为什么包 expl3 和 xparse 没有标记为已加载最新的 LaTeX 2ε 内核?

为什么包 expl3 和 xparse 没有标记为已加载最新的 LaTeX 2ε 内核?

使用最新的 LaTeX 2ε 内核时,expl3 和 xparse 功能默认可用。

为什么包 expl3 和 xparse 没有标记为已加载最新的 LaTeX 2ε 内核?

举个例子

\makeatletter
\message{^^J}
\message{xparse\@ifpackageloaded{xparse}{}{ not} loaded.^^J}
\message{expl3\@ifpackageloaded{expl3}{}{ not} loaded.^^J}
\message{\string\NewDocumentCommand\@ifundefined{NewDocumentCommand}{ not}{} defined.^^J}
\message{\string\ExplSyntaxOn\@ifundefined{ExplSyntaxOn}{ not}{} defined.^^J}
\stop

我得到:

This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2020-10-01> patch level 4
L3 programming layer <2021-02-18> 
xparse not loaded.
expl3 not loaded.
\NewDocumentCommand defined.
\ExplSyntaxOn defined.
 )
No pages of output.
Transcript written on test.log.

答案1

在这两种情况下,每个包的代码都加载到 LaTeX 内核中:对于expl3expl3-code.tex是预加载的,对于(以前的)xparse,其核心命令定义功能内置于内核中,并且包仍然存在,主要是为了兼容性。

这些包有两个主要原因本身未标记为已加载。首先是选项:如果内核预加载,例如,expl3没有选项,然后用户尝试\usepackage[enable-debug]{expl3},它会抛出“选项冲突”错误,因此无法完成。相反,我们只将核心代码加载到expl3-code.tex内核中,然后确保在加载expl3-code.tex时有重新加载保护,以防止再次加载。expl3.sty

第二个原因是expl3.styxparse.sty仍然提供由于某种原因未添加到 LaTeX 内核的功能。 expl3.sty提供与调试相关的加载时选项,其中一些选项(undo-recent-deprecations例如)在核心中没有用户级等效选项,因此需要包。 xparse.sty提供Glu参数类型,这些类型未在内核中预加载,因为它们已被弃用,仅用于向后兼容。

在这两种情况下,软件包提供的内容主要是为了兼容性,因此在新文档中您实际上不需要加载(事实上,应该不xparse.sty鼓励使用已弃用的参数类型)。

答案2

来自手动的expl3(重点是我的):

expl3 的发行版在 CTAN 上分为三个包:l3kernel、l3packages 和 l3experimental。由于历史原因,\RequirePackage{expl3} 加载现在作为 l3kernel 发行的代码。这个单片包包含所有模块被团队视为稳定的,并且此代码中的任何更改都非常有限。因此,此材料适合在第三方软件包中使用,而不必担心支持的变化。所有这些代码都记录在 interface3.pdf 中。使用最新的 LATEX2ε 内核,此代码内置于格式文件中,因此无需任何进一步步骤即可使用。l3packages 中的材料也很稳定,但并不总是处于编程水平:最值得注意的是,xparse 是稳定的并且适合更广泛的使用。

相关内容