LaTeX 3 接口文件(interface3.pdf)的第 9 页讨论了命令\ProvidesExplPackage
、\ProvidesExplClass
和\ProvidesExplFile
。
这些函数的作用方式与相应的 LATEX2ε 内核函数 \ProvidesPackage、\ProvidesClass 和 \ProvidesFile 大致相同。但是,它们还隐式地为文件其余部分的代码切换 \ExplSyntaxOn。在文件末尾,将调用 \ExplSyntaxOff 来反转此操作。(这与 LATEX2ε 在包和类代码中打开 \makeatletter 的概念相同。)
所以我刚刚测试了后一个命令\ProvidesFile
,它似乎没有这样做。我测试了 MWE:
\documentclass{article}
\input{ExplFile}
\newcommand{\pangram}{The Five Boxing Wizards Jump Quickly!}
\begin{document}
\pangram
\end{document}
ExplFile
位于同一文件夹中的输入有代码
%
\ProvidesExplFile{ExplFile}{2023/05/27}{1.0.0}{Test file}
%
%FILE CONTENTS
%
编译后的 PDF 仅显示\pangram
但所有空格字符均被删除。空格字符无法正常显示的唯一原因是 ExplSyntax 不会在文件末尾自动关闭\ProvidesExplFile
。
编辑:2023-07-03 我刚刚了解到这个问题已经发布在 GitHub 上。https://github.com/latex3/latex3/issues/817
答案1
\ProvidesExplFile
基于\ProvidesFile
,然后与\ProvidesPackage
和 一起出现\ProvidesClass
。这些都使用 LaTeX catcode 堆栈来保存/恢复@
(经典)和ExplSyntaxOn/Off
状态。但是,要做到这一点,您必须以正确的方式加载文件:\RequirePackage
、\LoadClass
等。目前,对于任意文件,只有\@onefilewithoptions
,这实际上是内部的:这是我们需要解决的问题。但是,如果您使用此机制,您会发现代码状态得到正确处理。