%%%
%%% mylatex.ltx
%%%%%%%%%%%%%%%
%%%
%%% Use this file to make a format based on the preamble of any LaTeX
%%% file
%%%
%%% There are no restrictions on the distribution or modification of
%%% this file, except that other people should not attempt to alter
%%% the master copy on the ctan archives.
%%%
%%% Making the format
%%%%%%%%%%%%%%%%%%%%%
%%%
%%% Given a LaTeX file `abc.tex', use initex as follows:
%%%
%%% initex &latex  mylatex.ltx abc      (Generic TeX)
%%% initex \&latex mylatex.ltx abc      (unix and other TeX's)
%%% tex /i &latex  mylatex.ltx abc      (emtex)
%%%
%%% If you are on a Mac or using some shell that makes it inconvenient
%%% to use a command line such as the above examples then you may
%%% make a file `mylatex.tex' with the single line
%%% \input mylatex.ltx abc
%%% and then pass the file mylatex.tex to your (ini)tex shell to produce
%%% the format, ie something equivalent to initex &latex mylatex.tex.
%%%
%%% If you are using OzTeX, see the separate instructions below.
%%%
%%% This should make a format file mylatex.fmt which you can then use
%%% as follows
%%%
%%% Using the new format
%%%%%%%%%%%%%%%%%%%%%%%%
%%%
%%% tex  &mylatex abc          (generic TeX)
%%% virtex \&mylatex abc       (Unix TeX)
%%%
%%% This will process your document, abc.tex, just as LaTeX does, but
%%% quicker as the contents of the preamble will be stored in the
%%% format file and will not need to be run each time.
%%%
%%% If (vir)tex fails to find your mylatex.fmt then it is not searching
%%% in the current directory, either modify your TEXFORMATS path (or
%%% equivalent) to search `.' or (on unix/dos) use   ./  as in:
%%% virtex \&./mylatex abc
%%%
%%% Making and using the format with OzTeX
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%
%%% Given a LaTeX file `abc.tex', do this: select `TeX...' from OzTeX's
%%% TeX menu, and go to the folder containing the file `abc.tex' as if you
%%% were selecting the file `abc.tex'. Then hit the Cancel button - this
%%% procedure sets OzTeX's working folder to the one containing abc.tex.
%%% Next, select iniTeX from the TeX menu, and type:
%%%
%%% &latex mylatex.ltx abc
%%%
%%% This should make a format file mylatex.fmt which you can save in the
%%% same folder as the file you're working on.
%%%
%%% To use the new format, put this at the very start of the very first
%%% line of your document:
%%%
%%% %&mylatex
%%%
%%% Further Notes
%%%%%%%%%%%%%%%%%
%%%
%%% The file abc.tex must contain a line *just* with
%%% \begin{document}
%%% Everything up to (but not including) the \begin{document} will
%%% be saved in the format and not executed in subsequent runs.
%%%
%%% If you are modifying the document (or working on a similar document)
%%% you may wish to add new commands to your document preamble.
%%% The `mylatex' format normally skips the whole preamble (believing
%%% it to be pre-loaded) and so such new commands do not take effect.
%%% You could re-make the format, preloading the new preamble, but that
%%% might be inconvenient to do every time, and so an alternative scheme
%%% has been introduced.
%%% If the preamble contains a comment   mylatex  (ie a line just
%%% containing a % white space and the word mylatex) then the mylatex
%%% format will start reading the preable at that point so any new
%%% commands can be placed after such a comment and they will be
%%% executed.
%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% David Carlisle
%%%        1994/09/27
%%%
%%%  Modified 1994/10/21 after comments by
%%%           Volker Kunert <[email protected]>
%%%  Modified 1996/01/26 To fix printout of preloaded files (which
%%%            hasnt worked since December 94 release, and to fix
%%%            incompatibility with \makeindex command.
%%%  Modified 1997/10/04 To generalise the \makeindex support to work
%%%            with any (well most:-) \openout uses in the preamble.
%%%  Modified 1997/10/09 Most? Ross Moore pointed out I just broke
%%%            changebar, so further tinkering. Also useful discussions
%%%            with Ross lead to the following changes.
%%%            Added `mylatex' comment feature.
%%%            Added some font preloading.
%%%  Modified 1998/01/21 Jean-Francois Mertens pointed out that comments
%%%            before the first TeX command were broken by the previous
%%%            version. In particular %&mylatex special comments which
%%%            would be picked up by some TeX versions to automatically
%%%            select the format.
%%%  Modified 1998/10/14 Rowland McDonnell added notes on how to use
%%%            mylatex.ltx with OzTeX
%%%  Modified 1999/01/04 Rowland McDonnell corrected notes on how to
%%%            use mylatex.ltx with OzTeX.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\makeatletter

