为什么这个简单的 \ifx 测试会失败?

为什么这个简单的 \ifx 测试会失败?

这应该很容易,但我不明白为什么下面的测试失败了......我预料到欢呼!\currentchar当计数达到90(即的字符代码)时打印Z

肯定是某个地方存在扩展问题,但我相信我\expandafter在这里使用 as 是必要的。我做错了什么?我应该采取不同的方法吗?

在此处输入图片描述

\def\mysteryletter{Z}

% loop through A-Z to find out the mystery letter
\newcount\currentchar
\currentchar=65 % <-- charcode of A
\loop
  \edef\temp{\char\currentchar}
  \temp
  \expandafter\expandafter\expandafter\ifx\expandafter\mysteryletter\temp Hurrah!\fi
  \advance \currentchar by 1
  \unless\ifnum \currentchar>90
\repeat

\bye

答案1

添加

> \show\temp

您将会看到没有什么\edef 区别,也不可\char扩展\currentchar,因此\temp每次都由这两个标记组成,并且永远不会\ifx等于字符标记。

luatex 有一个可扩展的\Uchar原语。

在这种情况下,测试字符代码比测试标记更容易。

\def\mysteryletter{Z}

% loop through A-Z to find out the mystery letter
\newcount\currentchar
\currentchar=65 % <-- charcode of A
\loop
  \char\currentchar
  \expandafter\ifnum\expandafter`\mysteryletter=\currentchar Hurrah!\fi
  \advance \currentchar by 1
  \unless\ifnum \currentchar>90
\repeat

\bye

答案2

\chardef\mysteryletter=`Z
% loop through A-Z to find out the mystery letter
\newcount\currentchar

\currentchar=`A
\loop
  \chardef\temp=\the\currentchar
  \temp
  \ifx\mysteryletter\temp Hurrah!\fi
  \advance \currentchar by 1
  \unless\ifnum \currentchar>90
\repeat

\bye

相关内容