Theoreme und Beweise (amsthm)

Sätze, Lemmata, Definitionen und Beweise haben eine feste Gestalt: eine fette Überschrift wie Theorem 3.1, kursiven Text, eine automatisch laufende Nummer und am Ende eines Beweises ein kleines hohles Quadrat (□). Das alles von Hand zu setzen wäre mühsam, deshalb bietet amsthm, ein Schwesterpaket von amsmath, eine Möglichkeit, theoremartige Umgebungen einmal zu *deklarieren*, plus eine eigene proof-Umgebung. Diese Seite behandelt Deklarationen mit \newtheorem, gemeinsame Zähler und Nummerierung innerhalb eines Abschnitts, unnummerierte Varianten, Stilwechsel mit \theoremstyle, die proof-Umgebung mit ihrem Endsymbol und die moderne höhere Schnittstelle thmtools.

Eine Satzumgebung deklarieren

Eine theoremartige Struktur wird zuerst in der Präambel als Umgebung deklariert und anschließend im Text verwendet. Die Deklaration erfolgt mit \newtheorem. Das erste Argument ist der Name der Umgebung (also das, was in \begin{…} steht), das zweite das Wort, das in der Überschrift fett gedruckt wird. Das folgende Beispiel stellt etwa eine Umgebung theorem bereit.

latex
\usepackage{amsthm}
\newtheorem{theorem}{Theorem}        % プリアンブルで宣言 / declare in the preamble

Damit erhält jede Verwendung der Umgebung theorem im Text automatisch eine fette Überschrift mit laufender Nummer, etwa Theorem 1, Theorem 2; der Inhalt wird im Standardstil kursiv gesetzt. Die Nummer verwaltet ein LaTeX-Zähler, sodass ein nachträglich eingefügter Satz alle folgenden Nummern automatisch verschiebt.

latex
\begin{theorem}
  素数は無限に存在する。
\end{theorem}

\begin{theorem}
  There are infinitely many primes.
\end{theorem}

Beachte, dass \newtheorem auch zu base LaTeX, also zum Standard-LaTeX2e, gehört. Schon das reine \newtheorem kann nummerierte Satzumgebungen erzeugen. Die unten beschriebenen Stilwechsel (\theoremstyle), die unnummerierte Sternform (\newtheorem*), die proof-Umgebung und das Beweisendesymbol sind jedoch Erweiterungen, die erst mit amsthm verfügbar werden. Für mathematische Texte lädt man üblicherweise amsthm zusammen mit amsmath.

Die Nummerierung steuern

Nummeriert man Sätze, Lemmata und Korollare jeweils mit eigenem Zähler, tauchen dieselben Nummern mehrfach auf, etwa „Theorem 1, Lemma 1, Theorem 2, Lemma 2…“, was verwirrend ist. In den meisten mathematischen Texten erhalten sie stattdessen eine gemeinsame Nummernfolge, etwa „Theorem 1, Lemma 2, Theorem 3…“. Das optionale Argument in eckigen Klammern von \newtheorem steuert dieses Verhalten genau. Entscheidend ist, dass die Klammer je nach Position etwas anderes bedeutet.

Um einen Zähler zu teilen, gib direkt nach dem neuen Umgebungsnamen in eckigen Klammern den Namen einer bestehenden Umgebung an. Im folgenden Beispiel verwendet lemma denselben Zähler wie theorem; Sätze und Lemmata ziehen also aus einer gemeinsamen Nummernfolge.

latex
\newtheorem{theorem}{Theorem}
\newtheorem{lemma}[theorem]{Lemma}   % theorem と番号を共有 / share theorem’s counter

Soll die Zählung dagegen in jedem Kapitel oder Abschnitt neu beginnen und die Abschnittsnummer voranstellen, also etwa „Theorem 2.1, Theorem 2.2“, setzt du die Klammer mit einem Elternzähler wie section nach dem zweiten Argument. Die Satznummer springt dann bei jedem neuen Abschnitt auf 1 zurück und wird zusammen mit der Abschnittsnummer ausgegeben.

