Dans les livres scolaires, les tableaux sont souvent utilisés pour récapituler des résultats d'une recherche. Il est donc nécessaire de maîtriser leur emploi afin de produire des documents de bonne qualité.

La gestion des tableaux n'est cependant pas très intuitive. Les tableaux de base ne sont pas très astreignants, leur logique est similaire au HTML (cf. Programmation HTML/Tableaux), mais vous remarquerez assez rapidement qu'un tableau un peu plus élaboré demande plus de temps pour sa construction.

Avant de continuer, veillez à bien avoir assimilé les tableaux de base présentés dans la section Premiers pas : faire des tableaux.

L'environnement tabular

modifier

Rappelons quelques concepts déjà explicités.

Environnement
Un environnement est une déclaration particulière destinée à la composition du texte dans un style spécifique. Tous les environnements commencent et finissent de la même façon :
\begin{nom-environnement}
...
...
\end{nom-environnement}
Environnement tabular
L'environnement tabular est un autre type d'environnement, conçu pour disposer vos données dans des tableaux. Des paramètres sont requis après la déclaration de l'environnement pour décrire l'alignement de chaque colonne. Le nombre de colonnes n'a pas besoin d'être indiqué puisqu'il est déduit du nombre de paramètres fournis. Il est également possible d'ajouter des traits verticaux entre les colonnes. Les symboles suivants sont disponibles pour décrire les colonnes du tableau :
  • l : colonne alignée à gauche
  • c : colonne centrée
  • r : colonne alignée à droite
  • p{largeur} : colonne de largeur fixée, justifiée et avec alinéa ; le texte est positionné en haut de la cellule
  • m{largeur} : comme précédemment, mais le texte est centré verticalement
  • b{largeur} comme précédemment, mais le texte est positionné en bas de la cellule
Notez bien que l'alignement vertical se fait par rapport aux lignes de texte : première ligne pour p, dernière ligne pour b, centre du paragraphe pour m. Cela peut poser problème lorsqu'une case contient une image : l'alignement ne se fait pas par rapport à la hauteur de l'image mais pas rapport à la ligne sur laquelle elle est posée, donc par rapport à la ligne unique posée au fond de la cellule. On peut contourner ce problème avec un \raisebox.
  les paramètres m et b nécessitent l'utilisation de l'extension array
  • | : filet vertical
  • || : double filet vertical
Une fois dans l'environnement,
  • & : séparateur de colonne
  • \\ : débute une nouvelle ligne
  • \hline : filet horizontal

Remarquez que les espaces insérées entre ces commandes sont purement inutiles, mais elles facilitent la lecture.

Tableau de base

modifier

Cet exemple montre comment créer un simple tableau en LaTeX. C'est un tableau trois par trois, mais sans aucun filet.

\begin{tabular}{ l c r }
   1 & 2 & 3 \\
   4 & 5 & 6 \\
   7 & 8 & 9 \\
 \end{tabular}

 

Modifions celui-ci en y ajoutant quelques filets verticaux, simples ou doubles :

\begin{tabular}{ l | c || r | }
   1 & 2 & 3 \\
   4 & 5 & 6 \\
   7 & 8 & 9 \\
 \end{tabular}

 

Pour ajouter des filets horizontaux tout en haut et tout en bas du tableau :

\begin{tabular}{ l | c || r | }
 \hline			
   1 & 2 & 3 \\
   4 & 5 & 6 \\
   7 & 8 & 9 \\
 \hline  
 \end{tabular}

 

Et finalement, pour ajouter des filets centrés entre toutes les lignes. Remarquez l'utilisation de l'environnement center pour centrer le tableau dans la page. On peut aussi obtenir un filet double horizontal en doublant la commande \hline (non représenté ici).

\begin{center}
   \begin{tabular}{ l | c || r | }
     \hline
     1 & 2 & 3 \\ \hline
     4 & 5 & 6 \\ \hline
     7 & 8 & 9 \\
     \hline
   \end{tabular}
 \end{center}

 

Texte dans un tableau

modifier

Les algorithmes de LaTeX pour mettre en forme les tableaux ont quelques imperfections. L'une d'entre elles est qu'il ne mettra pas automatiquement le texte sur plusieurs lignes dans les cellules, même si celui-ci déborde de la largeur de la page. Pour les colonnes qui contiendront une certaine quantité de texte, il est recommandé d'employer l'attribut p et d'indiquer la largeur désirée de la colonne (bien que cela puisse obliger à effectuer quelques ajustements avant d'obtenir le résultat escompté).

Avant de procéder, nous devons présenter le système de mesure que LaTeX emploie. Il est très souple puisque vous pouvez choisir parmi toute une variété d'unités de longueur :

  • pt : point anglo-saxon, 1/72 de pouce ;
  • mm : millimètre ;
  • cm : centimètre ;
  • in : pouce (2,54 cm) ;
  • ex : hauteur d'x (parfois appelé à tort hauteur d'œil), hauteur d'une lettre sans hampe ni jambage dans la police courante ;
  • em : cadratin, grossièrement la largeur d'un M (capitale) dans la police courante.

