如何在 siunitx 命令中使用 IfStrEqCase?

如何在 siunitx 命令中使用 IfStrEqCase?

我无法\IfStrEqCase使用字符串\num从内希尼奇

\documentclass{article}
\usepackage{xstring}
\usepackage{siunitx}

\newcommand{\bla}[1]{%
\IfStrEqCase{#1}{{a}{1}%
    {b}{2}%
    {c}{3}}%
    [0]%
}
\newcommand{\blubb}[1]{1}

\begin{document}
|\num{\blubb{a}}|
|\bla{a}|
|\num{\bla{a}}|    
\end{document}

将会失败|\num{\bla{a}}|

pdflatex.exe> ! TeX capacity exceeded, sorry [input stack size=5000].
pdflatex.exe> \reserved@a ->\def \reserved@a 
pdflatex.exe>                                *{\let \@xs@assign\@xs@expand@and@detokenize...
pdflatex.exe> l.16 |\num{\bla{a}}
pdflatex.exe>                    |
pdflatex.exe> !  ==> Fatal error occurred, no output PDF file produced!

我该如何克服这个问题?欢迎 提供不包含IfStrEqCase但提供其他方法的解决方案switchcase

答案1

正如手册所述,中的命令xstring不是完全可扩展的,并且不能嵌套或使用,例如在中\edef。因此,几个xstring命令都有一个最终可选参数,它是一个宏,可以存储结果。这适用于的情况\IfStrEqCase,因此您需要在代码中为每种情况提供类似这样的内容。例如:

示例输出

\documentclass{article}
\usepackage{xstring}
\usepackage{siunitx}

\newcommand{\bla}[2]{%
\IfStrEqCase{#1}{{a}{\xdef#2{1}}%
    {b}{\xdef#2{2}}%
    {c}{\xdef#2{3}}}%
    [\xdef#2{0}]%
}
\newcommand{\blubb}[1]{1}

\begin{document}
|\num{\blubb{a}}|

|\bla{a}{\outp}\outp|

|\bla{b}{\outp}\num{\outp}|    
\end{document}

通过这种方式你可以定义一个命令

\newcommand{\blanum}[1]{\bla{#1}{\outp}\num{\outp}}

您可以直接使用它\blanum{b}

答案2

这是一个使用 的版本stringstrings。虽然\convertchar宏不能嵌套在\num参数内,但其结果(\thestring)是可扩展的,因此可以分两步解决,就像我在宏\Inum(间接\num)中所做的那样。

编辑后,不仅以字母,而且以单词作为参数。

\documentclass{article}
\usepackage{stringstrings}
\usepackage{siunitx}

\newcommand\Inum[1]{\bla[q]{#1}\num{\thestring}}

\newcommand{\bla}[2][v]{%
    \convertword[q]{#2}{ax}{1}%
    \convertword[q]{\thestring}{by}{2}%
    \convertword[#1]{\thestring}{c}{3}%
}
\newcommand{\blubb}[1]{1}

\begin{document}
|\num{\blubb{a}}|
|\bla{ax}|
|\Inum{by}|  
\end{document}

相关内容