> 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/24-how-tex-calculates-glue-settings-in-an-hbox.md).

# Comment TeX calcule les réglages de glue dans une \hbox

Voici le troisième et dernier article d'une série qui examine $$\mathrm \TeX$$ les boîtes et la colle. Le premier billet [Boîtes et colle : une introduction brève, mais visuelle, à l'aide de LuaTeX](/latex/fr/articles-approfondis/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md) présentait les concepts de boîtes et de colle et a été suivi par [La \hbox de Pandore : utiliser LuaTeX pour lever le couvercle des boîtes TeX](/latex/fr/articles-approfondis/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md) qui présentait un [$$\text{Lua}\mathrm\TeX$$projet Overleaf basé sur](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) pour explorer les structures plus profondes de $$\mathrm \TeX$$ les boîtes à l'aide de graphes de nœuds. Dans ce dernier article, nous plongeons en profondeur dans les mécanismes de $$\mathrm \TeX$$ calcule les valeurs de colle dans une `\hbox` : *réglage de la colle*. Nous utilisons abondamment des graphes de nœuds (introduits dans le [La \hbox de Pandore : utiliser LuaTeX pour lever le couvercle des boîtes TeX](/latex/fr/articles-approfondis/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md) dans cette série) et montrons comment utiliser et interpréter certaines des données qu'ils fournissent : `glue_set`, `glue_sign` et `glue_order`.

Nous fournissons un exemple entièrement détaillé de calculs de colle pour un `\hbox` et couvrons beaucoup de détails ; toutefois, il peut exister des circonstances et considérations supplémentaires que nous n'avons pas l'espace d'aborder ici, et le lecteur intéressé est renvoyé à la page 77 de $$\text{The } \mathrm \TeX \text{book}$$.

## Le défi

Supposons que nous ayons un `\hbox` comme celui-ci :

```latex
\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt%
B\hskip 0pt plus 2fil%
C\hskip 0pt plus 2fill%
D\hskip 0pt plus 3fill%
}
```

Voici à quoi ressemble cette boîte — pour plus de clarté, affichée agrandie et avec une bordure :

![boîte](/files/4dbdb064d0620368ba67e257b1a5e6de9db689ed)

La question est : quelle est la valeur finale, en $$\mathrm \TeX$$ points, de l'espace (colle) entre les éléments suivants :

* A et B
* B et C
* C et D
* D et la fin de la boîte

c.-à-d. que nous voulons calculer les valeurs de $$\mathrm{g}*{1}, \mathrm{g}*{2}, \mathrm{g}*{3} \text{ and } \mathrm{g}*{4}:$$

![colle](/files/8f7d7f9cd36fcc650f809bf510322cde02035c53)

Voici un graphe de nœuds représentant la boîte ci-dessus. Trois valeurs contenues dans la section « metadata » sont particulièrement intéressantes :

* `glue_set`
* `glue_sign`
* `glue_order`

![graphe de nœuds](/files/2de0b1551698914c3534fa380466166a919060f5)

Il est important de noter qu'un ensemble particulier de valeurs pour `glue_set`, `glue_sign` et `glue_order` n'affecte que les colles à l'intérieur de la boîte de niveau supérieur : elles n'affectent pas les colles à l'intérieur de *imbriquées* boîtes : chaque boîte imbriquée (objet hlist ou vlist) possède ses propres valeurs pour ces trois paramètres. Voici un exemple d'une `\hbox` imbriquée dans une `\hbox`. Dans cet exemple, vous pouvez clairement voir les différentes valeurs de `glue_set`— bien sûr, la boîte imbriquée peut aussi avoir des valeurs différentes pour `glue_sign` et `glue_order`.

```latex
\hbox to 75pt{\hfill ABC\hbox to15pt{\hfill D}}
```

![graphe de nœuds](/files/5956f7d2fc19aca6c12119a05e28bd394dbfbbb2)

## Types de colle, infinis et ordres : un résumé

$$\mathrm \TeX$$ fournit un certain nombre de commandes primitives liées à la colle, notamment :

* colle horizontale : `\hskip`, `\hfil`, `\hfill`, `\hfilneg`, `\hss`;
* colle verticale :`\vskip`, `\vfil`, `\vfill`, `\vfilneg`, `\vss`;

ainsi que `\mskip` pour insérer de la colle dans les expressions mathématiques.

Un élément de colle est défini par un ensemble de trois valeurs :

* **largeur naturelle** : l'espace qu'elle occupe si vous ne l'étirez ni ne la réduisez ;
* **composante d'étirement** : de combien la colle peut s'étirer ;
* **composante de réduction** : de combien la colle peut se réduire.

