> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/fr/articles-approfondis/15-how-do-tex-engines-typeset-tables-2.md).

# Comment les moteurs TeX composent-ils des tableaux 2

## Comment les moteurs TeX composent-ils des tableaux 2

## Les moteurs TeX désignent les tableaux par le terme « alignements »

Dans la [documentation du code source de TeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) Knuth ne parle pas de la capacité de TeX à « composer des tableaux », mais décrit plutôt les algorithmes de TeX pour construire les soi-disant *alignements*. La composition des tableaux par TeX est, en effet, un processus automatisé d’alignement de boîtes : disposer des boîtes (cellules, lignes et colonnes du tableau) pour obtenir une grille ou un tableau rectangulaire agréable — bien sûr, étant TeX, il y a *de nombreuses* des subtilités dans ce processus.

Le terme « alignement » se reflète aussi dans les noms des deux commandes de composition de tableaux intégrées à tous les moteurs TeX :

* `\halign` (alignement horizontal), et
* `\valign` (alignement vertical).

Nous explorerons ces deux commandes tout au long de cette série d’articles, en commençant par un aperçu plus formel du format/de la structure des `\halign` et `\valign` commandes afin de poser les bases pour les articles approfondis ultérieurs de cette série.

### Les tableaux de TeX sont des boîtes et des espacements

Les cellules individuelles d’un tableau contiennent généralement विविध types de contenu, comme des lignes de texte, des mathématiques ou des graphiques, ce qui produit un ensemble de cellules de tailles différentes, avec des matériaux composés ayant des largeurs, hauteurs ou profondeurs différentes. D’une manière ou d’une autre, TeX doit travailler avec ces cellules, aux dimensions de contenu variables, pour construire le tableau final où chaque ligne a une certaine hauteur et chaque colonne une certaine largeur. TeX doit déduire des valeurs appropriées pour les hauteurs de chaque ligne et les largeurs de chaque colonne à partir de l’ensemble des cellules de tableau de tailles variables.

Cependant, TeX ne peut pas connaître la taille réelle du contenu de chaque cellule avant que ce contenu ne soit composé ; par conséquent, TeX parcourt l’ensemble du tableau, compose chaque cellule, afin d’obtenir les données de dimensionnement nécessaires pour terminer la mise en page du tableau. À partir de ces données de taille, TeX peut déterminer la hauteur correcte de chaque ligne et la largeur de chaque colonne. TeX peut aussi rencontrer des cellules vides ou des cellules que l’utilisateur souhaite faire s’étendre sur plusieurs colonnes ou plusieurs lignes, tout cela devant être pris en compte avec soin dans ses calculs. Après avoir « filtré » cet ensemble disparate de données de taille des cellules (boîtes), seulement alors TeX est-il en mesure de déterminer les valeurs finales des largeurs de colonnes dans un `\halign`, ou les hauteurs de lignes pour `\valign` et utilise ces valeurs dans les dernières étapes de ses algorithmes de mise en page des tableaux.

En pratique, et « sous le capot », la composition des tableaux par TeX se déroule en plusieurs étapes. En gros, TeX compose d’abord une version « brouillon » ou « incomplète » du tableau tout en capturant et en traitant les données de taille des cellules — ainsi que les données sur toutes les `\span` commandes utilisées dans le tableau. Dans les dernières étapes, TeX retraitera cette version « incomplète » du tableau afin de finaliser `\halign` les largeurs de colonnes ou `\valign` les hauteurs de lignes et obtenir la mise en page achevée — tout cela sera exploré dans cette série d’articles.

## \halign et \valign : deux façons de construire des tableaux

Tous les moteurs TeX fournissent deux *la prise en charge intégrée* commandes (primitives) conçues pour composer des tableaux (alignements) : `\halign` et `\valign`, qui partagent de nombreuses fonctionnalités de base mais diffèrent aussi sur certains points fondamentaux. La différence clé entre `\halign` et `\valign` réside dans la manière dont ils construisent leurs tableaux respectifs : ligne par ligne ou colonne par colonne :

* `\halign`: compose des tableaux ligne par ligne pour créer des lignes individuelles qui sont empilées verticalement afin de produire les colonnes du tableau
* `\valign`: compose des tableaux colonne par colonne pour créer des colonnes individuelles qui sont empilées horizontalement afin de produire les lignes du tableau

### \halign

Le diagramme suivant illustre la construction d’un tableau créé par `\halign`. Le tableau est composé ligne par ligne avec des lignes individuelles empilées verticalement. Cela a plusieurs conséquences :

* les colonnes du tableau résultent de l’empilement vertical des lignes du tableau
* des sauts de page peuvent se produire entre les lignes du tableau
* du contenu non tabulaire peut être inséré entre les lignes (via `\nolign`, que nous examinerons plus tard)

![](/files/08de6f96cd4025c36d2356a57d1f99e4934bc569)

### \valign

Le diagramme suivant illustre la construction d’un tableau créé par `\valign`. Le tableau est composé colonne par colonne avec des colonnes individuelles empilées horizontalement (côte à côte). Cela a plusieurs conséquences :

* les lignes du tableau résultent de l’empilement horizontal des colonnes du tableau
* des retours à la ligne peuvent se produire entre les colonnes du tableau
* du contenu non tabulaire peut être inséré entre les colonnes (via `\noalign`, que nous examinerons plus tard)

![](/files/b7d4b99e30e5e2e30fcf6655677961568df9fb84)

### Exemples

L’exemple suivant a pour but de mettre en évidence l’approche ligne *vs*. colonne de \halign et \valign.

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Bordures de boîte ajustées
\setlength{\fboxsep}{0pt}

Voici un tableau \verb|\valign| :
\begingroup
% \hsize contrôle les
% largeurs de colonnes de \valign. Nous réglons aussi
% \parindent sur une valeur plus petite
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr % Le préambule : abordé plus loin (en très grande détail !)
A&B&C\cr % La première COLONNE de ce tableau \valign
D&E&F\cr
G&H&I\cr
}}
\endgroup

