
Zweifellos gibt es Schriftgrößenumschalter in Form von Steuersequenzen (beschriebenHierzum Beispiel.) Aber von Zeit zu Zeit stieß ich auf Codebeispiele, in denen Umgebungsversionen davon verwendet wurden, z. B. \begin{small}...\end{small}
. Nachdem ich diese erfolgreich getestet hatte, begann ich, sie in mein TeX-Vokabular aufzunehmen.
Vor ein paar Tagen kommentierte @GonzaloMedina eine meiner Antworten, dass diese Umgebungen nicht existieren und Konstruktionen, die auf ihnen basieren, rein zufällig funktionieren. Dann versuchte ich, mehr über diese ominösen Umgebungen herauszufinden. Ominös, weil sie nicht irgendwie dokumentiert zu sein scheinen. (Das einzige, was ich fand, das versuchte, sie einigermaßen systematisch zu erklären, war eine Wikibooks-Ressource.)
Sind diese Umgebungen real oder nicht?
Antwort1
Sie können jeden LaTeX
beliebigen durch definierten Befehl verwenden \newcommand
und ein \begin{}...\end{}
Paar darum schließen. Dies wird jedoch nicht empfohlen, da dies keine Umgebung ist.
Das Interessante ist jedoch, dass die Gruppierung trotzdem funktioniert, was jedoch eine Folge von ist \begin...\end
.
Es gibt keine Schriftgrößenumgebungen wie \begin{small}
etc., da es \begin{chapter}
etc. nicht gibt.
Siehe zum Beispiel:
\documentclass{article}
\newcommand{\foo}{This does nothing}
\begin{document}
\begin{foo}
\end{foo}
\end{document}
BearbeitenEinige Erklärungen
Dieser Code ist zu finden in latex.ltx
, siehe Zeilen 4058f.
\def\begin#1{%
\@ifundefined{#1}%
{\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}%
{\def\reserved@a{\def\@currenvir{#1}%
\edef\@currenvline{\on@line}%
\csname #1\endcsname}}%
\@ignorefalse
\begingroup\@endpefalse\reserved@a}
Man erkennt, dass @ifundefined{foo}
aufgerufen werden würde, was falsch ist, da es so \foo
definiert ist, also der environment
Name foo
gesetzt ist und \csname #1\endcsname
(also \foo
) aufgerufen wird.
Nun der \end{foo}
: Teil
\def\end#1{%
\csname end#1\endcsname\@checkend{#1}%
\expandafter\endgroup\if@endpe\@doendpe\fi
\if@ignore\@ignorefalse\ignorespaces\fi}
Umgebungen suchen \end...
hier nach dem Code \endfoo
, der nicht definiert ist, aber \csname endfoo\endcsname
zu einem erweitert \relax
wird und nichts Schlimmes passiert.
Zu beachten ist, dass viele der bekannten Umgebungen nicht mit definiert sind \newenvironment
. Es genügt beispielsweise die Verwendung eines \foo
Befehls und \def\endfoo
, siehe \endequation
oder usw.\endenumerate
Antwort2
Jeder Befehl kann als Umgebung verwendet werden. Wenn er große Textblöcke umgibt, ist dies oft praktisch.
{\small zzz\par}
Und
\begin{small}%
zzzz
\end{small}
sind mehr oder weniger gleichwertig.
Beachten Sie jedoch, dass im Gegensatz zu \small
Leerzeichen nach \begin{small}
aufgrund der normalen TeX-Tokenisierungsregeln nicht gelöscht werden. Außerdem benötigen Sie fast immer eine \par
oder eine Leerzeile vor dem , \end
was auch in der Befehlsform zutrifft, aber in der Umgebungsform leichter vergessen werden kann, da die meisten benutzerdefinierten Umgebungen wie center
ein implizites \par
in ihrem Endcode enthalten, was hier jedoch nicht der Fall ist.
Siehe auch die Diskussion in:
Antwort3
Tatsächlich empfiehlt das „LaTeXbook“ (eigentlich „LaTeX. A Document Preparation System“ von Leslie Lamport) die Verwendung solcher Umgebungen: Am Ende von Seite 27 finden wir:
Jede Deklaration hat eine entsprechende Umgebung mit dem gleichen Namen (abzüglich des
\
Zeichens).\begin{em} ... \end{em}
ist gleichbedeutend mit der Eingabe von
{\em ... }
.
Insbesondere liefert die Form „Umgebung“ automatisch eine Gruppe, um die Auswirkungen der Deklaration lokal zu halten, wie es bei Umgebungen immer der Fall ist ( \begin
gibt ein \begingroup
und \end
das entsprechende aus \endgroup
). \small
Da es sich bei um eine Deklaration handelt, gilt das oben Gesagte.
Dies wurde mit Absicht gemacht, daher halte ich es nicht für richtig, zu sagen, dass diese Umgebungen „zufällig“ funktionieren. Tatsächlich stellt, wie bereits festgestellt, das Fehlen einer Definition eines Befehls wie \endsmall
kein Problem dar, da er als „as“ aufgerufen wird \csname small\endcsname
und daher gleichwertig mit \relax
„if undefined“ ist.
Meine Antwort lautet also letztendlich: „Ja, diese Umgebungen sind ‚real‘“ (was auch immer das bedeutet).
Zusatz
Nachdem ich einige der Kommentare gelesen hatte, dachte ich, dass es nützlich sein könnte, einige Details darüber hinzuzufügen, wie Umgebungen in LaTeX2e implementiert werden (über LaTeX3 werde ich nicht sprechen, da ich nicht über ausreichende Fachkenntnisse verfüge). Christian Hupfer hat bereits die genauen Codeauszüge von vorgestellt latex.ltx
, aber vielleicht findet jemand auch die folgenden zusätzlichen Anmerkungen nützlich.
Wenn Sie eine Umgebung definieren FOO
, definiert LaTeX einfach zwei neue Befehle, \FOO
und \endFOO
: Letzterer ist immer ohne Argumente, während Ersterer dieselben Argumente (sofern vorhanden) hat, die für die Umgebung angegeben wurden FOO
. Wenn ein \begin{FOO}
auftritt, geschieht (unter anderem) Folgendes:
eine Gruppe wird mit begonnen
\begingroup
;das Argument von
\begin
(FOO
in diesem Fall) wird (lokal) im Makro gespeichert\@currenvir
, um später überprüfen zu können, ob jedes\end
mit dem richtigen gepaart ist\begin
;Der Befehl
\FOO
wird als letztes ausgeführt und absorbiert daher die folgenden Argumente\begin{fOO}
, sofern vorhanden.
Wenn es dagegen um LaTeX geht \end{FOO}
, passiert (unter anderem) Folgendes:
\endFOO
wird ausgeführt, wenn es definiert ist (wenn nicht, passiert nichts, wie oben bereits erklärt);LaTeX prüft, ob das Argument
\end
gleich ist\@currenvir
und gibt andernfalls einen Fehler aus.\endgroup
Zum Schließen der Gruppe wird eine ausgegeben.
Wenn ich eine neue Umgebung auf Grundlage einer anderen Standardumgebung definiere, vermeide ich eigentlich lieber explizite \begin
und -Anweisungen \end
, damit der Wert von \@currenvir
nicht geändert wird. Angenommen, ich möchte eine Variante der quote
Umgebung definieren, deren Inhalt kursiv dargestellt wird. Ich bevorzuge beispielsweise
\newenvironment{italquote}{%
\quote
\itshape
}{\endquote}
über
\newenvironment{italquote}{%
\begin{quote}%
\itshape
}{\end{quote}}
insbesondere, wenn ich die Umgebung nicht selbst verwenden werde. Wenn Benutzer den Namen der Umgebung in der \end
Anweisung falsch schreiben, erhalten sie daher eine Fehlermeldung über eine falsch beendete italquote
Umgebung, die sie tatsächlich verwendet haben, und nicht über eine falsch beendete quote
Umgebung, von der sie möglicherweise nichts wissen.