行数の多い表は、一枚のページに収まらず次のページへ続けたくなります。ところが、ふつうに tabular を **table 環境(浮動体) に入れた表は、けっして改ページしません——フロートは「一ページに収まる塊」を前提にしているからです。この壁を越えるのが longtable パッケージ**。longtable 環境はフロートではなく 本文の流れの中に直接置かれ、LaTeX の通常の改ページ処理に従って 複数ページにまたがれます。このページでは、なぜ tabular だけでは改ページできないのか、longtable の 見出し・脚の繰り返し(\endfirsthead・\endhead・\endfoot・\endlastfoot)の仕組み、キャプションの付け方、そして自動幅の X 列も改ページできる **xltabular** までを見ていきます。
なぜ table の中の表は改ページできないのか
「tabular の基本」で見たとおり、表の中身を組むのは tabular 環境、それを「表◯」として配置するのが浮動体の **table 環境** でした。table は figure と同じ フロート(floating body) で、LaTeX は「これは一ページに収まる一個の塊だ」とみなして、本文の途中から ページの上や下へ丸ごと移動 させます。塊である以上、その内部で改ページは起こりません。だから中身の tabular がどれだけ縦に長くても 分割されず、ページに収まらなければ次ページの先頭へ送られるだけで、最悪あふれてしまいます。
つまり「ページをまたぐ表」は、フロートという枠組みそのものと相容れません。必要なのは、表を 本文と同じ文章の流れに置き、段落のように 自然に改ページさせる 仕組みです。それが longtable です。
longtable 環境
longtable は、tabular の機能をほぼそのまま備えつつ、TeX の標準の改ページアルゴリズムで分割できる 表組み環境です。パッケージ作者 David Carlisle の言葉では「tabular 環境のほとんどの機能を持ち、複数ページに分割できる表を作る」環境。使い方も tabular とよく似ていて、\begin{longtable}{spec} のように 列指定を必須引数 に取り、本文では & で列を区切り \\ で行を閉じます。違いは、これが フロートではなく本文に直接置かれる こと——だから \begin{longtable}…\end{longtable} を **table 環境で包んではいけません**。
使うにはプリアンブルで \usepackage{longtable} を読み込みます。l・c・r・p{幅} といった列指定や \hline・\multicolumn は tabular とまったく同じように使えます。\begin{longtable} には列指定の前に **任意引数 [c]・[r]・[l] を渡せ、これは表全体を 左右どちらに寄せるか**(既定は中央)を決めます。改ページは行と行のあいだ、または \hline の位置でのみ起こり、p 列の一行(セル)の途中では分割されません。
見出しと脚の繰り返し
表が複数ページに分かれると、二ページ目以降にも 見出し行(ヘッダ) を出したくなります。longtable は、表の冒頭に「どの行をどのページに繰り返すか」を宣言する 四つのマーカー を用意しています。各マーカーは、対応する行(複数可)の末尾で \\ の代わりに置きます。
\endfirsthead— この行までは、最初のページ** の表頭にだけ現れます。\endhead** —\endfirstheadの後・このマーカーまでの行は、最初以外のすべてのページ の表頭に繰り返されます。\endfoot** —\endheadの後・このマーカーまでの行は、表が 次ページへ続くページの脚(=最終ページ以外)に現れます。\endlastfoot** —\endfootの後・このマーカーまでの行は、最終ページの表の末尾 にだけ現れます。
これらは省略可能で、たとえば全ページで同じ見出しを出すだけなら \endhead だけでも足ります。\endfirsthead を別に書けば、一ページ目だけ違う見出し(たとえばキャプション付き)に、二ページ目以降は「(つづき)」のような簡略な見出しに、と作り分けられます。\endfoot には、次ページへ続くことを知らせる 「次ページに続く」 の行を入れるのが定番です。
キャプションと番号
longtable は tabular と違い、**自前で \caption{…} を持ちます**。番号付けには標準と同じ table カウンタを使うので、\caption{…} は通常の表と同じく「表◯」として 自動採番 され、図表一覧(\listoftables)にも載ります。キャプションは表のレイアウトの一部なので、\caption{…}\\ のように **見出しブロック(\endfirsthead の前)に書き、末尾を \\ で閉じる** のが基本です。
いくつか実用的な約束ごとがあります。番号を付けたくない ときは \caption*{…} を使います(番号も図表一覧の項目も付きません)。二ページ目以降の見出しに置く「(つづき)」のような 従属キャプション は、図表一覧に重複して載らないよう **任意引数を空にした \caption[]{…}** で書きます。相互参照の \label{…} は、**繰り返される \endhead の見出しに置いてはいけません**(複数回現れてしまうため)。\endfirsthead の中か、表の本文に置きます。キャプションの幅は既定で 4 インチ。変えたいときはプリアンブルで \setlength{\LTcapwidth}{…} を設定します。
完全な骨格
四つのマーカーをすべて使った longtable の骨格を示します。読み方はこうです——まず冒頭に、一ページ目だけの見出し(キャプションと列見出し)を書き、\endfirsthead で閉じる。続けて二ページ目以降の見出し(「(つづき)」+列見出し)を書き、\endhead で閉じる。次に、続くページの脚に出す「次ページに続く」の行を \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}この表は番号付きキャプション「表◯: 年間の売上記録」を一ページ目に出し、ページをまたぐたびに「(表のつづき)」と列見出しを上端に繰り返し、続くページの下端には「次ページに続く」を添えます。最終ページでは脚の罫線だけで静かに締めくくります。データ行がどれだけ増えても、longtable が行の境目で自動的にページを分けていきます。
一つ注意点があります。longtable は 列幅と改ページ位置を確定させるために、LaTeX を二回以上処理する必要 があります。各ページの幅をそろえる情報を .aux ファイル経由でやり取りするため、初回のコンパイルでは列がそろわない ことがあり、実際 LaTeX は「列幅が変わった」という警告を出します(ドキュメントにも「数回処理するまで正しくそろわない」と明記されています)。latexmk などのビルドツールは必要な回数だけ自動で再処理してくれます。
自動幅で折り返す列:xltabular
longtable の列指定は tabular と同じなので、長い文章は p{幅} 列に固定幅で入れて折り返します。ただし「行幅いっぱいに広がり、中身に応じて幅が自動調整される列」がほしいときは、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{幅} を手で調整する必要はありません。なお、longtable が常に table カウンタを進めるのに対し、xltabular は \caption を書かなければ番号を消費しない点が少し異なります。