在特殊情况下(文档类的新版本leaflet
),我使用新的 LaTeX 钩子shipout/before
将完成的页面保存在框寄存器中而不输出。在下一步中,它们被组合并输出。此时,我希望所有 shipout 钩子都不再处于活动状态。我该如何实现这一点?是否有任何我可以重置的相关令牌寄存器?
答案1
这有点取决于你想做什么。使用新的钩子管理系统,包会将带标签的代码块添加到钩子中,你可以使用它们的标签独立操作这些块。要找出钩子包含的内容,你可以使用\ShowHook
。以下是文档中的一个示例(texdoc lthooks
):
-> The hook 'example-hook':
> Code chunks:
> foo -> [code from package 'foo']
> bar -> [from package 'bar']
> baz -> [package 'baz' is here]
> Extra code for next invocation:
> -> [one-time code]
> Rules:
> foo|baz with relation >
> baz|bar with default relation <
> Execution order (after applying rules):
> baz, foo, bar.
这意味着该钩子包含三个代码块(标签foo
、bar
和baz
——它们通常与添加它们的包具有相同的名称)。
有四种方法可以删除任何单个代码块:
您可以在您的包中(假设它在
foo
这里),使用 将代码添加到该钩子中,然后声明一条规则,您的包将从(例如)使用中\AddToHook
删除代码块baz
\DeclareHookRule{example-hook}{foo}{voids}{baz}
然后在中
example-hook
,当您的包foo
存在时,的代码块baz
不会被使用。如果你的包
foo
与以下不兼容baz
,那么你可以写\DeclareHookRule{example-hook}{foo}{incompatible-error}{baz}
如果和 的代码块都存在于 中,
foo
则 和的代码块都将被删除。如果不存在重大不兼容性,则还有。baz
example-hook
incompatible-warning
在这两种情况下,您也可以使用\DeclareDefaultHookRule{foo}{<relation>}{baz}
,它会影响包foo
和baz
全部钩子(尽管非Default
规则优先)。此外,在这两种情况下,都可以用另一个\Declare(Default)HookRule
或覆盖该设置\ClearHookRule
。
如果你真的想要删除包的代码块
baz
,那么你可以这样做\RemoveFromHook{example-hook}[baz]
但此操作与设置规则不同,具有破坏性并且无法撤消。
\RemoveFromHook
如果标签尚未添加到钩子中,则也能起作用。最后,如果你想彻底清除钩子,无论出于什么原因,那么你可以这样做
\RemoveFromHook{example-hook}[*]
这将删除全部代码块
example-hook
。但是不建议使用此操作,因为它将删除在此之前添加到钩子中的所有代码,无论该代码是什么。与前一种情况一样,此操作无法撤消。因此,只有当您确实想完全清除钩子时才使用此方法,否则请尝试在上述方法的基础上进行构建。