动态表创建问题

动态表创建问题

我在编写一个包时,进入了一个未知领域。有一次,我需要创建一个有“n”列的表(n 由用户在文档中提供)。在表格声明的前言中创建一个变量将处理行数和对齐方式,但我似乎无法弄清楚如何创建一行有“n”个单元格的标签。希望这个 MWE 示例能够澄清(我已经大大简化了我的代码以专注于我认为的问题所在)。这将产生错误。

    \documentclass{memoir}
    \begin{document}

     \ newcounter{n}
      \newcommand{\repeatntimes}[2]{ % usage:\repeatntimes{c}{3} -> ccc
      \setcounter{n}{0}%
      \loop\addtocounter{n}{1}{#1}%
      \ifnum\value{n}<#2\repeat}

      \newcommand{\sublabels}{\repeatntimes{blah &}{2}}

      \begin{tabular}[t]{ccc}
      \sublabels blah \\
      \end{tabular}
    \end{document}

我需要 \sublabels 进行扩展,以便排版的内容是

\begin{tabular}[t]{ccc}
blah & blah & blah \\
\end{tabular}

我知道这是一个扩展问题,但还有另一个问题,即“&”是 10 个会产生奇怪效果的特殊字符之一。错误消息是

! Missing } inserted.
<inserted text>
                }

我记得 Knuth 在 TeXbook 上讨论过这个问题,但我今天花了很长时间才找到它,却找不到。我试过各种方法来对扩展进行排序,但都行不通,我思考因为'&'的功能方式,但我不确定。

我将非常感激任何想法。TIA

答案1

您可以\repeatntimes像这样修复:

\newcommand{\repeatntimes}[2]{ % usage:\repeatntimes{c}{3} -> ccc
   \newcount\i
   \newtoks\ans
   \loop
      \ans=\expandafter{\the\ans#1}
      %\showthe\ans% uncomment to watch this work
      \advance\i by 1
      \ifnum\i<#2\repeat
   \the\ans
}

然后

\newcommand{\sublabels}{\repeatntimes{blah &}{2}}
\begin{tabular}[t]{ccc}
\repeatntimes{blah &}{2} blah \\
\end{tabular}

给你你想要的东西。

但也许还有更优雅的方法,这取决于你真正想要什么。你想让表格中的一行单元格都是相同的吗?也许你可以阅读列规范来找到正确的 n。

答案2

我将使用可扩展\prg_replicate:nn函数expl3

\documentclass{memoir}
\usepackage{expl3}
\begin{document}
  \ExplSyntaxOn
  \newcommand*{\sublabels}{\prg_replicate:nn{2}{blah &}}
  \ExplSyntaxOff
  \begin{tabular}[t]{ccc}
  \sublabels blah \\
  \end{tabular}
\end{document}

当然,如果您愿意,您可以获取后台代码\prg_replicate:nn并自行实现它expl3(毕竟,它最终只是 TeX 编程)。但是,我会选择“预打包”版本(这并不奇怪,尽管我要指出的是,这比\prg_replicate:nn我参与 LaTeX3 的时间要早​​得多)。

相关内容