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

# Hvordan TeX beregner limindstillinger i en \hbox

Dette er den tredje og afsluttende artikel i en serie, der ser på $$\mathrm \TeX$$ bokse og glue. Det første indlæg [Kasser og glue: En kort, men visuel, introduktion med LuaTeX](/latex/da/dybtgaende-artikler/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md) introducerede begreberne bokse og glue og blev fulgt af [Pandoras \hbox: Brug af LuaTeX til at løfte låget på TeX-bokse](/latex/da/dybtgaende-artikler/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md) som præsenterede et [$$\text{Lua}\mathrm\TeX$$-baseret Overleaf-projekt](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) for at udforske de dybere strukturer i $$\mathrm \TeX$$ bokse ved hjælp af nodegrafer. I denne afsluttende del tager vi et “dybt dyk” ned i mekanikken bag, hvordan $$\mathrm \TeX$$ beregner glue-værdier i en `\hbox`: en proces omtalt som *at sætte glue*. Vi gør omfattende brug af nodegrafer (introduceret i [Pandoras \hbox: Brug af LuaTeX til at løfte låget på TeX-bokse](/latex/da/dybtgaende-artikler/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md) i denne serie) og viser, hvordan man bruger og fortolker nogle af de data, de giver: `glue_set`, `glue_sign` og `glue_order`.

Vi giver et fuldt gennemarbejdet eksempel på glue-beregninger for en `\hbox` og dækker mange detaljer; der kan dog være yderligere omstændigheder og overvejelser, som vi ikke har plads til at behandle her, og den interesserede læser henvises til side 77 i $$\text{The } \mathrm \TeX \text{book}$$.

## Udfordringen

Antag, at vi har en `\hbox` som denne:

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

Her er, hvordan denne boks ser ud — vist for tydelighedens skyld forstørret og med kant:

![boks](/files/44b3d91cd9c3e3332fc450c14867ebee5f40acfb)

Spørgsmålet er: hvad er den endelige værdi, i $$\mathrm \TeX$$ punkter, af mellemrummet (glue) mellem de følgende elementer:

* A og B
* B og C
* C og D
* D og boksens slutning

dvs. vi vil beregne værdierne af $$\mathrm{g}*{1}, \mathrm{g}*{2}, \mathrm{g}*{3} \text{ and } \mathrm{g}*{4}:$$

![glue](/files/1fd342d6b779c148a451108c97e5b86f4de2a64d)

Her er en nodegraf, der repræsenterer boksen ovenfor. Særligt interessante er tre værdier i sektionen “metadata”:

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

![nodegraf](/files/e1723d2d9cfd42ae9d48719b91f62a3533d6957d)

Det er vigtigt at bemærke, at et bestemt sæt værdier for `glue_set`, `glue_sign` og `glue_order` påvirker kun glue i topniveau-boksen: de påvirker ikke glue i *indlejrede* bokse: hver indlejret boks (hlist- eller vlist-objekt) har sine egne værdier for disse tre parametre. Her er et eksempel på en `\hbox` indlejret i en ydre `\hbox`. I dette eksempel kan du tydeligt se de forskellige værdier af `glue_set`—selvfølgelig kan den indlejrede boks også have forskellige værdier for `glue_sign` og `glue_order`.

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

![nodegraf](/files/f4f8272dad7c8ebeef44d2d2a0f9cd0a66f632f6)

## Typer af glue, uendeligheder og ordener: Et sammendrag

$$\mathrm \TeX$$ indeholder en række primitive glue-relaterede kommandoer, herunder:

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

sammen med `\mskip` til indsættelse af glue i matematiske udtryk.

Et glue-element er defineret ved et sæt af tre værdier:

* **naturlig bredde**: hvor meget plads det optager, hvis du ikke strækker eller krymper det;
* **strækningskomponent**: hvor meget glue kan strækkes;
* **krympningskomponent**: hvor meget glue kan krympes.

Det, vi vil se på, er brugen af glue inde i en `\hbox{...}` og beregningerne $$\mathrm \TeX$$ bruger til at bestemme, hvor meget plads glue til sidst vil optage. Kommandoen, vi vil bruge til at skabe noget *vandret* glue er `\hskip`, som har formen:

