%
% chapterbib.sty   Version 1.4 (11-MAR-1995) Donald Arseneau (sectionbib)
% ~~~~~~~~~~~~~~           1.3 (04-JUL-1994) Donald Arseneau (2e, cbunit)
%                          1.2 (21-MAY-1993) Donald Arseneau (bug fix)
%                          1.1 (24-MAR-1993) Donald Arseneau
%                          1.0 (23-NOV-1988) Niel Kempson
%
% Allow multiple bibliographies in a LaTeX document, including items
% \cite'd in more than one bibliography.  Despite the name "chapterbib",
% the bibliographies are for each included file, not necessarily for each
% chapter.  The main point is to allow you to use BibTeX: Each included 
% file should have its own \bibliography command, and you should run
% BibTeX on each included file separately rather than on the root file.
%
% There are also the commands \begin{cbunit}, \end{cbunit}, and \cbinput
% to allow multiple bibliographies without using \include (see item 4).
% There are two added hooks, \citeform and \citepunct, to customise the 
% formatting of each entry in a citation list.
%
% Usage, Restrictions, and Options
% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%
% 1. Put a \bibliography command in each \include'd file; run LaTeX; run BibTeX 
%    on each included file; run LaTeX.
% 
% 2. The \bibliography and \bibliographystyle commands may not be used in
%    the root file, only in files that have been \include'd. If you try to use
%    them, a LaTeX warning is issued and the offending command(s) ignored. This
%    restriction occurs because the root .aux file includes the subsidiary .aux
%    files and when BibTeX processes the root .aux file, it complains about
%    multiple \bibdata commands.
% 
% 3. If you want to \cite in the root file, you must provide your own
%    bibliography within the root file using the thebibliography environment. 
%    I don't suppose that this will appeal to BibTeX users! 
% 
% 4. If you can't use \include because a new section must start below the
%    preceding bibliography on the same page [odd format!], then you can
%    use \begin{cbunit}...\end{cbunit} or \cbinput, with a thebibliography
%    environment in each unit or input file.  To use BibTeX: input separate 
%    files using \cbinput; at first use the package or global option [draft],
%    run LaTeX on the document, then BibTeX on each file that was \cbinput; 
%    finally, remove the [draft] option and run LaTeX again (maybe twice to 
%    get page references right).  The [draft] option only affects the treatment
%    of \cbinput, not \include or \begin{cbunit}.
%        With old LaTeX, do the preliminary run using \include commands, and
%    change these to \cbinput for the final run(s).
% 
% 5. Your preferred citation style (xxx.sty) may not work with chapterbib at
%    first, but it is easy to make it compatible.  In `xxx.sty' change every
%    "b@\@citeb" to "b@\@citeb\@extra@b@citeb", and insert the line: 
%        \@ifundefined{@extra@b@citeb}{\def\@extra@b@citeb{}}{}
%    somewhere (but not as a comment or as part of another definition!). 
%    If the style file also redefines \bibcite then you should change that
%    definition, replacing "b@#1" with "b@#1\@extra@binfo", and insert 
%        \gdef\@extra@binfo{}
%    somewhere in the file.
%
% 6. The report and book document classes usually treat the bibliography as 
%    an unnumbered chapter (\chapter*), which is not so good for bibliographies 
%    IN a chapter.  You can specify  
%        \usepackage[sectionbib]{chapterbib}  
%    and your bibliographies will be treated as sections (\section*) with an
%    entry in the table of contents and the page-header.  The [sectionbib]
%    option modifies the existing thebibliography environment, so the other
%    formatting in the bibliography should remain unchanged.  On the other
%    hand, if you already have a non-standard bibliography defined, it may
%    not handle the sectionbib modification; you would have to handle any
%    modifications by yourself.
%    In old LaTeX2.09, you can declare \sectionbib in the document preamble.
%
% \citeform and \citepunct:
% ~~~~~~~~~~~~~~~~~~~~~~~~~
% Normally, the citations are formatted as given, but you can define \citeform
% (with one parameter) to reformat every citation.  Some possibilities:
%  \renewcommand\citeform[1]{\romannumeral 0#1}% roman numerals:  [iv,x]
%  \renewcommand\citeform[1]{(#1)}             % parentheses:  [(3),(4),(7)]
%  \renewcommand\citeform[1]{\thechapter.#1}   % number by chapter:  [3.9,3.10]
% If you change \citeform, you should change \@biblabel to match.
% \citepunct gives the punctuation (comma-penalty-space) between items.
%
% Tags indicating the citations and/or the input files:
% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
% \c@inputfile    = counter counting included files
% \the@ipfilectr  = (empty) when typesetting from the root file,
%                 = @-\the\c@inputfile when typesetting from an included file
% \@extra@b@citeb = \the@ipfilectr (just an alias)
% \@extra@binfo   = the value of \@extra@b@citeb as saved in .aux files
%
% \b@FOO:
% ~~~~~~~
% In the root file, the citation number (or name) is given by \b@FOO
% just like regular LaTeX, but in an \include'd file it is given by
% \b@FOO@-number.  Any definition of \cite (\@citex) should refer
% to this using \csname b@\@citeb\@extra@b@citeb \endcsname.
%---------------------------------------------------------------
% 
% Authors  Niel Kempson        (original)
% ~~~~~~~  Donald Arseneau  <asnd@reg.triumf.ca>   March 1993 - Mar 1995
%
% Changes with ver 1.4: sectionbib and draft options
% Changes with ver 1.3: rewrite: 
% The filename tag is defined in each .aux file by \include, not as as an
% extra parameter to \bibcite.  \@bibitem & \@lbibitem are left alone.  Add 
% \citeform and \citepunct. Add \cbunit and \cbinput for use without \include.
%
%======================BEGIN==MACROS===========================
% Redefine the \include macro so that when a file is \include'd...
% Increment the file number, (globally) update \the@ipfilectr to be 
% @-number, and write \gdef\@extra@binfo{@-number} in the (main) .aux 
% file, and do regular \include. When the \include'd file is finished, 
% write \gdef\@extra@binfo{} in the (main) .aux file. Globally reset 
% \the@ipfilectr to {}.  Provide similar \cbunit and \cbinput.

\newenvironment{cbunit}%
{\global\advance\c@inputfile\@ne \xdef\the@ipfilectr{@-\the\c@inputfile}%
  \immediate\write\@auxout{\string\gdef\string\@extra@binfo{\@extra@b@citeb}}}%
{\gdef\the@ipfilectr{}%
  \immediate\write\@auxout{\string\gdef\string\@extra@binfo{\@extra@b@citeb}}}

\let\cb@include\include
\def\include#1{\clearpage \cbunit \xdef\@currentipfile{#1}%
  \cb@include{#1}\global\let\@currentipfile\@savedjobname\endcbunit}

\newcommand\cbinput[1]{\cbunit \xdef\@currentipfile{#1}%
  \input{#1}\global\let\@currentipfile\@savedjobname\endcbunit}

%-------------------------------------------------------------
% Redefine \cite (\@citex actually) and \bibcite to use the file number
% tag along with the specified tag.  \@citex also uses \citeform as a hook 
% to reformat each individual citation.
% Only replace definitions if no citation style that supports chapterbib 
% has been loaded--as indicated by existence of filename tags.
%
\@ifundefined{@extra@binfo}{
  \def\bibcite#1#2{\global\@namedef{b@#1\@extra@binfo}{#2}}
}{}

\@ifundefined{@extra@b@citeb}{%
 \def\@citex[#1]#2{%
   \let\@citea\@empty
   \@cite{\@for\@citeb:=#2\do
     {\@citea\let\@citea\citepunct
      \edef\@citeb{\expandafter\@iden\@citeb}%
      \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi
      \@ifundefined{b@\@citeb \@extra@b@citeb}{\mbox{\reset@font\bf ?}%
         \@warning{Citation `\@citeb' in file `\@currentipfile'
             on page \thepage \space undefined}\G@refundefinedtrue}%
      {\hbox{\citeform{\csname b@\@citeb \@extra@b@citeb\endcsname}}}}}{#1}}
}{}% 2nd arg of \@ifundefined{@extra@b@citeb}

