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

# Come TeX calcola le impostazioni della spaziatura elastica in un \hbox

Questo è il terzo e conclusivo articolo di una serie che esamina $$\mathrm \TeX$$ caselle e colla. Il primo post [Caselle e colla: una breve, ma visiva, introduzione con LuaTeX](/latex/it/articoli-approfonditi/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md) ha introdotto i concetti di caselle e colla ed è stato seguito da [Il \hbox di Pandora: usare LuaTeX per sollevare il coperchio delle caselle TeX](/latex/it/articoli-approfonditi/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md) che presentava un [$$\text{Lua}\mathrm\TeX$$progetto Overleaf basato su](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) per esplorare le strutture più profonde delle $$\mathrm \TeX$$ caselle attraverso l'uso di grafi dei nodi. In questo pezzo finale facciamo un'“immersione profonda” nella meccanica di come $$\mathrm \TeX$$ calcola i valori della colla in una `\hbox`: un processo chiamato *impostazione della colla*. Facciamo ampio uso di grafi dei nodi (introdotti nel [Il \hbox di Pandora: usare LuaTeX per sollevare il coperchio delle caselle TeX](/latex/it/articoli-approfonditi/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md) in questa serie) e mostriamo come usare e interpretare alcuni dei dati che forniscono: `glue_set`, `glue_sign` e `glue_order`.

Forniamo un esempio completamente svolto dei calcoli della colla per una `\hbox` e trattiamo molti dettagli; tuttavia, potrebbero esserci ulteriori circostanze e considerazioni che qui non abbiamo spazio per affrontare e il lettore interessato è rimandato a pagina 77 di $$\text{The } \mathrm \TeX \text{book}$$.

## La sfida

Supponiamo di avere una `\hbox` come questa:

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

Ecco come appare questa casella—per chiarezza, mostrata ingrandita e con un bordo:

![casella](/files/74b8b146584c6aeffb6a77fd2593ee450e932f05)

La domanda è: qual è il valore finale, in $$\mathrm \TeX$$ punti, dello spazio (colla) tra i seguenti elementi:

* A e B
* B e C
* C e D
* D e la fine della casella

cioè, vogliamo calcolare i valori della $$\mathrm{g}*{1}, \mathrm{g}*{2}, \mathrm{g}*{3} \text{ and } \mathrm{g}*{4}:$$

![colla](/files/19df4c3c0910c847239248b25f9acec5596799c1)

Ecco un grafo dei nodi che rappresenta la casella sopra. Di particolare interesse sono tre valori contenuti nella sezione “metadata”:

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

![grafo dei nodi](/files/1f8c9c3b3dc678a0f79a09450d73d66ff4a353f3)

È importante notare che un particolare insieme di valori per `glue_set`, `glue_sign` e `glue_order` influenza solo le colle all'interno della casella di primo livello: non influenza le colle all'interno delle *annidate* caselle: ogni casella annidata (oggetto hlist o vlist) ha i propri valori per questi tre parametri. Ecco un esempio di una `\hbox` annidata all'interno di una `\hbox`. In questo esempio, puoi vedere chiaramente i diversi valori di `glue_set`—naturalmente, la casella annidata può anche avere valori diversi per `glue_sign` e `glue_order`.

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

![grafo dei nodi](/files/875a50fe128db117720f9dd7c06b3893d1bbab29)

## Tipi di colla, infiniti e ordini: un riepilogo

$$\mathrm \TeX$$ fornisce una serie di comandi primitivi relativi alla colla, tra cui:

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

insieme a `\mskip` per inserire colla nelle espressioni matematiche.

Un elemento di colla è definito da un insieme di tre valori:

* **larghezza naturale**: quanto spazio occupa se non lo si allunga o restringe;
* **componente di allungamento**: di quanto la colla può allungarsi;
* **componente di restringimento**: di quanto la colla può restringersi.

Ciò che prenderemo in considerazione è l'uso della colla all'interno di una `\hbox{...}` e i calcoli $$\mathrm \TeX$$ che usa per determinare quanto spazio occuperà alla fine la colla. Il comando che useremo per creare un po' di *colla orizzontale* è `\hskip`, che ha la forma:

`**\\hskip** *<natural width>* **plus** *<amount to stretch>* **minus** *<amount to shrink>*`

