diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /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.dtx | 947 |
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 |