
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 innercustomthm
den Zähler hochfährt und die erforderlichen Werte einstellt, damit die nächsten \label
Befehle 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 \theinnercustomthm
wird 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, innercustomthm
der 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 \theinnercustomthm
die „innere“ Umgebung (lokal) neu zu definieren und aufzurufen, die ihre Aufgabe des Satzes der Anweisung übernimmt.
Die Definition von customthm
kö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 \end
“ innercustomthm
anstelle von customthm
. Also,Macho-ProgrammiererWir verwenden in diesem Fall die interne Version der \begin
und \end
Routinen 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 \newenvironment
zwei Befehle \myenv
und definiert \endmyenv
, wobei \myenv
sich zu ...start code...
und \endmyenv
erweitert 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 innercustomthm
Umgebung als „Theorem“-Umgebung, die den innercustomthm
Zä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 customthm
Umgebung, 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, \theinnercustomthm
wird neu definiert, sodass es gleich ist, X
wonach die innercustomthm
Umgebung angewendet wird. Die customthm
Umgebung ist also im Wesentlichen dieselbe wie die innercustomthm
Umgebung, außer dass \theinnercustomthm
zuerst gleich gesetzt wird X
, wobei X
das Argument für die customthm
Umgebung ist. Der Nettoeffekt ist also, dass diese Umgebung Folgendes ausgibt: „Satz X“ ...
Schließlich sagten Siedas Ändern des Umgebungsnamens (z. B. mytheo
anstelle 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}