跨页表格 (longtable)

行数很多的表格很快就会超过一页,需要延续到下一页。但普通的 tabular 如果包在浮动的 table 环境 中,绝不会跨页断开,因为浮动体假定自己是一块能放进一页的整体。longtable 用来突破这个限制。longtable 环境 不是浮动体:它 直接放在正文流中,并能按照 LaTeX 正常的分页算法 跨越多页。本页说明为什么单独的 tabular 不能分页,longtable重复表头和表脚\endfirsthead\endhead\endfoot\endlastfoot)如何工作,标题如何添加,最后介绍 xltabular,它还能让自动宽度的 X 列跨页。

为什么浮动体中的表格不能分页

如“tabular 基础”中所述,tabular 环境负责排版表格内容,而浮动的 table 环境 负责把它作为“表 N”放置。tablefigure 一样是 浮动体:LaTeX 把它视为一个能放进一页的整体,并可以将 整个块 从正文中移动到页面顶部或底部。既然它是不可分割的块,内部就不会发生分页。因此内部的 tabular 无论有多高,都 不会被拆分;如果当前页放不下,只会被推到下一页页首,最坏情况下仍然溢出。

换句话说,“跨页表格”与浮动体机制本身根本不兼容。需要的是一种把表格 放在与正文相同的文本流中,并像段落一样 自然跨页断开 的机制。这正是 longtable 提供的功能。

longtable 环境

longtable 保留了 tabular 几乎所有功能,同时生成的表格 可以由 TeX 标准分页算法拆分。按作者 David Carlisle 的说法,它“拥有 tabular 环境的大多数功能,但生成的表格可以跨页拆分”。用法也很像 tabular\begin{longtable}{spec} 接收 必选列指定,主体中用 & 分列,用 \\ 结束行。区别在于它 不是浮动体,而是直接放在正文中,因此 不要table 环境包住 \begin{longtable}…\end{longtable}

在导言区用 \usepackage{longtable} 载入。lcrp{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 结束。之后才是真正的数据行;写在这些标记下面的行会作为实际表格内容流入各页。

document.tex
\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} 列中换行。但如果想要一列 伸展到整行宽度,并按内容自动调整宽度tabularxX 列 很方便。“高级表格环境(tabularx / tabularray)”中介绍的这个 X 列本来属于 tabularx 环境,不能跨页断开

把两者优点合在一起的是 xltabular(Rolf Niepraschk 与 Herbert Voß)。作者的描述是:“像 tabularx 一样工作的 longtable;简言之,就是带有 X 列指定符的 longtable。”它内部载入 ltablex,但不会改变已有 tabularx 环境的行为。环境语法类似 tabularx:先是 可选位置引数 [c] / [r] / [l],接着是整张表的 总宽度,然后是 列指定longtable 的表头 / 表脚标记(\endfirsthead 等)也可以照常使用。

document.tex
\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,就不会消耗编号。