`**\hskip** *<naturlig bredde>* **plus** *<mængde at strække>* **minus** *<mængde at krympe>*`

For *lodret* glue, som du ville bruge `**\vskip** *<naturlig bredde>* **plus** *<mængde at strække>* **minus** *<mængde at krympe>*`.

For eksempel ville noget typisk vandret glue blive udtrykt som `\hskip 3pt plus 2pt minus 1pt`. Du kan også bruge andre fysiske enheder:

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

## $$\mathrm \TeX$$ glue og enheder af “uendelighed”

For krympnings- eller strækningskomponenten af glue $$\mathrm \TeX$$ introducerer en anden type enhed: såkaldte “uendeligheder”: $$\text{fil}$$, $$\text{fill}$$ og $$\text{filll}$$. Disse tre “niveauer af uendelighed” er sådan, at når de listes i rækkefølge, er hvert enkelt “mere uendeligt” end det foregående:

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

Måske er “uendeligheder” et lidt forvirrende navn for disse enheder — det kan hjælpe også at tænke på dem som forskellige niveauer af *prioritet*, fordi de i sidste ende hjælper med at bestemme, hvilke glue-stykker der faktisk deltager i processen med at strække eller krympe. Ved at have glue med en “uendelig” stræknings- eller krympningskomponent, $$\mathrm \TeX$$ gør det muligt at skabe glue, der kan strækkes eller krympes med en hvilken som helst ønsket mængde. Bemærk, at for endelige glue, $$\mathrm \TeX$$ vil begrænse den mængde, som sådanne glue kan krympes med. Et eksempel på “uendelig” glue er

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

Bemærk, vi kan ikke skrive f.eks. `\hskip 1fil` fordi $$\mathrm \TeX$$ vil rapportere en fejl med meddelelsen `Ugyldig måleenhed (pt indsat)`. På dette tidspunkt kan disse “niveauer af uendelighed” lyde meget mærkelige, men indtil videre skal du blot acceptere det som det er, og vi vil snart se, hvordan $$\mathrm \TeX$$ bruger disse uendeligheder, når den udfører glue-beregninger.

### Niveauer af uendelighed (“glue-orden”)

