如何在 longtable 中的 \hline 上禁用分页符?

如何在 longtable 中的 \hline 上禁用分页符?

如何在 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不引入任何断点的变体。为此,您只需复制用于重新定义的代码\hlinelongtable.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

colortblPhilippe 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

相关内容