\protect 的第五个可能值是什么?

\protect 的第五个可能值是什么?

部分source2e.pdf 的“11.4 强健命令和 \protect”(文件 d: ltdefns.dtx 日期: 2020/02/27 版本 v1.5g)\protect可以有一个可能的“值”,但仅列出其中:

  1. \relax
  2. \string
  3. \noexpand
  4. \@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}%

相关内容