我在编写一个包时,进入了一个未知领域。有一次,我需要创建一个有“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 的时间要早得多)。