在latexrelease
2015/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 年后现代特征添加到源代码中,旧习惯很难改变……