Filets

Il existe trois manières de tracer les filets d’un tableau. Les commandes intégrées de LaTeX, \hline / \cline, avec le spécificateur de colonne | ; le package booktabs (\toprule, \midrule, \bottomrule) pour des tableaux professionnels ; et hhline pour contrôler finement les doubles filets et leur croisement avec les filets verticaux. Les filets standard sont faciles à utiliser, mais trop de filets rendent le tableau difficile à lire. Cette page parcourt ces trois niveaux et montre pourquoi booktabs est le choix recommandé par défaut.

Filets standard — \hline, \cline, |

Le filet horizontal fourni par LaTeX de base est \hline. Placé après le \\ d’une ligne, ou tout en haut ou tout en bas du tableau, il trace un filet simple sur toute la largeur. Deux à la suite, \hline\hline, donnent un double filet horizontal séparé par \doublerulesep. Le \\ après la dernière ligne peut normalement être omis, mais pour tracer un \hline sous cette dernière ligne il faut d’abord la fermer avec \\.

Pour tracer une ligne sur certaines colonnes seulement au milieu du tableau, utilisez \cline{i-j} : le filet ne couvre que les colonnes i à j, donc \cline{2-3} trace seulement sous les colonnes 2 et 3. Pour plusieurs intervalles disjoints, juxtaposez-les, par exemple \cline{1-1}\cline{3-4}. Les filets verticaux se définissent non pas dans le corps, mais dans la spécification des colonnes : insérer | dans la spécification, comme {|l|c|r|}, place à cet endroit une ligne verticale sur toute la hauteur du tableau ; || donne une double ligne verticale. L’épaisseur de ces lignes |, \hline et \vline est la longueur \arrayrulewidth (par défaut 0.4pt), et l’écart entre lignes doubles est \doublerulesep.

latex
\begin{tabular}{|l|c|r|}
  \hline
  項目 & 個数 & 価格 \\
  \hline\hline
  りんご & 3 & 380 \\
  \cline{2-3}
  みかん & 12 & 120 \\
  \hline
\end{tabular}

Cet exemple encadre chaque colonne avec |, place un double filet sous l’en-tête avec \hline\hline, et trace un filet partiel au milieu avec \cline{2-3} (colonnes 2 et 3 seulement). Il fait le tour des filets standard, mais il est précisément un exemple de surcharge de filets à éviter.

La raison est que trop de filets nuit à la lisibilité. Dans la tradition typographique, un filet n’est pas une cage autour des données, mais un moyen discret de marquer une division logique de l’information. Les filets verticaux, en particulier, créent des murs visuels entre les colonnes qui gênent le parcours de l’œil, et les doubles filets paraissent inutilement lourds. Simon Fear, auteur du package booktabs présenté ensuite, écrit que ce style de tableau « s’est établi au fil de siècles d’expérience et ne devrait être modifié qu’en circonstances extraordinaires », et recommande des tableaux sobres, uniquement à filets horizontaux, sans filets verticaux ni doubles filets.

booktabs — tableaux de qualité publication

booktabs, de Simon Fear, est un paquet qui permet de composer facilement des tableaux « tels qu’ils devraient apparaître dans les livres et revues scientifiques publiés ». On le charge par \usepackage{booktabs} dans le préambule. Ce qui le distingue d’un simple \hline, c’est qu’il différencie les filets par leur épaisseur et insère automatiquement un espace approprié au-dessus et au-dessous de chaque filet. Le résultat est un tableau raffiné dont la structure se lit clairement sans encadrement.

Trois commandes sont centrales : \toprule tout en haut du tableau, \midrule entre l’en-tête et le corps, et \bottomrule tout en bas. \toprule et \bottomrule sont plus épais (par défaut \heavyrulewidth = 0.08em) et \midrule plus fin (\lightrulewidth = 0.05em) ; cette différence rend immédiatement visibles les bords extérieurs et la séparation interne. Chacune accepte une largeur optionnelle entre crochets (par ex. \toprule[1pt]) et, comme \hline, se place après le \\ d’une ligne, sauf \toprule, qui vient juste après \begin{tabular}{...}.

