在纯 TeX 中,代码如下:
\def\ver{a}
\if\ver{a}{yes}\else{no}\fi
\ifx\ver{a}{yes}\else{no}\fi
返回
no
no
是否有“if”和“ifx”的变体会返回“yes”?如果没有,是否有其他方法可以进行等效的逻辑测试?使用代替\let
似乎\def
没有帮助。
答案1
TeX 中没有原始条件来解释括号参数。无论真假文本都不要加括号。
对于\if
,TeX 会执行完整的宏扩展,直到找到两个不可扩展的标记。在您的例子中,\ver
被扩展为a
,而后面的标记是{
,它是不可扩展的。
因此,字符代码的比较返回 false,并且\else
跳过之前的文本,而您仍然使用
\else{no}\fi
所以最后你会得到{no}
打印“no”的结果。
相反,\ifx
不进行扩展并比较以下两个标记,在本例中为\ver
和{
。
考试
\if a\ver yes\else no\fi
将打印“yes”。
答案2
在 Plain TeX 中(\def
不可扩展):
\def\tmp{a}
\ifx\tmp\ver Yes\else No\fi
在 Optex 中(可扩展):
\ismacro \ver{a}\iftrue Yes\else No\fi