Tableaux sur plusieurs pages (longtable)

Un tableau comportant de nombreuses lignes dépasse vite une seule page et doit se poursuivre sur la suivante. Mais un tabular ordinaire placé dans l’environnement flottant table ne se coupera jamais sur deux pages : un flottant suppose un bloc qui tient sur une page. Le package longtable franchit cette limite. L’environnement longtable n’est pas un flottant : il se place directement dans le flux du texte et peut s’étendre sur plusieurs pages, découpé par l’algorithme normal de saut de page de LaTeX. Cette page explique pourquoi tabular seul ne peut pas se couper, comment fonctionnent les en-têtes et pieds répétés de longtable (\endfirsthead, \endhead, \endfoot, \endlastfoot), comment ajouter des légendes, puis xltabular, qui permet aussi des colonnes X à largeur automatique sur plusieurs pages.

Pourquoi un tableau dans un flottant ne peut pas se couper

Comme indiqué dans « bases de tabular », l’environnement tabular compose le contenu du tableau, tandis que l’environnement flottant table le place comme « Tableau N ». Comme figure, table est un flottant : LaTeX le traite comme un bloc unique qui tient sur une page et peut déplacer tout le bloc vers le haut ou le bas d’une page. Étant indivisible, aucun saut de page ne peut se produire à l’intérieur. Ainsi, quelle que soit la hauteur du tabular interne, il n’est jamais scindé ; il est seulement poussé au début de la page suivante et peut encore déborder s’il ne tient pas.

Autrement dit, un « tableau qui s’étend sur plusieurs pages » est fondamentalement incompatible avec le mécanisme des flottants. Il faut un moyen de placer le tableau dans le même flux que le texte et de le laisser se couper naturellement sur plusieurs pages, comme un paragraphe. C’est exactement ce que fournit longtable.

L’environnement longtable

longtable conserve presque toutes les fonctionnalités de tabular tout en produisant un tableau qui peut être divisé par l’algorithme standard de saut de page de TeX. Selon son auteur, David Carlisle, il « has most of the features of the tabular environment, but produces tables which may be broken » across pages. Son usage ressemble beaucoup à tabular : \begin{longtable}{spec} prend une spécification de colonnes obligatoire, puis le corps sépare les colonnes par & et termine les lignes par \\. La différence est qu’il est placé directement dans le texte, et non comme flottant ; il ne faut donc pas envelopper \begin{longtable}…\end{longtable} dans un environnement table.

Chargez-le avec \usepackage{longtable} dans le préambule. Les spécificateurs de colonnes l, c, r, p{width}, ainsi que \hline et \multicolumn, fonctionnent exactement comme dans tabular. Avant la spécification de colonnes, \begin{longtable} accepte un argument optionnel [c], [r] ou [l] qui fixe l’alignement horizontal du tableau entier (centré par défaut). Les sauts de page se produisent seulement entre lignes ou aux positions de \hline, jamais au milieu d’une ligne d’une colonne p.

En-têtes et pieds répétés

Quand un tableau se scinde sur plusieurs pages, on souhaite généralement que les lignes d’en-tête réapparaissent sur chaque page de continuation. longtable fournit quatre marqueurs, déclarés au début du tableau, qui indiquent quelles lignes répéter sur quelles pages. Chaque marqueur se place là où \\ terminerait normalement la ligne correspondante.

  • \endfirsthead — les lignes jusqu’ici apparaissent comme en-tête seulement sur la première page.
  • \endhead — les lignes après \endfirsthead et jusqu’ici se répètent en tête de toutes les pages sauf la première.
  • \endfoot — les lignes après \endhead et jusqu’ici apparaissent au pied de chaque page qui continue, c’est-à-dire toutes sauf la dernière.
  • \endlastfoot — les lignes après \endfoot et jusqu’ici apparaissent uniquement tout à la fin du tableau, sur la dernière page.

Les quatre sont optionnels : si vous voulez seulement le même en-tête sur chaque page, \endhead suffit. Un \endfirsthead séparé permet de donner à la première page un en-tête différent, par exemple avec légende, et aux pages suivantes un en-tête bref comme « (continued) ». Le bloc \endfoot est l’endroit habituel pour une ligne « Continued on next page » signalant que le tableau continue.

