以下工作:
\documentclass{article}
\usepackage{longtable}
\begin{document}
\newcount\n
\n=0
\begin{longtable}{ccc}
\loop
\ifnum\n<10
\advance\n by1
hello
\repeat
\end{longtable}
\end{document}
以下不是工作:
\documentclass{article}
\usepackage{longtable}
\begin{document}
\newcount\n
\n=0
\begin{longtable}{ccc}
\loop
\ifnum\n<10
\advance\n by1
col1 & col2 & col3 \\
\repeat
\end{longtable}
\end{document}
为什么?
答案1
表格环境中的单元格(tabular
,, ...)也是组,因此在第一个单元格/组之后,longtable
内部循环定义和的值会丢失。\n
典型的解决方法是先将内容放入宏或令牌寄存器中:
\documentclass{article}
\usepackage{longtable}
\begin{document}
\newcount\n
\n=0
\begin{longtable}{ccc}
\n=0
\toks0={}%
\loop
\ifnum\n<10
\advance\n by1
\toks0=\expandafter{\the\toks0
col1 & col2 & col3 \\\relax
}%
\repeat
\the\toks0
\end{longtable}
\end{document}
答案2
这是一个\prg_replicate:nn
可以跨越单元边界并在之后完成的版本。
\documentclass{article}
\usepackage{longtable}
\usepackage{xparse}
\ExplSyntaxOn%
\int_new:N\g_macmadness_int%
\newcommand{\runacross}[2]{%
\int_gzero:N \g_macmadness_int
\prg_replicate:nn {#1}{%
\int_gincr:N \g_macmadness_int
\int_compare:nNnTF {\g_macmadness_int } = {#1}{%
#2\int_use:N \g_macmadness_int \tabularnewline
}{%
#2\int_use:N \g_macmadness_int &
}
}
}
\ExplSyntaxOff
\newcounter{cols}
\setcounter{cols}{10}
\begin{document}
\begin{longtable}{*{\number\value{cols}}{c}}
\runacross{\number\value{cols}}{col}
\runacross{\number\value{cols}}{Foo}
\end{longtable}
\end{document}