我正在比较两个字符串,其中一个是命令的扩展。以下三次尝试均未产生正确的结果:
\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!}
是剩余的残差。