我正在尝试使用函数这个答案
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\switchcondition}{ O{string} m m m }
{
\use:c { fraiman_#1_switch:nnn } { #2 } { #3 } { #4 }
}
\cs_new:Nn \fraiman_string_switch:nnn
{
\str_case:nnF { #1 } { #2 } { #3 }
}
\cs_new:Nn \fraiman_token_switch:nnn
{
\tl_case:nnF { #1 } { #2 } { #3 }
}
\cs_new:Nn \fraiman_integer_switch:nnn
{
\int_case:nnF { #1 } { #2 } { #3 }
}
\cs_new:Nn \fraiman_dimen_switch:nnn
{
\dim_case:nnF { #1 } { #2 } { #3 }
}
\ExplSyntaxOff
\begin{document}
\newcommand{\Hello}{A4}
\switchcondition{\Hello}{
{A4}{It is A4}
{A5}{It is A5}
}{Oops!}
\end{document}
问题是,无论我如何定义\Hello
,我总是会得到“哎呀!”。
然而,
\switchcondition{A5}{
{A4}{It is A4}
{A5}{It is A5}
}{Oops!}
作品。
答案1
如果您希望第一个参数\str_case:nnF
完全展开,则必须使用\str_case_e:nnF
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\switchcondition}{ O{string} m m m }
{
\use:c { fraiman_#1_switch:nnn } { #2 } { #3 } { #4 }
}
\cs_new:Nn \fraiman_string_switch:nnn
{
\str_case_e:nnF { #1 } { #2 } { #3 }
}
\cs_new:Nn \fraiman_token_switch:nnn
{
\tl_case:nnF { #1 } { #2 } { #3 }
}
\cs_new:Nn \fraiman_integer_switch:nnn
{
\int_case:nnF { #1 } { #2 } { #3 }
}
\cs_new:Nn \fraiman_dimen_switch:nnn
{
\dim_case:nnF { #1 } { #2 } { #3 }
}
\ExplSyntaxOff
\begin{document}
\newcommand{\Hello}{A4}
\switchcondition{\Hello}{
{A4}{It is A4}
{A5}{It is A5}
}{Oops!}
\end{document}