使用来自 \let 的标记

使用来自 \let 的标记

似乎从\let命令派生出的标记并不总是可以按字面意思使用。以下失败。我想测试下一个字符是否是数值常数。当然,测试并不完整;我只是在这里问一个问题。

\newcount\cnta
\def\gobble#1{}
\def\cmda{\futurelet\next\cmdb}
% \next is unabsorbed but remains as character 2. \gobble is meant to gobble 2.
\def\cmdb{\cnta0\next\space\gobble}
\cmda 2
\showthe\cnta

答案1

  1. \cmda 2

  2. \futurelet\next\cmdb 2

    这相当于

  3. \let\next 2\cmdb 2

    现在的\next意思是“字符2”,并且\let被删除。

  4. \cnta0\next\space\gobble 2

    \cnta开始分配,并且\next,它是不可扩展的并且不是<digit>,结束对数字的搜索。因此\cnta=0执行,\next被传递执行,因为它将是\space和产生的空间,\gobble吞噬 2。

TeX 确实在搜索数字时进行扩展,但在\let\next=2之后\next不是宏。还有赋值,例如

\cnta=\next

\let\next=2在 之后(或使用,这是等效的)将是非法的\futurelet;请参阅 TeXbook 中的语法<number>,第 269 页:不能使用隐式字符标记。

相关内容