使用最新的 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 内核中:对于expl3
,expl3-code.tex
是预加载的,对于(以前的)xparse
,其核心命令定义功能内置于内核中,并且包仍然存在,主要是为了兼容性。
这些包有两个主要原因本身未标记为已加载。首先是选项:如果内核预加载,例如,expl3
没有选项,然后用户尝试\usepackage[enable-debug]{expl3}
,它会抛出“选项冲突”错误,因此无法完成。相反,我们只将核心代码加载到expl3-code.tex
内核中,然后确保在加载expl3-code.tex
时有重新加载保护,以防止再次加载。expl3.sty
第二个原因是expl3.sty
和xparse.sty
仍然提供由于某种原因未添加到 LaTeX 内核的功能。 expl3.sty
提供与调试相关的加载时选项,其中一些选项(undo-recent-deprecations
例如)在核心中没有用户级等效选项,因此需要包。 xparse.sty
提供G
、l
和u
参数类型,这些类型未在内核中预加载,因为它们已被弃用,仅用于向后兼容。
在这两种情况下,软件包提供的内容主要是为了兼容性,因此在新文档中您实际上不需要加载(事实上,应该不xparse.sty
鼓励使用已弃用的参数类型)。
答案2
来自手动的expl3(重点是我的):
expl3 的发行版在 CTAN 上分为三个包:l3kernel、l3packages 和 l3experimental。由于历史原因,\RequirePackage{expl3} 加载现在作为 l3kernel 发行的代码。这个单片包包含所有模块被团队视为稳定的,并且此代码中的任何更改都非常有限。因此,此材料适合在第三方软件包中使用,而不必担心支持的变化。所有这些代码都记录在 interface3.pdf 中。使用最新的 LATEX2ε 内核,此代码内置于格式文件中,因此无需任何进一步步骤即可使用。l3packages 中的材料也很稳定,但并不总是处于编程水平:最值得注意的是,xparse 是稳定的并且适合更广泛的使用。