%  XREF.STY
%  Querverweis-Mechanismus fuer mehrbaendige Werke
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{xref}
\RequirePackage{ifthen}

% Kennung fuer eigene Bandnummer, Default: Band I
\newcommand{\@volume}{I}

% Userkommando zum Setzen der Bandzahl
\newcommand{\volume}[1]
  {\renewcommand{\@volume}{#1}}

% Vollstaendige Kennzeichnung nach einer 
% externen Referenz
\newcommand{\volnotation}[1]
  { (Band~#1)}

% Umdefinition einiger Interna fuer dreiteilige
% Labelinformationen
\long\def\@firstofthree#1#2#3{#1}
\long\def\@secondofthree#1#2#3{#2}
\long\def\@thirdofthree#1#2#3{#3}

% Analog zu \@setref:
% #1 ist dreiteilige Liste (Ref, Seite, Band), 
% #2 ist Befehl \@xofthree, #3 ist Labelname
\def\@setbref#1#2#3{%
  \ifx#1\relax
  \else
    \def\tmp{\expandafter#2#1}%
    \ifthenelse{\equal{\tmp}{\@volume}}
      {}
      {\volnotation{\tmp}}%
    \fi
  }

% Label, das neben Referenznummer und Seitenzahl
% auch die Bandnummer wegschreibt
\def\label#1{\@bsphack
  \protected@write\@auxout{}%
  {\string\newlabel{#1}%
    {{\@currentlabel}{\thepage}{\@volume}}}%
  \@esphack}

%% Lies Hilfsfiles fuer die externen Baende ein und
%% generiere Labelinfos daraus
%% -- Einige Zeilen aus File `xr.sty'/tools -------
%% xr.dtx Copyright (C) 1993-1994 David Carlisle
\def\externalaux#1{\makeatletter
  \XR@next#1.aux\relax\\}
\def\XR@next#1\relax#2\\{%
  \edef\XR@list{#2}%
  \XR@loop{#1}}
\def\XR@aux{%
  \ifx\XR@list\@empty\else\expandafter\XR@explist\fi}

\def\XR@explist{\expandafter\XR@next\XR@list\\}
\def\XR@loop#1{\openin\@inputcheck#1\relax
  \ifeof\@inputcheck
    \PackageWarning{xref}%
      {^^JNo file #1^^JLABELS NOT IMPORTED.^^J}%
    \expandafter\XR@aux
  \else
    \PackageInfo{xref}{IMPORTING LABELS FROM #1}%
    \expandafter\XR@read\fi}
\def\XR@read{%
  \read\@inputcheck to\XR@line
  \expandafter\XR@test\XR@line...\XR@}
\long\def\XR@test#1#2#3#4\XR@{%
  \ifx#1\newlabel
    \newlabel{#2}{#3}%
  \else\ifx#1\@input
     \edef\XR@list{\XR@list#2\relax}%
  \fi\fi
  \ifeof\@inputcheck\expandafter\XR@aux
  \else\expandafter\XR@read\fi}
% ----- Ende des xr-Imports --------

% ---- Hauptbefehle ------
% Zunaechst die normalen Funktionalitaeten: Druck
% der Referenz, Seitenzahl, Bandzahl
% r@name enthaelt liste der drei Daten
\newcommand{\rref}[1]{%
  \expandafter\@setref%
    \csname r@#1\endcsname\@firstofthree{#1}}
\newcommand{\ppageref}[1]{%
  \expandafter\@setref%
    \csname r@#1\endcsname\@secondofthree{#1}}
\newcommand{\bref}[1]{%
  \expandafter\@setref%
    \csname r@#1\endcsname\@thirdofthree{#1}}
  
% Liefert Referenzzahl und ggf. Hinweis auf den
% zugehoerigen Band, falls extern
\renewcommand{\ref}[1]{%
  \expandafter\@setref%
    \csname r@#1\endcsname\@firstofthree{#1}%
  \expandafter\@setbref%
    \csname r@#1\endcsname\@thirdofthree{#1}%
  }

% dto. fuer Seitenzahlen
\renewcommand{\pageref}[1]{%
  \expandafter\@setref%
    \csname r@#1\endcsname\@secondofthree{#1}%
  \expandafter\@setbref%
    \csname r@#1\endcsname\@thirdofthree{#1}%
  }
