答案1
我将在这个答案中总结简单的解决方案,并按顺序编写一个 Matlab 集成。
- 在 Excel 中执行 LaTeX:缓慢、困难、需要大量人工、容易出错、可以重复使用但每次都需要复制粘贴。
这种方法只需在 Excel 中键入所需的部分即可构建 LaTeX。这是我的第一个想法。只有当您可以在完全相同的模板上复制和粘贴数据时,它才会有用。但您总是必须复制和粘贴……而且速度非常慢。
考虑以下电子表格
开始编写命令(我在创建它时犯了一些错误)。在分离的单元格上定义命令更加容易。
如果您有很多特殊情况,自动完成工具会有所帮助,但帮助不大。
每次合并都必须手动更正,并且正确编辑并不简单。
然后我注意到一个错误。\hline
应该是\\ \hline
然后\hline
仅在第一行上方添加一个。
必须将结果复制到您的 LaTeX 编辑器中。
- 在线服务:速度快,简单,手动操作适中,预览可避免错误,不可重复使用,每次都需要复制粘贴。
它更快,只需将您的.xls
或.xlsx
文件拖入其中即可。但您可能需要编辑额外的行,并且始终会插入行。
适合几张桌子的最佳选择,它具有编辑表格和生成 LaTeX 代码的工具。将文件转换为 的速度较慢.csv
,但快速格式化工具确实值得。
语法已呈现并可进行编辑。
添加边框就像在任何所见即所得的软件中一样简单
- 我的 Matlab 集成解决方案:准备工作完成后,速度快,简单,手动工作量少,错误可以快速纠正,可重复使用,无需每次复制粘贴。
另一个重要的缺点是 Matlab 是一款商业软件,我不能说我的代码在 Octave 上能正常工作。其中一些使用了我在 Octave 中从未尝试过的语法。
该解决方案仍然不完美,我通常没有特殊情况可以合并使用\multicolumn{cols}{pos}{text}
或更糟糕的\multirow{number of rows}{width}{text}
情况。尽管我已经在我的 中编写了针对同一问题的解决方案Matlab to Word Lbrary
,但我仍然没有在 中做出同样的解决方案Matlab to LaTeX library
。
我的 Matlab 集成解决方案已在另一个专门的答案中提出。
编辑:我决定只整合一个答案。
因此我们我们的 Matlab 集成解决方案。
为了完成整个任务,我们需要我的三个库
管理 latex 语法并从 matlab 对象创建它。
加载 excel 文件并.tex
直接从 Matlab 创建文件。
这个库是主库冈比亚(巴西葡萄牙语中的解决方法)冈比亚。
它允许您在任意数量的文件中将一组给定的单词替换为另一组。它几乎NotePad++
与使用其Find Files
命令执行的操作相同。但在这里,您可以以编程方式执行此操作,甚至可以利用操作序列。
MWELaTeX
确实非常简单
\documentclass{article}
\usepackage{multirow}
\begin{document}
\input{input_tab_test}
\end{document}
关键概念是总是创建外部文件,这样您只需将其输入到主文件中即可。它允许您根据需要多次修改外部文件。
input_tab_test
完成后应该是这样的
代码MATLAB
如下,请看解释。
将 Excel 加载到 Matlab 中,'F5:K11'
这对于避免多余的单元格很重要。第二个条目1
是工作表的编号。
excel_filename = 'Pasta1.xlsx';
[data, txt, raw] = xlsread(excel_filename,1,'F5:K11');
以下循环将单元格的所有条目转换raw
为字符串。我可能很快就会将其提升为一个函数。
% Analysis needed because all data must be string to the code
new_raw = cell(size(raw));
for i = 1:size(raw,1)
for j = 1:size(raw,2)
if isnumeric(raw{i,j})
if isnan(raw{i,j})
new_raw{i,j} = '';
else
new_raw{i,j} = sprintf('%g',raw{i,j});
end
else
new_raw{i,j} = sprintf('%s',raw{i,j});
end
end
end
然后我们定义格式并调用第一个库函数。
format = '| p{1cm} | p{0.5 cm} | p{1.5cm} | p{2cm} | p{3cm} | p{1cm} |';
tb_l = fc_lib_latex_cell_to_tab_line(new_raw,'\hline');
对于重复的字母使用:
format = repmat('c',[1 6]);
tb_l 与在线小工具的结果完全相同。
现在,调用一个具有某些语法的函数来添加\begin{tabular}
,\end{tabular}
以及任何必要的内容。Matlab 命令char
是这里的关键。
S = fc_lib_latex_struct_strings_02_table;
l1 = sprintf(S.btab,format);
tab = char(l1,'\hline',tb_l,S.etab);
tab
应该看起来像这样
最后,我们可以使用第二个库中的函数将其保存在磁盘中。
str_ext = '.tex'; file_name = 'input_tab_test';
fc_lib_save_file_extensao(file_name, str_ext, tab);
由于我目前没有合并列功能,我将使用第三个库。此步骤使整个过程效率降低,因为用户仍然必须手动定义替换。您可以像示例中那样稍微灵活一些w1
。
w1 = 'f';
input = {sprintf('%s & &', w1),...
'o & & &',...
'z &',...
'1 &'};
output = {sprintf('\\multicolumn{3}{|c|}{%s}',w1),...
'\multicolumn{4}{|c|}{o}',...
'\multicolumn{2}{|c|}{z}',...
'\multicolumn{2}{|c|}{1}',...
};
为了合并,我将创建一个具有行号的单元格和一个包含要合并的每个组的第一个和最后一个单元格的向量。
colMerge_p = {1, [3,4; 5,6];
2, [1,3; 4,6];
4, [1,6]};
但我仍然需要为 LaTeX 语法编写代码。
最后,我们调用函数搜索每一个input
并替换相应的output
。
filter = {'input_tab_test'}; encod = 'ISO-8859-1'; flag_copy = 0;
fc_lib_file_search_replace_wordset(pwd,filter,input,output,flag_copy,encod);
该变量filter
仅过滤感兴趣的文件。
在没有特殊情况时,这种方法效果更好,将来这应该不再是问题,最大的优点是可以以惊人的速度纠正错误,并重复使用具有相同模板的其他表格。而且,由于它保存的是外部文件,因此您只需重新编译主文件即可.tex
。
这是 LaTeX 中的结果
编辑2:自动合并列的新功能。
考虑以下电子表格
将其加载到 Matlab 中。命令的结果tb_l = fc_lib_latex_cell_to_tab_line(new_raw,'\hline');
是
要合并的新功能new_tb_l = fc_lib_latex_tab_line_colMerge(tb_l,colMerge);
是
colMerge = {2, [1,3], '|c|';
3, [3,4], '|c|';
4, [1,4], '|l|';
6, [3,4; 5,6], '|c|';
8, [1,6], '|c|';
9, [1,5], '|r|';
10, [2,3; 4,6], '|c|';
11, [1,2; 4,5], '|c|'};
第一个条目是要合并的行,第二个条目是要合并的每个间隙的第一列和最后一列的矩阵,第三个条目是对齐。 LaTeX 语法是
最终结果是
不要忘记使用“\usepackage{inputenc}”来处理重音字符。
答案2
我需要这样做的时候,我会导出到 CSV,然后用一些 Perl 脚本处理结果(几行就可以完成大部分工作)。但是,需要对列标题和行进行修饰。