\renewenvironment 和环境挂钩

\renewenvironment 和环境挂钩

这个问题涉及 2020 年 10 月推出的 LaTeX 2e 的钩子系统 ( lthooks)。

如何\renewenvironment与其钩子交互?

  • 钩子是否被清除了或者已经添加到钩子中的代码是否还保留?
  • 当恢复环境的原始定义(例如通过结束组)时,钩子是否会恢复为其旧值?
  • 这些问题的答案是否也适用于document环境,或者在这方面的表现是否有所不同?

答案1

我会尝试逐一回答你的问题。首先,介绍一下背景:

钩子由\begin和执行\end。环境代码不会以任何方式改变。使用lthooks\begin会 (过于简单)

  \UseHook{env/#1/before}%
  \begingroup
    \UseHook{env/#1/begin}%
    \csname #1\endcsname

并且\end

    \UseHook{env/#1/end}%
  \csname end#1\endcsname
  \endgroup
  \UseHook{env/#1/after}%

其中#1是环境名称。这基本上与etoolbox之前的钩子的布局相同lthooks

  • 钩子是否被清除了或者已经添加到钩子中的代码是否还保留?

它们保留下来。无论环境定义如何,添加到的内容env/foo/before都将在 处执行env/foo/before。在这种情况下,钩子代码不可能知道\foo在文档中的两点之间重新定义了什么。

  • 当恢复环境的原始定义(例如通过结束组)时,钩子是否会恢复为其旧值?

钩子上的操作始终是全局的,因此在组内添加代码不会在最后恢复。相反,如果需要,您必须明确删除它(请参阅我关于从钩子中删除代码)。

  • 这些问题的答案是否也适用于文档环境,或者在这方面的表现是否有所不同?

document作为环境, 具有通常环境所具有的所有钩子(除了env/document/after,由于 TeX 运行在此之前结束,因此不会执行)。但\document该宏还有一堆编码到宏中的附加钩子:

  • begindocument/before:执行的第一件事\document(在\endgroup取消所\begingroup完成的之后\begin)。这是一个“一次性”钩子,这意味着\AddToHook{begindocument/before}{<code>}在此之后的任何操作都将导致<code>立即执行;

  • begindocument:好东西\@begindocumenthook(您可以使用新\AddToHook界面或 向其中添加代码\AtBeginDocument)。这也是一次性钩子;和

  • begindocument/end\document:除了 final 之外执行的最后一件事\ignorespaces。也是一次性钩子。

如果您重新定义\document,环境钩子将像任何环境一样正常执行,但\document特定于的钩子则不会执行(当然,除非您将它们添加到重新定义中)。

相关内容