Il existe des commandes connues sous le nom de commandes de longueur, qui jouent le rôle de variable, qui n'ont pas de valeurs fixes car elles dépendent de la configuration de la classe et/ou du préambule courants du document. Les plus utiles sont :

  • \parindent : la taille de l'indentation ;
  • \baselineskip : distance verticale entre les lignes ;
  • \parskip : espace supplémentaire entre les paragraphes ;
  • \textwidth : la largeur d'une ligne de texte dans l'environnement local (par exemple, les lignes sont généralement plus étroites dans le résumé que dans le texte normal) ;
  • \textheight : la hauteur du texte dans la page ;

Les exemples fournis sont très longs parce que j'illustrais ce qui se produit quand il y a juste un morceau de texte dans les cellules d'un tableau. Ainsi au lieu de le reproduire dans la page, allez ([1]) directement consulter le fichier Latex en exemple, wrapped.tex et puis regardez le résultat.

Alignement du texte

modifier

Lorsque l'on utilise des colonnes du type p, m, c ou b, il peut être utile de changer la façon dont le paragraphe est aligné. Pour cela la méthode la plus claire est de définir un nouveau type de colonne qui réalise l'alignement désiré. Par exemple le code latex suivant définit un nouveau type de colonne ("M") qui centre verticalement le paragraphe par rapport à la ligne (comme le type de colonne m) et aligne le paragraphe à gauche de la colonne ("drapeau droit" en typographie, \raggedright en LaTeX) :

