summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/hyper/hyper.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/hyper/hyper.dtx
Initial commit
Diffstat (limited to 'macros/latex/contrib/hyper/hyper.dtx')
-rw-r--r--macros/latex/contrib/hyper/hyper.dtx3732
1 files changed, 3732 insertions, 0 deletions
diff --git a/macros/latex/contrib/hyper/hyper.dtx b/macros/latex/contrib/hyper/hyper.dtx
new file mode 100644
index 0000000000..bf83272d0f
--- /dev/null
+++ b/macros/latex/contrib/hyper/hyper.dtx
@@ -0,0 +1,3732 @@
+% \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