平均能量损失

平均能量损失

我已经成功使用xcolor及其\cellcolor命令一段时间了,并产生了漂亮的效果。但是,我想创建一些更高级的背景效果:用两种颜色给单元格上色:

Example of attempted solutions

上面的例子是使用https://tex.stackexchange.com/a/263403/17312但这种方法因以下几个原因而失败:

  1. Tikz 的矩阵命令远不如该array包和其他包中的普通表格那么强大。我有一些数字数据,我很高兴能用它们在小数点上对齐dcolumn- 我不知道如何在 tikz 矩阵中做到这一点。
  2. 我想模拟 booktabs 的行为,但我无法让它工作。https://tex.stackexchange.com/a/21178/17312提出了一种解决方法,但是它不起作用。
  3. 如果列宽未预先定义,则颜色会变得不均匀: Example 2

    一切都崩溃了。

  4. 我已经看过其他问题了;https://tex.stackexchange.com/a/346212/17312https://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}

该方法依赖于 TiZ 阴影,定义起来并不复杂,而且功能非常强大。声明阴影时要考虑的一件事是,如果您将其定义为,它将100bp自动缩放,并且阴影的可见部分将介于25bp和之间75bp,这就是为什么我的多色阴影的蓝色从0bp25bp,因为那部分实际上是隐藏的。可以使用键shading angle来设置对角线倾斜度,也可以定义其他类型的阴影(有关更多信息,请查看手册)。

enter image description here

答案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}

enter image description here

答案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 节点)。

Output of the above code

相关内容