我看到很多关于“表格单元格颜色与单元格边框重叠”的讨论。我想分享一下我对这个问题的尝试。另外,我是 Latex 的初学者,我的代码可能不是最好的,我想看看是否有更好的解决方案。
有人说这是 pdf viewer 的问题。我不同意,因为 cellcolor 确实比 cell 更大。
有人说我们可以把边框弄粗,但我觉得这样会让表格看起来很奇怪,所以我不想用它。另一方面,\hhline 解决方案也帮不上什么忙。
线条仍然消失。
我开始使用 tikz 矩阵来绘制表格。
单元格颜色非常完美,不会与单元格边框重叠。不过,也有一些缺点。
- tikz 图片在一个盒子里。(我不太确定)盒子导致缩进和水平盒子过满。我需要使用 trimbox 来纠正表格的位置。
- 每个单元格根据其内容的大小不同,您需要设置最小高度/宽度以使表格正确显示。您需要通过“反复试验”找到最佳值。
- 制作多列/多行单元格比较困难。你需要使用 parbox 将内容插入单元格,同时还需要通过“反复试验”找到 parbox 的最佳位置。
- 换行也比较困难,需要设置
textwidth
单元格的 才能换行。
这是 MWE。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix,positioning,backgrounds,fit}
\tikzset{no right/.style={
draw=none,
append after command={
[shorten <= -0.5\pgflinewidth]
(\tikzlastnode.north east)
edge(\tikzlastnode.north west)
([shift={( 0.5\pgflinewidth,-0.5\pgflinewidth)}]\tikzlastnode.north west)
edge([shift={( 0.5\pgflinewidth,+0.5\pgflinewidth)}]\tikzlastnode.south west)
([shift={( 0.5\pgflinewidth,+0.5\pgflinewidth)}]\tikzlastnode.south west)
edge([shift={(-1.0\pgflinewidth,+0.5\pgflinewidth)}]\tikzlastnode.south east)
}
}
}
\tikzset{no left/.style={
draw=none,
append after command={
[shorten <= -0.5\pgflinewidth]
(\tikzlastnode.north east)
edge(\tikzlastnode.north west)
([shift={( -0.5\pgflinewidth,0.5\pgflinewidth)}]\tikzlastnode.north east)
edge([shift={( -0.5\pgflinewidth,0.5\pgflinewidth)}]\tikzlastnode.south east)
([shift={( 0.5\pgflinewidth,+0.5\pgflinewidth)}]\tikzlastnode.south west)
edge([shift={(-1.0\pgflinewidth,+0.5\pgflinewidth)}]\tikzlastnode.south east)
}
}
}
\tikzset{no left right/.style={
draw=none,
append after command={
[shorten <= -0.5\pgflinewidth]
(\tikzlastnode.north east)
edge(\tikzlastnode.north west)
([shift={( 0.5\pgflinewidth,+0.5\pgflinewidth)}]\tikzlastnode.south west)
edge([shift={(-1.0\pgflinewidth,+0.5\pgflinewidth)}]\tikzlastnode.south east)
}
}
}
\begin{document}
\begin{tikzpicture}[cell/.style={rectangle,draw=black},nodes in empty cells]
\matrix (m) [
matrix of nodes,
row sep=-\pgflinewidth,
column sep=-2\pgflinewidth,
nodes={anchor=center,text height=2ex,text depth=0.25ex},
column 1/.style = {nodes={cell, minimum width=1cm}},
column 2/.style = {nodes={cell, minimum width=2cm}},
column 3/.style = {nodes={cell, minimum width=2cm}},
row 1/.style={nodes={cell,fill=black!25!white}},
row 2/.style={nodes={cell}},
row 3/.style={nodes={cell}},
row 4/.style={nodes={cell}},
]
{ & 2 & 3 \\
|[no right,fill=black!25!white]| & |[no left right,draw=none,fill=black!25!white]| & |[no left,fill=black!25!white]| \\
2 & c & d \\
3 & & e \\
};
\node[fit=(m-2-1)(m-2-3)]{\parbox[c][2.5em][b]{5cm}{\centering green cell long}};
\end{tikzpicture}
\end{document}
上述代码基于:在 TikZ 中剪切矩形节点的一侧
我的问题是:有没有更简单的方法来绘制“完美表格”?(即表格单元格颜色不会与单元格边框重叠。)
答案1
这算是完美的桌子吗?
\documentclass[tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix,positioning,backgrounds,fit}
\begin{document}
\tikzset{
a/.style={
draw,fill=white
},
b/.style={
draw,fill=gray!50
},
c/.style={
draw,fill=green,inner ysep=0,inner xsep=-.5\pgflinewidth
}
}
\begin{tikzpicture}
\matrix (m) [
matrix of nodes,
nodes in empty cells,
row sep=-\pgflinewidth,
column sep=-2\pgflinewidth,
nodes={anchor=center,text height=2ex,text depth=0.25ex},
column 1/.style = {nodes={a, minimum width=1cm}},
column 2/.style = {nodes={a, minimum width=2cm}},
column 3/.style = {nodes={a, minimum width=2cm}},
row 1/.style={nodes={b}},
]
{ & 2 & 3 \\
& & \\
2 & c & d \\
3 & & e \\
};
\node[c,fit=(m-2-1)(m-2-3)]{\parbox[c][2.5em][b]{5cm}{\centering green cell long}};
\end{tikzpicture}
\end{document}
答案2
该软件包nicematrix
有专门用于解决该问题的工具。使用该软件包,彩色面板在规则之前绘制,使用文件中写入的信息aux
(因此需要多次编译)。
\documentclass{article}
\usepackage{colortbl}
\usepackage{nicematrix}
\begin{document}
\begin{tabular}{|c|c|c|}
\hline
\rowcolor{blue!15}%
text & text & text \\
\hline
text & \multicolumn{2}{c|}{\cellcolor{red!15}block} \\
\hline
text & text & text \\
\hline
\end{tabular}
\bigskip
\begin{NiceTabular}{ccc}[color-inside,hvlines]
\rowcolor{blue!15}%
text & text & text \\
text & \Block[fill=red!15]{1-2}{block} \\
text & text & text \\
\end{NiceTabular}
\end{document}
备注:使用colortbl
,生成的 PDF 在数学上是完美的,但一些 PDF 阅读器会遇到困难,因为光栅化通常需要在规则之前绘制彩色面板( 并非如此colortbl
)。