Ce que nous allons considérer, c'est l'utilisation de colle à l'intérieur d'une `\hbox{...}` et les calculs $$\mathrm \TeX$$ qu'il utilise pour déterminer combien d'espace la colle occupera finalement. La commande que nous utiliserons pour créer de la *horizontal* colle est `\hskip`, qui prend la forme suivante :

`**\hskip** *<largeur naturelle>* **plus** *<quantité à étirer>* **minus** *<quantité à réduire>*`

Pour *vertical* de colle que vous utiliseriez `**\vskip** *<largeur naturelle>* **plus** *<quantité à étirer>* **minus** *<quantité à réduire>*`.

Par exemple, une colle horizontale typique s'exprimerait ainsi : `\hskip 3pt plus 2pt minus 1pt`. Vous pouvez aussi utiliser d'autres unités physiques :

* `\hskip 3mm plus 2mm minus 1mm`
* `\hskip 3in plus 2in minus 1in`
* `\hskip 1in plus 3cm minus 20mm`

## $$\mathrm \TeX$$ colle et unités d'« infini »

Pour la composante de réduction ou d'étirement de la colle $$\mathrm \TeX$$ introduit un autre type d'unité : les soi-disant « infinis » : $$\text{fil}$$, $$\text{fill}$$ et $$\text{filll}$$. Ces trois « niveaux d'infini » sont tels que, lorsqu'ils sont listés dans une séquence, chacun est « plus infini » que le précédent :

$$\text{fil} < \text{fill} < \text{filll}$$

Peut-être que « infinis » est un nom un peu déroutant pour ces unités — il peut être utile de les considérer aussi comme différents niveaux de *priorité*, car, au bout du compte, elles aident à déterminer quelles colles participent réellement au processus d'étirement ou de réduction. Avec de la colle dont la composante d'étirement ou de réduction est « infinie », $$\mathrm \TeX$$ permet de créer une colle qui peut s'étirer ou se réduire de n'importe quelle quantité souhaitée. Notez que pour les colles finies, $$\mathrm \TeX$$ limitera la quantité de réduction possible de telles colles. Un exemple de colle « infinie » est

`\hskip 3pt plus 2fil minus 1fill`

Notez que nous ne pouvons pas écrire, par exemple, `\hskip 1fil` parce que $$\mathrm \TeX$$ signalera une erreur avec le message `Illegal unit of measure (pt inserted)`. À ce stade, ces « niveaux d'infini » peuvent sembler très étranges, mais, pour l'instant, acceptez-les simplement tels quels et nous verrons bientôt comment $$\mathrm \TeX$$ utilise ces infinis lors des calculs de colle.

### Niveaux d'infini (« ordre de colle »)

En interne, lorsque $$\mathrm \TeX$$ effectue ses calculs de colle, il considère que chaque niveau d'infini est un « ordre de colle » allant de 0 à 3, où l'ordre 0 est réservé à la colle avec des dimensions physiques telles que bp, pt, mm, etc. Toutefois, avec $$\text{Lua}\mathrm\TeX$$ il existe une légère différence car il possède en réalité un type supplémentaire (ordre) d'infini absent de nombreux autres $$\mathrm \TeX$$ moteurs : $$\text{fi}$$ (voir l'explication ci-dessous). Si vous lisez $$\text{The } \mathrm \TeX\text{book}$$ vous ne verrez aucune mention de l' $$\text{fi}$$ infini — simplement parce qu'il n'est pas implémenté dans le $$\mathrm \TeX$$ logiciel original de Knuth. Par conséquent, il existe un léger décalage entre $$\text{Lua}\mathrm\TeX\text{'s}$$ les ordres d'infini et ceux que vous pourriez voir dans les livres sur $$\mathrm \TeX$$. $$\text{Lua}\mathrm\TeX$$ utilise des infinis dont l'ordre va de 0 à 4, mais d'autres $$\mathrm \TeX$$ moteurs courants vont de 0 à 3. Voici un tableau montrant l'ordre de colle attribué à chaque type d'unité de colle.

|                           |                               |     |     |      |       |
| ------------------------- | ----------------------------- | --- | --- | ---- | ----- |
|                           | Unités physiques (pt, mm, in) | fi  | fil | fill | filll |
| $$\text{Lua}\mathrm\TeX$$ | 0                             | 1   | 2   | 3    | 4     |
| Autres moteurs            | 0                             | N/A | 1   | 2    | 3     |

### Notes sur $$\text{Lua}\mathrm\TeX$$ : Pourquoi avoir un infini supplémentaire ?

