%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
% This is file ltxtools-incluput.sty, version 0.0.1, December 2011.        %
%                                                                          %
% It can be used to input standalone subsidiary documents without          %
% also including their preamble and/or postamble. Files can be             %
% 'inputted' or 'included'.                                                %
%                                                                          %
% If you enter 'persistent=false' in the call to the package,              %
% you would have to put \let\documentclass\ltxtools-incluput at the top    %
% of every file to be included in the main document, otherwise enter it    %
% only in the first file to be input.                                      %
%                                                                          %
% Use the 'nested' option to input documents that themselves input         %
% other documents.                                                         %
%                                                                          %
% This work may be distributed and/or modified under the conditions        %
% of the LaTeX Project Public License, either version 1.3 of this          %
% license or any later version. The latest version of this license         %
% is in http://www.latex-project.org/lppl.txt and version 1.3 or later     %
% is part of all distributions of LaTeX version 2005/12/01 or later.       %
%                                                                          %
% Copyright (c) 2011 Ahmed Musa (a.musa@rocketmail.com).                   %
%                                                                          %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%

\@ifpackageloaded{ltxtools}{%
  \@ifpackagelater{ltxtools}{2011/12/12}{}{%
    \@latex@error{Loaded version of ltxtools package is
      not current}\@ehc
  }%
}{%
  \RequirePackage{ltxtools}[2011/12/12]%
}
\@ifpackageloaded{ltxkeys}{%
  \@ifpackagelater{ltxkeys}{2011/12/12}{}{%
    \@latex@error{Loaded version of ltxkeys package is
      not current}\@ehc
  }%
}{%
  \RequirePackage{ltxkeys}[2011/12/12]%
}
\UseNormalCatcodes
\StyleFilePurpose{Input standalone documents (AM)}
\StyleFileRCSInfo
$Id: ltxtools-incluput.sty,v 0.0.1 2011/12/12 09:00:00 Ahmed Musa Exp $
\ProvidesPackage{ltxtools-incluput}[\StyleFileInfo]
\NeedsTeXFormat{LaTeX2e}[2011/06/27]
\SetStyleFileMessages[inclp@]{info}{warn}{err}
\ifx\documentclass\@twoclasseserror\else
  \inclp@err{Package 'ltxtools-incluput' can't be loaded
    \MsgBrk outside document preamble}\@ehc
\fi
\AfterStartOfDocument{%
  \ifoneloadedTF{%
    docmute,standalone,fileimport-filedate
  }{%
    \inclp@err{Package 'ltxtools-incluput' can't be used
      \MsgBrk with package '\ltspkgcls'}\@ehc
    \expandafter\endinput
  }%
  \ifinclp@useincluput
    \gletcs\documentclass\incluput
    \incluputtrue
  \else
    \incluputfalse
  \fi
}
\cptnewbools{incluput}
\def\inclp@gobblepreamble{%
  \begingroup
  \everyeof{\begin{EOF}\relax}%
  \inclp@g@bblepreamble
}
\long\def\inclp@g@bblepreamble#1\begin#2{%
  \ifstrcmpTF{#2}{document}{%
    \endgroup
    \ifinclp@persistent\else
      \let\documentclass\@twoclasseserror
    \fi
    \inclp@afterpreamble
  }{%
    \ifstrcmpTF{#2}{EOF}{%
      \endgroup\endinput
    }{%
      \inclp@g@bblepreamble
    }%
  }%
}
\let\inclp@document\document
\let\inclp@enddocument\enddocument
\let\inclp@afterbegindoc\relax
\def\inclp@beforeenddoc{%
  \let\enddocument\inclp@enddocument
  \ifinclp@persistent\else
    \incluputfalse
  \fi
  \begingroup
}
\def\inclp@afterpreamble{%
  \inclp@afterbegindoc
  \def\enddocument{%
    \inclp@beforeenddoc
    \endinput
    \aftergroup\ignorespaces
  }%
  \ignorespaces
}
\newletcs\incluput\inclp@gobblepreamble
\ltxkeys@boolkey[KV]{incluput}[inclp@]{useincluput}[true]{}
\ltxkeys@boolkey[KV]{incluput}[inclp@]{persistent}[true]{%
  \ifinclp@persistent
    \def\document{%
      \inclp@document
      \let\documentclass\incluput
    }%
  \fi
}
\ltxkeys@boolkey[KV]{incluput}[inclp@]{nested}[true]{%
  \ifinclp@nested
    \let\inclp@afterbegindoc\begingroup
    \let\inclp@beforeenddoc\relax
  \else
    \inclp@info{Option 'nested' is false}%
  \fi
}
\ltxkeys@declareoption*{%
  \inclp@warn{Unknown option '#3' with value '#4' ignored}%
}
\ltxkeys@executeoptions[KV]<incluput>{persistent,useincluput=false}
\ltxkeys@processoptions*[KV]<incluput>\relax
\providecommand*\input@path{}
\robust@def*\InputDocument{%
  \let\inclp@input\@@input
  \inclp@inputdocument
}
\robust@def*\IncludeDocument{%
  \let\inclp@input\include
  \inclp@inputdocument
}
\robust@def*\inclp@inputdocument{%
  \ifinclp@persistent\else
    \inclp@warn{Option 'persistent' is false.\MsgBrk
      If you don't want to set 'persistent=true',\MsgBrk
      then you must put '\detokenize{\let\documentclass\incluput}'%
      \MsgBrk at the top of each document to input,
      \MsgBrk ie, before the \string\documentclass
    }%
  \fi
  \gletcs\inclp@inputpath\input@path
  \let\inclp@newgeometry\newgeometry
  \let\inclp@restoregeometry\restoregeometry
  \let\newgeometry\@gobble
  \let\restoregeometry\relax
  \cpt@teststopt\inclp@inputfile{.}%
}
\new@def*\inclp@inputfile[#1]#2{%
  \ifblankTF{#1}{}{%
    \edef\input@path{\expandcsonce\input@path{#1/}}%
  }%
  \ifboolTF{cpt@st}{%
    \inclp@inp@tfile{#2}%
  }{%
    \ifcsndefTF{#2@readx}{%
      \inclp@info{File '#2' already read:\MsgBrk
        File '#2' wasn't read again}%
    }{%
      \inclp@inp@tfile{#2}%
    }%
  }%
}
\new@def*\inclp@inp@tfile#1{%
  \IfFileExists{#1}{%
    \inclp@input\@filef@und
    \letcsntocs{#1@readx}\noboundary
    \inclp@afterfileinput
  }{%
    \typein[\answer]{^^J! File '\string#1' does not exist.
      ^^JEnter filename or 'x' and <return> to continue.}%
    \def\reserved@a{x}%
    \ifxTF\answer\reserved@a{%
      \inclp@afterfileinput
    }{%
      \cptexpandarg{\inclp@inputfile[]}\answer
    }%
  }%
}
\new@def*\inclp@afterfileinput{%
  \gletcs\input@path\inclp@inputpath
  \let\newgeometry\inclp@newgeometry
  \let\restoregeometry\inclp@restoregeometry
}

\endinput