% chapterbib.sty Version 1.8 (29-APR-1999) Donald Arseneau % % Allow multiple bibliographies in a LaTeX document, including items % \cite'd in more than one bibliography. % % Instructions are below, after \endinput. % %====================== BEGIN MACROS =========================== \newenvironment{cbunit}% {\global\advance\c@inputfile\@ne \xdef\the@ipfilectr{@-\the\c@inputfile}% \@CB@writeContext}% {\gdef\the@ipfilectr{}\@CB@writeContext} \def\@CB@writeContext{\if@filesw\begingroup \edef\@tempa{\string\gdef\string\@extra@binfo{\@extra@b@citeb}}% \immediate\write\@auxout{\@tempa\@CB@wtoc{toc}\@CB@wtoc{lof}\@CB@wtoc{lot}}% \endgroup\fi} \def\@CB@wtoc#1{\string\@writefile{#1}{\gdef \string\the@ipfilectr{\@extra@b@citeb}}}% \let\cb@include\include \def\include#1{\clearpage \cbunit \xdef\@currentipfile{#1}% \cb@include{#1}\global\let\@currentipfile\@savedjobname\endcbunit} \newcommand\cb@input[1]{\cbunit \xdef\@currentipfile{#1}% \input{#1}\global\let\@currentipfile\@savedjobname\endcbunit} \let\cbinput\cb@input \@ifundefined{@extra@binfo}{% if not defined by compatible package \let\bibcite@iii\bibcite \def\bibcite#1{\bibcite@iii{#1\@extra@binfo}}% }{}% \@ifundefined{@extra@b@citeb}{% if not defined by compatible package \def\@citex[#1]#2{% Add \@extra@b@citeb to \cite \let\@citea\@empty \@cite{\@for\@citeb:=#2\do {\@citea\let\@citea\citepunct \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}% \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}} }{}% % Test if \@extra@b@citeb hook needs to be added to \nocite \setbox\@tempboxa\hbox{% \def\@extra@b@citeb{\global\let\@gtempa\relax}\@extra@b@citeb \def\@ifundefined#1#2#3{\global\let\@gtempa\@empty #1}% \@fileswfalse \nocite{x}} \ifx\@gtempa\@empty % define \nocite with hook \def\nocite#1{\@bsphack % Add \@extra@b@citeb to \nocite \@for\@citeb:=#1\do{% \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}% \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi \@ifundefined{b@\@citeb\@extra@b@citeb}{\G@refundefinedtrue \@warning{Citation `\@citeb' in file `\@currentipfile' undefined}}{}}% \@esphack} \fi \long\def\@firstofone#1{#1} \@ifundefined{citeform}{\let\citeform\@empty}{} \@ifundefined{citepunct}{\def\citepunct{,\penalty\@m\ }}{} \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. \@ifundefined{reset@font}{\let\reset@font\relax}{} \@ifundefined{G@refundefinedtrue}{\let\G@refundefinedtrue\relax}{} \let\cb@bibliographystyle\bibliographystyle \def\bibliographystyle#1{\if\cb@roottest\cb@bibliographystyle{#1}\fi} \def\cb@roottest{11}% was: {2\ifx\the@ipfilectr\@empty 1\else2\fi} \def\bibliography#1{\if\cb@roottest \if@filesw\immediate\write\@auxout{\string\bibdata{#1}}\fi \fi \cb@dobiblio{\@currentipfile.bbl}} \@ifundefined{PackageWarning}{\let\cb@warning\@warning}% {\def\cb@warning{\PackageWarning{chapterbib}}} \@ifundefined{@newl@bel}{% pre-1995; must redefine \@testdef \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}% \let\cb@dobiblio\@input}% {\let\cb@dobiblio\@input@} \def\sectionbib#1#2{% Macro to convert \thebibliography command \long\def\@tempa##1##{% to parse beginning of old def \long\def\@tempa####1\endthebibliography{}\def\@tempc{##1}\@tempa}% \expandafter\@tempa\thebibliography{}{}\endthebibliography \def\@tempa{\chapter*}\ifx\@tempa\@tempc\else \begingroup\toks@{#1}% \cb@warning {The sectionbib option changes \string"\expandafter \strip@prefix\meaning\@tempc\string" to \string"\the\toks@\string" in \string\thebibliography }\endgroup\fi \let\cb@thebibliography\thebibliography \def\thebibliography{\let\@currentlabel\@empty \ifx\the@ipfilectr\@empty \else \expandafter\expandafter\expandafter\cb@sectionbib\fi \cb@thebibliography}% \expandafter\def\expandafter\cb@sectionbib\@tempc##1{#1{\bibname}% \ifx\@currentlabel\@empty \begingroup \c@secnumdepth-\tw@ \addcontentsline{toc}{#2}{\bibname}% local: * -> no num \csname#2mark\endcsname{\bibname}\endgroup\fi }} \def\strip@prefix#1>{} \@ifundefined{bibname}{\def\bibname{Bibliography}}{} \@ifundefined{DeclareOption}{% LaTeX2.09 \def\@CB@wtoc#1{}% disable; broken in 2.09 }{% LaTeX2e option \ProvidesPackage{chapterbib}[1999/04/29 \space v 1.8 ] \DeclareOption{sectionbib}{\AtBeginDocument{\sectionbib{\section*}{section}}% \providecommand\StartFinalBibs{\chapter*{\bibname}\chaptermark\bibname \protected@edef\bibname{\chaptername\space\noexpand\thechapter}}}% \DeclareOption{draft}{\let\cbinput=\include} \DeclareOption{rootbib}{\def\cb@roottest{2\ifx\the@ipfilectr\@empty2\else1\fi}} \DeclareOption{duplicate}{\gdef\cb@biblist{}\let\cb@sub@input\@input@} \DeclareOption{gather}{\gdef\cb@biblist{}\let\cb@sub@input\@gobble} \ProcessOptions \ifx\cb@sub@input\@input@ \def\cb@dofinalbibs{\if@filesw \toks@{\let\cb@bc\bibcite\let\bibcite\@gobbletwo}% \immediate\write\@auxout{\the\toks@}\fi \let\cb@elt\cb@dogatherbib \cb@biblist \if@filesw\immediate\write\@auxout{\let\string\bibcite\string\cb@bc}\fi}% \fi \ifx\cb@sub@input\@gobble \def\cb@dofinalbibs{\let\cb@elt\cb@dogatherbib \cb@biblist}% \fi \ifx\cb@biblist\@empty % duplicate or gather declared \providecommand\StartFinalBibs{\protected@edef\bibname {\bibname\space for \chaptername\space \noexpand\thechapter}}% \def\cb@dobiblio#1{\begingroup\makeatletter \ifx\the@ipfilectr\@empty % in root \StartFinalBibs \cb@dofinalbibs \else % in chapter \let\cb@elt\relax \xdef\cb@biblist{\cb@biblist \cb@elt{\thechapter}{\the\c@inputfile}{\@currentipfile}}% \cb@sub@input{#1}% \fi\endgroup} \def\cb@dogatherbib#1#2#3{% \setcounter{chapter}{#1}% \global\c@inputfile#2\global\advance\c@inputfile\m@ne \IfFileExists{#3.bbl}{\cb@input{#3.bbl}}{}} \fi \AtBeginDocument{\let\sectionbib\undefined} } \endinput %====================== BEGIN INSTRUCTIONS =========================== % chapterbib.sty Version 1.8 (29-APR-1999) DA (gather, duplicate, toc) % ~~~~~~~~~~~~~~ 1.7 (21-JUL-1997) DA (sectionbib, \nocite) % 1.6 (08-FEB-1997) Donald Arseneau (more sectionbib) % 1.5 (09-OCT-1995) Donald Arseneau (rootbib) % 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 \bibliographystyle and \bibliography commands, % 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. Normal use: Put \bibliographystyle and \bibliography commands in % each \include'd file. Run LaTeX; run BibTeX on each included file; % run LaTeX; run LaTeX. % % 2. If you get errors like "! LaTeX Error: Command \xxx already defined." % then bibtex is foolishly putting "\newcommand" in each bbl file. The % fix is to put the \bibliography command in braces: {\bibliography{x}}. % % 3. The \bibliography and \bibliographystyle commands are not normally used % in the root file, only in files that have been \include'd. To have a % whole-document bibliography, see items 7-10, depending on which style of % whole-document bib. % % 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 package 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. % Even after putting the "\@extra@b@citeb" hook into \cite, there may be % a problem with \nocite. This package will try to detect the hook in % \nocite, but this might fail. If it does, then you may need to define % \nocite (with any "b@\@citeb" changed to "b@\@citeb\@extra@b@citeb") % in that sty 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. A bibliography in % the root file remains as a \chapter*. 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, or if you want them numbered, % it may be easier to redefine \thebibliography directly, without any % trickery. % For more control, or in old LaTeX2.09, you can use the \sectionbib % command directly in the document preamble. It takes two parameters: % the sectioning command, and the name of the sectioning level. For % instance, the [sectionbib] option does \sectionbib{\section*}{section}. % Again, for the most control, it is better to redefine \thebibliography % entirely. % % 7. If you want a completely unrelated bibliography in the root file, perhaps % for a general reading list, you can provide your own bibliography there % using the thebibliography environment. I don't suppose this will appeal % to BibTeX users! % % 8. To have a cohesive bibliography for the whole document, plus individual % bibs in the chapters, put \bibliography commands in the included chapters % plus in the root file; use \usepackage[rootbib]{chapterbib}; run LaTeX; % run BibTeX on the root file; change to \usepackage{chapterbib}; run % LaTeX; run BibTeX on each included file; run LaTeX; run LaTeX. % This produces an independent `overall' bibliography which only makes % sense for various `named' bibliography styles; a style with numbering % will give unrelated numbers in each bibliography. % Actually, you probably don't *need* to ever run with [rootbib] % because, although bibTeX should complain about multiple \bibdata % commands, it should produce all the right bbl files. % % 9. To have a bibliography-by-chapter at the end instead of separate bibs % in the chapters, use \usepackage[gather]{chapterbib} and run LaTeX as % in item 1. You can control the titling of the final bibliography by % defining \StartFinalBibs. The default definition is (like) % % \newcommand{\StartFinalBibs}{% % \renewcommand{\bibname}{Bibliography for Chapter \thechapter}} % % normally, but when using the [sectionbib] option it becomes % % \newcommand{\StartFinalBibs}{% % \chapter*{\bibname}\chaptermark{\bibname}% % \renewcommand{\bibname}{Chapter \thechapter}} % % You should really provide your own definition. % %10. To have bibliographies in each chapter PLUS a bibliography-by-chapter at % the end, follow item 9, but declare \usepackage[duplicate]{chapterbib} % (or \usepackage[duplicate,sectionbib]{chapterbib}). % %11. If you use Babel, load chapterbib before babel. % % \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 define \@biblabel to match. % \citepunct gives the punctuation (comma-penalty-space) between items. % % -----------------Implementation notes--------------- % % LaTeX normally uses command names in the form \b@TAG to associate a mnemonic % TAG with the citation name or number. Chapterbib changes this to a command % like \b@TAG@-nn where nn is a number identifying which included file is in % effect. % % 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. % % \include \cbinput and \cbunit: % ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ % 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. % % \cite: % ~~~~~~ % 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 do the redefinitions if no citation style that supports chapterbib % has been loaded--as indicated by existence of filename tags. % % \nocite: % ~~~~~~~~ % A while ago LaTeX changed its \nocite so it checks the validity of the % (no)citation tags. This necessitated adding the "\@extra@b@citeb" hook % to \nocite. At first, I only redefined \nocite when redefining \cite, % but there existed citation packages that supported chapterbib by putting % \@extra@b@citeb into \cite but which did not define \nocite at all! % These then gave warning messages for every \nocite. With version 1.7, % I now try exercising the \nocite command with some functions disabled: % (1) .aux file output is locally switched off; (2) The \@ifundefined % command is hacked to merely typeset the text of the tag; (3) this is % done in a disappearing \hbox so it generates no output. This detects % (by setting a global flag \@gtempa) a \nocite command that executes % \@ifundefined but not \@extra@b@citeb. In such cases, \nocite must % be redefined. % % \citepunct and \citeform: % ~~~~~~~~~~~~~~~~~~~~~~~~~ % These customization hooks are present in cite.sty; others (\citemid, % \citeleft, \citeright) are not defined here because \@cite is not redefined. % % We redefine \@testdef so that it properly checks whether the % \cite labels have changed. % % Handle package options and redefining thebibliography. [sectionbib] % converts "\chapter*{...}" to "\section*{\bibname\markright{\bibname}% % \addcontentsline{toc}{section}{\bibname}}" % % Table of contents etc: % ~~~~~~~~~~~~~~~~~~~~~~ % As of version 1.8, definitions of \@extra@b@citeb are written to the % toc, lot, and lof files to avoid undefined citation tags in those tables. % This is actually a problem in regular LaTeX with bibTeX -- cites that % appear in those tables get numbered starting with 1, but they should % be sequenced by where they originated -- but the problem was worse with % chapterbib. % %--------------------------------------------------------------- % % Authors Niel Kempson (original) % ~~~~~~~ Donald Arseneau March 1993 - Apr 1999 % % Changes with ver 1.8: options gather and duplicate; babel workarounds; toc % Changes with ver 1.7: change the \sectionbib command re. headings. % update \nocite and alter \citeform % Changes with ver 1.6: change the \sectionbib command to take arguments. % Changes with ver 1.5: rootbib option; item 8 in instructions. % 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 an % extra parameter to \bibcite. \@bibitem & \@lbibitem are left alone. Add % \citeform and \citepunct. Add \cbunit and \cbinput for use without \include.