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

# Hur TeX beräknar liminställningar i en \hbox

Detta är den tredje och avslutande artikeln i en serie som tittar på $$\mathrm \TeX$$ boxar och glue. Det första inlägget [Boxar och glue: En kort, men visuell, introduktion med LuaTeX](/latex/sv/fordjupade-artiklar/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md) introducerade begreppen boxar och glue och följdes av [Pandoras \hbox: Att använda LuaTeX för att lyfta på locket till TeX-boxar](/latex/sv/fordjupade-artiklar/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md) som presenterade ett [$$\text{Lua}\mathrm\TeX$$-baserat Overleaf-projekt](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) för att utforska de djupare strukturerna i $$\mathrm \TeX$$ boxar genom att använda nodgrafer. I denna avslutande del gör vi en ”djupdykning” i mekaniken bakom hur $$\mathrm \TeX$$ beräknar glue-värden i en `\hbox`: en process som kallas *att sätta gluet*. Vi använder nodgrafer i stor utsträckning (introducerade i [Pandoras \hbox: Att använda LuaTeX för att lyfta på locket till TeX-boxar](/latex/sv/fordjupade-artiklar/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md) i denna serie) och visar hur man använder och tolkar en del av den data de ger: `glue_set`, `glue_sign` och `glue_order`.

Vi ger ett fullständigt genomarbetat exempel på glue-beräkningar för ett `\hbox` och går igenom mycket detaljer; men det kan finnas ytterligare omständigheter och överväganden som vi inte har plats att ta upp här, och den intresserade läsaren hänvisas till sidan 77 i $$\text{The } \mathrm \TeX \text{book}$$.

## Utmaningen

Anta att vi har en `\hbox` så här:

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

Här är hur denna box ser ut—för tydlighetens skull visas den förstorad och med kantlinje:

![box](/files/3b873f61f4913ccd988fc03468ea35e161f0a9e3)

Frågan är: vad blir det slutliga värdet, i $$\mathrm \TeX$$ punkter, av utrymmet (gluet) mellan följande objekt:

* A och B
* B och C
* C och D
* D och boxens slut

dvs. vi vill beräkna värdena för $$\mathrm{g}*{1}, \mathrm{g}*{2}, \mathrm{g}*{3} \text{ and } \mathrm{g}*{4}:$$

![lim](/files/5334bfe327ab619394e01a2a0c13e9b2a6964309)

Här är en nodgraf som representerar boxen ovan. Av särskilt intresse är tre värden som finns i avsnittet ”metadata”:

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

![nodgraf](/files/fd1f435258216f20205a98ad1ca672e1c134da91)

Det är viktigt att notera att en viss uppsättning värden för `glue_set`, `glue_sign` och `glue_order` påverkar endast glue i den översta boxen: de påverkar inte glue i *nästlade* boxar: varje nästlad box (hlist- eller vlist-objekt) har sina egna värden för dessa tre parametrar. Här är ett exempel på en `\hbox` nästlad i en yttre `\hbox`. I detta exempel kan du tydligt se de olika värdena för `glue_set`—naturligtvis kan den nästlade boxen också ha olika värden för `glue_sign` och `glue_order`.

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

![nodgraf](/files/3bd73753f57480106cd58ef4d9ff19c42b9090af)

## Typer av glue, infiniteter och ordningar: En sammanfattning

$$\mathrm \TeX$$ tillhandahåller ett antal primitiva kommandon relaterade till glue, inklusive:

* horisontellt glue: `\hskip`, `\hfil`, `\hfill`, `\hfilneg`, `\hss`;
* vertikalt glue:`\\vskip`, `\vfil`, `\vfill`, `\vfilneg`, `\vss`;

tillsammans med `\mskip` för att infoga glue i matematiska uttryck.

Ett glue-objekt definieras av en uppsättning av tre värden:

* **naturlig bredd**: hur mycket utrymme det upptar om du inte sträcker eller krymper det;
* **sträckkomponent**: hur mycket gluet kan sträckas;
* **krympkomponent**: hur mycket gluet kan krympas.

Det vi ska titta på är användningen av glue i en `\hbox{...}` och beräkningarna $$\mathrm \TeX$$ som används för att avgöra hur mycket utrymme gluet till slut kommer att uppta. Kommandot vi kommer att använda för att skapa lite *horisontell* glue är `\hskip`, som har formen:

`**\hskip** *<naturlig bredd>* **plus** *<mängd att sträcka>* **minus** *<mängd att krympa>*`

För *vertikal* glue du skulle använda `**\vskip** *<naturlig bredd>* **plus** *<mängd att sträcka>* **minus** *<mängd att krympa>*`.

Till exempel skulle ett typiskt horisontellt glue uttryckas som `\hskip 3pt plus 2pt minus 1pt`. Du kan också använda andra fysiska enheter:

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

## $$\mathrm \TeX$$ glue och enheter av ”oändlighet”

För krymp- eller sträckkomponenten i gluet $$\mathrm \TeX$$ införs en annan typ av enhet: så kallade ”oändligheter”: $$\text{fil}$$, $$\text{fill}$$ och $$\text{filll}$$. Dessa tre ”nivåer av oändlighet” är sådana att när de listas i följd är var och en ”mer oändlig” än den föregående:

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

Kanske är ”oändligheter” ett något förvirrande namn på dessa enheter—det kan vara hjälpsamt att också tänka på dem som olika nivåer av *prioritet*, eftersom, i slutändan, hjälper de till att avgöra vilka glue som faktiskt deltar i processen att sträckas eller krympas. Genom att ha glue med en ”oändlig” sträck- eller krympkomponent, $$\mathrm \TeX$$ kan du skapa glue som kan sträckas eller krympas med valfri önskad mängd. Observera att för ändliga glue, $$\mathrm \TeX$$ kommer att begränsa mängden som sådana glue kan krympas med. Ett exempel på ”oändligt” glue är

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

Observera att vi inte kan skriva till exempel `\hskip 1fil` eftersom $$\mathrm \TeX$$ kommer att rapportera ett fel med meddelandet `Otillåten måttenhet (pt infogat)`. I det här skedet kan dessa ”nivåer av oändlighet” låta väldigt märkliga men för närvarande får du bara acceptera det som det är, och snart kommer vi att se hur $$\mathrm \TeX$$ använder dessa oändligheter när den utför glue-beräkningar.

### Nivåer av oändlighet (”glue-ordning”)

