这个问题涉及 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
特定于的钩子则不会执行(当然,除非您将它们添加到重新定义中)。