Win11; TeXLive2024; VSCode; PDFLaTeX.
从模板命令封装的角度出发,我欲定义一个带钩子(hook)的“API”命令 \my
,使用户在导言区能够控制某些行为。
但事实是,\my
在导言区中无法调用hook,而放到正文区中则可以。
为啥呢。
本人明白从需求的角度出发、能有不用hook的简单方法,但该贴的重心即在讨论hook的行为.
\my
的定义方式由\newcommand
改为\newif
:如上述描述所示另外,lthooks-doc.pdf
中也未找到相关解释(当然,不排除错读漏读)。
以控制列表环境的行为为例:
\documentclass{article}
\usepackage{enumitem}
\newcommand{\my}{}
\AddToHook{cmd/my/after}{
\setlist{label=\roman*}
}
\my
\begin{document}
\begin{enumerate}
\item{tips 1}
\item{tips 2}
\end{enumerate}
\end{document}
对。

噢~ 还是漏看了。感谢解惑~
@u10307 想请教一下您截图的这个
CUSTeX
文档是否可以免费下载到,我在您的这个仓库链接下似乎没找到。考古的回复...
钩子在
\begin{document}
之前并不存在(即:在导言区使用命令时,钩子永远不会被执行)。在
ltcmdhooks.pdf
中,section 2.1.1
如上截图第一段的翻译大意为:当在文档的导言区首次调用
\AddToHook
(或其expl3
等效命令)时,例如使用通用命令钩子cmd/foo/before
,如果之前没有向该钩子添加过代码,它会存储一个针对该命令的修补指令(patch instruction),直到\begin{document}
。然后,所有添加了钩子的命令会一次性被修补。这意味着导言区中的命令不会立即应用钩子。这解释了
\my
为什么只有在正文调用才生效。