
Давайте сначала рассмотрим эти два файла.
\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}
Эти два файла имеют одинаковое содержимое, за исключением некоторых команд, которые были использованы до и после \begin{document}
. Однако они производят полностью идентичные выходные данные.
Теперь, если мы захотим добавить \baselineskip
команду, она сработает, если ее использовать только после \begin{document}
.
Опять же, есть команды, которые разрешены только в преамбуле. \usepackage
Это самая распространенная из них.
Мы определенно понимаем, что это \begin{document}
начинает среду, скорее всего, самую высокую или самую важную, вы понимаете, о чем я.
(Пытался поискать что-то похожее \newenvironment{document}
на latex.ltx. Не удалось. Может быть, я не там ищу.)
Но что именно делает эта команда?
Пожалуйста, ответьте на эти два вопроса:
Что именно запускает команда \begin{document}? Что она включает?
Почему некоторые команды разрешены только в преамбуле?
Определенно, вместе с ответами появятся и другие важные вопросы.
решение1
Вам следует искать \document
(и/или \enddocument
) внутриlatex.ltx
, поскольку среда env
состоит из макропары \env
и \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}
Среди множества факторов document
окружающая среда инициирует следующее:
- Отчет о неиспользованных
\documentclass
опциях; - Настройте макет страницы;
- Прочитайте в
.aux
файле; - Откройте поток, чтобы начать (пере)запись в
.aux
; - Инициировать размер шрифта для документа (
\normalsize
); - Выполнить все, что было собрано с помощью
\AtBeginDocument
(\@begindocumenthook
); - Отключить команды, содержащие только преамбулу (через
\@preamblecmds
, который собирает команды, определенные как пригодные для использования только в преамбуле через\@onlypreamble
).
Обратите внимание, что это определение по умолчанию, используемое в LaTeX. Некоторые документы могут изменять или дополнять это определение в зависимости от требований.
По сути, пакеты предназначены для выполнения множества действий, включая вмешательство в действия, выполняемые во время инициации document
среды (упомянутой выше). Очевидно,geometry
является одним из них, поскольку ему необходимо настроить макет страницы и размеры, прежде чем вы сможете начать писать определенный контент. Однако, как более общее правило, лучше отделить структуру от контента, и поскольку пакет предоставляет структурный интерфейс, они лучше подходят для преамбулы. Вы можете загрузить довольно тривиальный пакет mypackage
(скажем) в document
среде, используя
\makeatletter
\input{mypackage.sty}% Load mypackage.sty
\makeatother
Пара \makeatletter
... \makeatother
позволяет избежать @
проблем -in-macro. Однако некоторые пакеты написаны с использованием команд, которые сами по себе могут использоваться только в преамбуле. Обход этого был бы утомительным процессом и не является необходимым.