以下是我的 MWE:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{etoolbox}
\newcommand{\test}[1]{%
\ifstrequal{#1}{bla}{{blu1}{blu2}}{{error}{schmerror}}
}
\newcommand{\switch}[2]{#2 #1}
\begin{document}
\test{bla} % this works
\switch12 % this works
\switch\test{bla} \\
\expandafter\switch\test{bla}
\expandafter\switch\expandafter{\test{bla}}
\switch{\test{bla}}
\end{document}
这是输出:
我试图让\switch
宏将的输出\test{bla}
作为参数,返回 blu2 blu2。但甚至没有\expendafter
奏效。有什么办法可以让这样的事情发挥作用吗?
前两行只是确保两个命令都按预期工作。
我的第一次尝试\switch\text{bla}
,显然交换\test
和{bla}
导致bla errorschmerror
因为的参数\test
不是bla
。(我认为它是\par
标记,因为如果我省略,下一次尝试将在同一行输出\\
。)
我的第二次尝试,\expandafter\switch\test{bla}
,只是返回 bla。据我所知,\test
在扩展时, 只是被替换为空,而 \switch 会切换{bla}
为某个内容(虽然不知道是什么)。起初我想知道这是否是由于不可扩展而导致的\ifstrequal
,这可能会导致\test
扩展为,但下一次尝试应该会显示相同的行为。
\test{bla}
但是,我的第三次尝试显然在扩展中用替换了{blu1blu2}
。然后,它被 替换为\switch
。但这不是我想要的,我想\switch
对两个参数和 进行操作,{blu1}
它们{blu2}
都应该由 提供\test
。
第四次尝试似乎产生了完全相同的结果。
答案1
\expandafter\switch\test{bla}
是
\switch\ifstrequal{blah}{bla}{{blu1}{blu2}}{{error}{schmerror}}
即
blah \ifstrequal {bla}{{blu1}{blu2}}{{error}{schmerror}}
这不是你想要的。
您可以将调用结构更改为
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{etoolbox}
\newcommand{\test}[2]{%
\ifstrequal{#2}{bla}{#1{blu1}{blu2}}{#1{error}{schmerror}}%
}
\newcommand{\switch}[2]{#2 #1}
\begin{document}
\test{}{bla}
\test\switch{bla}
\end{document}