我正在尝试使用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
这个问题不会出现,因为它使用了一个可选参数的定义,做匹配方括号:因此不需要额外的步骤。