% \iffalse meta-comment % % Copyright 1994 the LaTeX3 project and the individual authors. % All rights reserved. For further copyright information see the file % legal.txt, and any other copyright indicated in this file. % % This file is part of the LaTeX2e system. % ---------------------------------------- % % This system is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. % % % IMPORTANT NOTICE: % % For error reports in case of UNCHANGED versions see bugs.txt. % % Please do not request updates from us directly. Distribution is % done through Mail-Servers and TeX organizations. % % You are not allowed to change this file. % % You are allowed to distribute this file under the condition that % it is distributed together with all files mentioned in manifest.txt. % % If you receive only some of these files from someone, complain! % % You are NOT ALLOWED to distribute this file alone. You are NOT % ALLOWED to take money for the distribution or use of either this % file or a changed version, except for a nominal charge for copying % etc. % \fi % % \iffalse %%% File: ltclass % %<*driver> % \fi \ProvidesFile{ltclass.dtx} [1994/05/26 v1.0i LaTeX Kernel (Class & Package Interface)] % \iffalse \documentclass{ltxdoc} \GetFileInfo{ltclass.dtx} \begin{document} \title{The main structure of documents} \author{Frank Mittelbach\and Chris Rowley\and Alan Jeffrey\and David Carlisle} \date{\filedate} \maketitle \DocInput{\filename} \end{document} % % \fi % % \iffalse % (C) Copyright Frank Mittelbach, Chris Rowley, % Alan Jeffrey and David Carlisle 1993-1994. % All rights reserved. % \fi % % \CheckSum{1193} % % \changes{v1.0f}{1994/05/22}{Use new warning and error commands} % % \section{Introduction} % % This file implements the following declarations, which replace % |\documentstyle| in \LaTeXe\ documents. % % Note that old documents containing |\documentstyle| will be run using % a compatibility option---thus keeping everyone happy, we hope! % % The overall idea is that there are two types of `style files': % `class files' which define elements and provide a default formatting % for them; and `packages' which provide extra functionality. One % difference between \LaTeXe\ and \LaTeX2.09 is that \LaTeXe\ packages % may have options. Note that options to classes packages may be % implemented such that they input files, but these file names are not % necessarily directly related to the option name. % % \section{User interface} % % |\documentclass[|\meta{main-option-list}|]{|^^A % \meta{class}|}[|\meta{version}|]| % % There must be exactly one such declaration, and it must come first. % The \meta{main-option-list} is a list of options which can modify the % formatting of elements which are defined in the \meta{class} file % as well as in all following |\usepackage| declarations (see below). % The \meta{version} is a version number, beginning with a date in the % format |YYYY/MM/DD|. If an older version of the class is found, a % warning is issued. % % \bigskip % % |\documentstyle[|\meta{main-option-list}|]{|^^A % \meta{class}|}[|\meta{version}|]| % % The |\documentstyle| declaration is kept in order to maintain upward % compatibility with \LaTeX2.09 documents. It is similar to % |\documentclass|, but it causes all options in % \meta{main-option-list} that the \meta{class} does not use to be % passed to |\RequirePackage| after the options have been processed. % This maintains compatibility with the 2.09 behaviour. Also a flag is % set to indicate that the document is to be processed in \LaTeX2.09 % compatibility mode. As far as most packages are concerned, this % only affects the warnings and errors \LaTeX\ generates. This flag % does affect the definition of font commands, and |\sloppy|. % % \bigskip % % |\usepackage[|\meta{package-option-list}|]{|^^A % \meta{package-list}|}[|\meta{version}|]| % % There can be any number of these declarations. All packages in % \meta{package-list} are called with the same options. % % Each \meta{package} file defines new elements (or modifies those % defined in the \meta{class}), and thus extends the range of documents % which can be processed. % The \meta{package-option-list} is a list of options which can modify % the formatting of elements defined in the \meta{package} file. % The \meta{version} is a version number, beginning with a date in the % format |YYYY/MM/DD|. If an older version of the package is found, a % warning is issued. % % Each package is loaded only once. If the same package is requested % more than once, nothing happens, unless the package has been requested % with options that were not given the first time it was loaded, in % which case an error is produced. % % As well as processing the options given in the % \meta{package-option-list}, each package processes the % \meta{main-option-list}. This means that options that affect all % of the packages can be given globally, rather than repeated for every % package. % % Note that class files have the extension |.cls|, packages have the % extension |.sty|. % % \DescribeEnv{filecontents} % The environment |filecontents| is intended for passing the contents % of packages, options, or other files along with a document in a % single file. % It has one argument, which is the name of the file to create. If that % file already exists (maybe only in the current directory if the OS % supports a notion of a `current directory' or `default directory') % then nothing happens % (except for an information message) and the body of the environment % is bypassed. Otherwise, the body of the environment is written % verbatim to the file name given as the first argument. % % The environment is allowed only before |\documentclass| to ensure % that all packages or options necessary for this particular run are % present when needed. % % \subsection{Option processing} % % When the options are processed, they are divided into two types: {\em % local\/} and {\em global}: % \begin{itemize} % % \item For a class, the options in the |\documentclass| command are % local. % % \item For a package, the options in the |\usepackage| command are % local, and the options in the |\documentclass| command are global. % % \end{itemize} % The options for |\documentclass| and |\usepackage| % are processed in the following way: % \begin{enumerate} % % \item The local and global options that have been declared % (using |\DeclareOption| as described below) are processed % first. % % In the case of |\ProcessOptions|, they are processed in the order % that they were declared in the class or package. % % In the case of |\ProcessOptions*|, they are processed in the order % that they appear in the option-lists. First the global options, and % then the local ones. % % \item Any remaining local options are dealt with using the default % option (declared using the |\DeclareOption*| declaration described % below). For document classes, this usually does nothing, but % records the option on a list of unused options. % For packages, this usually produces an error. % % \end{enumerate} % Finally, when |\begin{document}| is reached, if there are any global % options which have not been used by either the class or any package, % the system will produce a warning. % % % \section{Class and Package interface} % % \subsection{Class name and version} % % \DescribeMacro\ProvidesClass % A class can identify itself with the % |\ProvidesClass{|\meta{name}|}[|\meta{version}|]| command. The % \meta{version} should begin with a date in the format |YYYY/MM/DD|. % % \subsection{Package name and version} % % \DescribeMacro\ProvidesPackage % A package can identify itself with the % |\ProvidesPackage{|\meta{name}|}[|\meta{version}|]| command. The % \meta{version} should begin with a date in the format |YYYY/MM/DD|. % % \subsection{Requiring other packages} % % \DescribeMacro\RequirePackage % Packages or classes can load other packages using\\ % |\RequirePackage[|\meta{options}|]{|\meta{name}|}[|^^A % \meta{version}|]|.\\ % If the package has already been loaded, then nothing happens unless % the requested options are not a subset of the options with which it % was loaded, in which case an error is called. % % \DescribeMacro\LoadClass % Similar to |\RequirePackage|, but for classes, may not be used in % package files. % % \DescribeMacro\PassOptionsToPackage % \DescribeMacro\PassOptionsToClass % Packages can pass options to other packages using:\\ % |\PassOptionsToPackage{|\meta{options}|}{|\meta{package}|}|.\\ This % adds the \meta{options} to the options list of any future % |\RequirePackage| or |\usepackage| command. For example: % \begin{verbatim} % \PassOptionsToPackage{foo,bar}{fred} % \RequirePackage[baz]{fred}\end{verbatim} % is the same as: % \begin{verbatim} % \RequirePackage[foo,bar,baz]{fred}\end{verbatim} % % \DescribeMacro\@ifpackageloaded % \DescribeMacro\@ifclassloaded % To find out if a package has already been loaded, use\\ % |\@ifpackageloaded{|\meta{package}|}{|\meta{true}|}{|\meta{false}|}|. % % \DescribeMacro\@ifpackagelater % \DescribeMacro\@ifclasslater % To find out if a package has already been loaded with a version more % recent than \meta{version}, use % |\@ifpackagelater{|\meta{package}|}{|\meta{version}|}{|^^A % \meta{true}|}{|\meta{false}|}|. % % \DescribeMacro\@ifpackagewith % \DescribeMacro\@ifclasswith % To find out if a package has already been loaded with at least the % options \meta{options}, use % |\@ifpackagewith{|\meta{package}|}{|\meta{options}|}{|^^A % \meta{true}|}{|\meta{false}|}|. % % \subsection{Declaring new options} % % Options for classes and packages are built using the same macros. % % \DescribeMacro\DeclareOption To define a builtin option, use % |\DeclareOption{|\meta{name}|}{|\meta{code}|}|. % % \DescribeMacro{\DeclareOption*} To define the default action to % perform for local options which have not been declared, use % |\DeclareOption*{|\meta{code}|}|. % % {\em Note\/}: there should be no use of\\ % |\RequirePackage|, |\DeclareOption|, |\DeclareOption*| or % |\ProcessOptions|\\ % inside |\DeclareOption| or |\DeclareOption*|. % % Possible uses for |\DeclareOption*| include: % % |\DeclareOption*{}|\\ % Do nothing. Silently accept unknown options. (This suppresses the % usual warnings.) % % |\DeclareOption*{\@unkownoptionerror}|\\ % Complain about unknown local options. (The initial setting for % package files.) % % |\DeclareOption*{\PassOptionsToPackage{\CurrentOption}|^^A % |{|\meta{pkg-name}|}|\\ % Handle the the current option by passing it on to the package % \meta{pkg-name}, which will presumably be loaded via % |\RequirePackage| later in the file. This is useful for building % `extension' packages, that perhaps handle a couple of new options, % but then pass everything else on to an existing package. % % |\DeclareOption*{\InputIfFileExists{xx-\CurrentOption.yyy}%|\\ % | {}%|\\ % | {\OptionNotUsed}}|\\ % Handle the option foo by loading the file |xx-foo.yyy| if it % exists, otherwise do nothing, but declare that the option was not % used. % Actually the |\OptionNotUsed| declaration is only needed if this is % being used in class files, but does no harm in package files. % % % \subsection{Safe Input Macros} % \DescribeMacro{\InputIfFileExists} % |\InputIfFileExists{|\meta{file}|}{|\meta{then}|}{|\meta{else}|}|\\ % Inputs \meta{file} if it exists. Immediately before the input, % \meta{then} is executed. Otherwise \meta{else} is executed. % % \DescribeMacro{\IfFileExists} % As above, but does not input the file. % % One thing you might like to put in the \meta{else} clause is % % \DescribeMacro{\@missingfileerror} % This starts an interactive request for a filename, supplying default % extensions. Just hitting return causes the whole input to be skipped. % (Perhaps we should let |x| denote quit the current run, as long as no % one wants to input a file of that name. % % \DescribeMacro{\input} % This has been redefined from the \LaTeX2.09 definition, in terms of % the new commands |\InputIfFileExists| and |\@missingfileerror|. % % % \DescribeMacro{\listfiles} Giving this declaration in the preamble % causes a list of all files input via the `safe input' commands to be % listed at the end. Any strings specified in the optional argument to % |\ProvidesPackage| are listed alongside the file name. So files in % standard (and other non-standard) distributions can put informative % strings in this argument. % % \StopEventually{} % % \section{Implementation} % % \begin{macrocode} %<*2ekernel> % \end{macrocode} % % % \changes{v0.2g}{1993/11/23} % {Various macros now moved to latex.tex.} % \changes{v0.2g}{1993/11/23} % {Warnings and errors now directly coded.} % \changes{v0.2h}{1993/11/28} % {Primitive filenames now terminated by space not \cmd\relax.} % \changes{v0.2h}{1993/11/28} % {Directory syntax checing moved to dircheck.dtx} % \changes{v0.2h}{1993/11/28} % {Assorted commands now in the kernel removed.} % \changes{v0.2i}{1993/12/03} % {\cmd\@onlypreamble: Many commands declared.} % \changes{v0.2i}{1993/12/03} % {Removed obsolete \cmd{\@documentclass}} % \changes{v0.2o}{1993/12/13} % {Removed setting \cmd\errcontextlines\ (now in latex.tex)} % \changes{v0.2p}{1993/12/15} % {Removed extra `.'s from \cmd{\@@warning}s} % \changes{v0.2s}{1994/01/17} % {Added many more \cmd{\@onlypreamble} commands} % \changes{v0.2s}{1994/01/17} % {Wrapped long lines to column 72} % \changes{v0.3a}{1994/03/02} % {Remove need for driver file} % \changes{v0.3b}{1994/03/08} % {Modify driver code into `new style'} % \changes{v0.3c}{1994/03/12} % {Change name from docclass to ltclass} % \changes{v0.3h}{1994/04/25} % {Removed spurious extra `.'s at the end of error messages} % \changes{v1.0a}{1994/04/29} % {Change version number to 1 (no other change)} % % \begin{macro}{\if@compatibility} % The flag for compatibilty mode. % \begin{macrocode} \newif\if@compatibility % \end{macrocode} % \end{macro} % % \begin{macro}{\@documentclasshook} % The hook called after the first |\documentclass| command. By % default this checks to see if |\@normalsize| is undefined, and if % so, sets it to |\normalsize|. % \changes{v0.2q}{1993/12/17} % {Macro added} % \changes{v0.2z}{1994/02/10} % {Changed the name from \cmd{\@compatibility} to % \cmd{\@documentclasshook}, and added the check for whether % \cmd{\@normalsize} has been defined. ASAJ.} % \begin{macrocode} \def\@documentclasshook{% \ifx\@normalsize\@undefined \let\@normalsize\normalsize \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\@declaredoptions} % This list is automatically built by |\DeclareOption|. % It is the list of options (separated by commas) declared in % the class or package file and it defines the order in which the % the corresponding |\ds@|\meta{option} commands are executed. % All local \meta{option}s which are not declared will be processed % in the order defined by the optional argument of |\documentclass| % or |\usepackage|. % \begin{macrocode} \let\@declaredoptions\@empty % \end{macrocode} % \end{macro} % % \begin{macro}{\@classoptionslist} % List of options of the main class. % \begin{macrocode} \let\@classoptionslist\relax % \end{macrocode} % \end{macro} % % \begin{macro}{\@unusedoptionlist} % List of options of the main class that haven't been declared or % loaded as class option files. % \begin{macrocode} \let\@unusedoptionlist\@empty % \end{macrocode} % \end{macro} % % \begin{macro}{\CurrentOption} % Name of current package or option. % \changes{v0.2c}{1993/11/17} % {Name changed from \cmd\@curroption} % \begin{macrocode} \let\CurrentOption\@empty % \end{macrocode} % \end{macro} % % \begin{macro}{\@currname} % Name of current package or option. % \begin{macrocode} \let\@currname\@empty % \end{macrocode} % \end{macro} % % \begin{macro}{\@currext} % The current file extension. % \changes{v0.2a}{1993/11/14}{Name changed from \cmd{\@currextension}} % \begin{macrocode} \global\let\@currext=\@empty % \end{macrocode} % \end{macro} % % \begin{macro}{\@clsextension} % \begin{macro}{\@pkgextension} % The two possible values of |\@currext|. % \begin{macrocode} \def\@clsextension{cls} \def\@pkgextension{sty} \@onlypreamble\@clsextension \@onlypreamble\@pkgextension % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\@pushfilename} % \begin{macro}{\@popfilename} % \begin{macro}{\@currnamestack} % Commands to push and pop the file name and extension. \\ % |#1| current name. \\ % |#2| current extension. \\ % |#3| current catcode of |@|. \\ % |#4| Rest of the stack. % \begin{macrocode} \def\@pushfilename{% \xdef\@currnamestack{% {\@currname}% {\@currext}% {\the\catcode`\@}% \@currnamestack}} \@onlypreamble\@pushfilename % \end{macrocode} % % \begin{macrocode} \def\@popfilename{\expandafter\@p@pfilename\@currnamestack\@nil} \@onlypreamble\@popfilename % \end{macrocode} % % \begin{macrocode} \def\@p@pfilename#1#2#3#4\@nil{% \gdef\@currname{#1}% \gdef\@currext{#2}% \catcode`\@#3\relax \gdef\@currnamestack{#4}} \@onlypreamble\@p@pfilename % \end{macrocode} % % \begin{macrocode} \gdef\@currnamestack{} \@onlypreamble\@currnamestack % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\@ptionlist} % Returns the option list of the file. % \begin{macrocode} \def\@ptionlist#1{% \@ifundefined{opt@#1}\@empty{\csname opt@#1\endcsname}} \@onlypreamble\@ptionlist % \end{macrocode} % \end{macro} % % \begin{macro}{\@ifpackageloaded} % \begin{macro}{\@ifclassloaded} % |\@ifpackageloaded{|\meta{name}|}| % Checks to see whether a file has been loaded. % \changes{v0.2t}{1994/01/18} % {Fix typo \cmd{\@pkgetension}} % \begin{macrocode} \def\@ifpackageloaded{\@ifl@aded\@pkgextension} \def\@ifclassloaded{\@ifl@aded\@clsextension} \@onlypreamble\@ifpackageloaded \@onlypreamble\@ifclassloaded % \end{macrocode} % % \begin{macrocode} \def\@ifl@aded#1#2{% \expandafter\ifx\csname ver@#2.#1\endcsname\relax \expandafter\@secondoftwo \else \expandafter\@firstoftwo \fi} \@onlypreamble\@ifl@aded % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\@ifpackagelater} % \begin{macro}{\@ifclasslater} % |\@ifpackagelater{|\meta{name}|}{YYYY/MM/DD}| % Checks that the package loaded is more recent than the given date. % \begin{macrocode} \def\@ifpackagelater{\@ifl@ter\@pkgextension} \def\@ifclasslater{\@ifl@ter\@clsextension} \@onlypreamble\@ifpackagelater \@onlypreamble\@ifclasslater % \end{macrocode} % % \begin{macrocode} \def\@ifl@ter#1#2{% \expandafter\@ifl@t@r \csname ver@#2.#1\endcsname} \@onlypreamble\@ifl@ter % \end{macrocode} % % This internal macro is also used in |\NeedsTeXFormat|. % \changes{v0.2f}{1993/11/22} % {Added //00 so parsing never produces a runaway argument.} % \begin{macrocode} \def\@ifl@t@r#1#2{% \ifnum\expandafter\@parse@version#1//00\@nil<% \expandafter\@parse@version#2//00\@nil \expandafter\@secondoftwo \else \expandafter\@firstoftwo \fi} \@onlypreamble\@ifl@t@r % \end{macrocode} % % \begin{macrocode} \def\@parse@version#1/#2/#3#4#5\@nil{#1#2#3#4 } \@onlypreamble\@parse@version % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\@ifpackagewith} % \begin{macro}{\@ifclasswith} % |\@ifpackagewith{|\meta{name}|}{|\meta{option-list}|}| % Checks that \meta{option-list} is a subset of the options % \textbf{with} which \meta{name} was loaded. % \begin{macrocode} \def\@ifpackagewith{\@if@ptions\@pkgextension} \def\@ifclasswith{\@if@ptions\@clsextension} \@onlypreamble\@ifpackagewith \@onlypreamble\@ifclasswith % \end{macrocode} % % \begin{macrocode} \def\@if@ptions#1#2{% \@expandtwoargs\@if@pti@ns{\@ptionlist{#2.#1}}} \@onlypreamble\@if@ptions % \end{macrocode} % % Probably shouldnt use |\CurrentOption| here\ldots (changed to % |\@tempb|.) % \changes{v0.2y}{1994/02/07} % {Add extra ,s so `two' is not matched with `twocolumn'} % \begin{macrocode} \def\@if@pti@ns#1#2{% \let\@tempa\@firstoftwo \@for\@tempb:=#2\do{% \expandafter\in@\expandafter{\expandafter,\@tempb,}{,#1,}% \ifin@\else\let\@tempa\@secondoftwo\fi}% \@tempa} \@onlypreamble\@if@pti@ns % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\ProvidesPackage} % Checks that the current filename is correct, and defines % |\ver@filename|. % \changes{v0.3c}{1994/03/12} % {Add \cmd{\wlog}} % \changes{v0.3c}{1994/03/12} % {use \cmd{\@gtempa}} % \begin{macrocode} \def\ProvidesPackage#1{% \xdef\@gtempa{#1}% \ifx\@gtempa\@currname\else \@latex@warning@no@line{You have requested \@cls@pkg\space`\@currname',\MessageBreak but the \@cls@pkg\space provides `#1'}% \fi \@ifnextchar[\@pr@videpackage{\@pr@videpackage[]}}%] \@onlypreamble\ProvidesPackage % \end{macrocode} % % \begin{macrocode} \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} \@onlypreamble\@pr@videpackage % \end{macrocode} % \end{macro} % % \begin{macro}{\ProvidesClass} % Like |\ProvidesPackage|, but for classes. % \begin{macrocode} \let\ProvidesClass\ProvidesPackage \@onlypreamble\ProvidesClass % \end{macrocode} % \end{macro} % % \begin{macro}{\ProvidesFile} % Like |\ProvidesPackage|, but for arbitrary files. Do not apply % |\@onlypreamble| to these, as we may want to label files input % during the document. % \changes{v0.2l}{1993/12/07} % {Macro added} % \changes{v0.3c}{1994/03/12} % {Add \cmd{\wlog}} % \changes{v0.3g}{1994/04/11} % {Protect against weird catcodes.} % \begin{macrocode} \def\ProvidesFile#1{% \begingroup \catcode`\ 10 % \@makeother\/% \@ifnextchar[{\@providesfile{#1}}{\@providesfile{#1}[]}} % \end{macrocode} % % \begin{macrocode} \def\@providesfile#1[#2]{% \wlog{File: #1 #2}% \expandafter\xdef\csname ver@#1\endcsname{#2}% \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\PassOptionsToPackage} % \begin{macro}{\PassOptionsToClass} % If the package has been loaded, we check that it was first loaded with % the options. Otherwise we add the option list to that of the package. % \begin{macrocode} \def\@pass@ptions#1#2#3{% \expandafter\xdef\csname opt@#3.#1\endcsname{% \@ifundefined{opt@#3.#1}\@empty {\csname opt@#3.#1\endcsname,}% \zap@space#2 \@empty}} \@onlypreamble\@pass@ptions % \end{macrocode} % % \begin{macrocode} \def\PassOptionsToPackage{\@pass@ptions\@pkgextension} \def\PassOptionsToClass{\@pass@ptions\@clsextension} \@onlypreamble\PassOptionsToPackage \@onlypreamble\PassOptionsToClass % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\DeclareOption} % \begin{macro}{\DeclareOption*} % Adds an option as a |\ds@| command, or the default |\default@ds| % command. % \changes{v0.2c}{1993/11/17} % {Error checking added} % \begin{macrocode} \def\DeclareOption{% \let\@fileswith@pti@ns\@badrequireerror \@ifstar{\@defdefault@ds}\@declareoption} \def\@declareoption#1#2{% \xdef\@declaredoptions{\@declaredoptions,#1}% \@namedef{ds@#1}{#2}} \def\@defdefault@ds#1{\def\default@ds{#1}} \@onlypreamble\DeclareOption \@onlypreamble\@declareoption \@onlypreamble\@defdefault@ds % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\OptionNotUsed} % If we are in a class file, add |\CurrentOption| to the list of % unused options. Otherwise, in a package file do nothing. % \begin{macrocode} \def\OptionNotUsed{% \ifx\@currext\@clsextension \xdef\@unusedoptionlist{% \ifx\@unusedoptionlist\@empty\else\@unusedoptionlist,\fi \CurrentOption}% \fi} \@onlypreamble\OptionNotUsed % \end{macrocode} % \end{macro} % % \begin{macro}{\default@ds} % The default default option code. % Set by |\@onefilewithoptions| to either |\OptionNotUsed| for % classes, or |\@unknownoptionerror| for packages. This may be reset % in either case with |\DeclareOption*|. % \begin{macrocode} % \let\default@ds\OptionNotUsed % \end{macrocode} % \end{macro} % % \begin{macro}{\ProcessOptions} % \begin{macro}{\ProcessOptions*} % |\ProcessOptions| calls |\ds@option| for each known package option, % then calls |\default@ds| for each option on the local options list. % Finally resets all the declared options to |\relax|. The empty option % does nothing, this has to be reset on the off chance it's set to % |\relax| if an empty element gets into the |\@declaredoptions| list. % % The star form is similar but executes options given in the order % specified in the document, not the order they are declared in the % file. In the case of packages, global options are executed before % local ones. % \changes{v0.2a}{1993/11/14} % {Stop adding the global option list inside class files.} % \changes{v0.2a}{1993/11/14} % {Optimise `empty option' code.} % \changes{v0.2b}{1993/11/15} % {Star form added.} % \changes{v0.2c}{1993/11/17} % {restoring \cmd{\@fileswith@pti@ns} added.} % \begin{macrocode} \def\ProcessOptions{% \let\ds@\@empty \edef\@curroptions{\@ptionlist{\@currname.\@currext}}% \@ifstar\@xprocess@ptions\@process@ptions} \@onlypreamble\ProcessOptions % \end{macrocode} % % \changes{v0.2y}{1994/02/07} % {Add extra ,s so `two' is not matched with `twocolumn'} % \begin{macrocode} \def\@process@ptions{% \@for\CurrentOption:=\@declaredoptions\do{% \ifx\CurrentOption\@empty\else \@expandtwoargs\in@{,\CurrentOption,}{% ,\ifx\@currext\@clsextension\else\@classoptionslist,\fi \@curroptions,}% \ifin@ \@use@ption \expandafter\let\csname ds@\CurrentOption\endcsname\@empty \fi \fi}% \@process@pti@ns} \@onlypreamble\@process@ptions % \end{macrocode} % % \changes{v0.2y}{1994/02/07} % {Add extra ,s so `two' is not matched with `twocolumn'} % \begin{macrocode} \def\@xprocess@ptions{% \ifx\@currext\@clsextension\else \@for\CurrentOption:=\@classoptionslist\do{% \ifx\CurrentOption\@empty\else \@expandtwoargs\in@{,\CurrentOption,}{,\@declaredoptions,}% \ifin@ \@use@ption \expandafter\let\csname ds@\CurrentOption\endcsname\@empty \fi \fi}% \fi \@process@pti@ns} \@onlypreamble\@xprocess@ptions % \end{macrocode} % % The common part of |\ProcessOptions| and |\ProcessOptions*|. % \begin{macrocode} \def\@process@pti@ns{% \@for\CurrentOption:=\@curroptions\do{% \@ifundefined{ds@\CurrentOption}% {\@use@ption \default@ds}% % \end{macrocode} % There should not be any non-empty definition of |\CurrentOption| at % this point, as all the declared options were executed earlier. This is % for compatibility with 2.09 styles which use |\def\ds@|\ldots\ % directly, and so have options which do not appear in % |\@declaredoptions|. % \begin{macrocode} \@use@ption}% % \end{macrocode} % Clear all the definitions for option code. First set all the declared % options to |\relax|, then reset the `default' and `empty' options. and % the lst of declared options. % \begin{macrocode} \@for\CurrentOption:=\@declaredoptions\do{% \expandafter\let\csname ds@\CurrentOption\endcsname\relax}% % \end{macrocode} % \begin{macrocode} \let\@fileswith@pti@ns\@@fileswith@pti@ns \AtEndOfPackage{\let\@unprocessedoptions\relax}} \@onlypreamble\@process@pti@ns % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\@options} % |\@options| is a synonym for |\ProcessOptions*| for upward % compatibility with \LaTeX2.09 style files. % \begin{macrocode} \def\@options{\ProcessOptions*} \@onlypreamble\@options % \end{macrocode} % \end{macro} % % \begin{macro}{\@use@ption} % Execute the code for the current option. % \changes{v0.2g}{1993/11/23} % {Name changed from \cmd{\@executeoption}} % \changes{v1.0e}{1994/05/17} % {Execute option after removing from list, not before} % \begin{macrocode} \def\@use@ption{% \@expandtwoargs\@removeelement\CurrentOption \@unusedoptionlist\@unusedoptionlist \csname ds@\CurrentOption\endcsname} \@onlypreamble\@use@ption % \end{macrocode} % \end{macro} % % \begin{macro}{\ExecuteOptions} % |\ExecuteOptions{|\meta{option-list}|}| executes the code declared % for each option. % \changes{v0.2d}{1993/11/18} % {Use \cmd{\CurrentOption} not\cmd{\@tempa}} % \changes{v0.2k}{1993/12/06} % {Preserve \cmd\CurrentOption} % \begin{macrocode} \def\ExecuteOptions#1{% \def\@tempa##1\@nil{% \@for\CurrentOption:=#1\do{\csname ds@\CurrentOption\endcsname}% \edef\CurrentOption{##1}}% \expandafter\@tempa\CurrentOption\@nil} \@onlypreamble\ExecuteOptions % \end{macrocode} % \end{macro} % % The top-level commands, which just set some parameters then call % the internal command, |\@fileswithoptions|. % \begin{macro}{\documentclass} % The main new-style class declaration. % \begin{macrocode} \def\documentclass{% \let\documentclass\@twoclasseserror \let\usepackage\RequirePackage \@fileswithoptions\@clsextension} \@onlypreamble\documentclass % \end{macrocode} % \end{macro} % % \begin{macro}{\documentstyle} % 2.09 style class `style' declaration. % \changes{v0.2a}{1993/11/14} % {Added \cmd\RequirePackage\ \cmd\@unusedoptionlist\ stuff.} % \changes{v0.2b}{1993/11/15} % {Modified to match \cmd{\ProcessOption*}} % \changes{v0.2d}{1993/11/18} % {Modified \cmd\RequirePackage\ stuff.} % \changes{v0.2n}{1993/12/09} % {input 209 compatibility file.} % \changes{v0.2o}{1993/12/13} % {compatibility file now latex209.sty.} % \changes{v0.2q}{1993/12/17} % {Match Alan's new code.} % \changes{v0.2u}{1994/01/21} % {compatibility file now latex209.def.} % \begin{macrocode} \def\documentstyle{% \makeatletter\input{latex209.def}\makeatother \documentclass} \@onlypreamble\documentstyle % \end{macrocode} % \end{macro} % % \begin{macro}{\RequirePackage} % Load package if not already loaded. % \begin{macrocode} \def\RequirePackage{% \@fileswithoptions\@pkgextension} \@onlypreamble\RequirePackage % \end{macrocode} % \end{macro} % % \begin{macro}{\LoadClass} % Load class. % \begin{macrocode} \def\LoadClass{% \ifx\@currext\@pkgextension \@latex@error {\noexpand\LoadClass in package file}% {You may only use \noexpand\LoadClass in a class file.}% \fi \@fileswithoptions\@clsextension} \@onlypreamble\LoadClass % \end{macrocode} % \end{macro} % % \begin{macro}{\usepackage} % To begin with, |\usepackage| produces an error. This is reset by % |\documentclass|. % \changes{v0.2o}{1993/12/13} % {Fixed error handling} % \changes{v1.0h}{1994/05/23}{Remove argument if possible} % \begin{macrocode} \def\usepackage#1#{% \@latex@error {\noexpand \usepackage before \string\documentclass}% {\noexpand \usepackage may only appear in the document preamble, i.e.,\MessageBreak between \noexpand\documentclass and \string\begin{document}.}% \@gobble} \@onlypreamble\usepackage % \end{macrocode} % \end{macro} % % \begin{macro}{\NeedsTeXFormat} % Check that the document is running on the correct system. % \changes{v0.2a}{1993/11/14} % {made more robust for alternative syntax for other formats.} % \changes{v0.2c}{1993/11/17} % {Name changed from \cmd\NeedsFormat} % \changes{v0.2d}{1993/11/18} % {\cmd\fmtname\ \cmd\fmtversion\ not \cmd{\@}\ldots} % \begin{macrocode} \def\NeedsTeXFormat#1{% \def\@tempa{#1}% \ifx\@tempa\fmtname \expandafter\@needsformat \else \@latex@error{This file needs format `\@tempa'% \MessageBreak but this is `\fmtname'}{% The current input file will not be processed further,\MessageBreak because it was written for some other flavor of TeX.\MessageBreak\@ehd}% % \end{macrocode} % If the file is not meant to be processed by \LaTeXe{} we stop % inputting it, but we do not end the run. We just end inputting % the current file. % \changes{v1.0h}{1994/05/23} % {Don't stop completely when format is wrong} % \begin{macrocode} \endinput \fi} \@onlypreamble\NeedsTeXFormat % \end{macrocode} % % \begin{macrocode} \def\@needsformat{% \@ifnextchar[%] \@needsf@rmat {}} \@onlypreamble\@needsformat % \end{macrocode} % % \changes{v1.0b}{1994/05/04} % {Changed wording of the warning} % \begin{macrocode} \def\@needsf@rmat[#1]{% \@ifl@t@r\fmtversion{#1}{}% {\@latex@warning@no@line {You have requested release `#1' of LaTeX,\MessageBreak but only release `\fmtversion' is available}}} \@onlypreamble\@needsf@rmat % \end{macrocode} % \end{macro} % % \begin{macro}{\zap@space} % |\zap@space foo|\meta{space}|\@empty| removes all spaces from |foo| % that are not protected by |{ }| groups. % \begin{macrocode} \def\zap@space#1 #2{% #1% \ifx#2\@empty\else\expandafter\zap@space\fi #2} % \end{macrocode} % \end{macro} % % \begin{macro}{\@fileswithoptions} % The common part of |\documentclass| and |\usepackage|. % \begin{macrocode} \def\@fileswithoptions#1{% \@ifnextchar[%] {\@fileswith@ptions#1}% {\@fileswith@ptions#1[]}} \@onlypreamble\@fileswithoptions % \end{macrocode} % % \changes{v0.2f}{1993/11/22} % {Made the default [] not [\cmd{\@unknownversion}]} % \begin{macrocode} \def\@fileswith@ptions#1[#2]#3{% \@ifnextchar[%] {\@fileswith@pti@ns#1[#2]#3}% {\@fileswith@pti@ns#1[#2]#3[]}} \@onlypreamble\@fileswith@ptions % \end{macrocode} % Then we do some work. % % First of all, we define the global variables. % Then we look to see if the file has already been loaded. % If it has, we check that it was first loaded with at least the current % options. % If it has not, we add the current options to the package options, % set the default version to be |0000/00/00|, and load the file if we % can find it. % Then we check the version number. % % Finally, we restore the old file name, reset the default option, % and we set the catcode of |@|. % % For classes, we can immediately process the file. For other types, % |#2| could be a comma separated list, so loop through, processing % each one separately. % \changes{v0.2q}{1993/12/17} % {Add \cmd{compatibility} hook} % \changes{v0.2s}{1994/01/17} % {Modify to reduce parameter stack usage} % \changes{v0.2y}{1994/02/07} % {Run \cmd{\@compatibility} on the first class to start % (not the first to finish) } % \changes{v0.2z}{1994/02/10} % {Renamed \cmd{\@compatibility} to \cmd{\@documentclasshook}. % ASAJ.} % \begin{macrocode} \def\@fileswith@pti@ns#1[#2]#3[#4]{% \ifx#1\@clsextension \ifx\@classoptionslist\relax \xdef\@classoptionslist{\zap@space#2 \@empty}% \def\@tempa{% \@onefilewithoptions#3[#2][#4]#1% \@documentclasshook}% \else \def\@tempa{% \@onefilewithoptions#3[#2][#4]#1}% \fi \else % \end{macrocode} % build up a list of calls to |\@onefilewithoptions| % (one for each package) without thrashing the parameter stack. % \begin{macrocode} \def\@tempb##1,{% \ifx\@nil##1\relax\else \ifx\relax##1\relax\else \noexpand\@onefilewithoptions##1[#2][#4]\noexpand\@pkgextension \fi \expandafter\@tempb \fi}% \edef\@tempa{\zap@space#3 \@empty}% \edef\@tempa{\expandafter\@tempb\@tempa,\@nil,}% \fi \@tempa} \@onlypreamble\@fileswith@pti@ns % \end{macrocode} % % Have the main argument as |#1|, so we only need one |\expandafter| % above. % \changes{v0.2a}{1993/11/14} % {Moved reseting of \cmd{\default@ds}, \cmd{\ds@} and % \cmd{\@declaredoptions} here, from the end of % \cmd\ProcessOptions.} % \changes{v0.2f}{1993/11/22} % {Made the initial version [] not [\cmd{\@unknownversion}]} % \changes{v0.2m}{1993/12/07} % {Reset \cmd\CurrentOption} % \begin{macrocode} \def\@onefilewithoptions#1[#2][#3]#4{% \@pushfilename \xdef\@currname{#1}% \global\let\@currext#4% \expandafter\let\csname\@currname.\@currext-h@@k\endcsname\@empty \let\CurrentOption\@empty \@reset@ptions \makeatletter % \end{macrocode} % Grab everything in a macro, so the parameter stack is popped before % any processing begins. % \changes{v0.2s}{1994/01/17} % {Modify to reduce parameter stack usage} % \begin{macrocode} \def\@tempa{% \@ifl@aded\@currext{#1}% {\@if@ptions\@currext{#1}{#2}{}% {\@latex@error {Option clash for \@cls@pkg\space #1}% {The package #1 has already been loaded with options:\MessageBreak \space\space[\@ptionlist{#1.\@currext}]\MessageBreak There has now been an attempt to load it with options\MessageBreak \space\space[#2]\MessageBreak Adding the line:\MessageBreak \space\space\string\usepackage [\@ptionlist{#1.\@currext},#2]{#1}\MessageBreak to your document may fix this.\MessageBreak Try typing \space \space to proceed.}}}% {\@pass@ptions\@currext{#2}{#1}% % \end{macrocode} % \changes{v0.3c}{1994/03/12} % {Do not use \cmd{\@pr@videpackage} to avoid typeout} % \begin{macrocode} \global\expandafter \let\csname ver@\@currname.\@currext\endcsname\@empty \InputIfFileExists {\@currname.\@currext}% {}% {\@missingfileerror\@currname\@currext}% % \end{macrocode} % |\@unprocessedoptions| will generate an error for each specified % option in a package unless a |\ProcessOptions| has appeared in the % package file. % \changes{v0.2v}{1994/01/29} % {All options raise error if no \cmd\ProcessOptions\ appears} % \changes{v0.2x}{1994/02/02} % {Only run the hook and options check if the file was loaded.} % \begin{macrocode} \let\@unprocessedoptions\@@unprocessedoptions \csname\@currname.\@currext-h@@k\endcsname \expandafter\let\csname\@currname.\@currext-h@@k\endcsname \@undefined \@unprocessedoptions} % \end{macrocode} % % \begin{macrocode} \@ifl@ter\@currext{#1}{#3}{}% {\@latex@warning@no@line {You have requested,\on@line, version\MessageBreak `#3' of \@cls@pkg\space #1,\MessageBreak but only version\MessageBreak `\csname ver@#1.\@currext\endcsname'\MessageBreak is available}}% % \end{macrocode} % \changes{v0.2c}{1993/11/17} % {Added trap for two \cmd{\LoadClass} commands.} % \begin{macrocode} \ifx\@currext\@clsextension\let\LoadClass\@twoloadclasserror\fi \@popfilename \@reset@ptions}% \@tempa} \@onlypreamble\@onefilewithoptions % \end{macrocode} % \end{macro} % % \begin{macro}{\@@fileswith@pti@ns} % Save the definition (for error checking). % \changes{v0.2c}{1993/11/17} % {Macro added} % \begin{macrocode} \let\@@fileswith@pti@ns\@fileswith@pti@ns \@onlypreamble\@@fileswith@pti@ns % \end{macrocode} % \end{macro} % % \begin{macro}{\@reset@ptions} % Reset the default option, and clear lists of declared options. % \changes{v0.2a}{1993/11/14}{macro added} % \begin{macrocode} \def\@reset@ptions{% \global\ifx\@currext\@clsextension \let\default@ds\OptionNotUsed \else \let\default@ds\@unknownoptionerror \fi \global\let\ds@\@empty \global\let\@declaredoptions\@empty} \@onlypreamble\@reset@ptions % \end{macrocode} % \end{macro} % % \subsection{Hooks} % % Allow code do be saved to be executed at specific later times. % % Save things in macros, I considered using toks registers, (and % |\addto@hook| from the NFSS code, that would require stacking the % contents in the case of required packages, so just generate a new % macro for each package. % \begin{macro}{\@begindocumenthook} % \begin{macro}{\@enddocumenthook} % Stuff to appear at the begining or end of the document. % \begin{macrocode} \let\@begindocumenthook\@empty \let\@enddocumenthook\@empty % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\g@addto@macro} % Globally add to the end of a macro. % \changes{v0.2a}{1993/11/14}{Made global} % \changes{v0.2w}{1994/01/31} % {Use toks register to avoid `hash' problems} % \begin{macrocode} \def\g@addto@macro#1#2{{% \toks@\expandafter{#1#2}% \xdef#1{\the\toks@}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfPackage} % \begin{macro}{\AtEndOfClass} % \begin{macro}{\AtBeginDocument} % \begin{macro}{\AtEndDocument} % The access functions. % \changes{v0.2a}{1993/11/14} % {Included extension in the generated macro name for package % and class hooks.} % \begin{macrocode} \def\AtEndOfPackage{% \expandafter\g@addto@macro\csname\@currname.\@currext-h@@k\endcsname} \let\AtEndOfClass\AtEndOfPackage \@onlypreamble\AtEndOfPackage \@onlypreamble\AtEndOfClass % \end{macrocode} % % \begin{macrocode} \def\AtBeginDocument{\g@addto@macro\@begindocumenthook} \def\AtEndDocument{\g@addto@macro\@enddocumenthook} \@onlypreamble\AtBeginDocument % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % % \begin{macro}{\@cls@pkg} % The current file type. % \changes{v0.2i}{1993/12/03} % {Name changed to avoid clash with output routine.} % \begin{macrocode} \def\@cls@pkg{% \ifx\@currext\@clsextension document class% \else package% \fi} \@onlypreamble\@cls@pkg % \end{macrocode} % \end{macro} % % \begin{macro}{\@unknownoptionerror} % Bad option. % \begin{macrocode} \def\@unknownoptionerror{% \@latex@error {Unknown option `\CurrentOption' for \@cls@pkg\space`\@currname'}% {The option `\CurrentOption' was not declared in \@cls@pkg\space`\@currname', perhaps you\MessageBreak misspelled its name. Try typing \space \space to proceed.}} \@onlypreamble\@unknownoptionerror % \end{macrocode} % \end{macro} % % \begin{macro}{\@@unprocessedoptions} % Declare an error for each option, unless a |\ProcessOptions| occured. % \changes{v0.2v}{1994/01/29} % {Macro added.} % \begin{macrocode} \def\@@unprocessedoptions{% \ifx\@currext\@pkgextension \edef\@curroptions{\@ptionlist{\@currname.\@currext}}% \@for\CurrentOption:=\@curroptions\do\@unknownoptionerror \fi} \@onlypreamble\@unprocessedoptions \@onlypreamble\@@unprocessedoptions % \end{macrocode} % \end{macro} % % \begin{macro}{\@badrequireerror} % |\RequirePackage| or |\LoadClass| occurs in the options section. % \changes{v0.2c}{1993/11/17} % {Macro added} % \begin{macrocode} \def\@badrequireerror#1[#2]#3[#4]{% \@latex@error {\noexpand\RequirePackage or \noexpand\LoadClass in Options Section}% {The \@cls@pkg\space `\@currname' is defective.\MessageBreak It attempts to load `#3' in the options section, i.e.,\MessageBreak between \noexpand\DeclareOption and \string\ProcessOptions.}} \@onlypreamble\@badrequireerror % \end{macrocode} % \end{macro} % % \begin{macro}{\@twoloadclasserror} % Two |\LoadClass| in a class. % \changes{v0.2c}{1993/11/17} % {Macro added} % \begin{macrocode} \def\@twoloadclasserror{% \@latex@error {Two \noexpand\LoadClass commands}% {You may only use one \noexpand\LoadClass in a class file}} \@onlypreamble\@twoloadclasserror % \end{macrocode} % \end{macro} % % \begin{macro}{\@twoclasseserror} % Two |\documentclass| or |\documentstyle|. % \changes{v0.2h}{1993/11/28} % {Macro added} % \begin{macrocode} \def\@twoclasseserror#1#{% \@latex@error {Two \noexpand\documentclass or \noexpand\documentstyle commands}% {The document may only declare one class.}\@gobble} \@onlypreamble\@twoclasseserror % \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{v0.2e}{1993/11/21} % {Stop infinite looping on \cmd{\@er@ext}} % \changes{v0.2h}{1993/11/28} % {Use filename parser from dircheck} % \changes{v0.3e}{1994/03/15} % {Quit on x or X just like a real error} % \changes{v1.0i}{1994/05/26} % {Modify message format} % \begin{macrocode} \def\@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\@tempa{x}\ifx\@tempa\@gtempa\batchmode\@@end\fi \def\@tempa{X}\ifx\@tempa\@gtempa\batchmode\@@end\fi \filename@parse\@gtempa \edef\filename@ext{% \ifx\filename@ext\relax#2\else\filename@ext\fi}% \edef\@tempa{% \noexpand\InputIfFileExists {\filename@area\filename@base.\filename@ext}% {}% {\noexpand\@missingfileerror {\filename@area\filename@base}{\filename@ext}}}% \@tempa \fi} % \end{macrocode} % \end{macro} % % \subsection{Providing shipment} % % \begin{macro}{\two@digits} % Prefix a number less than 10 with `0'. % \begin{macrocode} \def\two@digits#1{\ifnum#1<10 0\fi\number#1} % \end{macrocode} % \end{macro} % % \begin{macro}{\filecontents} % \begin{macro}{\endfilecontents} % This environment implements inline files. % The star-form does not write extra comments into the file. % % \changes{v0.2h}{1993/11/28} % {Don't globally allocate a write stream (always use 15)} % \changes{v0.2r}{1993/12/19}{Different message when ignoring a file} % \changes{v0.3g}{1994/04/11} % {Add star form, % dont write \cmd{\endinput} at the end of the file.} % \changes{v1.0c}{1994/05/11} % {Add checks for form feed and tab} % \begin{macrocode} \begingroup% \gdef\filecontents{\@tempswatrue\filec@ntents}% \catcode`\*=11 % \gdef\filecontents*{\@tempswafalse\filec@ntents}% \catcode`\^^M\active% \catcode`\^^L\active\let^^L\relax% \catcode`\^^I\active% \gdef\filec@ntents#1{% \openin\@inputcheck#1 % \ifeof\@inputcheck% \@latex@warning@no@line% {Writing file `\@currdir#1'}% \chardef\verbatim@out15 % \ch@ck7\verbatim@out\write% \else% \@latex@warning@no@line% {File `#1' already exists on the system.\MessageBreak% Not generating it from this source}% \def\immediate##1\relax{}% \fi% \immediate\openout\verbatim@out=#1\relax% \if@tempswa% \immediate\write\verbatim@out{% \@percentchar\@percentchar\space LaTeX2e file `#1'^^J% \@percentchar\@percentchar\space generated by the % `filecontents' environment^^J% \@percentchar\@percentchar\space from source `\jobname' on % \number\year/\two@digits\month/\two@digits\day.^^J% \@percentchar\@percentchar}\relax% \fi% \let\do\@makeother\dospecials% \@vwrend% \catcode`\^^L\active% \let\L\@undefined% \def^^L{\@ifundefined L^^J^^J^^J}% \catcode`\^^I\active% \let\I\@undefined% \def^^I{\@ifundefined I\space\space}% \catcode`\^^M\active% \def^^M##1^^M% {\def\@tempb{##1}% \ifx\@tempb\@tempa\expandafter\end\expandafter{\@currenvir}% \else\immediate\write\verbatim@out{##1}\relax\expandafter^^M\fi}}% \endgroup% \begingroup \catcode`/=0 \catcode`<=\catcode`{ \catcode`>=\catcode`} \catcode`|=\catcode`\% /catcode`/\=12 /catcode`/{=12 /catcode`/}=12 /catcode`/%=12 /catcode`/*=11 /gdef/@percentchar<%> /gdef/@vwrend> /gdef/endfilecontents<| /immediate/closeout/verbatim@out/relax /ifx/L/@undefined/else /@latex@warning@no@line
| /fi /ifx/I/@undefined/else /@latex@warning@no@line| /fi /immediate/write/@unused<>/relax> /global/let/endfilecontents*/endfilecontents| /@onlypreamble/filecontents /@onlypreamble/endfilecontents /@onlypreamble/filecontents* /@onlypreamble/endfilecontents* /endgroup \@onlypreamble\@vwrend % \end{macrocode} % \end{macro} % \end{macro} % % \subsection{Listing files} % % \begin{macro}{\@filelist} % A list of files input so far. % \begin{macrocode} \let\@filelist\@gobble % \end{macrocode} % \end{macro} % % \begin{macro}{\@addtofilelist} % Add to the list of files input so far. % \changes{v0.3d}{1994/03/13} % {Macro added} % \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{v0.2f}{1993/11/22} % {Removed checking for \cmd{\@unknownversion}} % \changes{v0.2s}{1994/01/17} % {New Version, adds `.tex' if needed, and lines up columns} % \changes{v1.0d}{1994/05/13} % {Stop \cs{listfiles} being run twice} % \begin{macrocode} \def\listfiles{% \let\listfiles\relax \def\@listfiles##1##2##3##4##5##6##7##8##9\@@{% \def\@tempd{\\}% \@tfor\@tempc:=##1##2##3##4##5##6##7##8\do{% \ifx\@tempc\@tempd \edef\filename@area{ \filename@area}% \fi}}% % \end{macrocode} % % \begin{macrocode} \AtEndDocument{% \typeout{^^J *File List*}% \@for\@currname:=\@filelist\do{% \filename@parse\@currname \edef\@tempa{% \filename@base.% \ifx\filename@ext\relax tex\else\filename@ext\fi}% \expandafter\let\expandafter\@tempb\csname ver@\@tempa\endcsname \expandafter\expandafter\expandafter\@listfiles\expandafter \filename@area\filename@base\\\\\\\\\\\\\\\\\\\@@ \typeout{% \filename@area\@tempa \ifx\@tempb\relax\else\@spaces\@tempb\fi}}% \typeout{ ***********^^J}}} % \end{macrocode} % % \changes{v0.3d}{1994/03/13} % {Reset \cmd{\@addtofilelist} at begin document} % \changes{v0.3f}{1994/03/16} % {Move this code directly into \cmd{\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} % % % \changes{v0.2f}{1993/11/22} % {\cs{@unknownversion} removed} % % \begin{macrocode} % % \end{macrocode} % % \section{After Preamble} % Finally we declare a package that allows all the commands declared % above to be |\@onlypreamble| to be used after |\begin{document}|. % \changes{v0.3f}{1994/03/16} % {Add pkgindoc package} % % \begin{macrocode} %<*afterpreamble> \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{pkgindoc} [1994/03/16 v1.0 Package Interface in Document (DPC)] \def\@tempa#1\do\@clsextension#2\do\listfiles#3\relax{% \gdef\@preamblecmds{#1#3}} \expandafter\@tempa\@preamblecmds\relax % % \end{macrocode} % % \Finale