Internt, når $$\mathrm \TeX$$ udfører sine glue-beregninger, betragtes hvert niveau af uendelighed som en “glue-orden” fra 0–3, hvor 0. orden er for glue med fysiske dimensioner såsom bp, pt, mm og så videre. Men med $$\text{Lua}\mathrm\TeX$$ er der en lille afvigelse, fordi den faktisk har en ekstra type (orden) af uendelighed, som ikke findes i mange andre $$\mathrm \TeX$$ motorer: $$\text{fi}$$ (se forklaring nedenfor). Hvis du læser $$\text{The } \mathrm \TeX\text{book}$$ vil du ikke se nogen omtale af $$\text{fi}$$ uendeligheden — simpelthen fordi den ikke er implementeret i Knuths oprindelige $$\mathrm \TeX$$ software. Følgelig har vi en lille “afbrydelse” mellem $$\text{Lua}\mathrm\TeX\text{'s}$$ orden for uendeligheder og dem, du måske ser i bøger om $$\mathrm \TeX$$. $$\text{Lua}\mathrm\TeX$$ bruger uendeligheder, hvis orden spænder fra 0–4, men andre (almindelige) $$\mathrm \TeX$$ motorer spænder fra 0–3. Her er en tabel, der viser den glue-orden, der er tildelt hver type glue-enhed.

|                           |                              |     |     |      |       |
| ------------------------- | ---------------------------- | --- | --- | ---- | ----- |
|                           | Fysiske enheder (pt, mm, in) | fi  | fil | fill | filll |
| $$\text{Lua}\mathrm\TeX$$ | 0                            | 1   | 2   | 3    | 4     |
| Andre motorer             | 0                            | N/A | 1   | 2    | 3     |

### Noter om $$\text{Lua}\mathrm\TeX$$: Hvorfor have en ekstra uendelighed?

$$\text{Lua}\mathrm\TeX$$ er afledt af en række projekter og kodebiblioteker, herunder et kaldet [Omega](https://en.wikipedia.org/wiki/Omega_\(TeX\)). $$\text{Lua}\mathrm\TeX$$ indarbejdede visse aspekter af Omegas kode, og det inkluderer en ny type uendelig glue kaldet $$\text{fi}$$. Fra Omega-manualen:

> “Et nyt uendelighedsniveau $$\text{fi}$$ er blevet tilføjet. Det er mindre end $$\text{fil}$$ men større end enhver endelig størrelse. Det oprindelige formål var strækning mellem bogstaver: enten udfyldning af sort, som det gøres for kalligrafiske skrifter som arabisk; eller til fremhævelse, som i russisk; alt dette uden at skulle omskrive eksisterende makropakker. Derfor er der et nyt nøgleord, $$\text{fi}$$, og to nye primitive kommandoer, `\hfi` og `\vfi`.”

## Tilbage til vores udfordring

Følgendе Knuths model, lad os definere to størrelser:

* den ønskede bredde af en boks: $$\mathrm{W}\_{\mathrm{D}}$$—hvor stor vil vi have, at den skal være;
* den naturlige bredde af en boks: $$\mathrm{W}\_{\mathrm{N}}$$—den samlede plads optaget af dens bestanddele før nogen glue er strakt eller krympet.

### Den naturlige bredde af en boks

Den naturlige bredde af en boks er den samlede bredde af alle komponenter i den boks: tegn, kerns, indlejrede bokse og alt glue. For glue inde i boksen ser den naturlige bredde bort fra enhver strækning eller krympning af glue: dvs. dens størrelse før nogen strækning eller krympning finder sted.

Her er igen boksen, vi undersøger:

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

Det er tydeligt, at vi ønsker, at boksen skal være 100pt bred, altså $$\mathrm{W}*{\mathrm{D}}=100\mathrm{pt}$$ men hvad med dens naturlige bredde, $$\mathrm{W}*{\mathrm{N}}$$? For at beregne den naturlige bredde er det klart, at vi har brug for bredderne af de fire tegn (A, B, C og D) plus de naturlige bredder af de fire glue-stykker.

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

Hvor $$\text{width}$$ er blot en notation til at angive den naturlige bredde af et element. Vi kan få de naturlige bredder af de fire tegn (A, B, C og D) fra vores nodegraf:

![nodegraf](/files/dcb051835c2cce390939d6551d8669a4096b4f4a)

Af nodegrafen ovenfor kan vi se, at:

$$\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 mangler vi kun de naturlige bredder af vores glue-stykker, som let fås ved at se bort fra stræk- og krympningskomponenterne:

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

Derfor:

$$\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 to centrale oplysninger:

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

Det er klart, $$\mathrm{W}*{\mathrm{D}} > \mathrm{W}*{\mathrm{N}}$$ og forskellen er $$(100-33.4445)\text{pt}=66.5555\text{pt}$$; dette overskydende rum skal udfyldes ved at strække glue-stykkerne — men hvilke og hvor meget?

### Hvem har mest stræk?

Følger Knuths metode (side 77 i $$\text{The } \mathrm \TeX \text{book}$$), men med tilladelse til den ekstra type uendelighed ($$\text{fi}$$) som leveres af $$\text{Lua}\mathrm \TeX$$, er næste trin at skrive boksens *samlede* stræk 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, hvis vi skriver $$\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 så se, at $$\text{total stretch}$$ er:

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

Sammenlignet med dette $$\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, at:

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

$$\mathrm\TeX$$ næste “spørger sig selv”: når man ser på $$\text{total stretch}$$, hvad er det højeste uendelighedsniveau med en ikke-nul-værdi? Ved at se på vores boks’ $$\text{total stretch}$$ er det tydeligt, at den “mest uendelige” ikke-nul strækningskomponent er $$\text{fill}$$ og vi har $$y\_3=5$$ enheder af det: det er glue med en $$\text{fill}$$ strækningskomponent, der giver al strækningen. Indekset 3 i $$y\_3$$ fortæller os `glue_order` af glue-stykket, der vil blive brugt — i dette tilfælde til strækning. Hvis vi nu ser på sektionen “metadata” i vores nodediagram for denne `\hbox` kan vi nu give mening til to yderligere “metadata-værdier” (vi vil behandle `glue_set` i næste afsnit)

![metadata](/files/6e5fca5fd7a25b43f9b42ad437760ffd3c9a65bf)

* `glue_sign`: fortæller dig, om glue er sat til sin naturlige længde, strakt eller krympet:
* 0=sat til naturlig bredde
* 1=stræk
* 2=krymp

I vores eksempel, `glue_sign` har værdien `1`, hvilket betyder, at deltagende glue-stykker skal strækkes.

* `glue_order` fortæller dig, hvilken “uendelighed” der er involveret; for $$\text{Lua}\mathrm \TeX$$ en værdi på 3 fortæller dig, at glue med en $$\text{fill}$$ komponent vil deltage i glue-beregninger — i vores tilfælde vil de strække.

Ethvert glue, der ikke har en strækningskomponent defineret i enheder af $$\text{fill}$$ vil være **sat til sin naturlige længde**: dvs. det vil slet ikke strække (i vores tilfælde).

### Hvor meget der skal strækkes eller krympes: beregning af glue\_set

For at opsummere, hvor vi er, og hvad vi ved:

1. ønsket bredde af boks: $$\mathrm{W}\_{\mathrm{D}} = 100\text{pt}$$;
2. naturlig bredde af boks: $$\mathrm{W}\_{\mathrm{N}} = 33.4445\text{pt}$$;
3. glue skal strækkes, men kun glue-stykker med en $$\text{fill}$$ strækningskomponent vil gøre denne strækning;
4. vi har i alt $$(2+3)=5$$ enheder af $$\text{fill}$$ til rådighed.

Næste spørgsmål er: hvor meget vil disse glue-stykker faktisk strække? Ind med *glue set-forholdet*—omtalt som `glue_set` i vores nodegraf. Det, $$\mathrm \TeX$$ gør, er at finde ud af, hvor meget plads der skal udfyldes, og derefter fordele den mængde plads mellem de passende glue-stykker proportionalt med størrelsen af deres strækningskomponent. Hvis du ser tilbage på vores faktiske `\hbox` kan du se præcis, hvilke glue-stykker der har strækningskomponenter indeholdende enheder af $$\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*)$$ beregnes som følger:

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

Og nu det sidste trin i $$\mathrm\TeX$$ algoritmen anvendes:

1. for hvert glue-stykke, hvis strækningskomponent matcher den ønskede `glue_order` (3 i vores tilfælde), bliver længden af det glue til:

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

3. alle andre glue-stykker sættes til deres naturlige længde — dvs. de strækker slet ikke.

Når vi ser på glue-stykkerne i vores boks:

```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 gennemgå dem for at beregne deres endelige værdier:

1. **Mellem A og B**: `\hskip 4pt plus3pt minus 2pt`. Strækningskomponenten er `3pt`, som er orden `0`. Den krævede `glue_order` er `3`: strækningskomponenten ignoreres, og dette glue antager sin naturlige bredde på `4pt`.
2. **Mellem B og C**: `\hskip 0pt plus 2fil`. Strækningskomponenten er `2fil`, som er orden `2`. Den krævede `glue_order` er `3`: strækningskomponenten ignoreres, og dette glue antager sin naturlige bredde på `0pt`.
3. **Mellem C og D**: `\hskip 0pt plus 2fill`. Strækningskomponenten er `2fill`, som er orden `3` og matcher den krævede `glue_order` på `3`. Dette glue vil blive strakt til: $$\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. **Mellem D og slutningen af boksen**: `\hskip 0pt plus 3fill`. Strækningskomponenten er `3fill`, som er orden `3` og matcher den krævede `glue_order` på `3`. Dette glue vil blive strakt til: $$\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}\ }$$

## Og til sidst: Kontrol af den samlede bredde

Processen med at beregne den faktiske plads, som glue optager, kaldes *at sætte glue* så vi kan nu kontrollere, om vi har fyldt boksen til den ønskede bredde, $$(\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 kender nu bredderne af alle glue-stykker og kan forberede en grafik, der besvarer spørgsmålet, der blev stillet i begyndelsen af denne artikel: her er glue-bredderne mellem tegnene i vores `\hbox`:

![glue](/files/6f7af31136c4cc7a0e839cee688de76092c47e4e)


---

# 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/da/dybtgaende-artikler/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.
