> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/sv/fordjupade-artiklar/14-how-do-tex-engines-typeset-tables.md).

# Hur TeX-motorer sätter tabeller

## Hur typograferar TeX-motorer tabeller

## Inledning: Vad omfattar denna serie?

Att producera estetiskt tilltalande tabeller kan vara en tidskrävande uppgift—oavsett om du använder ett visuellt layoutverktyg, LaTeX eller ett märkspråk som HTML eller markdown. Särskilt för LaTeX-användare rankas tabellsättning högt på många människors lista över ”smärtpunkter”, vilket kanske återspeglas av att ”tables” är ett av de mest [högst taggade ämnena på tex.stackexchange](https://tex.stackexchange.com/tags).

Utöver svaren och exemplen på tex.stackexchange visar även en snabb genomgång av det stöd som finns för tabellsättning med LaTeX att det finns ett antal tabellrelaterade informationsresurser:

* Overleafs [hjälpsidor](https://www.overleaf.com/learn/latex/tables) och andra webbplatser som [learnlatex.org](https://www.learnlatex.org/en/lesson-08)
* CTAN, Comprehensive TeX Network, listar över [70 TeX/LaTeX-paket](https://ctan.org/topic/table) relaterade till att skapa tabeller
* en hel [bok om tabellsättning med LaTeX](https://www.amazon.co.uk/Typesetting-Tables-LaTeX-Herbert-Voss/dp/1906860254)
* en utmärkt [online-generator för LaTeX-tabeller](https://www.tablesgenerator.com/latex_tables)

En enkel Google-sökning på [LaTeX tabeller](https://www.google.com/search?q=latex+tables) ger ett enormt antal träffar och listar många webbplatser som erbjuder hjälp, råd, exempel och förklaringar.

### TeX, inte LaTeX

Med tanke på den mängd litteratur som finns om tabellsättning med LaTeX, finns det något mer att skriva om dem—ännu fler tabellexempel och uppräkning/demonstration av paketkommandon? Finns det ett sätt att närma sig ämnet tabellsättning som lyfter fram eller fokuserar på de grundläggande principerna och begreppen bakom tabellsättning? Det finns, men det kräver att man skalar av LaTeX-löken…

Vi bestämde oss för att producera en artikelserie som syftar till att ge läsarna bakgrundsinformation och förklaringar av den underliggande *mekaniken* i TeX-baserad tabellsättning. I stället för att fokusera på tabellsättning med specifika LaTeX-makron/paket kommer vi att utforska det *underliggande beteendet* hos TeX-motorer: vi undersöker den lågnivåmässiga sättningsmekaniken som utgör grunden för de LaTeX-makrokommandon som byggs ovanpå den. Det yttersta målet är att få fram och förklara de centrala metoderna och algoritmerna för TeX-baserad tabellsättning—förhoppningsvis hjälper det läsare/användare att bättre förstå varför tabeller beter sig som de gör. En oundviklig konsekvens av detta angreppssätt, att skala bort de skyddande lagren av LaTeX-makroisolering, är exponering för röriga detaljer på lågnivå som användare vanligtvis (och glatt) är avskärmade från genom lager av LaTeX-makrokod.

Det har tagit mycket tid att forska, skriva och illustrera dessa artiklar, så vårt hopp är att de blir ett värdefullt tillskott till litteraturen och tillhandahåller material som informerar läsarna och hjälper dem att bättre förstå detta komplexa område inom TeX-sättning. Vi bör betona att denna artikelserie kommer att *inte* dra sig in i att diskutera *estetik* i tabellutformning—det är ett ämne fullt av subjektiva preferenser och vars argument måste föras någon annanstans…

### Utforska mekaniken i TeX-tabeller: Hur kan man göra det?

För att utforska, och sedan skriva om, de mekanismer och processer på lägre nivå som sker inuti TeX-motorer, såsom tabellsättning, byggde Overleaf kompilerade ”debugg”-versioner av Knuths TeX-motor med hjälp av Martin Ruckerts [Web2W-process](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html).

Traditionellt sett innebär byggandet av TeX en process kallad Web2C, som används inom TeX Live, och som genererar C-kod genom att konvertera TeX:s ursprungliga Pascal-källkod till dess C-ekvivalent. Den processen genererar C-kod som aldrig var avsedd att läsas av människor, endast av C-kompilatorer. Den mekaniskt genererade C-koden är *utomordentligt* svår att läsa eller modifiera i experimentellt syfte.

Däremot producerar Web2W C-källkod (tillgänglig [här](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/ctex.c)) som är *många storleksordningar* mer läsbar än kod producerad av Web2C. Följaktligen är Web2W:s C-källkod mycket mer lämpad att modifiera för lärande-/experimenteringssyften.

Web2W producerar en version av TeX (“CTeX”) som är *extremt* nära Knuths originalprogram: “CTeX” innehåller inte de många förändringar och förbättringar som infördes genom Web2C-processen—såsom SyncTeX, kommandoradsbearbetning och filsökning via Kpathsea. Även om du avstår från dessa värdefulla förbättringar är den resulterande (Web2W) C-koden relativt enkel att navigera med hjälp av Knuths publicerade TeX-källkod, trots att TeX skrevs i Pascal.

* **En not om namn:** Strängt taget får namnet ”TeX” endast syfta på den ursprungliga programvaran som skrevs och publicerades av Donald Knuth. Alla modifieringar av hans programvara måste använda ett annat namn för den resulterande TeX-baserade sättningsprogramvaran. Här använde vi Web2W-processen för att bygga en motor som fortfarande i praktiken är Knuths ursprungliga programvara. Men för tydlighetens skull kommer vi att använda termen ”CTeX” för att mena den specifika version som byggts med Web2W, men vi kommer också att använda ”TeX” för att mena antingen Knuths ursprungliga motor eller en generell term för sättningsspråket baserat på principerna i Knuths TeX. Vi hoppas att läsarna har överseende med eventuella tillfälliga avsteg från en rigorös tillämpning/användning av den strikt korrekta terminologin: vi hoppas att mening/avsikt förmedlas av sammanhanget.

Debug-versionen av CTeX kördes med [Eclipse IDE](https://www.eclipse.org/downloads/packages/), vilket gjorde det möjligt att observera bearbetningen i realtid av C-koden som implementerar de lågnivåmässiga primitiva (inbyggda) TeX-kommandon och algoritmer som Knuth utformade för att stödja tabellsättning.

Följande korta video (ca 90 sekunder) visar hur CTeX-motorn körs i [Eclipse IDE](https://www.eclipse.org/downloads/packages/):

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

Utöver CTeX kompilerade vi också e-TeX för att få tillgång till några ytterligare primitiver som inte finns i Knuths ursprungliga programvara. Även om CTeX och e-TeX numera är gamla TeX-baserade motorer, är de fortfarande lämpliga som grund för att utforska mekaniken bakom tabellsättning eftersom dessa underliggande principer fortfarande gäller för alla TeX-baserade sättningsmotorer.

### Varför använda en äldre TeX-motor för att utforska tabeller?

För det första är den tryckta boken, [TeX:The Program](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373), som listar och förklarar TeX:s källkod, fortfarande en extremt praktisk guide till TeX:s dunkla inre, trots att den publicerades för mer än 30 år sedan (1986). Naturligtvis kan du själv sätta dokumentationen till TeX:s källkod, se till exempel Overleaf-projektet [Sätt dokumentationen till källkoden för TeX, e-TeX eller pdfTeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv). Sedan publiceringen av TeX:The Program 1986 har nya TeX-motorer utvecklats, inklusive pdfTeX, XeTeX och LuaTeX, som alla introducerar funktioner och kommandon som inte dokumenteras i TeX:The Program helt enkelt därför att de inte fanns i Knuths ursprungliga programvara.

För många kärnprocesser, såsom TeX:s tabellsättning, är koden som dokumenteras i TeX:The Program fortfarande relevant som grund för studier—även om TeX:s källkod är skriven i Pascal. Dessutom är Knuths TeX relativt enkel och snabb att kompilera—särskilt via den oerhört användbara [Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html) process som utvecklats av Martin Ruckert. Enkelhet/snabbhet i kompileringen gör det mycket bekvämare att modifiera TeX på enkla sätt—såsom skapandet av SVG-grafik som används senare i denna artikelserie.

### Förstå skillnaden mellan TeX och LaTeX

Många läsare känner redan till att LaTeX faktiskt inte är ett *exekverbart* sättningsprogram utan en stor samling kommandon (*makron*) som i slutändan är skrivna i ett sättnings-/programmeringsspråk på lägre nivå som kallas TeX. Din LaTeX-kod producerar sättsatt utdata först efter att den har bearbetats av ett exekverbart program kallat en *TeX-motor*—mjukvaran som ligger mellan din LaTeX-kod (dokument) och den sättsatta PDF:en. I dag kan användare välja mellan olika TeX-motorer för att sätta sin LaTeX-kod, inklusive pdfTeX, XeTeX och varianter av LuaTeX.

De som är nya i TeX/LaTeX-ekosystemet blir ofta, och förståeligt nog, förbryllade av mängden kryptiskt klingande namn som används för verktygen de stöter på: TeX, LaTeX, pdfTeX, pdfLaTeX, XeTeX, XeLaTeX, LuaTeX och LuaLaTeX. Om du känner likadant finns hjälp att få i Overleaf-artikeln [Vad ligger i ett namn: En guide till de många smakerna av TeX](/latex/sv/fordjupade-artiklar/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) som förklarar ursprunget till och betydelsen av alla dessa termer.

#### Dialekter och TeX-primitiver

Varje TeX-motor har en uppsättning inbyggda kommandon som kallas *primitiver* vilka tillsammans utgör motorns ”dialekt” av TeX-sättningsspråket och återspeglar de kapaciteter som är inbyggda i varje motor. Här betyder termen ”primitive” som används för att beskriva TeX-motorernas inbyggda kommandon inte *inte* att dessa kommandon är grundläggande eller enkla, utan att de är fundamentala och odelbara: de är inte konstruerade av andra kommandon (till skillnad från makron). Alla TeX-motorer delar en stor kärnuppsättning primitiver men vissa innehåller primitiver som är specifika för just den motorn—vilket ger upphov till föreställningen om en ”dialekt” av TeX.

Oavsett vilken TeX-motor som används för att sätta ditt LaTeX-dokument är dess uppgift att bearbeta (”exekvera”) den samling LaTeX-kommandon (dvs. makron) som används för att skriva och konstruera ditt dokument. I praktiken ”omvandlar” TeX-motorn din LaTeX-kod (makron) *tillbaka till* deras ingående primitiva TeX-motor-kommandon som motorn kan exekvera för att utföra den faktiska sättningen. Du behöver inte *har* att använda LaTeX-kommandon för att sätta dokument med TeX-motorer—du *skulle kunna* välja att konstruera dina dokument helt med TeX-primitiver, dvs. direkt i det lågnivåmässiga *TeX-programmeringsspråket* som är inbyggt i TeX-motorer. Men med dagens mått mätt är TeX-språket ganska esoteriskt och anses generellt vara svårt att programmera i—det kan också kräva ett stort antal inbyggda primitiver för att uppnå ditt sättningsmål, vilket gör det till en programmeringsuppgift som lätt leder till fel och som potentiellt blir repetitiv.

För att slippa skriva direkt i TeX-språket, eller ständigt skriva om samma serie kommandon, låter TeX-motorer dig skapa ”genvägar” kallade *makron*. Genom att skapa makron definierar du dina egna kommandon som paketerar potentiellt långa och komplexa sekvenser av TeX-språkets primitiver (eller andra makron) till ett enda ”högre nivå”-kommando. TeX-programmerare kan skriva mycket sofistikerade makron som kapslar in en stor mängd funktionalitet i ett enda kommando—såsom de kommandon som tillhandahålls av LaTeX. Genom att använda makropaket, såsom LaTeX (eller [ConTeXt](https://wiki.contextgarden.net/Main_Page)), är dokumentförfattare (i stort sett) skyddade från många tröttsamma detaljer, vilket låter dem fokusera på att skriva och sätta text snarare än att ständigt brottas med TeX-språkets komplexitet och nyanser.

## I begynnelsen...

Tillsammans med att utforma algoritmer för matematiksättning och avancerad radbrytning stod Knuth inför utmaningen att programmera sin TeX-mjukvara för att sätta tabeller. Tydligt är att alla algoritmer för tabellkonstruktion inte får vara onödigt begränsande, eftersom det skulle frustrera användare som behöver friheten att skapa ett nästan oändligt antal tabelllayouter. Dessutom kan tabellceller innehålla ett brett spektrum av innehåll, inklusive matematik, grafik och textstycken som bryts upp i snyggt sättsatta rader—faktiskt allt som TeX kan sätta. Att leverera denna flexibilitet kräver att TeX:s tabellbyggande algoritmer arbetar hand i hand med andra delar av TeX:s sättningsmaskineri.

TeX-motorer tar dock betalt för den flexibilitet som deras tabellkonstruktionsförmåga ger: många subtiliteter och nyanser i beteendet på låg nivå hos inbyggda (primitiva) kommandon för tabellsättning, av vilka det finns 9:

* **`\halign`**, **`\valign`**: centrala kommandon för tabellkonstruktion
* **`\tabskip`**: lim placerat mellan kolumner i \halign eller rader i \valign
* **`\cr`**: obligatorisk ”radslut”-terminator för alla rader i en tabell
* **`\noalign`**: injicera material mellan rader i \halign eller kolumner i \valign
* **`\everycr`**: kommandon (tokenregister) som läses efter att \cr har upptäckts
* **`\span`**: ett kommando med dubbel funktion: \span skapar celler som sträcker sig över kolumner eller rader, eller expanderar kommandon i tabellpreambeln (detta kommer vi att titta närmare på)
* **`\omit`**: hoppa över mallarna för en viss cell
* **`\crcr`**: används i makron för att undvika fel om användare glömmer ett obligatoriskt \cr

Vi kommer att stöta på dessa kommandon på vår resa genom tabellkonstruktionen.

### Avlägsna ekon av utmaningarna

Begravt i [TeX:s källkod](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) finns en något avskräckande introduktion till ämnet att implementera de lågnivåkommandon \halign och \valign som är avsedda att sätta tabeller:

> ”Det är nästan ett mirakel när \halign och \valign fungerar, eftersom de skär tvärs igenom så många av TeX:s styrstrukturer. Därför är denna sida förmodligen inte den bästa platsen för en nybörjare att börja läsa detta program; det är bättre att först bemästra allt annat.”

Knuth fortsätter med att säga

> ”Observera att när \halign bearbetas ger vi utan fruktan upp kontrollen till resten av TeX. Vid kritiska vägskäl kallas en aligneringsrutin in för att ingripa och göra någon liten åtgärd, men för det mesta lurar dessa rutiner bara i bakgrunden. Det är lite som posthypnotisk suggestion.”

Av dessa kommentarer verkar det rimligt att dra slutsatsen att även för Knuth var implementeringen av TeX:s tabellsättning ”något av en utmaning”—att ge kontroll och flexibilitet åt användaren men samtidigt säkerställa att TeX:s automatiska tabellkonstruktionsalgoritmer var väl orkestrerade med TeX:s kärnprocesser för sättning.

Författaren vittnar gärna om komplexiteten i koden och algoritmerna bakom TeX:s kapacitet för tabellsättning men också om beundran för den enorma mängd funktionalitet som ryms i en relativt liten mängd, om än tät, Pascal- (eller C-) kod.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/sv/fordjupade-artiklar/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.