$$\text{Lua}\mathrm\TeX$$ est dérivé d'un certain nombre de projets et de bibliothèques de code, dont l'un s'appelle [Omega](https://en.wikipedia.org/wiki/Omega_\(TeX\)). $$\text{Lua}\mathrm\TeX$$ a incorporé certains aspects du code d'Omega, y compris un nouveau type de colle infinie appelé $$\text{fi}$$. D'après le manuel d'Omega :

> « Un nouveau niveau d'infini $$\text{fi}$$ a été ajouté. Il est plus petit que $$\text{fil}$$ mais plus grand que toute quantité finie. Son intention initiale était l'étirement entre les lettres : soit pour combler les blancs, comme cela se fait pour des écritures calligraphiques telles que l'arabe ; soit pour l'emphase, comme en russe ; le tout sans avoir à réécrire les paquets de macros existants. Il existe donc un nouveau mot-clé, $$\text{fi}$$, et deux nouvelles primitives, `\hfi` et `\vfi` ».

## Revenons à notre défi

En suivant le modèle de Knuth, définissons deux quantités :

* la largeur souhaitée d'une boîte : $$\mathrm{W}\_{\mathrm{D}}$$— quelle taille voulons-nous qu'elle ait ;
* la largeur naturelle d'une boîte : $$\mathrm{W}\_{\mathrm{N}}$$— l'espace total occupé par ses éléments constitutifs avant que les colles ne soient étirées ou réduites.

### La largeur naturelle d'une boîte

La largeur naturelle d'une boîte est la largeur totale de tous les composants de cette boîte : caractères, kerns, boîtes imbriquées et toute colle. Pour la colle à l'intérieur de la boîte, sa largeur naturelle ignore tout étirement ou toute réduction de la colle : c'est-à-dire sa taille avant tout étirement ou toute réduction.

Voici encore une fois la boîte que nous examinons :

```latex
\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt%
B\hskip 0pt plus 2fil%
C\hskip 0pt plus 2fill%
D\hskip 0pt plus 3fill%
}
```

Clairement, nous voulons que la boîte ait une largeur de 100pt, donc $$\mathrm{W}*{\mathrm{D}}=100\mathrm{pt}$$ mais qu'en est-il de sa largeur naturelle, $$\mathrm{W}*{\mathrm{N}}$$ ? Pour calculer la largeur naturelle, il est clair que nous avons besoin des largeurs des quatre caractères (A, B, C et D) plus les largeurs naturelles des quatre colles.

$$\eqalign{\mathrm{W}\_{\mathrm{N}} &= &\text{width(A)} + \text{width(B)} + \text{width(C)} + \text{width(D)} \ & &+ \text{width}(\verb\*\hskip 4pt plus3pt minus 2pt\*)\ & &+\text{width}(\verb\*\hskip 0pt plus 2fil\*)\ & &+\text{width}(\verb\*\hskip 0pt plus 2fill)*\ & &+\text{width}(\verb*\hskip 0pt plus 3fill\*)\ }$$

Où $$\text{width}$$ est simplement une notation pour désigner la largeur naturelle d'un élément. Nous pouvons obtenir les largeurs naturelles des quatre caractères (A, B, C et D) à partir de notre graphe de nœuds :

![graphe de nœuds](/files/009588d387ccf7578963a193256254b240962b00)

D'après le graphe de nœuds ci-dessus, nous pouvons voir que :

$$\eqalign{ \text{width(A)} &= 7.50002\text{pt}\ \text{width(B)} &= 7.08336\text{pt}\ \text{width(C)} &= 7.22223\text{pt}\ \text{width(D)} &= 7.6389\text{pt}\ }$$

Il ne nous reste plus qu'à obtenir les largeurs naturelles de nos colles, ce qui s'obtient facilement en ignorant les composantes d'étirement et de réduction :

$$\eqalign{ &\text{width}(\verb\*\hskip 4pt plus3pt minus 2pt\*) & = 4\text{pt}\ &\text{width}(\verb\*\hskip 0pt plus 2fil\*) &=0\text{pt}\ &\text{width}(\verb\*\hskip 0pt plus 2fill)*&=0\text{pt}\ &\text{width}(\verb*\hskip 0pt plus 3fill\*)&=0\text{pt}\ }$$

Par conséquent :

$$\eqalign{ \mathrm{W}\_{\mathrm{N}} & = \text{widths of characters} + \text{width of all glues}\ &= 7.50002\text{pt}+ 7.08336\text{pt} + 7.22223\text{pt} + 7.6389\text{pt} + 4\text{pt}\space \text{(from }\verb\*\hskip\*\text{)}\ &=33.4445\text{pt}\ }$$

