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

# Hvordan TeX-motorer setter tabeller

## Hvordan setter TeX-motorer tabeller

## Innledning: Hva dekker denne serien?

Å lage estetisk tiltalende tabeller kan være en tidkrevende oppgave—enten du bruker et visuelt layoutverktøy, LaTeX eller et markeringsspråk som HTML eller Markdown. For LaTeX-brukere spesielt rangerer tabellsetting høyt på mange menneskers liste over «smertepunkter», noe som kanskje bekreftes av at «tabeller» er et av de mest [taggede temaene på tex.stackexchange](https://tex.stackexchange.com/tags).

I tillegg til svarene og eksemplene på tex.stackexchange, viser også en overfladisk gjennomgang av støtten som finnes for tabellsetting med LaTeX, at det finnes en rekke tabellrelaterte informasjonsressurser:

* Overleafs [hjelpesider](https://www.overleaf.com/learn/latex/tables) og andre nettsteder som [learnlatex.org](https://www.learnlatex.org/en/lesson-08)
* CTAN, det omfattende TeX-nettverket, oppgir over [70 TeX/LaTeX-pakker](https://ctan.org/topic/table) knyttet til å lage tabeller
* en hel [bok om tabellsetting ved hjelp av LaTeX](https://www.amazon.co.uk/Typesetting-Tables-LaTeX-Herbert-Voss/dp/1906860254)
* en utmerket [nettbasert LaTeX-tabellgenerator](https://www.tablesgenerator.com/latex_tables)

Et enkelt Google-søk etter [LaTeX-tabeller](https://www.google.com/search?q=latex+tables) gir et enormt antall treff, med mange nettsteder som tilbyr hjelp, råd, eksempler og forklaringer.

### TeX, ikke LaTeX

Når det finnes så mye litteratur om tabellsetting med LaTeX, er det da noe mer å skrive om dem—enda flere tabell-eksempler og opplisting/demonstrasjon av pakke-kommandoer? Finnes det en måte å tilnærme seg temaet tabellsetting på som fremhever eller fokuserer på de grunnleggende prinsippene og konseptene bak tabellsetting? Det finnes, men det krever at man skreller bort LaTeX-løken…

Vi bestemte oss for å lage en artikkelserie som søker å gi leserne bakgrunnsinformasjon og forklaringer av de underliggende *mekanikkene* i TeX-basert tabellsetting. I stedet for å fokusere på tabellsetting ved hjelp av bestemte LaTeX-makroer/-pakker, vil vi utforske den *underliggende oppførselen* til TeX-motorer: ved å undersøke det lavnivå-tabellsettingsmaskineriet som danner grunnlaget for LaTeX-makrokommandoer. Det endelige målet er å trekke frem, og forklare, de sentrale metodene og algoritmene i TeX-basert tabellsetting—forhåpentligvis for å hjelpe leserne/brukerne å få bedre forståelse av hvorfor tabeller oppfører seg som de gjør. En uunngåelig konsekvens av denne tilnærmingen, å skrelle bort de beskyttende lagene av LaTeX-makroisolasjon, er eksponering for rotete lavnivådetaljer som brukere vanligvis (og med glede) skjermes fra gjennom lag av LaTeX-makrokode.

Det har tatt mye tid å forske, skrive og illustrere disse artiklene, så vi håper at de blir et verdifullt tilskudd til litteraturen, og tilbyr materiale som vil informere leserne og hjelpe dem å forstå dette komplekse området innen TeX-tabellsetting bedre. Vi bør understreke at denne artikkelserien vil *inneholder* gli inn på å diskutere *estetikken* i tabellutforming—det er et tema fullt av subjektive preferanser, og argumentene om det må tas andre steder…

### Utforske mekanikken i TeX-tabeller: Hvordan kan du gjøre det?

For å utforske, og deretter skrive om, de lavere nivå-mekanismene og prosessene som finner sted inne i TeX-motorer, som tabellsetting, bygde Overleaf «debug»-versjoner (kompilerte) av Knuths TeX-motor ved hjelp av Martin Rucketts [Web2W-prosess](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html).

Tradisjonelt innebærer bygging av TeX en prosess kalt Web2C, brukt i TeX Live, som genererer C-kode ved å konvertere TeXs opprinnelige Pascal-kildekode til sin C-ekvivalent. Denne prosessen genererer C-kode som aldri var ment å leses av mennesker, bare av C-kompilatorer. Den maskinelt genererte C-koden er *eksepsjonelt* vanskelig å lese eller modifisere med tanke på eksperimentering.

I kontrast produserer Web2W C-kildekode (tilgjengelig [her](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/ctex.c)) som er *mange størrelsesordener* mer lesbar enn kode produsert av Web2C. Følgelig er Web2Ws C-kildekode langt mer egnet til modifikasjon for lærings-/eksperimenteringsformål.

Web2W produserer en versjon av TeX («CTeX») som er *ekstremt* nær Knuths opprinnelige program: «CTeX» inkluderer ikke de mange endringene og forbedringene som ble introdusert av Web2C-prosessen—som SyncTeX, kommandolinjebearbeiding og filsøk via Kpathsea. Selv om du ofrer disse verdifulle forbedringene, er den resulterende (Web2W) C-koden relativt enkel å navigere ved hjelp av Knuths publiserte TeX-kildekode, selv om TeX ble skrevet i Pascal.

* **En merknad om navn:** Strengt tatt må navnet «TeX» bare vise til den opprinnelige programvaren skrevet og publisert av Donald Knuth. Eventuelle endringer av programvaren hans må bruke et annet navn for den resulterende TeX-baserte typografiprogramvaren. Her brukte vi Web2W-prosessen for å bygge en motor som fremdeles i praksis er Knuths opprinnelige programvare. For å unngå enhver tvil vil vi imidlertid bruke begrepet «CTeX» om den spesifikke versjonen som er bygget med Web2W, men vi vil også bruke «TeX» om enten Knuths opprinnelige motor eller som et generelt begrep for typograferingsspråket basert på prinsippene i Knuths TeX. Vi håper leserne vil tilgi eventuelle sporadiske avvik i den strenge bruken av korrekt terminologi: vi håper mening/intensjon formidles av konteksten.

Debug-versjonen av CTeX ble kjørt med [Eclipse IDE](https://www.eclipse.org/downloads/packages/), noe som gjorde det mulig å observere sanntidsbehandlingen av C-koden som implementerer de lavnivå primitive (innebygde) TeX-kommandoene og algoritmene designet av Knuth for å støtte tabellsetting.

Følgende korte video (ca. 90 sekunder) demonstrerer CTeX-motoren som kjører inne i [Eclipse IDE](https://www.eclipse.org/downloads/packages/):

{% embed url="<https://videos.ctfassets.net/nrgyaltdicpt/7drdFwYR6h5xD88XnurDIH/36511f504755ab274f4da2e3f3fc1ce5/TeXtables.mp4>" %}

I tillegg til CTeX kompilerte vi også e-TeX for å få tilgang til noen ekstra primitiver som ikke finnes i Knuths opprinnelige programvare. Selv om CTeX og e-TeX nå er gamle TeX-baserte motorer, er de fortsatt egnet som grunnlag for å utforske mekanikken i tabellsetting, fordi de underliggende prinsippene fortsatt gjelder for alle TeX-baserte typografimotorer.

### Hvorfor bruke en eldre TeX-motor til å utforske tabeller?

For det første er den trykte boken, [TeX:The Program](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373), som lister opp og forklarer TeXs kildekode, fortsatt en svært praktisk guide til de uklare dypene i TeXs indre virkemåte, til tross for at den ble publisert for mer enn 30 år siden (1986). Du kan selvfølgelig sette TeXs kildekodedokumentasjon selv, for eksempel se Overleaf-prosjektet [Sett kildekodedokumentasjonen for TeX, e-TeX eller pdfTeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv). Siden publiseringen av TeX:The Program i 1986 har nye TeX-motorer utviklet seg, inkludert pdfTeX, XeTeX og LuaTeX, som alle introduserer funksjoner og kommandoer som ikke er dokumentert i TeX:The Program ganske enkelt fordi de ikke var til stede i Knuths opprinnelige programvare.

For mange kjerneprosesser, som TeXs tabellsetting, er koden som er dokumentert i TeX:The Program fortsatt relevant som grunnlag for studier—selv om TeXs kildekode er skrevet i Pascal. I tillegg er Knuths TeX forholdsvis enkel, og rask, å kompilere—særlig via den uhyre nyttige [Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html) prosessen utviklet av Martin Ruckert. Enkelhet/hastighet ved kompilering gjør det langt mer praktisk å modifisere TeX på enkle måter—som å lage SVG-grafikk brukt senere i denne artikkelserien.

### Forstå forskjellen mellom TeX og LaTeX

Mange lesere vil allerede vite at LaTeX faktisk ikke er et *kjørbart* typografiprogram, men en stor samling kommandoer (*makroer*) som i siste instans er skrevet i et typografi-/programmeringsspråk på lavere nivå kalt TeX. LaTeX-koden din produserer satt utdata først etter at den er behandlet av et kjørbart program kalt en *TeX-motor*—programvaren som ligger mellom LaTeX-koden din (dokumentet) og den satte PDF-en. I dag kan brukere velge mellom ulike TeX-motorer for å sette opp LaTeX-koden sin, inkludert pdfTeX, XeTeX og varianter av LuaTeX.

De som er nye i TeX/LaTeX-økosystemet blir ofte, og forståelig nok, forvirret av den mengden kryptisk-klingende navn som brukes for verktøyene de møter: TeX, LaTeX, pdfTeX, pdfLaTeX, XeTeX, XeLaTeX, LuaTeX og LuaLaTeX. Hvis du føler det samme, finnes det hjelp i Overleaf-artikkelen [Hva er i et navn: En guide til de mange variantene av TeX](/latex/no/dybdeartikler/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) som forklarer opprinnelsen og betydningen av alle disse termene.

#### Dialekter og TeX-primitiver

Hver TeX-motor har et sett innebygde kommandoer kalt *primitivene* som samlet utgjør motorens «dialekt» av TeX-typografispråket, og gjenspeiler funksjonene som er bygget inn i hver motor. Her betyr ikke begrepet «primitiv», som brukes for å beskrive TeX-motorenes innebygde kommandoer, *inneholder* at disse kommandoene er enkle eller primitive, men at de er grunnleggende og udelelige: ikke konstruert av andre kommandoer (i motsetning til makroer). Alle TeX-motorer deler et stort sett med kjerneprimitiver, men noen inneholder primitiver som er spesifikke for den motoren—hvilket gir opphav til forestillingen om en «dialekt» av TeX.

Uansett hvilken TeX-motor som brukes til å sette LaTeX-dokumentet ditt, er oppgaven å behandle («kjøre») samlingen av LaTeX-kommandoer (dvs. makroer) som brukes til å skrive og konstruere dokumentet ditt. I praksis «konverterer» TeX-motoren LaTeX-koden din (makroene) *tilbake til* sine bestanddeler av primitive TeX-motor-kommandoer som motoren kan kjøre for å utføre selve typograferingen. Du trenger ikke *må* å bruke LaTeX-kommandoer for å sette dokumenter med TeX-motorer—du *kunne* velge å konstruere dokumentene dine helt med TeX-primitiver, dvs. direkte i det lavnivå *TeX-programmeringsspråket* innebygd i TeX-motorer. Men etter dagens standarder er TeX-språket ganske esoterisk og generelt ansett som vanskelig å programmere i—det kan også kreve et stort antall innebygde primitiver for å oppnå typografimålet ditt, noe som gjør det til en feilutsatt og potensielt repetitiv programmeringsoppgave.

For å unngå å måtte skrive direkte på TeX-språket, eller konstant skrive inn den samme serien av kommandoer på nytt, lar TeX-motorer deg lage «snarveier» kalt *makroer*. Ved å lage makroer definerer du dine egne kommandoer som pakker potensielt lange og komplekse sekvenser av primitiver i TeX-språket (eller andre makroer) inn i en enkelt «høyere nivå»-kommando. TeX-programmerere kan skrive svært sofistikerte makroer som innkapsler mye funksjonalitet i én enkelt kommando—som kommandoene som tilbys av LaTeX. Ved å bruke makropakker, som LaTeX (eller [ConTeXt](https://wiki.contextgarden.net/Main_Page)), er dokumentforfattere (for det meste) skjermet fra mange kjedelige detaljer, slik at de kan fokusere på å skrive og sette tekst i stedet for stadig å hanskes med kompleksiteten og nyansene i TeX-språket.

## I begynnelsen...

Sammen med å designe algoritmer for å sette matematikk og sofistikert linjedeling, sto Knuth overfor utfordringen med å programmere TeX-programvaren sin for å sette tabeller. Tydeligvis må enhver algoritme for tabellkonstruksjon ikke være unødig restriktiv, fordi det ville frustrere brukere som trenger friheten til å lage et nesten uendelig spekter av tabelloppsett. Videre kan tabellceller inneholde et bredt spekter av innhold, inkludert matematikk, grafikk og tekststykker brutt opp i pent satte linjer—faktisk alt som TeX er i stand til å sette. Å levere denne fleksibiliteten krever at TeXs tabellbyggingsalgoritmer fungerer hånd i hånd med andre deler av TeXs typografimaskineri.

Men TeX-motorer krever en pris for fleksibiliteten som tabellkonstruksjonsmulighetene gir: mange subtiliteter og nyanser i lavnivåoppførselen til innebygde (primitive) tabellsettingskommandoer, hvor det finnes 9:

* **`\halign`**, **`\valign`**: kjernekommandoer for tabellkonstruksjon
* **`\tabskip`**: lim plassert mellom \halign-kolonner eller \valign-rader
* **`\cr`**: obligatorisk avslutningstegn for alle linjer i en tabell, tilsvarer «carriage return»
* **`\noalign`**: setter inn materiale mellom \halign-rader eller \valign-kolonner
* **`\everycr`**: kommandoer (tokenregister) som leses etter at \cr er oppdaget
* **`\span`**: en kommando med dobbel funksjon: \span oppretter celler som spenner over kolonner eller rader, eller utvider kommandoer i tabellpreambelen (det vil vi se nærmere på)
* **`\omit`**: hopper over malene for en bestemt celle
* **`\crcr`**: brukes i makroer for å unngå feil hvis brukere glemmer en påkrevd \cr

Vi kommer til å møte disse kommandoene på reisen vår gjennom tabellkonstruksjon.

### Fjerne ekko av utfordringene

Begravd i [TeXs kildekode](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) finnes en noe skremmende innledning til temaet å implementere de lavnivå-kommandoene \halign og \valign som er utformet for å sette tabeller:

> «Det er omtrent et mirakel hver gang \halign og \valign fungerer, fordi de skjærer på tvers av så mange av kontrollstrukturene i TeX. Derfor er denne siden sannsynligvis ikke det beste stedet for en nybegynner å starte lesingen av dette programmet; det er bedre å mestre alt annet først.»

Knuth fortsetter med å si

> «Merk at når \halign behandles, overlater vi fryktløst kontrollen til resten av TeX. På kritiske punkter blir en justeringsrutine kalt inn for å gripe inn og gjøre en liten handling, men mesteparten av tiden ligger disse rutinene bare på lur i bakgrunnen. Det er litt som posthypnotisk suggestion.»

Ut fra disse kommentarene virker det rimelig å konkludere med at selv for Knuth var implementeringen av TeXs tabellsetting «noe med en utfordring»—for å gi brukeren kontroll og fleksibilitet, samtidig som man sørger for at TeXs automatiske algoritmer for tabellkonstruksjon er godt koordinert med TeXs kjerneprosesser for typografering.

Forfatteren kan uten forbehold bekrefte kompleksiteten i koden og algoritmene bak TeXs tabellsettingsmuligheter, men også beundringen for den enorme mengden funksjonalitet som finnes i en relativt liten mengde, om enn tett, Pascal- (eller C-)kode.


---

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