Internt, när $$\mathrm \TeX$$ utför sina glue-beräkningar betraktar den varje nivå av oändlighet som en ”glue-ordning” från 0–3 där 0:e ordningen är för glue med fysiska dimensioner som bp, pt, mm och så vidare. Men med $$\text{Lua}\mathrm\TeX$$ finns en liten avvikelse eftersom det faktiskt har en extra typ (ordning) av oändlighet som inte finns i många andra $$\mathrm \TeX$$ motorer: $$\text{fi}$$ (se förklaring nedan). Om du läser $$\text{The } \mathrm \TeX\text{book}$$ kommer du inte att se någon hänvisning till $$\text{fi}$$ oändligheten—helt enkelt för att den inte är implementerad i Knuths ursprungliga $$\mathrm \TeX$$ programvara. Följaktligen har vi en liten ”diskrepans” mellan $$\text{Lua}\mathrm\TeX\text{'s}$$ ordning av oändligheter och de du kan se i böcker om $$\mathrm \TeX$$. $$\text{Lua}\mathrm\TeX$$ använder oändligheter vars ordning sträcker sig från 0–4 men andra (vanliga) $$\mathrm \TeX$$ motorer sträcker sig från 0–3. Här är en tabell som visar den glue-ordning som tilldelas varje typ av glue-enhet.

|                           |                              |                |     |      |       |
| ------------------------- | ---------------------------- | -------------- | --- | ---- | ----- |
|                           | Fysiska enheter (pt, mm, in) | fi             | fil | fill | filll |
| $$\text{Lua}\mathrm\TeX$$ | 0                            | 1              | 2   | 3    | 4     |
| Andra motorer             | 0                            | ej tillämpligt | 1   | 2    | 3     |

### Anmärkningar om $$\text{Lua}\mathrm\TeX$$: Varför ha en extra oändlighet?

$$\text{Lua}\mathrm\TeX$$ är härlett från ett antal projekt och kodbibliotek, inklusive ett som kallas [Omega](https://en.wikipedia.org/wiki/Omega_\(TeX\)). $$\text{Lua}\mathrm\TeX$$ införde vissa aspekter av Omegas kod och det inkluderar en ny typ av oändligt glue som kallas $$\text{fi}$$. Från Omegas manual:

> ”En ny oändlighetsnivå $$\text{fi}$$ har lagts till. Den är mindre än $$\text{fil}$$ men större än varje ändlig storhet. Dess ursprungliga avsikt var för sträckning mellan bokstäver: antingen ifyllning av svart, som görs för kalligrafiska skriftsystem såsom arabiska; eller för betoning, som i ryska; allt detta utan att behöva skriva om befintliga makropaket. Det finns därför ett nytt nyckelord, $$\text{fi}$$, och två nya primitiver, `\hfi` och `\vfi`.”

## Tillbaka till vår utmaning

I enlighet med Knuths modell, låt oss definiera två storheter:

* önskad bredd på en box: $$\mathrm{W}\_{\mathrm{D}}$$—hur stor vill vi att den ska vara;
* naturlig bredd på en box: $$\mathrm{W}\_{\mathrm{N}}$$—det totala utrymme som upptas av dess beståndsdelar innan några glues sträcks eller krymps.

### Den naturliga bredden hos en box

Den naturliga bredden hos en box är den totala bredden av alla komponenter i den boxen: tecken, kerns, nästlade boxar och allt glue. För glue inne i boxen bortser dess naturliga bredd från eventuell sträckning eller krympning av gluet: dvs. dess storlek innan någon sträckning eller krympning sker.

Återigen, här är boxen vi undersöker:

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

Tydligtvis vill vi att boxen ska vara 100pt bred, alltså $$\mathrm{W}*{\mathrm{D}}=100\mathrm{pt}$$ men vad är dess naturliga bredd, $$\mathrm{W}*{\mathrm{N}}$$? För att beräkna den naturliga bredden är det tydligt att vi behöver bredderna för de fyra tecknen (A, B, C och D) plus de naturliga bredderna för de fyra gluen.

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

Där $$\text{width}$$ är bara en notation för att beteckna ett objekts naturliga bredd. Vi kan få de naturliga bredderna för de fyra tecknen (A, B, C och D) från vår nodgraf:

![nodgraf](/files/1db96dc7b568ceb0b9a2a2a86cefc86d46c46c73)

Av nodgrafen ovan kan vi se att:

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

Nu behöver vi bara de naturliga bredderna för våra glues, som enkelt erhålls genom att ignorera sträck- och krympkomponenterna:

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

Alltså:

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

Vi har nu två nyckelinformationer:

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

Tydligtvis, $$\mathrm{W}*{\mathrm{D}} > \mathrm{W}*{\mathrm{N}}$$ och skillnaden är $$(100-33.4445)\text{pt}=66.5555\text{pt}$$; detta överskottsutrymme måste fyllas genom att sträcka gluen—men vilka och hur mycket?

### Vem har mest sträckning?

Följer vi Knuths metod (sidan 77 i $$\text{The } \mathrm \TeX \text{book}$$), men med tillägg för den extra oändlighetstypen ($$\text{fi}$$) som tillhandahålls av $$\text{Lua}\mathrm \TeX$$, är nästa steg att skriva ner boxens *totala* sträckning i formen:

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

Först, om vi skriver ner $$\text{total glue}$$:

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

kan vi sedan se att $$\text{total stretch}$$ är:

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

Om vi jämför detta med $$\text{total stretch} = y\_{0}+ y\_{1}\text{fi} +y\_{2}\text{fil} +y\_{3}\text{fill} +y\_{4}\text{filll}\space$$kan vi se att:

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

$$\mathrm\TeX$$ nästa steg ”frågar sig”: om man tittar på $$\text{total stretch}$$, vad är den högsta oändlighetsnivån med ett icke-nollvärde? Vid en granskning av vår boxs $$\text{total stretch}$$ det är tydligt att den ”mest oändliga” icke-noll sträckkomponenten är $$\text{fill}$$ och vi har $$y\_3=5$$ enheter av det: det är glues med en $$\text{fill}$$ sträckkomponent som tillhandahåller all sträckning. Nedsänkningsindex 3 i $$y\_3$$ berättar för oss `glue_order` av gluet som kommer att användas—i detta fall för sträckning. Om vi nu tittar på avsnittet ”metadata” i vår nodgraf för denna `\hbox` kan vi nu förstå ytterligare två ”metadatavärden” (vi `glue_set` i nästa avsnitt)

![metadata](/files/c543d259353df7f867262bb6f18ac152124b4ae3)

* `glue_sign`: berättar om gluet är inställt på sin naturliga längd, utsträckt eller krympt:
* 0=inställt på naturlig bredd
* 1=sträckning
* 2=krympning

I vårt exempel, `glue_sign` har värdet `1`, vilket betyder att de glues som deltar ska sträckas.

* `glue_order` berättar vilken ”oändlighet” som är inblandad; för $$\text{Lua}\mathrm \TeX$$ ett värde på 3 berättar att glues med en $$\text{fill}$$ komponent kommer att delta i glue-beräkningarna—i vårt fall kommer de att sträckas.

Alla glues som inte har en sträckkomponent definierad i enheter av $$\text{fill}$$ kommer att **sättas till sin naturliga längd**: dvs. de kommer inte att sträckas alls (i vårt fall).

### Hur mycket att sträcka eller krympa: beräkning av glue\_set

För att sammanfatta var vi är och vad vi vet:

1. önskad bredd på boxen: $$\mathrm{W}\_{\mathrm{D}} = 100\text{pt}$$;
2. naturlig bredd på boxen: $$\mathrm{W}\_{\mathrm{N}} = 33.4445\text{pt}$$;
3. glue måste sträckas men bara glues med en $$\text{fill}$$ sträckkomponent kommer att göra den sträckningen;
4. vi har totalt $$(2+3)=5$$ enheter av $$\text{fill}$$ tillgängliga.

Nästa fråga är: hur mycket kommer dessa glues faktiskt att sträckas? Här kommer *glue\_set-förhållandet*—kallas `glue_set` i vår nodgraf. Vad $$\mathrm \TeX$$ gör är att räkna ut hur mycket utrymme som måste fyllas och fördela den mängden utrymme mellan de lämpliga gluen i proportion till storleken på deras sträckkomponent. Om du går tillbaka till vår faktiska `\hbox` kan du se exakt vilka glues som har sträckkomponenter som innehåller enheter av $$\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%
}
```

Den $$\textit{glue set ratio }(\text{or } \verb*glue\_set*)$$ beräknas enligt följande:

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

Och nu det sista steget i $$\mathrm\TeX$$ algoritmen tillämpas:

1. för varje glue-objekt vars sträckkomponent matchar den önskade `glue_order` (3 i vårt fall) blir längden på det gluet:

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

3. alla andra glues sätts till sin naturliga längd—dvs. de sträcks inte alls.

Om vi tittar på gluen i vår box:

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

kan vi gå igenom dem för att beräkna deras slutliga värden:

1. **Mellan A och B**: `\hskip 4pt plus3pt minus 2pt`. Sträckkomponenten är `3pt`, vilket är ordning `0`. Den erforderliga `glue_order` är `3`: sträckkomponenten ignoreras och detta glue antar sin naturliga bredd på `4pt`.
2. **Mellan B och C**: `\hskip 0pt plus 2fil`. Sträckkomponenten är `2fil`, vilket är ordning `2`. Den erforderliga `glue_order` är `3`: sträckkomponenten ignoreras och detta glue antar sin naturliga bredd på `0pt`.
3. **Mellan C och D**: `\hskip 0pt plus 2fill`. Sträckkomponenten är `2fill`, vilket är ordning `3` och matchar den erforderliga `glue_order` för `3`. Detta glue kommer att sträckas till: $$\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. **Mellan D och boxens slut**: `\hskip 0pt plus 3fill`. Sträckkomponenten är `3fill`, vilket är ordning `3` och matchar den erforderliga `glue_order` för `3`. Detta glue kommer att sträckas till: $$\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}\ }$$

## Och till sist: Kontroll av den totala bredden

Processen att beräkna det faktiska utrymme som upptas av glue kallas *att sätta gluet* så vi kan nu kontrollera om vi har fyllt boxen till den önskade bredden, $$(\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} }$$

Vi känner nu till bredderna för alla glues och kan förbereda en grafisk bild som besvarar frågan som ställdes i början av denna artikel: här är glue-bredderna mellan tecknen i vår `\hbox`:

![lim](/files/6ced2d0906bbd2bc2d2e8d9385209c30577bec53)


---

# 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/sv/fordjupade-artiklar/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.
