2020年底,LaTeX 增加了对通用钩子管理系统的支持。 系统\maketitle
允许我在文档开头执行如果我在序言中,或者如果我在文档中:
\AddToHook{begindocument/end}{\maketitle}
LaTeX hooks 仅在 TeX Live 2021 及更高版本中可用。但是,我需要我的代码至少在未更新的 TeX Live 2020 中工作(以支持 Overleaf),最好在 TeX Live ≥ 2018 中工作。务实地说,我可以按如下方式重写我的代码:
\ifx\@onlypreamble\@notprerr
% We are in the document
\maketitle
\else
% We are in the preamble
\RequirePackage{etoolbox}
\AfterEndPreamble{\maketitle}
\fi
但是,我想逐步将我的代码转换为使用 LaTeX 钩子,而使用兼容代码只会积累技术债务,这是我想避免的。
是否存在polyfill有没有可以添加(有限)对 LaTeX 钩子支持的软件包,可以让我在历史 TeX Live 版本中使用 LaTeX 钩子?像这样:
\RequirePackage{lthooks-polyfill}
\AddToHook{begindocument/end}{\maketitle}
如果不是,那么建议从不使用钩子的代码迁移到使用钩子并与 TeX Live 历史版本保持兼容的代码的迁移路径是什么?
答案1
通过将有用的 LaTeX 包拉入内核,LaTeX 内核的功能便可实现 Polyfill。然而,hooks 的概念是全新的和受到各种不同的 LaTeX 软件包的启发:etoolbox
,filehook
,atbegshi
,atveryend
, 和别的。
正如 Ulrike 在原始问题下方的评论中指出的那样,\AfterEndPreamble
该etoolbox
包中的命令类似于begindocument/end
钩子,但仅在序言中起作用。因此,答案似乎是否定的:尽管 LaTeX 钩子的部分功能在不同的 LaTeX 包中可用,但不存在全面的 polyfill。
LaTeX 钩子自 LaTeX 2020-10-01 起可用。因此,一种迁移路径是在 2020-10-01 之前和之后为 LaTeX 编写不同的代码:
\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
\IfFormatAtLeastTF{2020-10-01}%
{\AddToHook{begindocument/end}{\maketitle}}%
{%
\ifx\@onlypreamble\@notprerr
% We are in the document
\maketitle
\else
% We are in the preamble
\RequirePackage{etoolbox}
\AfterEndPreamble{\maketitle}
\fi
}
或者,您可以通过加载当前文件来向前滚动 LaTeX 格式latexrelease.sty
,正如 David 在原始问题下方的评论和 Joseph 的回答中所指出的那样,或者等到您不再需要支持 TeX Live <2021。
答案2
我建议设置一个你需要的规范,然后坚持下去:这在 LaTeX 中一直可以使用可选参数来实现\NeedsTeXFormat
,但今天人们可能会使用更受控制的情况
\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
\IfFormatAtLeastTF{2020-10-01}%
{}
{%
\PackageError{foo}
{%
This package requires LaTeX 2020-10-01 or newer!
}
\@ehc
\endinput
}
然后我会记录下可以使用它latexrelease
在旧系统上获得足够新的格式。