\def\@iden#1{#1}

% These customization hooks are present in cite.sty:
\@ifundefined{citeform}{\let\citeform=\relax}{}
\@ifundefined{citepunct}{\def\citepunct{,\penalty\@m\ }}{}
% others (\citemid, \citeleft, \citeright) are not defined here because 
% \@cite is not redefined.

%-------------------------------------------------------------
%  Initialize file-name tags
%
\xdef\@savedjobname{\jobname}           % save root file name as a macro
\let\@currentipfile\@savedjobname
\gdef\the@ipfilectr{}
\def\@extra@b@citeb{\the@ipfilectr}
\newcount\c@inputfile \global\c@inputfile=0

\gdef\@extra@binfo{}  % in case .aux files are left from old run.

%-------------------------------------------------------------
% OFSS:  Yes, I know the \let is superfluous.  \relax allows \@ifundefined
% to be used again by other packages.

\@ifundefined{reset@font}{\let\reset@font\relax}{}
\@ifundefined{G@refundefinedtrue}{\let\G@refundefinedtrue\relax}{}

%---------------------------------------------------------------
% We don't allow \bibliography and \bibliographystyle commands in the root
% file, so warn and ignore if appropriate.

\let\cb@bibliographystyle\bibliographystyle

\def\bibliographystyle#1{\ifx\the@ipfilectr\@empty 
 \cb@rootwarn\bibliographystyle \else
 \cb@bibliographystyle{#1}\fi}

\def\bibliography#1{\ifx\the@ipfilectr\@empty \cb@rootwarn\bibliography 
  \else  \if@filesw\immediate\write\@auxout{\string\bibdata{#1}}\fi
    \@input{\@currentipfile.bbl}\fi}

\def\cb@rootwarn#1{\cb@warning{\string#1\space 
  command in the root file ignored}}

