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
无论它是否包含尾随空格,都可以独立工作。
因此,我认为您的问题“如何消除\relax
TeX 自身插入的”的答案是:首先不要让 TeX 插入一个,避免这种情况。