latex
\newtheorem{theorem}{Theorem}[section]   % 節ごとにリセットし「2.1」形式 / reset per section, “2.1” style

Beide Klammerformen lassen sich nicht gleichzeitig verwenden, aber du kannst einen Zähler auch einer anderen Umgebung unterordnen. \newtheorem{corollary}{Corollary}[theorem] lässt die Korollarnummer zum Beispiel bei jedem neuen Satz zurücksetzen; sie trägt dann die Nummer des Elternsatzes, etwa „Corollary 3.1“ als erstes Korollar zu Theorem 3. Die Tabelle fasst Position und Wirkung der Klammern zusammen.

DeklarationWirkung
\newtheorem{theorem}{Theorem}Eigene unabhängige laufende NummerNummeriert 1, 2, 3, … mit eigenem Zähler
\newtheorem{lemma}[theorem]{Lemma}Teilt den theorem-Zähler als eine FolgeLemmata und Sätze teilen eine Nummernfolge
\newtheorem{theorem}{Theorem}[section]Setzt je Abschnitt zurück; Anzeige wie „2.1“Beginnt bei jedem \section neu, mit Abschnittsnummer als Präfix
\newtheorem{corollary}{Corollary}[theorem]Setzt bei jedem theorem zurück; Anzeige wie „3.1“Dem theorem-Zähler untergeordnet

Unnummeriert und mit Namen

Für theoremartige Umgebungen ohne Nummer, etwa etwas Einmaliges wie „Remark“ oder „Main Theorem“, verwendest du die von amsthm bereitgestellte Sternform \newtheorem*. Sie vergibt überhaupt keine Nummer und druckt nur das Überschriftenwort. Die Syntax entspricht \newtheorem ohne Stern; nur zählerbezogene Argumente entfallen.

latex
\newtheorem*{remark}{Remark}   % 番号なし(amsthm が必要) / unnumbered (needs amsthm)

Du kannst einem einzelnen Satz außerdem einen eigenen Namen oder eine Quellenangabe mitgeben. Beim Öffnen der Umgebung im Text übergibst du direkt nach \begin{theorem} einen Namen in eckigen Klammern; er erscheint in Klammern nach der Nummer. Das folgende Beispiel erzeugt etwa eine Überschrift wie „Theorem 1 (Pythagorean theorem)“.

latex
\begin{theorem}[Pythagorean theorem]
  直角三角形において $a^2 + b^2 = c^2$ が成り立つ。
\end{theorem}

Diese Klammer ist unabhängig davon, ob die Umgebung nummeriert ist. Bei einer nummerierten Umgebung erhältst du „Nummer + (Name)“, bei einer mit \newtheorem* erzeugten unnummerierten Umgebung „Überschriftenwort + (Name)“; in beiden Fällen wird der Name in Klammern angehängt.

Das Aussehen wählen: \theoremstyle

amsthm stellt \theoremstyle bereit, um das Aussehen theoremartiger Umgebungen zu wechseln. Es gibt drei eingebaute Stile, die sich in der Schriftkombination für Überschrift (head) und Text (body) unterscheiden. Wichtig ist: \theoremstyle{…} gilt für jedes danach deklarierte \newtheorem. Setze den Stil also *vor* den \newtheorem-Deklarationen und gruppiere die Deklarationen nach Stil. Ohne Angabe gilt standardmäßig plain.

  • plain: fette Überschrift, kursiver Text. Für betont formulierte Aussagen wie Sätze, Lemmata, Propositionen und Korollare. Dies ist der Standard, wenn nichts gesetzt wird.
  • definition: fette Überschrift, aufrechter (roman) Text. Für Inhalte, die wie normaler Fließtext gelesen werden sollen, etwa Definitionen, Beispiele, Aufgaben und Bedingungen.
  • remark: kursive Überschrift, aufrechter Text. Für Nebenbemerkungen wie Bemerkungen, Notizen und Claims.

