Le premier argument de tabular, une spécification de colonnes comme {lcr}, n’est pas seulement une liste d’alignements. C’est un petit langage : en plus du nombre de colonnes et de leur alignement, on peut y demander à LaTeX d’insérer une déclaration avant ou après chaque cellule, de remplacer l’espace entre colonnes, ou de répéter un groupe de colonnes. La plupart de ces possibilités ne sont pas dans tabular seul ; elles sont ajoutées par le package array. En partant de l, c, r et p{width}, cette page parcourt m{width} et b{width}, >{…} et <{…}, @{…} et !{…}, puis *{n}{…}.
Le mini-langage des colonnes
Les quatre bases ont été vues dans une autre page. l, c et r alignent à gauche, au centre et à droite, avec une largeur de colonne égale au contenu naturel, sans repli. Seul p{width} est composé comme une boîte de paragraphe de largeur donnée qui se replie lorsque le contenu la dépasse. Dans les termes du package array, p{width} équivaut à \parbox[t]{width} : un paragraphe aligné en haut. Cette valeur par défaut « haut » sert de contraste avec les deux variantes suivantes.
La plupart des notations introduites à partir d’ici — m/b, >/<, @/!, * — ne deviennent disponibles qu’après \usepackage{array} dans le préambule. array est fourni avec TeX Live et MiKTeX, et beaucoup de packages de tableaux (tabularx, booktabs, etc.) le chargent en interne ; il est donc souvent déjà actif. Même ainsi, le charger explicitement est plus sûr.
Colonnes de paragraphe — p, m, b
Il existe trois sortes de colonnes de paragraphe repliables, qui ne diffèrent que par la position verticale de la cellule. Selon la définition du manuel array, p{width} est \parbox[t], donc aligné en haut ; m{width} centre son contenu verticalement dans la ligne ; et b{width} est \parbox[b], donc aligné en bas. m et b sont ajoutés par le package array ; un tabular simple ne les possède pas.
L’intérêt apparaît lorsqu’une ligne mélange une cellule haute, par exemple une colonne p repliée sur plusieurs lignes ou une grande image, avec des cellules d’une seule ligne. Avec le p par défaut, aligné en haut, la cellule courte voisine colle au haut de la ligne et ne s’aligne pas avec le milieu de la cellule haute. Avec m{width}, le contenu de cette colonne se place au centre vertical de la ligne et s’aligne naturellement avec une voisine d’une ligne. C’est pratique pour les cellules contenant une image ou pour les tableaux qui associent un libellé à une longue description.
\usepackage{array}
% ...
\begin{tabular}{ p{3cm} m{3cm} b{3cm} }
\hline
上端揃え (p) & 縦中央 (m) & 下端揃え (b) \\
この列は parbox[t]。 & この列は行の上下中央に。 & この列は parbox[b]。 \\
\hline
\end{tabular}À largeur et texte identiques, p, m et b changent la position verticale de chaque cellule. Dans les trois cas, notez qu’à l’intérieur d’une colonne de paragraphe, \parindent (retrait de paragraphe) vaut 0 par défaut ; on peut le rétablir avec, par exemple, >{\setlength{\parindent}{1em}}.
| Spécificateur | Position verticale | parbox équivalente | Fourni par |
|---|---|---|---|
p{wd} | Haut | \parbox[t]{wd} | Standard |
m{wd} | Milieu | centré sur la ligne | array |
b{wd} | Bas | \parbox[b]{wd} | array |
Insérer autour des cellules — >{…} et <{…}
Le cœur du package array est >{decl} et <{decl}. >{decl} insère decl juste avant le contenu de chaque cellule de cette colonne ; <{decl} l’insère juste après. Par exemple, >{\bfseries}l rend grasse chaque cellule d’une colonne alignée à gauche sans écrire \bfseries dans chacune. >{\itshape}c donne de l’italique centré, >{\color{red}}r du rouge aligné à droite, et ainsi de suite.
On peut aussi placer des déclarations d’alignement dans >{…}. Les colonnes de paragraphe (p, m, b) sont justifiées par défaut, mais >{\raggedright}p{4cm} donne une colonne alignée à gauche, avec bord droit irrégulier, >{\centering} une colonne centrée, et >{\raggedleft} une colonne alignée à droite. Cela répond au besoin précis de « replier, mais ne pas justifier ».
Il existe toutefois un piège sérieux. Les trois commandes \raggedright, \raggedleft et \centering redéfinissent en interne le terminateur de ligne \\. Si une colonne qui les utilise dans >{…} est la dernière colonne du tableau, \\ cesse de fonctionner comme fin de ligne, ce qui provoque erreurs ou sortie cassée. La solution consiste à ajouter \arraybackslash, fourni par array, à la fin de la déclaration : >{\raggedright\arraybackslash}p{4cm} rétablit \\ comme saut de ligne. Même règle pour \centering et \raggedleft.
Un autre procédé classique consiste à mettre toute une colonne en mode mathématique. Avec >{$}c<{$}, chaque cellule est encadrée par $ avant et après, si bien que toute la colonne est composée en mathématiques en ligne. Plus besoin d’écrire $…$ dans chaque cellule riche en nombres ou symboles. À l’inverse, dans un environnement array, dont les cellules sont déjà en mode mathématique, >{$}…<{$} fait s’annuler les deux $ et place cette seule colonne en mode texte.
Attention : ce qui se place dans >{…} et <{…} doit être une déclaration. Les formes qui ne prennent pas d’argument ensuite, comme >{\bfseries} ou >{\itshape}, conviennent ; en revanche, il ne faut pas terminer par une commande qui prend un argument. Par exemple, >{\textbf} essaiera de lire le contenu de la cellule comme argument et se comportera mal ; pour le gras, utilisez la forme déclarative \bfseries. Le manuel array avertit que >{\textbf} ne rendrait ni toute la colonne grasse, ni même le premier caractère.
À la frontière des colonnes — @{…} et !{…}
Entre deux colonnes, LaTeX insère par défaut un espace \tabcolsep (6 pt de chaque côté par défaut, donc le double au total). Placé à cet endroit de la spécification, @{decl} supprime l’espace inter-colonnes et insère decl à la place ; selon le manuel array, il « suppresses inter-column space and inserts decl. instead ».
Deux usages principaux. D’abord, réduire le blanc extérieur du tableau : placer @{} (déclaration vide) aux deux extrémités de la spécification supprime le \tabcolsep à gauche de la première colonne et à droite de la dernière, de sorte que le tableau s’aligne exactement sur la marge gauche du texte ; c’est un idiome fréquent avec booktabs. Ensuite, insérer un séparateur : pour aligner des nombres sur le décimal, séparez-les en une colonne de partie entière et une colonne de partie fractionnaire, puis placez @{.} entre les deux ; les points s’alignent à position fixe, donnant un alignement décimal.
Le pendant de @{…} est !{decl}. Il peut être écrit là où irait un filet vertical | et insère un decl arbitraire à la place du filet. La différence décisive avec @{…} est que !{…} ne supprime pas l’espace inter-colonnes normal. Il convient donc aux cas comme « tracer une ligne pointillée entre colonnes tout en gardant le blanc », par exemple en plaçant une commande de filet pointillé du package arydshln dans !{…}.
Au passage, charger array modifie aussi légèrement le comportement du filet vertical | : l’écart entre colonnes s’élargit de l’épaisseur du filet. Dans LaTeX standard, le filet se place dans l’espace existant et l’écart ne grandit pas. Cela dit, les filets verticaux eux-mêmes sont à éviter dans les tableaux professionnels ; ce point est réservé à « filets et tableaux de qualité publication ».
Répéter des colonnes — *{n}{…}
Lorsque de nombreuses colonnes identiques se suivent, *{count}{spec} replie la répétition. Selon le manuel array, cela équivaut à « count copies de spec ». Pour six colonnes centrées, écrivez *{6}{c} au lieu de cccccc. L’unité répétée peut contenir plusieurs spécificateurs : *{3}{|c}| se développe en |c|c|c|. C’est particulièrement utile pour répéter une longue spécification contenant >{…} ou @{…} ; par exemple, *{4}{>{$}c<{$}} construit quatre colonnes mathématiques centrées d’un coup.
Un exemple combinant plusieurs outils
Enfin, voici une spécification de colonnes qui concentre les outils précédents. La colonne 1 est une colonne d’étiquettes en gras (>{\bfseries}l) ; la colonne 2 est une colonne de paragraphe repliable alignée à gauche (>{\raggedright\arraybackslash}p{5cm} — pas strictement nécessaire ici puisqu’elle n’est pas la dernière, mais \arraybackslash est ajouté par habitude) ; les colonnes 3 et 4 sont des colonnes mathématiques centrées construites ensemble avec *{2}{…} ; et le blanc extérieur est supprimé par @{} aux deux extrémités.
\usepackage{array}
% ...
\begin{tabular}{@{} >{\bfseries}l >{\raggedright\arraybackslash}p{5cm} *{2}{c} @{}}
\hline
記号 & 意味 & 値 & 単位 \\
\hline
$c$ & 真空中の光速。物理定数のひとつ。 & $2.998\times10^{8}$ & m/s \\
$g$ & 標準重力加速度。地表付近での近似値。 & $9.807$ & m/s$^2$ \\
\hline
\end{tabular}Le résultat : la colonne des symboles est uniformément en gras, la colonne de signification se replie à gauche sur 5cm, les deux colonnes de valeurs sont centrées, et tout le tableau s’aligne sur le bord gauche du texte sans blanc extérieur. Le point fort du langage des colonnes est de pouvoir combiner plusieurs mécanismes dans une seule spécification, mais cela devient vite difficile à lire. Pour une combinaison fréquente, donnez-lui un nom avec \newcolumntype{yourletter}{…} comme type de colonne personnalisé, puis réutilisez-la brièvement, par exemple {C C C} ; c’est une fonction du package array.
Pour aligner des nombres sur le séparateur décimal, le choix moderne et fiable est d’ailleurs la colonne S du package siunitx, plutôt que le @{.} montré ici. La colonne S analyse chaque nombre et aligne correctement partie entière, séparateur décimal, partie fractionnaire, exposant et même incertitudes, tout en réglant groupements de chiffres et chiffres significatifs. À consulter avec la page « tableaux larges et largeur automatique ».