Exportar grade estilizada para látex
Eu gostaria de escrever uma ExportStringfunção do tipo de conversão Gridou TextGridem tabelas de látex preservando elementos de estilo básicas , incluindo texto com estilo , divisórias celulares estilo e corantes fundo da célula .
Aqui está um exemplo do tipo de tabela que estou tentando exportar. A entrada seria estilizada TextGridcomo esta:
TextGrid[{{"","x","y","w","z"},{Style["variable 1",Italic],"a","b","c","d"},{Style["variable 2",Bold],"a","b","c","d"},
{Style["variable 3",Blue],"a","b","c","d"},{"variable 4","a","b","c","d"},{"variable 5","a","b","c","d"}},
Background->{{White,{LightGray,White}},{1->LightCyan}},Dividers->{{False,{True},False},
{True,True,{False},True},{{{1,2},{2,-2}}->False,{{1,1},{2,-2}}->True,
{{2,2},{2,-2}}->True}},Alignment->{Center,Center},Spacings->{{1,{3}},1}]
Uma solução deve ser capaz de gerar algo como o \begin{tablular}...\end{tabular}bloco do documento abaixo:
\documentclass{article}
\usepackage{xcolor,colortbl} % (* you may assume these packages *)
\newcommand{\mc}[2]{\multicolumn{#1}{c}{#2}}
\definecolor{Gray}{gray}{0.85}
\definecolor{LightCyan}{rgb}{0.88,1,1}
\definecolor{LightBlue}{rgb}{0,0,1}
\newcolumntype{a}{>{\columncolor{Gray}}c}
\newcolumntype{b}{>{\columncolor{white}}c}
\begin{document}
\begin{table} % (* the generated portion *) \begin{tabular}{l | a | b | a | b} \hline \rowcolor{LightCyan} \mc{1}{} & \mc{1}{x} & \mc{1}{y} & \mc{1}{w} & \mc{1}{z} \\ \hline variable 1 & a & b & c & d \\ variable 2 & a & b & c & d \\ variable 3 & a & b & c & d \\ variable 4 & a & b & c & d \\ variable 5 & a & b & c & d \\ \hline \end{tabular} \end{table}
\end{document}
Qual látex é processado perfeitamente como:
Isso parece razoavelmente próximo à TextGridsaída original acima.
Respostas
Eu nunca usei LaTex, então decidi brincar com isso por um tempo e usar latexbase.com para verificar a saída. Esta não é uma solução completa. Funciona com o modelo fornecido. Aqui está o que ele faz:
- Permite a modificação da cor de todo o texto, fundo da linha do cabeçalho, fundo da primeira coluna e fundo alternado para as colunas subsequentes. Uma
\definecolorlinha é emitida para todas as cores e elas são nomeadas color1 , color2 ... etc. - Permite o uso de
Style[]para incluir texto e oferece suporte a uma combinação de negrito, itálico, sublinhado e cor. - A cor deve ser RGBColor ou GrayLevel, ou o nome de cor equivalente.
Spacingsaplica-se uniformemente a todas as colunas e linhas e deve ser inserido no formato{x,y}.Backgrounddeve ser inserido no formato mostrado na pergunta. A primeira entrada (amarelo no exemplo) é o fundo da primeira coluna. Em seguida, vêm as duas cores (LightGray, White) usadas para alternar a cor das outras colunas, e então a regra (1-> LightCyan) é a cor de fundo da linha do cabeçalho.- O texto na primeira coluna é alinhado à esquerda. É alinhado ao centro nas outras colunas.
- A
Dividersopção não foi analisada (ou seja, as linhas foram desenhadas arbitrariamente para corresponder ao modelo fornecido na questão).
Aqui está um exemplo baseado na pergunta, mas com mais variação de estilos.
tg = TextGrid[{{"", "x", Style["y", Italic, Bold, Red],
Style["w", Underlined],
Style["z", RGBColor[1, 0, 1]]}, {Style["variable 1", Italic], "a",
"b", "c", "d"}, {Style["variable 2", Bold], "a", "b", "c",
"d"}, {Style["variable 3", Blue], "a", "b", "c",
"d"}, {"variable 4", "a", Style["b", Gray],
Style["c", Brown, Bold], "d"}, {"variable 5", "a", "b", "c",
Style["d", Blue]}},
Background -> {{Yellow, {LightGray, White}}, {1 -> LightCyan}},
Spacings -> {3, 1.5},
Dividers -> {{Opacity[0], {True}, Opacity[0]}, {True, True, {False},
True}, {{{1, 2}, {2, -2}} -> False, {{1, 1}, {2, -2}} ->
True, {{2, 2}, {2, -2}} -> True}},
Alignment -> {Center, Center}]
(* Conversion function *)
textGridAsTeX[tg_TextGrid] := (
processStyle[s_] := ( Module[{n, m, colorToken, token, colorName},
If[Length[s] == 0 , Return[s]];
token = s[[1]];
n = 2;
While[n <= Length[s],
If[Head[s[[n]]] == RGBColor || Head[s[[n]]] == GrayLevel,
colorToken = s[[n]]];
If[s[[n]] == Italic,
token = StringJoin["\\textit{", token, "}"]];
If[s[[n]] == Bold,
token = StringJoin["\\textbf{", token, "}"]];
If[s[[n]] == Underlined,
token = StringJoin["\\underline{", token, "}"]];
n++;
];
If[Head[colorToken] == RGBColor || Head[colorToken] == GrayLevel ,
If[! MemberQ[colorsDefined, ToString[colorToken]],
colorName =
StringJoin["color", ToString[Length[colorsDefined] + 1]];
AppendTo[colorsDefined, ToString[colorToken]];
l = Apply[List, colorToken];
If[Length[l] == 3, colorModel = "}{rgb}",
colorModel = "}{gray}"];
ltex =
Insert[ltex,
StringJoin["\\definecolor{" , colorName, colorModel,
ToString[Apply[List, colorToken]], "\r"], 1],
p = Flatten[Position[colorsDefined, ToString[colorToken]]];
colorName = StringJoin["color", ToString[p[[1]]]];
];
token = StringJoin["\\textcolor{", colorName, "}{", token, "}" ];
];
Return[token];]
);
cName[col_] := (
If[! MemberQ[colorsDefined, ToString[col]],
colorName =
StringJoin["color", ToString[Length[colorsDefined] + 1]];
AppendTo[colorsDefined, ToString[col]];
l = Apply[List, col];
If[Length[l] == 3, colorModel = "}{rgb}", colorModel = "}{gray}"];
ltex =
Insert[ltex,
StringJoin["\\definecolor{" , colorName, colorModel,
ToString[l], "\r"], 1],
p = Flatten[Position[colorsDefined, ToString[col]]];
colorName = StringJoin["color", ToString[p[[1]]]];
];
colorName
);
colorsDefined = {};
tgList = Apply[List, tg];
rows = Length[tgList[[1]]];
cols = Length[tgList[[1]][[1]]];
ltex = {};
(* spacing *)
spacing =
FilterRules[tgList[[2 ;; Length[tgList]]], Spacings][[1]][[2]];
v = spacing[[1]];
AppendTo[ltex,
StringJoin["\\setlength{\\tabcolsep}{", ToString[v*6], "pt}\r"]];
v = spacing[[2]];
AppendTo[ltex,
StringJoin["\\renewcommand{\\arraystretch}{", ToString[v],
"}\r"]];
(* new column types *)
bck = FilterRules[tgList[[2 ;; Length[tgList]]], Background];
newcol = bck[[1]][[2]][[1]][[2]];
n = 1;
While[n <= Length[newcol],
AppendTo[ltex,
StringJoin["\\newcolumntype{", {"a", "b"}[[n]],
"}{>{\\columncolor{" , cName[newcol[[n]]], "}}c}\r"]];
n++;
];
newCol = bck[[1]][[2]][[1]][[1]];
AppendTo[ltex,
StringJoin["\\newcolumntype{", "d", "}{>{\\columncolor{" ,
cName[newCol], "}}l}\r"]];
(* new command *)
AppendTo[ltex,
"\\newcommand{\\mc}[2]{\\multicolumn{#1}{c}{#2}}\r"];
(* begin document *)
AppendTo[ltex, "\\begin{document}\r"];
(* the table *)
AppendTo[ltex, "\\begin{table}\r"];
(* tabular *)
AppendTo[ltex, "\\begin{tabular}"];
(* columns description *)
aCols = Table["a", cols];
bCols = Table["b", cols];
rCols = Riffle[aCols, bCols];
rfCols = Take[rCols, cols - 1];
colTypes = {"{d"};
n = 1;
While[n <= cols - 1,
AppendTo[colTypes, StringJoin[" | ", rfCols[[n]]]];
n++;
];
AppendTo[ltex, StringJoin[colTypes, "}\r"]];
(* Header row *)
AppendTo[ltex, "\\hline\r"];
rowNumber = bck[[1]][[2]][[2]][[1]][[1]];
rowVal = cName[bck[[1]][[2]][[2]][[1]][[2]]];
AppendTo[ltex, StringJoin["\\rowcolor{", rowVal, "}\r"]];
cList = tgList[[1]][[1]];
n = 1;
While[n <= cols,
AppendTo[ltex,
StringJoin["\\mc{1}{", processStyle[cList[[n]]], "}"]];
If[n == cols, AppendTo[ltex, " \\\\\r"], AppendTo[ltex, " & \r"]];
n++;
];
AppendTo[ltex, "\\hline\r"];
(* Rows *)
m = 2;
While[m <= rows,
cList = tgList[[1]][[m]];
n = 1;
While[n <= cols,
AppendTo[ltex, processStyle[cList[[n]]]];
If[n == cols, AppendTo[ltex, " \\\\\r"], AppendTo[ltex, " & "]];
n++;
];
m++;
];
AppendTo[ltex, "\\hline\r"];
(* End tabular*)
AppendTo[ltex, "\\end{tabular}\r"];
(* end table *)
AppendTo[ltex, "\\end{table}\r"];
(* end document *)
AppendTo[ltex, "\\end{document}\r"];
(* package *)
ltex = Insert[ltex, "\\usepackage{colortbl}\r", 1];
(* the documentclass *)
ltex = Insert[ltex, "\\documentclass{article}\r", 1];
StringJoin[ltex]
)
(* calling the function *)
textGridAsTeX[tg]
Este é o resultado:
Mathematica:
Látex: