我试图写一个答案使用 CSV 阅读器将表格中的一个单元格加粗使用包裹collcell
,而且似乎无法让它与csvsimple
tabluar 一起工作,也无法datatool
。
通过cvssimple
,我得到:
Runaway argument? ! Paragraph ended before \collect@cell@arg was complete. <to be read again> \par
随着datatool
我得到:
! TeX 容量超出,抱歉 [输入堆栈大小=5000]。 \reserved@a ->\def \reserved@a *{\let \@xs@assign \@xs@expand@and@detokenize... l.56 \end{tabular}
!==> 发生致命错误,未生成输出 PDF 文件!
笔记:
对于格式错误,深表歉意:但在您尝试编辑它以修复它之前,请参阅预览显示与最终帖子不相同
下面的 MWE 代码可以很好地编译,并产生上面显示的输出,如下面的
cvssimple
表格datatool
所示不是使用collcell
包。为了尝试使用collcell
包,需要将两个表格列规范从 更改为 ,l l
以便L L
使用\newcolumntype
。
代码:
\documentclass{article}
\usepackage{csvsimple}
\usepackage{collcell}
\usepackage{datatool}
\usepackage{booktabs}
\usepackage{xstring}
\usepackage{xcolor}
% Make csv in question
\usepackage{filecontents}
\begin{filecontents*}{scientists2.csv}
name,surname,
Albert,Einstein,
Marie,Curie,
Thomas,Edison,
\end{filecontents*}
\newcommand*{\FormatCell}[1]{%
\IfStrEq{#1}{Curie}{\textcolor{red}{#1}}{#1}%
}%
% Need this so that the header rows is not passed to \collectcell
\newcommand*{\Header}[1]{\multicolumn{1}{l}{\textbf{#1}}}
\newcolumntype{L}{>{\collectcell\FormatCell}l<{\endcollectcell}}
\begin{document}
\noindent
Normal \textbf{tabular}:\par
\begin{tabular}{L L}\toprule
\Header{First Name} & \Header{Last Name}\\\cmidrule{1-2}
Albert & Einstein \\
Marie & Curie \\
Thomas & Edison \\
\end{tabular}
\bigskip\noindent
Using \verb|\csvreader|:\par
\csvreader[tabular=l l,
table head=\Header{First Name} & \Header{Last Name} \\\hline]%
{scientists2.csv}{name=\name,surname=\surname}%
{\name & \surname}%
\DTLloaddb[keys={Name,Surname}]{myDB}{scientists2.csv}
\bigskip\noindent
Using \verb|\DTLforeach|:\par
\begin{tabular}{l l}\toprule
\Header{First Name} & \Header{Last Name}\\\cmidrule{1-2}
\DTLforeach*{myDB}{\Name=Name,\Surname=Surname}{%
\Name & \Surname \\
}%
\end{tabular}
\end{document}
答案1
该collcell
包(由我编写)会扫描tabular
内容,通过查找 TeX 在查找下一个&
或等时自动添加的标记来找到单元格的末尾\\
。我认为它与不兼容cvssimple
,我猜它会以不同的方式添加此类标记,即使它对排版本身并不重要。