% \iffalse
%% File: hyper.dtx Copyright (C) 1995--1999 Michael Mehlich
%% This program can be redistributed and/or modified under the terms
%% of the LaTeX Project Public License Distributed from CTAN
%% archives in directory macros/latex/base/lppl.txt; either
%% version 1 of the License, or any later version.
%<*driver>
\documentclass[letterpaper]{ltxdoc}
\usepackage{tabularx}
\makeatletter
\let\TX@vwarn\relax
\makeatother
\IfFileExists{hyper.sty}{%
  \message{*** Generating hypertext documentation ***}
  \usepackage[color,fixhyperbox,pagetop]{hyper}%
}{%
  \def\hyperURL##1##2##3##4{##4}
}
\def\AmS{{\protect\usefont{OMS}{cmsy}{m}{n}%
  A\kern-.1667em\lower.5ex\hbox{M}\kern-.125emS}}
\def\amslatex{{\protect\AmS-\protect\LaTeXe}}
\def\CWEB{{\scshape Cweb}}
%</driver>
\def\fileversion{V4.2d}
\def\filedate{1999/03/09}
\def\docdate{1999/03/09}
%<*driver>
\begin{document}
  \hbadness=10000
  \hfuzz100pt
  \title{HyperText Documents with \LaTeXe\\\fileversion}
  \author{Michael Mehlich}
  \date{\docdate}
  \maketitle
  \tableofcontents
  \DocInput{hyper.dtx}
