我有一些文本,我想根据计数器的当前状态改变颜色。但我无法编译此文件。(这显然是简化的,因为 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,0
11 个标记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
,就不会再有恶事发生。