我正在尝试使用 创建一个宏来检查两个参数是否具有相同的字符串\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
}
如果您不希望在文档中意外出现空格,就像西班牙宗教裁判所那样。