我想使用循环生成自动表格。如之前所建议的,最好先在 toks 中生成行,然后将它们传递给 tabular。但是,我在访问行内的行计数变量时遇到了问题,如下例所示:
\documentclass{article}
\newcount\it
\newcount\tot
\newtoks\tablines
\def\addtomytablines#1{\tablines\expandafter{\the\tablines#1}}
\it=2
\tot=7
\loop
\addtomytablines{\the\it&&&\\\cline{2-3}}
\advance\it 1
\ifnum \it<\tot
\repeat
\def\maketable{%
\begin{tabular}{r|p{7mm}|p{7mm}|p{5mm}} \cline{2-3}
& foo & foo & \\ \cline{2-3}
\the\tablines
foofoo & & & \\ \cline{2-3}
\end{tabular}
}
\begin{document}
\maketable
\end{document}
期望的输出是每个行号都以当前行号开头(因此从 2 到 6),但是输出总是 写入 \it 的最后一个值。
有什么想法可以改变它来使其工作吗?只需将循环内的行更改为
\addtomytablines\expandafter{\the\it&&&\\\cline{2-3}}
给出了正确的数字,但不再是表格。
答案1
您必须尽可能地扩展行号,然后才能将其添加到\tablines
标记列表中。以下是实现此目的的一种方法:
\documentclass{article}
\newcounter{it}
\newcounter{tot}
\newtoks\tablines
\newcommand{\addtomytablines}[1]{\tablines\expandafter{\the\tablines#1}}
\setcounter{it}{2}
\setcounter{tot}{7}
\loop
\expandafter\addtomytablines\expandafter{\number\arabic{it} & & & \\ \cline{2-3}}
\stepcounter{it}
\ifnum \value{it}<\value{tot}
\repeat
\def\maketable{%
\begin{tabular}{r|p{7mm}|p{7mm}|p{5mm}}
\cline{2-3}
& foo & foo & \\
\cline{2-3}
\the\tablines
foofoo & & & \\
\cline{2-3}
\end{tabular}
}
\begin{document}
\maketable
\end{document}
\expandafter
(LaTeX 计数器用法)在\number
将计数器\arabic{it}
的值it
传递给之前先将其扩展\addtomytablines
。
答案2
您可以使用两个计数器来实现这一点,一个在\addtomytablines
命令内部,一个在主循环中。(我不完全明白为什么。)
我擅自清理了你的代码并用 LaTeX 编写了它。
\documentclass{article}
\newtoks\tablines
\def\addtomytablines#1{\tablines\expandafter{\the\tablines#1}}
\newcounter{row}
\newcounter{loop}
\newcounter{maxrow}
\setcounter{row}{2}
\setcounter{loop}{\value{row}}
\setcounter{maxrow}{7}
\loop
\addtomytablines{%
\therow & & & \\%
\cline{2-3}%
\stepcounter{row}
}
\stepcounter{loop}%
\ifnum\value{loop} < \value{maxrow}
\repeat
\def\maketable{%
\begin{tabular}{r|p{7mm}|p{7mm}|p{5mm}}
\cline{2-3}
& foo & foo & \\ \cline{2-3}
\the\tablines
foofoo & & & \\ \cline{2-3}
\end{tabular}
}
\begin{document}
\maketable
\end{document}
答案3
LaTeX 内核有一些未公开的编程工具,例如 while 循环。更广为人知的循环\loop
并不适用于表格,原因有很多,一是它会做出本地定义,而这个定义会丢失,二是它\cline
也会使用\loop
,这会产生冲突。
下面是一行代码,让用户访问一个 LaTeX while 循环。
\documentclass[border=12pt]{standalone}
\newcounter{index}
\makeatletter
\def\WHILENUM #1{\@whilesw\ifnum#1\relax\fi}%
\makeatother
\begin{document}
\begin{tabular}{r|p{7mm}|p{7mm}|p{5mm}}
\cline{2-3}
& foo & foo & \\
\cline{2-3}
\setcounter{index}{2}%
\WHILENUM
{\value{index}<7}
{\theindex\stepcounter{index}&&&\\\cline{2-3}}%
foofoo & & & \\
\cline{2-3}
\end{tabular}
\end{document}