我想生成一个空表,单元格中有下划线,以便有人手动填写。我可以使用循环生成一个空白表行,没有任何问题,但是一旦我尝试向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}