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

# Hvordan TeX beregner liminnstillinger i en \hbox

Dette er den tredje, og avsluttende, artikkelen i en serie som ser nærmere på $$\mathrm \TeX$$ bokser og lim. Det første innlegget [Bokser og lim: En kort, men visuell, introduksjon med LuaTeX](/latex/no/dybdeartikler/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md) introduserte konseptene bokser og lim og ble fulgt av [Pandoras \hbox: Bruke LuaTeX til å løfte lokket på TeX-bokser](/latex/no/dybdeartikler/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md) som presenterte et [$$\text{Lua}\mathrm\TeX$$-basert Overleaf-prosjekt](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) for å utforske de dypere strukturene i $$\mathrm \TeX$$ bokser ved hjelp av nodediagrammer. I denne siste delen tar vi et «dykk ned i» mekanikken bak hvordan $$\mathrm \TeX$$ beregner limverdier i en `\hbox`: en prosess kalt *å sette limet*. Vi bruker nodediagrammer mye (introdusert i [Pandoras \hbox: Bruke LuaTeX til å løfte lokket på TeX-bokser](/latex/no/dybdeartikler/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md) i denne serien) og viser hvordan man bruker og tolker noe av dataene de gir: `glue_set`, `glue_sign` og `glue_order`.

Vi gir et fullt utarbeidet eksempel på limberegninger for en `\hbox` og går gjennom mange detaljer; det kan likevel finnes ytterligere omstendigheter og hensyn som vi ikke har plass til å ta opp her, og den interesserte leseren henvises til side 77 i $$\text{The } \mathrm \TeX \text{book}$$.

## Utfordringen

