> 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/31-latex-is-more-powerful-than-you-think-computing-the-fibonacci-numbers-and-turing-completeness.md).

# LaTeX er mere kraftfuldt, end du tror - beregning af Fibonacci-tallene og Turing-komplethed

**Forfatter: Robert Murrish (april 2012 (redigeret af Overleaf i april 2023))**

LaTeX er et stærkt værktøj. Så stærkt, faktisk, at det kan bruges til meget mere end dokumentmarkup. LaTeX er [Turing-komplet](https://en.wikipedia.org/wiki/Turing_completeness); det vil sige, at det kan programmeres til at beregne stort set alt.

For at demonstrere LaTeX' programmeringsevner til generelle formål vil vi se på et eksempel, der beregner de første Fibonacci-tal. Selvom dette ikke er et bevis på Turing-komplethed, er det et godt eksempel på en komplet algoritme implementeret i LaTeX.

### Fibonacci-tallene

Hvert tal i Fibonacci-sekvensen er summen af de to foregående led i sekvensen, hvor de to første led er defineret som 1 for at give et udgangspunkt.

Vi kan skrive en ny kommando til at beregne disse tal. Lad os begynde med at beslutte, hvordan et kald til vores endnu-ikke-skrivne kommando kunne se ud:

```latex
\fibonacci{10}
```

Når denne kommando kaldes fra vores LaTeX-dokument, bør den producere en liste over `n` Fibonacci-tal (hvor `n=10` i eksempelkaldet her). Her er koden til `\fibonacci` kommandoen (dvs. LaTeX-makroen). Lad os se på, hvordan den virker.

```latex
\documentclass{article}
\begin{document}

\newcount\temp
\newcount\fone
\newcount\ftwo
\newcount\fcnt

\newcommand{\fibonacci}[1]{%
	\fcnt=#1
	\fone=1
	\ftwo=1
	\temp=0
	\the\fone, \the\ftwo
	\let\next=\fibloop
	\fibloop
}

\def\fibloop{, %
	\temp=\fone
	\fone=\ftwo
	\advance\ftwo by \temp
	\ifnum\fcnt=0
            \let\next=\relax
        \else
            \advance\fcnt by -1
        \fi
	\the\ftwo
	\next
}

(\fibonacci{10})
\end{document}
```

[Åbn dette eksempel i Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Fibonacci+sequence+in+LaTeX\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%0A%5Cnewcount%5Ctemp%0A%5Cnewcount%5Cfone%0A%5Cnewcount%5Cftwo%0A%5Cnewcount%5Cfcnt%0A%0A%5Cnewcommand%7B%5Cfibonacci%7D%5B1%5D%7B%25%0A%09%5Cfcnt%3D%231%0A%09%5Cfone%3D1%0A%09%5Cftwo%3D1%0A%09%5Ctemp%3D0%0A%09%5Cthe%5Cfone%2C+%5Cthe%5Cftwo%0A%09%5Clet%5Cnext%3D%5Cfibloop%0A%09%5Cfibloop%0A%7D%0A%0A%5Cdef%5Cfibloop%7B%2C+%25%0A%09%5Ctemp%3D%5Cfone%0A%09%5Cfone%3D%5Cftwo%0A%09%5Cadvance%5Cftwo+by+%5Ctemp%0A%09%5Cifnum%5Cfcnt%3D0%0A++++++++++++%5Clet%5Cnext%3D%5Crelax%0A++++++++%5Celse%0A++++++++++++%5Cadvance%5Cfcnt+by+-1%0A++++++++%5Cfi%0A%09%5Cthe%5Cftwo%0A%09%5Cnext%0A%7D%0A%0A%28%5Cfibonacci%7B10%7D%29%0A%5Cend%7Bdocument%7D)

Først sætter vi et par variabler op, som vi vil bruge senere. Kommandoen `\newcount` giver os en variabel, vi kan bruge til at gemme et heltal; her opretter vi fire: `\fcnt`, `\fone`, `\ftwo` og `\temp`. Det er værd at nævne, at disse ikke er nye variabler; de er snarere aliaser for eksisterende tællere. [LaTeX-tællere](/latex/da/formatering/10-counters.md) kan bruges direkte som i `\count0`, `\count1`, osv. men ved at tildele dem navne forhindrer vi os i at skrive til en tæller, der allerede er i brug. Hvis du er nysgerrig, så erstat en af variablerne i denne kode med `\count0`, og sidetallene vil være forkerte resten af dokumentet.

Derefter har vi `\fibonacci` kommandoen. Vi opretter den med `\newcommand`, som vi giver navnet, antallet af argumenter og TeX-koden, der skal behandles som argumenter. For denne kommando accepterer vi et enkelt argument, antallet af Fibonacci-tal, der skal udskrives. Indholdet af denne kommando er enkelt: vi sætter startværdier for vores variabler, udskriver de første to Fibonacci-tal (da de ikke behøver at blive beregnet), og kalder derefter `\fibloop`, som vil klare det tunge arbejde for vores beregninger.

Kommandoen `\fibloop` er erklæret på samme måde, men en central del af denne kommando er, hvordan den laver løkker. Vi bruger en kommando kaldet `\next`, initialiseret til `\fibloop` i `\fibonacci`, og brugt inde i `\fibloop` til at styre løkken. `\fibloop` vil gentage sig, indtil `\next` ændres af kode inde i `\fibloop` kommandoen selv. Vi vil kun løkke `n` gange, så vi bruger en `\ifnum` sætning, der tjekker værdien af vores tæller (`\fcnt`) og derefter, hvis den ikke har nået tærskelværdien 0, `\fcnt` nedtælles hver gang løkken gentages. Hvis betingelsen er opfyldt, sætter vi `\next` til `\relax`, hvilket vil forhindre `\fibloop` i at gentage sig—den afsluttende `\next` kommando gør ingenting, og løkken afsluttes.

De andre kommandoer i dette blok beregner det næste Fibonacci-tal i sekvensen og opdaterer variablernes værdier, så de er klar til næste omgang. Kommandoen `\the\ftwo` udskriver værdien af det aktuelle Fibonacci-tal i dokumentet, og du vil også bemærke et komma og et mellemrum øverst i `\fibloop` kommandoen, der bruges til at adskille hver værdi.

#### Resultatet

Den enkleste måde at se denne kode i aktion er at køre den på Overleaf ved hjælp af **Åbn dette eksempel i Overleaf** linket nederst i kodevisningen. Fibonacci-sekvensen vokser hurtigt, så enhver `n>44` vil resultere i et heltals-overløb i denne specifikke implementering.

### Hvor skal man gå herfra?

Som et uformelt bevis på, at LaTeX er Turing-komplet, præsenterer jeg følgende kode, som er en hurtig og beskidt implementering af en [NAND-port](https://en.wikipedia.org/wiki/NAND_gate):

```latex
\newcount\nanone
\newcount\nantwo

\newcommand{\nand}[2]{%
\nanone=#1
\nantwo=#2
  \ifnum\nanone=\nantwo
    \ifnum\nanone=0\relax 1
      \else 0
    \fi
   \else 1
\fi
}
```

NAND- (og også NOR-) logiske porte har den interessante egenskab, at enhver anden logisk port kan dannes med netop denne ene type port. Ud fra de grundlæggende logiske porte kan du konstruere låse, flip-flops og hukommelse. Det er ingredienserne til en computer til generelle formål. Du kan teste denne NAND-port for hver af dens fire mulige input med følgende eksempel, som du kan åbne i Overleaf.

```latex
\documentclass{article}
\begin{document}

\newcount\nanone
\newcount\nantwo

\newcommand{\nand}[2]{%
\nanone=#1
\nantwo=#2
  \ifnum\nanone=\nantwo
    \ifnum\nanone=0\relax 1
      \else 0
    \fi
   \else 1
\fi
}

\nand{0}{0}
\nand{0}{1}
\nand{1}{0}
\nand{1}{1}
\end{document}
```

[Åbn dette eksempel i Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=NAND+gate+in+LaTeX\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%0A%5Cnewcount%5Cnanone%0A%5Cnewcount%5Cnantwo%0A%0A%5Cnewcommand%7B%5Cnand%7D%5B2%5D%7B%25%0A%5Cnanone%3D%231%0A%5Cnantwo%3D%232%0A++%5Cifnum%5Cnanone%3D%5Cnantwo%0A++++%5Cifnum%5Cnanone%3D0%5Crelax+1%0A++++++%5Celse+0%0A++++%5Cfi%0A+++%5Celse+1%0A%5Cfi%0A%7D%0A%0A%5Cnand%7B0%7D%7B0%7D%0A%5Cnand%7B0%7D%7B1%7D%0A%5Cnand%7B1%7D%7B0%7D%0A%5Cnand%7B1%7D%7B1%7D%0A%5Cend%7Bdocument%7D)

At vide, at LaTeX er Turing-komplet, åbner op for en verden af muligheder. Kode som denne er almindelig i LaTeX’ backend til ting som at holde styr på side- og figurnumre og beslutte, hvor flydende objekter skal placeres. Det er et værktøj, du kan bruge til din fordel til at forenkle komplekse dokumentlayout.

Som afslutning på dette indlæg vil jeg give dig videre læsning om eksempler på programmering i LaTeX og Turing-maskiner.

#### Eksempler på LaTeX-programmering

* [Mandelbrot-mængden i LaTeX](http://warp.povusers.org/MandScripts/latex.html) . Særligt tak til denne; denne kode var et nyttigt eksempel, mens jeg skrev min Fibonacci-kommando.
* [En Turing-maskine i LaTeX: opfølgeren](http://pbelmans.ncag.info/blog/2010/12/12/a-turing-machine-in-latex-follow-u/) NB: Da vi flyttede denne artikel til et andet indholdsplatformssystem, bemærkede vi, at det websted, der blev henvist til i den oprindelige artikel (<http://en.literateprograms.org/Turing_machine_simulator_(LaTeX))> ikke længere var tilgængeligt, så vi erstattede linket med en opfølgende artikel af en anden forfatter.
* [Wikibog om TeX-kommandoer](http://en.wikibooks.org/wiki/Category:TeX)
* [LaTeX i en programmeringskonkurrence](http://sdh33b.blogspot.com/2008/07/icfp-contest-2008.html). En Mars-rover-controller i LaTeX slog bidrag skrevet i flere mere almindelige programmeringssprog.

### Turing-maskiner på uventede steder

* [Conways Game of Life er Turing-komplet](http://rendell-attic.org/gol/utm/index.htm). Her er en implementering af en Turing-maskine.
* [Regel 110](http://en.wikipedia.org/wiki/Rule_110) er en 1D cellulær automat, som er Turing-komplet.
* Minecraft (videospillet) er Turing-komplet. Der er blevet bygget flere eksempler, så følgende link er blot til en [side med relevante YouTube-søgeresultater](http://www.youtube.com/results?search_query=minecraft+turing+machine)


---

# 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/31-latex-is-more-powerful-than-you-think-computing-the-fibonacci-numbers-and-turing-completeness.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.
