Code kann auf mehreren Wegen auf die Seite kommen. verbatim gibt wieder, was du getippt hast; listings und minted zeigen echten Quellcode mit Farbe und Zeilennummern; ein dritter Weg zeigt eine sprachunabhängige Prozedur in einem nummerierten „Algorithm 1“-Kasten: Pseudocode. Anders als echter Code wird Pseudocode als *Float* gesetzt: Er bewegt sich wie Abbildung oder Tabelle über die Seite und besitzt Beschriftung, laufende Nummer, Querverweise und ein Algorithmenverzeichnis. Diese Seite konzentriert sich darauf, solchen Pseudocode als *gelistetes Objekt* sauber zu präsentieren, vor allem Beschriftungen und Nummerierung. Die vollständige Befehlsreferenz derselben Pakete steht unter /learn/math/algorithms; hier zeigen wir die Karte der beiden Ökosysteme und je ein minimales Beispiel.
Pseudocode wird als Float gesetzt
Während verbatim und listings Code im Textfluss platzieren, wird Pseudocode normalerweise in einem Float präsentiert. Ein Float ist ein Kasten wie figure oder table, den LaTeX automatisch so positioniert, dass ungünstige Seitenumbrüche vermieden werden. Das bringt zwei Vorteile. Erstens eine nummerierte Beschriftung „Algorithm 1“, auf die du im Text mit \ref verweisen kannst. Zweitens wird ein langer Algorithmus nicht ungeschickt über eine Seitengrenze zerrissen; die innere Umgebung kann inline zwar über Seiten umbrechen, der Float-Kasten bleibt aber zusammen und wandert als Einheit auf die nächste Seite.
Die erste Hürde sind mehrere ähnlich benannte Pakete. Entscheidend ist eine Arbeitsteilung: Ein Paket liefert den Container, also den nummerierten Float-Kasten, ein anderes den Inhalt, also den Pseudocode selbst. Diese Trennung gilt jedoch nur für eines der beiden Lager. In der Praxis gibt es zwei große Optionen.
- Zwei Schichten:
algorithm(Container) +algpseudocode(Inhalt). Deralgorithm-Float liefert den schwebenden Kasten, Beschriftung und Nummer;algpseudocode(das Standardlayout vonalgorithmicx) liefert den Pseudocode-Körper mit\State,\For,\Ifund ähnlichen Befehlen. - Ein Paket:
algorithm2e. Selbständig: Es bringt eigenen Float, eigene Beschriftung und eigene Körperbefehle (\KwIn/\KwOut,\eIf, …) mit.algorithmwird nicht zusätzlich geladen, denn beide kollidieren beim Namen der Float-Umgebung.
Die wichtigste Regel zuerst: Lege dich im gesamten Dokument auf ein Lager fest. algpseudocode und algorithm2e unterscheiden sich in Syntax und Denkweise vollständig, und beide zusammen kollidieren bei gleichnamigen Befehlen wie \For und \If. Was immer du wählst: Kompiliere das Dokument wie üblich zweimal, damit Nummern, Querverweise und Algorithmenverzeichnis stabil werden.
Beschriftungen, Nummern, Verweise und Algorithmenverzeichnis
Der Schwerpunkt dieser Seite ist die Präsentation. In beiden Lagern erzeugt \caption{…} eine Überschrift „Algorithm N“, wobei N automatisch in Erscheinungsreihenfolge vergeben wird. Setzt du direkt danach \label{key}, kann der Text die Nummer mit \ref{key} und die Seite mit \pageref{key} abrufen, genau wie bei Abbildungen oder Tabellen.
Ein weiterer Vorteil nummerierter Floats ist das Algorithmenverzeichnis. Neben \listoffigures und \listoftables erzeugt \listofalgorithms eine inhaltsverzeichnisartige Liste mit Nummer und Beschriftung jedes Algorithmus. Dort erscheint der Text aus \caption, und das funktioniert sowohl mit dem algorithm-Float als auch mit algorithm2e. Beachte: algorithm2e besitzt auch gesonderte Nur-Titel-Befehle neben \caption; diese fügen keinen Eintrag ins Algorithmenverzeichnis ein.
Die Position der Beschriftung ist Konventionssache. Beim algorithm-Float darf \caption wie bei einer Abbildung vor oder nach dem Körper stehen; viele setzen sie oben. Bei algorithm2e ist es üblich, \caption ans Ende der Umgebung zu setzen, und diese Beschriftung dient zugleich als Referenzname im Algorithmenverzeichnis.
Lager 1: algorithm + algpseudocode
Außen steht ein algorithm-Float, innen schreibst du den Pseudocode in der Umgebung algorithmic (das Paket heißt algpseudocode, die Umgebung aber algorithmic). Alle Körperbefehle sind mit großem Anfangsbuchstaben geschrieben (\State, \While, …); so unterscheidest du sie vom alten komplett großgeschriebenen algorithmic (\STATE). Die wichtigsten Befehle:
\State— Beginn einer Anweisung (Zeile); eine pro Anweisung.\For{…}…\EndFor/\While{…}…\EndWhile— Schleifen.\If{…}…\ElsIf{…}…\Else…\EndIf— Verzweigungen.\Function{name}{args}…\EndFunctionplus\Return— Funktionen und Rückgabewerte.\Require/\Ensure— Vor- und Nachbedingungen (mit fetter Beschriftung).\Comment{…}— ein Kommentar am Zeilenende.
Das optionale Argument [1] steuert die Zeilennummerierung: 1 nummeriert jede Zeile, n jede n-te Zeile, ohne Argument gibt es keine Nummern. Hier ist ein Minimalbeispiel zur Berechnung der Potenz y = xⁿ; beachte das \label direkt nach \caption.
\documentclass{article}
\usepackage{algorithm}
\usepackage{algpseudocode}
\begin{document}
\listofalgorithms
\begin{algorithm}
\caption{Calculate $y = x^n$}\label{alg:power}
\begin{algorithmic}[1]
\Require $n \geq 0$
\State $y \gets 1$
\While{$n \neq 0$}
\State $y \gets y \times x$
\State $n \gets n - 1$ \Comment{count down}
\EndWhile
\State \Return $y$
\end{algorithmic}
\end{algorithm}
アルゴリズム~\ref{alg:power} は累乗を計算する。
\end{document}Beim Kompilieren entsteht ein oben und unten gerahmter Kasten, der als Float auf der Seite steht und oben „Algorithm 1 Calculate y = xⁿ“ trägt (die Nummer ist automatisch). Links werden die Zeilen mit 1, 2, 3 … nummeriert, und \ref{alg:power} im Text löst sich zu dieser Nummer auf (hier 1). \listofalgorithms am Anfang erzeugt einen Eintrag wie „1 Calculate y = xⁿ … Seite“. Für die Ausgabe jedes Befehls, einschließlich \ElsIf und \Function, siehe /learn/math/algorithms.
Lager 2: algorithm2e
algorithm2e ist ein eigenes Ökosystem, in einem Paket selbständig (aktuelle Version 5.2, 2017). Lade es vor \begin{document} mit \usepackage[…]{algorithm2e}; seine Umgebung algorithm ist selbst der Float. Das Aussehen wählst du über Ladeoptionen: ruled (Linien oben und unten), boxed (Kasten um alles), vlined/lined (vertikale Linien für Blöcke), plain (Standard, ohne Schmuck); linesnumbered fügt Zeilennummern hinzu. Drei Syntaxpunkte sind wichtig:
- Eingabe/Ausgabe verwenden eigene Befehle
\KwIn{…}/\KwOut{…}(oder\KwData{…}/\KwResult{…}), gesetzt als fettes „Input:“, „Output:“ usw. - Verzweigungen und Schleifen bekommen ihren Körper als Klammerargument. Ein if–then–else ist
\eIf{cond}{then}{else}; Schleifen sind\For{…}{body}und\While{…}{body}(mit\KwTofür „to“). - Jede Anweisung endet mit
\\;(Backslash-Semikolon). Vergisst du es, läuft die nächste Anweisung in derselben Zeile weiter. Um das „;“ in der Ausgabe zu verbergen, nutze\DontPrintSemicolon.
\documentclass{article}
\usepackage[ruled,linesnumbered]{algorithm2e}
\begin{document}
\listofalgorithms
\begin{algorithm}
\caption{Sum of positive entries}\label{alg:sum}
\KwIn{an array $a[1..n]$}
\KwOut{the sum $s$ of its positive entries}
$s \gets 0$\;
\For{$i \gets 1$ \KwTo $n$}{
\eIf{$a[i] > 0$}{
$s \gets s + a[i]$\;
}{
skip\;
}
}
\Return $s$\;
\end{algorithm}
アルゴリズム~\ref{alg:sum} は正の要素を合計する。
\end{document}Die Option ruled zeichnet Linien oben und unten mit einer Beschriftungszeile oben, und linesnumbered nummeriert jede Zeile. Der Kasten beginnt mit fettem „Input:“ und „Output:“; die \For-Zeile lautet for i ← 1 to n do mit eingerücktem Körper; \eIf setzt den wahren if … then-Block über den falschen else-Block. An jedem \; entsteht ein Zeilenumbruch, die letzte Zeile lautet return s. Der Text von \caption erscheint unverändert in \listofalgorithms. Für feinere Steuerung, etwa [H] zum Festhalten an Ort und Stelle oder \SetAlgoLined für vertikale Blocklinien, siehe /learn/math/algorithms.
Welches verwenden?
Beide sind weit verbreitet; es geht um Stil, nicht darum, dass eines besser wäre. Die Kurzliste unten hilft bei der Einordnung.
| Aspekt | algorithm + algpseudocode | algorithm2e |
|---|---|---|
構成 | Zwei Schichten, zwei Pakete | Ein selbständiges Paket |
本体の書き方 | Einfache Befehle mit führendem \State | Blockkörper in Klammern übergeben |
入出力 | \Require / \Ensure | \KwIn / \KwOut (explizit) |
行末 | Nicht erforderlich | \\; erforderlich |
向く人 | Traditionelles Aussehen; Vorlagen, die es erwarten | Explizite Ein-/Ausgabe, vertikale Linien, mehrsprachige Schlüsselwörter |
In beiden Fällen ist die Präsentation gleich: \caption liefert eine nummerierte Überschrift, \label/\ref verweisen darauf, und \listofalgorithms baut das Verzeichnis. Noch einmal: Lege dich auf ein Körperpaket fest; wenn du algorithm2e verwendest, lade den Container algorithm nicht. Die vollständige Befehlsübersicht und längere Beispiele stehen unter /learn/math/algorithms. Wenn du echten Quellcode mit Farbe und Zeilennummern zeigen willst, also keinen Pseudocode, sind listings/minted auf /learn/code-verbatim/code-listings zuständig.