通过宏定义颜色时出现“未定义的控制序列”错误

通过宏定义颜色时出现“未定义的控制序列”错误

color!\somemacro我正在尝试使用单元格的数据值为单元格着色。但是,当我尝试计算某个值(使用单元格的内容)时,中的颜色定义\cellcolor不起作用。其中\somemacro存储了计算结果。

我得到的错误是:

!未定义控制序列。蓝色!\y

为什么会发生这种情况?我猜问题与宏的扩展部分有关,但我不知道这是如何工作的。有人能解释一下这种情况是如何/为什么发生的以及如何避免它吗?

\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{pgfplotstable}

\pgfplotstableset{
    color cells/.style={
        col sep=comma,
        string type,
        postproc cell content/.code={%
                \pgfkeysalso{@cell content=\rule{0cm}{2.4ex}%
                \pgfmathsetmacro\y{round(##1 * 0.5)}\cellcolor{blue!\y}%
                ##1}%
                }
    }
}

\begin{document}
\begin{table}\caption{Colors}
\centering
\pgfplotstabletypeset[color cells]{
a,b,c,d
50,300,200,100
20,0,100,200
}
\end{table}
\end{document}

答案1

该命令\cellcolor实际上并没有立即设置单元格颜色,而是将其存储起来以供以后处理。虽然我的样式文件解析技能无法确定它最终用在何处,但代码中断的一个线索是存储过程定义了一个全球的\CT@cell@color。由于它是全局的,我怀疑它会在当前组之外进行处理。这个全局宏保存了颜色定义原样:在声明\show\CT@cell@color后面放置\cellcolor(使用合适的\makeatletter ... \makeatother),我们在日志文件中得到以下内容:

\CT@cell@color=macro:
->\CT@color {blue!\y }\global \let \CT@cell@color \relax .

因此,\CT@cell@color宏将其参数与完整的一起保存。但(可能)在已设置的\y组之外处理它。有人可能会尝试将其设为全局,但我发现这会导致问题。避免这些问题的另一种常用方法是在将其传递给之前强制展开。最简单的方法是使用和一个临时宏。\y\y\y\cellcolor\edef

\documentclass{article}
%\url{http://tex.stackexchange.com/q/54872/86}
\usepackage[table]{xcolor}
\usepackage{pgfplotstable}


\pgfplotstableset{
    color cells/.style={
        col sep=comma,
        string type,
        postproc cell content/.code={%
                \pgfkeysalso{@cell content=\rule{0cm}{2.4ex}%
                \pgfmathsetmacro\y{min(100,max(0,round(##1 * 0.5)))}\edef\temp{\noexpand\cellcolor{blue!\y}}\temp%
                ##1}%
                }
    }
}

\begin{document}
\begin{table}\caption{Colors}
\centering
\pgfplotstabletypeset[color cells]{
a,b,c,d
50,300,200,100
20,0,100,200
}
\end{table}
\end{document}

(注意:一旦我让它工作起来,它就会抱怨数字超出范围,所以我将可能的值截断\y到范围内[0,100]

按内容设置颜色的表格

相关内容