编辑:事实证明,\unexpanded
ConTeXt 与\unexpanded
ε-TeX 不同,因此之前的描述不适用。我会相应地更新问题。
来自 ε-TeX 手册:
\protected
在构建扩展标记列表(对于\edef
、\xdef
、\message
、\errmessage
、\special
,或将 的标记列表写入文件时)或在 或 的对齐中向前查看时,\mark
受保护的宏(用前缀定义)不会被扩展。\marks
\write
\noalign
\omit
当宏的扩展出现问题时,我们可以在它前面加上
\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
,这也会阻止任何用户定义的命令扩展到其替换,这可能是也可能不是您想要的,具体取决于情况。