%^^A* legal notices
% \iffalse
%
%   This program is part of the Frankenstein bundle for LaTeX.  
%
%   Copyright 1995-2001 Matt Swift <swift@alum.mit.edu>.
%
%   This file contains both the code and documentation for the
%   includex LaTeX package.  It will work ONLY if it is placed in a
%   proper directory.  Files called README, INSTALL, includex.tex
%   and includex.ins should have also been distributed to you
%   with this file.  See them for more information on how to typeset
%   the documentation with LaTeX and how to generate a version of this
%   file that will work faster than this one.
%
%   This program is free software; you may redistribute it and/or
%   modify it under the conditions of the LaTeX Project Public
%   License, either version 1.2 or (at your option) any later version.
%   The latest version of this license is in
%   http://www.latex-project.org/lppl.txt, and version 1.2 or later is
%   part of all distributions of LaTeX version 1999/12/01 or later.
%
%   This program 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.  See the
%   LaTeX Project Public License for more details.
%
% \fi  
%
%^^A* checks
%
%^^A NOTE:  The character table, with two %'s, will get written to all files.
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
%
% \CheckSum{227}
% 
% \begin{abstract}
%   Includex allows you to include just the contents of one source file into
%   another, ignoring the text outside the
%   \code{\begin{document}}\lips\code{\end{document}} in the included file.
%
%   This package is useful but may have problems and is unsupported.
%
%   See also the \package{newclude} package.
% \end{abstract}
% \tableofcontents
%
% \part{Discussion}
% \section{Including Files}
%
% \DescribeMacro{\include*}
% \cs\include was always pretty useless to me because it did a \cs\clearpage
% before and after the \cs\input.  The macro |\include*| is defined below to be
% like \cs\include but without the \cs\clearpage s.
%
% The other thing we do is define a command \cs\includedoc, which includes a
% file which is allowed to have its own \cs\documentclass and |\begin{document}|
% and |\end{document}| and \cs\usepackage commands.  
%
% This opens up a whole new world of truly modular \LaTeX{} files.  There is
% even nothing special about extracting the |document| environment, we can
% extract \emph{any} environment, or perhaps even other things.
%
% There are some problems, however.  Maybe the \cs\usepackage is necessary,
% maybe it would conflict.  Same with other commands like the \cs\newcommand
% family. It is simply not (yet) an issue in \LaTeX{} design to consider the
% implications of parent files.  The problems are not insurmountable.  We can
% begin by working with a convention, and ultimately maybe make some changes in
% certain macros.  I will be getting to all this.  I admit I have not looked
% carefully to see whether the design specifications of \LaTeX3{} address these
% important issues. 
%
% The macros here will be useful in many circumstances, when the included files
% are themselves simple.  
%
% \DescribeMacro{\includedoc}
% \DescribeMacro{\includedoc*}
% \DescribeMacro{\includedocskip}
% \DescribeMacro{\includedocskip*}
%   There are now two main commands, \cs\includedoc and \cs\includedocskip,
%   each with a |*| version analogous to the new \cmd{include*}.  Each take a
%   filename as an argument just like \cs\include.
%
%   \cs\includedoc\marg{filename} reads everything in the file except for
%   \cs\documentclass, \cs\usepackage, |\begin{document}|, |\end{document}|
%   (and whatever follows it).
%
%   \cs\includedocskip\marg{filename} does the same except it also skips
%   everything between \cs\documentclass and |\begin{document}|.
%
% \DescribeMacro{\disable}
%   At present there is a makeshift way to ignore additional commands when
%   using \cs\includedoc and \cs\includedocskip. If you want to cause \cs\foo
%   which takes no arguments to be disabled, say |\disable{\let\foo\relax}|. If
%   \cs\foo takes one mandatory argument, say |\let\foo\Gobble| instead.  If
%   \cs\foo takes one optional and one mandatory, say |\let\foo\GobbleOM|.  If
%   \cs\foo takes two mandatory arguments, say |\let\foo\GobbleMM|.  For other
%   permutations of arguments, you can extrapolate from the macros defined
%   below.
%
% \StopEventually{}
%
% \part{Implementation}
%
% \section{Version control}
%
%  \begin{macro}{\fileinfo}
%  \begin{macro}{\DoXUsepackagE}
%  \begin{macro}{\HaveECitationS}
%  \begin{macro}{\fileversion}
%  \begin{macro}{\filedate}
%  \begin{macro}{\docdate}
%  \begin{macro}{\PPOptArg}
% These definitions must be the first ones in the file.
%    \begin{macrocode}
\def\fileinfo{extra ways to include files}
\def\DoXPackageS {}
\def\fileversion{v0.6}
\def\filedate{1999/02/23}
% A trick to include(x!) Robin:
\let\MDSavedauthor\author
\renewcommand\author [1] {%
  \MDSavedauthor{#1\\and Robin Fairbairns}%    
}
\def\docdate{1999/02/23}
\edef\PPOptArg {%
  \filedate\space \fileversion\space \fileinfo
}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
% If we're loading this file from a \cs\ProcessDTXFile command (see the
% \package{compsci} package), then \cs\JusTLoaDInformatioN will be defined;
% othewise we assume it is not (that's why the FunkY NamE).
% 
% If we're loading from \cs\ProcessDTXFile, we want to load the packages listed
% in \cs\DoXPackageS (needed to typeset the documentation for this file) and
% then bail out.  Otherwise, we're using this file in a normal way as a
% package, so do nothing.  \cs\DoXPackageS, if there are any, are declared in
% the \ext{dtx} file, and, if you're reading the typeset documentation of this
% package, would appear just above.  (It's OK to call \cs\usepackage with an
% empty argument or \cs\relax, by the way.)
%    \begin{macrocode}
\makeatletter% A special comment to help create bst files.  Don't change!
\@ifundefined{JusTLoaDInformatioN} {%
  }{% ELSE (we know the compsci package is already loaded, too)
  \UndefineCS\JusTLoaDInformatioN
  \SaveDoXVarS
  \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined
    \usepackage{#1}%
  }%
  \RestoreDoXVarS
  \makeatother
  \endinput
}% A special comment to help create bst files.  Don't change!
%    \end{macrocode}
%
% Now we check for \LaTeX2e and declare the LaTeX package.
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{includex}[\PPOptArg]
%    \end{macrocode}^^A special comment to help create bst files.  Don't change!
%
% ^^A NOTE: We have to compensate for the above backslashes, which are not
% ^^A       actually in the .dtx file the author works on, by adding to the
% ^^A       CheckSum.
%%
% \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this.
% \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however...
% \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file 
%                   ^^A     that precede it.
% \IfCitations {%
%   \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in
% }                  ^^A the .dtx file, we need 2 more in the CheckSum.
%
% \AddToCheckSum{8}^^A Compensate for trick.
%
% \section{Requirements}
%
% Now we declare the package, check for \LaTeX2e, and load the other packages
% needed. 
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{includex}
\RequirePackage{latex-macros/moredefs}
%    \end{macrocode}
%
% \section{Disabling things}
%
% \begin{macro}{\disable}
% This allows the disabling hacks.
%    \begin{macrocode}
\ReserveCS\DisableMonster  % This line is elsewhere for main package
\newcommand\disable[1] {%
  \g@addto@macro\DisableMonster{#1}%
}
%    \end{macrocode}
% \end{macro}
%
% \section{New things}
%
% \begin{macro}{\sc@saved@include}
% \begin{macro}{\include}
% \begin{macro}{\sc@include}
% \begin{macro}{\sc@@include}
% This is a simple redefinition of \cs\include without the \cs\clearpage
% commands.  Nothing tricky going on. 
%    \begin{macrocode}
\newlet\sc@saved@include\include
\renewcommand\include {%
  \@ifstar
      \sc@include
    \sc@saved@include
}
\newcommand\sc@include {%
  \relax
  \ifnum\@auxout=\@partaux
    \@latex@error{\string\include\space cannot be nested}\@eha
  \else
    \expandafter\sc@@include
  \fi
}
\newcommand\sc@@include[1] {%
  \if@filesw
    \immediate\write\@mainaux{\string\@input{#1.aux}}%
  \fi
  \@tempswatrue
  \if@partsw 
    \@tempswafalse
    \edef\@tempb{#1}%
    \@for \@tempa:=\@partlist
      \do{\ifx\@tempa
            \@tempb
            \@tempswatrue
          \fi}%
  \fi
  \if@tempswa 
    \let\@auxout\@partaux 
    \if@filesw
      \immediate\openout\@partaux #1.aux%
      \immediate\write\@partaux{\relax}%
    \fi
    \@input@{#1.tex}%
    \@writeckpt{#1}%
    \if@filesw
% NOTE: Robin took out the \immediate here.
%      \immediate\closeout\@partaux 
      \closeout\@partaux 
    \fi
  \else
    \@nameuse{cp@#1}%
  \fi
  \let\@auxout\@mainaux
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% Now we start dealing with the much more tricky extraction of the |document|
% environment.
%
% We start with considering how to quit inputting a file.  The idea is to make
% the |\end{document}| command of the included file call \cs\endinput.  But
% there is a hitch that characters on the line after the |\end{document}| get
% inserted when you don't want them to.  To beat that limitation, we have to do
% some work.
%
% \begin{macro}{\sc@radical@shutdown}
% We will add a bunch of commands to this macro, with the idea of \cs\catcode ing
% everything and its brother to a comment.   This would be a brute force
% method! 
%    \begin{macrocode}
\ReserveCS\sc@radical@shutdown
%    \end{macrocode}
% First log a message that we're about to do some crazy things. In case
% something ever goes wrong, this might help.
%    \begin{macrocode}
\addto@macro\sc@radical@shutdown {%
  \PackageInfo{includex}{\protect\sc@radical@shutdown\space beginning}%
}
%    \end{macrocode}
% Now we start adding \cs\catcode commands.  These first two should be
% redundant; but just in case someone changed things\lips.
%    \begin{macrocode}
\addto@macro\sc@radical@shutdown{\catcode`\%=14}    % 14 = comment
\addto@macro\sc@radical@shutdown{\catcode`\^=7}     % 7 = superscript
%    \end{macrocode}
% \begin{macro}{\sc@disable@char}
% Next, we define a command we weill use in a loop in a moment.
%    \begin{macrocode}
\newcommand\sc@disable@char[1] {%
  \addto@macro\sc@radical@shutdown
    {\catcode`#1=14}}  % 14 = comment
%    \end{macrocode}
% \end{macro}
% The following list contains every keyboard char except these three, which are
% treated specially: |%#|.  
% The first is already a comment, and we handle the second in a moment.  Each
% character in the following list is \cs\catcode d to a comment:
%    \begin{macrocode}
\@tfor\sc@t@a:=abcdefghijklmnopqrstuvwxyz%
                ABCDEFGHIJKLMNOPQRSTUVWXYZ%
                ~!@$&*()_+-=[]|/?.,<>%
                1234567890%
                `'";:%
                \^\\\{\}\ % this is really the chars "^\{}" and space
    \do {\expandafter\sc@disable@char\sc@t@a}
%    \end{macrocode}
% We add |#| separately, because it's tricky or impossible to put it into the
% list we just used.
%    \begin{macrocode}
\sc@disable@char\#
%    \end{macrocode}
% We end the macro with \cs\endinput.  This has to come after all the previous,
% otherwise, \TeX{} goes ahead and reads to the end of the line immediately,
% with regular catcodes.  This is a good theory, I'm not sure it's necessary.
%    \begin{macrocode}
\addto@macro\sc@radical@shutdown{\endinput}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\sc@radical@shutdown@aftergroup}
% We need to use |\sc@radical@shutdown| this way.
%    \begin{macrocode}
\newcommand\sc@radical@shutdown@aftergroup {%
  \aftergroup\sc@radical@shutdown
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\sc@begindoc@toks}
% \begin{macro}{\sc@enddoc@toks}
% These are for \cs\AtBeginIncludedDocument and \cs\AtEndIncludedDocument.
%    \begin{macrocode}
\newtoks\sc@begindoc@toks
\sc@begindoc@toks{}
\newtoks\sc@enddoc@toks
\sc@enddoc@toks{}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\AtBeginIncludedDocument}
% The analogue of \cs\AtBeginDocument.
%    \begin{macrocode}
\newcommand\AtBeginIncludedDocument[1] {%
    \sc@begindoc@toks\expandafter{\the\sc@begindoc@toks#1}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\AtEndIncludedDocument}
% The analogue of \cs\AtEndDocument
%    \begin{macrocode}
\newcommand\AtEndIncludedDocument[1] {%
    \sc@enddoc@toks\expandafter{\the\sc@enddoc@toks#1}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\includedoc}
% \begin{macro}{\includedoc*}
% Now we start from the other end, defining the user command.
%    \begin{macrocode}
\newcommand\includedoc {%
% Robin's new:
  \@ifstar {%
      \def\sc@includebit@cmd{\include*}\sc@includebit
    }{% ELSE
    \let\sc@includebit@cmd\include\sc@includebit
  }%
}

% My old:
%      {\sc@includebit}
%    {\clearpage
%    \sc@includebit[\clearpage]}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\sc@includebit}
% The commented-out code is for some eventual extensions.
%
% Interface is \cmd{sc@includebit}\oarg{postlude}\marg{file} (where
% \oarg{postlude} is command(s) to be executed after the inclusion is
% complete); it is assumed that \cmd{sc@includebit@cmd} is either \cs\include
% or \cmd{include*}
%    \begin{macrocode}
\newcounter{sc@count}
\newcounter{bit}
\newcommand\sc@includebit [2] [] {%
  \setcounter{sc@count}{\thebit}%
  \begingroup
    \DisableMonster  
    \let\usepackage\GobbleOM
% Robin's new:
    \def\enddocument {%
      \makeatletter
      \the\sc@enddoc@toks
      \sc@radical@shutdown@aftergroup
    }
% My old:
% \let\enddocument\sc@radical@shutdown@aftergroup
    \let\documentclass\GobbleOM  
    \let\documentstyle\GobbleOM  % why worry about branching if 2.09..
    \def\document {%
      \the\sc@begindoc@toks
    }%
    \def\IncludedJobname {#2}%
    \sc@includebit@cmd{#2}% 
  \endgroup
  \par
  #1
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\includedocskip}
% \begin{macro}{\includedocskip*}
% Now we make a similar command that \emph{entirely} skips the preamble,
% whereas \cs\includedoc only skipped those commands that we specifically
% disabled.  Obviously this whole business of the preamble needs to be
% radically reconceived if convenient modularity of documents is to be had.  At
% the moment, no distinction is made between things like \cs\newcommand and
% \cs\usepackage that should be exported to a parent file, and those things that
% should not.
%    \begin{macrocode}
\newcommand\includedocskip {%
  \@ifstar {%
      \sc@includebitskip
    }{% ELSE
    \clearpage
    \sc@includebitskip[\clearpage]%
  }%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% I tried combining |\sc@includebitskip| and |\sc@includebit| but something
% changed when I used a conditional to do this.  I'm sure the problem could be
% figured out and the two combined.
%
% \begin{macro}{\sc@includebitskip}
% We begin skipping with the \cs\documentclass or \cs\documentstyle command, and
% stop with the |\begin{document}| command.  With some hacking to the new
% |verbatim| environment, this could be done.  I haven't done this yet, so this
% is implemented by stuffing everything into a macro argument.  I can't think
% of a \cs\begin occurring between \cs\documentclass the \cs\begin document, but
% that will screw things up if it does.
%
% The commented lines here are once again for a future extension.
%    \begin{macrocode}
\newcommand\sc@includebitskip [2] [] {%
  \setcounter{sc@count}{\thebit}%
  \begingroup
    \DisableMonster
    \let\enddocument\sc@radical@shutdown@aftergroup
    \long\def\documentclass ##1\begin{%
      \begingroup
      \def\@currenvir{document}%
      \GobbleM
    }% "{document}" is still to be read.
    \let\documentstyle\documentclass
    \include*{#2}%
  \endgroup
  \par
  #1\relax
}
%    \end{macrocode}
% \end{macro}
%
% \Finale
