我想将表格环境中的单元格颜色设置为热图,就像 Unas 的解决方案一样通过 TikZ 对表格中的阴影进行参数化,但表格中有负数。我想为这些单元格设置 0 阴影,但我无法适当设置 if 条件。
我可以使用 if 条件很好地计算“阴影”变量,但如果原始数字为负数,则不允许将结果传播给函数。
请考虑下面的 MWE。如果我尝试同时取消注释第 9 行和第 16 行,我会收到“17:缺少数字,视为零。[\end]”和“17:非法计量单位(插入 pt)。[\end]”错误。
\documentclass{article}
\usepackage{xcolor,colortbl}
\usepackage{xintexpr}
\newcommand{\cca}[1]{%
\gdef\shade{\ifnum\numexpr#1<0\relax {\xinttheiexpr 0\relax}\else#1\fi}
\shade
%\ccadoit[10]{#1}% it works
% \ccadoit[0]{#1}% it works
\ccadoit[\shade]{#1}% it works only for \cca{nonnegative_number}
}
\def\ccadoit[#1]#2{\cellcolor{brown!#1}{ #2}}
\begin{document}
\begin{tabular}{r}
\cca{10} \\ % it works
\cca{0} \\ % it works
\cca{-10} \\ % it does not work with \ccadoit[\shade]{#1}
\end{tabular}
\end{document}
答案1
\relax
不可扩展;您必须确保计算中的所有内容都是可扩展的。为此,我\relax
在数字比较后删除了空格(这应该会停止对数字的扫描)。
\documentclass{article}
\usepackage[table]{xcolor}
\newcommand{\shade}[1]{\ifnum\numexpr#1<0 0\else#1\fi}
\newcommand{\cca}[1]{%
\ccadoit[\shade{#1}]{#1}%
}
\def\ccadoit[#1]#2{\cellcolor{brown!#1}{ #2}}
\begin{document}
\begin{tabular}{rrrr}
\cca{100} & \cca{90} & \cca{80} & \cca {70} \\
\cca {60} & \cca{50} & \cca{40} & \cca {30} \\
\cca {20} & \cca{10} & \cca{ 0} & \cca{-10}
\end{tabular}
\end{document}
答案2
问题是,\shade
当在 内部使用 时, 不会展开\cellcolor
。更好的方法是在 语句\shade
内定义\if
,而不是\fi
在 的定义内使用 语句\shade
。话虽如此,您的定义不必要地复杂:\gdef\shade{\ifnum#1<0 0\else#1\fi}
在代码中使用 可以正常工作。
与定义相比\cca
,\ccadoit
使用一个宏更有效率:
\documentclass{article}
\usepackage{xcolor,colortbl}
\newcommand{\cca}[1]{%
\ifnum#1<0\cellcolor{red!10}{#1}\else\cellcolor{brown!#1}{#1}\fi
}
\begin{document}
\begin{tabular}{r}
\cca{100} \\ % it works
\cca{10} \\ % it works
\cca{0} \\ % it works
\cca{-10} \\ % it does not work with \ccadoit[\shade]{#1}
\end{tabular}
\end{document}
生产: