更新:随着 LaTeX2e 2018-04-01 补丁级别 2 的发布,下面引用的段落中添加了以下句子,以使文档更加清晰:
\edef
更准确地说,每当或等的内容\xdef
可以包含不受程序员直接控制的任意用户输入时,就应该使用\protected@edef
而不是\edef
等,这样\protect
就有合适的定义,并且如果它包含脆弱的命令,用户输入就不会中断。
尝试发布这个答案,我注意到source2e.pdf
第 11.4 节中说
LaTeX 用来使脆弱的命令变得健壮的方法是在它们前面加上
\protect
。这可以有以下五个可能的值之一:
- [...]
\@unexpandable@protect
,用于将移动参数写入文件。因此\protect\foo
将写入\protect\foo
后跟空格。此值也在\edef
s、\mark
s 和其他完全评估其参数的命令中使用。
但是,我不明白\edef
这里“这个值也在 s 内部使用”是什么意思。如上述答案所述,\protect
是\let
在\@unexpandable@protect
a 内部\protected@edef
,但我不认为可以改变\protect
在 a 内部的定义\edef
。
这句话有什么意义?我是不是理解错了?
答案1
该文档有点误导,我认为我们可以/应该改进。
更好的做法是,说明 LaTeX 内部不使用\edef
除非已知输入始终是“安全的”,而是使用\protected@edef
设置\protect
为 \unexpandable@protect
,以便任何“保护”自身的命令不会扩展,但在\edef
扩展后保持不变。