> 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/47-tex-tables-how-tex-calculates-spanned-column-widths.md).

# Tableaux TeX : comment TeX calcule la largeur des colonnes fusionnées

## Le but de cet article

Dans cet article, nous explorons comment $$\mathrm\TeX$$ calcule les largeurs des colonnes de tableaux lorsque les tableaux contiennent des entrées (par ex., des en-têtes de tableau) qui s'étendent sur plusieurs colonnes (par ex., en utilisant la $$\mathrm\TeX$$ primitives `\omit` et `\span`). En utilisant un simple [tableau « de référence »](#reference-table) comme point de départ, nous créons une série d’exemples — dérivés de ce tableau de référence — en modifiant diverses entrées pour créer des colonnes fusionnées. En examinant l’effet de ces modifications, nous pouvons commencer à comprendre l’algorithme sous-jacent que $$\mathrm\TeX$$ utilise pour calculer la largeur des colonnes fusionnées.

### En utilisant $$\mathrm\TeX$$ pas $$\mathrm\LaTeX$$

Pour examiner et expliquer *comment* $$\mathrm\TeX$$ décide les largeurs des colonnes fusionnées, il est nécessaire de se passer de tous les merveilleux $$\mathrm\LaTeX$$ paquets de tableaux et de revenir aux commandes fondamentales de création de tableaux, de bas niveau (primitives) : en particulier, `\halign{...}`, `\span` et `\omit`. [Les $$\mathrm\TeX$$/$$\mathrm\LaTeX$$ paquets de tableaux](https://ctan.org/topic/table) sont bien sûr des outils de productivité essentiels et offrent une multitude de fonctionnalités extrêmement utiles qui permettent aux utilisateurs de produire rapidement une vaste gamme de tableaux en utilisant $$\mathrm\LaTeX$$. Ces paquets fournissent un « échafaudage macro » essentiel construit autour du comportement de bas niveau de $$\mathrm\TeX$$et leurs développeurs fournissent des abstractions et des couches d’isolation bienvenues qui prennent en charge les complexités sous-jacentes. Beaucoup de ces paquets sont de véritables prouesses de programmation complexe $$\mathrm\TeX$$ programmation : nous devrions tous être reconnaissants qu’ils existent pour nous éviter d’avoir à utiliser du $$\mathrm\TeX$$!

L’algorithme réel que $$\mathrm\TeX$$ utilise pour calculer les largeurs des colonnes fusionnées est expliqué à la page 245 du [$$\mathrm\TeX\text{book}$$](https://www.amazon.co.uk/TeXbook-Donald-E-Knuth/dp/0201134489) et, avec plus de détails, dans la section 801 (page 336) du livre imprimé contenant $$\mathrm\TeX$$le code source de [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373). Cependant, pour beaucoup de personnes (moi y compris), les explications de Knuth sont, à l’occasion, plutôt compactes et succinctes et, parfois, elles peuvent être difficiles à suivre en détail : des exemples illustrés sont toujours très utiles.

### Oui, les tableaux sont complexes

Dans la section 768 (page 322) du livre [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373), Knuth fait un commentaire intéressant :

> « C’est un peu un miracle chaque fois que `\halign` et `\valign` fonctionnent, parce qu’ils coupent à travers tant de structures de contrôle de $$\mathrm\TeX$$.»

De plus, le volume IV de la série de livres en quatre volumes [$$\mathrm\TeX\text{ in Practice}$$](https://www.amazon.co.uk/Tex-Practice-Set-Stephan-Bechtolsheim/dp/038797296X/ref=sr_1_11?s=books\&ie=UTF8\&qid=1504256043\&sr=1-11\&keywords=TeX+in+Practice) consacre pas moins de 180 pages (pp. 199–379) à la création de tableaux en $$\mathrm\TeX$$ via `\halign` et `\valign`.

On peut donc observer sans risque que $$\mathrm\TeX$$ les tableaux sont effectivement « assez délicats ».

### Colonnes fusionnées : \omit, \span et \multispan

Comme indiqué, pour explorer $$\mathrm\TeX$$les calculs de largeur de colonne de $$\mathrm\TeX$$; ce que cela signifie est une combinaison de commandes primitives et d’un $$\text{Plain }\mathrm\TeX$$ macro appelée `\multispan`. Bien que nous n’utiliserons pas ces commandes pour illustrer directement nos tableaux (par ex., expliquer entièrement tout le $$\mathrm\TeX$$ code), il vaut la peine d’inclure une brève note les expliquant :

* `\halign`: L’une des deux $$\mathrm\TeX$$ primitives (commandes) pour créer des tableaux. L’autre est `\valign` mais elle n’est pas aussi largement utilisée et ne sera pas abordée dans cet article.
* `\omit`: Une $$\mathrm\TeX$$ primitive (commande) qui ordonne à $$\mathrm\TeX$$ d’ignorer le modèle du préambule d’une entrée de tableau.
* `\span`: Une $$\mathrm\TeX$$ primitive (commande) utilisée pour combiner deux entrées adjacentes d’un tableau.
* `\multispan{n}`: Une $$\mathrm\TeX$$ macro simple permettant de fusionner `n` colonnes.

En substance, pour fusionner des colonnes $$\mathrm\TeX$$ ignore le nombre approprié de modèles de préambule de tableau et combine le nombre requis d’entrées de tableau en une seule entrée. `\multispan{n}` fonctionne en se développant en la séquence de `\omit` et `\span` jetons nécessaires pour fusionner `n` colonnes. Par exemple, `\multispan{3}` se développe en `\omit\span\omit\span\omit`.

## Présentation de notre tableau « de référence »

Voici notre tableau de référence suivi d’une version annotée qui explique les éléments utilisés dans sa construction :

![{{{alt}}}](/files/3bf789eff9573c135c0144c59becf8c0e547f061)

En modifiant notre tableau de référence, nous observerons ce qui arrive à la largeur du tableau et à la largeur des colonnes individuelles à mesure que nous ajoutons des entrées qui s’étendent sur plusieurs colonnes. Ce tableau de référence a été produit en $$\mathrm\TeX$$ avec l’aide de `\halign{...}` la primitive, ainsi qu’un certain nombre de macros personnalisées nécessaires pour composer les tableaux — nous n’aborderons pas ces macros car elles ne sont pas essentielles à la compréhension des exemples et des explications.

Voici une version annotée de notre tableau de référence pour expliquer ses caractéristiques :

![{{{alt}}}](/files/ecccdf995d3987fb8bdd2546aa9683b2bed43697)

Notre premier ensemble de tableaux d’exemple, ainsi que le tableau de référence initial, ont tous été réglés sur `\tabskip=0pt` de sorte que $$\mathrm\TeX$$ n’ajoute aucun espace entre nos colonnes : en pratique, elles se touchent toutes. La raison de cela est de simplifier la discussion initiale et les calculs qui s’ensuivent — plus loin dans l’article, nous réintroduisons un `\tabskip` glue non nul pour examiner son effet sur le calcul des largeurs de colonnes fusionnées.

Comme indiqué dans les annotations, nous avons ajouté un petit espace blanc (5pt) au début de toutes les entrées de tableau non fusionnées (sauf la première ligne). Cet espace blanc de 5pt fait partie de la largeur totale de toutes les entrées non fusionnées (sauf la première ligne) et a été ajouté simplement pour rendre le tableau un peu moins encombré.

### Brève note sur les largeurs des tableaux

Le `\halign{...}` commande a trois formes :

* `\halign{...}`: définir le tableau à la largeur que $$\mathrm\TeX$$ calcule, en fonction de la taille des entrées (et du `\tabskip` glue) ;
* `\halign to *width* {...}`: ordonne à $$\mathrm\TeX$$ de composer le tableau à une `*largeur*`;
* `\halign spread *amount*{...}`: ajuster la largeur calculée de `*amount*`.

Lorsque $$\mathrm\TeX$$ compose un tableau en utilisant `\halign{...}` il doit lire l’intégralité du tableau en mémoire afin d’effectuer les divers calculs nécessaires à sa composition. Par conséquent, à moins que vous n’ayez spécifié la largeur en utilisant `\halign to *width* {...}` vous ne pouvez pas connaître la largeur finale tant que $$\mathrm\TeX$$ n’a pas fini de le traiter (de le composer). Une façon d’obtenir la largeur d’un tableau produit par `\halign{...}` consiste d’abord à composer le tableau à l’intérieur d’une `\vbox{...}` (par ex., `\setbox0=\vbox{\halign{...}}`) puis, par exemple, utiliser `\the\wd0` pour obtenir la largeur.

### Pas de coupure automatique des lignes dans les entrées de tableau

Il est important de noter que lorsque $$\mathrm\TeX$$ compose un tableau créé avec `\halign{...}` tout texte à l’intérieur des entrées de tableau n’est pas soumis automatiquement à la coupure des lignes : les entrées de tableau sont composées en *mode horizontal restreint*—tout comme un `\\hbox`. Pour activer la coupure des lignes, le texte d’une entrée de tableau doit être placé à l’intérieur d’une `\vbox{...}` en utilisant en plus une valeur appropriée pour `\hsize` à l’intérieur de cette `\vbox{...}`. Notez toutefois que le texte à l’intérieur d’un `\noalign{...}` commande (une $$\mathrm\TeX$$ primitive) utilisée dans un `\halign{...}` est soumis à la coupure de ligne de $$\mathrm\TeX$$’s line-breaking. En pratique, et comme son nom l’indique, `\noalign{...}` permet à $$\mathrm\TeX$$ de « s’échapper » du `\halign{...}` et de placer du contenu entre les lignes du tableau — généralement pour produire des filets horizontaux entre les lignes.

### Interdit : \halign{...} à l’intérieur de \hbox{...}

Vous ne pouvez pas *éditant* composer un `\halign{...}` à l’intérieur d’un `\hbox{...}`. Tenter d’utiliser `\hbox{\halign{...}}` produira une erreur assez déroutante :

```latex
! Missing } inserted.
<texte inséré>
                }
<à relire>
                   \halign
l.1 \hbox{\halign
```

#### Une explication de cette erreur

En raison du `\hbox{...}` $$\mathrm\TeX$$ englobeur, *mode horizontal restreint*est en `\halign{...}` ce qui est une commande de *mode vertical.* Par exemple, si vous utilisez `\halign{...}` dans un paragraphe, $$\mathrm\TeX$$ mettra fin au paragraphe, traitera le `\halign{...}` puis poursuivra avec le reste du paragraphe.

Lorsqu’il est utilisé à l’intérieur d’un `\hbox{...}`, la `\halign{...}` déclenche $$\mathrm\TeX$$ pour essayer de revenir au mode vertical en tentant de forcer la fermeture du groupe en cours : $$\mathrm\TeX$$ signale un «`! Missing }`» et émet une erreur parce qu’il pense que vous avez fait une erreur dans votre utilisation du groupement. Bien qu’une accolade fermante (`}`) puisse ne pas manquer dans votre $$\mathrm\TeX$$ code, le message d’erreur est un symptôme du `\hbox{...}` qui « se met en travers » et $$\mathrm\TeX$$ qui fait sa « meilleure estimation » de la marche à suivre appropriée pour résoudre le problème.

## Exemples de tableaux avec colonnes fusionnées

La séquence suivante de figures de tableaux fournit une gamme d’exemples pour démontrer l’effet de la fusion de colonnes de tableau : elle indique que des entrées de tableau longues peuvent avoir des résultats inattendus sur la largeur de certaines colonnes — et, par conséquent, sur la largeur du tableau lui-même. La question à laquelle nous allons répondre est : que fait $$\mathrm\TeX$$ lorsqu’une entrée de tableau particulière s’étend sur un certain nombre de colonnes mais qu’elle est « trop large pour tenir » ? Comme indiqué ci-dessus, $$\mathrm\TeX$$ applique bel et bien un algorithme spécifique à ce problème de calcul des largeurs de colonnes : les exemples suivants sont conçus pour aider à se faire une idée du fonctionnement de cet algorithme.

### Tableau d’exemple 1

Dans cet exemple, nous utilisons `\multispan{2}` pour fusionner les colonnes 1 et 2 avec une entrée dont le texte est **Un en-tête de tableau**:

![{{{alt}}}](/files/e46d7f1864d2a123acc02d35079f4c2f7700f9ac)

#### Observations

* La largeur de ce tableau est la même que celle du tableau de [référence](#reference-table): $$327.71722\text{pt}$$.
* La largeur de l’entrée qui fusionne les colonnes 1 et 2 est $$81.04953\text{pt}$$ ce qui est inférieur à la largeur totale des entrées des colonnes qu’elle fusionne : $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$

## Tableau d’exemple 2

Comme dans [Tableau d’exemple 1](#example-table-1), cet exemple utilise également `\multispan{2}` pour fusionner les colonnes 1 et 2, mais ici nous utilisons une entrée plus longue dont le texte est **Un en-tête de tableau légèrement plus long**.

![{{{alt}}}](/files/9feec8993f19e7e4aa11298fc220b892962d01e2)

#### Observations

Si vous comparez cet exemple à notre [référence](#reference-table) nous pouvons constater ce qui suit :

* La largeur de ce tableau a augmenté de $$327.71722\text{pt}$$ à $$374.37032\text{pt}$$: soit un total de $$46.6531\text{pt}$$.
* La largeur de l’entrée qui fusionne les colonnes 1 et 2 ($$156.28664\text{pt}$$) est supérieure à la largeur totale des entrées des colonnes qu’elle fusionne : $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$. Cette différence est de $$156.28664\text{pt}-109.63355\text{pt} = 46.6531\text{pt}$$ , ce qui est le même montant que l’augmentation de la largeur du tableau.
* $$\mathrm\TeX$$ a ajusté la largeur de la colonne 2 pour fournir l’espace supplémentaire nécessaire. Plus tard, nous verrons comment $$\mathrm\TeX$$ calcule le montant de l’augmentation de la colonne 2.
* La colonne 1 n’est pas affectée : sa largeur n’a pas été modifiée par l’entrée qui fusionne les colonnes 1 et 2.

### Tableau d’exemple 3

Dans cet exemple, nous utilisons `\multispan{3}` pour fusionner les colonnes 1 à 3 avec une entrée dont le texte est le même que [Tableau d’exemple 2](#example-table-2): **Un en-tête de tableau légèrement plus long**.

![{{{alt}}}](/files/431129143ad480e30e046a703fd21ce121935413)

#### Observations

* La largeur de ce tableau est la même que celle du tableau de [référence](#reference-table): $$327.71722\text{pt}$$.
* La largeur de l’entrée qui fusionne les colonnes 1 à 3 ($$156.28664\text{pt}$$) est inférieure à la largeur totale des entrées dans les trois colonnes qu’elle fusionne : $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} = 168.67254\text{pt}$$.
* Aucune des largeurs de colonnes n’a été affectée par l’entrée fusionnant les colonnes 1 à 3.

Commencez-vous à voir émerger un schéma ?

### Tableau d’exemple 4

Comme pour [Tableau d’exemple 3](#example-table-3), ici nous utilisons `\multispan{3}` pour fusionner les colonnes 1 à 3, mais cette fois avec une entrée dont le texte est considérablement plus long : **Un en-tête de tableau considérablement plus long qui s’étend très loin**.

![{{{alt}}}](/files/fb98e4cec846c9abb5ebd244deeca1f1eb1ced61)

#### Observations

* Comparé au [référence](#reference-table), la largeur de ce tableau a augmenté de $$327.71722\text{pt}$$ à $$465.95685\text{pt}$$: une augmentation de $$138.23963\text{pt}$$.
* La largeur de l’entrée qui fusionne les colonnes 1 à 3 est $$306.91216\text{pt}$$.
* La largeur totale des entrées dans les trois colonnes fusionnées est $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} = 168.67254\text{pt}$$.
* La différence de largeur entre la longue entrée fusionnée et les entrées des colonnes 1 à 3 est $$306.91216\text{pt}-168.67254\text{pt}=138.23962\text{pt}$$. Le même montant (à 4 décimales près !) que celui de l’augmentation de la largeur du tableau.
* Seule la largeur de la colonne 3 a augmenté : ni la colonne 1 ni la colonne 2 ne sont affectées.

#### Un schéma émerge

Si nous examinons [Tableau d’exemple 2](#example-table-2) et [Tableau d’exemple 4](#example-table-4) nous pouvons voir que, dans les deux cas, c’est la **dernière colonne de l’étendue** qui a vu sa largeur augmenter pour laisser de la place à la longue entrée qui s’étendait sur les colonnes :

* Dans [Tableau d’exemple 2](#example-table-2): La longue entrée s’étendait sur les colonnes 1 et 2. La colonne 2 est devenue « étirée ».
* Dans [Tableau d’exemple 4](#example-table-4): La longue entrée s’étendait sur les colonnes 1 à 3. La colonne 3 est devenue « étirée ».

#### La largeur de la colonne 3 : un algorithme émerge-t-il ?

Les calculs suivants donnent une indication plus claire de ce que $$\mathrm\TeX$$ fait. Voici ce que nous savons :

* La largeur de la longue entrée s’étendant sur les colonnes 1 à 3 est $$306.91216\text{pt}$$.
* La largeur totale des entrées dans les colonnes 1 et 2 est $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$.

Quelle est la différence entre ces valeurs ? Elle est de $$306.91216\text{pt}-109.63355\text{pt} = 197.2786\text{pt}$$ et c’est la largeur utilisée pour la colonne 3 : elle découle directement de l’algorithme utilisé par $$\mathrm\TeX$$.

### Tableau d’exemple 5

Avant d’arriver à un exemple plus compliqué, voici encore un exemple « simple ». Ce tableau contient la même longue entrée que [Tableau d’exemple 4](#example-table-4): **Un en-tête de tableau considérablement plus long qui s’étend très loin**; cependant, cette fois nous utilisons `\multispan{6}` ce qui permet à cette entrée de s’étendre sur tout le tableau. Comme vous pouvez le voir, le tableau résultant a toujours la même largeur que notre [référence](#reference-table) ($$327.71722\text{pt}$$) ce qui signifie qu’aucune colonne n’a été affectée par cette entrée très longue. De toute évidence, c’est parce que la largeur de l’entrée ($$306.91216\text{pt}$$) est inférieure à la largeur totale de toutes les entrées qu’elle traverse : $$327.71722\text{pt}$$; c’est-à-dire la largeur du tableau.

![{{{alt}}}](/files/54c5cef8d7f9589338484ed7c67fb3dd41f219dd)

### Tableau d’exemple 6 : un peu plus compliqué

Ici, nous examinons une série de trois tableaux d’exemple (6(a)–6(c)) pour montrer l’effet de deux entrées différentes qui s’étendent toutes deux jusqu’à la colonne 5. [Tableau d’exemple 6(a)](#example-table-6a) et [Tableau d’exemple 6(b)](#example-table-6b) montrent chacun un tableau contenant une seule entrée qui s’étend sur plusieurs colonnes jusqu’à la colonne 5. [Tableau d’exemple 6(c)](#example-table-6c) combine les deux entrées fusionnées dans un seul tableau et pose la question : quelle entrée détermine en réalité la largeur de la colonne 5, et pourquoi ? La réponse nous amène à l’essence de l’algorithme utilisé par $$\mathrm\TeX$$.

#### Tableau d’exemple 6(a)

![{{{alt}}}](/files/ed6f409d6cf0c15218af3bac311f1c6485458ccb)

**Observations**

* Comparé au [référence](#reference-table), la largeur de ce tableau a augmenté de $$327.71722\text{pt}$$ à $$371.11153\text{pt}$$: une augmentation de $$43.39431\text{pt}$$.
* La largeur de l’entrée qui fusionne les colonnes 3 à 5 est $$215.06683\text{pt}$$.
* La largeur totale des entrées dans les colonnes 3 à 5 est $$59.03899\text{pt} + 52.98344\text{pt} + 59.6501\text{pt} = 171.67253\text{pt}$$.
* La différence de largeur entre les entrées fusionnées dans les colonnes 3 à 5 et la largeur de l’entrée fusionnée est $$215.06683\text{pt}-171.67253\text{pt}=43.3943\text{pt}$$: le montant exact (à 4 décimales près !) de l’augmentation de la largeur du tableau.

#### Tableau d’exemple 6(b)

![{{{alt}}}](/files/ae966fc968eb6010fb07779b8012c014d50d7422)

**Observations**

* Comparé au [référence](#reference-table), la largeur de ce tableau a augmenté de $$327.71722\text{pt}$$ à $$353.3233\text{pt}$$: une augmentation de $$25.60608\text{pt}$$.
* La largeur de l’entrée qui fusionne les colonnes 1 à 5 est $$306.91216\text{pt}$$.
* La largeur totale des entrées dans les colonnes 1 à 5 est $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} + 52.98344\text{pt} + 59.6501\text{pt} = 281.30608\text{pt}$$.
* La différence de largeur entre les entrées fusionnées dans les colonnes 1 à 5 et la largeur de l’entrée fusionnée est $$306.91216\text{pt}-281.30608\text{pt}=25.60608\text{pt}$$: **note** c’est *inférieur* à la valeur calculée pour [l’Exemple 6(a)](#example-table-6a), qui était $$43.3943\text{pt}$$.

#### Tableau d’exemple 6(c)

Ici, nous combinons les entrées des tableaux d’exemple [6(a)](#example-table-6a) et [6(b)](#example-table-6b) dans un seul tableau : que se passe-t-il ?

![{{{alt}}}](/files/d28e38d127afae9264072a8a2faeb6ab856bec1f)

**Observation**

* Comparé au [référence](#reference-table), la largeur de ce tableau a augmenté de $$327.71722\text{pt}$$ à $$371.11153\text{pt}$$: une augmentation de $$43.39431\text{pt}$$. Nous notons que c’est exactement la même chose que [Tableau d’exemple 6(a)](#example-table-6a).

#### Que fait $$\mathrm\TeX$$ ?

Pour comprendre les résultats de $$\mathrm\TeX$$les processus algorithmiques et décisionnels, nous notons que cette entrée

![{{{alt}}}](/files/4626a7af42c3fa10e14c5af3df5096e6db77ab74)

dépasse les entrées fusionnées par $$25.60608\text{pt}$$; cependant, cette entrée

![{{{alt}}}](/files/78a9716a837bf1f78da0810baa2e4ef7acf2c810)

dépasse encore davantage les entrées fusionnées : de $$43.3943\text{pt}$$. Ainsi, cette entrée « gagne la course » et la largeur de la colonne 5 est augmentée du **maximum** de ces deux valeurs ($$43.3943\text{pt}$$). La largeur de la colonne 5 devient maintenant $$59.6501\text{pt} + 43.3943\text{pt} = 103.0444\text{pt}$$ pour accueillir l’entrée qui s’étend sur les colonnes 3 à 5. Notre description de la séquence exacte des « événements » est légèrement simplifiée, mais le résultat est comme nous l’avons décrit.

## Revenir à un peu de complexité

Afin de minimiser la complexité de nos discussions (jusqu’à présent), nous avons utilisé des exemples relativement simples pour démontrer les principes de $$\mathrm\TeX$$l’algorithme de `\tabskip=0pt`; en particulier, nous avons réglé `\tabskip` . En pratique, les tableaux du « monde réel » auront probablement de nombreuses entrées qui s’étendent sur une gamme de colonnes et, bien sûr, auront des valeurs non nulles pour le

### glue \tabskip et les largeurs de colonnes fusionnées

La conception des tableaux nécessite souvent l’ajout d’espace blanc entre les colonnes et, bien sûr, $$\mathrm\TeX$$ dispose de cette fonctionnalité grâce à une commande primitive appelée `\tabskip`. Cette commande peut être utilisée pour mettre du glue fixe ou flexible (espacement) :

* avant un tableau (c.-à-d. à gauche de la colonne 1) ;
* entre une ou plusieurs colonnes ;
* après le tableau (c.-à-d. à droite de la dernière colonne).

Voici un exemple pour nous rafraîchir la mémoire :

![{{{alt}}}](/files/5b17e0a824076529dd0afd1236f4f342b3f2c1a7)

### Comment le glue \tabskip affecte-t-il les largeurs des colonnes fusionnées ?

La présence d’un `\tabskip` glue non nul entre les colonnes fournit un espace supplémentaire que les entrées fusionnées peuvent « absorber » avant que $$\mathrm\TeX$$ ne doive penser à augmenter la largeur de la dernière colonne d’une fusion.

Dans notre prochain exemple, nous utiliserons deux tableaux pour comparer les résultats de la fusion de deux colonnes. La seule différence entre les tableaux est l’utilisation de `\tabskip` glue.

* Le premier exemple utilise notre tableau « de référence » original qui, si vous vous en souvenez, a réglé `\tabskip=0pt`.
* Le deuxième exemple utilise une version modifiée de notre [référence](#reference-table) (annotée ci-dessus) qui a `\tabskip=10pt` avant et après le tableau mais, plus important encore, a réglé `\tabskip=20pt` entre les colonnes.

Dans le *tableau de référence modifié* les deux colonnes fusionnées n’ont aucun effet sur les largeurs des colonnes (et la largeur du tableau), mais elles affectent la largeur de la colonne 2 (et la largeur du tableau) dans le *original* [référence](#reference-table).

### Tableau de référence original : \tabskip=0pt

Ici, nous montrons notre [référence](#reference-table) original [référence](#reference-table)ainsi qu’un deuxième tableau (dérivé de notre origina&#x6C;**) qui a une entrée «**&#x54;estez un en-tête de tableau plus long

![{{{alt}}}](/files/feb5e6dc4e8fc7f5530d36700c19e9f41971508f)

### » s’étendant sur les colonnes 1 et 2. Très clairement, la colonne 2 (du deuxième tableau dans le schéma) et donc tout le tableau sont tous deux affectés par les colonnes fusionnées.

Tableau de référence modifié : \tabskip=20p&#x74;**) qui a une entrée «**&#x49;ci, nous montrons notre tableau de référence modifié ainsi qu’un deuxième tableau (dérivé de notre tableau de référence modifié) qui a lui aussi une entrée « `\tabskip` » s’étendant sur les colonnes 1 et 2. Très clairement, dans le deuxième tableau du schéma, ni la largeur de la colonne 2 ni celle du tableau ne sont affectées par les colonnes fusionnées. Dans ce cas, la présence de`20pt`glue (

![{{{alt}}}](/files/9ed596e8411d02ac3e730dd3abe68ad96d45e46e)

## L’essence de $$\mathrm\TeX$$l’algorithme de

Nous l’espérons, la série d’exemples présentés ci-dessus a aidé à développer une « intuition » de ce que $$\mathrm\TeX$$ fait pour accueillir les entrées fusionnées et comment $$\mathrm\TeX$$ ajustera, si nécessaire, la largeur de la **dernière** colonne à l’intérieur de chaque ensemble de colonnes fusionnées. En plus de la largeur des entrées dans les colonnes individuelles fusionnées, la présence d’un `\tabskip` glue non nul est un facteur important que $$\mathrm\TeX$$ prend en compte lorsqu’il décide s’il doit ajuster des largeurs de colonnes. Le point clé à retenir est que $$\mathrm\TeX$$l’objectif de **dernière colonne** dans chaque plage de colonnes fusionnées.

### Exemple final de tableau : dernières colonnes dans une plage fusionnée

Dans cet exemple final, nous réutilisons une fois de plus notre tableau de référence modifié (avec `\tabskip` les valeurs de colle discutées ci-dessus) pour en dériver un autre tableau qui contient diverses colonnes fusionnées par des règles — nous avons utilisé des règles pour rendre les fusions plus faciles à voir.

Les deux tableaux ont été soigneusement alignés pour montrer que, dans le tableau du haut, aucune colonne antérieure à la colonne 5 n’a été affectée par les colonnes fusionnées. La zone vert foncé à gauche du schéma montre que les colonnes 1 à 4 des deux tableaux s’alignent toujours parfaitement. À droite, une zone ombrée en vert plus clair montre que seules les colonnes 5 et 6 ont été affectées par les entrées fusionnées.

Dans le tableau du haut, les fusions sont les suivantes :

* colonnes 1 à 5 : fusionnées par une $$400\text{pt}$$ règle ;
* colonnes 3 à 5 : fusionnées par une $$200\text{pt}$$ règle ;
* colonnes 4 à 6 : fusionnées par une $$250\text{pt}$$ règle.

![{{{alt}}}](/files/270e80c097d01e4c4d566b38fbf503b6aa0443b6)

Une fois encore, l’explication est que dans une série de colonnes fusionnées, seule la largeur de la dernière colonne est ajustée (si nécessaire) : les colonnes intermédiaires ne sont pas affectées et, ici, cela signifie les colonnes 1 à 4 — bien entendu, la largeur des colonnes 1 à 4 (et des colonnes intermédiaires `\tabskip` de colle) est prise en compte lors du calcul des largeurs ajustées des colonnes 5 et 6.

### Une présentation pas à pas de $$\mathrm\TeX$$l’algorithme de

Nous conclurons par une *simplifiée* présentation pas à pas de «$$\mathrm\TeX$$des processus de pensée de » lorsqu’il calcule les largeurs des colonnes dans les entrées fusionnées. Décrire $$\mathrm\TeX$$les algorithmes de » n’est pas toujours simple, donc nous nous autoriserons quelques « libertés artistiques simplificatrices » pour donner un aperçu de ce qui se passe. Les lecteurs intéressés par tous les détails compliqués sont renvoyés à la section 801 (page 336) du livre imprimé contenant $$\mathrm\TeX$$le code source de [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373).

Les tableaux du monde réel sont souvent créés avec de nombreuses utilisations de la `\span` primitive (par ex. à l’intérieur de $$\mathrm\LaTeX$$ paquets) pour construire de multiples occurrences de colonnes fusionnées dans le tableau. Pour gérer cela, les structures de $$\mathrm\TeX$$données (au plus profond de *nœuds de fusion*) qui indiquent $$\mathrm\TeX$$ les liens (fusions) entre les entrées/colonnes du tableau. De toute évidence, $$\mathrm\TeX$$ doit appliquer ses algorithmes de manière systématique et devra traiter l’ensemble du tableau pour effectuer ses calculs finaux — déterminer toutes les largeurs de colonnes, la largeur totale du tableau et, si nécessaire, la quantité de laquelle les colles souples utilisées dans le tableau doivent s’étirer ou se rétracter. Il n’est pas vraiment surprenant que $$\mathrm\TeX$$ ne puisse pas vous indiquer la largeur finale du tableau avant d’avoir entièrement traité la `\halign{...}` commande — il a vraiment beaucoup de travail à faire !

Le point de départ des calculs de largeur de colonne est la colonne 1, car, bien sûr, rien ne peut s’étendre depuis la gauche de (et *à travers/dans*) la colonne 1. $$\mathrm\TeX$$ commence par déterminer la largeur de la colonne 1 en déterminant quelle entrée a la largeur naturelle maximale *naturelle*. Appelons cette largeur maximale $$w\_1$$et s’il existe des entrées qui s’étendent de la colonne 1 à la colonne 2, appelons la largeur de cette entrée $$w\_{12}$$ (largeur de 1 à 2). De plus, nous noterons la `\tabskip` colle entre les colonnes 1 et 2 comme $$t\_{1}$$—notez que nous ne considérons que la *naturelle* de cette `\tabskip` colle et, pour l’instant, en ignorant tout composant d’étirement ou de rétrécissement qu’elle pourrait posséder. De plus, soit la largeur naturelle maximale de toutes les entrées non fusionnées de la colonne 2 $$w\_2$$.

Le point essentiel à noter est que $$\mathrm\TeX$$ tente de calculer la largeur de la colonne 2 en ne considérant que les entrées dont la fusion *commence* à la colonne 1 et *se termine* à la colonne 2. Le critère essentiel pour $$\mathrm\TeX$$ est le test $$\max(w\_{2}, w\_{12} - (w\_1+ t\_1))$$—il peut y avoir plusieurs entrées s’étendant sur les colonnes 1 et 2 : certaines peuvent être étroites (petite $$w\_{12}$$), d’autres très larges (grande $$w\_{12}$$) donc $$\mathrm\TeX$$ recherche celle qui a le plus grand effet (d’où la $$\max(\text{...})$$). Ici, la valeur de $$w\_{12} -(w\_1+ t\_1)$$ est la quantité de laquelle une entrée s’étendant sur les colonnes 1 et 2 « déborde » de la colonne 1 vers la colonne 2 : notez que $$\mathrm\TeX$$ utilise la largeur de la colonne 1 **et** le `\tabskip` » s’étendant sur les colonnes 1 et 2. Très clairement, dans le deuxième tableau du schéma, ni la largeur de la colonne 2 ni celle du tableau ne sont affectées par les colonnes fusionnées. Dans ce cas, la présence de$$t\_{1}$$) entre les colonnes 1 et 2. Une fois $$\mathrm\TeX$$ a déterminé si des fusions allant de la colonne 1 à 2 affectent ou non la largeur de la colonne 2, il fixe la largeur de la colonne 2 à la valeur maximale qu’il a déterminée (en utilisant le test décrit). $$\mathrm\TeX$$ continue de parcourir toutes les autres colonnes en effectuant des tests similaires.

Et enfin, pour être complet, nous citons ici l’essentiel de $$\mathrm\TeX$$l’algorithme de calcul des largeurs de colonnes de » (tiré de la documentation du code source de $$\mathrm\TeX$$):

Soit $$w\_{ij}$$ le maximum des largeurs naturelles de toutes les entrées qui s’étendent sur les colonnes $$i$$ à $$j$$, incluses. Les largeurs finales des colonnes sont définies par la formule

$$\begin{equation\*} w\_j=\max\_{1\leq i\leq j}\biggl(w\_{ij}-\sum\_{i\leq k< j}(t\_k+w\_k)\biggr) \end{equation\*}$$

où $$t\_k$$ est la largeur naturelle de la colle tabskip entre les colonnes $$k$$ et $$k+1$$.

## Colophon : utiliser Overleaf pour produire des tableaux sous forme de graphiques SVG

Tous les $$\mathrm\TeX$$ tableaux présentés dans cet article sont des fichiers Scalable Vector Graphics (SVG) produits sur la plateforme Overleaf. Les annotations (flèches et cadres verts) ont été ajoutées en ouvrant le graphique SVG dans Inkscape — notez toutefois que le texte des annotations a été composé en $$\mathrm\TeX$$ comme texte supplémentaire accompagnant le tableau : seules les flèches et les fonds verts ont été ajoutés dans Inkscape. Si vous souhaitez savoir comment cela a été réalisé, poursuivez votre lecture.

Les serveurs d’Overleaf utilisent la $$\mathrm\TeX \text{ Live}$$ distribution qui, en plus des moteurs de composition $$\mathrm\TeX$$fondés sur -, fournit une multitude d’outils et d’utilitaires logiciels très utiles liés à $$\mathrm\TeX$$. Parmi ceux-ci, il en est un appelé [`dvisvgm`](https://dvisvgm.de) qui, comme son nom l’indique, convertit $$\mathrm\TeX$$le DVI traditionnel de**D**e**V**ice **I**ne dépendant) au format de fichier de sortie SVG. Parmi ses nombreuses [options en ligne de commande](https://dvisvgm.de/Manpage/) `dvisvgm` propose une option (`-n` ou `--no-fonts`) qui lui demande de convertir tout le texte en *tracés* ce qui signifie que le texte dans les graphiques SVG est dessiné à l’aide de lignes et de courbes plutôt qu’au moyen de polices et de glyphes réels. Cela peut augmenter la taille du fichier du graphique SVG résultant, mais cela garantit que les graphiques SVG sont extrêmement portables et presque assurés de bien fonctionner sur n’importe quel appareil.

### Alors… comment cela a-t-il été fait ?

Dans un [article précédent](https://www.overleaf.com/blog/510-using-luatex-to-run-tools-and-utilities-installed-on-overleafs-servers) j’ai expliqué comment vous pouvez utiliser $$\text{Lua}\mathrm\TeX$$ pour exécuter les divers outils et utilitaires logiciels installés sur les serveurs d’Overleaf — c’est une technique extrêmement simple et pratique. Cette technique a été utilisée pour générer des graphiques SVG de $$\mathrm\TeX$$ tableaux composés, comme suit. Depuis le $$\mathrm\TeX$$ fichier principal du document, le code permettant de composer chaque tableau (créé en utilisant using `\halign`) a été écrit dans un fichier `.tex` . Cela a été réalisé en encadrant le code du tableau par une paire de commandes que j’ai appelées `\beginscoop` et `\endscoop`. Il existe probablement de nombreuses autres façons d’obtenir les résultats souhaités, mais voici les définitions de macros que j’ai utilisées :

```latex
\def\cc{\catcode`\#=12\relax}
\long\def\scoop#1\endscoop{\global\fulltoks={#1}\egroup}
\def\beginscoop{\global\advance\numfigs by1\relax\bgroup\cc\scoop}
```

Vous les utilisez ainsi :

```latex
\beginscoop
\halign{...}
\endscoop
```

Notez que le `\endscoop` jeton sert simplement à délimiter le paramètre de la `\scoop` macro : $$\mathrm\TeX$$ supprime en fait le `\endscoop` jeton, donc nous n’avons pas réellement besoin de le définir (par exemple, avec `\def\endscoop{...}`).

Le $$\mathrm\TeX$$ code contenu dans le `\halign{...}` est enregistré dans un `toks` registre appelé `\fulltoks`. Un point délicat que j’ai rencontré (avec $$\text{Lua}\mathrm\TeX$$) était la nécessité d’empêcher les caractères `#` à l’intérieur du `\halign{...}` préambule d’être « doublés » en `##` lorsqu’ils sont écrits dans un `.tex` fichier. Pour éviter cela, j’ai dû temporairement régler les `\catcode`de `#` caractères à 12 avant d’enregistrer le $$\mathrm\TeX$$ code (jetons) dans le `\fulltoks` registre de jetons.

L’étape suivante consiste à écrire les jetons contenus dans `\fulltoks` dans un $$\mathrm\TeX$$ fichier — comme j’utilisais $$\text{Lua}\mathrm\TeX$$ cela s’est révélé être *extrêmement* facile grâce à $$\text{Lua}\mathrm\TeX$$l’extraordinaire API Lua de ». En bref, j’ai écrit une macro appelée `\writefile{...}` qui prend comme paramètre le nom d’un registre de jetons dont vous voulez écrire les jetons dans un fichier (par ex., `\writefile{fulltoks}`). Dans la `\writefile{...}` macro, j’ai utilisé l’API Lua pour obtenir une représentation textuelle du `\fulltoks` registre de jetons :

```latex
\def\writefile#1{%
\directlua{
...
...
 local p=tex.toks["#1"]
...
...
}}
```

Voici une capture d’écran montrant un peu plus de `\writefile{...}` commande :

[![{{{alt}}}](/files/82be6cbabe3b0aca56b1d5c9e98a1a1336bc202c)](https://www.filepicker.io/api/file/ngeDmgRStGWvG044RE1A)

Le langage Lua et l’API Lua fournie par $$\text{Lua}\mathrm\TeX$$ peuvent souvent simplifier $$\mathrm\TeX$$ les tâches de programmation, et c’est en raison de ces fonctionnalités utiles et puissantes que j’utilise $$\text{Lua}\mathrm\TeX$$ depuis \~2009 — et que je reste un grand admirateur de ce moteur vraiment remarquable $$\mathrm\TeX$$ . Bon, la $$\text{Lua}\mathrm\TeX$$ publicité s’achève ici.

Ayant ainsi obtenu facilement le $$\mathrm\TeX$$ code stocké dans `\fulltoks` il est écrit dans un fichier avec du code supplémentaire pour en faire un fichier correctement formé $$\mathrm\LaTeX$$ . Les étapes suivantes sont :

1. Traiter le `.tex` fichier contenant notre tableau avec $$\text{pdf}\mathrm\LaTeX$$ (en mode DVI) afin qu’il compose le tableau et génère un `.dvi` fichier pour `dvisvgm` à traiter. Oui, vous pouvez utiliser $$\text{Lua}\mathrm\TeX$$ pour exécuter $$\text{pdf}\mathrm\LaTeX$$—une fois encore, j’ai utilisé la méthode abordée dans un [article précédent](/latex/fr/articles-approfondis/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md).
2. Et enfin, exécutez `dvisvgm` pour traiter le `.dvi` fichier afin de générer un graphique SVG du tableau composé. $$\mathrm\TeX$$ tableau.
3. Pour obtenir les graphiques SVG eux-mêmes, vous pouvez télécharger un fichier ZIP depuis Overleaf — en veillant à sélectionner les **Fichiers d’entrée et de sortie** option.


---

# 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/47-tex-tables-how-tex-calculates-spanned-column-widths.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.
