Le package longtable ^{∗}

David Carlisle^{†} traduction de Jean-Pierre Drucbert ^{‡}

1998/05/13

Résumé Ce package définit l’environnement longtable, une version « multi-page »

de tabular.

Liste des tableaux

1 Un caption optionnel (pour la liste des tables) . . . . . . . . . . . . 2 2 Une table flottante . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3 Une combinaison difficile de \multicolumn : pass 1 . . . . . . . . . 7 4 Une combinaison difficile de \multicolumn : pass 2 . . . . . . . . . 7 5 Une combinaison difficile de \multicolumn : pass 3 . . . . . . . . . 7 6 Une combinaison difficile de \multicolumn : pass 4 . . . . . . . . . 7 7 Résumé des commandes longtable . . . . . . . . . . . . . . . . . . . 10

1 Introduction

longtable Ce package définit un nouvel environnement, longtable, qui possède la plupart des possibilités de l’environnement tabular, mais produit des tables pouvant dépasser la hauteur d’une page, c’est-à-dire qui peuvent être coupées par l’algorithme standard de rupture de page de TEX. Il partage aussi certaines possibilités de l’environnement table. En particulier, il utilise le même compteur, table, et a une commande \caption similaire. La commande \listoftables liste les tables produites par les environnements table et longtable.

L’exemple suivant utilise la plupart des caractéristiques de l’environnement longtable. Un listing source de cet exemple est donné dans la Section 8.

Note : Plusieurs parties de la table suivante ne seront pas alignées correctement jusqu’à ce que ce document soit compilé plusieurs fois par L^{A}TEX. C’est un trait caractéristique de ce package, comme décrit ci-dessous.

∗Ce fichier a le numéro de version v4.09, révisé le 1998/05/13.

†Le nouvel algorithme pour aligner les morceaux (« chunks ») d’une table, utilisé dans la version 4 de ce package a été révisé, implémenté et documenté par David Kastrup, dak@neuroinformatik.ruhr-uni-bochum.de.

‡Traductions additionnelles : Françoise Marre-Fournier <marre-fournier@unilim.fr> ; relecture Benjamin Bayart <bayartb@edgard.fdn.fr>

. . . . . . . . . . . . . . . . . . . . . . . longtable.sty . . . . . . . . . . . . . . . . . . . . . . .

Tab. 1: Une longue table

*  Cette partie apparaît au sommet de la table  *
*  Première Seconde  *
*  Les colonnes de longtable sont spécifiées de la  *
*  même manière que dans l’environnement tabular.  *

*  @{*}r||p{1in}@{*} dans ce cas.  *

*  Chaque ligne se termine par une commande \\. *
*  La commande \\ a un argument  *
*  optionnel, tout comme dans l’environnement tabular.  *
*  Voyez vous l’effet de \\[10pt] ?  *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  De même \hline peut être utilisée, comme dans ta- bular.*
*  Ceci était une \hline .  *
*  Ceci était une \hline\hline .  *

                  Ceci est une \multicolumn{2}{||c||}

*  Si une rupture de page a lieu sur une \hline alors une ligne est tra- cée*
*  au bas d’une page et au sommet de la suivante.*
*  L’argument [t] [b] [c] de tabular ne peut pas être utilisé.*
*  L’argument optionnel doit être choisi parmi [l] [r] [c] *
*  pour spécifier si la table doit être ajustée  *
*  sur la gauche, sur la droite ou centrée.  *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
* Ceci va en bas. *

. . . . . . . . . . . . . . . . . . . . . . . . . . . Page 2 . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . longtable.sty . . . . . . . . . . . . . . . . . . . . . . .

Tab. 1: (suite)

*  Cette partie apparaît en haut de chacune des autres pages  *
*  Première Seconde  *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*Certaines lignes prennent beaucoup de place, comme celle-ci : Cette dernière colonne est une colonne « p » si bien que cette « ligne » de la table peut occuper plusieurs lignes. Notez cependant que TEX ne coupera jamais une page à l’intérieur d’une telle ligne. Les ruptures de page ne se produisent qu’entre les rangées de la table ou sur des commandes \hline.*

*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Des tas^{1} de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci^{2} *
*  Ceci va en bas.  *

. . . . . . . . . . . . . . . . . . . . . . . . . . . Page 3 . . . . . . . . . . . . . . . . . . . . . . . . . .

1Ceci est une note 2longtable prend des précautions spéciales et des notes de bas de page peuvent aussi être

. . . . . . . . . . . . . . . . . . . . . . . longtable.sty . . . . . . . . . . . . . . . . . . . . . . .

Tab. 1: (suite)

*  Cette partie apparaît en haut de chacune des autres pages  *
*  Première Seconde  *
*  Des tas de lignes comme celle-ci. *
*  Des tas de lignes comme celle-ci. *
*  Ces lignes apparaîtront *
*  à la place du bas habituel *
*  à la fin de la table  *

2 Taille du pas ou « chunk size »

LTchunksize Pour pouvoir traiter par TEX des tables faisant plusieurs pages, il est nécessaire de partager la table en plus petits morceaux (les « chunks », littéralement « bouchées », NdT), pour que TEX ne soit pas obligé de tout garder à la fois. Par défaut, longtable utilise 20 lignes par pas, mais l’usager peut choisir la valeur qu’il désire, avec par exemple, \setcounter{LTchunksize}={10}.^{3} Ces pas ou « chunks » n’affectent pas la rupture des pages, donc si vous utilisez TEX avec beaucoup de mémoire, vous pouvez donner à LTchunksize l’équivalent de plusieurs pages de la table. TEX s’exécutera plus rapidement avec un grand LTchunksize. Cependant si cela est nécessaire longtable peut travailler avec LTchunksize=1, auquel cas la mémoire utilisée sera négligeable. Notez que si vous utilisez les commandes pour placer un en-tête en haut de la page (voir plus loin), la valeur de LTchunksize doit être au moins égale au nombre de lignes de l’en-tête ou du pied. (En pratique, une valeur entre 10 et 50 semble raisonnable. NdT).

Ce document spécifie \setcounter{LTchunksize}{10}. Si vous pouviez regarder la table précédente après la première exécution de L^{A}TEX vous verriez que les deux moitiés ne collent pas^{4}. De plus L^{A}TEX a imprimé un avertissement comme quoi la largeur des colonnes a changé. longtable écrit des informations dans le fichier .aux, pour pouvoir aligner les différents pas ou « chunks ». Avant la version 4, il n’utilise ces informations que si une commande \setlongtables est donnée avant que la table commence. Cependant, maintenant, ces informations sont toujours utilisées, grace à un nouvel algorithme^{5} et donc \setlongtables n’est plus utile. Il est défini (mais ne fait rien) pour que les anciens documents qui l’emploient puissent être utilisé.

utilisées (sans abus !) dans les colonnes ‘p’.

3On peut aussi utiliser la syntaxe plain TEX \LTchunksize=10.

4En fait, vous ne voyez rien d’étrange ici, car au second passage de L^{A}TEX, tout est remis en place. Et ce document ne s’est pas fait en un seul passage (ni même en seul un jour). NdT

5Dû à David Kastrup

Un environnement tabular
dans une table  flottante

Tab. 2 – Une table flottante

3 Légendes et en-têtes

Au début de la table vous pouvez spécifier des lignes qui devront apparaître en haut de chaque page (en dessous de la ligne de tête, mais avant les autres lignes de la table).

\endhead Ces lignes sont entrées normalement, mais la dernière commande \\ est rem-

placée par une commande \endhead.

\endfirsthead Si la première page doit avoir une en-tête différente, alors celle-ci doit être donnée en premier, et terminée par la commande \endfirsthead. La valeur de \LTchunksize doit être choisie au moins égale au nombre de lignes de l’en-tête.

\endfoot Il y a aussi des commandes \endfoot et \endlastfoot qui sont utilisées de la \endlastfoot même façon (au début de la table) pour spécifier des lignes (ou une \hline) de-

vant apparaître en bas de chaque page. Dans certaines situations, vous pourrez vouloir placer des lignes qui appartiennent logiquement au corps de la table à la fin de firsthead, ou au début de lastfoot. Ceci peut aider à contrôler quelles lignes apparaissent sur la première et la dernière page de la table.

\caption La commande \caption{...} est essentiellement équivalente à

\multicolumn{n}{c}{\parbox{\LTcapwidth}{...}} où n est le nombre de co-

lonnes de la table. Vous pouvez forcer la largeur de la légende avec une commande telle que \setlength{LTcapwidth}{2in} dans le préambule de votre document. La valeur par défaut est de quatre pouces. \caption écrit aussi les informations pour produire une entrée dans la liste des tables. Comme pour la commande \caption des environnements figure et table, un argument optionnel spécifie le texte devant apparaître dans la liste des tables si ce texte est différent de celui apparaissant dans la légende elle-même. Donc la légende pour la table 1

a été spécifiés par \caption[Une légende optionnelle (pour la liste des
tables)]{Une longue table\label{long}} Vous pouvez désirer que la légende

