ConTeXt 中的 \unexpanded 和 \protected 有什么区别?

ConTeXt 中的 \unexpanded 和 \protected 有什么区别?

编辑:事实证明,\unexpandedConTeXt 与\unexpandedε-TeX 不同,因此之前的描述不适用。我会相应地更新问题。

来自 ε-TeX 手册:

  • \protected在构建扩展标记列表(对于\edef\xdef\message\errmessage\special,或将 的标记列表写入文件时)或在 或 的对齐中向前查看时,\mark受保护的宏(用前缀定义)不会被扩展。\marks\write\noalign\omit

ConTeXt 维基

当宏的扩展出现问题时,我们可以在它前面加上\unexpanded,如下所示:

\unexpanded\def\somecommand{... ... ...}

这将防止宏在没有排版的地方扩展,例如当字符串写入 tuo 文件时。

在实践中,我看到过这两种用法看似完全相同,但\unexpanded\def...似乎更常见。两者之间有什么明显的区别需要我注意吗?

答案1

如果我使用context以下内容进行编译

\show\unexpanded

我明白了

> \unexpanded=\protected

tex error       > tex error on line 1 in file /Users/enrico2013/provaccia/sep2018/tttsssttt.tex: ?

l.1 \show\unexpanded


1 >>  \show\unexpanded
2     

在 中/usr/local/texlive/2018/texmf-dist/tex/context/base/mkiv/syst-aux.mkiv,第 61 行内容为

\let\unexpanded\normalprotected

如果我添加\show\normalprotected,那么输出是

> \normalprotected=\protected

当然,的含义\unexpanded可以重新分配,但定义的宏\unexpanded具有该含义时将是\protected(在 e-TeX 术语中)。

答案2

这是在比较 etex 原语,\unexpanded而不是同名的上下文宏。问题已经澄清,上下文命令才是预期的。


它们实际上没有可比性:

\protected是 的修饰符\def,并使生成的标记具有内部标志设置,以便其扩展在某些上下文中受到抑制。因此它是命令

\unexpanded用于防止标记列表的扩展,因此它是上下文的属性,而不是其中的命令的属性。

当然,也存在一些重叠,如果您正在写入文件并且需要防止扩展,那么您可以(如在经典 latex 中一样)声明易碎命令将失败,并安排所有定义都使用 ,\protect这样易碎命令就会减少。或者,您可以使用\unexpanded并防止所有扩展,无论命令是否使用\protect,这也会阻止任何用户定义的命令扩展到其替换,这可能是也可能不是您想要的,具体取决于情况。

相关内容