% \iffalse %% %% File: footbib.dtx Copyright (C) 1997-2005 Eric Domenjoud %% %% Eric Domenjoud, %% CRIN/CNRS & INRIA Lorraine %% 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.4} \def\filedate{2004/06/04} %<*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} % % \fi % % \CheckSum{2068} % % \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 may be specified independently of the standard one. % 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{The 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 % |\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 foot 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[,{\penalty10000\ }] %\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 length 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 foot 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 % |\renewcommand*\footxref[2]{|\dots|}|. % % \end{list} % % \section{Known and potential problems} % % \begin{list}{$\bullet$}{\settowidth\leftmargin{$\bullet$\hskip\labelsep}} % \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 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 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 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 foot 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`=\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\@tempdima\dp\@cclv\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 \space to quit or cross your fingers and just type .\MessageBreak} \fi % % \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 \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{Appearance 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 a % \emph{verbatim} copy of it. 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} % \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 case, 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{In fact, a right page may also start a new unit if the % user used for instance the % |firstcite(chapter)|\SpecialOptionIndex{firstcite} option 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} % % \section{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} % 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\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@keys,\fb@deferredcite}% \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 foot 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{% \color@begingroup \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 \setbox\@tempboxa\hbox{\footreflabel{\the\fb@lbl}}% \hskip-\@tempdima \ifdim\wd\@tempboxa<\fb@lblwidth \hbox to\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 let 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 \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}{#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 \@tempdima\dp\@cclv \unvbox \@cclv \vskip-\@tempdima % \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 % % \end{macrocode} % % \Finale