% \iffalse meta-comment
%
% Copyright 1993 1994 1995 1996 1997 1998 1999
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
% This file is part of the LaTeX2e system.
% ----------------------------------------
%
% It may be distributed under the terms of the LaTeX Project Public
% License, as described in lppl.txt in the base LaTeX distribution.
% Either version 1.0 or, at your option, any later version.
%
% \fi
%
% \iffalse
%%% From File: ltfiles.dtx
%<*driver>
% \fi
\ProvidesFile{ltfiles.dtx}
[1997/10/06 v1.1l LaTeX Kernel (File Handling)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltfiles.dtx}
\title{\filename}
\date{\filedate}
\author{%
Johannes Braams\and
David Carlisle\and
Alan Jeffrey\and
Leslie Lamport\and
Frank Mittelbach\and
Chris Rowley\and
Rainer Sch\"opf}
\begin{document}
\maketitle
\DocInput{\filename}
\end{document}
%</driver>
% \fi
%
% \CheckSum{572}
%
% \changes{v1.0h}{1994/05/21}{Use new error commands}
% \changes{v1.0n}{1994/11/17}
% {\cs{@tempa} to \cs{reserved@a}}
% \changes{v1.0u}{1995/07/13}{Updates to docu}
%
% \section{File Handling}
%
% The following user commands are defined in this part:
%
% \DescribeMacro{\document} (ie |\begin{document}|)\\
% Reads in the .AUX files and |\catcode|'s |@| to 12.
%
% \DescribeMacro{\nofiles}\\
% Suppresses all file output by setting |\@filesw| false.
%
% \DescribeMacro{\includeonly}\marg{NAME1, ... ,NAMEn}\\
% Causes only parts NAME1, ... ,NAMEn to be read by
% their |\include| commands. Works by setting \@partsw true
% and setting |\@partlist| to NAME1, ... ,NAMEn.
%
% \DescribeMacro{\include}\marg{NAME}\\
% Does an |\input| NAME unless |\@partsw| is true and
% NAME is not in |\@partlist|. If |\@filesw| is true, then
% it directs .AUX output to NAME.AUX, including a
% checkpoint at the end.
%
% \DescribeMacro{\input}\marg{NAME}\\
% The same as TeX's |\input|, except it allows optional
% braces around the file name. In \LaTeXe, it also avoids
% the primitive `missing file' error, if the file can not be
% found.
%
% \DescribeMacro{\IfFileExists}\marg{NAME}\marg{then}\marg{else}\\
% If the file exists on the system, execute \emph{then} otherwise
% execute \emph{else}.
%
% \DescribeMacro{\InputIfFileExists}\marg{NAME}\marg{then}\marg{else}\\
% If the file exists on the system, execute \emph{then} and input
% \emph{NAME} otherwise execute \emph{else}.
%
% \StopEventually{}
%
% \changes{v1.0a}{1994/03/07}{Initial version, split from latex.dtx}
% \changes{v1.0a}{1994/03/07}{Long lines wrapped to 72 columns}
%
% \begin{oldcomments}
%
% \begin{macrocode}
%<*2ekernel|autoload>
\message{files,}
% \end{macrocode}
%
% VARIABLES, SWITCHES AND INTERNAL COMMANDS:
% \@mainaux : Output file number for main .AUX file.
% \@partaux : Output file number for current part's .AUX file.
% \@auxout : Either \@mainout or \@partout, depending on
% which .AUX file output goes to.
% \@input{foo} : If file foo exists, then \input's it,
% otherwise types a warning message.
% @filesw : Switch -- set false if no .AUX, .TOC, .IDX etc
% files are to be written
% @partsw : Set true by a \includeonly command.
% \@partlist : Set to the argument of the \includeonly command.
%
% \cp@FOO : The checkpoint for \include'd file FOO.TEX, written
% by \@writeckpt at the end of file FOO.AUX
%
%
% \includeonly{FILELIST} ==
% BEGIN
% \@partsw := T
% \@partlist := FILELIST
% END
%
% \include{FILE} ==
% BEGIN
% \clearpage
% if \@filesw = T
% then \immediate\write\@mainaux{\string\@input{FILE.AUX}}
% fi
% if \@partsw = T
% then \@tempswa := F
% \reserved@b == FILE
% for \reserved@a := \@partlist
% do if eval(\reserved@a) = eval(\reserved@b)
% then \@tempswa := T fi
% od
% fi
%
% if \@tempswa = T
% then \@auxout := \@partaux
% if \@filesw = T
% then \immediate\openout\@partaux{FILE.AUX}
% \immediate\write\@partaux{\relax}
% fi
% \@input{FILE.TEX}
% \clearpage
% \@writeckpt{FILE}
% if @filesw then \closeout \@partaux fi
% \@auxout := \@mainaux
% else \cp@FILE
% fi
% END
%
% \@writeckpt{FILE} ==
% BEGIN
% if \@filesw = T
% \immediate\write on file \@partaux:
% \@setckpt{FILE}{ %% }
% for \reserved@a := \cl@@ckpt
% do \immediate\write on file \@partaux:
% \global\string\setcounter
% {eval(\reserved@a)}{eval(\c@eval(\reserved@a))}
% od %% {
% \immediate\write on file \@partaux: }
% fi
% END
%
% \@setckpt{FILE}{LIST} ==
% BEGIN
% G \cp@FILE := LIST
% END
%
% INITIALIZATION
% \@tempswa := T
%
% \end{oldcomments}
%
%
% \task{???}{Do we use @unused or mainaux?}
% \begin{macro}{\@inputcheck}
% \begin{macro}{\@unused}
% Allocate read stream for testing and output stream.
% \changes{v1.0l}{1994/11/07}
% {move here from ltdefns, remove duplicate \cs{@mainaux}}
% \begin{macrocode}
\newread\@inputcheck
\newwrite\@unused
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@mainaux}
% \begin{macro}{\@partaux}
% \begin{macrocode}
\newwrite\@mainaux
\newwrite\@partaux
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\if@filesw}
% \begin{macro}{\if@partsw}
% \begin{macrocode}
\newif\if@filesw \@fileswtrue
\newif\if@partsw \@partswfalse
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@clubpenalty}
% This stores the current normal (non-infinite) value of
% \cs{clubpenalty}; it should therefore be reset whenever the
% normal value is changed (as in the bibliography in the standard
% styles).
% \changes{v1.1h}{1996/10/05}{Added setting its value}
% \begin{macrocode}
\newcount\@clubpenalty
\@clubpenalty \clubpenalty
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\document}
% \changes{v0.9e}{1993/12/09}{Hook added}
% Cancel the |\begingroup| from |\begin|
% \begin{macrocode}
\def\document{\endgroup
% \end{macrocode}
% If some options on |\documentclass| haven't been used by any
% package we will now give a warning since this is most certainly a
% misspelling.
% \begin{macrocode}
\ifx\@unusedoptionlist\@empty\else
\@latex@warning@no@line{Unused global option(s):^^J%
\@spaces[\@unusedoptionlist]}%
\fi
\@colht\textheight
\@colroom\textheight \vsize\textheight
\columnwidth\textwidth
\@clubpenalty\clubpenalty
\if@twocolumn
\advance\columnwidth -\columnsep
\divide\columnwidth\tw@ \hsize\columnwidth \@firstcolumntrue
\fi
\hsize\columnwidth \linewidth\hsize
\begingroup\@floatplacement\@dblfloatplacement
\makeatletter\let\@writefile\@gobbletwo
% \end{macrocode}
% \changes{v1.1a}{1995/10/24}
% {Removed multiplelabels switch}
% \begin{macrocode}
\global \let \@multiplelabels \relax
\@input{\jobname.aux}%
\endgroup
\if@filesw
\immediate\openout\@mainaux\jobname.aux
\immediate\write\@mainaux{\relax}%
\fi
% \end{macrocode}
%
% Dateline 1991/03/26: FMi added |\process@table| to support NFSS;
% This will also work with old lfonts if no other style defines
% |\process@table|. The following line forces the initialization of
% the math fonts.
% \begin{macrocode}
\process@table
\let\glb@currsize\@empty %% Force math initialization.
% \end{macrocode}
% \changes{v0.9t}{1994/01/31}
% {set \cs{@normalsize} or \cs{normalsize} if necessary}
% \changes{v1.0d}{1994/03/28}
% {(DPC) remove \cs{@normalsize check}}
% \changes{v1.0d}{1994/03/28}
% {(DPC) Use \cs{normalsize} not \cs{@normalsize}}
% \changes{v1.0g}{1994/05/13}{Added execution of \cs{every@size}}
% \changes{v1.0m}{1994/11/07}{Renamed \cs{every@size} to
% \cs{every@math@size}.}
% \changes{v1.0q}{1995/04/25}
% {Removed execution of \cs{every@size} latex/1407}
% \begin{macrocode}
\normalsize
\everypar{}%
% \end{macrocode}
%
% So that punctuation in headings is not disturbed by verbatim
% or other local changes to the space factor codes, save the document
% default here. This will be locally reset by the output routine.
% For special cases a class may want to define |\normalsfcodes|
% directly, in case that definition will be used.
% (This is an old bug, problem existed in \LaTeX2.0x and plain \TeX.)
% \changes{v1.1k}{1997/04/14}
% {Set the document space factor defaults. latex/2404}
% \begin{macrocode}
\ifx\normalsfcodes\@empty
\ifnum\sfcode`\.=\@m
\let\normalsfcodes\frenchspacing
\else
\let\normalsfcodes\nonfrenchspacing
\fi
\fi
% \end{macrocode}
% Way back in 1991 (08/26) FMi \& RmS set the |\@noskipsec| switch
% to true in the preamble and to false here.
% This was done to trap lists and related text in the preamble but it
% does not catch everything; hence Change 1.1g was introduced.
% \begin{macrocode}
\@noskipsecfalse
% \end{macrocode}
% \changes{v1.1a}{1995/10/24}
% {Removed refundefined switch}
% \begin{macrocode}
\let \@refundefined \relax
% \end{macrocode}
% Just before disabling the preamble commands we execute the begin
% document hook which contains any code contributed by
% |\AtBeginDocument|. Also disable the gathering of the file list,
% if no |\listfiles| has been issued. |\AtBeginDocument| is redefined
% at this point so that and such commands that get into the hook do
% not chase their tail\ldots
% \changes{v1.1e}{1996/04/24}
% {(DPC) Reset \cs{AtBeginDocument} eg for latex/1297}
% \begin{macrocode}
\let\AtBeginDocument\@firstofone
\@begindocumenthook
% \end{macrocode}
% Most of the following assignments will be done globally in case
% the user adds something like |\begin{multicols}| to the document
% hook, i.e. starts are group in |\begin{document}|.
% \changes{v1.0r}{1995/04/27}
% {Added \cs{global} to support groups in hook}
% \changes{v1.0c}{1994/03/16}
% {(DPC) directly add file list settings}
% \changes{v1.0v}{1995/08/16}{set \cs{topskip} globally}
% \changes{v1.0v}{1995/08/16}{set \cs{@maxdepth}}
%
% \changes{v1.0s}{1995/05/25}
% {Added check for \cs{topskip} zero}
% \changes{v1.0t}{1995/05/25}
% {Corrected typo}
% Since a value of exactly 0pt for \cs{topskip} causes
% \cs{twocolumn[]} to misbehave, we add this check, hoping
% that it will not cause any problems elsewhere.
% \begin{macrocode}
\ifdim\topskip<1sp\global\topskip 1sp\relax\fi
\global\@maxdepth\maxdepth
\global\let\@begindocumenthook\@undefined
\ifx\@listfiles\@undefined
\global\let\@filelist\relax
\global\let\@addtofilelist\@gobble
\fi
% \end{macrocode}
% At the very end we disable all preamble commands. This has to
% happen after the begin document hooks was executed so that this
% hook can still use such commands.
% \changes{v0.9o}{1994/01/15}
% {move \cs{@preamblecmds} after document hook}
% \changes{v1.0v}{1995/08/16}{set \cs{do} globally}
% \begin{macrocode}
\gdef\do##1{\global\let ##1\@notprerr}%
\@preamblecmds
% \end{macrocode}
% The next line saves tokens and also allows |\@nodocument| to be
% used directly to trap preamble errors.
% \changes{v1.1g}{1996/09/29}{Added disabling of \cs{@nodocument}}
% \begin{macrocode}
\global\let \@nodocument \relax
% \end{macrocode}
% The next line is a pure safety measure in case a do list is ever
% expanded at the wrong place. In addition it will save a few
% tokens to get rid of the above definition.
% \begin{macrocode}
\global\let\do\noexpand
% \end{macrocode}
% \changes{v1.1c}{1995/12/05}{\cs{ignorespaces} added for latex/1933}
% Use of |\AtBeginDocument| hook might mean that we are already in
% horizontal mode, so ignore the space after |\begin{document}|.
% \begin{macrocode}
\ignorespaces}
% \end{macrocode}
%
% \begin{macrocode}
\@onlypreamble\document
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\normalsfcodes}
% \changes{v1.1k}{1997/04/14}
% {Macro added (from patch file) latex/2404}
% The setting of |\@empty| is just a flag. This command may be defined
% in a class or package file. If it is still |\@empty| at
% |\begin{document}| it will be defined to be |\frenchspacing| or
% |\nonfrenchspacing|, depending on which of those appears to be in
% effect at that point.
% \begin{macrocode}
\let\normalsfcodes\@empty
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\nofiles}
% \changes{v1.0k}{1994/11/04}
% {Added setting of \cs{protected@write},
% \cs{makeindex} and \cs{makeglossary} to \cs{nofiles}. ASAJ.}
% \changes{v1.0o}{1994/11/30}
% {There is no \cs{@gobblethree}\ldots}
% \changes{v1.0t}{1995/05/25}
% {(CAR) added \cs{long}}
% \changes{v1.1f}{1996/05/17}
% {added \cs{write} to \cs{protected@write} for latex/2146}
% Set |\@fileswfalse| which suppresses the places where \LaTeX\ makes
% |\immediate| writes. The |\makeindex| and |\makeglossary| are
% disabled. |\protected@write| is redefined not to write to the file
% specified, but rather to write a blank line to the log file. This
% ensures that a \meta{whatsit} node is still created, and so spacing
% is not affected by the |\nofiles| command; to ensure this more
% generally, the |\if@nobreak| test is needed.
% \changes{v1.1i}{1996/11/05}
% {Standard \cs{if@nobreak} test added}
% \begin{macrocode}
\def\nofiles{%
\@fileswfalse
\typeout{No auxiliary output files.^^J}%
\long\def\protected@write##1##2##3%
{\write\m@ne{}\if@nobreak\ifvmode\nobreak\fi\fi}%
\let\makeindex\relax
\let\makeglossary\relax}
\@onlypreamble\nofiles
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\protected@write}
% This takes three arguments: an output stream, some initialization
% code, and some text to write. It then writes this, with
% appropriate handling of |\protect| and |\thepage|.
% \changes{v1.0k}{1994/11/04}{Macro added ASAJ.}
% \changes{v1.0t}{1995/05/25}
% {(CAR) added \cs{long}}
% \begin{macrocode}
\long\def \protected@write#1#2#3{%
\begingroup
\let\thepage\relax
#2%
\let\protect\@unexpandable@protect
\edef\reserved@a{\write#1{#3}}%
\reserved@a
\endgroup
\if@nobreak\ifvmode\nobreak\fi\fi
}
% \end{macrocode}
% \end{macro}
%
% \begin{macrocode}
\let\@auxout=\@mainaux
% \end{macrocode}
%
%
% \begin{macro}{\includeonly}
% \changes{v1.0p}{1995/04/22}{Allow blanks in argument}
% \begin{macrocode}
\def\includeonly#1{%
\@partswtrue
\edef\@partlist{\zap@space#1 \@empty}}
\@onlypreamble\includeonly
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\include}
% \changes{v0.9p}{1994/01/18}
% {Use \cs{@input@} so include files are listed.}
% In the definition of |\include|, |\def\reserved@b| changed to
% |\edef\reserved@b| to be consistent with the |\edef| in
% |\includeonly|.
% (Suggested by Rainer Sch\"opf \& Frank Mittelbach.
% Change made 20 Jul 88.)
%
% Changed definition of |\include| to allow space at end of file name
% --- otherwise, typing |\include{foo }| would cause \LaTeX\ to
% overwrite |foo.tex|. Change made 24 May 89, suggested by Rainer
% Sch\"opf and Frank Mittelbach
%
% Made |\include| check for being used inside an |\include|'d file, as
% this will not work and cause surprising results.
% \begin{macrocode}
\def\include#1{\relax
\ifnum\@auxout=\@partaux
\@latex@error{\string\include\space cannot be nested}\@eha
\else \@include#1 \fi}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@include}
% \begin{macrocode}
\def\@include#1 {%
\clearpage
\if@filesw
\immediate\write\@mainaux{\string\@input{#1.aux}}%
\fi
\@tempswatrue
\if@partsw
\@tempswafalse
\edef\reserved@b{#1}%
\@for\reserved@a:=\@partlist\do
{\ifx\reserved@a\reserved@b\@tempswatrue\fi}%
\fi
\if@tempswa
\let\@auxout\@partaux
\if@filesw
\immediate\openout\@partaux #1.aux
\immediate\write\@partaux{\relax}%
\fi
\@input@{#1.tex}%
\clearpage
\@writeckpt{#1}%
\if@filesw
\immediate\closeout\@partaux
\fi
\else
% \end{macrocode}
% If the file is not included, reset |\deadcycles|, so that a long
% list of non-included files does not generate an `Output loop'
% error.
% \changes{v1.1j}{1997/01/08}{reset \cs{deadcycles} latex/2365}
% \begin{macrocode}
\deadcycles\z@
\@nameuse{cp@#1}%
\fi
\let\@auxout\@mainaux}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@writeckpt}
% \begin{macrocode}
\def\@writeckpt#1{%
\if@filesw
\immediate\write\@partaux{\string\@setckpt{#1}\@charlb}%
{\let\@elt\@wckptelt \cl@@ckpt}%
\immediate\write\@partaux{\@charrb}%
\fi}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@wckptelt}
% \begin{macrocode}
\def\@wckptelt#1{%
\immediate\write\@partaux{%
\string\setcounter{#1}{\the\@nameuse{c@#1}}}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@setckpt}
% RmS 93/08/31: introduced |\@setckpt|
% \begin{macrocode}
\def\@setckpt#1{\global\@namedef{cp@#1}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@charlb}
% \begin{macro}{\@charrb}
% The following defines |\@charlb| and |\@charrb| to be |{| and |}|,
% respectively with |\catcode| 11.
% \begin{macrocode}
{\catcode`[=1 \catcode`]=2
\catcode`{=11 \catcode`}=11
\gdef\@charlb[{]
\gdef\@charrb[}]
]% }brace matching
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
% \subsection{Safe Input Macros}
%
% \begin{macro}{\IfFileExists}
% \changes{v0.9b}{1993/12/04}{Macro added}
% \changes{v0.9p}{1994/01/18}{New Definition}
% \changes{v1.0t}{1995/05/25}
% {(CAR) added \cs{long}}
%
% \begin{macrocode}
\long\def \IfFileExists#1#2#3{%
\openin\@inputcheck#1 %
\ifeof\@inputcheck
\ifx\input@path\@undefined
\def\reserved@a{#3}%
\else
\def\reserved@a{\@iffileonpath{#1}{#2}{#3}}%
\fi
\else
\closein\@inputcheck
\edef\@filef@und{#1 }%
\def\reserved@a{#2}%
\fi
\reserved@a}
% \end{macrocode}
%
% \begin{macro}{\@iffileonpath}
% If the file is not found by |\openin|, and |\input@path| is defined,
% look in all the directories specified in |\input@path|.
% \changes{v0.9p}{1994/01/18}{Macro added}
% \changes{v1.0f}{1994/05/02}
% {\cs{@break@loop} renamed to \cs{@break@tfor}}
% \changes{v1.0t}{1995/05/25}
% {(CAR) added \cs{long}}
% \changes{v1.1d}{1996/01/10}
% {Change argument handling to not require doubled hash. latex/2024}
% \begin{macrocode}
\long\def\@iffileonpath#1{%
\let\reserved@a\@secondoftwo
\expandafter\@tfor\expandafter\reserved@b\expandafter
:\expandafter=\input@path\do{%
\openin\@inputcheck\reserved@b#1 %
\ifeof\@inputcheck\else
\edef\@filef@und{\reserved@b#1 }%
\let\reserved@a\@firstoftwo%
\closein\@inputcheck
\@break@tfor
\fi}%
\reserved@a}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\InputIfFileExists}
% \changes{v0.9b}
% {1993/12/04}{Macro added}
% \changes{v0.9p}
% {1994/01/18}{New Definition}
% \changes{v0.3b}{1994/03/13}
% {Use new cmd \cs{@addtofilelist}}
% Now define |\InputIfFileExists| to input |#1| if it seems to exist.
% Immediately prior to the input, |#2| is executed.
% If the file |#1| does not exist, execute `|#3|'.
% \changes{v1.0t}{1995/05/25}
% {(CAR) added \cs{long}}
% \begin{macrocode}
\long\def \InputIfFileExists#1#2{%
\IfFileExists{#1}%
{#2\@addtofilelist{#1}\@@input \@filef@und}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\input}
% Input a file: if the argument is given in braces use safe input
% macros, otherwise use \TeX's primitive |\input| command (which is
% called |\@@input| in \LaTeX).
% \changes{v0.9b}{1993/12/04}{Macro reimplemented}
% \begin{macrocode}
\def\input{\@ifnextchar\bgroup\@iinput\@@input}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@iinput}
% Define |\@iinput| (i.e., |\input|) in terms of
% |\InputIfIfileExists|.
% \changes{v0.9b}{1993/12/04}{Macro reimplemented}
% \begin{macrocode}
\def\@iinput#1{%
\InputIfFileExists{#1}{}%
{\filename@parse{#1}%
\edef\reserved@a{\noexpand\@missingfileerror
{\filename@area\filename@base}%
{\ifx\filename@ext\relax tex\else\filename@ext\fi}}%
\reserved@a}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@input}
% \changes{v0.9b}{1993/12/04}{Macro reimplemented}
% \changes{v0.9p}{1994/01/18}%
% {do not use a different definition for \cs{input@path}}
% Define |\@input| in terms of |\IfIfileExists|.
% So this is a `safe input' command, but the files input are not
% listed by |\listfiles|.
%
% We don't want |.aux|, |.toc| files etc be listed by |\listfiles|.
% However, something like |.bbl| probably should be listed and thus
% should be implemented not by |\@input|.
% \begin{macrocode}
\def\@input#1{%
\IfFileExists{#1}{\@@input\@filef@und}{\typeout{No file #1.}}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@input@}
% \changes{v0.9p}{1994/01/18}{Macro added}
% \task{???}{share code with `@input ?}
% Version of |\@input| that does add the file to |\@filelist|.
% \begin{macrocode}
\def\@input@#1{\InputIfFileExists{#1}{}{\typeout{No file #1.}}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@missingfileerror}
% This `error' command avoids \TeX's primitive missing file loop.
%
% Missing file error. Prompt for a new filename, offering a default
% extension.
% \changes{LaTeX2e}{1993/11/21}
% {Stop infinite looping on \cs{@er@ext}}
% \changes{LaTeX2e}{1993/11/28}
% {Use filename parser from dircheck}
% \changes{LaTeX2e}{1994/03/15}
% {Quit on x or X just like a real error}
% \changes{LaTeX2e}{1994/05/26}
% {Modify message format}
% \changes{v1.0j}{1994/11/03}
% {Move here from ltclass}
% \changes{v1.0w}{1995/10/06}
% {Autoload error}
% \begin{macrocode}
%<autoload>\def\@missingfileerror{\@autoerr\@missingfileerror}
%</2ekernel|autoload>
%<*2ekernel|autoerr>
\gdef\@missingfileerror#1#2{%
\typeout{^^J! LaTeX Error: File `#1.#2' not found.^^J^^J%
Type X to quit or <RETURN> to proceed,^^J%
or enter new name. (Default extension: #2)^^J}%
\message{Enter file name: }%
{\endlinechar\m@ne
\global\read\m@ne to\@gtempa}%
\ifx\@gtempa\@empty
\else
\def\reserved@a{x}\ifx\reserved@a\@gtempa\batchmode\@@end\fi
\def\reserved@a{X}\ifx\reserved@a\@gtempa\batchmode\@@end\fi
\filename@parse\@gtempa
\edef\filename@ext{%
\ifx\filename@ext\relax#2\else\filename@ext\fi}%
\edef\reserved@a{%
\noexpand\InputIfFileExists
{\filename@area\filename@base.\filename@ext}%
{}%
{\noexpand\@missingfileerror
{\filename@area\filename@base}{\filename@ext}}}%
\reserved@a
\fi}
%</2ekernel|autoerr>
%<*2ekernel|autoload>
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@obsoletefile}
% For compatibility with \LaTeX~2.09 document styles, we distribute
% files called |article.sty|, |book.sty|, |report.sty|,
% |slides.sty| and |letter.sty|. These use the command
% |\@obsoletefile|, which produces a warning message.
% \changes{v0.9m}{1993/12/20}{Added this command, removed
% @oldfilewarning}
% \changes{v1.0f}{1994/05/02}{Make \cs{@onlypreamble}}
% \begin{macrocode}
\def\@obsoletefile#1#2{%
\@latex@warning@no@line{inputting `#1' instead of obsolete `#2'}}
\@onlypreamble\@obsoletefile
% \end{macrocode}
%
% \subsection{Listing files}
%
% \begin{macro}{\@filelist}
% A list of files input so far. The initial value of |\@gobble| eats
% the comma before the first file name.
% \begin{macrocode}
\let\@filelist\@gobble
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@addtofilelist}
% Add to the list of files input so far.
% \changes{LaTeX2e}{1994/03/13}
% {Macro added}
% \changes{LaTeX2e}{1995/10/01}
% {Macro added}
% This `real' definition is only used for `cfg' files during initex.
% An initial definition of |\@gobble| has already been set.
% \begin{macrocode}
%\def\@addtofilelist#1{\xdef\@filelist{\@filelist,#1}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\listfiles}
% A preamble command to cause |\end{document}| to list files input
% from the main file.
% \changes{LaTeX2e}{1993/11/22}
% {Removed checking for \cs{@unknownversion}}
% \changes{LaTeX2e}{1994/01/17}
% {New Version, adds `.tex' if needed, and lines up columns}
% \changes{LaTeX2e}{1994/05/13}
% {Stop \cs{listfiles} being run twice}
% \changes{v1.0i}{1994/10/18}
% {code moved here from ltclass}
% \begin{macrocode}
\def\listfiles{%
\let\listfiles\relax
\def\@listfiles##1##2##3##4##5##6##7##8##9\@@{%
\def\reserved@d{\\}%
\@tfor\reserved@c:=##1##2##3##4##5##6##7##8\do{%
\ifx\reserved@c\reserved@d
\edef\filename@area{ \filename@area}%
\fi}}%
% \end{macrocode}
%
% \changes{v1.0o}{1994/11/30}
% {Use \cs{@dofilelist}}
% \begin{macrocode}
\def\@dofilelist{%
\typeout{^^J *File List*}%
\@for\@currname:=\@filelist\do{%
\filename@parse\@currname
\edef\reserved@a{%
\filename@base.%
\ifx\filename@ext\relax tex\else\filename@ext\fi}%
\expandafter\let\expandafter\reserved@b
\csname ver@\reserved@a\endcsname
\expandafter\expandafter\expandafter\@listfiles\expandafter
\filename@area\filename@base\\\\\\\\\\\\\\\\\\\@@
\typeout{%
\filename@area\reserved@a
\ifx\reserved@b\relax\else\@spaces\reserved@b\fi}}%
\typeout{ ***********^^J}}}
% \end{macrocode}
%
% \changes{LaTeX2e}{1994/03/13}
% {Reset \cs{@addtofilelist} at begin document}
% \changes{LaTeX2e}{1994/03/16}
% {Move this code directly into \cs{document}}
% The |\@filelist| will be de-activated if |\listfiles| does not
% appear in the preamble. |\begin{document}| contains code equivalent
% to the following:
%\begin{verbatim}
% \AtBeginDocument{%
% \ifx\@listfiles\@undefined
% \let\@filelist\relax
% \let\@addtofilelist\@gobble
% \fi}
%\end{verbatim}
% \begin{macrocode}
\@onlypreamble\listfiles
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@dofilelist}
% \changes{v1.0o}{1994/11/30}
% {Macro added}
% \begin{macrocode}
\let\@dofilelist\relax
% \end{macrocode}
% \end{macro}
%
% \begin{macrocode}
%</2ekernel|autoload>
% \end{macrocode}
% \end{macro}
%
% \Finale
%
|