sur les pages suivantes soit différente de celle de la première page. Dans ce cas placez la commande \caption dans le premier en-tête, et une autre légende dans une commande \caption[] dans l’en-tête principal. Si l’argument optionnel de la commande \caption est vide, aucune entrée n’est ajoutée dans la liste des tables. De plus, si vous ne voulez pas que le numéro de table soit imprimé chaque fois, utilisez la commande \caption*.

Le légendes sont formattés suivant le code de la classe article. Si vous avez redéfini la commande standard \@makecaption pour produire un format différent de légende, vous serez peut-être amené à réaliser des changements similaires pour le \LT@makecaption de la version de longtable. Voir le code pour plus de détails. Une métode plus pratique pour personnaliser les légendes donnée par le package caption2, qui fournit des commandes de légendes personnalisés, et qui adapte les légendes dans les environnements standards. De nombreux autres environnements fournis par des packages (incluant le package longtable) sont modifiés de façon compatible.

Vous pouvez utiliser la commande \label pour faire des références croisés aux longues tables avec \ref (ou \pageref, NdT). Notez dependant que la commande \label ne doit pas être utilisée dans un en-tête qui peut apparaître plus d’une fois. Placez la, soit dans le fisrthead ou dans le corps de la table. Elle ne doit être la première commande de n’importe quelle entrée. [Les règles exactes sur les endroits où il est possible de placer la commande \label sont assez TEXniques, mais il est toujours possible et inoffensif de la placer à l’intérieur de l’argument d’une commande \caption. NdT].

4 Entrées multicolonnes

La commande \multicolumn peut être utlisée exactement de la même manière que dans tabular. Vous pouvez vouloir sauter cette section, qui est plutôt technique, cependant prendre en compte \multicolumn est un des principaux problèmes pour un environnement tel que longtable. Le principal effet que l’utilisateur verra est que certaines combinaisons des entrées \multicolumn auront comme résultat que le document devra être plusieurs fois compilé par L^{A}TEX avant que les différents morceaux (« chunks ») d’une table ne soient alignés.

Les exemples de cette section sont réalisés en utilisant un LTchunksize fixé à la valeur minimum, pour montrer les effects lorsque les entrés \multicolumn se produisent dans différents morceaux.

Considérons la Table 3. Dans le deuxième morceau, longtable voit l’entré large de la multicolonne. À ce point, il considère que les deux premières colonnes sont trés étroites. Toute la largeur de l’entrée multicolonne est supposée être dans la troisième colonne (c’est une « caractéristique » de la commande originelle \halign de TEX). Ensuite longtable prend en compte l’information selon laquelle il y a une troisième colonne large pour le dernier morceau. Le résultat est que la première « passe » est trop « large ». Si les « lignes sauvées » à partir de cette première passe sont réinsérées dans la table à la passe suivante, la table sera alignée en deux passes mais pourra être beaucoup trop large.

\kill La solution de ce problème, employée dans les versions 1 et 2, est d’utiliser une « \kill line » (littéralement, une ligne tuée, NdT). Si une ligne est tuée (\killed), par l’utilisation de \kill, au lieu de \\, à la fin de la ligne, cela est utilisé dans le calcul des largeurs de colonne, mais enlevé de la table finale. Donc, l’entrée de copies tuées (\killed copies) des deux dernières lignes, avant l’entrée entière de la colonne, devrait signifier que \halign « voyait » l’entrée complète dans les deux premières colonnes, et donc, élargissait la troisième colonne de façon à faire la place à l’entrée multicolonne.

Dans la version 3, une nouvelle solution a été introduite. Si la ligne sauvée dans le fichier .aux n’a pas été utilisée, longtable utilisait une forme « brouillon » de \multicolumn ; cela modifiait la définition, de façon à ce que l’entrée étendue ne soit pas plus large que la colonne élargie. Donc, après la première passe, le fichier .aux stockait la plus large entrée normale pour chaque colonne, aucune colonne

. . . . . . . . . . . . . . . . . . . . . . . longtable.sty . . . . . . . . . . . . . . . . . . . . . . .

Tab. 3: Une combinaison difficile de \multicolumn : pass 1

1 2 3

une multicolonne trés large 1–3

une multicolonne 1–2  3
wide 1 2 3

Tab. 4: Une combinaison difficile de \multicolumn : pass 2

1 2 3

une multicolonne trés large 1–3

une multicolonne 1–2 3
wide 1 2 3

Tab. 5: Une combinaison difficile de \multicolumn : pass 3

1 2 3

une multicolonne trés large 1–3

une multicolonne 1–2  3
wide 1 2 3

Tab. 6: Une combinaison difficile de \multicolumn : pass 4

1 2 3

une multicolonne trés large 1–3

une multicolonne 1–2  3
wide 1 2 3

. . . . . . . . . . . . . . . . . . . . . . . . . . . Page 7 . . . . . . . . . . . . . . . . . . . . . . . . . . n’étant élargie à cause des colonnes \spanées. Par défaut, longtable ignorait le fichier .aux, et donc chaque compilation par L^{A}TEX était considérée comme la première passe. Une fois la déclaration de \setlongtables faite, la ligne sauvée dans le fichier .aux et la définition correcte de \multicolumn était utilisées. Si une entrée \multicolumn entraînait l’élargissement d’une colonne, cette information ne pouvait être ignorée pour le morceau suivant, et donc la table ne pouvait pas être correctement alignée jusqu’à la troisième passe. Cette algorithme convergeait toujours en trois passes, comme décrit ci-dessus, mais dans les exemples tels qu’un de ceux des tables 3–6, les largeurs finales n’étaient pas optimales pour celle de la colonne 2 : en effet, cette largeur est déterminée par une entrée \multicolumn qui n’est pas connue quand la largeur finale de la colonne 3 a été déterminée car les deux commandes \multicolumn sont interverties entre les modes « brouillon » et « normal » en même temps.

La version 4 allège considérablement le problème. La première compilation de la table aura en effet une troisième colonne beaucoup trop large. Cependant, à la passe suivante, longtable prendra en compte l’erreur et réduira la largeur de colonne de façon conforme. Si cela doit déplacer le morceau avant celui de \multicolumn, une passe additionnelle, bien sûr, sera nécessaire.

Il est possible de construire des tables dans lesquelles cette détermination en cascade des bonnes largeurs nécessite plusieurs compilation pour « converger » et produire une table avec tous ses morceaux alignés. Cependant, pour avoir besoin de plusieurs compilations, il faut construire une table avec de nombreuses entrées \multicolumn se chevauchant, toutes étant plus larges que la largeur naturelle des colonnes à étendre et toutes se produisant dans des parties de table différentes.

Dans le cas le plus courant, l’algorithme convergera après deux ou trois passes ; on aura l’avantage de ne pas rééditer le document avant la compilation finale pour ajouter \setlongtables et le meilleur choix de la largeur finale des colonnes, en cas de plusieurs entrées \multicolumn sera, heureusement, plus aisé que les passes supplémentaires qui seraient nécessaires.

Donc, la table 3 converge après 4 passes comme on peut le voir table 6.

Vous pouvez encore accélérer la convergence en introduisant judicieusement des lignes \killées, s’il vous arrive d’avoir des tables morcellées, comme ci-dessus.

Et si vous ne désirez pas compiler un fichier deux fois, vous devez, à la première ligne de chaque longtable, saisir une ligne \killée qui contient l’entrée la plus large qui sera utilisée dans chaque colonne. Tous les morceaux seront alignés à la première compilation.

5 Ajustement

L’argument optionnel de longtable contrôle l’alignement horizontal de la table. Les options possibles sont [c], [r] et [l], pour centrer, aligner à droite et aligner

\LTleft à gauche, respectivement. Normalement, le centrage est l’option par défaut, mais \LTright ce document spécifie

 \setlenght\LTleft\parindent
 \setlenght\LTright\fill

dans son préambule, ce qui signifie que les tables sont cadrées à gauche, mais indentées comme pour un paragraphe normal. Des longueurs quelconques peuvent être spécifiées pour ces paramètres, mais au moins l’une d’elles devrait être élastique pour pouvoir remplir la largeur de la page, à moins que des longueurs élastiques soient ajoutées entre les colonnes en utilisant la commande \extracolumnsep. Par exemple

\begin{tabular*}
{\textwidth}{@{\extracolsep{...}}...}

produit un table de pleine largeur, pour produire un effet similaire avec longtable :

\setlength\LTleft{0pt}
\setlength\LTright{0pt}
\begin{longtable}{@{\extracolsep{...}}...}

6 Changements

Cette section présente les principaux changements depuis la version 2. Un état plus détaillé des changements peut être produit à la fin du listing source si le fichier

ltxdoc.cfg spécifie
\AtBeginDocument{\RecordChanges}
\AtEndDocument{\PrintChanges}

Changements effectués entre les versions 2 et 3 :

– Le mécanisme d’ajout des en-tête et pied de table a été complètement réécrit. Avec ce nouveau code, longtable ne nécessite pas de \clearpage au début de la page, ainsi une table peut commencer au milieu d’une page. De plus, la commande \endlastfoot, qui n’était pas implémentée de façon solide dans l’ancien code, a été ajoutée ;

– longtable provoque maintenant une erreur s’il démarre dans un contexte \twocolumn ou dans l’environnement multicols ;

