
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. \usepackage
ist 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,
Was genau löst der Befehl \begin{document} aus? Welche Dinge werden dadurch aktiviert?
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 env
aus dem Makropaar \env
und 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 document
Folgendes:
- Bericht über ungenutzte
\documentclass
Optionen; - 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
); \AtBeginDocument
Fü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 document
Umgebung (siehe oben) erledigt wurden.geometry
ist 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 document
Umgebung laden, indem Sie
\makeatletter
\input{mypackage.sty}% Load mypackage.sty
\makeatother
Das \makeatletter
...- \makeatother
Paar 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.