> 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/15-how-do-tex-engines-typeset-tables-2.md).

# Hvordan typograferer TeX-motorer tabeller 2

## Hvordan typograferer TeX-motorer tabeller 2

## TeX-motorer omtaler tabeller som alignments

I [dokumentationen af TeX's kildekode](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) Knuth diskuterer ikke TeX's evne til at “sætte tabeller”, men beskriver i stedet TeX's algoritmer til at konstruere såkaldte *alignments*. TeX's typografering af tabeller er i praksis en automatiseret boksjusteringsproces: at arrangere bokse (tabelceller, rækker og kolonner) for at opnå et pænt rektangulært gitter eller en matrix—selvfølgelig er der mange nuancer i denne proces i TeX. *mange* nuancer i denne proces.

Begrebet “alignment” afspejles også i navnene på de to kommandoer til satsning af tabeller, der er indbygget i alle TeX-motorer:

* `\halign` (horisontal justering), og
* `\valign` (vertikal justering).

Vi vil udforske begge kommandoer gennem hele denne artikelserie og begynde med en mere formel oversigt over formatet/strukturen for `\halign` og `\valign` kommandoerne for at lægge fundamentet til senere, dybdegående artikler i denne serie.

### TeX's tabeller er bokse og afstand

De enkelte tabelceller indeholder typisk forskelligt indhold såsom tekstlinjer, matematik eller grafik, hvilket giver et sæt tabelceller, der har forskellige bredder, højder eller dybder af satsmateriale. På en eller anden måde skal TeX arbejde med disse celler, med varierende indholds-dimensioner, for at konstruere den endelige tabel, hvor hver række har en bestemt højde og hver kolonne en bestemt bredde. TeX skal udlede passende værdier for højderne af hver række og bredderne af hver kolonne ud fra samlingen af tabelceller i varierende størrelse.

TeX kan imidlertid ikke kende den sande størrelse af hver celles indhold, før dette indhold er sat; derfor arbejder TeX sig gennem hele tabellen, sætter hver celle, for at få de størrelsesdata, der kræves for at færdiggøre tabelayoutet. Ud fra disse størrelsesdata kan TeX bestemme den korrekte højde for hver række og bredden for hver kolonne. TeX kan også støde på tomme celler eller celler, som brugeren vil have skal spænde over flere kolonner eller flere rækker, og alt dette må TeX omhyggeligt indregne i sine beregninger. Først efter at have “filtreret” denne brogede samling af celle-(boks-)størrelsesdata kan TeX bestemme de endelige værdier for kolonnebredder i en `\halign`, eller rækkehøjder for `\valign` og bruger disse værdier i de afsluttende faser af sine algoritmer til tabellayout.

I praksis, og “under motorhjelmen”, består TeX's tabelsætning af flere trin. Groft sagt sætter TeX først en “kladde”- eller “ufuldstændig” version af tabellen, mens den indsamler og behandler cellestørrelsesdata—og data om eventuelle `\span` kommandoer, der bruges i tabellen. I de sidste trin genbehandler TeX denne “ufuldstændige” version af tabellen for at færdiggøre `\halign` kolonnebredder eller `\valign` rækkehøjder og opnå det færdige layout—alt sammen noget, vi vil udforske i denne artikelserie.

## \halign og \valign: to måder at konstruere tabeller på

Alle TeX-motorer tilbyder to *indbyggede* kommandoer (primitiver), der er designet til satsning af tabeller (alignments): `\halign` og `\valign`, som deler mange kernefunktioner, men også adskiller sig på nogle grundlæggende måder. Den væsentlige forskel mellem `\halign` og `\valign` er, hvordan de konstruerer deres respektive tabeller: række for række eller kolonne for kolonne:

* `\halign`: sætter tabeller række for række for at skabe individuelle rækker, som stables lodret og danner tabellens kolonner
* `\valign`: sætter tabeller kolonne for kolonne for at skabe individuelle kolonner, som stables horisontalt for at danne tabellens rækker

### \halign

Det følgende diagram viser konstruktionen af en tabel oprettet af `\halign`. Tabellen sættes række for række med de enkelte rækker stablet lodret. Nogle konsekvenser af dette er:

* tabelkolonnerne opstår ved lodret stabling af tabelrækkerne
* sideombrydninger kan finde sted mellem tabelrækkerne
* ikke-tabelmateriale kan indsættes mellem rækkerne (via `\nolign`(som vi ser på senere)

![](/files/7b3c974149ca4ec3965485b3bd65293b4cd196f4)

### \valign

Det følgende diagram viser konstruktionen af en tabel oprettet af `\valign`. Tabellen sættes kolonne for kolonne med de enkelte kolonner stablet horisontalt (side om side). Nogle konsekvenser af dette er:

* tabelrækkerne opstår ved horisontal stabling af tabelkolonnerne
* linjeombrydninger kan finde sted mellem tabelkolonnerne
* ikke-tabelmateriale kan indsættes mellem kolonnerne (via `\noalign`(som vi ser på senere)

![](/files/4a0597eb773ab4af5e1d561654c5ca15f4639499)

### Eksempler

Følgende eksempel er beregnet til at fremhæve række *vs*. kolonne-tilgangen for \halign og \valign.

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Tætsluttende bokskanter
\setlength{\fboxsep}{0pt}

Her er en \verb|\valign|-tabel:
\begingroup
% \hsize styrer \valign
% kolonnebredder. Vi sætter også
% \parindent til en mindre værdi
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr % Præamblen: dækkes senere (i stor detalje!)
A&B&C\cr % Den første KOLONNE i denne \valign-tabel
D&E&F\cr
G&H&I\cr
}}
\endgroup

% Bemærk: af grunde, der forklares senere
% \halign skal placeres i en \vbox
Her er en \verb|\halign|-tabel: \fbox{%
\vbox{\halign{
#&#&#\cr % Præamblen: dækkes senere (i stor detalje!)
A&B&C\cr % Den første RÆKKE i denne \halign-tabel
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Åbn dette eksempel i Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+table+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A+%0A%5Cbegingroup%0A%25+%5Chsize+controls+the+%5Cvalign+%0A%25+column+widths.+We+also+set+%0A%25+%5Cparindent+to+a+smaller+value%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign%7B%0A%23%26%23%26%23%5Ccr+%25+The+preamble%3A+covered+later+%28in+great+detail%21%29%0AA%26B%26C%5Ccr+%25+The+first+COLUMN+of+this+%5Cvalign+table%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%0A%25+Note%3A+for+reasons+explained+later%0A%25+the+%5Chalign+has+to+be+put+in+a+%5Cvbox%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table%3A+%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign%7B%0A%23%26%23%26%23%5Ccr+%25+The+preamble%3A+covered+later+%28in+great+detail%21%29%0AA%26B%26C%5Ccr+%25+The+first+ROW+of+this+%5Chalign+table%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Dette eksempel giver følgende output: ![](/files/832db0569f979624747558de1b3a82f6480983b8)

Følgende grafik viser en kommenteret version af tabellerne, som blev produceret af koden ovenfor. Senere i denne artikelserie vil vi behandle emner som:

* hvad er tabelpræambler?
* hvorfor sætter vi `\hsize` og `\parindent` for `\valign` tabeller?

For nuværende skal du blot bemærke række- vs. kolonne-tilgangen i `\halign` *vs*. `\valign` tabelkonstruktionen:

![](/files/641e14c5a24a00d10017fac3d682f0568f521a4c)

## Generel form for \halign og \valign

Til at begynde med vil vi gennemgå de grundlæggende egenskaber og det generelle format for `\halign` og `\valign` men uden (endnu) at gå i nogen reel detalje. [Som nævnt](#intro), anlægger vi en lidt formel oversigt over formen/strukturen af `\halign` og `\valign` kommandoerne for at lægge fundamentet til de efterfølgende artikler i denne serie.

Den mest generelle form af de `\halign` og `\valign` kommandoer kan skrives som følger:

`\halign` $$\langle$$⁠`valgfri specifikation`⁠$$\rangle$$ { $$\langle$$⁠`præambel`⁠$$\rangle$$ $$\langle$$⁠`krop`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`valgfri specifikation`⁠$$\rangle$$ { $$\langle$$⁠`præambel`⁠$$\rangle$$ $$\langle$$⁠`krop`⁠$$\rangle$$ }

Som du kan se, omfatter begge `\halign` og `\valign` tre hovedafsnit:

* [$$\langle$$⁠`valgfri specifikation`⁠$$\rangle$$](#optspec)
* [$$\langle$$⁠`præambel`⁠$$\rangle$$](#preamble)
* [$$\langle$$⁠`krop`⁠$$\rangle$$](#body)

## Den $$\langle$$⁠valgfri specifikation⁠$$\rangle$$

Tabellens standardstørrelse/-udstrækning, dens såkaldte "naturlige størrelse", bestemmes af dens indhold—for at præcisere henviser vi med størrelse/udstrækning til

* det *bredden* af en tabel skabt af `\halign`, eller
* det *højden* af en tabel skabt af `\valign`

En $$\langle$$⁠`valgfri specifikation`⁠$$\rangle$$ kan bruges til at “tilsidesætte” tabellens naturlige størrelse og har én af to former:

* **`til`** $$\langle$$**⁠`dimension`⁠**$$\rangle$$
* **`spread`** $$\langle$$**⁠`dimension`⁠**$$\rangle$$

hvor

* $$\langle$$**⁠`dimension`⁠**$$\rangle$$ er en længde angivet i enheder, som TeX forstår, såsom pt, mm eller cm—længden kan også angives som en kommando, der udvides til en værdi angivet i passende enheder;
* **`til`** og **`spread`** er TeX-nøgleord, der angiver typen af tilsidesættelse af den naturlige størrelse:
  * **`til`**: sætter tabellens størrelse til den angivne $$\langle$$⁠`dimension`⁠$$\rangle$$ værdi
  * **`spread`**: lægger den angivne $$\langle$$⁠`dimension`⁠$$\rangle$$ værdi til tabellens naturlige størrelse

Virkningen af en $$\langle$$⁠`valgfri specifikation`⁠$$\rangle$$ afhænger af den type tabel, der sættes: den vil justere en `\halign` tabellens naturlige *bredden*, eller en `\valign` tabellens naturlige *højden*.

Her er nogle eksempler:

* `\halign **to 100pt**{...}`: sætter `\halign` tabellens bredde til `100pt`
* `\valign **to 50pt**{...}`: sætter `\valign` tabellens højde til `30pt`
* `\halign **spread 30pt**{...}`: lægger 30pt til den `\halign` tabellens naturlige bredde. Omvendt vil skrivningen **spread -30pt** reducere tabellens bredde med 30pt.
* `\valign **spread 20pt**{...}`: lægger 20pt til den `\valign` tabellens naturlige højde. Omvendt vil skrivningen **spread -20pt** reducere tabellens højde med 20pt.

Følgende kode genbruger tabel-eksemplerne ovenfor, men anvender en $$\langle$$⁠`valgfri specifikation`⁠$$\rangle$$ til en `\valign` og `\halign` tabel:

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Tætsluttende bokskanter
\setlength{\fboxsep}{0pt}

Her er en \verb|\valign|-tabel:
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup

Her er en \verb|\halign|-tabel:
\fbox{%
\vbox{\halign to 100pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Åbn dette eksempel i Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+table+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A+%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+50pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table%3A%0A%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign+to+100pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Dette eksempel producerer det output, der er vist nedenfor:

![](/files/0e2b2f54f38563af144574739499e3334252d9c4)

—men bemærk, hvordan indholdet i begge tabeller er “presset sammen”. Årsagen er fraværet af fleksibel afstand (glue), som TeX kan bruge til at strække indholdet ud, så det fylder den ekstra plads, der er givet af **`til`** $$\langle$$**⁠`dimension`⁠**$$\rangle$$. Her springer vi lidt fremad for at nævne `\tabskip` kommando.

#### En indledende introduktion til \tabskip-kommandoen

Æstetikken i en tabels layout kan kræve justering af afstanden mellem dens rækker eller kolonner, så det er ikke overraskende, at TeX-motorer har en kommando kaldet `\tabskip` som lader dig gøre det. `\tabskip` bruges til at angive (og variere) mængden af fleksibel afstand (“glue”), som TeX placerer mellem kolonnerne i en `\halign` eller rækkerne i en `\valign`. Senere artikler vil udforske `\tabskip` i langt større detaljer.

Som et indledende eksempel bruger den følgende kode en indstilling for `\tabskip` som får TeX til at indsætte noget (meget) fleksibel afstand mellem rækkerne i en `\valign` tabel. Den fleksible afstand gør det muligt for tabelrækkerne at brede sig ud og udfylde den ekstra plads, der skabes af den $$\langle$$⁠`valgfri specifikation`⁠$$\rangle$$ af **`to 50pt`**:

```latex
\documentclass{article}
\setlength{\fboxsep}{0pt}
\setlength{\parindent}{0pt}
\newcommand{\optspec}{\(\langle \texttt{optional specification} \rangle\)}
\begin{document}
\pagestyle{empty}
Her er en \verb|\valign|-tabel:
\vspace{6pt}

\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\vspace{6pt}

Her er den samme \verb|\valign|-tabel, men med en \optspec{} på ``\texttt{to 50pt}''. Bemærk, hvordan rækkerne er ``presset sammen'', fordi der ikke er nogen tilgængelig ``strækbar glue'' mellem rækkerne:

\vspace{6pt}
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\vspace{6pt}

Vi vil bruge \verb|\valign|-tabellen med en \optspec{} på ``\texttt{to 50pt}'', men give ``fleksibel afstand'' via \verb|\tabskip|-kommandoen. Her giver \verb|\tabskip| nok ``glue'' til at gøre det muligt for \verb|\valign|-rækkerne at ``strække sig ud'' og udfylde enhver tilgængelig ekstra plads. Her er den ``udstrakte'' \verb|\valign|-tabel:

\tabskip=0pt plus1fil % Dette sætter \tabskip til en meget fleksibel glue
\vspace{6pt}

\def\mylen{50pt}
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to \mylen{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\end{document}
```

[Åbn dette eksempel i Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+example+using+tabskip+glue\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%5Csetlength%7B%5Cparindent%7D%7B0pt%7D%0A%5Cnewcommand%7B%5Coptspec%7D%7B%5C%28%5Clangle+%5Ctexttt%7Boptional+specification%7D+%5Crangle%5C%29%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cvspace%7B6pt%7D%0A%0AHere+is+the+same+%5Cverb%7C%5Cvalign%7C+table+but+with+an+%5Coptspec%7B%7D+of+%60%60%5Ctexttt%7Bto+50pt%7D%27%27.+Note+how+the+rows+are+%60%60bunched+up%27%27+because+there%27s+no+available+%60%60stretchable+glue%27%27+between+the+rows%3A+%0A%0A%5Cvspace%7B6pt%7D%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+50pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cvspace%7B6pt%7D%0A%0AWe%27ll+use+the+%5Cverb%7C%5Cvalign%7C+table+with+%5Coptspec%7B%7D+of+%60%60%5Ctexttt%7Bto+50pt%7D%27%27%2C+but+provide+%60%60flexible+spacing%27%27+via+the+%5Cverb%7C%5Ctabskip%7C+command.+Here%2C+%5Cverb%7C%5Ctabskip%7C+is+providing+enough+%60%60glue%27%27+to+enable+the++%5Cverb%7C%5Cvalign%7C+rows+to++%60%60stretch+out%27%27+and+fill+any+available+extra+space.+Here+is+the+%60%60stretched+out%27%27+%5Cverb%7C%5Cvalign%7C+table%3A%0A%0A%5Ctabskip%3D0pt+plus1fil+%25+This+sets+%5Ctabskip+to+a+very+flexible+glue%0A%5Cvspace%7B6pt%7D%0A%0A%5Cdef%5Cmylen%7B50pt%7D%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+%5Cmylen%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Dette eksempel giver følgende output:

![](/files/b3385fa59834ee901e334e01e01b82e3fa50fd51)

## Introduktion til tabellen $$\langle$$⁠præambel⁠$$\rangle$$ og $$\langle$$⁠krop⁠$$\rangle$$

Dette afsnit giver en introduktion til tabellens $$\langle$$⁠`præambel`⁠$$\rangle$$, og *kort* berører tabellens $$\langle$$⁠`krop`⁠$$\rangle$$ som efterfølgende [udforskes mere detaljeret](#bodydetails).

Senere artikler i denne serie vil udforske $$\langle$$⁠`præambel`⁠$$\rangle$$ og $$\langle$$⁠`krop`⁠$$\rangle$$ mere detaljeret, især TeX's brug og behandling af tabellens $$\langle$$⁠`præambel`⁠$$\rangle$$.

Som nævnt ovenfor kan det mest generelle format for `\halign` eller `\valign` tabeller skrives som:

`\halign` $$\langle$$⁠`valgfri specifikation`⁠$$\rangle$$ { $$\langle$$⁠`præambel`⁠$$\rangle$$ $$\langle$$⁠`krop`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`valgfri specifikation`⁠$$\rangle$$ { $$\langle$$⁠`præambel`⁠$$\rangle$$ $$\langle$$⁠`krop`⁠$$\rangle$$ }

### Den $$\langle$$⁠præambel⁠$$\rangle$$

Den $$\langle$$⁠`præambel`⁠$$\rangle$$ afsnittet indeholder en enkelt $$\langle$$⁠`præambellinje`⁠$$\rangle$$ som er *afsluttet* af `\cr` kommandoen; følgelig kan $$\langle$$⁠`præambel`⁠$$\rangle$$ omskrives som:

$$\langle$$⁠`præambel`⁠$$\rangle$$=$$\langle$$⁠`præambellinje`⁠$$\rangle$$**`\cr`**

### Den $$\langle$$⁠krop⁠$$\rangle$$

Tilsvarende kan $$\langle$$⁠krop⁠$$\rangle$$ afsnittet yderligere opdeles i en eller flere bestående "linjer", men her er der to muligheder for hver linje:

* en linje bestående af et sæt celler, som danner en `\halign` række eller `\valign` kolonne; eller
* et `\noalign` kommando, som “indsprøjter” materiale mellem en `\halign`'s rækker eller `\valign`'s kolonner.

Til nærværende formål ignorerer vi `\noalign` kommandoen (se [senere i artiklen](#noalign)) og antager, at hver linje i $$\langle$$⁠krop⁠$$\rangle$$ er data for et sæt celler og *afsluttet* af `\cr` kommando.

Ved at ignorere `\noalign`, $$\langle$$⁠`krop`⁠$$\rangle$$ afsnittet, som repræsenterer brugerens indhold, indeholder en sekvens af linjer, som vi hver især vil omtale som en $$\langle$$⁠`kroplinje`⁠$$\rangle$$ som er *afsluttet* af sin tilhørende `\cr` kommando.

Den $$\langle$$⁠`krop`⁠$$\rangle$$ omskrives som:

$$\langle$$⁠kroplinje$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠kroplinje$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠kroplinje$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠kroplinje$${}*\mathrm{N}$$⁠$$\rangle$$\cr

Sammenlagt kan vi omskrive det generelle format for `\halign` og `\valign` som:

`\halign` $$\langle$$⁠`valgfri specifikation`⁠$$\rangle$$ { $$\langle$$⁠`præambellinje`⁠$$\rangle$$\cr $$\langle$$⁠kroplinje$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠kroplinje$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠kroplinje$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠kroplinje$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

`\valign` $$\langle$$⁠`valgfri specifikation`⁠$$\rangle$$ { $$\langle$$⁠`præambellinje`⁠$$\rangle$$\cr $$\langle$$⁠kroplinje$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠kroplinje$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠kroplinje$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠kroplinje$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

Af grunde, der vil blive behandlet i senere artikler, har $$\langle$$⁠`præambel`⁠$$\rangle$$, blot en enkelt $$\langle$$⁠`præambellinje`⁠$$\rangle$$, har et andet format end alle linjer i tabellen $$\langle$$⁠`krop`⁠$$\rangle$$. Vi vil også [genbesøge `\noalign` kommando](#noalign) som også kan bruges i tabellen $$\langle$$⁠`krop`⁠$$\rangle$$.

### Den $$\langle$$⁠præambellinje⁠$$\rangle$$

Den $$\langle$$⁠`præambellinje`⁠$$\rangle$$ spiller en *afgørende* rolle i satsningen af tabeller, fordi den giver en slags “blåtryk”, der bruges til at sætte indholdet—`\halign` rækker eller `\valign` kolonner—som er indeholdt i tabellen $$\langle$$⁠`krop`⁠$$\rangle$$. The $$\langle$$⁠`præambellinje`⁠$$\rangle$$ kan også indeholde celle-“skabeloner”, som bruges til at konstruere rækkerne i en `\halign` eller kolonnerne i en `\valign`—et emne, der vil blive udforsket i detaljer.

Formålet med the $$\langle$$⁠`præambellinje`⁠$$\rangle$$ er todelt:

* den bestemmer den *maksimale* antal celler pr. række i en `\halign` eller pr. kolonne i en `\valign`.
* den lagrer *celle-skabeloner* som kan bruges til at automatisere formatering eller indholdsindsættelse i celler i tabellen $$\langle$$⁠`krop`⁠$$\rangle$$. Celle-skabeloner er valgfrie og kan være "tomme", eller du kan inkludere tegn eller kommandoer, som TeX automatisk vil indsætte før og/eller efter det faktiske indhold i bestemte celler i din tabel. Det sparer dig for besværet med manuelt at skrive/indsætte disse tegn eller kommandoer i hver celle, som du vil have dem til at gælde for.

**Bemærk**: en `\halign` række eller `\valign` kolonne kan indeholde færre celler end det maksimum, der er angivet af den $$\langle$$⁠`præambellinje`⁠$$\rangle$$ men kan ikke indeholde flere end dette maksimum, ellers genererer TeX en fejl. I denne sammenhæng udelader vi detaljer om *cykliske* præambler.

Når vi fortsætter med vores strukturdiagrammer, kan $$\langle$$⁠`præambellinje`⁠$$\rangle$$ for

* en `\halign` tabel med et maksimum på $$\mathrm{K}$$ celler pr. *række*, eller
* et `\valign` tabel med et maksimum på $$\mathrm{K}$$ celler pr. *kolonne*

skrives som:

$$\langle$$⁠skabelon$${}\_1$$⁠$$\rangle$$&$$\langle$$⁠skabelon$${}\_2$$⁠$$\rangle$$&$$\langle$$⁠skabelon$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$⁠skabelon$${}*\mathrm{K}$$⁠$$\rangle$$

hvor `&` er den *justeringsfanetegnet* som angiver afslutningen på én celle og starten på den næste. Traditionelt bruges ampersand-tegnet (`&`) som justeringstegn, men enhver karakter med [kategori-kode](/latex/da/flere-emner/43-table-of-tex-category-codes.md) 4 kunne bruges i stedet.

Som en påmindelse kan $$\langle$$⁠`præambel`⁠$$\rangle$$ skrives $$\langle$$⁠`præambel`⁠$$\rangle$$=$$\langle$$⁠`præambellinje`⁠$$\rangle$$**`\cr`**, eller tilsvarende

$$\langle$$⁠`præambel`⁠$$\rangle$$=$$\langle$$⁠skabelon$${}\_1$$⁠$$\rangle$$&$$\langle$$⁠skabelon$${}\_2$$⁠$$\rangle$$&$$\langle$$⁠skabelon$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$⁠skabelon$${}*\mathrm{K}$$⁠$$\rangle$$**`\cr`**

#### Struktur af hver celle $$\langle$$⁠skabelon⁠$$\rangle$$

Hver celle $$\langle$$⁠skabelon$${}\_i$$⁠$$\rangle$$ skrives som:

$$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ hvor:

* $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ er et sæt tegn eller kommandoer (tokens), som TeX automatisk vil indsætte *før* brugerleveret indhold til celle $$i$$;
* $$\texttt{#}$$ er en pladsholder, der viser, hvor brugerleveret indhold skal vises i celle $$i$$. Igen er `#` tegnet blot en *tradition*, kan enhver karakter med [kategori-kode](/latex/da/flere-emner/43-table-of-tex-category-codes.md) 6 bruges i stedet. Bemærk, at kategori-kode 6 bruges til makroparametre;
* $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ er et sæt tegn eller kommandoer (tokens), som TeX automatisk vil indsætte *efter* brugerleveret indhold til celle $$i$$.

Bemærk, at alle $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ og $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ er *valgfrie*: du behøver ikke at bruge nogen tegn eller kommandoer før eller efter cellens indhold.

**Færdiggørelse af** $$\langle$$**⁠præambel⁠**$$\rangle$$

Til sidst, ved at bruge notationen ovenfor, vil $$\langle$$⁠`præambel`⁠$$\rangle$$ for

* en `\halign` tabel med et maksimum på $$\mathrm{K}$$ celler pr. *række*, eller
* et `\valign` tabel med et maksimum på $$\mathrm{K}$$ celler pr. *kolonne*

skrives som:

$$\langle$$⁠`præambel`⁠$$\rangle$$=$$\langle$$⁠`præambellinje`⁠$$\rangle$$`**\cr**`

eller

$$\langle$$⁠`præambel`⁠$$\rangle$$=$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}*3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*3$$⁠$$\rangle$$$$\cdots$$$$\langle$$⁠$$\texttt{U}*\mathrm{K}$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

**Den** $$\langle$$**⁠præambel⁠**$$\rangle$$ **og optælling af rækker og kolonner**

En **`\halign`** tabel med en $$\langle$$⁠`præambel`⁠$$\rangle$$ der angiver $$\mathrm{K}$$ celler og en $$\langle$$⁠`krop`⁠$$\rangle$$ indeholdende $$\mathrm{N}$$ $$\langle$$⁠`kroplinjer`⁠$$\rangle$$ vil give en tabel med $$\mathrm{K}$$ *kolonner* og $$\mathrm{N}$$ *rækker*, som vist i følgende diagram:

![](/files/5fbed50250fa53cdd74c330120837073a7fe511c)

En **`\valign`** tabel med en $$\langle$$⁠`præambel`⁠$$\rangle$$ der angiver $$\mathrm{K}$$ celler og en $$\langle$$⁠`krop`⁠$$\rangle$$ indeholdende $$\mathrm{N}$$ $$\langle$$⁠`kroplinjer`⁠$$\rangle$$ vil give en tabel med $$\mathrm{K}$$ *rækker* og $$\mathrm{N}$$ *kolonner*, som vist i følgende diagram:

![](/files/0fc4b3341148e077c4ed33a61fd6eb07072ac497)

### Nok teori, lad os se på nogle eksempler!

Som vi senere vil se i detaljer, når TeX behandler en tabels indhold—tabelcellerne indeholdt i den [$$\langle$$⁠`krop`⁠$$\rangle$$](#body)—tjekker den for tilstedeværelsen af celleskabeloner, som blev defineret i den $$\langle$$⁠`præambel`⁠$$\rangle$$, fordi TeX leder efter eventuelle skabelon-tokens, der skal indsættes før og/eller efter brugerens indhold. Følgende minimale eksempler demonstrerer brugen af celleskabeloner $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ i en `\halign` og `\valign` tabel.

#### En \halign-tabel, der bruger celleskabeloner

Følgende eksempel demonstrerer en `\halign` tabel, som bruger en celle-skabelon til automatisk at indsætte dobbelte anførselstegn omkring indholdet i den første celle i hver række: dvs. en skabelon, som påvirker hver celle i den første kolonne:

```latex
\documentclass{article}
\usepackage{parskip} % Sæt \parindent til 0pt
% Vælg en passende lille sidestørrelse
\usepackage[paperheight=10cm,paperwidth=12cm,textwidth=8cm]{geometry}
\setlength{\tabskip}{20pt} % Fordel \halign-kolonnerne
\begin{document}
\pagestyle{empty}

Her er en \verb|\halign|-tabel \textit{uden} celleskabeloner:

\halign{
% Intet før eller efter hvert '#' i <præambel>
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}

Her er den samme \verb|\halign|-tabel, men med dobbelte anførselstegn automatisk tilføjet til den første celle i hver række; dvs. det påvirker hver celle i den første kolonne:

\halign{
% Anførselstegnsskabeloner i præamblen:
``#''&#&#\cr % Dobbelte anførselstegn før og efter det første #
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\end{document}
```

[Åbn dette eksempel i Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=halign+example+of+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D10cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B20pt%7D+%25+Space+out+the+%5Chalign+columns%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table+%5Ctextit%7Bwithout%7D+cell+templates%3A+%0A%0A%5Chalign%7B%0A%25+Nothing+before+or+after+each+%27%23%27+in+the+%3Cpreamble%3E%0A%23%26%23%26%23%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%0AHere+is+the+same+%5Cverb%7C%5Chalign%7C+table+but+with+double+quotes+automatically+added+to+the+first+cell+in+each+row%3B+i.e.%2C+it+affects+every+cell+in+the+first+column%3A+%0A%0A%5Chalign%7B%0A%25+Quotation+templates+in+the+preamble%3A%0A%60%60%23%27%27%26%23%26%23%5Ccr+%25+Double+quote+marks+before+and+after+first+%23%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cend%7Bdocument%7D)

Dette eksempel giver følgende output:

![](/files/bcf1b7db7b70f9fa7737ca19031c540a0d699cfe)

Følgende grafik er en kommenteret version af den `\halign` tabellen produceret af eksemplet ovenfor; her sammenligner vi den “formelle” struktur af en tre-cellet $$\langle$$⁠`præambel`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

med den faktiske $$\langle$$⁠`præambel`⁠$$\rangle$$ af ` ``#''&#&#**\cr** `, hvor tilstedeværelsen eller fraværet af celleskabeloner fremhæves:

![](/files/65ebfa4eae51ff0e4593057a62613875cc9d3ddc)

#### En \valign-tabel, der bruger celleskabeloner

Følgende eksempel demonstrerer en `\valign` tabel, som bruger en skabelon til hver celle til automatisk at indsætte cifre omkring brugerens indhold.

```latex
\documentclass{article}
\usepackage{parskip} % Sæt \parindent til 0pt
% Vælg en passende lille sidestørrelse
\usepackage[paperheight=14cm,paperwidth=12cm,textwidth=10cm]{geometry}
\setlength{\tabskip}{8pt} % Fordel \valign-rækkerne
\begin{document}
\pagestyle{empty}

Her er en \verb|\valign|-tabel \textit{uden} celleskabeloner:

\begingroup
\hsize=25pt
\valign{
% Intet før eller efter hvert '#' i
% præamblen
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

Her er den samme \verb|\valign|-tabel, men ved at bruge celleskabeloner til automatisk at indsætte cifre i hver celle:

\begingroup
\hsize=25pt
\valign{
% Cifre indsat før og efter hvert '#' i
% præamblen
1#2&3#4&5#6\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup
\end{document}
```

[Åbn dette eksempel i Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+valign+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D14cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D+%25+Space+out+the+%5Cvalign+rows%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table+%5Ctextit%7Bwithout%7D+cell+templates%3A%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%25+Nothing+before+or+after+each+%27%23%27+in+%0A%25+the+%3Cpreamble%3E%0A%23%26%23%26%23%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%0AHere+is+the+same+%5Cverb%7C%5Cvalign%7C+table+but+using+cell+templates+to+automatically+insert+digits+into+every+cell%3A+%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%25+Digits+inserted+before+and+after+every+%27%23%27+in%0A%25+the+%3Cpreamble%3E%0A1%232%263%234%265%236%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Dette eksempel giver følgende output:

![](/files/ec850cea3385772e4137689c8f9390cedad09404)

Følgende grafik er en kommenteret version af den `\valign` tabellen produceret af eksemplet ovenfor; her sammenligner vi den “formelle” struktur af en tre-cellet $$\langle$$⁠`præambel`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

med den faktiske $$\langle$$⁠`præambel`⁠$$\rangle$$ af `1#2&3#4&5#6**\cr**`, hvor brugen af celleskabeloner fremhæves $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$:

![](/files/4cfb5e7469dea849c506b9b70f3b9be87f749877)

Bemærk, hvordan skabelonen for celle $$i$$ ($$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$) anvendes på $$i$$te celle i hver `\valign` kolonne, hvilket resulterer i, at alle celler i den $$i$$te *række* bliver påvirket.

#### Formatering af tekst ved hjælp af celleskabeloner

Det næste eksempel bruger følgende $$\langle$$⁠`præambel`⁠$$\rangle$$ (celleskabeloner) til at formatere teksten i hver række eller kolonne:

`\textbf{#}&\textit{#}&\texttt{#}\cr`

Hvis vi sammenligner denne $$\langle$$⁠`præambel`⁠$$\rangle$$ med vores "formelle" struktur af en tre-cellet $$\langle$$⁠`præambel`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

kan vi se, at:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$=`\textbf{`

$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$=`}`

$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$=`\textit{`

$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$=`}`

$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$=`\texttt{`

$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$=`}`

Bemærk, hvordan disse celleskabeloner, såsom `\textbf{#}` ligner makroer med én parameter (celleindholdet).

```latex
En \verb|\valign|-tabel med tekst formateret ved hjælp af celleskabeloner:

\begingroup
\hsize=25pt
\valign{
\textbf{#}&\textit{#}&\texttt{#}\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

En \verb|\halign|-tabel med tekst formateret ved hjælp af celleskabeloner:

\halign{
\textbf{#}&\textit{#}&\texttt{#}\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
```

[Åbn dette eksempel i Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Styling+with+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D14cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%25+Space+out+the+%5Chalign+columns+or+%5Cvalign+rows%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0AA+%5Cverb%7C%5Cvalign%7C+table+with+text+styled+using+cell+templates%3A%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%5Ctextbf%7B%23%7D%26%5Ctextit%7B%23%7D%26%5Ctexttt%7B%23%7D%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%0AAn+%5Cverb%7C%5Chalign%7C+table+with+text+styled+using+cell+templates%3A%0A%0A%5Chalign%7B%0A%5Ctextbf%7B%23%7D%26%5Ctextit%7B%23%7D%26%5Ctexttt%7B%23%7D%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cend%7Bdocument%7D)

Dette eksempel giver følgende output:

![](/files/64cca900276d68b563850e0f5f1a81886c2b7a7a)

## Mere detaljer om tabellen $$\langle$$⁠krop⁠$$\rangle$$

I afsnittet [Introduktion til tabellen $$\langle$$⁠`præambel`⁠$$\rangle$$ og $$\langle$$⁠`krop`⁠$$\rangle$$](#preamble) så vi, hvordan, hvis vi midlertidigt ignorerer `\noalign`, $$\langle$$⁠`krop`⁠$$\rangle$$ af en `\halign` eller `\valign` består tabellen af flere linjer, hver betegnet $$\langle$$⁠kroplinje$${}\_j$$⁠$$\rangle$$, hvor:

* hver $$\langle$$⁠kroplinje$${}\_j$$⁠$$\rangle$$ afsluttes af `\cr` kommando
* hver $$\langle$$⁠kroplinje$${}\_j$$⁠$$\rangle$$ af en `\halign` er en tabelrække
* hver $$\langle$$⁠kroplinje$${}\_j$$⁠$$\rangle$$ af en `\valign` er en tabelkolonne

Sekvensen af linjer, $$\langle$$⁠kroplinje$${}\_j$$⁠$$\rangle$$, hvor $$j=1\ldots\mathrm{N}$$, danner $$\mathrm{N}$$ rækker af en `\halign` eller $$\mathrm{N}$$ kolonner for en `\valign`. Som opsummeret i det følgende diagram er en generel $$\langle$$⁠`præambel`⁠$$\rangle$$ såsom

$$\langle$$⁠`præambel`⁠$$\rangle$$=$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}*3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*3$$⁠$$\rangle$$$$\cdots$$$$\langle$$⁠$$\texttt{U}*\mathrm{K}$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

angiver celleskabeloner for højst $$\mathrm{K}$$ celler i hver af $$\mathrm{N}$$ $$\langle$$⁠`kroplinje`⁠$$\rangle$$ indtastninger i $$\langle$$⁠`krop`⁠$$\rangle$$:

![](/files/71623f3238dbdce8a4545f0696225847e93a8e89)

### Strukturen af hver $$\langle$$⁠kroplinje$${}\_j$$⁠$$\rangle$$

Hver linje $$\langle$$⁠kroplinje$${}\_j$$⁠$$\rangle$$ i tabellen $$\langle$$⁠krop⁠$$\rangle$$ indeholder indhold til op til $$\mathrm{K}$$ celler—som bestemt af tabellen $$\langle$$⁠præambel⁠$$\rangle$$—og har den generelle form:

$$\langle$$⁠kroplinje$${}\_j$$⁠$$\rangle$$=$$\langle$$⁠Cellen$${}\_1$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$⁠Cellen$${}\_2$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$⁠Cellen$${}*3$$⁠$$\rangle$$$$\texttt{&}$$$$\cdots$$$$\texttt{&}$$$$\langle$$⁠Cellen$${}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

hvor:

* $$\langle$$⁠Cellen$${}\_i$$⁠$$\rangle$$ repræsenterer brugerens indhold til $$i$$te celle i en given $$\langle$$⁠kroplinje$${}\_j$$⁠$$\rangle$$
* det **`&`** tegn kaldes *justeringsfanen* (samme som bruges i $$\langle$$⁠præambel⁠$$\rangle$$), som markerer afslutningen på én celle og starten på den næste. Endnu en gang er brugen af **`&`** kun en tradition (konvention), fordi ethvert tegn med [kategori-kode](/latex/da/flere-emner/43-table-of-tex-category-codes.md) 4 kunne bruges i stedet.

Selv om hver $$\langle$$⁠kroplinje$${}\_j$$⁠$$\rangle$$ kan indeholde højst $$\mathrm{K}$$ celler (bestemt af $$\langle$$⁠præambel⁠$$\rangle$$) kan de indeholde *færre* end $$\mathrm{K}$$ celler, og enhver $$\langle$$⁠Cellen$${}\_i$$⁠$$\rangle$$ i $$\langle$$⁠kroplinje$${}\_j$$⁠$$\rangle$$ kan være tom.

Følgende eksempel demonstrerer en $$\langle$$⁠præambel⁠$$\rangle$$ af `#&#&#&#&#\cr` hvilket giver mulighed for højst 5 celler pr. $$\langle$$⁠brødlinje⁠$$\rangle$$; dog indeholder de satsede tabeller linjer med færre end 5 celler:

```latex
En \verb|\valign|-tabel med 1 til 5 celler pr. \textit{kolonne}:

\begingroup
% \hsize styrer \valign-kolonnebredderne (de satsede linjers størrelse).
\hsize=40pt
\fbox{\valign{
% Brug en præambel, der tillader 5 celler pr. kolonne
% De fleste kolonner giver ikke indhold til 5 celler
#&#&#&#&#\cr% 5 celler pr. kolonne
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)&\(\mathrm{Cell}{}_5\)\cr
}}
\endgroup

% Bemærk: af grunde, der forklares senere
% \halign skal placeres i en \vbox
En \verb|\halign|-tabel med 1 til 5 celler pr. \textit{række}:

\fbox{%
\vbox{\halign{
% Brug en præambel, der tillader 5 celler pr. række
% De fleste rækker giver ikke indhold til 5 celler
#&#&#&#&#\cr % 5 celler pr. række
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)&\(\mathrm{Cell}{}_5\)\cr
}}}
```

[Åbn dette eksempel i Overleaf](/latex/da/dybtgaende-artikler/15-how-do-tex-engines-typeset-tables-2.md)

Dette eksempel giver følgende output:

![](/files/52381da52c40308840fd9f34dcf021f77cecc6cb)

Det næste `\halign` eksempel demonstrerer et varierende antal celler pr. række og muligheden for, at celler kan være tomme—bemærk, hvordan tomme celler skabes af på hinanden følgende **`&`** tegn i tabellen:

```latex
En \verb|\halign|-tabel med nogle tomme celler—bemærk, at der er på hinanden følgende \texttt{\&}-tegn i tabellen \(\langle\texttt{body}\rangle\):

\fbox{%
\vbox{\halign{
% Brug en præambel, der tillader 5 celler pr. række
% De fleste rækker giver ikke indhold til 5 celler
#&#&#&#&#\cr % 5 celler pr. række
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&&\(\mathrm{Cell}{}_3\)\cr
&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&&&\(\mathrm{Cell}{}_5\)\cr
}}}
```

[Åbn dette eksempel i Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Empty+cells+Number+of+cells+per+row\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%25+Space+out+the+%5Chalign+columns+and+%5Cvalign+rows%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D+%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%5Cbegin%7Bdocument%7D%0AAn+%5Cverb%7C%5Chalign%7C+table+with+some+empty+cells---note+there+are+consecutive+%5Ctexttt%7B%5C%26%7D+characters+in+the+table+%5C%28%5Clangle%5Ctexttt%7Bbody%7D%5Crangle%5C%29%3A%0A%0A%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign%7B%0A%25+Use+a+preamble+that+allows+for+5+cells+per+row%0A%25+Most+rows+don%27t+provide+content+for+5+cells%0A%23%26%23%26%23%26%23%26%23%5Ccr+%25+5+cells+per+row%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%5Ccr+%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%5Ccr%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_3%5C%29%5Ccr%0A%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_3%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_4%5C%29%5Ccr%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%26%26%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_5%5C%29%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Dette eksempel giver følgende output:

![](/files/4333a29cbdc8ebde9a0ba9f7884947a67c2dfae4)

### Der er intet særligt ved & og # i typografi af tabeller

TeX's brug af tegnene `&` og `#` i typografien af `\halign`- eller `\valign`-baserede tabeller er en tradition, som stammer fra Knuths oprindelige plain TeX-makroer. Det er helt muligt at bruge andre tegn end `&` og `#` ved at tildele de passende kategorikoder til dine foretrukne erstatninger, som det følgende eksempel viser:

* ved at erstatte `&` med `@` ved at tildele `@` til kategorikode 4
* ved at erstatte `#` med `|` ved at tildele `|` til kategorikode 6 (som bruges til makroparametre)

Kategoriændringer holdes lokale ved at bruge `\begingroup` og `\endgroup`:

```latex
\documentclass{article}
\begin{document}
\begingroup
\catcode`@=4
\catcode`|=6
\halign{
|@|@|\cr
A@B@C\cr
D@E@F\cr
}
\endgroup
\end{document}
```

[Åbn dette eksempel i Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Tables+and+category+codes\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegingroup%0A%5Ccatcode%60%40%3D4%0A%5Ccatcode%60%7C%3D6%0A%5Chalign%7B%0A%7C%40%7C%40%7C%5Ccr%0AA%40B%40C%5Ccr%0AD%40E%40F%5Ccr%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

## Genindførelsen af kommandoen \noalign

TeX-motorer leverer den indbyggede (primitive) `\noalign` kommandoen:

`\noalign{`$$\langle$$⁠`tokens`⁠$$\rangle$$`}`

hvor $$\langle$$⁠`tokens`⁠$$\rangle$$ er tegn og/eller TeX/LaTeX-kommandoer. Kommandoen `\noalign` er udelukkende til brug inden for en `\halign` eller `\valign` tabel: brug uden for disse vil give en fejl.

Formålet med `\noalign` er at tillade "indsættelse" af tekst og TeX/LaTeX-kommandoer *mellem* rækkerne i en `\halign` tabel eller kolonnerne i en `\valign` tabel. Den mest almindelige brug af `\noalign` er at oprette tabelregler (linjer):

* *vandrette* regler mellem `\halign` tabelrækker
* *lodrette* regler mellem `\valign` tabelkolonner

Bemærk følgende:

* det `\noalign` kommandoen er ***ikke afsluttet af\*\*\*\*****&#x20;****`\cr`****&#x20;****\*\*\*\*kommandoen***
* det sæt af kommandoer, der er tilladt inden for `\noalign{...}` afhænger af, om den bruges i $$\langle$$⁠`krop`⁠$$\rangle$$ af en `\halign` eller `\valign` tabellen (dvs. i en lodret eller vandret tilstand).

Vi kan nu sige, at tabellen $$\langle$$⁠`krop`⁠$$\rangle$$ af `\halign` eller `\valign` kan bestå af enkelte linjer $$\langle$$⁠kroplinje$${}\_i$$⁠$$\rangle$$`\cr` afbrudt af `\noalign` kommandoer; en af mange muligheder/kombinationer kunne være:

`\noalign{`$$\langle$$⁠`tokens`⁠$$\rangle$$`}` $$\langle$$⁠kroplinje$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠kroplinje$${}\_2$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`flere tokens`⁠$$\rangle$$`}` $$\langle$$⁠kroplinje$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠kroplinje$${}*\mathrm{N}$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`andre tokens`⁠$$\rangle$$`}`

### Eksempel med \noalign

Vi vil se på andre anvendelsesområder senere i denne artikelserie, men her er et grundlæggende eksempel, der demonstrerer oprettelse af tabelregler via `\noalign`:

```latex
\setlength{\tabskip}{5pt}

Brug af \verb|\noalign| til at placere vandrette regler mellem rækkerne i en \verb|\halign|-tabel:
\vspace{6pt}

\halign{%
#&#&#&#&#\cr
\noalign{\hrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\hrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\hrule}
}

Brug af \verb|\noalign| til at placere lodrette regler mellem kolonnerne i en \verb|\valign|-tabel:
\vspace{6pt}

\begingroup % Hold ændringer til \parindent og \hsize lokale
\parindent=0pt
\hsize=50pt
\valign{%
#&#&#&#&#\cr
\noalign{\vrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\vrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\vrule}
}
\endgroup
```

[Åbn dette eksempel i Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+the+noalign+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%0AUsing+%5Cverb%7C%5Cnoalign%7C+to+place+horizontal+rules+between+rows+of+an+%5Cverb%7C%5Chalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Chalign%7B%25%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Chrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%7D%0A%7D%0A%0AUsing+%5Cverb%7C%5Cnoalign%7C+to+place+vertical+rules+between+columns+of+a+%5Cverb%7C%5Cvalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Cbegingroup+%25+keep+changes+to+%5Cparindent+and+%5Chsize+local%0A%5Cparindent%3D0pt%0A%5Chsize%3D50pt%0A%5Cvalign%7B%25%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Dette eksempel giver følgende output:

![](/files/7c11ce59253c0b76c4d2ba8d1e931b0cccc4d97f)

## \tabskip genbesøgt

Vi ser nærmere på `\tabskip` -kommandoen og bygger videre på [introduktionen i et tidligere afsnit](#tabskip).

Den `\tabskip` -kommandoen sætter værdien af en særlig form for "mellemrum" (lim), der bruges *udelukkende* i typografien af tabeller: dens formål er at give afstand mellem tabelrækker eller -kolonner:

* for `\halign` tabeller: `\tabskip` lim indsættes før og efter tabellen (dvs. til venstre og højre) og mellem tabelkolonnerne
* for `\valign` tabeller: `\tabskip` lim indsættes før og efter tabellen (dvs. over og under) og mellem tabelrækkerne

Værdien af `\tabskip` kan sættes ved hjælp af LaTeX `\setlength` kommandoen:

`\setlength{\tabskip}{`$$\langle$$⁠`limværdi`⁠$$\rangle$$`}`

hvor $$\langle$$⁠`limværdi`⁠$$\rangle$$ kan være:

* en fast længde såsom `5pt`, `3mm`, eller
* en endelig fleksibel lim såsom `3pt plus 2pt minus 1pt`, eller
* en uendeligt fleksibel lim såsom `0pt plus1fill`.

Du kan også direkte sætte `\tabskip` (ved at omgå `\setlength`) ved at skrive

`\tabskip`=$$\langle$$⁠`limværdi`⁠$$\rangle$$

Men enhver ændring af værdien af `\tabskip` lim vil kun påvirke tabelafstanden, når ændringen er:

* foretaget *før* det `\halign` eller `\valign` kommandoen skal behandles, eller
* foretaget inde i tabellen $$\langle$$⁠`præambel`⁠$$\rangle$$

Forsøg på at sætte `\tabskip` værdier inde i tabelindholdet (cellerne i tabellen $$\langle$$⁠`krop`⁠$$\rangle$$) *ikke vil* ændrer ikke afstanden mellem `\halign` tabelkolonner eller `\valign` tabelrækker. Årsagen til denne adfærd hos `\tabskip` kan spores tilbage til den rolle, som $$\langle$$⁠`præambel`⁠$$\rangle$$ spiller under typografien af tabeller—processer, som vi senere vil udforske mere detaljeret.

### At se er at tro

For at hjælpe med at visualisere tilstedeværelsen af forskellige typer mellemrum/lim, der bruges i typografien af tabeller, især

* `\tabskip` glue
* `\baselineskip` glue
* manuel kerning (`\kern`)

Overleaf forberedte et LuaTeX-baseret projekt til at farvelægge komponenterne i en tabel. LuaTeX blev valgt, fordi det muliggør lav-niveau genbehandling af de interne data/strukturer i satsede tabeller, men vi vil ikke udforske de detaljer her.

Her er nogle eksempler, som viser forskellige anvendelser af `\tabskip`. For hvert eksempel viser vi det faktiske output og den farvelagte version produceret af LuaTeX.

### \tabskip-eksempel 1

Lad os undersøge brugen af `\tabskip` i en `\halign` og `\valign` tabel. Vi viser de faktiske satte tabeller med en kant for at visualisere deres størrelse og afstand sammen med annoterede grafer, der indeholder farvelagte versioner, som tydeligt viser størrelsen af forskellige lim-/mellemrumselementer i hver tabel.

Først, `\halign`:

```latex
% For at visualisere tabelens omfang sætter vi en kant omkring den
\setlength{\fboxsep}{0pt} % Brug tætsluttende kanter

% Her sætter vi \tabskip "direkte"
\tabskip5pt % Sæt den indledende \tabskip-værdi uden for tabellen

% For at sætte en kant omkring tabellen skal den gemmes i en TeX-boks.
% En \halign skal placeres i en \vbox, fordi \halign skal være
% behandlet i en "lodret tilstand": en \hbox vil ikke virke, fordi
% den behandles i en "vandret tilstand"

\fbox{\vbox{\halign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
```

[Åbn dette eksempel i Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Tabskip+glue+in+an+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D+%25+sets+%5Cparindent+to+0pt%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+To+visualize+the+table%27s+extent+we%27ll+put+a+border+around+it+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D+%25+Use+close-fitting+borders%0A%0A%25+Here+we+set+%5Ctabskip+%22directly%22%0A%5Ctabskip5pt+%25+Set+the+initial+%5Ctabskip+value+outside+the+table%0A%0A%25+To+put+a+border+around+the+table+it+has+to+be+saved+to+a+TeX+box.%0A%25+An+%5Chalign+has+to+be+placed+in+a+%5Cvbox+because+%5Chalign+must+be+%0A%25+processed+in+a+%22vertical+mode%22%3A+an+%5Chbox+will+not+work+because%0A%25+that+is+processed+in+a+%22horizontal+mode%22%0A%0A%5Cfbox%7B%5Cvbox%7B%5Chalign%7B%0A%5Ctabskip10pt%23%26%0A%5Ctabskip15pt%23%26%0A%5Ctabskip20pt%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Dette eksempel giver følgende output:

![](/files/e196540d969f8ef4680ba43d3e2eddd9fe68d8c6)

Den næste grafik er en større, farvelagt og annoteret version af tabellen fra det foregående eksempel:

![](/files/eb32b9b52482bc2acac961f1398e78b48e9411cf)

Der er 4 forekomster af `\tabskip` kommandoen, og hver svarer til et bestemt sted for afstand i tabellen:

1. `\tabskip5pt` bruges uden for tabellen og sætter `\tabskip` værdien anvendt før (til venstre for) den første celle i hver række.
2. `\tabskip10pt` sættes i den første celleskabelon for $$\langle$$⁠`præambel`⁠$$\rangle$$ hvilket påvirker afstanden mellem $$\langle$$⁠Cellen$${}\_1$$⁠$$\rangle$$ og $$\langle$$⁠Cellen$${}\_2$$⁠$$\rangle$$ i hver række.
3. `\tabskip15pt` sættes i den anden celleskabelon for $$\langle$$⁠`præambel`⁠$$\rangle$$ hvilket påvirker afstanden mellem $$\langle$$⁠Cellen$${}\_2$$⁠$$\rangle$$ og $$\langle$$⁠Cellen$${}\_3$$⁠$$\rangle$$ i hver række.
4. `\tabskip20pt` sættes i den tredje og sidste celleskabelon for $$\langle$$⁠`præambel`⁠$$\rangle$$ som påvirker afstanden, der tilføjes efter $$\langle$$⁠Cellen$${}\_3$$⁠$$\rangle$$, den sidste celle i hver række.

Dernæst, `\valign`

```latex
\setlength{\fboxsep}{0pt} % Brug tætsluttende kanter
\tabskip5pt % Sæt den indledende \tabskip-værdi uden for tabellen

% Hold ændringer til \hsize lokale (i en gruppe)
\begingroup
% \hsize bestemmer \valign-kolonnebredderne
\setlength{\hsize}{50pt}
% Fordi \valign kan placeres i en \vbox eller \hbox, kan vi bruge
% \fbox direkte
\fbox{\valign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
E&E&F\cr
G&H&I\cr
}}
\endgroup
```

[Åbn dette eksempel i Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D+%25+sets+%5Cparindent+to+0pt%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D+%25+Use+close-fitting+borders%0A%5Ctabskip5pt+%25+Set+the+initial+%5Ctabskip+value+outside+the+table%0A%0A%25+Keep+changes+to+%5Chsize+local+%28in+a+group%29%0A%5Cbegingroup%0A%25+%5Chsize+determines+the+%5Cvalign+column+widths%0A%5Csetlength%7B%5Chsize%7D%7B50pt%7D+%0A%25+Because+%5Cvalign+can+be+placed+in+a+%5Cvbox+or+%5Chbox+we+can+use+%0A%25+%5Cfbox+directly%0A%5Cfbox%7B%5Cvalign%7B%0A%5Ctabskip10pt%23%26%0A%5Ctabskip15pt%23%26%0A%5Ctabskip20pt%23%5Ccr%0AA%26B%26C%5Ccr%0AE%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Dette eksempel giver følgende output:

![](/files/22b2440191fad533a39cf90a179fc2a9269b3351)

Igen er den næste grafik en større, farvelagt og annoteret version af tabellen fra det foregående eksempel:

![](/files/2ae660499d8632fc26f70029f9cdda0690e754f8)

Som med `\halign` eksemplet er der 4 forekomster af `\tabskip` kommandoen. Men med en `\valign` tabel indsættes `\tabskip` mellem tabelrækkerne:

1. `\tabskip5pt` bruges uden for tabellen og sætter `\tabskip` værdien anvendt før (over) den første celle i hver kolonne.
2. `\tabskip10pt` sættes i den første celleskabelon for $$\langle$$⁠`præambel`⁠$$\rangle$$ hvilket påvirker afstanden mellem $$\langle$$⁠Cellen$${}\_1$$⁠$$\rangle$$ og $$\langle$$⁠Cellen$${}\_2$$⁠$$\rangle$$ i hver kolonne.
3. `\tabskip15pt` sættes i den anden celleskabelon for $$\langle$$⁠`præambel`⁠$$\rangle$$ hvilket påvirker afstanden mellem $$\langle$$⁠Cellen$${}\_2$$⁠$$\rangle$$ og $$\langle$$⁠Cellen$${}\_3$$⁠$$\rangle$$ i hver kolonne.
4. `\tabskip20pt` sættes i den tredje og sidste celleskabelon for $$\langle$$⁠`præambel`⁠$$\rangle$$ som påvirker afstanden, der tilføjes efter $$\langle$$⁠Cellen$${}\_3$$⁠$$\rangle$$, den sidste celle i hver kolonne.

**Resumé/konklusioner**

* I en `\halign` tabel indsættes `\tabskip` lim placeres til venstre og højre for hver celle i en række, hvilket dermed skaber afstand mellem tabelkolonnerne.
* I en `\valign` tabel indsættes `\tabskip` lim placeres over og under hver celle i en kolonne, hvilket dermed skaber afstand mellem tabelrækkerne.

### \tabskip og \noalign

#### Brug af en \halign

Det følgende `\halign` eksempel bruger `\tabskip` lim og demonstrerer også `\noalign` -kommandoen, hvor den bruges til at placere afstandssatte regler over og under rækkerne i en `\halign` tabel. Disse regler er sat med den `\hrule` (primitive) kommando sammen med mellemrum skabt af `\kern`:

```latex
\setlength{\tabskip}{5pt} % Sæt \tabskip uden for tabellen

\halign{
#&#&#&#&#\cr % <præambel>
\noalign{\hrule\kern2pt} % Regel med afstand før række 1
1&2&3&4&5\cr % Række 1
\noalign{\kern2pt\hrule\kern2pt} % Regel med afstand mellem række 1/2
6&7&8&9&10\cr % Række 2
\noalign{\kern2pt\hrule\kern2pt} % Regel med afstand mellem række 2/3
11&12&13&14&15\cr % Række 3
16&17&18&19&20\cr % Række 4---ingen regler mellem række 3/4
\noalign{\kern2pt\hrule} % Afstandssat regel ved tabelslut
}
```

[Åbn dette eksempel i Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D+%25+Set+%5Ctabskip+outside+of+the+table%0A%0A%5Chalign%7B%0A%23%26%23%26%23%26%23%26%23%5Ccr+%25+The+%3Cpreamble%3E%0A%5Cnoalign%7B%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+before+row+1%0A1%262%263%264%265%5Ccr+%25+Row+1%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+between+rows+1%2F2+%0A6%267%268%269%2610%5Ccr+%25+Row+2%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+between+rows+2%2F3+%0A11%2612%2613%2614%2615%5Ccr+%25+Row+3%0A16%2617%2618%2619%2620%5Ccr+%25+Row+4---no+rules+between+rows+3%2F4%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%7D+%25+Space+rule+at+table+end%0A%7D%0A%5Cend%7Bdocument%7D)

Dette eksempel producerer tabellen vist nedenfor, som er yderligere annoteret for at gengive (La)TeX-koden og tallene (1) til (4) for at nummerere `\noalign` kommandoerne, der indeholder regler og kerns, sammen med deres tilsvarende satsede output:

![](/files/ae8e43b101bc146b78be396844754575372f486c)

Følgende grafik viser en farvelagt version af tabellen mærket for at vise de forskellige afstande/lim i tabellen:

![](/files/235c5b1286fda347999d42b81ab3c78661438126)

Bemærk følgende:

* brugen af `\noalign` til at indsætte regler mellem bestemte rækker og den manuelle brug af `\kern` værdier til at sætte noget mellemrum før/efter reglerne. TeX-motorer indsætter ikke `\baselineskip` lim efter en sat regel, derfor indsættes der manuelt mellemrum ved hjælp af `\kern` (andre mellemrumskommandoer kunne bruges);
* `\baselineskip` lim blev automatisk indsat mellem række 3 og 4.

#### Brug af en \valign

Det følgende `\valign` eksempel bruger de samme data som det foregående `\halign`:

```latex
\begingroup
\setlength{\parindent}{10pt}
\setlength{\hsize}{50pt}
\setlength{\tabskip}{5pt}
\valign{
#&#&#&#&#\cr
\noalign{\vrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\vrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\vrule\kern2pt}
11&12&13&14&15\cr
16&17&18&19&20\cr
\noalign{\kern2pt\vrule}
}
\endgroup
```

[Åbn dette eksempel i Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Cbegingroup%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Csetlength%7B%5Chsize%7D%7B50pt%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%5Cvalign%7B%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A11%2612%2613%2614%2615%5Ccr%0A16%2617%2618%2619%2620%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Dette eksempel producerer tabellen vist nedenfor, som er yderligere annoteret for at gengive (La)TeX-koden og tallene (1) til (4) for at nummerere `\noalign` kommandoerne, der indeholder regler og kerns, sammen med deres tilsvarende satsede output:

![](/files/ae2081291ab03e0728f7ae05a6e26b02f65acf4f)

![](/files/49cbca3504cea236167ca046e59e11f07563d654)

### En \valign-tabel med tekstlinjer

Det næste eksempel

```latex
\setlength{\tabskip}{5pt}
\begingroup % Hold ændringer til \parindent og \hsize lokale
\setlength{\parindent}{10pt}
\setlength{\hsize}{75pt}
\valign{
#&#&#\cr
\noalign{\vrule\kern5pt}
\TeX{} kan sætte meget komplekse
tabeller.&Her er lidt ekstra
tekst.&Og til sidst en ekstra linje
i denne kolonne.\cr
\noalign{\kern5pt\vrule\kern5pt}
A&B&C\cr
\noalign{\kern5pt\vrule\kern5pt}
D&E&F\cr
G&H&I\cr
\noalign{\kern5pt\vrule}
}
\endgroup
```

[Åbn dette eksempel i Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+valign+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D16cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%5Cbegingroup+%25+Keep+changes+to+%5Cparindent+and+%5Chsize+local%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Csetlength%7B%5Chsize%7D%7B75pt%7D%0A%5Cvalign%7B%0A%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern5pt%7D%0A%5CTeX%7B%7D+can+typeset+very+complex%0Atables.%26Here%27s+a+bit+of+extra+%0Atext.%26And%2C+finally%2C+an+extra+line%0Ain+this+column.%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%5Ckern5pt%7D%0AA%26B%26C%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%5Ckern5pt%7D%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Dette eksempel giver følgende output:

## Indstilling af række-bredder og kolonne-højder

## Mere om tabellen $$\langle$$⁠præambel⁠$$\rangle$$


---

# 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/15-how-do-tex-engines-typeset-tables-2.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.
