这LaTeX 内核定义\ProvidesFile
两次:
121: \def\ProvidesFile#1{%
122: \begingroup
123: \catcode`\ 10 %
124: \ifnum \endlinechar<256 %
125: \ifnum \endlinechar>\m@ne
126: \catcode\endlinechar 10 %
127: \fi
128: \fi
129: \@makeother\/%
130: \@ifnextchar[{\@providesfile{#1}}{\@providesfile{#1}[]}}
.....
7580: \def\ProvidesFile#1{%
7581: \begingroup
7582: \catcode`\ 10 %
7583: \ifnum \endlinechar<256 %
7584: \ifnum \endlinechar>\m@ne
7585: \catcode\endlinechar 10 %
7586: \fi
7587: \fi
7588: \@makeother\/%
7589: \@makeother\&%
7590: \kernel@ifnextchar[{\@providesfile{#1}}{\@providesfile{#1}[]}}
这里唯一有意义的区别是添加了\@makeother\&
(since \let\kernel@ifnextchar\@ifnextchar
on line 1055)。这有必要吗?
source2e.pdf
关于第一个定义(第 4 页)提到了这一点:
\ProvidesFile
这是供 initex 使用的特殊版本。
...关于第二个(重新)定义(第 459 页),如下所述:
与 类似
\ProvidesPackage
,但适用于任意文件。
这里的catcode 差异有什么作用&
?
答案1
您链接到的latex.ltx
版本很好,但当然那是删除了所有文档的版本。
在文献资料中,你可以看到第一个
% \subsection{Some bits of 2e}
% \begin{macrocode}
%<*2ekernel>
\def\two@digits#1{\ifnum#1<10 0\fi\number#1}
\long\def\@firstoftwo#1#2{#1}
\long\def\@secondoftwo#1#2{#2}
% \end{macrocode}
% \changes{v1.0e}{1994/05/11}
% {Add \cs{ProvidesFile} as used in fd files.}
% \changes{v1.0l}{1995/10/17}
% {Modify initex version of \cs{ProvidesFile}}
% \changes{v1.0n}{1995/11/01}
% {Initialise \cs{@addtofilelist} to \cs{@gobble}}
% This is a special version of |\ProvidesFile| for initex use.
% \changes{v1.0x}{2001/05/25}{Explicitly set catcode of
% \cs{endlinechar} to 10 (pr/3334)}
% \changes{v1.0y}{2001/06/04}{But only if it is a char (pr/3334)}
% \begin{macrocode}
因此,它是一组命令的一部分,给出了初始的基本定义,以允许 latex 从没有预加载格式的核心 initex 引导自身。
特别是这部分dircheck.dtx
用于unpack.ins
\let\documentclass\undefined
\input ltdirchk.dtx
因此,如果您需要仅使用 initex 从文档源中解压 latex.ltx,而没有可用的纯文本或 latex 格式,则该ltdircheck.dtx
文件需要定义它使用的每个宏。
此初始集合中的定义并不总是最终定义。有时是因为有特殊要求(例如,在\ProvidesFile
格式构建期间输入的文件不会被处理\listfiles
),但大多数情况下,任何差异都是因为ltdircheck
版本仅定义为允许 latex 源自行解压并引导转储格式所需的最低限度。
第二个文档(在ltclass.dtx
)或多或少暗示了&
差异(这无关紧要) &
是后来添加的
% \changes{v1.1a}{1998/03/21}
% {Allow \&. Internal/2702}
由于格式构建期间输入的文件数量是已知的,并且&
已知在ltdircheck.dtx
版本未更改的情况下是安全的,因此如果它最初存在,那么它最终可能会出现在两个版本中,仅仅因为易于复制代码。