% \iffalse meta-comment
%
% Copyright 2011 Enrico Gregorio
%
% This file 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
%    http://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX 
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
% 
% The Current Maintainer of this work is Enrico Gregorio.
%
% This work consists of the files
%   xcite.dtx 
%   xcite.ins
% and the derived file xcite.sty.
% 
% \fi
% \iffalse
%
%<*driver>
\ProvidesFile{xcite.dtx}
%</driver>
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{xcite}
%<*package>
    [2011/09/02 v1.0 eXternal Citations (EG)]
%</package>
%
%<*driver>
\documentclass{ltxdoc}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
  \DocInput{xcite.dtx}
  \PrintChanges
\end{document}
%</driver>
% \fi
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \CheckSum{82}
%
% \changes{v1.00}{2011/09/02}
%         {First version}
%
% \GetFileInfo{xcite.dtx}
%
% \title{The \textsf{xcite} package\thanks{This file
%         has version number \fileversion, last
%         revised \filedate.}}
% \author{Enrico Gregorio\thanks{%
%   This package derives from \textsf{xr} by David Carlisle}\\
%   {\small\texttt{Enrico dot Gregorio at univr dot it}}}
% \date{\filedate}
% \maketitle
%
% \section{Description}
% This package implements a system for eXternal Citations.
% If one document needs to refer to citations in another, say |aaa.tex|,
% then this package may be loaded in the main file, and the command\\[\topsep]
% |\externalcitedocument{aaa}|\\[\topsep]
% given in the preamble.
%
% Then you may use |\cite| to refer to anything which has been
% declared by |\bibitem| in either |aaa.tex| or the main document.
% You may declare any number of such external documents. Notice that
% |\bibitem| commands may not appear in |aaa.tex|, but rather in
% |aaa.bbl| if \textsc{Bib}\negthinspace\TeX{} or Biber are used to
% generate the bibliography, but this doesn't matter. The important
% thing is that |aaa.tex| is in final form with all citations resolved
% and that |aaa.aux| is readable.
%
% If any of the external documents, or the main document, use the same
% citation key then an error will occur as the label will be multiply
% defined. To overcome this problem |\externalcitedocument| has an
% optional argument. If you declare\\[\topsep]
% |\externalcitedocument[A-]{aaa}|\\[\topsep]
% then all references from |aaa| are prefixed by |A-|. So for
% instance, if |aaa.tex| had |\bibitem{xyz}|, then this could be
% referenced with |\cite{A-xyz}|. The prefix need not be |A-|, it can
% be any string chosen to ensure that all the keys imported from
% external files are unique. Note however that if your style declares
% certain active characters (|:| in French, |"| in German) then these
% characters can not usually be used in |\cite|, and similarly may
% not be used in the optional argument to |\externalcitedocument|.
%
% \section{Acknowledgment}
% This package is just a straightforward modification of David
% Carlisle's \textsf{xr} package (based on Jean-Pierre Drucbert's
% work). The changes consisted in renaming the main command and
% substituting |\newlabel| with |\bibcite|; the |XR| prefix to
% internal commands has been changed into |XC|.
%
% These modifications are possible because |\newlabel| and |\bibcite|
% are almost the same command in disguise.
%
% This package originated from a question in
% |TeX.StackExchange.com|.\footnote{\ttfamily
% http://tex.stackexchange.com/questions/27243/}
%
% \StopEventually{}
%
% \section{The macros}
%
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
% Save the optional prefix. Start processing the first |aux| file.
%    \begin{macrocode}
\newcommand\externalcitedocument[2][]{{%
  \makeatletter
  \def\XC@prefix{#1}%
  \XC@next#2.aux\relax\\}}
%    \end{macrocode}
%
% Process the next |aux| file in the list and remove it from the head of
% the list of files to process.
%    \begin{macrocode}
\def\XC@next#1\relax#2\\{%
  \edef\XC@list{#2}%
  \XC@loop{#1}}
%    \end{macrocode}
%
% Check whether the list of |aux| files is empty.
%    \begin{macrocode}
\def\XC@aux{%
  \ifx\XC@list\@empty\else\expandafter\XC@explist\fi}
%    \end{macrocode}
%
% Expand the list of |aux| files, and call |\XC@next| to process the first
% one.
%    \begin{macrocode}
\def\XC@explist{\expandafter\XC@next\XC@list\\}
%    \end{macrocode}
%
% If the |aux| file exists, loop through line by line, looking for
% |\bibcite| and |\@input|. Otherwise process the next file in the
% list.
%    \begin{macrocode}
\def\XC@loop#1{\openin\@inputcheck#1\relax
  \ifeof\@inputcheck
    \PackageWarning{xc}{^^JNo file #1^^JLABELS NOT IMPORTED.^^J}%
    \expandafter\XC@aux
  \else
    \PackageInfo{xc}{IMPORTING LABELS FROM #1}%
    \expandafter\XC@read\fi}
%    \end{macrocode}
%
% Read the next line of the aux file.
%    \begin{macrocode}
\def\XC@read{%
  \read\@inputcheck to\XC@line
%    \end{macrocode}
% The |...| make sure that |\XC@test| always has sufficient arguments.
%    \begin{macrocode}
  \expandafter\XC@test\XC@line...\XC@}
%    \end{macrocode}
%
% Look at the first token of the line.
% If it is |\bibcite|, do the |\bibcite|. If it is |\@input|, add the
% filename to the list of files to process. Otherwise ignore.
% Go around the loop if not at end of file. Finally process the next
% file in the list.
%    \begin{macrocode}
\long\def\XC@test#1#2#3#4\XC@{%
  \ifx#1\bibcite
    \bibcite{\XC@prefix#2}{#3}%
  \else\ifx#1\@input
     \edef\XC@list{\XC@list#2\relax}%
  \fi\fi
  \ifeof\@inputcheck\expandafter\XC@aux
  \else\expandafter\XC@read\fi}
%    \end{macrocode}
%
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
% \Finale
%