Per *colla verticale* si userebbe `**\\vskip** *<natural width>* **plus** *<amount to stretch>* **minus** *<amount to shrink>*`.

Ad esempio, una tipica colla orizzontale sarebbe espressa come `\hskip 3pt plus 2pt minus 1pt`. Puoi usare anche altre unità fisiche:

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

## $$\mathrm \TeX$$ colla e unità di “infinito”

Per la componente di restringimento o allungamento della colla $$\mathrm \TeX$$ introduce un altro tipo di unità: i cosiddetti “infiniti”: $$\text{fil}$$, $$\text{fill}$$ e $$\text{filll}$$. Questi tre “livelli di infinito” sono tali che, se elencati in sequenza, ciascuno è “più infinito” del precedente:

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

Forse “infiniti” è un nome leggermente confuso per queste unità—potrebbe essere utile pensarle anche come diversi livelli di *priorità*, perché, in definitiva, aiutano a determinare quali colle partecipano effettivamente al processo di allungamento o restringimento. Avere colla con una componente di allungamento o restringimento “infinita”, $$\mathrm \TeX$$ ti consente di creare colla che può allungarsi o restringersi di qualsiasi quantità desiderata. Nota che, per le colle finite, $$\mathrm \TeX$$ limiterà la quantità di restringimento di tali colle. Un esempio di colla “infinita” è

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

Nota: non possiamo scrivere, ad esempio, `\hskip 1fil` perché $$\mathrm \TeX$$ segnalerà un errore con il messaggio `Illegal unit of measure (pt inserted)`. A questo punto, questi “livelli di infinito” possono sembrare molto strani ma, per ora, accettali semplicemente così come sono e vedremo presto come $$\mathrm \TeX$$ usa questi infiniti quando esegue i calcoli della colla.

### Livelli di infinito (“ordine della colla”)

Internamente, quando $$\mathrm \TeX$$ esegue i calcoli della colla considera che ogni livello di infinito sia un “ordine della colla” che va da 0 a 3, dove l'ordine 0 è per la colla con dimensioni fisiche come bp, pt, mm e così via. Tuttavia, con $$\text{Lua}\mathrm\TeX$$ c'è una lieve deviazione perché in realtà ha un tipo (ordine) di infinito aggiuntivo non presente in molti altri $$\mathrm \TeX$$ motori: $$\text{fi}$$ (vedi spiegazione sotto). Se leggi $$\text{The } \mathrm \TeX\text{book}$$ non troverai alcun riferimento all' $$\text{fi}$$ infinito—semplicemente perché non è implementato nel software originale di Knuth. $$\mathrm \TeX$$ Di conseguenza, c'è un piccolo “scollamento” tra $$\text{Lua}\mathrm\TeX\text{'s}$$ l'ordine degli infiniti e quelli che potresti vedere nei libri su $$\mathrm \TeX$$. $$\text{Lua}\mathrm\TeX$$ usa infiniti il cui ordine va da 0 a 4, ma altri $$\mathrm \TeX$$ motori (comuni) vanno da 0 a 3. Ecco una tabella che mostra l'ordine della colla assegnato a ciascun tipo di unità di colla.

|                           |                            |     |     |      |       |
| ------------------------- | -------------------------- | --- | --- | ---- | ----- |
|                           | Unità fisiche (pt, mm, in) | fi  | fil | fill | filll |
| $$\text{Lua}\mathrm\TeX$$ | 0                          | 1   | 2   | 3    | 4     |
| Altri motori              | 0                          | N/D | 1   | 2    | 3     |

### Note su $$\text{Lua}\mathrm\TeX$$: Perché avere un infinito aggiuntivo?

$$\text{Lua}\mathrm\TeX$$ deriva da una serie di progetti e librerie di codice, incluso uno chiamato [Omega](https://en.wikipedia.org/wiki/Omega_\(TeX\)). $$\text{Lua}\mathrm\TeX$$ ha incorporato alcuni aspetti del codice di Omega e ciò include un nuovo tipo di colla infinita chiamata $$\text{fi}$$. Dal manuale di Omega:

> “È stato aggiunto un nuovo livello di infinito $$\text{fi}$$ È più piccolo di $$\text{fil}$$ ma più grande di qualsiasi quantità finita. La sua intenzione originaria era per l'allungamento tra le lettere: sia per riempire gli spazi neri, come avviene per scritture calligrafiche come l'arabo; sia per l'enfasi, come in russo; tutto questo senza dover riscrivere i pacchetti di macro esistenti. C'è quindi una nuova parola chiave, $$\text{fi}$$, e due nuovi primitivi, `\hfi` e `\vfi`.”

## Torniamo alla nostra sfida

Seguendo il modello di Knuth, definiamo due quantità:

* la larghezza desiderata di una casella: $$\mathrm{W}\_{\mathrm{D}}$$—quanto grande vogliamo che sia;
* la larghezza naturale di una casella: $$\mathrm{W}\_{\mathrm{N}}$$—lo spazio totale occupato dai suoi elementi costitutivi prima che eventuali colle vengano allungate o ristrette.

### La larghezza naturale di una casella

La larghezza naturale di una casella è la larghezza totale di tutti i componenti in quella casella: caratteri, kern, caselle annidate e qualsiasi colla. Per la colla all'interno della casella, la sua larghezza naturale ignora qualsiasi allungamento o restringimento della colla: cioè, la sua dimensione prima che avvenga qualsiasi allungamento o restringimento.

Ancora una volta, ecco la casella che stiamo esaminando:

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

Chiaramente, vogliamo che la casella sia larga 100pt, quindi $$\mathrm{W}*{\mathrm{D}}=100\mathrm{pt}$$ ma che dire della sua larghezza naturale, $$\mathrm{W}*{\mathrm{N}}$$? Per calcolare la larghezza naturale è chiaro che servono le larghezze dei quattro caratteri (A, B, C e D) più le larghezze naturali delle quattro colle.

$$\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\*)\ }$$

