在著名的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