我正在尝试根据大小自动创建表格。LaTeX 中循环命令的数量很多,很难确定哪一个合适。我尝试了普通的 TeX 循环和来自包的循环forloop
,pgfloop
但没有成功。
显然,在环境中运行循环存在问题tabular
。我还尝试先运行循环并将输出字符串保存到 中token
,然后在 中打印标记tabular
。这在某些情况下有效。
这是一个最小的例子:首先,我想要生产:
\begin{tabular}{|*{4}{c|}}
1&2&3&4
\end{tabular}
以下是我使用 TeX 循环所尝试的操作:
\newcounter{numofcol}\setcounter{numofcol}{4}
\newcounter{tmpcol}\setcounter{tmpcol}{1}
\begin{tabular}{|*{\thenumofcol}{c|}}
\thetmpcol
\loop
\ifnum\value{tmpcol}<\value{numofcol}%
\stepcounter{tmpcol}%
&\thetmpcol
\repeat
\end{tabular}
显然,&
符号会导致循环出现问题。如果我使用包forloop
或中的循环,也会发生同样的情况pgfloop
。错误是
ERROR: Forbidden control sequence found while scanning use of \loop.
--- TeX said ---
<inserted text>
\par
l.140 &
\thetmpcol
--- HELP ---
No help available
token
因此我认为我可以将行的字符串保存在
\newcounter{numofcol}\setcounter{numofcol}{4}
\newcounter{tmpcol}\setcounter{tmpcol}{1}
\newtoks\tmprowcontent
\tmprowcontent={x}
\loop%
\ifnum\value{tmpcol}<\value{numofcol}%
\stepcounter{tmpcol}%
\tmprowcontent=\expandafter{\the\expandafter\tmprowcontent & x}%
\repeat
\begin{tabular}{|*{\thenumofcol}{c|}}
\the\tmprowcontent
\end{tabular}
如果我不将该计数器包含在内,则此方法有效token
。如果我x
用当前计数器值替换,即
\newcounter{numofcol}\setcounter{numofcol}{4}
\newcounter{tmpcol}\setcounter{tmpcol}{1}
\newtoks\tmprowcontent
\tmprowcontent={\thetmpcol}
\loop%
\ifnum\value{tmpcol}<\value{numofcol}%
\stepcounter{tmpcol}%
\tmprowcontent=\expandafter{\the\tmprowcontent & \thetmpcol}%
\repeat
\begin{tabular}{|*{\thenumofcol}{c|}}
\the\tmprowcontent
\end{tabular}
然后每个条目都是计数器的最后一个值,即4
在这种情况下。这是因为使用了\expandafter
。但是,如果我不使用\expandafter
,那么 TeX 会告诉我内存不足。
因此,我的问题是,我该如何实现它?
答案1
您可以简单地迭代这些值,尽管您可能需要隐藏它,&
以便不会太早被看到并在表格单元格中期测试结束时结束。
\documentclass{article}
\begin{document}
\newcounter{numofcol}\setcounter{numofcol}{4}
\newcounter{tmpcol}\setcounter{tmpcol}{0}
\newcommand\foo{%
\stepcounter{tmpcol}%
\thetmpcol
\ifnum\value{tmpcol}<\value{numofcol}\hiddenamp\expandafter\foo\fi}
\newcommand\hiddenamp{&}
\begin{tabular}{|*{\thenumofcol}{c|}}
\foo
\end{tabular}
\end{document}