我已经成功使用xcolor
及其\cellcolor
命令一段时间了,并产生了漂亮的效果。但是,我想创建一些更高级的背景效果:用两种颜色给单元格上色:
上面的例子是使用https://tex.stackexchange.com/a/263403/17312但这种方法因以下几个原因而失败:
- Tikz 的矩阵命令远不如该
array
包和其他包中的普通表格那么强大。我有一些数字数据,我很高兴能用它们在小数点上对齐dcolumn
- 我不知道如何在 tikz 矩阵中做到这一点。 - 我想模拟 booktabs 的行为,但我无法让它工作。https://tex.stackexchange.com/a/21178/17312提出了一种解决方法,但是它不起作用。
-
一切都崩溃了。
- 我已经看过其他问题了;https://tex.stackexchange.com/a/346212/17312和https://tex.stackexchange.com/a/81998/17312设法动态创建单色条;https://tex.stackexchange.com/a/148797/17312结合起来
tabularx
,并tikz
有一个有前途的方法,但我未能设法使其适应我的目的;将 tikz 节点与表格单元格对齐?绘制线条并设法坚持表格环境 - 也许是一个很好的起点?
因此,理想情况下,我希望坚持一个tabular
环境,并能够自由指定单元格的背景内容(对于这个问题的要点,我很高兴有一个解决方案,可以给我提供对角线分离的效果,如两个示例的左上角所示),使用诸如 之类的命令\twocolor{blue}{purple}
。
答案1
可以通过收集以下信息来实现更灵活的背景定义:我的答案到TikZ:对角线填充的矩形(两种颜色)和贡萨洛的回答到使用 tikz 设置表格背景阴影和阴影。存在一些间距问题,主要是(我认为)因为我不太了解tabular
单元格内的填充宏,特别是booktabs
规则(toprule
,,\midrule
...),所以现在效果更好\hline
,但我相信可以轻松改进。
列说明符不会被否决,但需要明确指定。在下面的 MWE 中,我使用了,dcolumn
但我建议使用siunitx
,就像 Salim Bou 所做的那样。
平均能量损失
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{tikzmark, calc}
% Makes a style for double color filling
\tikzset{
double color fill/.code 2 args={
\pgfdeclareverticalshading[%
tikz@axis@top,tikz@axis@middle,tikz@axis@bottom%
]{diagonalfill}{100bp}{%
color(0bp)=(tikz@axis@bottom);
color(50bp)=(tikz@axis@bottom);
color(50bp)=(tikz@axis@middle);
color(50bp)=(tikz@axis@top);
color(100bp)=(tikz@axis@top)
}
\tikzset{shade, left color=#1, right color=#2, shading=diagonalfill}
}
}
% Code adapted from Gonzalo: https://tex.stackexchange.com/a/67096/81905
\newcommand\BGcell[4][0pt]{%
\begin{tikzpicture}[overlay,remember picture]%
\path[#4] ( $ (pic cs:#2) + (-.5\tabcolsep,1.9ex) $ ) rectangle ( $ (pic cs:#3) + (\tabcolsep,-#1*\baselineskip-.8ex) $ );
\end{tikzpicture}%
}%
\newcounter{BGnum}
\setcounter{BGnum}{1}
\newcommand\cellBG[3]{
\multicolumn{1}{
!{\BGcell{startBG\arabic{BGnum}}{endBG\arabic{BGnum}}{%
#1}
\tikzmark{startBG\arabic{BGnum}}}
#2
!{\tikzmark{endBG\arabic{BGnum}}}}
{#3}
\addtocounter{BGnum}{1}
}
% end of code from Gonzalo
\usepackage{dcolumn, array, booktabs}
\newcolumntype{.}{D{.}{.}{-1}}
\newcommand*{\tabhead}[1]{\multicolumn{1}{c}{#1}}
\begin{document}
\tikzset{%
diagonal fill/.style 2 args={%
double color fill={#1}{#2},
shading angle=45,
opacity=0.8},
other filling/.style={%
shade,
shading=myshade,
shading angle=0,
opacity=0.5}
}
% Other crazy filling options using shading
\pgfdeclarehorizontalshading{myshade}{100bp}{%
color(0bp)=(blue);
color(25bp)=(blue);
color(37.5bp)=(blue);
color(37.5bp)=(brown);
color(50bp)=(brown);
color(50bp)=(green);
color(62.5bp)=(green);
color(62.5bp)=(purple);
color(75bp)=(red);
color(100bp)=(red)}
\begin{tabular}{c.}
\toprule
\cellBG{double color fill={red}{blue}, shading angle=-45, opacity=0.5}{c}{Header 1} & \tabhead{Header 2}\\
\midrule
\cellBG{diagonal fill={yellow}{green}}{c}{Text} & \cellBG{other filling}{.}{1.2333}\\
\cellBG{other filling}{c}{Text} & 154.622\\
Text & 1.244\\
Text & 11.3\\
Text & 121.2\\
\bottomrule
\end{tabular}
\end{document}
该方法依赖于 Ti钾Z 阴影,定义起来并不复杂,而且功能非常强大。声明阴影时要考虑的一件事是,如果您将其定义为,它将100bp
自动缩放,并且阴影的可见部分将介于25bp
和之间75bp
,这就是为什么我的多色阴影的蓝色从0bp
到25bp
,因为那部分实际上是隐藏的。可以使用键shading angle
来设置对角线倾斜度,也可以定义其他类型的阴影(有关更多信息,请查看手册)。
答案2
基于@leoLiu解决方案创建带有对角线的单元格。在示例中,我使用suinitx
而不是dcolumn
将数字按小数点对齐。
\documentclass[11pt]{article}
\usepackage{array}
\usepackage{siunitx}
\usepackage{booktabs}
\usepackage{tikz}
\newcommand\diagfil[4]{%
\multicolumn{1}{p{#1}}{\hskip-\tabcolsep
$\vcenter{\begin{tikzpicture}[baseline=0,anchor=south west,inner sep=0pt,outer sep=0pt]
\path[use as bounding box] (0,0) rectangle (#1+2\tabcolsep,\baselineskip);
\node[minimum width={#1+2\tabcolsep},minimum height=\baselineskip+\extrarowheight+\belowrulesep+\aboverulesep,fill=#2] (box)at(0,-\aboverulesep) {};
\fill [#3] (box.south west)--(box.north east)|- cycle;
\node[anchor=center] at (box.center) {#4};
\end{tikzpicture}}$\hskip-\tabcolsep}}
\begin{document}
\centering
\begin{tabular}{SSSSS}
\toprule
\diagfil{2cm}{blue}{purple}{Text} &&&&2.0\\
\midrule
& & & &3.03\\
15&12&18&50&4.5\\
15&12&18&50&4.54\\
\bottomrule
\end{tabular}
\end{document}
答案3
使用,可以轻松地用 PGF/Tikz 阴影填充单元格或块(合并单元格的矩形){NiceTabular}
。nicematrix
指令\Block[tikz=shade]{n-p}{contents}
将用阴影填充块(n 行和 p 列)阴凉处(并把内容在区块的中心)。
该答案的 Tikz 色调与 Zanotelli 的答案类似。
\documentclass{article}
\usepackage{tikz}
\usepackage{nicematrix}
\usepackage{siunitx}
\usepackage{booktabs}
\begin{document}
% Makes a style for double color filling
\makeatletter
\tikzset{
double color fill/.code 2 args={
\pgfdeclareverticalshading[%
tikz@axis@top,tikz@axis@middle,tikz@axis@bottom%
]{diagonalfill}{100bp}{%
color(0bp)=(tikz@axis@bottom);
color(50bp)=(tikz@axis@bottom);
color(50bp)=(tikz@axis@middle);
color(50bp)=(tikz@axis@top);
color(100bp)=(tikz@axis@top)
}
\tikzset{shade, left color=#1, right color=#2, shading=diagonalfill}
}
}
\makeatother
\tikzset{%
diagonal fill/.style 2 args={%
double color fill={#1}{#2},
shading angle=45,
opacity=0.8},
other filling/.style={%
shade,
shading=myshade, % myshade is defined below
shading angle=0,
opacity=0.5}
}
% Other crazy filling options using shading
\pgfdeclarehorizontalshading{myshade}{100bp}{%
color(0bp)=(blue);
color(25bp)=(blue);
color(37.5bp)=(blue);
color(37.5bp)=(brown);
color(50bp)=(brown);
color(50bp)=(green);
color(62.5bp)=(green);
color(62.5bp)=(purple);
color(75bp)=(red);
color(100bp)=(red)}
\begin{NiceTabular}{cS}
\toprule
\Block[tikz={double color fill={red}{blue}, shading angle=-45, opacity=0.5}]{}{Header 1} & {Header 2} \\
\midrule
\Block[tikz={diagonal fill={yellow}{green}}]{2-1}{Text} & \Block[tikz=other filling]{}{1.2333} \\
& 154.622\\
\Block[tikz = other filling]{1-1}{Text} & 1.244 \\
Text & 11.3\\
Text & 121.2\\
\bottomrule
\end{NiceTabular}
\end{document}
您需要多次编译(因为nicematrix
使用 PGF/Tikz 节点)。