当剩余行longtable
恰好适合当前页面时,longtable
将通过在当前页面上打印页脚并将最后一行移动到下一页(重复的页眉和页脚)来创建孤行。
可以通过将最后一行打印为最后一个页脚的一部分来防止这种情况发生,但我想知道为什么会发生这种情况,以及是否可以在包中修复这个问题longtable
。(从概念上讲,我希望算法仅在确定剩余内容不适合当前页面后才开始新页面。)
\documentclass{article}
\usepackage{booktabs}
\usepackage{longtable}
\begin{document}
\begin{longtable}{l}
\caption{Caption}\\
\toprule
Column heading\\
\midrule
\endfirsthead
\caption[]{Caption} \\
\toprule
Column heading\\
\midrule
\endhead
\midrule
Continued on next page\\
\midrule
\endfoot
\bottomrule
\endlastfoot
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
\end{longtable}
\end{document}
答案1
longtable
真的不能提前看,它的全部目的是将分页推迟到异步输出例程,就像正常的分页一样,因此它无法控制分页决策发生的时间,输出例程会在它跳转时跳转。它使用 footbox 的垂直尺寸来测量所需的空间,它从不检查 lastfoot 是否更小,它可以检查这一点,但我不确定它能做什么。
这就是 tex 的问题所在:它是为 1979 年的机器内存设计的,它没有将文档存储在内存中,甚至可能在\end{longtable}
从文件系统读取之前就已经将最后一页写入了 pdf。longtable 不能向前看,也不能回头改变决定(但它可以在 1990 年内存小于 1Mb 的机器上排版 1000 行表格……)
正如其他答案所示,较新的软件包会做出不同的假设,并首先抓取整个表。这提供了更大的灵活性,但需要完全重新设计,而不是可以简单添加的功能
答案2
如果您愿意使用longtblr
包tabularray
而不是longtable
,那么在您的特定情况下,即使表体中多一行,表格也可以放在一页中:
(红线显示页面布局)
除此之外,表格代码更加简洁和简单:
\documentclass{article}
%--------------- show page layout. don't use in a real document!
\usepackage{showframe}
\renewcommand\ShowFrameLinethickness{0.15pt}
\renewcommand*\ShowFrameColor{\color{red}}
%
\usepackage{lipsum} % for dummy text
\usepackage[latin, english]{babel}
%---------------------------------------------------------------%
\usepackage{tabularray}
\UseTblrLibrary{booktabs}
\begin{document}
\begin{longtblr}[
caption = {Caption}
]{colspec={X[c]},
rowsep=0pt,
row{1}={font=\bfseries},
rowhead=1}
\toprule
Column heading\\
\midrule
%
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
x\\
%
one more table row\\
\bottomrule
\end{longtblr}
\end{document}
如果表格较长(行数较多或行中包含多行文本),则会分页并自动插入(continued)
下一页的标题和第一页表格底部的“下一页继续”