![\docsvlist 与 tabular 之间的交互](https://linux22.com/image/340645/%5Cdocsvlist%20%E4%B8%8E%20tabular%20%E4%B9%8B%E9%97%B4%E7%9A%84%E4%BA%A4%E4%BA%92.png)
我正在尝试使用\docsvlist
etoolbox 来生成表格行。但是,当我尝试使用时,我发现了一个奇怪的交互这个技巧跳过输出中的第一个 & 符号。以下是 MWVE:
\documentclass{standalone}
\usepackage{etoolbox}
\begin{document}
\def\nextitem{\def\nextitem{&}}%
\renewcommand*{\do}[1]{\nextitem #1}%
\begin{tabular}{c|c|c|c|c}
\docsvlist{a,b,c,d,e}
\end{tabular}
\end{document}
当我编译此文件时,它生成的表格如下所示:
我希望它看起来更像这样:
有趣的是,如果我将分隔符修改为 以外的其他内容&
,例如,
,它就会按预期工作:
更有趣的是,如果我改为\def\nextitem{\def\nextitem{&}}
,\def\nextitem{&}
它可以正常工作,只是开头有一个额外的空白单元格:
对我来说,这表明在表格环境中重新定义时存在一些非常具体的问题。我该如何解决这个\nextitem
问题?&
答案1
每个单元格内都tabular
形成一个组。因此,\nextitem
单元格内的重新定义不会保留到下一个单元格。如果您将重新定义设为g
全局 - 通过\gdef
(例如) - 您将获得所需的输出:
\documentclass{article}
\usepackage{etoolbox}
\begin{document}
% Local \nextitem redefinition
\def\nextitem{\def\nextitem{&}}% http://tex.stackexchange.com/a/89187/5764
\renewcommand*{\do}[1]{\nextitem #1}%
\begin{tabular}{c|c|c|c|c}
\docsvlist{a,b,c,d,e}
\end{tabular}
% Global \nextitem redefinition
\def\nextitem{\gdef\nextitem{&}}% http://tex.stackexchange.com/a/89187/5764
\renewcommand*{\do}[1]{\nextitem #1}%
\begin{tabular}{c|c|c|c|c}
\docsvlist{a,b,c,d,e}
\end{tabular}
\end{document}
答案2
另一种方法是先在 tabular 之外的单独命令中定义表格内容docsvlist
,然后将其插入。发现使用从多个文件中读取的同名变量的内容组装表格很有用
\newcommand*{\DataSetList}{DataFile1,DataFile2}
\renewcommand{\do}[1]{\input{DataSet.tex} Data1 & Data2 & Data3 \\} % for each item in docsvlist, read that data and ad a line to table
\renewcommand{\tableContents}{\expandafter\docsvlist\expandafter{\DataSetList}}
\begin{tabular}{c|c|c}
\tableContents
\end{tabular}
注意:data1,...在DataFile*.inp中使用declarecommand定义(使用declarecommand如何定义或重新定义命令(混合 \providecommand + \renewcommand)?)
答案3
您可能对问题的一般解决方案感兴趣,无论是在表格内还是表格外工作。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\managecsvlist}
{
O{} % pre code
m % main code
O{} % post code
m % list
}
{
#1
\clist_set:Nn \l__kunkel_list_clist { #4 }
\clist_use:Nn \l__kunkel_list_clist { #2 }
#3
}
\ExplSyntaxOff
\newcounter{rows}
\newcommand{\nr}{\stepcounter{rows}\therows &}
\begin{document}
\begin{tabular}{|l|c|c|c|c|c|}
\hline
\managecsvlist[\nr]{&}[\\\hline]{a,b,c,d,e}
\managecsvlist[\nr]{&}[\\\hline]{a,b,c,d,e}
\managecsvlist[\nr]{&}[\\\hline]{a,b,c,d,e}
\end{tabular}
\end{document}
第一个参数(可选)是在处理列表之前要执行的操作;第二个参数(必选)指定项目之间要执行的操作;第三个参数是在处理列表之后要执行的操作。最后是列表。
我并不赞同使用笼式桌子。这里只是举个例子。