ページをまたぐ表(longtable)

行数の多い表は、一枚のページに収まらず次のページへ続けたくなります。ところが、ふつうに tabulartable 環境(浮動体) に入れた表は、けっして改ページしません——フロートは「一ページに収まる塊」を前提にしているからです。この壁を越えるのが longtable パッケージlongtable 環境はフロートではなく 本文の流れの中に直接置かれ、LaTeX の通常の改ページ処理に従って 複数ページにまたがれます。このページでは、なぜ tabular だけでは改ページできないのか、longtable見出し・脚の繰り返し\endfirsthead\endhead\endfoot\endlastfoot)の仕組み、キャプションの付け方、そして自動幅の X 列も改ページできる xltabular までを見ていきます。

なぜ table の中の表は改ページできないのか

「tabular の基本」で見たとおり、表の中身を組むのは tabular 環境、それを「表◯」として配置するのが浮動体の table 環境 でした。tablefigure と同じ フロート(floating body) で、LaTeX は「これは一ページに収まる一個の塊だ」とみなして、本文の途中から ページの上や下へ丸ごと移動 させます。塊である以上、その内部で改ページは起こりません。だから中身の tabular がどれだけ縦に長くても 分割されず、ページに収まらなければ次ページの先頭へ送られるだけで、最悪あふれてしまいます。

つまり「ページをまたぐ表」は、フロートという枠組みそのものと相容れません。必要なのは、表を 本文と同じ文章の流れに置き、段落のように 自然に改ページさせる 仕組みです。それが longtable です。

longtable 環境

longtable は、tabular の機能をほぼそのまま備えつつ、TeX の標準の改ページアルゴリズムで分割できる 表組み環境です。パッケージ作者 David Carlisle の言葉では「tabular 環境のほとんどの機能を持ち、複数ページに分割できる表を作る」環境。使い方も tabular とよく似ていて、\begin{longtable}{spec} のように 列指定を必須引数 に取り、本文では & で列を区切り \\ で行を閉じます。違いは、これが フロートではなく本文に直接置かれる こと——だから \begin{longtable}…\end{longtable}table 環境で包んではいけません

使うにはプリアンブルで \usepackage{longtable} を読み込みます。lcrp{幅} といった列指定や \hline\multicolumntabular とまったく同じように使えます。\begin{longtable} には列指定の前に 任意引数 [c][r][l] を渡せ、これは表全体を 左右どちらに寄せるか(既定は中央)を決めます。改ページは行と行のあいだ、または \hline の位置でのみ起こり、p 列の一行(セル)の途中では分割されません。

見出しと脚の繰り返し

表が複数ページに分かれると、二ページ目以降にも 見出し行(ヘッダ) を出したくなります。longtable は、表の冒頭に「どの行をどのページに繰り返すか」を宣言する 四つのマーカー を用意しています。各マーカーは、対応する行(複数可)の末尾で \\ の代わりに置きます。

  • \endfirsthead — この行までは、最初のページ の表頭にだけ現れます。
  • \endhead\endfirsthead の後・このマーカーまでの行は、最初以外のすべてのページ の表頭に繰り返されます。
  • \endfoot\endhead の後・このマーカーまでの行は、表が 次ページへ続くページの脚(=最終ページ以外)に現れます。
  • \endlastfoot\endfoot の後・このマーカーまでの行は、最終ページの表の末尾 にだけ現れます。

これらは省略可能で、たとえば全ページで同じ見出しを出すだけなら \endhead だけでも足ります。\endfirsthead を別に書けば、一ページ目だけ違う見出し(たとえばキャプション付き)に、二ページ目以降は「(つづき)」のような簡略な見出しに、と作り分けられます。\endfoot には、次ページへ続くことを知らせる 「次ページに続く」 の行を入れるのが定番です。

キャプションと番号

longtabletabular と違い、自前で \caption{…} を持ちます。番号付けには標準と同じ table カウンタを使うので、\caption{…} は通常の表と同じく「表◯」として 自動採番 され、図表一覧(\listoftables)にも載ります。キャプションは表のレイアウトの一部なので、\caption{…}\\ のように 見出しブロック(\endfirsthead の前)に書き、末尾を \\ で閉じる のが基本です。

いくつか実用的な約束ごとがあります。番号を付けたくない ときは \caption*{…} を使います(番号も図表一覧の項目も付きません)。二ページ目以降の見出しに置く「(つづき)」のような 従属キャプション は、図表一覧に重複して載らないよう 任意引数を空にした \caption[]{…} で書きます。相互参照の \label{…} は、繰り返される \endhead の見出しに置いてはいけません(複数回現れてしまうため)。\endfirsthead の中か、表の本文に置きます。キャプションの幅は既定で 4 インチ。変えたいときはプリアンブルで \setlength{\LTcapwidth}{…} を設定します。

完全な骨格

四つのマーカーをすべて使った longtable の骨格を示します。読み方はこうです——まず冒頭に、一ページ目だけの見出し(キャプションと列見出し)を書き、\endfirsthead で閉じる。続けて二ページ目以降の見出し(「(つづき)」+列見出し)を書き、\endhead で閉じる。次に、続くページの脚に出す「次ページに続く」の行を \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}

この表は番号付きキャプション「表◯: 年間の売上記録」を一ページ目に出し、ページをまたぐたびに「(表のつづき)」と列見出しを上端に繰り返し、続くページの下端には「次ページに続く」を添えます。最終ページでは脚の罫線だけで静かに締めくくります。データ行がどれだけ増えても、longtable が行の境目で自動的にページを分けていきます。

一つ注意点があります。longtable列幅と改ページ位置を確定させるために、LaTeX を二回以上処理する必要 があります。各ページの幅をそろえる情報を .aux ファイル経由でやり取りするため、初回のコンパイルでは列がそろわない ことがあり、実際 LaTeX は「列幅が変わった」という警告を出します(ドキュメントにも「数回処理するまで正しくそろわない」と明記されています)。latexmk などのビルドツールは必要な回数だけ自動で再処理してくれます。

自動幅で折り返す列:xltabular

longtable の列指定は tabular と同じなので、長い文章は p{幅} 列に固定幅で入れて折り返します。ただし「行幅いっぱいに広がり、中身に応じて幅が自動調整される列」がほしいときは、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{幅} を手で調整する必要はありません。なお、longtable が常に table カウンタを進めるのに対し、xltabular\caption を書かなければ番号を消費しない点が少し異なります。