“缺少 \begin{document}” 如何起作用?

“缺少 \begin{document}” 如何起作用?

我想知道 LaTeX 如何调用错误Missing \begin{document}。我想按照以下 MWE 的意义重现它(它将成为我自己的文档类的一部分):

\documentclass{article}

\begin{document}

\title{My titlE} % <-- these are fine
\author{tohecz}
\def\A{\mathbf{A}}

Hello % <-- should invoke error "Text before `\maketitle` command"
% the error should be invoked even when `\maketitle` is missing at all

\maketitle

World % <-- this is fine

\end{document}

答案1

LaTeX 使用\everypartoken 寄存器来设置错误。如果你\showthe\everypar之前尝试过,\begin{document}你会看到

> \@nodocument .
l.3 \showthe\everypar

内部命令\@nodocument展开后会给出错误。这是因为 TeX\everypar每次开始一个段落时都会插入内容,而当它在垂直模式下遇到水平模式材料时就会发生这种情况。TeX 以垂直模式启动,第一个字母或类似字母会导致切换到水平模式,插入内容\everypar,因此会触发错误。

宏的一部分从 中\document删除。因此,您需要向其中添加一些内容,然后将其作为 的一部分再次删除或禁用。您还需要在 的末尾在正确的位置激活它。例如\@nodocument\everypar\maketitle\document

\makeatletter
\g@addto@macro{\document}{\everypar\expandafter{\the\everypar\my@title@check}}        
\g@addto@macro{\maketitle}{\global\let\my@title@check\relax}
\newcommand*{\my@title@check}{\PackageError{MyPkg}{Missing \protect\maketitle}\@ehc}
\makeatother

我没有从中删除检查\everypar,而是采取了一旦使用就将其转换为无操作的简单方法\maketitle。您也可以使用标志,例如,如果您有进一步的测试要做。(从 toks 中删除需要对一般情况多加注意,所以我避免了这个问题。)

相关内容