\ifx 之前看似未使用的 \edef 却神秘地影响了 \ifx 的结果。为什么?

\ifx 之前看似未使用的 \edef 却神秘地影响了 \ifx 的结果。为什么?

据我了解,在 中\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任务一样。

相关内容