灵活的 \IfStrEqCase 语句

灵活的 \IfStrEqCase 语句

我正在尝试使用xstring's\IfStrEqCase来切换大小写。它似乎工作正常除了对于开关参数是宏的情况可选参数:

\MySwitch{$\MyMacro[optional]{a - b}$}

有问题的行在 MWE 中被注释掉了。一旦按预期工作,输出中的最后一行应该被复制:

在此处输入图片描述

其中的代码\MySwitch经常用于不同的情况。

代码:

\documentclass{article}
\usepackage{amsmath}
\usepackage{xstring}
\usepackage{xparse}

\NewDocumentCommand{\MyMacro}{o m}{\IfNoValueTF{#1}{#2}{\text{#1: } #2}}%

\newcommand*{\MySwitch}[1]{%
    \IfStrEqCase{#1}{%
        {plain text}{text: #1}%
        {$x^2$}{math a: #1}%
        {$\MyMacro{a - b}$}{math b: #1}%
        {$\MyMacro[optional]{a - b}$}{math c: #1}%
    }[Error: Invalid input: #1]%
}

\begin{document}
\MySwitch{plain text}

\MySwitch{$x^2$}

\MySwitch{$\MyMacro{a - b}$}

math c: $\MyMacro[optional]{a - b}$%% <-- Following should produce this output

%\MySwitch{$\MyMacro[optional]{a - b}$}% <--- This is the problem

\end{document}

答案1

您遇到的问题是一个“经典”问题:LaTeX 内核(以及大多数手写代码)使用的可选参数的定义不计算方括号。因此,您需要确保嵌套可选参数的任何地方都使用“保护”:

\documentclass{article}
\usepackage{amsmath}
\usepackage{xstring}
\usepackage{xparse}

\NewDocumentCommand{\MyMacro}{o m}{\IfNoValueTF{#1}{#2}{\text{#1: } #2}}%

\newcommand*{\MySwitch}[1]{%
    \IfStrEqCase{#1}{%
        {plain text}{text: #1}%
        {$x^2$}{math a: #1}%
        {$\MyMacro{a - b}$}{math b: #1}%
        {$\MyMacro[optional]{a - b}$}{math c: #1}%
    }[{Error: Invalid input: #1}]% CHANGE IS HERE
}

\begin{document}
\MySwitch{plain text}

\MySwitch{$x^2$}

\MySwitch{$\MyMacro{a - b}$}

math c: $\MyMacro[optional]{a - b}$%% <-- Following should produce this output


\MySwitch{$\MyMacro[optional]{a - b}$}% <--- This is the problem

\end{document}

注意我加了一对括号里面可选参数,#1即使它本身包含,也是“安全的” [ ... ]

xparse这个问题不会出现,因为它使用了一个可选参数的定义,匹配方括号:因此不需要额外的步骤。

相关内容