\@ifundefined{PackageWarning}{\def\cb@warning{\@warning}}%
 {\def\cb@warning{\PackageWarning{chapterbib}}}

%---------------------------------------------------------------
% we redefine \@testdef so that it properly checks whether the 
% \cite labels have changed.

\let\@test@defiii\@testdef

\def\@testdef#1#2#3{%
  \if#1b\relax\@test@defiii b{#2\@extra@binfo}{#3}%
  \else \@test@defiii #1{#2}{#3}\fi
}
%---------------------------------------------------------------
% Handle package options and redefining thebibliography.  [sectionbib]
% converts "\chapter*{...}" to "\section*{\bibname\markright{\bibname}%
%   \addcontentsline{toc}{section}{\bibname}}"

\def\sectionbib{% Macro to convert \thebibliography command
 \long\def\@tempa##1##2##3\endthebibliography{% to parse beginning of old def
   \def\@tempa{\chapter*}\def\@tempb{##1##2}}% should start \chapter*{...
 \expandafter\@tempa\thebibliography{}\endthebibliography
 \ifx\@tempa\@tempb % \thebibliography has the expected format, so change
  \let\cb@thebibliography\thebibliography 
  \def\thebibliography{\ifx\the@ipfilectr\@empty \else
    \expandafter\expandafter\expandafter\cb@sectionbib\fi \cb@thebibliography}%
  \def\cb@sectionbib##1##2##3{\section*{\bibname
  % there is no \@mkright corresponding to \@mkboth, so fudge it:
  \ifx\@mkboth\@gobbletwo\else\markright{\uppercase{\bibname}}\fi
  \addcontentsline{toc}{section}{\bibname}}}%
 \else \cb@warning % \thebibliography has unexpected format, so give error
  {Your style of bibliography cannot be changed to the sectionbib style}%
 \fi \let\sectionbib\relax}

\@ifundefined{bibname}{\def\bibname{Bibliography}}{}

\@ifundefined{DeclareOption}{}{% LaTeX2e option
\ProvidesPackage{chapterbib}[1995/03/11 \space  v 1.4]
\DeclareOption{sectionbib}{\AtBeginDocument{\sectionbib}}
\DeclareOption{draft}{\let\cbinput=\include}
\ProcessOptions 
}
