我想用动态(计算)数量的列填充表格。该列应填充用户应提供的逗号分隔的值。因此,我尝试使用循环,但我肯定犯了一些错误,因为我收到了一个奇怪的错误:
Undefined control sequence ^^I\entry{5,6,7}
举例来说
\documentclass{article}
\usepackage{etextools}
%Create a table with a specific amount of columns
\newenvironment{vartab}[1]
{
\begin{tabular}{ |c@{} *{#1}{r|} } \hline
}{
\end{tabular}
}
\newcommand{\entry}[1]{
\forcsvloop{#1}\do{
& ##1
}\\ \hline
}
\begin{document}
\begin{vartab}{3}
& 2 & 3 & 4 \\\hline
\entry{5,6,7}
\end{vartab}
\end{document}
您知道可能存在什么问题吗?
答案1
一种更简单的方法是使用辅助宏来简化扩展:
\documentclass{article}
\usepackage{etextools}
%Create a table with a specific amount of columns
\newenvironment{vartab}[1]
{
\begin{tabular}{ |c@{} *{#1}{r|} } \hline
}{
\end{tabular}
}
\newcommand{\myformat}[1]{& #1}
\newcommand{\entry}[1]{
\edef\result{\csvloop[\myformat]{#1}}
\result \\ \hline
}
\begin{document}
\begin{vartab}{3}
& 2 & 3 & 4 \\\hline
\entry{5,6,7}
\end{vartab}
\end{document}
作为一种完全不同的方法,请注意,它建立在逐行构建表格的tabular
tex 基元之上。此基元具有按列工作的垂直模拟:\halign
\valign
\documentclass{article}
\begin{document}
\valign{\hrule\vskip 2pt plus 1fil\hbox{\strut\quad #\quad}\vfil&
\hrule\vskip 2pt plus 1 fil \hbox{\strut\quad #\quad}
\vskip 1pt plus 1fil\hrule\cr
\noalign{\vrule}
2&5\cr
\noalign{\vrule}
3&6\cr
\noalign{\vrule}
4&7\cr
\noalign{\vrule}}
\end{document}
答案2
您尝试在一个单元格中开始循环并在另一个单元格中结束循环,这是不可能的,因为表格单元格会形成组;这就像不正确地嵌套环境
\begin{A}
\begin{B}
...
\end{A}
\end{B}
这是行不通的。
这是一种方法etoolbox
(我不建议使用etextools
有缺陷且无人维护的方法)。
\documentclass{article}
\usepackage{etoolbox}
%Create a table with a specific amount of columns
\newenvironment{vartab}[1]
{\begin{tabular}{ |c@{} *{#1}{r|} } \hline}
{\end{tabular}}
\newcommand{\doentry}[1]{\appto\temp{& #1}}
\newcommand{\entry}[1]{%
\def\temp{}% initialize to empty
\forcsvlist{\doentry}{#1}% add entries
\appto\temp{\\ \hline}% end the row
\temp % deliver contents
}
\begin{document}
\begin{vartab}{3}
& 2 & 3 & 4 \\\hline
\entry{5,6,7}
\end{vartab}
\end{document}
通过添加在末尾扩展的临时命令,循环在第一个单元格中完全完成。
不同的解决方案使用xparse
和expl3
;请注意,不再需要虚拟的第一列。
\documentclass{article}
\usepackage{xparse}
%Create a table with a specific amount of columns
\newenvironment{vartab}[1]
{\begin{tabular}{ |*{#1}{r|} } \hline}
{\end{tabular}}
\ExplSyntaxOn
\NewDocumentCommand{\entry}{m}
{
\clist_set:Nn \l_muffel_row_clist { #1 }
\clist_use:Nn \l_muffel_row_clist { & }
\\
\hline
}
\clist_new:N \l_muffel_row_clist % allocate a clist variable
\ExplSyntaxOff
\begin{document}
\begin{vartab}{3}
2 & 3 & 4 \\\hline
\entry{5,6,7}
\end{vartab}
\end{document}