\newcount\@repeat%
\def\repeat#1#2{%
\@repeat#1\relax%
\ifnum#1>\z@\relax%
\advance\@repeat by -1\relax%
\repeat{\@repeat}{#2}#2%
\fi}%
\repeat{2}{1}\\%
\repeat{11}{f}\\%
\repeat{\repeat{2}{1}}{f}% this does not work
宏\repeat#1#2
将参数 #2 重复了 #1 次。我期望最后两行产生相同的结果,但最后一行是错误的。
为什么最后一行不能产生 11 次字母 f?可扩展性重要吗?我不太明白。
我应该如何编辑代码以便它们产生相同的东西?
答案1
你得到
! Missing = inserted for \ifnum.
因为\repeat
有
\ifnum#1>\z@
所以#1
必须扩展为一个数字,但它\repeat{2}{1}
包括许多不可扩展的结构,如 \@repeat
、\relax
和\advance
。
尽管与此片段中的错误无关,但重新定义是一个非常糟糕的主意,因为它是整个 LaTeX 和纯 TeX 中使用的\repeat
基本构造的一部分。\loop
此版本仅使用扩展:
\documentclass{article}
\begin{document}
\makeatletter
\def\xrepeat#1#2{%
\ifnum#1>\z@
\xrepeat{\numexpr#1-1\relax}{#2}#2%
\fi}%
\xrepeat{2}{1}\\%
\xrepeat{11}{f}\\%
\xrepeat{\xrepeat{2}{1}}{f}% this does not work
\end{document}
答案2
David 已经解释了为什么嵌套\repeat
命令不起作用以及为什么使用名称是个坏主意\repeat
。
这是一个不同的定义,基于expl3
:我认为这更容易,自己判断。
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_set_eq:NN \xrepeat \prg_replicate:nn
\ExplSyntaxOff
\begin{document}
\xrepeat{2}{1}\\
\xrepeat{11}{f}\\
\xrepeat{\xrepeat{2}{1}}{f}
\end{document}
解释
软件包expl3
套件已经提供了您想要定义的函数,它被称为\prg_replicate:nn
。所以我们只需为其创建一个别名即可。就是这样。