无法在 for 循环中生成文本(自动表格生成)

无法在 for 循环中生成文本(自动表格生成)

我想生成一个空表,单元格中有下划线,以便有人手动填写。我可以使用循环生成一个空白表行,没有任何问题,但是一旦我尝试向cmidrules行中添加一些内容,行为就不会按预期进行。我的循环似乎添加了最后一个cmidrule,但实际上我用命令中的最后一个表达式覆盖了它genrow

下面的图片显示了我想要生成的内容,红线是缺少的但我期望绘制的内容。

在此处输入图片描述

\documentclass{scrartcl}

\usepackage{booktabs}


\newcounter{iter}  \setcounter{iter}{0}
\newtoks\tabRtok  % token for table row
\newcommand\addtabRtok[1]{\tabRtok\expandafter{\the\tabRtok#1}}
\newcommand*\resettabRtok{\tabRtok{}}
\newcommand*\printtabRtok{\the\tabRtok}

\newcounter{itb}  \setcounter{itb}{0}


\newcommand{\genrow}[1]{  % generates a row
    \newcounter{cols}
    \setcounter{cols}{#1}
    \addtocounter{cols}{-1}

    \resettabRtok
    \setcounter{iter}{0}
    \loop\ifnum\theiter<\value{cols}
        \stepcounter{iter}
        \addtabRtok{. & .}
    \repeat
    \addtabRtok{\\}

    \addtabRtok{\cmidrule(r){1-1}}
    \setcounter{iter}{2}  %
    \loop\ifnum\value{iter}<#1
        \addtabRtok{\cmidrule(lr){\the\value{iter}-\the\value{iter}}}  % THIS ONLY GENERATES cmidrule on last column...?
%       \addtocounter{iter}{1}  % this doesn't work
        \stepcounter{iter}
    \repeat
    \addtabRtok{\cmidrule(l){#1-#1}}    
}

\begin{document}

\genrow{4}
\begin{tabular}{llll}
    \toprule
    \printtabRtok
    \bottomrule
\end{tabular}

\end{document}

答案1

将其添加到令牌寄存器时必须进行扩展\the\value{iter},否则除了第一列和最后一列之外,它将包含如下内容:

\cmidrule(lr){\the\value{iter}-\the\value{iter}}

iter而实际展开时的值将是 4(在示例中)。下面只是添加了一个小的扩展辅助宏(我称之为\addtabRtokhelper),它将展开的\the\value{iter}作为其参数并将添加\cmidrule到标记中。

您的代码中还有一些其他问题我已修复。

  • 不要\newcounter{cols}在多次执行的宏中执行此操作,第二次使用时会抛出错误,并且在 plainTeX 的等效语法中,每次都会创建计数器并占用一个寄存器(这现在不是什么大问题,因为我们通常有很多寄存器,但在过去 TeX 在这里相当有限)

  • 不要在宏定义中的行尾留空格(或空行),否则会添加虚假的空格或\par标记。如果您需要空行来获得更多概览,请%在其中添加一个。数字参数末尾的空格是例外,因为它们会结束 TeX 对数字的解析(参见\ifnum代码中的行)。

代码:

\documentclass{scrartcl}

\usepackage{booktabs}


\newcounter{iter}  \setcounter{iter}{0}
\newtoks\tabRtok  % token for table row
\newcommand\addtabRtok[1]{\tabRtok\expandafter{\the\tabRtok#1}}
\newcommand*\resettabRtok{\tabRtok{}}
\newcommand*\printtabRtok{\the\tabRtok}

\newcommand*\addtabRtokhelper[1]{\addtabRtok{\cmidrule(lr){#1-#1}}}

\newcounter{itb}  \setcounter{itb}{0}

\newcounter{cols}


\newcommand{\genrow}[1]{% generates a row
    \setcounter{cols}{#1}%
    \addtocounter{cols}{-1}%
    \resettabRtok
    \setcounter{iter}{0}%
    \loop\ifnum\the\value{iter}<\value{cols}
        \stepcounter{iter}%
        \addtabRtok{. & .}%
    \repeat
    \addtabRtok{\\}%
    \addtabRtok{\cmidrule(r){1-1}}%
    \setcounter{iter}{2}%
    \loop\ifnum#1>\value{iter}
        \expandafter\addtabRtokhelper\expandafter{\the\value{iter}}%
        \stepcounter{iter}%
    \repeat
    \addtabRtok{\cmidrule(l){#1-#1}}%
}

\begin{document}

\genrow{4}
\begin{tabular}{llll}
    \toprule
    \printtabRtok
    \bottomrule
\end{tabular}

\end{document}

在此处输入图片描述

相关内容