Gibt es Fontsize-Umgebungen?

Gibt es Fontsize-Umgebungen?

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 LaTeXbeliebigen durch definierten Befehl verwenden \newcommandund 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 \foodefiniert ist, also der environmentName foogesetzt 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\endcsnamezu einem erweitert \relaxwird und nichts Schlimmes passiert.

Zu beachten ist, dass viele der bekannten Umgebungen nicht mit definiert sind \newenvironment. Es genügt beispielsweise die Verwendung eines \fooBefehls und \def\endfoo, siehe \endequationoder 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 \smallLeerzeichen nach \begin{small}aufgrund der normalen TeX-Tokenisierungsregeln nicht gelöscht werden. Außerdem benötigen Sie fast immer eine \paroder eine Leerzeile vor dem , \endwas auch in der Befehlsform zutrifft, aber in der Umgebungsform leichter vergessen werden kann, da die meisten benutzerdefinierten Umgebungen wie centerein implizites \parin ihrem Endcode enthalten, was hier jedoch nicht der Fall ist.

Siehe auch die Diskussion in:

Sind \end...-Makronamen in LaTeX2e reserviert?

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 ( \begingibt ein \begingroupund \enddas entsprechende aus \endgroup). \smallDa 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 \endsmallkein Problem dar, da er als „as“ aufgerufen wird \csname small\endcsnameund 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, \FOOund \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( FOOin diesem Fall) wird (lokal) im Makro gespeichert \@currenvir, um später überprüfen zu können, ob jedes \endmit dem richtigen gepaart ist \begin;

  • Der Befehl \FOOwird 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:

  • \endFOOwird ausgeführt, wenn es definiert ist (wenn nicht, passiert nichts, wie oben bereits erklärt);

  • LaTeX prüft, ob das Argument \endgleich ist \@currenvir und gibt andernfalls einen Fehler aus.

  • \endgroupZum Schließen der Gruppe wird eine ausgegeben.

Wenn ich eine neue Umgebung auf Grundlage einer anderen Standardumgebung definiere, vermeide ich eigentlich lieber explizite \beginund -Anweisungen \end, damit der Wert von \@currenvirnicht geändert wird. Angenommen, ich möchte eine Variante der quoteUmgebung 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 \endAnweisung falsch schreiben, erhalten sie daher eine Fehlermeldung über eine falsch beendete italquoteUmgebung, die sie tatsächlich verwendet haben, und nicht über eine falsch beendete quoteUmgebung, von der sie möglicherweise nichts wissen.

verwandte Informationen