% \iffalse meta-comment
%
% Copyright 1994 the LaTeX3 project and the individual authors.
% All rights reserved. For further copyright information see the file
% legal.txt, and any other copyright indicated in this file.
% 
% This file is part of the LaTeX2e system.
% ----------------------------------------
% 
%  This system is distributed in the hope that it will be useful,
%  but WITHOUT ANY WARRANTY; without even the implied warranty of
%  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
% 
% 
% IMPORTANT NOTICE:
% 
% For error reports in case of UNCHANGED versions see bugs.txt.
% 
% Please do not request updates from us directly.  Distribution is
% done through Mail-Servers and TeX organizations.
% 
% You are not allowed to change this file.
% 
% You are allowed to distribute this file under the condition that
% it is distributed together with all files mentioned in manifest.txt.
% 
% If you receive only some of these files from someone, complain!
% 
% You are NOT ALLOWED to distribute this file alone.  You are NOT
% ALLOWED to take money for the distribution or use of either this
% file or a changed version, except for a nominal charge for copying
% etc.
% \fi
%
% \iffalse
%%% File: ltxref
%
%<*driver>
% \fi
\ProvidesFile{ltxref.dtx}
             [1994/05/25 v1.1c LaTeX Kernel (Cross Referencing)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltxref.dtx}
\title{\filename}
\date{\filedate}
 \author{%
  Johannes Braams\and
  David Carlisle\and
  Alan Jeffrey\and
  Leslie Lamport\and
  Frank Mittelbach\and
  Chris Rowley\and
  Rainer Sch\"opf}

\begin{document}
\maketitle
 \DocInput{\filename}
\end{document}
%</driver>
% \fi
%
% \CheckSum{102}
%
% \changes{v1.0c}{1994/03/29}
%     {Create file ltcntlen from parts of ltmiscen and ltherest.}
% \changes{v1.1a}{1994/05/19}
%     {Extract file ltxref from ltcntlen.}
% \changes{v1.1b}{1994/05/21}{Use new warning commands}
% \changes{v1.1c}{1994/05/25}{Modify documentation}
%
% \section{Cross Referencing}
%  The user writes  |\label|\marg{foo}  to define the following
%  cross-references:
%
%   |\ref|\marg{foo}: value of most recently incremented referencable
%             counter. in the current environment. (Chapter, section,
%             theorem and enumeration counters counters are
%             referencable, footnote counters are not.)
%
%   |\pageref|\marg{foo}: page number at which |\label{foo}|  command
%             appeared.  where  foo  can be any string of characters not
%             containing  `|\|', `|{|' or `|}|'.
%
%  Note: The scope of the |\label| command is delimited by environments,
%  so\\
%  |\begin{theorem} \label{foo} ... \end{theorem} \label{bar}|\\
%  defines |\ref{foo}| to be the theorem number and |\ref{bar}| to be
%  the current section number.
%
%  Note: |\label| does the right thing in terms of spacing -- i.e.,
%  leaving a space on both sides of it is equivalent to leaving
%  a space on either side.
%
%
% \StopEventually{}
%
% \subsection{Cross Referencing}
%
% \begin{oldcomments}
%    \begin{macrocode}
%<*2ekernel>
\message{x-ref,}
%    \end{macrocode}
%
%  This is implemented as follows.  A referencable counter  CNT  is
%  incremented by the command  \refstepcounter{CNT} , which sets
%  \@currentlabel == {CNT}{eval(\p@cnt\theCNT)}.   The command
%  \label{FOO} then writes the following on file \@auxout :
%        \newlabel{FOO}{{eval(\@currentlabel)}{eval(\thepage)}}
%
%  \ref{FOO} ==
%    BEGIN
%      if \r@foo undefined
%        then  @refundefined := G T
%              ??
%              Warning: 'reference foo on page ... undefined'
%        else  \@car \eval(\r@FOO)\@nil
%      fi
%    END
%
%  \pageref{foo} =
%    BEGIN
%      if \r@foo undefined
%        then  @refundefined := G T
%              ??
%              Warning: 'reference foo on page ... undefined'
%        else  \@cdr \eval(\r@FOO)\@nil
%      fi
%    END
%
%    \begin{macrocode}
\newif\ifG@refundefined
\def\G@refundefinedtrue{\global\let\ifG@refundefined\iftrue}
\def\G@refundefinedfalse{\global\let\ifG@refundefined\iffalse}
%    \end{macrocode}
%
% RmS 91/10/25: added a few extra \reset@font,
%               as suggested by Bernd Raichle
% RmS 92/08/14: made \ref and \pageref robust
% RmS 93/09/08: Added setting of @refundefined switch.
% \end{oldcomments}
%
%  \begin{macro}{\ref}
% \changes{LaTeX2e}{1993/12/11}{Macro reimplemented}
%  \begin{macro}{\pageref}
% \changes{LaTeX2e}{1993/12/11}{Macro reimplemented}
%  \begin{macro}{\@setref}
% \changes{LaTeX2e}{1993/12/11}{Macro added}
%    Referencing a |\label|.
%    \begin{macrocode}
\def\@setref#1#2#3{%
  \ifx#1\relax
   \protect\G@refundefinedtrue
   \nfss@text{\reset@font\bfseries ??}%
   \@latex@warning{Reference `#3' on page \thepage \space
             undefined}%
  \else
   \expandafter#2#1\null
  \fi}
\def\ref#1{\expandafter\@setref\csname r@#1\endcsname\@firstoftwo{#1}}
\def\pageref#1{\expandafter\@setref\csname r@#1\endcsname
                                   \@secondoftwo{#1}}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
%
%  \begin{macro}{\newlabel}
% \changes{v1.1b}{1994/05/21}{Use new warning commands}
%    This command will be written to the \texttt{.aux} file to
%     pass label information from one run to another.
%    \begin{macrocode}
\def\newlabel#1#2{\@ifundefined{r@#1}%
  {}%
  {\global\@multiplelabelstrue
   \@latex@warning@no@line{Label `#1' multiply defined}}%
   \global\@namedef{r@#1}{#2}}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\if@multiplelabels}
%    This switch is set true if at least on label is defined more than
%    once. It will be check by the |\enddocument| command.
%    \begin{macrocode}
\newif\if@multiplelabels
%    \end{macrocode}
%  \end{macro}
%
% |\label| and |\refstepcounter| changed to allow |\protect|'ed commands
% to work properly.  For example,
%\begin{verbatim}
%   \def\thechapter{\protect\foo{\arabic{chapter}.\roman{section}}}
%\end{verbatim}
% will cause a |\label{bar}| command to define |\ref{bar}| to expand to
% something like |\foo{4.d}|.  Change made 20 Jul 88.
%    \begin{macrocode}
\def\label#1{\@bsphack\if@filesw {\let\thepage\relax
   \let\protect\@unexpandable@noexpand
   \edef\@tempa{\write\@auxout{\string
      \newlabel{#1}{{\@currentlabel}{\thepage}}}}%
   \expandafter}\@tempa
   \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\refstepcounter#1{\stepcounter{#1}\let\@tempa\protect
\let\protect\@unexpandable@protect
\edef\@currentlabel{\csname p@#1\endcsname\csname the#1\endcsname}%
\let\protect\@tempa}
%    \end{macrocode}
%
%
% For |\label| commands that come before any environment
%    \begin{macrocode}
\def\@currentlabel{} 
%    \end{macrocode}
%
%    \begin{macrocode}
%</2ekernel>
%    \end{macrocode}
%
% \Finale
%