% Save the original definitions.
\let\MYLATEXdocument\document
\let\MYLATEXopenout\openout

% The version of \document to use on the initex run.
% Just preloads some fonts, puts back \document and \openout,
% sets up the banner to display the file list of files preloaded,
% then sets up some special catcodes so the preamble will be
% skipped on normal runs with the new format.
\def\document{\endgroup
% Force some font preloading.
{\setbox\z@\hbox{%
   $$% math (not bold, some setups don't have \boldmath)
   \normalfont% normal
   {\ifx\large\@undefined\else\large\fi % large and footnote
    \ifx\footnotesize\@undefined\else\footnotesize\fi}%
   {\bfseries\itshape}% bold and bold italic
   {\itshape}% italic
   \ttfamily% monospace
   \sffamily% sans serif
   }}%
 \let\document\MYLATEXdocument
 \let\openout\MYLATEXopenout
 \makeatother
 \everyjob\expandafter{\the\everyjob
    \begingroup
     \listfiles
     \expandafter\MYLATEXcustomised\@dofilelist
     \endgroup}%
 \@addtofilelist{.}%
 \catcode`\\=13\relax%
 \catcode`\#=12\relax%
 \catcode`\ =9\relax%
 \dump}


% In principle \openout stream= filename need not be space terminated,
% and need not be immediate, but this covers \makeindex \makeglossary
% and index package's \newindex which are all the cases of \openout
% that occur before \begin{document} that I could see.
% Thanks to Ross Moore for pointing out \AtBeginDocument is too late
% eg changebar package *closes* the stream in \AtBeginDocument, so need
% to make sure it is opened before that. Make a special purpose hook.
%
\def\openout#1 {%
 \g@addto@macro\MYLATEXopens{\immediate\openout#1 }}
\let\MYLATEXopens\@empty

% Templates for ending the `preamble skipping process'.
\def\MYLATEXbegin{\begin{document}}
\def\MYLATEXcomment{mylatex}

% Banner for \everyjob.
\def\MYLATEXcustomised#1#2#3\typeout#4{%
 \typeout{CUSTOMISED FORMAT. Preloaded files:^^J%
 \@spaces\@spaces.}#3}

% While the preamble is being skipped, the EOL is active
% and defined to grab each line and inspect it looking
% for \begin{document} or mylatex lines.
% The special catcodes required are not enabled until after the
% first TeX command in the file, so as to avoid problems with
% the special processing that TeX does on the first line, choosing
% the format, or the file name etc.
{\catcode`\^^M=\active%
 \catcode`\/=0 %
 /catcode`\\=13 %
 /gdef\{/catcode`/\=0 /catcode`/^^M=13   /catcode`/%=9 ^^M}%
 /long/gdef^^M#1^^M{%
   /def/MYLATEXline{#1}%
% If hit a comment `mylatex' then do as if you'd hit \begin{document}
% except don't run the real \document as a \begin{document} will be
% coming up later in the file at the end of the preamble.
   /ifx/MYLATEXline/MYLATEXcomment%
     /let/MYLATEXbegin/relax%
     /let/MYLATEXline/relax%
   /fi%
% If hit \begin{document} put things back as they should be, run the
% hook with any save \openouts then do the original \document code.
   /ifx/MYLATEXline/MYLATEXbegin%
     /catcode`/^^M=5/relax%
     /let^^M/par%
     /catcode`/#=6/relax%
     /catcode`/%=14/relax%
     /catcode`/ =10/relax%
     /expandafter/MYLATEXopens/expandafter/MYLATEXbegin%
   /else%
% Otherwise grab the next line to look at.
     /expandafter^^M%
   /fi}}%

% Trick lookahead to allow mylatex.ltx and the document filename to be
% given on the same command line. (initex &latex mylatex.ltx abc.tex)
\expandafter\input\endinput%