控制 longtable 最后一页的高度

控制 longtable 最后一页的高度

我想控制由longtable环境创建的表格,这样如果表格的其余部分长度超过某个高度(这取决于文本的高度,文本跟在表格后面,并且应该完全在最后一页,表格的最后两列),那么它将在最后两行之前有分页符。表格后的最后一行和文本是静态块,我将其放入lastfoot。但倒数第二行应该始终与最后一行位于同一页上。

以下是最短的工作示例:

\documentclass[12pt]{letter}
\usepackage[english]{babel}
\usepackage{longtable}
\usepackage{array}

\makeatletter
\newtoks\f@st
\f@st={}
\def\pr@line#1{#1\global\f@st={}}
\def\RPOline#1#2{\pr@line{\the\f@st}\global\f@st={#1&#2\cr\hline}}
\newcolumntype{C}[1]{>{\centering}m{#1}}
\newsavebox\l@stb@x
\def\RPOb@g{
    \global\savebox{\l@stb@x}{\hbox to\textwidth{\vbox to 10cm{some text\vfill bottom}}}
    \begin{longtable}{|C{1cm}|C{5cm}|}
    \hline N& Name\cr\hline\endfirsthead
    \endhead\endfoot
    \multicolumn{2}{l}{\usebox{\l@stb@x}}\endlastfoot
}
\newtoks\old@utput
\newdimen\texth@
\old@utput=\expandafter{\the\output}
\def\ts@{\texth@=\textheight\advance\texth@ by -\ht\l@stb@x\advance\texth@ by -5mm\relax
    \setbox0=\vbox{\unvbox255}\ifdim\ht0<\texth@
    \setbox255=\vbox{\unvbox0\pr@line{\the\f@st}}\else
    \setbox255=\vbox{\unvbox0}\fi
    \the\old@utput
    \global\output=\expandafter{\the\old@utput}}
\def\PRO@nd{
    \global\output={\ts@}\cr\pagebreak
    \pr@line{\the\f@st}
    \end{longtable}
}
\newenvironment{RPOtable}{\RPOb@g}{\PRO@nd}
\makeatother
\newcount\tstcnt
\def\fillt#1{\ifnum\tstcnt>0\global\advance\tstcnt by -1\relax #1\fillt{#1}\fi}
\def\filltbl#1#2{\global\tstcnt=#1\relax\fillt{#2}}

\begin{document}
\begin{RPOtable}
    \filltbl{31}{\RPOline{a}{Sample line}}
    \RPOline{L}{Last line}
\end{RPOtable}
\end{document}

当我输入\cr\pagebreak\PRO@nd如上文所述)时,我没有收到任何错误,但表格中有空行,并且表格总是在 处中断\pagebreak。如果我省略\pagebreak,标记为“最后一行”的行将保留在上一页,并且其后仍有一个空的表格行。

问题

我如何才能使页面“不间断” longtable?我做不到,\vsplit因为它已经是一个框了。另外,Misplased \noalign如果我不在\cr之前放置,我总是会收到错误消息\pagebreak

答案1

正如长桌文档中所述,将最后一行保持在一起的方法是将它们放入最后一英尺,或者使用\\*

发布的这段代码位置不对,因此产生了虚假单元格,因此产生了额外的垂直线段,并且缺少%行尾,因此引入了空白。如果我理解了这个问题,就不需要切换输出例程了。当然,在表格内切换输出例程似乎很勇敢。

您需要在此上下文中使用\arraybackslashafter (或在内部代码中使用never except)。\centering\\\tabularnewline\cr

此版本将最后 4 行放在最后一英尺,下面有一个使用 nopagebreak 惩罚的版本(如评论中所述,可能需要进一步调整)。

\documentclass[12pt]{letter}
\usepackage[english]{babel}
\usepackage{longtable}
\usepackage{array}

\raggedbottom
\newcolumntype{C}[1]{>{\centering\arraybackslash}m{#1}}
\setlength\extrarowheight{2pt}

\def\samplerow#1#2{%
\ifnum#1>0
#2\\\hline
\afterfi
\expandafter\samplerow\expandafter{\the\numexpr#1-1\relax}{#2}%
\fi}
\def\afterfi#1\fi{\fi#1}


\raggedbottom
\begin{document}


\makeatother
\begin{longtable}{@{}|C{1cm}|C{5cm}|@{}}
\hline
N&Name\\\hline\endhead
\samplerow{4}{a&sample line}
\noalign{\nobreak\smallskip\noindent\parbox\textwidth{Last line}}\endlastfoot
\samplerow{25}{a&Sample Line}
\end{longtable}
\end{document}

下面生成 31 行加上一个表头和随后的段落,确保与表格末尾保持至少 4 行。

在此处输入图片描述

通常您可以只使用\nopagebreak\hline允许分页,\hline因此这会用非分页版本替代最后几行。

\documentclass[12pt]{letter}
\usepackage[english]{babel}
\usepackage{longtable}
\usepackage{array}

\raggedbottom
\newcolumntype{C}[1]{>{\centering\arraybackslash}m{#1}}
\setlength\extrarowheight{2pt}

\makeatletter
\def\samplerow#1#2{%
\ifnum#1>0
#2\\
\ifnum#1<5 
\nopagebreak
  \multispan\LT@cols
     \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
\nopagebreak
\else
\hline
\fi
\afterfi
\expandafter\samplerow\expandafter{\the\numexpr#1-1\relax}{#2}%
\fi}
\def\afterfi#1\fi{\fi#1}
\makeatother

\raggedbottom
\begin{document}


\makeatother
\begin{longtable}{@{}|C{1cm}|C{5cm}|@{}}
\hline
N&Name\\\hline\endhead
\noalign{\nobreak\smallskip\noindent\parbox\textwidth{Last line}}\endlastfoot
\samplerow{31}{a&Sample Line}
\end{longtable}
\end{document}

相关内容