% \iffalse meta-comment % % Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % % This file is part of the LaTeX base system. % ------------------------------------------- % % It 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 % https://www.latex-project.org/lppl.txt % and version 1.3c or later is part of all distributions of LaTeX % version 2008 or later. % % This file has the LPPL maintenance status "maintained". % % The list of all files belonging to the LaTeX base distribution is % given in the file `manifest.txt'. See also `legal.txt' for additional % information. % % The list of derived (unpacked) files belonging to the distribution % and covered by LPPL is defined by the unpacking scripts (with % extension .ins) which are part of the distribution. % % \fi % % \iffalse %%% From File: ltfiles.dtx %<*driver> % \fi \ProvidesFile{ltfiles.dtx} [2023/06/17 v1.2u 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} \providecommand\pkg[1]{\texttt{#1}} \providecommand\InternalDetectionOff{} \providecommand\InternalDetectionOn{} \begin{document} \MaintainedByLaTeXTeam{latex} \maketitle \DocInput{\filename} \end{document} % % \fi % % \providecommand\hook[1]{\texttt{#1}} % % % \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} % \changes{v1.1m}{2015/02/21} % {Removed autoload support} % \changes{v1.2i}{2020/08/21}{Integration of new hook management interface} % % \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}. % % \MaybeStop{} % % \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> \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} % % % \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} % \begin{macrocode} % %\IncludeInRelease{2020/10/01}% % {\document}{Added hook to load l3backend code}% %<*2ekernel|latexrelease> \def\document{% % \end{macrocode} % We do cancel the grouping as part of the \cs{begin} handling % (this is now done inside \cs{begin} instead) so that the % \hook{env/\meta{env}/begin} hook is not hidden inside \cs{begingroup} % \texttt{...} \cs{endgroup}. % \begin{macrocode} % \endgroup % \end{macrocode} % % \begin{macrocode} \UseOneTimeHook{begindocument/before}% \@kernel@after@begindocument@before % \end{macrocode} % % Added hook to load \textsf{l3backend} code: % \changes{v1.2h}{2020/06/05}{Added hook to load \textsf{l3backend} code} % \begin{macrocode} \@expl@sys@load@backend@@ \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} % For similar reasons also save the default language, this will be reset % locally in the output routine. In particular it allows hyphenation % in the page head even if the page break happens in verbatim. % If this has already been set by a package, set to the value of |\language| % at this point. % \changes{v1.1n}{2017/03/10}{Save language default} % \begin{macrocode} \ifx\document@default@language\m@ne \chardef\document@default@language\language \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} \@kernel@before@begindocument \UseOneTimeHook{begindocument}% \@kernel@after@begindocument % \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} % % \begin{macrocode} \UseOneTimeHook{begindocument/end}% % \end{macrocode} % \changes{v1.1c}{1995/12/05}{\cs{ignorespaces} added for latex/1933} % Use of the hook might mean that we are already in % horizontal mode, so ignore the space after |\begin{document}|. % \begin{macrocode} \ignorespaces} % \end{macrocode} % % Provide a global definition for \cs{do} as well, so that it is % already defined in the preamble and not late as % \verb=\begin{document}= overwriting some definition given by the % unsuspecting user in the preamble. % \changes{v1.2s}{2023/01/05}{\cs{do} now with default definition in % the kernel (gh/975)} % \begin{macrocode} \let\do\noexpand % \end{macrocode} % % The \hook{begindocument} hook already existed in the kernel since % 1994 under the name \cs{atbegindocumenthook} the % additional ones are originally from the \pkg{etoolbox} % package under the names \cs{@endpreamblehook} \cs{afterpreamble}. % \begin{macrocode} \NewHook{begindocument} \NewHook{begindocument/before} \NewHook{begindocument/end} % \end{macrocode} % \begin{macro}{\@kernel@after@begindocument@before, % \@kernel@before@begindocument, % \@kernel@after@begindocument} % % Above we used two kernel only hooks to be run after the public % \hook{begindocument/before} and after \hook{begindocument} % hooks. % % In \cs{@kernel@after@begindocument@before} we already place one % action: drop the fast execution code for the % \hook{env/document/begin} hook. That hook marks the end of the % preamble and should therefore only be run once. In a normal % document that is anyway the case (so the code would just sit % there taking up space afterwards, which these days is rather % harmless), however, in more complicated scenarios where several % full documents are combined to a single document it might get % applied several times with harmful effects. We therefore % explicitly drop it at this point. the coding is somewhat obscure % due to the name of the macro which requires constructing. % \InternalDetectionOff % \begin{macrocode} \edef \@kernel@after@begindocument@before {% \let\expandafter\noexpand\csname __hook env/document/begin\endcsname \noexpand\@empty} % \end{macrocode} % \InternalDetectionOn % % These internal hooks are already declared earlier (in % \texttt{ltexpl}) so that other modules could write to them. % \changes{v1.2m}{2021/04/17}{Move \cs{@kernel@before@begindocument} and % \cs{@kernel@after@begindocument} init earlier so that other modules can % write to the hooks} % \begin{macrocode} %\let \@kernel@before@begindocument \@empty %\let \@kernel@after@begindocument \@empty % \end{macrocode} % % \end{macro} % % % \begin{macrocode} % %\EndIncludeInRelease % \end{macrocode} % % \begin{macrocode} %\IncludeInRelease{2017/04/15}% % {\document}{Save language for hyphenation}% % %\def\document{\endgroup % \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 % \global \let \@multiplelabels \relax % \@input{\jobname.aux}% % \endgroup % \if@filesw % \immediate\openout\@mainaux\jobname.aux % \immediate\write\@mainaux{\relax}% % \fi % \process@table % \let\glb@currsize\@empty % Force math initialization. % \normalsize % \everypar{}% % \ifx\normalsfcodes\@empty % \ifnum\sfcode`\.=\@m % \let\normalsfcodes\frenchspacing % \else % \let\normalsfcodes\nonfrenchspacing % \fi % \fi % \ifx\document@default@language\m@ne % \chardef\document@default@language\language % \fi % \@noskipsecfalse % \let \@refundefined \relax % \let\AtBeginDocument\@firstofone % \@begindocumenthook % \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 % \gdef\do##1{\global\let ##1\@notprerr}% % \@preamblecmds % \global\let \@nodocument \relax % \global\let\do\noexpand % \ignorespaces} %\EndIncludeInRelease % %\IncludeInRelease{0000/00/00}% % {\document}{Save language for hyphenation} %\def\document{\endgroup % \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 % \global \let \@multiplelabels \relax % \@input{\jobname.aux}% % \endgroup % \if@filesw % \immediate\openout\@mainaux\jobname.aux % \immediate\write\@mainaux{\relax}% % \fi % \process@table % \let\glb@currsize\@empty % \normalsize % \everypar{}% % \ifx\normalsfcodes\@empty % \ifnum\sfcode`\.=\@m % \let\normalsfcodes\frenchspacing % \else % \let\normalsfcodes\nonfrenchspacing % \fi % \fi % \@noskipsecfalse % \let \@refundefined \relax % \let\AtBeginDocument\@firstofone % \@begindocumenthook % \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 % \gdef\do##1{\global\let ##1\@notprerr}% % \@preamblecmds % \global\let \@nodocument \relax % \global\let\do\noexpand % \ignorespaces} %\EndIncludeInRelease %<*2ekernel> % \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}{\include,\includeonly} % \changes{v0.9p}{1994/01/18} % {Use \cs{@input@} so include files are listed.} % \changes{v1.0p}{1995/04/22}{Allow blanks in argument} % \changes{v1.2a}{2019/07/01}{Support UTF-8} % \changes{v1.2g}{2020/05/02}{Improved support for spaces in filenames % (gh/217)} % % 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. % \changes{v1.2g}{2020/05/02}{Get rid of leading and trailing spaces % from the filename (gh/217)} % \changes{v1.2g}{2020-05-02}{Pass the filename to \cs{@include} by % value instead of by reference (gh/217)} % % \begin{macrocode} % %<*2ekernel|latexrelease> %\IncludeInRelease{2020/10/01}% % {\includeonly}{Spaces in file names}% % \end{macrocode} % % \begin{macrocode} \def\include#1{\relax \ifnum\@auxout=\@partaux \@latex@error{\string\include\space cannot be nested}\@eha \else % \end{macrocode} % Here the normalization will add |.tex| for all files, (it uses % the same normalization as the hooks), so we need to remove that % manually. \cs{@strip@tex@ext} does that. % \begin{macrocode} \set@curr@file{#1}% \edef\@curr@file{\@strip@tex@ext\@curr@file}% % \end{macrocode} % For historical reasons \cs{@include} expects an argument % delimited by a space. This is kept (though unnecessary now) to avoid % errors in other packages that use \cs{@include} directly. % \begin{macrocode} \expandafter\@include\expandafter{\@curr@file} % deliberate space \fi} % \end{macrocode} % % Here in \cs{includeonly} we also need to strip |.tex| after % normalization: % \begin{macrocode} \def\includeonly#1{% \@partswtrue % \end{macrocode} % Because the argument to |\includeonly| is a comma-separated list % of filenames where there may be comma's preceding some of the % filenames or trailing them. Therefore we need to take the list % apart, remove the unwanted spaces while leaving the spaces % \emph{in} the filenames intact. % \begin{macrocode} \let\@partlist\@empty \@for\reserved@a:=#1 \do {% \expandafter\set@curr@file\expandafter{\reserved@a}% \ifx\@partlist\@empty \edef\@partlist{\@strip@tex@ext\@curr@file}% \else \edef\@partlist{\@partlist,\@strip@tex@ext\@curr@file}% \fi }% } \@onlypreamble\includeonly % \end{macrocode} % \end{macro} % % \begin{macro}{\@strip@tex@ext,\@strip@tex@ext@aux} % These macros take a (\cs{detokenize}d file name and remove any % |.tex| extension). Extra care is taken to not remove the string % |.tex| from the middle of a file name: it is only removed if it's % the very last thing in the file name. % \begin{macrocode} \def\reserved@a#1{% \def\@strip@tex@ext##1{% \expandafter\@strip@tex@ext@aux ##1\@nil\@nil #1\@nil\relax\@nnil} \def\@strip@tex@ext@aux##1#1\@nil##2\@nnil{% \ifx\relax##2\@empty \expandafter\@cdr\expandafter\@empty\@cdr{}##1% \else##1\fi}}% \expandafter\reserved@a \expandafter{\detokenize{.tex}} % % \end{macrocode} % \end{macro} % % \begin{macrocode} %\EndIncludeInRelease %\IncludeInRelease{2019/10/01}% % {\includeonly}{Spaces in file names}% % %\def\includeonly#1{% % \@partswtrue % \set@curr@file{\zap@space#1 \@empty}% % \let\@partlist\@curr@file % } % %\def\include#1{\relax % \ifnum\@auxout=\@partaux % \@latex@error{\string\include\space cannot be nested}\@eha % \else % \set@curr@file{#1 }% % \expandafter\@include\@curr@file % \fi} % %\let\@strip@tex@ext\@undefined %\let\@strip@tex@ext@aux\@undefined % %\EndIncludeInRelease % \end{macrocode} % % \begin{macrocode} %\IncludeInRelease{0000/00/00}% % {\includeonly}{Spaces in file names}% %\def\includeonly#1{% % \@partswtrue % \edef\@partlist{\zap@space#1 \@empty}} % %\def\include#1{\relax % \ifnum\@auxout=\@partaux % \@latex@error{\string\include\space cannot be nested}\@eha % \else \@include#1 \fi} % %\EndIncludeInRelease %<*2ekernel> % \end{macrocode} % % \begin{macro}{\@include} % \changes{v1.2g}{2020/05/02}{Support spaces in filenames by enclosing % the names of \texttt{.aux}-files in quotes (gh/217)} % \begin{macrocode} % %<*2ekernel|latexrelease> %\IncludeInRelease{2022/06/01}% % {\@include}{Spaces in file names and hooks}% % \end{macrocode} % % \changes{v1.2j}{2020/10/04}{Quotes around the aux file name removed, % they are not needed and upset BibTeX (gh/400)} % \changes{v1.2p}{2021/10/14}{Warn about use in preamble} % \begin{macrocode} \def\@include#1 {% % \end{macrocode} % % \begin{macrocode} \ifx\@nodocument\relax % \end{macrocode} % % \begin{macrocode} \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 % \end{macrocode} % Now before going to the hooks we need to set \cs{CurrentFile}: % \begin{macrocode} %----------------------------------------- \@filehook@set@CurrentFile % \end{macrocode} % Execute the \texttt{before} hooks just after we switched the % \texttt{.aux} file \ldots % \changes{v1.2n}{2021/07/23}{Make include/name/before a one-time hook} % \changes{v1.2o}{2021/08/25}{Standardise generic hook names (gh/648)} % \begin{macrocode} \UseHook{include/before}% \UseOneTimeHook{include/#1/before}% %----------------------------------------- \@input@{#1.tex}% %----------------------------------------- % \end{macrocode} % \ldots{} then \texttt{end} hooks \ldots % \changes{v1.2n}{2021/07/23}{Make include/name/end a one-time hook} % \begin{macrocode} \UseOneTimeHook{include/#1/end}% \UseHook{include/end}% %----------------------------------------- \clearpage %----------------------------------------- % \end{macrocode} % \ldots{} and after the \cs{clearpage} the \texttt{after} hooks % followed by another \cs{clearpage} just in case new material got % added (after all we need to be in well defined state after the % \cs{include}). % \changes{v1.2n}{2021/07/23}{Make include/name/after a one-time hook} % \begin{macrocode} \UseOneTimeHook{include/#1/after}% \UseHook{include/after}% \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}% % \end{macrocode} % We also execute a hook in this case, first a general used for % every include file that is exclude and then a specific one that % contains the name of the include file. % \changes{v1.2q}{2022/04/01}{Process some hooks is an include file is bypassed} % \begin{macrocode} %----------------------------------------- \UseHook{include/excluded}% \UseOneTimeHook{include/#1/excluded}% %----------------------------------------- \fi \let\@auxout\@mainaux % \end{macrocode} % % \begin{macrocode} \else \@latex@warning{% \noexpand\include should only be used after \string\begin{document}}% \@input@{#1}% \fi} % \end{macrocode} % % \changes{v1.2o}{2021/08/25}{Declare non-generic include hooks} % Now declare the non-generic \hook{include} hooks used above: % \begin{macrocode} \NewHook{include/before} \NewReversedHook{include/end} \NewReversedHook{include/after} \NewHook{include/excluded} %\EndIncludeInRelease % % \end{macrocode} % % \begin{macrocode} %\IncludeInRelease{2020/10/01}% % {\@include}{Spaces in file names and hooks}% %\EndIncludeInRelease %\def\@include#1 {% %\ifx\@nodocument\relax % \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 % \@filehook@set@CurrentFile % \UseHook{include/before}% % \UseOneTimeHook{include/#1/before}% % \@input@{#1.tex}% % \UseOneTimeHook{include/#1/end}% % \UseHook{include/end}% % \clearpage % \UseOneTimeHook{include/#1/after}% % \UseHook{include/after}% % \clearpage % \@writeckpt{#1}% % \if@filesw % \immediate\closeout\@partaux % \fi % \else % \deadcycles\z@ % \@nameuse{cp@#1}% % \fi % \let\@auxout\@mainaux %\else %\@latex@warning{% % \noexpand\include should only be used after \string\begin{document}}% %\@input@{#1}% %\fi} %\NewHook{include/before} %\NewReversedHook{include/end} %\NewReversedHook{include/after} % \end{macrocode} % % \begin{macrocode} %\IncludeInRelease{0000/00/00}% % {\@include}{Spaces in file names and hooks}% %\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 % \deadcycles\z@ % \@nameuse{cp@#1}% % \fi % \let\@auxout\@mainaux} % %\EndIncludeInRelease %<*2ekernel> % \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}{\@curr@file} % \begin{macro}{\set@curr@file} % % File name handling is done by generating a csname from the % provided file name (which means that UTF-8 octets gets turned into % strings as this is what happens if they appear in a csname due to % the code in \texttt{utf8.def}). By setting \cs{escapchar} to % \texttt{-1} we ensure that we don't get a backslash in front. As a % result we end up with all characters as catcode 12 (plus % spaces). We then sometimes add quotes around the construct % (removing any existing inner quotes. Sometimes we only remove the % quotes if they have been supplied by the user. There is clearly % some room for improvement. % % A side effect of the new code is that we will see quotes around % file name displays where there haven't been any before. % % For compatibility with existing code using |{abc}.tex| or % |{one.two}.png|, an initial brace group is discarded before % expansion and |\string| is applied. The content of the brace % group is discarded. This means that a leading space will be lost % unless protected (by |{ }| or |" "| or |\space|) but filenames % with a space are hopefully rare. % % \changes{v1.2a}{2019/07/01}{Support UTF-8} % \changes{v1.2c}{2019/10/11}{Remove one brace group} % \changes{v1.2d}{2019/10/26}{remove quotes} % \changes{v1.2e}{2019/11/09}{expand and \cs{string} before removing quotes} % % The definition below is from 2019 and only used during kernel % bootstrapping, later on in \texttt{ltfilehook.dtx} it will get % overwritten. % \begin{macrocode} \def\set@curr@file#1{% \begingroup \escapechar\m@ne \xdef\@curr@file{% \expandafter\expandafter\expandafter\unquote@name \expandafter\expandafter\expandafter{% \expandafter\string \csname\@firstofone#1\@empty\endcsname}}% \endgroup } % \end{macrocode} % \end{macro} % \end{macro} % % % \begin{macro}{\quote@name} % \begin{macro}{\quote@@name} % \begin{macro}{\unquote@name} % Quoting spaces %\begin{verbatim} % a b c -> "a b c" % "a b c" -> "a b c" % a" "b" "c -> "a b c" % -> "" %\end{verbatim} % \begin{macrocode} % %<*2ekernel|latexrelease> %\IncludeInRelease{2019/10/01}% % {\quote@name}{Quote file names}% \def\quote@name#1{"\quote@@name#1\@gobble""} \def\quote@@name#1"{#1\quote@@name} % \end{macrocode} % and removing quotes \ldots % \begin{macrocode} \def\unquote@name#1{\quote@@name#1\@gobble"} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % % % \begin{macro}{\IfFileExists} % % \changes{v1.2a}{2019/07/01}{Support UTF-8} % \changes{v1.2b}{2019/08/27}{Make command robust} % \changes{v1.2d}{2019/10/26}{don't quote name} % \begin{macrocode} \DeclareRobustCommand\IfFileExists[1]{% \set@curr@file{#1}% \expandafter\IfFileExists@\expandafter{\@curr@file}} % \end{macrocode} % \end{macro} % % \begin{macrocode} % %\EndIncludeInRelease %\IncludeInRelease{0000/00/00}% % {\quote@name}{Quote file names}% % %\let\quote@name\@undefined %\let\quote@@name\@undefined %\let\unquote@name\@undefined % %\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} % %\EndIncludeInRelease %<*2ekernel> % \end{macrocode} % % % % \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}} % \changes{v1.2d}{2019/10/26}{quote on openin} % \changes{v1.2k}{2021/03/12}{Allow unbalanced conditionals (gh/530)} % \changes{v1.2t}{2023/05/15}{Use \pkg{expl3} file existence test} % \begin{macro}{\IfFileExists@@} % \changes{v1.2t}{2023/05/15}{Macro added} % \changes{v1.2u}{2023/06/16}{Support piped input} % Argument |#1| is |\@curr@file| so catcode 12 string with no quotes. % % The original definition picked up arguments |#2| and |#3| in a % way that they couldn't contain unbalanced conditionals. A better % implementation would have been not to pick up the arguments at % all but instead use the usual \cs{@firstoftwo} and % \cs{secondoftwo}. However, that changes how |#| is interpreted % and so we can't do that nowadays without invalidating a lot of % code. Therefore the somewhat curious construction near the end. % % Earlier versions used |\openin| here, but this led to two % code paths, one in \pkg{expl3} and one here. To avoid that, % and as the \pkg{expl3} approach works by expansion, we use % that here. As we need the file name to include the path, % the actual \pkg{expl3} function used is not the file existence % test! % \begin{macrocode} % %<*2ekernel|latexrelease> %\IncludeInRelease{2023/06/01}% % {\IfFileExists@}{IfFileExists} \long\def \IfFileExists@#1#2#3{% \edef\@filef@und{\IfFileExists@@{#1}}% % \end{macrocode} % The \pkg{expl3} function regards an empty argument as nothing at all, % but the \LaTeXe{} convention is that this is equal to the special % \texttt{.tex} file. % \begin{macrocode} \ifx\@filef@und\@empty \if\relax\detokenize{#1}\relax \let\reserved@a\@firstoftwo \def\@filef@und{".tex" }% \else \let\reserved@a\@secondoftwo \fi \else \let\reserved@a\@firstoftwo \edef\@filef@und{"\@filef@und" }% \fi % \end{macrocode} % This is just there so that any |#| inside |#2| or |#3| needs % doubling (as that was the case in the past). % \begin{macrocode} \expandafter\def\expandafter\reserved@a \expandafter{\reserved@a{#2}{#3}}% \reserved@a} % \end{macrocode} % Pipes are not really files, but at the document level they are supported. % To quickly trim of any leading spaces, we use a blank test and \cs{use:n} % rather than \cs{tl_trim_spaces:n} for speed as we don't care about the end % of the input. % \begin{macrocode} \ExplSyntaxOn \cs_new:Npn \IfFileExists@@ #1 { \tl_if_blank:nF {#1} { \tl_if_head_eq_charcode:oNTF { \use:n #1 } | {#1} { \file_full_name:n {#1} } } } \cs_generate_variant:Nn \tl_if_head_eq_charcode:nNTF { o } \ExplSyntaxOff % %\EndIncludeInRelease %\IncludeInRelease{2021/06/01}% % {\IfFileExists@}{IfFileExists} % %\long\def \IfFileExists@#1#2#3{% % \openin\@inputcheck"#1" % % \ifeof\@inputcheck % \ifx\input@path\@undefined % \let\reserved@a\@secondoftwo % \else % \def\reserved@a{\@iffileonpath{#1}}% % \fi % \else % \closein\@inputcheck % \edef\@filef@und{"#1" }% % \let\reserved@a\@firstoftwo % \fi % \expandafter\def\expandafter\reserved@a % \expandafter{\reserved@a{#2}{#3}}% %\reserved@a} %\let\IfFileExists@@\@undefined %\EndIncludeInRelease % %\IncludeInRelease{2019/10/01}% % {\IfFileExists@}{IfFileExists} % %\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} %\EndIncludeInRelease %\IncludeInRelease{0000/00/00}% % {\IfFileExists@}{IfFileExists} % %\let\IfFileExists@\@undefined % % %\EndIncludeInRelease %<*2ekernel> % \end{macrocode} % \end{macro} % \end{macro} % % % % % % % \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} % \changes{v1.2d}{2019/10/26}{quote on openin}% % \changes{v1.2f}{2019/11/11}{make \cs{@filef@und} match quoting used on \cs{openin}}% % \begin{macrocode} % %<*2ekernel|latexrelease> %\IncludeInRelease{2019/10/01}% % {\@iffileonpath}{Quote file names} \long\def\@iffileonpath#1{% \let\reserved@a\@secondoftwo \expandafter\@tfor\expandafter\reserved@b\expandafter :\expandafter=\input@path\do{% \openin\@inputcheck\expandafter\quote@name\expandafter{\reserved@b#1} % \ifeof\@inputcheck\else \edef\@filef@und{\expandafter\quote@name\expandafter{\reserved@b#1} }% \let\reserved@a\@firstoftwo% \closein\@inputcheck \@break@tfor \fi}% \reserved@a} % \end{macrocode} % \end{macro} % % \begin{macrocode} % %\EndIncludeInRelease %\IncludeInRelease{0000/00/00}% % {\quote@name}{Quote file names} % %\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} % %\EndIncludeInRelease %<*2ekernel> % \end{macrocode} % % % % % \begin{macro}{\InputIfFileExists} % % 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|'. % % This here is a temporary definition for the kernel. The real one % comes somewhat later in the file \texttt{ltfilehook.dtx}. % % \begin{macrocode} \DeclareRobustCommand \InputIfFileExists[2]{% \IfFileExists{#1}% {% \expandafter\@swaptwoargs\expandafter {\@filef@und}{#2\@addtofilelist{#1}\@@input}}} % \end{macrocode} % \end{macro} % % % \begin{macro}{\@swaptwoargs} % % \changes{v1.1o}{2019/02/07}{Helper macro added} % Swap two arguments and return them unbraced (like % \cs{@firstoftwo} etc). % \begin{macrocode} % %<*2ekernel|latexrelease> %\IncludeInRelease{2019/10/01}% % {\@swaptwoargs}{Don't lose the file name}% \long\def\@swaptwoargs#1#2{#2#1} % \end{macrocode} % % \begin{macrocode} % %\EndIncludeInRelease %\IncludeInRelease{0000/00/00}% % {\@swaptwoargs}{Don't lose the file name}% %\let\@swaptwoargs\@undefined %\EndIncludeInRelease %<*2ekernel> % \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} % % Changes to \cs{@iinput}: adapt to the changes to % \cs{@missingfileerror}. % \begin{macrocode} % %<*2ekernel|latexrelease> %\IncludeInRelease{2020/10/01}% % {\@iinput}{Change in file error handling}% \def\@iinput#1{% \InputIfFileExists{#1}{}% {\filename@parse\@curr@file \edef\reserved@a{\noexpand\@missingfileerror {\filename@area\filename@base}% {\ifx\filename@ext\relax tex\else\filename@ext\fi}}% % \end{macrocode} % This line now just sets \cs[no-index]{@missingfile@\meta{part}}: % \begin{macrocode} \reserved@a % \end{macrocode} % Now here we have to use it. The file here is guaranteed to exist, % because \cs{@missingfileerror} ensures so, but we have to use % \cs{InputIfFileExists} because it executes the file hooks. % \begin{macrocode} \edef\reserved@a{\noexpand\@iinput{% \@missingfile@area\@missingfile@base.\@missingfile@ext}}% \reserved@a}} % %\EndIncludeInRelease % \end{macrocode} % % \begin{macrocode} %\IncludeInRelease{2019/10/01}% % {\@iinput}{Quote file names}% % %\def\@iinput#1{% % \InputIfFileExists{#1}{}% % {\filename@parse\@curr@file % \edef\reserved@a{\noexpand\@missingfileerror % {\filename@area\filename@base}% % {\ifx\filename@ext\relax tex\else\filename@ext\fi}}% % \reserved@a}} %\EndIncludeInRelease % \end{macrocode} % % \begin{macrocode} %\IncludeInRelease{0000/00/00}% % {\@iinput}{Quote file names}% %\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}} %\EndIncludeInRelease %<*2ekernel> % \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} % % Changes to \cs{@missingfileerror}: rather than trying to input the % file by force, now \cs{@missingfileerror} just returns three % \cs[no-index]{@missingfile@\meta{part}} and the caller macro is % responsible for doing the right thing with it. % \begin{macrocode} % %<*2ekernel|latexrelease> %\IncludeInRelease{2020/10/01}% % {\@missingfileerror}{Do not load missing file immediately}% \gdef\@missingfileerror#1#2{% \typeout{^^J! LaTeX Error: File `#1.#2' not found.^^J^^J% Type X to quit or 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 % \end{macrocode} % If the user answers with \meta{return}, fallback to the |.tex| file % (previously it did nothing). % \begin{macrocode} \let\@missingfile@area\@empty \let\@missingfile@base\@empty \def\@missingfile@ext{tex}% \else % \end{macrocode} % Use \cs{batchmode}\cs{read}|-1 to |\meta{tl} to end the \TeX{} run, % same as \pkg{expl3} does (it was \cs{batchmode}\cs{@@end} before). % \begin{macrocode} \def\reserved@b{\batchmode\read-1 to \reserved@a}% \def\reserved@a{x}\ifx\reserved@a\@gtempa\reserved@b\fi \def\reserved@a{X}\ifx\reserved@a\@gtempa\reserved@b\fi \filename@parse\@gtempa \edef\filename@ext{% \ifx\filename@ext\relax#2\else\filename@ext\fi}% \edef\reserved@a{% % \end{macrocode} % Only check \cs{IfFileExists} (it was \cs{InputIfFileExists}). % \begin{macrocode} \noexpand\IfFileExists {\filename@area\filename@base.\filename@ext}% % \end{macrocode} % If the file exists, define \cs[no-index]{@missingfile@\meta{part}}. % \begin{macrocode} {\def\noexpand\@missingfile@area{\filename@area}% \def\noexpand\@missingfile@base{\filename@base}% \def\noexpand\@missingfile@ext {\filename@ext}}% {\noexpand\@missingfileerror {\filename@area\filename@base}{\filename@ext}}}% \reserved@a \fi } % %\EndIncludeInRelease % \end{macrocode} % % \begin{macrocode} %\IncludeInRelease{0000/00/00}% % {\@missingfileerror}{Do not load missing file immediately}% % %\gdef\@missingfileerror#1#2{% % \typeout{^^J! LaTeX Error: File `#1.#2' not found.^^J^^J% % Type X to quit or 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} % %\EndIncludeInRelease %<*2ekernel> % \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}} % \changes{v1.2r}{2022/05/27}{Try saved version string, if ver@.. is \cs{relax} (gh/825)} % \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 % \end{macrocode} % Packages that \cs{relax} their \cs{ver@...} string to allow for % multiple loading (e.g., \pkg{fontenc}) can use \cs{ver@@...} to % store the version information instead. % \begin{macrocode} \ifx\reserved@b\relax \expandafter\let\expandafter\reserved@b \csname ver@@\reserved@a\endcsname \fi \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} % % \end{macrocode} % \end{macro} % % \Finale %