为什么在填充 longtable 内容时循环无法重复?

为什么在填充 longtable 内容时循环无法重复?

以下工作:

\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}

在此处输入图片描述

相关内容