\end{document}
%</driver>
% \fi
% \CheckSum{5034}
%%
%% \CharacterTable
%% {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%  Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%  Digits        \0\1\2\3\4\5\6\7\8\9
%%  Exclamation   \!     Double quote  \"     Hash (number) \#
%%  Dollar        \$     Percent       \%     Ampersand     \&
%%  Acute accent  \'     Left paren    \(     Right paren   \)
%%  Asterisk      \*     Plus          \+     Comma         \,
%%  Minus         \-     Point         \.     Solidus       \/
%%  Colon         \:     Semicolon     \;     Less than     \<
%%  Equals        \=     Greater than  \>     Question mark \?
%%  Commercial at \@     Left bracket  \[     Backslash     \\
%%  Right bracket \]     Circumflex    \^     Underscore    \_
%%  Grave accent  \`     Left brace    \{     Vertical bar  \|
%%  Right brace   \}     Tilde         \~}
%%
% \MakeShortVerb{|}
%
% \title{Hyper\LaTeXe}
% \maketitle
%
% \section{Introduction}
% Traditional texts only have a linear structure given by its series of
% characters. But this is not sufficient for any kind of documents one
% may think of. Thus, recently the number of documents using a more
% complex graphical structure (called ``hyper text'' documents) have
% increased.
%
% This package provides the generation of such documents based on the
% already given structure of \LaTeXe{}-documents without the document
% writer having to consider new commands.
%
% \section{Usage}
%
% Just insert |\usepackage{hyper}| in the preamble of your
% \LaTeX2e--document as the last package to be loaded.\par
% If you use the theorem package define the theorems via
% |\newtheorem| after inserting the hyper package.\medskip
%
% You may also give some options for the package, i.e.\ instead of
% the command above you may use |\usepackage[<option list>]{hyper}|
% in your preamble.\medskip
%
% \noindent Currently the following options are known:
% \begin{itemize}
%   \item |yes|, |no|
%                       determine whether the hypertext marks are inserted
%                       or not (default is |yes|)
%   \item |fixhyperbox|
%                       modifies the position of the html-marks in the |dvi|-file
%                       so that |dvips| creates the right bounding boxes for
%                       the hyper references; it is highly recommended to use
%                       this option (though for compatibility reasons with earlier
%                       versions this is not the default setting); note, that the
%                       text of the reference is packed into a horizontal box (|\hbox|)
%                       due to the need of measuring its size
%   \item |black|, |gray|, |color|
%                       determine the colors anchors and references
%                       are printed in (default is |black|);\newline
%                       the colors can be changed by
%                       |\definecolor{refcolor}{rgb}{|\emph{r}|,|\emph{g}|,|\emph{b}|}|
%                       for references,
%                       |\definecolor{undefrefcolor}{rgb}{|\emph{r}|,|\emph{g}|,|\emph{b}|}|
%                       for unresolved references, and
%                       |\definecolor{anchorcolor}{rgb}{|\emph{r}|,|\emph{g}|,|\emph{b}|}|
%                       for anchors where \emph{r}, \emph{g}, \emph{b} stand for the
%                       red, green, and blue, respectively, values (between 0.0 and 1.0)
%                       of the color (cf.\ |graphics| package)
%   \item |pagenumber|, |pagetop|
%                       determine whether a page number refers to the page
%                       number of the respectively page or to the top of
%                       the page
%   \item |indexcmds| has to be given explicitely whenever an
%                       index or glossary file has been created using
%                       this package if the file is not regenerated using
%                       the commands |\makeindex| and |\makeglossary|,
%                       respectively.
%   \item |backcitepages|, |backcitesections| introduce back references
%                       from the bibliography to the pages and sections,
%                       respectively, they have been cited in
%   \item |amsart|, |amsbook|, |amsdtx|, |amsldoc|, |amsproc|, |article|,
%         |book|, |cweb|, |letter|, |ltxdoc|, |ltxguide|, |ltnews|, |proc|,
%         |report|, |slides|
%                       determine the document class for which the
%                       modifications are loaded
%                       (default is the document class given via
%                       |\documentclass| if it can be derived)
%   \item |leqno|
%                       adds modifications for the document class option
%                       |leqno| (will be used automagically for known
%                       document classes)
%   \item |amsmath|, |amstex|, |amsthm|, |doc|, |fancyheadings|, |ftnright|, |longtable|,
%         |natbib|, |subeqnarray|, |theorem|, |upref|
%                       add modifications for the corresponding package
%                       (will be used automagically)
%   \item |xr|
%                       add modifications for the package |xr| and
%                       redefine it's internal macro |\externaldocument|
%                       addint a new parameter determining the URL--address
%                       of the document for the cross references used
%                       (will be used automagically)
%   \item |harvard|     add modifications for the respectively packages that
%                       are part of the distribution but provided by other
%                       authors
%   \item |<other>|
%                       add a modification file |<other>.hyp| that has to
%                       be provided by yourself
% \end{itemize}
%
% \section{Macros Provided}
% The following macros are defined by the package and may be used:
% \begin{itemize}
%    \item |\hyperanchor#1#2|
%               lets |#1| being the hypertext anchor for |#2|
%               (|#1| may neither be a natural number nor beginning
%                with |page.| or |fn.|)
%    \item |\blindhyperanchor#1|
%               lets |#1| being a hypertext anchor
%               (|#1| may neither be a natural number nor beginning
%                with |page.| or |fn.|)
%    \item |\hyperreference#1#2|
%               lets |#2| being a hypertext reference to the anchor |#1|,
%               (|#1| may not start with a |[|)
%    \item |\hyperURL#1#2#3#4|
%               lets |#4| being a hypertext reference to an external URL
%               with type |#1|, domain |#2|, and document |#3|, i.e.\
%               to the URL |#1://#2/#3|
%    \item |\labeltext#1#2|
%               lets |#1| being the hypertext capable (\LaTeXe) reference to the text |#2|
%               and prints |#2|
%    \item |\noref[#1]#2|
%               lets |#1| being a hypertext reference to the
%               anchor defined by the \LaTeXe reference |#2| without printing the reference
%               (|#1| is not optional!)
%    \item |\ref[#1]#2|
%               is the same as \LaTeXe's original |#1~\ref{#2}| except that
%               the hypertext reference is provided from the complete
%               |#1~\ref{#2}| instead of |\ref{#2}| only
%    \item |\pageref[#1]#2|
%               is the same as |\ref| except that we get a reference to the
%               page number
%    \item |\refcurrent#1|
%               lets |#1| being a hypertext reference to the last numerical anchor
%               that has been generated
%    \item |\refnext#1|
%               lets |#1| being a hypertext reference to the next numerical anchor
%               that will be generated
% \end{itemize}
%
% \noindent The following macros are redefined when using the
% corresponding packages:
% \begin{itemize}
%   \item for |xr|:
%     \begin{itemize}
%       \item |\externaldocument(#1)[#2]#3|, |\externaldocument[#1](#2)#3|
%               are equivalent to the original |\externaldocument| of the
%               |xr|--package except for the additional parameter surrounded
%               by |(||)| determining the URL--address of the external
%               document (the URL--type |file:| is added automagically)
%               (default is |#3.dvi|)
%     \end{itemize}
% \end{itemize}
%
% \noindent The following macros are provided when using the option |backcitepages|
% or |backcitesections| (definitions show default value):
% \begin{itemize}
%    \item |\def\hyperbackcitepage{Cited on page~}| is the text preceeding a
%          back reference to a single page number.
%    \item |\def\hyperbackcitepages{Cited on pages~}| is the text preceeding a
%          back reference to multiple page numbers.
%    \item |\def\hyperbackcitesection{Cited in~}| is the text preceeding a
%          back reference to a single section reference.
%    \item |\def\hyperbackcitesections{Cited in~}| is the text preceeding a
%          back reference to multiple section references.
%    \item |\def\hyperbackcitenormalseparator{, }| is the text between two
%          page numbers or section references (except for the last pair).
%    \item |\def\hyperbackcitefinalseparatorpair{ and~}| is the text
%          between the page numbers or section references if there are
%          exactly two entries.
%    \item |\def\hyperbackcitefinalseparatorlist{, and~}| is the text
%          between the last pair page numbers or section references if
%          there are more than two entries.
% \end{itemize}
% \section{Viewing Hyper\LaTeXe--documents}
%
% There are several methods that can be used to view the dvi--documents
% with html--marks resulting from using this package.
%
% \begin{itemize}
%    \item For UNIX$^{\mathrm{TM}}$--systems with the graphical user interface
%          |X| there is a modification of |xdvi| called |xhdvi| available at any CTAN-site.
%    \item For systems running under NeXTSTEP$^{\mathrm{TM}}$ there exists a
%          Hyper\TeX-capable modification of |TeXview|, called |HyperTeXview|.
%    \item There exists a variant of |dvips| (called |dvihps|) translating hyperdvi--files to
%          hyperps--files containing the html--marks when using the parameter |-z|.
%          (|emtex| provides this feature with |dvips|).\par
%          \noindent The resulting files can be viewed using a HyperPS-capable Postscript-viewer,
%          (e.g. a hacked version of |ghostview| (for UNIX$^{\mathrm{TM}}$) or the actual |gsview|
%          (for Windows$^{\mathrm{TM}}$))
%    \item Another way is to use |dvihps| to get a HyperPS--file ready to be handled by
%          the Acrobat$^{\mathrm{TM}}$--distiller available from Adobe
%          or by ghostscript's |pdfwriter|--output--device
%          which both can translate hyperps--files to  |pdf|--files that can be viewed
%          using an Acrobat$^{\mathrm{TM}}$--reader or any other |pdf|--reader.
% \end{itemize}
%
% \section{Bugs}
% Currently there are only a few known problems. Unfortunately they
% cannot be avoided. You have to care about this:
% \begin{itemize}
%   \item If you write your bibliographies with the |thebibliograpy|-environment
%         by hand (not using bibtex) you may get an error message due to a
%         command not matching its definition. This can be avoided by providing
%         an empty line or a |\par| command at the end of each bibliographic entry
%         (with |\bibitem|) including the last entry before |\end{thebibliography}|.
%   \item If you include an index or glossary file into the current
%         document you may get a message from \LaTeX{} like
%         |Undefined control sequence.| $\ldots$ |\hyperpage|.
%         This is due to you not using |\makeindex| or |\makeglossary|
%         in the preamble. In this case just add the package option
%         |indexcmds| when loading the hyper--package.
%   \item In indexing commands you can't use |]| without surrounding braces.
%         If you do, \TeX{} will parse the command in a wrong way.
%         To get the sorting of the index right you therefore should use
%         |\index{A[zzzzB@A{]}B}| instead of |\index{A]B}|.
%   \item Similarly, a protected $\mid$, i.e.\ |"|$\mid$ is not handled
%         correctly. Use a similar method as above to circumnavigate
%         this problem.
% \end{itemize}
% \vskip0.5em
% \noindent There is another problem in connection with (a html-capable) |dvips| and paper formats different
% from |letter|. Apparently the positions for the |html|-specials are not computed correctly. The package
% provides a perl-script that allows to modify the positions of these specials.
% When using e.g.\ a4paper you have to call |perl dvi2pdf.pl -z "-s0,50" -nopdf <normal parameters to dvips>|
% to create an appropriate ps-file.
% Note, that the script |dvi2pdf.pl| has to be configured
% and has only been tested on a Windows$^{\mathrm{TM}}$ system.
% \vskip0.5em
% \noindent Other problems are not known so far. But surely there are some
% (otherwise the history would not be already that long).
% Thus, if you detect one please report it with the package version and
% a small example to\medskip
%
% |      Michael Mehlich|\par
% |      mmehlich@semdesigns.com|
%
% \section{Related Work, Acknowledgement}
% Sebastian Rahtz has written another package for adding
% HyperText--capabilities to \LaTeX{}. His package
% |hyperref| has been developed in parallel with this one
% and uses a slightly different realization for getting
% similar results. Some of the ideas found there have been
% added to this package, too.
% Thus, I have to give a special thank to him.
%
% Thanks also to Ulrich Fuchs for further suggestions.
%
% \StopEventually{}
%
% \section{History}
% \leavevmode
% \begin{tabularx}{\textwidth}{|c|l|X|r@{.}l|}
% \hline
% When & By & What & \multicolumn{2}{|c|}{V}
% \\ \hline\hline
% 1998/10/29 & Michael Mehlich &
% fixed macro name for |amsthm|
% & 4&2d
% \\ \hline
% 1998/10/28 & Michael Mehlich &
% corrected problem with wrong references produced
% & 4&2c
% \\ \hline
% 1997/09/22 & Michael Mehlich &
% corrected problem with |\uppercase| and |\lowercase| in internally used names
% & 4&2b
% \\ \hline
% 1997/09/15 & Michael Mehlich &
% corrected problem with |\noalign| in |eqnarray| environment
% & 4&2a
% \\ \hline
% 1997/08/28 & Michael Mehlich &
% corrected definition of new hyper anchor name to appear
% only locally within |\labeltext|\newline
% redefined |\label| for |amstex.sty|\newline
% added support for package |subeqnarray|
% & 4&2
% \\ \hline
% 1997/08/24 & Michael Mehlich &
% reduced problems when adding or removing the |hyper|-package\newline
% patched around problem in interaction of option |fixhyperbox| with
% |dvips|\newline
% problem with undefined hyper references when using cross references
% provided by the package |xr| resolved
% & 4&1
% \\ \hline
% 1997/07/14 & Michael Mehlich &
% corrected bug when creating cross-references between documents
% (bug was introduced when introducing resolution of nested html-marks)
% & 4&0h
% \\ \hline
% 1997/05/28 & Michael Mehlich &
% ensured hyper references for footnotes being created
% even if footnote is moved to the next page
% (but not further)\newline
% corrected marks introduced by the index environment |\theindex|
% in the classes |report| and |book|\newline
% changed mechanism for change flags
% & 4&0g
% \\ \hline
% 1997/05/07 & Michael Mehlich &
% redirected output for special hyper informations to main auxiliary file
% & 4&0f
% \\ \hline
% 1997/04/25 & Michael Mehlich &
% changed catcodes for reading the parameters of |\hyperURL|
% & 4&0e
% \\ \hline
% 1997/04/17 & Michael Mehlich &
% resolved some problem with the |cweb|-package modifications
% & 4&0d
% \\ \hline
% 1997/03/25 & Michael Mehlich &
% resolved problem with wrong footnote references when using package |footnpag|
% (this also corrects the former wrong naming of anchors for footnotes)
% & 4&0c
% \\ \hline
% 1997/03/21 & Michael Mehlich &
% removed bug in interaction of package with |cweb|'s chunk naming mechanism
% & 4&0b
% \\ \hline
% \end{tabularx}
% \newpage
% \begin{tabularx}{\textwidth}{|c|l|X|r@{.}l|}
% \hline
% When & By & What & \multicolumn{2}{|c|}{V}
% \\ \hline\hline
% 1997/03/08 & Michael Mehlich &
% added color for external URL added by |\hyperURL|
% & 4&0a
% \\ \hline
% 1997/03/01 & Michael Mehlich &
% added check for anchor existing before introducing reference to it\newline
% added check whether the anchors have changed beween two \LaTeXe\ runs\newline
% added handling of nested html-marks by unnesting (shit, this conflicts with
% the option |fixhyperbox|)\newline
% added option |fixhyperbox|\newline
% changed creation of anchor names for footnotes due to illegal names and
% duplicated names in the old version\newline
% improved extension package |backcites|\newline
% added handling of sorted citations for package |natbib|\newline
% changed macros for package |natbib|\newline
% added support for common package |fancyheadings| (this was needed for handling
% page references to page numbers when creating pages with empty headers
% and footers)\newline
% modified header and footer modification for inserting appropriate
% anchors and references
% & 4&0
% \\ \hline
% 1997/02/03 & Michael Mehlich &
% allow |\makeindex| and |\makeglossary| to appear after including the package\newline
% corrected mishandling of |pagetop|\newline
% changed colors for references and anchors\newline
% added documentation about how to change colors for colored references and anchors
% & 3&0c
% \\ \hline
% 1997/01/12 & Michael Mehlich &
% corrected problem with loop occurring on even pages
% & 3&0b
% \\ \hline
% 1996/11/01 & Michael Mehlich &
% corrected problem with empty headings causing an overful hbox\newline
% bug of having two page anchors on empty pages in case of |pagetop| removed\newline
% adapted to current version of |natbib|
% & 3&0a
% \\ \hline
% \end{tabularx}
% \newpage
% \begin{tabularx}{\textwidth}{|c|l|X|r@{.}l|}
% \hline
% When & By & What & \multicolumn{2}{|c|}{V}
% \\ \hline\hline
% 1996/10/26 & Michael Mehlich &
% added code for bibliographic references with |natbib|\newline
% added possibility of let pagelinks go to the top of the page
% & 3&0
% \\ \hline
% 1996/10/21 & Michael Mehlich &
% corrected problem with empty page style
% & 2&8a
% \\ \hline
% 1996/01/07 & Michael Mehlich &
% adapted to current version of latex
% & 2&8
% \\ \hline
% 1995/12/19 & Michael Mehlich &
% adapted to current version of the cweb--package
% & 2&7b
% \\ \hline
% 1995/10/22 & Michael Mehlich &
% made reference commands robust
% & 2&7a
% \\ \hline
% 1995/09/24 & Michael Mehlich &
% added support for the \CWEB\ document class
% & 2&7
% \\ \hline
% 1995/07/13 & Michael Mehlich &
% |\hyper@next| changed to |\fragilerefnext| to avoid problems when writing
% the command into the |.toc|--file
% & 2&6a
% \\ \hline
% 1995/07/06 & Michael Mehlich &
% |\hyperbackcite| occurred mistakenly in each file\newline
% bug fix in redefinition of |theindex|-environment in |doc.hyp|\newline
% handling of footnotes corrected\newline
% modified |\@xeqncr| instead of |\@eqncr|\newline
% adapted redefinition of captions for |longtable| to current
% version of |longtable|
% & 2&6
% \\ \hline
% 1995/07/04 & Michael Mehlich &
% correction of optional parameter of |\\| in eqnarray--environment
% mistakenly ignored
% & 2&5d
% \\ \hline
% 1995/06/14 & Michael Mehlich &
% corrected |\hyper@oddfoot|
% & 2&5c
% \\ \hline
% 1995/05/29 & Michael Mehlich &
% added support for contribution |harvard.hyp|,
% changed automatical uploading of packages to
% conditional uploading (tests if the package
% really exists)
% & 2&5b
% \\ \hline
% 1995/05/23 & Michael Mehlich &
% changed wrong page numbers for certain
% document classes
% & 2&5a
% \\ \hline
% 1995/05/10 & Michael Mehlich &
% added support for backcites
% &2&5
% \\ \hline
% 1995/05/08 & Michael Mehlich &
% internal handling of references to pages simplified\newline
% bug in |xr.hyp| fixed\newline
% anchor on empty pages added
% & 2&4c
% \\ \hline
% 1995/05/07 & Michael Mehlich &
% let |\item| accept |]| in optional argument
% & 2&4b
% \\ \hline
% \end{tabularx}
% \newpage
% \begin{tabularx}{\textwidth}{|c|l|X|r@{.}l|}
% \hline
% When & By & What & \multicolumn{2}{|c|}{V}
% \\ \hline\hline
% 1995/04/20 & Michael Mehlich &
% added new option |indexcmds|
% & 2&4a
% \\ \hline
% 1995/04/20 & Michael Mehlich &
% added support for |amstex|
% & 2&4
% \\ \hline
% 1995/04/18 & Michael Mehlich &
% corrected bug in index (reported by Ulrich Fuchs)
% & 2&3a
% \\ \hline
% 1995/02/12 & Michael Mehlich &
% support for package |xr| added\newline
% handling of options improved
% & 2&3
% \\ \hline
% 1995/02/11 & Michael Mehlich &
% definition of |\label| corrected (bug introduced at 1995/01/31)
% & 2&2b
% \\ \hline
% 1995/02/02 & Michael Mehlich &
% macros for |amsthm| changed according to new definition in amslatex
% & 2&2a
% \\ \hline
% 1995/02/01 & Michael Mehlich &
% support for package |amslatex| added\newline
% support for package |longtable| added
% & 2&2
% \\ \hline
% 1995/01/31 & Michael Mehlich &
% support for package |theorem| added\newline
% catcodes of \verb+|+, |@|, and |!| for parsing the parameters of
% |\index| and |\glossary| changed\newline
% |\@makecaption| modified\newline
% hypertext references in |eqnarray| corrected\newline
% redefinition of |\label| changed
% & 2&1
% \\ \hline
% 1995/01/30 & Michael Mehlich &
% handling of series of page numbers for index/glossary added\newline
% |\protected@write| stopped from inserting an extra space
% & 2&0b
% \\ \hline
% 1995/01/29 & Michael Mehlich &
% references from headers to sections for bibliography, index, glossary, and
% table of contents added
% & 2&0a
% \\ \hline
% 1995/01/26 & Michael Mehlich &
% options to be handled are determined automagically now\newline
% protected the anchor and reference adding macros instead of {\tt"}\newline
% some internal algorithms changed\newline
% some macro--names changed
% & 2&0
% \\ \hline
% 1995/01/25 & Michael Mehlich & handling of index and glossary added & 1&3
% \\ \hline
% 1995/01/24 & Michael Mehlich &
% handling of options changed\newline
% color support for anchors and references added
% & 1&2
% \\ \hline
% 1995/01/24 & Michael Mehlich &
% |\noref| added\newline
% bug in writing wrong page numbers to auxiliary files removed
% & 1&1
% \\ \hline
% 1995/01/20 & Michael Mehlich &
% protected {\tt"} for compatibility with the package |german.sty|
% & 1&0g
% \\ \hline
% 1995/01/12 & Michael Mehlich &
% first official version
% & 1&0
% \\ \hline
% \end{tabularx}
%
% \clearpage
%
% \section{The Realization}
%
% \subsection{The Package Header}
% We need a version of \LaTeX2e{} dated with June 1, 1995 or newer.
% Thus, we just demand it.
%    \begin{macrocode}
%<*hyper>
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
%    \end{macrocode}
% Now we have to introduce ourself.
%    \begin{macrocode}
\ProvidesPackage{hyper}[\filedate\space HyperLaTeX2e extension]
%    \end{macrocode}
%
% \subsection{Special Characters}
% First of all let us reserve some characters which are important and are
% not preserved by every other package.
%    \begin{macrocode}
\bgroup
  \catcode`\!00\relax
  \catcode`\"12\relax
  !catcode`!\12!relax
  !gdef!hyper@quote{"}
  !gdef!hyper@backslash{\}
  !global!edef!hyper@hash{!string#}
  !global!edef!hyper@tilde{!string~}
!egroup
%    \end{macrocode}
% For compatibility with other packages this may need to be extended.
% But for now we suppose this being sufficient.
%
% \subsection{The Basic Anchor/Reference-Entries}
% Let us set the output channel for special hyper informations first.
%    \begin{macrocode}
\AtBeginDocument{\let\hyper@auxout\@auxout}
%    \end{macrocode}
% We have to define some macros that allow us to insert the hypertext marks
% for anchors and references into the resulting dvi-file. This can be
% done by using the |\special|--macro.\par
% \noindent But before introducing them, we need some auxiliaries that allow
% us to write the hyper anchors to the auxiliary file and reread them at
% program start. This way we can check, whether we use a reference to an
% existing anchor; thus we can avoid introducing invalid references.
% This mechanism can additionally be used to check whether the hyper anchors
% may have changed between two \LaTeXe\ runs.\par
% \noindent This is also a good place to recheck whether there have been some
% undefined or multiply defined hyper anchors or forwarded references
% used in hyper references.
%     \begin{macrocode}
\newcount\hyper@changed
\global\hyper@changed=0
\newcount\hyper@cnt%careful, this is used as a temporary counter in various places
\def\hyper@change#1{%set change value (powers of 2 only), in use: 1,2,4,8
  \hyper@cnt\hyper@changed\relax%
  \divide\hyper@cnt#1\relax%
  \ifodd\hyper@cnt\else%
     \global\advance\hyper@changed#1\relax%
  \fi%
}
\def\newhyper#1#2{%
  \bgroup%
     \def\uppercase{<UPPERCASE>}%
     \def\lowercase{<LOWERCASE>}%
     \expandafter\ifx\csname hyper@#1\endcsname\relax\else%
        \hyper@change2\relax%
        \PackageWarningNoLine{hyper}%
                     {Hyper anchor #1 multiply defined}%
     \fi%
     \expandafter\global\expandafter\def\csname hyper@#1\endcsname{#2}%
  \egroup%
}
\def\newhyper@check#1#2{%
   \def\reserved@a{#2}%
  \bgroup%
     \def\uppercase{<UPPERCASE>}%
     \def\lowercase{<LOWERCASE>}%
     \expandafter\ifx\csname hyper@#1\endcsname\reserved@a\else%
       \expandafter\ifx\csname hyper@new@#1\endcsname\reserved@a\else%
          \global\hyper@change4\relax%
        \fi%
     \fi%
  \egroup%
}
\let\hyper@enddocument\enddocument
\def\hyper@check@end{%
  \ifodd\hyper@changed%1
     \PackageWarningNoLine{hyper}{There were undefined hyper references}%
  \fi%
  \divide\hyper@changed2\relax%
  \ifodd\hyper@changed%2
     \PackageWarningNoLine{hyper}%
          {There were multiply defined hyper anchors}%
  \fi%
  \divide\hyper@changed2\relax%
  \ifodd\hyper@changed%4
     \PackageWarningNoLine{hyper}%
          {Hyper anchor(s) may have changed.\MessageBreak
           Rerun to get hyper references right}%
  \fi%
  \divide\hyper@changed2\relax%
  \ifodd\hyper@changed%8
     \PackageWarningNoLine{hyper}%
          {Footnote hyper reference(s) may have been forwarded\MessageBreak
             to next page.\MessageBreak
           Check result to ensure this being correct.\MessageBreak
           If not rerun to get footnote hyper references right}%
  \fi%
}
\def\enddocument{%
  \let\hyper@@end\@@end%
  \def\@@end{\hyper@check@end\hyper@@end}%
  \let\newhyper\newhyper@check%
  \hyper@enddocument%
}
\def\hyper@to@aux#1{%
  \bgroup%
     \def\uppercase{<UPPERCASE>}%
     \def\lowercase{<LOWERCASE>}%
     \expandafter\ifx\csname hyper@#1\endcsname\relax%
        \expandafter\ifx\csname hyper@new@#1\endcsname\relax%
           \expandafter\global%
             \expandafter\expandafter\expandafter\def\csname hyper@new@#1\endcsname%
                 {{\@currentlabel}{\thepage}}%
        \fi%
     \fi%
     \@bsphack%
        \protected@write%
           \hyper@auxout%
             {}%
             {\string\newhyper%
               {#1}%
               {{\@currentlabel}{\thepage}}%
             }%
     \@esphack%
   \egroup%
}
%    \end{macrocode}
% \noindent The macros |\hyperreference| |\hyperpagereference| and insert a html-reference
% to an internal label except when the first parameter begins with |[|. Then the
% parameter must have the form |[#1][#2]| where |#1| is an external URL and
% |#2| an anchor within this URL. This is used when generating cross references
% between documents.\par
% \noindent The whole stuff is complicated by two problems: We have to avoid
% nesting of the html-markups in the dvi-file and we have to tell |dvips| about the
% right dimension of the box by modifying the positions of the specials from which
% |dvips| gets the bounding box for a hyper reference (The latter one is optionally
% done when passing the corresponding parameter to the package).
%    \begin{macrocode}
\newbox\hyper@box@text
\newbox\hyper@box@ref
\newdimen\hyper@fixdim
\newif\if@hyper@is@active
\@hyper@is@activefalse
\def\hyper@html{html:}
\bgroup
  \catcode`\<12\catcode`\>12\relax%
  \catcode`\:12\catcode`\=12\catcode`\/12\relax%
  \gdef\hyper{%
    \def\hyper@unnested@special##1##2##3{%
       \special{\hyper@html##1}##3\special{\hyper@html##2}%
    }%
    \def\hyper@unnested@special@anchor@nofix##1##2##3{%
       \special{\hyper@html##1}\hyper@anchor@color{##3}\special{\hyper@html##2}%
    }%
    \def\hyper@unnested@special@reference@nofix##1##2##3{%
       \special{\hyper@html##1}\hyper@ref@color{##3}\special{\hyper@html##2}%
    }%
    \def\hyper@unnested@special##1##2{%
       \hyper@fixdim\ht\hyper@box@text%
       \advance\hyper@fixdim\dp\hyper@box@text%
       \advance\hyper@fixdim-8pt%
       \setbox\hyper@box@ref=\hbox{%
          \parindent0pt\leftskip0pt\rightskip0pt%
          \leftmargin0pt\rightmargin\wd\hyper@box@text\advance\rightmargin0.5pt%
          \linewidth\rightmargin\textwidth\rightmargin%
          \noindent\vbox{%
             \hrule height \hyper@fixdim width 0pt%
             \special{\hyper@html##1}\hbox to\linewidth{\hfill}%
             \hrule height -\hyper@fixdim width 0pt%
             \hbox to\linewidth{\hfill\special{\hyper@html##2}}%
             \hrule height 0pt width 0pt%
          }%
       }%
       \ht\hyper@box@ref0pt%
       \dp\hyper@box@ref0pt%
       \wd\hyper@box@ref0pt%
       \hyper@fixdim\ht\hyper@box@text%
       \advance\hyper@fixdim-8pt%
       \hbox{\raise\hyper@fixdim\copy\hyper@box@ref\copy\hyper@box@text}%
       \setbox\hyper@box@ref=\hbox{}%
    }%
    \def\hyper@unnested@special@anchor@fix##1##2##3{%
       \setbox\hyper@box@text=\hbox{\hyper@anchor@color{##3}}%
       \hyper@unnested@special{##1}{##2}%
       \setbox\hyper@box@text=\hbox{}%
    }%
    \def\hyper@unnested@special@reference@fix##1##2##3{%
       \setbox\hyper@box@text=\hbox{\hyper@ref@color{##3}}%
       \hyper@unnested@special{##1}{##2}%
       \setbox\hyper@box@text=\hbox{}%
    }
    \let\hyper@unnested@special@reference\hyper@unnested@special@reference@nofix%
    \let\hyper@unnested@special@anchor\hyper@unnested@special@anchor@nofix%
    \def\hyper@nested@special##1##2##3##4{%
       \ifx\hyper@unnested@special@reference\hyper@unnested@special@reference@nofix%
          \if@hyper@is@active%
             \expandafter\expandafter\expandafter%
                  \special\expandafter\@firstoftwo\hyper@special@last%
               {\def\hyper@special@last{{{\hyper@html##4}}{{\hyper@html##2}}}%
                ##1{##2}{##4}{##3}%
               }%
             \expandafter\expandafter\expandafter%
                 \special\expandafter\@secondoftwo\hyper@special@last%
          \else%
            \def\hyper@special@last{{{\hyper@html##4}}{{\hyper@html##2}}}%
            \@hyper@is@activetrue\relax%
            ##1{##2}{##4}{##3}%
            \@hyper@is@activefalse\relax%
          \fi%
       \else%
          \if@hyper@is@active%
             ##1{##2}{##4}{##3}%
          \else%
            \@hyper@is@activetrue\relax%
            ##1{##2}{##4}{##3}%
            \@hyper@is@activefalse\relax%
          \fi%
       \fi%
    }%
    \def\hyper@special@anchor{\hyper@nested@special\hyper@unnested@special@anchor}
    \def\hyper@special@reference{\hyper@nested@special\hyper@unnested@special@reference}
    \def\f@hyper@ref@ext[##1][##2][##3]\end@hyper@ref##4{%
      \ifvmode\leavevmode\fi%
      \hyper@special@reference%
         {<a href=\hyper@quote##1##2\hyper@hash##3\hyper@quote>}%
            {##4}%
         {</a>}%
    }%
    \def\hyper@check@fn##1.##2.##3.##4\hyper@check@fn{%
       \def\hyper@tmpa{fn}%mark for link to footnote
       \def\hyper@tmpb{##1}%
       \ifx\hyper@tmpa\hyper@tmpb{%
           \ifx?##3\relax%
              \global\let\hyper@forwarded@fn\@empty%
           \else%
              \hyper@cnt##3\relax%                                   fetch page
              \advance\hyper@cnt1\relax%                             advance page by one
              \global\edef\hyper@forwarded@fn{fn.##2.\the\hyper@cnt}%create new link
           \fi%
         }%
       \else%
         \global\let\hyper@forwarded@fn\@empty%
       \fi%
    }%
    \let\hyper@thepage\thepage%
    \def\f@hyper@ref@int##1\end@hyper@ref##2{%
      \ifvmode\leavevmode\fi%
      \expandafter\ifx\csname hyper@##1\endcsname\relax%
         \expandafter\ifx\csname hyper@new@##1\endcsname\relax%
            \hyper@check@fn##1...\hyper@check@fn%
            \ifx\hyper@forwarded@fn\@empty%
               \PackageWarning{hyper}%
                  {Hyper reference `##1' for `##2' on page \hyper@thepage\space undefined}%
               \hyper@change1\relax%
               \hyper@undef@color{##2}%
            \else%
               \expandafter\ifx\csname hyper@\hyper@forwarded@fn\endcsname\relax%
                  \expandafter\ifx\csname hyper@new@\hyper@forwarded@fn\endcsname\relax%
                     \PackageWarning{hyper}%
                        {Hyper reference `##1' for `##2'  %
                         on page \hyper@thepage\space undefined}%
                     \hyper@change1\relax%
                     \hyper@undef@color{##2}%
                  \else%
                     \hyper@change8\relax%
                     \PackageWarning{hyper}%
                        {Hyper reference `##1' for `##2' on page \hyper@thepage\space%
                         forwarded to `\hyper@forwarded@fn'}%
                     \hyper@special@reference%
                        {<a href=\hyper@quote\hyper@hash\hyper@forwarded@fn\hyper@quote>}%
                           {##2}%
                        {</a>}%
                  \fi%
               \else%
                  \hyper@change8\relax%
                  \PackageWarning{hyper}%
                     {Hyper reference `##1' for `##2' on page \hyper@thepage\space%
                      forwarded to `\hyper@forwarded@fn'}%
                  \hyper@special@reference%
                     {<a href=\hyper@quote\hyper@hash\hyper@forwarded@fn\hyper@quote>}%
                        {##2}%
                     {</a>}%
               \fi%
            \fi%
         \else%
            \hyper@special@reference%
               {<a href=\hyper@quote\hyper@hash##1\hyper@quote>}%
                  {##2}%
               {</a>}%
         \fi%
      \else%
        \hyper@special@reference%
           {<a href=\hyper@quote\hyper@hash##1\hyper@quote>}%
              {##2}%
           {</a>}%
      \fi%
    }%
    \def\f@hyper@ref{%
      \@ifnextchar[{\f@hyper@ref@ext[]}{\f@hyper@ref@int}%
    }%
    \def\fragilehyperreference##1{%
      \expandafter\expandafter\expandafter\f@hyper@ref##1\end@hyper@ref%
    }%
    \def\f@hyper@page@ref{%
      \@ifnextchar[{\f@hyper@ref@page@ext[page.]}{\f@hyper@ref@int page.}%
    }%
    \def\fragilehyperpagereference##1{%
      \expandafter\expandafter\expandafter%
      \f@hyper@page@ref##1\end@hyper@ref%
    }%
    \def\fragilehyperanchor##1##2{%
      \ifvmode\leavevmode\fi%
      \hyper@special@anchor%
         {<a name=\hyper@quote##1\hyper@quote>}%
            {\hyper@to@aux{##1}%
             ##2%
            }%
         {</a>}%
    }%
    \def\fragileblindhyperanchor##1{%
      \hyper@special@anchor%
         {<a name=\hyper@quote##1\hyper@quote>}%
            {\hyper@to@aux{##1}}%
         {</a>}%
    }%
    \def\fragilehyperURL##1##2##3##4{%
      \ifvmode\leavevmode\fi%
      \def\hyper@tmp{##4}%
      \def\hyper@tmpa{##1}%
      \def\hyper@tmpb{##2}%
      \def\hyper@tmpc{##3}%
      \ifx\hyper@tmp\@empty%
         %
      \else\ifx\hyper@tmpa\@empty%
         \ifx\hyper@tmpb\@empty%
            \ifx\hyper@tmpc\@empty%
               {##4}%
            \else%
               \hyper@special@reference%
                  {<a href=\hyper@quote##3\hyper@quote>}%
                     {##4}%
                  {</a>}%
            \fi%
         \else\ifx\hyper@tmpc\@empty%
            \hyper@special@reference%
               {<a href=\hyper@quote//##2/\hyper@quote>}%
                  {##4}%
               {</a>}%
         \else%
            \hyper@special@reference%
               {<a href=\hyper@quote//##2/##3\hyper@quote>}%
                  {##4}%
               {</a>}%
         \fi\fi%
      \else\ifx\hyper@tmpb\@empty%
         \ifx\hyper@tmpc\@empty%
            {##4}%
         \else%
            \hyper@special@reference%
               {<a href=\hyper@quote##1:##3\hyper@quote>}%
                  {##4}%
               {</a>}%
         \fi%
      \else\ifx\hyper@tmpc\@empty%
        \hyper@special@reference%
           {<a href=\hyper@quote##1://##2/\hyper@quote>}%
              {##4}%
           {</a>}%
      \else%
        \hyper@special@reference%
           {<a href=\hyper@quote##1://##2/##3\hyper@quote>}%
              {##4}%
           {</a>}%
       \fi\fi\fi\fi%
    }%
  }
\egroup
\hyper
%    \end{macrocode}
% Sometimes we need this package without being allowed to insert
% the hypertext marks into the dvi--file. Note, thate |\hyper@fix| is
% defined for the sole purpose of having the same \TeX-output behaviour
% regardless whether we create or do not create hypertext markups.
%    \begin{macrocode}
\def\nohyper{%
  \def\hyper@fix##1{%
     \ifx\hyper@unnested@special@reference\hyper@unnested@special@reference@nofix%
        ##1%
     \else%
        \hbox{##1}%
     \fi%
  }
  \def\fragilehyperreference##1##2{%
     \ifvmode\leavevmode\fi\hyper@fix{\hyper@ref@color{##2}}%
  }%
  \def\fragilehyperpagereference##1##2{%
     \ifvmode\leavevmode\fi\hyper@fix{\hyper@ref@color{##2}}%
  }%
  \def\fragilehyperanchor##1##2{%
     \ifvmode\leavevmode\fi\hyper@anchor@color{##2}%
  }%
  \def\fragileblindhyperanchor##1{}%
  \def\fragilehyperURL##1##2##3##4{%
     \ifvmode\leavevmode\fi\hyper@fix{\hyper@ref@color{##4}}%
  }%
}
%    \end{macrocode}
% Now let's protect the fragile commands.
%    \begin{macrocode}
\def\hyperreference{\protect\fragilehyperreference}
\def\hyperpagereference{\protect\fragilehyperpagereference}
\def\hyperanchor{\protect\fragilehyperanchor}
\def\blindhyperanchor{\protect\fragileblindhyperanchor}
\def\fragileChyperURL{%
  \bgroup%
     \catcode`\<12\catcode`\>12\catcode`\"12\relax%
     \catcode`\:12\catcode`\=12\catcode`\/12\relax%
     \catcode`\#12\catcode`\~12\relax%\catcode`\%12\relax%
     \finish@hyperURL%
}
\def\finish@hyperURL#1#2#3#4{%
    \fragilehyperURL{#1}{#2}{#3}{#4}%
  \egroup%
}
\def\hyperURL{\protect\fragileChyperURL}
%    \end{macrocode}
%
% \subsection{Colored Anchors/References}
% Above we have used three macros |\hyper@ref@color|, |\hyper@undef@color|, and |\hyper@anchor@color|
% with which we can modify the text that is printed to the document.
% As their name indicates we want to use them to color the anchors resp.\
% references. Hence we should define some variants of these macros.\par
% \noindent The first variant prints the text in different colors.
%    \begin{macrocode}
\def\hyper@color{%
  \definecolor{refcolor}{rgb}{0,0,1}%
  \definecolor{undefrefcolor}{rgb}{1,0,0}%
  \definecolor{anchorcolor}{rgb}{0,0.75,0.75}%
  \def\hyper@ref@color##1{\textcolor{refcolor}{##1}}%
  \def\hyper@undef@color##1{\textcolor{undefrefcolor}{##1}}%
  \def\hyper@anchor@color##1{\textcolor{anchorcolor}{##1}}%
}
%    \end{macrocode}
% If we do not have colors we may use gray text instead.
%    \begin{macrocode}
\def\hyper@gray{%
  \definecolor{refcolor}{gray}{0.75}%
  \definecolor{undefrefcolor}{gray}{0.25}%
  \definecolor{anchorcolor}{gray}{0.5}%
  \def\hyper@ref@color##1{\textcolor{refcolor}{##1}}%
  \def\hyper@undef@color##1{\textcolor{undefrefcolor}{##1}}%
  \def\hyper@anchor@color##1{\textcolor{anchorcolor}{##1}}%
}
%    \end{macrocode}
% In ready to print documents we should not use these options but print
% the text in ordinary black. This is also the default definition.
%    \begin{macrocode}
\def\hyper@black{%
  \def\hyper@ref@color##1{##1}%
  \def\hyper@undef@color##1{##1}%
  \def\hyper@anchor@color##1{##1}%
}
\hyper@black
%    \end{macrocode}
%
% \subsection{Automatic Generation of Anchor Names}
% As we want to insert hypertext marks automagically we need a service that
% provides new names for anchors. The simplest solution is to let the
% name be a natural number.\par
% \noindent Thus we need an initialization for providing them.
%    \begin{macrocode}
\newcount\hypercount
\hypercount=0\relax
\def\@currenthyper{}
%    \end{macrocode}
% Now we can compute the next anchor from the last one generated.
%    \begin{macrocode}
\def\hyper@setcurrent{%
  \global\advance\hypercount1\relax%
  \edef\@currenthyper{\the\hypercount}%
}%
\def\hyper@settype#1{%
\edef\@currenthypertype{#1}%
}%
%    \end{macrocode}
% The automatic generation of anchor names leads to a little problem.
% We have to ensure that |\@currenthyper| is expanded at an appropriate
% time. Thus we define a macro that allow us to get an expanded
% hypertext reference that follows a not yet expanded
% token list.
%    \begin{macrocode}
\def\hyper@ref@toggle#1#2#3{#3[\hyperreference{#1}{#2}]}
\def\ref@by@expanded@hyper#1\end@hyper{{#1}}
\def\callwithexpandedhyperref#1#2{%
  \expandafter\expandafter\expandafter\hyper@ref@toggle%
    \expandafter\ref@by@expanded@hyper\@currenthyper\end@hyper%
  {#2}{#1}%
}
%    \end{macrocode}
%
% \subsection{HyperText Cross--Referencing for \LaTeXe}
% For a replacement of \LaTeXe's cross--referencing features we need to
% redefine the commands |\label| and |\ref|.\par
% \noindent Let us first define a label command for writing the current
% hypertext reference to the |.aux|--file. It must print four components
% of a label: the hypertext--type, the hypertext--anchor, the \LaTeXe--anchor,
% and the \LaTeXe--page. This is due to the fact that we need to know not only
% the stuff we reference to but also the internal name of the anchor.
%    \begin{macrocode}
\def\hyperlabel#1{\@bsphack
  \protected@write\hyper@auxout{}%
         {\string\newlabel{#1}%
           {{\@currenthypertype}{\@currenthyper}{\@currentlabel}{\thepage}}}%
  \@esphack}
%    \end{macrocode}
% Now we need some auxiliary macros to be able to select each of the three
% parts of the second argument of |\newlabel| that has been written to the
% |.aux|--file. Note, that the third component may contain informations
% about the URL of an external document (for cross referencing between
% documents) that has to be stripped of a page
% number before printing it.
%    \begin{macrocode}
\def\hyper@secondoffour#1#2#3#4{#2}
\def\hyper@thirdoffour#1#2#3#4{#3}
\def\hyper@forthoffour#1#2#3#4{#4}
\def\hyper@snd@forthoffour[#1][#2]\end@hyper{#2}
\def\hyper@this@forthoffour#1\end@hyper{#1}
\def\hyper@test@forthoffour{%
  \@ifnextchar[{\hyper@snd@forthoffour}{\hyper@this@forthoffour}%
}
\def\hyper@page@forthoffour#1#2#3#4{%
  \expandafter\hyper@test@forthoffour#4\end@hyper%
}
%    \end{macrocode}
% When setting a reference to an anchor we also have to add the corresponding
% hypertext link into the dvi-file.
%    \begin{macrocode}
\let\hyper@thepage\thepage
\def\hyper@setref#1#2#3#4{%
  \ifx#1\relax%
     \protect\G@refundefinedtrue%
     #4\nfss@text{\reset@font\bfseries ??}%
     \@latex@warning{Reference `#3' on page \hyper@thepage \space undefined}%
  \else%
    \edef\hyper@tmp{\expandafter\hyper@secondoffour#1}%
    \ifx\hyper@tmp\@empty%
       \ifx#2\hyper@secondoffour%
          #4\null%
       \else\ifx#2\hyper@thirdoffour%
         #4\expandafter#2#1\null%
       \else%
         #4\expandafter#2#1\null%
       \fi\fi%
    \else%
       \ifx#2\hyper@secondoffour%
          \hyperreference{\expandafter\hyper@secondoffour#1}{#4}\null%
       \else\ifx#2\hyper@thirdoffour%
         \hyperreference%
           {\expandafter\hyper@secondoffour#1}%
           {#4\expandafter#2#1\null}\null%
       \else%
         \hyperpagereference%
           {\expandafter\hyper@forthoffour#1}%
           {#4\expandafter#2#1\null}\null%
       \fi\fi%
    \fi%
  \fi%
}
%    \end{macrocode}
% Proceeding from this we can define three macros |\hypernoref|, |\hyperref|,
% and |\hyperpageref| that correspond to the same \LaTeXe--macros where the
% hyper does not occur. But we want to do a little bit more. Thus an
% additional optional argument may be given to these macros to allow
% the user to reference from a whole text and not only from the number
% to the anchor.
%    \begin{macrocode}
\def\@@hypernoref[#1]#2{%
  \expandafter\hyper@setref\csname r@#2\endcsname%
    \hyper@secondoffour{#2}{#1}%
}
\def\@hypernoref[#1]{\@@hypernoref[#1]}
\def\hypernoref{\@ifnextchar[{\@hypernoref}{\@@hypernoref[]}}
\def\@@hyperref[#1]#2{%
  \expandafter\hyper@setref\csname r@#2\endcsname%
    \hyper@thirdoffour{#2}{#1}%
}
\def\@hyperref[#1]{\@@hyperref[#1~]}
\def\hyperref{\@ifnextchar[{\@hyperref}{\@@hyperref[]}}
\def\@@hyperpageref[#1]#2{%
   \expandafter\hyper@setref\csname r@#2\endcsname%
     \hyper@page@forthoffour{#2}{#1}%
}
\def\@hyperpageref[#1]{\@@hyperpageref[#1~]}
\def\hyperpageref{\@ifnextchar[{\@hyperpageref}{\@@hyperpageref[]}}
%    \end{macrocode}
% Now let's patch \LaTeXe's ref/label-system:
%    \begin{macrocode}
\let\label\hyperlabel
\def\noref{\protect\hypernoref}
\def\ref{\protect\hyperref}
\def\pageref{\protect\hyperpageref}
%    \end{macrocode}
% Up to now we only can reference to anchors but haven't yet defined some.
% This will be done in many of the following subsections.
% \subsection{Other Cross--Referencing Features}
% Though \LaTeXe{} has a very good reference mechanism this is not enough
% for hypertext documents. The user should be able to add an anchor to
% a text of his own choice.
%    \begin{macrocode}
\def\labeltext#1#2{%
  \bgroup%
    \hyper@setcurrent%
    \hyper@settype{text}%
    \def\@currentlabel{#2}%
    \label{#1}%
    \hyperanchor{\@currenthyper}{#2}%
  \egroup%
}
%    \end{macrocode}
% But that is not enough. Some of the macros of this package define anchors
% which cannot be caught by a |\label| command. But then it is the current or
% the next anchor generated. The following macros will allow us to reference
% to them:
%    \begin{macrocode}
\def\refcurrent#1{\hyperreference{\@currenthyper}{#1}}
\def\fragilerefnext#1#2{\bgroup%
  \hypercount=#1\relax\advance\hypercount1\relax%
  \hyperreference{\the\hypercount}{#2}%
\egroup}
\def\refnext#1{\protect\fragilerefnext{\the\hypercount}{#1}}
%    \end{macrocode}
% This is especially usefull for inserting links from the table of contents
% to an unnumbered section like e.g.\ the references of a document.\par
% \noindent But wait, there is more. \LaTeXe{} not only uses |\ref| and
% |\label| for it's referencing mechanism but also |\refstepcounter| to
% determine to what the next |\label| should reference.
% This has to be reflected for the hypertext stuff.
%    \begin{macrocode}
\let\hyper@refstepcounter\refstepcounter
\def\refstepcounter{\hyper@setcurrent\hyper@settype{counter}\hyper@refstepcounter}
%    \end{macrocode}
% As we will patch some latex internals below we also need
% a macro that allow us to forget the next |\refstepcounter|.
%    \begin{macrocode}
\def\ignore@next@refstepcounter{%
  \def\refstepcounter##1{%
    \def\refstepcounter{\hyper@setcurrent\hyper@settype{counter}\hyper@refstepcounter}%
  }%
}
%    \end{macrocode}
%
% \subsection{Handling Page Numbers}
% We want to refer from the pages in the table of contents
% to the corresponding page. Thus we have to recall the necessary
% information when printing the table.
%    \begin{macrocode}
\let\hyper@contentsline\contentsline
\def\contentsline#1#2#3{%
  \hyper@contentsline{#1}{#2}{\hyperpagereference{#3}{#3}}%
}
%    \end{macrocode}
% The same is valid for indices and glossaries. But they are more
% problematic. Hence we will handle them in a subsection of its own.\par
% \noindent So far the result is a couple of references from page numbers
% to pages. But we haven't defined the anchors they refer to.\par
% \noindent To resolve this we have to modify headers and footers of
% a page. This can be done for an arbitrary page style when we change
% (misuse!) |\@begindvi|.\par
% \noindent Let's provide to different styles for this purpose, one allowing
% jumps to the page number, and one allowing jumps to the top of the page.
% In the latter case we let the page numbers in the headers and footers refer
% to the top of the page.
%    \begin{macrocode}
\let\hyper@thepage\thepage
\def\hyper@anchorpage{%
  \fragilehyperanchor{page.\hyper@thepage}{\hyper@thepage}%
}
\def\hyper@referencepage{%
  \fragilehyperreference{page.\hyper@thepage}{\hyper@thepage}%
}
\def\hyper@empty{\@empty}
\def\hyper@evenhead{\@evenhead}
\def\hyper@oddhead{\@oddhead}
\def\hyper@evenfoot{\@evenfoot}
\def\hyper@oddfoot{\@oddfoot}
\def\hyper@modifyheadfoot@pagenumber{%
  \let\hyper@thehead\@thehead%
  \ifx\hyper@thehead\hyper@oddhead\let\hyper@thehead\@oddhead\fi%
  \ifx\hyper@thehead\hyper@evenhead\let\hyper@thehead\@evenhead\fi%
  \let\hyper@thefoot\@thefoot%
  \ifx\hyper@thefoot\hyper@oddfoot\let\hyper@thefoot\@oddfoot\fi%
  \ifx\hyper@thefoot\hyper@evenfoot\let\hyper@thefoot\@evenfoot\fi%
  \def\@thehead{%
      \ifnum\ifnum\ifx\hyper@thehead\@empty1\else0\fi%
                  \ifx\hyper@thehead\hyper@empty1\else0\fi%
                  >0 0\else1\fi%
            \ifnum\ifx\hyper@thefoot\@empty1\else0\fi%
                  \ifx\hyper@thefoot\hyper@empty1\else0\fi%
                  >0 0\else1\fi%
            >0\relax%
      \else%
         \blindhyperanchor{page.\thepage}%
      \fi%
      \let\hyper@thepage\thepage%
      \let\thepage\hyper@anchorpage%
      \ifx\hyper@thehead\@empty%
         \hfil%
      \else\ifx\hyper@thehead\hyper@empty%
         \hfil%
      \else%
        \hyper@thehead%
      \fi\fi%
  }%
  \def\@thefoot{%
      \let\hyper@thepage\thepage%
      \let\thepage\hyper@anchorpage%
      \ifx\hyper@thefoot\@empty%
         \hfil%
      \else\ifx\hyper@thefoot\hyper@empty%
         \hfil%
      \else%
         \hyper@thefoot%
      \fi\fi%
  }%
}
\def\hyper@modifyheadfoot@pagetop{%
  \let\hyper@thehead\@thehead%
  \ifx\hyper@thehead\hyper@oddhead\let\hyper@thehead\@oddhead\fi%
  \ifx\hyper@thehead\hyper@evenhead\let\hyper@thehead\@evenhead\fi%
  \let\hyper@thefoot\@thefoot%
  \ifx\hyper@thefoot\hyper@oddfoot\let\hyper@thefoot\@oddfoot\fi%
  \ifx\hyper@thefoot\hyper@evenfoot\let\hyper@thefoot\@evenfoot\fi%
  \def\@thehead{%
      \blindhyperanchor{page.\thepage}%
      \let\hyper@thepage\thepage%
      \let\thepage\hyper@referencepage%
      \ifx\hyper@thehead\@empty%
         \hfil%
      \else\ifx\hyper@thehead\hyper@empty%
         \hfil%
      \else%
         \hyper@thehead%
      \fi\fi%
  }%
  \def\@thefoot{%
      \let\hyper@thepage\thepage%
      \let\thepage\hyper@referencepage%
      \ifx\hyper@thefoot\@empty%
         \hfil%
      \else\ifx\hyper@thefoot\hyper@empty%
         \hfil%
      \else%
         \hyper@thefoot%
      \fi\fi%
    }%
}
\let\hyper@begindvi\@begindvi
\def\@begindvi{%
  \hyper@begindvi%
  \hyper@modifyheadfoot%
  \global\let\@begindvi\hyper@modifyheadfoot%
}
%    \end{macrocode}
% Hopefully we do not use a page number twice in headers or footers if we want to jump to the pagenumber.\par
% \noindent We use pagenumbers as the default position for page anchors.
%    \begin{macrocode}
\let\hyper@modifyheadfoot\hyper@modifyheadfoot@pagenumber
%    \end{macrocode}
% \subsection{Table of Contents}
% In the subsection ``Handling of Pages'' we already have inserted
% references from the page number to the corresponding page.
% Now we want to add further references from the title of an entry
% in the table of contents to the corresponding text within the
% document.\par
% \noindent To do that we have to modify the corresponding sectioning commands.
%     \begin{macrocode}
\let\hyper@sect\@sect
\def\@sect#1#2#3#4#5#6[#7]#8{%
  \ifnum #2>\c@secnumdepth%
    \hyper@setcurrent%
  \else%
    \refstepcounter{#1}%
    \ignore@next@refstepcounter%
  \fi%
  \hyper@settype{#1}%
  \global\let\@currenthyper\@currenthyper%
  \global\let\@currenthypertype\@currenthypertype%
  \callwithexpandedhyperref%
    {\hyper@sect{#1}{#2}{#3}{#4}{#5}{#6}}%
    {#7}%
    {\hyperanchor{\@currenthyper}{#8}}%
}
\let\hyper@ssect\@ssect
\def\@ssect#1#2#3#4#5{%
  \hyper@setcurrent%
  \hyper@settype{#1}%
  \global\let\@currenthyper\@currenthyper%
  \global\let\@currenthypertype\@currenthypertype%
  \hyper@ssect{#1}{#2}{#3}{#4}{\hyperanchor{\@currenthyper}{#5}}%
}
%</hyper>
%    \end{macrocode}
% The classes |book| and |report| additionally define a |\chapter| command.
% Unfortunately they do it in a different way. But the differences are fairly
% small. Thus we will use nearly the same definition.
%    \begin{macrocode}
%<*book,report>
\let\hyper@chapter\@chapter
\let\hyper@schapter\@schapter
\def\@chapter[#1]#2{%
  \ifnum\c@secnumdepth>\m@ne%
%</book,report>
%<*book>
    \if@mainmatter%
%</book>
%<*book,report>
      \refstepcounter{chapter}%
      \ignore@next@refstepcounter%
%</book,report>
%<*book>
    \else%
      \hyper@setcurrent%
    \fi%
%</book>
%<*book,report>
  \else%
    \hyper@setcurrent%
  \fi%
  \hyper@settype{chapter}%
  \global\let\@currenthyper\@currenthyper%
  \global\let\@currenthypertype\@currenthypertype%
  \callwithexpandedhyperref%
    {\hyper@chapter}%
    {#1}%
    {\hyperanchor{\@currenthyper}{#2}}%
}
\def\@schapter#1{%
  \hyper@setcurrent%
  \hyper@settype{chapter}%
  \global\let\@currenthyper\@currenthyper%
  \global\let\@currenthypertype\@currenthypertype%
  \hyper@schapter{\hyperanchor{\@currenthyper}{#1}}%
}
%    \end{macrocode}
% However, this is not sufficient. The classes |book| and |report| use a different mechanism
% for the index heading not using the macro |\chapter*|. So we have to fix this.
%    \begin{macrocode}
\let\hyper@theindex\theindex
\def\theindex{%
  \bgroup%
    \let\hyper@makeschapterhead\@makeschapterhead%
    \def\@makeschapterhead##1{%
      \hyper@setcurrent%
      \hyper@settype{chapter}%
      \global\let\@currenthyper\@currenthyper%
      \global\let\@currenthypertype\@currenthypertype%
      \hyper@makeschapterhead{\hyperanchor{\@currenthyper}{##1}}%
    }
    \hyper@theindex%
  \egroup%
  \let\item\@idxitem%
}
%</book,report>
%    \end{macrocode}
% There is also a |\part|--macro defined in the classes |article|, |book|,
% |ltnews|, |ltxdoc|, |ltxguide|, |proc|, and |report|.
% Unfortunately there are two different definitions we have to modify.
% But they differ only in a constant in a conditional expression.
% Thus we can use a nearly common definition.
%    \begin{macrocode}
%<*article,book,ltnews,ltxdoc,ltxguide,proc,report>
\let\hyper@part\@part
\def\@part[#1]#2{%
  \ifnum\c@secnumdepth>%
%</article,book,ltnews,ltxdoc,ltxguide,proc,report>
%<*article,ltnews,ltxdoc,ltxguide,proc>
-1\relax%
%</article,ltnews,ltxdoc,ltxguide,proc>
%<*book,report>
-2\relax%
%</book,report>
%<*article,book,ltnews,ltxdoc,ltxguide,proc,report>
      \refstepcounter{part}%
      \ignore@next@refstepcounter%
  \else%
    \hyper@setcurrent%
  \fi%
  \hyper@settype{part}%
  \global\let\@currenthyper\@currenthyper%
  \global\let\@currenthypertype\@currenthypertype%
  \callwithexpandedhyperref%
    {\hyper@part}%
    {#1}%
    {\hyperanchor{\@currenthyper}{#2}}%
}
\let\hyper@spart\@spart
\def\@spart#1{%
  \hyper@setcurrent%
  \hyper@settype{part}%
  \global\let\@currenthyper\@currenthyper%
  \global\let\@currenthypertype\@currenthypertype%
  \hyper@spart{\hyperanchor{\@currenthyper}{#1}}%
}
%</article,book,ltnews,ltxdoc,ltxguide,proc,report>
%    \end{macrocode}
% Now we do not only get references from the table of contents to the
% corresponding sections but also from the headers and footers to them.
% There is only one exception these references are not inserted:
% If we used the |*|--ed variants of the sectioning commands the marks
% are not inserted in the headers.\par
% \noindent For bibliography, glossary, index, and table of contents
% this can be changed by modifying |\@mkboth|.
%    \begin{macrocode}
%<*article,book,ltnews,ltxdoc,ltxguide,proc,report>
\def\hyper@mkboth@do[#1][#2]{%
  \markboth{#1}{#2}%
}
\def\hyper@mkboth#1#2{%
  \callwithexpandedhyperref%
    {\callwithexpandedhyperref{\hyper@mkboth@do}{#1}}%
    {#2}%
}
%    \end{macrocode}
% As marks are only inserted when using the pagestyle ``headings'',
% the corresponding macro has to be modified to get the desired result.
%    \begin{macrocode}
\let\hyper@ps@headings\ps@headings
\def\ps@headings{%
  \hyper@ps@headings%
  \let\@mkboth\hyper@mkboth%
}
%</article,book,ltnews,ltxdoc,ltxguide,proc,report>
%    \end{macrocode}
% Last but not least set the new page style.
%    \begin{macrocode}
%<*book,report>
\pagestyle{headings}
%</book,report>
%    \end{macrocode}
% Unfortunately, the package |doc.sty| modifies the |theindex| environment
% in a way that the above changes do not work correctly with it.
% Hence, we have to modify this environment to resolve this.
%    \begin{macrocode}
%<*doc>
\g@addto@macro\index@prologue{%
  \def\markboth#1#2{%
    \@mkboth{\refcurrent{#1}}{\refcurrent{#2}}%
  }%
}
%</doc>
%    \end{macrocode}
%
% \subsection{Bibliography}
% We want to reference from citation points within the text,
% given by |\cite|, to the corresponding entry in the bibliography.
% To realize this we only have to modify the |\bibitem|--macro.
%    \begin{macrocode}
%<*hyper>
\def\@lbibitem[#1]#2{%
  \hyper@setcurrent%
  \hyper@settype{citation}%
  \item[\@biblabel{\hyperanchor{\@currenthyper}{#1}}\hfill]%
  \if@filesw%
      {\let\protect\@unexpandable@protect%
       \immediate%
       \write\@auxout{%
         \string\bibcite{#2}{\hyperreference{\@currenthyper}{#1}}%
       }%
      }%
  \fi%
  \ignorespaces%
}
\def\@bibitem{%
  \stepcounter{\@listctr}%
  \hyper@settype{citation}%
  \@lbibitem[\the\value{\@listctr}]%
}
%    \end{macrocode}
% \subsection{Equations}
% The goal is to reference to the equation number in equations and
% arrays of equations. This is really simple to do.
%    \begin{macrocode}
\def\@eqnnum{%
  \hyperanchor{\@currenthyper}{\normalfont\normalcolor(\theequation)}%
}
\let\hyper@eqnarray\eqnarray
\def\eqnarray{%
  \hyper@setcurrent%
  \def\@currenthyper{\the\hypercount}%
  \hyper@settype{equation}%
  \hyper@eqnarray%
}
\let\hyper@xeqncr\@xeqncr
\def\@xeqncr[#1]{%
  \hyper@xeqncr[#1]%
  \noalign{\hyper@setcurrent\hyper@settype{equation}}%
}
%</hyper>
%    \end{macrocode}
% There is a document class option |leqno| that has to be redefined for us.
%    \begin{macrocode}
%<*leqno>
\def\@eqnnum{%
  \hbox to .01\p@{}%
  \rlap{\reset@font\rmfamily%
        \hskip -\displaywidth%
        \hyperanchor{\@currenthyper}{\reset@font\rmfamily (\theequation)}%
       }%
}
%</leqno>
%    \end{macrocode}
%
% \subsection{Float Captions}
% What do you think we want to do here? Simply using |\caption| to define
% an anchor that may be used to refer to the current float.
%     \begin{macrocode}
%<*hyper>
\long\def\@caption#1[#2]#3{\par%
  \addcontentsline%
    {\csname ext@#1\endcsname}%
    {#1}%
    {\protect\numberline{\csname the#1\endcsname}%
     {\ignorespaces \hyperreference{\@currenthyper}{#2}}%
    }%
  \begingroup%
    \@parboxrestore%
    \normalsize%
    \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par%
  \endgroup%
}
%</hyper>
%    \end{macrocode}
% Obviously we need to modify |\@makecaption| to define the anchor.
% As this macro is defined only for the classes |article|, |book|,
% |ltnews|, |ltxdoc|, |ltxguide|, |proc|,  and |report| we redefine
% it only for them.
%    \begin{macrocode}
%<*article,book,ltnews,ltxdoc,ltxguide,proc,report>
\let\hyper@makecaption\@makecaption
\long\def\@makecaption#1#2{%
  \hyper@makecaption{\hyperanchor{\@currenthyper}{#1}}{#2}%
}
%</article,book,ltnews,ltxdoc,ltxguide,proc,report>
%    \end{macrocode}
%
% \subsection{Footnotes}
% Here we want to handle references from footnotemarks to footnotes
% at the bottom of the page.\par
% \noindent At first modify the standard definition of |\@makefnmark| to
% refer to a footnote which is complicated by the fact that |\thepage| does not
% necessarily refer to the actual page when used. So we have to write the page
% to an auxiliary file and reread it afterwards. Let's not forget to check for
% changes of these entries to warn the user about possible changes.
%    \begin{macrocode}
%<*hyper>
\newcount\hyper@fnmark@count
\hyper@fnmark@count0
\def\hyper@currentfnmark{%
   \global\advance\hyper@fnmark@count1\relax%
   \@bsphack%
      \protected@write\hyper@auxout%
         {}%
         {\string\hyperfnpage{\the\hyper@fnmark@count}{\thepage}}%
   \@esphack%
   \hb@xt@\z@{%
    \ifx\hyper@minipage@label\@empty%
      \global\edef\hyper@current@fnmark%
        {fn.\@arabic\c@footnote.%
           \expandafter%
              \ifx\csname hyper@fn@\the\hyper@fnmark@count\endcsname%
                  \relax%
              ?%
           \else%
              \csname hyper@fn@\the\hyper@fnmark@count\endcsname%
           \fi%
        }%
    \else\ifnum\hyper@minipage@label=0\relax%
      \global\edef\hyper@current@fnmark%
        {fn.\hyper@minipage@label.\@arabic\c@footnote.%
           \expandafter%
              \ifx\csname hyper@fn@\the\hyper@fnmark@count\endcsname%
                  \relax%
              ?%
           \else%
              \csname hyper@fn@\the\hyper@fnmark@count\endcsname%
           \fi%
        }%
    \else%
      \global\edef\hyper@current@fnmark%
        {fn.\hyper@minipage@label.\@arabic\c@mpfootnote.%
           \expandafter%
              \ifx\csname hyper@fn@\the\hyper@fnmark@count\endcsname%
                  \relax%
              ?%
           \else%
              \csname hyper@fn@\the\hyper@fnmark@count\endcsname%
           \fi%
        }%
   \fi\fi%
  }%
}
\def\hyperfnpage#1#2{%
  \expandafter\global\expandafter\def\csname hyper@fn@#1\endcsname{#2}%
}
\def\hyperfnpage@check#1#2{%
   \def\reserved@a{#2}%
   \expandafter\ifx\csname hyper@fn@#1\endcsname\reserved@a\else%
      \hyper@change4\relax%
   \fi%
}
\let\hyper@fn@enddocument\enddocument
\def\enddocument{%
  \let\hyperfnpage\hyperfnpage@check%
  \global\hyper@fnmark@count0\relax%
  \hyper@fn@enddocument%
}
\def\@makefnmark{%
  \hyper@currentfnmark%
  \hbox{\@textsuperscript{%
          \normalfont\hyperreference%
           {\hyper@current@fnmark}%
           {\@thefnmark}%
     }}%
}
\def\hyper@makefnmark@text{%
  \hyper@currentfnmark%
  \hbox{\@textsuperscript{%
          \normalfont\hyperanchor%
            {\hyper@current@fnmark}%
            {\@thefnmark}%
       }}%
}
%</hyper>
%    \end{macrocode}
% Unfortunately, the definition of |\@makefntext| is dependend of the
% document class we use.\par
% \noindent For |article|, |book|, |letter|, |ltnews|, |ltxdoc|, |ltxguide|,
% |proc|, |report|, and |slides| we have to use the following
% hypertext--variant.
%    \begin{macrocode}
%<*article,book,letter,ltnews,ltxdoc,ltxguide,proc,report,slides>
\let\hyper@makefntext\@makefntext%
\long\def\@makefntext#1{%
  \bgroup%
    \hyper@currentfnmark%
    \edef\@currenthyper{\hyper@current@fnmark}%
    \let\@makefnmark\hyper@makefnmark@text%
    \hyper@makefntext{#1}%
  \egroup%
}
%</article,book,letter,ltnews,ltxdoc,ltxguide,proc,report,slides>
%    \end{macrocode}
% There are also footnotes within minipages. Therefore we should handle them.
%    \begin{macrocode}
%<*hyper>
\newcount\hyper@minipage@cnt
\hyper@minipage@cnt=0
\edef\hyper@minipage@label{}
\let\hyper@minipage\minipage
\let\hyper@endminipage\endminipage
\def\minipage{%
  \bgroup%
    \global\advance\hyper@minipage@cnt1\relax%
    \edef\hyper@minipage@label{\the\hyper@minipage@cnt}%
    \hyper@minipage%
}
\def\endminipage{%
    \hyper@endminipage%
  \egroup%
}
%</hyper>
%    \end{macrocode}
% Note, that there exists only one level of minipages the footnotes
% are handled correctly by \LaTeXe. Thus we haven't to do more.\par
% \noindent Unfortunately there is another problem. The footnote--macros
% are redefined by the |\maketitle|--macro in some classes.\par
% \noindent Thus we need the following changes for the classes
% |article|, |book|, |ltxdoc|, |ltxguide|, and |report|.
%    \begin{macrocode}
%<*article,book,ltxdoc,ltxguide,report>
\if@titlepage\else
\renewcommand\maketitle{\par
  \begingroup
    \renewcommand\thefootnote{\fnsymbol{footnote}}%
    \def\@makefnmark{%
      \hyper@currentfnmark%
      \rlap{\@textsuperscript{%
        \normalfont%
        \hyperreference{\hyper@current@fnmark}%
        {\@thefnmark}%
      }}%
    }%
    \long\def\@makefntext##1{%
      \hyper@currentfnmark%
      \bgroup%
        \edef\@currenthyper{\hyper@current@fnmark}%
        \parindent 1em\noindent
        \hb@xt@1.8em{%
          \hss\@textsuperscript{%
            \normalfont%
            \hyperanchor{\hyper@current@fnmark}{\@thefnmark}
          }%
        }%
        ##1%
      \egroup%
    }%
    \if@twocolumn
      \ifnum \col@number=\@ne
        \@maketitle
      \else
        \twocolumn[\@maketitle]%
      \fi
    \else
      \newpage
      \global\@topnum\z@
      \@maketitle
    \fi
    \thispagestyle{plain}\@thanks
  \endgroup
  \setcounter{footnote}{0}%
  \let\thanks\relax
  \let\maketitle\relax\let\@maketitle\relax
  \gdef\@thanks{}\gdef\@author{}\gdef\@title{}}
\fi
%</article,book,ltxdoc,ltxguide,report>
%    \end{macrocode}
% For the class |proc| another redefinition is needed.
%    \begin{macrocode}
%<*proc>
\def\maketitle{\par
 \begingroup
   \renewcommand\thefootnote{\fnsymbol{footnote}}%
   \def\@makefnmark{%
      \hyper@currentfnmark%
      \hbox to\z@{%
      \@textsuperscript{%
        \normalfont%
        \hyperreference{\hyper@current@fnmark}%
        {\@thefnmark}%
      }%
   }}%
   \twocolumn[\@maketitle]%
   \@thanks
 \endgroup
 \setcounter{footnote}{0}%
 \let\maketitle\relax
 \let\@maketitle\relax
 \gdef\@thanks{}\gdef\@author{}\gdef\@title{}\let\thanks\relax}
%</proc>
%    \end{macrocode}
% The package |doc.sty| also modifies |\maketitle| that has a redefinition
% of |\@makefnmark| and |\@makefntext|.
%    \begin{macrocode}
%<*doc>
\def\maketitle{\par
      \begingroup \def \thefootnote {\fnsymbol {footnote}}%
      \setcounter {footnote}\z@
      \def\@makefnmark{%
        \hyper@currentfnmark%
        \hbox to\z@{%
        $\m@th^{%
          \hyperreference%
            {\hyper@current@fnmark}%
            {\@thefnmark}%
        }$\hss%
      }}%
      \long\def\@makefntext##1{%
        \hyper@currentfnmark%
        \bgroup
          \edef\@currenthyper{\hyper@current@fnmark}
          \parindent 1em\noindent
          \hbox to1.8em{%
            \hss$\m@th^{%
              \hyperanchor{\hyper@current@fnmark}{\@thefnmark}%
            }$%
          }%
          ##1%
        \egroup%
      }%
      \if@twocolumn \twocolumn [\@maketitle ]%
      \else \newpage \global \@topnum \z@ \@maketitle \fi
       \thispagestyle{titlepage}\@thanks \endgroup
      \setcounter {footnote}\z@
      \gdef\@date{\today}\gdef\@thanks{}%
      \gdef\@author{}\gdef\@title{}}
%</doc>
%    \end{macrocode}
% Shit, now we can get the same name for hyper anchors, one via maketitle and one for the following text.
% Let's pretend the titlepage being minipage 0. Note, that the definition of |\hyper@currentfnmark| given
% above tests for this. (This is necessary!) Additionally we have to modify the macro |\thanks| to get
% the correct anchors in the footnote texts.
%    \begin{macrocode}
%<*hyper>
\AtBeginDocument{%
   \let\hyper@maketitle\maketitle%
   \def\maketitle{%
     \edef\hyper@minipage@label{0}%
     \hyper@maketitle%
     \let\hyper@minipage@label\@empty%
   }%
}
\def\hyper@thanks@footnotetext#1[#2]#3{%
  \bgroup%
     \edef\hyper@current@fnmark{#1}%
     \let\hyper@currentfnmark\relax%
     \footnotetext[#2]{#3}%
  \egroup%
}
\def\thanks#1{\footnotemark%
    \expandafter\protected@xdef\expandafter\@thanks\expandafter{\expandafter\@thanks%
        \expandafter\protect%
           \expandafter\hyper@thanks@footnotetext%
              \expandafter{\hyper@current@fnmark}[\the\c@footnote]{#1}}%
}
%</hyper>
%    \end{macrocode}
% \subsection{Lists}
% Some lists have enumerated items which may be referenced to by the
% label command. Hence we have to set the corresponding anchors.
%    \begin{macrocode}
%<*hyper>
\let\hyper@item\@item
\def\@item[#1]{%
  \if@noitemarg%
    \if@nmbrlist%
      \hyper@item[\hyperanchor{\@currenthyper}{#1}]%
    \else%
      \hyper@item[{#1}]%
    \fi%
  \else%
    \hyper@item[{#1}]%
  \fi%
}
%    \end{macrocode}
%
% \subsection{Index and Glossary}
% As already has been said, we don't write the page number together with a
% reference to |.idx|-- resp.\ |.glo|--files. |makeindex| wouldn't accept
% such informations. But that means that we have to think of a way to get
% back the references after |makeindex| has generated the index resp.\
% glossary.\par
% \noindent As this stuff needs an additional package we should include it only
% if it is necessary. Thus, let us at first save it in a macro.
%    \begin{macrocode}
\def\hyper@idxglo@cmds{
%    \end{macrocode}
% \noindent For the following definition we need the |defpattern|-package.
%    \begin{macrocode}
\RequirePackage{defpattern}
%    \end{macrocode}
% Now we can define hypertext variants of the macros |\index| and
% |\glossary|.\par
% \noindent First of all we handle series of page numbers and ranges.
%    \begin{macrocode}
\def\hyper@ref@page##1{\hyperpagereference{##1}{##1}}
\defpattern\hyper@page@range[##2]{\hyper@ref@page{##2}}
\defpattern\hyper@page@range[##2--##3]{%
  \hyper@ref@page{##2}--\hyper@ref@page{##3}%
}
\defpattern\hyper@page@range[##2, ##3]{%
  \hyper@page@range[##2], \hyper@page@range[##3]%
}
%    \end{macrocode}
% Based on this we can define a macro |\hyperpage| with an optional executable
% macro as provided by the indexing system to surround a page number.
%    \begin{macrocode}
\def\hyper@page@cmd[##1]##2{##1{\hyper@page@range[##2]}}
\def\hyper@page@nocmd##1{\hyper@page@range[##1]}
\def\hyperpage{\@ifnextchar[{\hyper@page@cmd}{\hyper@page@nocmd}}
%    \end{macrocode}
% After saving the original meaning of |\index| and |\glossary|
%    \begin{macrocode}
\let\hyper@index\index
\let\hyper@glossary\glossary
%    \end{macrocode}
% we can insert the page number surrounding command for |makeindex| by
%    \begin{macrocode}
\defpattern\hyper@ig@pat[##2|##3]{##2{##3|hyperpage}}
\defpattern\hyper@ig@pat[##2|##3|##4]{%
  ##2{##3|hyperpage[\hyper@backslash##4]}%
}
\defpattern\hyper@ig@pat[##2|##3|(##4]{%
  ##2{##3|(hyperpage[\hyper@backslash##4]}%
}
\defpattern\hyper@ig@pat[##2|##3|)##4]{%
  ##2{##3|)hyperpage[\hyper@backslash##4]}%
}
\defpattern\hyper@ig@pat[##2|##3|(]{##2{##3|(hyperpage}}
\defpattern\hyper@ig@pat[##2|##3|)]{##2{##3|)hyperpage}}
%    \end{macrocode}
% and define the new |\index|-- and |\glossary|--macros as follows.
%    \begin{macrocode}
\def\hyper@ig{%
  \@bsphack\begingroup%
    \catcode`\@=12\catcode`\!=12\catcode`\|=12\catcode`\"=12\relax%
    \@sanitize\hyper@ig@%
}
\def\hyper@ig@##1##2{%
    \hyper@ig@pat[##1|##2]%
  \endgroup\@esphack%
}
\def\index{\hyper@ig\hyper@index}
\def\glossary{\hyper@ig\hyper@glossary}
%    \end{macrocode}
% We have reached the end of the macro. But as we do not call its contents
% twice we just let the macro being a no-op before.
%    \begin{macrocode}
\let\hyper@idxglo@cmds\relax
}
%    \end{macrocode}
% Now let's call the stuff whenever an index or glossary has to be generated.
%    \begin{macrocode}
\ifnum%
  \ifx\@indexfile\@undefined0\else1\fi%
  \ifx\@glossaryfile\@undefined0\else1\fi%
  >0\relax
    \hyper@idxglo@cmds
\fi
\ifx\makeindex\@empty\else
  \let\hyper@makeindex\makeindex
  \def\makeindex{\hyper@makeindex\hyper@idxglo@cmds}
\fi
\ifx\makeglossary\@empty\else
  \let\hyper@makeglossary\makeglossary
  \def\makeglossary{\hyper@makeglossary\hyper@idxglo@cmds}
\fi
%    \end{macrocode}
%
% \subsection{Theorems}
% Theorems, Lemmatas, Corollaries, Examples, etc.\ are often refered to. Hence
% they have to introduce an anchor for these references.
%    \begin{macrocode}
\let\hyper@begintheorem\@begintheorem%
\def\@begintheorem#1#2{\trivlist%
   \item[\hskip%
         \labelsep{\hyperanchor{\@currenthyper}{\bfseries #1\ #2}}%
        ]\itshape%
}
\def\@opargbegintheorem#1#2#3{\trivlist%
      \item[\hskip%
            \labelsep%
               {\hyperanchor{\@currenthyper}{\bfseries #1\ #2}\ (#3)}%
           ]\itshape%
}
%</hyper>
%    \end{macrocode}
% These definitions are changed by the theorem--package. Hence, we have to
% give hypertext definitions for them below.
%
% \subsection{Additional Patches}
% The Hyper\TeX--previewer for NeXTSTEP can't handle multiple pages with the
% same name correctly. It supposes that each link on a page number 1 is on
% the first page with the number one. This is a problem for the title page
% often having the same number as one of the following pages. Hence we patch
% the page number of the title page from 1 to -1 (if the next page also has
% number 1).
%    \begin{macrocode}
%<*article,report>
\let\hyper@titlepage\titlepage
\def\titlepage{%
  \hyper@titlepage%
  \if@compatibility%
     \global\setcounter{page}{0}%
  \else%
     \global\setcounter{page}{-1}%
  \fi%
}
%</article,report>
%    \end{macrocode}
% We have to ignore the stuff that is written to the |.aux|--file
% by the extensional packages
%    \begin{macrocode}
%<*hyper>
\def\hyperbackcite#1#2#3#4{}
%</hyper>
%    \end{macrocode}
%
% \subsection{Handling Options}
% At first let us define some macros to collect and detect mutually
% excluding options.
%    \begin{macrocode}
%<*hyper>
\def\hyper@set@option#1#2#3{%
  \ifx#1\@undefined%
    \def#1{#2}%
  \else%
    \PackageError{hyper}{#3}{}%
  \fi}
\def\set@hyper@class#1{%
  \hyper@set@option\hyper@class{#1}%
    {Only one class is allowed in option list}%
}
\def\set@hyper@do#1{%
  \hyper@set@option\hyper@do{#1}%
    {Excluding options 'yes' and 'no' in option list found}%
}
\def\set@hyper@pageanchor#1{%
  \hyper@set@option\hyper@pageanchor{#1}%
    {Excluding options 'pagenumber' and 'pagetop' in option list found}%
}
\def\set@hyper@color#1{%
  \hyper@set@option\hyper@this@color{#1}%
    {Multiple color options in option list found}%
}
\def\set@hyper@idxglo{%
  \let\hyper@idxglo\hyper@idxglo@cmds%
}
%    \end{macrocode}
% We suppose each other option given being an additional package.
% They are collected without regarding multiple occurrences.
%    \begin{macrocode}
\def\hyper@packages{}
\def\add@hyper@package#1{%
  \edef\hyper@packages{\hyper@packages(#1)}%
}
\def\hyper@extensions{}
\def\add@hyper@extension#1{%
  \edef\hyper@extensions{\hyper@extensions(#1)}%
}
%    \end{macrocode}
% Now we define the options known to distribute them between the macros
% given above.\par
% \noindent The document classes known by the package are the following.
%    \begin{macrocode}
\DeclareOption{article}{\set@hyper@class{article}}
\DeclareOption{book}{\set@hyper@class{book}}
\DeclareOption{letter}{\set@hyper@class{letter}}
\DeclareOption{ltxdoc}{\set@hyper@class{ltxdoc}}
\DeclareOption{ltxguide}{\set@hyper@class{ltxguide}}
\DeclareOption{ltnews}{\set@hyper@class{ltnews}}
\DeclareOption{proc}{\set@hyper@class{proc}}
\DeclareOption{report}{\set@hyper@class{report}}
\DeclareOption{slides}{\set@hyper@class{slides}}
\DeclareOption{amsart}{\set@hyper@class{amsart}}
\DeclareOption{amsproc}{\set@hyper@class{amsproc}}
\DeclareOption{amsbook}{\set@hyper@class{amsbook}}
\DeclareOption{amsdtx}{\set@hyper@class{amsdtx}}
\DeclareOption{amsldoc}{\set@hyper@class{amsldoc}}
\DeclareOption{cweb}{\set@hyper@class{cweb}}
%    \end{macrocode}
% There are two options determining whether we want to insert the
% hypertext--marks into the dvi--file.
%    \begin{macrocode}
\DeclareOption{yes}{\set@hyper@do{\hyper}}
\DeclareOption{no}{\set@hyper@do{\nohyper}}
%    \end{macrocode}
% We should not forget that we have an optional behaviour for fixing the bounding box
% of a hyper reference. So we have to introduce and handle an option for it.
%    \begin{macrocode}
\DeclareOption{fixhyperbox}{%
  \AtBeginDocument{%
     \let\hyper@unnested@special@reference\hyper@unnested@special@reference@fix%
     \let\hyper@unnested@special@anchor\hyper@unnested@special@anchor@fix%
  }%
}
% In the subsection ``Colored Anchors/References'' we have introduced
% three variants of colors the anchors resp.\ references may be printed in.
%    \begin{macrocode}
\DeclareOption{color}{\set@hyper@color{\hyper@color}}
\DeclareOption{gray}{\set@hyper@color{\hyper@gray}}
\DeclareOption{black}{\set@hyper@color{\hyper@black}}
%    \end{macrocode}
% We additionally have to choose whether a hyperlink to a page always
% jumps to the page number or to the top of the page.
%    \begin{macrocode}
\DeclareOption{pagenumber}{\set@hyper@pageanchor{\hyper@modifyheadfoot@pagebottom}}
\DeclareOption{pagetop}{\set@hyper@pageanchor{\hyper@modifyheadfoot@pagetop}}
%    \end{macrocode}
% If the user want to have the index and glossary commands,
% e.g.\ when including an index or glossary
% without using |\makeindex| respectively |\makeglossary| he may
% give the option |indexcmds|.
%    \begin{macrocode}
\DeclareOption{indexcmds}{\set@hyper@idxglo}
%    \end{macrocode}
% Additionally we have to pass the options for the extensional packages
%    \begin{macrocode}
\DeclareOption{backcitepages}{%
  \PassOptionsToPackage{pages}{hxt-bc}%
  \add@hyper@extension{hxt-bc}%
}
\DeclareOption{backcitesections}{%
  \PassOptionsToPackage{sections}{hxt-bc}%
  \add@hyper@extension{hxt-bc}%
}
%    \end{macrocode}
% All other options to be given are considered as packages.
%    \begin{macrocode}
\DeclareOption*{\add@hyper@package{\CurrentOption}}
%    \end{macrocode}
% Now let's collect the options given.
%    \begin{macrocode}
\ProcessOptions
%    \end{macrocode}
% So far now we know the options the user has send to us.\par
% \noindent If no option determining a document class has been given we should
% try to determine which class the document is of.
%    \begin{macrocode}
\ifx\hyper@class\@undefined
  \@ifclassloaded{slides}{\def\hyper@class{slides}}{}
  \@ifclassloaded{report}{\def\hyper@class{report}}{}
  \@ifclassloaded{letter}{\def\hyper@class{letter}}{}
  \@ifclassloaded{book}{\def\hyper@class{book}}{}
  \@ifclassloaded{article}{\def\hyper@class{article}}{}
  \@ifclassloaded{proc}{\def\hyper@class{proc}}{}
  \@ifclassloaded{ltnews}{\def\hyper@class{ltnews}}{}
  \@ifclassloaded{ltxguide}{\def\hyper@class{ltxguide}}{}
  \@ifclassloaded{ltxdoc}{\def\hyper@class{ltxdoc}}{}
  \@ifclassloaded{amsart}{\def\hyper@class{amsart}}{}
  \@ifclassloaded{amsproc}{\def\hyper@class{amsproc}}{}
  \@ifclassloaded{amsbook}{\def\hyper@class{amsbook}}{}
  \@ifclassloaded{amsdtx}{\def\hyper@class{amsdtx}}{}
  \@ifclassloaded{amsldoc}{\def\hyper@class{amsldoc}}{}
  \@ifclassloaded{cweb}{\def\hyper@class{cweb}}{}
\fi
%    \end{macrocode}
% If there is a document class load the corresponding |.hyp|--file
% otherwise give an error message.
%    \begin{macrocode}
\ifx\hyper@class\@undefined
  \PackageError{hyper}{Document class can't be determined.\MessageBreak
              Please add one to the option list%
             }{}
\else
  \InputIfFileExists{\hyper@class.hyp}{}%
    {\PackageError{hyper}{\hyper@class.hyp not found.\MessageBreak
                 Please reinstall the complete package%
                }{}%
    }%
\fi
%    \end{macrocode}
% If we explicitely want to have the commands for index and glossary
% we have to introduce them by calling the macro holding the stuff.
% Note, that the macro is a nop when the stuff already has been added.
%    \begin{macrocode}
\ifx\hyper@idxglo\@undefined\else
  \hyper@idxglo@cmds
\fi
%    \end{macrocode}
% If we want to print the anchors resp.\ references in colors we have to
% load the |color|-package and defined the appropriate macros.
%    \begin{macrocode}
\ifx\hyper@this@color\@undefined
\else
  \expandafter\ifx\hyper@this@color\hyper@gray
    \RequirePackage{color}
  \else\expandafter\ifx\hyper@this@color\hyper@color
    \RequirePackage{color}
  \else\expandafter\ifx\hyper@this@color\hyper@black
  \else
    \PackageError{hyper}{Implementation error:\MessageBreak
                Case for reference/anchor color definition not defined}{}
  \fi\fi\fi
  \hyper@this@color
\fi
%    \end{macrocode}
% Afterwards we have to load modifications.\par
% \noindent At first we just handle the document class option |leqno|
% if it can be found in the option list.
%    \begin{macrocode}
\@ifclasswith\hyper@class{leqno}%
  {\InputIfFileExists{leqno.hyp}{}%
     {\PackageError{hyper}{leqno.hyp not found.\MessageBreak
                  Please reinstall the complete package}{}%
     }%
  }%
  {}
%    \end{macrocode}
% We may have to handle some known packages, i.e.\ we need to load
% some modifications for them.\par
% \noindent As there is a common way to do this let us first define
% a generic macro.
%    \begin{macrocode}
\def\hyper@loadpackage#1{%
  \@ifpackageloaded{#1}%
    {\InputIfFileExists{#1.hyp}%
       {\expandafter\edef\csname hyper@loaded@#1\endcsname{#1.hyp}}%
       {\PackageError{hyper}{#1.hyp not found.\MessageBreak
                    Please reinstall the complete package}{}%
       }%
    }%
    {}
}
%    \end{macrocode}
% Now we can call this macro for each package known.
%    \begin{macrocode}
\hyper@loadpackage{amsmath}
\hyper@loadpackage{amstex}
\hyper@loadpackage{amsthm}
\hyper@loadpackage{doc}
\hyper@loadpackage{fancyheadings}
\hyper@loadpackage{ftnright}
\hyper@loadpackage{harvard}
\hyper@loadpackage{longtable}
\hyper@loadpackage{natbib}
\hyper@loadpackage{subeqnarray}
\hyper@loadpackage{theorem}
\hyper@loadpackage{upref}
\hyper@loadpackage{xr}
%    \end{macrocode}
% Afterwards we add each package the user has told us to do.
%    \begin{macrocode}
\def\@hyper@load@pkg(#1){%
  \expandafter\ifx\csname hyper@loaded@#1\endcsname\relax%
    \IfFileExists{#1.hyp}%
      {\IfFileExists{#1.sty}{\RequirePackage{#1}}{}%
       \input{#1.hyp}%
       \expandafter\edef\csname hyper@loaded@#1\endcsname{#1.hyp}%
      }%
      {\PackageError{hyper}{Modification file #1.hyp not found}{}}%
  \fi%
  \hyper@loadpackage%
}
\def\hyper@loadpackage{\@ifnextchar({\@hyper@load@pkg}{}}
\expandafter\hyper@loadpackage\hyper@packages\relax
%    \end{macrocode}
% Additionally, we have to load some extensions of the hyper package.
%    \begin{macrocode}
\def\@hyper@load@ext(#1){%
  \expandafter\ifx\csname hyper@loaded@ext@#1\endcsname\relax%
    \IfFileExists{#1.sty}%
      {\RequirePackage{#1}%
       \expandafter\edef\csname hyper@loaded@ext@#1\endcsname{#1.sty}%
      }%
      {\PackageError{hyper}{Extension file #1.sty not found}{}}%
  \fi%
  \hyper@loadpackage%
}
\def\hyper@load@extension{\@ifnextchar({\@hyper@load@ext}{}}
\expandafter\hyper@load@extension\hyper@extensions\relax
%    \end{macrocode}
% Now we have to activate the (nondefault) decision for placing the anchors on pages (top of page or pagenumber)
%    \begin{macrocode}
\ifx\hyper@pageanchor\@undefined
\else
  \expandafter\let\expandafter\hyper@modifyheadfoot\hyper@pageanchor
\fi
%    \end{macrocode}
% Last but not least we have to decide whether we really want the
% hypertext--marks being inserted into the dvi--file.
%    \begin{macrocode}
\ifx\hyper@do\@undefined\else\hyper@do\fi
%</hyper>
%    \end{macrocode}
%
% \subsection{Compatibility with Ordinary \LaTeX}
% The package redefines the notion of a label. Thus, to be able to add the
% package to an exising \LaTeX-file without having trouble with an existing
% |.aux|-file we have to be able to handle the old as well as the new definition:
%    \begin{macrocode}
%<*hyper>
\def\hyper@end@newlabel{\relax}
\let\hyper@orig@newlabel\newlabel
\def\hyper@newlabel#1#2#3#4#5{%
   \ifx|#4|%
      \hyper@orig@newlabel{#1}{{}{}{#2}{#3}}%
   \else%
      \hyper@orig@newlabel{#1}{{#2}{#3}{#4}{#5}}%
   \fi%
}
\def\newlabel#1#2{\hyper@newlabel{#1}#2\hyper@end@newlabel\hyper@end@newlabel}
%    \end{macrocode}
%
% The package leaves traces for intermediate informations in several auxiliary files.
% To be able to remove the package without deleting these auxiliary files, certain
% definitions have to remain to exist. The following code ensures, that these definitions
% are availlable, by adding them to the subsequently generated |.aux|-files.
%    \begin{macrocode}
\begingroup
  \catcode`\<=\catcode`\{
  \catcode`\>=\catcode`\}
  \catcode`\{=12\catcode`\}=12
  \catcode`\%=12
  \gdef\hyper@open<{>
  \gdef\hyper@close<}>
  \gdef\hyper@comment<%>
\endgroup
\def\hyper@nl{^^J}%
\long\def\hyper@protected@write#1{%
   \begingroup%
      \let\thepage\relax%
      \let\protect\@unexpandable@protect%
      \edef\reserved@a{\immediate\write\@auxout{#1}}%
      \reserved@a%
   \endgroup%
   \if@nobreak\ifvmode\nobreak\fi\fi%
}
\gdef\hyper@aux@write{
   \hyper@protected@write{\hyper@comment@potential%
      \string\ifx\string\newhyper\string\@undefined%
   }
   \hyper@protected@write{\hyper@comment@potential%
      \string\gdef\string\newhyper\hyper@hash1\hyper@hash2{}\hyper@nl
      \string\gdef\string\hyperfnpage\hyper@hash1\hyper@hash2{}\hyper@nl
      \string\global\string\let\string\@hyper@newlabel\string\newlabel\hyper@nl
      \string\gdef\string\hyper@end@newlabel{\string\relax}\hyper@nl
      \string\gdef\string\hyper@newlabel\hyper@hash1\hyper@hash2\hyper@hash3\hyper@hash4\hyper@hash5%
                      {\hyper@comment@potential%
        \string\ifx\string|\hyper@hash4\string|\string\hyper@end@newlabel\hyper@comment@potential%
          \string\@hyper@newlabel{\hyper@hash1}{{\hyper@hash2}{\hyper@hash3}}%
                      \hyper@comment@potential%
        \string\else\hyper@comment@potential%
          \string\@hyper@newlabel{\hyper@hash1}{{\hyper@hash4}{\hyper@hash5}}%
                      \hyper@comment@potential%
        \string\fi\hyper@comment@potential%
      }\hyper@nl
      \string\gdef\string\newlabel\hyper@hash1\hyper@hash2%
                      {\string\hyper@newlabel{\hyper@hash1}\hyper@hash2%
                      \string\hyper@end@newlabel\string\hyper@end@newlabel}\hyper@nl
      \string\gdef\string\@@hyperpage[\hyper@hash1]{\hyper@hash1}\hyper@nl
      \string\gdef\string\@hyperpage\hyper@hash1{\hyper@hash1}\hyper@nl
      \string\gdef\string\hyperpage%
                      {\string\@ifnextchar[\string\@@hyperpage\string\@hyperpage}\hyper@nl
      \string\global\string\let\string\fragilehyperreference\string\@gobble\hyper@nl
      \string\global\string\let\string\fragilehyperpagereference\string\@gobble\hyper@nl
      \string\global\string\let\string\fragilehyperanchor\string\@gobble\hyper@nl
      \string\global\string\let\string\fragileblindhyperanchor\string\@gobble\hyper@nl
      \string\global\string\let\string\fragilehyperURL\string\@gobble\hyper@nl
      \string\gdef\string\hyperbackcite\hyper@hash1\hyper@hash2\hyper@hash3\hyper@hash4%
                      {}\hyper@nl
      \string\global\string\let\string\hyper@setref\string\@setref\hyper@nl
      \string\gdef\string\hyper@thirdoffour\hyper@hash1\hyper@hash2\hyper@hash3%
                      {\hyper@hash2}\hyper@nl
      \string\gdef\string\hyper@forthoffour\hyper@hash1\hyper@hash2\hyper@hash3%
                      {\hyper@hash3}\hyper@nl
      \string\gdef\string\hyper@end@forthoffour{\string\relax}\hyper@nl
      \string\gdef\string\@setref\hyper@hash1{\hyper@comment@real\hyper@nl
        \string\ifx\hyper@hash1\string\relax\hyper@comment@real\hyper@nl
           \string\def\string\hyper@next{\string\hyper@setref{\hyper@hash1}}%
                      \hyper@comment@real\hyper@nl
        \string\else\hyper@comment@real\hyper@nl
          \string\edef\string\hyper@tmp%
                      {\string\expandafter\string\hyper@forthoffour\hyper@hash1%
                      \string\hyper@end@forthoffour}\hyper@comment@real\hyper@nl
          \string\ifx\string\hyper@tmp\string\hyper@end@forthoffour%
                      \hyper@comment@real\hyper@nl
             \string\def\string\hyper@next{\string\hyper@setref{\hyper@hash1}}%
                      \hyper@comment@real\hyper@nl
          \string\else\hyper@comment@real\hyper@nl
             \string\edef\string\hyper@tmp%
                      {{\string\expandafter\string\hyper@thirdoffour\hyper@hash1}%
                      {\string\expandafter\string\hyper@forthoffour\hyper@hash1}}%
                      \hyper@comment@real\hyper@nl
             \string\def\string\hyper@next{\string\hyper@setref{\string\hyper@tmp}}%
                      \hyper@comment@real\hyper@nl
          \string\fi\hyper@comment@real\hyper@nl
        \string\fi\hyper@comment@real\hyper@nl
        \string\hyper@next\hyper@comment@real\hyper@nl
      }
   }
   \hyper@protected@write{\hyper@comment@potential%
      \string\begingroup\hyper@nl
         \string\catcode\string`\string\<\string=\string\catcode\string`\string\{\hyper@nl
         \string\catcode\string`\string\>\string=\string\catcode\string`\string\}\hyper@nl
         \string\catcode\string`\string\{\string=12%
         \string\catcode\string`\string\}\string=12\hyper@nl
         \string\catcode\string`\string\%\string=12\hyper@nl
         \string\gdef\string\hyper@open<{>\hyper@nl
         \string\gdef\string\hyper@close<}>\hyper@nl
         \string\gdef\string\hyper@comment<\hyper@comment@real>\hyper@nl
      \string\endgroup
   }
   \hyper@protected@write{\hyper@comment@potential%
      \string\bgroup\hyper@nl
         \string\global\string\edef\string\hyper@hash{\string\string\hyper@hash}\hyper@nl
      \string\egroup
   }
   \hyper@protected@write{\hyper@comment@potential%
      \string\gdef\string\hyper@nl{\string^\string^J}
   }
   \hyper@protected@write{\hyper@comment@potential%
      \string\def\string\hyper@hash@four{\string\hyper@hash\string\hyper@hash%
                      \string\hyper@hash\string\hyper@hash}
   }
   \hyper@protected@write{\hyper@comment@potential%
      \string\global\string\long\string\def\string\hyper@protected@write\hyper@hash1%
                      {\hyper@nl
         \string\begingroup\hyper@nl
            \string\let\string\thepage\string\relax\hyper@nl
            \string\let\string\protect\string\@unexpandable@protect\hyper@nl
            \string\edef\string\reserved@a{\string\immediate\string\write\string\@auxout%
                      {\hyper@hash1}}\hyper@nl
            \string\reserved@a\hyper@nl
         \string\endgroup\hyper@nl
      \string\if@nobreak\string\ifvmode\string\nobreak\string\fi\string\fi\hyper@nl
      }
   }
   \hyper@protected@write{\hyper@comment@potential%
      \string\gdef\string\hyper@aux@write\hyper@open
   }%
   \hyper@second@write{\hyper@comment@potential%
      \string\hyper@write\hyper@open\hyper@nl
         \string\begingroup\hyper@nl
            \string\let\string\@hyper@protected@write\string\hyper@protected@write\hyper@nl
            \string\def\string\hyper@protected@write@do\hyper@hash\hyper@hash1%
                      \hyper@hash\hyper@hash2{\hyper@nl
               \string\begingroup\hyper@nl
                  \string\let\string\hyper@string\string\string\hyper@nl
                  \string\def\string\string%
                      {\string\hyper@string\string\string\string\hyper@string}\hyper@nl
                  \string\def\string\hyper@open%
                      {\string\hyper@string\string\hyper@open}\hyper@nl
                  \string\def\string\hyper@close%
                      {\string\hyper@string\string\hyper@close}\hyper@nl
                  \string\def\string\hyper@nl%
                      {\string\hyper@string\string\hyper@nl\string^\string^J}\hyper@nl
                  \string\def\string\hyper@comment@real%
                      {\string\hyper@string\string\hyper@comment@real}\hyper@nl
                  \string\def\string\hyper@comment@potential%
                      {\string\hyper@string\string\hyper@comment@potential%
                      \string\hyper@comment\string^\string^J}\hyper@nl
                  \string\def\string\hyper@hash%
                      {\string\hyper@string\string\hyper@hash}\hyper@nl
                  \string\@hyper@protected@write%
                      {\string\hyper@string\hyper@hash\hyper@hash1%
                      {\hyper@hash\hyper@hash2\string^\string^J}}\hyper@nl
               \string\endgroup\hyper@nl
            }\hyper@nl
            \string\def\string\hyper@protected@write%
                      {\string\hyper@protected@write@do\string\hyper@protected@write}%
                      \hyper@nl
            \string\def\string\hyper@second@write\hyper@hash\hyper@hash1{\hyper@nl
               \string\hyper@protected@write@do\string\hyper@second@write%
                      {\hyper@hash\hyper@hash1}\hyper@nl
               \string\@hyper@protected@write{\hyper@hash\hyper@hash1}\hyper@nl
            }\hyper@nl
            \string\def\string\hyper@write{\string\@gobble}\hyper@nl
            \string\hyper@aux@write\hyper@nl
         \string\endgroup\hyper@nl
      \hyper@close
   }
   \hyper@write{
      \begingroup
         \let\@hyper@protected@write\hyper@protected@write
         \def\hyper@protected@write@do##1##2{
            \begingroup
               \let\hyper@string\string
               \def\string{\hyper@string\string\hyper@string}
               \def\hyper@open{\hyper@string\hyper@open}
               \def\hyper@close{\hyper@string\hyper@close}
               \def\hyper@nl{\hyper@string\hyper@nl^^J}
               \def\hyper@comment@real{\hyper@string\hyper@comment@real}
               \def\hyper@comment@potential%
                      {\hyper@string\hyper@comment@potential\hyper@comment^^J}
               \def\hyper@hash{\hyper@string\hyper@hash}
               \@hyper@protected@write{\hyper@string##1{##2^^J}}
            \endgroup
         }
         \def\hyper@protected@write{\hyper@protected@write@do\hyper@protected@write}
         \def\hyper@second@write##1{
            \hyper@protected@write@do\hyper@second@write{##1}
            \@hyper@protected@write{##1}
         }
         \def\hyper@write{\@gobble}
         \hyper@aux@write
      \endgroup
   }
   \hyper@protected@write{\hyper@comment@potential%
      \hyper@close
   }
   \hyper@protected@write{\hyper@comment@potential%
      \string\AtBeginDocument{\hyper@comment@real\hyper@nl%
         \string\let\string\hyper@write\string\relax%
                      \hyper@comment@real\hyper@nl%
         \string\let\string\hyper@second@write\string\@gobble%
                      \hyper@comment@real\hyper@nl%
         \string\let\string\hyper@comment@potential\string\@empty%
                      \hyper@comment@real\hyper@nl%
         \string\let\string\hyper@comment@real\string\hyper@comment%
                      \hyper@comment@real\hyper@nl%
         \string\hyper@aux@write\hyper@comment@real\hyper@nl%
      }
   }
   \hyper@protected@write{\hyper@comment@potential%
      \string\fi
   }
 \relax
}
\AtBeginDocument{%
   \let\hyper@write\relax%
   \let\hyper@second@write\@gobble%
   \let\hyper@comment@potential\@empty%
   \let\hyper@comment@real\hyper@comment%
   \hyper@aux@write%
}
%</hyper>
%    \end{macrocode}
%
% \clearpage
%
% \section{Supported Packages}
%
% \subsection{\amslatex}
% \subsubsection{The Classes}
% First of all let us modify the \amslatex--classes.\par
% \noindent We change |amsart.cls|, |amsproc.cls|, and |amsbook.cls|
% in the following way.
%    \begin{macrocode}
%<*amsart,amsproc,amsbook>
\let\hyper@makecaption\@makecaption
\def\@makecaption#1#2{%
  \hyper@makecaption{\hyperanchor{\@currenthyper}{#1}}{#2}%
}
\def\@makefnmark{%
  \hyper@currentfnmark%
  \hbox{%
      \@textsuperscript{%
        \normalfont%
        \hyperreference{\hyper@current@fnmark}%
        {\@thefnmark}%
      }%
    }%
}
\long\def\@makefntext#1{\indent%
  \hyper@currentfnmark%
  \bgroup%
    \edef\@currenthyper{\hyper@current@fnmark}%
    \parindent 1em\noindent
    \hbox{%
      \hss\@textsuperscript{%
        \normalfont%
        \hyperanchor{\hyper@current@fnmark}{\@thefnmark}%
      }%
    }%
    #1
  \egroup%
}
\let\hyper@tocwriteb\@tocwriteb
\def\hyper@tocwriteb@def[#1]{%
    \def\@tocwriteb##1##2##3{%
       \hyper@tocwriteb{##1}{##2}{#1}%
       \let\@tocwriteb\hyper@tocwriteb%
    }%
}
\def\@sect#1#2#3#4#5#6[#7]#8{%
  \ifnum#2>\c@secnumdepth%
    \hyper@setcurrent%
  \else%
    \refstepcounter{#1}%
    \ignore@next@refstepcounter%
  \fi%
  \hyper@settype{#1}%
  \global\let\@currenthyper\@currenthyper%
  \global\let\@currenthypertype\@currenthypertype%
  \ifnum#2>\@m\else%
    \callwithexpandedhyperref{\hyper@tocwriteb@def}{#8}%
  \fi%
  \callwithexpandedhyperref%
    {\hyper@sect{#1}{#2}{#3}{#4}{#5}{#6}}%
    {#7}%
    {\hyperanchor{\@currenthyper}{#8}}%
}
%</amsart,amsproc,amsbook>
%    \end{macrocode}
% For |amsbook.cls| we need some additional modifications for parts and chapters.
%    \begin{macrocode}
%<*amsbook>
\let\hyper@chapter\@chapter
\def\@chapter[#1]#2{%
  \refstepcounter{chapter}%
  \ignore@next@refstepcounter%
  \hyper@settype{chapter}%
  \global\let\@currenthyper\@currenthyper%
  \global\let\@currenthypertype\@currenthypertype%
  \callwithexpandedhyperref{\hyper@tocwriteb@def}{#2}%
  \hyper@chapter[#1]{\hyperanchor{\@currenthyper}{#2}}%
}
\let\hyper@chaptermark\chaptermark
\def\hyper@chaptermark@def[#1]{%
    \def\chaptermark##1{%
       \hyper@chaptermark{#1}%
       \let\chaptermark\hyper@chaptermark%
    }%
}
\let\hyper@schapter\@schapter
\def\@schapter#1{%
  \hyper@setcurrent%
  \hyper@settype{chapter}%
  \global\let\@currenthyper\@currenthyper%
  \global\let\@currenthypertype\@currenthypertype%
  \callwithexpandedhyperref{\hyper@tocwriteb@def}{#1}%
  \callwithexpandedhyperref{\hyper@chaptermark@def}{#1}%
  \hyper@schapter{\hyperanchor{\@currenthyper}{#1}}%
}
\let\hyper@part\@part
\def\@part[#1]#2{%
  \ifnum\c@secnumdepth>-2\relax%
    \refstepcounter{part}%
    \ignore@next@refstepcounter%
  \else%
    \hyper@setcurrent%
  \fi%
  \hyper@settype{part}%
  \global\let\@currenthyper\@currenthyper%
  \global\let\@currenthypertype\@currenthypertype%
  \callwithexpandedhyperref%
    {\hyper@part}%
    {#1}%
    {\hyperanchor{\@currenthyper}{#2}}%
}
\def\hyper@add@part[#1]{%
  \addcontentsline{toc}{part}{\protect\noindent#1}%
}
\def\@spart#1{%
  \hyper@setcurrent%
  \hyper@settype{part}%
  \global\let\@currenthyper\@currenthyper%
  \global\let\@currenthypertype\@currenthypertype%
  \callwithexpandedhyperref{\hyper@add@part}{#1}%
  \begingroup\centering
  \fontsize{\@xxpt}{25}\bfseries
     \hyperanchor{\@currenthyper}{#1}%
     \vfil\vfil\endgroup \newpage\thispagestyle{empty}}
%</amsbook>
%    \end{macrocode}
% |amsdtx.cls| has to be modified as follows.
%    \begin{macrocode}
%<*amsdtx>
\input{book.hyp}
\renewcommand\maketitle{\par
  \begingroup
    \renewcommand\thefootnote{\fnsymbol{footnote}}%
    \def\@makefnmark{%
      \hyper@currentfnmark%
      \hbox to\z@{%
      \@textsuperscript{%
        \normalfont%
        \hyperreference%
          {\hyper@current@fnmark}%
          {\@thefnmark}%
      }%
    }}%
    \long\def\@makefntext##1{%
      \hyper@currentfnmark%
      \bgroup%
        \edef\@currenthyper{\hyper@current@fnmark}%
        \parindent 1em%
        \noindent%
        \hbox to1.8em%
          {\hss$\m@th^{%
            \hyperanchor{\hyper@current@fnmark}{\@thefnmark}%
          }$}##1%
       \egroup%
    }%
    \if@twocolumn
      \ifnum \col@number=\@ne
        \@maketitle
      \else
        \twocolumn[\@maketitle]%
      \fi
    \else
      \newpage
      \global\@topnum\z@
      \@maketitle
    \fi
    \thispagestyle{plain}\@thanks
  \endgroup
  \setcounter{footnote}{0}%
  \let\thanks\relax
  \let\maketitle\relax\let\@maketitle\relax
  \gdef\@thanks{}\gdef\@author{}\gdef\@title{}}
%</amsdtx>
%    \end{macrocode}
% For |amsldoc.cls| we need the following changes.
%    \begin{macrocode}
%<*amsldoc>
\input{book.hyp}
\let\hyper@theindex@ams\theindex%fetch modified index from book.hyp
\def\theindex{%
  \hyper@theindex@ams%
  \let\autoindex\@gobble%
}
%</amsldoc>
%    \end{macrocode}
% \subsubsection{The Packages}
% To add the hypertext--capability to |amsmath| respectively |amstex|
% some macros of them have to be modified.\par
% \noindent As we have redefined |\@eqnnum| and we need another
% definition for |amsmath| and |amstex| let us set the macro to its
% default.
%    \begin{macrocode}
%<*amsmath,amstex>
\iftagsleft@
  \def\@eqnnum{\hbox to1sp{}\rlap{\normalfont\normalcolor
    \hskip -\displaywidth\tagform@\theequation}}
\else
  \def\@eqnnum{{\normalfont\normalcolor \tagform@\theequation}}
\fi
%</amsmath,amstex>
%    \end{macrocode}
% |amsmath| temporary redefines |\label| but needs the original definition
% that is hold in |\ltx@label|.
%    \begin{macrocode}
%<*amsmath>
\let\ltx@label\label
%</amsmath>
%    \end{macrocode}
% Now let us define a blind anchor for referencing a couple of equations
% bound together.
%    \begin{macrocode}
%<*amsmath,amstex>
\let\hyper@subequations\subequations
\def\subequations{%
  \hyper@setcurrent%
  \hyper@settype{equation}%
  \blindhyperanchor{\@currenthyper}%
  \hyper@subequations%
}
%    \end{macrocode}
% To allow the references pointing to an equation number we have to define an
% appropriate anchor.
%    \begin{macrocode}
\let\hyper@tagform@\tagform@
\def\tagform@#1{%
  \maketag@@@{\hyperanchor{\@currenthyper}{(\ignorespaces#1\unskip)}}%
}
%</amsmath,amstex>
%    \end{macrocode}
% For user defined tags it is necessary to generate a new hypertext number
% in |amsmath|.
%    \begin{macrocode}
%<*amsmath>
\let\hyper@make@display@tag\make@display@tag
\def\make@display@tag{%
  \if@eqnsw\else\iftag@%
    \hyper@setcurrent%
    \hyper@settype{equation}%
  \fi\fi%
  \hyper@make@display@tag%
}
%</amsmath>
%    \end{macrocode}
% For |amstex| a similar result cannot be provided with an as simple changing.
% This is due to |\@seteqlabel| being called when introducing a new tag.
% Supposing |\@seteqlabel| defining the correct |\@currenthyper| we therefore
% have to modify |\make@df@tag| as follows.
%    \begin{macrocode}
%<*amstex>
\def\make@df@tag@@@#1{%
  \@seteqlabel{#1}%
  \global\let\ams@currenthyper\@currenthyper%
  \gdef\df@tag{\let\@currenthyper\ams@currenthyper\tagform@{#1}}%
}
%    \end{macrocode}
% Now we just have to ensure |\@seteqlabel| defining the correct
% |\@currenthyper|.
%    \begin{macrocode}
\def\@seteqlabel#1{%
  \toks@\@xp{\p@equation{#1}}%
  \hyper@setcurrent%
  \hyper@settype{equation}%
  \edef\@currenthyper{\@currenthyper.\the\toks@}%
  \edef\@currentlabel{\the\toks@}%
}
%</amstex>
%    \end{macrocode}
% We should not use an anchor when using |\eqref|
%    \begin{macrocode}
%<*amsmath,amstex>
\def\eqref#1{\textup{\hyper@tagform@{\ref{#1}}}}
%</amsmath,amstex>
%    \end{macrocode}
% Damned |amstex| redefines the macro |\label|. We have to ensure that the 
% correct stuff is written into the |.aux|-file when this macro is called.
%    \begin{macrocode}
%<*amstex>
\def\hyperlabel#1{%
   \@bsphack%
       \iffirstchoice@\if@filesw%
          {\let\thepage\relax%
           \def\protect{\noexpand\noexpand\noexpand}%
           \xdef\@gtempa{%
              \write\@auxout{%
                 \string\newlabel{#1}{{\@currenthypertype}{\@currenthyper}{\@currentlabel}{\thepage}}%
              }%
           }%
          }%
          \@gtempa%
          \if@nobreak\ifvmode\nobreak\fi\fi%
       \fi\fi%
   \@esphack%
}
\let\label\hyperlabel
%</amstex>
%    \end{macrocode}
% To get hypertext references to theorems, lemmas, etc.\ |amsthm| has to
% be modified.
%    \begin{macrocode}
%<*amsthm>
\let\@begintheorem\hyper@begintheorem
\def\thmhead@plain#1#2#3{%
  \hyperanchor{\@currenthyper}{\thmname{#1}\thmnumber{ #2}}%
  \thmnote{ {\the\thm@notefont(#3)}}%
}
\let\thmhead\thmhead@plain
\def\swappedhead#1#2#3{%
  \hyperanchor{\@currenthyper}{\thmnumber{#2}\thmname{. #1}}%
  \thmnote{ {\the\thm@notefont(#3)}}%
}
%</amsthm>
%    \end{macrocode}
% For |upref| working correct it is sufficient to modify |\hyper@setref|.
%    \begin{macrocode}
%<*upref>
\def\hyper@setref#1#2#3#4{%
  \ifx#1\relax%
     \protect\G@refundefinedtrue%
     #4\nfss@text{\reset@font\bfseries ??}%
     \@latex@warning{Reference `#3' on page \thepage \space undefined}%
  \else%
    \edef\hyper@tmp{\expandafter\hyper@secondoffour#1}%
    \ifx\hyper@tmp\@empty%
       \ifx#2\hyper@secondoffour%
          #4\null%
        \else\ifx#2\hyper@thirdoffour%
          #4\protect\textup{\expandafter#2#1\hbox{}}\null%
        \else%
          #4\protect\textup{\expandafter#2#1\hbox{}}\null%
        \fi\fi%
    \else%
       \ifx#2\hyper@secondoffour%
          \hyperreference{\expandafter\hyper@secondoffour#1}{#4}\null%
        \else\ifx#2\hyper@thirdoffour%
          \hyperreference%
            {\expandafter\hyper@secondoffour#1}%
            {#4\protect\textup{\expandafter#2#1\hbox{}}}\null%
        \else%
          \hyperpagereference%
            {\expandafter\hyper@forthoffour#1}%
            {#4\protect\textup{\expandafter#2#1\hbox{}}}\null%
        \fi\fi%
    \fi%
  \fi%
}
%</upref>
%    \end{macrocode}
%
% \subsection{Cross References between Documents}
% The package |xr| adds the capability of generating cross--references
% between different \LaTeXe--documents. It is a nice feature to support
% this by hypertext links. Thus we have to modify |xr| appropriately.\par
% \noindent At first let us provide an additional parameter to |\externaldocument|
% giving the URL--address of the document we use references to. It has to
% be given with surrounding |(||)|. The default value is given by
% |documentname.dvi|.
%    \begin{macrocode}
%<*xr>
\def\externaldocument{%
  \@ifnextchar(%
    {\hyper@externaldocument}%
    {\hyper@externaldocument()}%
}
\def\hyper@externaldocument(#1){%
  \@ifnextchar[%
    {\hyper@@externaldocument(#1)}%
    {\hyper@@externaldocument(#1)[]}%
}
\def\hyper@@externaldocument(#1)[#2]#3{%
  \def\hyper@XR@docprefix{#1}%
  \ifx\hyper@XR@docprefix\@empty%
    \def\hyper@XR@docprefix{#3.dvi}%
  \fi%
  \XR@[#2]{#3}%
}
%    \end{macrocode}
% Now we have to modify the anchors we refer to from their local definition
% in the documents |.aux|--file to its external URL--definitions.
%    \begin{macrocode}
\def\hyper@xr@end@newlabel{\relax}
\def\hyper@xr@newlabel#1#2#3#4#5{%
   \ifx#4\hyper@xr@end@newlabel%
      \newlabel%
         {\XR@prefix#1}%
         {{}%
          {}%
          {#2}%
          {[file:\hyper@XR@docprefix][#3]}%
         }%
   \else%
      \newlabel%
         {\XR@prefix#1}%
         {{#2}%
          {[file:\hyper@XR@docprefix][#3]}%
          {#4}%
          {[file:\hyper@XR@docprefix][#5]}%
         }%
   \fi
}
\long\def\XR@test#1#2#3#4\XR@{%
  \ifx#1\newlabel%
    \expandafter\hyper@xr@newlabel{#2}#3\hyper@xr@end@newlabel\hyper@xr@end@newlabel%
  \else\ifx#1\newhyper%
     \newhyper{\XR@prefix#2}{#3}%
  \else\ifx#1\@input%
     \edef\XR@list{\XR@list#2\relax}%
  \fi\fi\fi%
  \ifeof%
    \@inputcheck\expandafter\XR@aux%
  \else%
    \expandafter\XR@read%
  \fi%
}
%</xr>
%    \end{macrocode}
%
% \subsection{Fancy Headings}
% The package |fancyheadings| uses a different way to express headings. This gives us trouble on
% pages with an ``empty'' page style via the (default) settings for headers and footers using
% the macro |\fancyplain|. To get the page number if all the parts for the heads and foots are empty
% demands a fairly complicated mechanism to implement if we want to refer to the page number as we
% do have to detect whether we really have a page number on the page. For sake of simplicity of
% processing we assume that any time there is a non-empty text for the head or the foot there also
% is a page number printed in either the head or the foot.
%    \begin{macrocode}
%<*fancyheadings>
\def\hyper@fancy@oddhead{\@fancyhead\@lodd\@olhead\@ochead\@orhead\@rodd}
\def\hyper@fancy@oddfoot{\@fancyfoot\@lodd\@olfoot\@ocfoot\@orfoot\@rodd}
\def\hyper@fancy@evenhead{\@fancyhead\@rodd\@elhead\@echead\@erhead\@lodd}
\def\hyper@fancy@evenfoot{\@fancyfoot\@rodd\@elfoot\@ecfoot\@erfoot\@lodd}
\def\hyper@fancy@empty{{\hyper@empty\hyper@empty}}
\def\hyper@iffancyplain@empty#1#2#3#4#5\hyper@iffancyplain@empty{%
  \ifx#4\hyper@fancy@empty%
     \ifx#1\fancyplain%
        \if@fancyplain%
           \ifx\\#2\\1\else0\fi%
        \else%
           \ifx\\#3\\1\else0\fi%
        \fi%
     \else%
        0%
     \fi%
  \else%
     0%
  \fi%
}
\def\hyper@iffancy@empty#1{%
   \ifnum\ifx#1\@empty1\else0\fi%
         \ifx#1\hyper@empty1\else0\fi%
         \expandafter%
            \hyper@iffancyplain@empty%
               #1\hyper@fancy@empty%
                 \hyper@fancy@empty\hyper@fancy@empty%
                 \hyper@fancy@empty\hyper@fancy@empty%
            \hyper@iffancyplain@empty%
         >0 0\else1\fi%
}
\def\hyper@modifyheadfoot@pagenumber{%
  \let\hyper@thehead\@thehead%
  \ifx\hyper@thehead\hyper@oddhead\let\hyper@thehead\@oddhead\fi%
  \ifx\hyper@thehead\hyper@evenhead\let\hyper@thehead\@evenhead\fi%
  \let\hyper@thefoot\@thefoot%
  \ifx\hyper@thefoot\hyper@oddfoot\let\hyper@thefoot\@oddfoot\fi%
  \ifx\hyper@thefoot\hyper@evenfoot\let\hyper@thefoot\@evenfoot\fi%
  \def\@thehead{%
      \ifnum\ifnum\ifx\hyper@thehead\@empty1\else0\fi%
                  \ifx\hyper@thehead\hyper@empty1\else0\fi%
                  \ifx\hyper@thehead\relax1\else0\fi%
                  >0 0\else1\fi%
            \ifnum\ifx\hyper@thefoot\@empty1\else0\fi%
                  \ifx\hyper@thefoot\hyper@empty1\else0\fi%
                  \ifx\hyper@thefoot\relax1\else0\fi%
                  >0 0\else1\fi%
            >0\relax%
         \ifnum\ifnum\ifx\hyper@thehead\hyper@fancy@oddhead1\else0\fi%
                     \ifx\hyper@thehead\hyper@fancy@evenhead1\else0\fi%
                     >0 0\else1\fi%
               \ifnum\ifx\hyper@thefoot\hyper@fancy@oddfoot1\else0\fi%
                     \ifx\hyper@thefoot\hyper@fancy@evenfoot1\else0\fi%
                     >0 0\else1\fi%
               >0\relax%
         \else%
            \ifnum\ifnum\hyper@iffancy@empty\@olhead%
                        \hyper@iffancy@empty\@ochead%
                        \hyper@iffancy@empty\@orhead%
                        >0 1\else0\fi%
                  \ifnum\hyper@iffancy@empty\@olfoot%
                        \hyper@iffancy@empty\@ocfoot%
                        \hyper@iffancy@empty\@orfoot%
                        >0 1\else0\fi%
                  >0\relax%
            \else%
               \blindhyperanchor{page.\thepage}%
            \fi%
         \fi%
      \else%
         \blindhyperanchor{page.\thepage}%
      \fi%
      \let\hyper@thepage\thepage%
      \let\thepage\hyper@anchorpage%
      \ifx\hyper@thehead\@empty%
         \hfil%
      \else\ifx\hyper@thehead\hyper@empty%
         \hfil%
      \else%
         \hyper@thehead%
      \fi\fi%
  }%
  \def\@thefoot{%
      \let\hyper@thepage\thepage%
      \let\thepage\hyper@anchorpage%
      \ifx\hyper@thefoot\@empty%
         \hfil%
      \else\ifx\hyper@thefoot\hyper@empty%
         \hfil%
      \else%
         \hyper@thefoot%
      \fi\fi%
  }%
}
\let\hyper@modifyheadfoot\hyper@modifyheadfoot@pagenumber
%</fancyheadings>
%    \end{macrocode}
% \subsection{Long Tables}
% The package |longtable| uses a definition of |\caption| for it's own.
% Thus we have to modify this to reflect the hypertext needs.
%    \begin{macrocode}
%<*longtable>
\let\hyper@LT@array\LT@array
\def\LT@array{%
  \refstepcounter{table}\ignore@next@refstepcounter%
  \def\@currenthyper{\the\hypercount}%
  \hyper@LT@array%
}
\def\LT@c@ption#1[#2]#3{%
  \LT@makecaption#1\fnum@table{#3}%
  \def\@tempa{#2}\ifx\@tempa\@empty\else
     {\let\\\space%
      \edef\@currenthyper{\the\hypercount}%
      \addcontentsline%
        {lot}%
        {table}%
        {\protect\numberline{\thetable}{\hyperreference{\@currenthyper}{#2}}}%
     }%
  \fi}
\def\LT@makecaption#1#2#3{%
  \LT@mcol\LT@cols c{\hbox to\z@{\hss\parbox[t]\LTcapwidth{%
    \hyper@setcurrent%
    \hyper@settype{caption}%
    \sbox\@tempboxa{\hyperanchor{\@currenthyper}{#1{#2}}: #3}%
    \ifdim\wd\@tempboxa>\hsize
      \hyperanchor{\@currenthyper}{#1{#2}}: #3%
    \else
      \hbox to\hsize{\hfil\box\@tempboxa\hfil}%
    \fi
    \endgraf\vskip\baselineskip}%
  \hss}}%
}
%</longtable>
%    \end{macrocode}
%
% \subsection{Right Column Footnotes in Double Column Documents}
% |ftnright.sty| redefines the macro |\@makefntext|. Thus we have to
% modify it's definition when needed.
%    \begin{macrocode}
%<*ftnright>
\long\def\@makefntext#1{%
  \hyper@currentfnmark%
  \bgroup%
    \edef\@currenthyper{\hyper@current@fnmark}%
    \parindent 1em%
    \noindent\hbox to 2em{}%
    \llap{${\hyperanchor{\hyper@current@fnmark}{\@thefnmark}}.\;\;$}#1%
  \egroup%
}
%</ftnright>
%    \end{macrocode}
%
% \subsection{The {\tt natbib}-Package}
% Unfortunately, the bibliography stuff is changed by the |natbib|-package. So we have to provide
% a special macrocode fragment for it which is complicated by the fact, that the package scans
% parts of the |\bibitem| parameters from the |*.aux|-file.\par
% \noindent Let's start with adding an anchor to the bibliographic entries.
%    \begin{macrocode}
%<*natbib>
\def\@lbibitem[#1]#2{%
   \hyper@setcurrent%
   \hyper@settype{citation}%
   \@ifundefined{b@#2\@extra@b@citeb}{\def\NAT@num{}}{\NAT@parse{#2}}%
   \item[\hfil\hyperanchor{\@currenthyper}{\@biblabel{\NAT@num}}]%
    \NAT@ifcmd#1()()\@nil{#2}%
}
%    \end{macrocode}
% To be able to associate the correct hyperlinks from citations to the respectively
% bibliographic entries, we have to save the hyper-addresses into the |.aux|-file
% and provide a macro to read them. Note, that we cannot use the same technique as
% in standard \LaTeXe\ as the |natbib|-package scans parts of the arguments of
% |\bibitem| and we have to ensure, that we do not introduce conflicts by surrounding
% the entries with a hyperlink. To avoid that we store the hyperlink in another macro.
%    \begin{macrocode}
\renewcommand\NAT@wrout[5]{%
  \if@filesw%
    {\let\protect\noexpand\let~\relax%
     \immediate%
     \write\@auxout%
       {\string\bibcite{#5}{{#1}{#2}{{#3}}{{#4}}}{\@currenthyper}}%
    }%
  \fi%
  \ignorespaces%
}
\renewcommand\bibcite[3]{%
   \@ifundefined{b@#1\@extra@binfo}\relax
     {\NAT@citemultiple%
      \PackageWarningNoLine{natbib}{Citation `#1' multiply defined}%
     }%
   \global\@namedef{b@#1\@extra@binfo}{#2}%
   \global\@namedef{hyper@b@#1\@extra@binfo}{#3}%
}
\AtEndDocument{\NAT@swatrue\renewcommand\bibcite[3]{\NAT@testdef{#1}{#2}}}%
%    \end{macrocode}
% Now comes the crucial part. We have to invoke the hyperlinks at appropriate points in the
% citation macros. Fortunately |natbib| supports |hyperref| by adding macros at appropriate places
% that can be redefined for introducing the links.
%    \begin{macrocode}
\def\hyper@natlinkstart#1#2\hyper@natlinkend{%
  \hyperreference{\csname hyper@b@#1\@extra@b@citeb\endcsname}{#2}%
}
\def\hyper@natlinkend{\relax}
%    \end{macrocode}
% But we do not like their solution for citations with author name and year. We can do better
% by not including the separators into the links.
%    \begin{macrocode}
\def\NAT@citex%
  [#1][#2]#3{\let\@citea\@empty%
  \@cite{\let\NAT@nm\@empty\let\NAT@year\@empty%
    \@for\@citeb:=#3\do%
    {\edef\@citeb{\expandafter\@firstofone\@citeb}%
     \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi%
     \@ifundefined{b@\@citeb\@extra@b@citeb}{\@citea%
       {\reset@font\bfseries ?}\NAT@citeundefined%
                 \PackageWarning{natbib}%
       {Citation `\@citeb' on page \thepage \space undefined}}%
     {\let\NAT@last@nm=\NAT@nm\let\NAT@last@yr=\NAT@year%
     \NAT@parse{\@citeb}\ifNAT@full\let\NAT@nm\NAT@all@names\else%
       \let\NAT@nm\NAT@name\fi%
     \ifNAT@swa%
       \ifx\NAT@last@nm\NAT@nm\NAT@yrsep%
         \ifx\NAT@last@yr\NAT@year%
           \hyper@natlinkstart{\@citeb}{\NAT@exlab}\hyper@natlinkend%
         \else%
           \unskip\ %
           \hyper@natlinkstart{\@citeb}{\NAT@date}\hyper@natlinkend%
         \fi%
       \else\@citea%
          \hyper@natlinkstart{\@citeb}{{\NAT@nm}}\hyper@natlinkend%
          \NAT@aysep\ %
          \hyper@natlinkstart{\@citeb}{\NAT@date}\hyper@natlinkend%
       \fi%
       \def\@citea{\NAT@sep\ }%
     \else%
       \ifx\NAT@last@nm\NAT@nm\NAT@yrsep%
         \ifx\NAT@last@yr\NAT@year%
           \hyper@natlinkstart{\@citeb}{\NAT@exlab}\hyper@natlinkend%
         \else%
            \unskip\ %
            \hyper@natlinkstart{\@citeb}{\NAT@date}\hyper@natlinkend%
         \fi%
       \else\@citea%
         \hyper@natlinkstart{\@citeb}{{\NAT@nm}}\hyper@natlinkend%
         \ \NAT@open%
         \hyper@natlinkstart{\@citeb}{\NAT@date}\hyper@natlinkend%
       \fi%
       \def\@citea{\NAT@close\NAT@sep\ }%
     \fi}}\ifNAT@swa\else\NAT@close\fi}{#1}{#2}}
%    \end{macrocode}
% Damned, |natbib| accesses this macros through |\@citex| using a |\let|-assignment.
% We have to recall this assignment to define it. Fortunately, the package provides
% a macro to achieve this.
%    \begin{macrocode}
\NAT@set@cites
%    \end{macrocode}
% Bad news, |natbib| does not provide dummies for inserting hypertext-markups into ranges.
% Thus we have to patch the sorting macros of the package.
%    \begin{macrocode}
\ifnum\NAT@sort=1
\begingroup \catcode`\_=8
\gdef\@make@cite@list{%
    \edef\@citeb{\expandafter\@firstofone\@citeb}%
     \@ifundefined{b@\@citeb\@extra@b@citeb}{%
      \@citea{\reset@font\bfseries?}%
      \def\@citea{\NAT@sep\penalty\@m\NAT@space}%
      \NAT@citeundefined\PackageWarning{natcite}%
      {Citation `\@citeb' on page \thepage\space undefined}}%
    {\NAT@parse{\@citeb}%
      \ifcat_\ifnum\z@<0\NAT@num_\else A\fi%
       \@tempcnta\NAT@num\relax%
       \ifnum\@tempcnta>\@tempcntb%
          \edef\@cite@list{\@cite@list \@celt{{\NAT@num}{\@citeb}}}%
          \@tempcntb\@tempcnta%
       \else%
          \edef\@cite@list{\expandafter\@sort@celt\@cite@list\@gobble @}%
       \fi%
    \else%
       \@citea\hyper@natlinkstart{\@citeb}{\NAT@num}\hyper@natlinkend%
       \def\@citea{\NAT@sep\penalty\@m\NAT@space}%
 \fi}}
\endgroup
\def\@sort@celt#1#2{%
   \ifx \@celt #1%
      \hyper@sort@celt#2%
   \fi%
}%
\def\hyper@sort@celt#1#2{%
   \ifnum #1<\@tempcnta%
      \@celt{{#1}{#2}}%
      \expandafter\expandafter\expandafter\@sort@celt%
   \else%
      \@celt{{\NAT@num}{\@citeb}}\@celt{{#1}{#2}}%
  \fi%
}
\def\@compress@cite#1{\hyper@compress@cite#1}
\def\hyper@compress@cite#1#2{%
  \advance\@tempcnta\@ne%
  \ifnum #1=\@tempcnta%
     \ifx\@h@ld\relax%
        \edef\@h@ld{%
           \@citea%
           \noexpand\hyper@natlinkstart{#2}{#1}\noexpand\hyper@natlinkend%
        }%
     \else%
        \def\@h@ld{%
           \hbox{--}%
           \hyper@natlinkstart{#2}{#1}\hyper@natlinkend%
        }%
     \fi%
  \else%
     \@h@ld\@citea%
     \hyper@natlinkstart{#2}{#1}\hyper@natlinkend%
     \let\@h@ld\relax%
  \fi%
  \@tempcnta#1\def\@citea{\NAT@sep\penalty\@m\NAT@space}%
}
\fi
%</natbib>
%    \end{macrocode}
%
% \subsection{The Subequationarray Package}
% First of all we have to set some anchors in the |subeqnarray|-environment
% we can refer to.
%    \begin{macrocode}
%<*subeqnarray>
\def\hyper@subeqnnum@leqno{%
   \hbox to .01\p@{}%
   \rlap{%
      \reset@font\rmfamily%
      \hskip-\displaywidth\hyperanchor{\@currenthyper}{(\thesubequation)}%
   }%
}
\def\hyper@subeqnnum@reqno{%
   {\reset@font\rmfamily \hyperanchor{\@currenthyper}{(\thesubequation)}}%
}
\let\@subeqnnum\hyper@subeqnnum@reqno
\@ifpackagewith{subeqnarray}{leqno}
  {\let\@subeqnnum\hyper@subeqnnum@leqno}
  {\let\@subeqnnum\hyper@subeqnnum@reqno}
\let\hyper@subeqnarray\subeqnarray
\def\subeqnarray{%
   \hyper@setcurrent%
   \hyper@settype{equation}%
   \let\label@currenthyper\@currenthyper%
   \let\label@currenthypertype\@currenthypertype%
   \def\label##1{%
      \let\@currenthyper\label@currenthyper%
      \let\@currenthypertype\label@currenthypertype%
      \hyperlabel{##1}%
      \blindhyperanchor{\label@currenthyper}%
      \def\@currenthyper{\the\hypercount}%
   }%
   \hyper@setcurrent%
   \hyper@settype{equation}%
   \def\@currenthyper{\the\hypercount}%
   \hyper@subeqnarray%
}
%    \end{macrocode}
% The subeqnarray package defines a new label command called |\slabel|.
% Thus, we have to redefine it in order to ensure that the hyper reference is
% added to the label when written into the |.aux|-file.
%    \begin{macrocode}
\def\slabel#1{%
  \@bsphack
  \if@filesw
    {\let\thepage\relax
     \def\protect{\noexpand\noexpand\noexpand}%
     \edef\@tempa{\write\@auxout{\string
        \newlabel{#1}{{\@currenthypertype}{\@currenthyper}{\thesubequation}{\thepage}}}}%
     \expandafter}\@tempa
     \if@nobreak \ifvmode\nobreak\fi\fi
  \fi\@esphack}
%</subeqnarray>
%    \end{macrocode}
% \subsection{The Theorem Package}
% Analoguous to the theorem environment of \LaTeXe{} we have to modify
% the different theorem styles of the theorem package.
%    \begin{macrocode}
%<*theorem>
%plain
\gdef\th@plain{\normalfont\itshape%
  \def\@begintheorem##1##2{%
     \item[\hskip\labelsep%
           \hyperanchor{\@currenthyper}{\theorem@headerfont ##1\ ##2}%
          ]%
  }%
  \def\@opargbegintheorem##1##2##3{%
     \item[\hskip\labelsep%
           \hyperanchor%
             {\@currenthyper}%
             {\theorem@headerfont ##1\ ##2}\ (##3)%
          ]%
  }%
}
%break
\gdef\th@break{\normalfont\slshape%
  \def\@begintheorem##1##2{%
     \item[\rlap{\vbox{\hbox{\hskip \labelsep%
             \hyperanchor{\@currenthyper}{\theorem@headerfont ##1\ ##2}%
           }\hbox{\strut}}}%
          ]%
  }%
  \def\@opargbegintheorem##1##2##3{%
    \item[\rlap{\vbox{\hbox{\hskip \labelsep%
            \hyperanchor%
              {\@currenthyper}%
              {\theorem@headerfont ##1\ ##2}\ (##3)%
          }\hbox{\strut}}}%
         ]%
  }%
}
%marginbreak
\gdef\th@marginbreak{\normalfont\slshape%
  \def\@begintheorem##1##2{%
    \item[\rlap{\vbox{\theorem@headerfont%
            \hbox{\llap{##2}\hskip\labelsep%
                  \hyperanchor{\@currenthyper}{##1}%
                 }%
          \hbox{\strut}}}%
         ]%
  }%
  \def\@opargbegintheorem##1##2##3{%
    \item[\rlap{\vbox{\theorem@headerfont%
            \hbox{\llap{##2}\hskip\labelsep%
                  \hyperanchor{\@currenthyper}{##1}\ (##3)
                 }%
          \hbox{\strut}}}%
         ]%
  }%
}
%changebreak
\gdef\th@changebreak{\normalfont\slshape%
  \def\@begintheorem##1##2{%
    \item[\rlap{\vbox{\hbox{\hskip\labelsep%
            \hyperanchor{\@currenthyper}{\theorem@headerfont ##2\ ##1}%
          }\hbox{\strut}}}%
         ]%
  }%
  \def\@opargbegintheorem##1##2##3{%
    \item[\rlap{\vbox{\hbox{\hskip\labelsep%
            \hyperanchor%
              {\@currenthyper}%
              {\theorem@headerfont ##2\ ##1}\ (##3)%
          }\hbox{\strut}}}%
         ]%
  }%
}
%change
\gdef\th@change{\normalfont\slshape%
  \def\@begintheorem##1##2{%
    \item[\hskip\labelsep%
          \hyperanchor{\@currenthyper}{\theorem@headerfont ##2\ ##1}%
         ]%
  }%
  \def\@opargbegintheorem##1##2##3{%
    \item[\hskip\labelsep%
          \hyperanchor%
            {\@currenthyper}%
            {\theorem@headerfont ##2\ ##1}\ (##3)%
         ]%
  }%
}
%margin
\gdef\th@margin{\normalfont\slshape%
  \def\@begintheorem##1##2{%
    \item[\theorem@headerfont \llap{##2}\hskip\labelsep%
          \hyperanchor{\@currenthyper}{##1}%
         ]%
  }%
  \def\@opargbegintheorem##1##2##3{%
    \item[\theorem@headerfont \llap{##2}\hskip\labelsep%
          \hyperanchor{\@currenthyper}{##1}\ (##3)%
         ]%
  }%
}
%</theorem>
%    \end{macrocode}
%
% \subsection{The CWEB Document Class}
% For \CWEB\ there exists a \LaTeXe\ document class that defined a reference
% mechanism for literate programming using latex and \CWEB.\par
% \noindent
% First of all it is based on another document class. Thus we have to
% load the modifications for this class, too.
%    \begin{macrocode}
%<*cweb>
\InputIfFileExists{\CwebBaseClass.hyp}{}%
  {\PackageError{hyper}{\CwebBaseClass.hyp not found.\MessageBreak
               Please choose another base document class for cweb\MessageBreak
               or redefine \string\CwebBaseClass to point to a\MessageBreak
               modification document class for the base document class
              }{}%
  }%
%    \end{macrocode}
% As we use pattern--like definitions for some stuff following below
% an additiional package has to be loaded.
%    \begin{macrocode}
\RequirePackage{defpattern}
%    \end{macrocode}
% |cweb.cls| uses the underscore character as a letter for some macro names
% we have to redefine. Thus we set the category code of |_| correspondingley.
%    \begin{macrocode}
\chardef\hyper@CatUsCode=\catcode`\_
\catcode`\_=\CatLetter
%    \end{macrocode}
% Why the hell must the class use a redefinition of |\refstepcounter| for
% its own? This means that we have to redefine it another time.
%    \begin{macrocode}
\let\hyper@cweb@refstepcounter=\hyper@refstepcounter
\def\refstepcounter#1{%
    \def\@tempa{#1}%
    \ifx \@tempa\cweb@string@chunk%
       \protected@edef\@currenthyper{cweb.\cweb@refchunk}%
       \hyper@settype{chunk}%
       \protected@edef\@currentlabel{\cweb@refchunk}%
    \else%
       \hyper@setcurrent%
       \hyper@settype{chunk}%
       \hyper@cweb@refstepcounter{#1}%
    \fi%
}
%    \end{macrocode}
% Naturally, we want to use the chunk numbers as links to the corresponding
% chunks. This means that we have to redefine |\CwebRefName|.
% Don't ask why it's that complicated.
%    \begin{macrocode}
\let\hyper@CwebRefName\CwebRefName
\def\CwebRefName#1:#2\X{%
    \ifmmode  \gdef\cwbb@toggle_text{\null$\null}%
    \else  \let\cwbb@toggle_text\relax%
    \fi%
    \cwbb@toggle_text%
    \expandafter\ifx\csname hyper@cweb.#1\endcsname\relax%
       \expandafter\ifx\csname hyper@new@cweb.#1\endcsname\relax%
          \PackageWarning{hyper}%
                   {Hyper reference for `cweb.#1' on page \hyper@thepage\space undefined}%
          \hyper@change1\relax%
          \hyper@undef@color{%
             $\langle\,${\cwbb@tex \cwbb@check_dot{#2}\CwebRefNumber{#1}}$\,\rangle$%
          }%
       \else%
          \hyperreference{cweb.#1}{%
             $\langle\,${\cwbb@tex \cwbb@check_dot{#2}\CwebRefNumber{#1}}$\,\rangle$%
          }%
       \fi%
    \else%
       \hyperreference{cweb.#1}{%
          $\langle\,${\cwbb@tex \cwbb@check_dot{#2}\CwebRefNumber{#1}}$\,\rangle$%
       }%
    \fi%
    \cwbb@toggle_text%
}
%    \end{macrocode}
% However, there has to exist anchors for these links to the chunks.\par
% \noindent Well, for a hierarchical structure the chunk numbers are
% written into the
% margin whereas for a flat structure they are written at the beginning of
% the chunk using the chunk begin macro |\M|. Therefore we need the following
% modifications of the original code.
%    \begin{macrocode}
\ifcase \cweb@structure
    %% hierarchic
    \let\hyper@cwbb@marginal_chunkno\cwbb@marginal_chunkno%
    \def\cwbb@marginal_chunkno{%
      \let\hyper@thechunk\thechunk%
      \def\thechunk{\hyperanchor{cweb.\arabic{chunk}}{\hyper@thechunk}}%
      \hyper@cwbb@marginal_chunkno%
      \let\thechunk\hyper@thechunk%
    }
  \or
    %% flat
    \let\hyper@M\M%
    \def\M#1{%
      \let\hyper@thechunk\thechunk%
      \def\thechunk{\hyperanchor{cweb.\arabic{chunk}}{\hyper@thechunk}}%
      \hyper@M{#1}%
      \let\thechunk\hyper@thechunk%
    }
\fi
%    \end{macrocode}
% Unfortunately, this is not sufficient. The class uses an additional
% cross referencing mechanism.\par
% \noindent Damned, it uses seperators for a list of cross references that
% cannot be used for the pattern-like definition we need to seperate the
% different references. Thus we have to redefinie the seperators and reinvoke
% them after splitting.
%    \begin{macrocode}
\let\hyper@CwebCREt\CwebCREt
\let\hyper@CwebCRsEt\CwebCRsEt
\def\CwebCREt{!}
\def\CwebCRsEt{?}
%
\defpattern\hyper@split@CwebCrossRef[#2]{\hyperreference{cweb.#2}{#2}}
\defpattern\hyper@split@CwebCrossRef[ #2]{\hyper@split@CwebCrossRef[#2]}
\defpattern\hyper@split@CwebCrossRef[#2,#3]{%
  \hyper@split@CwebCrossRef[#2], %
  \hyper@split@CwebCrossRef[#3]%
}
\defpattern\hyper@split@CwebCrossRef[#2!#3]{%
  \hyper@split@CwebCrossRef[#2]\hyper@CwebCREt%
  \hyper@split@CwebCrossRef[#3]%
}
\defpattern\hyper@split@CwebCrossRef[#2?#3]{%
  \hyper@split@CwebCrossRef[#2]\hyper@CwebCRsEt%
  \hyper@split@CwebCrossRef[#3]%
}
\def\hypersplit@CwebCrossRef[#1]{%
  \edef\hyper@tmp{#1}%
  \expandafter\hyper@split@CwebCrossRef\expandafter[\hyper@tmp]%
}
%
\let\hyper@CwebCrossRef\CwebCrossRef
\def\CwebCrossRef#1#2.{%
  \hyper@CwebCrossRef{#1}{\hypersplit@CwebCrossRef[#2]}.%
}
%    \end{macrocode}
% As you might have expected, this even does not resolve all problems.
% The list of references may contain multiple entries pointing to
% different chunks containing code for the same literate.
% Therefore we have to redefine the literates to allow links to different
% occurrences.
%    \begin{macrocode}
\let\hyper@CwebRefList\CwebRefList
\def\hyper@CwebRefName@RefList#1:#2\X{%
  \hyper@CwebRefName\hypersplit@CwebCrossRef[#1]:#2\X%
}
\def\CwebRefList{%
  \let\hyper@CwebReadPPList\CwebReadPPList%
  \let\CwebReadPPList\relax%
  \hyper@CwebRefList%
  \let\X\hyper@CwebRefName@RefList
  \def\CwebCrossRef##1##2.{%
    \quad {\reset@font\footnotesize ##1~\hypersplit@CwebCrossRef[##2].}%
  }%
  \let\CwebReadPPList\hyper@CwebReadPPList%
  \CwebReadPPList%
}
%    \end{macrocode}
% Last but not least we have to handle the index referencing from variables
% to the chunks they occur in. The modifications below are just a little bit
% complicated as we have to split the list of occurrences to several parts
% each of which has to be handled sepeartely without being allowed to use
% the original list that may contain the character |]| that cannot be used
% in pattern--like definitions we need here.
%    \begin{macrocode}
\let\hyper@CwebIndexEntry\CwebIndexEntry
\let\hyper@CwebIndexDeclared\CwebIndexDeclared
\def\CwebIndexDeclared#1]{|#1|}
\defpattern\hyper@cwebindex[#2]{\hyperreference{cweb.#2}{#2}}
\defpattern\hyper@cwebindex[|#2|]{%
  \hyperreference{cweb.#2}{\hyper@CwebIndexDeclared#2]}%
}
\defpattern\hyper@cwebindex[#2, #3]{%
  \hyper@cwebindex[#2], \hyper@cwebindex[#3]%
}
\def\hyper@cweb@index#1{%
  \edef\hyper@tmp{#1}%
  \expandafter\hyper@cwebindex\expandafter[\hyper@tmp]%
}
\def\CwebIndexEntry#1, #2.{%
  \hyper@CwebIndexEntry#1, \hyper@cweb@index{#2}.%
}
%    \end{macrocode}
% Now it just remains to reset the category code for |_| to the one we had
% before the modifications started.
%    \begin{macrocode}
\catcode`\_=\hyper@CatUsCode
%</cweb>
%    \end{macrocode}
%
% \clearpage
%
% \section{Needed Packages (Part of this Distribution)}
%
% \subsection{Pattern--Like Definition of Macros}
% For the index and glossary definitions we have used the package |defpattern|
% that is already part of the fp--package on |CTAN:macros/latex/contrib/other/fp|.
% This is a very usefull macro allowing the definition of other macros by
% pattern matching rules.\par
% \noindent The package has been adapted from Alan Jeffrey's |\howto| that can be
% found in ``\TeX and TUG NEWS 2(2)''.
%    \begin{macrocode}
%<*defpattern>
\ProvidesPackage{defpattern}
\message{%
  `\string\defpattern-macro %
   (adapted from \string\howto\space%
    (Alan Jeffrey in TeX and TUG NEWS 2(2))%
   )%
  '%
}
\def\xcs#1#2{\expandafter#1\csname#2\endcsname}
\newcount\actioncount
\def\defpattern#1[#2]#3{%
  \xcs\ifx{\expandafter\gobble\string#1}\relax
  \def#1{\erroraction#1}\fi
  \advance\actioncount by 1\relax
  \expandafter\defaction\expandafter{#1}{#3}{#2}%
  \def\temp##1##2##3##4##5##6##7##8##9{\def\temp{[#2]}}%
  \temp\empty\empty\empty\empty\empty\empty\empty\empty\empty
  \edef#1{\noexpand\doaction\xcs\noexpand
    {action-\the\actioncount}\temp}}
\def\defaction#1#2#3{%
  \xcs\def{action-\the\actioncount}##1[#3]{\applyto{#1}{#2}}}
\def\gobble#1{}
\def\applyto#1#2#3{#3{#1}{#2}}
\def\doaction#1[#2][#3]{#1[#3]\success[#2]\failure[#3]}
\def\success#1#2[#3]\failure[#4]{#2}
\def\failure#1#2{#1}
\def\erroraction#1[#2]{%
   \PackageError{defpattern}{I don't know how to \string#1[#2]}{}}
%</defpattern>
%    \end{macrocode}
%
% \clearpage
%
% \section{Extensions}
% Currently the following extensions exist for this package.
% \begin{itemize}
%    \item Back references from the bibliography to the citations\newline
%          (described in |backcite.dtx|)
% \end{itemize}
%
% \Finale