Anta at vi har en `\hbox` slik 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%
}
```

Slik ser denne boksen ut—for tydelighetens skyld vist forstørret og med en ramme:

![boks](/files/29aac6b88928f704bff98af535792536403888a6)

Spørsmålet er: hva er den endelige verdien, i $$\mathrm \TeX$$ punkter, av mellomrommet (limet) mellom følgende elementer:

* A og B
* B og C
* C og D
* D og slutten av boksen

dvs. vi vil beregne verdiene til $$\mathrm{g}*{1}, \mathrm{g}*{2}, \mathrm{g}*{3} \text{ and } \mathrm{g}*{4}:$$

![glue](/files/6b8c0ddd86723d7376abb8498ad2149fe39e5686)

Her er et nodediagram som representerer boksen ovenfor. Av særlig interesse er tre verdier i «metadata»-seksjonen:

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

![nodediagram](/files/c7c4e452b12a4c54af02ef0e0e0ecf8ec4888754)

Det er viktig å merke seg at et bestemt sett med verdier for `glue_set`, `glue_sign` og `glue_order` bare påvirker lim innenfor toppnivåboksen: de påvirker ikke lim innenfor *nestede* bokser: hver nestede boks (hlist- eller vlist-objekt) har sine egne verdier for disse tre parameterne. Her er et eksempel på en `\hbox` nestet i en ytre `\hbox`. I dette eksempelet kan du tydelig se de forskjellige verdiene til `glue_set`—selvfølgelig kan den nestede boksen også ha andre verdier for `glue_sign` og `glue_order`.

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

![nodediagram](/files/78e96f7f22e05b66d0ad31de2a4279852c9cb233)

## Limetyper, uendeligheter og grader: en oppsummering

$$\mathrm \TeX$$ tilbyr en rekke primitive limrelaterte kommandoer, inkludert:

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

sammen med `\mskip` for å sette inn lim i matematiske uttrykk.

Et limelement er definert av et sett med tre verdier:

* **naturlig bredde**: hvor mye plass det opptar hvis du ikke strekker eller krymper det;
* **strekkkomponent**: hvor mye limet kan strekkes;
* **krympkomponent**: hvor mye limet kan krympes.

Det vi skal se på, er bruken av lim inne i en `\hbox{...}` og beregningene $$\mathrm \TeX$$ som brukes for å bestemme hvor mye plass limet til slutt vil oppta. Kommandoen vi skal bruke for å lage noe *horisontal* lim er `\hskip`, som har formen:

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

For *vertikal* lim du ville brukt `**\vskip** *<natural width>* **plus** *<amount to stretch>* **minus** *<amount to shrink>*`.

For eksempel vil noe typisk horisontalt lim uttrykkes som `\hskip 3pt plus 2pt minus 1pt`. Du kan også bruke andre fysiske enheter:

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

## $$\mathrm \TeX$$ lim og enheter for «uendelighet»

For krymp- eller strekkkomponenten til limet $$\mathrm \TeX$$ innfører en annen type enhet: såkalte «uendeligheter»: $$\text{fil}$$, $$\text{fill}$$ og $$\text{filll}$$. Disse tre «uendelighetsnivåene» er slik at når de listes i rekkefølge, er hvert nivå «mer uendelig» enn det forrige:

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

Kanskje «uendeligheter» er et litt forvirrende navn på disse enhetene—det kan være nyttig også å tenke på dem som ulike nivåer av *prioritet*, fordi de til syvende og sist hjelper til med å bestemme hvilke lim som faktisk deltar i prosessen med å strekke eller krympe. Ved å ha lim med en «uendelig» strekk- eller krympkomponent, $$\mathrm \TeX$$ kan du lage lim som kan strekkes eller krympes med enhver ønsket mengde. Merk at for endelige lim, $$\mathrm \TeX$$ vil begrense hvor mye slike lim kan krympe. Et eksempel på «uendelig» lim er

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

Merk at vi for eksempel ikke kan skrive, `\hskip 1fil` fordi $$\mathrm \TeX$$ vil rapportere en feil med meldingen `Illegal unit of measure (pt inserted)`. På dette punktet kan disse «uendelighetsnivåene» høres veldig merkelige ut, men for nå kan du bare godta det som det er, og snart skal vi se hvordan $$\mathrm \TeX$$ bruker disse uendelighetene når den utfører limberegninger.

### Uendelighetsnivåer («limgrad»)

Internt, når $$\mathrm \TeX$$ utfører limberegningene sine, betrakter den hvert uendelighetsnivå som en «limgrad» fra 0–3, der 0. grad er for lim med fysiske enheter som bp, pt, mm og så videre. Men med $$\text{Lua}\mathrm\TeX$$ er det et lite avvik fordi den faktisk har en ekstra type (grad) av uendelighet som ikke finnes i mange andre $$\mathrm \TeX$$ motorer: $$\text{fi}$$ (se forklaring nedenfor). Hvis du leser $$\text{The } \mathrm \TeX\text{book}$$ vil du ikke se noen omtale av $$\text{fi}$$ uendeligheten—rett og slett fordi den ikke er implementert i Knuths opprinnelige $$\mathrm \TeX$$ programvaren. Følgelig har vi en liten «diskontinuitet» mellom $$\text{Lua}\mathrm\TeX\text{'s}$$ uendelighetsgrader og de du kan se i bøker om $$\mathrm \TeX$$. $$\text{Lua}\mathrm\TeX$$ bruker uendeligheter hvis grad går fra 0–4, men andre (vanlige) $$\mathrm \TeX$$ motorer går fra 0–3. Her er en tabell som viser limgraden som er tildelt hver type limenhet.

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

### Merknader om $$\text{Lua}\mathrm\TeX$$: Hvorfor ha en ekstra uendelighet?

$$\text{Lua}\mathrm\TeX$$ er avledet fra en rekke prosjekter og kodelbiblioteker, inkludert et som heter [Omega](https://en.wikipedia.org/wiki/Omega_\(TeX\)). $$\text{Lua}\mathrm\TeX$$ innlemmet visse aspekter av Omegas kode, og det inkluderer en ny type uendelig lim kalt $$\text{fi}$$Fra Omega-manualen:

> «Et nytt uendelighetsnivå $$\text{fi}$$ har blitt lagt til. Det er mindre enn $$\text{fil}$$ men større enn enhver endelig størrelse. Den opprinnelige hensikten var strekk mellom bokstaver: enten utfylling av de svarte områdene, slik man gjør i kalligrafiske skriftsystemer som arabisk; eller for utheving, som i russisk; alt dette uten å måtte skrive om eksisterende makropakker. Det finnes derfor et nytt nøkkelord, $$\text{fi}$$, og to nye primitiver, `\hfi` og `\vfi`».

## Tilbake til utfordringen vår

I tråd med Knuths modell skal vi definere to størrelser:

* ønsket bredde på en boks: $$\mathrm{W}\_{\mathrm{D}}$$—hvor stor vil vi at den skal være;
* den naturlige bredden til en boks: $$\mathrm{W}\_{\mathrm{N}}$$—den totale plassen som opptas av elementene den består av før noe lim strekkes eller krympes.

### Den naturlige bredden til en boks

Den naturlige bredden til en boks er den totale bredden av alle komponentene i den boksen: tegn, kerns, nestede bokser og alt lim. For lim inne i boksen ignorerer den naturlige bredden all strekk eller krymping av limet: altså størrelsen før eventuell strekk eller krymping finner sted.

Her er igjen boksen 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%
}
```