Die folgende Präambel zeigt eine typische Einrichtung: Sie mischt die drei Stile und teilt zugleich einen Zähler für theorem, lemma und corollary. Unter \theoremstyle{plain} werden theorem, lemma und corollary deklariert, unter \theoremstyle{definition} definition und example, unter \theoremstyle{remark} schließlich remark.

latex
\usepackage{amsmath, amsthm}

\theoremstyle{plain}              % 本文イタリック / italic body
\newtheorem{theorem}{Theorem}[section]
\newtheorem{lemma}[theorem]{Lemma}
\newtheorem{corollary}[theorem]{Corollary}

\theoremstyle{definition}        % 本文立体 / upright body
\newtheorem{definition}[theorem]{Definition}
\newtheorem{example}[theorem]{Example}

\theoremstyle{remark}            % 見出しイタリック / italic head
\newtheorem*{remark}{Remark}

Mit dieser Einstellung teilen theorem, lemma, corollary, definition und example eine abschnittsweise Nummernfolge, etwa „Theorem 2.1, Definition 2.2, Lemma 2.3…“. Die Texte von Sätzen, Lemmata und Korollaren sind kursiv, die von Definitionen und Beispielen aufrecht. Nur remark ist unnummeriert, mit kursiver Überschrift „Remark“. Achte auf die Position: Steht \theoremstyle *nach* einem \newtheorem, wirkt es nicht auf diese Deklaration; sie behält den vorherigen Stil oder plain, falls noch keiner gesetzt war.

Die proof-Umgebung und das QED-Symbol

amsthm bietet außerdem eine eigene proof-Umgebung; auch sie gehört nicht zu base LaTeX, sondern ist eine Funktion von amsthm. Die proof-Umgebung setzt am Anfang automatisch eine kursive Überschrift „Proof.“ und am Ende ein Beweisendesymbol, standardmäßig ein kleines hohles Quadrat (□), das Tombstone- oder QED-Symbol.

latex
\begin{proof}
  $\sqrt{2}$ が有理数だと仮定して矛盾を導く。……よって $\sqrt{2}$ は無理数である。
\end{proof}

Das Überschriftenwort lässt sich ändern. Die proof-Umgebung akzeptiert ebenfalls ein eckiges Argument pro Instanz; \begin{proof}[Proof of Theorem 1] ersetzt die Überschrift also durch „Proof of Theorem 1.“, oder etwa durch \begin{proof}[Proof of the lemma].

Die Platzierung des Beweisendesymbols verlangt etwas Sorgfalt. amsthm versucht, das Symbol am Ende der letzten Textzeile zu setzen; endet ein Beweis aber mit einer abgesetzten Gleichung oder einer Listenumgebung, kann das Symbol allein in die nächste Zeile fallen. Setze deshalb dort, wo das Symbol erscheinen soll, ausdrücklich \qedhere. Am Ende einer abgesetzten Gleichung platziert es das □ zum Beispiel rechts in derselben Gleichungszeile.

latex
\begin{proof}
  両辺を整理すると、次を得る。
  \[
    a^2 + b^2 = c^2. \qedhere
  \]
\end{proof}

Auch das Symbol selbst lässt sich ändern. Definiere \qedsymbol neu, um etwa ein gefülltes Quadrat (■), eine Zeichenkette oder ein beliebiges Endzeichen zu verwenden; soll es ganz verschwinden, definiere es leer. Schreibe eine der folgenden Zeilen in die Präambel.

latex
\renewcommand{\qedsymbol}{$\blacksquare$}   % 黒い四角に / filled square
% \renewcommand{\qedsymbol}{}              % 記号を消す / remove the symbol

thmtools: eine moderne höhere Schnittstelle

Wenn viele Deklarationen zusammenkommen, wird die Nummerierung über die Position der Klammern von \newtheorem schwer lesbar. thmtools ist eine höhere Schnittstelle auf Basis von amsthm oder ntheorem und stellt \declaretheorem bereit, bei dem alles als key=value-Option angegeben wird. thmtools besitzt selbst keine Nummerierungslogik; es ruft \newtheorem aus amsthm als Backend auf und wird daher zusammen mit amsthm geladen.

