\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... 쌍 은 -in-macro 문제를 \makeatother방지합니다 . @그러나 일부 패키지는 서문 내에서만 사용할 수 있는 명령을 사용하여 작성됩니다. 이를 우회하는 것은 지루한 과정이며 필요하지 않습니다.

관련 정보