![控制 longtable 最后一页的高度](https://linux22.com/image/289908/%E6%8E%A7%E5%88%B6%20longtable%20%E6%9C%80%E5%90%8E%E4%B8%80%E9%A1%B5%E7%9A%84%E9%AB%98%E5%BA%A6.png)
我想控制由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\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
正如长桌文档中所述,将最后一行保持在一起的方法是将它们放入最后一英尺,或者使用\\*
。
发布的这段代码位置不对,因此产生了虚假单元格,因此产生了额外的垂直线段,并且缺少%
行尾,因此引入了空白。如果我理解了这个问题,就不需要切换输出例程了。当然,在表格内切换输出例程似乎很勇敢。
您需要在此上下文中使用\arraybackslash
after (或在内部代码中使用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}