\edef 中 \protect 的定义

\edef 中 \protect 的定义

更新:随着 LaTeX2e 2018-04-01 补丁级别 2 的发布,下面引用的段落中添加了以下句子,以使文档更加清晰:

\edef更准确地说,每当或等的内容\xdef可以包含不受程序员直接控制的任意用户输入时,就应该使用\protected@edef而不是\edef等,这样\protect就有合适的定义,并且如果它包含脆弱的命令,用户输入就不会中断。


尝试发布这个答案,我注意到source2e.pdf第 11.4 节中说

LaTeX 用来使脆弱的命令变得健壮的方法是在它们前面加上\protect。这可以有以下五个可能的值之一:

  • [...]
  • \@unexpandable@protect,用于将移动参数写入文件。因此\protect\foo将写入\protect\foo后跟空格。此值也在\edefs、\marks 和其他完全评估其参数的命令中使用。

但是,我不明白\edef这里“这个值也在 s 内部使用”是什么意思。如上述答案所述,\protect\let\@unexpandable@protecta 内部\protected@edef,但我不认为可以改变\protect在 a 内部的定义\edef

这句话有什么意义?我是不是理解错了?

答案1

该文档有点误导,我认为我们可以/应该改进。

更好的做法是,说明 LaTeX 内部不使用\edef除非已知输入始终是“安全的”,而是使用\protected@edef设置\protect\unexpandable@protect,以便任何“保护”自身的命令不会扩展,但在\edef扩展后保持不变。

相关内容