我想知道 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 使用\everypar
token 寄存器来设置错误。如果你\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 中删除需要对一般情况多加注意,所以我避免了这个问题。)