– le fichier séparé de documentation longtable.tex a été fusionné avec le fichier d’extension, longtable.dtx en utilisant le package doc de Mittelbach ;

– la prise en compte des notes de bas de page a été ajoutée. Cependant, il est à noter que \footnote ne fonctionnera pas dans les sections d’« en-tête » ou de « pied » de table. Pour pouvoir utiliser une note de bas de page dans ces sections (par exemple, dans une légende), il faut utiliser \footnotemark au point d’insertion et \footnotetext, n’importe où dans le corps de la table, qui apparaîtra sur la même page ;

– le traitement de \multicolumn a été modifié, rendant inutile de « tuer » (\kill) les lignes, au prix, quelquefois, de réaliser une troisiéme compilation par L^{A}TEX ;

– la commande \newpage fonctionne maintenant dans l’environnement longtable.

Changements effectués entre les versions 3 et 4 :

– Un nouvel algorithme est utilisé pour aligner les morceaux. En plus de la plus grande largeur de chaque colonne, longtable se souvient de quel morceau produisait ce maximum. Cela lui permet de vérifier que le maximum est encore atteint dans les derniéres compilations. Comme longtable peut maintenant traiter les colonnes retrécies pendant que le fichier est édité, la commande \setlongtables n’est plus nécessaire et est désactivée.

– Un bénéfice supplémentaire de la nouvelle capacité de l’algorithme à traiter les colonnes rétrécies est qu’il produit de meilleures (par rapport l’algorithme précédent) largeurs de colonne (plus étroites) dans le cas d’entrées de \multicolumn se chevauchant dans différents morceaux ;

– le mode « brouillon » de \multicolumn a été enlevé suivant les commandes asociées telles que \LTmulticolumn ;

– l’inconvénient du nouvel algorithme est qu’il peut faire plus de passes. Le maximum théorique est approximativement deux fois la longueur d’un « enchaînement » de colonnes avec des entrées \multicolumn se chevauchant, bien qu’en pratique il converge habituellement plus vite que l’ancienne version (qui converge toujours en trois passes une fois la commande

\setlongtables activée) ;

– les commandes \\* et \nopagebreak peuvent être utilisées pour contrôler les sauts de page.

7 Résumé

Tab. 7: Résumé des commandes longtable

Paramètres

\LTleft  Glu sur la gauche de la table.  (\fill)
\LTright  Glu sur la droite de la table.  (\fill)

\LTpre  Glu avant la table.  (\bigskipamount)
\LTpost  Glu après la table.  (\bigskipamount)

\LTcapwidth  La largeur de la « parbox » contenant la légende.  (4in)
LTchunksize  Le nombre de ligne par pas ou « chunk ».  (20)

Arguments optionnels de \begin{longtable}

aucun  Position spécifiés par \LTleft et \LTright.
[c]  Centre la table.
[l]  Place la table sur la gauche.
[r]  Place la table sur la droite.

Commandes à la fin des lignes de la table

\\  Spécifie la fin d’une ligne

\\[⟨dim⟩] Finit la ligne, puis ajoute un espace vertical (comme dans l’envi-

ronnement tabular).

\\*  Identique à \\ mais interdit un saut de page après la ligne.

\tabularnewline Équivalent à \\. À utiliser dans un contexte \raggedright (ou

similaire) qui redéfinit \\.

\kill  La ligne est effacée mais est utilisée dans le calcul des largeurs.
\endhead  Spécifie les lignes qui doivent apparaître en haut de chaque page.

\endfirsthead Spécifie les lignes qui doivent apparaître en haut de la première

page.

\endfoot  Spécifie les lignes qui doivent apparaître en bas de chaque page.

\endlastfoot Spécifie les lignes qui doivent apparaître en bas de la dernière page.

Les commandes de légende de longtable

\caption{⟨caption⟩} Légende ‘Table ? : ⟨caption⟩’, et une entrée ‘⟨caption⟩’ dans la liste

des tables.

\caption[⟨lot⟩]{⟨caption⟩} Légende ‘Table ? : ⟨caption⟩’, et une entrée ‘⟨lot⟩’ dans la liste des

tables.

\caption[]{⟨caption⟩} Légende ‘Table ? : ⟨caption⟩’, mais pas d’entrée dans la liste des

tables.

\caption*{⟨caption⟩}  Légende ‘⟨caption⟩’, mais pas d’entrée dans la liste des tables.

Commandes disponibles au début d’une ligne

\pagebreak  Force un saut de page.
\pagebreak[⟨val⟩]  Un poids (« hint ») entre 0 et 4 pour autoriser un saut.
\nopagebreak  Interdit un saut de page .
\nopagebreak[⟨val⟩]  Un poids (« hint ») entre 0 et 4 pour interdire un saut.
\newpage  Force un saut de page.

Commandes de note de bas de page disponible dans longtable

\footnote Note de bas de page, mais qui ne doit pa être utilisée dans les

têtes et pieds de tables.

\footnotemark Marque de la note de bas de page, peut être utilisée dans les têtes

et pieds de tables.

\footnotetext  Texte de la note de bas de page, à utiliser dans le corps de la page.

Setlongtables

\setlongtables  Commande obsolète. Ne fait plus rien.

8 Source de la Table 1