Dove $$\text{width}$$ è solo una notazione per indicare la larghezza naturale di un elemento. Possiamo ricavare le larghezze naturali dei quattro caratteri (A, B, C e D) dal nostro grafo dei nodi:

![grafo dei nodi](/files/8200eb918b0d8308a230c072e9f5beed45a0c45c)

Dal grafo dei nodi sopra possiamo vedere che:

$$\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}\ }$$

Ora, tutto ciò che ci serve sono le larghezze naturali delle nostre colle, che si ottengono facilmente ignorando le componenti di allungamento e restringimento:

$$\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}\ }$$

Quindi:

$$\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}\ }$$

Ora abbiamo due informazioni chiave:

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

Chiaramente, $$\mathrm{W}*{\mathrm{D}} > \mathrm{W}*{\mathrm{N}}$$ e la differenza è $$(100-33.4445)\text{pt}=66.5555\text{pt}$$; questo spazio in eccesso deve essere riempito allungando le colle—ma quali e di quanto?

### Chi ha il maggior allungamento?

Seguendo la metodologia di Knuth (pagina 77 di $$\text{The } \mathrm \TeX \text{book}$$), ma tenendo conto del tipo di infinito aggiuntivo ($$\text{fi}$$) fornito da $$\text{Lua}\mathrm \TeX$$, il passo successivo è scrivere l' *allungamento totale* della casella nella forma:

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

Innanzitutto, se scriviamo il $$\text{total glue}$$:

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

possiamo allora vedere che il $$\text{total stretch}$$ è:

$$\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}\ }$$

Confrontandolo con $$\text{total stretch} = y\_{0}+ y\_{1}\text{fi} +y\_{2}\text{fil} +y\_{3}\text{fill} +y\_{4}\text{filll}\space$$possiamo vedere che:

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

$$\mathrm\TeX$$ poi si “chiede”: guardando la $$\text{total stretch}$$, qual è il livello di infinito più alto con un valore diverso da zero? Esaminando il $$\text{total stretch}$$ della casella, è chiaro che la componente di allungamento diversa da zero “più infinita” è $$\text{fill}$$ e abbiamo $$y\_3=5$$ unità di questo: sono colle con una $$\text{fill}$$ componente di allungamento che forniscono tutto l'allungamento. Il pedice 3 di $$y\_3$$ ci dice l' `glue_order` della colla che verrà usata—in questo caso per l'allungamento. Ora, se guardiamo la sezione “metadata” nel nostro diagramma dei nodi per questa `\hbox` possiamo ora dare un senso ad altri due “valori metadata” (affronteremo `glue_set` nella sezione successiva)