latex
\begin{tabular}{@{}llr@{}}
  \toprule
  \multicolumn{2}{c}{品目} \\
  \cmidrule(lr){1-2}
  種類 & 状態 & 価格 \\
  \midrule
  りんご & 蜜入り & 380 \\
  みかん & 訳あり & 120 \\
  \addlinespace
  合計 & & 500 \\
  \bottomrule
\end{tabular}

Cet exemple rassemble les éléments de booktabs. Un filet sur certaines colonnes seulement est \cmidrule{a-b}, l’équivalent booktabs de \cline. Comme \cmidrule occupe toute la largeur des colonnes et risque de toucher les filets voisins, on ajoute normalement un rognage. Entre parenthèses, (l), (r) ou (lr) rognent la gauche, la droite ou les deux extrémités de \cmidrulekern (par défaut 0.5em) ; (lr){1-2} trace donc un filet sur les colonnes 1–2 avec les deux extrémités rognées. La quantité peut aussi être fixée explicitement, comme (r{.75em}). La syntaxe complète est \cmidrule[width](trim){a-b}.

Pour ajouter un peu d’espace entre deux lignes, par exemple avant une ligne de total, placez \addlinespace après le \\. Par défaut, il insère \defaultaddspace (0.5em), et on peut préciser la quantité avec \addlinespace[1ex]. L’intention est plus claire qu’en étirant une ligne avec \\[...], et placé autour d’un filet il contrôle exactement l’écart. Si vous devez vraiment fixer à la main l’épaisseur et les espaces au-dessus et au-dessous, utilisez \specialrule{width}{above}{below} (trois arguments obligatoires). C’est une commande de cas particulier ; les trois \toprule / \midrule / \bottomrule suffisent normalement.

La philosophie de booktabs est donnée d’emblée en deux règles simples : « ne jamais utiliser de filets verticaux » et « ne jamais utiliser de doubles filets ». Fear écrit qu’elles « peuvent sembler extrêmes, mais je n’ai jamais trouvé de bon argument pour les enfreindre ». Si deux moitiés d’un tableau diffèrent assez pour nécessiter une séparation, il faut faire deux tableaux plutôt qu’un filet vertical ; au-dessus d’une ligne de total, un seul \midrule suffit. Par conception, les filets de booktabs sont faits pour ne pas se connecter au | de la spécification des colonnes : c’est une fonctionnalité destinée à décourager les filets verticaux.

Autre règle : ne mélangez pas \hline avec les filets de booktabs. Fear indique clairement qu’ils « ne sont pas garantis pour fonctionner avec \hline ou \cline… je ne vois aucune raison de vouloir les mélanger ». Ce n’est que dans le cas exceptionnel où l’on empile deux \cmidrule à la même hauteur pour un double filet partiel qu’on insère \morecmidrules entre elles (\cmidrule{1-2}\morecmidrules\cmidrule{1-2}). Comme les doubles filets sont eux-mêmes déconseillés, ce n’est pas non plus un usage courant.

CommandeRôleÉpaisseur / espace par défaut
\topruleFilet en haut du tableauÉpaisseur \heavyrulewidth = 0.08em
\midruleSépare l’en-tête du corpsÉpaisseur \lightrulewidth = 0.05em
\bottomruleFilet en bas du tableauÉpaisseur \heavyrulewidth = 0.08em
\cmidrule(lr){a-b}Filet partiel sur les colonnes a-bÉpaisseur \cmidrulewidth = 0.03em, rognage \cmidrulekern = 0.5em
\addlinespaceEspace supplémentaire entre lignes\defaultaddspace = 0.5em
\specialruleFilet entièrement spécifiéTrois arguments obligatoires

hhline — contrôler le croisement des filets

