\IfStrEqCase 与 \StrChar 结合的问题

\IfStrEqCase 与 \StrChar 结合的问题

编译这个最小示例后

\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}

在此处输入图片描述

相关内容