如何在 longtable 中的 \hline 上禁用分页符?
这是一个说明我的问题的例子:
\documentclass[12pt,a4paper,oneside]{letter}
\usepackage{longtable}
\begin{document}
\begin{longtable}{ | p{5cm} | }
\hline
Table header\\*
\hline
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pharetra
porttitor turpis, id egestas neque congue in. Nam sed lorem lorem, ac
tristique tellus. Nunc ornare feugiat orci, a blandit turpis facilisis ut.
Aenean pharetra ornare ante. Sed tempus leo in dolor eleifend placerat.
Integer at enim augue. Ut nisl tortor, interdum ac porttitor ac, sagittis
quis libero. Vivamus nibh metus, ornare vel pulvinar nec, fringilla nec
orci. Maecenas mollis nulla a nibh fringilla nec convallis augue varius.
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
cubilia Curae. \\
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pharetra
porttitor turpis, id egestas neque congue in. Nam sed lorem lorem, ac
tristique tellus. Nunc ornare feugiat orci, a blandit turpis facilisis ut.
Aenean pharetra ornare ante. Sed tempus leo in dolor eleifend placerat.
Integer at enim augue. Ut nisl tortor, interdum ac porttitor ac, sagittis
quis libero. Vivamus nibh metus, ornare vel pulvinar nec, fringilla nec
orci. Maecenas mollis nulla a nibh fringilla nec convallis augue varius.
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
cubilia Curae. \\
\hline
Table header\\*
\hline
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pharetra
porttitor turpis, id egestas neque congue in. Nam sed lorem lorem, ac
tristique tellus. Nunc ornare feugiat orci, a blandit turpis facilisis ut.
Aenean pharetra ornare ante. Sed tempus leo in dolor eleifend placerat.
Integer at enim augue. Ut nisl tortor, interdum ac porttitor ac, sagittis
quis libero. Vivamus nibh metus, ornare vel pulvinar nec, fringilla nec
orci. Maecenas mollis nulla a nibh fringilla nec convallis augue varius.
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
cubilia Curae. \\
\hline
\end{longtable}
\end{document}
我希望在第 3 页上有第二个页眉。我无法控制表格内容,所以我无法手动进行分页。
答案1
该longtable
包\hline
通过引入惩罚来重新定义以允许分页符,就像\penaly-\@lowpenalty
在代码中一样。如果我理解正确的话,你想要的是一个\hline
不引入任何断点的变体。为此,您只需复制用于重新定义的代码\hline
,longtable.sty
并使用它来定义一个\nobreakhline
变体宏,其中惩罚已被更改为,10000
以防止所有分页符。这给出了以下代码:
\documentclass[12pt,a4paper,oneside]{letter}
\usepackage{longtable}
\makeatletter
\def\nobreakhline{%
\noalign{\ifnum0=`}\fi
\penalty\@M
\futurelet\@let@token\LT@@nobreakhline}
\def\LT@@nobreakhline{%
\ifx\@let@token\hline
\global\let\@gtempa\@gobble
\gdef\LT@sep{\penalty\@M\vskip\doublerulesep}% <-- change here
\else
\global\let\@gtempa\@empty
\gdef\LT@sep{\penalty\@M\vskip-\arrayrulewidth}% <-- change here
\fi
\ifnum0=`{\fi}%
\multispan\LT@cols
\unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
\noalign{\LT@sep}%
\multispan\LT@cols
\unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
\noalign{\penalty\@M}%
\@gtempa}
\makeatother
\begin{document}
\begin{longtable}{ | p{5cm} | }
\hline
Table header\\*
\nobreakhline
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pharetra
porttitor turpis, id egestas neque congue in. Nam sed lorem lorem, ac
tristique tellus. Nunc ornare feugiat orci, a blandit turpis facilisis ut.
Aenean pharetra ornare ante. Sed tempus leo in dolor eleifend placerat.
Integer at enim augue. Ut nisl tortor, interdum ac porttitor ac, sagittis
quis libero. Vivamus nibh metus, ornare vel pulvinar nec, fringilla nec
orci. Maecenas mollis nulla a nibh fringilla nec convallis augue varius.
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
cubilia Curae. \\
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pharetra
porttitor turpis, id egestas neque congue in. Nam sed lorem lorem, ac
tristique tellus. Nunc ornare feugiat orci, a blandit turpis facilisis ut.
Aenean pharetra ornare ante. Sed tempus leo in dolor eleifend placerat.
Integer at enim augue. Ut nisl tortor, interdum ac porttitor ac, sagittis
quis libero. Vivamus nibh metus, ornare vel pulvinar nec, fringilla nec
orci. Maecenas mollis nulla a nibh fringilla nec convallis augue varius.
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
cubilia Curae. \\
\hline
Table header\\*
\nobreakhline
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pharetra
porttitor turpis, id egestas neque congue in. Nam sed lorem lorem, ac
tristique tellus. Nunc ornare feugiat orci, a blandit turpis facilisis ut.
Aenean pharetra ornare ante. Sed tempus leo in dolor eleifend placerat.
Integer at enim augue. Ut nisl tortor, interdum ac porttitor ac, sagittis
quis libero. Vivamus nibh metus, ornare vel pulvinar nec, fringilla nec
orci. Maecenas mollis nulla a nibh fringilla nec convallis augue varius.
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
cubilia Curae. \\
\hline
\end{longtable}
\end{document}
以下是之前代码的工作原理。它位于和之间\makeatletter
,\makeatother
因为它是包含字符的内部代码@
。代码分为两部分:首先定义,\nobreakhline
然后调用另一个宏\LT@@nobreakhline
。宏以开始
\def\nobreakhline{%
\noalign{\ifnum0=`}\fi
这\ifnum..\fi
是一个技巧,可以让TeX
认为括号配对正确,但实际上并非如此。 因此,它相当于\noalign{
,第二个宏中以 开头的行中的结束括号\ifnum
。 然后,宏设置惩罚并调用第二个宏,这要归功于\futurelet
:
\penalty\@M
\futurelet\@let@token\LT@@nobreakhline}
这\futurelet
是为了预测\nobreakhline
宏;正如我们将看到的,如果它后面跟着另一个,那么行为将不会相同\hline
。
我们还没有得到 的定义\LT@@nobreakhline
。它从一个if
测试开始:
\def\LT@@nobreakhline{%
\ifx\@let@token\hline
\global\let\@gtempa\@gobble
\gdef\LT@sep{\penalty\@M\vskip\doublerulesep}% <-- change here
测试包括查看下一个标记是否为\hline
。如果是,则将宏\@gtempa
设置为\@gobble
。顾名思义,\@gobble
宏只会吞噬其后的标记。宏\@gtempa
在这里定义,但在和的末尾使用\LT@@nobreakhline
,因此这意味着\LT@@nobreakhline
将吞噬\hline
其后的,从而避免了\hline
两次排版。设置后\@gtempa
,宏\LT@sep
也会被设置。这是我从原始longtable.sty
代码中更改的部分:惩罚从-\@medpenalty
(类似于-151
,取决于文档类)更改为\@M
(这是的快捷方式10000
);这可以防止在发出惩罚时发生任何中断。
现在我们进入else
条件部分:
\else
\global\let\@gtempa\@empty
\gdef\LT@sep{\penalty\@M\vskip-\arrayrulewidth}% <-- change here
\fi
它的结构与then
部分相同,只是它仅当我们的宏\nobreakhline
后面没有时才会出现\hline
,并将结束宏设置\@gtempa
为(\@empty
),这意味着在 的末尾不会执行任何特殊操作\LT@@nobreakhline
;还有一个惩罚变化以防止中断;这次惩罚是-\@lowpenalty
(大约 -51)并且更改为10000
与之前一样。下一行是之前提到的“结束括号”:
\ifnum0=`{\fi}%
接下来几行代码排版规则:
\multispan\LT@cols
\unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
然后使用先前定义的宏\LT@sep
,它具有防止任何中断的效果:
\noalign{\LT@sep}%
然后有另一条排版规则(它可能从代码中删除,因为我们不再允许中断,但由于\vskip
中的负数,它与前一条规则重叠,因此无害\LT@sep
):
\multispan\LT@cols
\unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
最后,宏以惩罚结束(以避免另一个断点),然后\@gtempa
发出之前定义的结束宏:
\noalign{\penalty\@M}%
\@gtempa}
答案2
colortbl
Philippe Goutet 的解决方案与包装和 设置水平线颜色 配合使用效果不佳\arrayrulecolor
。以下是应该与 配合使用的解决方案colortbl
:
\makeatletter
\def\nobreakhline{%
\noalign{\ifnum0=`}\fi
\penalty\@M
\futurelet\@let@token\LT@@nobreakhline}
\def\LT@@nobreakhline{%
\ifx\LT@next\hline
\global\let\LT@next\@gobble
\ifx\CT@drsc@\relax
\gdef\CT@LT@sep{%
\noalign{\penalty\@M\vskip\doublerulesep}}%
\else
\gdef\CT@LT@sep{%
\multispan\LT@cols{%
\CT@drsc@\leaders\hrule\@height\doublerulesep\hfill}\cr}%
\fi
\else
\global\let\LT@next\empty
\gdef\CT@LT@sep{%
\noalign{\penalty\@M\vskip-\arrayrulewidth}}%
\fi
\ifnum0=`{\fi}%
\multispan\LT@cols
{\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr
\CT@LT@sep
\multispan\LT@cols
{\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr
\noalign{\penalty\@M}%
\LT@next}
\makeatother