summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/hyperref/backref.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/hyperref/backref.dtx
Initial commit
Diffstat (limited to 'macros/latex/contrib/hyperref/backref.dtx')
-rw-r--r--macros/latex/contrib/hyperref/backref.dtx947
1 files changed, 947 insertions, 0 deletions
diff --git a/macros/latex/contrib/hyperref/backref.dtx b/macros/latex/contrib/hyperref/backref.dtx
new file mode 100644
index 0000000000..dd31e66d71
--- /dev/null
+++ b/macros/latex/contrib/hyperref/backref.dtx
@@ -0,0 +1,947 @@
+% \iffalse
+%% File: backref.dtx
+%% Copyright (C) 1995-2000 David Carlisle, Sebastian Rahtz, Heiko Oberdiek
+%% 2001-2012 Heiko Oberdiek
+%% 2016 Oberdiek Package Suport Group
+%% https://github.com/ho-tex/hyperref/issues
+%%
+%% This file is part of the `Hyperref Bundle'.
+%% -------------------------------------------
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3
+%% 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.3 or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Heiko Oberdiek.
+%%
+%% The list of all files belonging to the `Hyperref Bundle' is
+%% given in the file `manifest.txt'.
+%
+%<*dtx>
+\ProvidesFile{backref.dtx}
+%</dtx>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{backref}
+%<driver>\ProvidesFile{backref.drv}
+% \fi
+% \ProvidesFile{backref.dtx}
+ [2016/05/21 v1.39 Bibliographical back referencing]%
+%
+% \CheckSum{768}
+%
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage[numbered]{hypdoc}
+\usepackage{bmhydoc}
+\usepackage{backref}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \GetFileInfo{backref.sty}%
+ \title{%
+ Back referencing from bibliographical citations%
+ \thanks{%
+ This file has version number \fileversion, %
+ last revised \filedate.%
+ }%
+ }%
+ \author{David Carlisle and Sebastian Rahtz (deceased)}%
+ \date{\filedate}%
+ \maketitle
+ \makeatletter
+ \@ifundefined{HyperrefOverview}{}{%
+ \HyperrefOverview*%
+ }%
+ \tableofcontents
+ \DocInput{backref.dtx}%
+ \PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+% \MakeShortVerb{|}
+%
+% \section{Introduction}
+%
+% \section{Usage}
+%
+% \subsection{Options}
+%
+% The supported options are given as package options.
+% Few options (e.g. |verbose|, |enable|, |disable|)
+% can be changed after the package is loaded by
+% the macro \cs{backrefsetup}, e.g.:
+% \begin{quote}
+%\begin{verbatim}
+%\usepackage[verbose]{backref}
+%\backrefsetup{verbose=false}
+%\end{verbatim}
+% \end{quote}
+% This macro is available since version 2012/07/24 v1.37.
+%
+% \subsubsection{Options for type of back references}
+%
+% In short the following options set the type of back
+% references. Default is option |pageref|.
+% \begin{quote}
+% \begin{tabular}{@{}ll@{}}
+% |ref| & section number\\
+% |pageref| & page number\\
+% |hyperref| & section number as hyper link\\
+% |hyperpageref| & page number as hyper link
+% \end{tabular}
+% \end{quote}
+% The options that start with |hyper| are intended for
+% the use with package |hyperref|. In this case package
+% |backref| will be loaded automatically if the |hyperref|
+% options |backref| or |pagebackref| are given. Package
+% |hyperref| then loads package |backref| with the appropriate
+% option:
+% \begin{quote}
+% \begin{tabular}{@{}ll@{}}
+% |hyperref| option & |backref| option set by |hyperref|\\
+% \hline
+% |backref| & |hyperref|\\
+% |backref=section| & |hyperref|\\
+% |backref=slide| & |hyperref|\\
+% |backref=page| & |hyperpageref|\\
+% |pagebackref| & |hyperpageref|
+% \end{tabular}
+% \end{quote}
+%
+% \subsubsection{Language options}
+%
+% Currently supported options are |english| (|american|, |australian|,
+% |british|, |canadian|, |newzealand|, |UKenglish|, |USenglish|),
+% |german| (|ngerman|, |austrian|, |naustrian|),
+% |french| (|acadian|, |canadien|, |frenchb|, |francais|),
+% |spanish|, and |brazil| (|brazilian|).
+% Default is |english|.
+%
+% \subsubsection{Other options}
+%
+% \begin{description}
+% \item[|verbose|:]
+% A message is written into the |.aux| file for each
+% reference that is found for back citing.
+% \item[|enable|, |disable|:]
+% If a citation should not be back cited, then
+% the recording can be turned off by option |disable|
+% and enabled again afterwards, e.g.:
+% \begin{quote}
+%\begin{verbatim}
+%\bookmarksetup{disable}\cite{...}\bookmarksetup{enable}
+%\end{verbatim}
+% \end{quote}
+% Both options are added in version 2012/07/24 v1.37.
+% \end{description}
+%
+% \subsection{Detecting the end of a bibliography entry}
+%
+% Package |backref| has to be able to detect the end of an entry
+% in the bibliography, therefore each \cmd{\bibitem} entry must
+% be ended by an empty line (or a |\par| token).
+% \nopagebreak
+%
+% Example:
+%\begin{quote}
+%\begin{verbatim}
+%\begin{thebibliography}{9}
+%\bibitem[bib:abc] First entry.
+%
+%\bibitem[bib:foo] Second entry.
+%
+%\end{thebibliography}
+%\end{verbatim}
+%\end{quote}
+% Then package |backref| can automatically add hooks
+% for the back references list at the end of the entries.
+%
+% \DescribeMacro{\backrefparscanfalse}
+% \DescribeMacro{\backrefparscantrue}
+% Sometimes it is not appropriate if the entry is read as
+% argument. For example, catcode changes for verbatim stuff
+% do not have the desired effect. Therefore the scan for
+% the \cs{par} token can be disabled by \cs{backrefparscanfalse}
+% before \cs{bibitem} and enabled by \cs{backrefparscantrue}
+% afterwards.
+%
+% \DescribeMacro{\backrefprint}
+% If the scan for the end of the entry is disabled, then package
+% |backref| does not know where to put the back references
+% list. The list is printed by the macro \cs{backrefprint}, thus
+% just call it at the right place. Example:
+%\begin{quote}
+%\begin{verbatim}
+%\backrefparscanfalse % disable scan for entry ending
+%\bibitem[...]{...}
+% ... \verb|...| ... % potentially dangerous stuff
+% ... \url{...} ...
+% \backrefprint % print back reference list here
+%\backrefparscantrue % enable scan again
+%\end{verbatim}
+%\end{quote}
+%
+% \subsection{Formatting of the back references list}
+%
+% The back references list is separated from the entry
+% by \cmd{\newblock},
+% if the used bibliography package supports this. The package options
+% control the kind of back references (page numbers, sections numbers),
+% whereas the hooks control the formatting.
+%
+% There are two hooks \cmd{\backref} and a new hook \cmd{\backrefalt},
+% available since version 1.21 of package |backref|. The former one
+% is enabled by default.
+%
+% \subsubsection{Formatting hook \cs{backref}}
+%
+% Macro \cmd{\backref} has a a comma separated
+% list of backref references as first and only argument.
+% With hyperref options only this list will be printed. Without
+% hyperref there is an introductionary text, controlled by
+% macros \cmd{\backrefpagesname} or \cmd{\backrefsectionsname}.
+%
+% \subsubsection{Formatting hook \cs{backrefalt}}
+%
+% \cmd{\backrefalt} is a new interface since version 1.21 of package
+% |backref|. It takes four arguments:
+% \begin{enumerate}
+% \item Number of citations without dupes.
+% \item Back references list without dupes.
+% \item Number of all citations (with dupes).
+% \item Back reference list with all entries (with dupes).
+% \end{enumerate}
+% The latter options consider equal entries as one entry.
+% Now \cmd{\backrefalt} can easily be defined with text that
+% depends on the number of citations, for example:
+%\begin{quote}
+%\begin{verbatim}
+%\usepackage[backref]{backref}
+%\renewcommand*{\backref}[1]{}% for backref < 1.33 necessary
+%\renewcommand*{\backrefalt}[4]{%
+% \ifcase #1 %
+% No citations.%
+% \or
+% One citation in section #2.%
+% \else
+% #1 citations in sections #2.%
+% \fi
+%}
+%\end{verbatim}
+%\end{quote}
+% The separation between the list entries are controlled by
+% the following macros:
+% \begin{itemize}
+% \item \cmd{\backrefsep}: inserted between entries except for the
+% next cases, default is ``\verb*|, |''.
+% \item \cmd{\backreftwosep}: inserted between entries in
+% a list of two entries, default is ``\verb*| and~|''.
+% \item \cmd{\backreflastsep}: inserted between the last two
+% entries of a list with more than two entries, default is
+% ``\verb*|, and~|''.
+% \end{itemize}
+% Examples:
+% \begin{quote}
+% \meta{entry1}\\
+% \meta{entry1} \cmd{\backreftwosep} \meta{entry2}\\
+% \meta{entry1} \cmd{\backrefsep} \meta{entry2}
+% \cmd{\backreflastsep} \meta{entry3}
+% \end{quote}
+% Since version 1.33 it is not necessary to redefine
+% \backref, it is automatically disabled if \backrefalt
+% is redefined.
+%
+% \subsubsection{Refinement \cs{backrefentrycount}}
+%
+% Since version 1.33 the entries of the distinct list of
+% interface \cs{backrefalt} are wrapped in
+% \cs{backrefentrycount}. The macro is called with two
+% arguments. The first is the backref entry and the second
+% one the citation count of this entry. As default the
+% macro passes the first argument through and ignores the
+% count argument. But it can be redefined, e.g.
+%\begin{quote}
+%\begin{verbatim}
+%\renewcommand*{\backrefalt}[4]{...}% see above
+%\renewcommand*{\backrefentrycount}[2]{%
+% #1%
+% \ifnum#2>1 %
+% ~(#2)%
+% \fi
+%}
+%\end{verbatim}
+%\end{quote}
+% In case of duplicates, the distinct entry is
+% appended by the number of citations in parentheses.
+%
+% \StopEventually{}
+%
+% \section{The macros}
+% Internal command names of this package start with |\BR@|,
+% commands, that store the original meaning of commands, which
+% will be redefined, are prefixed with |\BRorg@|.
+%
+% \subsection{Package identification}
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \subsection{Options}
+%
+% \begin{macrocode}
+\RequirePackage{kvoptions}[2011/06/30]
+\RequirePackage{kvsetkeys}[2009/07/30]
+\RequirePackage{ltxcmds}[2009/12/12]
+\SetupKeyvalOptions{%
+ family=backref,%
+ prefix=BR@,%
+}
+% \end{macrocode}
+% \begin{macro}{\backrefsetup}
+% \begin{macrocode}
+\newcommand*{\backrefsetup}{\kvsetkeys{backref}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Option verbose}
+% If package hyperref is loaded, then its setting is used as
+% default for the verbose switch.
+% \begin{macrocode}
+\DeclareBoolOption[%
+ \ltx@ifundefined{ifHy@verbose}{%
+ false%
+ }{%
+ \ifx\ifHy@verbose\iftrue true\else false\fi
+ }%
+]{verbose}
+% \end{macrocode}
+%
+% \subsubsection{Options for way of working}
+%
+% What is printed depends on how the 3 available items of
+% information are used (page number, section number, label).
+% \begin{macrocode}
+\long\def\page@backref#1#2#3{#1}
+\long\def\section@backref#1#2#3{#2}
+\long\def\hyper@section@backref#1#2#3{\hyperlink{#3}{#2}}
+\long\def\hyper@page@backref#1#2#3{\hyperlink{page.#1}{#1}}
+% \end{macrocode}
+% Now the options follows, that can be used without
+% package hyperref.
+% \begin{macrocode}
+\DeclareVoidOption{pageref}{%
+ \def\backref{\backrefpagesname\ }%
+ \let\backrefxxx\page@backref
+}
+\DeclareVoidOption{ref}{%
+ \def\backref{\backrefsectionsname\ }%
+ \let\backrefxxx\section@backref
+}
+% \end{macrocode}
+% Set up back-referencing to be hyper links, by page or section.
+% \begin{macrocode}
+\DeclareVoidOption{hyperref}{%
+ \def\backref{}\let\backrefxxx\hyper@section@backref
+}
+\DeclareVoidOption{hyperpageref}{%
+ \def\backref{}\let\backrefxxx\hyper@page@backref
+}
+% \end{macrocode}
+% Recording the back references in the auxiliary file can
+% be enabled and disabled by the following options.
+% \begin{macrocode}
+\DeclareBoolOption[true]{enable}
+\DeclareComplementaryOption{disable}{enable}
+% \end{macrocode}
+%
+% \subsubsection{Language options}
+%
+% \begin{macrocode}
+\def\backrefenglish{%
+ \def\backrefpagesname{pages}%
+ \def\backrefsectionsname{sections}%
+ \def\backrefsep{, }%
+ \def\backreftwosep{ and~}%
+ \def\backreflastsep{, and~}%
+}
+\def\backrefgerman{%
+ \def\backrefpagesname{Seiten}%
+ \def\backrefsectionsname{Abschnitte}%
+ \def\backrefsep{, }%
+ \def\backreftwosep{ und~}%
+ \def\backreflastsep{ und~}%
+}
+\def\backreffrench{%
+ \def\backrefpagesname{pages}%
+ \def\backrefsectionsname{sections}%
+ \def\backrefsep{, }%
+ \def\backreftwosep{ et~}%
+ \def\backreflastsep{ et~}%
+}
+\def\backrefspanish{%
+ \def\backrefpagesname{p\'aginas}%
+ \def\backrefsectionsname{secciones}%
+ \def\backrefsep{, }%
+ \def\backreftwosep{ y~}%
+ \def\backreflastsep{ y~}%
+}
+\def\backrefbrazil{%
+ \def\backrefpagesname{p\'aginas}%
+ \def\backrefsectionsname{se\c c\~oes}%
+ \def\backrefsep{, }%
+ \def\backreftwosep{ e~}%
+ \def\backreflastsep{ e~}%
+}
+\def\backrefafrikaans{%
+ \def\backrefpagesname{bladsye}%
+ \def\backrefsectionsname{afdelings}%
+ \def\backrefsep{, }%
+ \def\backreftwosep{ en~}%
+ \def\backreflastsep{ en~}%
+}%
+% \end{macrocode}
+% Instead of package babel's definition of \cmd{\addto} the
+% implementation of package varioref is used. Additionally
+% argument |#1| is checked for \cmd{\relax}.
+% \begin{macrocode}
+\def\BR@addto#1#2{%
+ #2%
+ \@temptokena{#2}%
+ \ifx#1\relax
+ \let#1\@empty
+ \fi
+ \ifx#1\@undefined
+ \edef#1{\the\@temptokena}%
+ \else
+ \toks@\expandafter{#1}%
+ \edef#1{\the\toks@\the\@temptokena}%
+ \fi
+ \@temptokena{}\toks@\@temptokena
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\BR@DeclareLang#1#2{%
+ \begingroup
+ \edef\x##1##2{%
+ \noexpand\ifx##2\relax
+ \errmessage{No definitions for language `#2' found!}%
+ \noexpand\fi
+ \endgroup
+ \noexpand\DeclareVoidOption{#1}{%
+ \noexpand\BR@addto{\noexpand##1}{\noexpand##2}%
+ }%
+ }%
+ \expandafter\x\csname extras#1\expandafter\endcsname
+ \csname backref#2\expandafter\endcsname
+}
+\BR@DeclareLang{english}{english}
+\BR@DeclareLang{american}{english}
+\BR@DeclareLang{australian}{english}
+\BR@DeclareLang{british}{english}
+\BR@DeclareLang{canadian}{english}
+\BR@DeclareLang{newzealand}{english}
+\BR@DeclareLang{UKenglish}{english}
+\BR@DeclareLang{USenglish}{english}
+\BR@DeclareLang{german}{german}
+\BR@DeclareLang{ngerman}{german}
+\BR@DeclareLang{austrian}{german}
+\BR@DeclareLang{naustrian}{german}
+\BR@DeclareLang{french}{french}
+\BR@DeclareLang{acadian}{french}
+\BR@DeclareLang{canadien}{french}
+\BR@DeclareLang{frenchb}{french}
+\BR@DeclareLang{francais}{french}
+\BR@DeclareLang{spanish}{spanish}
+\BR@DeclareLang{brazil}{brazil}
+\BR@DeclareLang{brazilian}{brazil}
+\BR@DeclareLang{afrikaans}{afrikaans}
+% \end{macrocode}
+% Default is the english version:
+% \begin{macrocode}
+\backrefenglish
+% \end{macrocode}
+%
+% \subsubsection{Process options}
+%
+% \begin{macrocode}
+\backrefsetup{pageref}
+\ProcessKeyvalOptions*
+% \end{macrocode}
+%
+% \begin{macro}{\BR@DisableOption}
+% \begin{macrocode}
+\def\BR@DisableOption#1{%
+ \DisableKeyvalOption[%
+ action=warning,%
+ package=backref,%
+ ]{backref}{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\BR@DisableOption{ref}
+\BR@DisableOption{pageref}
+\BR@DisableOption{hyperref}
+\BR@DisableOption{hyperpageref}
+% \end{macrocode}
+%
+% \subsection{The bibliography}
+%
+% \begin{macro}{\ifbackrefparscan}
+% \begin{macrocode}
+\newif\ifbackrefparscan
+\backrefparscantrue
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifBR@BackrefAlt}
+% \begin{macrocode}
+\newif\ifBR@BackrefAlt
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\BR@bibitem}
+% \begin{macrocode}
+\def\BR@bibitem{%
+ \ifbackrefparscan
+ \expandafter\@ifnextchar\expandafter[\expandafter
+ \BR@@lbibitem\expandafter\BR@@bibitem
+ \else
+ \expandafter\@ifnextchar\expandafter[\expandafter
+ \BR@@@lbibitem\expandafter\BR@@@bibitem
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\def\BR@@lbibitem[#1]#2#3\par{%
+ \let\backrefprint\BR@backrefprint
+ \BRorg@bibitem[{#1}]{#2}#3%
+ \BR@backref{#2}%
+}%
+\def\BR@@bibitem#1#2\par{%
+ \let\backrefprint\BR@backrefprint
+ \BRorg@bibitem{#1}#2%
+ \BR@backref{#1}%
+}
+\def\BR@@@lbibitem[#1]#2{%
+ \def\backrefprint{\BR@backref{#2}}%
+ \BRorg@bibitem[{#1}]{#2}%
+}
+\def\BR@@@bibitem#1{%
+ \def\backrefprint{\BR@backref{#1}}%
+ \BRorg@bibitem{#1}%
+}
+\def\BR@backrefprint{%
+ \PackageError{backref}{%
+ \string\backrefprint\space is only available after \string\bibitem
+ \MessageBreak
+ with setting \string\backrefparscanfalse
+ }\@ehc
+}
+\let\backrefprint\BR@backrefprint
+\def\BR@backref#1{%
+ \newblock
+ \begingroup
+ \csname @safe@activestrue\endcsname
+ \expandafter\providecommand\csname brc@#1\endcsname{0}%
+ \expandafter\providecommand\csname brcd@#1\endcsname{0}%
+ \csname @safe@activesfalse\expandafter\endcsname
+ \ifBR@BackrefAlt
+ \ifx\backrefentrycount\BR@BackrefEntryCountUnused
+ \else
+ \BR@PopulateEntryCount{#1}%
+ \fi
+ \expandafter\backrefalt\csname brc@#1\expandafter\endcsname
+ \csname brl@#1\expandafter\endcsname
+ \csname brcd@#1\expandafter\endcsname
+ \csname brld@#1\endcsname
+ \else
+ \expandafter\backref\csname br@#1\expandafter\endcsname
+ \fi
+ \endgroup
+ \par
+}
+\@ifundefined{newblock}{\def\newblock{\par}}{}
+\let\BR@Unused\@empty
+\def\BR@BackrefAltUnused#1#2#3#4{\BR@Unused}
+\@ifundefined{backrefalt}{%
+ \let\backrefalt\BR@BackrefAltUnused
+}{}
+\def\BR@BackrefEntryCountUnused#1#2{\BR@Unused#1}
+\@ifundefined{backrefentrycount}{%
+ \let\backrefentrycount\BR@BackrefEntryCountUnused
+}{}
+% \end{macrocode}
+%
+% \subsection{Reading .brf file}
+%
+% \begin{macro}{\backcite}
+% The file |\jobname.brf| collects the back cite informations
+% as calls of \cmd{\backcite} with the informations
+% in the arguments.
+%
+% The first argument of macro \cmd{\backcite} is the citation
+% label, the second parameter contains the page number
+% (\cmd{\thepage}), the current label of the citation
+% (\cmd{\@currentlabel}), and the current anchor name
+% (\cmd{\@currentHref}). Example for a citation at the
+% first page in second section:
+%\begin{verbatim}
+%\backcite {bib:abc}{{1}{2}{section.2}}
+%\end{verbatim}
+%
+% While the file |\jobname.brf| is read, the informations are
+% collected and stored in macros whose names are build by the
+% citation label \meta{label}:
+% \begin{quote}
+% \begin{tabular}{@{}ll@{}}
+% |\br@|\meta{label} & list, entries separated by comma without dupes\\
+% |\brc@|\meta{label} & number of citations without dupes\\
+% |\brl@|\meta{label} & backref list without dupes\\
+% |\brcd@|\meta{label} & number of all citations (with dupes)\\
+% |\brld@|\meta{label} & backref list with all entries (with dupes)
+% \end{tabular}
+% \end{quote}
+% What are ``dupes''? An instance: you have three references to
+% an entry in the bibliography on the first page:
+%\begin{verbatim}
+%\backcite {bib:abc}{{1}{1}{section.1}}
+%\backcite {bib:abc}{{1}{1}{section.1}}
+%\backcite {bib:abc}{{1}{2}{section.2}}
+%\end{verbatim}
+% Then the whole backref list with option |pageref| would print, e.g.:
+% \begin{quote}
+% Entry for |bib:abc|. Cited on pages 1, 1, 1.
+% \end{quote}
+% Without dupes the entries with the same page number would be removed,
+% e.g.:
+% \begin{quote}
+% Entry for |bib:abc|. Cited on page 1.
+% \end{quote}
+% Also the third entry is removed, because it has the same page number.
+% For the comparison only these pieces of information are considered
+% that will be used later by \cmd{\backrefxxx}. With option
+% |pageref| macro \cmd{\backrefxxx} becomes \cmd{\page@backref} that
+% throws away the second and third argument and only uses the first
+% argument with the page number. To be more precise, the first
+% expansion of \cmd{\backrefxxx} is used in comparison. If some
+% arguments are used here, but later omitted, then this will not
+% be detected.
+%
+% \begin{macro}{\backrefxxxdupe}
+% With option |hyperref| you will get two entries
+% in the following example because the second entry differs in the
+% link information, so the result will be the same section number,
+% but as different links.
+%\begin{verbatim}
+%\backref {bib:abc}{{1}{1}{section.1}}
+%\backref {bib:abc}{{1}{1}{equation.1}}
+%\end{verbatim}
+% Macro \cmd{\backrefxxxdupe} will be used
+% in the comparison test if it is defined. Thus you can provide a
+% definition in this case as follows:
+%\begin{verbatim}
+%\newcommand*{\backrefxxxdupe}[3]{#2}
+%\end{verbatim}
+% Then only the section number is interpreted, but not the anchor name.
+% \end{macro}
+%
+% To avoid same entries, it is checked before, whether the entry
+% already exists. Only the information needed by \cmd{\backrefxxx}
+% is compared.
+% \begin{macrocode}
+\def\backcite#1#2{%
+ \@for\x:=#1\do{%
+ \begingroup
+ \csname @safe@activestrue\endcsname
+ \edef\x{\endgroup
+ \def\noexpand\x{\expandafter\@firstofone\x\@empty}%
+ }%
+ \x
+% \end{macrocode}
+% Now macro \cmd{\x} contains the citation label name.
+% \begin{macrocode}
+ \expandafter\ifx\csname br@\x\endcsname\relax
+% \end{macrocode}
+% Initialization, fill in the first entry.
+% \begin{macrocode}
+ \expandafter\protected@xdef\csname br@\x\endcsname{%
+ \protect\backrefxxx#2%
+ }%
+ \ifBR@BackrefAlt
+ \global\expandafter\let\csname brl@\x\expandafter\endcsname
+ \csname br@\x\endcsname
+ \global\expandafter\let\csname brld@\x\expandafter\endcsname
+ \csname br@\x\endcsname
+ \expandafter\gdef\csname brc@\x\endcsname{1}%
+ \expandafter\gdef\csname brcd@\x\endcsname{1}%
+ \fi
+ \else
+% \end{macrocode}
+% Fill in further entry. But check for dupe first.
+% \begin{macrocode}
+ \begingroup
+ \@ifundefined{backrefxxxdupe}{}{\let\backrefxxx\backrefxxxdupe}%
+ \expandafter\def\expandafter\reserved@a\expandafter{%
+ \backrefxxx#2%
+ }%
+ \let\BRorg@backrefxxx\backrefxxx
+ \global\let\BR@found=N%
+ \long\def\backrefxxx##1##2##3{%
+ \expandafter\def\expandafter\reserved@b\expandafter{%
+ \BRorg@backrefxxx{##1}{##2}{##3}%
+ }%
+ \ifx\reserved@a\reserved@b
+ \global\let\BR@found=Y%
+ \fi
+ }%
+ \setbox\@tempboxa\hbox{\csname br@\x\endcsname}%
+ \endgroup
+ \let\backrefsep\relax
+ \def\backreftwosep{\backrefsep}%
+ \def\backreflastsep{\backrefsep}%
+ \if N\BR@found
+ \expandafter\protected@xdef\csname br@\x\endcsname{%
+ \csname br@\x\endcsname, %
+ \protect\backrefxxx#2%
+ }%
+ \ifBR@BackrefAlt
+ \expandafter\protected@xdef\csname brl@\x\endcsname{%
+ \csname brl@\x\endcsname
+ \ifnum\@nameuse{brc@\x}=1 %
+ \noexpand\backreftwosep
+ \else
+ \noexpand\backreflastsep
+ \fi
+ \protect\backrefxxx#2%
+ }%
+ \count@=\@nameuse{brc@\x}\relax
+ \advance\count@ by 1 %
+ \expandafter\xdef\csname brc@\x\endcsname{\the\count@}%
+ \fi
+ \fi
+ \ifBR@BackrefAlt
+ \expandafter\protected@xdef\csname brld@\x\endcsname{%
+ \csname brld@\x\endcsname
+ \ifnum\@nameuse{brcd@\x}=1 %
+ \noexpand\backreftwosep
+ \else
+ \noexpand\backreflastsep
+ \fi
+ \protect\backrefxxx#2%
+ }%
+ \count@=\@nameuse{brcd@\x}\relax
+ \advance\count@ by 1 %
+ \expandafter\xdef\csname brcd@\x\endcsname{\the\count@}%
+ \fi
+ \fi
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\BR@PopulateEntryCount}
+% \begin{macrocode}
+\def\BR@PopulateEntryCount#1{%
+ \begingroup
+ \toks@{}%
+ \def\backrefsep{%
+ \toks@\expandafter{\the\toks@\backrefsep}%
+ }%
+ \def\backreftwosep{%
+ \toks@\expandafter{\the\toks@\backreftwosep}%
+ }%
+ \def\backreflastsep{%
+ \toks@\expandafter{\the\toks@\backreflastsep}%
+ }%
+ \def\protect{}%
+ \let\BR@backrefxxx\backrefxxx
+ \let\backrefxxx\BR@PopulateBackrefxxx
+ \def\BR@name{#1}%
+ \csname brl@#1\endcsname
+ \expandafter\xdef\csname brl@#1\endcsname{\the\toks@}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\BR@PopulateBackrefxxx}
+% \begin{macrocode}
+\def\BR@PopulateBackrefxxx#1#2#3{%
+ \expandafter\def\expandafter\BR@tempa\expandafter{%
+ \BR@backrefxxx{#1}{#2}{#3}%
+ }%
+ \begingroup
+ \count@=\z@
+ \def\backrefsep{}%
+ \def\backreftwosep{}%
+ \def\backreflastsep{}%
+ \let\backrefxxx\BR@@PopulateBackrefxxx
+ \csname brld@\BR@name\endcsname
+ \toks\tw@={\backrefxxx{#1}{#2}{#3}}%
+ \edef\x{\endgroup
+ \toks@{%
+ \the\toks@
+ \noexpand\backrefentrycount{%
+ \the\toks\tw@
+ }{\the\count@}%
+ }%
+ }%
+ \x
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\BR@@PopulateBackrefxxx}
+% \begin{macrocode}
+\def\BR@@PopulateBackrefxxx#1#2#3{%
+ \expandafter\def\expandafter\BR@tempb\expandafter{%
+ \BR@backrefxxx{#1}{#2}{#3}%
+ }%
+ \ifx\BR@tempa\BR@tempb
+ \advance\count@\@ne
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Initialization}
+%
+% \begin{macrocode}
+\def\@currentHref{}
+\AtBeginDocument{%
+ \let\BRorg@bibitem\bibitem
+ \let\bibitem\BR@bibitem
+ \let\BRorg@thebibliography\thebibliography
+ \def\thebibliography{%
+ \BR@starttoc
+ \BRorg@thebibliography
+ }%
+ \@ifundefined{NAT@parse}{%
+ \global\let\BRorg@citex\@citex
+ \global\let\@citex\BR@citex
+ }{%
+ \@ifpackageloaded{hyperref}{}{%
+ \def\hyper@natlinkstart#1{\Hy@backout{#1}}%
+ }%
+ \PackageInfo{backref}{** backref set up for natbib **}%
+ }%
+}
+% \end{macrocode}
+% \begin{macro}{\BR@starttoc}
+% \begin{macrocode}
+\def\BR@starttoc{%
+ \ifx\backrefalt\BR@BackrefAltUnused
+ \global\BR@BackrefAltfalse
+ \else
+ \global\BR@BackrefAlttrue
+ \fi
+ \begingroup
+ \makeatletter
+ \@input{\jobname.brf}%
+ \if@filesw
+ \@ifundefined{tf@brf}{%
+ \expandafter\newwrite\csname tf@brf\endcsname
+ }{}%
+ \@ifundefined{tf@brf@open}{%
+ \BR@RerunFileCheck
+ \immediate\openout\csname tf@brf\endcsname\jobname.brf\relax
+ \gdef\tf@brf@open{}%
+ }{}%
+ \fi
+ \@nobreakfalse
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Collecting back cite informations}
+%
+% \begin{macro}{\BR@citex}
+% \begin{macrocode}
+\def\BR@citex[#1]#2{%
+ \BRorg@citex[{#1}]{#2}%
+ \Hy@backout{#2}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Grr. for chicago.sty
+% \begin{macrocode}
+\@ifpackageloaded{chicago}{%
+ \let\BRorg@citedatax\@citedatax
+ \def\@citedatax[#1]#2{%
+ \BRorg@citedatax[{#1}]{#2}%
+ \Hy@backout{#2}%
+ }%
+}{}
+% \end{macrocode}
+% \begin{macro}{\Hy@backout}
+% \begin{macrocode}
+\def\Hy@backout#1{%
+ \@bsphack
+ \ifBR@enable
+ \ifBR@verbose
+ \PackageInfo{backref}{Back cite \string`#1\string'}%
+ \fi
+ \ifx\@empty\@currentlabel
+ \protected@write\@auxout{}{%
+ \string\@writefile{brf}{%
+ \string\backcite{#1}{{\thepage}{(document)}{Doc-Start}}%
+ }%
+ }%
+ \else
+ \protected@write\@auxout{}{%
+ \string\@writefile{brf}{%
+ \string\backcite{#1}{{\thepage}{\@currentlabel}{\@currentHref}}%
+ }%
+ }%
+ \fi
+ \else
+ \ifBR@verbose
+ \PackageInfo{backref}{Disabled back cite \string`#1\string'}%
+ \fi
+ \fi
+ \@esphack
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Rerun warning}
+%
+% \begin{macro}{\BR@RerunFileCheck}
+% The following code computes a MD5 sum and the file size of the
+% |.brf| file at the begin and the end of the document and compares
+% them. A rerun warning is given, if they do not match.
+% This method requires pdf\TeX\ or Lua\TeX. The method fails,
+% if the MD5 sum and the file size are the same for
+% a changed |.brf| file (it's probably very seldom).
+% \begin{macrocode}
+\RequirePackage{rerunfilecheck}[2009/12/10]
+\def\BR@RerunFileCheck{%
+ \RerunFileCheck{\jobname.brf}{%
+ \@ifundefined{tf@brf@open}{%
+ }{%
+ \immediate\closeout\tf@brf
+ }%
+ }{%
+ Rerun to get bibliographical references right%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \Finale
+%
+\endinput