\def\fileversion{1.0}
\def\filedate{2001/05/19}
\def\docdate{2001/05/19}
%
% \changes{v1.0}{19 May 200}{First Release}
%
% \MakeShortVerb{\|}
% \title{Cross-referencing technical Documents with \texttt{crossreference}}
% \author{Vince Filby}
% \maketitle
% \begin{abstract}
% This is the instruction manual for using
% \texttt{crossreference}.
% \end{abstract}
% 
% \section{Introduction}
% This package allows authors to maintain a crossreference section in technical 
% documents easily and efficiently without having to worry about reordering, 
% removing or otherwise altering the crossreference numbers because they are 
% automatically generated.
% 
% This package was originally designed to maintain the crossreference section
% of software requirements document and a software design document.
%
% \section{Documentation Driver}
% This code will generate the documentation.  Since
% it is the first peice of code in this file, the documentation
% can obtained by simply processing this file with \LaTeXe
%    \begin{macrocode}
%<*driver>
\documentclass{ltxdoc}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
        \DocInput{crossreference.dtx}    \PrintIndex   \PrintChanges
\end{document}
%</driver>
%    \end{macrocode}
% \section{User Interface}
% This section defines everything that an average user should know.
% 
%    \begin{macrocode}
%<*crossreference>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{crossreference}[\filedate\space\fileversion\space 
Crossreferencing for technical documents (V. Filby)]
\newcounter{xref}
%    \end{macrocode}
% \DescribeMacro{\crossreferences}
% The command|\crossreferences| will print out the crossreference table.
% The format is simple and uses the "list of figures" table of contents style.
% You can change the format of the table by changing this macro.   If you
% choose to use a tabular format you will have to change the output lines
% to include \&'s.   
%    \begin{macrocode}
\newcommand\crossreferences{%
	\if@twocolumn
		\@restonecoltrue\onecolumn
	\else
		\@restonecolfalse
	\fi
	\@starttoc{xref}
	\if@restonecol\twocolumn\fi
}
%    \end{macrocode}
% 
% \DescribeMacro{\addxref}
% The command |\addxref| will add a a line to the crossreference
% table containing the number, label and section label.
% 
%    \begin{macrocode}
\newcommand{\addxref}[1]{%
	\protected@write{\@auxout}{}{\protect\@writefile{xref}{
		\string\contentsline{figure}{\string\numberline {\thexref}{\string\ignorespaces{#1}}}{\@currentlabel}
	}}
	\xreflabel{#1}
	\stepcounter{xref}
}
%    \end{macrocode}
%
% \DescribeMacro{\xref} 
% The command |\xref| can be used to refer to an item that has been 
% added to the crossreference table. 
%    \begin{macrocode}
\newcommand{\xref}[1]{~[REF \pageref{#1}]}
%    \end{macrocode}
%
% \section{Definitions}
% This section contains the internal counters and macros that are used
% to keep track of the crossreference labels. 
%    \begin{macrocode}
\def\G@refundefinedtrue{%
  \gdef\@refundefined{%
    \@latex@warning@no@line{There were undefined references}}}
\let\@refundefined\relax

\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}}
\def\@newl@bel#1#2#3{%
  \@ifundefined{#1@#2}%
    \relax
    {\gdef \@multiplelabels {%
       \@latex@warning@no@line{There were multiply-defined labels}}%
     \@latex@warning@no@line{Label `#2' multiply defined}}%
  \global\@namedef{#1@#2}{#3}}

\def\newlabel{\@newl@bel r}
\@onlypreamble\@newl@bel

\let \@multiplelabels \relax

\def\xreflabel#1{\@bsphack
  \protected@write\@auxout{}%
         {\string\newlabel{#1}{{#1}{\thexref}}}%
  \@esphack}

\def\refstepcounter#1{\stepcounter{#1}%
    \protected@edef\@currentlabel
       {\csname p@#1\endcsname\csname the#1\endcsname}%
}

\def\@currentlabel{}
%</crossreference>
%    \end{macrocode}
%
% \section{Example Document}
% This is a sample document to show how to use the crossreference system
% when you unpacked the dtx it should have generated this file called
% xrefexample.tex
%    \begin{macrocode}
%<*example>
\documentclass{article}

\usepackage{crossreference}

\begin{document}

\section{Animals}
\addxref{Animals}
Animals can eat other animals\xref{Animals} or plants\xref{Plants}.

\section{Plants}
\addxref{Plants}
Plants are mostly green and are eaten by Animals\xref{Animals}.

\section{Books and Writings}
\addxref{Books and Writings}
Books and writings are general not read by animals\xref{Animals} or plants\xref{Plants}.

\section{Humans}
Humans can read books and writings\xref{Books and Writings}.
\newpage
\section{Cross-References}
\crossreferences 

\end{document}
\endinput
%</example>
%    \end{macrocode}
% \Finale