我正在编写一个生成 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
,或者更确切地说是两个\cline
s 一个在另一个之上,以便在分页符处进行重复。
因此,基本上,其他软件包中的规则不太可能起作用,除非它们明确满足要求longtable
。
如果您只是需要变化,\arrayrulewidth
您应该能够使用\setlength{\arrayrulewidth}{3pt}
然后正常\hline
。
booktabs
确实对它有一些支持,但我注意到它的文档明确说明了。
一个有点技术性的说明:在 中
longtable
,\hline
和\hline\hline
都产生双重规则(以允许在该点发生分页符)。但规则booktabs
却没有。即使根据该包中的文档,longtable
的自动加倍也是值得怀疑的。但双重规则几乎没有任何意义。\hline
booktabs
因此,这似乎意味着分页符的行为是经过设计的。
答案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
是无条件添加到每行的额外垂直空间。... 因此,行可以共享相同的高度/深度,但间距不是动态的。
也可以只更改内容上方或下方的空间。