Im einfachsten Fall übergibst du nur den Umgebungsnamen und schreibst die Nummerierungssteuerung als Schlüssel. Die Unterordnung unter einen Abschnitt heißt numberwithin=; die Synonyme parent= und within= funktionieren ebenfalls. Einen Zähler teilt man mit sibling=, auch numberlike= und sharecounter= sind möglich. Unnummeriert ist numbered=no, das Überschriftenwort ist name= mit den Synonymen title= und heading=, und der Stil ist style=. Das Beispiel unten schreibt fast dieselbe Einrichtung wie die obige amsthm-Version mit thmtools.

latex
\usepackage{amsthm, thmtools}

\declaretheorem[numberwithin=section]{theorem}
\declaretheorem[sibling=theorem]{lemma}
\declaretheorem[style=definition, sibling=theorem]{definition}
\declaretheorem[numbered=no, name=Remark]{remark}

Die Stärke von thmtools liegt darin, fortgeschrittene Funktionen, die mit amsthm allein umständlich wären, schnell nutzbar zu machen. Ein wichtiges Beispiel ist Wiederholen mit restatable. Lädt man das Paket thm-restate, das zu thmtools gehört, und schreibt einen Satz in einer restatable-Umgebung, wird sein Inhalt als Makro gespeichert. So kannst du denselben Satz später mit seiner ursprünglichen Nummer erneut setzen. Das erste optionale Argument von restatable ist ein Name, das zweite die zu verwendende Satzumgebung und das dritte der Makroname, der den Inhalt speichert.

latex
\usepackage{amsthm, thmtools, thm-restate}
\declaretheorem{theorem}

% 本編:内容を \firsteuclid に保存 / store the content in \firsteuclid
\begin{restatable}[Euclid]{theorem}{firsteuclid}
  \label{thm:euclid}
  There are infinitely many primes.
\end{restatable}

% 付録などで同じ定理・同じ番号を再掲 / restate later with the same number
\firsteuclid*

Wird das gespeicherte Makro \firsteuclid später expandiert, setzt es diesen Satz erneut mit seiner ursprünglichen Nummer. Die Nummer bleibt an die erste Stelle gebunden, ebenso etwa Nummern abgesetzter Gleichungen innerhalb des Satzes. Mit Stern, also \firsteuclid*, wird der Satz erneut gesetzt, während Querverweise (\label/\ref) auf die ursprüngliche Deklaration statt auf die wiederholte Kopie zeigen. Das ist praktisch, wenn eine Aussage im Haupttext nummeriert stehen soll, der Beweis aber im Anhang.

Eine weitere nützliche Funktion ist ein Satzverzeichnis. Mit \listoftheorems wird automatisch eine inhaltsverzeichnisartige Liste von Sätzen, Lemmata und Ähnlichem erzeugt. Du kannst sie einschränken, indem du mit ignoreall zunächst alles ausschließt und dann mit show={…} nur die gewünschten Umgebungsnamen nennst. Mit onlynamed oder onlynamed={…} erscheinen nur die Sätze, denen du einen Namen gegeben hast, etwa durch \begin{…}[name]. Ist auch hyperref geladen, wird jeder Eintrag im Verzeichnis zu einem anklickbaren Link auf den entsprechenden Satz.

latex
\listoftheorems                                  % すべて / everything
\listoftheorems[ignoreall, show={theorem, lemma}]   % theorem と lemma だけ / only these

Wenn du ein eigenes Aussehen gestalten willst, definierst du mit \declaretheoremstyle aus thmtools einen neuen Stil und rufst ihn über \declaretheorem[style=…]{…} auf. Per Schlüssel lassen sich Überschriftenschrift (headfont), Textschrift (bodyfont), Abstand davor und danach (spaceabove, spacebelow), Klammern um die Notiz (notebraces), Abstand nach der Überschrift (postheadspace), Endsymbol (qed) und mehr einstellen. Wenn schlichtes amsthm genügt, musst du nicht dazu greifen, aber für ausgefeilte Satzumgebungen ist es eine starke Option.