LaTeX cellcolor + ifnum 比较中的负数:未编译

LaTeX cellcolor + ifnum 比较中的负数:未编译

我想将表格环境中的单元格颜色设置为热图,就像 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}

生产:

相关内容