\expandafter 如何与 { 交互?

\expandafter 如何与 { 交互?

我正在比较两个字符串,其中一个是命令的扩展。以下三次尝试均未产生正确的结果:

\documentclass{scrartcl}

\usepackage{etoolbox}
\begin{document}

    \newcommand{\sometext}{abc}
    \expandafter\ifstrequal{\sometext}{abc}{True!}{False!}

\end{document}

这会产生“False!”,因此 \expandafter 似乎在这里不起作用。我看到 \expandafter 的工作方式通常是没有花括号,所以我尝试了这两个:

\documentclass{scrartcl}

\usepackage{etoolbox}
\begin{document}

    \newcommand{\sometext}{abc}
    \expandafter\ifstrequal\sometext{abc}{True!}{False!}

\end{document}

\documentclass{scrartcl}

\usepackage{etoolbox}
\begin{document}

    \newcommand{\sometext}{abc}
    \expandafter\ifstrequal\sometext{}{abc}{True!}{False!}

\end{document}

这两个都产生 abcTrue!False!

有什么办法可以做我想做的事吗?

答案1

您需要第二个\expandafter,否则您只是在扩大{

\documentclass{scrartcl}

\usepackage{etoolbox}
\begin{document}

    \newcommand{\sometext}{abc}
    \expandafter\ifstrequal\expandafter{\sometext}{abc}{True!}{False!}

\end{document}

根据后续评论进行进一步阐述

\expandafter\ifstrequal{\sometext}{abc}{True!}{False!}

失败是因为\expandafter作用于 ,{而 并没有替代文本;因此,\expandafter在这种情况下 是没有意义的,并且测试失败是因为\sometext并不完全等同于abc

对于另一次尝试

\expandafter\ifstrequal\sometext{abc}{True!}{False!}

经过扩展,它变得等同于

\ifstrequal abc{abc}{True!}{False!}

因此,此处,a与进行比较b。如果为 True,c则打印;如果为 false,则abc打印。然后{True!}{False!}只是在字符串测试之外进行操作的剩余输入流。

最后,对于

\expandafter\ifstrequal\sometext{}{abc}{True!}{False!}

扩展为

\ifstrequal abc{}{abc}{True!}{False!}

和前面一样,a与 进行比较b。同样,c成为 TRUE 文本,{}成为 FALSE 文本。然后,{abc}{True!}{False!}是剩余的残差。

相关内容