当使用 \specialrule 而不是 \hline 时,Longtable 无法正确中断

当使用 \specialrule 而不是 \hline 时,Longtable 无法正确中断

我正在编写一个生成 latex 代码的应用程序,因此解决方案必须尽可能通用,以确保它始终生成干​​净的 pdf。我想让我的用户指定表格的粗细(水平线和垂直线),到目前为止,我发现的最佳解决方案是使用 booktabs 包中的“\specialrule”。

以下是 MWE:

\documentclass{article}

\usepackage{longtable}
\usepackage{tabularx}
\usepackage{booktabs}
\newcommand\VRule[1][\arrayrulewidth]{\vrule width #1}

\begin{document}

Some text goes here

and here

and here

and here

and here


\begin{longtable}{!{\VRule[3pt]}c!{\VRule[3pt]}c!{\VRule[3pt]}c!{\VRule[3pt]}c!{\VRule[3pt]}c!{\VRule[3pt]}}
\specialrule{3pt}{0pt}{0pt}
This & is & the & nice & header \\  \specialrule{3pt}{0pt}{0pt} \endhead
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}
Portable & 1 & 676 & 21.00 & 676.00 \\  \specialrule{3pt}{0pt}{0pt}

\end{longtable}


\end{document}

我的问题是,根据表格前内容的高度和行的粗细,换行无法正常工作。在这种情况下,第一页上的长表的最后一条水平线会移动到第二页。

答案1

\hline确实longtable需要了解很多有关如何longtable组合 s 的知识,特别是左右边距如何工作,以及在分页符处该做什么。它基本上更像是\cline,或者更确切地说是两个\clines 一个在另一个之上,以便在分页符处进行重复。

因此,基本上,其他软件包中的规则不太可能起作用,除非它们明确满足要求longtable

如果您只是需要变化,\arrayrulewidth您应该能够使用\setlength{\arrayrulewidth}{3pt}然后正常\hline

booktabs确实对它有一些支持,但我注意到它的文档明确说明了。

一个有点技术性的说明:在 中longtable\hline\hline\hline 都产生双重规则(以允许在该点发生分页符)。但规则booktabs却没有。即使根据该包中的文档,longtable的自动加倍也是值得怀疑的。但双重规则几乎没有任何意义。\hlinebooktabs

因此,这似乎意味着分页符的行为是经过设计的。

答案2

诀窍是 (a) 用附加线定义脚,或 (b) 使用\hline并更改线宽\setlength{\arrayrulewidth}(这也会更改中的垂直线longtable)。

此外,我认为tabu对你来说会非常有用。请参见示例:

\documentclass{article}

\usepackage{kantlipsum}% just for some blindtext

\usepackage{longtable}
\usepackage{tabu}
  \newtabulinestyle{tb=1pt,out=1pt,ins=0.3pt}
                   % "tb" for "top & bottom",
                   % "out" for "(vertical left & right) outside",
                   % "ins" for "(vertical) inside"

  % for global changes, could be changed locally inside a group:
  \setlength{\arrayrulewidth}{0.3pt} % for "normal" lines ("\hline")
  \tabulinestyle{0.3pt} % for "\tabucline" provided by "tabu" and "|" (!!!)
  % note that I set both to the same width,
  % these 2 also, for safety:
  \setlength{\tabulinesep}{0pt}
  \setlength{\extrarowsep}{0pt}

\begin{document}

\kant[1-2]

\begin{longtabu} to \linewidth [c]{|[out]X[-2c]|[ins]X[-1c]|[ins]X[-1c]|[ins]X[-1c]|[ins]X[-1c]|[out]}
% Define the first head
\tabucline[tb]{-}
\multicolumn{5}{|[out]c|[out]}{\large This is the nice header} \\
\tabucline[0.6pt]{-} %§%
\endfirsthead
% Define the head of continued page(s)
\multicolumn{5}{l}{\scriptsize\itshape continued from last page} \\
\tabucline[0.6pt]{-}
\multicolumn{5}{|[out]c|[out]}{\large This is the nice header} \\
\tabucline{-} % need to be actually the difference between tabucline above
               % marked with %§%, and the "normal" tabuclines below
\endhead
% Define the normal foot
\tabucline[0.6pt]{-}
\multicolumn{5}{r}{\scriptsize\itshape continued on next page} \\
\endfoot
% Define the very last foot
\tabucline[tb]{-}
\endlastfoot
% table body
\everyrow{\tabucline{-}}% will be inserted after, emm, every row -- saves us a lot of work
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
Portable & 1 & 676 & 21.00 & 676.00 \\
\end{longtabu}

\end{document}

您有多种方式可以为指定线宽\tabucline

  • 通过设置\tabulinestyle
  • 通过定义新的禁忌线型
  • 单独作为选项(还有更复杂的可能性)。

垂直线可以通过这种方式改变,因此设置\tabulinestyle也适用于它们!

需要注意的是,页脚中遗漏的行将转到下一页,并添加到属于后续页面顶部标题的行中。

另一方面你提到booktabs

永远不要使用垂直规则。

内容和水平线之间的垂直空间由\tabulinesep和控制\extrarowheight。根据禁忌手册,区别如下:

\tabulinesep设置单元格内容和单元格边框之间允许的最小垂直空间。...
\extrarowsep是无条件添加到每行的额外垂直空间。... 因此,行可以共享相同的高度/深度,但间距不是动态的。

也可以只更改内容上方或下方的空间。

相关内容