多个 \AtBeginDocument 调用是否按出现的顺序执行代码

多个 \AtBeginDocument 调用是否按出现的顺序执行代码

假设我有这两个简单的文件

  • myclass.cls

    \LoadClass{article}
    \AtBeginDocument{\typeout{IN CLASS}}
    
  • myfile.tex

    \AtBeginDocument{\typeout{BEFORE CLASS}}
    \documentclass{myclass}
    \AtBeginDocument{\typeout{AFTER CLASS}}
    \begin{document}
    empty
    \end{document}
    

编译时myfile.tex我希望按以下顺序看到消息:

  1. BEFORE CLASS
  2. IN CLASS
  3. AFTER CLASS

我宁愿得到这个命令:

  1. IN CLASS
  2. BEFORE CLASS
  3. AFTER CLASS

我错过了什么?

只是为了完整性,我使用pdfTeX 3.14159265-2.6-1.40.21 (TeX Live 2020/Debian)和得到了这个结果kpathsea version 6.3.2

答案1

使用钩子管理系统\AtBeginDocument是一个别名\AddToHook{begindocument},所有具有相同标签(toplevel在这种情况下默认为或您的类名)的条目一起执行,以便它们可以按照钩子规则进行排序。

您可以使用新的可选参数将两个调用放在单独的标签中

\AtBeginDocument[A]{\typeout{BEFORE CLASS}}
\documentclass{myclass}
\AtBeginDocument[B]{\typeout{AFTER CLASS}}
\begin{document}
empty
\end{document}

生产

BEFORE CLASS
IN CLASS
AFTER CLASS

相关内容