在 eTeX 的 \TextOrMath 实现中使用 \noexpand

在 eTeX 的 \TextOrMath 实现中使用 \noexpand

latexrelease2015/01/01 中,有两种实现\TextOrMath:一种用于常规 TeX,另一种用于类似 eTeX 的引擎(更准确地说:支持 的引擎\protected)。我的问题涉及后者:

\protected\expandafter\def\csname TextOrMath\space\endcsname{%
  (...) } % no problem here
\edef\TextOrMath#1#2{% from latex.ltx
  \expandafter\noexpand\csname TextOrMath\space\endcsname
  {#1}{#2}}

我想我很理解这些定义,但是我不明白为什么\edef不简单地这样写:

\edef\TextOrMath#1#2{% from me
  \csname TextOrMath\space\endcsname
  {#1}{#2}}

既然是内部\TextOrMath<space>宏,那么在它前面加上内部\protected有什么意义呢?是不是因为作者担心\noexpand\edef\protected可能有缺陷吗?

我做了这样的测试(使用 pdfTeX 运行):

% From latex.ltx (or p. 153 of source2e.pdf)
\protected\expandafter\def\csname TextOrMath\space\endcsname{%
  \ifmmode  \expandafter\@secondoftwo
  \else     \expandafter\@firstoftwo  \fi}

\edef\TextOrMath#1#2{%
  \expandafter\noexpand\csname TextOrMath\space\endcsname
  {#1}{#2}}

% My simpler way of doing the same (?)
\edef\altTextOrMath#1#2{%
  \csname TextOrMath\space\endcsname
  {#1}{#2}}

\show\TextOrMath    % \TextOrMath=macro:#1#2->\TextOrMath  {#1}{#2}.
\show\altTextOrMath % \altTextOrMath=ditto

\ifx\TextOrMath\altTextOrMath
  identical
\else
  different
\fi

\vfill
\eject
\bye

这个测试打印出“identical”,似乎表明我的定义与 latex.ltx 中的定义相同(但略微简单一些)。我是不是漏掉了什么?

谢谢!

答案1

不,你没有错过任何东西,只是随着我们逐渐将这些 1992 年后现代特征添加到源代码中,旧习惯很难改变……

相关内容