%%
%% This is file `ut-backref.sty',
%%
%% Most of the code in here is taken from:
%%
%% File: backref.dtx Copyright (C) 1995, 1996, 1997 David Carlisle,
%%       Sebastian Rahtz
%% 
%% 
\def\fileversion{1.2}
\def\filedate{1998/11/03}
\ProvidesPackage{ut-backref}[\filedate:
  bibliographical back referencing, \fileversion]

%%% User-Interface

\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}}
\DeclareOption{pageref}{%
  \def\backref{\small(cited on p\thinspace}%
  \def\backrefs{\small(cited on pp\thinspace}%
  \def\backrefclose{)}%
  \def\backrefsclose{)}%
  \let\backrefxxx\page@backref
}
\DeclareOption{ref}{%
  \def\backref{\small(cited in section\thinspace}%
  \def\backrefs{\small(cited in sections\thinspace}%
  \def\backrefclose{)}%
  \def\backrefsclose{)}%
  \let\backrefxxx\section@backref
}
\DeclareOption{hyperref}{%
  \def\backref{}%
  \def\backrefs{}%
  \def\backrefclose{}%
  \def\backrefsclose{}%
  \let\backrefxxx\hyper@section@backref
}
\DeclareOption{hyperpageref}{%
  \def\backref{}%
  \def\backrefs{}%
  \def\backrefclose{}%
  \def\backrefsclose{}%
  \let\backrefxxx\hyper@page@backref
}
\ExecuteOptions{pageref}
\ProcessOptions

%%% 

\newcommand\loopcmd{}
\newcommand\br@last{}

%%% a standard loop with `delimited arguments'. \end is used
%%% only as an end marker here. The argument will be
%%% expanded, so you'll get the meaning of e.g. \backrefxxx as
%%% last element.
\def\@getlast#1,#2\end{%
%        \typeout{   checking elem #1}%
        \if!#2! % test if ! equals !, i.e. if #2 is empty
        \edef\br@last{#1}
%        \typeout{Last elem is: \br@last}%
        \let\loopcmd\relax
        \else
        \def\loopcmd{\@getlast#2\end}%
        \fi
        \loopcmd
}%

%%% A wrapper adding `,' and `\end' so that we can check these
%%% in \@getlast
\newcommand\getlast[1]{\expandafter\@getlast#1,\end}

\newcounter{br@el@mcnt}

%%% this uses LaTeX's \@for ... \do loop. See ltcntrl.dtx for details.
\newcommand\lengthof[1]{%
    \setcounter{br@el@mcnt}{0}%
    \@for\testitem:=#1\do
        {\stepcounter{br@el@mcnt}}
%    \typeout{length of #1 is: \arabic{br@el@mcnt}}
    }

%%%

\@ifundefined{newblock}{\def\newblock{\par}}{}

\def\xcitedOn#1{%
\@ifundefined{br@#1}{%
\typeout{Warning: No page list for reference `#1'.}%
}{% At least one citation, find out how many
\newblock% newline if "open" format used
\edef\x{\csname br@#1\endcsname}% These are the citations
\lengthof{\x}% number of citations will be in br@el@mcnt
\ifnum\arabic{br@el@mcnt}>1% More than one citation?
\backrefs%
\x%
\backrefsclose%
\else% exactly one citation
\backref%
\x%
\backrefclose%
\fi%
}% end of if defined
}% end of \def\xcitedOn

\def\xbibitem{\@ifnextchar[{\@xlbibitem}{\@xbibitem}}
\def\@xlbibitem[#1]#2#3\par{%
 \oldb[#1]{#2}#3\xcitedOn{#2}
 \par
}%
\def\@xbibitem#1#2\par{%
 \oldb{#1}#2\xcitedOn{#1}
 \par
}
\def\backcite#1#2{% #1 = list of labels, #2 = page, section, text
  \@for\x:=#1\do{% for each label in list
    \edef\br@label{\thinspace\protect\backrefxxx#2}%
    \edef\br@list{\csname br@\x\endcsname}%
    \getlast{\br@list}%
%    \typeout{label \meaning\br@label, last \meaning\br@last}
    \ifx\br@label\br@last
    \relax\else%
   \edef\x{\expandafter\@firstofone\x\@empty}%
   \expandafter\protected@xdef\csname br@\x\endcsname{%
   \expandafter\ifx\csname br@\x\endcsname\relax\else
     \csname br@\x\endcsname,\fi\thinspace\protect\backrefxxx#2}%
   \fi
   }}
\def\@currentHref{}
\AtBeginDocument{%
  \let\oldb\bibitem
  \let\bibitem\xbibitem
  \let\oldbibl\thebibliography
  \def\thebibliography{\@starttoc{brf}{}\oldbibl}
  \@ifundefined{NAT@parse}{%
   \global\let\old@citex\@citex
   \global\let\@citex\x@citex
   }{\typeout{** backref set up for natbib ***}}
}
\def\x@citex[#1]#2{%
  \old@citex[#1]{#2}%
  \hy@backout{#2}%
}
\def\hy@backout#1{%
  \@bsphack
  \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
   \@esphack
}
\endinput
%%
%% End of file `backref.sty'.