在宏中使用 \ifx

在宏中使用 \ifx

我正在尝试使用 创建一个宏来检查两个参数是否具有相同的字符串\ifx。但我观察到看似不一致的行为。这是我的代码:

\documentclass{minimal}

\begin{document}

\newcommand{\argA}{abc}
\newcommand{\argB}{abc}
\newcommand{\argC}{abcd}

\def\compA#1#2{
    \ifx #1 #2
    Same
    \else
    Different
    \fi
}

% This gives 'Same'
\ifx \argA \argB
Same
\else
Different
\fi

% This gives 'Different'
\ifx \argA \argC
Same
\else
Different
\fi

% This gives 'Different'    
\compA{\argA}{\argB}

% This gives 'Different'
\compA{\argA}{\argC}

\end{document}

我不明白为什么\compA{\argA}{\argB}会给出Different。我在 TSE 中徒劳地寻找与此问题类似的问题。此代码中发生了什么?

更新

修复问题后,我运行\compA{abc}{abc}但结果是Different。该问题有什么解决办法?

更新 2:我发现下面的代码有效。

\def\comp#1#2{
    \def\tempA{#1}
    \def\tempB{#2}
    \ifx \tempA\tempB
    Same
    \else
    Different
    \fi
}

\comp{abc}{abc} % Same
\comp{abc}{abcd} % Different

但我想知道这是否是解决这个问题的有效方法。我可以\def在宏内部调用使用标记化

答案1

当 TeX 处理你的\compA宏时,它会\compA{\argA}{\argB}用定义的替换文本进行替换,即

\ifx \argA • \argB • Same • \else Different • \fi

根据您的定义,其中表示空格标记(其他空格为了清楚起见而保留,并且在第一级扩展后不在结果标记列表中)。

因此,与空间标记\ifx相比,它们是不同的。\argA

这是修复后的代码:

\def\compA#1#2{%
    \ifx #1#2%
    Same%
    \else
    Different%
    \fi
}

宏后面的空格(或结束行)在标记化过程中将被忽略;结束行算作空格

这就是为什么\ifx \argA \argB返回 true,因为标记化后,后面会留出空格标记\argA


您提供的第二段代码应该以类似的方式处理:

\def\comp#1#2{%
    \def\tempA{#1}%
    \def\tempB{#2}%
    \ifx \tempA\tempB
    Same%
    \else
    Different%
    \fi
}

如果您不希望在文档中意外出现空格,就像西班牙宗教裁判所那样。

相关内容