扩张有何意义?

扩张有何意义?
\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。所以我们只需为其创建一个别名即可。就是这样。

相关内容