使用 booktabs 和 cellcolor 的表格看起来很丑

使用 booktabs 和 cellcolor 的表格看起来很丑

\cellcolor当在表格中使用时booktabs,我发现输出并不是很吸引人:

桌子

我不太在意彩色单元格是否接触上面和下面的线条(参见使用 colortbl 和 booktabs 对表格中的列进行着色),但我觉得丑陋的是,\cellcolor命令与其标题的缩短相结合看起来很糟糕\midrule。我原本想问如何\cellcolor以类似的方式简单地缩短,但我猜输出仍然不太吸引人,因为3不再位于其背景的中心。

因此,这里有一个更基本的问题:什么是最佳做法,可以让事情看起来更吸引人?我确实喜欢这种booktabs风格,我有几个表格,我想在其中突出显示一些单元格。请注意,我并不一定要使用背景来突出显示,但我想不出更好的方法:使用粗体似乎可以传达突出显示的值更重要(而实际上它们是错误情况),使用斜体则不太明显。

以下是相应的 MWE:

\documentclass{article}

\usepackage{booktabs}
\usepackage{colortbl}

\begin{document}

 \begin{tabular}{ccccc}
    \toprule
        \multicolumn{2}{c}{a} & \multicolumn{3}{c}{b} \\
    \cmidrule(lr){1-2}\cmidrule(lr){3-5}
        1 & 2 & \cellcolor[gray]{0.9}3 & 4 & 5 \\
    \bottomrule
\end{tabular}

\end{document}

答案1

\cellcolor\cellcolor添加填充以确保相邻单元格背景相互接触。我相信你根本不需要。

\documentclass{article}

\usepackage{booktabs}
\usepackage{xcolor}

\makeatletter
\newcommand{\ccell}[3][]{%
  \kern-\fboxsep
  \if\relax\detokenize{#1}\relax
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
  {\colorbox{#2}}%
  {\colorbox[#1]{#2}}%
  {#3}\kern-\fboxsep
}
\makeatother
\definecolor{cellgray}{gray}{0.9}
\AtBeginDocument{\setlength{\cmidrulekern}{0.3em}}

\begin{document}

\begin{tabular}{ccccc}
\toprule
\multicolumn{2}{c}{a} & \multicolumn{3}{c}{b} \\
\cmidrule(lr){1-2}\cmidrule(lr){3-5}
1 & 2 & \ccell[gray]{0.9}{3} & 4 & 5 \\
1 & 2 & \ccell{cellgray}{3} & 4 & 5 \\
\bottomrule
\end{tabular}

\end{document}

这两个\kern命令使 TeX 认为默认的填充\colorbox尚未添加到单元格的宽度中。稍微改变修剪量\cmidrule可确保中间规则覆盖彩色单元格。

请注意,语法\ccell允许直接指定颜色或使用定义的颜色。

在此处输入图片描述

的定义\ccell可以简化为

\makeatletter
\protected\def\ccell#1#{%
  \kern-\fboxsep
  \@ccell{#1}%
}
\def\@ccell#1#2#3{%
  \colorbox#1{#2}{#3}%
  \kern-\fboxsep
}
\makeatother

答案2

还有通常的tikzmark做法:

\documentclass{article}

\usepackage{booktabs,colortbl}
\usepackage{xparse}

\usepackage{tikz}
\usetikzlibrary{tikzmark}

\newcommand{\fillcol}{gray!50}
\newcommand{\bordercol}{white}
\pgfkeys{/tikz/.cd,
      set fill color/.code={\renewcommand{\fillcol}{#1}},
      set border color/.code={\renewcommand{\bordercol}{#1}},
      left offset/.store in=\leftoff,
      right offset/.store in=\rightoff,
      above offset/.store in=\aboveoff,
      below offset/.store in=\belowoff,
      left offset=-0.02,
      right offset=0.12,
      above offset=0.325,
      below offset=-0.1,
      below right offset/.store in=\belowrightoff,
      below right offset={\rightoff,\belowoff},
      above left offset/.store in=\aboveleftoff,
      above left offset={\leftoff,\aboveoff},
}%

\NewDocumentCommand{\tikzmarkin}{o m D(){\belowrightoff} D(){\aboveleftoff}}{%
    \IfNoValueTF{#1}{%true
      \tikz[remember picture,overlay]
      \draw[line width=1pt,rectangle,fill=\fillcol,draw=\bordercol]
      (pic cs:#2) ++(#3) rectangle (#4)
      ;}
      {%false
      \tikz[remember picture,overlay]
      \draw[line width=1pt,rectangle,fill=\fillcol,draw=\bordercol,#1]
      (pic cs:#2) ++(#3) rectangle (#4)
      ;
      }
}      


\newcommand\tikzmarkend[2][]{%
\tikz[remember picture with id=#2] #1;}

\begin{document}

 \begin{tabular}{ccccc}
    \toprule
        \multicolumn{2}{c}{a} & \multicolumn{3}{c}{b} \\
    \cmidrule(lr){1-2}\cmidrule(lr){3-5}
        1 & 2 & \tikzmarkin{a}3\tikzmarkend{a} & 4 & \tikzmarkin[above left offset={0.15,0.325}, below right offset={0.05,-0.1},set fill color=red!80]{b}5\tikzmarkend{b} \\
    \bottomrule
\end{tabular}

\end{document}

类似地hf-tikz,有多种样式可以更改突出显示区域的宽度。可以更改leftrightabovebelow offsets 或组合above left或s。下面给出了一个示例,以了解突出显示的below right offset方式。通过此方法,用户可以完全控制突出显示区域的大小。5offsets

结果:

在此处输入图片描述

相关内容