答案1
这个问题吸引了我:如何根据单元格中的值自动为表格条目着色?也就是说,我们如何制作不那么随机的表格
\begin{tabular}{ *7H }
-1.0 & -0.9 & -0.8 & -0.7 & -0.6 & -0.5 & -0.4 \\
-0.3 & -0.2 & -0.1 & 0.0 & 0.1 & 0.2 & 0.3 \\
0.4 & 0.5 & 0.6 & 0.7 & 0.8 & 0.9 & 1.0 \\
\multicolumn{7}{c}{Min
\tikz{\shade[left color=blue,right color=red]
(current page.south west) rectangle ++(#1,12pt);}
Max}
\end{tabular}
产生以下内容?
[原帖作者可能主要想问的是绘制渐变阴影,但正如 John Kormylo 在评论中所说(以及上面显示的那样),这很容易做到,使用蒂克兹。
在回答这个问题时,我假设这些矩阵的条目在和之间-1
——1
很容易将下面的代码更改为适用于其他域。要根据条目的值自动为每个单元格分配背景颜色,我首先使用大批定义新列类型的包
\newcolumntype{H}{>{\collectcell\Heat}r<{\endcollectcell}}
反过来,H
列类型使用胶原细胞包将命令应用于\Heat
每个单元格条目。宏首先使用将单元格条目映射到和\Heat
之间的整数0
100
数学
\pgfmathparse{int(50+50*#1)}% map number in [-1,1] to [0,100]
然后,这个数字用于设置单元格的背景颜色\cellcolor{red!\pgfmathresult!blue}
-- 虽然实际上这里需要一点扩展技巧。有了这些定义,上面的代码就可以实现我想要的效果了。
完整代码如下:
\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{collcell}
\usepackage{array}
\usepackage{tikz}
\newcolumntype{H}{>{\collectcell\Heat}r<{\endcollectcell}}
\newcommand\Heat[1]{% \Heat{number in the interval [-1,1]}
\pgfmathparse{int(50+50*#1)}% map number in [-1,1] to [0,100]
\edef\HeatCell{\noexpand\cellcolor{red!\pgfmathresult!blue}}%
\HeatCell$#1$%
}
\begin{document}
\begin{tabular}{ *7H }
-1.0 & -0.9 & -0.8 & -0.7 & -0.6 & -0.5 & -0.4 \\
-0.3 & -0.2 & -0.1 & 0.0 & 0.1 & 0.2 & 0.3 \\
0.4 & 0.5 & 0.6 & 0.7 & 0.8 & 0.9 & 1.0 \\
\multicolumn{7}{c}{Min
\tikz{\shade [left color=blue ,right color=red]
(current page.south west) rectangle ++(#1,12pt);}
Max}
\end{tabular}
\end{document}
话虽如此,颜色的选择让表格看起来非常花哨和不美观。第一个改进是将文本颜色改为白色,我们可以这样做\Heat
:
\newcommand\Heat[1]{% \Heat{number in the interval [-1,1]}
\pgfmathparse{int(50+50*#1)}% map number in [-1,1] to [0,100]
\edef\HeatCell{\noexpand\cellcolor{red!\pgfmathresult!blue}}%
\HeatCell\textcolor{white}{$#1$}%
}
得出的结果为:
我们可以将颜色改为Yellow1
和SpringGreen3
(使用x11names
选项彩色), 要得到:
编辑
只是为了好玩,下面是相同的代码,但是鍵盤通过等设置颜色和最小/最大值的界面\Heatset{min colour=blue, max colour=red}
。还有一个\Heatset{slider= <width> }
渐变条滑块:
\documentclass{article}
\usepackage[table,x11names]{xcolor}
\usepackage{collcell}
\usepackage{array}
\usepackage{tikz}
\usepackage{pgfkeys}
% set up pgfkeys for controlling heat specifications
\pgfkeys{/heat/.is family, /heat,
min colour/.initial = Yellow1,
max colour/.initial = SpringGreen3,
text colour/.initial = black,
min color/.style = {min colour=#1},% for our friends who can't spell
max color/.style = {max colour=#1},
text color/.style = {text colour=#1},
min/.initial = -1,
max/.initial = 1,
slider/.code={%
\tikz{\shade[left color=\HVal{min colour},%
right color=\HVal{max colour}]%
(current page.south west) rectangle ++(#1,12pt);
}%
}%
}
\newcommand\Heatset[1]{\pgfkeys{/heat, #1}}
\newcommand\HVal[1]{\pgfkeysvalueof{/heat/#1}}
\newcolumntype{H}{>{\collectcell\Heat}r<{\endcollectcell}}
\newcommand\Heat[1]{% \Heat{number in the interval [min, max] }
\pgfmathparse{int(100*(#1-\HVal{min})/(\HVal{max}-\HVal{min}))}% map number to [0,100]
\edef\HeatCell{\noexpand\cellcolor{\HVal{max colour}!\pgfmathresult!\HVal{min colour}}}%
\HeatCell\textcolor{\HVal{text colour}}{$#1$}%
}
\begin{document}
\begin{tabular}{ *7H }
-1.0 & -0.9 & -0.8 & -0.7 & -0.6 & -0.5 & -0.4 \\
-0.3 & -0.2 & -0.1 & 0.0 & 0.1 & 0.2 & 0.3 \\
0.4 & 0.5 & 0.6 & 0.7 & 0.8 & 0.9 & 1.0 \\
\multicolumn{7}{c}{Min \Heatset{slider=5.5} Max}
\end{tabular}
\bigskip\noindent
\Heatset{max colour=red, min colour=blue, min=0, max=100, text colour=white}
\verb|\Heatset{max colour=red, min colour=blue, min=0, max=100, text colour=white}|
\begin{tabular}{ *7H }
10 & 90 & 80 & 70 & 60 & 50 & 40 \\
30 & 20 & 10 & 00 & 10 & 20 & 30 \\
40 & 50 & 60 & 70 & 80 & 90 & 10 \\
\multicolumn{7}{c}{Min \Heatset{slider=3.0} Max}
\end{tabular}
\end{document}
得出的结果为: