删除 LaTeX 钩子的内容(使用 lthooks)

删除 LaTeX 钩子的内容(使用 lthooks)

在特殊情况下(文档类的新版本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.

这意味着该钩子包含三个代码块(标签foobarbaz——它们通常与添加它们的包具有相同的名称)。

有四种方法可以删除任何单个代码块:

  1. 您可以在您的包中(假设它在foo这里),使用 将代码添加到该钩子中,然后声明一条规则,您的包将从(例如)使用中\AddToHook删除代码块baz

    \DeclareHookRule{example-hook}{foo}{voids}{baz}
    

    然后在中example-hook,当您的包foo存在时,的代码块baz不会被使用。

  2. 如果你的包foo与以下不兼容baz,那么你可以写

    \DeclareHookRule{example-hook}{foo}{incompatible-error}{baz}
    

    如果和 的代码块都存在于 中,foo则 和的代码块都将被删除。如果不存在重大不兼容性,则还有。bazexample-hookincompatible-warning

在这两种情况下,您也可以使用\DeclareDefaultHookRule{foo}{<relation>}{baz},它会影响包foobaz全部钩子(尽管非Default规则优先)。此外,在这两种情况下,都可以用另一个\Declare(Default)HookRule或覆盖该设置\ClearHookRule

  1. 如果你真的想要删除包的代码块baz,那么你可以这样做

    \RemoveFromHook{example-hook}[baz]
    

    但此操作与设置规则不同,具有破坏性并且无法撤消。 \RemoveFromHook如果标签尚未添加到钩子中,则也能起作用。

  2. 最后,如果你想彻底清除钩子,无论出于什么原因,那么你可以这样做

    \RemoveFromHook{example-hook}[*]
    

    这将删除全部代码块example-hook。但是不建议使用此操作,因为它将删除在此之前添加到钩子中的所有代码,无论该代码是什么。与前一种情况一样,此操作无法撤消。因此,只有当您确实想完全清除钩子时才使用此方法,否则请尝试在上述方法的基础上进行构建。

相关内容