diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /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.dtx | 3732 |
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 |