如何在 TeX Live 的历史版本中使用 LaTeX 钩子?

如何在 TeX Live 的历史版本中使用 LaTeX 钩子?

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 软件包的启发etoolboxfilehookatbegshiatveryend, 和别的。

正如 Ulrike 在原始问题下方的评论中指出的那样,\AfterEndPreambleetoolbox包中的命令类似于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在旧系统上获得足够新的格式。

相关内容