使用数字来指代颜色

使用数字来指代颜色

我想创建一个命令,允许我用数字指定的颜色为任意文本着色(例如 1 = 绿色,2 = 蓝色等)。为此,我创建了第一个命令,根据数字给出颜色的名称(并且此命令工作正常)。

\documentclass[12pt]{article}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{xstring}
\usepackage[T1]{fontenc}

\newcommand{\levelcolor}[1]{\IfEqCase{#1}{{1}{ForestGreen}{2}{CornflowerBlue}{3}{BurntOrange}{4}{Red}{5}{Black}{6}{Mulberry}}}
\newcommand{\level}[2]{\colorbox{\levelcolor{#2}}{#1}}


\begin{document}
\level{Test}{4}
\end{document}

当在另一个命令中使用此命令的结果时,我收到一条错误消息:

! Use of \@undeclaredcolor doesn't match its definition.
\@ifnextchar ... \reserved@d =#1\def \reserved@a {
                                                  #2}\def \reserved@b {#3}\f...
l.11 \level{Test}{4}

我知道该怎么做才能修复这个问题(以及为什么上述代码无法运行)?

答案1

参数中的颜色规范应该\colorbox完全扩展为颜色名称;由于\IfEqCase对其参数进行了大量工作,并且这项工作包括进行分配,因此不能在需要完全扩展的地方使用它。

一个更好(更简单)的策略是说

\colorlet{levelcolor1}{ForestGreen}
\colorlet{levelcolor2}{CornflowerBlue}
\colorlet{levelcolor3}{BurntOrange}
\colorlet{levelcolor4}{Red}
\colorlet{levelcolor5}{Black}
\colorlet{levelcolor6}{Mulberry}

\newcommand{\levelcolor}[1]{levelcolor#1}

所以\colorbox{\levelcolor{1}}{text}会变成

\colorbox{levelcolor1}{text}

\colorlet使用所选的颜色。


另一种可能性,在某些其他情况下可能会派上用场,如下所示expl3

\usepackage{xparse} % loads also expl3

\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\levelcolor}{m}
 {
  \int_case:nnF { #1 }
   {
    {1}{ForestGreen}
    {2}{CornflowerBlue}
    {3}{BurntOrange}
    {4}{Red}
    {5}{Black}
    {6}{Mulberry}
   }
   {Cyan} % overflow
 }
\ExplSyntaxOff

用这个你甚至可以这样做\levelcolor{1+1}(并不是那么有用),但也可以传递计数器的值\value{counter}

相关内容