> 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/flere-emner/19-how-tex-macros-actually-work-part-1.md).

# Hvordan TeX-makroer egentlig fungerer: Del 1

[Del 1](/latex/no/flere-emner/19-how-tex-macros-actually-work-part-1.md) [Del 2](/latex/no/flere-emner/20-how-tex-macros-actually-work-part-2.md) [Del 3](/latex/no/flere-emner/21-how-tex-macros-actually-work-part-3.md) [Del 4](/latex/no/flere-emner/22-how-tex-macros-actually-work-part-4.md) [Del 5](/latex/no/flere-emner/23-how-tex-macros-actually-work-part-5.md) [Del 6](/latex/no/flere-emner/24-how-tex-macros-actually-work-part-6.md)

## Introduksjon: Målene med denne serien

Denne artikkelserien har et ambisiøst mål: å forklare *hvordan* hvordan TeX-makroer (som LaTeX-kommandoer) faktisk fungerer — på det mest grunnleggende nivået, inne i selve TeX-motorprogramvaren. I stedet for å støtte oss *utelukkende* på en samling eksempelmikroer utformet for å demonstrere ulike funksjoner, kanttilfeller og oppførsel i TeX, skal vi se inn i selve TeX for å se *hvordan* og *hvorfor* hvorfor metoder for makroprogrammering fungerer slik de gjør.

For å nå målet vårt må vi begynne med å diskutere temaer som er ganske lavnivå, og i starten kan disse virke noe fjerne fra oppgaven med å sette dokumentene dine. Forhåpentligvis vil du, etter å ha gått dypere inn i det, komme ut med et grunnlag for å bygge en bedre forståelse som til slutt vil spare deg for mye tid og kanskje også redusere frustrasjonsnivået.

### TeX-programmeringsspråket: Kjenner du følelsen?

Det er ikke særlig urimelig å beskrive TeX-programmeringsspråket som noe obskurt, for det er det — i hvert fall etter standarden til de fleste vanlige programmeringsspråk som brukes i dag. Når du begynner reisen med å lære mer om TeX/LaTeX, særlig hvis du vil skrive ikke-trivielle makroer, møter du raskt begreper som kategorikoder, tokens/tokenisering og «ekspansjon» av kommandoer eller makroer. Denne salven av begreper er sannsynligvis ganske fremmedartet, og kan kanskje gjøre deg forvirret og til tider litt frustrert, ettersom veien til suksess ikke alltid blir hjulpet av noen av TeX/LaTeXs nærmest ugjennomtrengelige feilmeldinger.

## Så hvor begynner vi? Med kategorikoder.

TeX-motorer faller inn under en programvareklasse som kalles [kompilatorer](https://en.wikipedia.org/wiki/Compiler): programmer som tar inn en fil skrevet i et *kilde* språk og *kompilerer* (transformerer) den til en utdatafil skrevet i et *mål* språk. Mer spesifikt er TeX en *dokumentkompilator*. For TeX-motorer (kompilatorer) er inndatafilen skrevet i TeX-settespråket, og målet er en utdatafil skrevet i et annet «språk» som [DVI](https://en.wikipedia.org/wiki/Device_independent_file_format) eller PDF — selv om vi bruker begrepet «språk» litt løst.

La oss se nærmere på kilde-, eller inndataspråket, som brukes til å skrive TeX-filen din. En `.tex` fil er i bunn og grunn én lang sekvens av tegn (inkludert linjeskifttegn): bestående av tekst som skal settes, avbrutt av `\`, `}`, `$`, `[` og alle slags tegn som kan forekomme i en tilsynelatende nær uendelig rekke kombinasjoner. Enhver som ikke bruker TeX/LaTeX, kan se på en typisk `.tex` fil og bli tilgitt for å oppfatte den som en ganske forvirrende blanding av tegn med liten, om noen, synlig filstruktur. LaTeX-makropakken gjør helt klart noe for å «påføre» en viss grunnleggende struktur på en .tex-inndatafil. Men mellom `\begin{document}` og `\end{document}` er det opp til dokumentforfatteren hva som skal inn der. Hvis du ser på `.tex` filer skrevet med Knuths opprinnelige Plain TeX-makropakke, vil du se at dokumentstrukturen nesten er helt fraværende.

Så generelt kan en TeX-inndatafil se ganske ustrukturert ut, en tilsynelatende vilkårlig blanding av innhold som skal settes, avbrutt av instruksjoner (kommandoer) som styrer settingen av dette innholdet. Hvordan er det i det hele tatt mulig for TeX å gi mening til en typisk `.tex` inndatafil: å filtrere dette innkommende virvaret av tegn til handlingsklare instruksjoner for settemotoren og innhold som skal settes?

### Filtrering av virvaret: Si hei til kategorikoder

Enhver menneskelig observatør som ikke vet noe om TeX, kan se på en `.tex` fil og kjenne igjen bestemte tegn som `$` og vite at det er symbolet for en valuta, eller se en `&` og identifisere den som et ampersand. Denne observatøren slutter seg til en *betydning* for hvert tegn de ser — en betydning basert på rollen tegnet spiller i menneskelig kommunikasjon. I tillegg kan de se tegn som `a`, `e`, `eller` og vite at de klassifiseres som vokaler, mens andre som `b`, `c` eller `d` klassifiseres som konsonanter. Som mennesker har vi en slags innebygd oppslagstabell (i minnet vårt) gjennom hvilken vi tilordner hvert tegn en betydning — en betydning basert på rollen tegnet har i språkene vi kan kommunisere på.

For å behandle en `.tex` fil må TeX-programvaren også se på hvert tegn i inndataene dine, og den må også tilordne en *betydning* til hvert eneste tegn den «ser». Men TeX er bare en programvarebasert maskin som behandler tekst — lagret som en sekvens av heltall (tegnkoder) i en inndatafil. Som maskin må TeX programmeres med relevante data som forteller den hvordan den skal bestemme betydningen av et tegn den «ser på», og deretter hva den skal gjøre med det. Hvordan oppnår TeX dette?

Svaret er et av disse TeX-spesifikke begrepene: *kategorikoder,* det finnes 16 av dem, fra 0 til 15. For TeX er hvert tegn det noen gang forventer å se i en `.tex` fil, så å si, *kategorikode* forhåndstildelt. Inne i TeX-programvaren finnes en slags «oppslagstabell» som lister kategorikoden *for øyeblikket* tildelt hvert tegn som TeX kan komme til å se i en .tex-inndatafil. Du bør tenke på TeXs kategorikoder som en tildeling av en *betydning* til hvert enkelt tegn i inndatastrømmen som TeX må undersøke (skanne).

For å sette dokumentet ditt må en TeX-motor lese (skanne) hvert eneste tegn, men TeXs umiddelbare interesse er ikke selve tegnene (tegnkodene): et tegns *kategorikode* er av større betydning ved skanning av inndata. Et tegns *nåværende* kategorikode bestemmer *den nåværende betydningen* av det tegnet *på det tidspunktet TeX leser det inn*: den kategorikoden bestemmer hvordan TeX vil behandle/prosessere hvert tegn — vi skal forklare hvorfor vi sier «nåværende kategorikode» og «nåværende betydning». Det er gjennom kategorikoder at TeX kan filtrere det innkommende virvaret av tegn for å skille mellom tegn (innhold) som skal settes, og tegn som utgjør instruksjoner som skal behandles —*kommandoer* som TeX må utføre.

Følgende tabell lister disse 16 kategorikodene: hva de hver for seg betyr, sammen med eksempler på tegn som vanligvis tildeles hver kategori.

| **Kategorikode** | **Beskrivelse**                                               | **Standard LATEX/TEX**                                       |
| ---------------- | ------------------------------------------------------------- | ------------------------------------------------------------ |
| 0                | Escape-tegn—forteller TEX å begynne å se etter en kommando    | `\`                                                          |
| 1                | Start en gruppe                                               | {                                                            |
| 2                | Avslutt en gruppe                                             | }                                                            |
| 3                | Matematikkbytte—bytt inn/ut av matematikkmodus                | $                                                            |
| 4                | Justeringstabulator                                           | &                                                            |
| 5                | Linjeslutt                                                    | ASCII-kode 13 (`\r`)                                         |
| 6                | Makroparameter                                                | #                                                            |
| 7                | Hevet skrift—for satsing av matematikk: `$y=x^2$` $$y=x^2$$   | ˆ                                                            |
| 8                | Senket skrift—for satsing av matematikk: `$y=x_2$` $$y=x\_2$$ | \_                                                           |
| 9                | Ignorert tegn                                                 | ASCII 0 `<null>`                                             |
| 10               | Mellomromstegn                                                | ASCII-kodene 32 (mellomrom) og 9 (tabulatortegn)             |
| 11               | Bokstav                                                       | A...Z, a...z, (og tusenvis av Unicode-tegn)                  |
| 12               | Annet                                                         | 0...9 pluss ,.;?" og mange andre                             |
| 13               | Aktivt tegn                                                   | Spesiell kategorikode for å lage makroer med ett tegn, som ˜ |
| 14               | Kommentartegn—ignorer alt som følger til linjeslutt           | %                                                            |
| 15               | Ugyldig tegn, ikke tillatt å forekomme i .tex-inndatafilen    | ASCII-kode 127 (`DEL`)                                       |

Bruken av kategorikoder er TeXs viktigste mekanisme for å filtrere den innkommende strømmen av tegn, og for å gi mening til inndataene dine for å avgjøre:

* tegn som utgjør teksten som skal settes;
* avgrensning av innhold som skal settes som matematikk;
* tegnsekvenser som er navn på kommandoer som skal behandles eller utføres;
* … og mange andre setteoperasjoner.

I begynnelsen kan du kanskje tro at hvert tegns kategorikode (betydning) er en slags fast tildeling: uforanderlig og permanent innebygd i de indre grunnvollene til TeX-programvaren, men slik er det ikke. Som nevnt holder TeX en intern oppslagstabell for å lagre detaljer om hvilken kategorikode som er *for øyeblikket* tildelt hvert tegn — vi sier helt bevisst *for øyeblikket tildelt* fordi kategorikoden for et hvilket som helst tegn (som ennå ikke er lest inn) kan endres ved å bruke en primitiv (innebygd) kommando kalt `\catcode`. Dette gir stor fleksibilitet fordi du, hvis du ønsker, kan endre fullstendig måten TeX vil behandle eller tolke betydningen av ethvert tegn som senere leses fra inndataene, noe som gir enorme muligheter for avanserte settningsapplikasjoner.

Hvis du mest er interessert i å bruke LaTeX for å «få jobben gjort», er det stor sannsynlighet for at du ikke har støtt på kategorikoder direkte, bortsett fra kanskje gjennom feilmeldinger du har sett. Men vær trygg, kategorikoder er en kjernekomponent i en TeX-motors virkemåte: de gjør LaTeX (og LaTeX-pakker) i stand til faktisk å gjøre arbeidet med å sette dokumentet ditt.

Når TeX-motoren din starter opp («[booter](https://en.wikipedia.org/wiki/Bootstrapping)») vil den bruke et sett med standardtildelinger av tegn til kategorikoder, men via `\catcode` kommandoen kan disse standardverdiene endres av LaTeX-kjernekoden (makroer) og/eller av LaTeX-pakkene du har lastet inn — eller faktisk av din egen TeX-kode eller dine egne makroer. Over tid og gjennom tradisjon/bruk har imidlertid visse tegn som er tildelt bestemte kategorikoder blitt akseptert som «standarder», og det er absolutt ønskelig å følge disse standardene hvis du vil at dokumentene dine skal være portable og lett kunne deles med kolleger eller andre brukere. For eksempel er `\` tegnet tildelt kategorikode 0 for å markere starten på en TeX/LaTeX-kommando — se [tabellen over](#tbl-0).

### Lesing (skanning) av inndata

Når TeX leser (skanner) det neste tegnet fra inndatafilen din, er det aller første den gjør å se på kategorikoden, så la oss se nærmere på hva som skjer når TeX leser en typisk linje med inndata.

Anta at vi har en .tex-fil som inneholder teksten `Hallo verden \\jobname` et sted inne i et avsnitt. Hvis vi ser inni `.tex` filen ved hjelp av en [hekseditor](https://en.wikipedia.org/wiki/Hex_editor), ser vi at tegnsekvensen `Hallo verden \\jobname` i vår `.tex` fil bare er en serie heltall, eller *tegnkoder*, vist i skjermbildet nedenfor som den heksadesimale sekvensen:

`48, 65, 6C, 6C, 6F, 20, 57, 6F, 72, 6C, 64, 20, 5C, 6A, 6F, 62, 6E, 61, 6D, 65, 20`

![Heksadesimale tegnkoder i en TeX-fil](/files/755f1fb702f24bc5b7e37b2bffc0406e5a17ecb7)

Hvis vi konverterer fra heksadesimal (base 16) til desimal (base 10), er tegnkodesevensen:

![Desimale tegnkoder i en TeX-fil](/files/72059dc33ee85e07c17d59c17ee2a68ae1a5f5f3)

Vi vet også at hvert tegn for TeX har en tilsvarende kategorikode; så, basert på [tabellen over](#tbl-0) vet vi at følgende standardtildelinger av kategorikoder (sannsynligvis) også brukes:

![TeX-kategorikoder](/files/45b7034d7757d863d2f848e81c27bb60ca2d8ab9)

Dermed er hvert tegn i inndatafilen representert for TeX av *to* numeriske verdier — tegnkoden og kategorikoden:

![Tegnkoder og tilhørende TeX-kategorikoder](/files/00726ef78d126d9269db2ca1a5b7f799f8c48d66)

På dette tidspunktet betrakter vi bare det aller første trinnet i TeXs behandling av filen din: skanningen av de enkelte tegnene. Så hva gjør egentlig TeX med disse parene av tegnkoder og kategorikoder? Når TeX har skannet et enkelt tegn og slått opp den tilsvarende kategorikoden, hvordan bruker TeX nøyaktig denne informasjonen til å «filtrere» de innkommende tegnene?

## Del 2

I del 2 ser vi nærmere på hvordan TeX leser inndataene dine: vi later som om vi er TeXs «øyne» idet det ser på inndataene dine, tegn for tegn.

[Del 1](/latex/no/flere-emner/19-how-tex-macros-actually-work-part-1.md) [Del 2](/latex/no/flere-emner/20-how-tex-macros-actually-work-part-2.md) [Del 3](/latex/no/flere-emner/21-how-tex-macros-actually-work-part-3.md) [Del 4](/latex/no/flere-emner/22-how-tex-macros-actually-work-part-4.md) [Del 5](/latex/no/flere-emner/23-how-tex-macros-actually-work-part-5.md) [Del 6](/latex/no/flere-emner/24-how-tex-macros-actually-work-part-6.md)


---

# 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/flere-emner/19-how-tex-macros-actually-work-part-1.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.
