动态生成表格列

动态生成表格列

考虑一个具有固定列数的表(常规表格环境)。我想创建一个接受逗号分隔的字符串列表的命令,其中字符串的数量可能在零和列数之间不同。

\begin{tabular}{llll}
  \outputrow{ab cd,foo,3,5}\\ %all columns used
  \outputrow{}\\ %no column used
  \outputrow{1,2}\\ %two columns used
\end{tabular} 

\outputrow{cvs-input}在所有情况下,都应该生成所有列(本例中为 4 列)。实际列值应由两个附加命令生成:\emptycol仅输出空列的内容,而\usercol{content}生成提供的用户输入的相应输出。因此,上述示例的结果应该是

\begin{tabular}{llll}
  \usercol{ab cd} & \usercol{foo} & \usercol{3} & \usercol{5} \\
  \emptycol & \emptycol & \emptycol & \emptycol \\
  \usercol{1} & \usercol{2} & \emptycol & \emptycol \\
\end{tabular} 

对于单个表来说,列数是静态的,但是对于具有不同列数的不同情况,我需要此解决方案。

我首先想到的是使用类似的包etoolbox,但我不知道如何发射使用循环或类似方法的单列。

您对如何实现这一目标有何建议?

答案1

这可以通过使用一些高级 TeX 功能来实现,即\def使用 scantext 而不是\newcommand。这样您就可以提取逗号之间的所有文本。

一种方法是:

\documentclass{article}

\makeatletter
\newcommand\outputrow[1]{%
    \@outputrow#1,,,,,\@nil
}
\def\@outputrow#1,#2,#3,#4,#5\@nil{%
    \@usercol{#1} & \@usercol{#2} & \@usercol{#3} & \@usercol{#4} \\%
}
\def\@usercol#1{%
    \expandafter\ifx\expandafter\@nnil\unexpanded{#1}\@nnil
        \emptycol
    \else
        \usercol{#1}%
    \fi
}
\makeatother

\newcommand\usercol[1]{\fbox{#1}}
\newcommand\emptycol{(empty)}


\begin{document}

\begin{tabular}{llll}
  \outputrow{ab cd,foo,3,5}\\ %all columns used
  \outputrow{}\\ %no column used
  \outputrow{1,2}\\ %two columns used
\end{tabular} 
\end{document}

调用\outputrow一个内部宏\@outputrow,并将参数放在其后面,不带{ }逗号,但带有几个逗号和一个结束标记 ( \@nil)。然后\@outputrow扫描四个参数,并将剩余的逗号用作五个参数,然后将其丢弃。与 一起使用的四个参数\@usercol检查参数是否为空,然后使用\emptycol\usercol{#1}

请注意,这也可以得到改进,例如使用循环以便它可以处理大量的列。

相关内容