\newcolumntype{M}[1]{>{\raggedright}m{#1}}

On peut ensuite l'utiliser dans un tableau comme suit :

\begin{tabular}{|l|M{4cm}|}
    \hline
    colonne 1 & colonne "M" \tabularnewline
    \hline
    court texte & Texte plus long qui sera centré dans la ligne et aligné à gauche dans la colonne  \tabularnewline
    \hline
 \end{tabular}

Ce qui donne :  

À noter :

  • Cet exemple nécessite l'utilisation de l'extension array (\usepackage{array})
  • L'utilisation de \tabularnewline à la place de \\ pour terminer une ligne du tableau.

Pour avoir du texte centré verticalement et horizontalement, il faut utiliser

\newcolumntype{M}[1]{>{\centering\arraybackslash}m{#1}}

D'autres solutions existent, voir cette page (en anglais).

Définition groupée de colonnes

modifier

Il est possible de définir les colonnes identiques ou les groupes de colonnes identiques d'un tableau en une seule fois. Cela est particulièrement utile pour les tableaux contenant beaucoup de colonnes identiques ou des tableaux pour lesquels la syntaxe des colonnes est complexe.

La syntaxe est la suivante : *{nombre}{déclaration}

Voici un exemple de tableau à 10 colonnes :

\begin{tabular}{|*{10}{c|}}
    \hline
     1  & 2  & 3  & 4  & 5  & 6  & 7  & 8  & 9  & 10 \\
    \hline
     2  & 4  & 6  & 8  & 10 & 12 & 14 & 16 & 18 & 20 \\
    \hline
     3  & 6  & 9  & 12 & 15 & 18 & 21 & 24 & 27 & 30 \\
    \hline
     4  & 8  & 12 & 16 & 20 & 24 & 28 & 32 & 36 & 40 \\
    \hline
     5  & 10 & 15 & 20 & 25 & 30 & 35 & 40 & 45 & 50 \\
    \hline
     6  & 12 & 18 & 24 & 30 & 36 & 42 & 48 & 54 & 60 \\
    \hline
     7  & 14 & 21 & 28 & 35 & 42 & 49 & 56 & 63 & 70 \\
    \hline
     8  & 16 & 24 & 32 & 40 & 48 & 56 & 64 & 72 & 80 \\
    \hline
     9  & 18 & 27 & 36 & 45 & 54 & 63 & 72 & 81 & 90 \\
    \hline
\end{tabular}

Résultat :  

L'environnement tabular*, maîtrise de la largeur d'un tableau

modifier

C'est fondamentalement une légère extension de la version originale de tableau, bien qu'elle exige un paramètre supplémentaire (avant les descriptions de colonne) pour indiquer la largeur souhaitée du tableau.

 \begin{tabular*}{0.75\textwidth}{ | c | c | c | r | }
   \hline
   label 1 & label 2 & label 3 & label 4 \\
   \hline 
   item 1  & item 2  & item 3  & item 4  \\
   \hline
 \end{tabular*}

Cependant, cela ne ressemble pas à ce qui était attendu. Les colonnes ont toujours leur largeur normale (juste assez large pour adapter leur contenu) tandis que les lignes sont aussi larges que la largeur demandée du tableau.
Le tableau a une apparence très laide. La raison de ce désordre est que vous devez également insérer un espace supplémentaire de colonne. Heureusement, Latex a des longueurs élastiques, qui à la différence d'autres, ne sont pas fixes, et Latex peut dynamiquement décider du moment jusqu'auquel elles doivent rester fixes. Ainsi, la solution est :

 \begin{tabular*}{0.75\textwidth}{@{\extracolsep{\fill}} | c | c | c | r | }
   \hline
   label 1 & label 2 &  3 & label 4 \\
   \hline 
   item 1  & item 2  &  3  & item 4  \\
   \hline
 \end{tabular*}

Vous remarquerez la présence de la construction @{...} ajoutée au début de la description de colonne. Plus de détails de ce rajout seront donnés sous peu. À l'intérieur de celle-ci, la commande \extracolsep, exige une largeur comme paramètre. Une largeur fixe aurait pu être employée, cependant, en utilisant une longueur élastique, telle que \fill, les colonnes sont automatiquement espacées de tel sorte que le résultat voulu est atteint.

L'environnement tabularx - Calcul automatique de la largeur des colonnes

modifier

Le paquet tabularx met à disposition l'environnement tabularx permettant de définir des colonnes de type X qui adaptent automatiquement leur largeur de sorte que le tableau ait la largeur souhaitée. L'environnement tabularx prend comme argument la largeur du tableau puis la déclaration des colonnes du tableau :

\begin{tabularx}{largeur}{déclaration}
\end{tabularx}

Les déclarations des colonnes sont identiques à celles d'un tableau classique sauf le type X dont la largeur s'adapte pour que le tableau ait la largeur indiquée. Voici un exemple tiré en partie de "The LateX companion" p113.

\begin{tabularx}{15cm}{|c|p{4cm}|X|}
    \hline
    1 & The two gentlemen of Verona & The Taming of the Shrew \\
    \hline
    2 & The comedy of errors & Love's Labour's Lost \\
    \hline
    3 & The Merchant of venice & The Merry Wives of Windsor \\
    \hline
\end{tabularx}

Voici le résultat, on remarque le comportement différent de la colonne p et de la colonne X :

 

Espacement entre les lignes, espacement entre les colonnes

modifier

Pour aérer un tableau, il est possible de redéfinir l'espacement entre les lignes d'un tableaux et l'espacement entre les colonnes, par exemple :

\renewcommand{\arraystretch}{1.5}

\setlength{\tabcolsep}{1cm}

Expressions avec @

modifier

Maintenant qu'il a été présenté, il serait intéressant de nous pencher sur le « prescripteur » @, bien que celui-ci n'ait pas un grand nombre d'applications évidentes.

Il prend typiquement du texte comme paramètre, et lorsqu'il est apposé à une colonne, il insère automatiquement ce texte dans chaque cellule de cette colonne avant les données mêmes de cette cellule. Il faut préciser qu'une fois utilisé, l'espace entre les colonnes concernées est supprimé. Pour ajouter un espace, employez la commande @{\hspace{largeur}}.

Pour mieux comprendre cela exigera quelques exemples d'utilisation. Parfois, il est souhaitable dans les tables scientifiques d'avoir les nombres alignés sur la virgule décimale. Ceci peut être réalisé en faisant ce qui suit :

 \begin{tabular}{r@{,}l}
  3&14159\\
  16&2\\
  123&456\\
\end{tabular}

Son application supprimant les espaces, il peut être très utile pour maîtriser l'espacement horizontal entre les colonnes. À partir d'un tableau de base, changeons les descriptions des colonnes:

\begin{tabular}{|l|l|}
\hline
truc & truc \\ \hline
truc & truc \\
\hline
\end{tabular}
{|l|l|}

 

{|@{}l|l@{}|}

 

{|@{}l@{}|l@{}|}

 

{|@{}l@{}|@{}l@{}|}

 

Lignes enveloppant des colonnes multiples

modifier

La commande adéquate ressemble à ceci:

\multicolumn{nomb_col}{alignement}{contenu}.
  • nomb_col est le nombre de colonnes consécutives à fusionner;
  • alignement est assez évident, et doit être remplacé par l, c, ou r ;
  • contenu représente simplement les données mêmes que vous désirez inclure dans la cellule.

Donnons un exemple simple:

\begin{tabular}{|l|l|}
  \hline
  \multicolumn{2}{|c|}{Membres de l'équipe} \\
  \hline
  GK & Guillaume Warmuz \\
  LB & Yohan Lachor \\
  DC & Jean-Guy Wallemme \\
  DC & Cyrille Magnier \\
  RB & Eric Sikora \\
  MC & Marc-Vivien Foe \\
  MC & Stephane Ziani \\
  MC & Mickaël Debève \\
  FW & Tony Vairelles \\
  ST & Vladimir Smicer \\
  ST & Anto Drobnjak \\
  \hline
\end{tabular}

 

Colonnes enveloppant des lignes multiples

modifier

Nous avons proposé précédemment une méthode simple mais détournée (cf. Faire des tableaux > Fusionner les lignes).

Si l'on veut vraiment fusionner les lignes, il faut avoir recours à l'extension multirow, et donc ajouter

\usepackage{multirow}

dans le préambule. Cela fournit alors la commande requise pour envelopper des lignes :

\multirow{nomb_ligne}{largeur}{contenu}

Les paramètres sont assez simples à comprendre. Avec le paramètre largeur, vous pouvez indiquer une largeur fixe si vous le désirez, ou une largeur normale (c'est-à-dire, juste assez large pour adapter le contenu de la colonne) en entrant simplement un astérisque (*). Cette approche a été employée dans l'exemple suivant :

\begin{tabular}{|l|l|l|}
  \hline
  \multicolumn{3}{|c|}{Membres de l'équipe} \\
  \hline
  Gardien de but & GK & Paul Robinson \\ \hline
  \multirow{4}{*}{Défenseurs} & LB & Lucus Radebe \\
    & DC & Michael Duberry \\
    & DC & Dominic Matteo \\
    & RB & Didier Domi \\ \hline
  \multirow{3}{*}{Milieux de terrain } & MC & David Batty \\
    & MC & Eirik Bakke \\
    & MC & Jody Morris \\ \hline
  Avant & FW & Jamie McMaster \\ \hline
  \multirow{2}{*}{Attaquants} & ST & Alan Smith \\
    & ST & Mark Viduka \\
 \hline
\end{tabular}

 

Ce qui est essentiel de remarquer lorsque vous utilisez la commande \multirow sur les lignes consécutives à envelopper, est qu'une entrée vide devant les cellules concernées doit être insérée : en effet, la commande \multirow indique simplement que le texte est sur plusieurs lignes, il ne modifie pas la structure du tableau (contrairement à \multicolumn). Ceci a de l'importance lorsque l'on met un fond coloré (voir ci-après).

Couleur

modifier

Nous avons vu dans Programmation LaTeX/Options de mise en forme avancées > Couleur comment mettre du texte en couleur, caractères et fond.

Mais le fond du texte est une boîte plus petite que la cellule du tableau. Si l'on veut mettre le fond d'une cellule en couleur, il faut utiliser l'extension colortbl. Vous pouvez l'appeler en même temps de xcolor en utilisant l'option table :

\usepackage[table]{xcolor}

(si vous utilisez beamer, vous devriez aussi avoir : \documentclass[xcolor=table]{beamer})

Le recours à l'extension array est fortement recommandé pour améliorer le rendu.

Vous pouvez alors définir :

  • la couleur de fond d'une ligne en mettant \rowcolor{couleur} en début de ligne ;
  • la couleur de fond d'une colonne en mettant >{\columncolor{couleur}} avant la désignation de la colonne dans la définition de l'environnement tabular ; on peut lui adjoindre la couleur des caractères >{\color{couleur} \columncolor{couleur}} ;
  • la couleur de fond d'une cellule en mettant \cellcolor{couleur} en début de cellule.

Par exemple

\begin{tabular}{l l >{\columncolor{green}} l}
   1 & 2 & 3 \\
   a & b & c
\end{tabular}
\begin{tabular}{l l l}
   \rowcolor{cyan} 1 & 2 & 3 \\
   a & b & c
\end{tabular}
\begin{tabular}{l l >{\columncolor{green}} l}
   1 & 2 & 3 \\
   a & \cellcolor{gray} b & c
\end{tabular}

On a souvent recours à une alternance de couleurs d'une ligne à l'autre. On peut utiliser pour cela la commande \rowcolors (avec un s) :

\rowcolors{début}{couleur impaire}{couleur paire}

l'argument début est la ligne où commence cette alternance, ce qui permet d'épargner les lignes d'en-tête. Par exemple

 \rowcolors{2}{gray}{}
\begin{tabular}{l l >{\columncolor{green}} l}
   1 & 2  & 3 \\
   a & b  & c \\
   I & II & III
\end{tabular}

Notez que :

  • une commande \rowcolor annule une commande \columncolor pour la ligne en cours ;
  • une commande \cellcolor annule une commande \columncolor ou \rowcolor(s) pour la cellule en cours.

La commande \arrayrulecolor{couleur} permet de définir la couleur des filets (horizontaux et verticaux). Elle influe sur les filets tracés après cette commande ; elle peut donc être placée avant un tableau ou bien à l'intérieur de celui-ci.

 Dans toutes les commandes, {couleur} peut être remplacé par [modèle]{couleur}, cf. Programmation LaTeX/Options de mise en forme avancées > Modèles de couleur
Cas de \multirow

La fonction \columncolor colorie les cases une par une. Lorsque l'on utilise \multirow, on a donc :

  1. La première case est colorée par \columncolor.
  2. Le texte est écrit sur plusieurs lignes par \multirow.
  3. Au passage à la ligne suivante, la deuxième case est colorée par \columncolor.

La deuxième ligne de texte est donc recouverte par la couleur de fond. Pour éviter ceci, il faut mettre le \multirow sur la dernière ligne et utiliser une valeur négative pour le nombre de lignes. Par exemple

 \begin{tabular}{l >{\columncolor{lightgray}} l l}
    1 &   & 3 \\
    a &   & c \\
    I & \multirow{-3}{1em}{2 A II} & III
 \end{tabular}

Tableaux longs

modifier

Si un tableau est susceptible d'être sur plusieurs pages, on utilise l'environnement longtable. Il s'utilise comme l'environnement table et comme l'environnement tabular :

\begin{longtable}{| p{0.2\linewidth} | p{0.2\linewidth} |}
\caption{Titre du tableau}
\hline
ligne 1 colonne 1 & ligne 1 colonne 2 \\\end{longtable}

Il propose de plus des commandes supplémentaires :

  • \setlongtables : cette commande est à mettre dans le préambule du document et permet d'utiliser tous les types de colonne (<c, l, …) ; si on l'omet, il faut indiquer la largeur des colonne (colonne de type p) ; comme l'affichage se fait sur plusieurs pages, le calcul des largeur nécessite plusieurs compilations ;
  • \endhead : indique la fin de l'en-tête, remplace le dernier \\ de cette partie ; la partie comprise entre le début de l'environnement et cette commande est répété à chaque changement de page ;
  • \endfoot : indique la fin du pied de tableau, remplace le dernier \\ de cette partie ; la partie comprise entre \endhead et cette commande est répété à chaque changement de page ;
  • \endfirsthead et \endfirstfoot : s'utilise de la même manière, mais indique l'en-tête et le pied de tableau de la première page, s'ils sont différents de ceux des autres pages.

Notes de bas de page

modifier

En typographie, les notes de bas de page sont incompatibles avec les tableaux. De fait, si l'on utilise la commande \footnote dans un tableau, on a l'appel de note mais la note elle-même n'apparaît pas en bas de page.

Si l'on veut vraiment une note de bas de page et que celle-ci est unique, on peut mettre \footnotemark à l'appel de note, et placer \footnotetext{texte de la note} après l'environnement du tableau. Mais si l'on a plusieurs notes, il faut numéroter les notes à la main avec \footnotetext[n]{texte de la note}, ce qui pose le problème du suivi de la numérotation des notes.

Une solution plus satisfaisante consiste à mettre le tableau dans un environnement minipage, la note apparaît alors sous le tableau, mais pas en bas de la page.

Résumé

modifier

Nous en avons déjà assez dit au sujet des tableaux de base à mon avis. Après vous pouvez expérimenter afin d'en maîtriser le concept. Je dois admettre que la syntaxe d'un tableau en Latex peut sembler plutôt tordue, et ainsi voir des exemples plus sophistiqués pourrait vous embrouiller davantage. Mais heureusement, nous en avons assez vu pour que vous puissiez créer par vous-même n'importe quel tableau dont vous pouvez avoir besoin dans vos documents. Il est clair que Latex a beaucoup de ressources, ainsi attendez-vous à trouver des instructions plus avancées dans un proche avenir.