编译这个最小示例后
\documentclass[12pt]{article}
\usepackage{xstring}
\newcommand{\digit}[1]{
\IfStrEqCase{#1}{%
{0}{zero}%
{1}{one}%
{2}{two}%
}[many]%
}
\begin{document}
\digit{1}
\digit{2}
\digit{3}
\digit{\StrChar{456}{2}}
\end{document}
我收到以下错误
! TeX capacity exceeded, sorry [input stack size=5000].
\@testopt #1#2->\kernel@ifnextchar [{#1
}{#1[{#2}]}
这段代码能运行吗?
答案1
\StrChar{456}{2}
不是一个数字,而是一组(可能)产生数字的指令。相反,\IfEqStrCase
在完全展开后需要一个明确的数字,而这在 中是不可能的\StrChar
。
您可以使用expl3
(称为 via xparse
)来完成此操作:
\documentclass[12pt]{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\digit}{m}
{
\str_case:fnF { #1 }
{
{0}{zero}%
{1}{one}%
{2}{two}%
}
{many}
}
\cs_generate_variant:Nn \str_case:nnF { f }
\DeclareExpandableDocumentCommand{\extract}{mm}
{
\tl_item:nn { #1 } { #2 }
}
\ExplSyntaxOff
\begin{document}
\digit{1}
\digit{2}
\digit{3}
\digit{\extract{456}{2}}
\end{document}