这次迭代中的分配是如何进行的(TeX)?

这次迭代中的分配是如何进行的(TeX)?

在著名的TeXbook(第二十次印刷,修订,1991 年 5 月),我发现了这个算法(附录 D:肮脏的技巧,第 373 页),

\newcount\m \newtoks\t \m=\n \t={}
\loop \ifnum\m>0 \t=\expandafter{\the\t *} \advance\m-1 \repeat
\edef\asts{\the\t}

试图理解TeX 的作品,我把上面的算法改成了这个,它追踪变量值的演变\t在循环迭代中(根据初始假设)。

\def\n{5}
\newcount\m \newtoks\t \m=\n \t={}
%output during the loop
In the loop:
\loop \ifnum\m>0 \t \t=\expandafter{\the\t *} \advance\m-1 \repeat
\edef\asts{\the\t}
Resulting macro expansion of \char`\\asts: \asts

令我惊讶的是,相应的输出显示了 5 个序列=*在循环阶段写入并将空宏扩展为\asts

有人可以帮我澄清一下这种行为吗?

我正在使用 TeX 3.14159265(TeX Live 2020/Debian),kpathsea 版本 6.3.2。

顺便问一下,是否可以定义不使用括号的命令/cs?(例如,\def\n{5})

提前致谢!

答案1

在循环内添加

\t \t=\expandafter{\the\t *}

\t \t相当于\t=\t并分配\t给自身,所以这是一个无操作,相当于

=\expandafter{\the\t *}

这与

=\the\t *

但因为你不再分配任何东西\t \the\t总是空的所以这是

=*

=*每次迭代只需排版一次。

你的意图

\the\t \t=\expandafter{\the\t *}

然后\the\t将显示的当前内容\t,第二个\t将按照预期成为赋值的左侧,将的新值设置为\t旧值并将设置为*

顺便问一下,是否可以定义不使用括号的命令/cs?(例如,\def\n{5})

括号(或至少是 catcode 1 和 2 中的某些字符)是必需的,\def尽管\n可以使用以下方式声明为计数寄存器,\newcount\n 则不允许使用括号,并且赋值将具有以下语法\n=5

相关内容