source3.pdf 和 TeXbook 中关于 \noexpand 的声明

source3.pdf 和 TeXbook 中关于 \noexpand 的声明

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生成的令牌。

答案2

为了给 David 的回答添加更多细节,这里摘录了“TeX:该程序”(texdoc tex)。

在此处输入图片描述

这里你可以看到,如果\noexpand后面跟着一个控制序列,那么这个标记将被一个带有代码 的内部标记替换frozen_dont_expand。这是无法通过任何其他方式到达的,因此不等于\relax

相关内容