expandafter 和 ifx

expandafter 和 ifx

我尝试仅设置颜色第一个字母,aaabbb)与测试有关\ifx
我原来有更复杂的任务,但我想了解它在这个简单的例子上是如何工作的。
我的 MWE:

\documentclass{article}
\usepackage[usenames]{color}
\begin{document}
\def\AAA{aaa}
\def\BBB{bbb}
\let\TST\AAA
\def\SETCOL #1{\textcolor{red}{#1}}

\expandafter\SETCOL\ifx\TST\AAA\AAA\else\BBB\fi

\end{document}

我用一个\expandafter红色的整个aaa

答案1

您的代码在执行 操作后\expandafter离开

\SETCOL\AAA\else\BBB\fi

并且的参数\SETCOL\AAA,而不是首字母。

让我们尝试一下

\expandafter\expandafter\expandafter\SETCOL\expandafter\ifx\expandafter\TST\expandafter\AAA\AAA\else\BBB\fi

在第一幕之后\expandafter,你将获得

\expandafter\SETCOL\ifx\TST\AAA aaa\else\BBB\fi

现在你得到了

\SETCOL aaa\else\BBB\fi

\else在任何一种情况下,从到 的标记\fi都会消失。但是,如果测试返回 false,则会出现同样的问题:当\TST\ifx等于时\AAA\expandafter噩梦就会消失

\SETCOL\BBB\fi

\BBB如果您希望\SETCOL看到扩展的第一个标记,则还需要到达\BBB。最好使用不同的策略。

\documentclass{article}
\usepackage[usenames]{color}

\begin{document}

\def\AAA{aaa}
\def\BBB{bbb}
\let\TST\AAA
\def\SETCOL #1{\expandafter\SETCOLAUX#1}
\def\SETCOLAUX #1{\textcolor{red}{#1}}

\expandafter\SETCOL\ifx\TST\AAA\AAA\else\BBB\fi

\let\TST\BBB

\expandafter\SETCOL\ifx\TST\AAA\AAA\else\BBB\fi

\end{document}

在此处输入图片描述

相关内容