![如何在 siunitx 命令中使用 IfStrEqCase?](https://linux22.com/image/286019/%E5%A6%82%E4%BD%95%E5%9C%A8%20siunitx%20%E5%91%BD%E4%BB%A4%E4%B8%AD%E4%BD%BF%E7%94%A8%20IfStrEqCase%EF%BC%9F.png)
我无法\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
但提供其他方法的解决方案switch
。case
答案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}