\begin{longtable}{@{*}r||p{1in}@{*}}
KILLED & LINE!!!! \kill
\caption
[Un caption optionnel (pour la liste des tables)]
{Une longue table\label{long}}\\
\hline\hline
\multicolumn{2}{@{*}c@{*}}%
{Cette partie appara\^{\i}t au sommet de la table}}\\
\textsc{Premi\`ere}&\textsc{Seconde}\\
\hline\hline
\endfirsthead
\caption[]{(suite)}\\
\hline\hline
\multicolumn{2}{@{*}c@{*}}%
      {Cette partie appara\^{\i}t en haut de chacune des autres pages}\\
\textbf{Premi\`ere}&\textbf{Seconde}\\
\hline\hline
\endhead
\hline
Ceci va en&bas.\\
\hline
\endfoot
\hline
Ces lignes&appara\^{\i}tront\\
\`a la place du&bas habituel\\
\`a la fin&de la table\\
\hline
\endlastfoot
Les colonnes de \env{longtable} sont sp\'ecifi\'ees& de la\\
m\^eme mani\`ere que dans l'environnement& \env{tabular}.\\
...
\multicolumn{2}{||c||}%
{Ceci est une ...}\\
...
  Certaines lignes prennent beaucoup de place, comme celle-ci: &
   \raggedleft Cette derni\`ere colonne est une colonne <<~p~>> \\
   si bien que cette <<~ligne~>> de la table peut occuper \\
   plusieurs lignes. Notez cependant que \TeX\ ne coupera \\
   jamais une page \`a l'int\'erieur d'une telle ligne. \\
   Les ruptures de page ne se produisent qu'entre les rang\'ees \\
   de la table ou sur des commandes "\hline".\\
   \tabularnewline
...
Des tas de lignes& comme celle-ci.\\
...
\hline
Des tas\footnote{...} de lignes& comme celle-ci.\\
Des tas de lignes& comme celle-ci\footnote{...}\\

 \hline
 Des tas de lignes& comme celle-ci.\\
 ...
 \end{longtable}

9 Les macrocommandes

1 ⟨∗package⟩

9.1 Code initial

Avant de déclarer les options du package, nous devons définir les valeurs par défaut ici.

\LT@err La commande de génération d’erreur

 2 \def\LT@err{\PackageError{longtable}}

\LT@warn La commande de génération des alertes

 3 \def\LT@warn{\PackageWarning{longtable}}

\LT@final@warn Si des longtables ne sont pas alignées, génère une alerte à la fin de la compilation,

\AtEndDocument.
 4 \def\LT@final@warn{%
 5 \AtEndDocument{%
 6  \LT@warn{Table \@width s have changed. Rerun LaTeX.\@gobbletwo}}%
 7 \global\let\LT@final@warn\relax}

9.2 Options

Les deux premir̀es options traitent le maniement des erreurs. Elles sont compatibles avec les options du package tracefnt

errorshow Affiche seulement les erreurs à l’écran. Les messages d’alertes apparaissent uniquement dans le fichier log.

 8 \DeclareOption{errorshow}{%
 9 \def\LT@warn{\PackageInfo{longtable}}}

pausing Dans une erreur, tous les messages d’alerte stoppent la compilation par TEX. Peut être utile pour le debuggage.

10 \DeclareOption{pausing}{%
11 \def\LT@warn#1{%
12  \LT@err{#1}{This is not really an error}}}

set final Les options suivantes présentent seulement une syntaxe alternative pour la décla-

ration de \setlongtables.
13 \DeclareOption{set}{}
14 \DeclareOption{final}{}
15 \ProcessOptions

9.3 Paramètres utilisateur

\LTleft \LTright Glu sur la gauche ou la droite de la table, \fill par défaut (i.e. centrée).

16 \newskip\LTleft       \LTleft=\fill
17 \newskip\LTright      \LTright=\fill

\LTpre \LTpost Glu avant et après longtable. Par défaut, \bigskip.

18 \newskip\LTpre        \LTpre=\bigskipamount
19 \newskip\LTpost       \LTpost=\bigskipamount

\LTchunksize Taille du pas (« chunk ») : le nombre de ligne donné par \halign, 20 par défaut.

20 \newcount\LTchunksize \LTchunksize=20

\c@LTchunksize Ajouté dans la V3.07 pour autoriser la syntaxe L^{A}TEX \setcounter{LTchunksize}{10}.

21 \let\c@LTchunksize\LTchunksize

\LTcapwidth Largeur de la \parbox contenant la légende, 4in par défaut.

22 \newdimen\LTcapwidth  \LTcapwidth=4in

9.4 Paramètres internes

\LT@head \LT@firsthead \LT@foot \LT@lastfoot Boîtes pour les tête et pied de table.
23 \newbox\LT@head
24 \newbox\LT@firsthead
25 \newbox\LT@foot
26 \newbox\LT@lastfoot

\LT@cols Compteur de numéro des colonnes.

27 \newcount\LT@cols

\LT@rows Compteur du pas (« chunksize »)

28 \newcount\LT@rows

\c@LT@tables Compteur de table, ajouté dans la V3.02. Les versions précédentes utilisaient seulement de compteur table de L^{A}TEX mais cela échouait si table était remis à zéro pendant la compilation ; par exemple, la classe report le remet à zéro dans chaque chapitre.

Cela a été modifié, dans la V3.04, par l’utilisation de \newcount\LT@tables. Les compteurs L^{A}TEX sont correctement préservés lorsque \includeonly est utilisé. Dans le reste du fichier, \LT@tables a été remplacé par \c@LT@tables sans autre commentaire supplémentaire.

29 \newcounter{LT@tables}

\c@LT@chunks Nous avons besoin de compter les pas d’une table depuis la Version 4.

30 \newcounter{LT@chunks}[LT@tables]

\c@table \fnum@table \tablename Si le compteur table n’est pas défini (par exemple dans le style letter), cette macro le définit (Ajouté dans la V3.06).

31 \ifx\c@table\undefined
32 \newcounter{table}
33 \def\fnum@table{\tablename~\thetable}
34 \fi
35 \ifx\tablename\undefined
36 \def\tablename{Table}
37 \fi

\LT@out Dans les styles standards, longtable utilise le fichier .aux pour enregistrer les largeurs de colonne. Avec letter.sty, le package utilise un fichier séparé .lta. (Ajouté dans la V3.06).

Inutile pour la nouvelle classe letter.

\ifx\startlabels\undefined
  \let\@auxout\@auxout
\else
  {\@input{\jobname.lta}}%
  \newwrite\@auxout
  \immediate\openout\@auxout=\jobname.lta
\fi

\LT@p@ftn Stockage temporaire du texte de la note de bas de page dans un colonne « p ».

38 \newtoks\LT@p@ftn

\LT@end@pen Poids (« penalty ») spécial pour la fin de la table. Réalisé comme ça pour épargner un compteur.

39 \mathchardef\LT@end@pen=30000

9.5 L’environnement longtable

\longtable Appelé par \begin{longtable}. Cette implémentation ne fonctionne pas dans un format à colonnes multiples. \par ajouté dans la V3.04.

40 \def\longtable{%
41 \par
42 \ifx\multicols\@undefined
43 \else
44  \ifnum\col@number>\@ne
45  \@twocolumntrue
46  \fi
47 \fi
48 \if@twocolumn
49  \LT@err{longtable not in 1-column mode}\@ehc
50 \fi
51 \begingroup

Vérifie la présence d’un argument optionnel.

52 \@ifnextchar[\LT@array{\LT@array[x]}}

\LT@array Commence l’ajustement de l’alignement. Basé sur \@array du noyau L^{A}TEX et sur

le package array

Depuis la Version 3.02, longtable utilise le compteur interne \c@LT@tables. Le compteur table de L^{A}TEX est encore incrémenté pour que \caption fonctionne correctement.

53 \def\LT@array[#1]#2{%
54 \refstepcounter{table}\stepcounter{LT@tables}%

Crée la justification (« glu ») autour de la table, si un argument optionnel est donné.

55 \if l#1%
56  \LTleft\z@ \LTright\fill
57 \else\if r#1%
58  \LTleft\fill \LTright\z@
59 \else\if c#1%
60  \LTleft\fill \LTright\fill
61 \fi\fi\fi

Fixe ces commandes internes pour longtable.

  \global\let\LT@mcw@rn\relax
62 \let\LT@mcol\multicolumn

Maintenant redéfinit \@tabarray, pour rétablir \hline et \multicolumn, pour que array et tabular encapsulés dans longtable (ou dans l’en-tête de page d’un longtable) donnent le résultat escompté. Les définitions originales sont ici sauvegardées pour que vous puissiez charger le package array avant ou après longtable.

63 \let\LT@@tabarray\@tabarray
64 \let\LT@@hl\hline
65 \def\@tabarray{%
66  \let\hline\LT@@hl
    \let\multicolumn\LT@mcol
67  \LT@@tabarray}%
68 \let\\\LT@tabularcr\let\tabularnewline\\%
69 \def\newpage{\noalign{\break}}%

Définitions plus ou moins standards, mais commencent d’abord un \noalign.

70 \def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LT@no@pgbk-}4}%
71 \def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LT@no@pgbk4}%
72 \let\hline\LT@hline \let\kill\LT@kill\let\caption\LT@caption
73 \@tempdima\ht\strutbox
74 \let\@endpbox\LT@endpbox

Commandes internes établies en accord avec celles de Lamport ou celles de Mittelbach.

75 \ifx\extrarowheight\@undefined

Initialise ces commandes comme dans tabular du noyau L^{A}TEX.

76  \let\@acol\@tabacol
77  \let\@classz\@tabclassz \let\@classiv\@tabclassiv
78  \def\@startpbox{\vtop\LT@startpbox}%
79  \let\@@startpbox\@startpbox
80  \let\@@endpbox\@endpbox
81  \let\LT@LL@FM@cr\@tabularcr
82 \else

Initialise ces commandes comme dans array. \d@llarremplacé par \d@llarbegin \d@llarend dans la V3.03 pour correspondre à array V2.0h. Nous n’avons pas besoin de fixer la valeur de \d@llarbegin et \d@llarend puisque le package array leur donne leurs valeurs correctes au premier niveau.

83  \advance\@tempdima\extrarowheight
84  \col@sep\tabcolsep
85  \let\@startpbox\LT@startpbox\let\LT@LL@FM@cr\@arraycr
86 \fi

La reste de cette macro est principalement basé sur le package array, mais devrait aussi fonctionner pour l’environnement tabular standard.

87 \setbox\@arstrutbox\hbox{\vrule
88  \@height \arraystretch \@tempdima
89  \@depth \arraystretch \dp \strutbox
90  \@width \z@}%
91 \let\@sharp##\let\protect\relax

Interpréte l’argument du préambule.

92 \begingroup
93  \@mkpream{#2}%

Nous avons besoin de renommer ici \@preamble puisque le système de F. M. utilise \global, et nous avons peut être besoin d’encapsuler \@mkpream, par exemple pour \multicolumn ou pour un array. Nous n’avons pas besoin de nous préoccuper des longtables encapsulées.

94  \xdef\LT@bchunk{%
95  \global\advance\c@LT@chunks\@ne
96  \global\LT@rows\z@\setbox\z@\vbox\bgroup

La ligne suivante a été ajoutée dans la v4.05. Pour que \penalties soit pris en compte aux limites des morceaux, il est nécessaire de se soucier de où et quand \lineskip est ajouté. La commande suivante ne fait rien en haut de la table, ni dans les pas d’en-tête, mais dans les morceaux du corps de la table, cela fixe \prevdepth (à 0pt, mais n’importe quelle valeur convient) pour que \lineskip soit ajoutée. La chose importante à noter est que la glu sera ajoutée après n’importe quelle donnée verticale provenant de \noalign.

97  \LT@setprevdepth
98  \tabskip\LTleft\halign to\hsize\bgroup
99  \tabskip\z@ \@arstrut \@preamble \tabskip\LTright \cr}%
100 \endgroup

Découvre combien nous avons de colonnes (stocké dans \LT@cols).

101 \expandafter\LT@nofcols\LT@bchunk&\LT@nofcols

Obtient les lignes sauvées à partir de \LT@i…\LT@ix (à partir du fichier.aux), ou insère une nouvelle ligne vide.

102 \LT@make@row

Quelques commandes internes supplémentaires pour longtable.

103 \m@th\let\par\@empty
104 \everycr{}\lineskip\z@\baselineskip\z@

Débute le premier morceau.

105 \LT@bchunk}

\LT@no@pgbk Peut simplifier le \@no@pgbk standard puisqu’il est seulement en vmode, mais nécessite alors de terminer \noalign.

106 \def\LT@no@pgbk#1[#2]{\penalty #1\@getpen{#2}\ifnum`{=0\fi}}

\LT@start Cette macro débute le procédé de placement de la table dans la page courante. Il n’est pas appelé jusqu’à ce qu’une commande \\ ou \endlongtable termine un morceau, puisque nous ne connaissons pas encore laquelle des quatre sections possibles d’en-tête ou de pied a été définie.

