我正在尝试使用 csv 文件创建一个包含两种不同类型行的表。
csv 看起来像这样
Data1,Data2,Data3
Caption1,,
Value1,Value2,Value3
Value4,Value5,Value6
Caption2,,
Value8,Value9,Value10
.....
每个标题都应该使用表格的所有三列,因此我尝试了以下代码:
\documentclass[a4paper,12pt]{article}
\usepackage{tabularx}
\usepackage{multirow}
\usepackage{booktabs}
\usepackage{datatool}
\usepackage{float}
\usepackage{wrapfig}
\begin{document}
\begin{figure}[H]
\DTLloaddb{Database_Name}{Test.csv}
\centering
\begin{tabular}{l c c}
\toprule
a & b & c \\
\midrule
\DTLforeach{Database_Name}
{\a=Data1,\b=Data2,\c=Data3}
{
%-----------------------
\DTLifnullorempty{\c}{\multicolumn{3}{c}{\a}}{\a & \b & \c}
%-----------------------
\DTLiflastrow{}{\\}} \\
\bottomrule
\end{tabular}
\end{figure}
\end{document}
但如果我在这种情况下使用它们,\multicolumn
它们就&
不起作用。您知道如何解决这个问题吗?
答案1
LaTeX 中的单元格tabular
是隐式本地组。这会破坏许多循环宏。一种解决方法是先使用循环宏在标记寄存器中编写表格,然后输出标记寄存器以设置表格:
\documentclass[a4paper,12pt]{article}
\usepackage{booktabs}
\usepackage{datatool}
\newtoks\tabletoks
\begin{document}
\begin{figure}
\DTLloaddb{Database_Name}{abc.csv}
\centering
\makeatletter
\tabletoks={%
\begin{tabular}{l c c}
\toprule
a & b & c \\
\midrule
}%
\DTLforeach{Database_Name}{%
\a=Data1,\b=Data2,\c=Data3%
}{%
\DTLifnullorempty{\c}{%
\protected@edef\x{%
\noexpand\multicolumn{3}{c}{\a}%
}%
}{%
\protected@edef\x{\a & \b & \c}%
}%
\tabletoks\expandafter{\the\expandafter\tabletoks\x\\}%
}%
\tabletoks\expandafter{%
\the\tabletoks
\bottomrule
\end{tabular}%
}%
\the\tabletoks
\end{figure}
\end{document}
\protected@edef
用于扩展宏\a
、\b
、\c
,然后将它们放入令牌寄存器中。