Nous avons maintenant deux informations clés :

$$\eqalign{ \mathrm{W}*{\mathrm{D}} & = 100\text{pt}\ \mathrm{W}*{\mathrm{N}} & = 33.4445\text{pt}\ }$$

Clairement, $$\mathrm{W}*{\mathrm{D}} > \mathrm{W}*{\mathrm{N}}$$ et la différence est $$(100-33.4445)\text{pt}=66.5555\text{pt}$$ ; cet espace excédentaire doit être rempli en étirant les colles — mais lesquelles et de combien ?

### Qui a le plus d'étirement ?

En suivant la méthodologie de Knuth (page 77 de $$\text{The } \mathrm \TeX \text{book}$$), mais en tenant compte du type d'infini supplémentaire ($$\text{fi}$$) fourni par $$\text{Lua}\mathrm \TeX$$, l'étape suivante consiste à noter la *total* d'étirement sous la forme :

$$\text{total stretch} = y\_{0}+ y\_{1}\text{fi} +y\_{2}\text{fil} +y\_{3}\text{fill} +y\_{4}\text{filll}$$

Tout d'abord, si nous notons le $$\text{total glue}$$:

$$\text{total glue } = (\verb*4pt plus3pt minus 2pt*) + (\verb*0pt plus 2fil*) + (\verb*0pt plus 2fill*) + (\verb*0pt plus 3fill*)$$

nous pouvons alors voir que la $$\text{total stretch}$$ est :

$$\eqalign{ \text{total stretch} & = 3\text{pt}+ 0\text{fi} + (2\text{fil}) + (2\text{fill} + 3\text{fill}) + 0\text{filll}\ &=3\text{pt}+ 0\text{fi} + 2\text{fil} + 5\text{fill} + 0\text{filll}\ }$$

En comparant cela à $$\text{total stretch} = y\_{0}+ y\_{1}\text{fi} +y\_{2}\text{fil} +y\_{3}\text{fill} +y\_{4}\text{filll}\space$$nous pouvons voir que :

$$\eqalign{ y\_0 &=3\text{pt}\ y\_1 &=0\ y\_2 &=2\ y\_3&=5\ y\_4&=0\ }$$

$$\mathrm\TeX$$ la suite se « demande » : en regardant le $$\text{total stretch}$$, quel est le niveau d'infini le plus élevé ayant une valeur non nulle ? À l'examen des $$\text{total stretch}$$ il est clair que la composante d'étirement non nulle la « plus infinie » est $$\text{fill}$$ et nous avons $$y\_3=5$$ unités de cela : ce sont les colles ayant une $$\text{fill}$$ composante d'étirement qui fournissent tout l'étirement. L'indice 3 de $$y\_3$$ nous indique l' `glue_order` de la colle qui sera utilisée — dans ce cas pour l'étirement. Maintenant, si nous regardons la section « métadonnées » dans notre diagramme de nœuds pour ce `\hbox` nous pouvons maintenant donner du sens à deux autres « valeurs de métadonnées » (nous aborderons `glue_set` dans la section suivante)

![métadonnées](/files/422be8eeea429b145a014d2d7de616677f1a89dc)

* `glue_sign` : indique si la colle est réglée à sa longueur naturelle, étirée ou réduite :
* 0=réglée à la largeur naturelle
* 1=étirement
* 2=réduction

Dans notre exemple, `glue_sign` a la valeur de `1`, signifiant que les colles participantes doivent être étirées.

* `glue_order` indique quel « infini » est en jeu ; pour $$\text{Lua}\mathrm \TeX$$ une valeur de 3 vous indique que les colles ayant une $$\text{fill}$$ composante participeront aux calculs de colle — dans notre cas, elles seront étirées.

Toute colle qui n'a pas de composante d'étirement définie en unités de $$\text{fill}$$ sera **réglée à sa longueur naturelle** : c.-à-d. qu'elle ne s'étirera pas du tout (dans notre cas).

### De combien étirer ou réduire : calcul de glue\_set

Pour résumer où nous en sommes et ce que nous savons :

1. largeur souhaitée de la boîte : $$\mathrm{W}\_{\mathrm{D}} = 100\text{pt}$$;
2. largeur naturelle de la boîte : $$\mathrm{W}\_{\mathrm{N}} = 33.4445\text{pt}$$;
3. la colle devra s'étirer, mais seules les colles ayant une $$\text{fill}$$ composante d'étirement effectueront cet étirement ;
4. nous avons un total de $$(2+3)=5$$ unités de $$\text{fill}$$ disponibles.

