2009-11-22 4 views
1

У меня есть массив из двух измерений, содержащий строки, и вы хотите создать с ними таблицу LaTeX. Проблема в том, что они могут быть длиннее, и после 15 символов должны быть линейные ошибки.Преобразование массива строк Java в таблицу LaTeX

Скажем, это массив 2x2, содержащий {{"String11 ....... String11", "String21"}, {"String12 ....... String12 ....... String12 ....... ", "String22 ...... String22 ......"}}, то результат должен выглядеть следующим образом:

\begin{tabular}{cc} 
String11.......& String21// 
String11  &// 
\hline 
String12.......&String22......// 
String12.......&String22......// 
String12.......& 
\end{tabular} 

есть умный способ сделать такое преобразование в Java?

ответ

3

Самый быстрый способ просто настроить 15em перенос текста в ваши файлы в таблице, которые вы, в конечном счете, ищете:

\begin{tabular}{p{15em} p{15em}} String11 & String21 \\ \hline String12 & String22 \\ \end{tabular}
В качестве альтернативы вы могли бы найти способ сделать что-то вроде этой работы:
// regex to place a new line delimiter (eg. \newline) after every 15 characters 
string11.replaceAll(".{15}", "$0" + someNewLineDelimiter);
Выполнение некоторых поисковых запросов Google по этому вопросу, я вижу, что \newline в LaTeX таблица работает не так легко, как хотелось бы, но вы должны найти что-то, что работает. Альтернатива, заключающаяся в том, что строка в несколько строк выглядит как плохое решение.

1

Должен признать, что это решение выглядит уродливым для меня. Я думаю, что есть много языков, на которых эта задача могла быть выполнена с гораздо меньшим количеством кода и ошибкой. Я подозреваю, что придет около 10 строк в Perl или 2 строки, в J. Still, вот лучшее, что я смог придумать:

import java.util.ArrayList; 
import java.util.List; 

public class Christian { 

    private static final int COLUMNS = 2, CELL_WIDTH = 15; 

    private static final String[][] array = { 
     {"I have an two dimension array that contains strings and want to create a LaTeX table with them. T", 
     "roblem is that they could be longer and there has to be line breakes after 15 characters. Th"}, 
     {"Say it's a 2x2 array with contains {{'String11.......String11', 'String21'}", 
      "{'String12.......String12.......String12.......', 'String22......String22......'}} then the result should look like"} 
     }; 

    public static void main(String[] args) { 
     ArrayList<String> lines = new ArrayList<String>(); 
     lines.add("\\begin{tabular}{cc}"); 
     for (String[] row : array) { 
     lines.addAll(convertRow(row)); 
     lines.add("\\hline"); 
     } 
     lines.remove(lines.size() - 1); 
     lines.add("\\end{tabular}"); 
     for (String line : lines) { 
     System.out.println(line); 
     } 
    } 

    private static List<String> convertRow(String[] row) { 
     ArrayList<ArrayList<String>> rearranged = new ArrayList<ArrayList<String>>(); 
     int deepest = 0; 
     for (int col=0; col<row.length; col++) { 
     boolean last = (col == row.length - 1); 
     String marker = (last) ? "//" : "&"; 
     String text = row[col]; 
     ArrayList<String> cell = new ArrayList<String>(); 
     for (int z=0; z<text.length(); z+=15) { 
      String cc = (z+CELL_WIDTH < text.length()) ? text.substring(z, z+CELL_WIDTH) : text.substring(z); 
      cell.add(cc + marker); 
      deepest = Math.max(deepest, cell.size()); 
     } 
     rearranged.add(cell); 
     } 
     for (int col=0; col<row.length; col++) { 
     ArrayList<String> cell = rearranged.get(col); 
     boolean last = (col == row.length - 1); 
     String marker = (last) ? "//" : "&"; 
     while (cell.size() < deepest) cell.add(marker); 
     } 
     ArrayList<String> lines = new ArrayList<String>(); 
     for (int line=0; line<deepest; line++) { 
     StringBuilder sb = new StringBuilder(); 
     for (int col=0; col<row.length; col++) { 
      sb.append(rearranged.get(col).get(line)); 
     } 
     boolean last = (line == deepest - 1); 
     if (last) sb.delete(sb.length() - 2, sb.length()); 
     lines.add(sb.toString()); 
     } 
     return lines; 
    } 

} 
Смежные вопросы