¿Qué activa exactamente el comando \begin{document}?

¿Qué activa exactamente el comando \begin{document}?

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 \baselineskipcomando, funcionará si se usa solo después del \begin{document}.

Nuevamente hay comandos que sólo se permiten en el preámbulo. \usepackagees 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,

  1. ¿Qué desencadena exactamente el comando \begin{document}? ¿Cuáles son las cosas que enciende?

  2. ¿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 envconsta del macropar \envy \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 documententorno inicia lo siguiente:

  • Informe sobre \documentclassopciones no utilizadas;
  • Establecer el diseño de la página;
  • Leer en el .auxarchivo;
  • 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 documententorno (mencionado anteriormente). Claramente,geometryes 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 documententorno, utilizando

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

El \makeatletter... \makeatotherpar 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.

información relacionada