summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/snapshot/snapshot.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-18 03:00:37 +0000
committerNorbert Preining <norbert@preining.info>2019-09-18 03:00:37 +0000
commit841a985f019b145be416f24859bcd1e0833ddb76 (patch)
tree54da1174340da923d25075b69108553327099df3 /macros/latex/contrib/snapshot/snapshot.dtx
parentcda3ce3f9172e48d4bc673e57fc617ba0f0b40d1 (diff)
CTAN sync 201909180300
Diffstat (limited to 'macros/latex/contrib/snapshot/snapshot.dtx')
-rw-r--r--macros/latex/contrib/snapshot/snapshot.dtx1018
1 files changed, 754 insertions, 264 deletions
diff --git a/macros/latex/contrib/snapshot/snapshot.dtx b/macros/latex/contrib/snapshot/snapshot.dtx
index 26a502b123..f79605dbf6 100644
--- a/macros/latex/contrib/snapshot/snapshot.dtx
+++ b/macros/latex/contrib/snapshot/snapshot.dtx
@@ -1,50 +1,55 @@
-%%% ====================================================================
-%%% @LaTeX-doc-source-file{
-%%% filename = "snapshot.dtx",
-%%% version = "1.14",
-%%% date = "2002/03/05",
-%%% time = "15:29:00 EST",
-%%% checksum = "39090 807 3449 29761",
-%%% author = "American Mathematical Society",
-%%% copyright = "Copyright 2001 American Mathematical Society,
-%%% all rights reserved. Copying of this file is
-%%% authorized only if either:
-%%% (1) you make absolutely no changes to your copy,
-%%% including name; OR
-%%% (2) if you do make changes, you first rename it
-%%% to some other name.",
-%%% address = "American Mathematical Society,
-%%% Electronic Products and Services,
-%%% PO Box 6248,
-%%% Providence, RI 02940,
-%%% USA",
-%%% email = "tech-support@ams.org",
-%%% URL = "http://www.ams.org/",
-%%% supported = "yes",
-%%% keywords = "version, compatibility, dependencies, LaTeX",
-%%% abstract = "This package provides a way for a LaTeX
-%%% document to specify, for each external file
-%%% on which the document depends, which version
-%%% is required to guarantee output fidelity.",
-%%% docstring = "The checksum field above contains a CRC-16
-%%% checksum as the first value, followed by the
-%%% equivalent of the standard UNIX wc (word
-%%% count) utility output of lines, words, and
-%%% characters. This is produced by Robert
-%%% Solovay's checksum utility.",
-%%% }
-%%% ====================================================================
+% \def\filename{snapshot.dtx}
+% \def\fileversion{2.13}
+% \def\filedate{2012/08/06}
+%
+% \iffalse meta-comment
+%
+% American Mathematical Society
+% Technical Support
+% Publications Technical Group
+% 201 Charles Street
+% Providence, RI 02904
+% USA
+% tel: (401) 455-4080
+% (800) 321-4267 (USA and Canada only)
+% fax: (401) 331-3842
+% email: tech-support@ams.org
+%
+% Copyright 1999-2003, 2004, 2010, 2012 American Mathematical Society.
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is the American Mathematical
+% Society.
+%
+% \fi
+%
% \iffalse
%<*driver>
\NeedsTeXFormat{LaTeX2e}
-\documentclass{amsdtx}
+\documentclass[oneside]{amsdtx}
\providecommand{\qq}[1]{\textquotedblleft#1\textquotedblright}
-\providecommand{\mdash}{\textemdash}
+\providecommand{\mdash}{\textemdash\penalty\exhyphenpenalty}
+\providecommand{\lat}[1]{\protect\LaTeX{}}
+\providecommand{\strong}[1]{\textbf{#1}}
+\providecommand{\secref}[1]{Section~\ref{#1}}
+
+\CodelineIndex
+
\begin{document}
\title{The \pkg{snapshot} package}
\author{American Mathematical Society\\Michael Downes}
\date{Version \fileversion, \filedate}
-\hDocInput{snapshot.dtx}
+\DocInput{snapshot.dtx}
+\PrintIndex
\end{document}
%</driver>
% \fi
@@ -82,7 +87,9 @@
% \end{verbatim}
%
% \item Run \latex/ on the document. This will produce a dependency
-% list in a file \verb'\jobname.dep'.
+% list in a file \verb'\jobname.dep'. (I.e., if the document name is
+% \fn{vermont.ltx}, the dependency list will be named
+% \fn{vermont.dep}.)
%
% \item Insert the \fn{.dep} file at the top of the document, before
% \cn{documentclass}. The following example shows what you would end
@@ -132,7 +139,9 @@
% the dependency list, but standard \tex/ 3.x does not provide direct
% access to font checksums for macro programmers. This information
% could be added by a separate script that scans the DVI file.
+% (Certain nontrivial complications are possible, however.)
%
+% \section{Graphics files}
% When a graphics file is read in by a \latex/ document using the
% standard \cn{includegraphics} command, it gets a dummy version
% number string of
@@ -153,9 +162,11 @@
% It would be possible, for \fn{.eps} files at least, to read the
% CreationDate comment that is normally included in the file header
% and use that as the basis of comparison. Recording the bounding box
-% numbers instead of a dummy version number would also be a possibly
-% useful stratagem. But I have left these possibilities untouched for
-% the time being [mjd,2001-05-14].
+% numbers instead of a dummy version number is another possibility,
+% which you can get with the
+% \opt{bbinfo} option (as of \pkg{snapshot} version 2.05).
+%
+% \section{Formalities}
%
% \DescribeMacro{\RequireVersions} The \cn{RequireVersions} command
% scans its argument for file names and associated version number
@@ -182,14 +193,31 @@
% \opt{tfm} to turn on the logging of metric files. (Not yet
% implemented [mjd,1999/09/23])
%
-% \item[format] This is almost always \fn{LaTeX2e}. Other possibilities
-% would be \fn{elatex} or \fn{lambda}. The information comes from
-% \cs{fmtname}.
-% \item[application] This is usually \fn{TeX} with version number
-% \fn{3.x}. From inside \latex/ there is no reliable way to get the
-% exact version number (one could check to see if version 2.x is in
-% use, but this is unlikely to be relevant, nowadays, so I have not
-% bothered).
+% \item[format] This is almost always \fn{LaTeX2e}. The information
+% comes from \cs{fmtname}. Lambda, e\LaTeX{}, and pdf\LaTeX{} leave
+% \cs{fmtname} unchanged, and although this may seem dubious at first
+% sight, I guess they have little choice: the widespread use of
+% \cs{NeedsTeXFormat} in existing package files makes them produce an
+% error message if \cs{fmtname} is changed. (Maybe the thing to do
+% would be to modify the definition of \cs{NeedsTeXFormat} as well.)
+%
+% For a \LaTeX{} format that uses the Babel mechanism for preloading
+% hyphenation patterns, the version number of \fn{babel.def} that was
+% used in building the format might be of interest. But at first
+% glance there does not seem to be any easy way of dealing with that,
+% and in the normal course of things, a document that relies on Babel
+% features will also have a \verb'\usepackage{babel}' statement at
+% the top, and that will yield adequate (I think) information for the
+% snapshot dependency list.
+%
+% \item[application] With standard \fn{TeX} there is no reliable way to
+% get the exact version number from inside \LaTeX{}. If a document is
+% processed with one of the recent variants that address this
+% deficiency (such as e-\TeX{}, pdf\TeX{} and Omega) the available
+% version info is used, but otherwise a presumptive value of
+% \verb'1990/03/25 v3.x' is used (the official release date of \TeX{}
+% 3.0).
+%
% \item[file] None of the above: some other file of miscellaneous type,
% e.g., \fn{.clo}, \fn{.cfg}, \fn{.tex}, or \fn{.def}.
% \end{description}
@@ -200,8 +228,25 @@
% assign a label to particular groups of files in case that helps
% with external processing.
%
-% \section{Warning and error options}
+% \section{Package options}
%
+% The list of options supported by the \pkg{snapshot} package is as
+% follows:
+% \begin{center}\begin{tabular}{lll}
+% dep & date\\
+% log & version\\
+% tfm & major-version\\
+% warning & bbinfo \\
+% error & test \\
+% self-warning
+% \end{tabular}
+% \end{center}
+%
+% \begin{description}
+% \item[dep, log] Write file date and version information to
+% \textit{jobname}\fn{.dep} or to the \LaTeX{} log file, respectively.
+%
+% \item[error, warning, self-warning]
% If the \pkg{snapshot} package is invoked with the \opt{error}
% option \emph{and also} the document contains a \cn{RequireVersions}
% statement, then each subsequent \cn{ProvidesFile},
@@ -219,12 +264,68 @@
% comparing.
% \end{description}
%
+% The \opt{self-warning} causes a warning to be given, instead of an
+% error, if the \pkg{snapshot} package itself has a date or
+% version mismatch.
+%
% \textbf{Note:} A file that doesn't have any sort of
% \cn{ProvidesFile} or \cn{ProvidesPackage} statement in it will show
% up in the dependency list, with a dummy date and version number of
-% 0000/00/00 v0.0, but there is no way, of course, to give any
-% meaningful warning or error message about version mismatches for
-% such a file.
+% 0000/00/00 v0.0, but testing for a version mismatch with such a
+% file is then infeasible.
+%
+% \item[bbinfo] For files of type ``graphic'', include bounding-box info
+% as the ``version number''. A normal date and version number are
+% seldom available for such files, and \LaTeX{} does not attempt
+% to read them, which means that the \pkg{snapshot} package could not
+% obtain the information except by drastically modifying the
+% low-level \LaTeX{} operations that read graphics file
+% information\mdash which seems overly risky.
+%
+% \item[tfm] \emph{Not implemented yet!} Include information about which
+% \TeX{} font metric files are called by \LaTeX{}. This list is
+% usually somewhat different from the list of fonts that are actually
+% used in the output file (\fn{.dvi} or \fn{.pdf}), primarily because
+% the setup for math formulas will normally preload font metric
+% information for all the fonts from which \LaTeX{}'s basic math
+% symbols are drawn (the symbols documented in the \LaTeX{} book),
+% even if the document does not use symbols from all of those fonts.
+%
+% \item[test] This option is for a special purpose. It drastically
+% changes the action of the \cs{RequireVersions} command so that it
+% does not merely record the information for later reference, but
+% does a \qq{trial load attempt} for each file in the list, and then
+% stops the \LaTeX{} job as soon as the list is finished, without
+% continuing any further.
+%
+% By \qq{trial load attempt} I mean that the \cs{RequireVersions}
+% command will actually input each file, but with various bits
+% redefined so that \cs{ProvidesPackage} and variants will execute
+% \cs{endinput}\mdash in other words, only the first few lines of
+% each file will be read.
+%
+% What this means, practically speaking, is that if you run such a
+% test on a document, it gives a relatively quick check on two useful
+% pieces of information without having to retypeset the entire
+% document (which for some documents might be very tedious)
+% \begin{enumerate}
+% \item The actual location on your system from which the file will be
+% loaded.
+%
+% \item The date and version info from \cs{Provides...} line, if present.
+% \end{enumerate}
+%
+% Similar results could be obtained by a combination of
+% \fn{kpsewhich} and \fn{grep}, but because the \pkg{snapshot} \opt{test}
+% option works through \LaTeX{}, it is a system-independent method.
+%
+% Caveat: If a file does not contain any \cs{ProvidesSomething} line,
+% it will be read in its entirety, which might lead to errors. Or if
+% there is any weird stuff preceding the \cs{ProvidesWhatever} line.
+% But for well-behaved files the option seemed useful enough to be
+% worth implementing.
+%
+% \end{description}
%
% \StopEventually{}
%
@@ -232,11 +333,7 @@
% Standard declaration of package name and date.
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-\ProvidesPackage{snapshot}[2002/03/05 v1.14]
-% \end{macrocode}
-%
-% \begin{macrocode}
-\let\@xp\expandafter \let\@nx\noexpand
+\ProvidesPackage{snapshot}[2012/08/06 v2.13]
% \end{macrocode}
%
% Calling the \pkg{snapshot} package in a document causes \latex/ to
@@ -260,11 +357,31 @@
% available; if the second piece is not present, a dummy number
% \verb'0.0' is supplied. Similarly, files that don't include any
% \cn{ProvidesWhatever} statement will get a dummy date of
-% \verb'0000/00/00'; \tex/ system administrators who want to ensure
+% \verb'0000/00/00';
+% \begin{center}\begin{minipage}{.9\columnwidth}\bfseries
+% \medskip
+% \tex/ system administrators who want to ensure
% maximal accuracy of the snapshot information should therefore make
% it a practice to use \cn{ProvidesFile} in \fn{.cfg} files and other
% local files that might have an impact on the output fidelity of
% their documents.
+% \end{minipage}\end{center}
+%
+% A couple of shorthand forms.
+% \begin{macrocode}
+\let\@xp=\expandafter \let\@nx=\noexpand
+% \end{macrocode}
+%
+% A function to compare two strings and return FT or TT (for use with
+% \cs{if}).
+% \begin{macrocode}
+\def\str@cmp#1#2\str@cmp#3{%
+ \if #1#3\else F\@car\fi \str@cmp#2\str@cmp
+}
+\def\string@equal#1#2{%
+ \str@cmp#1\relax\str@cmp#2{\relax\@gobbletwo}\@nil TT%
+}
+% \end{macrocode}
%
% \begin{macro}{\RequireVersions}
%
@@ -272,15 +389,47 @@
% particular collection of files. This might be useful for setting a
% \tex/ inputs path.
% \begin{macrocode}
-\newcommand{\RequireVersions}[2][]{%
- \let\snap@check\snap@compare@versions
- \let\snap@selfcheck\snap@selfcheck@a
- \@ifnextchar *\snap@store@version\snap@store@error#2*{end}{}{}%
+\newcommand{\RequireVersions}[2][]{}%
+\renewcommand{\RequireVersions}[1][]{%
+ \def\snap@check{\snap@compare@versions}%
+ \toks@{#1}\afterassignment\snap@storem
+ \let\@let@token=
+}
+\def\snap@storem{%
+ \ifx\@let@token\bgroup
+ \else
+ \PackageError{snapshot}{Expected a `\@charlb' character here}\@ehc
+ \@xp\@gobblefour
+ \fi
+ \futurelet\@let@token\snap@branch
}
\@onlypreamble\RequireVersions
% \end{macrocode}
%
% \begin{macrocode}
+\let\snap@check\@gobble
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\snap@finish{\toks@\bgroup}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\snap@branch{%
+ \ifx\@let@token\egroup
+ \@xp\snap@finish
+ \else\ifx\@let@token *%
+ \let\reserved@c\snap@store@version
+ \else\ifx\@let@token\@sptoken
+ \lowercase{\def\reserved@c} {\futurelet\@let@token\snap@branch}%
+ \else
+ \let\reserved@c\snap@store@error
+ \fi\fi\fi
+ \reserved@c
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
\def\snap@store@error#1{%
\PackageError{snapshot}{Expected '*' here, not '#1'}\@ehc
}
@@ -294,6 +443,48 @@
\@onlypreamble\snap@store@version
% \end{macrocode}
%
+% Detection of e-\LaTeX{}, pdf\LaTeX{}, pdfe\LaTeX{}, and Lambda
+% [Omega]:
+% \begin{macrocode}
+\ifx\OmegaVersion\@@undefined
+\else
+ \edef\snapshotApplication{%
+ {Omega}\space\space\space
+ {0000/00/00 v\OmegaVersion}%
+ }%
+\fi
+\ifx\eTeXversion\@@undefined
+\else
+ \edef\snapshotApplication{%
+ {eTeX}\space\space\space\space
+ {0000/00/00 v\number\eTeXversion\eTeXrevision}%
+ }%
+\fi
+\ifx\pdftexversion\@@undefined
+\else
+ \edef\snapshotApplication{%
+ \ifx\eTeXversion\@@undefined
+ {pdfTeX}\space\space
+ \else
+ {pdfeTeX}\space
+ \fi
+ {0000/00/00 v0.\number\pdftexversion\pdftexrevision}%
+ }%
+\fi
+% \end{macrocode}
+% If none of the above information is available, the exact version
+% number of \TeX{} is not accessible from inside \latex/. We then
+% fall back to using a nominal date of 1990/03/25, which is when
+% version 3.0 of \fn{tex.web} was released by Knuth.
+% \begin{macrocode}
+\@ifundefined{snapshotApplication}{%
+ \edef\snapshotApplication{%
+ {TeX}\space\space\space\space\space
+ {1990/03/25 v3.x}%
+ }%
+}{}
+% \end{macrocode}
+%
% \begin{macrocode}
\def\@fmtextension{fmt}
\def\@tfmextension{tfm}
@@ -301,9 +492,11 @@
\edef\snapx@class{.\@clsextension}
\edef\snapx@format{.\@fmtextension}
\edef\snapx@tfm{.\@tfmextension}
-\long\def\snapx@application{}
-\let\snap@file=\@empty
+\long\def\snapx@ignore{}
+\let\snapx@application=\snapx@ignore
+\let\snapx@file=\@empty
\let\snapx@end\@@end
+\expandafter\let\csname snapx@-------\endcsname\snapx@end
% \end{macrocode}
%
% For a package named \fn{foo.sty}, this function defines
@@ -311,7 +504,7 @@
% \begin{macrocode}
\def\snap@store@b#1#2#3#4{%
\ifx#1\snapx@end
- \@xp\@gobblefour
+ \@xp\snap@finish
\else
\ifx#1\relax \let#1\@empty\fi
\def\@tempa##1 ##2 ##3\@nil{##1 ##2}%
@@ -319,18 +512,23 @@
%
% \begin{macrocode}
\ifx#1\snapx@application
+ \@xp\xdef\csname rqv@#3#1\endcsname{\@tempa#4 v?.? ? \relax\@nil}%
\else
- \xdef\rqv@list{\rqv@list
- \ifx\@empty\rqv@list\else,\fi
- #3#1%
- }%
- \fi
- \@xp\xdef\csname rqv@#3#1\endcsname{\@tempa#4 v?.? ? \relax\@nil}%
- \ifx#1\snapx@format \snap@check{#3.fmt}%
- \else \snap@selfcheck{#3.sty}%
+ \xdef\rqv@list{\rqv@list{#3#1}}%
+ \@xp\xdef\csname rqv@#3#1\endcsname{\@tempa#4 v?.? ? \relax\@nil}%
+ \snap@intest{#3}{#1}%
+ \ifx#1\snapx@format \snap@check{#3.fmt}%
+% \end{macrocode}
+% Test if current file is \fn{snapshot.sty}. Need to pre-expand the
+% extension part to ensure the test is correct.
+% \begin{macrocode}
+ \else
+ \edef\@tempa{\@nx\string@equal{snapshot.sty}{#3#1}}%
+ \if\@tempa \snap@selfcheck \fi
+ \fi
\fi
\fi
- \@ifnextchar *\snap@store@version\snap@store@error
+ \futurelet\@let@token\snap@branch
}
\@onlypreamble\snap@store@b
% \end{macrocode}
@@ -356,21 +554,11 @@
% \end{macrocode}
%
% The purpose of the `test' option is to support a separate testing
-% procedure that resolves file names. If the \cs{RequireVersions}
-% data is extracted to a separate file, and
-%\begin{verbatim}
-%\RequirePackage[test]{snapshot}
-%\end{verbatim}
-% is added at the top, then the file can be run as a small separate
-% \LaTeX{} job whose sole purpose is to produce in the log file a
-% nice list of fully resolved file names. A limited, but
-% system-independent variant of the \fn{kpsewhich} idea.
-%
+% procedure for resolving file names and pre-checking version
+% numbers. See \secref{test} for more information.
% \begin{macrocode}
-\let\snap@fake@b\relax
-\DeclareOption{test}{%
- \def\snap@fake@b{\endinput \futurelet\@let@token\snap@ignoline}%
-}
+\let\snap@intest=\@gobbletwo
+\DeclareOption{test}{\def\snap@intest{True}}
% \end{macrocode}
%
% For each font used by a document, we would like to list the
@@ -402,6 +590,7 @@
% \begin{macrocode}
\DeclareOption{error}{%
\def\snap@mismatch{\PackageError}%
+ \def\snap@selfcheck{\snap@selfcheck@a}%
\ifx\snap@select\@empty \let\snap@select\snap@select@all \fi
}
% \end{macrocode}
@@ -409,23 +598,32 @@
% \begin{macrocode}
\DeclareOption{warning}{%
\def\snap@mismatch{\snap@mismatch@warning}%
+ \def\snap@selfcheck{\snap@selfcheck@a}%
\ifx\snap@select\@empty \let\snap@select\snap@select@all \fi
}
% \end{macrocode}
%
% Because the exact form of the version number is not mandated by
-% LaTeX, just take the first two ``words'' delimited by spaces. And
-% take a little extra care to properly handle multiple spaces between
-% the words.
+% \LaTeX{}, just take the first two ``words'' delimited by spaces.
+% And take a little extra care to properly handle multiple spaces
+% between the words.
% \begin{macrocode}
\def\snap@select@all#1#2 #3#4 #5\@nil{#1#2 #3#4}
\let\snap@select\@empty
% \end{macrocode}
%
+% If the naming conventions seem a little peculiar here, it's because
+% I had to add some pieces later that I didn't think of initially,
+% and I wanted to minimize the chances of compatibility problems for
+% client packages [mjd,2002-11-04].
% \begin{macrocode}
-\DeclareOption{date}{%
- \def\snap@select#1#2 #3\@nil{#1#2}%
-}
+\def\snap@seldate#1#2 #3\@nil{#1#2}%
+\def\snap@selversion#1#2 #3{\snap@select@version #3}%
+\def\snap@selmajor#1#2 #3{\snap@select@major #3}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareOption{date}{\let\snap@select=\snap@seldate}
% \end{macrocode}
%
% \begin{macrocode}
@@ -440,19 +638,45 @@
% \end{macrocode}
%
% \begin{macrocode}
-\DeclareOption{version}{%
- \def\snap@select#1#2 #3{\snap@select@version #3}%
+\DeclareOption{version}{\let\snap@select\snap@selversion}
+\DeclareOption{major-version}{\let\snap@select\snap@selmajor}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\snap@bbinfo{01}
+\DeclareOption{bbinfo}{\def\snap@bbinfo{00}}
+% \end{macrocode}
+%
+% Give this an inert definition, for the time being, until we are
+% ready to do the split.
+% \begin{macrocode}
+\let\snap@splitter=?
+\AtBeginDocument{%
+ \xdef\@filelist{\@filelist\snap@splitter}%
}
% \end{macrocode}
%
% \begin{macrocode}
-\DeclareOption{major-version}{%
- \def\snap@select#1#2 #3{\snap@select@major #3}%
+\let\snap@selfcheck\@empty
+\let\snap@selfcheck@a\@empty
+% \end{macrocode}
+%
+% The \opt{self-warning} option would normally be used in conjunction
+% with the \opt{error} option.
+% \begin{macrocode}
+\DeclareOption{self-warning}{%
+ \def\snap@selfcheck{%
+ \begingroup
+ \def\snap@mismatch{\snap@mismatch@warning}%
+ \snap@selfcheck@a
+ \endgroup
+ }
}
% \end{macrocode}
%
% \begin{macrocode}
-\ProcessOptions\par
+\ExecuteOptions{warning}
+\ProcessOptions\relax
% \end{macrocode}
%
% We need the following patch to make up for the fact that
@@ -510,54 +734,36 @@
v\ifx\@tempc\fmtname 2.e\else ?.?\fi
}%
\fi
+% \end{macrocode}
+% Ensure that files get recorded.
+% \begin{macrocode}
\listfiles
-\def\@dofilelist{%
- \snap@restore@extensions
- \ifx\rqv@list\@empty
- \else \rqv@compare@lists
- \fi
- \ifx\snap@write\typeout
- \else
- \newwrite\snap@out
- \immediate\openout\snap@out=\jobname.dep \relax
- \fi
- \snap@write{\string\RequireVersions\@charlb}%
% \end{macrocode}
-% Since the exact version number of \TeX{} is not normally accessible
-% from inside \latex/, we use a nominal date of 1990/03/25, which is
-% when version 3.0 of \fn{tex.web} was released by Knuth.
+%
% \begin{macrocode}
- \snap@write{\space\space *{application}{TeX}%
- \space\space\space\space\space{1990/03/25 v3.x}}%
- \@for\@currname:=\@filelist\do{%
- \filename@parse\@currname
+\def\snap@doit#1{%
+ \begingroup
+ \ifx\delimiter#1\delimiter
+ \else
+ \filename@parse{#1}%
+ \let\@tempd\@empty
\ifx\filename@ext\relax
- \def\@tempa{file}\def\@tempd{.tex}\def\filename@ext{tex}%
- \def\@tempb{~~~}%
+ \def\@tempa{file}\def\@tempb{~~~}%
\else\ifx\filename@ext\@pkgextension
- \def\@tempa{package}\let\@tempd\@empty
- \def\@tempb{}%
+ \def\@tempa{package}\let\@tempb\@empty
\else\ifx\filename@ext\@clsextension
- \def\@tempa{class}\let\@tempd\@empty
- \def\@tempb{~~}%
+ \def\@tempa{class}\def\@tempb{~~}%
\else\ifx\filename@ext\@fmtextension
- \def\@tempa{format}\let\@tempd\@empty
- \def\@tempb{~}%
+ \def\@tempa{format}\def\@tempb{~}%
\else\ifx\filename@ext\@tfmextension
- \def\@tempa{tfm}\let\@tempd\@empty
- \def\@tempb{~~~~}%
+ \def\@tempa{tfm}\def\@tempb{~~~~}%
\else
\def\@tempa{file}\edef\@tempd{.\filename@ext}%
\def\@tempb{~~~}%
\fi\fi\fi\fi\fi
\@xp\let\@xp\@tempe
- \csname ver@\filename@base.\filename@ext\endcsname
-% \end{macrocode}
-% If a file contains just \verb'\ProvidesFoo{xyz}' without \emph{any}
-% optional argument, then \cs{ver@xyz} ends up empty. Resetting it to
-% \cs{relax} is the easiest way to get the fallback version
-% number in that case also.
-% \begin{macrocode}
+ \csname ver@\filename@base %
+ \ifx\filename@ext\relax\else.\filename@ext\fi\endcsname
\ifx\@tempe\@empty \let\@tempe\relax \fi
\edef\@tempe{%
\ifx\@tempe\relax 0000/00/00 v0.0%
@@ -567,10 +773,91 @@
}%
\edef\@tempc{\filename@area\filename@base\@tempd}% full file name
\@xp\snap@pad\@tempc\space~~~~~~~~~~~~~~~~\@nil\@tempd
- \begingroup \let~\space
- \snap@write{\space\space *{\@tempa}\@tempb{\@tempc}\@tempd{\@tempe}}%
- \endgroup
+ \let~\space
+ \snap@write{\space\space *{\@tempa}\@tempb{\@tempc}\@tempd{\@tempe}}%
+ \fi
+ \aftergroup\snap@doit
+ \endgroup
+}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\snap@bracify#1#2,{%
+ \ifx\@empty#1\expandafter\@gobble\else {#1#2}\fi \snap@bracify
+}
+\def\snap@splitter@a{%
+ \iffalse{{\fi }}% close current file name, end definition
+ \xdef\specific@files{%
+ \iffalse}\fi
+ \specific@files
+ \expandafter\@gobble\string % discard one closing brace
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\snap@fdcheck#1{%
+ \ifx\delimiter#1\@xp\@gobble
+ \else\snap@fda#1\@empty.fd\@empty ?\@nil
+ \fi
+ \snap@fdcheck
+}
+\def\snap@fda#1.fd\@empty#2#3\@nil{%
+ \if ?#2%
+ \xdef\specific@files{\specific@files {#1}}%
+ \else
+ \xdef\general@files{\general@files {#1.fd}}%
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\general@files\@empty
+\let\specific@files\@empty
+% \end{macrocode}
+%
+% The \cn{SpecialInput} command is related to the \opt{packages-only}
+% option. Apart from some ad hoc handling for \fn{.fd} files that get
+% loaded on demand, all files that are input after
+% \verb'\begin{document}' are put into the specific-files list, and
+% all files before \verb'\begin{document}' go into the general-files
+% (packages-only) list. If there is a macro file for a book (say),
+% that contains definitions specific to that book, and that is loaded
+% in the preamble, loading it with \cs{SpecialInput} will cause it to
+% go in the specific-files list.
+% \begin{macrocode}
+\newcommand{\SpecialInput}[1]{%
+ \xdef\specific@files{\specific@files{#1}}%
+ \@@input#1\relax
+}
+% \end{macrocode}
+%
+% Our definition of \cs{@dofilelist} does not retain much resemblance
+% to the original in the \LaTeX{} kernel.
+% \begin{macrocode}
+\def\@dofilelist{%
+ \snap@restore@extensions
+ \xdef\general@files{\@xp\snap@bracify \@filelist \@empty,\@empty,}%
+ \let\snap@splitter\snap@splitter@a
+ \xdef\general@files{\general@files}%
+ \let\@tempa\specific@files \global\let\specific@files\@empty
+ \@xp\snap@fdcheck\@tempa{\delimiter}%
+ \ifx\rqv@list\@empty
+ \else \rqv@compare@lists
+ \fi
+ \ifx\snap@write\typeout
+ \else
+ \newwrite\snap@out
+ \immediate\openout\snap@out=\jobname.dep \relax
+ \fi
+ \snap@write{\string\RequireVersions\@charlb}%
+ \snap@write{\space\space *{application}%
+ \snapshotApplication
}%
+ \@xp\snap@doit\general@files{\delimiter\aftergroup\@gobble\@gobble}%
+ \ifx\specific@files\@empty
+ \else
+ \snap@specific
+ \fi
\snap@write{\@charrb}%
\ifx\snap@write\typeout
\else \immediate\closeout\snap@out
@@ -579,102 +866,86 @@
}%
% \end{macrocode}
%
+% \begin{macrocode}
+\def\snap@specific{%
+ \snap@write{ \space *{-------}{Document-specific files:}{----}}%
+ \@xp\snap@doit\specific@files{\delimiter\aftergroup\@gobble\@gobble}%
+}
+% \end{macrocode}
+%
% The \cs{rqv@compare@lists} function checks to see if any files
-% are found only in the RequireVersions list or only in
-% \cs{@filelist}. To see which files are only in \cs{@filelist}, we
-% map the \cs{rqv@condense} function across both lists, reinitializing
-% \cs{L} (used here as a scratch variable) in between. As a side
-% effect this leaves the desired file names in \cs{L}. Then the same
-% process with the order of the lists reversed tells us which ones
-% are only in \cs{rqv@list}.
-% \begin{macrocode}
-\def\rqv@condense#1,{%
- \if ,#1,%
+% are found only in the RequireVersions list or only in the
+% \cs{general@files} list.
+% \begin{macrocode}
+\def\rqv@condense#1{%
+ \@xp\ifx\csname ver@#1\endcsname\N
\else
- \@xp\ifx\csname ver@#1\endcsname\N
- \else
- \edef\L{\L,#1}%
- \@xp\let\csname ver@#1\endcsname=\N
- \fi
+ \edef\L{\L{#1}}%
+ \@xp\let\csname ver@#1\endcsname=\N
\fi
\rqv@condense
}
+\def\rqv@condend{\endcsname ?\fi
+ \@xp\@xp\@xp\@gobbletwo\csname @xp\iftrue}
% \end{macrocode}
%
% \begin{macrocode}
-\def\rqv@compare@lists{%
- \begingroup
- \def\N{1}\let\L=\@gobble
- \@xp\rqv@condense \rqv@list,TeX,{,\relax\@xp\@gobbletwo\@xp},%
- \ifx\L\@gobble\let\L\@empty\fi
- \let\rqv@list=\L
- \let\L=\@gobble
- \@xp\rqv@condense \@filelist,{,\relax\@xp\@gobbletwo\@xp},%
- \ifx\L\@gobble\let\L\@empty\fi
- \@for\@currname:=\L\do{%
- \snap@mismatch{snapshot}{^^J%
- File \@currname\space loaded though not in
- \noexpand\RequireVersions list%
- }\@ehc
- }%
- \def\N{2}\let\L=\@gobble
- \@xp\rqv@condense\@filelist,TeX,{,\relax\@xp\@gobbletwo\@xp},%
- \let\L=\@gobble
- \@xp\rqv@condense\rqv@list,{,\relax\@xp\@gobbletwo\@xp},%
- \ifx\L\@gobble\let\L\@empty\fi
- \@for\@currname:=\L\do{%
- \snap@mismatch{snapshot}{^^J%
- File \@currname\space [\csname rqv@\@currname\endcsname]
- required but not loaded%
- }\@ehc
- }%
- \endgroup
+\def\rqv@overloaded#1{%
+ \snap@mismatch{snapshot}{^^J%
+ File #1 loaded though not in \noexpand\RequireVersions list%
+ }\@ehc
}
% \end{macrocode}
%
-% See the documentation above for the `test' option.
% \begin{macrocode}
-\begingroup \catcode\endlinechar=12\relax %
-\long\gdef\snap@ignoline#1
-{}\endgroup %
+\def\rqv@notloaded#1{%
+ \snap@mismatch{snapshot}{^^J%
+ File #1 [\csname rqv@#1\endcsname] required but not loaded%
+ }\@ehc
+}
% \end{macrocode}
%
% \begin{macrocode}
-\def\snap@fake@input#1#2#3#4{%
- \ifx#1\snapx@end
- \aftergroup\@@end \@xp\@gobblefour
- \else
- \ifx#1\snapx@format
- \else
- \message{^^J}%
- \@xp\snap@fake@b\@@input #3#1\relax
- \fi
- \fi
- \@ifnextchar *\snap@store@version\snap@store@error
-}
+\def\rqv@set#1{\@xp\let\csname ver@#1\endcsname\N \rqv@set}
+\def\rqv@test#1{\csname ver@#1\endcsname{#1}\rqv@test}
% \end{macrocode}
%
% \begin{macrocode}
-\newcommand{\rqvTest}[2][]{%
- \begingroup \catcode\endlinechar=12
- \catcode`\%=12 \catcode`\{=12 \catcode`\}=12\relax
+\def\rqv@compare@lists{%
+ \begingroup
% \end{macrocode}
-% Since \cs{snap@fake@input} just compares \cs{snapx@foo} with
-% \cs{ifx}, making \cs{snapx@application}
-% and \cs{snapx@tfm} compare equal to \cs{snap@format}
-% ensures that only one comparison is needed to tell if
-% we shouldn't attempt to input the current file type.
+% Clear up duplicate file names (just in case) to avoid redundant
+% warning messages. This should seldom be necessary in practice.
% \begin{macrocode}
- \let\snapx@application=\snapx@format \let\snapx@tfm=\snap@format
- \@ifnextchar *\snap@store@version\snap@store@error#2*{end}{}{}%
- \endgroup
-}
+ \def\N{1}\let\L\@empty
+ \@xp\rqv@condense\rqv@list\rqv@condend
+ \global\let\rqv@list=\L
+ \def\N{2}\let\L\@empty
+ \@xp\rqv@condense\general@files\rqv@condend
+ \global\let\general@files=\L
% \end{macrocode}
-%
+% Let's make a shorthand for the code that terminates our recursion.
% \begin{macrocode}
-\@ifundefined{snap@fake@b}{}{%
- \let\snap@store@b\snap@fake@input
- \let\RequireVersions\rqvTest
+ \def\T{\@firstoftwo{\endcsname\@empty\@gobbletwo}}%
+% \end{macrocode}
+% Set all the loaded general files to an error function.
+% \begin{macrocode}
+ \let\N\rqv@overloaded \@xp\rqv@set\general@files \T
+% \end{macrocode}
+% Set all the required files to an ignore function.
+% \begin{macrocode}
+ \let\N\@gobble \@xp\rqv@set\rqv@list \T
+% \end{macrocode}
+% Execute all the general files.
+% \begin{macrocode}
+ \@xp\rqv@test\general@files{\endcsname\csname @gobbletwo}%
+% \end{macrocode}
+% And now do essentially the same thing in the reverse direction.
+% \begin{macrocode}
+ \let\N\rqv@notloaded \@xp\rqv@set\rqv@list \T
+ \let\N\@gobble \@xp\rqv@set\general@files \T
+ \@xp\rqv@test\rqv@list{\endcsname\csname @gobbletwo}%
+ \endgroup
}
% \end{macrocode}
%
@@ -694,24 +965,94 @@
}
% \end{macrocode}
%
-% Terminate here without touching \LaTeX{} internals, unless
-% one of the relevant snapshot options was chosen.
+% Because \cs{ProvidesFile} is used in \fn{.fd} files which are
+% normally read with special catcodes, there tend to
+% be problems with whitespace characters being erroneously lost from
+% the second argument. Since we have to put in a \cs{snap@check} call
+% anyway, while we're at it let's fix a bug of this type that
+% affected some older versions of \latex/.
% \begin{macrocode}
-\let\snap@compare@versions\@gobble \let\snap@check\@gobble
-\let\snap@selfcheck\@gobble \let\snap@selfcheck@a\@gobble
-\ifx\snap@select\@empty \endinput \fi
+\def\ProvidesFile#1{%
+ \def\snap@checker{\snap@check{#1}}%
+ \begingroup
+ \aftergroup\snap@checker
+ \catcode`\ 10
+% \end{macrocode}
+% Added guards from 2001/06/01 version of \latex/. These are
+% necessary because, for example, \pkg{inputenc} sets
+% \cs{endlinechar} to a large (nonvalid character) value when
+% reading input encoding files. The guards prevent an ``invalid
+% character'' error.
+% \begin{macrocode}
+ \ifnum\endlinechar < 256
+ \ifnum \endlinechar>\m@ne
+ \catcode\endlinechar 10
+ \fi
+ \fi
+ \@makeother\/%
+ \@makeother\&%
+ \kernel@ifnextchar[{\snap@providesfile{#1}}{\snap@providesfile{#1}[]}%
+}
+% \end{macrocode}
+%
+% Normally the string found in the second arg of \cs{ProvidesFile}
+% (for a nongraphics file) would begin with the usual date string.
+% The \cs{includegraphics} command, however, begins the second arg
+% with \texttt{Graphic file} instead. This test therefore just checks
+% if the first two letters are \texttt{Gr}; this is enough,
+% ordinarily, for us to conclude that we are dealing with a graphic
+% file.
+% \begin{macrocode}
+\def\snap@graphic@test#1#2#3\@nil{r\if G#1#2\else X\fi}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\snap@providesfile#1[#2]{%
+ \wlog{File: #1 #2}%
+ \if\snap@graphic@test#2@@\@nil
+ \snap@record@graphic#1\relax #2 (type ??)\@nil
+ \else
+ \expandafter\xdef\csname ver@#1\endcsname{#2}%
+ \fi
+ \endgroup
+}
+% \end{macrocode}
+%
+% This is what \cn{includegraphics} does to record graphic file
+% information.
+%\begin{verbatim}
+%\@providesfile #1[#2]->
+%\wlog {File: #1 #2}\expandafter \xdef \csname ver@#1\endcsname {#2}
+%\endgroup
+%#1<-\Gin@base \Gin@ext
+%#2<-Graphic file (type eps)
+%\end{verbatim}
+%
+% Check the graphics info.
+% \begin{macrocode}
+\def\snap@record@graphic#1\relax #2(type #3)#4\@nil{%
+ \expandafter\xdef\csname ver@#1\endcsname{%
+ Graphic%
+ \if\snap@bbinfo :bb=\Gin@llx/\Gin@lly/\Gin@urx/\Gin@ury\fi
+ \space v0.0%
+ }%
+}
% \end{macrocode}
%
% \begin{macrocode}
-\begingroup \catcode`\.=11\relax
-\gdef\snap@selfcheck@b#1\rqv@snapshot.sty#2#3\@nil{T#2}
-\gdef\snap@selfcheck@a#1{%
- \if\@xp\snap@selfcheck@b\csname rqv@#1\endcsname T%
- \rqv@snapshot.sty F\@nil
- \snap@check{#1}%
+\def\@pr@videpackage [#1]{%
+ \expandafter\xdef\csname ver@\@currname.\@currext\endcsname{#1}%
+ \ifx\@currext\@clsextension
+ \typeout{Document Class: \@gtempa\space#1}%
+ \else
+ \wlog{Package: \@gtempa\space#1}%
\fi
+ \snap@check{\@currname.\@currext}%
}
-\endgroup
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\snap@selfcheck@a{\snap@check{snapshot.sty}}
% \end{macrocode}
%
% \begin{macrocode}
@@ -747,61 +1088,210 @@
\fi
}%
\endgroup
+% \end{macrocode}
+% When the \opt{test} option is in effect, jump out of the current
+% file instead of continuing.
+% \begin{macrocode}
+ \snap@test@abort
}
% \end{macrocode}
%
-% Because \cs{ProvidesFile} is used in \fn{.fd} files which are
-% normally read with special catcodes, there tend to
-% be problems with whitespace characters being erroneously lost from
-% the second argument. Since we have to put in a \cs{snap@check} call
-% anyway, while we're at it let's fix a bug of this type that
-% affected some older versions of \latex/.
% \begin{macrocode}
-\def\ProvidesFile#1{%
- \def\snap@checker{\snap@check{#1}}%
- \begingroup
- \aftergroup\snap@checker
- \catcode`\ 10\catcode\endlinechar 10 %
- \@makeother\/%
- \@makeother\&%
- \@ifnextchar[{\@providesfile{#1}}{\@providesfile{#1}[]}%
+\let\snap@test@abort=\@empty
+% \end{macrocode}
+%
+% \section{Compatibility}
+%
+% Suppose that I have a \lat/ document containing a
+% \cs{RequireVersions} statement generated by \pkg{snapshot} and I
+% send this to my colleague who, we believe, has a \lat/ setup that
+% is for our purposes identical. Suppose that our belief is erroneous
+% in the following way: My colleague has a newer version of
+% \pkg{snapshot} and a newer version of one of the affected files.
+%
+% Here is what we \strong{don't} want to happen: That the differing
+% version of snapshot would cause the other differing file to be
+% accepted without demur.
+%
+% Conversely, if it is I who have the newer version of
+% \pkg{snapshot}, the main concern is that some difference in the
+% contents of the \cs{RequireVersions} statement would lead to an
+% error when my colleague attempts to process the document.
+%
+% \section{In conclusion}
+%
+% \begin{macrocode}
+\ifx\snap@select\@empty
+ \let\snap@compare@versions\@gobble
+ \let\snap@check\@gobble
+\fi
+% \end{macrocode}
+%
+% Fallback for a command that is sometimes used in AMS journal
+% production.
+% \begin{macrocode}
+\providecommand{\controldates}[1]{}
+% \end{macrocode}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{And finally \dots}\label{test}
+%
+% If the embedded \cs{RequireVersions}
+% data in a \lat/ document is extracted to a separate file, and
+%\begin{verbatim}
+%\RequirePackage[test]{snapshot}
+%\end{verbatim}
+% is added at the top, then the file can be run as a small separate
+% \LaTeX{} job that will, among other things, produce in the log file
+% a nice list of fully resolved file names\mdash sort of a limited,
+% but system-independent variant of the \fn{kpsewhich} idea.
+% \begin{macrocode}
+\ifx\snap@intest\@gobbletwo \endinput \fi
+% \end{macrocode}
+%
+% Some old, ill-behaved packages might throw in a \cs{makeatother} at
+% the end which can cause problems for the next file that comes along
+% when testing.
+% \begin{macrocode}
+\def\restore@some@catcodes{}
+\def\save@some@catcodes{%
+ \edef\restore@some@catcodes{%
+ \catcode\number`\@=\number\catcode`\@
+ \catcode\number`\"=\number\catcode`\"
+ \catcode\number`\^=\number\catcode`\^
+ \catcode\number`\_=\number\catcode`\_
+ \relax
+ }%
}
% \end{macrocode}
%
+% Some typical calls of \cs{snap@intest}:
+%\begin{verbatim}
+% \snap@intest{LaTeX2e}{\snapx@format}
+% \snap@intest{snapshot}{\snapx@package}
+% \snap@intest{mcom-l}{\snapx@class}
+% \snap@intest{amsmath}{\snapx@package}
+% \snap@intest{umsa.fd}{\snapx@file}
+% \snap@intest{pictex}{\snapx@file}
+%\end{verbatim}
+%
+% The extant public versions of the following files (in the teTeX
+% distribution, at least) are known to be problematic when we are
+% trying to read a \cs{ProvidesWhatever} line from the top of the
+% file: psfig.sty, pictex.sty, pictex.tex, epic.sty, amstex.sty,
+% xy.tex. Either (a) they don't have a \cs{ProvidesWhatever} line at
+% all, or (b) they include some code before the \cs{ProvidesWhatever}
+% line that makes some assumption true in normal processing but false
+% in snapshot-test processing. E.g., there is code in \fn{amstex.sty}
+% that assumes \cs{documentstyle} or \cs{documentclass} was already
+% executed and that the \cs{if@compatibility} switch got set
+% accordingly.
+%
% \begin{macrocode}
-\def\@pr@videpackage[#1]{%
- \expandafter\xdef\csname ver@\@currname.\@currext\endcsname{#1}%
- \ifx\@currext\@clsextension
- \typeout{Document Class: \@gtempa\space#1}%
+\def\snap@intest#1#2{%
+ \message{^^J}%
+ \begingroup \edef\0{#1#2}\def\9{latex209.def}%
+ \ifx\0\9\global\@compatibilitytrue \fi
+ \ifx#2\snapx@format
+% \end{macrocode}
+% If arg1 + arg2 = ``LaTeX2e.fmt'', the calling function
+% \cs{snap@storeb} will run \cs{snap@check} separately.
+% This is a crude way of making things work in that case without
+% much extra trouble.
+% \begin{macrocode}
+ \def\snap@test@abort{\endgroup}%
\else
- \wlog{Package: \@gtempa\space#1}%
+ \edef\N{%
+ \noexpand\snap@intest@b{#1#2}%
+ {#1}{\@xp\@gobble#2\@empty}%
+ {\csname rqv@#1#2\endcsname}}%
+ \expandafter\endgroup\N
\fi
- \snap@check{\@currname.\@currext}%
}
% \end{macrocode}
%
-% The usual \cs{endinput} to ensure that random garbage at the end of
-% the file doesn't get copied by \fn{docstrip}.
% \begin{macrocode}
-\endinput
+\def\snap@intest@b#1#2#3#4{%
+ \def\@currname{#2}\def\@currext{#3}%
+ \begingroup \lccode`\/=`\0\relax\lowercase{\endgroup
+ \ifnum\snap@seldate#4 00 0\@nil>\z@
+ }% matches \lowercase
+ \save@some@catcodes
+ \@@input #1 \relax
+ \restore@some@catcodes
+ \else
+ \snap@specialtest{#1}{#4}%
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\snap@specialtest#1#2{%
+ \fake@input{#1}%
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\fake@input#1{%
+ \begingroup
+ % Ensure that outer \foo or unmatched braces don't trip us up
+ \catcode`\\=12 \catcode`\{=12 \catcode`\}=12
+ \endinput
+% \end{macrocode}
+% Note that these definitions of \cs{G} and \cs{?} are local, and
+% recall that one-letter cs names don't use up hash table entries.
+% \begin{macrocode}
+ \def\G{\@car\endgroup}%
+ \expandafter\futurelet\expandafter\?\expandafter\G\@@input#1 \relax\@nil
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\snap@test@abort=\endinput
+\let\snap@selfcheck=\@empty
% \end{macrocode}
%
-% \section*{To Do}
+% There's an extra close-brace left hanging around at the end, but I
+% guess we don't care.
+% \begin{macrocode}
+\def\snap@finish{%%
+ \endgroup \message{^^J}%
+ \def\X##1{##1,\X}%
+ \edef\@filelist{\@xp\X\rqv@list{\@gobbletwo}}%
+ \def\X##1,?{##1}\edef\@filelist{\@xp\X\@filelist ?}%
+ \@dofilelist
+ \@@end
+}%
+% \end{macrocode}
%
-% \begin{itemize}
-% \item Provide a test to distinguish between shared-use files and
-% document-specific files? Document-specific files would be things
-% like graphics files loaded via \cs{includegraphics} or book
-% chapters loaded via \cs{include}. But there might also be something
-% like \verb'\input{my-book-macros}' in the preamble. Maybe authors
-% should be encouraged to put this after \verb'\begin{document}'? Or,
-% even, after \verb'\begin{abstract}' so that the abstract will
-% contain only lowest-common-denominator \LaTeX{} commands?
+% \begin{macrocode}
+\def\snap@mismatch#1#2#3{}
+% \end{macrocode}
%
-% The non-document-specific files most commonly loaded after
-% \verb'\begin{document}' would be \fn{.fd} files, but there is also
-% the possibility of autoloaded stuff (\fn{alatex} format).
-% \end{itemize}
+% Problematic: xy.sty, because it calls xy.tex before it calls
+% \cs{ProvidesPackage}. And pictex.tex because it doesnt use
+% \cs{ProvidesFile} at all.
+% \begin{macrocode}
+\renewcommand{\RequireVersions}[2][]{%
+ \begingroup
+ \makeatletter
+ \def\snap@check{\snap@compare@versions}%%
+ \let\snapx@tfm=\snap@ignore
+% \end{macrocode}
+% This seems to help, with english.ldf for example, to prevent an
+% endless loop when attempting to load babel.def.
+% \begin{macrocode}
+ \def\ProvidesLanguage##1{\ProvidesFile{##1.ldf}}%
+ \iffalse{\fi \futurelet\@let@token\snap@branch #2}%
+ \endgroup
+}
+% \end{macrocode}
+%
+% The usual \cs{endinput} to ensure that random garbage at the end of
+% the file doesn't get copied by \fn{docstrip}.
+% \begin{macrocode}
+\endinput
+% \end{macrocode}
%
-% \CheckSum{777}
+% \CheckSum{1209}
% \Finale