我知道有 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
or內重複使用它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 會有幫助。好吧,我表明我需要,\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
。