如何消除 TeX 自身插入的 \relax

如何消除 TeX 自身插入的 \relax

TeX 插入\relax时突然发现\else\fi扩展条件(例如寻找数字)时,TeX 按主题分类\relax说了很多。但是,在以下虚构示例中,您如何摆脱它?eTeX 的\dimexpr\numexpr确实消失了\relax,但在以下情况下可能不会消失。

\edef\x{%
  \ifnum0=0\fi\ifnum\z@=\z@
    \expandafter\@firstoftwo\else
      \expandafter\@secondoftwo\fi{x}{y}%
} 

(从‘答案’编辑)

Martin,\@empty即使在完全扩展的上下文中也可能残留:\noexpand使可扩展命令可恢复\relax。​​此外,至少有一半的时间人们对完全扩展或打印不感兴趣,而是对一步或两步扩展感兴趣。结果甚至可能立即被去标记化。因此,在人工塞子之前发现不可扩展标记的情况下,任何额外的\@empty\space作为“人工”塞子的东西都会在定义中残留。以下说明了 Bruno 的观点,我已经意识到了这一点:

\def\test@cond#1\fi{%
  #1\noexpand\@empty
    \expandafter\@firstoftwo\else
    \expandafter\@secondoftwo\fi{x}{y}%
}
\edef\x{\test@cond\ifnum\z@=\z@\fi}
\edef\x{\test@cond\if xx\fi}
\edef\x{\test@cond\ifnum0=0\fi}

我发现了一个涉及\iffirstisspace宏的棘手解决方案,并且\romannumeral也提供了一种解决方法。

答案1

例如,当 TeX 发现一个空格并被占用时,它就会停止寻找数字。因此,您的示例可以像这样修复:

\edef\x{%
  \ifnum0=0 \fi\ifnum\z@=\z@
    \expandafter\@firstoftwo\else
      \expandafter\@secondoftwo\fi{x}{y}%
} 

然而,一般情况下可能没那么容易:

\edef\x{%
  \ifnum\macroa=\macrob \fi\ifnum\z@=\z@
    \expandafter\@firstoftwo\else
      \expandafter\@secondoftwo\fi{x}{y}%
} 

如果\macrob不以空格结尾,仍会插入松弛。在其后添加普通空格当然会像命令序列后的其他空格一样被删除。\space只要\macrob不以空格结尾,添加显式空格就会起作用,否则它将不会被删除并成为定义的一部分。

这里帮助 eTeX\numexpr可以使用它\relax作为结束标记:

\edef\x{%
  \ifnum\macroa=\numexpr\macrob\relax\fi\ifnum\z@=\z@
    \expandafter\@firstoftwo\else
      \expandafter\@secondoftwo\fi{x}{y}%
} 

然后\macrob无论它是否包含尾随空格,都可以独立工作。

因此,我认为您的问题“如何消除\relaxTeX 自身插入的”的答案是:首先不要让 TeX 插入一个,避免这种情况。

相关内容