使用动态数量的列填充表格

使用动态数量的列填充表格

我想用动态(计算)数量的列填充表格。该列应填充用户应提供的逗号分隔的值。因此,我尝试使用循环,但我肯定犯了一些错误,因为我收到了一个奇怪的错误:

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}

作为一种完全不同的方法,请注意,它建立在逐行构建表格的tabulartex 基元之上。此基元具有按列工作的垂直模拟:\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}

通过添加在末尾扩展的临时命令,循环在第一个单元格中完全完成。

不同的解决方案使用xparseexpl3;请注意,不再需要虚拟的第一列。

\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}

在此处输入图片描述

相关内容