\docsvlist 与 tabular 之间的交互

\docsvlist 与 tabular 之间的交互

我正在尝试使用\docsvlistetoolbox 来生成表格行。但是,当我尝试使用时,我发现了一个奇怪的交互这个技巧跳过输出中的第一个 & 符号。以下是 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}

当我编译此文件时,它生成的表格如下所示:

一|二|三|四|

我希望它看起来更像这样:

a|b|c|d|e

有趣的是,如果我将分隔符修改为 以外的其他内容&,例如,,它就会按预期工作:

a,b,c,d,e|

更有趣的是,如果我改为\def\nextitem{\def\nextitem{&}}\def\nextitem{&}它可以正常工作,只是开头有一个额外的空白单元格:

|a|b|c|d\ne|

对我来说,这表明在表格环境中重新定义时存在一些非常具体的问题。我该如何解决这个\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}

第一个参数(可选)是在处理列表之前要执行的操作;第二个参数(必选)指定项目之间要执行的操作;第三个参数是在处理列表之后要执行的操作。最后是列表。

在此处输入图片描述

我并不赞同使用笼式桌子。这里只是举个例子。

相关内容