根据计数器改变颜色

根据计数器改变颜色

我有一些文本,我想根据计数器的当前状态改变颜色。但我无法编译此文件。(这显然是简化的,因为 texcolour 命令实际上是序言中定义的命令的一部分……)

\documentclass{article}
\usepackage{xcolor}
\newcounter{foo}
\setcounter{foo}{30}
\begin{document}
\textcolor[RGB]{0,\value{foo},0}{Text in FOO colour}
\end{document}

我重复收到以下错误:

! Missing number, treated as zero.
<to be read again> 
                   \
l.8 ...r[RGB]{0,\value{foo},0}{Text in FOO colour}

! Illegal unit of measure (pt inserted).
<to be read again> 
                   \
l.8 ...r[RGB]{0,\value{foo},0}{Text in FOO colour}

我确信还有一些微妙之处我还没有掌握......但\vskip \value{foo} pt编译得很好,并根据计数器的值给我空间,所以我不会偏离太远......

答案1

\the在 ;之前插入\value即可。

至于为什么你必须包括\the:罪魁祸首就是\@onelevel@sanitize里面所说的\XC@edef什么??让我试着解释一下。在某个时候,你的\textcolor命令会调用

\XC@edef\@@clr{0,\value{foo},0}

这反过来又要求

\edef\@@tmp{0,\value{foo},0}

(对主动角色使用了一些技巧),从而使\@@tmp包含0,\c@foo,0不是 0,30,0\edef不将计数器扩展\c@foo到其内容。紧接着,\XC@edef调用

\@onelevel@sanitize\@@tmp

进而扩展为

\edef\@@tmp{\expandafter \strip@prefix \meaning \@@tmp}

这会产生可怕的效果:它将 5 个标记变成0,\c@foo,011 个标记0,\c@foo ,0,即控制序列\c@foo变成了单个字符序列(除空格外,所有字符的 catcode 均为 12)。现在,您已经知道了奇怪错误消息的解释

! Missing number, treated as zero.
<to be read again> 
                   \

\的第一个字符\c@foo!而且它确实不是一个数字。

如果你能跟进到这一点,那么就很容易理解为什么\the这里有帮助:

\edef\@@tmp{0,\the\value{foo},0}

使得 得到\@@tmp遏制0,30,0,就不会再有恶事发生。

相关内容