似乎从\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
\cmda 2
\futurelet\next\cmdb 2
这相当于
\let\next 2\cmdb 2
现在的
\next
意思是“字符2”,并且\let
被删除。\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 页:不能使用隐式字符标记。