Klart nok vil vi at boksen skal være 100pt bred, derfor $$\mathrm{W}*{\mathrm{D}}=100\mathrm{pt}$$ men hva med dens naturlige bredde, $$\mathrm{W}*{\mathrm{N}}$$? For å beregne den naturlige bredden er det klart at vi trenger breddene til de fire tegnene (A, B, C og D) pluss de naturlige breddene til de fire limene.

$$\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 bare en notasjon for å angi den naturlige bredden til et element. Vi kan hente de naturlige breddene til de fire tegnene (A, B, C og D) fra nodediagrammet vårt:

![nodediagram](/files/f671dda536f9adde349228681578e2d1d8056244)

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

Nå trenger vi bare de naturlige breddene til limene våre, som lett fås ved å se bort fra strekk- og krympkomponentene:

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

Dermed:

$$\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 nå to nøkkelinformasjoner:

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

Klart nok, $$\mathrm{W}*{\mathrm{D}} > \mathrm{W}*{\mathrm{N}}$$ og forskjellen er $$(100-33.4445)\text{pt}=66.5555\text{pt}$$; dette overskuddsrommet må fylles ved å strekke limene—men hvilke og hvor mye?

### Hvem har mest strekk?

I tråd med Knuths metode (side 77 i $$\text{The } \mathrm \TeX \text{book}$$)$$\text{fi}$$) som tilbys av $$\text{Lua}\mathrm \TeX$$, er neste steg å skrive ned boksens *totale* strekk 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 ned $$\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 deretter 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 $$\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$$ spør $$\text{total stretch}$$, hva er det høyeste uendelighetsnivået med en ikke-nullverdi? Ved inspeksjon av boksens $$\text{total stretch}$$ er det klart at den «mest uendelige» ikke-null strekkkomponenten er $$\text{fill}$$ og vi har $$y\_3=5$$ enheter av det: det er lim med en $$\text{fill}$$ strekkkomponent som står for all strekkingen. Indeksen 3 i $$y\_3$$ forteller oss `glue_order` til limet som skal brukes—i dette tilfellet for strekk. Nå, hvis vi ser på «metadata»-seksjonen i nodediagrammet vårt for denne `\hbox` kan vi nå forstå to til «metadataverdier» (vi skal ta for oss `glue_set` i neste seksjon)

![metadata](/files/6d5bd6945089ffd94105444d6665d0e833a75197)

