行数很多的表格很快就会超过一页,需要延续到下一页。但普通的 tabular 如果包在浮动的 table 环境 中,绝不会跨页断开,因为浮动体假定自己是一块能放进一页的整体。longtable 包 用来突破这个限制。longtable 环境 不是浮动体:它 直接放在正文流中,并能按照 LaTeX 正常的分页算法 跨越多页。本页说明为什么单独的 tabular 不能分页,longtable 的 重复表头和表脚(\endfirsthead、\endhead、\endfoot、\endlastfoot)如何工作,标题如何添加,最后介绍 xltabular,它还能让自动宽度的 X 列跨页。
为什么浮动体中的表格不能分页
如“tabular 基础”中所述,tabular 环境负责排版表格内容,而浮动的 table 环境 负责把它作为“表 N”放置。table 和 figure 一样是 浮动体:LaTeX 把它视为一个能放进一页的整体,并可以将 整个块 从正文中移动到页面顶部或底部。既然它是不可分割的块,内部就不会发生分页。因此内部的 tabular 无论有多高,都 不会被拆分;如果当前页放不下,只会被推到下一页页首,最坏情况下仍然溢出。
换句话说,“跨页表格”与浮动体机制本身根本不兼容。需要的是一种把表格 放在与正文相同的文本流中,并像段落一样 自然跨页断开 的机制。这正是 longtable 提供的功能。
longtable 环境
longtable 保留了 tabular 几乎所有功能,同时生成的表格 可以由 TeX 标准分页算法拆分。按作者 David Carlisle 的说法,它“拥有 tabular 环境的大多数功能,但生成的表格可以跨页拆分”。用法也很像 tabular:\begin{longtable}{spec} 接收 必选列指定,主体中用 & 分列,用 \\ 结束行。区别在于它 不是浮动体,而是直接放在正文中,因此 不要 用 table 环境包住 \begin{longtable}…\end{longtable}。
在导言区用 \usepackage{longtable} 载入。l、c、r、p{width} 等列指定,以及 \hline、\multicolumn,都与 tabular 中完全一样。\begin{longtable} 在列指定之前可接收 可选参数 [c]、[r] 或 [l],用于设置 整张表的水平对齐(默认居中)。分页只会发生在行与行之间,或 \hline 的位置;不会在 p 列单行(单元格)内部拆开。
重复表头与表脚
当表格跨越多页时,通常希望 表头行 在后续页面也重复出现。longtable 提供 四个标记,在表格开头声明“哪些行在哪些页面重复”。每个标记都放在对应行(可多行)的末尾,替代本来结束该行的 \\。
\endfirsthead— 到这里为止的行 只出现在第一页 的表头。\endhead—\endfirsthead之后到这里为止的行,会在 除第一页外的每一页 表头重复。\endfoot—\endhead之后到这里为止的行,会出现在 仍会继续到下一页的页面表脚(也就是除最后一页外)。\endlastfoot—\endfoot之后到这里为止的行,只出现在表格最后,即最后一页。
四个标记都可省略;如果只想让所有页面使用相同表头,单独写 \endhead 就足够。单独写 \endfirsthead 时,第一页可以使用不同表头(例如带标题),后续页则可用“(continued)”这样的简略表头。\endfoot 块通常放置一行 “Continued on next page”,提示表格还会继续。
标题与编号
与 tabular 不同,longtable 自带 \caption{…}。它使用标准的 table 计数器编号,所以 \caption{…} 会像普通表格一样作为“表 N” 自动编号,并出现在表目录(\listoftables)中。由于标题是表格布局的一部分,基本写法是在 表头块中(\endfirsthead 之前)写入,并用 \\ 结束,如 \caption{…}\\。
有几个实用约定。若 不想编号,使用 \caption*{…}(没有编号,也不会加入表目录)。后续页面中“(continued)”这样的 附属标题,应写成 可选参数为空的 \caption[]{…},避免在表目录中重复列出。交叉引用的 \label{…} 不能放在会重复的 \endhead 表头中,因为它会出现多次;应放在 \endfirsthead 中或表格主体中。标题宽度默认是 4 英寸;若要修改,在导言区设置 \setlength{\LTcapwidth}{…}。
完整骨架
下面是使用全部四个标记的 longtable 骨架。读法如下:首先写第一页专用表头(标题和列标题),并用 \endfirsthead 结束。接着写后续页表头(“(continued)”加列标题),并用 \endhead 结束。然后写用于继续页表脚的“Continued on next page”行,并用 \endfoot 结束;最后页的收尾横线用 \endlastfoot 结束。之后才是真正的数据行;写在这些标记下面的行会作为实际表格内容流入各页。
\documentclass{article}
\usepackage{longtable}
\begin{document}
\begin{longtable}{l l r}
% --- 1 ページ目だけの見出し ---
\caption{年間の売上記録}\\
\hline
日付 & 品目 & 金額 \\
\hline
\endfirsthead
% --- 2 ページ目以降の見出し ---
\multicolumn{3}{l}{\small (表のつづき)}\\
\hline
日付 & 品目 & 金額 \\
\hline
\endhead
% --- 続くページの脚 ---
\hline
\multicolumn{3}{r}{\small 次ページに続く}\\
\endfoot
% --- 最終ページの脚 ---
\hline
\endlastfoot
% --- ここから本物のデータ行 ---
2026-01-05 & りんご & 380 \\
2026-01-06 & みかん & 120 \\
% …行が続き、自動で改ページされる…
\end{longtable}
\end{document}这张表在第一页显示带编号标题“Table N: Annual sales log”,每次跨页时在页首重复“(continued)”和列标题,并在仍会继续的页面底部加上“Continued on next page”。最后一页只用表脚横线安静收尾。无论添加多少数据行,longtable 都会自动在行边界处分割表格。
有一个注意点:longtable 至少需要两次 LaTeX 处理 才能确定列宽和分页位置。它通过 .aux 文件交换各页宽度信息,所以 第一次编译时列可能对不齐;LaTeX 甚至会输出列宽变化的警告(手册也说明,在文档经过 LaTeX 处理数次之前,表格“will not line up correctly”)。latexmk 等构建工具会按需要自动重新处理。
自动宽度换行列:xltabular
longtable 的列指定与 tabular 相同,因此长文本通常放入固定宽度的 p{width} 列中换行。但如果想要一列 伸展到整行宽度,并按内容自动调整宽度,tabularx 的 X 列 很方便。“高级表格环境(tabularx / tabularray)”中介绍的这个 X 列本来属于 tabularx 环境,不能跨页断开。
把两者优点合在一起的是 xltabular 包(Rolf Niepraschk 与 Herbert Voß)。作者的描述是:“像 tabularx 一样工作的 longtable;简言之,就是带有 X 列指定符的 longtable。”它内部载入 ltablex,但不会改变已有 tabularx 环境的行为。环境语法类似 tabularx:先是 可选位置引数 [c] / [r] / [l],接着是整张表的 总宽度,然后是 列指定。longtable 的表头 / 表脚标记(\endfirsthead 等)也可以照常使用。
\documentclass{article}
\usepackage{xltabular}
\begin{document}
\begin{xltabular}{\linewidth}{l X r}
\caption{用語と説明}\\
\hline
用語 & 説明 & 頁 \\
\hline
\endfirsthead
\hline
用語 & 説明 & 頁 \\
\hline
\endhead
longtable & ページをまたいで分割できる表組み環境。フロートではなく本文の流れに直接置かれる。 & 12 \\
xltabular & longtable と tabularx を組み合わせ、自動幅の X 列を改ページ可能にした環境。 & 34 \\
\end{xltabular}
\end{document}这里总宽度设为 \linewidth(正文宽度),中间的说明列是 X 列。X 列会自动扩展到剩余宽度并为长文本换行,同时整张表仍作为 longtable 可以跨页,无需手动调整固定宽度的 p{width}。有一点小差异:longtable 总是推进 table 计数器,而 xltabular 如果不写 \caption,就不会消耗编号。