![metadata](/files/c64a2b30ad90293fa41f78bcf42b4850d50f521a)

* `glue_sign`: indica se la colla è impostata alla sua lunghezza naturale, allungata o ristretta:
* 0=impostata alla larghezza naturale
* 1=allungamento
* 2=restringimento

Nel nostro esempio, `glue_sign` ha il valore `1`, il che significa che le colle partecipanti devono essere allungate.

* `glue_order` indica quale “infinito” è coinvolto; per $$\text{Lua}\mathrm \TeX$$ un valore di 3 ti dice che le colle con una $$\text{fill}$$ componente parteciperanno ai calcoli della colla—nel nostro caso si allungheranno.

Qualsiasi colla che non abbia una componente di allungamento definita in unità di $$\text{fill}$$ sarà **impostata alla sua lunghezza naturale**: cioè, nel nostro caso, non si allungherà affatto.

### Quanto allungare o restringere: calcolo di glue\_set

Per riassumere dove siamo e cosa sappiamo:

1. larghezza desiderata della casella: $$\mathrm{W}\_{\mathrm{D}} = 100\text{pt}$$;
2. larghezza naturale della casella: $$\mathrm{W}\_{\mathrm{N}} = 33.4445\text{pt}$$;
3. la colla dovrà allungarsi, ma solo le colle con una $$\text{fill}$$ componente di allungamento effettueranno tale allungamento;
4. abbiamo un totale di $$(2+3)=5$$ unità di $$\text{fill}$$ disponibili.

La domanda successiva è: di quanto si allungheranno effettivamente quelle colle? Entra in gioco il *rapporto di regolazione della colla*—chiamato `glue_set` nel nostro grafo dei nodi. Ciò che $$\mathrm \TeX$$ fa è calcolare quanto spazio deve essere riempito e poi distribuire quella quantità di spazio tra le colle appropriate in proporzione alla dimensione della loro componente di allungamento. Se guardi di nuovo il nostro `\hbox` puoi vedere esattamente quali colle hanno componenti di allungamento contenenti unità di $$\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%
}
```

Il $$\textit{glue set ratio }(\text{or } \verb*glue\_set*)$$ si calcola come segue:

$$\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})\ }$$

E ora il passo finale nell' $$\mathrm\TeX$$ algoritmo viene applicato:

1. per ogni elemento di colla la cui componente di allungamento corrisponde al `glue_order` (3 nel nostro caso) la lunghezza di quella colla diventerà:

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

3. tutte le altre colle sono impostate alla loro lunghezza naturale—cioè, non si allungano affatto.

Guardando le colle nella nostra casella:

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

possiamo passarle in rassegna per calcolarne i valori finali:

1. **Tra A e B**: `\hskip 4pt plus3pt minus 2pt`. La componente di allungamento è `3pt`, che è di ordine `0`Il rapporto richiesto `glue_order` è `3`: la componente di allungamento viene ignorata e questa colla assume la sua larghezza naturale di `4pt`.
2. **Tra B e C**: `\hskip 0pt plus 2fil`. La componente di allungamento è `2fil`, che è di ordine `2`Il rapporto richiesto `glue_order` è `3`: la componente di allungamento viene ignorata e questa colla assume la sua larghezza naturale di `0pt`.
3. **Tra C e D**: `\hskip 0pt plus 2fill`. La componente di allungamento è `2fill`, che è di ordine `3` e corrisponde al `glue_order` di `3`. Questa colla verrà allungata a: $$\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. **Tra D e la fine della casella**: `\hskip 0pt plus 3fill`. La componente di allungamento è `3fill`, che è di ordine `3` e corrisponde al `glue_order` di `3`. Questa colla verrà allungata a: $$\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}\ }$$

## E infine: controllo della larghezza totale

Il processo di calcolo dello spazio effettivamente occupato dalla colla si chiama *impostazione della colla* quindi ora possiamo verificare se abbiamo riempito la casella fino alla larghezza desiderata, $$(\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} }$$

Ora conosciamo le larghezze di tutte le colle e possiamo preparare un grafico che risponda alla domanda posta all'inizio di questo articolo: ecco le larghezze della colla tra i caratteri nella nostra `\hbox`:

![colla](/files/31175b5e2b863e6861a97e7f30cafcb7cb837bd2)


---

# 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/it/articoli-approfonditi/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.