* `glue_sign`: forteller deg om limet er satt til sin naturlige lengde, strekt eller krympet:
* 0=satt til naturlig bredde
* 1=strekk
* 2=krymp

I vårt eksempel er `glue_sign` har verdien `1`, noe som betyr at de deltakende limene skal strekkes.

* `glue_order` forteller deg hvilken «uendelighet» som er involvert; for $$\text{Lua}\mathrm \TeX$$ forteller en verdi på 3 deg at lim med en $$\text{fill}$$ komponent vil delta i limberegningene—i vårt tilfelle vil de strekkes.

Alt lim som ikke har en strekkkomponent definert i enheter av $$\text{fill}$$ vil være **satt til sin naturlige lengde**: dvs. det vil (i vårt tilfelle) ikke strekkes i det hele tatt.

### Hvor mye som skal strekkes eller krympes: beregning av glue\_set

For å oppsummere hvor vi er og hva vi vet:

1. ønsket bredde på boksen: $$\mathrm{W}\_{\mathrm{D}} = 100\text{pt}$$;
2. naturlig bredde på boksen: $$\mathrm{W}\_{\mathrm{N}} = 33.4445\text{pt}$$;
3. limet må strekkes, men bare lim med en $$\text{fill}$$ strekkkomponent vil gjøre den strekkingen;
4. vi har totalt $$(2+3)=5$$ enheter av $$\text{fill}$$ tilgjengelig.

Neste spørsmål er: hvor mye vil disse limene faktisk strekkes? Her kommer *glue\_set-forholdet*—omtalt som `glue_set` i nodediagrammet vårt. Det $$\mathrm \TeX$$ gjør er å regne ut hvor mye plass som må fylles, og deretter fordele den mengden plass mellom de aktuelle limene i forhold til størrelsen på strekkkomponenten deres. Hvis du ser tilbake på vårt faktiske `\hbox` kan du se nøyaktig hvilke lim som har strekkkomponenter som inneholder 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*)$$ 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 nå det siste steget i $$\mathrm\TeX$$ algoritmen brukes:

1. for hvert limelement hvis strekkkomponent samsvarer med den ønskede `glue_order` (3 i vårt tilfelle) blir lengden på det limet:

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

3. alle andre lim settes til sin naturlige lengde—dvs. de strekkes ikke i det hele tatt.

Ser vi på limene i boksen vår:

```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å gjennom dem for å beregne de endelige verdiene deres:

1. **Mellom A og B**: `\hskip 4pt plus3pt minus 2pt`. Strekkkomponenten er `3pt`, som er grad `0`1 `glue_order` er `3`: strekkkomponenten ignoreres, og dette limet antar sin naturlige bredde på `4pt`.
2. **Mellom B og C**: `\hskip 0pt plus 2fil`. Strekkkomponenten er `2fil`, som er grad `2`1 `glue_order` er `3`: strekkkomponenten ignoreres, og dette limet antar sin naturlige bredde på `0pt`.
3. **Mellom C og D**: `\hskip 0pt plus 2fill`. Strekkkomponenten er `2fill`, som er grad `3` og samsvarer med den ønskede `glue_order` på `3`. Dette limet vil bli strukket 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. **Mellom D og slutten av boksen**: `\hskip 0pt plus 3fill`. Strekkkomponenten er `3fill`, som er grad `3` og samsvarer med den ønskede `glue_order` på `3`. Dette limet vil bli strukket 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 slutt: kontroll av den totale bredden

Prosessen med å beregne den faktiske plassen som opptas av lim, kalles *å sette limet* så vi kan nå sjekke om vi har fylt boksen til den ønskede 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 kjenner nå breddene til alle limene og kan lage en grafikk som besvarer spørsmålet som ble stilt i begynnelsen av denne artikkelen: her er limbreddene mellom tegnene i vår `\hbox`:

![glue](/files/f970427950adba2d0b2ce549dcd8108157b0037e)


---

# 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/no/dybdeartikler/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.
