据我了解,在 中\ifx\x\y xx \else yy \fi
,\ifx
并没有扩展其论点。如果你想\ifx
比较扩展\x
和的值\y
,那么我们需要自己进行扩展前喂它们到\ifx
:
\edef\xpndX{\x}
\edef\xpndY{\y}
\ifx\xpndX\xpndY xx \else yy \fi
对我们来说,这种扩展也是如此。当和是宏中的参数时,\edef
这种情况经常发生,因此我们实际上不知道它们代表什么类型的量。\x
\y
我正在改编用户 2478 对 TeX-SE 问题的回答中找到的代码片段为什么这个简单的 \ifx 测试会失败?并得出了以下 MWE:
\documentclass{article}
\usepackage[svgnames]{xcolor} % to get named colors
\begin{document}
\chardef\mysteryletter=`H
% loop through A-Z to find out the mystery letter
\newcount\currentchar
\currentchar=`A
\loop
\chardef\temp=\the\currentchar
\edef\tmp{\temp}%
\ifx\mysteryletter\temp {\color{Red}\bf\temp}\else\temp\fi
\advance \currentchar by 1
\unless\ifnum \currentchar>90
\repeat
\end{document}
编译后生成以下输出:
这实际上是所需的输出,但它应该不是已经!我添加了语句\edef\tmp{\temp}
以获取“扩展”版本,\temp
打算将参数更改\temp
为\ifx
命令,\tmp
但在编译此文档时没有。瞧,所需的结果被打印出来了!这让我相信该\edef\tmp{\temp}
语句执行的扩展是不必要的,因此它被注释掉并重新编译了文档。这给出了错误的结果;字母 H 不是粗体或红色
我注意到,从命令末尾删除注释字符\edef
会产生预期的效果,即在每个字母之间添加一个空格,但并不能阻止找到并突出显示“H”。
\temp
所以我的问题是:语句中未使用的扩展如何\edef
改变命令执行的比较\ifx
?我在这里遗漏了什么?
答案1
\chardef\temp=\the\currentchar
\edef\tmp{\temp}%
通过定义的标记\chardef
不可扩展,因此\edef\tmp{\temp}
与\def\tmp{\temp}
不清楚为什么\ifx\mysteryletter\temp
如果两个标记都是通过\chardef
相同的数字定义的,您不认为这是真的?
我猜你的修改版本相当于
\chardef\temp=\the\currentchar
\ifx\mysteryletter\temp
测试\ifx
发生在分配之前,同时寻找结束数字,你需要
\chardef\temp=\the\currentchar\relax
\ifx\mysteryletter\temp
或者
\chardef\temp=\currentchar
\ifx\mysteryletter\temp
所以你的\edef
行为就像是\relax
终止\chardef
任务一样。