我在longtable
环境中使用水平线和垂直线来创建一种树状内部结构。由于我需要用包给一些单元格上色colortbl
,我不能使用\cline
,所以我试着用hhline
包代替。这基本上是可行的;然而,一些垂直线出现了奇怪的扭曲:
我不完全明白这里发生了什么——这个扭曲的像素(?)从哪里来的,我该如何将它放回原位?
(此外,如果有更优雅的方式来绘制这样的树形表,我会很乐意了解它......)
\documentclass{article}
\usepackage{array}
\usepackage{longtable}
\usepackage{hhline}
\newcommand{\mc}[2]{\multicolumn{#1}{|l}{#2}}
\begin{document}
\begin{longtable}{|lllll|}
\hline
\mc{3}{one} & foo & bar \\
& \mc{2}{two} & foo & bar \\
& \mc{1}{} & \mc{1}{three} & foo & bar \\
& \mc{1}{} & \mc{1}{four} & foo & bar \\
\hhline{|~|~---}
& \mc{1}{} & & & \\
& \mc{2}{five} & foo & bar \\
& \mc{1}{} & \mc{1}{six} & foo & bar \\
& \mc{1}{} & \mc{1}{seven} & foo & bar \\
\hhline{|~|~---}
& \mc{1}{} & & & \\
\hhline{|~----}
& & & & \\
\hline
\end{longtable}
\end{document}
答案1
根本问题是,这是错误的:
\newcommand{\mc}[2]{\multicolumn{#1}{|l}{#2}}
除了第一列之外,LaTeX 表格规则始终是正确的前一个单元格的边缘。有时您可以避免这种情况,但在这里您会看到一个单元格右边缘的规则与下一行单元格左边缘的规则不对齐。因此您需要:
\documentclass{article}
\usepackage{array}
\usepackage{longtable}
\usepackage{hhline}
\newcommand{\mc}[2]{\multicolumn{#1}{l|}{#2}}
\begin{document}
\begin{longtable}{|lllll|}
\hline
\multicolumn{3}{|l}{one} & foo & bar \\
\multicolumn{1}{|l|}{} & \multicolumn{2}{l}{two} & foo & bar \\
\multicolumn{1}{|l|}{} & \mc{1}{} & three & foo & bar \\
\multicolumn{1}{|l|}{} & \mc{1}{} & four & foo & bar \\
\hhline{|~|~---}
\multicolumn{1}{|l|}{} & & & & \\
\multicolumn{1}{|l|}{} & \multicolumn{2}{l}{five}& foo & bar \\
\multicolumn{1}{|l|}{} & \mc{1}{} & six & foo & bar \\
\multicolumn{1}{|l|}{} & \mc{1}{} & seven & foo & bar \\
\hhline{|~|~---}
\multicolumn{1}{|l|}{} & & & & \\
\hhline{|~----}
& & & & \\
\hline
\end{longtable}
\end{document}
答案2
使用{NiceTabular}
(nicematrix
使用 PGF/TikZ 来绘制规则)。
\documentclass{article}
\usepackage{nicematrix}
\begin{document}
\begin{NiceTabular}{lllll}
\Block[draw]{*-*}{}
\Block{1-2}{one} & & & foo & bar \\
& \Block[borders={left,bottom}]{8-*}{} \Block[l]{1-2}{\; two} & & foo & bar \\
& & \Block[borders={left,bottom}]{2-*}{} three & foo & bar \\
& & four & foo & bar \\
\\
& \Block[l]{1-2}{\; five} & & foo & bar \\
& & \Block[borders={left,bottom}]{2-*}{} six & foo & bar \\
& & seven & foo & bar \\
\\
\\
\end{NiceTabular}
\end{document}
您需要多次编译。