如何在 \begin{document} 之后立即自动添加文本

如何在 \begin{document} 之后立即自动添加文本

我尝试重新定义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}也会很幸运。)在之前执行的最后一个钩子\ignorespacesbegindocument/end(另请参阅lthooks-doc.pdf,第 25 页)。因此,要排版的材料应放入此钩子中:

\documentclass{article}
\AddToHook{begindocument/end}{Hello world!\par}
\begin{document}
Hello world.
\end{document}

在此处输入图片描述

对于高于 的格式2020-10-01etoolbox本身\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

相关内容