将 collcell 包与 csvsimple 或 datatool 结合使用

将 collcell 包与 csvsimple 或 datatool 结合使用

我试图写一个答案使用 CSV 阅读器将表格中的一个单元格加粗使用包裹collcell,而且似乎无法让它与csvsimpletabluar 一起工作,也无法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,我猜它会以不同的方式添加此类标记,即使它对排版本身并不重要。

相关内容