在 LaTeX 内核中双击 \ProvidesFile。为什么?

在 LaTeX 内核中双击 \ProvidesFile。为什么?

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\@ifnextcharon 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版本未更改的情况下是安全的,因此如果它最初存在,那么它最终可能会出现在两个版本中,仅仅因为易于复制代码。

相关内容