% Remarque : pour des raisons expliquées plus loin
% le \halign doit être placé dans un \vbox
Voici un tableau \verb|\halign| : \fbox{%
\vbox{\halign{
#&#&#\cr % Le préambule : abordé plus loin (en très grande détail !)
A&B&C\cr % La première LIGNE de ce tableau \halign
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Ouvrez cet exemple dans Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+table+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A+%0A%5Cbegingroup%0A%25+%5Chsize+controls+the+%5Cvalign+%0A%25+column+widths.+We+also+set+%0A%25+%5Cparindent+to+a+smaller+value%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign%7B%0A%23%26%23%26%23%5Ccr+%25+The+preamble%3A+covered+later+%28in+great+detail%21%29%0AA%26B%26C%5Ccr+%25+The+first+COLUMN+of+this+%5Cvalign+table%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%0A%25+Note%3A+for+reasons+explained+later%0A%25+the+%5Chalign+has+to+be+put+in+a+%5Cvbox%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table%3A+%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign%7B%0A%23%26%23%26%23%5Ccr+%25+The+preamble%3A+covered+later+%28in+great+detail%21%29%0AA%26B%26C%5Ccr+%25+The+first+ROW+of+this+%5Chalign+table%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Cet exemple produit le résultat suivant : ![](/files/bb4fa9f55426f848cd6dc8c3b3892d32a8540426)

Le graphique suivant montre une version annotée des tableaux produits par le code ci-dessus. Plus loin dans cette série d’articles, nous aborderons des sujets tels que :

* que sont les préambules de tableau ?
* pourquoi définissons-nous `\hsize` et `\parindent` pour `\valign` les tableaux ?

Pour l’instant, retenez simplement l’approche ligne par ligne vs colonne par colonne de `\halign` *vs*. `\valign` la construction des tableaux :

![](/files/c38945a8b4f19f3879579f1777417a531d426a21)

## Forme générale de \halign et \valign

Pour commencer, nous passerons en revue les propriétés de base et le format général de `\halign` et `\valign` sans toutefois entrer pour l’instant dans les détails. [Comme indiqué](#intro), nous adoptons un aperçu légèrement formel de la forme/structure des `\halign` et `\valign` commandes afin de poser les bases des articles suivants de cette série.

La forme la plus générale des `\halign` et `\valign` commandes peut s’écrire comme suit :

`\halign` $$\langle$$⁠`spécification facultative`⁠$$\rangle$$ { $$\langle$$⁠`préambule`⁠$$\rangle$$ $$\langle$$⁠`corps`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`spécification facultative`⁠$$\rangle$$ { $$\langle$$⁠`préambule`⁠$$\rangle$$ $$\langle$$⁠`corps`⁠$$\rangle$$ }

Comme vous pouvez le voir, les deux `\halign` et `\valign` comprennent trois sections principales :

* [$$\langle$$⁠`spécification facultative`⁠$$\rangle$$](#optspec)
* [$$\langle$$⁠`préambule`⁠$$\rangle$$](#preamble)
* [$$\langle$$⁠`corps`⁠$$\rangle$$](#body)

## Le $$\langle$$⁠spécification facultative⁠$$\rangle$$

La taille/étendue par défaut d’un tableau, sa soi-disant « taille naturelle », est déterminée par son contenu — pour clarifier, par taille/étendue nous entendons

* le *la largeur* d’un tableau produit par `\halign`, ou
* le *hauteur* d’un tableau produit par `\valign`

Un $$\langle$$⁠`spécification facultative`⁠$$\rangle$$ peut être utilisé pour « remplacer » la taille naturelle du tableau et prend l’une de deux formes :

* **`à`** $$\langle$$**⁠`dimension`⁠**$$\rangle$$
* **`étalement`** $$\langle$$**⁠`dimension`⁠**$$\rangle$$

où

* $$\langle$$**⁠`dimension`⁠**$$\rangle$$ est une longueur donnée dans des unités que TeX comprend, comme pt, mm ou cm — la longueur peut aussi être spécifiée par une commande qui se développe en une valeur exprimée dans les unités appropriées ;
* **`à`** et **`étalement`** sont des mots-clés TeX indiquant le type de « remplacement » de la taille naturelle :
  * **`à`** : fixe la taille du tableau à la $$\langle$$⁠`dimension`⁠$$\rangle$$ valeur
  * **`étalement`** : ajoute la $$\langle$$⁠`dimension`⁠$$\rangle$$ valeur à la taille naturelle du tableau

L’effet d’un $$\langle$$⁠`spécification facultative`⁠$$\rangle$$ dépend du type de tableau composé : il ajustera un `\halign` la taille naturelle d’un tableau *la largeur*, ou une `\valign` la taille naturelle d’un tableau *hauteur*.

Voici quelques exemples :

* `\halign **to 100pt**{...}` : fixe la `\halign` largeur du tableau à `100pt`
* `\valign **to 50pt**{...}` : fixe la `\valign` hauteur du tableau à `30pt`
* `\halign **spread 30pt**{...}` : ajoute 30pt à la `\halign` largeur naturelle du tableau. À l’inverse, écrire **spread -30pt** réduirait la largeur du tableau de 30pt.
* `\valign **spread 20pt**{...}` : ajoute 20pt à la `\valign` hauteur naturelle du tableau. À l’inverse, écrire **spread -20pt** réduirait la hauteur du tableau de 20pt.

Le code suivant réutilise les exemples de tableau ci-dessus mais applique un $$\langle$$⁠`spécification facultative`⁠$$\rangle$$ à un `\valign` et `\halign` tableau :

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Bordures de boîte ajustées
\setlength{\fboxsep}{0pt}

Voici un tableau \verb|\valign| :
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup

Voici un tableau \verb|\halign| :
\fbox{%
\vbox{\halign to 100pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Ouvrez cet exemple dans Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+table+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A+%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+50pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table%3A%0A%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign+to+100pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Cet exemple produit le résultat ci-dessous :

![](/files/f1e4ae6d3d81b7f6249d34a892c37af2b89d72c1)

—mais remarquez comment le contenu des deux tableaux est « regroupé ». La raison en est l’absence d’espacement flexible (glue) que TeX peut utiliser pour étirer le contenu afin de remplir l’espace supplémentaire fourni par **`à`** $$\langle$$**⁠`dimension`⁠**$$\rangle$$. Ici, nous allons anticiper et mentionner la `\tabskip` commande.

#### Première introduction à la commande \tabskip

L’esthétique de la mise en page d’un tableau peut nécessiter un ajustement de l’espacement entre ses lignes ou ses colonnes ; il n’est donc pas surprenant que les moteurs TeX fournissent une commande appelée `\tabskip` qui vous permet de le faire. `\tabskip` est utilisé pour définir (et faire varier) la quantité d’espace flexible (« glue ») que TeX place entre les colonnes d’un `\halign` ou les lignes d’un `\valign`. Les articles suivants exploreront `\tabskip` beaucoup plus en détail.

Comme exemple introductif, le code suivant utilise un réglage pour `\tabskip` qui amène TeX à insérer un espace (très) flexible entre les lignes d’un `\valign` tableau. Cet espace flexible permet aux lignes du tableau de se déployer et de remplir l’espace supplémentaire créé par $$\langle$$⁠`spécification facultative`⁠$$\rangle$$ de **`to 50pt`**:

```latex
\documentclass{article}
\setlength{\fboxsep}{0pt}
\setlength{\parindent}{0pt}
\newcommand{\optspec}{\(\langle \texttt{optional specification} \rangle\)}
\begin{document}
\pagestyle{empty}
Voici un tableau \verb|\valign| :
\vspace{6pt}

\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\vspace{6pt}

Voici le même tableau \verb|\valign| mais avec une \optspec{} de ``\texttt{to 50pt}''. Remarquez comment les lignes sont « serrées » car il n’y a pas de « colle extensible » disponible entre les lignes :

\vspace{6pt}
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\vspace{6pt}

Nous utiliserons le tableau \verb|\valign| avec une \optspec{} de ``\texttt{to 50pt}'', mais en fournissant un « espacement flexible » via la commande \verb|\tabskip|. Ici, \verb|\tabskip| fournit suffisamment de « glue » pour permettre aux lignes du \verb|\valign| de « s’étirer » et de remplir tout espace supplémentaire disponible. Voici le tableau \verb|\valign| « étiré » :

\tabskip=0pt plus1fil % Cela définit \tabskip comme une colle très flexible
\vspace{6pt}

\def\mylen{50pt}
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to \mylen{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\end{document}
```

[Ouvrez cet exemple dans Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+example+using+tabskip+glue\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%5Csetlength%7B%5Cparindent%7D%7B0pt%7D%0A%5Cnewcommand%7B%5Coptspec%7D%7B%5C%28%5Clangle+%5Ctexttt%7Boptional+specification%7D+%5Crangle%5C%29%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cvspace%7B6pt%7D%0A%0AHere+is+the+same+%5Cverb%7C%5Cvalign%7C+table+but+with+an+%5Coptspec%7B%7D+of+%60%60%5Ctexttt%7Bto+50pt%7D%27%27.+Note+how+the+rows+are+%60%60bunched+up%27%27+because+there%27s+no+available+%60%60stretchable+glue%27%27+between+the+rows%3A+%0A%0A%5Cvspace%7B6pt%7D%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+50pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cvspace%7B6pt%7D%0A%0AWe%27ll+use+the+%5Cverb%7C%5Cvalign%7C+table+with+%5Coptspec%7B%7D+of+%60%60%5Ctexttt%7Bto+50pt%7D%27%27%2C+but+provide+%60%60flexible+spacing%27%27+via+the+%5Cverb%7C%5Ctabskip%7C+command.+Here%2C+%5Cverb%7C%5Ctabskip%7C+is+providing+enough+%60%60glue%27%27+to+enable+the++%5Cverb%7C%5Cvalign%7C+rows+to++%60%60stretch+out%27%27+and+fill+any+available+extra+space.+Here+is+the+%60%60stretched+out%27%27+%5Cverb%7C%5Cvalign%7C+table%3A%0A%0A%5Ctabskip%3D0pt+plus1fil+%25+This+sets+%5Ctabskip+to+a+very+flexible+glue%0A%5Cvspace%7B6pt%7D%0A%0A%5Cdef%5Cmylen%7B50pt%7D%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+%5Cmylen%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Cet exemple produit le résultat suivant :

![](/files/cd3cf907bc1185b63f97ee324a3dedc42f39c744)

## Introduction du tableau $$\langle$$⁠préambule⁠$$\rangle$$ et $$\langle$$⁠corps⁠$$\rangle$$

Cette section présente une introduction au tableau $$\langle$$⁠`préambule`⁠$$\rangle$$, et *brièvement* aborde le tableau $$\langle$$⁠`corps`⁠$$\rangle$$ qui sera ensuite [examiné plus en détail](#bodydetails).

Les articles suivants de cette série exploreront le $$\langle$$⁠`préambule`⁠$$\rangle$$ et $$\langle$$⁠`corps`⁠$$\rangle$$ plus en détail, en particulier l’utilisation et le traitement par TeX du $$\langle$$⁠`préambule`⁠$$\rangle$$.

Comme indiqué ci-dessus, le format le plus général de `\halign` ou `\valign` des tableaux peut s’écrire comme suit :

`\halign` $$\langle$$⁠`spécification facultative`⁠$$\rangle$$ { $$\langle$$⁠`préambule`⁠$$\rangle$$ $$\langle$$⁠`corps`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`spécification facultative`⁠$$\rangle$$ { $$\langle$$⁠`préambule`⁠$$\rangle$$ $$\langle$$⁠`corps`⁠$$\rangle$$ }

### Le $$\langle$$⁠préambule⁠$$\rangle$$

Le $$\langle$$⁠`préambule`⁠$$\rangle$$ section contient une seule $$\langle$$⁠`ligne de préambule`⁠$$\rangle$$ qui est *terminée* par la `\cr` commande ; par conséquent, le $$\langle$$⁠`préambule`⁠$$\rangle$$ peut être réécrit comme suit :

$$\langle$$⁠`préambule`⁠$$\rangle$$=$$\langle$$⁠`ligne de préambule`⁠$$\rangle$$**`\cr`**

### Le $$\langle$$⁠corps⁠$$\rangle$$

De même, le $$\langle$$⁠corps⁠$$\rangle$$ section peut être décomposée plus avant en une ou plusieurs « lignes » constitutives, mais ici il y a deux possibilités pour chaque ligne :

* une ligne constituée d’un ensemble de cellules qui forment une `\halign` ligne ou `\valign` colonne ; ou
* a `\noalign` commande qui « injecte » du contenu entre les lignes d’un `\halign`'s ou les `\valign`colonnes d’un

Pour l’instant, nous ignorerons la `\noalign` commande (voir [plus loin dans l’article](#noalign)) et supposerons que chaque ligne du $$\langle$$⁠corps⁠$$\rangle$$ est une donnée pour un ensemble de cellules et *terminée* par `\cr` commande.

En ignorant `\noalign`, la $$\langle$$⁠`corps`⁠$$\rangle$$ section, qui représente le contenu de l’utilisateur, contient une séquence de lignes, chacune desquelles nous appellerons une $$\langle$$⁠`ligne de corps`⁠$$\rangle$$ qui est *terminée* par sa `\cr` commande.

Le $$\langle$$⁠`corps`⁠$$\rangle$$ peut être réécrit comme suit :

$$\langle$$⁠ligne de corps$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠ligne de corps$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠ligne de corps$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠ligne de corps$${}*\mathrm{N}$$⁠$$\rangle$$\cr

En combinant cela, nous pouvons réécrire le format général de `\halign` et `\valign` comme :

`\halign` $$\langle$$⁠`spécification facultative`⁠$$\rangle$$ { $$\langle$$⁠`ligne de préambule`⁠$$\rangle$$\cr $$\langle$$⁠ligne de corps$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠ligne de corps$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠ligne de corps$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠ligne de corps$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

`\valign` $$\langle$$⁠`spécification facultative`⁠$$\rangle$$ { $$\langle$$⁠`ligne de préambule`⁠$$\rangle$$\cr $$\langle$$⁠ligne de corps$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠ligne de corps$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠ligne de corps$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠ligne de corps$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

Pour des raisons qui seront abordées dans des articles ultérieurs, le $$\langle$$⁠`préambule`⁠$$\rangle$$, une simple $$\langle$$⁠`ligne de préambule`⁠$$\rangle$$, a un format différent de toutes les lignes du tableau $$\langle$$⁠`corps`⁠$$\rangle$$. Nous reviendrons aussi [sur la `\noalign` commande](#noalign) qui peut aussi être utilisée dans le tableau $$\langle$$⁠`corps`⁠$$\rangle$$.

### Le $$\langle$$⁠ligne de préambule⁠$$\rangle$$

Le $$\langle$$⁠`ligne de préambule`⁠$$\rangle$$ joue un *rôle essentiel* dans la composition des tableaux car elle fournit une sorte de « plan » utilisé pour composer le contenu —`\halign` lignes ou `\valign` colonnes — contenu dans le tableau $$\langle$$⁠`corps`⁠$$\rangle$$. Le $$\langle$$⁠`ligne de préambule`⁠$$\rangle$$ peut aussi contenir des « modèles » de cellule utilisés pour construire les lignes d’un `\halign` ou les colonnes d’un `\valign`—un sujet qui sera exploré en détail.

Le but du $$\langle$$⁠`ligne de préambule`⁠$$\rangle$$ est double :

* il détermine le *maximum* du nombre de cellules par ligne d’un `\halign` ou par colonne d’un `\valign`.
* il stocke *des modèles de cellule* qui peuvent être utilisés pour automatiser le formatage ou l’inclusion de contenu dans les cellules du tableau $$\langle$$⁠`corps`⁠$$\rangle$$. Les modèles de cellule sont facultatifs et peuvent être « vides », ou vous pouvez inclure des caractères ou des commandes que TeX insérera automatiquement avant et/ou après le contenu réel de cellules spécifiques de votre tableau. Cela vous évite la monotonie consistant à devoir écrire/insérer manuellement ces caractères ou commandes dans chaque cellule à laquelle vous voulez les appliquer.

**Remarque**: un `\halign` ligne ou `\valign` colonne peut contenir moins de cellules que le maximum spécifié par le $$\langle$$⁠`ligne de préambule`⁠$$\rangle$$ mais ne peut pas en contenir davantage, sinon TeX génère une erreur. Pour l’instant, nous omettons les détails des *cycliques* préambules.

En poursuivant nos diagrammes de structure, le $$\langle$$⁠`ligne de préambule`⁠$$\rangle$$ pour

* un `\halign` tableau avec un maximum de $$\mathrm{K}$$ cellules par *ligne*, ou
* a `\valign` tableau avec un maximum de $$\mathrm{K}$$ cellules par *colonne*

peut être écrit comme suit :

$$\langle$$⁠modèle$${}\_1$$⁠$$\rangle$$&$$\langle$$⁠modèle$${}\_2$$⁠$$\rangle$$&$$\langle$$⁠modèle$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$⁠modèle$${}*\mathrm{K}$$⁠$$\rangle$$

où `&` est la *caractère de tabulation d’alignement* qui indique la fin d’une cellule et le début de la suivante. Traditionnellement, le caractère esperluette (`&`) est utilisé comme tabulation d’alignement, mais n’importe quel caractère avec [code de catégorie](/latex/fr/autres-sujets/43-table-of-tex-category-codes.md) 4 pourrait être utilisé à la place.

Pour rappel, le $$\langle$$⁠`préambule`⁠$$\rangle$$ peut être écrit $$\langle$$⁠`préambule`⁠$$\rangle$$=$$\langle$$⁠`ligne de préambule`⁠$$\rangle$$**`\cr`**, ou, de manière équivalente,

$$\langle$$⁠`préambule`⁠$$\rangle$$=$$\langle$$⁠modèle$${}\_1$$⁠$$\rangle$$&$$\langle$$⁠modèle$${}\_2$$⁠$$\rangle$$&$$\langle$$⁠modèle$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$⁠modèle$${}*\mathrm{K}$$⁠$$\rangle$$**`\cr`**

#### Structure de chaque cellule $$\langle$$⁠modèle⁠$$\rangle$$

Chaque cellule $$\langle$$⁠modèle$${}\_i$$⁠$$\rangle$$ peut être écrit comme suit :

$$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ où :

* $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ est un ensemble de caractères ou de commandes (jetons) que TeX insérera automatiquement *avant* contenu fourni par l’utilisateur pour la cellule $$i$$;
* $$\texttt{#}$$ est un espace réservé, indiquant où le contenu fourni par l’utilisateur doit apparaître dans la cellule $$i$$. Là encore, le caractère `#` n’est qu’une *tradition*, n’importe quel caractère avec [code de catégorie](/latex/fr/autres-sujets/43-table-of-tex-category-codes.md) 6 pourrait être utilisé à la place. Notez que le code de catégorie 6 est utilisé pour les paramètres des macros ;
* $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ est un ensemble de caractères ou de commandes (jetons) que TeX insérera automatiquement *après* contenu fourni par l’utilisateur pour la cellule $$i$$.

Notez que tous les $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ et $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ le sont *ensemble facultatif*: vous n’avez pas à utiliser de caractères ou de commandes avant ou après le contenu de la cellule.

**Compléter le** $$\langle$$**⁠préambule⁠**$$\rangle$$

Enfin, en utilisant la notation ci-dessus, le $$\langle$$⁠`préambule`⁠$$\rangle$$ pour

* un `\halign` tableau avec un maximum de $$\mathrm{K}$$ cellules par *ligne*, ou
* a `\valign` tableau avec un maximum de $$\mathrm{K}$$ cellules par *colonne*

peut être écrit comme suit :

$$\langle$$⁠`préambule`⁠$$\rangle$$=$$\langle$$⁠`ligne de préambule`⁠$$\rangle$$`**\cr**`

ou

$$\langle$$⁠`préambule`⁠$$\rangle$$=$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}*3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*3$$⁠$$\rangle$$$$\cdots$$$$\langle$$⁠$$\texttt{U}*\mathrm{K}$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

**Le** $$\langle$$**⁠préambule⁠**$$\rangle$$ **et le comptage des lignes et des colonnes**

Un **`\halign`** tableau avec un $$\langle$$⁠`préambule`⁠$$\rangle$$ spécifiant $$\mathrm{K}$$ cellules et un $$\langle$$⁠`corps`⁠$$\rangle$$ contenant $$\mathrm{N}$$ $$\langle$$⁠`lignes du corps`⁠$$\rangle$$ produira un tableau avec $$\mathrm{K}$$ *colonnes* et $$\mathrm{N}$$ *lignes*, comme le montre le diagramme suivant :

![](/files/30e2354f63df29502d917215435fbbe09ccba93f)

A **`\valign`** tableau avec un $$\langle$$⁠`préambule`⁠$$\rangle$$ spécifiant $$\mathrm{K}$$ cellules et un $$\langle$$⁠`corps`⁠$$\rangle$$ contenant $$\mathrm{N}$$ $$\langle$$⁠`lignes du corps`⁠$$\rangle$$ produira un tableau avec $$\mathrm{K}$$ *lignes* et $$\mathrm{N}$$ *colonnes*, comme le montre le diagramme suivant :

![](/files/3e584164211c1684a9c050be4f6c2ae076b95c51)

### Assez de théorie, quelques exemples !

Comme nous le verrons plus tard en détail, lorsque TeX traite le contenu d’un tableau — les cellules contenues dans le [$$\langle$$⁠`corps`⁠$$\rangle$$](#body)— il vérifie la présence de modèles de cellule, qui ont été définis dans le $$\langle$$⁠`préambule`⁠$$\rangle$$, car TeX recherche d’éventuels jetons de modèle à insérer avant et/ou après le contenu de l’utilisateur. Les exemples minimalistes suivants démontrent l’utilisation de modèles de cellule $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ dans un `\halign` et `\valign` tableau.

#### Un tableau \halign utilisant des modèles de cellule

L’exemple suivant montre un `\halign` tableau qui utilise un modèle de cellule pour insérer automatiquement des guillemets doubles autour du contenu de la première cellule de chaque ligne : c’est-à-dire un modèle qui affecte chaque cellule de la première colonne :

```latex
\documentclass{article}
\usepackage{parskip} % Régler \parindent à 0pt
% Choisir une taille de page commodément petite
\usepackage[paperheight=10cm,paperwidth=12cm,textwidth=8cm]{geometry}
\setlength{\tabskip}{20pt} % Espacer les colonnes de \halign
\begin{document}
\pagestyle{empty}

Voici un tableau \verb|\halign| \textit{sans} modèles de cellule :

\halign{
% Rien avant ou après chaque '#' dans le <preamble>
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}

Voici le même tableau \verb|\halign| mais avec des guillemets doubles ajoutés automatiquement à la première cellule de chaque ligne ; c’est-à-dire que cela affecte chaque cellule de la première colonne :

\halign{
% Modèles de guillemets dans le préambule :
``#''&#&#\cr % Guillemets doubles avant et après le premier #
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\end{document}
```

[Ouvrez cet exemple dans Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=halign+example+of+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D10cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B20pt%7D+%25+Space+out+the+%5Chalign+columns%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table+%5Ctextit%7Bwithout%7D+cell+templates%3A+%0A%0A%5Chalign%7B%0A%25+Nothing+before+or+after+each+%27%23%27+in+the+%3Cpreamble%3E%0A%23%26%23%26%23%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%0AHere+is+the+same+%5Cverb%7C%5Chalign%7C+table+but+with+double+quotes+automatically+added+to+the+first+cell+in+each+row%3B+i.e.%2C+it+affects+every+cell+in+the+first+column%3A+%0A%0A%5Chalign%7B%0A%25+Quotation+templates+in+the+preamble%3A%0A%60%60%23%27%27%26%23%26%23%5Ccr+%25+Double+quote+marks+before+and+after+first+%23%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cend%7Bdocument%7D)

Cet exemple produit le résultat suivant :

![](/files/7fc4a77de3d0c28c933d5cae8be51a352d7002df)

Le graphique suivant est une version annotée du `\halign` tableau produit par l’exemple ci-dessus ; ici, nous comparons la structure « formelle » d’un tableau à trois cellules $$\langle$$⁠`préambule`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

avec le $$\langle$$⁠`préambule`⁠$$\rangle$$ de ` ``#''&#&#**\cr** `, en mettant en évidence la présence ou l’absence de modèles de cellule :

![](/files/b34eb42733c8db80a1a2cd5a213432d9d5479714)

#### Un tableau \valign utilisant des modèles de cellule

L’exemple suivant montre un `\valign` tableau qui utilise un modèle pour chaque cellule afin d’insérer automatiquement des chiffres autour du contenu de l’utilisateur.

```latex
\documentclass{article}
\usepackage{parskip} % Régler \parindent à 0pt
% Choisir une taille de page commodément petite
\usepackage[paperheight=14cm,paperwidth=12cm,textwidth=10cm]{geometry}
\setlength{\tabskip}{8pt} % Espacer les lignes de \valign
\begin{document}
\pagestyle{empty}

Voici un tableau \verb|\valign| \textit{sans} modèles de cellule :

\begingroup
\hsize=25pt
\valign{
% Rien avant ou après chaque '#' dans
% le <preamble>
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

Voici le même tableau \verb|\valign| mais utilisant des modèles de cellule pour insérer automatiquement des chiffres dans chaque cellule :

\begingroup
\hsize=25pt
\valign{
% Chiffres insérés avant et après chaque '#' dans
% le <preamble>
1#2&3#4&5#6\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup
\end{document}
```

[Ouvrez cet exemple dans Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+valign+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D14cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D+%25+Space+out+the+%5Cvalign+rows%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table+%5Ctextit%7Bwithout%7D+cell+templates%3A%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%25+Nothing+before+or+after+each+%27%23%27+in+%0A%25+the+%3Cpreamble%3E%0A%23%26%23%26%23%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%0AHere+is+the+same+%5Cverb%7C%5Cvalign%7C+table+but+using+cell+templates+to+automatically+insert+digits+into+every+cell%3A+%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%25+Digits+inserted+before+and+after+every+%27%23%27+in%0A%25+the+%3Cpreamble%3E%0A1%232%263%234%265%236%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Cet exemple produit le résultat suivant :

![](/files/403f68c563719029fe93cff50a7d47d36bb0bf17)

Le graphique suivant est une version annotée du `\valign` tableau produit par l’exemple ci-dessus ; ici, nous comparons la structure « formelle » d’un tableau à trois cellules $$\langle$$⁠`préambule`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

avec le $$\langle$$⁠`préambule`⁠$$\rangle$$ de `1#2&3#4&5#6**\cr**`, en mettant en évidence l’utilisation de modèles de cellule $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$:

![](/files/aa1faba13bebaa55ad762fd1d910f3886a615858)

Remarquez comment le modèle pour la cellule $$i$$ ($$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$) est appliqué à la $$i$$ème cellule de chaque `\valign` colonne, ce qui fait que toutes les cellules de la $$i$$ème *ligne* sont affectées.

#### Stylisation du texte à l’aide de modèles de cellules

L’exemple suivant utilise les éléments suivants $$\langle$$⁠`préambule`⁠$$\rangle$$ (modèles de cellules) pour styliser le texte contenu dans chaque ligne ou colonne :

`\textbf{#}&\textit{#}&\texttt{#}\cr`

Si l’on compare cela $$\langle$$⁠`préambule`⁠$$\rangle$$ à notre structure « formelle » d’une table à trois cellules $$\langle$$⁠`préambule`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

nous pouvons voir que :

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$=`\textbf{`

$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$=`}`

$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$=`\textit{`

$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$=`}`

$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$=`\texttt{`

$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$=`}`

Remarquez comment ces modèles de cellules, tels que `\textbf{#}` ressemblent à des macros avec un seul paramètre (le contenu de la cellule).

```latex
Une table \verb|\valign| avec du texte stylisé à l’aide de modèles de cellules :

\begingroup
\hsize=25pt
\valign{
\textbf{#}&\textit{#}&\texttt{#}\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

Une table \verb|\halign| avec du texte stylisé à l’aide de modèles de cellules :

\halign{
\textbf{#}&\textit{#}&\texttt{#}\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
```

[Ouvrez cet exemple dans Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Styling+with+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D14cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%25+Space+out+the+%5Chalign+columns+or+%5Cvalign+rows%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0AA+%5Cverb%7C%5Cvalign%7C+table+with+text+styled+using+cell+templates%3A%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%5Ctextbf%7B%23%7D%26%5Ctextit%7B%23%7D%26%5Ctexttt%7B%23%7D%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%0AAn+%5Cverb%7C%5Chalign%7C+table+with+text+styled+using+cell+templates%3A%0A%0A%5Chalign%7B%0A%5Ctextbf%7B%23%7D%26%5Ctextit%7B%23%7D%26%5Ctexttt%7B%23%7D%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cend%7Bdocument%7D)

Cet exemple produit le résultat suivant :

![](/files/adf5979932f677538a3613517697be55dabf683d)

## Plus de détails sur la table $$\langle$$⁠corps⁠$$\rangle$$

Dans la section [Introduction du tableau $$\langle$$⁠`préambule`⁠$$\rangle$$ et $$\langle$$⁠`corps`⁠$$\rangle$$](#preamble) nous avons vu comment, si nous ignorons temporairement `\noalign`, la $$\langle$$⁠`corps`⁠$$\rangle$$ d’un `\halign` ou `\valign` tableau se compose de plusieurs lignes, chacune désignée $$\langle$$⁠ligne de corps$${}\_j$$⁠$$\rangle$$, où :

* chaque $$\langle$$⁠ligne de corps$${}\_j$$⁠$$\rangle$$ est terminée par le `\cr` commande
* chaque $$\langle$$⁠ligne de corps$${}\_j$$⁠$$\rangle$$ d’un `\halign` est une ligne du tableau
* chaque $$\langle$$⁠ligne de corps$${}\_j$$⁠$$\rangle$$ d’un `\valign` est une colonne du tableau

La séquence de lignes, $$\langle$$⁠ligne de corps$${}\_j$$⁠$$\rangle$$, où $$j=1\ldots\mathrm{N}$$, produit $$\mathrm{N}$$ les lignes d’un `\halign` ou $$\mathrm{N}$$ des colonnes pour un `\valign`. Comme résumé dans le schéma suivant, un tableau général $$\langle$$⁠`préambule`⁠$$\rangle$$ tels que

$$\langle$$⁠`préambule`⁠$$\rangle$$=$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}*3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*3$$⁠$$\rangle$$$$\cdots$$$$\langle$$⁠$$\texttt{U}*\mathrm{K}$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

spécifie des modèles de cellules pour un maximum de $$\mathrm{K}$$ cellules dans chacune des $$\mathrm{N}$$ $$\langle$$⁠`ligne de corps`⁠$$\rangle$$ entrées dans le $$\langle$$⁠`corps`⁠$$\rangle$$:

![](/files/cbab2148a005f7ff7975988a332db2f6a7c97431)

### La structure de chaque $$\langle$$⁠ligne de corps$${}\_j$$⁠$$\rangle$$

Chaque ligne $$\langle$$⁠ligne de corps$${}\_j$$⁠$$\rangle$$ du tableau $$\langle$$⁠corps⁠$$\rangle$$ contient du contenu pour jusqu’à $$\mathrm{K}$$ cellules — selon le tableau $$\langle$$⁠préambule⁠$$\rangle$$— et a la forme générale suivante :

$$\langle$$⁠ligne de corps$${}\_j$$⁠$$\rangle$$=$$\langle$$Cellule$${}\_1$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$Cellule$${}\_2$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$Cellule$${}*3$$⁠$$\rangle$$$$\texttt{&}$$$$\cdots$$$$\texttt{&}$$$$\langle$$Cellule$${}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

où :

* $$\langle$$Cellule$${}\_i$$⁠$$\rangle$$ représente le contenu de l’utilisateur pour la $$i$$nième cellule dans un certain $$\langle$$⁠ligne de corps$${}\_j$$⁠$$\rangle$$
* le **`&`** caractère est appelé la *tabulation d’alignement* (idem que dans le $$\langle$$⁠préambule⁠$$\rangle$$) qui signale la fin d’une cellule et le début de la suivante. Une fois encore, l’utilisation de **`&`** est simplement une tradition (convention), car n’importe quel caractère avec [code de catégorie](/latex/fr/autres-sujets/43-table-of-tex-category-codes.md) 4 pourrait être utilisé à la place.

Bien que chaque $$\langle$$⁠ligne de corps$${}\_j$$⁠$$\rangle$$ puisse contenir au maximum $$\mathrm{K}$$ cellules (déterminé par le $$\langle$$⁠préambule⁠$$\rangle$$) elles peuvent contenir *moins de* que $$\mathrm{K}$$ cellules et n’importe quelle $$\langle$$Cellule$${}\_i$$⁠$$\rangle$$ dans $$\langle$$⁠ligne de corps$${}\_j$$⁠$$\rangle$$ peut être vide.

L’exemple suivant montre un $$\langle$$⁠préambule⁠$$\rangle$$ de `#&#&#&#&#\cr` ce qui prévoit un maximum de 5 cellules par $$\langle$$⁠ligne de corps⁠$$\rangle$$; cependant, les tableaux typographiés contiennent des lignes avec moins de 5 cellules :

```latex
Une table \verb|\valign| avec de 1 à 5 cellules par \textit{colonne} :

\begingroup
% \hsize contrôle les largeurs de colonne de \valign (taille des lignes typographiées).
\hsize=40pt
\fbox{\valign{
% Utilisez un préambule qui autorise 5 cellules par colonne
% La plupart des colonnes ne fournissent pas de contenu pour 5 cellules
#&#&#&#&#\cr% 5 cellules par colonne
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)&\(\mathrm{Cell}{}_5\)\cr
}}
\endgroup

% Remarque : pour des raisons expliquées plus loin
% le \halign doit être placé dans un \vbox
Une table \verb|\halign| avec de 1 à 5 cellules par \textit{ligne} :

\fbox{%
\vbox{\halign{
% Utilisez un préambule qui autorise 5 cellules par ligne
% La plupart des lignes ne fournissent pas de contenu pour 5 cellules
#&#&#&#&#\cr % 5 cellules par ligne
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)&\(\mathrm{Cell}{}_5\)\cr
}}}
```

[Ouvrez cet exemple dans Overleaf](/latex/fr/articles-approfondis/15-how-do-tex-engines-typeset-tables-2.md)

Cet exemple produit le résultat suivant :

![](/files/5316f23b411e0a182bb9e0b05aa2459d4311ff05)

L’exemple suivant `\halign` démontre un nombre variable de cellules par ligne et la possibilité que les cellules soient vides — notez comment les cellules vides sont produites par des **`&`** caractères dans la table :

```latex
Une table \verb|\halign| avec certaines cellules vides — notez qu’il y a des caractères \texttt{\&} consécutifs dans la table \(\langle\texttt{body}\rangle\) :

\fbox{%
\vbox{\halign{
% Utilisez un préambule qui autorise 5 cellules par ligne
% La plupart des lignes ne fournissent pas de contenu pour 5 cellules
#&#&#&#&#\cr % 5 cellules par ligne
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&&\(\mathrm{Cell}{}_3\)\cr
&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&&&\(\mathrm{Cell}{}_5\)\cr
}}}
```

[Ouvrez cet exemple dans Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Empty+cells+Number+of+cells+per+row\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%25+Space+out+the+%5Chalign+columns+and+%5Cvalign+rows%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D+%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%5Cbegin%7Bdocument%7D%0AAn+%5Cverb%7C%5Chalign%7C+table+with+some+empty+cells---note+there+are+consecutive+%5Ctexttt%7B%5C%26%7D+characters+in+the+table+%5C%28%5Clangle%5Ctexttt%7Bbody%7D%5Crangle%5C%29%3A%0A%0A%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign%7B%0A%25+Use+a+preamble+that+allows+for+5+cells+per+row%0A%25+Most+rows+don%27t+provide+content+for+5+cells%0A%23%26%23%26%23%26%23%26%23%5Ccr+%25+5+cells+per+row%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%5Ccr+%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%5Ccr%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_3%5C%29%5Ccr%0A%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_3%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_4%5C%29%5Ccr%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%26%26%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_5%5C%29%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Cet exemple produit le résultat suivant :

![](/files/dda254d9b4b92b29b6d316c355a630d4441ede5e)

### Il n’y a rien de particulier avec & et # dans la composition des tableaux

L’utilisation par TeX des caractères `&` et `#` dans la composition de `\halign`- ou `\valign`-basés est une tradition qui trouve son origine dans les macros plain TeX originales de Knuth. Il est tout à fait possible d’utiliser d’autres caractères que `&` et `#` en attribuant les codes de catégorie appropriés à vos remplacements préférés, comme le montre l’exemple suivant :

* remplacer `&` avec `@` en attribuant `@` le code de catégorie 4
* remplacer `#` avec `|` en attribuant `|` le code de catégorie 6 (utilisé pour les paramètres de macro)

Les changements de catégorie sont conservés localement en utilisant `\begingroup` et `\endgroup`:

```latex
\documentclass{article}
\begin{document}
\begingroup
\catcode`@=4
\catcode`|=6
\halign{
|@|@|\cr
A@B@C\cr
D@E@F\cr
}
\endgroup
\end{document}
```

[Ouvrez cet exemple dans Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Tables+and+category+codes\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegingroup%0A%5Ccatcode%60%40%3D4%0A%5Ccatcode%60%7C%3D6%0A%5Chalign%7B%0A%7C%40%7C%40%7C%5Ccr%0AA%40B%40C%5Ccr%0AD%40E%40F%5Ccr%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

## Réintroduction de la commande \noalign

Les moteurs TeX fournissent l’élément intégré (primitif) `\noalign` commande :

`\noalign{`$$\langle$$⁠`jetons`⁠$$\rangle$$`}`

où $$\langle$$⁠`jetons`⁠$$\rangle$$ sont des caractères et/ou des commandes TeX/LaTeX. La `\noalign` commande est exclusivement destinée à être utilisée dans une `\halign` ou `\valign` table : son utilisation en dehors de celles-ci générera une erreur.

Le but de `\noalign` est de permettre l’« insertion » de texte et de commandes TeX/LaTeX *entre* les lignes d’un `\halign` tableau ou les colonnes d’un `\valign` tableau. L’utilisation la plus courante de `\noalign` est la création de règles de tableau (lignes) :

* *horizontal* règles entre `\halign` lignes du tableau
* *vertical* règles entre `\valign` colonnes du tableau

Notez ce qui suit :

* le `\noalign` commande est ***non terminée par la\*\*\*\*****&#x20;****`\cr`****&#x20;****\*\*\*\*commande***
* l’ensemble des commandes autorisées dans `\noalign{...}` dépend du fait qu’elle est utilisée dans le $$\langle$$⁠`corps`⁠$$\rangle$$ d’un `\halign` ou `\valign` tableau (c.-à-d. en mode vertical ou horizontal).

Nous pouvons désormais dire que le tableau $$\langle$$⁠`corps`⁠$$\rangle$$ de `\halign` ou `\valign` peut se composer de lignes individuelles $$\langle$$⁠ligne de corps$${}\_i$$⁠$$\rangle$$`\cr` entremêlées avec `\noalign` commandes ; une des nombreuses possibilités/combinaisons pourrait être :

`\noalign{`$$\langle$$⁠`jetons`⁠$$\rangle$$`}` $$\langle$$⁠ligne de corps$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠ligne de corps$${}\_2$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`davantage de jetons`⁠$$\rangle$$`}` $$\langle$$⁠ligne de corps$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠ligne de corps$${}*\mathrm{N}$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`d’autres jetons`⁠$$\rangle$$`}`

### Exemple utilisant \noalign

Nous examinerons d’autres cas d’utilisation plus loin dans cette série d’articles, mais voici un exemple de base pour montrer la création de règles de tableau via `\noalign`:

```latex
\setlength{\tabskip}{5pt}

Utilisation de \verb|\noalign| pour placer des règles horizontales entre les lignes d’une table \verb|\halign| :
\vspace{6pt}

\halign{%
#&#&#&#&#\cr
\noalign{\hrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\hrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\hrule}
}

Utilisation de \verb|\noalign| pour placer des règles verticales entre les colonnes d’une table \verb|\valign| :
\vspace{6pt}

\begingroup % Conserver localement les modifications de \parindent et \hsize
\parindent=0pt
\hsize=50pt
\valign{%
#&#&#&#&#\cr
\noalign{\vrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\vrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\vrule}
}
\endgroup
```

[Ouvrez cet exemple dans Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+the+noalign+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%0AUsing+%5Cverb%7C%5Cnoalign%7C+to+place+horizontal+rules+between+rows+of+an+%5Cverb%7C%5Chalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Chalign%7B%25%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Chrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%7D%0A%7D%0A%0AUsing+%5Cverb%7C%5Cnoalign%7C+to+place+vertical+rules+between+columns+of+a+%5Cverb%7C%5Cvalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Cbegingroup+%25+keep+changes+to+%5Cparindent+and+%5Chsize+local%0A%5Cparindent%3D0pt%0A%5Chsize%3D50pt%0A%5Cvalign%7B%25%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Cet exemple produit le résultat suivant :

![](/files/998cc74b1c348b1c0e45dbf248a6091ff8064e2a)

## \tabskip revisité

Nous examinerons de plus près la `\tabskip` commande, en nous appuyant sur l’ [introduction de la section précédente](#tabskip).

Le `\tabskip` La commande définit la valeur *exclusivement* dans la composition des tableaux : son but est de fournir un espacement entre les lignes ou colonnes du tableau :

* pour `\halign` tableaux : `\tabskip` la colle est insérée avant et après le tableau (c.-à-d. à gauche et à droite) et entre les colonnes du tableau
* pour `\valign` tableaux : `\tabskip` la colle est insérée avant et après le tableau (c.-à-d. au-dessus et au-dessous) et entre les lignes du tableau

La valeur de `\tabskip` peut être définie à l’aide de la commande LaTeX `\setlength` commande :

`\setlength{\tabskip}{`$$\langle$$⁠`valeur de colle`⁠$$\rangle$$`}`

où $$\langle$$⁠`valeur de colle`⁠$$\rangle$$ peut être :

* une longueur fixe telle que `5pt`, `3mm`, ou
* une colle flexible finie telle que `3pt plus 2pt minus 1pt`, ou
* une colle infiniment flexible telle que `0pt plus1fill`.

Vous pouvez aussi définir directement `\tabskip` (en contournant `\setlength`) en écrivant

`\tabskip`=$$\langle$$⁠`valeur de colle`⁠$$\rangle$$

Cependant, toute modification de la valeur de `\tabskip` la colle n’affectera l’espacement du tableau que lorsque cette modification est :

* effectuée *avant* le `\halign` ou `\valign` par la commande à traiter, ou
* effectuée à l’intérieur du tableau $$\langle$$⁠`préambule`⁠$$\rangle$$

Les tentatives de définir des valeurs de `\tabskip` à l’intérieur du contenu du tableau (cellules dans le $$\langle$$⁠`corps`⁠$$\rangle$$) *ne changeront pas* l’espacement des `\halign` colonnes du tableau ou des `\valign` lignes du tableau. La raison de ce comportement de `\tabskip` peut être rattachée au rôle joué par le $$\langle$$⁠`préambule`⁠$$\rangle$$ pendant la composition des tableaux — des processus que nous explorerons plus tard en détail.

### Voir c’est croire

Pour aider à visualiser la présence des différents types d’espacement/colle utilisés dans la composition des tableaux, en particulier

* `\tabskip` colle
* `\baselineskip` colle
* l’espacement manuel (`\kern`)

Overleaf a préparé un projet basé sur LuaTeX pour coloriser les composants d’un tableau. LuaTeX a été choisi parce qu’il permet un retraitement bas niveau des données/structures internes des tableaux composés, mais nous n’explorerons pas ces détails ici.

Voici quelques exemples qui montrent diverses applications de `\tabskip`. Pour chaque exemple, nous montrerons le résultat réel et la version colorisée produite par LuaTeX.

### Exemple 1 de \tabskip

Examinons l’utilisation de `\tabskip` dans un `\halign` et `\valign` tableau. Nous montrerons les tableaux réellement composés, avec une bordure pour visualiser leur taille et leur espacement, ainsi que des graphiques annotés contenant des versions colorisées qui montrent clairement la taille des différentes colles/espacements dans chaque tableau.

Tout d’abord, la `\halign`:

```latex
% Pour visualiser l’étendue du tableau, nous allons lui mettre une bordure
\setlength{\fboxsep}{0pt} % Utilisez des bordures ajustées

% Ici, nous définissons \tabskip « directement »
\tabskip5pt % Définir la valeur initiale de \tabskip en dehors du tableau

% Pour mettre une bordure autour du tableau, il faut l’enregistrer dans une boîte TeX.
% Un \halign doit être placé dans une \vbox parce que \halign doit être
% traité en « mode vertical » : une \hbox ne fonctionnerait pas parce que
% elle est traitée en « mode horizontal »

\fbox{\vbox{\halign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
```

[Ouvrez cet exemple dans Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Tabskip+glue+in+an+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D+%25+sets+%5Cparindent+to+0pt%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+To+visualize+the+table%27s+extent+we%27ll+put+a+border+around+it+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D+%25+Use+close-fitting+borders%0A%0A%25+Here+we+set+%5Ctabskip+%22directly%22%0A%5Ctabskip5pt+%25+Set+the+initial+%5Ctabskip+value+outside+the+table%0A%0A%25+To+put+a+border+around+the+table+it+has+to+be+saved+to+a+TeX+box.%0A%25+An+%5Chalign+has+to+be+placed+in+a+%5Cvbox+because+%5Chalign+must+be+%0A%25+processed+in+a+%22vertical+mode%22%3A+an+%5Chbox+will+not+work+because%0A%25+that+is+processed+in+a+%22horizontal+mode%22%0A%0A%5Cfbox%7B%5Cvbox%7B%5Chalign%7B%0A%5Ctabskip10pt%23%26%0A%5Ctabskip15pt%23%26%0A%5Ctabskip20pt%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Cet exemple produit le résultat suivant :

![](/files/a2e379bda3ee9083a8a73b182fc6db196633039e)

Le graphique suivant est une version plus grande, colorisée et annotée du tableau produit par l’exemple précédent :

![](/files/f1a54e8fb61456661b076904ee16ef3bd320e61c)

Il y a 4 occurrences de la `\tabskip` commande, chacune correspondant à un emplacement particulier d’espacement dans le tableau :

1. `\tabskip5pt` est utilisé en dehors du tableau et définit la `\tabskip` valeur appliquée avant (à gauche de) la première cellule de chaque ligne.
2. `\tabskip10pt` est défini dans le premier modèle de cellule du $$\langle$$⁠`préambule`⁠$$\rangle$$ qui affecte l’espace entre $$\langle$$Cellule$${}\_1$$⁠$$\rangle$$ et $$\langle$$Cellule$${}\_2$$⁠$$\rangle$$ de chaque ligne.
3. `\tabskip15pt` est défini dans le deuxième modèle de cellule du $$\langle$$⁠`préambule`⁠$$\rangle$$ qui affecte l’espace entre $$\langle$$Cellule$${}\_2$$⁠$$\rangle$$ et $$\langle$$Cellule$${}\_3$$⁠$$\rangle$$ de chaque ligne.
4. `\tabskip20pt` est défini dans le troisième et dernier modèle de cellule du $$\langle$$⁠`préambule`⁠$$\rangle$$ qui affecte l’espace ajouté après $$\langle$$Cellule$${}\_3$$⁠$$\rangle$$, la dernière cellule de chaque ligne.

Ensuite, le `\valign`

```latex
\setlength{\fboxsep}{0pt} % Utilisez des bordures ajustées
\tabskip5pt % Définir la valeur initiale de \tabskip en dehors du tableau

% Conservez localement les modifications de \hsize (dans un groupe)
\begingroup
% \hsize détermine les largeurs des colonnes de \valign
\setlength{\hsize}{50pt}
% Parce que \valign peut être placé dans une \vbox ou une \hbox, nous pouvons utiliser
% \fbox directement
\fbox{\valign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
E&E&F\cr
G&H&I\cr
}}
\endgroup
```

[Ouvrez cet exemple dans Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D+%25+sets+%5Cparindent+to+0pt%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D+%25+Use+close-fitting+borders%0A%5Ctabskip5pt+%25+Set+the+initial+%5Ctabskip+value+outside+the+table%0A%0A%25+Keep+changes+to+%5Chsize+local+%28in+a+group%29%0A%5Cbegingroup%0A%25+%5Chsize+determines+the+%5Cvalign+column+widths%0A%5Csetlength%7B%5Chsize%7D%7B50pt%7D+%0A%25+Because+%5Cvalign+can+be+placed+in+a+%5Cvbox+or+%5Chbox+we+can+use+%0A%25+%5Cfbox+directly%0A%5Cfbox%7B%5Cvalign%7B%0A%5Ctabskip10pt%23%26%0A%5Ctabskip15pt%23%26%0A%5Ctabskip20pt%23%5Ccr%0AA%26B%26C%5Ccr%0AE%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Cet exemple produit le résultat suivant :

![](/files/8009fcdffa659722ca163ed414dbe0860dcdcf51)

Encore une fois, le graphique suivant est une version plus grande, colorisée et annotée du tableau produit par l’exemple précédent :

![](/files/e057e8d876a2f0b649b9bd8ad228208a259c6b74)

Comme pour l’ `\halign` exemple, il y a 4 occurrences de la `\tabskip` commande. Cependant, avec une `\valign` table \verb|\valign|, la `\tabskip` est insérée entre les lignes du tableau :

1. `\tabskip5pt` est utilisé en dehors du tableau et définit la `\tabskip` valeur appliquée avant (au-dessus de) la première cellule de chaque colonne.
2. `\tabskip10pt` est défini dans le premier modèle de cellule du $$\langle$$⁠`préambule`⁠$$\rangle$$ qui affecte l’espace entre $$\langle$$Cellule$${}\_1$$⁠$$\rangle$$ et $$\langle$$Cellule$${}\_2$$⁠$$\rangle$$ de chaque colonne.
3. `\tabskip15pt` est défini dans le deuxième modèle de cellule du $$\langle$$⁠`préambule`⁠$$\rangle$$ qui affecte l’espace entre $$\langle$$Cellule$${}\_2$$⁠$$\rangle$$ et $$\langle$$Cellule$${}\_3$$⁠$$\rangle$$ de chaque colonne.
4. `\tabskip20pt` est défini dans le troisième et dernier modèle de cellule du $$\langle$$⁠`préambule`⁠$$\rangle$$ qui affecte l’espace ajouté après $$\langle$$Cellule$${}\_3$$⁠$$\rangle$$, la dernière cellule de chaque colonne.

**Résumé/conclusions**

* Dans un `\halign` table \verb|\valign|, la `\tabskip` la colle est placée à gauche et à droite de chaque cellule d’une ligne, espaçant ainsi les colonnes du tableau.
* Dans un `\valign` table \verb|\valign|, la `\tabskip` la colle est placée au-dessus et au-dessous de chaque cellule d’une colonne, espaçant ainsi les lignes du tableau.

### \tabskip et \noalign

#### Utiliser un \halign

L'exemple suivant `\halign` exemple utilise `\tabskip` les colles et démontre aussi la `\noalign` commande, en l’utilisant pour placer des règles espacées au-dessus et au-dessous des lignes d’une `\halign` table. Ces règles sont composées à l’aide de la commande `\hrule` (primitive) ainsi que de l’espace créé par `\kern`:

```latex
\setlength{\tabskip}{5pt} % Définir \tabskip en dehors du tableau

\halign{
#&#&#&#&#\cr % Le <preamble>
\noalign{\hrule\kern2pt} % Règle espacée avant la ligne 1
1&2&3&4&5\cr % Ligne 1
\noalign{\kern2pt\hrule\kern2pt} % Règle espacée entre les lignes 1/2
6&7&8&9&10\cr % Ligne 2
\noalign{\kern2pt\hrule\kern2pt} % Règle espacée entre les lignes 2/3
11&12&13&14&15\cr % Ligne 3
16&17&18&19&20\cr % Ligne 4---aucune règle entre les lignes 3/4
\noalign{\kern2pt\hrule} % Règle espacée à la fin du tableau
}
```

[Ouvrez cet exemple dans Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D+%25+Set+%5Ctabskip+outside+of+the+table%0A%0A%5Chalign%7B%0A%23%26%23%26%23%26%23%26%23%5Ccr+%25+The+%3Cpreamble%3E%0A%5Cnoalign%7B%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+before+row+1%0A1%262%263%264%265%5Ccr+%25+Row+1%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+between+rows+1%2F2+%0A6%267%268%269%2610%5Ccr+%25+Row+2%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+between+rows+2%2F3+%0A11%2612%2613%2614%2615%5Ccr+%25+Row+3%0A16%2617%2618%2619%2620%5Ccr+%25+Row+4---no+rules+between+rows+3%2F4%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%7D+%25+Space+rule+at+table+end%0A%7D%0A%5Cend%7Bdocument%7D)

Cet exemple produit le tableau ci-dessous, qui a été ensuite annoté pour reproduire le code (La)TeX et les numéros (1) à (4) afin d’énumérer les `\noalign` commandes, contenant des règles et des kerns, ainsi que leur résultat typographié correspondant :

![](/files/e0ca113edefeb23f74a6dbadc0deb1c6023c3961)

Le graphique suivant montre une version colorisée du tableau, étiquetée pour montrer les différents espacements/colles dans le tableau :

![](/files/00307f272fff803b4a69906c82daa145afc15caa)

Notez ce qui suit :

* l’utilisation de `\noalign` pour insérer des règles entre certaines lignes et l’utilisation manuelle de `\kern` valeurs pour ajouter un peu d’espace avant/après les règles. Les moteurs TeX n’insèrent pas `\baselineskip` de colle à la suite d’une règle composée, c’est pourquoi l’espace est inséré manuellement à l’aide de `\kern` (d’autres commandes d’espacement pourraient être utilisées) ;
* `\baselineskip` de la colle a été insérée automatiquement entre les lignes 3 et 4.

#### Utilisation d’une \valign

L'exemple suivant `\valign` exemple utilise les mêmes données que le précédent `\halign`:

```latex
\begingroup
\setlength{\parindent}{10pt}
\setlength{\hsize}{50pt}
\setlength{\tabskip}{5pt}
\valign{
#&#&#&#&#\cr
\noalign{\vrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\vrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\vrule\kern2pt}
11&12&13&14&15\cr
16&17&18&19&20\cr
\noalign{\kern2pt\vrule}
}
\endgroup
```

[Ouvrez cet exemple dans Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Cbegingroup%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Csetlength%7B%5Chsize%7D%7B50pt%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%5Cvalign%7B%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A11%2612%2613%2614%2615%5Ccr%0A16%2617%2618%2619%2620%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Cet exemple produit le tableau ci-dessous, qui a été ensuite annoté pour reproduire le code (La)TeX et les numéros (1) à (4) afin d’énumérer les `\noalign` commandes, contenant des règles et des kerns, ainsi que leur résultat typographié correspondant :

![](/files/547169b48975a03df701d183ba0c2f862563cbcc)

![](/files/c10ac0945ae2beb4235bd4d44c94b3164a050696)

### Une table \valign avec des lignes de texte

L’exemple suivant

```latex
\setlength{\tabskip}{5pt}
\begingroup % Conserver localement les modifications de \parindent et \hsize
\setlength{\parindent}{10pt}
\setlength{\hsize}{75pt}
\valign{
#&#&#\cr
\noalign{\vrule\kern5pt}
\TeX{} peut composer des tableaux très complexes
tables.&Voici un peu de texte supplémentaire
text.&Et, enfin, une ligne supplémentaire
dans cette colonne.\cr
\noalign{\kern5pt\vrule\kern5pt}
A&B&C\cr
\noalign{\kern5pt\vrule\kern5pt}
D&E&F\cr
G&H&I\cr
\noalign{\kern5pt\vrule}
}
\endgroup
```

[Ouvrez cet exemple dans Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+valign+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D16cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%5Cbegingroup+%25+Keep+changes+to+%5Cparindent+and+%5Chsize+local%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Csetlength%7B%5Chsize%7D%7B75pt%7D%0A%5Cvalign%7B%0A%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern5pt%7D%0A%5CTeX%7B%7D+can+typeset+very+complex%0Atables.%26Here%27s+a+bit+of+extra+%0Atext.%26And%2C+finally%2C+an+extra+line%0Ain+this+column.%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%5Ckern5pt%7D%0AA%26B%26C%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%5Ckern5pt%7D%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Cet exemple produit le résultat suivant :

## Définir les largeurs de ligne et les hauteurs de colonne

## Plus d’informations sur la table $$\langle$$⁠préambule⁠$$\rangle$$


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/fr/articles-approfondis/15-how-do-tex-engines-typeset-tables-2.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