Elle commence par se redéfinir elle-même, de façon à ce que la table soit commencée une seule fois ! Dans la V3.04, elle était redéfinie en \relax, maintenant, elle utilise \endgraf pour forcer l’activation de saut de page.

107 \def\LT@start{%
108 \let\LT@start\endgraf
109 \endgraf\penalty\z@\vskip\LTpre

Commence une nouvelle page s’il n’y a pas assez de place pour l’en-tête et le pied de page et pour une ligne supplémentaire.

110 \dimen@\pagetotal
111 \advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
112 \advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
113 \advance\dimen@ \ht\LT@foot

À ce point, j’avais l’habitude d’ajouter \ht\@arstrutbox et \dp\@arstrutbox pour mesurer la taille d’une ligne. Cependant, cela peut échouer de façon spectaculaire pour une colonne p qui peut être beaucoup plus large. Les versions précédentes pouvaient finir par créer une table commençant par un pied de table, puis un saut de page puis un en-tête puis, enfin le « premier en-tête » ! Donc, maintenant, on mesure la première ligne de la table, précisément, en la séparant verticalement (\vsplitting) du premier morceau.

114 \dimen@ii\vfuzz
115 \vfuzz\maxdimen
116  \setbox\tw@\copy\z@
117  \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox
118  \setbox\tw@\vbox{\unvbox\tw@}%
119 \vfuzz\dimen@ii
120 \advance\dimen@ \ht
121  \ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi
122 \advance\dimen@\dp
123  \ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi
124 \advance\dimen@ -\pagegoal
125 \ifdim \dimen@>\z@\vfil\break\fi

Stockage de la hauteur de la page moins le pied de table dans \@colroom.

126  \global\@colroom\@colht

Si le pied n’est pas vide, réduction de façon homogène de \vsize et \@colroom.

127 \ifvoid\LT@foot\else
128  \advance\vsize-\ht\LT@foot
129  \global\advance\@colroom-\ht\LT@foot
130  \dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@
131  \maxdepth\z@
132 \fi

Place l’en-tête de table sur la page puis passe à le nouvelle routine de sortie.

133 \ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi
134 \output{\LT@output}}
\endlongtable Appelé par \end{longtable}.
135 \def\endlongtable{%

Ajoute essentiellement un \\ final. Mais comme nous connaissons le nombre réel de morceaux, nous pouvons enlever toutes les entrées se référant à une entrée maximale hors de la table (cela se produit seulement si la table a été raccourcie ou que la numérotation de table a disparu). Dans ce cas, nous devons, au moins, commencer par récupérer la nouvelle information correcte pour le dernier morceau de cette table, en enlevant la contrainte de largeur.

136 \crcr
137 \noalign{%
138  \let\LT@entry\LT@entry@chop
139  \xdef\LT@save@row{\LT@save@row}}%
140 \LT@echunk
141 \LT@start
142 \unvbox\z@
143 \LT@get@widths

Écrit la colonne modèle dans le fichier.aux. Depuis la V3.06, utilisation de fichier

.lta pour letter.sty.
144 \if@filesw
145  {\let\LT@entry\LT@entry@write\immediate\write\@auxout{%

Depuis la Version 3.02, longtable utilise le compteur interne \c@LT@tables plutôt que le compteur table de L^{A}TEX. Cette information semble totalement différente de celle de la version 3. Cependant, nous n’avons pas besoin de renommer la macro car le code le plus récent considèrera qu’il n’y a pas de colonne et donc effacera les anciennes données.

146  \gdef\expandafter\noexpand
147  \csname LT@\romannumeral\c@LT@tables\endcsname
148  {\LT@save@row}}}%
149 \fi

À ce point, émission d’un message d’alerte si une \multicolumn a été fixée en mode brouillon.

  \LT@mcw@rn

Si le dernier morceau a des largeurs différentes par rapport au premier, alerte de l’utilisateur. De plus déclenchement d’une alerte pour recompiler avec L^{A}TEX à la fin du document.

150 \ifx\LT@save@row\LT@@save@row
151 \else
152  \LT@warn{Column \@width s have changed\MessageBreak
153  in table \thetable}%
154  \LT@final@warn
155 \fi

Force one more go with the longtable output routine.

156 \endgraf\penalty -\LT@end@pen

Maintenant, oblige le groupe à revenir à une routine standard.

157 \endgroup

Remise à zéro de \@mparbottom pour que les marges de paragraphes soient proches de la fin de la table.^{6}

158 \global\@mparbottom\z@
159 \pagegoal\vsize
160 \endgraf\penalty\z@\addvspace\LTpost

Note de bas de page, comme cela est réalisé dans le package multicol.

161 \ifvoid\footins\else\insert\footins{}\fi}

9.6 Comptage des colonnes

Les colonnes sont comptées par l’inspection de \@preamble, plutôt que, simplement, par l’obtention de \@mkpream, pour incrémenter le compteur. De cette façon, le préambule est construit pour que le package soit compatible avec la plupart de ceux qui ajoutent une définition supplémentaire de colonne au standard L^{A}TEX.

La version 1 comptait les \@sharp pour calculer le nombre de colonnes, cela a été changé dans la version 2 puisque cela ne fonctionnait pas avec NFSS. Maintenant, comptage des & [lfonts.new (et maintenant la définition selon le Standard L^{A}TEX) définit \@tabclassz pour que \@sharp soit à l’intèrieur d’un groupe.]

\LT@nofcols Trouve le & suivant, puis regarde plus avant pour voir quel est le suivant.

162 \def\LT@nofcols#1&{%
163 \futurelet\@let@token\LT@n@fcols}

\LT@n@fcols Ajoute un, puis stoppe au niveau d’un \LT@nofcols ou cherche le & suivant. L’astuce \expandafter a été ajoutée et le nom de \@LT@nofcols a été modifié pour conserver la convention d’appellation, \LT@.

164 \def\LT@n@fcols{%
165 \advance\LT@cols\@ne
166 \ifx\@let@token\LT@nofcols
167  \expandafter\@gobble
168 \else
169  \expandafter\LT@nofcols
170 \fi}

6Cela peut ne pas être correct. Cependant, si c’est oublié, il y a un problème avec les marges de paragraphe, [par exemple, page 3 de la documentation en V. O., NdT]. Y a-t’il des gourous des routine de sortie dans la salle ?

9.7 Les commandes \\ et \kill

\LT@tabularcr La définition interne de \\. Dans la forme *, insère un \nobreak après le \cr (ou

\crcr) suivant.

Le traitement de la forme « étoile » a finalement été ajouté dans la v4.05. Durant les six ou sept dernières années, le commentaire de ce point disait

Cette définition accepte aussi \\* qui agit de le même façon que \\. tabular fait cela mais longtable devra probablement définir \\* pour prévenir les sauts de page.

{\ifnum0=`}\fi ajouté dans la version 3.01, requis si la première entrée est vide. En fait, c’est insuffisant, puisque avec le package array, un groupe {} peut être introduit en mode mathématique. Donc, utilise la modification suivante. Ajoutée dans la v3.14

171 \def\LT@tabularcr{%
172 \relax\iffalse{\fi\ifnum0=`}\fi
173 \@ifstar
174  {\def\crcr{\LT@crcr\noalign{\nobreak}}\let\cr\crcr
175  \LT@t@bularcr}%
176  {\LT@t@bularcr}}
\LT@crcr
177 \let\LT@crcr\crcr

\LT@setprevdepth Cela sera redéfini pour fixer \prevdepth au début d’un morceau.

178 \let\LT@setprevdepth\relax
\LT@t@bularcr
179 \def\LT@t@bularcr{%

Incrémente le compteur et insère le \\ de tabular ou termine le morceau. L’astuce \expandafter a été ajouté dans la version 3. Fixe \prevdepth au début d’un nouveau morceau. (C’est fait ici et pas dans le morceau en tête).

180 \global\advance\LT@rows\@ne
181 \ifnum\LT@rows=\LTchunksize
182  \gdef\LT@setprevdepth{%
183  \prevdepth\z@\global
184  \global\let\LT@setprevdepth\relax}%
185  \expandafter\LT@xtabularcr
186 \else
187  \ifnum0=`{}\fi
188  \expandafter\LT@LL@FM@cr
189 \fi}

\LT@xtabularcr Cela cherche juste un argument optionnel.

190 \def\LT@xtabularcr{%
191 \@ifnextchar[\LT@argtabularcr\LT@ntabularcr}

\LT@ntabularcr La version sans argument optionnel. Ajoutée dans la version 3.01. Modifiée dans la v3.14.

192 \def\LT@ntabularcr{%
193 \ifnum0=`{}\fi
194 \LT@echunk
195 \LT@start
196 \unvbox\z@
197 \LT@get@widths
198 \LT@bchunk}

