Alignement vertical dans un tableau

C’est un sujet récurent sur les fora, et beaucoup s’arrachent les cheveux ou se cassent les dents sur une broutille qui semble pourtant élémentaire : aligner verticalement et horizontalement du texte ou des images dans un tableau \LaTeX. Je vais donc dans ce court billet donner la méthode qui marche dans 95 % des cas.

Problématique

Prenons un exemple minimal : on souhaite faire un tableau comprenant des images et du texte. Habituellement, on ferait comme suit :

\begin{tabular}{cc}
  Première ligne de texte                              & \includegraphics[width=.2\textwidth]{Gnu.jpg}\\
  \includegraphics[height=.2\textheight]{Stallman.jpg} & Une seconde ligne, de taille différente
\end{tabular}

Ce qui aura pour effet de produire (suivant la taille de vos images) :

Tableau habituelle mélangeant images et texte
Les éléments sont bien centrés horizontalement, mais restent sur la ligne de base

Le problème est que \LaTeX ne peux pas anticiper à la fois la hauteur et la largeur nécessaires à chaque cellule.

Centrer verticalement

Une première approche est donc de lui dire de centrer verticalement. Mais il faut alors lui indiquer la largeur des colonnes, après avoir chargé le package array :

\usepackage{array}
 
\begin{tabular}{m{.4\textwidth} m{.4\textwidth}}
  Première ligne de texte                              & \includegraphics[width=.2\textwidth]{Gnu.jpg}\\
  \includegraphics[height=.2\textheight]{Stallman.jpg} & Une seconde ligne, de taille différente
\end{tabular}

Ainsi, on commence à s’approcher de ce que l’on cherchait à avoir :

Centrage vertical des éléments
On impose la largeur des colonnes, et LaTeX trouve tout seul la hauteur des lignes

Centrage vertical et horizontal

Comme on le voit sur la figure précédente, les éléments sont bien centrés verticalement, mais ne le sont plus horizontalement ! L’astuce est en fait d’utiliser la commande \centering pour chacun d’eux. Il est possible de rendre cette exécution automatique pour chaque cellule d’une colonne grâce à la commande « > » lors de sa définition. Par contre, centering est a priori incompatible avec l’environnement tabular, il faut donc rétablir la commande « \\ ». Finalement, la commande complète est donc :

\usepackage{array}
 
\begin{tabular}{>{\centering\arraybackslash}m{.4\textwidth} >{\centering\arraybackslash}m{.4\textwidth}}
    Première ligne de texte                              & \includegraphics[width=.2\textwidth]{Gnu.jpg}\\
    \includegraphics[height=.2\textheight]{Stallman.jpg} & Une seconde ligne, de taille différente
\end{tabular}

 

Ce qui nous donne enfin :

Centrage vertical et horizontal
Les éléments du tableau sont bien centrés verticalement et horizontalement

Pour finir, j’en profite pour vous donner une dernière astuce : à l’instar de la commande \textwidth qui retourne la largeur de la page, il peut être intelligent d’utiliser la commande \linewidth dans un tableau. Comme son nom l’indique, elle donne la largeur ligne courante. Très pratique donc dans les tableaux mais aussi pour les documents en double colonne et les présentations Beamer.

Bonne compilation !

Alignement vertical dans un tableau
4.7 (93.33 %) 9 votes
  • Pingback: Les tableaux scientifiques sous LaTeX | Le Blog de DorianLe Blog de Dorian()

  • salvanah

    Merci (infiniment) pour ces explications claires et efficaces !

  • profette

    Aaaaah enfin une explication claire plutôt que de remontrer les fils de discussion interminables ! Merci beaucoup !

  • Frédéric Stévenot

    Bonjour,
    L’alignement vertical fonctionne effectivement bien, mais presque : c’est OK pour les deux premières colonnes, mais pas la dernière. Pourquoi ? Je n’en sais rien.
    Merci,
    Fred

    Voici un bout du code (array et tabularx en préambule) :

    centering
    setlength{extrarowheight}{10pt}
    begin{tabular}{l|l|m{.1textwidth}}
    hline
    emph{Machin} & blabla & 50,20 \
    hline
    & Total (en euro) & 969,70 \
    hline
    end{tabular}

    • Salut !
      Désolé pour la réponse tardive ; probablement que tu as déjà trouvé la solution depuis, mais bon. Si j’essaye mon code minimal avec 3 colonnes, ça fonctionne toujours. Dans ton cas, le problème vient plutôt de l’option ‘m’ qui justifie le texte, donc l’aligne à gauche.