\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
,有多种样式可以更改突出显示区域的宽度。可以更改left
、right
、above
、below
offset
s 或组合above left
或s。下面给出了一个示例,以了解突出显示的below right
offset
方式。通过此方法,用户可以完全控制突出显示区域的大小。5
offsets
结果: