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

# LaTeX ist leistungsfähiger, als Sie denken – Berechnung der Fibonacci-Zahlen und Turing-Vollständigkeit

**Autor: Robert Murrish (April 2012 (bearbeitet von Overleaf im April 2023))**

LaTeX ist ein leistungsstarkes Werkzeug. So leistungsstark sogar, dass es für weit mehr als Dokumentauszeichnung verwendet werden kann. LaTeX ist [Turing-vollständig](https://en.wikipedia.org/wiki/Turing_completeness); das heißt, es kann so programmiert werden, dass es fast alles berechnet.

Um die allgemeine Programmiertauglichkeit von LaTeX zu demonstrieren, schauen wir uns ein Beispiel an, das die ersten Fibonacci-Zahlen berechnet. Zwar ist das kein Beweis für Turing-Vollständigkeit, aber es ist ein gutes Beispiel für einen vollständigen Algorithmus, der in LaTeX implementiert ist.

### Die Fibonacci-Zahlen

Jede Zahl in der Fibonacci-Folge ist die Summe der beiden vorherigen Glieder der Folge, wobei die ersten beiden Glieder als 1 definiert sind, um einen Ausgangspunkt zu schaffen.

Wir können einen neuen Befehl schreiben, um diese Zahlen zu berechnen. Beginnen wir damit, zu entscheiden, wie ein Aufruf unseres noch zu schreibenden Befehls aussehen könnte:

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

Wenn dieser Befehl aus unserem LaTeX-Dokument aufgerufen wird, sollte er eine Liste von `n` Fibonacci-Zahlen (wobei `n=10` im Beispielaufruf hier). Hier ist der Code für den `\fibonacci` Befehl (d. h. LaTeX-Makro). Schauen wir uns an, wie er funktioniert.

```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}
```

[Öffnen Sie dieses Beispiel in 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)

Zuerst richten wir ein paar Variablen ein, die wir später verwenden werden. Der `\newcount` Befehl gibt uns eine Variable, die wir zum Speichern einer ganzen Zahl verwenden können; hier erstellen wir vier: `\fcnt`, `\fone`, `\ftwo` und `\temp`. Es ist erwähnenswert, dass dies keine neuen Variablen sind; sie sind eher Aliasnamen für vorhandene Zähler. [LaTeX-Zähler](/latex/de/formatierung/10-counters.md) können direkt verwendet werden, wie in `\count0`, `\count1`, usw. aber das Vergeben von Namen verhindert, dass wir in einen bereits verwendeten Zähler schreiben. Wenn du neugierig bist, ersetze eine der Variablen in diesem Code durch `\count0`, und die Seitenzahlen werden für den Rest des Dokuments falsch sein.

Als Nächstes haben wir den `\fibonacci` Befehl. Wir erstellen ihn mit `\newcommand`, den wir mit dem Namen, der Anzahl der Argumente und dem TeX-Code zur Verarbeitung als Argumente versehen. Für diesen Befehl akzeptieren wir ein einzelnes Argument, die Anzahl der auszugebenden Fibonacci-Zahlen. Der Inhalt dieses Befehls ist einfach: Wir setzen Anfangswerte für unsere Variablen, geben die ersten beiden Fibonacci-Zahlen aus (da sie nicht berechnet werden müssen) und rufen dann `\fibloop`auf, das die eigentliche Arbeit für unsere Berechnungen übernimmt.

Der Befehl `\fibloop` wird auf dieselbe Weise deklariert, aber ein zentraler Teil dieses Befehls ist seine Schleifenlogik. Wir verwenden einen Befehl namens `\next`, initialisiert auf `\fibloop` verwendet wird `\fibonacci`, und verwendet innerhalb von `\fibloop` zur Steuerung der Schleife. `\fibloop` wird wiederholt, bis `\next` durch Code innerhalb des `\fibloop` Befehls selbst geändert wird. Wir wollen nur `n` Mal schleifen, also verwenden wir eine `\ifnum` Anweisung, die den Wert unseres Zählers überprüft (`\fcnt`) und dann, wenn er den Schwellenwert 0 noch nicht erreicht hat, `\fcnt` bei jeder Wiederholung der Schleife dekrementiert wird. Wenn die Bedingung erfüllt ist, setzen wir `\next` zu `\\relax`, wodurch `\fibloop` vom Wiederholen abgehalten wird – der letzte `\next` Befehl tut nichts, und die Schleife endet.

Die anderen Befehle in diesem Block berechnen die nächste Fibonacci-Zahl in der Folge und aktualisieren die Werte der Variablen, damit sie für den nächsten Durchlauf bereit sind. Der Befehl `\the\ftwo` gibt den Wert der aktuellen Fibonacci-Zahl im Dokument aus, und du wirst auch ein Komma und ein Leerzeichen oben im `\fibloop` Befehl bemerken, die zur Trennung der einzelnen Werte verwendet werden.

#### Das Ergebnis

Der einfachste Weg, diesen Code in Aktion zu sehen, ist, ihn auf Overleaf mit dem **Öffnen Sie dieses Beispiel in Overleaf** Link am Ende der Codeanzeige auszuführen. Die Fibonacci-Folge wächst schnell, daher führt jedes `n>44` in dieser speziellen Implementierung zu einem Integer-Overflow.

### Wohin geht es von hier aus weiter?

Als informellen Beweis dafür, dass LaTeX Turing-vollständig ist, präsentiere ich den folgenden Code, der eine schnelle und schmutzige Implementierung eines [NAND-Gatters](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- und auch NOR-Logikgatter haben die interessante Eigenschaft, dass sich mit genau diesem einen Gatttyp jedes andere logische Gatter bilden lässt. Aus den grundlegenden logischen Gattern kann man Latches, Flip-Flops und Speicher bauen. Das sind die Zutaten für einen Allzweckcomputer. Du kannst dieses NAND-Gatter für jede seiner vier möglichen Eingaben mit dem folgenden Beispiel testen, das du in Overleaf öffnen kannst.

```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}
```

[Öffnen Sie dieses Beispiel in 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)

Zu wissen, dass LaTeX Turing-vollständig ist, eröffnet eine Welt voller Möglichkeiten. Code wie dieser ist im Backend von LaTeX üblich, etwa zum Verfolgen von Seiten- und Abbildungsnummern und zum Entscheiden, wo schwebende Elemente platziert werden. Es ist ein Werkzeug, das du zu deinem Vorteil nutzen kannst, um komplexe Dokumentlayouts zu vereinfachen.

Zum Abschluss dieses Beitrags gebe ich dir noch weiterführende Lektüre zu Beispielen für Programmierung in LaTeX und Turing-Maschinen mit auf den Weg.

#### Beispiele für LaTeX-Programmierung

* [Die Mandelbrot-Menge in LaTeX](http://warp.povusers.org/MandScripts/latex.html) . Besonderen Dank an diesen hier; dieser Code war ein hilfreiches Beispiel, während ich meinen Fibonacci-Befehl schrieb.
* [Eine Turing-Maschine in LaTeX: die Fortsetzung](http://pbelmans.ncag.info/blog/2010/12/12/a-turing-machine-in-latex-follow-u/) Hinweis: Beim Übertragen dieses Artikels auf ein anderes Content-Hosting-System haben wir bemerkt, dass die im ursprünglichen Artikel referenzierte Seite (<http://en.literateprograms.org/Turing_machine_simulator_(LaTeX))> nicht mehr erreichbar war, also haben wir diesen Link durch einen Folgeartikel eines anderen Autors ersetzt.
* [Wikibuch zu TeX-Befehlen](http://en.wikibooks.org/wiki/Category:TeX)
* [LaTeX in einem Programmierwettbewerb](http://sdh33b.blogspot.com/2008/07/icfp-contest-2008.html). Ein Marsrover-Controller in LaTeX ließ Einträge in mehreren gebräuchlicheren Programmiersprachen hinter sich.

### Turing-Maschinen an unerwarteten Orten

* [Conways Game of Life ist Turing-vollständig](http://rendell-attic.org/gol/utm/index.htm). Hier ist eine Implementierung einer Turing-Maschine.
* [Regel 110](http://en.wikipedia.org/wiki/Rule_110) ist ein eindimensionaler zellulärer Automat, der Turing-vollständig ist.
* Minecraft (das Videospiel) ist Turing-vollständig. Mehrere Beispiele wurden gebaut, daher verweist der folgende Link einfach auf eine [Seite mit relevanten YouTube-Suchergebnissen](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/de/ausfuhrliche-artikel/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.
