表格中使用 \hhline 的问题

表格中使用 \hhline 的问题

考虑以下 MWE

\documentclass{standalone}
\usepackage{multirow}
\usepackage[table]{xcolor}
\usepackage{hhline}
\newcommand{\firstrow}[1]{%
  \multicolumn{2}{|c|}{\cellcolor{blue!25} #1}
}
\newcolumntype{C}{>{\cellcolor{blue!50} }c<{}}

\begin{document}
\renewcommand{\arraystretch}{2}
  \begin{tabular}{|C|C|c|C|C|}
    \hhline{--~--}
    \firstrow{R1C1--2}&&\firstrow{R1C4--5} \\ 
    \hhline{--~--}
    \hhline{==~~~}
    R2C1 & R2C2 & \multicolumn{3}{c}{\strut} \\
    \hhline{--~--}
    R3C1 & R3C2 && R3C4 &  R3C5  \\ 
    \hhline{--~--}
    R4C1 &  R4C2  &&  \multirow{2}{*}{R4--5C4} & \multirow{2}{*}{R4--5C5} \\ 
    \hhline{--~~~}
    R5C1 & R5C2 &&&  \\ 
    \hhline{--~--}
    R6C1 & R6C2 && R6C5 &  R6C5                                    
    \\ 
    \hhline{--~--}
  \end{tabular}
\end{document}

结果是

在此处输入图片描述

存在一些问题:

  1. 第 3 列和第 4 列之间的角画得不太好;
  2. 单元格 R5C4-5 的背景颜色覆盖了单元格 R4C4-5 的内容;
  3. R4C4-5 和 R5C4-5 之间的水平线不应该存在;
  4. 所有单元格的边框看起来并不统一,但我不明白这是显示器上显示的图形问题还是实际问题;
  5. 小问题:第 3 列用于将第 1-2 列与第 4-5 列分隔开;如果能够控制其宽度就更好了(我希望它比现在更窄)。

问题 3 与这个问题但我无法在那里找到解决方案,因为那里的代码太乱了。

答案1

{NiceTabular}以下是使用构建该表的一种方法nicematrix

\documentclass{article}
\usepackage{xcolor}
\usepackage{nicematrix}

\begin{document}

\begin{NiceTabular}{cc>{\hspace*{-2mm}}ccc}[cell-space-limits=2mm]
\Block[draw,fill=blue!50]{1-2}{R1C1-2} & & & \Block[draw,fill=blue!50]{1-2}{R1C4-5} \\
\noalign{\vspace{-2mm}}
\\
\Block[hvlines,fill=blue!25]{5-2}{}
R2C1 & R2C2 \\
R3C1 & R3C2 & & \Block[hvlines,fill=blue!25]{4-2}{} 
                R3C4                & R3C5 \\
R4C1 & R4C2 & & \Block{2-1}{R4-5C4} & \Block{2-1}{R4-5C5} \\
R5C1 & R5C2 \\
R6C1 & R6C2 & & R6C4 & R6C5 
\end{NiceTabular}

\end{document}

您需要多次编译(因为nicematrix在后台使用 PGF/Tikz 节点)。

上述代码的输出

答案2

通过努力,我解决了我的问题。

我发布该解决方案是为了防止其他人需要它。

\documentclass{standalone}
\usepackage{multirow}
\usepackage[table]{xcolor}
\usepackage{hhline}
\newcommand{\firstrow}[2]{%
  \multicolumn{2}{#1}{\cellcolor{blue!25} #2}
}
\newcolumntype{C}{>{\cellcolor{blue!50} }c<{}}
\setlength{\arrayrulewidth}{2pt}
\begin{document}
\renewcommand{\arraystretch}{2}
  \begin{tabular}{|C|C|>{\hspace*{-3mm}}c|C|C|}
    \hhline{--~|--}
    \firstrow{|c|}{R1C1--2}&&\firstrow{c|}{R1C4--5} \\ 
    \hhline{--~|--}
    \multicolumn{5}{c}{\strut\vspace{-20pt}} \\
    \hhline{--~~~}
    R2C1 & R2C2 & \multicolumn{3}{c}{\strut} \\
    \hhline{--~|--}
    R3C1 & R3C2 && R3C4 &  R3C5  \\ 
    \hhline{--~|--}
    R4C1 &  R4C2  &&&\\ 
    \hhline{--~|>{\arrayrulecolor{blue!50}}->{\arrayrulecolor{black}}|>{\arrayrulecolor{blue!50}}->{\arrayrulecolor{black}}|}
    R5C1 & R5C2 && \multirow{-2}{*}{R4--5C4} & \multirow{-2}{*}{R4--5C5}  \\ 
    \hhline{--~|--}
    R6C1 & R6C2 && R6C5 &  R6C5                                    
    \\ 
    \hhline{--~|--}
  \end{tabular}
\end{document}

结果是

在此处输入图片描述

每个点的解决方案是:

  1. |在 的每个相关位置添加\hhline,完成垂直边框。
  2. 移动多行文本降低行,以便这一行覆盖前一行;
  3. 注意每一块边框的颜色(有点烦人……)。
  4. 这实际上是一个问题:从我发布的图片中看不出来,但查看编译后的 pdf 后,放大后你会发现有些边框的厚度是双倍的。如果你像我在解决方案中所做的那样添加命令,情况会更加明显\setlength{\arrayrulewidth}{2pt}。问题出现的原因是有些边框被绘制了两次。在解决方案中,这个问题已经修复。这是我对这个包的错误使用hhline(这是我第一次使用这个特定的包)。
  5. 据我所知,在普通的表格环境中,没有实际的方法来控制两个给定行或列之间的实际空间。如果我没记错的话,使用包可以做到这一点tabularray。没有恢复到它,我得到了插入一个包含负空间的行。它甚至可以在列之间工作。这是一种解决方法,不仅仅是一个解决方案,但对我的目的来说已经足够了。

总而言之,我现在得到了我想要的桌子。:)

相关内容