\LT@argtabularcr La version avec un argument optionnel. \ifnum0=`{\fi} dans la version 3.01. Modifié dans la v3.14.

199 \def\LT@argtabularcr[#1]{%
200 \ifnum0=`{}\fi
201 \ifdim #1>\z@
202  \unskip\@xargarraycr{#1}%
203 \else
204  \@yargarraycr{#1}%
205 \fi

Ajoute la ligne modèle et termine \halign.

206 \LT@echunk
207 \LT@start
208 \unvbox\z@
209 \LT@get@widths
210 \LT@bchunk}

\LT@echunk Cela finit le morceau en cours et efface la ligne modèle.

211 \def\LT@echunk{%
212 \crcr\LT@save@row\cr\egroup
213 \global\setbox\@ne\lastbox

La ligne suivante a été ajoutée dans la v4.05. longtable dépend du paramètre \lineskip (qui est 0pt) pour fournir des points de saut entre chaque ligne pour que la table puisse être divisée en plusieurs pages.

Les versions précédentes laissaient le paramètre \lineskip à la fin de chaque morceau ajouté quand la ligne modèle est ajoutée. Il n’y avait pas de glu au début du morceau suivant puisque normalement TEX ne met pas de glu \lineskip en haut d’une boîte. Cela signifiait que les morceaux étaient parfaitement ajustés, cependant \noalign à la limite d’un morceau venait avant la première ligne du morceau suivant ou après l’interligne à la fin de ce morceau. C’est une mauvaise place, par exemple, cela signifie même que \penalty10000 n’interdit pas un saut puisque la glu \lineskip, dans l’item précédent de la liste, donne un point de saut autorisé. Donc, maintenant, on enlève la glu \lineskip qui était avant la ligne modèle et on introduit \LT@setprevdepth pour fixer \prevdepth au début du prochain morceau, pour s’assurer que la glu \lineskip est ajoutée plus tard.

214  \unskip
215 \egroup}

\LT@entry Nous donnons ici la définition élémentaire de \LT@entry, c’est à dire celle utilisée dans les modèles d’alignement. Il ajoute un \kern seulement si le maximum est imposé par un morceau différent.

Le test \ifhmode donne la première entrée quand nous ne voulons pas ajouter un &.

216 \def\LT@entry#1#2{%
217 \ifhmode\@firstofone{&}\fi\omit
218 \ifnum#1=\c@LT@chunks
219 \else
220  \kern#2\relax
221 \fi}

\LT@entry@chop Cette définition pour l’argument de \LT@save@row est utilisée pour mettre de côté tous ces maxima qui ne peuvent être vérifiés parce qu’ils apparaissent après la fin de la table. Cela peut se produire seulement si une table a été raccourcie (ou si l’ordre des lignes a été bousculé depuis la compilation précédente). Il est à noter que cela est prématuré : le dernier morceau est toujours à fixer et avec les limites tronquées.

222 \def\LT@entry@chop#1#2{%
223 \noexpand\LT@entry
224  {\ifnum#1>\c@LT@chunks
225  1}{0pt%
226  \else
227  #1}{#2%
228  \fi}}

\LT@entry@write Pour écrire une entrée dans le fichier aux, nous utilisons une définition, légèrement surprenante, qui a pour seul but d’éviter des lignes débordantes (qui pourraient dépasser les limites de TEX lors de la lecture du fichier aux ; vous aurez probablement besoin de quelques centaines de colonnes avant que cela ne se produise, mais…).

229 \def\LT@entry@write{%
230 \noexpand\LT@entry^^J%
231 \@spaces}

\LT@kill Cela termine le morceau courant comme ci-dessus, mais supprime deux lignes, la ligne modèle et la ligne tuée, avant de prendre en compte le morceau suivant. Depuis la V3.04, l’ancien morceau est « remis en boîte » au début de la boîte contenant le morceau suivant. Cela permet d’utiliser \kill dans les en-tête (de table) puisque cette commande doit être traitée dans une seule boîte.

232 \def\LT@kill{%
233 \LT@echunk
234 \LT@get@widths
235 \expandafter\LT@rebox\LT@bchunk}

\LT@rebox Renvoie l’ancien morceau (box0) au début du nouveau morceau, ce qui supprime la ligne tuée. Cette macro a été ajoutée dans la V3.04.

236 \def\LT@rebox#1\bgroup{%
237 #1\bgroup
238 \unvbox\z@
239 \unskip
240 \setbox\z@\lastbox}

9.8 La Ligne modèle

La ligne modèle est prise en compte par \LT@save@row.

\LT@blank@row \LT@build@blank Crée une ligne blanche si nous n’avons pas utililisé les informations du fichier .aux.

241 \def\LT@blank@row{%
242 \xdef\LT@save@row{\expandafter\LT@build@blank
243  \romannumeral\number\LT@cols 001 }}

Oups ! Qu’est-ce que c’est supposé être ? Un remplacement de la première tache de l’Appendice D du TEXbook. \romannumeral affecte à \LT@cols un m par unité suivi de i^{7}. La macro ci-dessous remplace donc les m par les entrées adéquates.

244 \def\LT@build@blank#1{%
245 \if#1m%
246  \noexpand\LT@entry{1}{0pt}%
247  \expandafter\LT@build@blank
248 \fi}

\LT@make@row Avant la version 4, par défaut on n’utilisait pas l’information du fichier .aux mais maintenant nous pouvons définir \LT@make@row pour que la commande utilise le fichier .aux, même pour les passes brouillon.

249 \def\LT@make@row{%
250 \global\expandafter\let\expandafter\LT@save@row
251  \csname LT@\romannumeral\c@LT@tables\endcsname
252 \ifx\LT@save@row\relax
253  \LT@blank@row

Là, c’est un cas légèrement difficile. Avant de décider de faire un modèle à partir du fichier .aux, nous vérifions que le nombre de champs est toujours le même. Si ce n’est pas le cas, soit le format de la table a changé, soit nous avons une table totalement mauvaise. Dans les deux cas, nous avons décidé de supprimer toutes informations accumulées et de redémarrer.

Le développement entre les!…! ci-dessous sera vide si le nombre de macros \LT@entry incluant les arguments dans \LT@save@row est égal à \LT@cols. S’il n’est pas vide, nous supprimons la ligne et nous repartons de zéro.

254 \else
255  {\let\LT@entry\or
256  \if!%
257  \ifcase\expandafter\expandafter\expandafter\LT@cols
258  \expandafter\@gobble\LT@save@row
259  \or
260  \else
261  \relax
262  \fi

263 !%

264  \else
265  \aftergroup\LT@blank@row
266  \fi}%

7NdT : si le compteur vaut 12, \number\LT@cols 001 vaut 12001, qui en chiffres romains donne mmmmmmmmmmmmi, soit un m par unité.

267 \fi}

\setlongtables Redéfinit la macro \LT@make@row pour utiliser l’information du fichier .aux, s’il

y a une ligne sauvegardée pour cette table avec le bon nombre de colonne.

Depuis la Version 3.02 longtable utilise le compteur interne \c@LT@tables au lieu du compteur table de L^{A}TEX . Le message d’alerte a été ajouté dans la V3.04, ainsi que le \global, pour éviter de faire déborder la pile.

Depuis la version 4.01, \setlongtables ne fait rien puisqu’il n’est plus nécessaire, mais est défini comme \relax au bénéfice des anciens documents.

268 \let\setlongtables\relax

\LT@get@widths C’est le cœur de longtable. S’il n’y a pas de tête et pied de table, cette macro, associée avec la commande \\ modifiée, pourrait tout à fait constituer une base pour un petit package simple pour les tables longues. Cette macro est trés inspirée de la macro \endvrulealign présentée en annexe D du TEXbook.

269 \def\LT@get@widths{%

\global ajouté par V3.04, pour éviter de faire déborder la pile.

Fait une boucle à travers la dernière ligne, supprimant la justification et sauvegardant les largeurs de boîte. Pour la V3.04, changement de la scratch box à 2 puisque la nouvelle commande \kill demande que \box0 soit conservé.

270 \setbox\tw@\hbox{%
271  \unhbox\@ne
272  \let\LT@old@row\LT@save@row
273  \global\let\LT@save@row\@empty
274  \count@\LT@cols
275  \loop
276  \unskip
277  \setbox\tw@\lastbox
278  \ifhbox\tw@
279  \LT@def@row
280  \advance\count@\m@ne
281  \repeat}%

Rappelle la largeur si nous sommes dans le premier morceau.

282 \ifx\LT@@save@row\@undefined
283  \let\LT@@save@row\LT@save@row
284 \fi}

\LT@def@row Ajoute une colonne à la ligne modèle. Nom changé (était \defLT@save@row) dans la Version 3, pour conserver la convention de dénommination \LT@.

285 \def\LT@def@row{%

Nous commençons par choisir les entrées respectives de nos anciennes lignes. Ces redéfinitions de \LT@entry sont limitées au groupe débuté en \LT@get@widths.

286 \let\LT@entry\or
287 \edef\@tempa{%
288  \ifcase\expandafter\count@\LT@old@row
289  \else
290  {1}{0pt}%
291  \fi}%

Maintenant, nous attachons la bonne définition devant \LT@save@row :

292 \let\LT@entry\relax
293 \xdef\LT@save@row{%
294  \LT@entry
295  \expandafter\LT@max@sel\@tempa
296  \LT@save@row}}

