unravel 包中的特殊 \relax 定义

unravel 包中的特殊 \relax 定义

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显示为\relaxifx不等于\relax。这是(通常)内部冻结的临时“放松”定义,用于实现它,\noexpand这使得命令在一个扩展步骤中暂时充当不可扩展的标记,但 Bruno 的技巧在这里使用and\relax构造来抓住这个定义,\expandafter\let

相关内容