From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Mon, 2 Sep 2019 13:46:59 +0900
Subject: Initial commit

---
 macros/latex/contrib/footbib/footbib.dtx | 2265 ++++++++++++++++++++++++++++++
 1 file changed, 2265 insertions(+)
 create mode 100644 macros/latex/contrib/footbib/footbib.dtx

(limited to 'macros/latex/contrib/footbib/footbib.dtx')

diff --git a/macros/latex/contrib/footbib/footbib.dtx b/macros/latex/contrib/footbib/footbib.dtx
new file mode 100644
index 0000000000..b68a1694e5
--- /dev/null
+++ b/macros/latex/contrib/footbib/footbib.dtx
@@ -0,0 +1,2265 @@
+% \iffalse
+%%
+%% File: footbib.dtx Copyright (C) 1997-2010 Eric Domenjoud
+%%
+%% Eric Domenjoud,
+%% LORIA/CNRS
+%% E-mail: Eric.Domenjoud@loria.fr
+%%
+% This program may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.2
+% 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.2 or later is part of all distributions of LaTeX 
+% version 1999/12/01 or later.
+%
+% This program consists of the files footbib.dtx and footbib.ins
+
+\def\fileversion{2.0.7}
+\def\filedate{2007/02/20}
+%<*driver>
+%%
+%%  To produce the documentation, do the following:
+%%
+%%    latex footbib.dtx
+%%    latex footbib.dtx
+%%    makeindex -s gind.ist footbib.idx -o footbib.ind
+%%    makeindex -s gglo.ist footbib.glo -o footbib.gls
+%%    latex footbib.dtx
+%%
+%%  In case makeindex does not find the style files gind.ist and gglo.ist,
+%%  either set the environment variable INDEXSTYLE to the path where these
+%%  files reside or use the full path in the commands above. 
+%%
+\documentclass{ltxdoc}
+%\DisableCrossrefs % uncomment when index is ready
+\CodelineIndex
+\RecordChanges
+%\OnlyDescription   % comment out for implementation details
+%\OldMakeindex     % use if your MakeIndex is pre-v2.9
+
+\title{The \textsf{footbib} package\thanks{This file has version
+       number \fileversion, last revised \filedate.}}
+\author{Eric Domenjoud\\Eric.Domenjoud@loria.fr}
+\date{\filedate}
+
+\hfuzz=20pt
+\begin{document}
+\DocInput{footbib.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{2069}
+%
+% \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         \~}
+%
+% \DoNotIndex{\',\+,\-,\.,\:,\<,\=,\>,\?,\^,\`,\~,\,,\@MM,\@Mii}
+% \DoNotIndex{\@Miii,\@addmarginpar,\@addtocurcol,\@botlist,\@bsphack,\@cclv}
+% \DoNotIndex{\@colht,\@colroom,\@combinefloats,\@currbox,\@currlist}
+% \DoNotIndex{\@dbldeferlist,\@dblfloatplacement,\@dbltoplist,\@deferlist}
+% \DoNotIndex{\@doclearpage,\@ehb,\@empty,\@esphack,\@finalstrut,\@firstofone}
+% \DoNotIndex{\@firstoftwo,\@for,\@freelist,\@gobble,\@holdpg,\@ifnextchar}
+% \DoNotIndex{\@ifpackagelater,\@ifstar,\@ifundefined,\@input,\@kludgeins}
+% \DoNotIndex{\@latexbug,\@latexerr,\@m,\@M,\@makecol,\@makefcolumn}
+% \DoNotIndex{\@makeother,\@makespecialcolbox,\@maxdepth,\@midlist,\@nameuse}
+% \DoNotIndex{\@ne,\@next,\@nil,\@nnil,\@onlypreamble,\@opcol,\@outputbox}
+% \DoNotIndex{\@outputpage,\@pagedp,\@pageht,\@parboxrestore,\@reinserts}
+% \DoNotIndex{\@specialoutput,\@tempa,\@tempb}
+% \DoNotIndex{\@tempboxa,\@tempdima,\@tempswafalse,\@tempswatrue,\@textbottom}
+% \DoNotIndex{\@texttop,\@toplist,\@undefined,\@whilesw,\active,\addpenalty}
+% \DoNotIndex{\advance,\afterassignment,\begingroup,\bfseries,\bigskipamount}
+% \DoNotIndex{\box,\boxmaxdepth,\c@fb,\catcode,\clearpage,\color@begingroup}
+% \DoNotIndex{\color@endgroup,\columnwidth,\count,\count@,\csname}
+% \DoNotIndex{\CurrentOption,\deadcycles,\DeclareOption,\DeclareRobustCommand}
+% \DoNotIndex{\def,\dimen}
+% \DoNotIndex{\dimen@,\do,\dp,\edef,\else,\end,\endcsname,\endgroup,\endinput}
+% \DoNotIndex{\ExecuteOptions,\expandafter,\fi,\floatingpenalty,\footins}
+% \DoNotIndex{\footnotesize,\gdef,\GenericError,\global,\hbox,\hfil,\hrule}
+% \DoNotIndex{\hsize,\hskip,\ht,\if@fcolmade,\if@filesw,\if@firstcolumn}
+% \DoNotIndex{\if@nobreak,\if@tempswa,\if@twocolumn,\ifdim,\iffalse,\ifnum}
+% \DoNotIndex{\ifodd,\ifvbox,\ifvoid,\ifx,\ignorespaces,\immediate}
+% \DoNotIndex{\input,\inputlineno,\insert,\interfootnotelinepenalty}
+% \DoNotIndex{\interlinepenalty,\jobname,\kern,\lastbox,\lccode,\leftskip}
+% \DoNotIndex{\let,\long,\lowercase,\maxdepth,\maxdimen,\meaning}
+% \DoNotIndex{\MessageBreak,\NeedsTeXFormat,\newcommand,\newcount,\newdimen}
+% \DoNotIndex{\newif,\newinsert,\newtoks,\newwrite,\nobreak,\noexpand}
+% \DoNotIndex{\normalcolor,\normalfont,\outputpenalty,\p@,\PackageError}
+% \DoNotIndex{\PackageWarning,\par,\penalty,\ProcessOptions,\ProvidesPackage}
+% \DoNotIndex{\relax,\renewcommand,\reset@font,\rule,\scriptspace,\setbox}
+% \DoNotIndex{\settowidth,\skip,\space,\splitmaxdepth,\splittopskip,\string}
+% \DoNotIndex{\strutbox,\textheight,\textsuperscript,\the,\thepage,\toks@}
+% \DoNotIndex{\unhbox,\unskip,\unvbox}
+% \DoNotIndex{\vbox,\vfil,\vskip,\vsplit,\wd,\write,\xdef,\z@}
+%
+%\makeatletter
+% \newcommand\SpecialNonMacroIndex[2]{^^A
+%   \@bsphack\index{#2\actualchar{\protect\ttfamily#2} (#1)\encapchar usage}^^A
+%   \index{#1s:\levelchar{\protect\ttfamily#2}\encapchar usage}\@esphack}
+% \newcommand\SpecialMainNonMacroIndex[2]{^^A
+%   \@bsphack\special@index{#2\actualchar{\string\ttfamily\space#2}
+%                 (#1)\encapchar main}^^A
+%   \index{#1s:\levelchar{\protect\ttfamily#2}\encapchar main}\@esphack} 
+% \newcommand*\NonM@cro@[1]{\m@cro@\iffalse{#1}^^A
+%   \let\SpecialMainEnvIndex\fb@tmp\ignorespaces}
+% \newenvironment{NonMacro}[1]{\let\fb@tmp\SpecialMainEnvIndex
+%   \def\SpecialMainEnvIndex{\SpecialMainNonMacroIndex{#1}}^^A
+%   \begingroup\@makeother\\\MakePrivateLetters\NonM@cro@}
+%   {\endenvironment}
+% \newcommand\DescribeNonMacro[2]{^^A
+%   {\def\SpecialEnvIndex{\SpecialNonMacroIndex{#1}}\DescribeEnv{#2}}}
+% \newcommand\newNonMacro[1]{\@newnonmacro#1\@nil}
+% \def\@newnonmacro#1#2\@nil{\uppercase{\@@newnonmacro{#1}}{#1}{#2}}
+% \newcommand\@@newnonmacro[3]{^^A
+%   \newenvironment{#2#3}{\NonMacro{#2#3}}{\endNonMacro}^^A
+%   \@namedef{Special#1#3Index}{\SpecialNonMacroIndex{#2#3}}^^A
+%   \@namedef{SpecialMain#1#3Index}{\SpecialMainNonMacroIndex{#2#3}}^^A
+%   \@namedef{Describe#1#3}{\DescribeNonMacro{#2#3}}}
+% \newNonMacro{option}
+% \newNonMacro{package}
+% \newcommand\Index[2]{^^A
+%     \SortIndex{#1 #2}{#1 #2\encapchar usage}^^A
+%     \SortIndex{#2}{#2\levelchar#1 \string\*\encapchar usage}}
+% \newcommand*\EndVerbChar{/}
+% \begingroup
+% \catcode`^=\active
+% \gdef\IndexSetup{\catcode\expandafter`\EndVerbChar=\active\begingroup
+%   \lccode`^=\expandafter`\verbatimchar\lccode`~=\expandafter`\EndVerbChar
+%   \lowercase{\endgroup\def~{^\verbmeta}\def\verbmeta##1{\meta{##1}\verb*^}}}
+% \endgroup
+% \newcommand*\VerbSetup[1]{\begingroup\lccode`\~=\expandafter`\EndVerbChar
+%   \lowercase{\let~\meta#1}\endgroup}
+% \newcommand\Fb@Index[2]{\addvspace{-\lastskip}\VerbSetup{#1{#2}}^^A
+%   \vskip-\MacrocodeTopsep\leavevmode}
+% \newcommand\FbIndex{\Fb@Index\SpecialIndex}
+% \newcommand\FbMainIndex{\Fb@Index\SpecialMainIndex}
+% \newenvironment{FbPatch}[1]
+%   {\vskip-\MacrocodeTopsep$\setbox\z@\hbox{$\braceld\m@th$}^^A
+%    \braceld\leaders\vrule \@height\ht\z@ \@depth\z@\hfill
+%    \lower.5ex\hbox{\kern1em{\tt footbib} #1\kern1em}^^A
+%    \leaders\vrule\@height\ht\z@\@depth\z@\hfill\bracerd\m@th$^^A
+%    \nobreak\vskip-\MacrocodeTopsep\nobreak}
+%   {\nobreak\vskip-\MacrocodeTopsep$\setbox\z@\hbox{$\braceld\m@th$}^^A
+%    \bracelu\leaders\vrule\@height\ht\z@\@depth\z@\hfill\braceru\m@th$^^A
+%    \nobreak\vskip-\MacrocodeTopsep}
+%\makeatother
+%
+% \newcommand\LATEX{({\let\TeX\relax\LaTeX})\TeX}
+% \maketitle
+% \setcounter{tocdepth}{2}
+% \tableofcontents
+%
+% \section{General overview}
+%
+%   This package makes bibliographic references appear
+% as footnotes. It defines a command |\footcite| which is similar to
+% the |\cite| command of \LaTeX\ but the references cited in this way
+% are inserted at the bottom of the pages. This \emph{foot
+% bibliography} does not conflict with the standard one and both may
+% exist simultaneously in a document. The command |\cite| may still be
+% used to produce the standard bibliography. 
+% 
+%   The foot bibliography uses its own style and bibliographic
+% database which are specified independently of the standard ones.
+% Any standard bibliography style may be used. If the style does not provide
+% explicit labels (e.g.~|plain|), the references are numbered.
+% The default is to number the references in the order in which they
+% appear in the |thebibliography| environment. This may be overridden through
+% options which allow the user to define a \emph{numbering
+% unit}\Index{numbering}{unit}. Then
+% the references will be numbered in the order in which they are
+% cited in the unit and the numbering restarts from 1 in each unit.
+% The numbering unit may be a page, a double page, a chapter, a part or
+% the whole document. Chapter and part may be used only if they are
+% defined by the document class. 
+%
+%   The user may also define a \emph{citation unit}\Index{citation}{unit}
+% which may be a page, a double page, a chapter, a part or the whole
+% document. The text of a reference will be inserted only once in 
+% each citation unit, on the page where the first citation occurs in
+% the unit. 
+%
+% The mechanism used to put a reference only once in each citation
+% unit may require several runs of \LaTeX\ (usually at least two) before the 
+% references find their exact place. If necessary, \LaTeX\ will issue, near
+% the end of the document, a warning saying 
+% \begin{center}
+%   |Package footbib Warning: Bibliography not yet stable. Rerun LaTeX.|
+% \end{center}
+%
+%   Using |footbib| in a document \meta{doc}|.tex| produces a file
+% \meta{doc}|.fb.aux|. One must pass the argument \meta{doc}|.fb| to \BibTeX\ 
+% to produce the bibliography which will be put in the file
+% \meta{doc}|.fb.bbl|. The exact sequence of commands is
+% \begin{trivlist}\leftskip=\leftmargini\parindent=0pt\item[]
+%   |latex|~\meta{doc}\\
+%   |bibtex|~\meta{doc}|.fb|\\
+%   |latex|~\meta{doc}\\
+%   |latex|~\meta{doc}\\
+%   \dots
+% \end{trivlist}
+%
+% \begin{description}
+% \item[Note:] The name \meta{doc}|.fb.aux| might cause some
+%      problem on systems which do not allow a double extension in
+%      a file name or put a limit on the length of file names.
+%      A user command is provided to change it (see section~\ref{sec:custom}).
+% \end{description}
+%
+% At the beginning of the document, |footbib| inputs the bibliography
+% from the file \meta{doc}|.fb.bbl| (or the name given by the
+% user). If one wants to include the |thebibliography|
+% environment\SpecialEnvIndex{thebibliography} in the main document,
+% this may be done with a |filecontents|
+% environment\SpecialEnvIndex{filecontents} before the
+% |\documentclass| command. See the \LaTeXe\ documentation for more
+% details about this environment.
+%
+% \section{User interface}
+%
+% \subsection{Package options}
+%
+% \subsubsection{\texttt{oneside}/\texttt{twoside}}
+%          \DescribeOption{oneside}^^A
+%          \DescribeOption{twoside}^^A
+%          The |oneside| and |twoside| options affect the behaviour
+%          of |footbib| when either unit (citation or numbering) is
+%          the page. In |oneside| mode, the actual unit is a single
+%          page while in |twoside| mode, the unit is a double page. These
+%          options may be used to override a global |oneside| or
+%          |twoside| option.
+%
+% \subsubsection{\texttt{citeonce}{\normalfont[\texttt*]}}
+%          \DescribeOption{citeonce}^^A
+%          \DescribeOption{citeonce*}^^A
+%          The |citeonce| option overrides the default \emph{citation
+%          unit}\Index{citation}{unit}. |footbib| puts the text of a
+%          reference only once in each citation unit which may be a
+%          (double) page, a chapter, a part or the whole document. The
+%          default citation unit is the page in |oneside| mode and the
+%          double page in |twoside| mode. The new citation unit (|chapter|,
+%          |part| or |document|) is given as an optional argument
+%          between parentheses (|citeonce(chapter)|, |citeonce(part)|
+%          or |citeonce(document)|). If no argument is supplied,
+%          |document| is assumed. The argument |chapter| (resp.~|part|) 
+%          may be used only if the document class defines |\chapter|
+%          (resp.~|\part|). The argument |page| may also be used but has a
+%          somehow special meaning. It defines a
+%          citation unit which is not overridden by another |citeonce| option
+%          but instead has a cumulative effect. For instance if one says 
+%\begin{verbatim}
+%    \usepackage[twoside,citeonce(page),citeonce(chapter)]{footbib}
+%\end{verbatim}
+%          then each double page and also each |\chapter| command starts a new
+%          citation unit. This may be useful if one wants a chapter to 
+%          start a new unit even if it starts on a right page.
+%          It is only meaningful in |twoside| mode in conjunction with
+%          another |citeonce| option. In all other cases, it has no effect.
+%
+%          The |citeonce| option has a star form |citeonce*| with the same
+%          optional argument. When the star form is used, for each subsequent
+%          citation of a reference in the same citation unit but on another
+%          (double) page, the text of the reference is not omitted but
+%          replaced with a cross reference to the first citation in the
+%          same citation unit. The |page| argument is not available since it
+%          would have no effect.
+%
+% \subsubsection{\texttt{firstcite}}
+%          \DescribeOption{firstcite}^^A
+%          The |firstcite| option affects the way the references are
+%          labelled. When the bibliography style does not provide
+%          explicit labels, the references are numbered. The default
+%          is to assign to each reference a \emph{static}
+%          label\Index{static}{label}
+%          which is its order in the |thebibliography| environment.
+%          The label is then the same for all citations of a
+%          given reference. The |firstcite| option causes the
+%          references to be numbered dynamically\Index{dynamic}{label}
+%          according to the order of their first citations. |firstcite|
+%          takes an optional argument between parentheses
+%          |firstcite(|\meta{unit}|)| which defines the
+%          \emph{numbering unit}\Index{numbering}{unit}.
+%          The numbering restarts then from 1 in each numbering unit.
+%          The argument \meta{unit} may take the value |page|,
+%          |chapter|, |part| 
+%          or |document|. If |page| is used, then the numbering
+%          unit is a page in |oneside| mode and a double page in
+%          |twoside| mode. If no argument is supplied, |document| is
+%          assumed. 
+%
+%          The effect of several |firstcite| options is cumulative in
+%          the sense that if one says for instance
+%\begin{verbatim}
+%    \usepackage[twoside,firstcite(page),firstcite(chapter)]{footbib}
+%\end{verbatim}
+%          \noindent then each double page \emph{and} each |\chapter| command
+%          starts a new numbering unit. This means that a |\chapter|
+%          command starts a new numbering unit even if it is on a right page.
+%
+%          If the bibliography style provides explicit 
+%          labels, the |firstcite| option has no effect.
+%
+% \subsubsection{{\normalfont\texttt{crossrefs}[\texttt*]} and
+%                \texttt{nocrossrefs}} 
+%          \DescribeOption{crossrefs}^^A
+%          \DescribeOption{crossrefs*}^^A
+%          \DescribeOption{nocrossrefs}^^A
+%          When an entry in the bibliographic database contains a
+%          |CROSSREF| field, \BibTeX\ includes the cross-referenced
+%          entry in the bibliography and puts a |\cite|
+%          command in the entry where the |CROSSREF| field occurs.
+%          If no standard bibliography is produced, \LaTeX\ 
+%          will complain about an undefined reference. 
+%          One may generally inhibit this behaviour of \BibTeX\ by
+%          invoking it with the |-min-crossrefs=|\meta{number}
+%          option which tells how many times an entry must
+%          be cross-referenced before it is included in the
+%          bibliography and replaced with a |\cite|
+%          command. Setting \meta{number} to a large value will
+%          generally inhibit the cross-referencing mechanism.
+%          However, this option has no effect if the 
+%          cross-referenced entry is explicitely cited in the
+%          document. 
+%
+%          The |crossrefs| option of |footbib| solves this problem by
+%          replacing each |\cite| command in a foot reference with
+%          |\footcite| (see the description of this command below).
+%          The star form |crossrefs*| replaces the 
+%          |\cite| command with a |\footcite*|, which means that
+%          the text of the reference is not inserted. It is then the
+%          responsibility of the user to insert the text in the right
+%          place with a |\footnocite| command. Of course, standard
+%          citation through |\cite| is not possible anymore in a foot
+%          reference when either form of this option is used. 
+%
+%          A |nocrossrefs| option is also provided to inhibit this
+%          behaviour in case it is not wanted but |crossrefs| occurs
+%          in the global options.
+%
+% \subsubsection{{\normalfont\texttt{split}} and \texttt{nosplit}}
+%          \DescribeOption{split}^^A
+%          \DescribeOption{nosplit}^^A
+%          The |nosplit| option tells |footbib| not to split the references
+%          across pages. The |split| option allows references to be
+%          split. |split| is the default and exists only to allow the
+%          user to override a global |nosplit| option.
+%
+% \subsection{Commands to generate the foot bibliography}
+% \begin{list}{}{\leftmargin=0pt \labelsep=0pt}
+% \item[]  \DescribeMacro{\footbibliography}
+%          |\footbibliography{|\meta{file}|,|\meta{file}|,|\dots|}|\\
+%          Defines the list of bibliographic databases for the foot
+%          bibliography. This command has the same syntax as the
+%          |\bibliography| command of \LaTeX. 
+% \item[]  \DescribeMacro{\footbibliographystyle}\leavevmode\noindent
+%          |\footbibliographystyle{|\meta{style}|}|\\
+%          Defines the style of the foot bibliography. This command has
+%          the same syntax as
+%          the |\bibliographystyle| command of \LaTeX.
+% \item[]  \DescribeMacro{\footcite}\noindent
+%          |\footcite{|\meta{key}|,|\meta{key}|,|\dots|}|\\
+%          Puts the list of labels in the text and the text of the
+%          references at the bottom of the page. The text of each
+%          reference is inserted at most once in a citation unit,
+%          even if it is cited several times. 
+% \item[]  \DescribeMacro{\footcite*}\noindent
+%          |\footcite*{|\meta{key}|,|\meta{key}|,|\dots|}|\\ 
+%          Puts the list of labels in the text but does not put the
+%          reference at the bottom of the page.
+% \item[]  \DescribeMacro{\footnocite}\noindent
+%          |\footnocite{|\meta{key}|,|\meta{key}|,|\dots|}|\\
+%          Puts the reference at the bottom of the page but puts
+%          nothing in the text.
+% \end{list}
+% \begin{description}
+% \item[Note:] The main purpose of the commands |\footcite*| and
+%        |\footnocite| is to solve the problem of a 
+%        |\footcite| occuring inside an environment where the
+%        reference will be lost (for instance in a |minipage| or
+%        |tabular| environment, in a |\mbox|, etc.). In this case,
+%        if the reference is not cited otherwise on the same page, it
+%        won't show up at the bottom of the page. It suffices to add
+%        a |\footnocite| command just before or after this environment.
+%        The command |\footcite{|\meta{key}|}| is more or less (but
+%        not completely) equivalent to
+%        |\footcite*{|\meta{key}|}\footnocite{|\meta{key}|}|.
+% \end{description}
+%
+% \subsection{Customisation}\label{sec:custom}
+%
+% \begin{list}{}{\leftmargin=0pt \labelsep=0pt}
+% \item[]  \DescribeMacro{\footbibliographyname}
+%          The basename of the |.aux| and |.bbl| files used for the
+%          foot bibliography may be redefined by
+%
+%          \qquad |\footbibliographyname{|\meta{name}|}|
+%
+%           The default value is
+%          |\jobname.fb|\footnote{\texttt{\string\jobname} is a
+%          primitive \TeX\ command which holds the name of the main
+%          document.} which causes |footbib| to read the bibliography
+%          from 
+%          |\jobname.fb.bbl| and  to use |\jobname.fb.aux| as an
+%          auxiliary file. This command may be used only in the preamble.
+%          The name supplied to |\footbibliographyname| must be
+%          different from the name of the main document.
+% \item[]  \DescribeMacro{\footcitelabel}^^A
+%          \DescribeMacro{\putfootcitelabel}^^A
+%          \DescribeMacro{\footcitelistformat}^^A
+%          The list of citations in the text may not be typeset in
+%          one step as done by the |\cite| command of \LaTeX. 
+%          The reason is that the command which creates the text of
+%          the reference must be inserted after each citation.
+%          The way \LATEX\ handles insertions makes 
+%          them vanish if they occur in a box. Hence if the command
+%          which formats the list of citations puts them in a box,
+%          the text is lost and the references do not show up at the
+%          bottom of the page. All references could be inserted at
+%          once, either before or after the list of citations but if
+%          this list gets split across pages, the text of some
+%          references could show up on the wrong page. Hence 
+%          the list is created one piece at a time and the text of
+%          the corresponding reference is inserted after each
+%          citation. The list of citation is created as follows: 
+% \begin{tabbing}
+% \qquad\=1)~\=start of list\\
+%     \>2)\>for each citation:\\
+%     \>\>a)~if it is not the first one, separator of citations\\
+%     \>\>b)~label of the reference, to which |\footcitelabel| is applied\\
+%     \>\>c)~insertion of the text of the reference\\
+%     \>3)\>end of list
+% \end{tabbing}
+% The separator of citations is made of two parts: \meta{sep$_1$} and
+% \meta{sep$_2$}. 
+% The command |\putfootcitelabel| is applied to each component of the
+% list, excepted \meta{sep$_2$} which is put as such.
+% Typically, \meta{sep$_2$} is a separator which may disappear at a line
+% break, like a penalty or some spacing. That's why
+% |\putfootcitelabel| is not applied to it so that it won't be put
+% in a box. The effect is as follows:
+% \begin{trivlist}\leftskip=\leftmargini\parindent=0pt\item[]
+%   |\putfootcitelabel{|\meta{start of list}|}|\\
+%   |\putfootcitelabel{\footcitelabel{|\meta{label $1$}|}}|\\
+%   \meta{insertion of the text of reference $1$}\\
+%   |\putfootcitelabel{|\meta{sep$_1$}|}|\\
+%   \meta{sep$_2$}\\
+%   |\putfootcitelabel{\footcitelabel{|label $2$|}}|\\
+%   \meta{insertion of the text of reference $2$}\\
+%   |\putfootcitelabel{|\meta{sep$_1$}|}|\\
+%   \meta{sep$_2$}\\
+%   \null\quad\vdots\\
+%   |\putfootcitelabel{\footcitelabel{|label $n$|}}|\\
+%   \meta{insertion of the text of reference $n$}\\
+%   |\putfootcitelabel{|\meta{end of list}|}|
+% \end{trivlist}
+%
+% Each component of the list may be redefined as follows:
+% \begin{trivlist}\leftskip=\leftmargini\parindent=0pt\item[]
+% |\renewcommand*\footcitelabel[1]{|\dots|}|\\
+% |\renewcommand*\putfootcitelabel[1]{|\dots|}|\\
+% |\footcitelistformat|\meta{start of list}\meta{sep$_1$}^^A
+%     \meta{sep$_2$}\meta{end of list}
+% \end{trivlist}
+% \end{list}
+% Here are some examples of the variations allowed by this mechanism.
+% \begin{description}\topsep=0pt
+% \item[example 1:]list of citations \emph{a la \LaTeX}: [label $1$,
+%       label $2$, \dots]
+%\begin{verbatim*}
+%\renewcommand*\footcitelabel[1]{#1}
+%\renewcommand*\putfootcitelabel[1]{#1}
+%\footcitelistformat[,{\penalty1000\ }]
+%\end{verbatim*}
+% \item[example 2:]ditto but the list may not be cut\par
+%     \leavevmode\quad\vdots
+%\begin{verbatim*}
+%\footcitelistformat[,{\nobreak\ }]
+%\end{verbatim*}
+% \item[example 3:] the list is raised and the labels are
+%       separated only by commas, without any space: 
+%     \textsuperscript{\normalfont[label $1$,label $2$,\dots]}
+%\begin{verbatim*}
+%\renewcommand*\footcitelabel[1]{#1}
+%\renewcommand*\putfootcitelabel[1]{\textsuperscript{\normalfont#1}}
+%\footcitelistformat[,{\penalty1000\relax}]
+%\end{verbatim*}
+% \item[example 4:] ditto, but no brackets around the list of labels:
+%     \textsuperscript{\normalfont label $1$,label $2$,\dots}\par
+%     \leavevmode\quad\vdots
+%\begin{verbatim*}
+%\footcitelistformat{},{\penalty1000\relax}{}
+%\end{verbatim*}
+% \item[example 5:] [label $1$], [label $2$], \dots
+%\begin{verbatim*}
+%\renewcommand*\footcitelabel[1]{[#1]}
+%\renewcommand*\putfootcitelabel[1]{#1}
+%\footcitelistformat{},{\penalty1000\ }{}
+%\end{verbatim*}
+% \end{description}
+% The default definitions are the ones of example 3 above.
+%
+% \begin{list}{}{\leftmargin=0pt\labelsep=0pt}
+% \item[] \DescribeMacro{\footbibskip}^^A
+%         \DescribeMacro{\footbibrule}^^A
+%          The foot bibliography is
+%          separated from the rest of the page by a vertical skip of
+%          length |\footbibskip| in which a horizontal line is
+%          drawn by the command |\footbibrule|. The height of the
+%          skip and the horizontal 
+%          line may be redefined in the preamble by\par\medskip
+%            {\leftskip=\leftmargini\parskip=0pt
+%            |\setlength\footbibskip{|\dots|}|\par
+%            |\renewcommand\footbibrule{|\dots|}|\par}
+%          \textbf{CAUTION}~~|\footbibrule| must take zero vertical space.
+% \item[]  \DescribeMacro{\footreflabel}^^A
+%          The label of the reference is formated by the macro
+%          |\footreflabel| which takes the label as argument. It 
+%          may be redefined by |\renewcommand*\footreflabel[1]{|\ldots|}|.
+% \item[]  \DescribeMacro{\footrefstyle}
+%          The label and the text of the reference at the bottom of
+%          the page are typeset in the style defined by the command
+%          |\footrefstyle| which may be redefined in the preamble by
+%          |\renewcommad\footrefstyle{|\dots|}|. The default definition
+%          is |\normalfont\footnotesize|.
+% \item[]  \DescribeMacro{\footxref}^^A
+%          The options |citeonce*(|\meta{unit}|)|\SpecialOptionIndex{citeonce*}
+%          tells |footbib| to replace the text of each reference but the first
+%          in each citation unit with a cross-reference to the last place where
+%          the full text of the reference appeared. The text of the
+%          cross-reference is generated by the command |\footxref| which takes
+%          two arguments: (1)~the label and (2)~the page of the last full
+%          citation. |\footxref| may be redefined in the preamble by
+%
+%          \qquad |\renewcommand*\footxref[2]{|\dots|}|.
+%
+% \end{list}
+%
+% \section{Known and potential problems}
+%
+% \begin{list}{$\bullet$}{\settowidth\leftmargin{$\bullet$\hskip\labelsep}}
+% \item At present, the convergence is not proved. There is no guarantee
+%   that the references eventually find their place. However,
+%   |footbib| was used in large documents (several
+%   hundreds pages) and such a problem never occured. 
+%
+% \item The foot bibliography is not sorted. The references appear at the
+%   bottom of the page in the order in which they are cited on the page.
+%
+% \item A |\footcite| command may not appear in a floating environment
+%   like |figure| or |table|.
+%
+% \item If a float is inserted at the bottom of the page, the foot
+%   bibliography is put \emph{above} it, like footnotes.
+%
+% \item The result is not very nice in |twocolumn| mode.
+%   The references should be balanced between the two columns of the
+%   page (if there are two) or put in the right column like the
+%   package |ftnright|\SpecialPackageIndex{ftnright} of Frank
+%   Mittelbach does for footnotes.  
+%
+% \item |footbib| does not work with most packages which 
+%   modify the output routine of \LaTeX:
+%   |multicol|\SpecialPackageIndex{multicol},
+%   |ftnright|\SpecialPackageIndex{ftnright},
+%   |floatflt|\SpecialPackageIndex{floatflt},
+%   |wrapfig|\SpecialPackageIndex{wrapfig}, etc. 
+%
+% \item The references must not contain any
+%   |verbatim|\SpecialEnvIndex{verbatim} environment. But 
+%   |\verb|\SpecialUsageIndex{\verb} is allowed since it is sometime used
+%   to typeset filenames, \textsc{url}'s, etc.
+%
+% \item The braces must be balanced in the references, excepted the ones
+%   that might occur inside the argument of a |\verb|
+%   command\SpecialUsageIndex{\verb}. This implies that a reference 
+%   may not contain say |\hbox\bgroup|\dots|}| which is otherwise correct
+%   in \LATEX.
+%
+% \item When references are numbered, the space between the label and
+%   the reference itself may be too large because the
+%   longest label is determined from the argument of
+%   |\begin{thebibliography}{|\meta{longest label}|}| and its length
+%   is used for all references. If all references on a page
+%   have small numbers and the bibliography contains many references
+%   (say more than 100),
+%   this length is not reliable. The longest label should be deduced
+%   from the maximal number of references on a page,
+%   but this may not be known at the beginning of the document, at
+%   least at the first run. At the second run, the
+%   information could be deduces from what was written into the |.aux| file,
+%   provided 
+%   the |\nofiles| command was not used (otherwise, the |.aux| file
+%   was not written). When per page numbering is used (option
+%   |firstcite(page)|), the longest label could also be simply initialised
+%   to |99| which is not too large and should be enough.
+% \end{list}
+%
+% \StopEventually{\IndexSetup\PrintIndex\PrintChanges}
+%
+% \section{Implementation}
+%
+% \subsection{Identification}
+%    \begin{macrocode}
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{footbib}[\filedate\space v\fileversion\space(E.Domenjoud)]
+%    \end{macrocode}
+%
+% \subsection{Initial setup}
+%
+% Some badly behaved packages (written for \LaTeX\kern.15em2.09) change the
+% catcodes before the 
+% beginning of the document and make some commands like |\@for|
+% unusable. The catcodes needed in the definitions are set here and
+% restored at the end of the package. 
+%    \begin{macrocode}
+\@makeother\`
+\edef\@tempa{\catcode\string`\string`\string=\the\catcode\string``\relax}
+\def\@tempb#1{\catcode`\noexpand#1\string=\the\catcode`#1\relax}
+\edef\@tempa{\@tempa
+  \@tempb\:\@tempb\?\@tempb\=\@tempb\<\@tempb\>\@tempb\+\@tempb\-%
+  \@tempb\.\@tempb\'\@tempb\~}
+\expandafter\AtEndOfPackage\expandafter{\@tempa}
+\@makeother\: \@makeother\? \@makeother\= \@makeother\< \@makeother\> 
+\@makeother\+ \@makeother\- \@makeother\. \@makeother\' 
+\catcode`\~=\active
+%    \end{macrocode}
+%
+% \subsection{Test of the output routine}
+%
+% If the \LaTeXe\ format is more recent than the package, we test
+% whether the output routine changed. If so, a warning is issued
+% because the user might get unexpected results. The package should
+% work with all previous versions of \LaTeXe.
+%
+% When |docstrip| is used to extract the package, this code is included only
+% if the `|checkoutput|' flag is used in addition to `|package|'.
+%
+%    \begin{macrocode}
+%<*checkoutput>
+\@ifpackagelater{footbib}\fmtversion\@tempswafalse\@tempswatrue
+\if@tempswa
+\def\@tempa#1#2{\def\@tempb{#2}\ifx#1\@tempb\else\@tempswatrue\fi}
+\@tempswafalse
+\@tempa\@specialoutput{\ifnum\outputpenalty>-\@Mii\@doclearpage\else
+  \ifnum\outputpenalty<-\@Miii\ifnum\outputpenalty<-\@MM\deadcycles\z@
+  \fi\global\setbox\@holdpg\vbox{\unvbox\@cclv}\else\global\setbox
+  \@holdpg\vbox{\unvbox\@holdpg\unvbox\@cclv\setbox\@tempboxa\lastbox
+  \unskip}\@pagedp\dp\@holdpg\@pageht\ht\@holdpg\unvbox\@holdpg\@next
+  \@currbox\@currlist{\ifnum\count\@currbox>\z@\advance\@pageht\@pagedp
+  \ifvoid\footins\else\advance\@pageht\ht\footins\advance\@pageht\skip
+  \footins\advance\@pageht\dp\footins\fi\ifvbox\@kludgeins\ifdim\wd
+  \@kludgeins=\z@\advance\@pageht\ht\@kludgeins\fi\fi\@reinserts
+  \@addtocurcol\else\@reinserts\@addmarginpar\fi}\@latexbug\ifnum
+  \outputpenalty<\z@\if@nobreak\nobreak\else\addpenalty\interlinepenalty
+  \fi\fi\fi\fi}
+\@tempa\@doclearpage{\ifvoid\footins\ifvbox\@kludgeins{\setbox\@tempboxa
+  \box\@kludgeins}\fi\setbox\@tempboxa\vsplit\@cclv to\z@
+  \unvbox\@tempboxa\setbox\@tempboxa\box\@cclv\xdef\@deferlist{\@toplist
+  \@botlist\@deferlist}\global\let\@toplist\@empty\global\let\@botlist
+  \@empty\global\@colroom\@colht\ifx\@currlist\@empty\else\@latexerr
+  {Float(s) lost}\@ehb\global\let\@currlist\@empty\fi\@makefcolumn
+  \@deferlist\@whilesw\if@fcolmade\fi{\@opcol\@makefcolumn\@deferlist
+  }\if@twocolumn\if@firstcolumn\xdef\@dbldeferlist{\@dbltoplist
+  \@dbldeferlist}\global\let\@dbltoplist\@empty\global\@colht\textheight
+  \begingroup\@dblfloatplacement\@makefcolumn\@dbldeferlist\@whilesw
+  \if@fcolmade\fi{\@outputpage\@makefcolumn\@dbldeferlist}\endgroup\else
+  \vbox{}\clearpage\fi\fi\else\setbox\@cclv\vbox{\box\@cclv\vfil}\@makecol
+  \@opcol\clearpage\fi}
+\@tempa\@makecol{\ifvoid\footins\setbox\@outputbox\box\@cclv\else\setbox
+  \@outputbox\vbox{\boxmaxdepth\@maxdepth\unvbox\@cclv
+  \vskip\skip\footins\color@begingroup\normalcolor\footnoterule\unvbox
+  \footins\color@endgroup}\fi\let\@elt\relax\xdef\@freelist{\@freelist
+  \@midlist}\global\let\@midlist\@empty\@combinefloats\ifvbox\@kludgeins
+  \@makespecialcolbox\else\setbox\@outputbox\vbox to\@colht{\@texttop\dimen@
+  \dp\@outputbox\unvbox\@outputbox\vskip-\dimen@\@textbottom}\fi\global
+  \maxdepth\@maxdepth}
+\@tempa\@reinserts{\ifvoid\footins\else\insert\footins{\unvbox\footins}\fi
+  \ifvbox\@kludgeins\insert\@kludgeins{\unvbox\@kludgeins}\fi}
+\fi
+\if@tempswa
+  \PackageError{footbib}{the output routine of LaTeX changed}
+  {The output routine of LaTeX changed since the current version of
+   `footbib'.\MessageBreak Since `footbib' patches this routine, 
+   using it may produce unexpected\MessageBreak results. Send a mail to \space 
+   Eric.Domenjoud@loria.fr \space to get a new version.\MessageBreak\MessageBreak
+   Type \space X <return> \space to quit or cross your fingers and
+   just type <return>.\MessageBreak} 
+\fi
+%</checkoutput>
+%    \end{macrocode}
+%
+% \subsection{Package Options}
+%
+% \subsubsection{Initial code}
+%
+% \begin{macro}{\iffb@twoside}
+% \begin{macro}{\iffb@citeonce}
+% \begin{macro}{\iffb@pagecite}
+% \begin{macro}{\fb@chaptercite}
+% \begin{macro}{\fb@partcite}
+% \begin{macro}{\iffb@firstcite}
+% \begin{macro}{\iffb@pagenum}
+% \begin{macro}{\fb@chapternum}
+% \begin{macro}{\fb@partnum}
+% \begin{macro}{\iffb@xref}
+% \begin{macro}{\iffb@crossrefs}
+% \begin{macro}{\iffb@xcrossrefs}
+% \begin{macro}{\iffb@nosplit}
+% First we define some switches which record the user options. The
+% switch |\iffb@twoside| is initialised from the current value of 
+% |\if@twoside| because default global options are not passed to packages. 
+% If one says |\documentclass{book}| then the document is in
+% |twoside|\SpecialOptionIndex{twoside} mode but the packages
+% \emph{don't know} it. 
+%    \begin{macrocode}
+\newif\iffb@twoside     \let\iffb@twoside\if@twoside
+\newif\iffb@citeonce    \fb@citeoncefalse
+\newif\iffb@pagecite    \fb@pagecitefalse
+\let\fb@chaptercite\@empty
+\let\fb@partcite\@empty
+\newif\iffb@firstcite   \fb@firstcitefalse
+\newif\iffb@pagenum     \fb@pagenumfalse
+\let\fb@chapternum\@empty
+\let\fb@partnum\@empty
+\newif\iffb@xref        \fb@xreffalse
+\newif\iffb@crossrefs   \fb@crossrefsfalse
+\newif\iffb@xcrossrefs  \fb@xcrossrefsfalse
+\newif\iffb@nosplit     \fb@nosplitfalse
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fb@checksec}
+% The macro |\fb@checksec| checks whether its first argument (a sectioning
+% command) is defined. If so, the second argument (a list of command)
+% is executed. Otherwise an error is raised and the second argument
+% is discarded. It is called while processing the options which must
+% patch a sectioning command.
+%    \begin{macrocode}
+\newcommand\fb@checksec[2]{%
+  \ifx#1\@undefined
+    \PackageError{footbib}{Bad option `\CurrentOption'}%
+    {{footbib}: The current document class does not define `\string#1'}%
+  \else
+    #2%
+  \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Declaration and processing of options}
+% {\MacroFont
+% \begin{option}{oneside}
+% \begin{option}{twoside}
+% \leavevmode\vspace{-1.2\baselineskip}
+%    \begin{macrocode}
+\DeclareOption{oneside}{\fb@twosidefalse}
+\DeclareOption{twoside}{\fb@twosidetrue}
+%    \end{macrocode}
+% \end{option}
+% \end{option}
+% \begin{option}{firstcite}
+% \leavevmode\vspace{-1.2\baselineskip}
+%    \begin{macrocode}
+\DeclareOption{firstcite}{\fb@firstcitetrue}
+\DeclareOption{firstcite(page)}{\fb@firstcitetrue\fb@pagenumtrue}
+\DeclareOption{firstcite(chapter)}{\fb@firstcitetrue
+    \fb@checksec\chapter{\def\fb@chapternum{\fb@newnumunit}}}
+\DeclareOption{firstcite(part)}{\fb@firstcitetrue
+    \fb@checksec\part{\def\fb@partnum{\fb@newnumunit}}}
+\DeclareOption{firstcite(document)}{\fb@firstcitetrue}
+%    \end{macrocode}
+% \end{option}
+% \begin{option}{citeonce}
+% \begin{option}{citeonce*}
+% \leavevmode\vspace{-1.2\baselineskip}
+%    \begin{macrocode}
+\DeclareOption{citeonce}{\fb@citeoncetrue}
+\DeclareOption{citeonce(page)}{\fb@pagecitetrue}
+\DeclareOption{citeonce(chapter)}{\fb@citeoncetrue
+    \fb@checksec\chapter{\def\fb@chaptercite{\fb@newciteunit}}}
+\DeclareOption{citeonce(part)}{\fb@citeoncetrue
+    \fb@checksec\part{\def\fb@partcite{\fb@newciteunit}}}
+\DeclareOption{citeonce(document)}{\fb@citeoncetrue}
+\DeclareOption{citeonce*}{\fb@citeoncetrue\fb@xreftrue}
+\DeclareOption{citeonce*(chapter)}{%
+    \ExecuteOptions{citeonce(chapter)}\fb@xreftrue}
+\DeclareOption{citeonce*(part)}{%
+    \ExecuteOptions{citeonce(part)}\fb@xreftrue}
+\DeclareOption{citeonce*(document)}{\ExecuteOptions{citeonce*}}
+%    \end{macrocode}
+% \end{option}
+% \end{option}
+% \begin{option}{crossrefs}
+% \begin{option}{crossrefs*}
+% \begin{option}{nocrossrefs}
+% \leavevmode\vspace{-1.2\baselineskip}
+%    \begin{macrocode}
+\DeclareOption{crossrefs}{\fb@crossrefstrue\fb@xcrossrefstrue}
+\DeclareOption{crossrefs*}{\fb@crossrefstrue\fb@xcrossrefsfalse}
+\DeclareOption{nocrossrefs}{\fb@crossrefsfalse\fb@xcrossrefsfalse}
+%    \end{macrocode}
+% \end{option}
+% \end{option}
+% \end{option}
+%
+% \begin{option}{split}
+% \begin{option}{nosplit}
+% \leavevmode\vspace{-1.2\baselineskip}
+%    \begin{macrocode}
+\DeclareOption{split}{\fb@nosplitfalse}
+\DeclareOption{nosplit}{\fb@nosplittrue}
+%    \end{macrocode}
+% \end{option}
+% \end{option}
+%    \begin{macrocode}
+\ProcessOptions*
+\iffb@pagecite
+  \fb@citeoncefalse
+  \fb@xreffalse
+\fi
+\let\fb@firstcitetrue\@undefined  \let\fb@firstcitefalse\@undefined
+\let\fb@citeoncetrue\@undefined   \let\fb@citeoncefalse\@undefined
+\let\fb@pagecitetrue\@undefined   \let\fb@pagecitefalse\@undefined
+\let\fb@xreftrue\@undefined       \let\fb@xreffalse\@undefined
+\let\fb@crossrefstrue\@undefined  \let\fb@crossrefsfalse\@undefined
+\let\fb@xcrossrefstrue\@undefined \let\fb@xcrossrefsfalse\@undefined
+\let\fb@pagenumtrue\@undefined    \let\fb@pagenumfalse\@undefined
+\let\fb@nosplittrue\@undefined    \let\fb@nosplitfalse\@undefined
+\let\fb@checksec\@undefined
+%    \end{macrocode}
+% }
+%
+% \begin{macro}{\chapter}
+% \begin{macro}{\part}
+% At the beginning of the document, the commands |\chapter| and |\part| are
+% patched if necessary so that they start a new citation or numbering unit. 
+% This is achieved by adding in front of them the commands hold in
+% |\fb@chaptercite|, |\fb@chapternum|, |\fb@partcite| and |\fb@partnum|
+% defined while processing the options. When a command is patched, a
+% |\clearpage| is added so that a new unit always starts at the top of a page.
+%    \begin{macrocode}
+\AtBeginDocument{%
+  \begingroup
+    \def\@tempb#1{%
+      \ifx\@tempa\@empty\else
+        \edef\@tempa{\noexpand\clearpage\@tempa}%
+        \toks@\expandafter\expandafter\expandafter{\expandafter\@tempa#1}%
+        \xdef#1{\the\toks@}%
+      \fi}%
+    \let\fb@newnumunit\relax
+    \let\fb@newciteunit\relax
+    \edef\@tempa{\fb@partcite\fb@partnum}%
+    \@tempb\part
+    \edef\@tempa{\fb@chaptercite\fb@chapternum}%
+    \@tempb\chapter
+  \endgroup}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Customisation}
+%
+% \subsubsection{Basename of the files used for the foot bibliography}
+%
+% \begin{macro}{\footbibliographyname}
+% The basename of the |.aux| and |.bbl| files is produced by the
+% command |\fb@bibname| which is redefined by a call to
+% |\footbibliographyname| in the preamble. 
+%
+% |\footbibliographyname| first checks that its argument is different
+% from |\jobname|. Since the characters in |\jobname| have  catcode
+% 12 (other), the first two commands below yield the argument of
+% |\footbibliographyname| also with catcodes 12 so that it may be
+% compared to |\jobname|.
+%    \begin{macrocode}
+\newcommand*\footbibliographyname[1]{%
+  \edef\@tempa{#1}%
+  \edef\@tempa{\expandafter\strip@prefix\meaning\@tempa}%
+  \edef\@tempb{\jobname}%
+  \ifx\@tempa\@tempb
+    \PackageError{footbib}{Bad argument `#1'\on@line}%
+      {The name supplied to `\string\footbibliographyname' must be
+         different from the name\MessageBreak
+       of the current document to avoid conflicts with the standard
+         bibliography.\MessageBreak\MessageBreak 
+       Type \space X <return> \space to quit.\MessageBreak}%
+  \else
+    \xdef\fb@bibname{#1}%
+  \fi}
+\@onlypreamble\footbibliographyname
+\footbibliographyname{\jobname.fb}
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Layout of the list of citations in the text}
+%
+% \begin{macro}{\footcitelabel}
+% \begin{macro}{\putfootcitelabel}
+% \begin{macro}{\footcitelistformat}
+% \begin{macro}{\fb@putfootcitelabel}
+% \begin{macro}{\fb@citestart}
+% \begin{macro}{\fb@citesep}
+% \begin{macro}{\fb@citeend}
+% Here we define the layout parameters for the list of citations in the
+% text. We define an additional macro |\fb@putfootcitelabel| which is
+% essentially |\putfootcitelabel|. Only |\scriptspace| and |\mathsurround| are
+% set to 0 pt in case |\putfootcitelabel| involves some math.
+% The modified version is applied to all components of the citation
+% list but |\fb@citeend| to which the standard version is applied.
+% This avoids unwanted spacing inside the list while allowing some
+% additional spacing after it. The macro |\footcitelistformat| defines the
+% macros |\fb@citestart|, |\fb@citesep| and |\fb@citeend| used by |\fb@cite|
+% to build the list of citations in the text.
+%    \begin{macrocode}
+\newcommand*\footcitelabel[1]{#1}
+\newcommand*\putfootcitelabel[1]{\textsuperscript{\normalfont#1}}
+\newcommand*\fb@putfootcitelabel[1]{%
+  {\m@th\scriptspace\z@\putfootcitelabel{#1}}}
+\newcommand*\footcitelistformat[4]{%
+  \def\fb@citestart{\fb@putfootcitelabel{#1}}%
+  \def\fb@citesep{\fb@putfootcitelabel{#2}#3}%
+  \def\fb@citeend{\putfootcitelabel{#4}}}%
+\footcitelistformat[,{\penalty\@m}]
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Style of the foot bibliography}
+% 
+% \begin{macro}{\footbibskip}
+% \begin{macro}{\footbibrule}
+% \begin{macro}{\footrefstyle}
+% \begin{macro}{\footreflabel}
+% \begin{macro}{\footxref}
+% \begin{macro}{\fb@ins}
+% Here are defined all the layout parameters for the foot bibliography.
+% |\fb@ins| is the insertion number for the foot bibliography. It is not
+% really the right place for its declaration but it is needed to define the
+% user definable parameter |\footbibskip|. By the way we set
+% all the parameters for these insertions: 1 to 1 magnification and
+% no limit on the height of the foot bibliography.
+%    \begin{macrocode}
+\newinsert\fb@ins
+\count\fb@ins=1000
+\AtBeginDocument{\dimen\fb@ins=\textheight}
+\newcommand\footbibskip{\skip\fb@ins}
+\footbibskip=\bigskipamount
+\newcommand\footbibrule{\kern-3\p@\hrule\kern 2.6\p@}% \hrule is .4pt high
+\newcommand\footrefstyle{\normalfont\footnotesize}
+\newcommand*\footreflabel[1]{[#1]}
+\newcommand*\footxref[2]{See~#1~on page~#2.}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Some useful definitions}
+%
+% \begin{macro}{\fb@vedef}
+% \begin{macro}{\fb@doactive}
+% The keys of the references must be read and written \emph{more or
+% less} verbatim. Since some packages make some
+% characters permanently active, the catcodes should be changed before
+% reading or writing a key or a list of keys and reset afterward.
+% Unfortunately, in some situations this is not possible because the
+% catcodes have already been attached to the characters. One solution is to scan
+% the key and replace each active character with its non-active
+% equivalent but this is fairly costly and does not work if some active
+% character have been let equal to a non-active one or is hidden in a
+% command occuring in the (list of) key(s). Another solution is to use
+% |\meaning| to get a \emph{verbatim} copy of the keys but this does
+% not allow them to contain commands like in |\foocite{\mylistofcitations}|
+% The method used here consists in redefining the active characters
+% so that their expansion produces the same character with a catcode
+% 12 (other). Then an expansion of the key yields an almost
+% \emph{verbatim} copy of it. Only then, |\meaning| is used to \emph{remove}
+% the category code of any special character which might remain in the key
+% like |$| or |_|. This mechanism allows the list of keys
+% to contain itself commands which expand in the normal way. 
+% All characters which may both be active in the document and appear in the
+% key of a reference must be treated in this way. Since \BibTeX\ allows almost
+% any character in a key, it is safer to consider all 
+% characters which may be active in a document. No matter that they
+% indeed are. The command |\dospecials| usually contains, among
+% other, all such characters, each one escaped and preceded by |\do|.
+% The \LaTeXe\ kernel defines |\dospecials|\SpecialUsageIndex{\dospecials} as
+%\begin{trivlist}\leftskip=\parindent\item[]\MacroFont
+%  \verb*|\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&\do\#\do\^\do\_\do\%\do\~}|
+%\end{trivlist}
+% \noindent Any package which define new \emph{special} characters
+% should add them to this list.
+% \medskip
+%
+% An active character is needed to start with. Since |~| was
+% made active at the beginning of the package, it may be safely used 
+% for this purpose. 
+%    \begin{macrocode}
+\newcommand*\fb@doactive[1]{\lccode`~=`#1\lowercase{\def~{\string~}}}
+\newcommand*\fb@vedef[2]{%
+  \begingroup
+    \let\do\fb@doactive \dospecials
+    \edef\@tempa{\endgroup\def\noexpand#1{#2}}%
+  \@tempa
+  \edef#1{\expandafter\strip@prefix\meaning#1}}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\fb@namexdef}
+% |\fb@namexdef| is similar to the |\@namedef| command of \LaTeX\ but uses
+% |\xdef| instead of |\def|
+%    \begin{macrocode}
+\newcommand*\fb@namexdef[1]{\expandafter\xdef\csname#1\endcsname}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fb@auxout}
+% \begin{macro}{\fb@writeaux}
+% |\fb@auxout| is the auxiliary file used to record information about
+% citations and as input to \BibTeX.
+% The commands |\footbibliographystyle| and |\footbibliography| do an
+% immediate |\write| to this file. However, since these commands may
+% be used in the preamble, this file might not yet be open for
+% writing at the time they are used. We must wait until the end of the
+% preamble before opening the auxiliary file to give the user a chance to
+% define its name with |\footbibliographyname|. Therefore, we define the
+% macro |\fb@writeaux| which postpones the write until the beginning of the
+% document. It is somehow a \emph{delayed immediate write} which means that
+% the write will be performed as soon as possible, i.e.~as soon as the
+% auxiliary file is open for writing. This definition is temporary and will
+% be changed to a \emph{true} immediate write by |\AtBeginDocument|. 
+%    \begin{macrocode}
+\newwrite\fb@auxout
+\newcommand*\fb@writeaux[2]{%
+  \AtBeginDocument{%
+    \if@filesw
+      \immediate\write\fb@auxout{\string#1{#2}}%
+    \fi}}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Units handling}
+%
+% \begin{macro}{\fb@numunit}
+% \begin{macro}{\fb@citeunit}
+% \begin{macro}{\fb@xrefunit}
+% We handle 3 counters: the \emph{numbering unit}\Index{numbering}{unit}
+% counter (|\fb@numunit|), the \emph{citation unit}\Index{citation}{unit}
+% counter (|\fb@citeunit|) and the \emph{cross-referencing
+% unit}\Index{cross-referencing}{unit} counter (|\fb@xrefunit|). This last
+% counter is meaningful only if a |citeonce*| option was used. It essentially
+% counts pages in |oneside| mode and double pages in |twoside| mode. However,
+% if the citation unit is a chapter (resp.~a part), each |\chapter|
+% (resp.~|\part|) command also increments this counter.
+%    \begin{macrocode}
+\newcount\fb@numunit  \fb@numunit\@ne
+\newcount\fb@citeunit \fb@citeunit\@ne
+\newcount\fb@xrefunit \fb@xrefunit\@ne
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fb@refciteunit}
+% \begin{macro}{\fb@refxrefunit}
+% \begin{macro}{\fb@refnumunit}
+% \begin{macro}{\fb@refpage}
+% \begin{macro}{\fb@theunits}
+% \begin{macro}{\fb@getunits}
+% \begin{macro}{\fb@get@units}
+% The macros |\fb@ref|\dots|unit| and |\fb@refpage| hold the units and the
+% page of the current citation.
+%    \begin{macrocode}
+\newcommand\fb@theunits{%
+  {\the\fb@citeunit}{\the\fb@xrefunit}{\the\fb@numunit}{\thepage}}
+\newcommand*\fb@getunits[1]{%
+  \ifx#1\relax
+    \xdef#1{{\fb@key}\fb@theunits}%
+  \fi
+  \expandafter\fb@get@units#1}
+\newcommand*\fb@get@units[5]{%
+  \def\fb@refciteunit{#2}%
+  \def\fb@refxrefunit{#3}%
+  \def\fb@refnumunit{#4}%
+  \def\fb@refpage{#5}}%
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fb@newciteunit}
+% \begin{macro}{\fb@newnumunit}
+% The macros |\fb@newciteunit| and |\fb@newnumunit| are called by the
+% patched versions of |\part| or 
+% |\chapter| to start a new citation or numbering unit. The patched
+% sectioning unit also forces a page break so that a unit always
+% starts at the top of a page.
+%    \begin{macrocode}
+\newcommand\fb@newciteunit{%
+  \global\advance\fb@citeunit\@ne
+  \global\advance\fb@xrefunit\@ne}
+\newcommand\fb@newnumunit{\global\advance\fb@numunit\@ne}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fb@checkpage}
+% \begin{macro}{\fb@prevpage}
+% Each time the page counter is incremented, i.e.~at the top of a new
+% page, the macro |\fb@checkpage| updates the units counters if necessary. We
+% first check whether the current page is a right page. In |oneside| mode, it
+% is never the case. In |twoside| mode, it is the case if its number is
+% |\fb@prevpage|${}+1$ and is odd, where |\fb@prevpage| is a counter which
+% holds the number of the last shiped out page. If the number
+% of the current page is not |\fb@prevpage|${}+1$, it means that
+% either the user has manually changed the page counter or the page numbering
+% has changed. In both cases, we consider the current page as a left page. If
+% the current page is a right page, we do nothing. Otherwise, it may start a
+% new unit\footnote{A right page may actually also start a new unit if for
+% instance the |firstcite(chapter)|\SpecialOptionIndex{firstcite}
+%  option is in effect and the current
+% page starts a new chapter. But in this case, the units are updated by the
+% |\string\chapter| command.} and we update the unit counters.
+%    \begin{macrocode}
+\newcount\fb@prevpage \fb@prevpage\@ne
+\newcommand*\fb@checkpage{%
+  \@tempswatrue
+  \iffb@twoside
+    \global\advance\fb@prevpage\@ne
+    \ifnum\fb@prevpage=\c@page
+      \ifodd\c@page
+        \@tempswafalse
+      \fi
+    \fi
+  \fi
+  \if@tempswa
+%    \end{macrocode}
+% The counter |\fb@numunit| is incremented if the switch |\iffb@pagenum| is
+% true, i.e.~the option
+% |firstcite(page)|\SpecialOptionIndex{firstcite} was used. 
+%    \begin{macrocode}
+    \iffb@pagenum
+      \global\advance\fb@numunit\@ne
+    \fi
+%    \end{macrocode}
+% The switch |\iffb@citeonce| is true iff a
+% |citeonce|\SpecialOptionIndex{citeonce} or
+% |citeonce*|\SpecialOptionIndex{citeonce*} 
+% option was used. In this case, the |\fb@citeunit| counter is
+% incremented by the |\chapter| or |\part| command. We just increment
+% |\fb@xrefunit| in case |citeonce*| was used. If
+% |\iffb@citeonce| is false, the citation unit is the (double) page and
+% we increment |\fb@citeunit|. Since no
+% |citeonce*|\SpecialOptionIndex{citeonce*} option was 
+% used, we do not need to handle |\fb@xrefunit|.
+%    \begin{macrocode}
+    \iffb@citeonce
+      \global\advance\fb@xrefunit\@ne
+    \else
+      \global\advance\fb@citeunit\@ne
+    \fi
+  \fi
+  \global\fb@prevpage\c@page}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begingroup\lccode`P=`\%\lowercase{\endgroup\begin{macro}{\c@fbPcheckpage}}
+% The next definition is a trick to make the macro |\fb@checkpage|
+% execute each time the page counter is incremented. Each counter
+% \meta{cnt} declared by |\@addtoreset{|\meta{cnt}|}{page}| is reset to
+% 0 by |\global\c@|\meta{cnt}|\z@|  when the counter |page| is
+% incremented. We define a macro |\c@|\emph{xxx} which \emph{looks like}
+% a counter and we say |\@addtoreset{|\emph{xxx}|}{page}|. To
+% be sure that the user will never define a counter named \emph{xxx}, we
+% name our macro |\c@fb%checkpage|. The name of the associated \emph{pseudo
+% counter} is |fb%checkpage| that the user may normally not type. 
+% Each time the page counter is incremented, |\global\c@fb%checkpage\z@|
+% is executed. The macro |\c@fb%checkpage| starts with an assignment
+% (|\count@\z@|) which \emph{uses} the |\global| and ends with a
+% counter (|\count@|) which \emph{gobbles} the following |\z@|. Since
+% we change the catcode of |%|, it may not be used for comments below.
+%    \begin{macrocode}
+\catcode`\%=11
+\newcommand\c@fb%checkpage{\count@\z@
+  \fb@checkpage
+  \count@}
+\@addtoreset{fb%checkpage}{page}
+\catcode`\%=14
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Commands to handle the references}
+%
+% \begin{macro}{\fb@refcount}
+% The counter |\fb@refcount| holds the number of the last numbered reference.
+% It is reset to 0 at the beginning of each numbering unit.
+%    \begin{macrocode}
+\newcount\fb@refcount
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\fb@lbl}
+% \begin{macro}{\fb@txt}
+% The token registers |\fb@lbl| and |\fb@txt| always holds the label
+% and the text of the current reference.
+%    \begin{macrocode}
+\newtoks\fb@lbl
+\newtoks\fb@txt
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\fb@setref}
+% \begin{macro}{\fb@getref}
+% \VerbSetup{\begin{macro}{\fb@r.\noexpand~{key}}}
+% |\fb@setref| stores the current value of the token registers
+% |\fb@lbl| and |\fb@txt| in the macro |\fb@r.|\meta{key} where
+% \meta{key} is the key of the current reference. This key is always
+% stored in the macro |\fb@key|. |\fb@setref| is called each time a component
+% of a reference changes: when it is first read at the beginning of the
+% document, and when the dynamic label or the text of the reference has
+% been updated. |\fb@getref| does the converse: given
+% a key, it updates |\fb@lbl| and |\fb@txt| from |\fb@r.|\meta{key}.
+%    \begin{macrocode}
+\newcommand\fb@setref{%
+  \fb@namexdef{fb@r.\fb@key}{{\the\fb@lbl}{\the\fb@txt}}}
+\newcommand\fb@getref{\afterassignment\fb@txt\fb@lbl}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\fb@setlbl}
+% \begin{macro}{\fb@getlbl}
+% |\fb@setlbl| updates the dynamic label of a reference. |\fb@getlbl| gets
+% the label after calling |\fb@setlbl| if necessary to update it.
+%    \begin{macrocode}
+\newcommand\fb@setlbl{%
+  \global\advance\fb@refcount\@ne
+  \edef\@tempa{{\fb@refnumunit}{\the\fb@refcount}}%
+  \global\fb@lbl\expandafter{\expandafter\fb@getlbl\@tempa}%
+  \fb@setref
+  \the\fb@refcount}
+\newcommand*\fb@getlbl[2]{\ifnum\fb@refnumunit=#1{#2}\else\fb@setlbl\fi}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\fb@settxt}
+% \begin{macro}{\fb@gettxt}
+% |\fb@settxt| and |\fb@gettxt| are similar to |\fb@setlbl| and
+% |\fb@getlbl| but update the text of the reference instead of the label.
+% When |\fb@settxt| is called, the label must have been expanded just
+% before so that it has been updated if necessary. Then |\fb@lbl|
+% has either the form |{|\meta{static label}|}|\Index{static}{label} or
+% the form |\fb@getlbl{|\meta{current numunit}|}{|\meta{dynamic
+% label}|}|\Index{dynamic}{label}.
+% In the later case, the test at the beginning of |\fb@getlbl| must
+% succeed so that in both cases, the first command in |\fb@settxt|
+% below assigns the label to |\toks@|. 
+%    \begin{macrocode}
+\newcommand\fb@settxt[1]{%
+  \toks@=\the\fb@lbl
+  \toks@\expandafter\expandafter\expandafter{\expandafter
+    \footreflabel\expandafter{\the\toks@}}%
+  \edef\@tempa{{\fb@refciteunit}{\the\toks@}{\fb@refpage}}%
+  \global\fb@txt\expandafter{\expandafter\fb@gettxt\@tempa{#1}}%
+  \fb@setref
+  #1}
+\newcommand\fb@gettxt[4]{%
+  \ifnum\fb@refciteunit=#1\relax
+    \footxref{#2}{#3}%
+  \else
+    \fb@settxt{#4}%
+  \fi}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Commands to handle the foot bibliography}
+%
+% \begin{macro}{\footbibliography}
+% \begin{macro}{\footbibliographystyle}
+% |\footbibliography| and |\footbibliographystyle| are the commands which
+% define the bibliography file and the bibliography style. They just write
+% their argument to the auxiliary file. If they are used in the preamble, the
+% |\fb@writeaux| macro in use is the delayed one. The write will actually
+% take place at the beginning of the document.
+%    \begin{macrocode}
+\newcommand\footbibliography{\fb@writeaux\bibdata}
+\newcommand\footbibliographystyle{\fb@writeaux\bibstyle}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fb@refnotfound}
+% When a reference is not found by \LaTeX, it is replaced by a
+% default one generated by the command |\fb@refnotfound| which
+% takes the key of the reference as an argument and expands to the
+% default label and the default text.
+%    \begin{macrocode}
+\newcommand*\fb@refnotfound[1]{%
+  {?}{*** ERROR: citation `{\normalfont\ttfamily\bfseries#1}' undefined ***}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Creation of the foot references}
+%
+% \begin{macro}{\footcite}
+% \begin{macro}{\footcite*}
+% \begin{macro}{\footnocite}
+% \begin{macro}{\fb@@cite}
+% \begin{macro}{\fb@optlbl}
+% \begin{macro}{\iffb@lbl}
+% \begin{macro}{\iffb@txt}
+% All 3 citation commands |\footcite|, |\footcite*| and |\footnocite|
+% actually call the same macro |\fb@cite|. Before this call, they just
+% set the flags 
+% |\iffb@lbl| and |\iffb@txt| according to whether the label and the
+% text of the reference are requested. The settings are as follows:
+% \begin{center}
+% \DeleteShortVerb\|\MakeShortVerb\"
+% \begin{tabular}{|l|c|c|}\hline
+%               & "\iffb@lbl" & "\iffb@txt" \\\hline
+% "\footcite"   & true        & true  \\
+% "\footcite*"  & true        & false \\
+% "\footnocite" & false       & true  \\\hline
+% \end{tabular}
+% \DeleteShortVerb\"\MakeShortVerb\|
+% \end{center}
+% In addition, |\footcite| calls |\fb@@cite| to get the optional argument
+% which is put in |\fb@optlbl|.
+%    \begin{macrocode}
+\newif\iffb@lbl
+\newif\iffb@txt
+\DeclareRobustCommand\footcite{%
+  \fb@lbltrue\@ifstar{\fb@txtfalse\fb@@cite}{\fb@txttrue\fb@@cite}}
+\newcommand\footnocite{\fb@lblfalse\fb@txttrue\fb@cite}
+\newcommand*\fb@@cite[1][\@nil]{%
+  \def\fb@optlbl{#1}%
+  \ifx\fb@optlbl\@nnil
+    \let\fb@optlbl\relax
+  \else
+    \def\fb@optlbl{\fb@putfootcitelabel{, #1}}%
+  \fi
+  \fb@cite}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fb@cite}
+% |\fb@cite| is the macro which handles the list of citations. It
+% calls |\fb@xcite| to produce the actual label and insert the text
+% of each individual reference.
+%    \begin{macrocode}
+\newcommand*\fb@cite[1]{%
+  \fb@vedef\fb@keys{#1}%
+  \iffb@lbl
+    \fb@citestart
+    \def\fb@citea{\let\fb@citea\fb@citesep}%
+  \fi
+%    \end{macrocode}
+% If the list of citation is empty, the |\@for| loop is not 
+% entered and no warning is issued. Therefore, we check for this now.
+%    \begin{macrocode}
+  \ifx\fb@keys\@empty
+    \PackageWarning{footbib}{Empty citation on page \thepage}%
+  \fi
+  \@for\fb@key:=\fb@keys\do{%
+    \iffb@lbl\fb@citea\fi
+    \fb@xcite
+    \ifx\fb@deferredcite\@empty\else
+      \begingroup
+        \fb@lblfalse
+        \expandafter\fb@xnocite\fb@deferredcite\@nil
+      \endgroup
+    \fi}%
+  \iffb@lbl\fb@optlbl\fb@citeend\fi}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\fb@xfootcite}
+% \begin{macro}{\fb@deferredcite}
+% The macro |\fb@xfootcite| is a replacement for the |\cite| command of
+% \LaTeX\ inside a foot reference if the
+% |crossrefs|\SpecialOptionIndex{crossrefs} or 
+% |crossrefs*|\SpecialOptionIndex{crossrefs*} option was used.  
+% In both cases, |\fb@xfootcite| performs a 
+% |\footcite*|. If the |crossrefs|\SpecialOptionIndex{crossrefs} option was
+% used, in addition, |\fb@xfootcite| adds globally the list of citation
+% keys to the list |\fb@deferredcite|. After the insertion of the current
+% reference has been completed, a |\footnocite|\SpecialUsageIndex{\footnocite}
+% will be performed for each key in the list. The format of this list is
+% \meta{key}|,|\dots,\meta{key}|,| (the trailing comma makes it easier to
+% handle than \meta{key}|,|\dots|,|\meta{key} and allows to distinguish between
+% an empty list and a list containing only an empty element). This list is
+% initially empty.  
+%    \begin{macrocode}
+\newcommand\fb@xfootcite[2][\@nil]{%
+  \footcite*[#1]{#2}%
+  \iffb@xcrossrefs
+    \fb@vedef\fb@keys{#2}%
+    \xdef\fb@deferredcite{\fb@deferredcite\fb@keys,}%
+  \fi}
+\let\fb@deferredcite\@empty
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\fb@xnocite}
+% After the insertion of the current reference has been completed, if some
+% deferred cross-references are present, the macro |\fb@xnocite| is called.
+% It calls |\fb@xcite| with |\iffb@lbl|=\emph{false} to insert the text of
+% the cross-references if necessary. This might produce more deferred
+% cross-references which will be added to |\fb@deferredcite|. 
+%    \begin{macrocode}
+\def\fb@xnocite#1,#2\@nil{%
+  \gdef\fb@deferredcite{#2}%
+  \def\fb@key{#1}%
+  \fb@xcite
+  \ifx\fb@deferredcite\@empty
+    \let\@tempa\@gobble
+  \else
+    \let\@tempa\fb@xnocite
+  \fi
+  \expandafter\@tempa\fb@deferredcite\@nil}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\fb@xcite}
+% The macro |\fb@xcite| is called both by |\fb@cite| and
+% |\fb@xnocite| to handle each individual citation. It writes to the auxiliary
+% file the information about the citation, puts the label in the text if
+% requested and put the text of the reference on the page if necessary. If the
+% reference is not found, it issues a warning.
+%
+% The first command in |\fb@xcite| removes any space in front of the key.
+% |\@empty| is inserted after the key to prevent an error in case it is
+% empty. 
+%
+% If the key is empty or the reference is undefined, the \LaTeX\ command
+% |\G@refundefinedtrue| is used to set the switch
+% |\if@refundefined| which indicates that some reference was
+% undefined. 
+%    \begin{macrocode}
+\newcommand\fb@xcite{%
+  \edef\fb@key{\expandafter\@firstofone\fb@key\@empty}%
+  \ifx\fb@key\@empty
+    \PackageWarning{footbib}{Empty citation on page \thepage}%
+    \G@refundefinedtrue
+  \else
+    \@ifundefined{fb@r.\fb@key}%
+%    \end{macrocode}
+% \FbIndex{\fb@r.\noexpand~{key}}^^A
+%    \begin{macrocode}
+      {\G@refundefinedtrue
+       \PackageWarning{footbib}{%
+          Citation `\fb@key' on page \thepage \space undefined}% 
+       \fb@getref\fb@refnotfound\fb@key\fb@setref}%
+      {\fb@getref\@nameuse{fb@r.\fb@key}}%
+%    \end{macrocode}
+% \FbIndex{\fb@r.\noexpand~{key}}^^A
+%    \begin{macrocode}
+    \fb@bibcite
+    \iffb@lbl\fb@putfootcitelabel{\footcitelabel{\the\fb@lbl}}\fi
+%    \end{macrocode}
+% The text of the reference is inserted if requested (|\iffb@txt|=\emph{true})
+% and either it has not yet been inserted in the current citation unit, or a
+% |citeonce*| option was used and the last citation was on
+% another (double) page.
+%    \begin{macrocode}
+    \iffb@txt
+      \expandafter\let\expandafter\@tempa\csname
+          fb@fn\fb@key.\fb@refciteunit\endcsname
+%    \end{macrocode}
+% \FbIndex{\fb@fn\noexpand~{key}.\noexpand~{num}}^^A
+%    \begin{macrocode}
+      \@tempswatrue
+      \ifx\@tempa\relax\else
+        \iffb@xref
+          \ifx\@tempa\fb@refxrefunit 
+            \@tempswafalse
+          \fi
+        \else
+          \@tempswafalse
+        \fi
+      \fi
+      \if@tempswa
+        \fb@namexdef{fb@fn\fb@key.\fb@refciteunit}{\fb@refxrefunit}%
+%    \end{macrocode}
+% \FbMainIndex{\fb@fn\noexpand~{key}.\noexpand~{num}}^^A
+%    \begin{macrocode}
+        \fb@citefn
+      \fi
+    \fi
+  \fi}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\fb@bibcite} 
+% \begin{macro}{\fb@lastrefnumunit}
+% \begin{macro}{\fb@citecount}
+% The command |\fb@bibcite| writes 
+% to the auxiliary file all the informations about the current
+% citation: the key, the units, and the page. It also resets to 0 the counter
+% |\fb@refcount| if the numbering unit changed between the last reference and
+% the current one. This counter is used to number the references. The counter 
+% |\fb@lastrefnumunit| holds the numbering unit of the last reference.
+% The counter |\fb@citecount| holds the number of the current citation. 
+%    \begin{macrocode}
+\newcount\fb@citecount
+\newcount\fb@lastrefnumunit \fb@lastrefnumunit\m@ne
+\newcommand\fb@bibcite{%
+  \fb@writeaux\citation\fb@key
+  \global\advance\fb@citecount\@ne
+  \expandafter\fb@getunits\csname fb@c.\the\fb@citecount\endcsname
+%    \end{macrocode}
+% \FbIndex{\fb@c.\noexpand~{num}}^^A
+%    \begin{macrocode}
+  \ifnum\fb@refnumunit=\fb@lastrefnumunit\else
+    \global\fb@lastrefnumunit\fb@refnumunit\relax
+    \global\fb@refcount\z@
+  \fi
+  \if@filesw
+    \write\fb@auxout\expandafter{\expandafter\string\expandafter
+      \bibcite\expandafter{\fb@key}\fb@theunits}%
+  \fi}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fb@citefn}
+% |\fb@citefn| inserts the text of the reference. It is called
+% only if the reference was not already cited in the same citation
+% unit or a |citeonce*|\SpecialOptionIndex{citeonce*} option was used. 
+% The code is mainly borrowed from the footnotes handling in \LaTeX.
+%    \begin{macrocode}
+\newcommand\fb@citefn{%
+  \insert\fb@ins{%
+    \reset@font\footrefstyle
+    \interlinepenalty\iffb@nosplit\@M\else\interfootnotelinepenalty\fi
+    \splittopskip 1.2\ht\strutbox
+    \splitmaxdepth \dp\strutbox
+    \floatingpenalty \@MM
+    \hsize\columnwidth
+    \@parboxrestore
+    \ifx\newblock\@undefined\let\newblock\relax\fi
+    \iffb@crossrefs\let\cite\fb@xfootcite\fi
+    \@tempdima\fb@lblwidth
+    \advance\@tempdima\labelsep
+    \leftskip\@tempdima
+    \color@begingroup
+      \setbox\@tempboxa\hbox{\footreflabel{\the\fb@lbl}}%
+      \hskip-\@tempdima
+      \ifdim\wd\@tempboxa<\fb@lblwidth
+        \hb@xt@\fb@lblwidth{\unhbox\@tempboxa\hfil}%
+      \else
+        \box\@tempboxa
+      \fi
+      \hskip\labelsep
+      \rule\z@{1.2\ht\strutbox}\ignorespaces\the\fb@txt\@finalstrut\strutbox
+    \color@endgroup}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{AtBeginDocument, AtEndDocument}
+%
+% At the beginning of the document, we read the bibliography file and
+% record all the references. This is memory consuming but the only
+% alternative is to read again the bibliography file for each
+% |\footcite| command which would be much slower.
+% We must wait until the beginning of the document to give the user a
+% chance to redefine |\fb@bibname| through |\footbibliographyname|.
+% The preamble of the bibliography is executed once for all when the
+% bibliography is read. After recording the bibliography, we read the |.aux|
+% file (if it exists) and record the parameters (citation and numbering unit,
+% page, etc.) of all citations as determined during the previous run. The
+% parameters of the $n^{th}$ citation are recorded in the macro 
+% |\fb@c.|\meta{n}.
+%    \begin{macrocode}
+\AtBeginDocument{%
+%    \end{macrocode}
+% Save the current value of |\thebibliography| and redefine it
+%    \begin{macrocode}
+  \let\fb@savethebibliography\thebibliography
+  \let\thebibliography\fb@thebibliography
+  \let\fb@thebibliography\@undefined
+%    \end{macrocode}
+% Read the |bbl| file. This executes the preamble, and if a
+% |thebibliography| environment is found, sets |\fb@lblwidth| to the
+% length of the longest label and records all references. |\fb@lblwidth|
+% is initialised with a negative value which allows us to detect
+% afterward whether a |thebibliography| environment was present.
+%    \begin{macrocode}
+  \global\fb@lblwidth=-\maxdimen
+  \fb@refcount\z@
+  \@input{\fb@bibname.bbl}%
+%    \end{macrocode}
+% Restore the standard value of |\thebibliography|
+%    \begin{macrocode}
+  \let\thebibliography\fb@savethebibliography
+  \let\fb@savethebibliography\@undefined
+%    \end{macrocode}
+% Assign a default value to |\fb@lblwidth| in case the |bbl| file
+% was not found or contained no |thebibliography| environment.
+%    \begin{macrocode}
+  \ifdim\fb@lblwidth<\z@
+    \settowidth\fb@lblwidth
+      {\footrefstyle\footreflabel{\expandafter\@firstoftwo\fb@refnotfound{?}}}%
+  \fi
+%    \end{macrocode}
+% \begin{macro}{\bibcite}
+% \VerbSetup{\begin{macro}{\fb@c.\noexpand~{num}}}
+% Then read the auxiliary file and record the parameters of each citation.
+%    \begin{macrocode}
+  \fb@citecount\z@
+  \begingroup
+    \let\citation\@gobble \let\bibstyle\@gobble \let\bibdata\@gobble
+    \def\bibcite#1#2#3#4#5{%
+        \advance\fb@citecount\@ne
+        \fb@vedef\fb@key{#1}%
+        \fb@namexdef{fb@c.\the\fb@citecount}{{\fb@key}{#2}{#3}{#4}{#5}}}%
+    \@input{\fb@bibname.aux}%
+  \endgroup
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\fb@auxout}
+% Prepare the auxiliary file for writing
+%    \begin{macrocode}
+  \if@filesw
+    \immediate\openout\fb@auxout=\fb@bibname.aux
+    \immediate\write\fb@auxout{\relax}%
+  \fi
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\fb@writeaux}
+% Finally, define a non delayed version of |\fb@writeaux|.
+%    \begin{macrocode}
+  \renewcommand*\fb@writeaux[2]{%
+    \if@filesw
+      \immediate\write\fb@auxout{\string#1{#2}}%
+    \fi}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fb@thebibliography}
+% \begin{macro}{\fb@lblwidth}
+% The macro |\fb@thebibliography| records the length of the longest
+% label in the \meta{dimen} register |\fb@lblwidth| and then scans the
+% bibliography and stores each reference in a global macro
+% |\fb@r.|\meta{key} where \meta{key} is the key 
+% of the reference. The references are read one token at a time so that we
+% may detect |\verb| commands even if they are hidden in groups.
+%    \begin{macrocode}
+\newdimen\fb@lblwidth
+%    \end{macrocode}
+% \end{macro}
+%    \begin{macrocode}
+\newcommand*\fb@thebibliography[1]{%
+%    \end{macrocode}
+% We open still a new group to prevent our definitions to conflict with
+% macros that might be used by |\end{thebibliography}|. We let
+% |\endthebibliography| equal to |\endgroup| so that it closes this group.
+%    \begin{macrocode}
+  \begingroup
+  \let\endthebibliography\endgroup
+%    \end{macrocode}
+% Record the size of the longest label
+%    \begin{macrocode}
+  \settowidth\dimen@{\footrefstyle\footreflabel{#1}}%
+  \ifdim\dimen@>\fb@lblwidth\global\fb@lblwidth=\dimen@\fi
+%    \end{macrocode}
+%
+% \begin{macro}{\@bracelevel}
+% \begin{macro}{\@bgrouplineno}
+% \begin{macro}{\@on@line}
+% \begin{macro}{\@eat}
+% Some definitions necessary to read the bibliography entries.
+% All these definitions are local since the command
+% |\begin{thebibliography}| opened a new group. They will be
+% cancelled when |\end{thebibliography}| is executed.
+% The names of global definitions have the form |\fb@|\dots\ while the
+% names of local definitions simply start with |\@|\dots\ We reuse as
+% much as possible 
+% existing global names so that we do not use memory unnecessarily.
+% the |\@bracelevel| counter keeps track of groups nesting while
+% reading the bibliography. The |\@bgrouplineno| counter holds the
+% number of the input line where the current group started. It is
+% used for error messages. |\@on@line| is similar to the |\on@line|
+% command of the \LaTeXe\ kernel but also shows the name of the
+% current file.
+%    \begin{macrocode}
+  \newcount\@bracelevel
+  \newcount\@bgrouplineno
+  \def\@on@line{\on@line\space of \fb@bibname.bbl}%
+  \def\@eat{\let\@tempa= }%
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@bgroup}
+% \begin{macro}{\@egroup}
+% \begin{macro}{\bgroup}
+% \begin{macro}{\egroup}
+% |\bgroup| and |\egroup| are redefined so that we may distinguish
+% between explicit and implicit begin or end group characters.
+%    \begin{macrocode}
+  \let\@bgroup{%
+  \let\@egroup}%
+  \let\bgroup\relax
+  \let\egroup\relax
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@actlet}
+% |\@actlet\|\meta{char}\meta{cmd} makes \meta{char} active and lets it
+% equal to \meta{cmd}.
+%    \begin{macrocode}
+  \def\@actlet##1{%
+      \catcode`##1=\active
+      \begingroup\lccode`~=`##1\lowercase{\endgroup\let~}}%
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@noitemerror}
+% |\@noitemerror| is called to raise an error if anything is seen
+% between |\begin{thebibliography}| and the first |\bibitem|. If the
+% user types \meta{return} at the prompt, the next token is swallowed
+% and the processing goes on.
+%    \begin{macrocode}
+  \def\@noitemerr{%
+      \PackageError{footbib}{Missing \string\bibitem\@on@line}\@empty
+      \afterassignment\@readbib\@eat}%
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@errifbraces}
+% |\@errifbraces|\meta{cmp} compares |\@bracelevel| with 0 using
+% \meta{cmp} ($=$ or $>$) and raises an error if the test succeeds.
+%    \begin{macrocode}
+  \def\@errifbraces##1{%
+      \ifnum\@bracelevel##1\z@
+        {\ifx##1>\let\inputlineno\@bgrouplineno\fi
+        \PackageError{footbib}{%
+           \ifx##1>Unmatched begin\else Extra end\fi-group
+           character\@on@line}\@empty}% 
+      \fi}% 
+%    \end{macrocode}
+% \end{macro}
+% Now come all the commands which read and handle the tokens.
+%
+% \begin{macro}{\@readbib}
+% \begin{macro}{\@xreadbib}
+% These macros read the next token and take the appropriate action.
+%    \begin{macrocode}
+  \def\@readbib{\futurelet\@tok\@xreadbib}%
+  \def\@xreadbib{%
+      \ifx\@tok\@sptoken\let\@tempa\@readsp
+      \else\ifx\@tok\par\let\@tempa\@readpar
+      \else\ifx\@tok\bibitem\let\@tempa\@endbibitem
+      \else\ifx\@tok\end\let\@tempa\@checkendbib
+      \else\if@newlist\let\@tempa\@noitemerr
+      \else\ifx\@tok\@bgroup\let\@tempa\@eat\afterassignment\@begingroup
+      \else\ifx\@tok\@egroup\let\@tempa\@eat\afterassignment\@endgroup
+      \else\ifx\@tok\verb\let\@tempa\relax
+      \else\let\@tempa\@addtotxt
+      \fi\fi\fi\fi\fi\fi\fi\fi\@tempa}%
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bibitem}
+% \begin{macro}{\@bibitem}
+% \begin{macro}{\@lbibitem}
+% The macro |\bibitem| is called if the next token is |\bibitem|. It
+% calls |\@lbibitem| or |\@bibitem| depending on whether a label is
+% provided or not. If no label is provided, |\@bibitem| provides one.
+% The definition of this macro depends on the switch |\iffb@firstcite|
+% which is true iff a |firstcite|\SpecialOptionIndex{firstcite} option
+% was used. If so, a \emph{dynamic} label\Index{dynamic}{label} is
+% provided. Otherwise, a \emph{static} label\Index{static}{label} is
+% provided which is the current value of the counter |\fb@refcount|.
+%    \begin{macrocode}
+  \def\bibitem{%
+      \@errifbraces>%
+      \@newlistfalse
+      \@ifnextchar[\@lbibitem\@bibitem}%
+  \iffb@firstcite
+    \def\@bibitem{\@lbibitem[\fb@setlbl]}%
+  \else
+    \def\@bibitem{%
+      \advance\fb@refcount\@ne
+      \expandafter\@lbibitem\expandafter[\the\fb@refcount]}%
+  \fi
+  \def\@lbibitem[##1]##2{%
+      \fb@lbl{{##1}}%
+      \fb@vedef\fb@key{##2}%
+      \fb@txt{}%
+      \let\@lastsptok\@empty
+      \@inlabeltrue
+      \@readbib}%
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@checkendbib}
+% The macro |\@checkendbib| is called when the next token is |\end|. It
+% reads the argument of |\end| and checks whether it is
+% |thebibliography|. If so it calls |\@endbibitem| to terminate the
+% current reference (if any) and reinserts |\end{thebibliography}| which will
+% terminate the bibliography.
+%    \begin{macrocode}
+  \def\@checkendbib\end##1{%
+      \def\@tempa{##1}\def\@tempb{thebibliography}%
+      \ifx\@tempa\@tempb
+        \def\@tempa{\@endbibitem\end{##1}}%
+      \else
+        \if@newlist
+          \let\@tempa\@noitemerr
+        \else
+          \def\@tempa{\@addtotxt{\end{##1}}}%
+        \fi
+      \fi\@tempa}%
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@endbibitem}
+% The macro |\@endbibitem| terminates the current reference (if any) and
+% calls |\fb@setref| which stores it in a macro. If the switch
+% |\iffb@xref| is true, i.e~a |citeonce*|\SpecialOptionIndex{citeonce*}
+% option was used, 
+% |\@endbibitem| adds to the text of the reference the command
+% |\fb@settxt| which will modify it dynamically.
+%    \begin{macrocode}
+  \def\@endbibitem{%
+      \if@newlist\else
+        \@errifbraces>%
+        \iffb@xref
+          \fb@txt\expandafter{\expandafter\fb@settxt\expandafter{\the\fb@txt}}%
+        \fi
+        \fb@setref
+      \fi}%
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@addtotxt}
+% The macro |\@addtotxt| adds to the text of the reference so far, first
+% the last \emph{space} token (\meta{space} or |\par|) and then its
+% argument. 
+%    \begin{macrocode}
+  \long\def\@addtotxt##1{%
+      \fb@txt\expandafter\expandafter\expandafter
+        {\expandafter\the\expandafter\fb@txt\@lastsptok##1}%
+      \let\@lastsptok\@empty
+      \@inlabelfalse
+      \@readbib}%
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@readsp}
+% \begin{macro}{\@readpar}
+% \begin{macro}{\@lastsptok}
+% The \emph{space} tokens \meta{space} and |\par| are handled in a
+% delayed way. They are first recorded in a single place
+% (|\@lastsptok|), so that each one overrides the previous one. 
+% The most recent one is added to the text of the reference each time
+% |\@addtotxt| is called. This mechanism discards any space preceding
+% a |\par| token and also the |\par| which occurs generally at the
+% end of each reference.
+%    \begin{macrocode}
+  \expandafter\def\expandafter\@readsp\space{%
+      \if@inlabel\else\let\@lastsptok\space\fi
+      \@readbib}%
+  \def\@readpar\par{%
+      \if@inlabel\else\def\@lastsptok{\par}\fi
+      \@readbib}%
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@begingroup}
+% \begin{macro}{\@endgroup}
+% The macros |\@begingroup| and |\@endgroup| are called when a begin-
+% or end-group character is seen. |\@begingroup| opens a new group and
+% increments the counter |\@bracelevel|. It also records the number of the
+% input line which may be used later for error reporting. |\@endgroup| closes
+% the group, which restores the previous value of |\@bracelevel|, and calls
+% |\@addtotxt| to add the group to the text of the reference so far.
+%    \begin{macrocode}
+  \def\@begingroup{%
+      \@bgroup
+      \advance\@bracelevel\@ne
+      \@bgrouplineno=\inputlineno
+      \fb@txt{}%
+      \let\@lastsptok\@empty
+      \@readbib}%
+  \def\@endgroup{%
+      \@errifbraces=%
+      \edef\@tempa{\@egroup\noexpand\@addtotxt{{\the\fb@txt\@lastsptok}}}%
+      \@tempa}%
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\verb}
+% \begin{macro}{\@sverb}
+% We provide special support for the |\verb| command. The following code
+% is essentially borrowed from the \LaTeXe\ kernel. Just we let the
+% active characters equal to |\relax| so that they are not expanded.
+%    \begin{macrocode}
+  \def\verb{%
+      \begingroup
+%    \end{macrocode}
+% First make all special characters `other'
+%    \begin{macrocode}
+      \let\do\@makeother \dospecials
+%    \end{macrocode}
+% Avoid ligatures
+%    \begin{macrocode}
+      \def\do####1{\@actlet####1\relax}\verbatim@nolig@list
+%    \end{macrocode}
+% An end of line character in the argument of |\verb| is an error.
+%    \begin{macrocode}
+      \@actlet\^^M\verb@eol@error
+      \@ifstar{\@sverb*}{\@actlet\ \relax\@sverb\@empty}}%
+  \def\@sverb##1##2{%
+      \@actlet##2\verb@egroup
+%    \end{macrocode}
+% Read the argument of |\verb|.
+%    \begin{macrocode}
+      \edef\@tempa{\noexpand\verb##1\noexpand~\iffalse}\fi}%
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\verb@egroup}
+% Normal termination of |\verb|. The |~| must be protected against expansion
+% because we are still inside the |\edef| started by |\@sverb|.
+%    \begin{macrocode}
+  \def\verb@egroup{%
+      \noexpand~\iffalse{\fi}%
+      \expandafter\endgroup\expandafter\@addtotxt\expandafter{\@tempa}}%
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\verb@eol@error}
+% The macro |\verb@eol@error| is called if an end of line character
+% occurs before the normal termination of |\verb|. Unlike it is done in the
+% \LaTeXe\ kernel, we do not terminate the |\verb| because the most frequent
+% case is when \BibTeX\ breaks the argument of |\verb| because the line is too
+% long. The closing delimiter will generally be found on the next line.
+%    \begin{macrocode}
+  \def\verb@eol@error{\iffalse{\fi}%
+      \GenericError\@empty{LaTeX Error:
+          \noexpand\verb ended by end of line\@on@line}\@gobble%
+          {The argument of \string\verb\@on@line\space contains 
+               an end of line.\MessageBreak 
+           Type \space X <return> \space to quit.\MessageBreak}%
+%    \end{macrocode}
+% We try to recover from error in case the user types \meta{return} at the
+% prompt. We where defining |\@tempa| which contains now
+% |\verb|?|~|\dots\ where\ ?\ stands for |*| or nothing. 
+%    \begin{macrocode}
+      \toks@\expandafter{\@tempa}%
+      \edef\@tempa{\the\toks@\iffalse}\fi}%
+%    \end{macrocode}
+% \end{macro}
+% Some initialisation before starting to read the
+% bibliography. 
+%    \begin{macrocode}
+  \@bracelevel\z@
+  \@newlisttrue
+  \@inlabeltrue
+%    \end{macrocode}
+% And finally start to read the bibliography. This is the end of
+% |\fb@thebibliography| 
+%    \begin{macrocode}
+  \@readbib}
+%    \end{macrocode}
+% \end{macro}
+%
+% At the end of the document, we first do a |\clearpage| to be sure
+% that all the writes have been performed. Then we close the
+% auxiliary file and finally read it to check whether any change
+% occured between the previous run and the current one. If so, we issue a
+% warning. 
+%    \begin{macrocode}
+\AtEndDocument{%
+  \clearpage
+  \if@filesw
+    \immediate\closeout\fb@auxout
+    \begingroup
+      \let\citation\@gobble \let\bibstyle\@gobble \let\bibdata\@gobble
+      \def\bibcite#1#2#3#4#5{%
+        \advance\fb@citecount\@ne
+        \fb@vedef\@tempa{#1}%
+        \edef\@tempa{{\@tempa}{#2}{#3}{#4}{#5}}%
+        \expandafter\ifx\csname fb@c.\the\fb@citecount\endcsname
+%    \end{macrocode}
+% \FbIndex{\fb@c.\noexpand~{num}}^^A
+%    \begin{macrocode}
+          \@tempa\else\@tempswatrue\fi}%
+      \fb@citecount\z@
+      \@tempswafalse
+      \input\fb@bibname.aux
+      \if@tempswa
+        \PackageWarning{footbib}{Bibliography not yet stable. Rerun
+                                   LaTeX\@gobble}% 
+      \fi
+    \endgroup
+  \fi}
+%    \end{macrocode}
+%
+% \subsection{Output routine}
+%
+% We redefine the macros |\@specialoutput|, |\@doclearpage|,
+% |\@makecol| and |\@reinserts| used by the output routine of \LaTeX\
+% so that we may insert the foot bibliography.
+% The code is just a patch to the macros defined in the \LaTeXe\ kernel.
+% 
+% \begin{macro}{\@specialoutput}
+% If a foot bibliography is present, |\@specialoutput| must add to
+% the height of the page the height plus depth of the foot
+% bibliography and the length of the skip above it.
+%    \begin{macrocode}
+\def\@specialoutput{%
+  \ifnum \outputpenalty>-\@Mii
+    \@doclearpage
+  \else
+    \ifnum \outputpenalty<-\@Miii
+      \ifnum \outputpenalty<-\@MM \deadcycles \z@ \fi
+      \global \setbox\@holdpg \vbox {\unvbox\@cclv}%
+    \else
+      \global \setbox\@holdpg \vbox{%
+                     \unvbox\@holdpg
+                     \unvbox\@cclv
+                     \setbox\@tempboxa \lastbox
+                     \unskip}%
+      \@pagedp \dp\@holdpg
+      \@pageht \ht\@holdpg
+      \unvbox \@holdpg
+      \@next\@currbox\@currlist{%
+        \ifnum \count\@currbox>\z@
+          \advance \@pageht \@pagedp
+          \ifvoid\footins \else
+            \advance \@pageht \ht\footins
+            \advance \@pageht \skip\footins
+            \advance \@pageht \dp\footins
+          \fi
+%    \end{macrocode}
+% \begin{FbPatch}{addition}
+%    \begin{macrocode}
+          \ifvoid\fb@ins\else
+            \advance\@pageht\ht\fb@ins
+            \advance\@pageht\skip\fb@ins
+            \advance\@pageht\dp\fb@ins
+          \fi
+%    \end{macrocode}
+% \end{FbPatch}
+%    \begin{macrocode}
+          \ifvbox \@kludgeins
+            \ifdim \wd\@kludgeins=\z@
+              \advance \@pageht \ht\@kludgeins
+            \fi
+          \fi
+          \@reinserts
+          \@addtocurcol
+        \else
+          \@reinserts
+          \@addmarginpar
+        \fi}%
+       \@latexbug
+      \ifnum \outputpenalty<\z@
+        \if@nobreak 
+          \nobreak
+        \else
+          \addpenalty \interlinepenalty
+        \fi
+      \fi
+    \fi
+  \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@doclearpage}
+% The test at the beginning of |\@doclearpage| has been modified so that
+% it checks that \emph{both} footnotes and the foot bibliography are empty.
+%    \begin{macrocode}
+\def \@doclearpage {%
+%    \end{macrocode}
+% \begin{FbPatch}{modification}
+%    \begin{macrocode}
+%  \ifvoid\footins
+  \@tempswatrue
+  \ifvoid\footins\else\@tempswafalse\fi
+  \ifvoid\fb@ins\else\@tempswafalse\fi
+  \if@tempswa
+%    \end{macrocode}
+% \end{FbPatch}
+%    \begin{macrocode}
+    \ifvbox\@kludgeins
+      {\setbox \@tempboxa \box \@kludgeins}%
+    \fi
+    \setbox\@tempboxa\vsplit\@cclv to\z@ \unvbox\@tempboxa
+    \setbox\@tempboxa\box\@cclv
+    \xdef\@deferlist{\@toplist\@botlist\@deferlist}%
+    \global \let \@toplist \@empty
+    \global \let \@botlist \@empty
+    \global \@colroom \@colht
+    \ifx \@currlist\@empty
+    \else
+      \@latexerr{Float(s) lost}\@ehb
+      \global \let \@currlist \@empty
+    \fi
+    \@makefcolumn\@deferlist
+    \@whilesw\if@fcolmade \fi{\@opcol\@makefcolumn\@deferlist}%
+    \if@twocolumn
+      \if@firstcolumn
+        \xdef\@dbldeferlist{\@dbltoplist\@dbldeferlist}%
+        \global \let \@dbltoplist \@empty
+        \global \@colht \textheight
+        \begingroup
+          \@dblfloatplacement
+          \@makefcolumn\@dbldeferlist
+          \@whilesw\if@fcolmade \fi{\@outputpage\@makefcolumn\@dbldeferlist}%
+        \endgroup
+      \else
+        \vbox{}\clearpage
+      \fi
+    \fi
+  \else
+    \setbox\@cclv\vbox{\box\@cclv\vfil}%
+    \@makecol\@opcol
+    \clearpage
+  \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@makecol}
+% In addition to footnotes (if any), |\@makecol| must add the foot
+% bibliography to the page. It is added immediately below the footnotes.
+% The test at the beginning of |\@makecol| has been modified in the same
+% way as in |\@doclearpage|
+%    \begin{macrocode}
+\def \@makecol {%
+%    \end{macrocode}
+% \begin{FbPatch}{modification}
+%    \begin{macrocode}
+%  \ifvoid\footins
+  \@tempswatrue
+  \ifvoid\footins\else\@tempswafalse\fi
+  \ifvoid\fb@ins\else\@tempswafalse\fi
+  \if@tempswa
+%    \end{macrocode}
+% \end{FbPatch}
+%    \begin{macrocode}
+    \setbox\@outputbox \box\@cclv
+  \else
+    \setbox\@outputbox \vbox {%
+      \boxmaxdepth \@maxdepth
+      \unvbox \@cclv
+%    \end{macrocode}
+% \begin{FbPatch}{addition}
+%    \begin{macrocode}
+      \ifvoid\footins \else
+%    \end{macrocode}
+% \end{FbPatch}
+%    \begin{macrocode}
+        \vskip \skip\footins
+        \color@begingroup
+          \normalcolor
+          \footnoterule
+          \unvbox \footins
+        \color@endgroup
+%    \end{macrocode}
+% \begin{FbPatch}{addition}
+%    \begin{macrocode}
+      \fi
+      \ifvoid\fb@ins\else
+        \vskip\skip\fb@ins
+        \color@begingroup
+          \normalcolor
+          \footbibrule
+          \unvbox\fb@ins
+        \color@endgroup
+      \fi
+%    \end{macrocode}
+% \end{FbPatch}
+%    \begin{macrocode}
+      }%
+  \fi
+  \let\@elt\relax
+  \xdef\@freelist{\@freelist\@midlist}%
+  \global \let \@midlist \@empty
+  \@combinefloats
+  \ifvbox\@kludgeins
+    \@makespecialcolbox
+  \else
+    \setbox\@outputbox \vbox to\@colht {%
+      \@texttop
+      \dimen@ \dp\@outputbox
+      \unvbox \@outputbox
+      \vskip -\dimen@
+      \@textbottom}%
+  \fi
+  \global \maxdepth \@maxdepth}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@reinserts}
+% The macro |\@reinsert| was modified to reinsert also the foot
+% bibliography after float processing. 
+%    \begin{macrocode}
+\def\@reinserts{%
+  \ifvoid\footins\else\insert\footins{\unvbox\footins}\fi
+%    \end{macrocode}
+% \begin{FbPatch}{addition}
+%    \begin{macrocode}
+  \ifvoid\fb@ins\else\insert\fb@ins{\unvbox\fb@ins}\fi
+%    \end{macrocode}
+% \end{FbPatch}
+%    \begin{macrocode}
+  \ifvbox\@kludgeins\insert\@kludgeins{\unvbox\@kludgeins}\fi}
+%    \end{macrocode}
+% \end{macro}
+%    \begin{macrocode}
+\endinput
+%</package>
+%    \end{macrocode}
+%
+% \Finale
-- 
cgit v1.2.3