Légendes et numérotation

Contrairement à tabular, longtable possède son propre \caption{…}. Il utilise le compteur standard table, donc \caption{…} est numéroté automatiquement comme « Tableau N », comme un tableau normal, et apparaît dans \listoftables. Comme la légende fait partie de la mise en page du tableau, on l’écrit dans le bloc d’en-tête, avant \endfirsthead, et on la ferme par \\, comme \caption{…}\\.

Quelques conventions pratiques. Pour omettre le numéro, utilisez \caption*{…} ; il n’y aura ni numéro ni entrée dans la liste des tableaux. Pour une légende subsidiaire comme « (continued) » sur les pages suivantes, écrivez-la avec un argument optionnel vide, \caption[]{…}, afin qu’elle ne soit pas listée deux fois. Un \label{…} de référence croisée ne doit pas être placé dans le \endhead répété, car il apparaîtrait plusieurs fois ; mettez-le dans \endfirsthead ou dans le corps du tableau. La largeur de légende vaut 4 pouces par défaut ; modifiez-la avec \setlength{\LTcapwidth}{…} dans le préambule.

Un squelette complet

Voici un squelette de longtable utilisant les quatre marqueurs. Il se lit ainsi : d’abord l’en-tête de la première page, légende plus titres de colonnes, fermé par \endfirsthead. Ensuite l’en-tête des pages suivantes, « (continued) » plus titres de colonnes, fermé par \endhead. Puis la ligne « Continued on next page » pour les pages qui continuent, fermée par \endfoot, et le filet de clôture de la dernière page, fermé par \endlastfoot. Après tout cela viennent les vraies lignes de données ; tout ce qui se trouve sous les marqueurs constitue le contenu réel, réparti sur les pages.

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}

Ce tableau place la légende numérotée « Table N: Annual sales log » sur la première page, répète « (continued) » et les titres de colonnes en haut à chaque changement de page, et ajoute « Continued on next page » en bas des pages qui continuent. La dernière page se termine sobrement par le seul filet de pied. Quel que soit le nombre de lignes de données ajoutées, longtable scinde automatiquement le tableau aux limites de ligne.

Une réserve : longtable a besoin d’au moins deux passages LaTeX pour stabiliser les largeurs de colonnes et les sauts de page. Il échange les informations de largeur par page via le fichier .aux, donc le premier passage peut ne pas aligner les colonnes ; LaTeX affiche même un avertissement indiquant que les largeurs ont changé. Le manuel précise que le tableau « will not line up correctly until the document has been run through LaTeX several times ». Des outils comme latexmk relancent le document autant de fois que nécessaire.

Colonnes repliables à largeur automatique : xltabular

La spécification de colonnes de longtable est la même que celle de tabular, donc les textes longs vont dans une colonne p{width} fixe qui se replie. Mais si vous voulez une colonne qui s’étire pour remplir la largeur de ligne et ajuste sa largeur automatiquement au contenu, la colonne X de tabularx est l’outil voulu. Cette colonne X, présentée dans « environnements de tableaux avancés (tabularx / tabularray) », appartient à l’environnement tabularx et ne peut pas se couper sur plusieurs pages.

Le package xltabular (Rolf Niepraschk et Herbert Voß) réunit les deux avantages. Selon ses auteurs, il « behaves like a tabularx as a longtable — in short, it is a longtable with the column specifier X ». Il charge ltablex en interne mais laisse l’environnement tabularx existant inchangé. Sa syntaxe ressemble à tabularx : un argument optionnel de position [c] / [r] / [l], puis la largeur totale du tableau, puis la spécification des colonnes. Les marqueurs d’en-tête et de pied de longtable (\endfirsthead, etc.) fonctionnent aussi.

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}

Ici, la largeur totale est \linewidth (largeur du texte), et la colonne centrale de description est une colonne X. Elle s’étend automatiquement pour remplir la largeur restante et replie le texte long, tandis que tout le tableau est un longtable et peut s’étendre sur plusieurs pages, sans ajuster à la main un p{width} fixe. Petite différence : alors que longtable avance toujours le compteur table, xltabular ne consomme pas de numéro tant que vous n’écrivez pas \caption.