我尝试重新定义document
环境如下,但是收到如下抱怨:
LaTeX 错误:
\begin{MYdocument}
输入第 13 行以 结尾\end{document}
。
\documentclass[12pt]{article}
\newtoks{\SpecialText}
\SpecialText={Text to be printed after begin document}
\newenvironment{MYdocument}{%
\begin{document}{}
Note: \the\SpecialText
}{%
\end{document}
}
\begin{MYdocument}
... file contents ...
\end{MYdocument}
我希望这产生以下输出
注意:在开始文档后打印的文本
... 文件内容 ...
如果我可以通过稍微修改环境来做到这一点,那就更好了,这样我就可以使用了\begin{document} ... \end{document}
。
答案1
截至 2023 年,建议使用的答案\AtBeginDocument
可能已过时。事实上,clsguide.pdf
在第 16 页
该
\AtBeginDocument
钩子不应用于进行任何排版的代码,因为排版结果是不可预测的。
简化后,代码\begin{document}
扩展为
\UseHook{env/document/before}
\begingroup
\def\@currenvir{document}
\UseHook{env/document/begin}
\UseOneTimeHook{begindocument/before}%
% ... global option check, size setting, aux file, font setup
\normalsize
\everypar{}%
% ... spacefactor codes, language, metadata, page size
\UseOneTimeHook{begindocument}% <--- \AtBeginDocument goes in here
% ... other settings
\UseOneTimeHook{begindocument/end}%
\ignorespaces
我标记了插入内容的位置\AtBeginDocument
。虽然已经设置了字体大小并\everypar
“清除”了字体大小,因此不会引发错误Missing \begin{document}
,但其他事情仍在继续,正如官方指南所说,结果可能是不可预测的。(虚拟语气:显然你可能\begin{document}
也会很幸运。)在之前执行的最后一个钩子\ignorespaces
是begindocument/end
(另请参阅lthooks-doc.pdf
,第 25 页)。因此,要排版的材料应放入此钩子中:
\documentclass{article}
\AddToHook{begindocument/end}{Hello world!\par}
\begin{document}
Hello world.
\end{document}
对于高于 的格式2020-10-01
,etoolbox
本身\AfterEndPreamble
将被简单地映射到\AddToHook{begindocument/end}
。 对于较旧的格式,它仍然可以安全地使用,因为 used 钩子被添加到 的最末尾,\document
如下所示:
\edef\document{\unexpanded\expandafter{\document Hello world!\par}}
自己这样做显然是邪恶的。每次你这样做,毛茸茸的小兔子都会死得很惨,除非你是一个真正知道自己在做什么的黑暗 TeX 巫师/女巫。
答案2
您可以使用行\AtBeginDocument
前的命令\begin{document}
来排队代码(甚至多段代码),以便在遇到该行时执行它。 以下是参考。
答案3
正如 Aaron 所说,\AtBeginDocument{<code>}
可用于将代码放置在“文档开头”。此钩子在旧钩子之后执行.aux
读入旧代码并打开新代码之后执行,但在前言正式关闭之前执行。因此代码仍然可以加载包和添加已经可设置类型的材料,将其写入.aux
文件,如分段命令。因此,它实际上是一只脚在前言中执行,另一只脚在文档正文中执行。
该etoolbox
软件包提供了\AfterEndPreamble{<code>}
(和其他有用的钩子)在序言关闭后执行,因此例如所有仅用于序言的宏都被禁用等。实际上,它是在 的最后执行的\begin{document}
,后面只跟一个。我个人更\ignorespaces
喜欢(已经被软件包大量使用)在文档主体的最开始添加代码。\AfterEndPreamble
\AtBeginDocument