Что именно запускает команда \begin{document}?

Что именно запускает команда \begin{document}?

Давайте сначала рассмотрим эти два файла.


\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. Не удалось. Может быть, я не там ищу.)

Но что именно делает эта команда?

Пожалуйста, ответьте на эти два вопроса:

  1. Что именно запускает команда \begin{document}? Что она включает?

  2. Почему некоторые команды разрешены только в преамбуле?

Определенно, вместе с ответами появятся и другие важные вопросы.

решение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. Однако некоторые пакеты написаны с использованием команд, которые сами по себе могут использоваться только в преамбуле. Обход этого был бы утомительным процессом и не является необходимым.

Связанный контент