\xs_IfStringCase_i 的使用与其定义不符?

\xs_IfStringCase_i 的使用与其定义不符?

我以为我已经创建了一个非常简单的命令,但显然这是不允许的。我怀疑我需要\expandafter在某个地方添加,但我不确定(在哪里)。我想详细了解原因。这是 MWE:

\documentclass{minimal}

\usepackage{xstring}
\usepackage{xcolor}

\newcommand{\getcolor}[1]{
    \IfStrEqCase{#1}{
        {r}{red}%
        {b}{blue}%
    }[#1]
}

\begin{document}

\getcolor{r} % prints 'red'

\getcolor{purple} % prints 'purple'

\textcolor{red}{text} % prints 'text' in red

\textcolor{\getcolor{r}}{text} % error

\end{document}

答案1

您的代码存在很大问题,因为\IfStrEqCase它没有生成颜色名称,而是生成了打印它的指令集。

您可以使用可扩展测试。

\documentclass{article}

\usepackage{xcolor}

\ExplSyntaxOn
\NewExpandableDocumentCommand{\getcolor}{m}
  {
    \str_case:nnF { #1 }
      {
        {r}{red}
        {b}{blue}
      }
      {#1}
  }
\ExplSyntaxOff

\begin{document}

\getcolor{r} % prints 'red'

\getcolor{purple} % prints 'purple'

\textcolor{red}{text} % prints 'text' in red

\textcolor{\getcolor{r}}{text} % prints 'text' in red

\textcolor{\getcolor{purple}}{text} % prints 'text' in purple

\end{document}

在此处输入图片描述

如果您的 LaTeX 安装不是最新的,您可能会收到错误。在这种情况下,请添加\usepackage{xparse},但您应该尽快升级。

请不要将其用作minimal代码示例,它不适用于此目的。

相关内容