Я знаю, что существует pgf, и многие используют его для создания тепловых карт. Однако мне не разрешено использовать этот пакет. Поэтому я хочу создать команду, которая позволит мне раскрашивать различные ячейки.
я нашел этовопрос, который показал следующееdef
\def\cca#1{\cellcolor{black!#10}\ifnum #1>5\color{white}\fi{#1}}
Но, судя по его комментариям и моим тестам, это работает только от 0 до 9.
Мне хотелось создать что-то более общее, вроде этого псевдокода:
\newcommand{\cTab}[2]
{
\res = #1/#2 %maybe using FP (?)
\eighty = 0.8*#2 %maybe using FP (?)
\cellcolor{black!\res}
\ifnum #1>\eighty
\color{white}
\fi{#1}
}
То есть, по сути, проблема заключается в том, чтобы вычислить число, а затем повторно использовать его для определения цвета и т. д.?
Я могу вычислить число с помощью FP, но не могу повторно использовать его в cellcolor
или ifnum
.
МВЭ
\documentclass[letterpaper, 10 pt]{article}
% Color
\usepackage{xcolor,colortbl}%
\begin{document}
\begin{table}[!ht]
\centering
\caption{True data classification.}
\label{tab:CollectedErrors}
\begin{tabular}{|p{1.5cm}|p{0.5cm}|}
\hline
\textbf{Exposure}& \textbf{Attribute} \\ \hline
4 & 2 \\ \hline
11 &144 \\ \hline
\end{tabular}
\end{table}
\end{document}
По сути, мне нужно создать тепловую карту, т. е. раскрасить ячейки на основе числа в ячейке таблицы.
MWE с использованием кода из решения 1
\documentclass[letterpaper, 10 pt]{article}
% Color
\usepackage{xcolor,colortbl}%
\usepackage{xintexpr}
\newcommand{\cTab}[2]
{%
\edef\res {\xinttheiexpr [2] #1/#2\relax}% [2] = "two digits after ."
\edef\eighty {\xinttheiexpr [2] 0.8*#2\relax}%
\cellcolor{black!\res}%
\xintifboolexpr {#1>\eighty}
% yes branch
{\color{white}}
% no branch (nothing to do)
{}%
{#1}%
}%
\begin{document}
\begin{table}[!ht]
\centering
\caption{True data classification.}
\label{tab:CollectedErrors}
\begin{tabular}{|p{1.5cm}|p{0.5cm}|}
\hline
\textbf{Exposure}& \textbf{Attribute} \\ \hline
\cTab{4}{4} & 2 \\ \hline %example, could also be \cTab{4}{144}, in theory all cells should be changed to cTab
11 &144 \\ \hline
\end{tabular}
\end{table}
\end{document}
решение1
Вы можете попробовать
\usepackage{xintexpr}
\newcommand{\cTab}[2]
{%
\edef\res {\xinttheiexpr [2] #1/#2\relax}% [2] = "two digits after ."
\edef\eighty {\xinttheiexpr [2] 0.8*#2\relax}%
\cellcolor{black!\res}%
\xintifboolexpr {#1>\eighty}
% yes branch
{\color{white}}
% no branch (nothing to do)
{}%
{#1}%
}%
Но mwe помогло бы. Хорошо, mwe показал, что мне нужно, \xdef\res
но я совсем не понимаю, на что оно направлено. Обновление, чтобы объяснить, теперь я лучше понимаю... (Я был сбит с толку по поводу xcolor
спецификации цвета с a, !
поскольку меня заставили поверить, что для этого требуется число от 0 до 1, тогда как запрашивается процент от 0 до 100).
Обновлено, чтобы избежать определения макросов \res
( \eighty
особенно \res
раздражало то, что требовалась глобальная область видимости; но мы можем использовать \xinttheiexpr
здесь расширяемость).
\documentclass[letterpaper, 10 pt]{article}
% Color
\usepackage{xcolor,colortbl}
% Fine stuff
\usepackage{xintexpr, xinttools}
\newcommand{\cTab}[2]% #1 = cell, #2 = max
{%
\cellcolor{black!\xinttheiexpr 100*#1/#2\relax}%
\xintifboolexpr {#1>0.8*#2}%
% "yes" branch
{\textcolor{blue}{#1}}% when #1 is big, print it blue
% "no" branch
{#1}%
}%
\begin{document}
\begin{table}[!ht]
\centering
\caption{True data classification.}
\label{tab:CollectedErrors}
\smallskip
\begin{tabular}{|p{1.5cm}|c|}
\hline
\textbf{Exposure}& \textbf{Attribute} \\ \hline
\xintFor* #1 in {\xintSeq[3]{1}{100}}\do
{%
\cTab{#1}{100} & \cTab{\the\numexpr100-#1\relax}{100}\\
}
\hline
\end{tabular}
\end{table}
\end{document}
Обратите также внимание на использование \textcolor
.