
Consideremos estos dos archivos primero.
\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}
Estos dos archivos tienen contenidos idénticos excepto que algunos comandos se han utilizado antes y después \begin{document}
. Sin embargo, producen resultados completamente idénticos.
Ahora, si queremos agregar un \baselineskip
comando, funcionará si se usa solo después del \begin{document}
.
Nuevamente hay comandos que sólo se permiten en el preámbulo. \usepackage
es el más común de ellos.
Definitivamente entendemos que \begin{document}
comienza un entorno, probablemente el más alto o el más importante, ya sabes a qué me refiero.
(Intenté buscar algo como \newenvironment{document}
en latex.ltx. No tuve éxito. Puede que no esté buscando en el lugar correcto).
¿Pero qué hace exactamente este comando?
Por favor responda estas dos consultas,
¿Qué desencadena exactamente el comando \begin{document}? ¿Cuáles son las cosas que enciende?
¿Por qué algunos comandos sólo se permiten en el preámbulo?
Definitivamente otras cuestiones relevantes vendrán con las respuestas.
Respuesta1
Deberías buscar \document
(y/o \enddocument
) dentrolatex.ltx
, ya que un entorno env
consta del macropar \env
y \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}
Entre una serie de cosas, el document
entorno inicia lo siguiente:
- Informe sobre
\documentclass
opciones no utilizadas; - Establecer el diseño de la página;
- Leer en el
.aux
archivo; - Abra una secuencia para comenzar (sobre)escribir en
.aux
; - Inicie el tamaño de fuente para el documento (
\normalsize
); - Ejecute lo que se haya recopilado mediante
\AtBeginDocument
(\@begindocumenthook
); - Deshabilite los comandos de solo preámbulo (a través de
\@preamblecmds
, que recopila comandos definidos como utilizables en el preámbulo solo a través de\@onlypreamble
).
Tenga en cuenta que esta es la definición predeterminada utilizada en LaTeX. Algunos documentos pueden modificar o agregar a esta definición, según los requisitos.
Básicamente, los paquetes están destinados a hacer una serie de cosas, incluida intervenir en cosas realizadas durante el inicio del document
entorno (mencionado anteriormente). Claramente,geometry
es uno, ya que necesita configurar el diseño y las dimensiones de la página antes de que pueda comenzar a escribir cierto contenido. Sin embargo, como regla más general, es mejor separar la estructura del contenido y, dado que los paquetes proporcionan una interfaz estructural, son más adecuados para el preámbulo. Puede cargar un paquete bastante trivial mypackage
(por ejemplo) dentro del document
entorno, utilizando
\makeatletter
\input{mypackage.sty}% Load mypackage.sty
\makeatother
El \makeatletter
... \makeatother
par evita @
problemas en macro. Sin embargo, algunos paquetes se escriben utilizando comandos que a su vez sólo se pueden utilizar dentro del preámbulo. Evitarlo sería un proceso tedioso y no es necesario.