\LT@max@sel Comment sélectionner la bonne combinaison. Noter que nous donnons l’information de l’ancien maximum, seulement si la taille ne change dans aucune direction. Si la taille a augmenté, nous aurons, bien sûr, un nouveau maximum. Si la taille a diminué, l’ancien maximum (qui était explicitement imposé à cause de l’existence du morceau courant) est non valide, et nous commençons avec ce morceau comme étant la nouvelle taille. Noter que même en cas d’égalité, nous devons utiliser la construction \the\wd\tw@ au lieu de #2, parce que #2 pourrait être lu à partir du fichier, et donc il pourrait exister des versions \catcode 11 de p et t dans lesquelles nous voulons les remplacer par leur versions \catcode 12 correctes.

297 \def\LT@max@sel#1#2{%
298 {\ifdim#2=\wd\tw@
299  #1%
300 \else
301  \number\c@LT@chunks
302 \fi}%
303 {\the\wd\tw@}}

9.9 La commande \hline

\LT@hline \hline et \hline\hline produisent tous deux deux lignes, la seule différence étant la justification et les « penalties ». C’est pourquoi un saut de page au niveau d’une \hline produit une ligne sur les deux pages à la fois.^{8}. De plus, cette \hline est plus comparable à \cline{1-\LT@cols}. Les \hline de tabular devraient tracer des lignes de la largeur totale de la page.

