LaTeX3 源代码于 2021-07-12 发布,其中第“23.7 所有可能的标记的描述”第 23 章:l3token包/令牌操作”:
- 扩展(当 可扩展时)会产生一个内部标记,暂时显示为,其形状与 一致,而其含义与 不同。
\noexpand ⟨token⟩
⟨token⟩
\notexpanded: ⟨token⟩
⟨token⟩
\relax
问题 1:为什么说含义不同从\relax
?
如果我做
\expandafter\show\noexpand\TeX
,然后我得到:
> \TeX=\relax.
<recently read> \notexpanded: \TeX
,这似乎意味着在扩展\noexpand
含义之后等于-primitive的含义\relax
。
如果我做
\expandafter\let\expandafter\test\expandafter=\noexpand\TeX \show\test
,然后我得到:
> \test=\relax
,这似乎意味着在扩展\noexpand
含义之后等于-primitive的含义\relax
。
除此之外,TeXbook,“第 20 章:定义(也称为宏)”说:
\noexpand ⟨token⟩
。扩展就是它⟨token⟩
本身;但这⟨token⟩
是解释就好像它的意义\relax
如果它是一个通常会通过 TeX 的扩展规则进行扩展的控制序列。
顺便说一句:这带来了更多问题:
一方面(source3.pdf)有扩展的声明\noexpand ⟨token⟩
产生一个内部令牌,(暂时)显示为 ,其形状与 一致。\notexpanded: ⟨token⟩
⟨token⟩
另一方面(TeXbook)有扩展的声明\noexpand ⟨token⟩
产生⟨token⟩
本身。
这是两种不同的说法。
问题2:这两种说法都正确吗?
问题 3:这两种说法哪一种更准确呢?
答案1
出色地...
\expandafter\show\noexpand\TeX
\expandafter\ifx\noexpand\TeX\relax \show Y\else\show N\fi
\expandafter\ifx\noexpand\TeX\TeX \show Y\else\show N\fi
\edef\zz{\ifnum0=0\else\fi}
\expandafter\expandafter\expandafter\ifx\expandafter\noexpand\expandafter\TeX\zz \show Y\else\show N\fi
\expandafter\expandafter\expandafter\ifx\expandafter\noexpand\expandafter\TeX\noexpand\LaTeX \show Y\else\show N\fi
\expandafter\expandafter\expandafter\ifx\expandafter\noexpand\expandafter\TeX\noexpand\TeX \show Y\else\show N\fi
\bye
生产
> \TeX=\relax.
<recently read> \notexpanded: \TeX
l.2 \expandafter\show\noexpand\TeX
?
> the letter N.
l.4 ...\ifx\noexpand\TeX\relax \show Y\else\show N
\fi
?
> the letter N.
l.6 ...er\ifx\noexpand\TeX\TeX \show Y\else\show N
\fi
?
> the letter N.
l.10 ...and\expandafter\TeX\zz \show Y\else\show N
\fi
?
> the letter Y.
l.13 ...and\expandafter\TeX\noexpand\LaTeX \show Y
\else\show N\fi
?
> the letter Y.
l.15 ...xpand\expandafter\TeX\noexpand\TeX \show Y
\else\show N\fi
?
因此,尽管\show
意味着令牌\relax
不\ifx
等于\relax
或冻结\relax
或原始令牌\TeX
,但\ifx
等于其他\noexpand
生成的令牌。