部分source2e.pdf 的“11.4 强健命令和 \protect”(文件 d: ltdefns.dtx 日期: 2020/02/27 版本 v1.5g)说\protect
可以有一个五可能的“值”,但仅列出四其中:
\relax
\string
\noexpand
\@unexpandable@protect
→\noexpand\protect\noexpand
第五个/未列出的值是什么?
为什么没有列出?
答案1
我有 source2e.pdf日期:2004/02/20我的档案中是 1.3g 版本。
它说:
LaTeX 用来使脆弱的命令变得健壮的方法是在命令前面加上
\protect
。这可以有以下五个可能的值之一:
\relax
,进行正常排版。因此\protect\foo
将执行\foo
。\string
,用于写入屏幕。因此\protect\foo
将写入\foo
。\noexpand
,用于写入文件。因此\protect\foo
写入\foo
后会跟一个空格。\@unexpandable@protect
,用于将移动参数写入文件。因此\protect\foo
将写入\protect\foo
后跟一个空格。此值也在 和 其他命令中使用\edefs
,\marks
这些命令会充分评估其参数。\@unexpandable@noexpand
,用于在 内执行延迟写入\edef
。因此\protect\foo
将写入\foo
后跟一个空格。如果您想要\protect\foo
写入,则应使用\@unexpandable@protect
。(因从未使用而被删除)。这些命令用于设置
\protect
内部\edefs
。192
193\def\@unexpandable@protect{\noexpand\protect\noexpand}
%\def\@unexpandable@noexpand{\noexpand\noexpand\noexpand}
答案2
更新文档已修复,将在下一版本中说明四,在代码更改后仅用了 26 年的时间就使文档规范化。
就在引用行下面,你会看到
% \changes{1.1c}{1994/05/18}
% {(ASAJ) Renamed the commands, and removed
% one which is no longer needed.}
这也解释了为什么列表少了一个,现在我正试图回忆那是什么。我怀疑是的,\noexpand\noexpand\noexpand
但我需要检查一下……
是的,LaTeX2.09 源 ( latex.tex
) 使用 \noexpand\noexpand\noexpand
例如
\def\label#1{\@bsphack\if@filesw {\let\thepage\relax
\def\protect{\noexpand\noexpand\noexpand}%