304 \def\LT@hline{%
305 \noalign{\ifnum0=`}\fi
306  \penalty\@M
307  \futurelet\@let@token\LT@@hline}

\LT@@hline Ce code est basé sur celui de \cline. Deux copies de la ligne sont produites, comme décrit ci-dessus.

308 \def\LT@@hline{%
309 \ifx\@let@token\hline
310  \global\let\@gtempa\@gobble
311  \gdef\LT@sep{\penalty-\@medpenalty\vskip\doublerulesep}%
312 \else
313  \global\let\@gtempa\@empty
314  \gdef\LT@sep{\penalty-\@lowpenalty\vskip-\arrayrulewidth}%

8longtable a toujours réalisé cela, mais peut-être ce serait mieux si les hlines étaient omises au niveau du saut de page, puisque habituellement, les tête et pied de table mettent une hline ici, de toutes façns

315 \fi
316 \ifnum0=`{\fi}%
317 \multispan\LT@cols
318  \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
319 \noalign{\LT@sep}%
320 \multispan\LT@cols
321  \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
322 \noalign{\penalty\@M}%
323 \@gtempa}

9.10 Légendes

\LT@caption La légende est donnée par \multicolumn{\LT@cols}{c}{⟨une parbox avec la

légende de la table⟩}

324 \def\LT@caption{%
325 \noalign\bgroup
326  \@ifnextchar[{\egroup\LT@c@ption\@firstofone}\LT@capti@n}

\LT@c@ption Commande de légende (avec [argument optionnel]). \protect ajouté dans la version 3. \fnum@table ajouté dans la V3.05.

327 \def\LT@c@ption#1[#2]#3{%
328 \LT@makecaption#1\fnum@table{#3}%
329 \def\@tempa{#2}%
330 \ifx\@tempa\@empty\else
331  {\let\\\space
332  \addcontentsline{lot}{table}{\protect\numberline{\thetable}{#2}}}%
333 \fi}

\LT@capti@n Commande de légende (sans [argument optionnel])

334 \def\LT@capti@n{%
335 \@ifstar
336  {\egroup\LT@c@ption\@gobble[]}%
337  {\egroup\@xdblarg{\LT@c@ption\@firstofone}}}

\LT@makecaption Met la légende dans une boîte de largeur 0pt, pour que ça n’affecte jamais les largeurs de colonne. La légende comprend une \parbox de largeut \LTcapwidth.

338 \def\LT@makecaption#1#2#3{%
339 \LT@mcol\LT@cols c{\hbox to\z@{\hss\parbox[t]\LTcapwidth{%

Basée sur \@makecaption de la classe article, #1 est \@gobble dans la forme *, et

 \@firstofone autrement.
340  \sbox\@tempboxa{#1{#2: }#3}%
341  \ifdim\wd\@tempboxa>\hsize
342  #1{#2: }#3%
343  \else
344  \hbox to\hsize{\hfil\box\@tempboxa\hfil}%
345  \fi
346  \endgraf\vskip\baselineskip}%
347 \hss}}}

9.11 La routine de sortie

La méthode utilisée ici pour relier une routine de sortie, utilisée dans un but spécial, à la routine standard de L^{A}TEX provient en droite ligne du package multicol de F. Mittelbach

\LT@output De fait, ce n’est pas si terrible, FM ayant déjà dégagé le terrain.

348 \def\LT@output{%
349 \ifnum\outputpenalty <-\@Mi
350  \ifnum\outputpenalty > -\LT@end@pen

Si c’était un flottant ou une marge de paragraphe que nous réclamons.

351  \LT@err{floats and marginpars not allowed in a longtable}\@ehc
352  \else

Nous atteignons la fin de la table, au moins par défilement,

353  \setbox\z@\vbox{\unvbox\@cclv}%
354  \ifdim \ht\LT@lastfoot>\ht\LT@foot

Le dernier pied peut ne pas correspondre, donc : ^{9}

355  \dimen@\pagegoal
356  \advance\dimen@-\ht\LT@lastfoot
357  \ifdim\dimen@<\ht\z@
358  \setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}%
359  \@makecol
360  \@outputpage
361  \setbox\z@\vbox{\box\LT@head}%
Fin de \ifdim\dimen@<\ht\z@^{10}.
362  \fi
Fin de \ifdim \ht\LT@lastfoot > \ht\LT@foot.
363  \fi

Réinitialisation de \@colroom.

364  \global\@colroom\@colht
365  \global\vsize\@colht

Met la dernière page de la table dans la liste verticale principale.

366  \vbox
367  {\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}%
Fin de \ifnum\outputpenalty > -\LT@end@pen.
368  \fi
Fin de \outputpenalty > -\@Mi.
369 \else

9Une alternative pourraît être la suppression d’un petit bout du dernier morceau, de façon à ce que la dernière page n’ait pas de sections de tête et de pied, mais il est difficile de réaliser cela d’une manière robuste.

10NdT : La documentation originale dit ici « End of \ifdim\dimen@<\ht\@cclc » qui semble être une faute, puisque le \if effectivement fermé porte sur la hauteur de la boîte 0 et non pas 255.

Si nous n’avons pas atteint la fin de la table,

370  \setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}%
371  \@makecol
372  \@outputpage

Réinitialisation de \vsize.

373  \global\vsize\@colroom

Met la tête de table en haut de la page suivante.

374  \copy\LT@head
Fin de \ifnum\outputpenalty <-\@Mi.
375 \fi}

9.12 Commande pour les en-tête et pied de table

\LT@end@hd@ft Le cœur de \endhead et compagnie. Stocke le morceau courant dans la boîte spécifiée par #1. Produit une erreur si la table est déjà commencée. Puis, commence un nouveau morceau.

376 \def\LT@end@hd@ft#1{%
377 \LT@echunk

Changement de \relax en \endgraf pour V3.04, cf \LT@start.

378 \ifx\LT@start\endgraf
379  \LT@err
380  {Longtable head or foot not at start of table}%
381  {Increase LTchunksize}%
382 \fi
383 \setbox#1\box\z@
384 \LT@get@widths
385 \LT@bchunk}
\endfirsthead \endhead \endfoot \endlastfoot Appelle \LT@end@hd@ft avec la boîte adéquate.
386 \def\endfirsthead{\LT@end@hd@ft\LT@firsthead}
387 \def\endhead{\LT@end@hd@ft\LT@head}
388 \def\endfoot{\LT@end@hd@ft\LT@foot}
389 \def\endlastfoot{\LT@end@hd@ft\LT@lastfoot}

9.13 La commande \multicolumn

Les plus anciennes versions nécessitaient une forme brouillon spéciale de \multicolumn. Cela n’est plus nécessaire dans la version 4, et donc ces commandes ont été supprimées.

\LTmulticolumn
\LT@mcwarn

9.14 Notes de bas de page

La commande \footnote standard fonctionne dans une colonne c, mais nous avons besoin de modifier cette définition pour une colonne p, pour passer outre le niveau supplémentaire d’emboîtement. Ces macros sont basées sur le package array, mais devraient être OK pour l’environnement tabular standard.

\LT@startpbox Ajoute un code supplémentaire pour changer la définition de \@footnotetext.

390 \def\LT@startpbox#1{%
391 \bgroup
392  \let\@footnotetext\LT@p@ftntext
393  \setlength\hsize{#1}%
394  \@arrayparboxrestore
395  \vrule \@height \ht\@arstrutbox \@width \z@}

\LT@endpbox Après la fermeture de la parbox, développement de \LT@p@ftn qui exécutera une série de

 \footnotetext[⟨num⟩]{⟨note⟩}

Après avoir été enlevées de la parbox, elles peuvent aller à leur place à partir d’ici.

396 \def\LT@endpbox{%
397 \@finalstrut\@arstrutbox
398 \egroup
399 \the\LT@p@ftn
400 \global\LT@p@ftn{}%
401 \hfil}

\LT@p@ftntext Dans la colonne p, sauvegarde juste le texte de la note de bas de page dans registre à jeton.

402 \def\LT@p@ftntext#1{%
403 \edef\@tempa{\the\LT@p@ftn\noexpand\footnotetext[\the\c@footnote]}%
404 \global\LT@p@ftn\expandafter{\@tempa{#1}}}%

405 ⟨/package⟩

Historique des changements

v0.00

Général : ‘Version 0’ distribuée en longtab.sty utilisant toujours un seul morceau pour la table entière . . . . . . . . . . . . . . . . . . 1

v1.00

Général : Version initiale . . . . . . . 1 v2.00

Général : Prise en compte de NFSS et array.sty . . . . . . . . . . . . . . . 1 v3.00

Général : Nouvelle implémentation. Les tables peuvent maintenant commencer n’importe où dans la page. . . . . . . . . . . . . . . . . . 1

v3.02

Général : (Michel Goossens) Longtable échoue si le compteur de table est remis à zéro durant la compilation. Maintenant utilise un compteur interne, mais tout de même incrément de table

pour que \caption et \label

fonctionnent correctement. … 1 v3.03

Général : Ajout de \@ifundefined{reset@font}

pour que la documentation puisse être réalisée avec d’anciennes versions de L^{A}TEX. . . . . 1 Modification du traitement de \d@llar pour correspondre aux nouvelles versions de array.sty de Mittelbach(array.sty v2.0h) . 1

v3.04

Général : (Graham Gough) Écrire

\setlongtables provoque un

message d’alerte. . . . . . . . . . . . 1 (Jean-Pierre Drucbert) Longtable échoue quand est utilisée avec \includeonly. . . . . . . . . . 1 (Sebastian Rahtz) Longtable dépasse les capacités mémoire pour les tables extrèmement longues. Un autre bug introduit dans la V3. . . . . . . . . . . . . . . . 1 Correction du bug qui empèchaît le fonctionnement correct de \kill dans les en-têtes. … 1

v3.05

Général : (Juergen Peus) Les tables sont correctement codées quant aux légendes, maintenant la légende utilise \fnum@table, donc \tablename sera utilisé. . . . . . . 1

v3.06

Général : (Ingo Hoffmann) Longtable échoue avec la classe letter. Le compteur de table n’est pas défini, et de la même façon, le fichier .aux n’est pas utilisé. Cette version utilisera un fichier a .lta pour le style letter. . . . . . 1

v3.07

Général : Autorise la syntaxe L^{A}TEX \setcounter{LTchunksize}{10} . . . . . . . . . . . . . . . . . . . . . . . . 1

v3.08

Général : Inutile d’utiliser \vbox avec les minipages L^{A}TEX 2ε … 1 Mise à jour pour L^{A}TEX 2ε …. 1 v3.09

Général : Nouveau style ltxdoc … 1 v3.10

                                   \LT@endpbox : Utilise \@finalstrut

. . . . . . . . . . . . . . . . . . . . . . . 31 v3.11

Général : Ajout d’option de traitement, nouveaux styles de messages d’erreur et d’alerte . . . . . 1

v3.12

Général : Suppression du traitement spécial de la classe letter de la v3.06, inutile pour la nouvelle classe letter . . . . . . . . . . . 1

                                   \endlongtable : N’écrit pas si

\nofiles est activé. . . . . . . . 20 \setlongtables : Modification des messages d’alerte pour faire une ligne à l’écran. . . . . . . . . . . . 26

v3.13

                                   \LT@array : ajout \tabularnewline

. . . . . . . . . . . . . . . . . . . . . . . 17 v3.14

pausing : Changement de la chaîne

de LT à longtable . . . . . . . . . 14 \LT@array : (Mike Van Geest) renommage de \LT@mc en \LT@mcol pour autoriser 1100 tables . . . . . . . . . . . . . . . . . . 17

\LT@c@ption : Ajout d’un nouvel argument de contrôle . . . . . . 28

                                      Appel de \LT@makecaption et
                                       non de \LT@mkcaption . . . . . 28
                                   \LT@capti@n  :  Appel  de
                                       \LT@makecaptionx et non de
                                       \LT@mkcaption . . . . . . . . . . . 28
                                      Appel de \LT@makecaption avec
                                       \@gobble ou \@firstofone . . 28
                                   \LT@makecaption : renommée
                                       à partir de \LT@mkcaption,

et modifiée pour appeler

                                       \@makecaption . . . . . . . . . . . 28

Utilise le premier argument pour enlever le compteur de la forme * . . . . . . . . . . . . . . . . . . . . . 28

\LT@output : Réinitialisation de \vsize , corrige tools/1584 . . 30 Réinitialisation de \@colroom, corrige tools/1584 . . . . . . . . . 29 \LT@start : Définition de

\@colroom, pour tools/1584 . . 19 \LT@tabularcr : Meilleur résultat

avec \ifnum cf tools/1571 … 22 errorshow : Changement de la

chaîne de LT à longtable …. 14 v3.15

pausing : Utilisation d’un seul

hash, corrige latex/1557 …. 14 v3.16

\LT@start : Mesure de la première

ligne de la table . . . . . . . . . . 19 v3.17

\LT@array : Remise à zéro de

\hline et \multicolumn dans

les environnements tabular et array encapsulés, corrige tools/2068 . . . . . . . . . . . . . . 17

v4.00

Général : (DK) Nouvel algorithme pour aligner les morceaux de table séparés et codé par David Kastrup . . . . . . . . . . . . . . . . . 1

\c@LT@chunks : (DK) Ajout de

compteur de pas . . . . . . . . . . 15 \LT@array : (DK) Incrémentation

du compteur de pas . . . . . . . 18

\LT@build@blank : (DK) Macro

ajoutée . . . . . . . . . . . . . . . . . 25 \LT@def@row : (DK) Nouvelle im-

plémentation . . . . . . . . . . . . 26 \LT@entry : (DK) Ajout de macro 23

\LT@entry@chop : (DK) Ajout de

macro . . . . . . . . . . . . . . . . . 24 \LT@make@row : (DK) Nouvelle im-

plémentation . . . . . . . . . . . . 25 \LT@max@sel : (DK) macro ajoutée 27

v4.01

\endlongtable : (DPC) Alertes

multicolumn inutiles . . . . . . . 20 (DPC) utilisation de \noalign pour l’insérer dans \LT@entry@chop . . . . . . . . . . . . . . . . . . . . . . . 20

final : (DPC) make set and final

options no op . . . . . . . . . . . . 14 \LT@array : (DPC) message

d’alerte multicolumn inutile . . 17

\LT@build@blank : (DPC) Ne mé-
lange pas \multicolumn dans

les passes brouillon . . . . . . . . 25 \LT@entry : (DPC) Utilisation de l’astuce \ifhmode pour déterminer la première entrée . . . . . . 23

                                   \LT@make@row : (DPC) Rend ce

comportement automatique, ne

                                       néssitant pas \setlongtables 25

(DPC) Utilisation du test \if test au lieu de \ifx\@empty . . 25

\LT@max@sel : (DPC) Modifications

mineures . . . . . . . . . . . . . . . 27 \LT@mcwarn : (DPC) macro suppri-

mée . . . . . . . . . . . . . . . . . . . 30

                                   \LTmulticolumn : (DPC) macro

supprimée . . . . . . . . . . . . . . . 30

                                   \setlongtables : (DPC) make into

no op . . . . . . . . . . . . . . . . . . 26 v4.02

Général : (DPC/DK) Amélioration

de la documentation . . . . . . . . 1 v4.03

                                   \LT@endpbox : Utilise \hfil pour

tools/2120 . . . . . . . . . . . . . . 31 v4.04

\endlongtable : Utilisation de

                                       \LT@final@warn . . . . . . . . . . 20

\LT@final@warn : Ajout de macro 14 v4.05

                                   \LT@array : Ajout de \LT@setprevdepth

. . . . . . . . . . . . . . . . . . . . . . . 18

                                      Ajout de \nopagebreak et

\pagebreak . . . . . . . . . . . . . 17 \LT@crcr : Macro ajoutée . . . . . 22

                                   \LT@echunk : \unskip ajouté pour

prendre en compte les sauts de page . . . . . . . . . . . . . . . . . . . 23 \LT@no@pgbk : Ajout d’une macro 19

                                   \LT@setprevdepth : Macro ajoutée 22

\LT@tabularcr : Code ré-organisé pour le traitement de la forme *. . . . . . . . . . . . . . . . . . . . . . 22

v4.06

Général : (DK) nouvelle adresse e-

mail . . . . . . . . . . . . . . . . . . . . 1 v4.07

\LT@entry@write : Évite l’utilisa-

tion de percent. tools/2631 . . 24 v4.08

\LT@array : Placement plus précoce de la définition de \@endpbox et définition de \@@endpbox et

\@@startpbox pour le mode

non-array. tools/2736 . . . . . . 17 v4.09

\LT@startpbox  :  Utilise

\setlength pour que les extensions de calcul soient applicables. tools/2793 . . . . . . . . . 31