Was genau löst der Befehl \begin{document} aus?

Was genau löst der Befehl \begin{document} aus?

Betrachten wir zunächst diese beiden Dateien.


\documentclass{article}

\parindent 0.0mm

\hyphenpenalty 500
\tolerance 700

\usepackage{lipsum}


\begin{document}

\lipsum[1-10]

\end{document}

\documentclass{article}


\usepackage{lipsum}

\begin{document}

\parindent 0.0mm

\hyphenpenalty 500
\tolerance 700

\lipsum[1-10]

\end{document}

Diese beiden Dateien haben identische Inhalte, außer dass vorher und nachher einige Befehle verwendet wurden \begin{document}. Sie erzeugen jedoch völlig identische Ausgaben.

Wenn wir jetzt einen Befehl hinzufügen möchten \baselineskip, funktioniert dieser, sofern er nur nach dem verwendet wird \begin{document}.

Auch hier gibt es Befehle, die nur in der Präambel zulässig sind. \usepackageist der häufigste davon.

Wir verstehen auf jeden Fall, dass \begin{document}dadurch eine Umgebung entsteht, wahrscheinlich die höchste oder wichtigste, wissen Sie, was ich meine.

(Habe versucht, \newenvironment{document}in latex.ltx nach etwas wie diesem zu suchen. War nicht erfolgreich. Vielleicht suche ich nicht an der richtigen Stelle.)

Aber was genau macht dieser Befehl?

Bitte beantworten Sie diese beiden Fragen,

  1. Was genau löst der Befehl \begin{document} aus? Welche Dinge werden dadurch aktiviert?

  2. Warum sind einige Befehle nur in der Präambel zulässig?

Mit Sicherheit werden mit den Antworten auch noch weitere relevante Fragen auftauchen.

Antwort1

Sie sollten nach \document(und/oder \enddocument) suchen innerhalblatex.ltx, da eine Umgebung envaus dem Makropaar \envund besteht \endenv:

\def\document{\endgroup
  \ifx\@unusedoptionlist\@empty\else
    \@latex@warning@no@line{Unused global option(s):^^J%
            \@spaces[\@unusedoptionlist]}%
  \fi
  \@colht\textheight
  \@colroom\textheight \vsize\textheight
  \columnwidth\textwidth
  \@clubpenalty\clubpenalty
  \if@twocolumn
    \advance\columnwidth -\columnsep
    \divide\columnwidth\tw@ \hsize\columnwidth \@firstcolumntrue
  \fi
  \hsize\columnwidth \linewidth\hsize
  \begingroup\@floatplacement\@dblfloatplacement
    \makeatletter\let\@writefile\@gobbletwo
    \global \let \@multiplelabels \relax
    \@input{\jobname.aux}%
  \endgroup
  \if@filesw
    \immediate\openout\@mainaux\jobname.aux
    \immediate\write\@mainaux{\relax}%
  \fi
  \process@table
  \let\glb@currsize\@empty  %% Force math initialization.
  \normalsize
  \everypar{}%
  \ifx\normalsfcodes\@empty
    \ifnum\sfcode`\.=\@m
      \let\normalsfcodes\frenchspacing
    \else
      \let\normalsfcodes\nonfrenchspacing
    \fi
  \fi
  \@noskipsecfalse
  \let \@refundefined \relax
  \let\AtBeginDocument\@firstofone
  \@begindocumenthook
  \ifdim\topskip<1sp\global\topskip 1sp\relax\fi
  \global\@maxdepth\maxdepth
  \global\let\@begindocumenthook\@undefined
  \ifx\@listfiles\@undefined
    \global\let\@filelist\relax
    \global\let\@addtofilelist\@gobble
  \fi
  \gdef\do##1{\global\let ##1\@notprerr}%
  \@preamblecmds
  \global\let \@nodocument \relax
  \global\let\do\noexpand
  \ignorespaces}

Die Umgebung initiiert unter anderem documentFolgendes:

  • Bericht über ungenutzte \documentclassOptionen;
  • Legen Sie das Seitenlayout fest.
  • Datei einlesen .aux;
  • Öffnen Sie einen Stream, um mit dem (Über-)Schreiben in das .aux; zu beginnen.
  • Initialisieren Sie die Schriftgröße für das Dokument ( \normalsize);
  • \AtBeginDocumentFühren Sie alles aus, was über ( \@begindocumenthook) gesammelt wurde .
  • Deaktivieren Sie Nur-Präambel-Befehle (über \@preamblecmds, das Befehle sammelt, die über als nur in der Präambel verwendbar definiert sind \@onlypreamble).

Beachten Sie, dass dies die in LaTeX verwendete Standarddefinition ist. Einige Dokumente können diese Definition je nach Anforderungen ändern oder ergänzen.


Grundsätzlich sind Pakete dazu gedacht, eine Vielzahl von Dingen zu tun, einschließlich der Möglichkeit, in Dinge einzugreifen, die während der Initiierung der documentUmgebung (siehe oben) erledigt wurden.geometryist eine davon, da das Seitenlayout und die Abmessungen eingerichtet werden müssen, bevor Sie mit dem Schreiben bestimmter Inhalte beginnen können. Als allgemeinere Regel ist es jedoch besser, Struktur und Inhalt zu trennen, und da Pakete eine strukturelle Schnittstelle bieten, sind sie für die Präambel besser geeignet. Sie können ein ziemlich triviales Paket mypackage(sagen wir) innerhalb der documentUmgebung laden, indem Sie

\makeatletter
\input{mypackage.sty}% Load mypackage.sty
\makeatother

Das \makeatletter...- \makeatotherPaar vermeidet @-in-macro-Probleme. Einige Pakete werden jedoch mit Befehlen geschrieben, die selbst nur innerhalb der Präambel verwendet werden können. Dies zu umgehen wäre ein mühsamer Prozess und ist nicht notwendig.

verwandte Informationen