“表格单元格颜色与单元格边框重叠”的更简单解决方案?

“表格单元格颜色与单元格边框重叠”的更简单解决方案?

我看到很多关于“表格单元格颜色与单元格边框重叠”的讨论。我想分享一下我对这个问题的尝试。另外,我是 Latex 的初学者,我的代码可能不是最好的,我想看看是否有更好的解决方案。

有人说这是 pdf viewer 的问题。我不同意,因为 cellcolor 确实比 cell 更大。

有人说我们可以把边框弄粗,但我觉得这样会让表格看起来很奇怪,所以我不想用它。另一方面,\hhline 解决方案也帮不上什么忙。

彩色表格和 cline/hhline

在此处输入图片描述

线条仍然消失。

在此处输入图片描述

我开始使用 tikz 矩阵来绘制表格。

单元格颜色非常完美,不会与单元格边框重叠。不过,也有一些缺点。

  1. tikz 图片在一个盒子里。(我不太确定)盒子导致缩进和水平盒子过满。我需要使用 trimbox 来纠正表格的位置。
  2. 每个单元格根据其内容的大小不同,您需要设置最小高度/宽度以使表格正确显示。您需要通过“反复试验”找到最佳值。
  3. 制作多列/多行单元格比较困难。你需要使用 parbox 将内容插入单元格,同时还需要通过“反复试验”找到 parbox 的最佳位置。
  4. 换行也比较困难,需要设置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)。

相关内容