前情提要:
其中雾月老师给了这一个例子:
而在文档中还有额外的两个\New
命令:
\NewHookWithArguments{cmd/fancybox/before}{2}
\NewReversedHookWithArguments{cmd/fancybox/after}{2}
我不太明白是,既然generic hook具有第一次自动修补的机制,那么这里:
It is important that the hooks are declared with\NewHookWithArguments
or\NewReversedHookWithArguments
, otherwise the command hook code will try to patch the command.
\NewHookWithArguments
和\NewReversedHookWithArguments
的含义?
哦哦,我大概明白了:
cmd/fancybox/before
没定义,那么会自动修补(同时\NewHook
)\New
了一个,相当于“占了位置”,这样子就可以实现阻止其自动修补但我还有有点不是太明白的是,此处
\fancybox
为什么需要阻止自动修补呢🤔?谢谢雾月老师解答~(笔芯)
@u70550 补充的图片加了一个例子。
@u10307 谢谢雾月老师费心补充内容,我看懂新增的例子了
P.S. 我觉得我可以弄懂文档原文中『从上下文来看』为何要添加两行
\New
命令来“占位”了(也即问题1和3):若如此做,则这个hook将在他应该执行的位置正常执行,且同时不会进行自动修补;在这个例子中,重要的是最后的两行
\NewHookWithArguments
以及\NewReverseHookWithArguments
,如果缺少了他们。那么自动修补机制将会尝试进行修补(因为没有事先显式\New
这两个generic hook)从单纯的段落阅读理解,我可以get到『加上
\New
可以避免自动修补』,但是此处的\fancybox
为何需要阻止自动修补,是因为\fancybox
功能上的要求(?),还是仅仅是文档中『then the hooks will be executed where they should and no patching will be attempted』直接指明了目的呢?如果我没有理解错,您新给的例子中是否需要手动
\UseHookWithArguments
是和『参数个数』相关的,似乎和这里文档例子中为什么加上\New
的原因无关。再次感谢雾月老师的帮助和释疑!
@u70550 不论其实现如何,从逻辑上看,钩子都是用于 public API(当然也可用于内部命令),既可以把它们包装到内部命令中,也可以放在 public API 的定义处,但总要保证位置“正确”,至少要达到理想效果。
从逻辑上看,
\fancybox
需要两个参数,但定义它时却没有,所以它必须向后看,才能找到所需参数,但执行了自动修补后,看到的是\UseHook..
而不是想要获取的参数,而且自动修补的也没有“正确”得到它的参数个数。所以必须阻止自动修补(通过创建钩子),并且手动修补。前提是这个钩子有存在的必要,如果作者认为这里不需要加钩子,也可以不管它。总之,如果可以有钩子,那么钩子的位置和参数至少要正确,如果不需要钩子,不管即可。
@u10307 顿悟了
之前目光一直局限在内部命令
\@fancybox
上,忘记\fancybox
不吃参数了!!非常感谢您的帮助!!