我想创建一个命令,允许我用数字指定的颜色为任意文本着色(例如 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}
。