La question suivante est : de combien ces colles vont-elles réellement s'étirer ? Intervient alors le *rapport de réglage de la colle*— appelé `glue_set` dans notre graphe de nœuds. Ce que $$\mathrm \TeX$$ fait, c'est calculer combien d'espace doit être rempli, puis répartir cette quantité d'espace entre les colles appropriées proportionnellement à la taille de leur composante d'étirement. Si vous revenez à notre `\hbox` vous pouvez voir exactement quelles colles ont des composantes d'étirement contenant des unités de $$\text{fill}$$:

```latex
\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt%
B\hskip 0pt plus 2fil%
C\hskip 0pt plus 2fill%
D\hskip 0pt plus 3fill%
}
```

Le $$\textit{glue set ratio }(\text{or } \verb*glue\_set*)$$ est calculé comme suit :

$$\eqalign{ \text{glue set ratio}\space (\verb*glue\_set*) = & {\text{amount to stretch}}\over{\text{value of highest infinity}}\ =& {\mathrm{W}*{\mathrm{D}}-\mathrm{W}*{\mathrm{N}}}\over{y\_3}\ =& {(100-33.4445)}\over{5}\ =& {66.5555}\over{5}\ =& 13.3111\space (\text{to 4 decimal places})\ }$$

Et maintenant, l'étape finale de l' $$\mathrm\TeX$$ algorithme est appliquée :

1. pour chaque élément de colle dont la composante d'étirement correspond à l' `glue_order` (3 dans notre cas), la longueur de cette colle deviendra :

$$\text{stretched value} = \text{natural length} + (\verb*glue\_set* \times \text{value of stretch component})$$

3. toutes les autres colles sont réglées à leur longueur naturelle — c.-à-d. qu'elles ne s'étirent pas du tout.

En examinant les colles dans notre boîte :

```latex
\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt%
B\hskip 0pt plus 2fil%
C\hskip 0pt plus 2fill%
D\hskip 0pt plus 3fill%
}
```

nous pouvons les passer en revue pour calculer leurs valeurs finales :

1. **Entre A et B**: `\hskip 4pt plus3pt minus 2pt`. La composante d'étirement est `3pt`, qui est d'ordre `0`. `glue_order` est `3` : la composante d'étirement est ignorée et cette colle prend sa largeur naturelle de `4pt`.
2. **Entre B et C**: `\hskip 0pt plus 2fil`. La composante d'étirement est `2fil`, qui est d'ordre `2`. `glue_order` est `3` : la composante d'étirement est ignorée et cette colle prend sa largeur naturelle de `0pt`.
3. **Entre C et D**: `\hskip 0pt plus 2fill`. La composante d'étirement est `2fill`, qui est d'ordre `3` et correspond à l' `glue_order` de `3`. Cette colle sera étirée à : $$\eqalign{ \text{stretched value}\space = & \text{natural width} + (\verb*glue\_set* \times \text{value of stretch component})\ = & 0\text{pt} + 13.3111 \times 2 \ = & 26.6222\text{pt}\ }$$5. **Entre D et la fin de la boîte**: `\hskip 0pt plus 3fill`. La composante d'étirement est `3fill`, qui est d'ordre `3` et correspond à l' `glue_order` de `3`. Cette colle sera étirée à : $$\eqalign{ \text{stretched value}\space = &\text{natural width} + (\verb*glue\_set* \times \text{value of stretch component})\ =& 0\text{pt} + 13.3111 \times 3 \ = &39.9333\text{pt}\ }$$

## Et enfin : vérification de la largeur totale

Le processus de calcul de l'espace réel occupé par la colle s'appelle *réglage de la colle* nous pouvons donc maintenant vérifier si nous avons rempli la boîte à la largeur souhaitée, $$(\mathrm{W}\_{\mathrm{D}} = \text{100pt})$$:

$$\eqalign{ \mathrm{W}\_{\mathrm{D}} & = \text{width of all characters} + \text{width of all }\textbf{set}\text{ glue values}\ & = \text{A:7.50002pt} + \text{B:7.08336pt} + \text{C:7.22223pt} + \text{D:7.6389pt}\ & + \text{4pt} + \text{0pt} + \text{26.6222pt} + \text{39.9333pt}\ & = \text{100.00pt} }$$

Nous connaissons maintenant les largeurs de toutes les colles et pouvons préparer un graphique qui répond à la question posée au début de cet article : voici les largeurs de colle entre les caractères de notre `\hbox`:

![colle](/files/3471b0ca790c98168526b9ba2ca54c5a4bd06129)


---

# 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/24-how-tex-calculates-glue-settings-in-an-hbox.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.
