该unravel
包定义了一个\__unravel_special_relax:
命令,我们在文档中找到了以下内容:
一个与 略有不同的特殊标记
\relax
(它\meaning
是,但根据 ,\relax
它与 不同)。在我们的作业右侧,可以用任何其他可扩展命令替换。\relax
\ifx
\__unravel_special_relax:
\exp_after:wN \cs_new_eq:NN \exp_after:wN \__unravel_special_relax: \exp_not:N \__unravel_special_relax:
和 到底有何\__unravel_special_relax:
不同\relax
?这个定义背后有什么技巧?为什么包\relax
中需要这个特殊版本unravel
?
答案1
如果我们用旧货币来表示定义:
\documentclass{article}
\begin{document}
\expandafter\let\expandafter\zrelax\noexpand\zrelax
\show\zrelax
\show\relax
\ifx\relax\zrelax
\show Y
\else
\show N
\fi
\end{document}
产生终端输出
> \zrelax=\relax.
l.6 \show\zrelax
?
> \relax=\relax.
l.7 \show\relax
?
> the letter N.
l.12 \show N
? x
因此\zrelax
显示为\relax
但ifx
不等于\relax
。这是(通常)内部冻结的临时“放松”定义,用于实现它,\noexpand
这使得命令在一个扩展步骤中暂时充当不可扩展的标记,但 Bruno 的技巧在这里使用and\relax
构造来抓住这个定义,\expandafter
\let