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]
)