
Vamos considerar esses dois arquivos primeiro.
\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}
Esses dois arquivos têm conteúdo idêntico, exceto que alguns comandos foram usados antes e depois \begin{document}
. No entanto, eles produzem resultados completamente idênticos.
Agora, se quisermos adicionar um \baselineskip
comando, ele funcionará se for usado somente após o \begin{document}
.
Novamente, existem comandos que são permitidos apenas no preâmbulo. \usepackage
é o mais comum deles.
Definitivamente entendemos que isso \begin{document}
inicia um ambiente, provavelmente o mais elevado ou o mais importante, você sabe o que quero dizer.
(Tentei pesquisar algo como \newenvironment{document}
latex.ltx. Não tive sucesso. Talvez eu não esteja procurando no lugar certo.)
Mas o que exatamente esse comando faz?
Por favor, responda a estas duas perguntas,
O que exatamente o comando \begin{document} aciona? Quais são as coisas que ele ativa?
Por que alguns comandos são permitidos apenas no preâmbulo?
Definitivamente outras questões relevantes virão com as respostas.
Responder1
Você deve procurar por \document
(e/ou \enddocument
) dentrolatex.ltx
, uma vez que um ambiente env
consiste no par macro \env
e \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 uma série de coisas, o document
ambiente inicia o seguinte:
- Relatório sobre
\documentclass
opções não utilizadas; - Defina o layout da página;
- Leia no
.aux
arquivo; - Abra um stream para começar a (sobre)escrever no
.aux
; - Inicie o tamanho da fonte do documento (
\normalsize
); - Execute tudo o que foi coletado via
\AtBeginDocument
(\@begindocumenthook
); - Desative comandos somente de preâmbulo (via
\@preamblecmds
, que coleta comandos definidos como utilizáveis somente no preâmbulo via\@onlypreamble
).
Observe que esta é a definição padrão usada no LaTeX. Alguns documentos podem alterar ou acrescentar esta definição, dependendo dos requisitos.
Fundamentalmente, os pacotes destinam-se a fazer uma série de coisas, inclusive intervir em coisas feitas durante a iniciação do document
ambiente (mencionado acima). Claramente,geometry
é um deles, pois precisa configurar o layout e as dimensões da página antes de você começar a escrever determinado conteúdo. Contudo, como regra mais geral, é melhor separar a estrutura do conteúdo, e como os pacotes fornecem interface estrutural, eles são mais adequados para o preâmbulo. Você pode carregar um pacote bastante trivial mypackage
(digamos) dentro do document
ambiente, usando
\makeatletter
\input{mypackage.sty}% Load mypackage.sty
\makeatother
O par \makeatletter
... evita problemas na macro. No entanto, alguns pacotes são escritos usando comandos que só podem ser usados no preâmbulo. Contornar isso seria um processo tedioso e desnecessário.\makeatother
@