Hilfe zur Erläuterung der Syntax dieses Befehls

Hilfe zur Erläuterung der Syntax dieses Befehls

Ich möchte eine Theoremumgebung definieren, in der ich die Nummerierung manuell vornehmen kann, anstatt sie einem internen Zähler zu folgen. Beim Umsehen fand ichDasAntwort. Dort wird als Lösung folgender Code vorgeschlagen:

\newtheorem{innercustomthm}{Theorem}
\newenvironment{customthm}[1]
  {\renewcommand\theinnercustomthm{#1}\innercustomthm}
  {\endinnercustomthm}

Der Code funktioniert wie gewünscht, ich habe jedoch versucht, den Code vollständig zu verstehen, für den Fall, dass ich ein wenig daran herumbasteln möchte (und auch, um zu lernen, was ich in mein Dokument einfüge), und stecke ein wenig fest.

Zunächst einmal hat \newenvironment die folgende Struktur:

\newenvironment{<env-name>}[<n-args>][<default>]{<begin-code>}{<end-code>}

Ich verstehe, dass das dritte Argument leer gelassen wird; damit ist kein Problem. Dann kommt der \renewcommand, der die folgende Struktur hat:

\renewcommand{<cmd>}[<n-args>][<default>]{<text>}

Hier habe ich Schwierigkeiten, zu verstehen, was vor sich geht, da keine Klammern verwendet werden. Ich dachte, der Befehl erlaubt es vielleicht, sie wegzulassen, aber ich habe keine Informationen dazu gefunden. Und dann wird es noch verwirrender, da die Befehle \theinnercustomthm, \innercustomthm und \endinnercustomthm speziell für diese spezielle Lösung entwickelt zu sein scheinen und ich nicht verstehe, wie sie funktionieren.

Mir ist beispielsweise aufgefallen, dass der Code kaputt geht, wenn man den Namen der Umgebung ändert (sagen wir „mytheo“ statt „customthm“).

Ich wäre sehr dankbar, wenn mir jemand erklären könnte, was los ist, oder mir ein Handbuch oder eine Webseite zeigen könnte, auf der ich nachvollziehen kann, was los ist.

Antwort1

Das erste, was zu beachten ist, ist, dass

\newtheorem{innercustomthm}{Theorem}

intern macht etwas Ähnliches wie

\newenvironment{innercustomthm}[1][]{<begin>}{<end>}

wobei die <begin>und <end>-Codes hier keine Rolle spielen. Beachten Sie, dass die Umgebung nach einem optionalen Argument (einer Theoremnotiz oder einer Zuordnung) sucht. Außerdem wird ein Zähler mit demselben Namen wie die Umgebung eingerichtet.

Der gewählte Name ist mit Absicht lang und unattraktiv: Es ist sehr unwahrscheinlich, dass ein solcher Name mit bestehenden oder imaginären Umgebungen kollidiert.

Für die Anwendung, die wir im Sinn haben, brauchen wir den Zähler nicht wirklich, sondern die Tatsache, dass jeder Aufruf von innercustomthmden Zähler hochfährt und die erforderlichen Werte einstellt, damit die nächsten \labelBefehle den Wert des Zählers verwenden. LaTeX betrachtet jedoch nicht den Wert selbst, sondern verwendet die aktuelle Bedeutung von \the<counter>, in diesem Fall \theinnercustomthm. Die Bedeutung von \theinnercustomthmwird auch zur Nummerierung der Umgebung verwendet.

Unsere Idee ist, Theoreme manuell zu nummerieren, da wir Theoreme mit derselben Nummer zitieren müssen, die sie in einer anderen Veröffentlichung haben, sodass eine automatische Nummerierung nicht in Frage kommt. Nun, wir erstellen einen Wrapper, innercustomthmder als Argument die Nummer annimmt, die die Aussage haben soll.

Die Idee besteht also darin, eine Umgebung zu starten, die ein Argument annimmt, das verwendet wird, um \theinnercustomthmdie „innere“ Umgebung (lokal) neu zu definieren und aufzurufen, die ihre Aufgabe des Satzes der Anweisung übernimmt.

Die Definition von customthmkönnte sein

\newenvironment{customthm}[1]
  {\renewcommand{\theinnercustomthm}{#1}\begin{innercustomthm}}
  {\end{innercustomthm}}

aber das hat einen kleinen Nachteil: wenn Sie vergessen \end{customthm}, erhalten Sie den Fehler „Missing \endinnercustomthmanstelle von customthm. Also,Macho-ProgrammiererWir verwenden in diesem Fall die interne Version der \beginund \endRoutinen für die „innere“ Umgebung: Die Buchhaltung wurde bereits von erledigt \begin{customthm}und wir müssen sie nicht wiederholen. Wir erhalten also

\newenvironment{customthm}[1]
  {\renewcommand{\theinnercustomthm}{#1}\innercustomthm}
  {\endinnercustomthm}

Der eigentliche Code, den Sie zitieren, ist

\newenvironment{customthm}[1]
  {\renewcommand\theinnercustomthm{#1}\innercustomthm}
  {\endinnercustomthm}

Warum die fehlenden Klammern? Eine weitere (schlechte) Angewohnheit vonMacho-Programmiererdie wissen, dass diese Zahnspangen unnötig sind und sowieso entfernt werden.

Im Zweifelsfall verwenden Sie diese.

Antwort2

Zunächst sollten wir uns fragen, was \newvironment{myenv}{..start code...}{...end code...}eigentlich geschieht. Um es etwas zu vereinfachen: Was passiert, ist, dass \newenvironmentzwei Befehle \myenvund definiert \endmyenv, wobei \myenvsich zu ...start code...und \endmyenverweitert sich zu erweitert ...end code.... Wenn Sie \begin{myenv}...\end{myenv}LaTeX schreiben, ersetzt es diese Umgebung durch Code, der (fast) gleichwertig mit ist {\myenv ... \endmyend}. (Hinter den Kulissen passiert noch etwas mehr.)

\newtheorem{innercustomthm}{Theorem}Als nächstes definiert die Zeile die innercustomthmUmgebung als „Theorem“-Umgebung, die den innercustomthmZähler verwendet. Insbesondere wird die „Theoremnummer“ für diese Umgebung mit ausgegeben \theinnercustomthm.

Betrachten wir nun:

\newenvironment{customthm}[1]
  {\renewcommand\theinnercustomthm{#1}\innercustomthm}
  {\endinnercustomthm}

Dies definiert die customthmUmgebung, die ein Argument annimmt #1. Nach dem ersten Absatz oben \begin{customthm}[X]...\end{customthm}wird es wie folgt erweitert:

{\renewcommand\theinnercustomthm{X}\innercustomthm ... \endinnercustomthm}

Das heißt, \theinnercustomthmwird neu definiert, sodass es gleich ist, Xwonach die innercustomthmUmgebung angewendet wird. Die customthmUmgebung ist also im Wesentlichen dieselbe wie die innercustomthmUmgebung, außer dass \theinnercustomthmzuerst gleich gesetzt wird X, wobei Xdas Argument für die customthmUmgebung ist. Der Nettoeffekt ist also, dass diese Umgebung Folgendes ausgibt: „Satz X“ ...

Schließlich sagten Siedas Ändern des Umgebungsnamens (z. B. mytheoanstelle von customthm) führt zu Codefehlern. Wenn das, was ich gesagt habe, richtig ist, kann das nicht wahr sein! Tatsächlich funktioniert der Code, wie der folgende Code zeigt, genauso, wenn wir den Namen der Umgebung ändern:

\documentclass{article}

\newtheorem{innercustomthm}{Theorem}
\newenvironment{mytheo}[1]
  {\renewcommand\theinnercustomthm{#1}\innercustomthm}
  {\endinnercustomthm}

\begin{document}

  \begin{innercustomthm}Hi
  \end{innercustomthm}

  \begin{mytheo}Hi
  \end{mytheo}

\end{document}

verwandte Informationen