hhline (par David Carlisle, inclus dans le bundle tools de LaTeX) trace les mêmes filets horizontaux simples ou doubles que \hline, mais permet de contrôler comment ils croisent les filets verticaux. Chargez-le avec \usepackage{hhline}. Avec un simple double filet \hline\hline, vous ne pouvez pas choisir si un filet vertical s’interrompt au croisement ou le traverse ; \hhline permet de le préciser caractère par caractère. Il est utile lorsque vous devez vraiment combiner des filets doubles ou partiels avec des filets verticaux, dans des cas que les commandes intégrées gèrent mal.

L’argument de \hhline{…} est une liste de jetons qui ressemble à une spécification de colonnes tabular. Les caractères signifient : = un double filet horizontal de la largeur d’une colonne, - un filet horizontal simple, ~ (tilde) une colonne sans filet. Pour les verticales : | est un filet vertical qui traverse le filet double ou simple, : est un filet vertical interrompu par le filet double, et # est un segment de filet double entre deux filets verticaux. Il existe aussi t (moitié supérieure d’un segment double) et b (moitié inférieure) pour construire les coins d’un double filet, entre deux filets verticaux (|t: est le coin supérieur gauche, :b| le coin inférieur droit). La même forme de répétition *{n}{…} que dans les spécifications de colonnes est disponible.

Notez que si vous spécifiez un double filet vertical (|| ou ::), les filets horizontaux de \hhline s’interrompent à cet endroit. Pour faire passer un filet horizontal sans interruption, utilisez # ou omettez entièrement les spécificateurs de filets verticaux. Voici l’exemple de la documentation officielle, qui utilise la plupart des fonctionnalités.

latex
\begin{tabular}{||cc||c|c||}
  \hhline{|t:==:t:==:t|}
  a & b & c & d \\
  \hhline{|:==:|~|~||}
  1 & 2 & 3 & 4 \\
  \hhline{#==#~|=#}
  i & j & k & l \\
  \hhline{||--||--||}
  w & x & y & z \\
  \hhline{|b:==:b:==:b|}
\end{tabular}

Dans ce tableau, la ligne supérieure |t:==:t:==:t| construit les moitiés supérieures des doubles filets et les coins des filets verticaux, tandis que la ligne inférieure |b:==:b:==:b| construit les moitiés inférieures, afin que le cadre à double filet rejoigne proprement les filets verticaux. Les lignes du milieu mélangent ~ (pas de filet) et # (segment de double filet entre verticales), en variant ligne par ligne les endroits où les filets horizontaux s’interrompent ou traversent les verticales. Reproduire des croisements aussi complexes avec de simples \hline / \cline est presque impossible ; hhline sert précisément à cela : régler les détails aux jonctions entre filets doubles et verticaux.

Un détail technique. Un \hline est un unique \hrule de TeX, tandis qu’un filet \hhline est construit à partir de nombreux petits segments. Ils sont placés correctement dans le DVI, mais certains visualiseurs ou pilotes peuvent ne pas aligner exactement les jonctions. Si cela vous gêne, la documentation suggère d’essayer un autre pilote ou d’augmenter légèrement \arrayrulewidth pour atténuer l’effet.

Que choisir

La conclusion est assez simple : faites de booktabs le choix par défaut pour les tableaux ordinaires. Les trois filets \toprule / \midrule / \bottomrule, plus un \cmidrule si nécessaire, suffisent à produire les tableaux sobres et lisibles que l’on voit dans les revues. En suivant la règle « pas de filets verticaux, pas de doubles filets », la question des filets cesse presque de se poser.

  • booktabs — le premier choix pour presque tous les tableaux : filets horizontaux seulement, épaisseurs et espacements réglés, qualité publication.
  • \hline / \cline / | standard — pratique car aucun package n’est nécessaire ; utile pour des tableaux en grille ou des brouillons rapides. Attention à ne pas surcharger.
  • hhline — réservé au cas particulier où il faut contrôler finement le croisement des doubles filets et des verticales. Pas pour l’usage courant.

Avant les filets eux-mêmes, l’alignement et la séparation des colonnes définissent l’ossature d’un tableau. Pour les bases de la spécification des colonnes, consultez « L’environnement tabular » ; pour \multicolumn, les largeurs et les raffinements associés, consultez « Spécificateurs de colonnes en détail ».