% \iffalse
%% File: hyperref.dtx Copyright 1995-2001 Sebastian Rahtz,
%% with portions written by David Carlisle and Heiko Oberdiek,
%% 2001-2011 Heiko Oberdiek.
%%
%% This file is part of the `Hyperref Bundle'.
%% -------------------------------------------
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%%   http://www.latex-project.org/lppl.txt
%% and version 1.3 or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.
%%
%% This work has the LPPL maintenance status `maintained'.
%%
%% The Current Maintainer of this work is Heiko Oberdiek.
%%
%% The list of all files belonging to the `Hyperref Bundle' is
%% given in the file `manifest.txt'.
%%
%<package|nohyperref|driver|check>\NeedsTeXFormat{LaTeX2e}[1995/12/01]
%<package>\ProvidesPackage{hyperref}
%<nohyperref>\ProvidesPackage{nohyperref}
%<driver>\ProvidesFile{hyperref.drv}
%<check>\ProvidesFile{hycheck.tex}
%<hypertex>\ProvidesFile{hypertex.def}
%<pdftex>\ProvidesFile{hpdftex.def}
%<pdfmark>\ProvidesFile{pdfmark.def}
%<vtexpdfmark>\ProvidesFile{hvtexmrk.def}
%<dvips>\ProvidesFile{hdvips.def}
%<dvipsone>\ProvidesFile{hdvipson.def}
%<textures>\ProvidesFile{htexture.def}
%<dviwindo>\ProvidesFile{hdviwind.def}
%<dvipdfm>\ProvidesFile{hdvipdfm.def}
%<xetex>\ProvidesFile{hxetex.def}
%<vtex>\ProvidesFile{hvtex.def}
%<vtexhtml>\ProvidesFile{hvtexhtml.def}
%<tex4ht>\ProvidesFile{htex4ht.def}
%<tex4htcfg>\ProvidesFile{htex4ht.cfg}
%<pd1enc>\ProvidesFile{pd1enc.def}
%<puenc>\ProvidesFile{puenc.def}
%<puvnenc>\ProvidesFile{puvnenc.def}
%<puarenc>\ProvidesFile{puarenc.def}
%<!none>  [2011/12/04 v6.82m %
%<package>  Hypertext links for LaTeX]
%<nohyperref>  Dummy hyperref (SR)]
%<driver>  Hyperref documentation driver file]
%<check>  Hyperref test file]
%<hypertex>  Hyperref driver for HyperTeX specials]
%<hypertex>\Hy@VersionCheck{hypertex.def}
%<pdftex>  Hyperref driver for pdfTeX]
%<pdftex>\Hy@VersionCheck{hpdftex.def}
%<pdfmark>  Hyperref definitions for pdfmark specials]
%<pdfmark>\Hy@VersionCheck{pdfmark.def}
%<vtexpdfmark> Hyperref driver for VTeX in PDF/PS mode (pdfmark specials)]
%<vtexpdfmark>\Hy@VersionCheck{hvtexmrk.def}
%<dvips>  Hyperref driver for dvips]
%<dvips>\Hy@VersionCheck{hdvips.def}
%<dvipsone>  Hyperref driver for dvipsone]
%<dvipsone>\Hy@VersionCheck{hdvipson.def}
%<textures>  Hyperref driver for Textures]
%<textures>\Hy@VersionCheck{htexture.def}
%<dviwindo>  Hyperref driver for dviwindo]
%<dviwindo>\Hy@VersionCheck{hdviwind.def}
%<dvipdfm>  Hyperref driver for dvipdfm]
%<dvipdfm>\Hy@VersionCheck{hdvipdfm.def}
%<xetex>  Hyperref driver for XeTeX]
%<xetex>\Hy@VersionCheck{hxetex.def}
%<vtex>  Hyperref driver for VTeX in PDF/PS mode]
%<vtex>\Hy@VersionCheck{hvtex.def}
%<vtexhtml>  Hyperref driver for VTeX in HTML mode]
%<vtexhtml>\Hy@VersionCheck{hvtexhtm.def}
%<tex4ht>  Hyperref driver for TeX4ht]
%<tex4ht>\Hy@VersionCheck{htex4ht.def}
%<tex4htcfg>  Hyperref configuration file for TeX4ht]
%<pd1enc>  Hyperref: PDFDocEncoding definition (HO)]
%<puenc>  Hyperref: PDF Unicode definition (HO)]
%<puvnenc>  Hyperref: Additions to puenc.def for VnTeX]
%<puarenc>  Hyperref: Additions to puenc.def for Arabi]
%<*driver>
\documentclass{ltxdoc}
\usepackage{array}
\usepackage{ifluatex,ifxetex}
\ifnum 0\ifluatex 1\else\ifxetex 1\fi\fi=0 %
  \usepackage[T1]{fontenc}%
  \renewcommand*{\ttdefault}{lmvtt}%
\else
  \usepackage{fontspec}%
  \renewcommand*{\ttdefault}{lmvtt}%
\fi
\usepackage[%
  colorlinks,%
  hyperindex=false,% done by hypdoc
  pdfusetitle,%
  pdfpagelabels%
]{hyperref}
\usepackage[numbered]{hypdoc}
\usepackage{bmhydoc}
\pdfstringdefDisableCommands{%
  \let\\\textbackslash
}%
\EnableCrossrefs
\CodelineIndex
\setlength{\hfuzz}{2pt}
\begin{document}
  %
  % title
  %
  \GetFileInfo{hyperref.drv}%
  \title{Hypertext marks in \LaTeX}%
  \author{Sebastian Rahtz\\%
    Email: \texttt{sebastian.rahtz at oucs.ox.ac.uk}\\[1.5ex]%
    Heiko Oberdiek\\%
    Email: \texttt{heiko.oberdiek at googlemail.com}}%
  % \date{processed \today}%
  \date{\filedate\space\fileversion}%
  \maketitle
  %
  % overview
  %
  \makeatletter
  \@ifundefined{HyperrefOverview}{}{%
    \HyperrefOverview\relax
    \newpage
  }%
  %
  % table of contents
  %
  \section{\contentsname}%
  \makeatletter
  \@starttoc{toc}%
  \newpage
  %
  % source code documentation
  %
  \let\Email\nolinkurl
  \DocInput{hyperref.dtx}%
  %
  % index
  %
  \PrintIndex
\end{document}
%</driver>
% \fi
% \CheckSum{28686}
%
% \MakeShortVerb{|}
% \StopEventually{}
%
% \DoNotIndex{\def,\edef,\gdef,\xdef,\global,\long,\let}
% \DoNotIndex{\expandafter,\string,\the,\ifx,\else,\fi}
% \DoNotIndex{\csname,\endcsname,\relax,\begingroup,\endgroup}
% \DoNotIndex{\DeclareTextCommand,\DeclareTextCompositeCommand}
% \DoNotIndex{\space,\@empty,\special}
% \DoNotIndex{\\,\0,\1,\2,\8}
% \makeatletter
% \let\SavedTheIndex\theindex
% \def\theindex{^^A
%   \clearpage
%   \addtolength{\textwidth}{\marginparwidth}^^A
%   \addtolength{\textwidth}{\marginparsep}^^A
%   \setlength{\linewidth}{\textwidth}^^A
%   \setlength{\hsize}{\textwidth}^^A
%   \setlength{\oddsidemargin}{\paperwidth}^^A
%   \addtolength{\oddsidemargin}{-\textwidth}^^A
%   \setlength{\oddsidemargin}{.5\oddsidemargin}^^A
%   \addtolength{\oddsidemargin}{-1in}^^A
%   \setlength{\evensidemargin}{\oddsidemargin}^^A
%   \SavedTheIndex
% }
% \g@addto@macro\theindex{^^A
%   \parfillskip=0pt plus 1fil
% }
% \makeatother
%
% \providecommand*{\eTeX}{\mbox{$\varepsilon$-\TeX}}
%
% \section{File hycheck.tex}
%
%    Many commands of \LaTeX\ or other packages cannot be
%    overloaded, but have to be redefined by hyperref directly.
%    If these commands change in newer versions, these
%    changes are not noticed by hyperref.
%    With this test file this situation can be checked.
%    It defines the command \cmd{\checkcommand} that
%    is more powerful than \LaTeX's \cmd{\CheckCommand},
%    because it takes \cmd{\DeclareRobustCommand} and
%    optional parameters better into account.
%
%    \begin{macrocode}
%<*check>
\documentclass{article}
\makeatletter
%    \end{macrocode}
%
%    \begin{macro}{\checklatex}
%    Optional argument: release date of \LaTeX.
%    \begin{macrocode}
\newcommand*{\checklatex}[1][]{%
  \typeout{}%
  \typeout{* Format: `LaTeX2e' #1}%
  \typeout{\space\space Loaded: `\fmtname' \fmtversion}%
}%
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\checkpackage}
%    The argument of \cmd{\checkpackage} is the package name
%    without extension optionally followed by a release date.
%    \begin{macrocode}
\newcommand*{\checkpackage}[1]{%
  \def\HyC@package{#1}%
  \let\HyC@date\@empty
  \@ifnextchar[\HyC@getDate\HyC@checkPackage
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyC@getDate}
%    The release date is scanned.
%    \begin{macrocode}
\def\HyC@getDate[#1]{%
  \def\HyC@date{#1}%
  \HyC@checkPackage
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyC@checkPackage}
%    \begin{macrocode}
\def\HyC@checkPackage{%
  \typeout{}%
  \begingroup
    \edef\x{\endgroup
      \noexpand\RequirePackage{\HyC@package}%
      \ifx\HyC@date\@empty\relax\else[\HyC@date]\fi%
    }%
  \x
  \typeout{}%
  \typeout{%
    * Package `\HyC@package'%
    \ifx\HyC@date\@empty
    \else
      \space\HyC@date
    \fi
  }%
  \@ifundefined{ver@\HyC@package.sty}{%
  }{%
    \typeout{%
      \space\space Loaded: `\HyC@package' %
      \csname ver@\HyC@package.sty\endcsname
    }%
  }%
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\checkcommand}
%    The macro \cmd{\checkcommand} parses the next
%    tokens as a \LaTeX\ definition and compares
%    this definition with the current meaning of
%    that command.
%    \begin{macrocode}
\newcommand*{\checkcommand}[1]{%
  \begingroup
  \ifx\long#1\relax
    \expandafter\HyC@checklong
  \else
    \def\HyC@defcmd{#1}%
    \expandafter\let\expandafter\HyC@next
      \csname HyC@\expandafter\@gobble\string#1\endcsname
    \expandafter\HyC@checkcommand
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyC@checklong}
%    The definition command \cmd{\def} or \cmd{\edef}
%    is read.
%    \begin{macrocode}
\def\HyC@checklong#1{%
  \def\HyC@defcmd{\long#1}%
  \expandafter\let\expandafter\HyC@next
    \csname HyC@\expandafter\@gobble\string#1\endcsname
  \HyC@checkcommand
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyC@checkcommand}
%    The optional star of \LaTeX's definitions is parsed.
%    \begin{macrocode}
\def\HyC@checkcommand{%
  \ifx\HyC@next\relax
    \PackageError{hycheck}{%
      Unknown command `\expandafter\strip@prefix\meaning\HyC@cmd'%
    }\@ehd
    \expandafter\endinput
  \fi
  \@ifstar{%
    \def\HyC@star{*}%
    \HyC@check
  }{%
    \let\HyC@star\@empty
    \HyC@check
  }%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyC@check}
%    The macro \cmd{\HyC@check} reads the
%    definition command.
%    \begin{macrocode}
\def\HyC@check#1{%
  \def\HyC@cmd{#1}%
  \let\HyC@org@cmd#1%
  \let#1\relax
  \let\HyC@param\@empty
  \HyC@Toks{}%
  \let\HyC@org@optcmd\HyC@noValue
  \let\HyC@org@robustcmd\HyC@noValue
  \let\HyC@org@robustoptcmd\HyC@noValue
  \HyC@next
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyC@noValue}
%    \begin{macrocode}
\def\HyC@noValue{NoValue}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyC@newcommand}
%    The code for \cmd{\newcommand}.
%    \begin{macrocode}
\def\HyC@newcommand{%
  \let\HyC@@cmd\HyC@cmd
  \@ifnextchar[\HyC@nc@opt\HyC@nc@noopt
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyC@Toks}
%    A register for storing the default value of an
%    optional argument.
%    \begin{macrocode}
\newtoks\HyC@Toks
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyC@nc@noopt}
%    This macro \cmd{\HyC@nc@noopt} is called, if the
%    parser has reached the definition text.
%    \begin{macrocode}
\long\def\HyC@nc@noopt#1{%
  \edef\x{%
    \expandafter\noexpand\HyC@defcmd
    \HyC@star
    \expandafter\noexpand\HyC@cmd
    \HyC@param\the\HyC@Toks
  }%
  \x{#1}%
  \HyC@doCheck
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyC@nc@opt}
%    This macro scans the first optional argument
%    of a \LaTeX\ definition (number of arguments).
%    \begin{macrocode}
\def\HyC@nc@opt[#1]{%
  \def\HyC@param{[{#1}]}%
  \@ifnextchar[\HyC@nc@default\HyC@nc@noopt
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyC@nc@default}
%    Macro \cmd{\HyC@nc@default} scans the
%    default for an optional argument.
%    \begin{macrocode}
\def\HyC@nc@default[#1]{%
  \HyC@Toks={[{#1}]}%
  \edef\HyC@optcmd{%
    \expandafter\noexpand
    \csname\expandafter\string\HyC@@cmd\endcsname
  }%
  \expandafter\let\expandafter\HyC@org@optcmd\HyC@optcmd
  \HyC@nc@noopt
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\HyC@DeclareRobustCommand}
%    \cmd{\DeclareRobustCommand}|{\cmd}| makes the command
%    \cmd{\cmd} robust, that then calls |\cmd|\verb*| |
%    with an space at the end of the command name, defined by
%    \cmd{\newcommand}. Therefore the further parsing
%    is done by \cmd{\HyC@nc@opt} or \cmd{\Hy@nc@noopt}
%    of the \cmd{\HyC@newcommand} chain.
%    \begin{macrocode}
\def\HyC@DeclareRobustCommand{%
  \edef\HyC@robustcmd{%
    \expandafter\noexpand
    \csname\expandafter\expandafter\expandafter\@gobble
      \expandafter\string\HyC@cmd\space\endcsname
  }%
  \expandafter\let\expandafter\HyC@org@robustcmd\HyC@robustcmd
  \expandafter\let\HyC@robustcmd\relax
  \let\HyC@@cmd\HyC@robustcmd
  \@ifnextchar[\HyC@nc@opt\HyC@nc@noopt
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\HyC@def}
%    \begin{macro}{\HyC@edef}
%    The parameter text of \cmd{\def} or \cmd{\edef} is
%    stored in the token register \cmd{\HyC@Toks}.
%    \begin{macrocode}
\def\HyC@def#1#{%
  \HyC@Toks={#1}%
  \HyC@nc@noopt
}
\let\HyC@edef\HyC@def
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%
%    \begin{macro}{\HyC@doCheck}
%    This command performs the checks and prints the result.
%    \begin{macrocode}
\def\HyC@doCheck{%
  \typeout{* Checking `\HyC@string\HyC@cmd':}%
  \HyC@checkItem{cmd}%
  \HyC@checkItem{robustcmd}%
  \HyC@checkItem{optcmd}%
  \HyC@checkItem{robustoptcmd}%
  \endgroup
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyC@checkItem}
%    A single check.
%    \begin{macrocode}
\def\HyC@checkItem#1{%
  \expandafter\ifx\csname HyC@org@#1\endcsname\HyC@noValue
  \else
    \expandafter\expandafter\expandafter\ifx
    \csname HyC@#1\expandafter\endcsname
    \csname HyC@org@#1\endcsname
      \expandafter\HyC@checkOk\csname HyC@#1\endcsname
    \else
      \expandafter\HyC@checkFailed
        \csname HyC@#1\expandafter\endcsname
        \csname HyC@org@#1\endcsname
    \fi
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyC@string}
%    \begin{macro}{\HyC@meaning}
%    Some shorthands.
%    \begin{macrocode}
\def\HyC@string#1{\expandafter\string#1}
\def\HyC@meaning#1{\expandafter\meaning#1}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \begin{macro}{\HyC@checkOk}
%    The result, if the check succeeds.
%    \begin{macrocode}
\def\HyC@checkOk#1{%
  \typeout{\space\space`\HyC@string#1' ok.}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyC@checkFailed}
%    The result, if the check fails.
%    \begin{macrocode}
\def\HyC@checkFailed#1#2{%
  \typeout{\space\space`\HyC@string#1' failed.}%
  \typeout{\space\space* original: \meaning#2}%
  \typeout{\space\space* expected: \HyC@meaning#1}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
% **************************************************
%</check>
%    \end{macrocode}
%
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
% \section{Package options and setup}\label{options}
%
% \subsection{Save catcodes}
%    There are many packages that change the standard catcodes.
%
%    First we save the original meaning of |`| and |=|
%    in the token register |\toks@|, because we need the two
%    characters in the macros \cmd{\Hy@SetCatcodes} and
%    \cmd{\Hy@RestoreCatcodes}.
%    \begin{macrocode}
\begingroup
  \@makeother\`%
  \@makeother\=%
  \edef\x{%
    \edef\noexpand\x{%
      \endgroup
      \noexpand\toks@{%
        \catcode 96=\noexpand\the\catcode`\noexpand\`\relax
        \catcode 61=\noexpand\the\catcode`\noexpand\=\relax
      }%
    }%
    \noexpand\x
  }%
\x
\@makeother\`
\@makeother\=
%    \end{macrocode}
%    \begin{macro}{\Hy@SetCatcodes}
%    \begin{macrocode}
\def\Hy@SetCatcodes{%
  \@makeother\`%
  \@makeother\=%
  \catcode`\$=3 %
  \catcode`\&=4 %
  \catcode`\^=7 %
  \catcode`\_=8 %
  \@makeother\|%
  \@makeother\:%
  \@makeother\(%
  \@makeother\)%
  \@makeother\[%
  \@makeother\]%
  \@makeother\/%
  \@makeother\!%
  \@makeother\<%
  \@makeother\>%
  \@makeother\.%
  \@makeother\;%
  \@makeother\+%
  \@makeother\-%
  \@makeother\"%
  \@makeother\'%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Hy@RestoreCatcodes}
%    \begin{macrocode}
\begingroup
  \def\x#1{\catcode`\noexpand#1=\the\catcode`#1\relax}%
  \xdef\Hy@RestoreCatcodes{%
    \the\toks@
    \x\$%
    \x\&%
    \x\^%
    \x\_%
    \x\|%
    \x\:%
    \x\(%
    \x\)%
    \x\[%
    \x\]%
    \x\/%
    \x\!%
    \x\<%
    \x\>%
    \x\.%
    \x\;%
    \x\+%
    \x\-%
    \x\"%
    \x\'%
  }%
\endgroup
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
\Hy@SetCatcodes
%    \end{macrocode}
%
% It needs the December 95 release of \LaTeX, because it uses
% |\protected@write|, and it defines commands in options; and the page
% setup internal code changed at that point. It'll probably break
% with the later releases!
%
% Use package |hobsub-hyperref| for faster package loading.
%    \begin{macrocode}
\IfFileExists{hobsub-hyperref.sty}{%
  \RequirePackage{hobsub-hyperref}[2011/01/30]%
}{}
%    \end{macrocode}
%    \begin{macrocode}
\RequirePackage{ltxcmds}[2010/10/25]
\RequirePackage{ifpdf}[2006/02/20]
\RequirePackage{pdftexcmds}[2009/04/10]
\@ifpackagelater{pdftexcmds}{2010/11/04}{}{%
  \ltx@IfUndefined{pdfdraftmode}{%
    \let\pdf@ifdraftmode\ltx@secondoftwo
  }{%
    \ifpdf
      \def\pdf@ifdraftmode{%
        \ifnum\pdfdraftmode=\ltx@one
          \expandafter\ltx@firstoftwo
        \else
          \expandafter\ltx@secondoftwo
        \fi
      }%
    \else
      \let\pdf@ifdraftmode\ltx@secondoftwo
    \fi
  }%
}
%    \end{macrocode}
%    \begin{macrocode}
\RequirePackage{infwarerr}[2010/04/08]
\RequirePackage{keyval}[1997/11/10]
\RequirePackage{kvsetkeys}[2007/09/29]
\RequirePackage{pdfescape}[2007/11/11]
\RequirePackage{ifvtex}
\RequirePackage{ifxetex}[2006/08/21]
\RequirePackage{hycolor}
\RequirePackage{letltxmacro}[2008/06/13]
\def\Hy@Error{\@PackageError{hyperref}}
\def\Hy@Warning{\@PackageWarning{hyperref}}
\def\Hy@WarningNoLine{\@PackageWarningNoLine{hyperref}}
\def\Hy@Info{\@PackageInfo{hyperref}}
\def\Hy@InfoNoLine{\@PackageInfoNoLine{hyperref}}
\def\Hy@Message#1{%
  \GenericWarning{%
    (hyperref)\@spaces\@spaces\@spaces\@spaces
  }{%
    Package hyperref Message: #1\ltx@gobble
  }%
}
%    \end{macrocode}
%
% \subsection{Version check}
%
%    \begin{macro}{\Hy@VersionChecked}
%    \begin{macrocode}
\chardef\Hy@VersionChecked=0 %
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Hy@VersionCheck}
%    \begin{macrocode}
\def\Hy@VersionCheck#1{%
  \begingroup
    \ltx@IfUndefined{ver@hyperref.sty}{%
      \Hy@Error{%
        This should not happen!\MessageBreak
        Missing hyperref version%
      }\@ehd
    }{%
      \ltx@IfUndefined{ver@#1}{%
        \Hy@Error{%
          This should not happen!\MessageBreak
          Missing version of `#1'%
        }\@ehd
      }{%
        \def\x##1##2##3{%
          \expandafter\expandafter\expandafter\Hy@@VersionCheck
          \expandafter\expandafter\expandafter##2%
          \csname ver@##3\endcsname##1##1\@nil
        }%
        \x{ }\y{hyperref.sty}%
        \x{ }\z{#1}%
        \ifx\y\z
        \else
          \Hy@Error{%
            Version mismatch!\MessageBreak
            * \y: hyperref.sty\MessageBreak
            * \z: #1%
          }\@ehd
        \fi
      }%
    }%
  \endgroup
  \chardef\Hy@VersionChecked=1 %
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Hy@@VersionCheck}
%    \begin{macrocode}
\def\Hy@@VersionCheck #1#2 #3 #4\@nil{%
  \def#1{#2 #3}%
}
%    \end{macrocode}
%    \end{macro}
%
% \subsection{Checks with regular expressions}
%
%    \begin{macrocode}
\ltx@IfUndefined{pdfmatch}{%
  \let\Hy@Match\ltx@gobblefour
}{%
  \def\Hy@Match#1#2{%
    \begingroup
    \edef\^{\ltx@backslashchar\string^}%
    \edef\.{\ltx@backslashchar.}%
    \edef\[{\ltx@backslashchar[}% ]]
    \edef\${\ltx@backslashchar$}%
    \edef\({\ltx@backslashchar(}%
    \edef\){\ltx@backslashchar)}%
    \edef\|{\ltx@backslashchar|}%
    \edef\*{\ltx@backslashchar*}%
    \edef\+{\ltx@backslashchar+}%
    \edef\?{\ltx@backslashchar?}%
    \edef\{{\ltx@backslashchar\ltx@leftbracechar}%
    \edef\}{\ltx@rightbracechar}%
    \edef\\{\ltx@backslashchar\ltx@backslashchar}%
    \let\ \ltx@space
    \ifcase\pdfmatch{#2}{#1} %
      \endgroup
      \expandafter\ltx@secondoftwo
    \or
      \endgroup
      \expandafter\ltx@firstoftwo
    \else
      \Hy@Warning{%
        Internal error: Wrong pattern!\MessageBreak
        --> #2 <--\MessageBreak
        Pattern check ignored%
      }%
      \endgroup
      \expandafter\ltx@firstoftwo
    \fi
  }%
  \ltx@ifpackagelater{ltxcmds}{2010/09/11}{}{%
    \begingroup
      \lccode`0=`\{\relax
    \lowercase{\endgroup
      \def\ltx@leftbracechar{0}%
    }%
    \begingroup
      \lccode`0=`\}\relax
    \lowercase{\endgroup
      \def\ltx@rightbracechar{0}%
    }%
  }%
}
%    \end{macrocode}
%
% \subsection{Compatibility with format dumps}
%
%    \begin{macro}{\AfterBeginDocument}
%    For use with pre-compiled formats, created using the
%    |ldump|  package, there needs to be 2 hooks for adding
%    material delayed until |\begin{document}|.
%    These are called \cmd{\AfterBeginDocument} and
%    \cmd{\AtBeginDocument}.
%    If |ldump| is not loaded, then a single hook suffices
%    for normal \LaTeX{} processing.
%
%    The default definition of |\AfterBeginDocument| cannot
%    be done by |\let| because of problems with |xypic|.
%    \begin{macrocode}
\@ifundefined{AfterBeginDocument}{%
  \def\AfterBeginDocument{\AtBeginDocument}%
}{}%
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Hy@AtBeginDocument}
%    For the case that package `hyperref' is loaded
%    using \cs{AtBeginDocument}, we have to wrap the calls
%    of \cs{AtBeginDocument}/\cs{AfterBeginDocument} in
%    \cs{AtEndOfPackage}. However, packages must be
%    loaded in \cs{AtEndOfPackage} \emph{before} package
%    `kvoptions' has to perform its option cleanup.
%    Therefore we use a hook.
%    \begin{macrocode}
\def\Hy@AtBeginDocument{%
  \ltx@LocalAppendToMacro\Hy@AtBeginDocumentHook
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Hy@AtEndOfPackage}
%    \begin{macrocode}
\def\Hy@AtEndOfPackage{%
  \ltx@LocalAppendToMacro\Hy@AtEndOfPackageHook
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Hy@AtBeginDocumentHook}
%    \begin{macrocode}
\let\Hy@AtBeginDocumentHook\ltx@empty
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Hy@AtEndOfPackageHook}
%    \begin{macrocode}
\let\Hy@AtEndOfPackageHook\ltx@empty
%    \end{macrocode}
%    \end{macro}
%    Install the hook, before package `kvoptions' is loaded.
%    \begin{macrocode}
\AtEndOfPackage{%
  \Hy@AtEndOfPackageHook
  \let\Hy@AtEndOfPackageHook\@undefined
  \AfterBeginDocument{%
    \Hy@AtBeginDocumentHook{}%
    \let\Hy@AtBeginDocumentHook\@undefined
  }%
}
%    \end{macrocode}
%
%    Package kvoptions is used for processing options that are
%    given as key value pairs. The package provides
%    |\ProcessKeyvalOptions|, formerly known as
%    |\ProcessOptionsWithKV|.
%    \begin{macrocode}
\RequirePackage{kvoptions}[2009/07/21]
%    \end{macrocode}
%
% \subsection{Switches}
%    \begin{macrocode}
\newif\ifHy@stoppedearly
\newif\ifHy@typexml
\newif\ifHy@activeanchor
\newif\ifHy@backref
\newif\ifHy@bookmarks
\newif\ifHy@bookmarksnumbered
\newif\ifHy@bookmarksopen
\newif\ifHy@breaklinks
\newif\ifHy@pdfcenterwindow
\newif\ifHy@CJKbookmarks
\newif\ifHy@colorlinks
\newif\ifHy@draft
\let\Hy@finaltrue\Hy@draftfalse
\let\Hy@finalfalse\Hy@drafttrue
\newif\ifHy@pdfescapeform
\newif\ifHy@hyperfigures
\newif\ifHy@pdffitwindow
\newif\ifHy@frenchlinks
\newif\ifHy@hyperfootnotes
\newif\ifHy@hyperindex
\newif\ifHy@hypertexnames
\newif\ifHy@implicit
\newif\ifHy@linktocpage
\newif\ifHy@localanchorname
\newif\ifHy@pdfmenubar
\newif\ifHy@naturalnames
\newif\ifHy@nesting
\newif\ifHy@pdfnewwindowset
\newif\ifHy@pdfnewwindow
\newif\ifHy@ocgcolorlinks
\newif\ifHy@pageanchor
\newif\ifHy@pdfpagelabels
\newif\ifHy@pdfpagehidden
\newif\ifHy@pdfstring
\newif\ifHy@plainpages
\newif\ifHy@psize
\newif\ifHy@raiselinks
\newif\ifHy@seminarslides
\newif\ifHy@setpagesize
\newif\ifHy@texht
\newif\ifHy@pdftoolbar
\newif\ifHy@unicode
\newif\ifHy@pdfusetitle
\newif\ifHy@verbose
\let\Hy@debugtrue\Hy@verbosetrue
\let\Hy@debugfalse\Hy@verbosefalse
\newif\ifHy@pdfwindowui
\newif\ifHy@pdfdisplaydoctitle
\newif\ifHy@pdfa
%    \end{macrocode}
%    Defaults for the switches are now set.
%    \begin{macrocode}
\Hy@backreffalse
\Hy@bookmarksnumberedfalse
\Hy@bookmarksopenfalse
\Hy@bookmarkstrue
\Hy@breaklinksfalse
\Hy@pdfcenterwindowfalse
\Hy@CJKbookmarksfalse
\Hy@pdfescapeformfalse
\Hy@hyperfiguresfalse
\Hy@pdffitwindowfalse
\Hy@hyperfootnotestrue
\Hy@hyperindextrue
\Hy@hypertexnamestrue
\Hy@implicittrue
\Hy@linktocpagefalse
\Hy@localanchornamefalse
\Hy@pdfmenubartrue
\Hy@naturalnamesfalse
\Hy@nestingfalse
\Hy@pdfnewwindowsetfalse
\Hy@pdfnewwindowfalse
\Hy@pageanchortrue
\Hy@pdfpagelabelstrue
\Hy@pdfpagehiddenfalse
\Hy@pdfstringfalse
\Hy@plainpagesfalse
\Hy@raiselinksfalse
\Hy@setpagesizetrue
\Hy@texhtfalse
\Hy@pdftoolbartrue
\Hy@typexmlfalse
\Hy@unicodefalse
\Hy@pdfusetitlefalse
\Hy@verbosefalse
\Hy@pdfwindowuitrue
\Hy@pdfdisplaydoctitlefalse
\Hy@pdfafalse
%    \end{macrocode}
%
% \section{Common help macros}
%
%    \begin{macro}{\Hy@StepCount}
%    \begin{macrocode}
\def\Hy@StepCount#1{\advance#1 by 1 }%
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Hy@GlobalStepCount}
%    \begin{macrocode}
\def\Hy@GlobalStepCount#1{\global\advance#1 by 1 }%
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macrocode}
\newdimen\@linkdim
\let\Hy@driver\ltx@empty
\let\MaybeStopEarly\relax
\newcount\Hy@linkcounter
\newcount\Hy@pagecounter
\Hy@linkcounter0
\Hy@pagecounter0
%    \end{macrocode}
%
% \subsection{Macros for recursions}
%
%    \begin{macrocode}
\let\Hy@ReturnEnd\@empty
\long\def\Hy@ReturnAfterFiFiEnd#1\fi#2\Hy@ReturnEnd{\fi\fi#1}
\long\def\Hy@ReturnAfterElseFiFiEnd#1\else#2\Hy@ReturnEnd{\fi\fi#1}
%    \end{macrocode}
%
% \subsection{Babel's protection of shorthand characters}
%
%    \begin{macro}{\Hy@safe@activestrue}
%    \begin{macro}{\Hy@safe@activesfalse}
%    Babel's switch setting commands cannot used directly,
%    because they can be undefined if babel is not loaded.
%    \begin{macrocode}
\def\Hy@safe@activestrue{\csname @safe@activestrue\endcsname}
\def\Hy@safe@activesfalse{\csname @safe@activesfalse\endcsname}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%
% \subsection{Coordinate transformations}
%
%    At some places numbers in pdf units are
%    expected (eg: FitBH, ...). The following macros
%    perform the transformation from TeX units (pt)
%    to PDF units (bp).
%
%    \begin{macro}{\hypercalcbp}
%    The user macro \cmd{\hypercalcbp} can be used, for example,
%    inside option values:
%\begin{verbatim}
%pdfstartview={FitBH \hypercalcbp{\paperheight-\topmargin-1in}}
%\end{verbatim}
%    \begin{itemize}
%    \item
%    It cannot be used inside \cmd{\usepackage}, because
%    LaTeX expands the options before package hyperref
%    is loaded and \cmd{\hypercalcbp} is defined.
%    \item
%    With e-TeX extensions an expandable implementation
%    is very easy; \cmd{\hypercalcbp} can be used
%    everywhere and is expanded at use.
%    \item
%    Without e-TeX's features \cmd{\hypercalcbp} cannot be
%    implemented expandable (practically) and have to
%    be supported by \cmd{\hypercalcbpdef}.
%    Limitations:
%      \begin{itemize}
%      \item Works only in options that use \cmd{\hypercalcbpdef}
%            (currently only |pdfstartview|).
%      \item For calculations package |calc| has to be loaded.
%      \item The expansion of the argument is done at definition time.
%      \end{itemize}
%    \end{itemize}
%    Example (\TeX):
%\begin{verbatim}
%\usepackage{calc}
%\usepackage[...]{hyperref}
%\hypersetup{
%  pdfstartview={FitBH \hypercalcbp{\paperheight-\topmargin-1in
%    -\headheight-\headsep}
%}
%\end{verbatim}
%    \begin{macro}{\hypercalcbp}
%    \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname dimexpr\endcsname\relax
  \def\hypercalcbpdef#1#2{%
    \begingroup
      \toks@{}%
      \HyCal@scan#2\hypercalcbp\@nil
    \expandafter\endgroup
    \expandafter\def\expandafter#1\expandafter{\the\toks@}%
  }%
  \def\HyCal@scan#1\hypercalcbp#2\@nil{%
    \toks@\expandafter{\the\toks@ #1}%
    \ifx\\#2\\%
    \else
      \ltx@ReturnAfterFi{%
        \HyCal@do#2\@nil
      }%
    \fi
  }%
  \def\HyCal@do#1#2\@nil{%
    \@ifpackageloaded{calc}{}{%
      \Hy@Warning{%
        For calculations \string\hypercalcbp\space needs\MessageBreak
        package calc or e-TeX%
      }%
    }%
    \setlength{\dimen@}{#1}%
    \setlength{\dimen@}{0.99626401\dimen@}%
    \edef\x{%
      \toks@{%
        \the\toks@
        \strip@pt\dimen@
      }%
    }\x
    \HyCal@scan#2\@nil
  }%
\else
  \def\hypercalcbp#1{%
    \strip@pt\dimexpr 0.99626401\dimexpr(#1)\relax\relax
  }%
  \def\hypercalcbpdef{\def}%
\fi
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%
% \section{Dealing with PDF strings}\label{sec:pdfstring}
%    The PDF string stuff done by Heiko Oberdiek.
%
%    Naming convention: All internal commands that are only
%    needed by \cs{pdfstringdef} are prefixed with \cs{HyPsd@}.
%
% \subsection{Description of PDF strings}
%    The PDF specification defines several places to hold
%    text strings (bookmark names, document information,
%    text annotations, etc.).
%    The PDF strings have following properties:
%    \begin{itemize}
%    \item They are surrounded by parentheses. The hexadecimal form
%      is not supported.
%    \item Like PostScript language strings they use the same
%      escaping mechanism:\\
%      \begin{tabular}{ll}
%      |\\|& the backslash itself\\
%      \cs{)}, \cs{(}& unbalanced parentheses\\
%      \cs{n}, \cs{r}, \cs{t}, \cs{b}, \cs{f}& special white space
%        escape sequences\\
%      |\|\textit{|ddd|}& octal character code \textit{|ddd|}
%      \end{tabular}
%    \item Strings are stored either in PDFDocEncoding, which is a superset of
%      ISOLatin1 and is compatible with Unicode with character codes
%      below 256, or in Unicode.
%    \end{itemize}
%
% \subsection{Definition of
%    \texorpdfstring{\cs{pdfstringdef}}{\\pdfstringdef}}
%    The central macro for dealing with PDF strings is \cs{pdfstringdef}.
%    It defines a command |#1| to be the result of the conversion
%    from the string in |#2| to a legal PDFDocEncoded string.
%    Currently the definition is global, but this can be changed in
%    the future.
%
%    Important: In \TeX's view PDF strings are written to a file and
%    are expanded only in its mouth. Stomach commands that cannot
%    be expanded further aren't executed, they are written verbatim.
%    But the PDF reader that reads such a string isn't a \TeX{}
%    interpreter!
%
%    The macro \cs{pdfstringdef} consists of three main parts:
%    \begin{enumerate}
%    \item Preprocessing. Here the expansion is prepared. The encoding
%          is set and many commands are redefined, so that they work
%          appropriate.
%    \item Expansion. The \TeX{} string is expanded the first time
%          to get a PDF string.
%    \item Postprocessing. The result of the expansion is checked and
%          converted to the final form.
%    \end{enumerate}
%
%    \begin{macro}{\pdfstringdef}
%    \cs{pdfstringdef} works on the tokens in |#2| and converts them to
%    a PDF string as far as possible:
%    \begin{itemize}
%    \item The result should obey the rules of the PDF specification
%          for strings.
%    \item The string can safely processed by \TeX, because the
%          tokens have only catcodes 10 until 12.
%    \end{itemize}
%    The result is stored in the command token given in |#1|.
%    \begin{macrocode}
\def\pdfstringdef#1#2{%
%    \end{macrocode}
%    Many redefinitions are needed, so all the work is done in a group.
%    \begin{macrocode}
  \begingroup
%    \end{macrocode}
%
% \subsubsection{Preprocessing}
% \paragraph{Octal escape sequences.}
%    To avoid problems with eight bit or non printable characters, the octal
%    escape notation is supported. So most glyphs in the encoding definitions
%    for PD1 and PU produce these octal escape sequences.
%    All three octal digits have to be used:
%    \begin{itemize}
%    \item Wrong results are avoided, if digits follow that are not part of the
%          octal sequence.
%    \item Macros rely on the fact that the octal sequences always consist of
%          three digits (vtex driver, Unicode support).
%    \end{itemize}
%    The escape sequences start with a backslash. By \cs{string} it will be
%    printed. Therefore it is ensured that the \TeX{} escape character indeed
%    prints as a normal backslash.
%    Eventually this line can be removed, because this is standard
%    \LaTeX{} behaviour.
%    \begin{macrocode}
    \escapechar`\\%
%    \end{macrocode}
%    From the view of \TeX{} a octal sequence consists of the command tokens
%    \cs{0} until \cs{3} and two digits.
%    For saving tokens \cs{0}, \cs{1}, \cs{2}, and \cs{3} are directly
%    used without a preceding \cs{string} in the glyph definitions.
%    This is done here locally
%    by defining the \cs{0} until \cs{3} commands. So the user
%    can use octal escape sequences directly, the disadvantage is
%    that a previous definition of this short commands does not apply.
%    \begin{macrocode}
    \edef\0{\string\0}%
    \edef\1{\string\1}%
    \edef\2{\string\2}%
    \edef\3{\string\3}%
%    \end{macrocode}
% \paragraph{Setting font encoding.}
%    The unicode encoding
%    uses \cs{8} and \cs{9} as marker for the higher byte.
%    \cs{8} is an abbreviation for the higher bytes 0 until 7
%    that can be expressed by one digit. \cs{8} will be
%    converted to \cs{00}. However \cs{9} only marks the next
%    three digits as higher byte and will be removed later.
%
%    The encoding is set by \cs{enc@update} for optimizing reasons.
%    \begin{macrocode}
    \ifHy@unicode
      \edef\8{\string\8}%
      \edef\9{\string\9}%
      \fontencoding{PU}%
      \HyPsd@UTFviii
      \def\ifpdfstringunicode##1##2{##1}%
    \else
      \fontencoding{PD1}%
      \def\ifpdfstringunicode##1##2{##2}%
    \fi
    \let\utf@viii@undeferr\HyPsd@utf@viii@undeferr
    \enc@update
%    \end{macrocode}
%
% \paragraph{Internal encoding commands.}
%    \cs{pdfstringdef} interpretes text strings which are not allowed
%    to contain mathematical stuff. The text glyph commands will produce
%    a warning, if called in math mode. But this warning disturbs while
%    expanding. Therefore we check for math mode here, before
%    \cs{@inmathwarn} will be disabled (see below).
%    \begin{macrocode}
    \@inmathwarn\pdfstringdef
%    \end{macrocode}
%    If a glyph is used, that isn't in the PD1/PU encoding there will
%    be an infinite error loop, because the NFSS encoding stuff
%    have to be expanded unprotected (\cs{edef}), so that the
%    assigments of \cs{@changed@cmd} don't take place.
%    To patch this behaviour I only found \cs{@inmathwarn}
%    as a usable hook. While an \cs{edef} a warning message by
%    \cs{@inmathwarn} or \cs{TextSymbolUnavailable} cannot be give out,
%    so \cs{@inmathwarn} should be disabled. And with the help of it
%    the assignments in \cs{@changed@cmd} can easily be caught
%    (see below).
%    \begin{macrocode}
    \let\@inmathwarn\HyPsd@inmathwarn
%    \end{macrocode}
%
%    Unknown composite characters are built with \cs{add@accent},
%    so it is redefined to provide a warning.
%    \begin{macrocode}
    \let\add@accent\HyPsd@add@accent
%    \end{macrocode}
%
% \paragraph{Commands that don't use NFSS directly.}
%    There are several commands that prints characters in the
%    printable ASCII area that don't obey the NFSS, so they have
%    to be redefined here.
%    \begin{macrocode}
    \let\{\textbraceleft
    \let\}\textbraceright
    \let\\\textbackslash
    \let\#\textnumbersign
    \let\$\textdollar
    \let\%\textpercent
    \let\&\textampersand
%    \let\~\textasciitilde
    \let\_\textunderscore
    \let\P\textparagraph
    \let\ldots\textellipsis
    \let\dots\textellipsis
%    \end{macrocode}
%
% \paragraph{Newline}
%    \cmd{\newline} or \cmd{\\} do not work in bookmarks, in text
%    annotations they should expand to \cmd{\r}. In pdf strings
%    \cmd{\\} stands for a backslash. Therefore the commands
%    are disabled now. The user can redefine them for a result
%    what he want:
%    \begin{description}
%    \item[backslash:]
%      |\pdfstringdefDisableCommands{\let\\\textbackslash}|
%    \item[new line:]
%      |\pdfstringdefDisableCommands{\let\\\textCR}|
%    \item[disabled:]
%      |\pdfstringdefDisableCommands{\let\\\empty}|
%    \end{description}
%    At any case, however, the optional argument or the star
%    cannot be scanned in a 100\% sure manner.
%    \begin{macrocode}
    \def\\{\pdfstringdefWarn\\}%
    \def\newline{\pdfstringdefWarn\newline}%
%    \end{macrocode}
%
% \paragraph{Logos.}
%    Because the box shifting
%    used in the \TeX{} logo does not work while writing to a file,
%    the standard \TeX{} logos are redefined.
%    \begin{macrocode}
    \def\TeX{TeX}%
    \def\LaTeX{La\TeX}%
    \def\LaTeXe{%
      \LaTeX2%
      \ifHy@unicode\textepsilon\else e\fi
    }%
    \def\eTeX{%
      \ifHy@unicode\textepsilon\else e\fi
      -\TeX%
    }%
    \def\SliTeX{Sli\TeX}%
    \def\MF{Metafont}%
    \def\MP{Metapost}%
%    \end{macrocode}
%
% \paragraph{Standard font commands.}
%    Because font changes do not work, the standard font
%    switching commands are disabled.
%    \begin{macrocode}
    \let\fontencoding\@gobble
    \let\fontfamily\@gobble
    \let\fontseries\@gobble
    \let\fontshape\@gobble
    \let\fontsize\@gobbletwo
    \let\selectfont\@empty
    \let\usefont\@gobblefour
    \let\emph\@firstofone
    \let\textnormal\@firstofone
    \let\textrm\@firstofone
    \let\textsf\@firstofone
    \let\texttt\@firstofone
    \let\textbf\@firstofone
    \let\textmd\@firstofone
    \let\textit\@firstofone
    \let\textsc\@firstofone
    \let\textsl\@firstofone
    \let\textup\@firstofone
    \let\normalfont\@empty
    \let\rmfamily\@empty
    \let\sffamily\@empty
    \let\ttfamily\@empty
    \let\bfseries\@empty
    \let\mdseries\@empty
    \let\itshape\@empty
    \let\scshape\@empty
    \let\slshape\@empty
    \let\upshape\@empty
    \let\em\@empty
    \let\rm\@empty
    \let\Huge\@empty
    \let\LARGE\@empty
    \let\Large\@empty
    \let\footnotesize\@empty
    \let\huge\@empty
    \let\large\@empty
    \let\normalsize\@empty
    \let\scriptsize\@empty
    \let\small\@empty
    \let\tiny\@empty
    \let\mathversion\@gobble
    \let\phantom\@gobble
    \let\vphantom\@gobble
    \let\hphantom\@gobble
%    \end{macrocode}
%
% \paragraph{Environments.}
%    \begin{macrocode}
    \def\begin#1{\csname#1\endcsname}%
    \def\end#1{\csname end#1\endcsname}%
%    \end{macrocode}
%
% \paragraph{Package color.}
%    \begin{macrocode}
    \def\textcolor##1##{\@secondoftwo}%
%    \end{macrocode}
%
% \paragraph{Upper- and lowercase.}
%    \begin{macrocode}
    \def\MakeUppercase{\MakeUppercaseUnsupportedInPdfStrings}%
    \def\MakeLowercase{\MakeLowercaseUnsupportedInPdfStrings}%
%    \end{macrocode}
%
% \paragraph{Package babel.}
%    Whereever ``naturalnames'' is used, disable \cs{textlatin}
%    (from Babel 3.6k). Thanks to Felix Neubauer
%    (Email: \Email{Felix.Neubauer@gmx.net}).
%    \begin{macrocode}
    \let\foreignlanguage\@secondoftwo
    \let\textlatin\@firstofone
    \ltx@IfUndefined{language@group}{}{%
      \csname HyPsd@babel@\language@group\endcsname
    }%
    \HyPsd@GreekPatch
    \HyPsd@SpanishPatch
    \HyPsd@RussianPatch
%    \end{macrocode}
%    \begin{macrocode}
    \HyPsd@BabelPatch
%    \end{macrocode}
%
%    \begin{macrocode}
    \let\@safe@activestrue\relax
    \let\@safe@activesfalse\relax
%    \end{macrocode}
%
%    Disable \cs{cyr}, used in russianb.ldf.
%    \begin{macrocode}
    \let\cyr\relax
%    \end{macrocode}
%
%    Redefine \cs{es@roman}, used in spanish.ldf.
%    \begin{macrocode}
    \let\es@roman\@Roman
%    \end{macrocode}
%
% \paragraph{Package german.}
%    \begin{macrocode}
    \let\glqq\textglqq
    \let\grqq\textgrqq
    \let\glq\textglq
    \let\grq\textgrq
    \let\flqq\textflqq
    \let\frqq\textfrqq
    \let\flq\textflq
    \let\frq\textfrq
%    \end{macrocode}
%
% \paragraph{Package french.} The support is deferred, because
%    it needs |\GenericError| to be disabled (see below).
%
% \paragraph{Package FrenchPro.} This package uses:
%    \begin{quote}
%    |\if@mid@expandable{|not fully expandable code|}{|fully expandable code|}|
%    \end{quote}
%    \begin{macrocode}
    \let\if@mid@expandable\@firstoftwo
%    \end{macrocode}
%
% \paragraph{AMS classes.}
%    \begin{macrocode}
    \HyPsd@AMSclassfix
%    \end{macrocode}
%
% \paragraph{Redefinition of \cs{hspace}}
%    \cs{hspace} don't work in bookmarks, the following fix
%    tries to set a space if the argument is a positive length.
%    \begin{macrocode}
    \let\hspace\HyPsd@hspace
%    \end{macrocode}
%
% \paragraph{Commands of referencing and indexing systems.}
%    Some \LaTeX{} commands that are legal in \cs{section} commands
%    have to be disabled here.
%    \begin{macrocode}
    \let\label\@gobble
    \let\index\@gobble
    \let\glossary\@gobble
    \let\href\HyPsd@href
    \let\@mkboth\@gobbletwo
%    \end{macrocode}
%
%    The \cs{ref} and \cs{pageref} is much more complicate because of their
%    star form.
%    \begin{macrocode}
    \let\ref\HyPsd@ref
    \let\pageref\HyPsd@pageref
    \let\nameref\HyPsd@nameref
    \let\autoref\HyPsd@autoref
%    \end{macrocode}
%
% \paragraph{Miscellaneous commands.}
%    \begin{macrocode}
    \let\leavevmode\@empty
    \let\mbox\@empty
%    \end{macrocode}
%    \cs{halign} causes error messages because of the template
%    character |#|.
%    \begin{macrocode}
    \def\halign{\pdfstringdefWarn\halign\@gobble}%
%    \end{macrocode}
%    \begin{macrocode}
    \let\ignorespaces\HyPsd@ignorespaces
%    \end{macrocode}
%    \begin{macrocode}
    \let\Hy@SectionAnchorHref\@gobble
%    \end{macrocode}
%
% \paragraph{Patch for cjk bookmarks.}
%    \begin{macrocode}
    \HyPsd@CJKhook
%    \end{macrocode}
%
% \paragraph{User hook.}
%    The switch \cs{Hy@pdfstring} is turned on. So user commands
%    can detect that they are processed not to be typesetted within
%    \TeX's stomach,
%    but to be expanded by the mouth to give a PDF string.
%    At this place before interpreting the string in |#2| additional
%    redefinitions can by added by the hook \cs{pdfstringdefPreHook}.
%
%    The position in the middle of the redefinitions is a compromise:
%    The user should be able to provide his own (perhaps better)
%    redefinitions, but some commands should have their original
%    meaning, because they can be used in the hook (\cs{bgroup},
%    or \cs{@protected@testopt}, and \cs{@ifnextchar}
%    for \cs{renewcommand}).
%    \begin{macrocode}
    \Hy@pdfstringtrue
    \pdfstringdefPreHook
%    \end{macrocode}
%
% \paragraph{Spaces.}
%    For checking the token of the string, spaces must be masked, because
%    they cannot by caught by undelimited arguments.
%    \begin{macrocode}
    \HyPsd@LetUnexpandableSpace\space
    \HyPsd@LetUnexpandableSpace\ %
    \HyPsd@LetUnexpandableSpace~%
    \HyPsd@LetUnexpandableSpace\nobreakspace
%    \end{macrocode}
%
% \paragraph{Package xspace.}
%    \begin{macrocode}
    \ltx@IfUndefined{@xspace}{%
      \let\xspace\HyPsd@ITALCORR
    }{%
      \let\xspace\HyPsd@XSPACE
    }%
    \let\/\HyPsd@ITALCORR
    \let\bgroup\/%
    \let\egroup\/%
%    \end{macrocode}
%
% \paragraph{Redefinitions of miscellaneous commands.}
%    Hyphenation does not make sense.
%    \begin{macrocode}
    \let\discretionary\@gobbletwo
%    \end{macrocode}
%
%  \cs{@ifstar} is defined in \LaTeX\ as follows:
%\begin{verbatim}
%\def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}}
%\end{verbatim}
%    \cs{@ifnextchar} doesn't work, because it uses stomach
%    commands like \cs{let} and \cs{futurelet}. But it
%    doesn't break. Whereas |\@firstoftwo{#1}}| gives an
%    error message because \cs{@firstoftwo} misses its second
%    argument.
%
%    A mimicry of \cs{@ifnextchar} only with expandible commands
%    would be very extensive and the result would be only an
%    approximation. So here a cheaper solution follows
%    in order to get rid of the error message at least:
%    \begin{macrocode}
    \def\@ifnextchar{\HyPsd@ifnextchar\@ifnextchar}%
    \def\kernel@ifnextchar{\HyPsd@ifnextchar\kernel@ifnextchar}%
    \def\new@ifnextchar{\HyPsd@ifnextchar\new@ifnextchar}%
    \let\@protected@testopt\HyPsd@protected@testopt
%    \end{macrocode}
%    Support for package `xargs':
%    \begin{macrocode}
    \let\@protected@testopt@xargs\HyPsd@protected@testopt
%    \end{macrocode}
%
% \subsubsection{Expansion}
%    There are several possibilities to
%    expand tokens within \LaTeX:
%    \begin{description}
%    \item[\cs{protected@edef}:]
%      The weakest form isn't usable, because
%      it does not expand the font encoding commands. They are
%      made roboust and protect themselves.
%    \item[\cs{csname}:] First the string is
%      expanded whithin a \cs{csname} and \cs{endcsname}.
%      Then the command name is converted to characters
%      with catcode 12 by \cs{string} and the first
%      escape character removed by \cs{@gobble}.
%      This method has the great \emph{advantage} that
%      stomach tokens that aren't allowed in PDF strings are detected
%      by \TeX{} and reported as errors in order to force the user
%      to write correct things. So he get no wrong results by
%      forgetting the proofreading of his text.
%      But the \emph{disadvantage} is that old wrong code cannot
%      processed without errors. Mainly the error message is very cryptic
%      and for the normal user hard to understand. \TeX{} provides
%      no way to catch the error caused by \cs{csname} or allows to
%      support the user with a descriptive error message. Therefore
%      the experienced user had to enable this behaviour by an
%      option |exactdef| in previous versions less or equal 6.50.
%    \item[\cs{edef}] This version uses this standard form for expansion.
%      It is stronger than \LaTeX's \cs{protected@edef}.
%      So the font encoding mechanism works and the glyph commands
%      are converted to the correct tokens for PDF strings whith the
%      definitions of the PD1 encoding.
%      Because the protecting mechanism of \LaTeX{} doesn't work
%      within an \cs{edef}, there are situations thinkable where
%      code can break. For example, assignments and definitions aren't
%      performed and so undefined command errors or argument
%      parsing errors can occur. But this is only a compatibility problem
%      with old texts. Now there are possibilities to write
%      code that gives correct PDF strings (see \cs{texorpdfstring}).
%      In the most cases unexpandable commands and tokens
%      (math shift, grouping characters) remains. They
%      don't cause an error like with \cs{csname}. However a PDF reader
%      isn't \TeX{}, so these tokens are viewed verbatim. So
%      this version detects them now, and removes them with an
%      descriptive warning for the user. As additional features
%      xspace support is possible and grouping characters can be
%      used without problems, because they are removed silently.
%    \end{description}
%
% \paragraph{Generic messages.}
%    While expanding via \cs{xdef} the |\Generic...| messages
%    don't work and causes problems (error messages, invalid |.out|
%    file). So they are disabled while expanding and removed silently,
%    because a user warning would be too expensive (memory and runtime,
%    |\pdfstringdef| is slow enough).
%    \begin{macrocode}
    \begingroup
      \let\GenericError\@gobblefour
      \let\GenericWarning\@gobbletwo
      \let\GenericInfo\@gobbletwo
%    \end{macrocode}
%
% \paragraph{Package french.}
%    This fix only works, if \cs{GenericError} is disabled.
%    \begin{macrocode}
      \ifx\nofrenchguillemets\@undefined
      \else
        \nofrenchguillemets
      \fi
%    \end{macrocode}
%
% \paragraph{Definition commands and expansion.}
%    Redefining the defining commands (see sec. \ref{defcmd}).
%    The original meaning of \cs{xdef} is saved in \cs{Hy@temp}.
%    \begin{macrocode}
      \let\Hy@temp\xdef
      \let\def\HyPsd@DefCommand
      \let\gdef\HyPsd@DefCommand
      \let\edef\HyPsd@DefCommand
      \let\xdef\HyPsd@DefCommand
      \let\futurelet\HyPsd@LetCommand
      \let\let\HyPsd@LetCommand
      \Hy@temp#1{#2}%
    \endgroup
%    \end{macrocode}
%
% \subsubsection{Postprocessing}
%    If the string is empty time can be saved by omitting the
%    postprocessing process.
%    \begin{macrocode}
    \ifx#1\@empty
    \else
%    \end{macrocode}
%
% \paragraph{Protecting spaces and removing grouping characters.}
%    In order to check the tokens we must separate them. This will be
%    done with \TeX's argument parsing. With this method
%    we must the following item takes into account, that makes
%    makes things a litte more complicate:
%    \begin{itemize}
%    \item \TeX{} does not accept a space as an undelimited argument,
%    it cancels space tokens while looking for an undelimited
%    argument. Therefore we must protect the spaces now.
%    \item An argument can be a single token or a group of many tokens.
%    And within curly braces tokens aren't find by \TeX's
%    argument scanning process. Third curly braces as grouping characters
%    cannot be expanded further, so they don't vanish by the string
%    expansion above. So these characters with catcode 1 and 2 are
%    removed in the following and replaced by an marker for the xspace
%    support.
%    \item \TeX{} silently removes the outmost pair of braces of an
%      argument. To prevent this on unwanted places, in the following
%    the character \verb+|+ is appended to the string to make an outer
%    brace to an inner one.
%    \end{itemize}
%    First the top level spaces are protected by replacing. Then the
%    string is scanned to detect token groups. Each token group
%    will now be space protected and again scanned for another
%    token groups.
%    \begin{macrocode}
      \HyPsd@ProtectSpaces#1%
      \let\HyPsd@String\@empty
      \expandafter\HyPsd@RemoveBraces\expandafter{#1|}%
      \global\let#1\HyPsd@String
%    \end{macrocode}
%
% \paragraph{Check tokens.}
%    After removing the spaces and the grouping characters
%    the string now should only consists of the following tokens/catcodes:\\
%    \begin{tabular}{rl}
%      0&command names with start with an escape character.\\
%      3&math shift\\
%      4&alignment tabs\\
%      6&parameter, but this is unlikely.\\
%      7&superscript\\
%      8&subscript\\
%     11&letter\\
%     12&other\\
%     13&commands that are active characters.
%    \end{tabular}
%
%    After \cs{HyPsd@CheckCatcodes} the command \cs{HyPsd@RemoveMask} is
%    reused to remove the group protection character \verb+|+.
%    This character is needed to ensure that the string at least
%    consists of one token if \cs{HyPsd@CheckCatcodes}
%    is called.
%
%    Because of internal local assignments and tabulars
%    group braces are used.
%    \begin{macrocode}
      \let\HyPsd@SPACEOPTI\relax
      {%
         \let\HyPsd@String\@empty
         \expandafter\HyPsd@CheckCatcodes#1\HyPsd@End
         \global\let#1\HyPsd@String
      }%
      \expandafter\HyPsd@RemoveMask\expandafter
        |\expandafter\@empty#1\HyPsd@End#1%
%    \end{macrocode}
%    \cs{HyPsd@CheckCatcodes} should no have removed the tokens with
%    catcode 3, 4, 7, and 8. Because a parameter token (6) would
%    cause to many errors before, there should now be only tokens
%    with catcodes 11 or 12. So I think there is no need for
%    a safety step like:
%\begin{verbatim}
%\xdef#1{\expandafter\strip@prefix\meaning#1}%
%\end{verbatim}
% \paragraph{Looking for wrong glyphs.}
%    The case that glyphs aren't defined in the PD1 encoding
%    is caught above in such a way, that the glyph name and
%    a marker is inserted into the string. Now we can safely
%    scan the string for this marker and provide a descriptive
%    warning.
%    \begin{macrocode}
      \expandafter\HyPsd@Subst\expandafter{\HyPsd@GLYPHERR}{\relax}#1%
      \let\HyPsd@String\@empty
      \expandafter\HyPsd@GlyphProcess#1\relax\@empty
      \global\let#1\HyPsd@String
%    \end{macrocode}
%
% \paragraph{Backslash.}
%    The double backslash disturbs parsing octal sequenzes, for
%    example in an string like |abc\\051| the sequence \cs{051}
%    is detected although the second \cs{} belongs to the
%    first backslash.
%    \begin{macrocode}
      \HyPsd@StringSubst{\\}{\textbackslash}#1%
%    \end{macrocode}
%
% \paragraph{Spaces.}
%    All spaces have already the form \cs{040}.
%    The last postprocessing step will
%    be an optimizing of the spaces, so we already introduce
%    already the necessary command \cs{HyPsd@SPACEOPTI}.
%    But first it is defined to be \cs{relax} in order to
%    prevent a too early expansion by an \cs{edef}.
%    Secondly a \cs{relax} serves as a marker for
%    a token that is detected by \cs{xspace}.
%
%    The code of |frenchb.ldf| can produce an additional
%    space before \cs{guillemotright}, because \cs{lastskip}
%    and \cs{unskip} do not work. Therefore it is removed here.
%    \begin{macrocode}
      \ifHy@unicode
        \expandafter\HyPsd@StringSubst\csname 80\040\endcsname
          \HyPsd@SPACEOPTI#1%
        \edef\Hy@temp@A{\HyPsd@SPACEOPTI\HyPsd@SPACEOPTI\80\273}%
        \expandafter\HyPsd@Subst\expandafter{\Hy@temp@A}%
          {\HyPsd@SPACEOPTI\80\273}#1%
      \else
        \HyPsd@StringSubst{\040}\HyPsd@SPACEOPTI#1%
        \expandafter\HyPsd@Subst\expandafter{%
          \expandafter\HyPsd@SPACEOPTI\expandafter\HyPsd@SPACEOPTI
          \string\273}{\HyPsd@SPACEOPTI\273}#1%
      \fi
%    \end{macrocode}
%
% \paragraph{Right parenthesis.}
%    Also \cs{xspace} detects a right parenthesis.
%    For the \cs{xspace} support and the following
%    parenthesis check the different parenthesis
%    notations |)|, \cs{)}, and \cs{051} are converted
%    to one type \cs{)} and before \cs{HyPsd@empty}
%    with the meaning of \cs{relax} is introduced for
%    \cs{xspace}. By redefining to \cs{@empty} \cs{HyPsd@empty}
%    can easily removed later.
%    \begin{macrocode}
      \ifHy@unicode
        \HyPsd@StringSubst{\)}{\80\051}#1%
        \HyPsd@Subst){\80\051}#1%
        \let\HyPsd@empty\relax
        \expandafter\HyPsd@StringSubst\csname 80\051\endcsname
          {\HyPsd@empty\80\051}#1%
      \else
        \HyPsd@StringSubst{\)}{\051}#1%
        \HyPsd@Subst){\051}#1%
        \let\HyPsd@empty\relax
        \HyPsd@StringSubst{\051}{\HyPsd@empty\string\)}#1%
      \fi
%    \end{macrocode}
%
% \paragraph{Support for package \texttt{xspace}.}
%    \cs{xspace} looks for the next token and decides if it
%    expands to a space or not. Following tokens prevent its
%    transformation to a space: Beginning and end of group,
%    handled above by replacing by an italic correction,
%    several punctuation marks, a closing parentheses, and
%    several spaces.
%
%    Without package |xspace| there are tokens with catcode 11 and 12,
%    \cs{HyPsd@empty} and \cs{HyPsd@SPACEOPTI}. With package |xspace|
%    marker for the italic correction \cs{/} and \cs{xspace} come with.
%    In the package |xspace| case the two markers are replaced by
%    commands and an \cs{edef} performs the \cs{xspace} processing.
%
%    In the opposite of the original \cs{xspace} \cs{HyPsd@xspace} uses
%    an argument instead of a \cs{futurelet}, so we have to provide
%    such an argument, if \cs{HyPsd@xspace} comes last. Because
%    \cs{HyPsd@Subst} with several equal tokens (|--|) needs a safe
%    last token, in both cases
%    the string gets an additional \cs{HyPsd@empty}.
%    \begin{macrocode}
      \expandafter\HyPsd@Subst\expandafter{\/}\HyPsd@empty#1%
      \ltx@IfUndefined{@xspace}{%
      }{%
        \let\HyPsd@xspace\relax
        \expandafter\HyPsd@Subst\expandafter
          {\HyPsd@XSPACE}\HyPsd@xspace#1%
        \let\HyPsd@xspace\HyPsd@doxspace
      }%
      \xdef#1{#1\HyPsd@empty}%
%    \end{macrocode}
%
% \paragraph{Ligatures.}
%    \TeX{} forms ligatures in its stomach, but the PDF strings are
%    treated only by \TeX's mouth. The PDFDocEncoding contains
%    some ligatures, but the current
%    version 3 of the AcrobatReader lacks the |fi| and |fl| glyphs, and
%    the Linux version lacks the |emdash| and |endash| glyphs.
%    So the necessary code is provided here, but currently disabled,
%    hoping that version 4 of the AcrobatReader is better.
%    To break the ligatures the user can use an empty group,
%    because it leads to an insertion of an \cs{HyPsd@empty}.
%    If this ligature code will be enabled some day, then the italic
%    correction should also break the ligatures. Currently this occurs
%    only, if package |xspace| is loaded.
%
%    Since newer AcrobatReader versions now show the en- and emdash in
%    a correct way (AR7/Linux, AR8/Linux), the substitution code
%    for them is enabled starting with version 6.78l.
%    \begin{macrocode}
      \HyPsd@Subst{---}\textemdash#1%
      \HyPsd@Subst{--}\textendash#1%
%      \HyPsd@Subst{fi}\textfi#1%
%      \HyPsd@Subst{fl}\textfl#1%
      \HyPsd@Subst{!`}\textexclamdown#1%
      \HyPsd@Subst{?`}\textquestiondown#1%
%    \end{macrocode}
%     With the next \cs{edef} we get rid of the token \cs{HyPsd@empty}.
%    \begin{macrocode}
      \let\HyPsd@empty\@empty
%    \end{macrocode}
%
% \paragraph{Left parentheses.}
%    Left parentheses are now converted to safe forms to avoid
%    problems with unmatched ones (\cs{(} with PDFDocEncoding,
%    the octal sequence with Unicode.
%
%    An optimization is possible. Matched parentheses can replaced
%    by a |()| pair. But this code is removed to save \TeX{} memory
%    and time.
%    \begin{macrocode}
      \ifHy@unicode
        \HyPsd@StringSubst\(\textparenleft#1%
        \HyPsd@Subst(\textparenleft#1%
      \else
        \HyPsd@StringSubst\({\050}#1%
        \HyPsd@Subst({\050}#1%
        \HyPsd@StringSubst{\050}{\string\(}#1%
      \fi
%    \end{macrocode}
%
% \paragraph{Optimizing spaces.}
%    Spaces are often used, but they have a very long form \cs{040}.
%    They are converted back to real spaces, but not all, so that
%    no space follows after another. In the bookmark case several
%    spaces are written to the |.out| file, but if the entries
%    are read back, several spaces are merged to a single one.
%
%    With Unicode the spaces are replaced by their octal sequences.
%    \begin{macrocode}
      \ifHy@unicode
        \edef\HyPsd@SPACEOPTI{\80\040}%
      \else
        \let\HyPsd@SPACEOPTI\HyPsd@spaceopti
      \fi
      \xdef#1{#1\@empty}%
    \fi
%    \end{macrocode}
%
% \paragraph{Converting to Unicode.}
%    At last the eight bit letters have to be converted to Unicode,
%    the masks \cs{8} and \cs{9} are removed and the Unicode
%    marker is added.
%    \begin{macrocode}
  \endgroup
  \begingroup
    \ifHy@unicode
      \HyPsd@ConvertToUnicode#1%
%    \end{macrocode}
%
% \paragraph{Try conversion back to PDFDocEncoding.}
%
%    \begin{macrocode}
      \ifx\HyPsd@pdfencoding\HyPsd@pdfencoding@auto
        \ltx@IfUndefined{StringEncodingConvertTest}{%
        }{%
          \EdefUnescapeString\HyPsd@temp#1%
          \ifxetex
            \let\HyPsd@UnescapedString\HyPsd@temp
            \StringEncodingConvertTest\HyPsd@temp\HyPsd@temp
                                      {utf16be}{ascii-print}{%
              \EdefEscapeString\HyPsd@temp\HyPsd@temp
              \global\let#1\HyPsd@temp
              \HyPsd@EscapeTeX#1%
              \Hy@unicodefalse
            }{%
              \HyPsd@ToBigChars#1%
            }%
          \else
            \StringEncodingConvertTest\HyPsd@temp\HyPsd@temp
                                      {utf16be}{pdfdoc}{%
              \EdefEscapeString\HyPsd@temp\HyPsd@temp
              \global\let#1\HyPsd@temp
              \HyPsd@EscapeTeX#1%
              \Hy@unicodefalse
            }{}%
          \fi
        }%
      \fi
    \fi
    \HyPsd@XeTeXBigCharsfalse
%    \end{macrocode}
%
% \paragraph{User hook.}
%    The hook \cs{pdfstringdefPostHook} can be used
%    for the purpose to postprocess the string further.
%    \begin{macrocode}
    \pdfstringdefPostHook#1%
  \endgroup
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\Hy@pdfstringdef}
%    \begin{macrocode}
\def\Hy@pdfstringdef#1#2{%
  \pdfstringdef\Hy@gtemp{#2}%
  \let#1\Hy@gtemp
}
%    \end{macrocode}
%    \end{macro}
%
% \subsection{Encodings}
%
% \subsubsection{Xe\TeX}
%
%    \begin{macrocode}
\edef\Hy@temp{\catcode0=\the\catcode0\relax}
\catcode\z@=12 %
\ifxetex
  \expandafter\@firstofone
\else
  \let\HyPsd@XeTeXBigCharstrue\@empty
  \let\HyPsd@XeTeXBigCharsfalse\@empty
  \expandafter\@gobble
\fi
{%
  \newif\ifHyPsd@XeTeXBigChars
  \def\HyPsd@XeTeXBigCharsfalse{%
    \global\let\ifHyPsd@XeTeXBigChars\iffalse
  }%
  \def\HyPsd@XeTeXBigCharstrue{%
    \global\let\ifHyPsd@XeTeXBigChars\iftrue
  }%
  \def\HyPsd@ToBigChars#1{%
    \ifHyPsd@XeTeXBigChars
      \EdefEscapeHex\HyPsd@UnescapedString{%
        \expandafter\@gobbletwo\HyPsd@UnescapedString
      }%
      \begingroup
        \toks@{}%
        \escapechar=92\relax
        \let\x\HyPsd@ToBigChar
        \expandafter\HyPsd@ToBigChar\HyPsd@UnescapedString
        \relax\relax\relax\relax\relax\relax\relax
      \edef\x{%
        \endgroup
        \gdef\noexpand#1{\the\toks@}%
      }%
      \x
    \fi
  }%
  \def\HyPsd@ToBigChar#1#2#3#4{%
    \ifx\relax#1\relax
      \let\x\relax
    \else
      \count@="#1#2#3#4\relax
      \let\y\@empty
      \lccode\z@=\count@
      \ifnum\count@=40 % (
        \let\y\@backslashchar
      \else
        \ifnum\count@=41 % )
          \let\y\@backslashchar
        \else
          \ifnum\count@=92 % backslash
            \let\y\@backslashchar
          \else
            \ifnum\count@=10 % newline
              \edef\y##1{\string\n}%
            \else
              \ifnum\count@=13 % carriage return
                \edef\y##1{\string\r}%
              \fi
            \fi
          \fi
        \fi
      \fi
      \lowercase{%
        \toks@\expandafter{%
          \the\expandafter\toks@
          \y
          ^^@%
        }%
      }%
    \fi
    \x
  }%
}
\Hy@temp
%    \end{macrocode}
%
% \subsubsection{Workaround for package linguex}
%
%    \begin{macrocode}
\@ifpackageloaded{linguex}{%
  \let\HyLinguex@OrgB\b
  \let\HyLinguex@OrgC\c
  \let\HyLinguex@OrgD\d
  \def\HyLinguex@Restore{%
    \let\b\HyLinguex@OrgB
    \let\c\HyLinguex@OrgC
    \let\d\HyLinguex@OrgD
  }%
  \Hy@AtEndOfPackage{%
    \pdfstringdefDisableCommands{%
      \ltx@IfUndefined{oldb}{}{\let\b\oldb}%
      \ltx@IfUndefined{oldc}{}{\let\c\oldc}%
      \ltx@IfUndefined{oldd}{}{\let\d\oldd}%
    }%
  }%
}{%
  \let\HyLinguex@Restore\relax
}%
%    \end{macrocode}
%
% \subsubsection{PD1 encoding}
%    The PD1 encoding implements the PDFDocEncoding for use with
%    \LaTeXe's NFSS. Because the informational strings are not set by
%    \TeX's typesetting mechanism but for interpreting by the PDF reader,
%    the glyphs of the PD1 encoding are implemented to be safely written
%    to a file (PDF output file, |.out| file).
%
%    The  PD1 encoding can be specified as an option of the 'fontenc'  package
%    or loaded here. It does not matter what font family is selected,
%    as \TeX{} does not process it anyway. So use CM.
%    \begin{macrocode}
\@ifundefined{T@PD1}{%
  \input{pd1enc.def}%
  \HyLinguex@Restore
}{}
\DeclareFontFamily{PD1}{pdf}{}
\DeclareFontShape{PD1}{pdf}{m}{n}{ <-> cmr10 }{}
\DeclareFontSubstitution{PD1}{pdf}{m}{n}
%    \end{macrocode}
%
% \subsubsection{PU encoding}
%    The PU encoding implements the Unicode encoding for use with
%    \LaTeX's NFSS. Because of large memory requirements the
%    encoding file for Unicode support is only loaded, if option
%    |unicode| is specified as package option.
%    \begin{macro}{\HyPsd@InitUnicode}
%    Because the file |puenc.def| takes a lot of memory, the loading
%    is defined in the macro \cs{HyPsd@InitUnicode} called by
%    the package option |unicode|.
%    \begin{macrocode}
\def\HyPsd@InitUnicode{%
  \@ifundefined{T@PU}{%
    \input{puenc.def}%
    \HyLinguex@Restore
  }{}%
  \DeclareFontFamily{PU}{pdf}{}%
  \DeclareFontShape{PU}{pdf}{m}{n}{ <-> cmr10 }{}%
  \DeclareFontSubstitution{PU}{pdf}{m}{n}%
  \let\HyPsd@InitUnicode\relax
}
%    \end{macrocode}
%    \end{macro}
%
% \subsection{Additional user commands}
%
% \subsubsection{^^A
%   \texorpdfstring{\cs{texorpdfstring}}{\\texorpdfstring}^^A
% }
%    \begin{macro}{\texorpdfstring}
%    While expanding the string in \cs{pdfstringdef} the switch
%    \cs{ifHy@pdfstring} is set. This is used by the
%    full expandible macro \cs{texorpdfstring}. It expects
%    two arguments, the first contains the string that will be
%    set and processed by \TeX's stomach, the second
%    contains the replacement for PDF strings.
%    \begin{macrocode}
\def\texorpdfstring{%
   \ifHy@pdfstring
     \expandafter\@secondoftwo
   \else
     \expandafter\@firstoftwo
   \fi
}
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Hooks for
%    \texorpdfstring{\cs{pdfstringdef}}{\\pdfstringdef}^^A
% }
%    \begin{macro}{\pdfstringdefPreHook}
%    \begin{macro}{\pdfstringdefPostHook}
%    Default definition of the hooks for \cs{pdfstringdef}.
%    The construct \cs{@ifundefined} with \cs{let} is a little bit
%    faster than \cs{providecommand}.
%    \begin{macrocode}
\@ifundefined{pdfstringdefPreHook}{%
  \let\pdfstringdefPreHook\@empty
}{}
\@ifundefined{pdfstringdefPostHook}{%
  \let\pdfstringdefPostHook\@gobble
}{}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%
%    \begin{macro}{\pdfstringdefDisableCommands}
%    In \cmd{\pdfstringdefPreHook} the user can add
%    code that is executed before the string, that have
%    to be converted by \cmd{\pdfstringdef}, is expanded.
%    So replacements for problematic macros can be given.
%    The code in \cmd{\pdfstringdefPreHook} should not
%    be replaced perhaps by an \cmd{\renewcommand},
%    because a previous meaning gets lost.
%
%    Macro \cmd{\pdfstringdefDisableCommands} avoids this,
%    because it reuses the old meaning of the hook and appends
%    the new code to \cmd{\pdfstringdefPreHook}, e.g.:
%\begin{verbatim}
%\pdfstringdefDisableCommands{%
%  \let~\textasciitilde
%  \def\url{\pdfstringdefWarn\url}%
%  \let\textcolor\@gobble
%}%
%\end{verbatim}
%    In the argument of \cmd{\pdfstringdefDisableCommands} the
%    character |@| can be used in command names. So it is easy
%    to use useful \LaTeX{} commands like \cmd{\@gobble} or
%    \cmd{\@firstofone}.
%    \begin{macrocode}
\def\pdfstringdefDisableCommands{%
  \begingroup
    \makeatletter
    \HyPsd@DisableCommands
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@DisableCommands}
%    \begin{macrocode}
\long\def\HyPsd@DisableCommands#1{%
    \ltx@GlobalAppendToMacro\pdfstringdefPreHook{#1}%
  \endgroup
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\pdfstringdefWarn}
%    The purpose of \cmd{\pdfstringdefWarn} is to produce
%    a warning message, so the user can see, that something
%    can go wrong with the conversion to PDF strings.
%
%    The prefix |\<>-| is added to the token. \cmd{\noexpand}
%    protects the probably undefined one during the first
%    expansion step. Then \cmd{\HyPsd@CheckCatcodes} can
%    detect the not allowed token, \cmd{\HyPsd@CatcodeWarning}
%    prints a warning message, after \cmd{\HyPsd@RemovePrefix}
%    has removed the prefix.
%
%    \cmd{\pdfstringdefWarn} is intended for document authors or
%    package writers, examples for use can be seen in the definition
%    of \cmd{\HyPsd@ifnextchar} or \cmd{\HyPsd@protected@testopt}.
%    \begin{macrocode}
\def\pdfstringdefWarn#1{%
   \expandafter\noexpand\csname<>-\string#1\endcsname
}
%    \end{macrocode}
%    \end{macro}
%
% \subsection{Help macros for expansion}
%
% \subsubsection{\cs{ignorespaces}}
%
%    \begin{macro}{\HyPsd@ignorespaces}
%    With the help of a trick using \cs{romannumeral} the
%    effect of \cs{ignorespaces} can be simulated a little,
%    In a special case using an alphabetic constant
%    \cs{romannumeral} eats an optional space. If the constant
%    is zero, then the \cs{romannumeral} expression vanishes.
%    The following macro uses this trick twice, thus \cs{HyPsd@ignorespaces}
%    eats up to two following spaces.^^A
%    \begin{macrocode}
\begingroup
  \catcode0=12 %
  \def\x{\endgroup
    \def\HyPsd@ignorespaces{%
      \romannumeral\expandafter`\expandafter^^@%
      \romannumeral`^^@%
    }%
  }%
\x
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Babel languages}
%
% Since version 2008/03/16 v3.8j babel uses inside \cs{AtBeginDocument}:
%\begin{quote}
%\begin{verbatim}
%\pdfstringdefDisableCommands{%
%  \languageshorthands{system}%
%}
%\end{verbatim}
%\end{quote}
%    As consequence the shorthands are shown in the bookmarks,
%    not its result. Therefore \cs{languageshorthands} is
%    disabled before the user hook. If there is a need to
%    use the command, then \cs{HyOrg@languageshorthands}
%    can be used inside \cs{pdfstringdefDisableCommands}.
%    \begin{macrocode}
\def\HyPsd@BabelPatch{%
  \let\HyOrg@languageshorthands\languageshorthands
  \let\languageshorthands\HyPsd@LanguageShorthands
}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname pdf@strcmp\endcsname\relax
  \let\HyPsd@langshort@system\@empty
  \def\HyPsd@LanguageShorthands#1{%
    \expandafter\ifx\csname HyPsd@langshort@#1\endcsname
                    \HyPsd@langshort@system
      \expandafter\@gobble
    \else
      \expandafter\@firstofone
    \fi
    {%
      \HyOrg@languageshorthands{#1}%
    }%
  }%
\else
  \def\HyPsd@LanguageShorthands#1{%
    \ifnum\pdf@strcmp{#1}{system}=\z@
      \expandafter\@gobble
    \else
      \expandafter\@firstofone
    \fi
    {%
      \HyOrg@languageshorthands{#1}%
    }%
  }%
\fi
\def\Hy@temp{%
  \@ifpackageloaded{babel}{%
    \@ifpackagelater{babel}{2008/03/16}{%
      \let\Hy@temp\@empty
    }{%
      \def\HyPsd@BabelPatch{%
        \let\HyOrg@languageshorthands\languageshorthands
      }%
    }%
  }{}%
}
\Hy@temp
\expandafter\Hy@AtBeginDocument\expandafter{\Hy@temp}
%    \end{macrocode}
%
%    \begin{macrocode}
\newif\ifHy@next
%    \end{macrocode}
%
%    Nothing to do for english.
%    \begin{macrocode}
\ltx@IfUndefined{danish@sh@"@sel}{}{%
  \def\HyPsd@babel@danish{%
    \declare@shorthand{danish}{"|}{}%
    \declare@shorthand{danish}{"~}{-}%
  }%
}
\ltx@IfUndefined{dutch@sh@"@sel}{}{%
  \def\HyPsd@babel@dutch{%
    \declare@shorthand{dutch}{"|}{}%
    \declare@shorthand{dutch}{"~}{-}%
  }%
}
\ltx@IfUndefined{finnish@sh@"@sel}{}{%
  \def\HyPsd@babel@finnish{%
    \declare@shorthand{finnish}{"|}{}%
  }%
}
\ltx@IfUndefined{french@sh@:@sel}{}{%
  \def\HyPsd@babel@frenchb{%
    \def\guill@spacing{ }%
  }%
}
\ltx@IfUndefined{german@sh@"@sel}{}{%
  \def\HyPsd@babel@german{%
    \declare@shorthand{german}{"f}{f}%
    \declare@shorthand{german}{"|}{}%
    \declare@shorthand{german}{"~}{-}%
  }%
}
\ltx@IfUndefined{macedonian@sh@"@sel}{}{%
  \def\HyPsd@babel@macedonian{%
    \declare@shorthand{macedonian}{"|}{}%
    \declare@shorthand{macedonian}{"~}{-}%
  }%
}{}
\ltx@IfUndefined{ngerman@sh@"@sel}{}{%
  \def\HyPsd@babel@ngerman{%
    \declare@shorthand{ngerman}{"|}{}%
    \declare@shorthand{ngerman}{"~}{-}%
  }%
}
\ltx@IfUndefined{portuges@sh@"@sel}{}{%
  \def\HyPsd@babel@portuges{%
    \declare@shorthand{portuges}{"|}{}%
  }%
}
\ltx@IfUndefined{russian@sh@"@sel}{}{%
  \def\HyPsd@babel@russian{%
    \declare@shorthand{russian}{"|}{}%
    \declare@shorthand{russian}{"~}{-}%
  }%
}
\ltx@IfUndefined{slovene@sh@"@sel}{}{%
  \def\HyPsd@babel@slovene{%
    \declare@shorthand{slovene}{"|}{}%
  }%
}
%    \end{macrocode}
%    Nested quoting environments are not supported (|<<|, |>>|).
%    \begin{macrocode}
\ltx@IfUndefined{spanish@sh@>@sel}{}{%
  \def\HyPsd@babel@spanish{%
    \declare@shorthand{spanish}{<<}{\guillemotleft}%
    \declare@shorthand{spanish}{>>}{\guillemotright}%
    \declare@shorthand{spanish}{"=}{-}%
    \declare@shorthand{spanish}{"~}{-}%
    \declare@shorthand{spanish}{"!}{\textexclamdown}%
    \declare@shorthand{spanish}{"?}{\textquestiondown}%
  }%
}
\ltx@IfUndefined{swedish@sh@"@sel}{}{%
  \def\HyPsd@babel@swedish{%
    \declare@shorthand{swedish}{"|}{}%
    \declare@shorthand{swedish}{"~}{-}%
  }%
}
\ltx@IfUndefined{ukrainian@sh@"@sel}{}{%
  \def\HyPsd@babel@ukrainian{%
    \declare@shorthand{ukrainian}{"|}{}%
    \declare@shorthand{ukrainian}{"~}{-}%
  }%
}
\ltx@IfUndefined{usorbian@sh@"@sel}{}{%
  \def\HyPsd@babel@usorbian{%
    \declare@shorthand{usorbian}{"f}{f}%
    \declare@shorthand{usorbian}{"|}{}%
  }%
}
%    \end{macrocode}
%    \begin{macrocode}
\ltx@IfUndefined{greek@sh@\string~@sel}{%
  \let\HyPsd@GreekPatch\@empty
}{%
  \def\HyPsd@GreekPatch{%
    \let\greeknumeral\HyPsd@greeknumeral
    \let\Greeknumeral\HyPsd@Greeknumeral
  }%
}
\def\HyPsd@greeknumeral#1{%
  \HyPsd@GreekNum\@firstoftwo{#1}%
}
\def\HyPsd@Greeknumeral#1{%
  \HyPsd@GreekNum\@secondoftwo{#1}%
}
\def\HyPsd@GreekNum#1#2{%
  \ifHy@unicode
    \ifnum#2<\@ne
      \@arabic{#2}%
    \else
      \ifnum#2<1000000 %
        \HyPsd@@GreekNum#1{#2}%
      \else
        \@arabic{#2}%
      \fi
    \fi
  \else
    \@arabic{#2}%
  \fi
}
\def\HyPsd@@GreekNum#1#2{%
  \ifnum#2<\@m
    \ifnum#2<10 %
      \expandafter\HyPsd@GreekNumI
          \expandafter\@gobble\expandafter#1\number#2%
    \else
      \ifnum#2<100 %
        \expandafter\HyPsd@GreekNumII
            \expandafter\@gobble\expandafter#1\number#2%
      \else
        \expandafter\HyPsd@GreekNumIII
            \expandafter\@gobble\expandafter#1\number#2%
      \fi
    \fi
    \ifnum#2>\z@
      \textnumeralsigngreek
    \fi
  \else
    \ifnum#2<\@M
      \expandafter\HyPsd@GreekNumIV\expandafter#1\number#2%
    \else
      \ifnum#2<100000 %
        \expandafter\HyPsd@GreekNumV\expandafter#1\number#2%
      \else
        \expandafter\HyPsd@GreekNumVI\expandafter#1\number#2%
      \fi
    \fi
  \fi
}
\def\HyPsd@GreekNumI#1#2#3{%
  #1{%
    \ifnum#3>\z@
      \textnumeralsignlowergreek
    \fi
  }%
  \expandafter#2%
  \ifcase#3 %
    {}{}%
  \or\textalpha\textAlpha
  \or\textbeta\textBeta
  \or\textgamma\textGamma
  \or\textdelta\textDelta
  \or\textepsilon\textEpsilon
  \or\textstigmagreek\textStigmagreek
  \or\textzeta\textZeta
  \or\texteta\textEta
  \or\texttheta\textTheta
  \else
    {}{}%
  \fi
}
\def\HyPsd@GreekNumII#1#2#3#4{%
  #1{%
    \ifnum#3>\z@
      \textnumeralsignlowergreek
    \fi
  }%
  \expandafter#2%
  \ifcase#3 %
    {}{}%
  \or\textiota\textIota
  \or\textkappa\textKappa
  \or\textlambda\textLambda
  \or\textmu\textMu
  \or\textnu\textNu
  \or\textxi\textXi
  \or\textomicron\textOmicron
  \or\textpi\textPi
  \or\textkoppagreek\textKoppagreek
  \else
    {}{}%
  \fi
  \HyPsd@GreekNumI#1#2#4%
}
\def\HyPsd@GreekNumIII#1#2#3#4#5{%
  #1{%
    \ifnum#3>\z@
      \textnumeralsignlowergreek
    \fi
  }%
  \expandafter#2%
  \ifcase#3 %
    {}{}%
  \or\textrho\textRho
  \or\textsigma\textSigma
  \or\texttau\textTau
  \or\textupsilon\textUpsilon
  \or\textphi\textPhi
  \or\textchi\textChi
  \or\textpsi\textPsi
  \or\textomega\textOmega
  \or\textsampigreek\textSampigreek
  \else
    {}{}%
  \fi
  \HyPsd@GreekNumII#1#2#4#5%
}
\def\HyPsd@GreekNumIV#1#2#3#4#5{%
  \HyPsd@GreekNumI\@firstofone#1#2%
  \HyPsd@@GreekNum#1{#3#4#5}%
}
\def\HyPsd@GreekNumV#1#2#3#4#5#6{%
  \HyPsd@GreekNumII\@firstofone#1#2#3%
  \HyPsd@@GreekNum#1{#4#5#6}%
}
\def\HyPsd@GreekNumVI#1#2#3#4#5#6#7{%
  \HyPsd@GreekNumIII\@firstofone#1#2#3#4%
  \HyPsd@@GreekNum#1{#5#6#7}%
}
%    \end{macrocode}
%    \begin{macrocode}
\def\HyPsd@SpanishPatch{%
  \ltx@IfUndefined{es@save@dot}{%
  }{%
    \let\.\es@save@dot
  }%
}
%    \end{macrocode}
%    Shorthand |"-| of `russianb.ldf' is not expandable,
%    therefore it is disabled and replaced by |-|.
%    \begin{macrocode}
\def\HyPsd@RussianPatch{%
  \ltx@IfUndefined{russian@sh@"@-@}{%
  }{%
    \@namedef{russian@sh@"@-@}{-}%
  }%
}
%    \end{macrocode}
%
% \subsubsection{CJK patch}
%
%    \begin{macrocode}
\RequirePackage{intcalc}[2007/09/27]
%    \end{macrocode}
%
%    \begin{macro}{\HyPsd@CJKhook}
%    \begin{macrocode}
\def\HyPsd@CJKhook{%
  \ltx@ifpackageloaded{CJK}{%
    \let\CJK@kern\relax
    \let\CJKkern\relax
    \let\CJK@CJK\relax
    \ifHy@CJKbookmarks
      \HyPsd@CJKhook@bookmarks
    \fi
    \HyPsd@CJKhook@unicode
  }{}%
}
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{CJK bookmarks}
%
%    \begin{macro}{\HyPsd@CJKhook}
%    Some internal commands of package cjk are redefined
%    to avoid error messages. For a rudimental support
%    of CJK bookmarks the active characters are
%    redefined so that they print themselves.
%
%    After preprocessing of Big5 encoded data the
%    following string for a double-byte character
%    is emitted:
%\begin{verbatim}
%^^7f<arg1>^^7f<arg2>^^7f
%\end{verbatim}
%    \verb|<arg1>| is the first byte in the range (always $>$ 0x80);
%    \verb|<arg2>| is the second byte in decimal notation
%    ($\ge$ 0x40).
%    \begin{macrocode}
\begingroup
  \catcode"7F=\active
  \toks@{%
    \let\CJK@ignorespaces\empty
    \def\CJK@char#1{\@gobbletwo}%
    \let\CJK@charx\@gobblefour
    \let\CJK@punctchar\@gobblefour
    \def\CJK@punctcharx#1{\@gobblefour}%
    \catcode"7F=\active
    \def^^7f#1^^7f#2^^7f{%
      \string #1\HyPsd@DecimalToOctal{#2}%
    }%
    % ... ?
    \ifHy@unicode
      \def\Hy@cjkpu{\80}%
    \else
      \let\Hy@cjkpu\@empty
    \fi
    \HyPsd@CJKActiveChars
  }%
  \count@=127 %
  \@whilenum\count@<255 \do{%
    \advance\count@ by 1 %
    \lccode`\~=\count@
    \lowercase{%
      \toks@\expandafter{\the\toks@ ~}%
    }%
  }%
  \toks@\expandafter{\the\toks@ !}%
  \xdef\HyPsd@CJKhook@bookmarks{%
    \the\toks@
  }%
\endgroup
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@CJKActiveChars}
%    The macro \cmd{\HyPsd@CJKActiveChars} is only defined
%    to limit the memory consumption of \cmd{\HyPsd@CJKhook}.
%    \begin{macrocode}
\def\HyPsd@CJKActiveChars#1{%
  \ifx#1!%
    \let\HyPsd@CJKActiveChars\relax
  \else
    \edef#1{\noexpand\Hy@cjkpu\string#1}%
  \fi
  \HyPsd@CJKActiveChars
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@DecimalToOctal}
%    A character, given by the decimal number is converted
%    to a PDF character.
%    \begin{macrocode}
\def\HyPsd@DecimalToOctal#1{%
  \ifcase #1 %
        \000\or \001\or \002\or \003\or \004\or \005\or \006\or \007%
    \or \010\or \011\or \012\or \013\or \014\or \015\or \016\or \017%
    \or \020\or \021\or \022\or \023\or \024\or \025\or \026\or \027%
    \or \030\or \031\or \032\or \033\or \034\or \035\or \036\or \037%
    \or \040\or \041\or \042\or \043\or \044\or \045\or \046\or \047%
    \or \050\or \051\or \052\or \053\or \054\or \055\or \056\or \057%
    \or    0\or    1\or    2\or    3\or    4\or    5\or    6\or    7%
    \or    8\or    9\or \072\or \073\or \074\or \075\or \076\or \077%
    \or    @\or    A\or    B\or    C\or    D\or    E\or    F\or    G%
    \or    H\or    I\or    J\or    K\or    L\or    M\or    N\or    O%
    \or    P\or    Q\or    R\or    S\or    T\or    U\or    V\or    W%
    \or    X\or    Y\or    Z\or \133\or \134\or \135\or \136\or \137%
    \or \140\or    a\or    b\or    c\or    d\or    e\or    f\or    g%
    \or    h\or    i\or    j\or    k\or    l\or    m\or    n\or    o%
    \or    p\or    q\or    r\or    s\or    t\or    u\or    v\or    w%
    \or    x\or    y\or    z\or \173\or \174\or \175\or \176\or \177%
    \or \200\or \201\or \202\or \203\or \204\or \205\or \206\or \207%
    \or \210\or \211\or \212\or \213\or \214\or \215\or \216\or \217%
    \or \220\or \221\or \222\or \223\or \224\or \225\or \226\or \227%
    \or \230\or \231\or \232\or \233\or \234\or \235\or \236\or \237%
    \or \240\or \241\or \242\or \243\or \244\or \245\or \246\or \247%
    \or \250\or \251\or \252\or \253\or \254\or \255\or \256\or \257%
    \or \260\or \261\or \262\or \263\or \264\or \265\or \266\or \267%
    \or \270\or \271\or \272\or \273\or \274\or \275\or \276\or \277%
    \or \300\or \301\or \302\or \303\or \304\or \305\or \306\or \307%
    \or \310\or \311\or \312\or \313\or \314\or \315\or \316\or \317%
    \or \320\or \321\or \322\or \323\or \324\or \325\or \326\or \327%
    \or \330\or \331\or \332\or \333\or \334\or \335\or \336\or \337%
    \or \340\or \341\or \342\or \343\or \344\or \345\or \346\or \347%
    \or \350\or \351\or \352\or \353\or \354\or \355\or \356\or \357%
    \or \360\or \361\or \362\or \363\or \364\or \365\or \366\or \367%
    \or \370\or \371\or \372\or \373\or \374\or \375\or \376\or \377%
  \fi
}
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{CJK unicode}
%
%    \begin{macro}{\HyPsd@CJKhook@unicode}
%    \begin{macrocode}
\def\HyPsd@CJKhook@unicode{%
  \let\Unicode\HyPsd@CJK@Unicode
  \let\CJKnumber\HyPsd@CJKnumber
  \let\CJKdigits\HyPsd@CJKdigits
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@CJK@Unicode}
%    \begin{macrocode}
\def\HyPsd@CJK@Unicode#1#2{%
  \ifnum#1<256 %
    \HyPsd@DecimalToOctalFirst{#1}%
    \HyPsd@DecimalToOctalSecond{#2}%
  \else
    \933%
    \expandafter\expandafter\expandafter\HyPsd@HighA
    \intcalcDiv{#1}{4}!%
    \933%
    \ifcase\intcalcMod{#1}{4} %
      4\or 5\or 6\or 7%
    \fi
    \HyPsd@DecimalToOctalSecond{#2}%
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
\def\HyPsd@HighA#1!{%
  \expandafter\expandafter\expandafter\HyPsd@HighB
  \IntCalcDiv#1!64!!%
  \expandafter\expandafter\expandafter\HyPsd@HighD
  \IntCalcMod#1!64!!%
}
\def\HyPsd@HighB#1!{%
  \expandafter\expandafter\expandafter\HyPsd@HighC
  \IntCalcDec#1!!%
}
\def\HyPsd@HighC#1!{%
  \IntCalcDiv#1!4!%
  \@backslashchar
  \IntCalcMod#1!4!%
}
\def\HyPsd@HighD#1!{%
  \ifcase\IntCalcDiv#1!8! %
    0\or 1\or 2\or 3\or 4\or 5\or 6\or 7%
  \fi
  \ifcase\IntCalcMod#1!8! %
    0\or 1\or 2\or 3\or 4\or 5\or 6\or 7%
  \fi
}
\def\HyPsd@DecimalToOctalFirst#1{%
  \9%
  \ifcase#1 %
        000\or 001\or 002\or 003\or 004\or 005\or 006\or 007%
    \or 010\or 011\or 012\or 013\or 014\or 015\or 016\or 017%
    \or 020\or 021\or 022\or 023\or 024\or 025\or 026\or 027%
    \or 030\or 031\or 032\or 033\or 034\or 035\or 036\or 037%
    \or 040\or 041\or 042\or 043\or 044\or 045\or 046\or 047%
    \or 050\or 051\or 052\or 053\or 054\or 055\or 056\or 057%
    \or 060\or 061\or 062\or 063\or 064\or 065\or 066\or 067%
    \or 070\or 071\or 072\or 073\or 074\or 075\or 076\or 077%
    \or 100\or 101\or 102\or 103\or 104\or 105\or 106\or 107%
    \or 120\or 111\or 112\or 113\or 114\or 115\or 116\or 117%
    \or 120\or 121\or 122\or 123\or 124\or 125\or 126\or 127%
    \or 130\or 131\or 132\or 133\or 134\or 135\or 136\or 137%
    \or 140\or 141\or 142\or 143\or 144\or 145\or 146\or 147%
    \or 150\or 151\or 152\or 153\or 154\or 155\or 156\or 157%
    \or 160\or 161\or 162\or 163\or 164\or 165\or 166\or 167%
    \or 170\or 171\or 172\or 173\or 174\or 175\or 176\or 177%
    \or 200\or 201\or 202\or 203\or 204\or 205\or 206\or 207%
    \or 210\or 211\or 212\or 213\or 214\or 215\or 216\or 217%
    \or 220\or 221\or 222\or 223\or 224\or 225\or 226\or 227%
    \or 230\or 231\or 232\or 233\or 234\or 235\or 236\or 237%
    \or 240\or 241\or 242\or 243\or 244\or 245\or 246\or 247%
    \or 250\or 251\or 252\or 253\or 254\or 255\or 256\or 257%
    \or 260\or 261\or 262\or 263\or 264\or 265\or 266\or 267%
    \or 270\or 271\or 272\or 273\or 274\or 275\or 276\or 277%
    \or 300\or 301\or 302\or 303\or 304\or 305\or 306\or 307%
    \or 310\or 311\or 312\or 313\or 314\or 315\or 316\or 317%
    \or 320\or 321\or 322\or 323\or 324\or 325\or 326\or 327%
    \or 330\or 331\or 332\or 333\or 334\or 335\or 336\or 337%
    \or 340\or 341\or 342\or 343\or 344\or 345\or 346\or 347%
    \or 350\or 351\or 352\or 353\or 354\or 355\or 356\or 357%
    \or 360\or 361\or 362\or 363\or 364\or 365\or 366\or 367%
    \or 370\or 371\or 372\or 373\or 374\or 375\or 376\or 377%
  \fi
}
\def\HyPsd@DecimalToOctalSecond#1{%
  \ifcase #1 %
        \000\or \001\or \002\or \003\or \004\or \005\or \006\or \007%
    \or \010\or \011\or \012\or \013\or \014\or \015\or \016\or \017%
    \or \020\or \021\or \022\or \023\or \024\or \025\or \026\or \027%
    \or \030\or \031\or \032\or \033\or \034\or \035\or \036\or \037%
    \or \040\or \041\or \042\or \043\or \044\or \045\or \046\or \047%
    \or \050\or \051\or \052\or \053\or \054\or \055\or \056\or \057%
    \or \060\or \061\or \062\or \063\or \064\or \065\or \066\or \067%
    \or \070\or \071\or \072\or \073\or \074\or \075\or \076\or \077%
    \or \100\or \101\or \102\or \103\or \104\or \105\or \106\or \107%
    \or \110\or \111\or \112\or \113\or \114\or \115\or \116\or \117%
    \or \120\or \121\or \122\or \123\or \124\or \125\or \126\or \127%
    \or \130\or \131\or \132\or \133\or \134\or \135\or \136\or \137%
    \or \140\or \141\or \142\or \143\or \144\or \145\or \146\or \147%
    \or \150\or \151\or \152\or \153\or \154\or \155\or \156\or \157%
    \or \160\or \161\or \162\or \163\or \164\or \165\or \166\or \167%
    \or \170\or \171\or \172\or \173\or \174\or \175\or \176\or \177%
    \or \200\or \201\or \202\or \203\or \204\or \205\or \206\or \207%
    \or \210\or \211\or \212\or \213\or \214\or \215\or \216\or \217%
    \or \220\or \221\or \222\or \223\or \224\or \225\or \226\or \227%
    \or \230\or \231\or \232\or \233\or \234\or \235\or \236\or \237%
    \or \240\or \241\or \242\or \243\or \244\or \245\or \246\or \247%
    \or \250\or \251\or \252\or \253\or \254\or \255\or \256\or \257%
    \or \260\or \261\or \262\or \263\or \264\or \265\or \266\or \267%
    \or \270\or \271\or \272\or \273\or \274\or \275\or \276\or \277%
    \or \300\or \301\or \302\or \303\or \304\or \305\or \306\or \307%
    \or \310\or \311\or \312\or \313\or \314\or \315\or \316\or \317%
    \or \320\or \321\or \322\or \323\or \324\or \325\or \326\or \327%
    \or \330\or \331\or \332\or \333\or \334\or \335\or \336\or \337%
    \or \340\or \341\or \342\or \343\or \344\or \345\or \346\or \347%
    \or \350\or \351\or \352\or \353\or \354\or \355\or \356\or \357%
    \or \360\or \361\or \362\or \363\or \364\or \365\or \366\or \367%
    \or \370\or \371\or \372\or \373\or \374\or \375\or \376\or \377%
  \fi
}
%    \end{macrocode}
%    \begin{macrocode}
\def\HyPsd@CJKnumber#1{%
  \ifnum#1<\z@
    \CJK@minus
    \expandafter\HyPsd@@CJKnumber\expandafter{\number-\number#1}%
  \else
    \expandafter\HyPsd@@CJKnumber\expandafter{\number#1}%
  \fi
}
\def\HyPsd@@CJKnumber#1{%
  \ifcase#1 %
    \CJK@zero\or\CJK@one\or\CJK@two\or\CJK@three\or\CJK@four\or
    \CJK@five\or\CJK@six\or\CJK@seven\or\CJK@eight\or\CJK@nine\or
    \CJK@ten\or\CJK@ten\CJK@one\or\CJK@ten\CJK@two\or
    \CJK@ten\CJK@three\or\CJK@ten\CJK@four\or\CJK@ten\CJK@five\or
    \CJK@ten\CJK@six\or\CJK@ten\CJK@seven\or\CJK@ten\CJK@eight\or
    \CJK@ten\CJK@nine
  \else
    \ifnum#1<10000 %
      \HyPsd@CJKnumberFour#1!\@empty{20}%
      \@empty
    \else
      \ifnum#1<100000000 %
        \expandafter\expandafter\expandafter\HyPsd@CJKnumberFour
          \IntCalcDiv#1!10000!%
        !{}{20}%
        \CJK@tenthousand
        \expandafter\expandafter\expandafter\HyPsd@CJKnumberFour
          \IntCalcMod#1!10000!%
        !\CJK@zero{10}%
        \@empty
      \else
        \expandafter\HyPsd@CJKnumberLarge
        \number\IntCalcDiv#1!100000000!\expandafter!%
        \number\IntCalcMod#1!100000000!!%
      \fi
    \fi
  \fi
}
\def\HyPsd@CJKnumberLarge#1!#2!{%
  \HyPsd@CJKnumberFour#1!{}{20}%
  \CJK@hundredmillion
  \ifnum#2=\z@
  \else
    \expandafter\expandafter\expandafter\HyPsd@CJKnumberFour
      \IntCalcDiv#2!10000!%
    !\CJK@zero{10}%
    \CJK@tenthousand
    \expandafter\expandafter\expandafter\HyPsd@CJKnumberFour
      \IntCalcMod#2!10000!%
    !\CJK@zero{10}%
    \@empty
  \fi
}
\def\HyPsd@CJKnumberFour#1!#2#3{%
  \ifnum#1=\z@
    \expandafter\@gobble
  \else
    \ifnum#1<1000 %
      #2%
      \HyPsd@CJKnumberThree#1!{}{#3}%
    \else
      \HyPsd@@CJKnumber{\IntCalcDiv#1!1000!}%
      \CJK@thousand
      \expandafter\expandafter\expandafter\HyPsd@CJKnumberThree
        \IntCalcMod#1!1000!%
      !\CJK@zero{10}%
    \fi
  \fi
}
\def\HyPsd@CJKnumberThree#1!#2#3{%
  \ifnum#1=\z@
  \else
    \ifnum#1<100 %
      #2%
      \HyPsd@CJKnumberTwo#1!{}{#3}%
    \else
      \HyPsd@@CJKnumber{\IntCalcDiv#1!100!}%
      \CJK@hundred
      \expandafter\expandafter\expandafter\HyPsd@CJKnumberTwo
        \IntCalcMod#1!100!%
      !\CJK@zero{10}%
    \fi
  \fi
}
\def\HyPsd@CJKnumberTwo#1!#2#3{%
  \ifnum#1=\z@
  \else
    \ifnum#1<#3 %
      #2%
      \HyPsd@@CJKnumber{#1}%
    \else
      \HyPsd@@CJKnumber{\IntCalcDiv#1!10!}%
      \CJK@ten
      \ifnum\IntCalcMod#1!10!=\z@
      \else
        \HyPsd@@CJKnumber{\IntCalcMod#1!10!}%
      \fi
    \fi
  \fi
}
%    \end{macrocode}
%    \begin{macrocode}
\def\HyPsd@CJKdigits#1{%
  \ifx*#1\relax
    \expandafter\HyPsd@@CJKdigits\expandafter\CJK@zero
  \else
    \HyPsd@@CJKdigits\CJK@null{#1}%
  \fi
}
\def\HyPsd@@CJKdigits#1#2{%
  \ifx\\#2\\%
  \else
    \HyPsd@@@CJKdigits#1#2\@nil
  \fi
}%
\def\HyPsd@@@CJKdigits#1#2#3\@nil{%
  \HyPsd@CJKdigit#1{#2}%
  \ifx\\#3\\%
    \expandafter\@gobble
  \else
    \expandafter\@firstofone
  \fi
  {%
    \HyPsd@@@CJKdigits#1#3\@nil
  }%
}
\def\HyPsd@CJKdigit#1#2{%
  \ifcase#2 %
    #1\or
    \CJK@one\or\CJK@two\or\CJK@three\or\CJK@four\or
    \CJK@five\or\CJK@six\or\CJK@seven\or\CJK@eight\or\CJK@nine
  \fi
}
%    \end{macrocode}
%
% \subsubsection{\texorpdfstring{\cs{@inmathwarn}}{\\@inmathwarn}-Patch}
%    \begin{macro}{\HyPsd@inmathwarn}
%    The patch of \cs{@inmathwarn} is needed to get rid of the
%    infinite error loop with glyphs of other encodings
%    (see the explanation above). Potentially the patch is
%    dangerous, if the code in |ltoutenc.dtx| changes.
%    Checked with \LaTeXe{} versions [1998/06/01] and
%    [1998/12/01]. I expect that versions below [1995/12/01]
%    don't work.
%
%    To understand the patch easier, the original code of
%    \cs{@current@cmd} and \cs{@changed@cmd} follows
%    (\LaTeXe{} release [1998/12/01]).
%    In the normal case \cs{pdfstringdef} is executed in a context
%    where \cs{protect} has the meaning of \cs{@typesetprotect}
%    (=\cs{relax}).
%\begin{verbatim}
%\def\@current@cmd#1{%
%   \ifx\protect\@typeset@protect
%      \@inmathwarn#1%
%   \else
%      \noexpand#1\expandafter\@gobble
%   \fi}
%\def\@changed@cmd#1#2{%
%   \ifx\protect\@typeset@protect
%      \@inmathwarn#1%
%      \expandafter\ifx\csname\cf@encoding\string#1\endcsname\relax
%         \expandafter\ifx\csname ?\string#1\endcsname\relax
%            \expandafter\def\csname ?\string#1\endcsname{%
%               \TextSymbolUnavailable#1%
%            }%
%         \fi
%         \global\expandafter\let
%               \csname\cf@encoding \string#1\expandafter\endcsname
%               \csname ?\string#1\endcsname
%      \fi
%      \csname\cf@encoding\string#1%
%         \expandafter\endcsname
%   \else
%      \noexpand#1%
%   \fi}
%\gdef\TextSymbolUnavailable#1{%
%   \@latex@error{%
%      Command \protect#1 unavailable in encoding \cf@encoding%
%   }\@eha}
%\def\@inmathwarn#1{%
%   \ifmmode
%      \@latex@warning{Command \protect#1 invalid in math mode}%
%   \fi}
%\end{verbatim}
%    \begin{macrocode}
\def\HyPsd@inmathwarn#1#2{%
  \ifx#2\expandafter
    \expandafter\ifx\csname\cf@encoding\string#1\endcsname\relax
      \HyPsd@GLYPHERR
      \expandafter\@gobble\string#1%
      >%
      \expandafter\expandafter\expandafter\HyPsd@EndWithElse
    \else
      \expandafter\expandafter\expandafter\HyPsd@GobbleFiFi
    \fi
  \else
    \expandafter#2%
  \fi
}
\def\HyPsd@GobbleFiFi#1\fi#2\fi{}
\def\HyPsd@EndWithElse#1\else{\else}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\HyPsd@add@accent}
%    \begin{macrocode}
\def\HyPsd@add@accent#1#2{%
  \HyPsd@GLYPHERR\expandafter\@gobble\string#1+\string#2>%
  #2%
}%
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Unexpandable spaces}
%
%    \begin{macro}{\HyPsd@LetUnexpandableSpace}
%    In \cmd{\HyPsd@@ProtectSpaces} the space tokens are replaced
%    by not expandable commands, that work like spaces:
%    \begin{itemize}
%    \item So they can caught by undelimited arguments.
%    \item And they work in number, dimen, and skip
%          assignments.
%    \end{itemize}
%    These properties are used in \cmd{\HyPsd@CheckCatcodes}.
%    \begin{macrocode}
\def\HyPsd@LetUnexpandableSpace#1{%
  \expandafter\futurelet\expandafter#1\expandafter\@gobble\space\relax
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@UnexpandableSpace}
%    \cmd{\HyPsd@UnexpandableSpace} is used
%    in \cmd{\HyPsd@@ProtectSpaces}.
%    In \cmd{HyPsd@@ProtectSpaces} the space tokens are replaced
%    by unexpandable commands \cmd{\HyPsd@UnexpandableSpace},
%    but that have the effect of spaces.
%    \begin{macrocode}
\HyPsd@LetUnexpandableSpace\HyPsd@UnexpandableSpace
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Marker for commands}
%    \begin{macro}{\HyPsd@XSPACE}
%    \begin{macro}{\HyPsd@ITALCORR}
%    \begin{macro}{\HyPsd@GLYPHERR}
%    Some commands and informations cannot be utilized before
%    the string expansion and the checking process.
%    Command names are filtered out, so we need another way
%    to transport the information: An unusual |#| with catcode
%    12 marks the beginning of the extra information.
%    \begin{macrocode}
\edef\HyPsd@XSPACE{\string#\string X}
\edef\HyPsd@ITALCORR{\string#\string I}
\edef\HyPsd@GLYPHERR{\string#\string G}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%
% \subsubsection{\texorpdfstring{\cs{hspace}}{\\hspace} fix}
%    \begin{macro}{\HyPsd@hspace}
%    \begin{macrocode}
\def\HyPsd@hspace#1{\HyPsd@@hspace#1*\END}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@@hspace}
%    \cs{HyPsd@@hspace} checks whether \cs{hspace}
%    is called in its star form.
%    \begin{macrocode}
\def\HyPsd@@hspace#1*#2\END{%
  \ifx\\#2\\%
    \HyPsd@hspacetest{#1}%
  \else
    \expandafter\HyPsd@hspacetest
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@hspacetest}
%    \cs{HyPsd@hyspacetest} replaces the \cs{hspace} by a space, if
%    the length is greater than zero.
%    \begin{macrocode}
\def\HyPsd@hspacetest#1{\ifdim#1>\z@\space\fi}
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Fix for AMS classes}
%
%    \begin{macrocode}
\ltx@IfUndefined{tocsection}{%
  \let\HyPsd@AMSclassfix\relax
}{%
  \def\HyPsd@AMSclassfix{%
    \let\tocpart\HyPsd@tocsection
    \let\tocchapter\HyPsd@tocsection
    \let\tocappendix\HyPsd@tocsection
    \let\tocsection\HyPsd@tocsection
    \let\tocsubsection\HyPsd@tocsection
    \let\tocsubsubsection\HyPsd@tocsection
    \let\tocparagraph\HyPsd@tocsection
  }%
  \def\HyPsd@tocsection#1#2#3{%
    \if @#2@\else\if @#1@\else#1 \fi#2. \fi
    #3%
  }%
}
%    \end{macrocode}
%
% \subsubsection{Reference commands}
%
%    \begin{macro}{\HyPsd@href}
%    \begin{macrocode}
\def\HyPsd@href#1#{\@secondoftwo}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\HyPsd@ref}
%    Macro \cs{HyPsd@ref} calls the macro \cs{HyPsd@@ref} for star checking.
%    The same methods like in \cs{HyPsd@hspace} is used.
%    \begin{macrocode}
\def\HyPsd@ref#1{\HyPsd@@ref#1*\END}%
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@@ref}
%    Macro \cs{HyPsd@@ref} checks if a star is present.
%    \begin{macrocode}
\def\HyPsd@@ref#1*#2\END{%
  \ifx\\#2\\%
    \HyPsd@@@ref{#1}%
  \else
    \expandafter\HyPsd@@@ref
  \fi
}%
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@@@ref}
%    \cs{HyPsd@@@ref} does the work and extracts the first argument.
%    \begin{macrocode}
\def\HyPsd@@@ref#1{%
  \expandafter\ifx\csname r@#1\endcsname\relax
    ??%
  \else
    \expandafter\expandafter\expandafter
    \@car\csname r@#1\endcsname\@nil
  \fi
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\HyPsd@pageref}
%    Macro \cs{HyPsd@pageref} calls the macro \cs{HyPsd@@pageref} for star checking.
%    The same methods like in \cs{HyPsd@hspace} is used.
%    \begin{macrocode}
\def\HyPsd@pageref#1{\HyPsd@@pageref#1*\END}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@@pageref}
%    Macro \cs{HyPsd@@pageref} checks if a star is present.
%    \begin{macrocode}
\def\HyPsd@@pageref#1*#2\END{%
  \ifx\\#2\\%
    \HyPsd@@@pageref{#1}%
  \else
    \expandafter\HyPsd@@@pageref
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@@@pageref}
%    \cs{HyPsd@@@pageref} does the work and extracts the second argument.
%    \begin{macrocode}
\def\HyPsd@@@pageref#1{%
  \expandafter\ifx\csname r@#1\endcsname\relax
    ??%
  \else
    \expandafter\expandafter\expandafter\expandafter
    \expandafter\expandafter\expandafter\@car
    \expandafter\expandafter\expandafter\@gobble
    \csname r@#1\endcsname{}\@nil
  \fi
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\HyPsd@nameref}
%    Macro \cs{HyPsd@nameref} calls the macro \cs{HyPsd@@nameref} for star checking.
%    The same methods like in \cs{HyPsd@hspace} is used.
%    \begin{macrocode}
\def\HyPsd@nameref#1{\HyPsd@@nameref#1*\END}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@@nameref}
%    Macro \cs{HyPsd@@nameref} checks if a star is present.
%    \begin{macrocode}
\def\HyPsd@@nameref#1*#2\END{%
  \ifx\\#2\\%
    \HyPsd@@@nameref{#1}%
  \else
    \expandafter\HyPsd@@@nameref
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@@@nameref}
%    \cs{HyPsd@@@nameref} does the work and extracts the third argument.
%    \begin{macrocode}
\def\HyPsd@@@nameref#1{%
  \expandafter\ifx\csname r@#1\endcsname\relax
    ??%
  \else
    \expandafter\expandafter\expandafter\expandafter
    \expandafter\expandafter\expandafter\@car
    \expandafter\expandafter\expandafter\@gobbletwo
    \csname r@#1\endcsname{}{}\@nil
  \fi
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\HyPsd@autoref}
%    Macro \cs{HyPsd@autoref} calls the macro \cs{HyPsd@@autoref} for star checking.
%    The same methods like in \cs{HyPsd@hspace} is used.
%    \begin{macrocode}
\def\HyPsd@autoref#1{\HyPsd@@autoref#1*\END}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@@autoref}
%    Macro \cs{HyPsd@@autoref} checks if a star is present.
%    \begin{macrocode}
\def\HyPsd@@autoref#1*#2\END{%
  \ifx\\#2\\%
    \HyPsd@@@autoref{#1}%
  \else
    \expandafter\HyPsd@@@autoref
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@@@autoref}
%    \cs{HyPsd@@@autoref} does the work and extracts the second argument.
%    \begin{macrocode}
\def\HyPsd@@@autoref#1{%
  \expandafter\ifx\csname r@#1\endcsname\relax
    ??%
  \else
    \expandafter\expandafter\expandafter\HyPsd@autorefname
        \csname r@#1\endcsname{}{}{}{}\@nil
    \expandafter\expandafter\expandafter
    \@car\csname r@#1\endcsname\@nil
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@autorefname}
%    At least a basic definition for getting the \cs{autoref} name.
%    \begin{macrocode}
\def\HyPsd@autorefname#1#2#3#4#5\@nil{%
  \ifx\\#4\\%
  \else
    \HyPsd@@autorefname#4.\@nil
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@@autorefname}
%    \begin{macrocode}
\def\HyPsd@@autorefname#1.#2\@nil{%
  \ltx@IfUndefined{#1autorefname}{%
    \ltx@IfUndefined{#1name}{%
    }{%
      \csname#1name\endcsname\space
    }%
  }{%
    \csname#1autorefname\endcsname\space
  }%
}
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Redefining the defining commands}
% \label{defcmd}
%    Definitions aren't allowed, because they aren't executed in
%    an only expanding context. So the command to be defined
%    isn't defined and can perhaps be undefined. This would causes
%    TeX to stop with an error message.
%    With a deep trick it is possible to define commands in such
%    a context: \cs{csname} does the job, it defines the command
%    to be \cs{relax}, if it has no meaning.
%
%    Active characters cannot be defined with this trick. It is
%    possible to define all undefined active characters
%    (perhaps that they have the meaning of \cs{relax}).
%    To avoid side effects this should be done in \cs{pdfstringdef}
%    shortly before the \cs{xdef} job. But checking and defining
%    all possible active characters of the full range (0 until 255)
%    would take a while. \cs{pdfstringdef} is slow enough, so
%    this isn't done.
%
%    \cs{HyPsd@DefCommand} and \cs{HyPsd@LetCommand} expands to the
%    commands \cs{<def>-command} and \cs{<let>-command}
%    with the meaning of \cs{def} and \cs{let}. So it is detected by
%    \cs{HyPsd@CheckCatcodes} and the command name \cs{<def>-command}
%    or \cs{<let>-command} should indicate a forbidden definition
%    command.
%
%    The command to be defined is converted to a string and back
%    to a command name with the help of \cs{csname}. If the
%    command is already defined, \cs{noexpand} prevents a
%    further expansion, even though the command would
%    expand to legal stuff. If the command don't have the meaning
%    of \cs{relax}, \cs{HyPsd@CheckCatcodes} will produce a warning.
%    (The command itself can be legal, but the warning is legitimate
%    because of the position after a defining command.)
%
%    The difference between \cs{HyPsd@DefCommand} and
%    \cs{HyPsdLetCommand} is that the first one also cancels this
%    arguments, the parameter and definition text. The right side
%    of the \cs{let} commands cannot be canceled with an undelimited
%    parameter because of a possible space token after \cs{futurelet}.
%
%    To avoid unmachted \cs{if...} tokens, the cases
%    \verb|\let\if...\iftrue| and \verb|\let\if...\iffalse|
%    are checked and ignored.
%
%    \begin{macro}{\HyPsd@DefCommand}
%    \begin{macro}{\HyPsd@LetCommand}
%    \begin{macrocode}
\begingroup
  \def\x#1#2{%
    \endgroup
    \let#1\def
    \def\HyPsd@DefCommand##1##2##{%
      #1%
      \expandafter\noexpand
        \csname\expandafter\@gobble\string##1\@empty\endcsname
      \@gobble
    }%
    \let#2\let
    \def\HyPsd@@LetCommand##1{%
      \expandafter\ifx\csname##1\expandafter\endcsname
                      \csname iftrue\endcsname
        \pdfstringdefWarn\let
        \expandafter\@gobble
      \else
        \expandafter\ifx\csname##1\expandafter\endcsname
                        \csname iffalse\endcsname
          \pdfstringdefWarn\let
          \expandafter\expandafter\expandafter\@gobble
        \else
          #2%
          \expandafter\noexpand
            \csname##1\expandafter\expandafter\expandafter\endcsname
        \fi
      \fi
    }%
  }%
\expandafter\x\csname <def>-command\expandafter\endcsname
              \csname <let>-command\endcsname
\def\HyPsd@LetCommand#1{%
  \expandafter\expandafter\expandafter\HyPsd@@LetCommand
    \expandafter\expandafter\expandafter{%
    \expandafter\@gobble\string#1\@empty
  }%
}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%
% \subsubsection{^^A
%   \texorpdfstring{\cs{ifnextchar}}{\\ifnextchar}^^A
% }
%    \begin{macro}{\HyPsd@ifnextchar}
%    In \cs{pdfstringdef} \cs{@ifnextchar} is disabled
%    via a \cs{let} command to save time. First a
%    warning message is given, then the three arguments
%    are canceled. \cs{@ifnextchar} cannot work in a correct
%    manner, because it uses \cs{futurelet}, but this is a
%    stomach feature, that doesn't work in an expanding context.
%    There are several variants of \cs{@ifnextchar}:
%    \begin{itemize}
%    \item \cs{@ifnextchar}
%    \item \cs{kernel@ifnextchar}
%    \item \cs{new@ifnextchar} from package \verb|amsgen.sty|
%    (bug report latex/3662).
%    \end{itemize}
%    \begin{macrocode}
\def\HyPsd@ifnextchar#1{%
  \pdfstringdefWarn#1%
  \expandafter\@gobbletwo\@gobble
}
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{^^A
%   \texorpdfstring{\cs{@protected@testoptifnextchar}}^^A
%     {\\@protected@testopt}^^A
% }
%    \begin{macro}{\HyPsd@protected@testopt}
%    Macros with optional arguments doesn't work properly, because
%    they call \cmd{\@ifnextchar} to detect the optional argument
%    (see the explanation of \cmd{\HyPsd@ifnextchar}).
%    But a warning, that \cmd{\@ifnextchar} doesn't work, doesn't
%    help the user very much. Therefore \cmd{\@protected@testopt}
%    is also disabled, because its first argument is the problematic
%    macro with the optional argument and it is called before
%    \cmd{\@ifnextchar}.
%    \begin{macrocode}
\def\HyPsd@protected@testopt#1{%
  \pdfstringdefWarn#1%
  \@gobbletwo
}
%    \end{macrocode}
%    \end{macro}
%
% \subsection{Help macros for postprocessing}
%
% \subsubsection{Generic warning.}
%    \begin{macro}{\HyPsd@Warning}
%    For several reasons \cs{space} is masked and does not have its
%    normal meaning. But it is used in warning messages, so it is
%    redefined locally:
%    \begin{macrocode}
\def\HyPsd@Warning#1{%
  \begingroup
    \let\space\ltx@space
    \Hy@Warning{#1}%
  \endgroup
}
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Protecting spaces}
%
%    \begin{macrocode}
\RequirePackage{etexcmds}[2007/09/09]
\ifetex@unexpanded
  \expandafter\@secondoftwo
\else
  \expandafter\@firstoftwo
\fi
{%
%    \end{macrocode}
%
%    \begin{macro}{\HyPsd@ProtectSpaces}
%    \cs{HyPsd@ProtectSpaces} calls with the expanded
%    string \cs{HyPsd@@ProtectSpacesFi}. The expanded string is
%    protected by \verb+|+ at the beginning and end of
%    the expanded string. Because of this there can be no group
%    at the beginning or end of the string and grouping characters
%    are not removed by the call of \cs{HyPsd@@ProtectSpacesFi}.
%    \begin{macrocode}
  \def\HyPsd@ProtectSpaces#1{%
    \iftrue
      \expandafter\HyPsd@@ProtectSpacesFi
        \expandafter|\expandafter\@empty#1| \HyPsd@End#1%
    \fi
  }%
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@@ProtectSpacesFi}
%    The string can contain command tokens, so it is better
%    to use an \cs{def} instead of an \cs{edef}.
%    \begin{macrocode}
  \def\HyPsd@@ProtectSpacesFi#1 #2\HyPsd@End#3\fi{%
    \fi
    \ifx\scrollmode#2\scrollmode
      \HyPsd@RemoveMask#1\HyPsd@End#3%
    \else
      \gdef#3{#1\HyPsd@UnexpandableSpace#2}%
      \expandafter\HyPsd@@ProtectSpacesFi#3\HyPsd@End#3%
    \fi
  }%
%    \end{macrocode}
%    \end{macro}
%
% \paragraph{Remove mask.}
%    \begin{macro}{\HyPsd@RemoveMask}
%    \cs{HyPsd@RemoveMask} removes the protecting \verb+|+.
%    It is used by \cs{HyPsd@@ProtectSpacesFi} and by the code in
%    \cs{pdfstringdef} that removes the grouping chararcters.
%    \begin{macrocode}
  \def\HyPsd@RemoveMask|#1|\HyPsd@End#2{%
    \toks@\expandafter{#1}%
    \xdef#2{\the\toks@}%
  }%
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macrocode}
}{%
  \let\HyPsd@fi\fi
  \def\HyPsd@ProtectSpaces#1{%
    \xdef#1{%
      \iftrue
        \expandafter\HyPsd@@ProtectSpacesFi
          \expandafter|\expandafter\@empty#1| %
      \HyPsd@fi
    }%
    \expandafter\HyPsd@RemoveMask#1\HyPsd@End#1%
  }%
  \def\HyPsd@@ProtectSpacesFi#1 #2\HyPsd@fi{%
    \fi
    \etex@unexpanded{#1}%
    \ifx\scrollmode#2\scrollmode
    \else
      \HyPsd@@ProtectSpacesFi\HyPsd@UnexpandableSpace#2%
    \HyPsd@fi
  }%
  \def\HyPsd@RemoveMask|#1|\HyPsd@End#2{%
    \xdef#2{\etex@unexpanded\expandafter{#1}}%
  }%
}
%    \end{macrocode}
%
% \subsubsection{Remove grouping braces}
%    \begin{macro}{\HyPsd@RemoveBraces}
%    |#1| contains the expanded string, the result will
%    be locally written in command \cs{HyPsd@String}.
%    \begin{macrocode}
\def\HyPsd@RemoveBraces#1{%
  \ifx\scrollmode#1\scrollmode
  \else
    \HyPsd@@RemoveBracesFi#1\HyPsd@End{#1}%
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@@RemoveBraces}
%    \cs{HyPsd@@RemoveBraces} is called with the expanded string,
%    the end marked by \cs{HyPsd@End}, the expanded string again, but
%    enclosed in braces and the string command. The first expanded
%    string is scanned by the parameter text |#1#2|.
%    By a comparison with the original form in |#3| we can decide
%    whether |#1| is a single token or a group. To avoid the
%    case that |#2| is a group, the string is extended by a \verb+|+
%    before.
%
%    While removing the grouping braces an italic correction
%    marker is inserted for supporting package |xspace| and
%    letting ligatures broken.
%
%    Because the string is already expanded, the \cs{if} commands
%    should disappeared. So we can move some parts out
%    of the argument of \cs{ltx@ReturnAfterFi}.
%    \begin{macrocode}
\def\HyPsd@@RemoveBracesFi#1#2\HyPsd@End#3\fi{%
  \fi
  \def\Hy@temp@A{#1#2}%
  \def\Hy@temp@B{#3}%
  \ifx\Hy@temp@A\Hy@temp@B
    \expandafter\def\expandafter\HyPsd@String\expandafter{%
      \HyPsd@String#1%
    }%
    \ifx\scrollmode#2\scrollmode
    \else
      \Hy@ReturnAfterFiFiEnd{%
        \HyPsd@RemoveBraces{#2}%
      }%
    \fi
  \else
    \def\Hy@temp@A{#1}%
    \HyPsd@AppendItalcorr\HyPsd@String
    \ifx\Hy@temp@A\@empty
      \Hy@ReturnAfterElseFiFiEnd{%
        \HyPsd@RemoveBraces{#2}%
      }%
    \else
      \HyPsd@ProtectSpaces\Hy@temp@A
      \HyPsd@AppendItalcorr\Hy@temp@A
      \Hy@ReturnAfterFiFiEnd{%
        \expandafter\HyPsd@RemoveBraces\expandafter
          {\Hy@temp@A#2}%
      }%
    \fi
  \fi
  \Hy@ReturnEnd
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@AppendItalcorr}
%    \begin{macro}{\HyPsd@@AppendItalcorr}
%    The string can contain commands yet, so it is better
%    to use \cs{def} instead of a shorter \cs{edef}.
%    The two help macros limit the count of \cs{expandafter}.
%    \begin{macrocode}
\def\HyPsd@AppendItalcorr#1{%
  \expandafter\HyPsd@@AppendItalcorr\expandafter{\/}#1%
}
\def\HyPsd@@AppendItalcorr#1#2{%
  \expandafter\def\expandafter#2\expandafter{#2#1}%
}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%
% \subsubsection{Catcode check}
% \paragraph{Check catcodes.}
%    \begin{macro}{\HyPsd@CheckCatcodes}
%    Because \cs{ifcat} expands its arguments, this is
%    prevented by \cs{noexpand}. In case of command tokens
%    and active characters \cs{ifcat} now sees a \cs{relax}.
%    After protecting spaces and removing braces |#1| should
%    be a single token, no group of several tokens, nor an
%    empty group. (So the \cs{expandafter}\cs{relax} between
%    \cs{ifcat} and \cs{noexpand} is only for safety and
%    it should be possible to remove it.)
%
%    \cs{protect} and \cs{relax} should be removed silently.
%    But it is too dangerous and breaks some code giving them
%    the meaning of \cs{@empty}. So commands with the meaning
%    of \cs{protect} are removed here. (\cs{protect} should
%    have the meaning of \cs{@typeset@protect} that
%    is equal to \cs{relax}).
%
%    \begin{macrocode}
\def\HyPsd@CheckCatcodes#1#2\HyPsd@End{%
  \global\let\HyPsd@Rest\relax
  \ifcat\relax\noexpand#1\relax
    \ifx#1\protect
    \else
      \ifx#1\penalty
        \setbox\z@=\hbox{%
          \afterassignment\HyPsd@AfterCountRemove
          \count@=#2\HyPsd@End
        }%
      \else
        \ifx#1\kern
          \setbox\z@=\hbox{%
            \afterassignment\HyPsd@AfterDimenRemove
            \dimen@=#2\HyPsd@End
          }%
        \else
          \ifx#1\hskip
            \setbox\z@=\hbox{%
              \afterassignment\HyPsd@AfterSkipRemove
              \skip@=#2\HyPsd@End
            }%
          \else
            \HyPsd@CatcodeWarning{#1}%
          \fi
        \fi
      \fi
    \fi
  \else
    \ifcat#1A% letter
      \expandafter\def\expandafter\HyPsd@String\expandafter{%
        \HyPsd@String#1%
      }%
    \else
      \ifcat#1 % SPACE
        \expandafter\def\expandafter\HyPsd@String\expandafter{%
          \HyPsd@String\HyPsd@SPACEOPTI
        }%
      \else
        \ifcat$#1%
          \HyPsd@CatcodeWarning{math shift}%
        \else
          \ifcat&#1%
            \HyPsd@CatcodeWarning{alignment tab}%
          \else
            \ifcat^#1%
              \HyPsd@CatcodeWarning{superscript}%
            \else
              \ifcat_#1%
                \HyPsd@CatcodeWarning{subscript}%
              \else
                \expandafter\def\expandafter\HyPsd@String\expandafter{%
                  \HyPsd@String#1%
                }%
              \fi
            \fi
          \fi
        \fi
      \fi
    \fi
  \fi
  \ifx\HyPsd@Rest\relax
    \ifx\scrollmode#2\scrollmode
    \else
      \Hy@ReturnAfterFiFiEnd{%
        \HyPsd@CheckCatcodes#2\HyPsd@End
      }%
    \fi
  \else
    \ifx\HyPsd@Rest\@empty
    \else
      \Hy@ReturnAfterFiFiEnd{%
        \expandafter\HyPsd@CheckCatcodes\HyPsd@Rest\HyPsd@End
      }%
    \fi
  \fi
  \Hy@ReturnEnd
}
%    \end{macrocode}
%    \end{macro}
%
% \paragraph{Remove counts, dimens, skips.}
%    \begin{macro}{\HyPsd@AfterCountRemove}
%    Counts like \cs{penalty} are removed silently.
%    \begin{macrocode}
\def\HyPsd@AfterCountRemove#1\HyPsd@End{%
  \gdef\HyPsd@Rest{#1}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@AfterDimenRemove}
%    If the value of the dimen (\cs{kern}) is zero, it can be
%    removed silently. All other values are difficult to interpret.
%    Negative values do not work in bookmarks. Should positive
%    values be removed or should they be replaced by space(s)?
%    The following code replaces positive values greater than
%    |1ex| with a space and removes them else.
%    \begin{macrocode}
\def\HyPsd@AfterDimenRemove#1\HyPsd@End{%
  \ifdim\ifx\HyPsd@String\@empty\z@\else\dimen@\fi>1ex %
    \HyPsd@ReplaceSpaceWarning{\string\kern\space\the\dimen@}%
    \gdef\HyPsd@Rest{\HyPsd@UnexpandableSpace #1}%
  \else
    \ifdim\dimen@=\z@
    \else
      \HyPsd@RemoveSpaceWarning{\string\kern\space\the\dimen@}%
    \fi
    \gdef\HyPsd@Rest{#1}%
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@AfterSkipRemove}
%    The glue part of skips do not work in PDF strings and are ignored.
%    Skips (\cs{hskip}), that are not zero, have the same
%    interpreting problems like dimens (see above).
%    \begin{macrocode}
\def\HyPsd@AfterSkipRemove#1\HyPsd@End{%
  \ifdim\ifx\HyPsd@String\@empty\z@\else\skip@\fi>1ex %
    \HyPsd@ReplaceSpaceWarning{\string\hskip\space\the\skip@}%
    \gdef\HyPsd@Rest{\HyPsd@UnexpandableSpace #1}%
  \else
    \ifdim\skip@=\z@
    \else
      \HyPsd@RemoveSpaceWarning{\string\kern\space\the\skip@}%
    \fi
    \gdef\HyPsd@Rest{#1}%
  \fi
}
%    \end{macrocode}
%    \end{macro}
%
% \paragraph{Catcode warnings.}
%    \begin{macro}{\HyPsd@CatcodeWarning}
%    \cs{HyPsd@CatcodeWarning} produces a warning for the user.
%    \begin{macrocode}
\def\HyPsd@CatcodeWarning#1{%
  \HyPsd@Warning{%
    Token not allowed in a PDF string (%
    \ifHy@unicode
      Unicode%
    \else
      PDFDocEncoding%
    \fi
    ):%
    \MessageBreak removing `\HyPsd@RemoveCmdPrefix#1'%
  }%
}
\begingroup
  \catcode`\|=0 %
  \catcode`\\=12 %
%    \end{macrocode}
%    \SpecialEscapechar{\|}
%    \vspace{-2\MacrocodeTopsep}
%    \vspace{-\parskip}
%    \vspace{-\partopsep}
%    \begin{macrocode}
  |gdef|HyPsd@RemoveCmdPrefix#1{%
    |expandafter|HyPsd@@RemoveCmdPrefix
      |string#1|@empty\<>-|@empty|@empty
  }%
  |gdef|HyPsd@@RemoveCmdPrefix#1\<>-#2|@empty#3|@empty{#1#2}%
|endgroup
%    \end{macrocode}
%    \SpecialEscapechar{\\}
%    \end{macro}
%    \begin{macro}{\HyPsd@RemoveSpaceWarning}
%    \begin{macrocode}
\def\HyPsd@RemoveSpaceWarning#1{%
  \HyPsd@Warning{%
    Token not allowed in a PDF string (%
    \ifHy@unicode
      Unicode%
    \else
      PDFDocEncoding%
    \fi
    ):%
    \MessageBreak #1\MessageBreak
    removed%
  }%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@ReplaceSpaceWarning}
%    \begin{macrocode}
\def\HyPsd@ReplaceSpaceWarning#1{%
  \HyPsd@Warning{%
    Token not allowed in a PDF string (%
    \ifHy@unicode
      Unicode%
    \else
      PDFDocEncoding%
    \fi
    ):%
    \MessageBreak #1\MessageBreak
    replaced by space%
  }%
}
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Check for wrong glyphs}
%    A wrong glyph is marked with \cs{relax}, the glyph
%    name follows, delimited by |>|. \cs{@empty} ends
%    the string.
%    \begin{macrocode}
\def\HyPsd@GlyphProcess#1\relax#2\@empty{%
  \expandafter\def\expandafter\HyPsd@String\expandafter{%
    \HyPsd@String#1%
  }%
  \ifx\\#2\\%
  \else
    \ltx@ReturnAfterFi{%
      \HyPsd@GlyphProcessWarning#2\@empty
    }%
  \fi
}
\def\HyPsd@GlyphProcessWarning#1>#2\@empty{%
  \HyPsd@@GlyphProcessWarning#1++>%
  \HyPsd@GlyphProcess#2\@empty
}
\def\HyPsd@@GlyphProcessWarning#1+#2+#3>{%
  \ifx\\#2\\%
    \HyPsd@Warning{%
      Glyph not defined in %
      P\ifHy@unicode U\else D1\fi\space encoding,\MessageBreak
      removing `\@backslashchar#1'%
    }%
  \else
    \HyPsd@Warning{%
      Composite letter `\@backslashchar#1+#2'\MessageBreak
      not defined in P\ifHy@unicode U\else D1\fi\space encoding,%
      \MessageBreak
      removing `\@backslashchar#1'%
    }%
  \fi
}
%    \end{macrocode}
%
% \paragraph{Spaces.}
%    \begin{macro}{\HyPsd@spaceopti}
%    In the string the spaces are represented by \cs{HyPsd@spaceopti}
%    tokens. Within an \cs{edef} it prints itself as
%    a simple space and looks for its next argument.
%    If another space follows, so it replaces the next \cs{HyPsd@spaceopti}
%    by an protected space \cs{040}.
%    \begin{macrocode}
\def\HyPsd@spaceopti#1{ % first space
  \ifx\HyPsd@spaceopti#1%
    \040%
  \else
    #1%
  \fi
}%
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Replacing tokens}
%    \begin{macro}{\HyPsd@Subst}
%    To save tokens \cs{HyPsd@StringSubst} is an wrapper for the
%    command \cs{HyPsd@Subst} that does all the work:
%    In string stored in command |#3| it replaces the tokens
%    |#1| with |#2|.\\
%    \begin{tabular}{ll}
%    |#1|& Exact the tokens that should be replaced.\\
%    |#2|& The replacement (don't need to be expanded).\\
%    |#3|& Command with the string.
%    \end{tabular}
%    \begin{macrocode}
\def\HyPsd@Subst#1#2#3{%
  \def\HyPsd@@ReplaceFi##1#1##2\END\fi{%
    \fi
    ##1%
    \ifx\scrollmode##2\scrollmode
    \else
      #2%
      \HyPsd@@ReplaceFi##2\END
    \fi
  }%
  \xdef#3{%
    \iftrue
      \expandafter\HyPsd@@ReplaceFi#3#1\END
    \fi
  }%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@StringSubst}
%    To save tokens in \cs{pdfstringdef} \cs{HyPsd@StringSubst} is a wrapper,
%    that expands argument |#1| before calling \cs{HyPsd@Subst}.
%    \begin{macrocode}
\def\HyPsd@StringSubst#1{%
  \expandafter\HyPsd@Subst\expandafter{\string#1}%
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\HyPsd@EscapeTeX}
%    \begin{macrocode}
\begingroup
  \lccode`\!=`\%%
  \lccode`\|=`\\%
  \lccode`\(=`\{%
  \lccode`\)=`\}%
  \lccode`0=\ltx@zero
  \lccode`1=\ltx@zero
  \lccode`3=\ltx@zero
  \lccode`4=\ltx@zero
  \lccode`5=\ltx@zero
  \lccode`7=\ltx@zero
\lowercase{\endgroup
  \def\HyPsd@EscapeTeX#1{%
    \HyPsd@Subst!{|045}#1%
    \HyPsd@Subst({|173}#1%
    \HyPsd@Subst){|175}#1%
  }%
}
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Support for package \texttt{xspace}}
%    \begin{macro}{\HyPsd@doxspace}
%    \cs{xspace} does not work, because it uses a \cs{futurelet}
%    that cannot be executed in \TeX's mouth. So this implementation
%    uses an argument to examine the next token. In a previous version
%    I reused \cs{@xspace}, but this version is shorter and easier
%    to understand.
%    \begin{macrocode}
\def\HyPsd@doxspace#1{%
  \ifx#1\relax\else
   \ifx#1.\else
    \ifx#1:\else
     \ifx#1,\else
      \ifx#1;\else
       \ifx#1!\else
        \ifx#1?\else
         \ifx#1/\else
          \ifx#1-\else
           \ifx#1'\else
             \HyPsd@SPACEOPTI
           \fi
          \fi
         \fi
        \fi
       \fi
      \fi
     \fi
    \fi
   \fi
  \fi
  #1%
}%
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Converting to Unicode}
%    Eight bit characters are converted to the sixteen bit ones,
%    \cs{8} is replaced by \cs{00}, and \cs{9} is removed.
%    The result should be a valid Unicode PDF string without the
%    Unicode marker at the beginning.
%    \begin{macrocode}
\begingroup
  \catcode`\|=0 %
  \catcode`\\=12 %
%    \end{macrocode}
%    \SpecialEscapechar{\|}
%    \begin{macro}{\HyPsd@ConvertToUnicode}
%    \begin{macrocode}
  |gdef|HyPsd@ConvertToUnicode#1{%
    |xdef#1{%
      |expandafter|HyPsd@DoConvert#1|@empty|@empty|@empty
    }%
    |ifx#1|@empty
    |else
      |xdef#1{%
        \376\377%
        #1%
      }%
    |fi
  }%
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@DoConvert}
%    \begin{macrocode}
  |gdef|HyPsd@DoConvert#1{%
    |ifx#1|@empty
    |else
      |ltx@ReturnAfterFi{%
        |ifx#1\%%
          \%%
          |expandafter|HyPsd@DoEscape
        |else
          |HyPsd@Char{#1}%
          |expandafter|HyPsd@DoConvert
        |fi
      }%
    |fi
  }%
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@DoEscape}
%    \begin{macrocode}
  |gdef|HyPsd@DoEscape#1{%
    |ifx#19%
      |expandafter|HyPsd@GetTwoBytes
    |else
      |ltx@ReturnAfterFi{%
        |ifx#18%
          00%
          |expandafter|HyPsd@GetTwoBytes
        |else
          #1%
          |expandafter|HyPsd@GetOneByte
        |fi
      }%
    |fi
  }%
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@GetTwoBytes}
%    \begin{macrocode}
  |gdef|HyPsd@GetTwoBytes#1\#2#3#4{%
    #1\#2#3#4%
    |HyPsd@DoConvert
  }%
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@GetOneBye}
%    \begin{macrocode}
  |gdef|HyPsd@GetOneByte#1#2{%
    #1#2%
    |HyPsd@DoConvert
  }%
|endgroup
%    \end{macrocode}
%    \end{macro}
%    \SpecialEscapechar{\\}
%    \begin{macro}{\HyPsd@@GetNextTwoTokens}
%    \TeX{} does only allow nine parameters, so we need another macro
%    to get more arguments.
%    \begin{macrocode}
\def\HyPsd@GetNextTwoTokens#1#2#3\END#4{%
  \xdef#4{#4#1#2}%
  \HyPsd@@ConvertToUnicode#3\END#4%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPsd@Char}
%    \begin{macrocode}
\begingroup
  \catcode0=9 %
  \catcode`\^=7 %
  \catcode`\^^^=12 %
  \def\x{^^^^0000}%
\expandafter\endgroup
\ifx\x\@empty
  \def\HyPsd@Char#1{%
    \ifnum`#1<128 %
      \@backslashchar 000#1%
    \else
      \ifnum`#1<65536 %
        \expandafter\HyPsd@CharTwoByte\number`#1!%
      \else
        \expandafter\expandafter\expandafter\HyPsd@CharSurrogate
        \intcalcSub{`#1}{65536}!%
      \fi
    \fi
  }%
  \def\HyPsd@CharTwoByte#1!{%
    \expandafter\expandafter\expandafter\HyPsd@CharOctByte
    \IntCalcDiv#1!256!!%
    \expandafter\expandafter\expandafter\HyPsd@CharOctByte
    \IntCalcMod#1!256!!%
  }%
  \def\HyPsd@CharOctByte#1!{%
    \@backslashchar
    \IntCalcDiv#1!64!%
    \intcalcDiv{\IntCalcMod#1!64!}{8}%
    \IntCalcMod#1!8!%
  }%
  \def\HyPsd@CharSurrogate#1!{%
    \@backslashchar 33%
    \IntCalcDiv#1!262144!%
    \expandafter\expandafter\expandafter\HyPsd@CharOctByte
    \intcalcDiv{\IntCalcMod#1!262144!}{1024}!%
    \@backslashchar 33%
    \expandafter\expandafter\expandafter\IntCalcAdd
    \intcalcDiv{\IntCalcMod#1!1024!}{256}!4!%
    \expandafter\expandafter\expandafter\HyPsd@CharOctByte
    \IntCalcMod#1!256!!%
  }%
\else
  \def\HyPsd@Char#1{%
    \@backslashchar 000#1%
  }%
\fi
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Support for UTF-8 input encoding}
%
%    After |\usepackage[utf8]{inputenc}| there are macros that
%    expect the UTF-8 octets as arguments. Therefore we can
%    calculate the PDF octal sequences directly. Because the
%    PDF format is limited to UCS-2, conversion macros are
%    needed for UTF-8 sequences with two and three octets only.
%
%    This calculation must be done in an expandable context,
%    so we use e\TeX here for performance reasons. Unhappily
%    the results of divisions are rounded. Thus a
%    circumvention via |\dimexpr| is used, e.g.:
%    \begin{quote}
%      |\numexpr 123/4\relax| is replaced by\\
%      |\number\dimexpr.25\dimexpr 123sp\relax\relax|
%    \end{quote}
%    \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname numexpr\endcsname\relax
  \let\HyPsd@UTFviii\relax
\else
  \begingroup
    \lccode`\~=`^^f4\relax
  \lowercase{\endgroup
    \def\HyPsd@UTFviii{%
      \let\UTFviii@two@octets\HyPsd@UTFviii@two
      \let\UTFviii@three@octets\HyPsd@UTFviii@three
      \let\UTFviii@four@octets\HyPsd@UTFviii@four
      \ifx~\HyPsd@UTFviii@ccxliv@undef
        \let~\HyPsd@UTFviii@ccxliv@def
      \fi
      \let\unichar\HyPsd@unichar
    }%
  }%
  \def\HyPsd@UTFviii@ccxliv@undef{\@inpenc@undefined@{utf8}}%
  \edef\HyPsd@UTFviii@ccxliv@def{%
    \noexpand\UTFviii@four@octets\string ^^f4%
  }%
%    \end{macrocode}
%
%    The two octet form of UTF-8 |110aaabb| (A) and |10cccddd| (B)
%    must be converted into octal numbers |00a| and |bcd|. The
%    result is |\8a\bcd| (with a, b, c, d as octal numbers).
%    The conversion equations.
%    \begin{eqnarray}
%      a &:= A/4 - 48\\
%      b &:= A - 4*(A/4)\\
%      c &:= B/8 - 8*((8*(B/8))/8)\\
%      d &:= B - 8*(B/8)\\
%    \end{eqnarray}
%    ^^A   #1 = A/4   #2 = A
%    ^^A   #3 = B/8   #4 = B
%    \begin{macrocode}
  \def\HyPsd@UTFviii@two#1#2{%
    \expandafter\HyPsd@UTFviii@@two
      \number\dimexpr.25\dimexpr`#1sp\expandafter\relax\expandafter|%
      \number`#1\expandafter|%
      \number\dimexpr.125\dimexpr`#2sp\expandafter\relax\expandafter|%
      \number`#2 \@nil
  }%
  \def\HyPsd@UTFviii@@two#1|#2|#3|#4\@nil{%
    \expandafter\8%
    \number\numexpr #1-48\expandafter\relax
    \csname\number\numexpr #2-4*#1\relax\expandafter\endcsname
    \number\numexpr #3-8*%
        \number\dimexpr.125\dimexpr#3sp\relax\relax\expandafter\relax
    \number\numexpr #4-8*#3\relax
  }%
%    \end{macrocode}
%
%    Three octet form: |1110aabb| (A), |10bcccdd| (B), and |10eeefff|
%    (C). The result is |\9abc\def| (with a, \dots, f as octal numbers).
%    The conversion equations:
%    \begin{eqnarray}
%      a &:= A/4 - 56\\
%      b &:= 2*(A - 4*(A/4)) + ((B-128 < 32) ? 0 : 1)\\
%      c &:= B/4 - 32 - ((B-128 < 32) ? 0 : 8)\\
%      d &:= B - 4*(B/4)\\
%      e &:= C/8 - 16\\
%      f &:= C - 8*(C/8)\\
%    \end{eqnarray}
%    ^^A   #1 = A/4   #2 = A
%    ^^A   #3 = (B-128 < 32) ? 0 : 1
%    ^^A   #4 = B/4   #5 = B
%    ^^A   #6 = C/8   #7 = C
%    \begin{macrocode}
  \def\HyPsd@UTFviii@three#1#2#3{%
    \expandafter\HyPsd@UTFviii@@three
      \number\dimexpr.25\dimexpr`#1sp\expandafter\relax\expandafter|%
      \number`#1\expandafter|%
      \number\ifnum\numexpr`#2-128\relax <32 0\else 1\fi\expandafter|%
      \number\dimexpr.25\dimexpr`#2sp\expandafter\relax\expandafter|%
      \number`#2\expandafter|%
      \number\dimexpr.125\dimexpr`#3sp\expandafter\relax\expandafter|%
      \number`#3 \@nil
  }%
  \def\HyPsd@UTFviii@@three#1|#2|#3|#4|#5|#6|#7\@nil{%
    \expandafter\9%
    \number\numexpr #1-56\expandafter\relax
    \number\numexpr 2*(#2-4*#1)+#3\expandafter\relax
    \number\numexpr #4 - 32 -\ifcase#3 0\else 8\fi\expandafter\relax
    \csname\number\numexpr #5-4*#4\relax\expandafter\endcsname
    \number\numexpr #6-16\expandafter\relax
    \number\numexpr #7-8*#6\relax
  }%
%    \end{macrocode}
%
%    Surrogates: 4 octets in UTF-8, a surrogate pair in UTF-16.
%    High surrogate range: U+D800--U+DBFF, low surrogate range:
%    U+DC00-U+DFFF.
%
%\begin{quote}
%\begin{verbatim}
%UTF-8:  11110uuu     10uuzzzz     10yyyyyy     10xxxxxx
%wwww =  uuuuu - 1
%UTF-16: 110110ww     wwzzzzyy     110111yy     yyxxxxxx
%octal:  011 011 0ww  0ww zzz zyy  011 011 1yy  0yy xxx xxx
%\end{verbatim}
%\end{quote}
%    \begin{macrocode}
  \def\HyPsd@UTFviii@four#1#2{%
    \expandafter\HyPsd@@UTFviii@four\number
    \numexpr-1+(`#1-240)*4+\dimexpr.0625\dimexpr`#2sp-128sp%
    \expandafter|\number
    \numexpr`#2-16*\dimexpr.0625\dimexpr`#2sp|%
  }%
  \def\HyPsd@@UTFviii@four#1|#2|#3{%
    \933\number\dimexpr.25\dimexpr#1sp\relax\relax
    \csname\number\numexpr#1-4*\dimexpr.25\dimexpr#1sp\endcsname
    \ifodd#2 %
      \number\numexpr(#2-1)/2\relax
    \else
      \number\numexpr#2/2\relax
    \fi
    \number\numexpr\ifodd#2 4+\fi
        \dimexpr.0625\dimexpr`#3sp-128sp\relax\relax\relax
    \933%
    \expandafter\HyPsd@@@UTFviii@four\number
    \numexpr`#3-16*\dimexpr.0625\dimexpr`#3sp|%
  }%
  \def\HyPsd@@@UTFviii@four#1|#2{%
    \number\numexpr4+\dimexpr.25\dimexpr#1sp\relax\relax\relax
    \csname\number\numexpr#1-4*\dimexpr.25\dimexpr#1sp\endcsname
    \number\dimexpr.125\dimexpr`#2sp-128sp\relax\relax
    \number\numexpr`#2-8*\dimexpr.125\dimexpr`#2sp\relax\relax\relax
  }%
%    \end{macrocode}
%
%    Input encoding |utf8x| of package |ucs| uses macro \cmd{\unichar}.
%    Values greater than |"FFFF| are not supported.
%    \begin{macrocode}
  \def\HyPsd@unichar#1{%
    \ifHy@unicode
      \ifnum#1>"10FFFF %
        \HyPsd@UnicodeReplacementCharacter % illegal
      \else
        \ifnum#1>"FFFF %
%    \end{macrocode}
%    High-surrogate code point.
%    (|"D800| = |55296|, |\p@| = |1pt| = |65536sp|)
%    \begin{macrocode}
          \expandafter\HyPsd@unichar\expandafter{%
            \number\numexpr 55296+%
                \dimexpr.0009765625\dimexpr\number#1sp-\p@
                \relax\relax\relax
          }%
%    \end{macrocode}
%    Low-surrogate code point.
%    (|"DC00| = 56320, |"DC00| - |65536| = |-9216|)
%    \begin{macrocode}
          \expandafter\HyPsd@unichar\expandafter{%
            \number\numexpr#1-9216%
                -1024*\dimexpr.0009765625\dimexpr\number#1sp-\p@
                \relax\relax\relax
        }%
        \else
          \ifnum#1>"7FF %
            \9%
            \expandafter\HyPsd@unichar@first@byte\expandafter{%
              \number
              \dimexpr.00390625\dimexpr\number#1sp\relax\relax
            }%
          \else
            \8%
            \number\dimexpr.00390625\dimexpr\number#1sp\relax\relax
          \fi
          \expandafter\HyPsd@unichar@second@byte\expandafter{%
            \number
            \numexpr#1-256*\number
                \dimexpr.00390625\dimexpr\number#1sp\relax\relax\relax
          }%
        \fi
      \fi
    \else
      .% unsupported (Unicode -> PDF Doc Encoding)
    \fi
  }%
  \def\HyPsd@UnicodeReplacementCharacter{\9377\375}%
  \def\HyPsd@unichar@first@byte#1{%
    \number\dimexpr.015625\dimexpr#1sp\relax\relax
    \expandafter\HyPsd@unichar@octtwo\expandafter{%
      \number
      \numexpr#1-64*\number\dimexpr.015625\dimexpr#1sp%
      \relax\relax\relax
    }%
  }%
  \def\HyPsd@unichar@second@byte#1{%
    \csname\number\dimexpr.015625\dimexpr#1sp\relax\relax\endcsname
    \expandafter\HyPsd@unichar@octtwo\expandafter{%
      \number
      \numexpr#1-64*\number\dimexpr.015625\dimexpr#1sp%
      \relax\relax\relax
    }%
  }%
  \def\HyPsd@unichar@octtwo#1{%
    \number\dimexpr.125\dimexpr#1sp\relax\relax
    \number\numexpr#1-8*\number\dimexpr.125\dimexpr#1sp%
    \relax\relax\relax
  }%
%    \end{macrocode}
%    \begin{macrocode}
\fi
%    \end{macrocode}
%
%    \begin{macro}{\HyPsd@utf@viii@undeferr}
%    \cs{utf@viii@undeferr} comes from file |utf8x.def| from
%    package |ucs|.
%    \begin{macrocode}
\def\HyPsd@utf@viii@undeferr#1#2#3#4#5#6{%
  \ifx\@gobble#1%
  \else
    [Please insert \textbackslash PrerenderUnicode%
    \textbraceleft#1\textbraceright\space
    into preamble]%
  \fi
}%
%    \end{macrocode}
%    \end{macro}
%
%
% \section{Support of other packages}
%
% \subsection{Class memoir}
%
%    \begin{macrocode}
\@ifclassloaded{memoir}{%
  \Hy@AtEndOfPackage{\RequirePackage{memhfixc}}%
}{}
%    \end{macrocode}
%
% \subsection{Package subfigure}
%    Added fix for version 2.1. Here \cmd{\sub@label} is defined.
%    \begin{macrocode}
\@ifpackageloaded{subfigure}{%
  \ltx@IfUndefined{sub@label}{%
    \Hy@hypertexnamesfalse
  }{%
    \renewcommand*{\sub@label}[1]{%
      \@bsphack
      \subfig@oldlabel{#1}%
      \if@filesw
        \begingroup
          \edef\@currentlabstr{%
            \expandafter\strip@prefix\meaning\@currentlabelname
          }%
          \protected@write\@auxout{}{%
            \string\newlabel{sub@#1}{%
              {\@nameuse{@@thesub\@captype}}%
              {\thepage}%
              {%
                \expandafter\strip@period\@currentlabstr
                \relax.\relax\@@@%
              }%
              {\@currentHref}%
              {}%
            }%
          }%
        \endgroup
      \fi
      \@esphack
    }%
    \@ifpackagelater{subfigure}{2002/03/26}{}{%
      \providecommand*{\toclevel@subfigure}{1}%
      \providecommand*{\toclevel@subtable}{1}%
    }%
  }%
}{}
%    \end{macrocode}
%
% \subsection{Package xr and xr-hyper}
%    The beta version of xr that supports \cmd{\XR@addURL} is called
%    \verb|xr-hyper|. Therefore we test for the macro itself and not
%    for the package name:
%    \begin{macrocode}
\ltx@IfUndefined{XR@addURL}{%
}{%
%    \end{macrocode}
% If reading external aux files check whether they have a non zero
% fourth field in |\newlabel| and if so, add the URL as the fifth field.
%    \begin{macrocode}
  \def\XR@addURL#1{\XR@@dURL#1{}{}{}{}\\}%
  \def\XR@@dURL#1#2#3#4#5\\{%
    {#1}{#2}%
    \if!#4!%
    \else
      {#3}{#4}{\XR@URL}%
    \fi
  }%
}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\Hy@true{true}
\def\Hy@false{false}
%    \end{macrocode}
%
%    Providing dummy definitions.
%    \begin{macrocode}
\let\literalps@out\@gobble
\newcommand\pdfbookmark[3][]{}
\def\Acrobatmenu#1#2{\leavevmode#2}
\def\Hy@writebookmark#1#2#3#4#5{}%
%    \end{macrocode}
%
% \section{Help macros for links}
% Anchors get created on the baseline of where they occur.   If an
% XYZ PDF view is set, this means that the link places the top of the
% screen \emph{on the baseline} of the target. If this is an equation,
% for instance, it means that you cannot see anything. Some links, of
% course, are created at the start of environments, and so it works. To
% allow for this, anchors are raised, where possible, by some small
% amount. This defaults to |\baselineskip|, but users can set it to
% something else in two ways (thanks to Heiko Oberdiek for suggesting this):
% \begin{enumerate}
% \item Redefine |\HyperRaiseLinkDefault| to be eg the height of a |\strut|
% \item Redefine  |\HyperRaiseLinkHook| to do something complicated;
%  it must give a value to |\HyperRaiseLinkLength|, which is what
%  actually gets used
% \end{enumerate}
%    \begin{macrocode}
\let\HyperRaiseLinkHook\@empty
\def\HyperRaiseLinkDefault{\baselineskip}
%    \end{macrocode}
%    |\HyperRaiseLinkHook| allows the user to reassign
%    |\HyperRaiseLinkLength|.
%    \begin{macrocode}
\newcount\Hy@SavedSpaceFactor
\def\Hy@SaveSpaceFactor{%
  \global\Hy@SavedSpaceFactor=\ifhmode\spacefactor\else\z@\fi
}
\def\Hy@RestoreSpaceFactor{%
  \relax
  \ifhmode
    \ifnum\Hy@SavedSpaceFactor>\z@
      \spacefactor=\Hy@SavedSpaceFactor
    \fi
  \fi
}
\def\Hy@SaveSavedSpaceFactor{%
  \edef\Hy@RestoreSavedSpaceFactor{%
    \global\Hy@SavedSpaceFactor=\the\Hy@SavedSpaceFactor\relax
  }%
}
\def\Hy@raisedlink#1{%
  \ifvmode
    #1%
  \else
    \Hy@SaveSpaceFactor
    \penalty\@M
    \smash{%
      \begingroup
        \let\HyperRaiseLinkLength\@tempdima
        \setlength\HyperRaiseLinkLength\HyperRaiseLinkDefault
        \HyperRaiseLinkHook
      \expandafter\endgroup
      \expandafter\raise\the\HyperRaiseLinkLength\hbox{%
        \Hy@RestoreSpaceFactor
        #1%
        \Hy@SaveSpaceFactor
      }%
    }%
    \Hy@RestoreSpaceFactor
  \fi
}
%    \end{macrocode}
%
%    \begin{macro}{\Hy@SaveLastskip}
%    \begin{macro}{\Hy@RestoreLastskip}
%    Inserting a \cmd{\special} command to set a
%    destination destroys the \cmd{\lastskip} value.
%
%    \begin{macrocode}
\def\Hy@SaveLastskip{%
  \let\Hy@RestoreLastskip\relax
  \ifvmode
    \ifdim\lastskip=\z@
      \let\Hy@RestoreLastskip\nobreak
    \else
      \begingroup
        \skip@=-\lastskip
        \edef\x{%
          \endgroup
          \def\noexpand\Hy@RestoreLastskip{%
            \noexpand\ifvmode
              \noexpand\nobreak
              \vskip\the\skip@
              \vskip\the\lastskip\relax
            \noexpand\fi
          }%
        }%
      \x
    \fi
  \else
    \ifhmode
      \ifdim\lastskip=\z@
        \let\Hy@RestoreLastskip\nobreak
      \else
        \begingroup
          \skip@=-\lastskip
          \edef\x{%
            \endgroup
            \def\noexpand\Hy@RestoreLastskip{%
              \noexpand\ifhmode
                \noexpand\nobreak
                \hskip\the\skip@
                \hskip\the\lastskip\relax
              \noexpand\fi
            }%
          }%
        \x
      \fi
    \fi
  \fi
}%
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%
% \section{Options}
%
%    \begin{macrocode}
\SetupKeyvalOptions{%
  family=Hyp,%
  prefix=HyOpt%
}
%    \end{macrocode}
%
% \subsection{Help macros}
%
%    \begin{macro}{\IfHyperBooleanExists}
%    \begin{macrocode}
\def\IfHyperBooleanExists#1{%
  \ltx@ifundefined{Hy@#1false}\ltx@secondoftwo{%
    \ltx@ifundefined{KV@Hyp@#1@default}\ltx@secondoftwo\ltx@firstoftwo
  }%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
\@namedef{KV@Hyp@stoppedearly@default}{}
%    \end{macrocode}
%
%    \begin{macro}{\IfHyperBoolean}
%    \begin{macrocode}
\def\IfHyperBoolean#1{%
  \IfHyperBooleanExists{#1}{%
    \csname ifHy@#1\endcsname
      \expandafter\ltx@firstoftwo
    \else
      \expandafter\ltx@secondoftwo
    \fi
  }\ltx@secondoftwo
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\Hy@boolkey}
%    \begin{macrocode}
\def\Hy@boolkey#1#2{%
  \edef\Hy@tempa{#2}%
  \lowercase\expandafter{%
    \expandafter\def\expandafter\Hy@tempa\expandafter{\Hy@tempa}%
  }%
  \ifx\Hy@tempa\@empty
    \let\Hy@tempa\Hy@true
  \fi
  \ifx\Hy@tempa\Hy@true
  \else
    \ifx\Hy@tempa\Hy@false
    \else
      \let\Hy@tempa\relax
    \fi
  \fi
  \ifx\Hy@tempa\relax
    \Hy@WarnOptionValue{#2}{#1}{`true' or 'false'}%
  \else
    \Hy@Info{Option `#1' set `\Hy@tempa'}%
    \csname Hy@#1\Hy@tempa\endcsname
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Hy@WarnOptionValue}
%    \begin{macrocode}
\def\Hy@WarnOptionValue#1#2#3{%
  \Hy@Warning{%
    Unexpected value `#1'\MessageBreak
    of option `#2' instead of\MessageBreak
    #3%
  }%
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\Hy@DisableOption}
%    \begin{macrocode}
\def\Hy@DisableOption#1{%
  \ltx@ifundefined{KV@Hyp@#1@default}{%
    \define@key{Hyp}{#1}%
  }{%
    \define@key{Hyp}{#1}[]%
  }%
  {\Hy@WarnOptionDisabled{#1}}%
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\Hy@WarnOptionDisabled}
%    \begin{macrocode}
\def\Hy@WarnOptionDisabled#1{%
  \Hy@Warning{%
    Option `#1' has already been used,\MessageBreak
    setting the option has no effect%
  }%
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\Hy@CheckOptionValue}
%    Some options take a string value out of a limited set of values.
%    Macro \cs{Hy@CheckOptionValue} checks whether the given value |#1|
%    for option |#2| is a member of the value list |#3|.
%    \begin{macrocode}
\def\Hy@CheckOptionValue#1#2#3{%
  \begingroup
    \edef\x{#1}%
    \@onelevel@sanitize\x
    \let\y=y%
    \def\do##1##2{%
      \def\z{##1}%
      \@onelevel@sanitize\z
      \ifx\x\z
        \let\y=n%
        \let\do\@gobbletwo
      \fi
    }%
    #3%
    \ifx\y y%
      \def\do##1##2{%
        * `##1'%
        \ifx\\##2\\\else\space(##2)\fi
        \MessageBreak
      }%
      \Hy@Warning{%
        Values of option `#2':\MessageBreak
        #3%
        * An empty value disables the option.\MessageBreak
        Unknown value `\x'%
      }%
    \fi
  \endgroup
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\Hy@DefNameKey}
%    \noindent
%    |#1|: option name\\
%    |#2|: \cs{do} list with known values, first
%          argument of \cs{do} is value, second argument is a comment.
%    \begin{macrocode}
\def\Hy@DefNameKey#1{%
  \expandafter\Hy@@DefNameKey\csname @#1\endcsname{#1}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Hy@@DefNameKey}
%    \noindent
%    |#1|: macro for value storage\\
%    |#2|: option name\\
%    |#3|: \cs{do} list with known values.
%    \begin{macrocode}
\def\Hy@@DefNameKey#1#2#3{%
  \define@key{Hyp}{#2}{%
    \edef#1{##1}%
    \ifx#1\@empty
    \else
      \Hy@CheckOptionValue{##1}{#2}{#3}%
    \fi
  }%
  \let#1\@empty
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Hy@UseNameKey}
%    \begin{macrocode}
\def\Hy@UseNameKey#1#2{%
  \ifx#2\@empty
  \else
    /#1/#2%
  \fi
}
%    \end{macrocode}
%    \end{macro}
%
% \subsection{Defining the options}
%    \begin{macrocode}
\define@key{Hyp}{implicit}[true]{%
  \Hy@boolkey{implicit}{#1}%
}
\define@key{Hyp}{draft}[true]{%
  \Hy@boolkey{draft}{#1}%
}
\define@key{Hyp}{final}[true]{%
  \Hy@boolkey{final}{#1}%
}
\let\KV@Hyp@nolinks\KV@Hyp@draft
%    \end{macrocode}
%    \begin{macrocode}
\def\Hy@ObsoletePaperOption#1{%
  \Hy@WarningNoLine{%
    Option `#1' is no longer used%
  }%
  \define@key{Hyp}{#1}[true]{}%
}
\def\Hy@temp#1{%
  \define@key{Hyp}{#1}[true]{%
    \Hy@ObsoletePaperOption{#1}%
  }%
}
\Hy@temp{a4paper}
\Hy@temp{a5paper}
\Hy@temp{b5paper}
\Hy@temp{letterpaper}
\Hy@temp{legalpaper}
\Hy@temp{executivepaper}
%    \end{macrocode}
%    \begin{macrocode}
\define@key{Hyp}{setpagesize}[true]{%
  \Hy@boolkey{setpagesize}{#1}%
}
\define@key{Hyp}{debug}[true]{%
  \Hy@boolkey{debug}{#1}%
}
\define@key{Hyp}{linktocpage}[true]{%
  \Hy@boolkey{linktocpage}{#1}%
  \ifHy@linktocpage
    \let\Hy@linktoc\Hy@linktoc@page
  \else
    \let\Hy@linktoc\Hy@linktoc@section
  \fi
}
\chardef\Hy@linktoc@none=0 %
\chardef\Hy@linktoc@section=1 %
\chardef\Hy@linktoc@page=2 %
\chardef\Hy@linktoc@all=3 %
\ifHy@linktocpage
  \let\Hy@linktoc\Hy@linktoc@page
\else
  \let\Hy@linktoc\Hy@linktoc@section
\fi
\define@key{Hyp}{linktoc}{%
  \@ifundefined{Hy@linktoc@#1}{%
    \Hy@Warning{%
      Unexpected value `#1' of\MessageBreak
      option `linktoc' instead of `none',\MessageBreak
      `section', `page' or `all'%
    }%
  }{%
    \expandafter\let\expandafter\Hy@linktoc
    \csname Hy@linktoc@#1\endcsname
  }%
}
\define@key{Hyp}{extension}{\def\XR@ext{#1}}
\let\XR@ext\relax
\define@key{Hyp}{verbose}[true]{%
  \Hy@boolkey{verbose}{#1}%
}
\define@key{Hyp}{typexml}[true]{%
  \Hy@boolkey{typexml}{#1}%
}
%    \end{macrocode}
% If we are going to PDF via HyperTeX |\special| commands,
% the dvips (-z option)  processor does not know
% the \emph{height} of a link, as it works solely on the
% position of the closing |\special|. If we use this option,
% the |\special| is raised up by the right amount, to fool
% the dvi processor.
%    \begin{macrocode}
\define@key{Hyp}{raiselinks}[true]{%
  \Hy@boolkey{raiselinks}{#1}%
}
%    \end{macrocode}
% Most PDF-creating drivers do not allow links to be broken
%    \begin{macrocode}
\def\Hy@setbreaklinks#1{%
  \csname breaklinks#1\endcsname
}
%    \end{macrocode}
%    \begin{macrocode}
\def\Hy@breaklinks@unsupported{%
  \ifx\Hy@setbreaklinks\@gobble
    \ifHy@breaklinks
      \Hy@WarningNoLine{%
        You have enabled option `breaklinks'.\MessageBreak
        But driver `\Hy@driver.def' does not suppport this.\MessageBreak
        Expect trouble with the link areas of broken links%
      }%
    \fi
  \fi
}
%    \end{macrocode}
%    \begin{macrocode}
\define@key{Hyp}{breaklinks}[true]{%
  \Hy@boolkey{breaklinks}{#1}%
  \let\Hy@setbreaklinks\@gobble
}
%    \end{macrocode}
%    \begin{macrocode}
\define@key{Hyp}{localanchorname}[true]{%
  \Hy@boolkey{localanchorname}{#1}%
}
%    \end{macrocode}
% Determines whether an automatic anchor is put on each page
%    \begin{macrocode}
\define@key{Hyp}{pageanchor}[true]{%
  \Hy@boolkey{pageanchor}{#1}%
}
%    \end{macrocode}
% Are the page links done as plain arabic numbers, or do
% they follow the formatting of the package? The latter loses
% if you put in typesetting like |\textbf| or the like.
%    \begin{macrocode}
\define@key{Hyp}{plainpages}[true]{%
  \Hy@boolkey{plainpages}{#1}%
}
%    \end{macrocode}
% Are the names for anchors made as per the HyperTeX system,
% or do they simply use what \LaTeX\ provides?
%    \begin{macrocode}
\define@key{Hyp}{naturalnames}[true]{%
  \Hy@boolkey{naturalnames}{#1}%
}
%    \end{macrocode}
% Completely ignore the names as per the HyperTeX system,
% and use unique counters.
%    \begin{macrocode}
\define@key{Hyp}{hypertexnames}[true]{%
  \Hy@boolkey{hypertexnames}{#1}%
}
%    \end{macrocode}
% Currently, |dvips| doesn't allow anchors nested within targets,
% so this option tries to stop that happening. Other processors
% may be able to cope.
%    \begin{macrocode}
\define@key{Hyp}{nesting}[true]{%
  \Hy@boolkey{nesting}{#1}%
}
%    \end{macrocode}
%
%    \begin{macrocode}
\define@key{Hyp}{unicode}[true]{%
  \Hy@boolkey{unicode}{#1}%
  \ifHy@unicode
    \def\HyPsd@pdfencoding{unicode}%
    \HyPsd@LoadUnicode
  \else
    \def\HyPsd@pdfencoding{pdfdoc}%
  \fi
}
\def\HyPsd@LoadUnicode{%
  \@ifundefined{T@PU}{%
    \input{puenc.def}%
    \HyLinguex@Restore
  }{}%
  \DeclareFontFamily{PU}{pdf}{}%
  \DeclareFontShape{PU}{pdf}{m}{n}{ <-> cmr10 }{}%
  \DeclareFontSubstitution{PU}{pdf}{m}{n}%
  \global\let\HyPsd@LoadUnicode\relax
}
\Hy@AtBeginDocument{%
  \ifx\HyPsd@LoadUnicode\relax
  \else
    \def\HyPsd@LoadUnicode{%
      \Hy@Error{%
        Unicode support for bookmarks is not available.\MessageBreak
        Activate unicode support by using one of the options\MessageBreak
        `unicode', `pdfencoding=unicode', `pdfencoding=auto'\MessageBreak
        in the preamble%
      }\@ehc
      \global\let\HyPsd@LoadUnicode\relax
      \global\Hy@unicodefalse
      \global\let\Hy@unicodetrue\Hy@unicodefalse
    }%
  \fi
}
%    \end{macrocode}
%    \begin{macrocode}
\define@key{Hyp}{pdfencoding}{%
  \edef\HyPsd@temp{#1}%
  \ifx\HyPsd@temp\HyPsd@pdfencoding@pdfdoc
    \let\HyPsd@pdfencoding\HyPsd@temp
    \Hy@unicodefalse
  \else
    \ifcase\ifx\HyPsd@temp\HyPsd@pdfencoding@unicode
             \z@
           \else
             \ifx\HyPsd@temp\HyPsd@pdfencoding@auto
               \z@
             \else
               \@ne
             \fi
           \fi
      \let\HyPsd@pdfencoding\HyPsd@temp
      \hypersetup{unicode}%
      \ifHy@unicode
        \def\HyPsd@pdfencoding{#1}%
        \ifx\HyPsd@pdfencoding\HyPsd@pdfencoding@auto
          \HyPsd@LoadStringEnc
        \fi
      \else
        \Hy@Warning{Cannot switch to unicode bookmarks}%
        \let\HyPsd@pdfencoding\HyPsd@pdfencoding@pdfdoc
      \fi
    \else
      \@onelevel@sanitize\HyPsd@temp
      \Hy@Warning{%
        Values of option `pdfencoding':\MessageBreak
        `pdfdoc', `unicode', `auto'.\MessageBreak
        Ignoring unknown value `\HyPsd@temp'%
      }%
    \fi
  \fi
}
\def\HyPsd@pdfencoding@auto{auto}
\def\HyPsd@pdfencoding@pdfdoc{pdfdoc}
\def\HyPsd@pdfencoding@unicode{unicode}
\let\HyPsd@pdfencoding\Hy@pdfencoding@pdfdoc
\def\HyPsd@LoadStringEnc{%
  \RequirePackage{stringenc}[2009/12/15]%
  \let\HyPsd@LoadStringEnc\relax
}
\Hy@AtBeginDocument{%
  \@ifpackageloaded{stringenc}{%
    \let\HyPsd@LoadStringEnc\relax
  }{%
    \def\HyPsd@LoadStringEnc{%
      \Hy@WarningNoLine{%
        Missing package `stringenc'. Use `pdfencoding=auto'\MessageBreak
        in the preamble or load the package there%
      }%
    }%
  }%
}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\hypersetup{\kvsetkeys{Hyp}}
%    \end{macrocode}
%
%    \begin{macrocode}
\newif\ifHy@setpdfversion
\define@key{Hyp}{pdfversion}{%
  \@ifundefined{Hy@pdfversion@#1}{%
    \PackageWarning{hyperref}{%
      Unsupported PDF version `#1'.\MessageBreak
      Valid values: 1.2 until 1.9%
    }%
  }{%
    \Hy@setpdfversiontrue
    \edef\Hy@pdfversion{\@nameuse{Hy@pdfversion@#1}}%
  }%
}
\@namedef{Hy@pdfversion@1.2}{2}%
\@namedef{Hy@pdfversion@1.3}{3}%
\@namedef{Hy@pdfversion@1.4}{4}%
\@namedef{Hy@pdfversion@1.5}{5}%
\@namedef{Hy@pdfversion@1.6}{6}%
\@namedef{Hy@pdfversion@1.7}{7}%
\@namedef{Hy@pdfversion@1.8}{8}%
\@namedef{Hy@pdfversion@1.9}{9}%
\def\Hy@pdfversion{2}
%    \end{macrocode}
%
% \section{Options for different drivers}\label{drivers}
%
%    \begin{macrocode}
\newif\ifHy@DviMode
\let\Hy@DviErrMsg\ltx@empty
\ifpdf
  \def\Hy@DviErrMsg{pdfTeX or LuaTeX is running in PDF mode}%
\else
  \ifxetex
    \def\Hy@DviErrMsg{XeTeX is running}%
  \else
    \ifvtex
      \ifvtexdvi
        \Hy@DviModetrue
      \else
        \def\Hy@DviErrMsg{VTeX is running, but not in DVI mode}%
      \fi
    \else
      \Hy@DviModetrue
    \fi
  \fi
\fi
\def\HyOpt@CheckDvi#1{%
  \ifHy@DviMode
    \expandafter\ltx@firstofone
  \else
    \Hy@Error{%
      Wrong DVI mode driver option `#1',\MessageBreak
      because \Hy@DviErrMsg
    }\@ehc
    \expandafter\ltx@gobble
  \fi
}
%    \end{macrocode}
%    \begin{macrocode}
\DeclareVoidOption{tex4ht}{%
  \Hy@texhttrue
  \kvsetkeys{Hyp}{colorlinks=true}%
  \def\BeforeTeXIVht{\RequirePackage{color}}%
  \def\Hy@driver{htex4ht}%
  \def\MaybeStopEarly{%
    \Hy@Message{Stopped early}%
    \Hy@AtBeginDocument{%
      \PDF@FinishDoc
      \gdef\PDF@FinishDoc{}%
    }%
    \endinput
  }%
}
\DeclareVoidOption{pdftex}{%
  \ifpdf
    \def\Hy@driver{hpdftex}%
  \else
    \Hy@Error{%
      Wrong driver option `pdftex',\MessageBreak
      because pdfTeX in PDF mode is not detected%
    }\@ehc
  \fi
}
\DeclareVoidOption{nativepdf}{%
  \HyOpt@CheckDvi{nativepdf}{%
    \def\Hy@driver{hdvips}%
  }%
}
\DeclareVoidOption{dvipdfm}{%
  \HyOpt@CheckDvi{dvipdfm}{%
    \def\Hy@driver{hdvipdfm}%
  }%
}
\DeclareVoidOption{dvipdfmx}{%
  \HyOpt@CheckDvi{dvipdfmx}{%
    \def\Hy@driver{hdvipdfm}%
  }%
}
\define@key{Hyp}{dvipdfmx-outline-open}[true]{%
  \expandafter\ifx\csname if#1\expandafter\endcsname
                  \csname iftrue\endcsname
    \chardef\SpecialDvipdfmxOutlineOpen\@ne
  \else
    \chardef\SpecialDvipdfmxOutlineOpen\z@
  \fi
}
\DeclareVoidOption{xetex}{%
  \ifxetex
    \def\Hy@driver{hxetex}%
  \else
    \Hy@Error{%
      Wrong driver option `xetex',\MessageBreak
      because XeTeX is not detected%
    }\@ehc
  \fi
}
\DeclareVoidOption{pdfmark}{%
  \HyOpt@CheckDvi{pdfmark}{%
    \def\Hy@driver{hdvips}%
  }%
}
\DeclareVoidOption{dvips}{%
  \HyOpt@CheckDvi{dvips}{%
    \def\Hy@driver{hdvips}%
  }%
}
\DeclareVoidOption{hypertex}{%
  \HyOpt@CheckDvi{hypertex}{%
    \def\Hy@driver{hypertex}%
  }%
}
\let\Hy@MaybeStopNow\relax
\DeclareVoidOption{vtex}{%
  \ifvtex
    \ifnum 0\ifnum\OpMode<1 1\fi \ifnum\OpMode>3 1\fi =0 %
      \def\Hy@driver{hvtex}%
    \else
      \ifnum\OpMode=10\relax
        \def\Hy@driver{hvtexhtm}%
        \def\MaybeStopEarly{%
           \Hy@Message{Stopped early}%
           \Hy@AtBeginDocument{%
             \PDF@FinishDoc
             \gdef\PDF@FinishDoc{}%
           }%
           \endinput
        }%
      \else
        \Hy@Error{%
          Wrong driver option `vtex',\MessageBreak
          because of wrong OpMode (\the\OpMode)%
        }\@ehc
      \fi
    \fi
  \else
    \Hy@Error{%
      Wrong driver option `vtex',\MessageBreak
      because VTeX is not running%
    }\@ehc
  \fi
}
\DeclareVoidOption{vtexpdfmark}{%
  \ifvtex
    \ifnum 0\ifnum\OpMode<1 1\fi \ifnum\OpMode>3 1\fi =0 %
      \def\Hy@driver{hvtexmrk}%
    \else
      \Hy@Error{%
        Wrong driver option `vtexpdfmark',\MessageBreak
        because of wrong OpMode (\the\OpMode)%
      }\@ehc
    \fi
  \else
    \Hy@Error{%
      Wrong driver option `vtexpdfmark,\MessageBreak
      because VTeX is not running%
    }\@ehc
  \fi
}
\DeclareVoidOption{dviwindo}{%
  \HyOpt@CheckDvi{dviwindo}{%
    \def\Hy@driver{hdviwind}%
    \kvsetkeys{Hyp}{colorlinks}%
    \PassOptionsToPackage{dviwindo}{color}%
  }%
}
\DeclareVoidOption{dvipsone}{%
  \HyOpt@CheckDvi{dvipsone}{%
    \def\Hy@driver{hdvipson}%
  }%
}
\DeclareVoidOption{textures}{%
  \HyOpt@CheckDvi{textures}{%
    \def\Hy@driver{htexture}%
  }%
}
\DeclareVoidOption{latex2html}{%
  \HyOpt@CheckDvi{latex2html}{%
    \Hy@AtBeginDocument{\@@latextohtmlX}%
  }%
}
%    \end{macrocode}
% No more special treatment for ps2pdf. Let it sink or swim.
%    \begin{macrocode}
\DeclareVoidOption{ps2pdf}{%
  \HyOpt@CheckDvi{ps2pdf}{%
    \def\Hy@driver{hdvips}%
  }%
}
%    \end{macrocode}
%
%    \begin{macrocode}
\let\HyOpt@DriverFallback\ltx@empty
\define@key{Hyp}{driverfallback}{%
  \ifHy@DviMode
    \def\HyOpt@DriverFallback{#1}%
    \Hy@Match\HyOpt@DriverFallback{%
      ^(|dvipdfm|dvipdfmx|dvips|dvipsone|dviwindo|hypertex|ps2pdf|%
       latex2html|tex4ht)$%
    }{}{%
      \let\HyOpt@DriverFallback\ltx@empty
    }%
  \fi
}
%    \end{macrocode}
%
% \section{Options to add extra features}\label{features}
%    Make included figures (assuming they use the standard graphics
%     package) be hypertext links. Off by default. Needs more work.
%    \begin{macrocode}
\define@key{Hyp}{hyperfigures}[true]{%
  \Hy@boolkey{hyperfigures}{#1}%
}
%    \end{macrocode}
%
%    The automatic footnote linking can be disabled
%    by option hyperfootnotes.
%    \begin{macrocode}
\define@key{Hyp}{hyperfootnotes}[true]{%
  \Hy@boolkey{hyperfootnotes}{#1}%
}
%    \end{macrocode}
%
%    Set up back-referencing to be hyper links, by page,
%     slide or section number,
%    \begin{macrocode}
\def\back@none{none}
\def\back@section{section}
\def\back@page{page}
\def\back@slide{slide}
\define@key{Hyp}{backref}[section]{%
  \lowercase{\def\Hy@tempa{#1}}%
  \ifx\Hy@tempa\@empty
    \let\Hy@tempa\back@section
  \fi
  \ifx\Hy@tempa\Hy@false
    \let\Hy@tempa\back@none
  \fi
  \ifx\Hy@tempa\back@slide
    \let\Hy@tempa\back@section
  \fi
  \ifx\Hy@tempa\back@page
    \PassOptionsToPackage{hyperpageref}{backref}%
    \Hy@backreftrue
  \else
    \ifx\Hy@tempa\back@section
      \PassOptionsToPackage{hyperref}{backref}%
      \Hy@backreftrue
    \else
      \ifx\Hy@tempa\back@none
        \Hy@backreffalse
      \else
        \Hy@WarnOptionValue{#1}{backref}{%
          `section', `slide', `page', `none',\MessageBreak
          or `false'}%
      \fi
    \fi
  \fi
}
\define@key{Hyp}{pagebackref}[true]{%
  \edef\Hy@tempa{#1}%
  \lowercase\expandafter{%
    \expandafter\def\expandafter\Hy@tempa\expandafter{\Hy@tempa}%
  }%
  \ifx\Hy@tempa\@empty
    \let\Hy@tempa\Hy@true
  \fi
  \ifx\Hy@tempa\Hy@true
    \PassOptionsToPackage{hyperpageref}{backref}%
    \Hy@backreftrue
  \else
    \ifx\Hy@tempa\Hy@false
      \Hy@backreffalse
    \else
      \Hy@WarnOptionValue{#1}{pagebackref}{`true' or `false'}%
    \fi
  \fi
}
%    \end{macrocode}
% Make index entries be links back to the relevant pages. By default
% this is turned on, but may be stopped.
%    \begin{macrocode}
\define@key{Hyp}{hyperindex}[true]{%
  \Hy@boolkey{hyperindex}{#1}%
}
%    \end{macrocode}
%    Configuration of encap char.
%    \begin{macrocode}
\define@key{Hyp}{encap}[\|]{%
  \def\HyInd@EncapChar{#1}%
}
%    \end{macrocode}
%
% \section{Language options}
%
%    The \cmd{\autoref} feature depends on the language.
%    \begin{macrocode}
\def\HyLang@afrikaans{%
  \def\equationautorefname{Vergelyking}%
  \def\footnoteautorefname{Voetnota}%
  \def\itemautorefname{Item}%
  \def\figureautorefname{Figuur}%
  \def\tableautorefname{Tabel}%
  \def\partautorefname{Deel}%
  \def\appendixautorefname{Bylae}%
  \def\chapterautorefname{Hoofstuk}%
  \def\sectionautorefname{Afdeling}%
  \def\subsectionautorefname{Subafdeling}%
  \def\subsubsectionautorefname{Subsubafdeling}%
  \def\paragraphautorefname{Paragraaf}%
  \def\subparagraphautorefname{Subparagraaf}%
  \def\FancyVerbLineautorefname{Lyn}%
  \def\theoremautorefname{Teorema}%
  \def\pageautorefname{Bladsy}%
}
\def\HyLang@english{%
  \def\equationautorefname{Equation}%
  \def\footnoteautorefname{footnote}%
  \def\itemautorefname{item}%
  \def\figureautorefname{Figure}%
  \def\tableautorefname{Table}%
  \def\partautorefname{Part}%
  \def\appendixautorefname{Appendix}%
  \def\chapterautorefname{chapter}%
  \def\sectionautorefname{section}%
  \def\subsectionautorefname{subsection}%
  \def\subsubsectionautorefname{subsubsection}%
  \def\paragraphautorefname{paragraph}%
  \def\subparagraphautorefname{subparagraph}%
  \def\FancyVerbLineautorefname{line}%
  \def\theoremautorefname{Theorem}%
  \def\pageautorefname{page}%
}
\def\HyLang@french{%
  \def\equationautorefname{\'Equation}%
  \def\footnoteautorefname{note}%
  \def\itemautorefname{item}%
  \def\figureautorefname{Figure}%
  \def\tableautorefname{Tableau}%
  \def\partautorefname{Partie}%
  \def\appendixautorefname{Appendice}%
  \def\chapterautorefname{chapitre}%
  \def\sectionautorefname{section}%
  \def\subsectionautorefname{sous-section}%
  \def\subsubsectionautorefname{sous-sous-section}%
  \def\paragraphautorefname{paragraphe}%
  \def\subparagraphautorefname{sous-paragraphe}%
  \def\FancyVerbLineautorefname{ligne}%
  \def\theoremautorefname{Th\'eor\`eme}%
  \def\pageautorefname{page}%
}
\def\HyLang@german{%
  \def\equationautorefname{Gleichung}%
  \def\footnoteautorefname{Fu\ss note}%
  \def\itemautorefname{Punkt}%
  \def\figureautorefname{Abbildung}%
  \def\tableautorefname{Tabelle}%
  \def\partautorefname{Teil}%
  \def\appendixautorefname{Anhang}%
  \def\chapterautorefname{Kapitel}%
  \def\sectionautorefname{Abschnitt}%
  \def\subsectionautorefname{Unterabschnitt}%
  \def\subsubsectionautorefname{Unterunterabschnitt}%
  \def\paragraphautorefname{Absatz}%
  \def\subparagraphautorefname{Unterabsatz}%
  \def\FancyVerbLineautorefname{Zeile}%
  \def\theoremautorefname{Theorem}%
  \def\pageautorefname{Seite}%
}
\def\HyLang@italian{%
  \def\equationautorefname{Equazione}%
  \def\footnoteautorefname{nota}%
  \def\itemautorefname{punto}%
  \def\figureautorefname{Figura}%
  \def\tableautorefname{Tabella}%
  \def\partautorefname{Parte}%
  \def\appendixautorefname{Appendice}%
  \def\chapterautorefname{Capitolo}%
  \def\sectionautorefname{sezione}%
  \def\subsectionautorefname{sottosezione}%
  \def\subsubsectionautorefname{sottosottosezione}%
  \def\paragraphautorefname{paragrafo}%
  \def\subparagraphautorefname{sottoparagrafo}%
  \def\FancyVerbLineautorefname{linea}%
  \def\theoremautorefname{Teorema}%
  \def\pageautorefname{Pag.\@}%
}
\def\HyLang@magyar{%
  \def\equationautorefname{Egyenlet}%
  \def\footnoteautorefname{l\'abjegyzet}%
  \def\itemautorefname{Elem}%
  \def\figureautorefname{\'Abra}%
  \def\tableautorefname{T\'abl\'azat}%
  \def\partautorefname{R\'esz}%
  \def\appendixautorefname{F\"uggel\'ek}%
  \def\chapterautorefname{fejezet}%
  \def\sectionautorefname{szakasz}%
  \def\subsectionautorefname{alszakasz}%
  \def\subsubsectionautorefname{alalszakasz}%
  \def\paragraphautorefname{bekezd\'es}%
  \def\subparagraphautorefname{albekezd\'es}%
  \def\FancyVerbLineautorefname{sor}%
  \def\theoremautorefname{T\'etel}%
  \def\pageautorefname{oldal}%
}
\def\HyLang@portuges{%
  \def\equationautorefname{Equa\c c\~ao}%
  \def\footnoteautorefname{Nota de rodap\'e}%
  \def\itemautorefname{Item}%
  \def\figureautorefname{Figura}%
  \def\tableautorefname{Tabela}%
  \def\partautorefname{Parte}%
  \def\appendixautorefname{Ap\^endice}%
  \def\chapterautorefname{Cap\'itulo}%
  \def\sectionautorefname{Se\c c\~ao}%
  \def\subsectionautorefname{Subse\c c\~ao}%
  \def\subsubsectionautorefname{Subsubse\c c\~ao}%
  \def\paragraphautorefname{par\'agrafo}%
  \def\subparagraphautorefname{subpar\'agrafo}%
  \def\FancyVerbLineautorefname{linha}%
  \def\theoremautorefname{Teorema}%
  \def\pageautorefname{P\'agina}%
}
%    \end{macrocode}
%
%    Next commented section for Russian is provided by Olga Lapko.
%
%    Next follow the checked reference names with commented variants and
%    explanations. All they are abbreviated and they won't create a
%    grammatical problems in the \emph{middle} of sentences.
%
%    The most weak points in these abbreviations are the
%    |\equationautorefname|, |\theoremautorefname| and the
%    |\FancyVerbLineautorefname|. But those three, and also the
%    |\footnoteautorefname| are not \emph{too} often referenced.
%    Another rather weak point is the |\appendixautorefname|.
%    \begin{macrocode}
\def\HyLang@russian{%
%    \end{macrocode}
%    The abbreviated reference to the equation:
%    it is not for ``the good face of the book'', but maybe it will be
%    better to get the company for the |\theoremautorefname|?
%    \begin{macrocode}
  \def\equationautorefname{\cyr\cyrv\cyrery\cyrr.}%
%    \end{macrocode}
%    The name of the equation reference has common form for both
%    nominative and accusative but changes in other forms, like
%    ``of |\autoref{auto}|'' etc. The full name must follow full
%    name of the |\theoremautorefname|.
%    \begin{macrocode}
%  \def\equationautorefname{%
%    \cyr\cyrv\cyrery\cyrr\cyra\cyrzh\cyre\cyrn\cyri\cyre
%  }%
%    \end{macrocode}
%
%    The variant of footnote has abbreviation form of the synonym
%    of the word ``footnote''. This variant of abbreviated synonym
%    has alternative status (maybe obsolete?).
%    \begin{macrocode}
  \def\footnoteautorefname{%
    \cyr\cyrp\cyro\cyrd\cyrs\cyrt\cyrr.\ \cyrp\cyrr\cyri\cyrm.%
  }%
%    \end{macrocode}
%    Commented form of the full synonym for ``footnote''.
%    It has common form for both nominative and accusative but
%    changes in other forms, like ``of |\autoref{auto}|''
%    \begin{macrocode}
%  \def\footnoteautorefname{%
%    \cyr\cyrp\cyro\cyrd\cyrs\cyrt\cyrr\cyro\cyrch\cyrn\cyro\cyre\ %
%    \cyrp\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyre
%  }%
%    \end{macrocode}
%    Commented forms of the ``footnote'': have different forms, the
%    same is for the nominative and accusative. (The others needed?)
%    \begin{macrocode}
%  \def\Nomfootnoteautorefname{\cyr\cyrs\cyrn\cyro\cyrs\cyrk\cyra}%
%  \def\Accfootnoteautorefname{\cyr\cyrs\cyrn\cyro\cyrs\cyrk\cyru}%
%    \end{macrocode}
%
%    Name of the list item, can be confused with the paragraph
%    reference name, but reader could understand meaning from context(?).
%    Commented variant has common form for both nominative and accusative
%    but changes in other forms, like ``of |\autoref{auto}|'' etc.
%    \begin{macrocode}
  \def\itemautorefname{\cyr\cyrp.}%
%  \def\itemautorefname{\cyr\cyrp\cyru\cyrn\cyrk\cyrt}%
%    \end{macrocode}
%
%    Names of the figure and table have stable (standard) abbreviation
%    forms. No problem in the middle of sentence.
%    \begin{macrocode}
  \def\figureautorefname{\cyr\cyrr\cyri\cyrs.}%
  \def\tableautorefname{\cyr\cyrt\cyra\cyrb\cyrl.}%
%    \end{macrocode}
%
%    Names of the part, chapter, section(s) have stable (standard)
%    abbreviation forms. No problem in the middle of sentence.
%    \begin{macrocode}
  \def\partautorefname{\cyr\cyrch.}%
  \def\chapterautorefname{\cyr\cyrg\cyrl.}%
  \def\sectionautorefname{\cyr\cyrr\cyra\cyrz\cyrd.}%
%    \end{macrocode}
%
%    Name of the appendix can use this abbreviation, but it is not
%    standard for books, i.e, not for ``the good face of the book''.
%    Commented variant has common form for both nominative and
%    accusative but changes in other forms, like ``of
%    |\autoref{auto}|'' etc.
%    \begin{macrocode}
  \def\appendixautorefname{\cyr\cyrp\cyrr\cyri\cyrl.}%
%  \def\appendixautorefname{%
%    \cyr\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre
%  }%
%    \end{macrocode}
%
%    The sectioning command have stable (almost standard) and common
%    abbreviation form for all levels (the meaning of these references
%    visible from the section number). No problem.
%    \begin{macrocode}
  \def\subsectionautorefname{\cyr\cyrr\cyra\cyrz\cyrd.}%
  \def\subsubsectionautorefname{\cyr\cyrr\cyra\cyrz\cyrd.}%
%    \end{macrocode}
%
%    The names of references to paragraphs also have stable
%    (almost standard) and common abbreviation form for all
%    levels (the meaning of these references is visible from
%    the section number). No problem in the middle of sentence.
%    \begin{macrocode}
  \def\paragraphautorefname{\cyr\cyrp.}%
  \def\subparagraphautorefname{\cyr\cyrp.}%
%    \end{macrocode}
%    Commented variant can be used in books but since it
%    has common form for both nominative and accusative but it
%    changes in other forms, like ``of |\autoref{auto}|'' etc.
%    \begin{macrocode}
%  \def\paragraphautorefname{\cyr\cyrp\cyru\cyrn\cyrk\cyrt}%
%  \def\subparagraphautorefname{\cyr\cyrp\cyru\cyrn\cyrk\cyrt}%
%    \end{macrocode}
%
%    The name of verbatim line. Here could be a standard of the
%    abbreviation (used very rare). But the author preprint
%    publications (which have not any editor or corrector)
%    can use this abbreviation for the page reference. So the
%    meaning of the line reference can be read as reference to
%    the page.
%    \begin{macrocode}
  \def\FancyVerbLineautorefname{\cyr\cyrs\cyrt\cyrr.}%
%    \end{macrocode}
%    Commented names of the ``verbatim line'': have different forms,
%    also the nominative and accusative.
%    \begin{macrocode}
%  \def\NomFancyVerbLineautorefname{\cyr\cyrs\cyrt\cyrr\cyro\cyrk\cyra}%
%  \def\AccFancyVerbLineautorefname{\cyr\cyrs\cyrt\cyrr\cyro\cyrk\cyru}%
%    \end{macrocode}
%    The alternative, ve-e-e-ery professional abbreviation,
%    was used in typography markup for typesetters.
%    \begin{macrocode}
%  \def\FancyVerbLineautorefname{\cyr\cyrs\cyrt\cyrr\cyrk.}%
%    \end{macrocode}
%
%    The names of theorem: if we want have ``the good face of
%    the book'', so the theorem reference must have the full name
%    (like equation reference). But \ldots
%    \begin{macrocode}
  \def\theoremautorefname{\cyr\cyrt\cyre\cyro\cyrr.}%
%    \end{macrocode}
%    Commented forms of the ``theorem'': have different forms, also
%    the nominative and accusative.
%    \begin{macrocode}
% \def\Nomtheoremautorefname{\cyr\cyrt\cyre\cyro\cyrr\cyre\cyrm\cyra}%
% \def\Acctheoremautorefname{\cyr\cyrt\cyre\cyro\cyrr\cyre\cyrm\cyru}%
%    \end{macrocode}
%
%    Name of the page stable (standard) abbreviation form. No problem.
%    \begin{macrocode}
  \def\pageautorefname{\cyr\cyrs.}%
}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\HyLang@spanish{%
  \def\equationautorefname{Ecuaci\'on}%
  \def\footnoteautorefname{Nota a pie de p\'agina}%
  \def\itemautorefname{Elemento}%
  \def\figureautorefname{Figura}%
  \def\tableautorefname{Tabla}%
  \def\partautorefname{Parte}%
  \def\appendixautorefname{Ap\'endice}%
  \def\chapterautorefname{Cap\'itulo}%
  \def\sectionautorefname{Secci\'on}%
  \def\subsectionautorefname{Subsecci\'on}%
  \def\subsubsectionautorefname{Subsubsecci\'on}%
  \def\paragraphautorefname{P\'arrafo}%
  \def\subparagraphautorefname{Subp\'arrafo}%
  \def\FancyVerbLineautorefname{L\'inea}%
  \def\theoremautorefname{Teorema}%
  \def\pageautorefname{P\'agina}%
}
\def\HyLang@vietnamese{%
  \def\equationautorefname{Ph\uhorn{}\ohorn{}ng tr\`inh}%
  \def\footnoteautorefname{Ch\'u th\'ich}%
  \def\itemautorefname{m\d{u}c}%
  \def\figureautorefname{H\`inh}%
  \def\tableautorefname{B\h{a}ng}%
  \def\partautorefname{Ph\`\acircumflex{}n}%
  \def\appendixautorefname{Ph\d{u} l\d{u}c}%
  \def\chapterautorefname{ch\uhorn{}\ohorn{}ng}%
  \def\sectionautorefname{m\d{u}c}%
  \def\subsectionautorefname{m\d{u}c}%
  \def\subsubsectionautorefname{m\d{u}c}%
  \def\paragraphautorefname{\dj{}o\d{a}n}%
  \def\subparagraphautorefname{\dj{}o\d{a}n}%
  \def\FancyVerbLineautorefname{d\`ong}%
  \def\theoremautorefname{\DJ{}\d{i}nh l\'y}%
  \def\pageautorefname{Trang}%
}
%    \end{macrocode}
%
%    Instead of package babel's definition of \cmd{\addto} the
%    implementation of package varioref is used. Additionally
%    argument |#1| is checked for \cmd{\relax}.
%    \begin{macrocode}
\def\HyLang@addto#1#2{%
  #2%
  \@temptokena{#2}%
  \ifx#1\relax
    \let#1\@empty
  \fi
  \ifx#1\@undefined
    \edef#1{\the\@temptokena}%
  \else
    \toks@\expandafter{#1}%
    \edef#1{\the\toks@\the\@temptokena}%
  \fi
  \@temptokena{}\toks@\@temptokena
}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\HyLang@DeclareLang#1#2#3{%
  \@ifpackagewith{babel}{#1}{%
    \expandafter\HyLang@addto
        \csname extras#1\expandafter\endcsname
        \csname HyLang@#2\endcsname
    \begingroup
      \edef\x{\endgroup
        #3%
      }%
    \x
    \@namedef{HyLang@#1@done}{}%
  }{}%
  \begingroup
    \edef\x##1##2{%
      \noexpand\ifx##2\relax
        \errmessage{No definitions for language #2' found!}%
      \noexpand\fi
      \endgroup
      \noexpand\define@key{Hyp}{#1}[]{%
        \noexpand\@ifundefined{HyLang@#1@done}{%
          \noexpand\HyLang@addto{\noexpand##1}{\noexpand##2}%
          #3%
          \noexpand\@namedef{HyLang@#1@done}{}%
        }{}%
      }%
    }%
  \expandafter\x\csname extras#1\expandafter\endcsname
                \csname HyLang@#2\endcsname
}
\HyLang@DeclareLang{english}{english}{}
\HyLang@DeclareLang{UKenglish}{english}{}
\HyLang@DeclareLang{british}{english}{}
\HyLang@DeclareLang{USenglish}{english}{}
\HyLang@DeclareLang{american}{english}{}
\HyLang@DeclareLang{german}{german}{}
\HyLang@DeclareLang{austrian}{german}{}
\HyLang@DeclareLang{ngerman}{german}{}
\HyLang@DeclareLang{naustrian}{german}{}
\HyLang@DeclareLang{russian}{russian}{\noexpand\hypersetup{unicode}}
\HyLang@DeclareLang{brazil}{portuges}{}
\HyLang@DeclareLang{brazilian}{portuges}{}
\HyLang@DeclareLang{portuguese}{portuges}{}
\HyLang@DeclareLang{spanish}{spanish}{}
\HyLang@DeclareLang{afrikaans}{afrikaans}{}
\HyLang@DeclareLang{french}{french}{}
\HyLang@DeclareLang{frenchb}{french}{}
\HyLang@DeclareLang{francais}{french}{}
\HyLang@DeclareLang{acadian}{french}{}
\HyLang@DeclareLang{canadien}{french}{}
\HyLang@DeclareLang{italian}{italian}{}
\HyLang@DeclareLang{magyar}{magyar}{}
\HyLang@DeclareLang{hungarian}{magyar}{}
%    \end{macrocode}
%    More work is needed in case of options |vietnamese| and |vietnam|.
%    \begin{macrocode}
\DeclareVoidOption{vietnamese}{%
  \HyLang@addto\extrasvietnamese\HyLang@vietnamese
  \Hy@AtEndOfPackage{%
    \@ifundefined{T@PU}{}{%
      \input{puvnenc.def}%
    }%
  }%
}
\DeclareVoidOption{vietnam}{%
  \HyLang@addto\extrasvietnam\HyLang@vietnamese
  \Hy@AtEndOfPackage{%
    \@ifundefined{T@PU}{}{%
      \input{puvnenc.def}%
    }%
  }%
}
%    \end{macrocode}
%    Similar for option |arabic| that just loads the additions
%    to PU encoding for Arabi.
%    \begin{macrocode}
\DeclareVoidOption{arabic}{%
  \Hy@AtEndOfPackage{%
    \@ifundefined{T@PU}{}{%
      \input{puarenc.def}%
    }%
  }%
}
%    \end{macrocode}
%
% \section{Options to change appearance of links}\label{appearance}
% Colouring links at the \LaTeX\ level is useful for debugging, perhaps.
%    \begin{macrocode}
\define@key{Hyp}{colorlinks}[true]{%
  \Hy@boolkey{colorlinks}{#1}%
}
\DeclareVoidOption{hidelinks}{%
  \Hy@colorlinksfalse
  \Hy@ocgcolorlinksfalse
  \Hy@frenchlinksfalse
  \def\Hy@colorlink##1{\begingroup}%
  \def\Hy@endcolorlink{\endgroup}%
  \def\@pdfborder{0 0 0}%
  \let\@pdfborderstyle\ltx@empty
}
\define@key{Hyp}{ocgcolorlinks}[true]{%
  \Hy@boolkey{ocgcolorlinks}{#1}%
}
\Hy@AtBeginDocument{%
  \begingroup
    \@ifundefined{OBJ@OCG@view}{%
      \ifHy@ocgcolorlinks
        \Hy@Warning{%
          Driver does not support `ocgcolorlinks',\MessageBreak
          using `colorlinks' instead%
        }%
      \fi
    }{}%
  \endgroup
}
\define@key{Hyp}{frenchlinks}[true]{%
  \Hy@boolkey{frenchlinks}{#1}%
}
%    \end{macrocode}
%
% \section{Bookmarking}
%
%    \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname chapter\endcsname\relax
  \def\toclevel@part{0}%
\else
  \def\toclevel@part{-1}%
\fi
\def\toclevel@chapter{0}
\def\toclevel@section{1}
\def\toclevel@subsection{2}
\def\toclevel@subsubsection{3}
\def\toclevel@paragraph{4}
\def\toclevel@subparagraph{5}
\def\toclevel@figure{0}
\def\toclevel@table{0}
\@ifpackageloaded{listings}{%
  \providecommand*\theHlstlisting{\thelstlisting}%
  \providecommand*\toclevel@lstlisting{0}%
}{}
\@ifpackageloaded{listing}{%
  \providecommand*\theHlisting{\thelisting}%
  \providecommand*\toclevel@listing{0}%
}{}
%    \end{macrocode}
%
%    \begin{macrocode}
\define@key{Hyp}{bookmarks}[true]{%
  \Hy@boolkey{bookmarks}{#1}%
}
%    \end{macrocode}
%    \begin{macrocode}
\define@key{Hyp}{bookmarksopen}[true]{%
  \Hy@boolkey{bookmarksopen}{#1}%
}
%    \end{macrocode}
%
%    The depth of the outlines is controlled by option
%    \verb|bookmarksdepth|.
%    The option acts globally and distinguishes three cases:
%    \begin{itemize}
%    \item \verb|bookmarksdepth|: Without value hyperref uses
%      counter \texttt{tocdepth} (compatible behaviour and default).
%    \item \verb|bookmarksdepth=<number>|: the depth is set to
%      \verb|<number>|.
%    \item \verb|bookmarksdepth=<name>|: The \verb|<name>| must
%      not start with a number or minus sign. It is a document
%      division name (part, chapter, section, \dots). Internally
%      the value of macro \verb|\toclevel@<name>| is used.
%    \end{itemize}
%    \begin{macrocode}
\let\Hy@bookmarksdepth\c@tocdepth
\define@key{Hyp}{bookmarksdepth}[]{%
  \begingroup
    \edef\x{#1}%
    \ifx\x\empty
      \global\let\Hy@bookmarksdepth\c@tocdepth
    \else
      \@ifundefined{toclevel@\x}{%
        \@onelevel@sanitize\x
        \edef\y{\expandafter\@car\x\@nil}%
        \ifcase 0\expandafter\ifx\y-1\fi
                 \expandafter\ifnum\expandafter`\y>47 %
                   \expandafter\ifnum\expandafter`\y<58 1\fi\fi\relax
          \Hy@Warning{Unknown document division name (\x)}%
        \else
          \setbox\z@=\hbox{%
            \count@=\x
            \xdef\Hy@bookmarksdepth{\the\count@}%
          }%
        \fi
      }{%
        \setbox\z@=\hbox{%
          \count@=\csname toclevel@\x\endcsname
          \xdef\Hy@bookmarksdepth{\the\count@}%
        }%
      }%
    \fi
  \endgroup
}
%    \end{macrocode}
%
% `bookmarksopenlevel' to specify the open level. From Heiko Oberdiek.
%    \begin{macrocode}
\define@key{Hyp}{bookmarksopenlevel}{%
  \def\@bookmarksopenlevel{#1}%
}
\def\@bookmarksopenlevel{\maxdimen}
% `bookmarkstype' to specify which `toc' file to mimic
\define@key{Hyp}{bookmarkstype}{%
  \def\Hy@bookmarkstype{#1}%
}
\def\Hy@bookmarkstype{toc}
%    \end{macrocode}
% Richard Curnow <richard@curnow.demon.co.uk> suggested this
% functionality. It adds section numbers etc to bookmarks.
%    \begin{macrocode}
\define@key{Hyp}{bookmarksnumbered}[true]{%
  \Hy@boolkey{bookmarksnumbered}{#1}%
}
%    \end{macrocode}
%
%    Option CJKbookmarks enables the patch for
%    CJK bookmarks.
%    \begin{macrocode}
\define@key{Hyp}{CJKbookmarks}[true]{%
  \Hy@boolkey{CJKbookmarks}{#1}%
}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\Hy@temp#1{%
  \expandafter\Hy@@temp\csname @#1color\endcsname{#1}%
}
\def\Hy@@temp#1#2#3{%
  \define@key{Hyp}{#2color}{%
    \HyColor@HyperrefColor{##1}#1%
  }%
  \def#1{#3}%
}
\Hy@temp{link}{red}
\Hy@temp{anchor}{black}
\Hy@temp{cite}{green}
\Hy@temp{file}{cyan}
\Hy@temp{url}{magenta}
\Hy@temp{menu}{red}
\Hy@temp{run}{\@filecolor}
\define@key{Hyp}{pagecolor}{%
  \Hy@WarningPageColor
}
\def\Hy@WarningPageColor{%
  \Hy@WarningNoLine{Option `pagecolor' is not available anymore}%
  \global\let\Hy@WarningPageColor\relax
}
\define@key{Hyp}{allcolors}{%
  \HyColor@HyperrefColor{#1}\@linkcolor
  \HyColor@HyperrefColor{#1}\@anchorcolor
  \HyColor@HyperrefColor{#1}\@citecolor
  \HyColor@HyperrefColor{#1}\@filecolor
  \HyColor@HyperrefColor{#1}\@urlcolor
  \HyColor@HyperrefColor{#1}\@menucolor
  \HyColor@HyperrefColor{#1}\@runcolor
}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\hyperbaseurl#1{\def\@baseurl{#1}}
\define@key{Hyp}{baseurl}{\hyperbaseurl{#1}}
\let\@baseurl\@empty
\def\hyperlinkfileprefix#1{\def\Hy@linkfileprefix{#1}}
\define@key{Hyp}{linkfileprefix}{\hyperlinkfileprefix{#1}}
\hyperlinkfileprefix{file:}
%    \end{macrocode}
%
% \section{PDF-specific options}\label{pdfopt}
%
%    \begin{macro}{\@pdfpagetransition}
%    The value of option |pdfpagetransition| is stored in
%    \cmd{\@pdfpagetransition}. Its initial value is set
%    to \cmd{\relax} in order to be able to differentiate
%    between a not used option and an option with an empty
%    value.
%    \begin{macrocode}
\let\@pdfpagetransition\relax
\define@key{Hyp}{pdfpagetransition}{%
  \def\@pdfpagetransition{#1}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\@pdfpageduration}
%    The value of option |pdfpageduration| is stored in
%    \cmd{\@pdfpageduration}. Its initial value is set
%    to \cmd{\relax} in order to be able to differentiate
%    between a not used option and an option with an empty
%    value.
%    \begin{macrocode}
\let\@pdfpageduration\relax
\define@key{Hyp}{pdfpageduration}{%
  \def\@pdfpageduration{#1}%
  \Hy@Match\@pdfpageduration{%
    ^(|[0-9]+\.?[0-9]*|[0-9]*\.?[0-9]+)$%
  }{}{%
    \Hy@Warning{%
      Invalid value `\@pdfpageduration'\MessageBreak
      of option `pdfpageduration'\MessageBreak
      is replaced by an empty value%
    }%
    \let\@pdfpageduration\ltx@empty
  }%
}
%    \end{macrocode}
%    \end{macro}
%
%    The entry for the |/Hid| key in the page object is
%    only necessary, if it is used and set to true for
%    at least one time. If it is always false, then
%    the |/Hid| key is not written to the pdf page
%    object in order not to enlarge the pdf file.
%    \begin{macrocode}
\newif\ifHy@useHidKey
\Hy@useHidKeyfalse
\define@key{Hyp}{pdfpagehidden}[true]{%
  \Hy@boolkey{pdfpagehidden}{#1}%
  \ifHy@pdfpagehidden
    \global\Hy@useHidKeytrue
  \fi
}
%    \end{macrocode}
%
%    The value of the |bordercolor| options are not processed
%    by the color package. Therefore the value consists of
%    space separated rgb numbers in the range 0 until 1.
%
%    Package |xcolor| provides |\XC@bordercolor| since version 1.1.
%    If the two spaces in the color specification are missing,
%    then the value is processed as color specification from
%    package |xcolor| by using |\XC@bordercolor| (since
%    xcolor 2004/05/09 v1.11, versions 2005/03/24 v2.02 until
%    2006/11/28 v2.10 do not work because of a bug that is
%    fixed in 2007/01/21 v2.11).
%    \begin{macrocode}
\def\Hy@ColorList{cite,file,link,menu,run,url}
\@for\Hy@temp:=\Hy@ColorList\do{%
  \edef\Hy@temp{%
    \noexpand\define@key{Hyp}{\Hy@temp bordercolor}{%
      \noexpand\HyColor@HyperrefBorderColor
          {##1}%
          \expandafter\noexpand\csname @\Hy@temp bordercolor\endcsname
          {hyperref}%
          {\Hy@temp bordercolor}%
    }%
  }%
  \Hy@temp
}
\define@key{Hyp}{pagebordercolor}{%
  \Hy@WarningPageBorderColor
}
\def\Hy@WarningPageBorderColor{%
  \Hy@WarningNoLine{Option `pagebordercolor' is not available anymore}%
  \global\let\Hy@WarningPageBorderColor\relax
}
\define@key{Hyp}{allbordercolors}{%
  \def\Hy@temp##1##2{%
    \HyColor@HyperrefBorderColor{#1}##1{hyperref}{##2bordercolor}%
  }%
  \Hy@temp\@citebordercolor{cite}%
  \Hy@temp\@filebordercolor{file}%
  \Hy@temp\@linkbordercolor{link}%
  \Hy@temp\@menubordercolor{menu}%
  \Hy@temp\@runbordercolor{run}%
  \Hy@temp\@urlbordercolor{url}%
}
%    \end{macrocode}
%
%    \begin{macrocode}
\define@key{Hyp}{pdfhighlight}{\def\@pdfhighlight{#1}}
\Hy@DefNameKey{pdfhighlight}{%
  \do{/I}{Invert}%
  \do{/N}{None}%
  \do{/O}{Outline}%
  \do{/P}{Push}%
}
\define@key{Hyp}{pdfborder}{%
  \let\Hy@temp\@pdfborder
  \def\@pdfborder{#1}%
  \Hy@Match\@pdfborder{%
    ^\HyPat@NonNegativeReal/ %
     \HyPat@NonNegativeReal/ %
     \HyPat@NonNegativeReal/%
     ( ?\[\HyPat@NonNegativeReal/( \HyPat@NonNegativeReal/)*])?$%
  }{}{%
    \Hy@Warning{%
      Invalid value `\@pdfborder'\MessageBreak
      for option `pdfborder'.\MessageBreak
      Option setting is ignored%
    }%
    \let\@pdfborder\Hy@temp
  }%
}
\define@key{Hyp}{pdfborderstyle}{%
  \let\Hy@temp\@pdfborderstyle
  \def\@pdfborderstyle{#1}%
  \Hy@Match\@pdfborderstyle{%
    ^%
    ( */Type */Border%
    | */W +\HyPat@NonNegativeReal/%
    | */S */[SDBIU]%
    | */D *\[ *(\HyPat@NonNegativeReal/( \HyPat@NonNegativeReal/)?)?]%
    )* *$%
  }{}{%
    \Hy@Warning{%
      Invalid value `\@pdfborderstyle'\MessageBreak
      for option `pdfborderstyle'.\MessageBreak
      Option setting is ignored%
    }%
    \let\@pdfborderstyle\Hy@temp
  }%
}
\def\Hy@setpdfborder{%
  \ifx\@pdfborder\@empty
  \else
    /Border[\@pdfborder]%
  \fi
  \ifx\@pdfborderstyle\@empty
  \else
    /BS<<\@pdfborderstyle>>%
  \fi
}
\Hy@DefNameKey{pdfpagemode}{%
  \do{UseNone}{}%
  \do{UseOutlines}{}%
  \do{UseThumbs}{}%
  \do{FullScreen}{}%
  \do{UseOC}{PDF 1.5}%
  \do{UseAttachments}{PDF 1.6}%
}
\Hy@DefNameKey{pdfnonfullscreenpagemode}{%
  \do{UseNone}{}%
  \do{UseOutlines}{}%
  \do{UseThumbs}{}%
  \do{FullScreen}{}%
  \do{UseOC}{PDF 1.5}%
  \do{UseAttachments}{PDF 1.6}%
}
\Hy@DefNameKey{pdfdirection}{%
  \do{L2R}{Left to right}%
  \do{R2L}{Right to left}%
}
\Hy@DefNameKey{pdfviewarea}{%
  \do{MediaBox}{}%
  \do{CropBox}{}%
  \do{BleedBox}{}%
  \do{TrimBox}{}%
  \do{ArtBox}{}%
}
\Hy@DefNameKey{pdfviewclip}{%
  \do{MediaBox}{}%
  \do{CropBox}{}%
  \do{BleedBox}{}%
  \do{TrimBox}{}%
  \do{ArtBox}{}%
}
\Hy@DefNameKey{pdfprintarea}{%
  \do{MediaBox}{}%
  \do{CropBox}{}%
  \do{BleedBox}{}%
  \do{TrimBox}{}%
  \do{ArtBox}{}%
}
\Hy@DefNameKey{pdfprintclip}{%
  \do{MediaBox}{}%
  \do{CropBox}{}%
  \do{BleedBox}{}%
  \do{TrimBox}{}%
  \do{ArtBox}{}%
}
\Hy@DefNameKey{pdfprintscaling}{%
  \do{AppDefault}{}%
  \do{None}{}%
}
\Hy@DefNameKey{pdfduplex}{%
  \do{Simplex}{}%
  \do{DuplexFlipShortEdge}{}%
  \do{DuplexFlipLongEdge}{}%
}
\Hy@DefNameKey{pdfpicktraybypdfsize}{%
  \do{true}{}%
  \do{false}{}%
}
\define@key{Hyp}{pdfprintpagerange}{%
  \def\@pdfprintpagerange{#1}%
}
\Hy@DefNameKey{pdfnumcopies}{%
  \do{2}{two copies}%
  \do{3}{three copies}%
  \do{4}{four copies}%
  \do{5}{five copies}%
}
%    \end{macrocode}
%    \begin{macrocode}
\define@key{Hyp}{pdfusetitle}[true]{%
  \Hy@boolkey{pdfusetitle}{#1}%
}
\def\HyXeTeX@CheckUnicode{%
  \ifxetex
    \ifHy@unicode
    \else
      \Hy@WarningNoLine{%
        XeTeX driver only supports unicode.\MessageBreak
        Enabling option `unicode'%
      }%
      \kvsetkeys{Hyp}{unicode}%
    \fi
  \else
    \let\HyXeTeX@CheckUnicode\relax
  \fi
}
\def\HyPsd@PrerenderUnicode#1{%
  \begingroup
    \expandafter\ifx\csname PrerenderUnicode\endcsname\relax
    \else
      \sbox0{%
        \let\GenericInfo\@gobbletwo
        \let\GenericWarning\@gobbletwo
        \let\GenericError\@gobblefour
        \PrerenderUnicode{#1}%
       }%
    \fi
  \endgroup
}
\define@key{Hyp}{pdftitle}{%
  \HyXeTeX@CheckUnicode
  \HyPsd@XeTeXBigCharstrue
  \HyPsd@PrerenderUnicode{#1}%
  \pdfstringdef\@pdftitle{#1}%
}
\define@key{Hyp}{pdfauthor}{%
  \HyXeTeX@CheckUnicode
  \HyPsd@XeTeXBigCharstrue
  \HyPsd@PrerenderUnicode{#1}%
  \pdfstringdef\@pdfauthor{#1}%
}
\define@key{Hyp}{pdfproducer}{%
  \HyXeTeX@CheckUnicode
  \HyPsd@XeTeXBigCharstrue
  \HyPsd@PrerenderUnicode{#1}%
  \pdfstringdef\@pdfproducer{#1}%
}
\define@key{Hyp}{pdfcreator}{%
  \HyXeTeX@CheckUnicode
  \HyPsd@XeTeXBigCharstrue
  \HyPsd@PrerenderUnicode{#1}%
  \pdfstringdef\@pdfcreator{#1}%
}
\define@key{Hyp}{pdfcreationdate}{%
  \begingroup
    \Hy@unicodefalse
    \pdfstringdef\@pdfcreationdate{#1}%
  \endgroup
}
\define@key{Hyp}{pdfmoddate}{%
  \begingroup
    \Hy@unicodefalse
    \pdfstringdef\@pdfmoddate{#1}%
  \endgroup
}
\define@key{Hyp}{pdfsubject}{%
  \HyXeTeX@CheckUnicode
  \HyPsd@XeTeXBigCharstrue
  \HyPsd@PrerenderUnicode{#1}%
  \pdfstringdef\@pdfsubject{#1}%
}
\define@key{Hyp}{pdfkeywords}{%
  \HyXeTeX@CheckUnicode
  \HyPsd@XeTeXBigCharstrue
  \HyPsd@PrerenderUnicode{#1}%
  \pdfstringdef\@pdfkeywords{#1}%
}
\define@key{Hyp}{pdftrapped}{%
  \lowercase{\edef\Hy@temp{#1}}%
  \ifx\Hy@temp\HyInfo@trapped@true
    \def\@pdftrapped{True}%
  \else
    \ifx\Hy@temp\HyInfo@trapped@false
      \def\@pdftrapped{False}%
    \else
      \ifx\Hy@temp\HyInfo@trapped@unknown
        \def\@pdftrapped{Unknown}%
      \else
        \ifx\Hy@temp\@empty
        \else
          \Hy@Warning{%
            Unsupported value `#1'\MessageBreak
            for option `pdftrapped'%
          }%
        \fi
        \def\@pdftrapped{}%
      \fi
    \fi
  \fi
}
\def\HyInfo@trapped@true{true}
\def\HyInfo@trapped@false{false}
\def\HyInfo@trapped@unknown{unknown}
\def\HyInfo@TrappedUnsupported{%
  \ifx\@pdftrapped\@empty
  \else
    \Hy@WarningNoLine{`pdftrapped' is not supported by this driver}%
    \gdef\HyInfo@TrappedUnsupported{}%
  \fi
}
\define@key{Hyp}{pdfinfo}{%
  \kvsetkeys{pdfinfo}{#1}%
}
\def\Hy@temp#1{%
  \lowercase{\Hy@temp@A{#1}}{#1}%
}
\def\Hy@temp@A#1#2{%
  \define@key{pdfinfo}{#2}{%
    \hypersetup{pdf#1={##1}}%
  }%
}
\Hy@temp{Title}
\Hy@temp{Author}
\Hy@temp{Keywords}
\Hy@temp{Subject}
\Hy@temp{Creator}
\Hy@temp{Producer}
\Hy@temp{CreationDate}
\Hy@temp{ModDate}
\Hy@temp{Trapped}
\newif\ifHyInfo@AddonUnsupported
\kv@set@family@handler{pdfinfo}{%
  \HyInfo@AddonHandler{#1}{#2}%
}
\let\HyInfo@do\relax
\def\HyInfo@AddonHandler#1#2{%
  \ifx\kv@value\relax
    \Hy@Warning{%
      Option `pdfinfo': ignoring key `\kv@key' without value%
    }%
  \else
    \EdefEscapeName\HyInfo@KeyEscaped{\kv@key}%
    \EdefUnescapeName\HyInfo@Key{\HyInfo@KeyEscaped}%
    \expandafter\ifx\csname KV@pdfinfo@\HyInfo@Key\endcsname\relax
      \ifHyInfo@AddonUnsupported
        \Hy@Warning{%
          This driver does not support additional\MessageBreak
          information entries, therefore\MessageBreak
          `\kv@key' is ignored%
        }%
      \else
        \define@key{pdfinfo}{\HyInfo@Key}{%
          \HyXeTeX@CheckUnicode
          \HyPsd@XeTeXBigCharstrue
          \HyPsd@PrerenderUnicode{##1}%
          \pdfstringdef\HyInfo@Value{##1}%
          \expandafter\let\csname HyInfo@Value@\HyInfo@Key\endcsname
              \HyInfo@Value
        }%
        \edef\HyInfo@AddonList{%
          \HyInfo@AddonList
          \HyInfo@do{\HyInfo@Key}%
        }%
        \kv@parse@normalized{%
          \HyInfo@Key={#2}%
        }{%
          \kv@processor@default{pdfinfo}%
        }%
      \fi
    \else
      \kv@parse@normalized{%
        \HyInfo@Key={#2}%
      }{%
        \kv@processor@default{pdfinfo}%
      }%
    \fi
  \fi
}
\def\HyInfo@GenerateAddons{%
  \ifHyInfo@AddonUnsupported
    \def\HyInfo@Addons{}%
  \else
    \begingroup
      \toks@{}%
      \def\HyInfo@do##1{%
        \EdefEscapeName\HyInfo@Key{##1}%
        \edef\x{%
          \toks@{%
            \the\toks@
            /\HyInfo@Key(\csname HyInfo@Value@##1\endcsname)%
          }%
        }%
        \x
      }%
      \HyInfo@AddonList
      \edef\x{\endgroup
        \def\noexpand\HyInfo@Addons{\the\toks@}%
      }%
    \x
  \fi
}
\let\HyInfo@AddonList\ltx@empty
%    \end{macrocode}
%    \begin{macrocode}
\define@key{Hyp}{pdfview}{\calculate@pdfview#1 \\}
\define@key{Hyp}{pdflinkmargin}{\setpdflinkmargin{#1}}
\let\setpdflinkmargin\@gobble
\def\calculate@pdfview#1 #2\\{%
  \def\@pdfview{#1}%
  \ifx\\#2\\%
    \def\@pdfviewparams{ -32768}%
  \else
    \def\@pdfviewparams{ #2}%
  \fi
}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname numexpr\endcsname\relax
  \def\Hy@number#1{%
    \expandafter\@firstofone\expandafter{\number#1}%
  }%
\else
  \def\Hy@number#1{%
    \the\numexpr#1\relax
  }%
\fi
\define@key{Hyp}{pdfstartpage}{%
  \ifx\\#1\\%
    \let\@pdfstartpage\ltx@empty
  \else
    \edef\@pdfstartpage{\Hy@number{#1}}%
  \fi
}%
\define@key{Hyp}{pdfstartview}{%
  \ifx\\#1\\%
    \let\@pdfstartview\ltx@empty
  \else
    \hypercalcbpdef\@pdfstartview{/#1}%
  \fi
}
\def\HyPat@NonNegativeReal/{%
  \ *([0-9]+\.?[0-9]*|[0-9]*\.?[0-9]+) *%
}
\define@key{Hyp}{pdfremotestartview}{%
  \ifx\\#1\\%
    \def\@pdfremotestartview{/Fit}%
  \else
    \hypercalcbpdef\@pdfremotestartview{#1}%
    \edef\@pdfremotestartview{\@pdfremotestartview}%
    \Hy@Match\@pdfremotestartview{%
      ^(XYZ -?(null|\HyPat@NonNegativeReal/) %
            -?(null|\HyPat@NonNegativeReal/) %
            (null|\HyPat@NonNegativeReal/)|%
        Fit(|B|%
         (H|V|BH|BV) (null|\HyPat@NonNegativeReal/)|%
         R \HyPat@NonNegativeReal/ \HyPat@NonNegativeReal/ %
           \HyPat@NonNegativeReal/ \HyPat@NonNegativeReal/%
      ))$%
    }{}{%
      \Hy@Warning{%
         Invalid value `\@pdfremotestartview'\MessageBreak
         of `pdfremotestartview'\MessageBreak
         is replaced by `Fit'%
      }%
      \let\@pdfremotestartview\@empty
    }%
    \ifx\@pdfremotestartview\@empty
      \def\@pdfremotestartview{/Fit}%
    \else
      \edef\@pdfremotestartview{/\@pdfremotestartview}%
    \fi
  \fi
}
\define@key{Hyp}{pdfpagescrop}{\edef\@pdfpagescrop{#1}}
\define@key{Hyp}{pdftoolbar}[true]{%
  \Hy@boolkey{pdftoolbar}{#1}%
}
\define@key{Hyp}{pdfmenubar}[true]{%
  \Hy@boolkey{pdfmenubar}{#1}%
}
\define@key{Hyp}{pdfwindowui}[true]{%
  \Hy@boolkey{pdfwindowui}{#1}%
}
\define@key{Hyp}{pdffitwindow}[true]{%
  \Hy@boolkey{pdffitwindow}{#1}%
}
\define@key{Hyp}{pdfcenterwindow}[true]{%
  \Hy@boolkey{pdfcenterwindow}{#1}%
}
\define@key{Hyp}{pdfdisplaydoctitle}[true]{%
  \Hy@boolkey{pdfdisplaydoctitle}{#1}%
}
\define@key{Hyp}{pdfa}[true]{%
  \Hy@boolkey{pdfa}{#1}%
}
\define@key{Hyp}{pdfnewwindow}[true]{%
  \def\Hy@temp{#1}%
  \ifx\Hy@temp\@empty
    \Hy@pdfnewwindowsetfalse
  \else
    \Hy@pdfnewwindowsettrue
    \Hy@boolkey{pdfnewwindow}{#1}%
  \fi
}
\def\Hy@SetNewWindow{%
  \ifHy@pdfnewwindowset
    /NewWindow %
    \ifHy@pdfnewwindow true\else false\fi
  \fi
}
\Hy@DefNameKey{pdfpagelayout}{%
  \do{SinglePage}{}%
  \do{OneColumn}{}%
  \do{TwoColumnLeft}{}%
  \do{TwoColumnRight}{}%
  \do{TwoPageLeft}{PDF 1.5}%
  \do{TwoPageRight}{PDF 1.5}%
}
\define@key{Hyp}{pdflang}{%
  \def\@pdflang{#1}%
}
\define@key{Hyp}{pdfpagelabels}[true]{%
  \Hy@boolkey{pdfpagelabels}{#1}%
}
\define@key{Hyp}{pdfescapeform}[true]{%
  \Hy@boolkey{pdfescapeform}{#1}%
}
%    \end{macrocode}
% Default values:
%    \begin{macrocode}
\def\@linkbordercolor{1 0 0}
\def\@urlbordercolor{0 1 1}
\def\@menubordercolor{1 0 0}
\def\@filebordercolor{0 .5 .5}
\def\@runbordercolor{0 .7 .7}
\def\@citebordercolor{0 1 0}
\def\@pdfhighlight{/I}
\let\@pdftitle\ltx@empty
\let\@pdfauthor\ltx@empty
\let\@pdfproducer\relax
\def\@pdfcreator{LaTeX with hyperref package}
\let\@pdfcreationdate\ltx@empty
\let\@pdfmoddate\ltx@empty
\let\@pdfsubject\ltx@empty
\let\@pdfkeywords\ltx@empty
\let\@pdftrapped\ltx@empty
\let\@pdfpagescrop\ltx@empty
\def\@pdfstartview{/Fit}
\def\@pdfremotestartview{/Fit}
\def\@pdfstartpage{1}
\let\@pdfprintpagerange\ltx@empty
\let\@pdflang\ltx@empty
\let\PDF@SetupDoc\@empty
\let\PDF@FinishDoc\@empty
\let\phantomsection\@empty
\let\special@paper\@empty
\def\HyperDestNameFilter#1{#1}
\Hy@AtBeginDocument{%
  \begingroup
    \edef\x{\@ifundefined{stockheight}\paperheight\stockheight}%
    \dimen@=\x\relax
    \ifdim\dimen@>\z@
    \else
      \dimen@=11in\relax
      \Hy@WarningNoLine{%
        Height of page (\expandafter\string\x) %
        is invalid (\the\x),\MessageBreak
        using 11in%
      }%
    \fi
    \dimen@=0.99626401\dimen@
    \xdef\Hy@pageheight{\strip@pt\dimen@}%
  \endgroup
}
\def\HyInd@EncapChar{\|}
%    \end{macrocode}
%
% Allow the user to use |\ExecuteOptions| in the cfg file even though
% this package does not use the normal option mechanism.
% Use |\hyper@normalise| as a scratch macro, since it is going to
% be defined in a couple of lines anyway.
%    \begin{macrocode}
\let\hyper@normalise\ExecuteOptions
\let\ExecuteOptions\hypersetup
\Hy@RestoreCatcodes
\InputIfFileExists{hyperref.cfg}{}{}
\Hy@SetCatcodes
\let\ExecuteOptions\hyper@normalise
\ifx\Hy@MaybeStopNow\relax
\else
  \Hy@stoppedearlytrue
  \expandafter\Hy@MaybeStopNow
\fi
\Hy@stoppedearlyfalse
%    \end{macrocode}
% To add flexibility, we will not use the ordinary processing of
% package options, but put them through the \emph{keyval} package.
% This section was written by David Carlisle.
%
%    \begin{macrocode}
\SetupKeyvalOptions{family=Hyp}
\DeclareLocalOptions{%
  a4paper,a5paper,b5paper,letterpaper,legalpaper,executivepaper%
}
%    \end{macrocode}
%
%    Add option |tex4ht| if package |tex4ht| is loaded.
%    \begin{macrocode}
\@ifpackageloaded{tex4ht}{%
  \@ifpackagewith{hyperref}{tex4ht}{}{%
    \PassOptionsToPackage{tex4ht}{hyperref}%
  }%
}{}
%    \end{macrocode}
%
%    \begin{macrocode}
\let\ReadBookmarks\relax
\ProcessKeyvalOptions{Hyp}
%    \end{macrocode}
%
%    After processing options.
%
% \subsection{Package xspace support}
%
%    \begin{macrocode}
\def\Hy@xspace@end{}
\ltx@IfUndefined{xspaceaddexceptions}{%
  \Hy@AtBeginDocument{%
    \ltx@IfUndefined{xspaceaddexceptions}{%
    }{%
      \def\Hy@xspace@end{%
        \ltx@gobble{end for xspace}%
      }%
      \xspaceaddexceptions{\Hy@xspace@end,\hyper@linkend,\hyper@anchorend}%
    }%
  }%
}{%
  \def\Hy@xspace@end{%
    \ltx@gobble{end for xspace}%
  }%
  \xspaceaddexceptions{\Hy@xspace@end,\hyper@linkend,\hyper@anchorend}%
}
%    \end{macrocode}
%
% \subsection{Option draft}
%
%    \begin{macrocode}
\Hy@AtBeginDocument{%
  \ifHy@draft
    \let\hyper@@anchor\@gobble
    \gdef\hyper@link#1#2#3{#3\Hy@xspace@end}%
    \def\hyper@anchorstart#1#2{#2\Hy@xspace@end}%
    \def\hyper@anchorend{\Hy@xspace@end}%
    \let\hyper@linkstart\@gobbletwo
    \def\hyper@linkend{\Hy@xspace@end}%
    \def\hyper@linkurl#1#2{#1\Hy@xspace@end}%
    \def\hyper@linkfile#1#2#3{#1\Hy@xspace@end}%
    \def\hyper@link@[#1]#2#3#4{#4\Hy@xspace@end}%
    \def\Acrobatmenu#1#2{\leavevmode#2\Hy@xspace@end}%
    \let\PDF@SetupDoc\@empty
    \let\PDF@FinishDoc\@empty
    \let\@fifthoffive\@secondoftwo
    \let\@secondoffive\@secondoftwo
    \let\ReadBookmarks\relax
    \let\WriteBookmarks\relax
    \Hy@WarningNoLine{Draft mode on}%
  \fi
  \Hy@DisableOption{draft}%
  \Hy@DisableOption{nolinks}%
  \Hy@DisableOption{final}%
}
%    \end{macrocode}
%
% \subsection{PDF/A}
%
%    \begin{macrocode}
\Hy@DisableOption{pdfa}
%    \end{macrocode}
%
%    \begin{macrocode}
\ifHy@pdfa
  \kvsetkeys{Hyp}{pdfversion=1.4}%
  \def\Hy@Acrobatmenu#1#2{%
    \leavevmode
    \begingroup
      \edef\x{#1}%
      \@onelevel@sanitize\x
      \ifx\x\Hy@NextPage
        \let\y=Y%
      \else
        \ifx\x\Hy@PrevPage
          \let\y=Y%
        \else
          \ifx\x\Hy@FirstPage
            \let\y=Y%
          \else
            \ifx\x\Hy@LastPage
              \let\y=Y%
            \else
              \let\y=N%
            \fi
          \fi
        \fi
      \fi
    \expandafter\endgroup
    \ifx\y Y%
    \else
      \Hy@Error{%
        PDF/A: Named action `#1' is not permitted%
      }\@ehc
      {#2}%
      \expandafter\@gobble
    \fi
  }%
  \def\Hy@temp#1{%
    \expandafter\def\csname Hy@#1\endcsname{#1}%
    \expandafter\@onelevel@sanitize\csname Hy@#1\endcsname
  }%
  \Hy@temp{NextPage}%
  \Hy@temp{PrevPage}%
  \Hy@temp{FirstPage}%
  \Hy@temp{LastPage}%
\else
  \def\Hy@Acrobatmenu#1#2{\leavevmode}%
\fi
%    \end{macrocode}
%
% \subsection{Patch for babel's
%    \texorpdfstring{\cs{texttilde}}{\\texttilde}}
%    Babel does not define \cmd{\texttilde} in NFSS2 manner,
%    so the NFSS2 definitions of PD1 or PU encoding is not
%    compatible. To fix this, \cmd{\texttilde} is defined
%    in babel manner.
%    \begin{macrocode}
\Hy@nextfalse
\ltx@IfUndefined{spanish@sh@"@sel}{}{\Hy@nexttrue}
\ltx@IfUndefined{galician@sh@"@sel}{}{\Hy@nexttrue}
\ltx@IfUndefined{estonian@sh@"@sel}{}{\Hy@nexttrue}
\ifHy@next
  \let\texttilde\~%
\fi
%    \end{macrocode}
%
%    \begin{macrocode}
\def\Hy@wrapper@babel#1#2{%
  \begingroup
    \Hy@safe@activestrue
    \set@display@protect
    \edef\x{#2}%
    \@onelevel@sanitize\x
    \toks@{#1}%
    \edef\x{\endgroup\the\toks@{\x}}%
  \x
}
\def\Hy@WrapperDef#1{%
  \begingroup
    \escapechar=\m@ne
    \xdef\Hy@gtemp{%
      \expandafter\noexpand\csname HyWrap@\string#1\endcsname
    }%
  \endgroup
  \edef#1{%
    \noexpand\Hy@wrapper@babel
    \expandafter\noexpand\Hy@gtemp
  }%
  \expandafter\def\Hy@gtemp
}
%    \end{macrocode}
%
%    \begin{macrocode}
\ifHy@hyperfigures
  \Hy@Info{Hyper figures ON}%
\else
  \Hy@Info{Hyper figures OFF}%
\fi
\ifHy@nesting
  \Hy@Info{Link nesting ON}%
\else
  \Hy@Info{Link nesting OFF}%
\fi
\ifHy@hyperindex
  \Hy@Info{Hyper index ON}%
\else
  \Hy@Info{Hyper index OFF}%
\fi
\ifHy@plainpages
  \Hy@Info{Plain pages ON}%
\else
  \Hy@Info{Plain pages OFF}%
\fi
\ifHy@backref
  \Hy@Info{Backreferencing ON}%
\else
  \Hy@Info{Backreferencing OFF}%
\fi
\ifHy@typexml
  \Hy@AtEndOfPackage{%
    \RequirePackage{color}%
    \RequirePackage{nameref}%
  }%
\fi
\Hy@DisableOption{typexml}
\ifHy@implicit
  \Hy@InfoNoLine{Implicit mode ON; LaTeX internals redefined}%
\else
  \Hy@InfoNoLine{Implicit mode OFF; no redefinition of LaTeX internals}%
  \def\MaybeStopEarly{%
    \Hy@Message{Stopped early}%
    \Hy@AtBeginDocument{%
      \PDF@FinishDoc
      \gdef\PDF@FinishDoc{}%
    }%
    \endinput
  }%
  \Hy@AtBeginDocument{%
    \let\autoref\ref
    \let\autopageref\pageref
    \ifx\@pdfpagemode\@empty
      \gdef\@pdfpagemode{UseNone}%
    \fi
    \global\Hy@backreffalse
  }%
  \Hy@AtEndOfPackage{%
    \global\let\ReadBookmarks\relax
    \global\let\WriteBookmarks\relax
  }%
\fi
\Hy@DisableOption{implicit}
%    \end{macrocode}
%
% \subsubsection{Driver loading}
%
%    \begin{macrocode}
\Hy@AtEndOfPackage{%
  \@ifpackageloaded{tex4ht}{%
    \def\Hy@driver{htex4ht}%
    \Hy@texhttrue
  }{}%
%    \end{macrocode}
%    Some drivers can be detected. Check for these drivers,
%    whether the given driver option is ok. Otherwise force
%    the right driver or use the default driver.
%    \begin{macrocode}
  \ifx\Hy@driver\@empty
  \else
    \def\Hy@temp{hpdftex}%
    \ifpdf
      \ifx\Hy@driver\Hy@temp
      \else
        \Hy@WarningNoLine{%
          Wrong driver `\Hy@driver.def';\MessageBreak
          pdfTeX is running in PDF mode.\MessageBreak
          Forcing driver `\Hy@temp.def'%
        }%
        \let\Hy@driver\Hy@temp
      \fi
    \else
      \ifx\Hy@driver\Hy@temp
        \Hy@WarningNoLine{%
          Wrong driver `\Hy@driver.def';\MessageBreak
          pdfTeX is not running in PDF mode.\MessageBreak
          Using default driver%
        }%
        \let\Hy@driver\@empty
      \fi
    \fi
  \fi
  \ifHy@texht
  \else
    \ifx\Hy@driver\@empty
    \else
      \def\Hy@temp{hxetex}%
      \ifxetex
        \ifx\Hy@driver\Hy@temp
        \else
          \Hy@WarningNoLine{%
            Wrong driver `\Hy@driver.def';\MessageBreak
            XeTeX is running.\MessageBreak
            Forcing driver `\Hy@temp.def' for XeTeX%
          }%
          \let\Hy@driver\Hy@temp
        \fi
      \fi
    \fi
  \fi
  \ifx\Hy@driver\@empty
  \else
    \def\Hy@temp{hvtexhtm}%
    \ifvtexhtml
      \ifx\Hy@driver\Hy@temp
      \else
        \Hy@WarningNoLine{%
          Wrong driver `\Hy@driver.def';\MessageBreak
          VTeX is running in HTML mode.\MessageBreak
          Forcing driver `\Hy@temp.def'%
        }%
        \let\Hy@driver\Hy@temp
      \fi
    \else
      \ifx\Hy@driver\Hy@temp
        \Hy@WarningNoLine{%
          Wrong driver `\Hy@driver.def';\MessageBreak
          VTeX is not running in HTML mode.\MessageBreak
          Using default driver%
        }%
        \let\Hy@driver\@empty
      \fi
    \fi
  \fi
%    \end{macrocode}
%    If the driver is not given, find the right driver or
%    use the default driver.
%    \begin{macrocode}
  \def\HyOpt@DriverType{}%
  \ifx\Hy@driver\@empty
    \def\HyOpt@DriverType{ (autodetected)}%
    \providecommand*{\Hy@defaultdriver}{hypertex}%
    \ifpdf
      \def\Hy@driver{hpdftex}%
    \else
      \ifxetex
        \def\Hy@driver{hxetex}%
      \else
        \ifvtexhtml
          \def\Hy@driver{hvtexhtm}%
          \def\MaybeStopEarly{%
            \Hy@Message{Stopped early}%
            \Hy@AtBeginDocument{%
              \PDF@FinishDoc
              \gdef\PDF@FinishDoc{}%
            }%
            \endinput
          }%
        \else
          \ifvtexpdf
            \def\Hy@driver{hvtex}%
          \else
            \ifvtexps
              \def\Hy@driver{hvtex}%
            \else
              \ifx\HyOpt@DriverFallback\ltx@empty
                \let\Hy@driver\Hy@defaultdriver
                \def\HyOpt@DriverType{ (default)}%
              \else
                \begingroup
                  \toks@\expandafter{\HyOpt@DriverFallback}%
                  \edef\x{\endgroup
                    \noexpand\kvsetkeys{Hyp}{\the\toks@}%
                  }%
                \x
                \ifx\Hy@driver\ltx@empty
                  \let\Hy@driver\Hy@defaultdriver
                  \def\HyOpt@DriverType{ (default)}%
                \else
                  \def\HyOpt@DriverType{ (fallback)}%
                \fi
              \fi
            \fi
          \fi
        \fi
      \fi
    \fi
    \ifx\Hy@driver\Hy@defaultdriver
      \def\Hy@temp{hdviwind}%
      \ifx\Hy@temp\Hy@driver
        \kvsetkeys{Hyp}{colorlinks}%
        \PassOptionsToPackage{dviwindo}{color}%
      \fi
    \fi
  \fi
  \Hy@Message{Driver\HyOpt@DriverType: \Hy@driver}%
  \chardef\Hy@VersionChecked=0 %
  \input{\Hy@driver.def}%
  \ifcase\Hy@VersionChecked
    \Hy@VersionCheck{\Hy@driver.def}%
  \fi
  \let\@unprocessedoptions\relax
  \Hy@RestoreCatcodes
  \Hy@DisableOption{tex4ht}%
  \Hy@DisableOption{pdftex}%
  \Hy@DisableOption{nativepdf}%
  \Hy@DisableOption{dvipdfm}%
  \Hy@DisableOption{dvipdfmx}%
  \Hy@DisableOption{dvipdfmx-outline-open}%
  \Hy@DisableOption{pdfmark}%
  \Hy@DisableOption{dvips}%
  \Hy@DisableOption{hypertex}%
  \Hy@DisableOption{vtex}%
  \Hy@DisableOption{vtexpdfmark}%
  \Hy@DisableOption{dviwindo}%
  \Hy@DisableOption{dvipsone}%
  \Hy@DisableOption{textures}%
  \Hy@DisableOption{latex2html}%
  \Hy@DisableOption{ps2pdf}%
  \Hy@DisableOption{xetex}%
  \Hy@DisableOption{pdfversion}%
}
%    \end{macrocode}
%    Support for open outlines is enabled for Xe\TeX\ >= 0.9995.
%    I don't know, if older versions also support this.
%    AFAIK older dvipdfmx versions will break, thus the
%    switch cannot be turned on by default.
%    \begin{macrocode}
\newif\ifHy@DvipdfmxOutlineOpen
\ifxetex
  \ifdim\number\XeTeXversion\XeTeXrevision in<0.9995in %
  \else
    \chardef\SpecialDvipdfmxOutlineOpen\@ne
    \Hy@DvipdfmxOutlineOpentrue
  \fi
\fi
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname SpecialDvipdfmxOutlineOpen\endcsname\relax
\else
  \ifnum\SpecialDvipdfmxOutlineOpen>\z@
    \Hy@DvipdfmxOutlineOpentrue
  \fi
\fi
%    \end{macrocode}
%
% \subsubsection{Bookmarks}
%    \begin{macrocode}
\def\WriteBookmarks{0}
\def\@bookmarkopenstatus#1{%
  \ifHy@bookmarksopen
%    \end{macrocode}
%    The purpose of the |\@firstofone|-number-space-construct
%    is that no |\relax| will be inserted by \TeX{} before the |\else|:
%    \begin{macrocode}
    \ifnum#1<\expandafter\@firstofone\expandafter
             {\number\@bookmarksopenlevel} % explicit space
    \else
      -%
    \fi
  \else
    -%
  \fi
}
\ifHy@bookmarks
  \Hy@Info{Bookmarks ON}%
  \ifx\@pdfpagemode\@empty
    \def\@pdfpagemode{UseOutlines}%
  \fi
\else
  \let\@bookmarkopenstatus\ltx@gobble
  \Hy@Info{Bookmarks OFF}%
  \Hy@AtEndOfPackage{%
    \global\let\ReadBookmarks\relax
    \global\let\WriteBookmarks\relax
  }%
  \ifx\@pdfpagemode\@empty
    \def\@pdfpagemode{UseNone}%
  \fi
\fi
\Hy@DisableOption{bookmarks}
%    \end{macrocode}
%
%    Add wrapper for setting standard catcodes (babel's shorthands).
%    \begin{macrocode}
\def\Hy@CatcodeWrapper#1{%
  \let\Hy@EndWrap\ltx@empty
  \def\TMP@EnsureCode##1##2{%
    \edef\Hy@EndWrap{%
      \Hy@EndWrap
      \catcode##1 \the\catcode##1\relax
    }%
    \catcode##1 ##2\relax
  }%
  \TMP@EnsureCode{10}{12}% ^^J
  \TMP@EnsureCode{33}{12}% !
  \TMP@EnsureCode{34}{12}% "
  \TMP@EnsureCode{36}{3}% $ (math)
  \TMP@EnsureCode{38}{4}% & (alignment)
  \TMP@EnsureCode{39}{12}% '
  \TMP@EnsureCode{40}{12}% (
  \TMP@EnsureCode{41}{12}% )
  \TMP@EnsureCode{42}{12}% *
  \TMP@EnsureCode{43}{12}% +
  \TMP@EnsureCode{44}{12}% ,
  \TMP@EnsureCode{45}{12}% -
  \TMP@EnsureCode{46}{12}% .
  \TMP@EnsureCode{47}{12}% /
  \TMP@EnsureCode{58}{12}% :
  \TMP@EnsureCode{59}{12}% ;
  \TMP@EnsureCode{60}{12}% <
  \TMP@EnsureCode{61}{12}% =
  \TMP@EnsureCode{62}{12}% >
  \TMP@EnsureCode{63}{12}% ?
  \TMP@EnsureCode{91}{12}% [
  \TMP@EnsureCode{93}{12}% ]
  \TMP@EnsureCode{94}{7}% ^ (superscript)
  \TMP@EnsureCode{95}{8}% _ (subscript)
  \TMP@EnsureCode{96}{12}% `
  \TMP@EnsureCode{124}{12}% |
  \TMP@EnsureCode{126}{13}% ~ (active)
  #1\relax
  \Hy@EndWrap
}
%    \end{macrocode}
%
%    |\HyColor@UseColor| expects a macro as argument. It contains
%    the color specification.
%    \begin{macrocode}
\Hy@AtBeginDocument{%
  \ifHy@ocgcolorlinks
    \kvsetkeys{Hyp}{colorlinks}%
    \ifHy@pdfa
      \Hy@Warning{%
        PDF/A: Optional Content Groups are prohibited,\MessageBreak
        using `colorlinks' instead of `ocgcolorlinks'%
      }%
      \Hy@ocgcolorlinksfalse
    \fi
  \fi
  \ifHy@ocgcolorlinks
  \else
    \Hy@DisableOption{ocgcolorlinks}%
  \fi
  \ifHy@colorlinks
    \def\@pdfborder{0 0 0}%
    \let\@pdfborderstyle\@empty
    \ifHy@typexml
    \else
      \Hy@CatcodeWrapper{%
        \RequirePackage{color}%
      }%
    \fi
    \def\Hy@colorlink#1{%
      \begingroup
      \HyColor@UseColor#1%
    }%
    \def\Hy@endcolorlink{\endgroup}%
    \Hy@Info{Link coloring ON}%
  \else
    \ifHy@frenchlinks
      \def\Hy@colorlink#1{\begingroup\fontshape{sc}\selectfont}%
      \def\Hy@endcolorlink{\endgroup}%
      \Hy@Info{French linking ON}%
    \else
%    \end{macrocode}
%    for grouping consistency:
%    \begin{macrocode}
      \def\Hy@colorlink#1{\begingroup}%
      \def\Hy@endcolorlink{\endgroup}%
      \Hy@Info{Link coloring OFF}%
    \fi
  \fi
  \Hy@DisableOption{colorlinks}%
  \Hy@DisableOption{frenchlinks}%
  \ifHy@texht
    \long\def\@firstoffive#1#2#3#4#5{#1}%
    \long\def\@secondoffive#1#2#3#4#5{#2}%
    \long\def\@thirdoffive#1#2#3#4#5{#3}%
    \long\def\@fourthoffive#1#2#3#4#5{#4}%
    \long\def\@fifthoffive#1#2#3#4#5{#5}%
    \providecommand*\@safe@activestrue{}%
    \providecommand*\@safe@activesfalse{}%
    \def\T@ref#1{%
      \Hy@safe@activestrue
      \expandafter\@setref\csname r@#1\endcsname\@firstoffive{#1}%
      \Hy@safe@activesfalse
    }%
    \def\T@pageref#1{%
      \Hy@safe@activestrue
      \expandafter\@setref\csname r@#1\endcsname\@secondoffive{#1}%
      \Hy@safe@activesfalse
    }%
  \else
    \ifHy@typexml
    \else
      \Hy@CatcodeWrapper{%
        \RequirePackage{nameref}%
      }%
    \fi
  \fi
  \DeclareRobustCommand\ref{%
    \@ifstar\@refstar\T@ref
  }%
  \DeclareRobustCommand\pageref{%
    \@ifstar\@pagerefstar\T@pageref
  }%
%  \@ifclassloaded{memoir}{%
%    \ltx@IfUndefined{@mem@titlerefnolink}\ltx@secondoftwo{%
%      \ltx@IfUndefined{@mem@titleref}\ltx@secondoftwo\ltx@firstoftwo
%    }%
%  }\ltx@secondoftwo
%  {%
%    \DeclareRobustCommand*{\nameref}{%
%      \@ifstar\@mem@titlerefnolink\@mem@titleref
%    }%
%  }{%
    \DeclareRobustCommand*{\nameref}{%
      \@ifstar\@namerefstar\T@nameref
    }%
%  }%
}
\Hy@AtBeginDocument{%
  \ifHy@texht
  \else
    \Hy@CatcodeWrapper\ReadBookmarks
  \fi
}
%    \end{macrocode}
%    \begin{macrocode}
\ifHy@backref
  \RequirePackage{backref}%
\else
  \let\Hy@backout\@gobble
\fi
\Hy@DisableOption{backref}
\Hy@DisableOption{pagebackref}
%    \end{macrocode}
%    \begin{macrocode}
\Hy@activeanchorfalse
%    \end{macrocode}
%
% \section{User hypertext macros}\label{usermacros}
% We need to normalise all user commands taking a URL argument;
% Within the argument the following special definitions apply:
% |\#|, |\%|, |~| produce |#|, |%|, |~| respectively.
% for consistency |\~| produces |~| as well.
% At the \emph{top level only} ie not within the argument of another
% command, you can use |#| and |%| unescaped, to produce themselves.
% even if, say, |#| is entered as |#| it will be converted to |\#|
% so it does not die if written to an aux file etc. |\#| will write
% as |#| locally while making |\special|s.
%    \begin{macrocode}
\begingroup
  \endlinechar=-1 %
  \catcode`\^^A=14 %
  \catcode`\^^M\active
  \catcode`\%\active
  \catcode`\#\active
  \catcode`\_\active
  \catcode`\$\active
  \catcode`\&\active
  \gdef\hyper@normalise{^^A
    \begingroup
    \catcode`\^^M\active
    \def^^M{ }^^A
    \catcode`\%\active
    \let%\@percentchar
    \let\%\@percentchar
    \catcode`\#\active
    \def#{\hyper@hash}^^A
    \def\#{\hyper@hash}^^A
    \@makeother\&^^A
    \edef&{\string&}^^A
    \edef\&{\string&}^^A
    \edef\textunderscore{\string_}^^A
    \let\_\textunderscore
    \catcode`\_\active
    \let_\textunderscore
    \let~\hyper@tilde
    \let\~\hyper@tilde
    \let\textasciitilde\hyper@tilde
    \let\\\@backslashchar
    \edef${\string$}^^A
    \Hy@safe@activestrue
    \hyper@n@rmalise
  }^^A
  \catcode`\#=6 ^^A
  \gdef\Hy@ActiveCarriageReturn{^^M}^^A
  \gdef\hyper@n@rmalise#1#2{^^A
    \def\Hy@tempa{#2}^^A
    \ifx\Hy@tempa\Hy@ActiveCarriageReturn
      \ltx@ReturnAfterElseFi{^^A
        \hyper@@normalise{#1}^^A
      }^^A
    \else
      \ltx@ReturnAfterFi{^^A
        \hyper@@normalise{#1}{#2}^^A
      }^^A
    \fi
  }^^A
  \gdef\hyper@@normalise#1#2{^^A
    \edef\Hy@tempa{^^A
      \endgroup
      \noexpand#1{\Hy@RemovePercentCr#2%^^M\@nil}^^A
    }^^A
    \Hy@tempa
  }^^A
  \gdef\Hy@RemovePercentCr#1%^^M#2\@nil{^^A
    #1^^A
    \ifx\limits#2\limits
    \else
      \ltx@ReturnAfterFi{^^A
        \Hy@RemovePercentCr #2\@nil
      }^^A
    \fi
  }^^A
\endgroup
\providecommand*\hyper@chars{%
  \let\#\hyper@hash
  \let\%\@percentchar
  \Hy@safe@activestrue
}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\hyperlink#1#2{%
  \hyper@@link{}{#1}{#2}%
}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\Hy@VerboseLinkStart#1#2{%
  \ifHy@verbose
    \begingroup
      \Hy@safe@activestrue
      \xdef\Hy@VerboseGlobalTemp{(#1) `#2'}%
      \Hy@Info{Reference \Hy@VerboseGlobalTemp}%
      \xdef\Hy@VerboseGlobalTemp{%
        \Hy@VerboseGlobalTemp, %
        line \the\inputlineno
      }%
    \endgroup
    \let\Hy@VerboseLinkInfo\Hy@VerboseGlobalTemp
    \@onelevel@sanitize\Hy@VerboseLinkInfo
  \fi
}
%    \end{macrocode}
%    \begin{macrocode}
\def\Hy@VerboseLinkInfo{<VerboseLinkInfo>}
\def\Hy@VerboseLinkStop{%
  \ifHy@verbose
    \begingroup
      \edef\x{\endgroup
        \write\m@ne{%
          Package `hyperref' Info: %
          End of reference \Hy@VerboseLinkInfo.%
        }%
      }%
    \x
  \fi
}
%    \end{macrocode}
%    \begin{macrocode}
\def\Hy@VerboseAnchor#1{%
  \ifHy@verbose
    \begingroup
      \Hy@safe@activestrue
      \Hy@Info{Anchor `\HyperDestNameFilter{#1}'}%
    \endgroup
  \fi
}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\Hy@AllowHyphens{%
  \relax
  \ifhmode
    \penalty\@M
    \hskip\z@skip
  \fi
}
%    \end{macrocode}
%
%    \begin{macrocode}
\DeclareRobustCommand*{\href}[1][]{%
  \begingroup
  \setkeys{href}{#1}%
  \@ifnextchar\bgroup\Hy@href{\hyper@normalise\href@}%
}
\def\Hy@href#{%
  \hyper@normalise\href@
}
\begingroup
  \catcode`\$=6 %
  \catcode`\#=12 %
  \gdef\href@$1{\expandafter\href@split$1##\\}%
  \gdef\href@split$1#$2#$3\\$4{%
    \hyper@@link{$1}{$2}{$4}%
    \endgroup
  }%
\endgroup
%    \end{macrocode}
%    Option `page'.
%    \begin{macrocode}
\define@key{href}{page}{%
  \def\Hy@href@page{#1}%
}
\let\Hy@href@page\@empty
\newcount\c@Hy@tempcnt
\def\theHy@tempcnt{\the\c@Hy@tempcnt}
\def\Hy@MakeRemoteAction{%
  \ifx\Hy@href@page\@empty
    \def\Hy@href@page{0}%
  \else
    \setcounter{Hy@tempcnt}{\Hy@href@page}%
    \ifnum\c@Hy@tempcnt<\@ne
      \Hy@Warning{%
        Invalid page number (\theHy@tempcnt)\MessageBreak
        for remote PDF file.\MessageBreak
        Using page 1%
      }%
      \def\Hy@href@page{0}%
    \else
      \global\advance\c@Hy@tempcnt\m@ne
      \edef\Hy@href@page{\theHy@tempcnt}%
    \fi
  \fi
%    \end{macrocode}
%    If a next action is set, then also a new window
%    should be opened. Otherwise AR reclaims that it
%    closes the current file with discarding the next actions.
%    \begin{macrocode}
  \ifx\Hy@href@nextactionraw\@empty
  \else
    \Hy@pdfnewwindowsettrue
    \Hy@pdfnewwindowtrue
  \fi
}
%    \end{macrocode}
%    Option `pdfremotestartview'.
%    \begin{macrocode}
\define@key{href}{pdfremotestartview}{%
  \setkeys{Hyp}{pdfremotestartview={#1}}%
}
%    \end{macrocode}
%    Option `pdfnewwindow'.
%    \begin{macrocode}
\let\KV@href@pdfnewwindow\KV@Hyp@pdfnewwindow
\let\KV@href@pdfnewwindow@default\KV@Hyp@pdfnewwindow@default
%    \end{macrocode}
%    Option `ismap'.
%    \begin{macrocode}
\newif\ifHy@href@ismap
\define@key{href}{ismap}[true]{%
  \ltx@IfUndefined{Hy@href@ismap#1}{%
    \Hy@Error{%
      Invalid value (#1) for key `ismap'.\MessageBreak
      Permitted values are `true' or `false'.\MessageBreak
      Ignoring `ismap'%
    }\@ehc
  }{%
    \csname Hy@href@ismap#1\endcsname
  }%
}
%    \end{macrocode}
%    Option `nextactionraw'.
%    \begin{macrocode}
\let\Hy@href@nextactionraw\@empty
\define@key{href}{nextactionraw}{%
  \edef\Hy@href@nextactionraw{#1}%
  \ifx\Hy@href@nextactionraw\@empty
  \else
    \Hy@Match\Hy@href@nextactionraw{%
      ^(\HyPat@ObjRef/|<<.*/S[ /].+>>|%
       \[( ?\HyPat@ObjRef/|<<.*/S[ /].+>>)+ ?])$%
    }{}{%
      \Hy@Warning{Invalid value for `nextactionraw':\MessageBreak
        \Hy@href@nextactionraw\MessageBreak
        The action is discarded%
      }%
    }%
    \ifx\Hy@href@nextactionraw\@empty
    \else
      \edef\Hy@href@nextactionraw{/Next \Hy@href@nextactionraw}%
    \fi
  \fi
}
\def\HyPat@ObjRef/{.+}
%    \end{macrocode}
%    Load package |url.sty| and save the meaning of
%    the original \cmd{\url} in \cmd{\nolinkurl}.
%    \begin{macrocode}
\RequirePackage{url}
\let\HyOrg@url\url
\def\Hurl{\begingroup \Url}
\DeclareRobustCommand*{\nolinkurl}{\hyper@normalise\nolinkurl@}
\def\nolinkurl@#1{\Hurl{#1}}
\DeclareRobustCommand*{\url}{\hyper@normalise\url@}
\def\url@#1{\hyper@linkurl{\Hurl{#1}}{#1}}
%    \end{macrocode}
%
%    \begin{macrocode}
\DeclareRobustCommand*{\hyperimage}{\hyper@normalise\hyper@image}
\providecommand\hyper@image[2]{#2}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\hypertarget#1#2{%
  \ifHy@nesting
    \hyper@@anchor{#1}{#2}%
  \else
    \hyper@@anchor{#1}{\relax}#2%
  \fi
}
%    \end{macrocode}
% |\hyperref| is more complicated, as it includes the concept of a
% category of link, used to make the name. This is not really used in this
% package.  |\hyperdef| sets up an anchor in the same way. They each have
% three  parameters of category, linkname, and marked text, and |\hyperref|
% also has a first parameter of URL.
% If there is an optional first parameter to |\hyperdef|,
% it is the name of a \LaTeX\ label which can be used in
% a short form of |\hyperref| later, to avoid
% remembering the name and category.
%    \begin{macrocode}
\DeclareRobustCommand*{\hyperref}{%
  \@ifnextchar[{\Hy@babelnormalise\label@hyperref}\@hyperref
}
\def\Hy@babelnormalise#1[#2]{%
  \begingroup
    \Hy@safe@activestrue
    \edef\Hy@tempa{%
      \endgroup
      \noexpand#1[{#2}]%
    }%
  \Hy@tempa
}
\def\@hyperref{\hyper@normalise\@@hyperref}
\def\@@hyperref#1#2#3{%
  \edef\ref@one{\ifx\\#2\\\else#2.\fi#3}%
  \expandafter\tryhyper@link\ref@one\\{#1}%
}
\def\tryhyper@link#1\\#2{%
  \hyper@@link{#2}{#1}%
}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\hyperdef{\@ifnextchar[{\label@hyperdef}{\@hyperdef}}
\def\@hyperdef#1#2#3{%, category, name, text
  \ifx\\#1\\%
    \def\Hy@AnchorName{#2}%
  \else
    \def\Hy@AnchorName{#1.#2}%
  \fi
  \ifHy@nesting
    \expandafter\hyper@@anchor\expandafter{\Hy@AnchorName}{#3}%
  \else
    \expandafter\hyper@@anchor\expandafter{\Hy@AnchorName}{\relax}#3%
  \fi
}
%    \end{macrocode}
% We also have a need to give a \LaTeX\ \emph{label} to a
% hyper reference, to ease the pain of referring to it later.
%    \begin{macrocode}
\def\label@hyperref[#1]{%
  \expandafter\label@@hyperref\csname r@#1\endcsname{#1}%
}%
\def\label@@hyperref#1#2#3{%
  \ifx#1\relax
    \protect\G@refundefinedtrue
    \@latex@warning{%
      Hyper reference `#2' on page \thepage \space undefined%
    }%
    \begingroup
      #3%
    \endgroup
  \else
    \hyper@@link{\expandafter\@fifthoffive#1}%
      {\expandafter\@fourthoffive#1\@empty\@empty}{#3}%
  \fi
}
\def\label@hyperdef[#1]#2#3#4{% label name, category, name,
                                % anchor text
  \@bsphack
  \ifx\\#2\\%
    \def\Hy@AnchorName{#3}%
  \else
    \def\Hy@AnchorName{#2.#3}%
  \fi
  \if@filesw
    \protected@write\@auxout{}{%
      \string\newlabel{#1}{{}{}{}{\Hy@AnchorName}{}}%
    }%
  \fi
  \@esphack
  \ifHy@nesting
    \expandafter\hyper@@anchor\expandafter{\Hy@AnchorName}{#4}%
  \else
    \expandafter\hyper@@anchor\expandafter{\Hy@AnchorName}{\relax}#4%
  \fi
}
%    \end{macrocode}
% \section{Underlying basic hypertext macros}\label{coremacros}
% Links have an optional type, a filename (possibly a URL),
% an internal name, and some marked text. (Caution: the internal
% name may contain babel shorthand characters.)
% If the second parameter is empty, its an internal link,
% otherwise we need to open another file or a URL.
% A link start has a type, and a URL.
%    \begin{macrocode}
\def\hyper@@link{\let\Hy@reserved@a\relax
  \@ifnextchar[{\hyper@link@}{\hyper@link@[link]}%
}
\def\hyper@link@[#1]#2#3#4{%
  \begingroup
    \protected@edef\Hy@tempa{#2}%
    \Hy@safe@activestrue
    \edef\x{#3}%
    \ifx\Hy@tempa\@empty
      \toks0{\hyper@link{#1}}%
    \else
      \toks0{\expandafter\hyper@readexternallink#2\\{#1}}%
    \fi
    \toks2{%
      \Hy@safe@activesfalse
      #4%
    }%
    \edef\Hy@tempa{\the\toks2}%
    \edef\x{\endgroup
      \ifx\Hy@tempa\@empty
        \noexpand\Hy@Warning{Suppressing empty link}%
      \else
        \the\toks0 {\x}{\the\toks2}%%
      \fi
    }%
  \x
}
%    \end{macrocode}
% The problem here is that the first (URL) parameter may be a
% local \texttt{file:} reference
% (in which case some browsers treat it differently)
% or a genuine URL, in which case we'll have to activate
% a real Web browser.
% Note that a simple name is also a URL, as that is interpreted
% as a relative file name. We have to worry about |#| signs in a local
% file as well.
%
%    \begin{macrocode}
\def\hyper@readexternallink#1\\#2#3#4{%
  \begingroup
    \let\\\relax
  \expandafter\endgroup
  \expandafter\@@hyper@@readexternallink#1\\{#2}{#3}{#4}%
}
\def\@@hyper@@readexternallink#1\\#2#3#4{%
%    \end{macrocode}
% Parameters are:
% \begin{enumerate}
% \item The URL or file name
% \item The type
% \item The internal name
% \item The link string
% \end{enumerate}
% We need to get the 1st parameter properly expanded,
% so we delimit the arguments rather than passing it inside a group.
%    \begin{macrocode}
  \@hyper@readexternallink{#2}{#3}{#4}#1::\\{#1}%
}
%    \end{macrocode}
% Now (potentially), we are passed:
% 1) The link type
% 2) The internal name,
% 3) the link string,
% 4) the URL type (http, mailto, file etc),
% 5) the URL details
% 6) anything after a real : in the URL
% 7) the whole URL again
%    \begin{macrocode}
\def\@pdftempwordfile{file}%
\def\@pdftempwordrun{run}%
\def\@hyper@readexternallink#1#2#3#4:#5:#6\\#7{%
%    \end{macrocode}
% If there are no colons at all (|#6| is blank), its a local
% file; if the URL type (|#4|) is blank, its probably a Mac filename,
% so treat it like a \texttt{file:} URL. The only flaw is if
% its a relative Mac path, with several colon-separated elements ---
% then we lose. Such names must be prefixed with an explicit |dvi:|
%    \begin{macrocode}
  \ifx\\#6\\%
    \@hyper@linkfile file:#7\\{#3}{#2}{#7}%
  \else
    \ifx\\#4\\%
      \@hyper@linkfile file:#7\\{#3}{#2}{#7}%
    \else
%    \end{macrocode}
% If the URL type is `file', pass it for local opening
%    \begin{macrocode}
      \def\@pdftempa{#4}%
      \ifx\@pdftempa\@pdftempwordfile
        \@hyper@linkfile#7\\{#3}{#2}{#7}%
      \else
%    \end{macrocode}
% if it starts `run:', its to launch an application.
%    \begin{macrocode}
        \ifx\@pdftempa\@pdftempwordrun
          \ifHy@pdfa
            \Hy@Error{%
              PDF/A: Launch action is prohibited%
            }\@ehc
            \begingroup
              \leavevmode
              #2%
            \endgroup
          \else
            \@hyper@launch#7\\{#3}{#2}%
          \fi
        \else
%    \end{macrocode}
% otherwise its a URL
%    \begin{macrocode}
          \hyper@linkurl{#3}{#7\ifx\\#2\\\else\hyper@hash#2\fi}%
        \fi
      \fi
    \fi
  \fi
}
%    \end{macrocode}
%  By default, turn |run:| into |file:|
%    \begin{macrocode}
\def\@hyper@launch run:#1\\#2#3{% filename, anchor text, linkname
  \hyper@linkurl{#2}{%
    \Hy@linkfileprefix
    #1%
    \ifx\\#3\\%
    \else
      \hyper@hash
      #3%
    \fi
  }%
}
%    \end{macrocode}
% D P Story <story@uakron.edu> pointed out that relative paths
% starting .. fell over. Switched to using |\filename@parse| to
% solve this.
%    \begin{macrocode}
\def\@hyper@linkfile file:#1\\#2#3#4{%
     %file url,link string, name, original uri
  \filename@parse{#1}%
  \ifx\filename@ext\relax
    \edef\filename@ext{\XR@ext}%
  \fi
  \def\use@file{\filename@area\filename@base.\filename@ext}%
  \Hy@IfStringEndsWith\filename@ext\XR@ext{%
    \hyper@linkfile{#2}{\use@file}{#3}%
  }{%
    \ifx\@baseurl\@empty
      \hyper@linkurl{#2}{%
        #4\ifx\\#3\\\else\hyper@hash#3\fi
      }%
    \else
      \hyper@linkurl{#2}{\use@file\ifx\\#3\\\else\hyper@hash#3\fi}%
    \fi
  }%
}
%    \end{macrocode}
%    \begin{macrocode}
\def\Hy@IfStringEndsWith#1#2{%
  \begingroup
    \edef\x{#1}%
    \@onelevel@sanitize\x
    \edef\x{.\x$}%
    \edef\y{#2}%
    \@onelevel@sanitize\y
    \edef\y{.\y$}%
    \expandafter\def\expandafter\z\expandafter##\expandafter1\y##2\@nil{%
      \endgroup
      \ifx\relax##2\relax
        \expandafter\ltx@secondoftwo
      \else
        \expandafter\ltx@firstoftwo
      \fi
    }%
  \expandafter\expandafter\expandafter\z\expandafter\x\y\@nil
}
%    \end{macrocode}
%    \begin{macrocode}
\def\Hy@StringLocalhost{localhost}
\@onelevel@sanitize\Hy@StringLocalhost
\def\Hy@CleanupFile#1{%
  \edef#1{#1}%
  \expandafter\Hy@@CleanupFile#1\hbox///\hbox\@nil{#1}%
}
\def\Hy@@CleanupFile#1//#2/#3\hbox#4\@nil#5{%
  \begingroup
    \toks@{\endgroup}%
    \def\x{#1}%
    \ifx\x\@empty
      \def\x{#2}%
      \ifx\x\@empty
        \toks@{\endgroup\def#5{/#3}}%
      \else
        \@onelevel@sanitize\x
        \ifx\x\Hy@StringLocalhost
          \toks@{\endgroup\def#5{/#3}}%
        \fi
      \fi
    \fi
  \the\toks@
}
%    \end{macrocode}
% Anchors have a name, and marked text.
% We have to be careful with the marked text, as if we break
% off part of something to put a |\special| around it, all hell breaks
% loose. Therefore, we check the category code of the first token,
% and only proceed if its safe. Tanmoy sorted this out.
%
% A curious case arises if the original parameter
% was in braces. That means that |#2| comes here a multiple
% letters, and the |noexpand| just looks at the first one,
% putting the rest in the output. Yuck.
%    \begin{macrocode}
\long\def\hyper@@anchor#1#2{\@hyper@@anchor#1\relax#2\relax}
\long\def\@hyper@@anchor#1\relax#2#3\relax{%
  \ifx\\#1\\%
    #2\Hy@Warning{Ignoring empty anchor}%
  \else
    \def\anchor@spot{#2#3}%
    \let\put@me@back\@empty
    \ifx\relax#2\relax
    \else
      \ifHy@nesting
      \else
        \ifcat a\noexpand#2\relax
        \else
          \ifcat 0\noexpand#2 \relax
          \else
%            \typeout{Anchor start is not alphanumeric %
%              on input line\the\inputlineno%
%            }%
            \let\anchor@spot\@empty
            \def\put@me@back{#2#3}%
          \fi
        \fi
      \fi
    \fi
    \ifHy@activeanchor
      \anchor@spot
    \else
      \hyper@anchor{#1}%
    \fi
    \expandafter\put@me@back
  \fi
  \let\anchor@spot\@empty
}
\let\anchor@spot\ltx@empty
%    \end{macrocode}
% \section{Compatibility with the \emph{\LaTeX{}2html} package}\label{latex2html}
% Map our macro names on to Nikos', so that documents prepared
% for that system will work without change.
%
% Note, however, that the whole complicated structure for
% segmenting documents is not supported; it is assumed that the user
% will load |html.sty| first, and then |hyperref.sty|, so that the
% definitions in |html.sty| take effect, and are then overridden
% in a few circumstances by this package.
%    \begin{macrocode}
\let\htmladdimg\hyperimage
%    \end{macrocode}
%
%    \begin{macrocode}
\def\htmladdnormallink#1#2{\href{#2}{#1}}
\def\htmladdnormallinkfoot#1#2{\href{#2}{#1}\footnote{#2}}
\def\htmlref#1#2{% anchor text, label
  \label@hyperref[{#2}]{#1}%
}
%    \end{macrocode}
% This is really too much. The \LaTeX2html package defines its own
% |\hyperref| command, with a different syntax. Was this always here?
% Its weird, anyway. We interpret it in the `printed' way, since
% we are about fidelity to the page.
%    \begin{macrocode}
\def\@@latextohtmlX{%
  \let\hhyperref\hyperref
  \def\hyperref##1##2##3##4{% anchor text for HTML
                     % text to print before label in print
                     % label
                     % post-label text in print
    ##2\ref{##4}##3%
  }%
}
%    \end{macrocode}
%
% \section{Forms creation}
% Allow for creation of PDF or HTML forms. The effects here are
% limited somewhat by the need to support both output formats,
% so it may not be as clever as something which only wants
% to make PDF forms.
%
% I (Sebastian) could not have started this without the
% encouragement of T V Raman.
%
% \subsection{Field flags}
%
%    The field flags are organized in a bit set.
%    \begin{macrocode}
\RequirePackage{bitset}
%    \end{macrocode}
%
%    Each flag has a option name, an \cs{if} switch,
%    and a bit position. The default is always `false', the
%    flag is clear.
%    This is also the default of the switch created by \cs{newif}.
%
%    The names of the flags in the PDF specification (1.7)
%    are used as lowercase option names.
%    \begin{macro}{\HyField@NewFlag}
%    |#1|: type: |F| annot flags, |Ff| field flags\\
%    |#2|: PDF name\\
%    |#3|: PDF position
%    \begin{macrocode}
\def\HyField@NewFlag#1#2{%
  \lowercase{\HyField@NewOption{#2}}%
  \lowercase{\HyField@NewBitsetFlag{#2}}{#2}{#1}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyField@NewFlagOnly}
%    \begin{macrocode}
\def\HyField@NewFlagOnly#1#2{%
  \lowercase{\HyField@NewBitsetFlag{#2}}{#2}{#1}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyField@NewOption}
%    |#1|: option name
%    \begin{macrocode}
\def\HyField@NewOption#1{%
  \expandafter\newif\csname ifFld@#1\endcsname
  \define@key{Field}{#1}[true]{%
    \lowercase{\Field@boolkey{##1}}{#1}%
  }%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyField@NewBitsetFlag}
%    Package `bitset' uses zero based positions, the
%    PDF specification starts with one.\\
%    |#1|: option\\
%    |#2|: PDF name\\
%    |#3|: type: |F| annot flags, |Ff| field flags\\
%    |#4|: PDF position
%    \begin{macrocode}
\def\HyField@NewBitsetFlag#1#2#3#4{%
  \begingroup
    \count@=#4\relax
    \advance\count@\m@ne
    \def\x##1{%
      \endgroup
      \expandafter\def\csname HyField@#3@#1\endcsname{##1}%
      \expandafter\ifx\csname HyField@#3@##1\endcsname\relax
        \expandafter\edef\csname HyField@#3@##1\endcsname{%
          (\number#4) #2%
        }%
      \else
        \expandafter\edef\csname HyField@#3@##1\endcsname{%
          \csname HyField@#3@##1\endcsname
          /#2%
        }%
      \fi
    }%
  \expandafter\x\expandafter{\the\count@}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyField@UseFlag}
%    The bit set is |HyField@#1|
%    \begin{macrocode}
\def\HyField@UseFlag#1#2{%
  \lowercase{\HyField@@UseFlag{#2}}{#1}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyField@@UseFlag}
%    \begin{macrocode}
\def\HyField@@UseFlag#1#2{%
  \bitsetSetValue{HyField@#2}{%
    \csname HyField@#2@#1\endcsname
  }{%
    \csname ifFld@#1\endcsname 1\else 0\fi
  }%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyField@SetFlag}
%    The bit set is |HyField@#1|
%    \begin{macrocode}
\def\HyField@SetFlag#1#2{%
  \lowercase{\HyField@@SetFlag{#2}}{#1}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyField@@SetFlag}
%    \begin{macrocode}
\def\HyField@@SetFlag#1#2{%
  \bitsetSetValue{HyField@#2}{%
    \csname HyField@#2@#1\endcsname
  }{1}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyField@PrintFlags}
%    \begin{macrocode}
\def\HyField@PrintFlags#1#2{%
  \ifHy@verbose
    \begingroup
      \let\Hy@temp\@empty
      \let\MessageBreak\relax
      \expandafter\@for\expandafter\x\expandafter:\expandafter=%
      \bitsetGetSetBitList{HyField@#1}\do{%
        \edef\Hy@temp{%
          \Hy@temp
          \csname HyField@#1@\x\endcsname\MessageBreak
        }%
      }%
    \edef\x{\endgroup
      \noexpand\Hy@Info{%
        Field flags: %
          \expandafter\ifx\@car#1\@nil S\else/\fi
          #1 %
          \bitsetGetDec{HyField@#1} %
          (0x\bitsetGetHex{HyField@#1}{32})\MessageBreak
        \Hy@temp
        for #2%
      }%
    }\x
  \fi
}
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Declarations of field flags}
%
%    ``Table 8.70 Field flags common to all field types''
%    \begin{macrocode}
\HyField@NewFlag{Ff}{ReadOnly}{1}
\HyField@NewFlag{Ff}{Required}{2}
\HyField@NewFlag{Ff}{NoExport}{3}
%    \end{macrocode}
%    ``Table 8.75 Field flags specific to button fields''
%    \begin{macrocode}
\HyField@NewFlag{Ff}{NoToggleToOff}{15}
\HyField@NewFlag{Ff}{Radio}{16}
\HyField@NewFlag{Ff}{Pushbutton}{17}
\HyField@NewFlag{Ff}{RadiosInUnison}{26}
%    \end{macrocode}
%    ``Table 8.77 Field flags specific to text fields''
%    \begin{macrocode}
\HyField@NewFlag{Ff}{Multiline}{13}
\HyField@NewFlag{Ff}{Password}{14}
\HyField@NewFlag{Ff}{FileSelect}{21}% PDF 1.4
\HyField@NewFlag{Ff}{DoNotSpellCheck}{23}% PDF 1.4
\HyField@NewFlag{Ff}{DoNotScroll}{24}% PDF 1.4
\HyField@NewFlag{Ff}{Comb}{25}% PDF 1.4
\HyField@NewFlag{Ff}{RichText}{26}% PDF 1.5
%    \end{macrocode}
%    ``Table 8.79 field flags specific to choice fields''
%    \begin{macrocode}
\HyField@NewFlag{Ff}{Combo}{18}
\HyField@NewFlag{Ff}{Edit}{19}
\HyField@NewFlag{Ff}{Sort}{20}
\HyField@NewFlag{Ff}{MultiSelect}{22}% PDF 1.4
% \HyField@NewFlag{Ff}{DoNotSpellCheck}{23}% PDF 1.4
\HyField@NewFlag{Ff}{CommitOnSelChange}{27}% PDF 1.5
%    \end{macrocode}
%    Signature fields are not supported.
%
%    Until 6.76i hyperref uses field option `combo' to set
%    three flags `Combo', `Edit', and `Sort'. Option `popdown' sets
%    flag `Combo' only.
%    \begin{macrocode}
\newif\ifFld@popdown
\define@key{Field}{popdown}[true]{%
  \lowercase{\Field@boolkey{#1}}{popdown}%
}
%    \end{macrocode}
%
%    Annotation flags. The form objects are widget annotations.
%    There are two flags for readonly settings, the one in the annotation
%    flags is ignored, instead the other in the field flags is used.
%
%    Flag |Print| is not much useful, because hyperref do not
%    use the appearance entry of the annotations for most fields.
%    \begin{macrocode}
\HyField@NewFlag{F}{Invisible}{1}
\HyField@NewFlag{F}{Hidden}{2}% PDF 1.2
\HyField@NewFlag{F}{Print}{3}% PDF 1.2
\HyField@NewFlag{F}{NoZoom}{4}% PDF 1.2
\HyField@NewFlag{F}{NoRotate}{5}% PDF 1.3
\HyField@NewFlag{F}{NoView}{6}% PDF 1.3
\HyField@NewFlag{F}{Locked}{8}% PDF 1.4
\HyField@NewFlag{F}{ToggleNoView}{9}% PDF 1.5
\HyField@NewFlag{F}{LockedContents}{10}% PDF 1.7
%    \end{macrocode}
%
%    \begin{macrocode}
\ifHy@pdfa
  \def\HyField@PDFAFlagWarning#1#2{%
    \Hy@Warning{%
      PDF/A: Annotation flag `#1' must\MessageBreak
      be set to `#2'%
    }%
  }%
  \Fld@invisiblefalse
  \def\Fld@invisibletrue{%
    \HyField@PDFAFlagWarning{invisible}{false}%
  }%
  \Fld@hiddenfalse
  \def\Fld@hiddentrue{%
    \HyField@PDFAFlagWarning{hidden}{false}%
  }%
  \Fld@printtrue
  \def\Fld@printfalse{%
    \HyField@PDFAFlagWarning{print}{true}%
  }%
  \Fld@nozoomtrue
  \def\Fld@nozoomfalse{%
    \HyField@PDFAFlagWarning{nozoom}{true}%
  }%
  \Fld@norotatetrue
  \def\Fld@norotatefalse{%
    \HyField@PDFAFlagWarning{norotate}{true}%
  }%
  \Fld@noviewfalse
  \def\Fld@noviewtrue{%
    \HyField@PDFAFlagWarning{noview}{false}%
  }%
\fi
%    \end{macrocode}
%
%    Submit flags. Flag 1 Include/Exclude is not supported,
%    use option noexport instead.
%    \begin{macrocode}
\HyField@NewFlag{Submit}{IncludeNoValueFields}{2}
\HyField@NewFlagOnly{Submit}{ExportFormat}{3}
\HyField@NewFlag{Submit}{GetMethod}{4}
\HyField@NewFlag{Submit}{SubmitCoordinates}{5}
\HyField@NewFlagOnly{Submit}{XFDF}{6}
\HyField@NewFlag{Submit}{IncludeAppendSaves}{7}
\HyField@NewFlag{Submit}{IncludeAnnotations}{8}
\HyField@NewFlagOnly{Submit}{SubmitPDF}{9}
\HyField@NewFlag{Submit}{CanonicalFormat}{10}
\HyField@NewFlag{Submit}{ExclNonUserAnnots}{11}
\HyField@NewFlag{Submit}{ExclFKey}{12}
\HyField@NewFlag{Submit}{EmbedForm}{14}
%    \end{macrocode}
%    \begin{macrocode}
\define@key{Field}{export}{%
  \lowercase{\def\Hy@temp{#1}}%
  \@ifundefined{Fld@export@\Hy@temp}{%
    \@onelevel@sanitize\Hy@temp
    \Hy@Error{%
      Unknown export format `\Hy@temp'.\MessageBreak
      Known formats are `FDF', `HTML', `XFDF', and `PDF'%
    }\@ehc
  }{%
    \let\Fld@export\Hy@temp
  }%
}
\def\Fld@export{fdf}
\@namedef{Fld@export@fdf}{0}%
\@namedef{Fld@export@html}{1}%
\@namedef{Fld@export@xfdf}{2}%
\@namedef{Fld@export@pdf}{3}%
%    \end{macrocode}
%
% \subsubsection{Set submit flags}
%
%    \begin{macro}{\HyField@FlagsSubmit}
%    \begin{macrocode}
\def\HyField@FlagsSubmit{%
  \bitsetReset{HyField@Submit}%
  \ifcase\@nameuse{Fld@export@\Fld@export} %
    % FDF
    \HyField@UseFlag{Submit}{IncludeNoValueFields}%
    \HyField@UseFlag{Submit}{SubmitCoordinates}%
    \HyField@UseFlag{Submit}{IncludeAppendSaves}%
    \HyField@UseFlag{Submit}{IncludeAnnotations}%
    \HyField@UseFlag{Submit}{CanonicalFormat}%
    \HyField@UseFlag{Submit}{ExclNonUserAnnots}%
    \HyField@UseFlag{Submit}{ExclFKey}%
    \HyField@UseFlag{Submit}{EmbedForm}%
  \or % HTML
    \HyField@SetFlag{Submit}{ExportFormat}%
    \HyField@UseFlag{Submit}{IncludeNoValueFields}%
    \HyField@UseFlag{Submit}{GetMethod}%
    \HyField@UseFlag{Submit}{SubmitCoordinates}%
    \HyField@UseFlag{Submit}{CanonicalFormat}%
  \or % XFDF
    \HyField@SetFlag{Submit}{XFDF}%
    \HyField@UseFlag{Submit}{IncludeNoValueFields}%
    \HyField@UseFlag{Submit}{SubmitCoordinates}%
    \HyField@UseFlag{Submit}{CanonicalFormat}%
  \or % PDF
    \HyField@SetFlag{Submit}{SubmitPDF}%
    \HyField@UseFlag{Submit}{GetMethod}%
  \fi
  \HyField@PrintFlags{Submit}{submit button field}%
  \bitsetIsEmpty{HyField@Submit}{%
    \let\Fld@submitflags\ltx@empty
  }{%
    \edef\Fld@submitflags{/Flags \bitsetGetDec{HyField@Submit}}%
  }%
}
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Set annot flags in fields}
%
%    \begin{macro}{\HyField@FlagsAnnot}
%    \begin{macrocode}
\def\HyField@FlagsAnnot#1{%
  \bitsetReset{HyField@F}%
  \HyField@UseFlag{F}{Invisible}%
  \HyField@UseFlag{F}{Hidden}%
  \HyField@UseFlag{F}{Print}%
  \HyField@UseFlag{F}{NoZoom}%
  \HyField@UseFlag{F}{NoRotate}%
  \HyField@UseFlag{F}{NoView}%
  \HyField@UseFlag{F}{Locked}%
  \HyField@UseFlag{F}{ToggleNoView}%
  \HyField@UseFlag{F}{LockedContents}%
  \HyField@PrintFlags{F}{#1}%
  \bitsetIsEmpty{HyField@F}{%
    \let\Fld@annotflags\ltx@empty
  }{%
    \edef\Fld@annotflags{/F \bitsetGetDec{HyField@F}}%
  }%
}
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Pushbutton field}
%
%    \begin{macro}{\HyField@FlagsPushButton}
%    \begin{macrocode}
\def\HyField@FlagsPushButton{%
  \HyField@FlagsAnnot{push button field}%
  \bitsetReset{HyField@Ff}%
  \HyField@UseFlag{Ff}{ReadOnly}%
  \HyField@UseFlag{Ff}{Required}%
  \HyField@UseFlag{Ff}{NoExport}%
  \HyField@SetFlag{Ff}{Pushbutton}%
  \HyField@PrintFlags{Ff}{push button field}%
  \bitsetIsEmpty{HyField@Ff}{%
    \let\Fld@flags\ltx@empty
  }{%
    \edef\Fld@flags{/Ff \bitsetGetDec{HyField@Ff}}%
  }%
}
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Check box field}
%
%    \begin{macro}{\HyField@FlagsCheckBox}
%    \begin{macrocode}
\def\HyField@FlagsCheckBox{%
  \HyField@FlagsAnnot{check box field}%
  \bitsetReset{HyField@Ff}%
  \HyField@UseFlag{Ff}{ReadOnly}%
  \HyField@UseFlag{Ff}{Required}%
  \HyField@UseFlag{Ff}{NoExport}%
  \HyField@PrintFlags{Ff}{check box field}%
  \bitsetIsEmpty{HyField@Ff}{%
    \let\Fld@flags\ltx@empty
  }{%
    \edef\Fld@flags{/Ff \bitsetGetDec{HyField@Ff}}%
  }%
}
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Radio button field}
%
%    \begin{macro}{\HyField@FlagsRadioButton}
%    \begin{macrocode}
\def\HyField@FlagsRadioButton{%
  \HyField@FlagsAnnot{radio button field}%
  \bitsetReset{HyField@Ff}%
  \HyField@UseFlag{Ff}{ReadOnly}%
  \HyField@UseFlag{Ff}{Required}%
  \HyField@UseFlag{Ff}{NoExport}%
  \HyField@UseFlag{Ff}{NoToggleToOff}%
  \HyField@SetFlag{Ff}{Radio}%
  \HyField@UseFlag{Ff}{RadiosInUnison}%
  \HyField@PrintFlags{Ff}{radio button field}%
  \bitsetIsEmpty{HyField@Ff}{%
    \let\Fld@flags\ltx@empty
  }{%
    \edef\Fld@flags{/Ff \bitsetGetDec{HyField@Ff}}%
  }%
}
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Text fields}
%
%    \begin{macro}{\HyField@FlagsText}
%    \begin{macrocode}
\def\HyField@FlagsText{%
  \HyField@FlagsAnnot{text field}%
  \bitsetReset{HyField@Ff}%
  \HyField@UseFlag{Ff}{ReadOnly}%
  \HyField@UseFlag{Ff}{Required}%
  \HyField@UseFlag{Ff}{NoExport}%
  \HyField@UseFlag{Ff}{Multiline}%
  \HyField@UseFlag{Ff}{Password}%
  \HyField@UseFlag{Ff}{FileSelect}%
  \HyField@UseFlag{Ff}{DoNotSpellCheck}%
  \HyField@UseFlag{Ff}{DoNotScroll}%
  \ifFld@comb
    \ifcase0\ifFld@multiline
            \else\ifFld@password
            \else\ifFld@fileselect
            \else 1\fi\fi\fi\relax
      \Hy@Error{%
        Field option `comb' cannot used together with\MessageBreak
        `multiline', `password', or `fileselect'%
      }\@ehc
    \else
      \HyField@UseFlag{Ff}{Comb}%
    \fi
  \fi
  \HyField@UseFlag{Ff}{RichText}%
  \HyField@PrintFlags{Ff}{text field}%
  \bitsetIsEmpty{HyField@Ff}{%
    \let\Fld@flags\ltx@empty
  }{%
    \edef\Fld@flags{/Ff \bitsetGetDec{HyField@Ff}}%
  }%
}
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Choice fields}
%
%    \begin{macro}{\HyField@FlagsChoice}
%    \begin{macrocode}
\def\HyField@FlagsChoice{%
  \HyField@FlagsAnnot{choice field}%
  \bitsetReset{HyField@Ff}%
  \HyField@UseFlag{Ff}{ReadOnly}%
  \HyField@UseFlag{Ff}{Required}%
  \HyField@UseFlag{Ff}{NoExport}%
  \HyField@UseFlag{Ff}{Combo}%
  \ifFld@combo
    \HyField@UseFlag{Ff}{Edit}%
  \fi
  \HyField@UseFlag{Ff}{Sort}%
  \HyField@UseFlag{Ff}{MultiSelect}%
  \ifFld@combo
    \ifFld@edit
      \HyField@UseFlag{Ff}{DoNotSpellCheck}%
    \fi
  \fi
  \HyField@UseFlag{Ff}{CommitOnSelChange}%
  \HyField@PrintFlags{Ff}{choice field}%
  \bitsetIsEmpty{HyField@Ff}{%
    \let\Fld@flags\ltx@empty
  }{%
    \edef\Fld@flags{/Ff \bitsetGetDec{HyField@Ff}}%
  }%
}
%    \end{macrocode}
%    \end{macro}
%
% \subsection{Choice field}
%
%    \begin{macro}{\HyField@PDFChoices}
%    |#1|: list of choices in key value syntax, key = exported name,
%    value = displayed text.\\
%    Input: \cs{Fld@default}, \cs{Fld@value}, \cs{ifFld@multiselect}\\
%    Result: \cs{Fld@choices} with entries: |/Opt|, |/DV|, |/V|, |/I|.
%    \begin{macrocode}
\def\HyField@PDFChoices#1{%
  \begingroup
    \global\let\Fld@choices\ltx@empty
    \let\HyTmp@optlist\ltx@empty
    \let\HyTmp@optitem\relax
    \count@=0 %
    \kv@parse{#1}{%
      \Hy@pdfstringdef\kv@key\kv@key
      \ifx\kv@value\relax
        \ifnum\Hy@pdfversion<3 % implementation note 122, PDF spec 1.7
          \xdef\Fld@choices{\Fld@choices[(\kv@key)(\kv@key)]}%
        \else
          \xdef\Fld@choices{\Fld@choices(\kv@key)}%
        \fi
      \else
        \Hy@pdfstringdef\kv@value\kv@value
        \xdef\Fld@choices{\Fld@choices[(\kv@value)(\kv@key)]}%
      \fi
      \edef\HyTmp@optlist{%
        \HyTmp@optlist
        \HyTmp@optitem{\the\count@}{\kv@key}0%
      }%
      \advance\count@ by 1 %
      \@gobbletwo
    }%
    \xdef\Fld@choices{/Opt[\Fld@choices]}%
    \ifFld@multiselect
      \HyField@@PDFChoices{DV}\Fld@default
      \HyField@@PDFChoices{V}\Fld@value
    \else
      \ifx\Fld@default\relax
      \else
        \pdfstringdef\Hy@gtemp\Fld@default
        \xdef\Fld@choices{\Fld@choices/DV(\Hy@gtemp)}%
      \fi
      \ifx\Fld@value\relax
      \else
        \pdfstringdef\Hy@gtemp\Fld@value
        \xdef\Fld@choices{\Fld@choices/V(\Hy@gtemp)}%
      \fi
    \fi
  \endgroup
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyField@@PDFChoices}
%    \begin{macrocode}
\def\HyField@@PDFChoices#1#2{%
  \ifx#2\relax
  \else
    \count@=0 %
    \def\HyTmp@optitem##1##2##3{%
      \def\HyTmp@key{##2}%
      \ifx\HyTmp@key\Hy@gtemp
        \expandafter\def\expandafter\HyTmp@optlist\expandafter{%
          \HyTmp@optlist
          \HyTmp@optitem{##1}{##2}1%
        }%
        \let\HyTmp@found=Y%
      \else
        \expandafter\def\expandafter\HyTmp@optlist\expandafter{%
          \HyTmp@optlist
          \HyTmp@optitem{##1}{##2}##3%
        }%
      \fi
    }%
    \expandafter\comma@parse\expandafter{#2}{%
      \pdfstringdef\Hy@gtemp\comma@entry
      \let\HyTmp@found=N %
      \expandafter\let\expandafter\HyTmp@optlist\expandafter\@empty
      \HyTmp@optlist
      \ifx\HyTmp@found Y%
        \advance\count@ by 1 %
      \else
        \@onelevel@sanitize\comma@entry
        \PackageWarning{hyperref}{%
          \string\ChoiceBox: Ignoring value `\comma@entry',%
          \MessageBreak
          it cannot be found in the choices%
        }%
      \fi
      \@gobble
    }%
    \def\HyTmp@optitem##1##2##3{%
      \ifnum##3=1 %
        (##2)%
      \fi
    }%
    \ifcase\count@
    \or
      \xdef\Fld@choices{\Fld@choices/#1\HyTmp@optlist}%
    \else
      \xdef\Fld@choices{\Fld@choices/#1[\HyTmp@optlist]}%
      \ifx#1V%
        \def\HyTmp@optitem##1##2##3{%
          \ifnum##3=1 %
            \@firstofone{ ##1}%
          \fi
        }%
        \edef\HyTmp@optlist{\HyTmp@optlist}%
        \xdef\Fld@choices{%
          \Fld@choices
          /I[\expandafter\@firstofone\HyTmp@optlist]%
        }%
      \fi
    \fi
  \fi
}
%    \end{macrocode}
%    \end{macro}
%
% \subsection{Forms}
%
%    \begin{macro}{\HyField@SetKeys}
%    \begin{macrocode}
\def\HyField@SetKeys{%
  \kvsetkeys{Field}%
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macrocode}
\newif\ifFld@checked
\newif\ifFld@disabled
\Fld@checkedfalse
\Fld@disabledfalse
\newcount\Fld@menulength
\newdimen\Field@Width
\newdimen\Fld@charsize
\Fld@charsize=10\p@
\def\Fld@maxlen{0}
\def\Fld@align{0}
\def\Fld@color{0 0 0 rg}
\def\Fld@bcolor{1 1 1}
\def\Fld@bordercolor{1 0 0}
\def\Fld@bordersep{1\p@}
\def\Fld@borderwidth{1}
\def\Fld@borderstyle{S}
\def\Fld@cbsymbol{4}
\def\Fld@radiosymbol{H}
\def\Fld@rotation{0}
\def\Form{\@ifnextchar[{\@Form}{\@Form[]}}
\def\endForm{\@endForm}
\newif\ifForm@html
\Form@htmlfalse
\def\Form@boolkey#1#2{%
  \csname Form@#2\ifx\relax#1\relax true\else#1\fi\endcsname
}
\define@key{Form}{action}{%
  \hyper@normalise\Hy@DefFormAction{#1}%
}
\def\Hy@DefFormAction{\def\Form@action}
\def\enc@@html{html}
\define@key{Form}{encoding}{%
  \def\Hy@tempa{#1}%
  \ifx\Hy@tempa\enc@@html
    \Form@htmltrue
    \def\Fld@export{html}%
  \else
    \Hy@Warning{%
       Form `encoding' key with \MessageBreak
       unknown value `#1'%
    }%
    \Form@htmlfalse
  \fi
}
\define@key{Form}{method}{%
  \lowercase{\def\Hy@temp{#1}}%
  \@ifundefined{Form@method@\Hy@temp}{%
    \@onelevel@sanitize\Hy@temp
    \Hy@Error{%
      Unknown method `\Hy@temp'.\MessageBreak
      Known values are `post' and `get'%
    }\@ehc
  }{%
    \let\Form@method\Hy@temp
    \ifcase\@nameuse{Form@method@\Hy@temp} %
      \Fld@getmethodfalse
    \else
      \Fld@getmethodtrue
    \fi
  }%
}
\def\Form@method{}
\@namedef{Form@method@post}{0}
\@namedef{Form@method@get}{1}
%    \end{macrocode}
%    \begin{macrocode}
\newif\ifHyField@NeedAppearances
\def\HyField@NeedAppearancesfalse{%
  \global\let\ifHyField@NeedAppearances\iffalse
}
\def\HyField@NeedAppearancestrue{%
  \global\let\ifHyField@NeedAppearances\iftrue
}
\HyField@NeedAppearancestrue
\define@key{Form}{NeedAppearances}[true]{%
  \edef\Hy@tempa{#1}%
  \ifx\Hy@tempa\Hy@true
    \HyField@NeedAppearancestrue
  \else
    \ifx\Hy@tempa\Hy@false
      \HyField@NeedAppearancesfalse
    \else
      \Hy@Error{%
        Unexpected value `\Hy@tempa'\MessageBreak
        of option `NeedAppearances' instead of\MessageBreak
        `true' or `false'%
      }\@ehc
    \fi
  \fi
}
\def\Field@boolkey#1#2{%
  \csname Fld@#2\ifx\relax#1\relax true\else#1\fi\endcsname
}
\ifHy@texht
  \newtoks\Field@toks
  \Field@toks={ }%
  \def\Field@addtoks#1#2{%
    \edef\@processme{\Field@toks{\the\Field@toks\space #1="#2"}}%
    \@processme
  }%
\else
  \def\Hy@WarnHTMLFieldOption#1{%
    \Hy@Warning{%
      HTML field option `#1'\MessageBreak
      is ignored%
    }%
  }%
\fi
\def\Fld@checkequals#1=#2=#3\\{%
  \def\@currDisplay{#1}%
  \ifx\\#2\\%
    \def\@currValue{#1}%
  \else
    \def\@currValue{#2}%
  \fi
}
\define@key{Field}{loc}{%
  \def\Fld@loc{#1}%
}
\define@key{Field}{checked}[true]{%
  \lowercase{\Field@boolkey{#1}}{checked}%
}
\define@key{Field}{disabled}[true]{%
  \lowercase{\Field@boolkey{#1}}{disabled}%
}
\ifHy@texht
  \define@key{Field}{accesskey}{%
    \Field@addtoks{accesskey}{#1}%
  }%
  \define@key{Field}{tabkey}{%
    \Field@addtoks{tabkey}{#1}%
  }%
\else
  \define@key{Field}{accesskey}{%
    \Hy@WarnHTMLFieldOption{accesskey}%
  }%
  \define@key{Field}{tabkey}{%
    \Hy@WarnHTMLFieldOption{tabkey}%
  }%
\fi
\define@key{Field}{name}{%
  \def\Fld@name{#1}%
}
\let\Fld@altname\relax
\define@key{Field}{altname}{%
  \def\Fld@altname{#1}%
}
\let\Fld@mappingname\relax
\define@key{Field}{mappingname}{%
  \def\Fld@mappingname{#1}%
}
\define@key{Field}{width}{%
  \def\Fld@width{#1}%
  \Field@Width#1\setbox0=\hbox{m}%
}
\define@key{Field}{maxlen}{%
  \def\Fld@maxlen{#1}%
}
\define@key{Field}{menulength}{%
  \Fld@menulength=#1\relax
}
\define@key{Field}{height}{%
  \def\Fld@height{#1}%
}
\define@key{Field}{charsize}{%
  \setlength{\Fld@charsize}{#1}%
}
\define@key{Field}{borderwidth}{%
  \Hy@defaultbp\Fld@borderwidth{#1}%
}
\def\Hy@defaultbp#1#2{%
  \begingroup
  \afterassignment\Hy@defaultbpAux
  \dimen@=#2bp\relax{#1}{#2}%
}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname dimexpr\endcsname\relax
  \def\Hy@defaultbpAux#1\relax#2#3{%
    \ifx!#1!%
      \endgroup
      \def#2{#3}%
    \else
      \dimen@=.99626\dimen@
      \edef\x{\endgroup
        \def\noexpand#2{%
          \strip@pt\dimen@
        }%
      }\x
    \fi
  }%
\else
  \def\Hy@defaultbpAux#1\relax#2#3{%
    \ifx!#1!%
      \endgroup
      \def#2{#3}%
    \else
      \edef\x{\endgroup
        \def\noexpand#2{%
          \strip@pt\dimexpr\dimen@*800/803\relax
        }%
      }\x
    \fi
  }%
\fi
\define@key{Field}{borderstyle}{%
  \let\Hy@temp\Fld@borderstyle
  \def\Fld@borderstyle{#1}%
  \Hy@Match\Fld@borderstyle{%
    ^[SDBIU]$%
  }{}{%
    \Hy@Warning{%
      Invalid value `\@pdfborderstyle'\MessageBreak
      for option `pdfborderstyle'. Valid values:\MessageBreak
      \space\space S (Solid), D (Dashed), B (Beveled),\MessageBreak
      \space\space I (Inset), U (Underline)\MessageBreak
      Option setting is ignored%
    }%
    \let\Fld@borderstyle\Hy@temp
  }%
}
\define@key{Field}{bordersep}{%
  \def\Fld@bordersep{#1}%
}
\define@key{Field}{default}{%
  \def\Fld@default{#1}%
}
\define@key{Field}{align}{%
  \def\Fld@align{#1}%
}
\define@key{Field}{value}{%
  \def\Fld@value{#1}%
}
\define@key{Field}{checkboxsymbol}{%
  \Fld@DingDef\Fld@cbsymbol{#1}%
}
\define@key{Field}{radiosymbol}{%
  \Fld@DingDef\Fld@radiosymbol{#1}%
}
\def\Fld@DingDef#1#2{%
  \let\Fld@temp\ltx@empty
  \Fld@@DingDef#2\ding{}\@nil
  \let#1\Fld@temp
}
\def\Fld@@DingDef#1\ding#2#3\@nil{%
  \expandafter\def\expandafter\Fld@temp\expandafter{%
    \Fld@temp
    #1%
  }%
  \ifx\\#3\\%
    \expandafter\@gobble
  \else
    \begingroup
      \lccode`0=#2\relax
    \lowercase{\endgroup
      \expandafter\def\expandafter\Fld@temp\expandafter{%
        \Fld@temp
        0%
      }%
    }%
    \expandafter\@firstofone
  \fi
  {%
    \Fld@@DingDef#3\@nil
  }%
}
%    \end{macrocode}
%    \begin{macrocode}
\define@key{Field}{rotation}{%
  \def\Fld@rotation{#1}%
}
%    \end{macrocode}
%    \begin{macrocode}
\define@key{Field}{backgroundcolor}{%
  \HyColor@FieldBColor{#1}\Fld@bcolor{hyperref}{backgroundcolor}%
}
\define@key{Field}{bordercolor}{%
  \HyColor@FieldBColor{#1}\Fld@bordercolor{hyperref}{bordercolor}%
}
\define@key{Field}{color}{%
  \HyColor@FieldColor{#1}\Fld@color{hyperref}{color}%
}
%    \end{macrocode}
%    \begin{macrocode}
\let\Fld@onclick@code\ltx@empty
\let\Fld@format@code\ltx@empty
\let\Fld@validate@code\ltx@empty
\let\Fld@calculate@code\ltx@empty
\let\Fld@keystroke@code\ltx@empty
\let\Fld@onfocus@code\ltx@empty
\let\Fld@onblur@code\ltx@empty
\let\Fld@onmousedown@code\ltx@empty
\let\Fld@onmouseup@code\ltx@empty
\let\Fld@onenter@code\ltx@empty
\let\Fld@onexit@code\ltx@empty
\def\Hy@temp#1{%
  \expandafter\Hy@@temp\csname Fld@#1@code\endcsname{#1}%
}
\def\Hy@@temp#1#2{%
  \ifHy@pdfa
    \define@key{Field}{#2}{%
      \Hy@Error{%
        PDF/A: Additional action `#2' is prohibited%
      }\@ehc
    }%
  \else
    \define@key{Field}{#2}{%
      \def#1{##1}%
    }%
  \fi
}
\Hy@temp{keystroke}
\Hy@temp{format}
\Hy@temp{validate}
\Hy@temp{calculate}
\Hy@temp{onfocus}
\Hy@temp{onblur}
\Hy@temp{onenter}
\Hy@temp{onexit}
\ifHy@texht
  \def\Hy@temp#1{%
    \define@key{Field}{#1}{%
      \Field@addtoks{#1}{##1}%
    }%
  }%
\else
  \def\Hy@temp#1{%
    \define@key{Field}{#1}{%
      \Hy@WarnHTMLFieldOption{#1}%
    }%
  }%
\fi
\Hy@temp{ondblclick}
\Hy@temp{onmousedown}
\Hy@temp{onmouseup}
\Hy@temp{onmouseover}
\Hy@temp{onmousemove}
\Hy@temp{onmouseout}
\Hy@temp{onkeydown}
\Hy@temp{onkeyup}
\Hy@temp{onselect}
\Hy@temp{onchange}
\Hy@temp{onkeypress}
\ifHy@texht
  \define@key{Field}{onclick}{%
    \Field@addtoks{onclick}{#1}%
  }%
\else
  \ifHy@pdfa
    \define@key{Field}{onclick}{%
      \Hy@Error{%
        PDF/A: Action `onclick' is prohibited%
      }\@ehc
    }%
  \else
    \define@key{Field}{onclick}{%
      \def\Fld@onclick@code{#1}%
    }%
  \fi
\fi
%    \end{macrocode}
%    \begin{macrocode}
\DeclareRobustCommand\TextField{%
  \@ifnextchar[{\@TextField}{\@TextField[]}%
}
\DeclareRobustCommand\ChoiceMenu{%
  \@ifnextchar[{\@ChoiceMenu}{\@ChoiceMenu[]}%
}
\DeclareRobustCommand\CheckBox{%
  \@ifnextchar[{\@CheckBox}{\@CheckBox[]}%
}
\DeclareRobustCommand\PushButton{%
  \@ifnextchar[{\@PushButton}{\@PushButton[]}%
}
\DeclareRobustCommand\Gauge{%
  \@ifnextchar[{\@Gauge}{\@Gauge[]}%
}
\DeclareRobustCommand\Submit{%
  \@ifnextchar[{\@Submit}{\@Submit[]}%
}
\DeclareRobustCommand\Reset{%
  \@ifnextchar[{\@Reset}{\@Reset[]}%
}
\def\LayoutTextField#1#2{% label, field
  #1 #2%
}
\def\LayoutChoiceField#1#2{% label, field
  #1 #2%
}
\def\LayoutCheckField#1#2{% label, field
  #1 #2%
}
\def\LayoutPushButtonField#1{% button
  #1%
}
\def\MakeRadioField#1#2{\vbox to #2{\hbox to #1{\hfill}\vfill}}
\def\MakeCheckField#1#2{\vbox to #2{\hbox to #1{\hfill}\vfill}}
\def\MakeTextField#1#2{\vbox to #2{\hbox to #1{\hfill}\vfill}}
\def\MakeChoiceField#1#2{\vbox to #2{\hbox to #1{\hfill}\vfill}}
\def\MakeButtonField#1{%
  \sbox0{%
    \hskip\Fld@borderwidth bp#1\hskip\Fld@borderwidth bp%
  }%
  \@tempdima\ht0 %
  \advance\@tempdima by \Fld@borderwidth bp %
  \advance\@tempdima by \Fld@borderwidth bp %
  \ht0\@tempdima
  \@tempdima\dp0 %
  \advance\@tempdima by \Fld@borderwidth bp %
  \advance\@tempdima by \Fld@borderwidth bp %
  \dp0\@tempdima
  \box0\relax
}
\def\DefaultHeightofSubmit{14pt}
\def\DefaultWidthofSubmit{2cm}
\def\DefaultHeightofReset{14pt}
\def\DefaultWidthofReset{2cm}
\def\DefaultHeightofCheckBox{\baselineskip}
\def\DefaultWidthofCheckBox{\baselineskip}
\def\DefaultHeightofChoiceMenu{\baselineskip}
\def\DefaultWidthofChoiceMenu{\baselineskip}
\def\DefaultHeightofText{\baselineskip}
\def\DefaultHeightofTextMultiline{4\baselineskip}
\def\DefaultWidthofText{3cm}
\def\DefaultOptionsofSubmit{print,name=Submit,noexport}
\def\DefaultOptionsofReset{print,name=Reset,noexport}
\def\DefaultOptionsofPushButton{print}
\def\DefaultOptionsofCheckBox{print}
\def\DefaultOptionsofText{print}
%    \end{macrocode}
%    Default options for the types of \cs{ChoiceMenu}.
%    \begin{macrocode}
\def\DefaultOptionsofListBox{print}
\def\DefaultOptionsofComboBox{print,edit,sort}
\def\DefaultOptionsofPopdownBox{print}
\def\DefaultOptionsofRadio{print,notoggletooff}
%    \end{macrocode}
%
% \section{Setup}
%    \begin{macrocode}
\ifHy@hyperfigures
  \Hy@Info{Hyper figures ON}%
\else
  \Hy@Info{Hyper figures OFF}%
\fi
\ifHy@nesting
  \Hy@Info{Link nesting ON}%
\else
  \Hy@Info{Link nesting OFF}%
\fi
\ifHy@hyperindex
  \Hy@Info{Hyper index ON}%
\else
  \Hy@Info{Hyper index OFF}%
\fi
\ifHy@backref
  \Hy@Info{backreferencing ON}%
\else
  \Hy@Info{backreferencing OFF}%
\fi
\ifHy@colorlinks
  \Hy@Info{Link coloring ON}%
\else
  \Hy@Info{Link coloring OFF}%
\fi
\ifHy@ocgcolorlinks
  \Hy@Info{Link coloring with OCG ON}%
\else
  \Hy@Info{Link coloring with OCG OFF}%
\fi
\ifHy@pdfa
  \Hy@Info{PDF/A mode ON}%
\else
  \Hy@Info{PDF/A mode OFF}%
\fi
%    \end{macrocode}
% \section{Low-level utility macros}
% We need unrestricted access to the |#|, |~| and |"| characters, so make
% them nice macros.
%    \begin{macrocode}
\edef\hyper@hash{\string#}
\edef\hyper@tilde{\string~}
\edef\hyper@quote{\string"}
%    \end{macrocode}
%    Support \cs{label} before |\begin{document}|.
%    \begin{macrocode}
\def\@currentHref{Doc-Start}
\let\Hy@footnote@currentHref\@empty
%    \end{macrocode}
% We give the start of document a special label; this is used
% in backreferencing-by-section, to allow for cites before
% any sectioning commands. Set up PDF info.
%    \begin{macrocode}
\Hy@AtBeginDocument{%
  \Hy@pdfstringtrue
  \PDF@SetupDoc
  \let\PDF@SetupDoc\@empty
  \Hy@DisableOption{pdfpagescrop}%
  \Hy@DisableOption{pdfpagemode}%
  \Hy@DisableOption{pdfnonfullscreenpagemode}%
  \Hy@DisableOption{pdfdirection}%
  \Hy@DisableOption{pdfviewarea}%
  \Hy@DisableOption{pdfviewclip}%
  \Hy@DisableOption{pdfprintarea}%
  \Hy@DisableOption{pdfprintclip}%
  \Hy@DisableOption{pdfprintscaling}%
  \Hy@DisableOption{pdfduplex}%
  \Hy@DisableOption{pdfpicktraybypdfsize}%
  \Hy@DisableOption{pdfprintpagerange}%
  \Hy@DisableOption{pdfnumcopies}%
  \Hy@DisableOption{pdfstartview}%
  \Hy@DisableOption{pdfstartpage}%
  \Hy@DisableOption{pdftoolbar}%
  \Hy@DisableOption{pdfmenubar}%
  \Hy@DisableOption{pdfwindowui}%
  \Hy@DisableOption{pdffitwindow}%
  \Hy@DisableOption{pdfcenterwindow}%
  \Hy@DisableOption{pdfdisplaydoctitle}%
  \Hy@DisableOption{pdfpagelayout}%
  \Hy@DisableOption{pdflang}%
  \Hy@DisableOption{baseurl}%
  \ifHy@texht\else\hyper@anchorstart{Doc-Start}\hyper@anchorend\fi
  \Hy@pdfstringfalse
}
%    \end{macrocode}

%    Ignore star from referencing macros:
%    \begin{macrocode}
\LetLtxMacro\NoHy@OrgRef\ref
\DeclareRobustCommand*{\ref}{%
  \@ifstar\NoHy@OrgRef\NoHy@OrgRef
}
\LetLtxMacro\NoHy@OrgPageRef\pageref
\DeclareRobustCommand*{\pageref}{%
  \@ifstar\NoHy@OrgPageRef\NoHy@OrgPageRef
}
%    \end{macrocode}
%
% \section{Localized nullifying of package}
% Sometimes we just don't want the wretched package interfering
% with us. Define an environment we can put in manually, or include
% in a style file, which stops the hypertext functions doing anything.
% This is used, for instance, in the Elsevier classes, to stop
% |hyperref| playing havoc in the front matter.
%    \begin{macrocode}
\def\NoHyper{%
  \def\hyper@link@[##1]##2##3##4{##4\Hy@xspace@end}%
  \def\hyper@@anchor##1##2{##2\Hy@xspace@end}%
  \global\let\hyper@livelink\hyper@link
  \gdef\hyper@link##1##2##3{##3\Hy@xspace@end}%
  \let\hyper@anchor\ltx@gobble
  \let\hyper@anchorstart\ltx@gobble
  \def\hyper@anchorend{\Hy@xspace@end}%
  \let\hyper@linkstart\ltx@gobbletwo
  \def\hyper@linkend{\Hy@xspace@end}%
  \def\hyper@linkurl##1##2{##1\Hy@xspace@end}%
  \def\hyper@linkfile##1##2##3{##1\Hy@xspace@end}%
  \let\Hy@backout\@gobble
}
\def\stop@hyper{%
  \def\hyper@link@[##1]##2##3##4{##4\Hy@xspace@end}%
  \let\Hy@backout\@gobble
  \let\hyper@@anchor\ltx@gobble
  \def\hyper@link##1##2##3{##3\Hy@xspace@end}%
  \let\hyper@anchor\ltx@gobble
  \let\hyper@anchorstart\ltx@gobble
  \def\hyper@anchorend{\Hy@xspace@end}%
  \let\hyper@linkstart\ltx@gobbletwo
  \def\hyper@linkend{\Hy@xspace@end}%
  \def\hyper@linkurl##1##2{##1\Hy@xspace@end}%
  \def\hyper@linkfile##1##2##3{##1\Hy@xspace@end}%
}
\def\endNoHyper{%
  \global\let\hyper@link\hyper@livelink
}
%</package>
%    \end{macrocode}
%
% \section{Package nohyperref}
%
%    This package is introduced by Sebastian Rahtz.
%
%    Package nohyperref is a dummy package that defines
%    some low level and some top-level commands.
%    It is done for jadetex, which calls hyperref
%    low-level commands, but it would also be useful with people using
%    normal hyperref, who really do not want the package loaded at all.
%
%    Some low-level commands:
%    \begin{macrocode}
%<*nohyperref>
\RequirePackage{letltxmacro}[2008/06/13]
\let\hyper@@anchor\@gobble
\def\hyper@link#1#2#3{#3}%
\let\hyper@anchorstart\@gobble
\let\hyper@anchorend\@empty
\let\hyper@linkstart\@gobbletwo
\let\hyper@linkend\@empty
\def\hyper@linkurl#1#2{#1}%
\def\hyper@linkfile#1#2#3{#1}%
\def\hyper@link@[#1]#2#3{}%
\let\PDF@SetupDoc\@empty
\let\PDF@FinishDoc\@empty
\def\nohyperpage#1{#1}
%    \end{macrocode}
%    Some top-level commands:
%    \begin{macrocode}
\def\Acrobatmenu#1#2{\leavevmode#2}
\let\pdfstringdefDisableCommands\@gobbletwo
\let\texorpdfstring\@firstoftwo
\let\pdfbookmark\@undefined
\newcommand\pdfbookmark[3][]{}
\let\phantomsection\@empty
\let\hypersetup\@gobble
\let\hyperbaseurl\@gobble
\newcommand*{\href}[3][]{#3}
\let\hyperdef\@gobbletwo
\let\hyperlink\@gobble
\let\hypertarget\@gobble
\def\hyperref{%
  \@ifnextchar[\@gobbleopt{\expandafter\@gobbletwo\@gobble}%
}
\long\def\@gobbleopt[#1]{}
\let\hyperpage\@empty
%    \end{macrocode}
%    Ignore star from referencing macros:
%    \begin{macrocode}
\LetLtxMacro\NoHy@OrgRef\ref
\DeclareRobustCommand*{\ref}{%
  \@ifstar\NoHy@OrgRef\NoHy@OrgRef
}
\LetLtxMacro\NoHy@OrgPageRef\pageref
\DeclareRobustCommand*{\pageref}{%
  \@ifstar\NoHy@OrgPageRef\NoHy@OrgPageRef
}
%</nohyperref>
%    \end{macrocode}
%
% \section{The Mangling Of Aux and Toc Files}
% Some extra tests so that the hyperref package may be removed or added
% to a document without having to remove .aux and .toc files
% (this section is by David Carlisle)
% All the code is delayed to |\begin{document}|
%    \begin{macrocode}
%<*package>
\Hy@AtBeginDocument{%
%    \end{macrocode}
% First the code to deal with removing the hyperref package from
% a document.
%
% Write some stuff into the aux file so if the next run is done
% without hyperref, then |\contentsline| and |\newlabel| are defined
% to cope with the extra arguments.
%    \begin{macrocode}
  \if@filesw
    \ifHy@typexml
      \immediate\closeout\@mainaux
      \immediate\openout\@mainaux\jobname.aux\relax
      \immediate\write\@auxout{<relaxxml>\relax}%
    \fi
    \immediate\write\@auxout{%
      \string\providecommand\string\HyperFirstAtBeginDocument{%
        \string\AtBeginDocument}^^J%
      \string\HyperFirstAtBeginDocument{%
        \string\ifx\string\hyper@anchor\string\@undefined^^J%
          \string\global\string\let\string\oldcontentsline\string\contentsline^^J%
          \string\gdef\string\contentsline%
            \string#1\string#2\string#3\string#4{%
            \string\oldcontentsline%
              {\string#1}{\string#2}{\string#3}}^^J%
          \string\global\string\let\string\oldnewlabel\string\newlabel^^J%
          \string\gdef\string\newlabel\string#1\string#2{%
             \string\newlabelxx{\string#1}\string#2}^^J%
          \string\gdef\string\newlabelxx%
             \string#1\string#2\string#3\string#4\string#5\string#6{%
             \string\oldnewlabel{\string#1}{{\string#2}{\string#3}}}^^J%
%    \end{macrocode}
%
% But the new aux file will be read again at the end, with the normal
% definitions expected, so better put things back as they were.
%    \begin{macrocode}
          \string\AtEndDocument{%
            \string\ifx\string\hyper@anchor\string\@undefined^^J%
              \string\let\string\contentsline\string\oldcontentsline^^J%
              \string\let\string\newlabel\string\oldnewlabel^^J%
            \string\fi%
          }^^J%
%    \end{macrocode}
%
% If the document is being run with hyperref put this definition
% into the aux file, so we can spot it on the next run.
%    \begin{macrocode}
        \string\fi%
      }^^J%
      \string\global\string\let\string\hyper@last\relax^^J%
      \string\gdef\string\HyperFirstAtBeginDocument\string#1{\string#1}%
    }%
  \fi
  \let\HyperFirstAtBeginDocument\ltx@firstofone
%    \end{macrocode}
%
% Now the code to deal with adding the hyperref package to a document
% with aux and toc written the standard way.
%
% If hyperref was used last time, do nothing. If it was not used,
% or an old version of hyperref was used, don't use that TOC at all
% but generate a warning. Not ideal, but better than failing
% with pre-5.0 hyperref TOCs.
%    \begin{macrocode}
  \ifx\hyper@last\@undefined
    \def\@starttoc#1{%
      \begingroup
        \makeatletter
        \IfFileExists{\jobname.#1}{%
          \Hy@WarningNoLine{%
            old #1 file detected, not used; run LaTeX again%
          }%
        }{}%
        \if@filesw
          \expandafter\newwrite\csname tf@#1\endcsname
          \immediate\openout\csname tf@#1\endcsname \jobname.#1\relax
        \fi
        \@nobreakfalse
      \endgroup
    }%
    \def\newlabel#1#2{\@newl@bel r{#1}{#2{}{}{}{}}}%
  \fi
}
%    \end{macrocode}
%
% \section{Title strings}
%
%    If options |pdftitle| and |pdfauthor| are not used,
%    these informations for the pdf information dictionary
%    can be extracted by the \title and \author.
%    \begin{macrocode}
\ifHy@pdfusetitle
  \let\HyOrg@title\title
  \let\HyOrg@author\author
  \def\title{\@ifnextchar[{\Hy@scanopttitle}{\Hy@scantitle}}%
  \def\Hy@scanopttitle[#1]{%
    \gdef\Hy@title{#1}%
    \HyOrg@title[{#1}]%
  }%
  \def\Hy@scantitle#1{%
    \gdef\Hy@title{#1}%
    \HyOrg@title{#1}%
  }%
  \def\author{\@ifnextchar[{\Hy@scanoptauthor}{\Hy@scanauthor}}%
  \def\Hy@scanoptauthor[#1]{%
    \gdef\Hy@author{#1}%
    \HyOrg@author[{#1}]%
  }%
  \def\Hy@scanauthor#1{%
    \gdef\Hy@author{#1}%
    \HyOrg@author{#1}%
  }%
%    \end{macrocode}
%
%    The case, that \title, or \author are given before
%    hyperref is loaded, is much more complicate, because
%    LaTeX initializes the macros \@title and \@author with
%    LaTeX error and warning messages.
%    \begin{macrocode}
  \begingroup
    \def\process@me#1\@nil#2{%
      \expandafter\let\expandafter\x\csname @#2\endcsname
      \edef\y{\expandafter\strip@prefix\meaning\x}%
      \def\c##1#1##2\@nil{%
        \ifx\\##1\\%
        \else
         \expandafter\gdef\csname Hy@#2\expandafter\endcsname
              \expandafter{\x}%
        \fi
      }%
      \expandafter\c\y\relax#1\@nil
    }%
    \expandafter\process@me\string\@latex@\@nil{title}%
    \expandafter\process@me\string\@latex@\@nil{author}%
  \endgroup
\fi
\Hy@DisableOption{pdfusetitle}
%    \end{macrocode}
%
%    Macro |\Hy@UseMaketitleInfos| is used in the driver files,
%    before the information entries are used.
%
%    The newline macro |\newline| or |\\| is much more
%    complicate. In the title a good replacement can be
%    a space, but can be already a space after |\\| in
%    the title string. So this space is removed by
%    scanning for the next non-empty argument.
%
%    In the macro |\author| the newline can perhaps
%    separate the different authors, so the newline
%    expands here to a comma with space.
%
%    The possible arguments such as space or the optional
%    argument after the newline macros are not detected.
%
%    \begin{macrocode}
\def\Hy@UseMaketitleString#1{%
  \ltx@IfUndefined{Hy@#1}{}{%
    \begingroup
      \let\Hy@saved@hook\pdfstringdefPreHook
      \pdfstringdefDisableCommands{%
        \expandafter\let\expandafter\\\csname Hy@newline@#1\endcsname
        \let\newline\\%
      }%
      \expandafter\ifx\csname @pdf#1\endcsname\@empty
        \expandafter\pdfstringdef\csname @pdf#1\endcsname{%
          \csname Hy@#1\endcsname\@empty
        }%
      \fi
      \global\let\pdfstringdefPreHook\Hy@saved@hook
    \endgroup
  }%
}
\def\Hy@newline@title#1{ #1}
\def\Hy@newline@author#1{, #1}
\def\Hy@UseMaketitleInfos{%
  \Hy@UseMaketitleString{title}%
  \Hy@UseMaketitleString{author}%
}
%    \end{macrocode}
%
% \section{Page numbers}
%    This stuff is done by Heiko Oberdiek.
%
% \section{Every page}
%
%    \begin{macrocode}
\RequirePackage{atbegshi}[2007/09/09]
\let\Hy@EveryPageHook\ltx@empty
\let\Hy@EveryPageBoxHook\ltx@empty
\let\Hy@FirstPageHook\ltx@empty
\AtBeginShipout{%
  \Hy@EveryPageHook
  \ifx\Hy@EveryPageBoxHook\ltx@empty
  \else
    \setbox\AtBeginShipoutBox=\vbox{%
      \offinterlineskip
      \Hy@EveryPageBoxHook
      \box\AtBeginShipoutBox
    }%
  \fi
}
\AtBeginShipoutFirst{%
  \Hy@FirstPageHook
}
\g@addto@macro\Hy@FirstPageHook{%
  \PDF@FinishDoc
  \global\let\PDF@FinishDoc\ltx@empty
}
%    \end{macrocode}
%
% \subsection{PDF /PageLabels}
%    Internal macros of this module are marked with |\HyPL@|.
%
%    \begin{macrocode}
\ifHy@pdfpagelabels
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname thepage\endcsname\relax
    \Hy@pdfpagelabelsfalse
    \Hy@WarningNoLine{%
      Option `pdfpagelabels' is turned off\MessageBreak
      because \string\thepage\space is undefined%
    }%
    \csname fi\endcsname
    \csname iffalse\expandafter\endcsname
  \fi
%    \end{macrocode}
%
%    \begin{macro}{\thispdfpagelabel}
%    The command \cmd{\thispdfpagelabel} allows to label a special
%    page without the redefinition of \cmd{\thepage} for the page.
%    \begin{macrocode}
  \def\thispdfpagelabel#1{%
    \gdef\HyPL@thisLabel{#1}%
  }%
  \global\let\HyPL@thisLabel\relax
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\HyPL@Labels}
%    The page labels are collected in \cmd{\HyPL@Labels} and
%    set at the end of the document.
%    \begin{macrocode}
  \let\HyPL@Labels\ltx@empty
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Hy@abspage}
%    We have to know the the absolute page number and introduce
%    a new counter for that.
%    \begin{macrocode}
  \newcount\Hy@abspage
  \Hy@abspage=0 %
%    \end{macrocode}
%    \end{macro}
%    For comparisons with the values of the previous page, some
%    variables are needed:
%    \begin{macrocode}
  \def\HyPL@LastType{init}%
  \def\HyPL@LastNumber{0}%
  \let\HyPL@LastPrefix\ltx@empty
%    \end{macrocode}
%    Definitions for the PDF names of the \LaTeX{} pendents.
%    \begin{macrocode}
  \def\HyPL@arabic{D}%
  \def\HyPL@Roman{R}%
  \def\HyPL@roman{r}%
  \def\HyPL@Alph{A}%
  \def\HyPL@alph{a}%
%    \end{macrocode}
%
%    \begin{macrocode}
  \let\HyPL@SlidesSetPage\ltx@empty
  \ltx@ifclassloaded{slides}{%
    \def\HyPL@SlidesSetPage{%
      \advance\c@page\ltx@one
      \ifnum\value{page}>\ltx@one
        \protected@edef\HyPL@SlidesOptionalPage{%
          \Hy@SlidesFormatOptionalPage{\thepage}%
        }%
      \else
        \let\HyPL@SlidesOptionalPage\ltx@empty
      \fi
      \advance\c@page-\ltx@one
      \def\HyPL@page{%
        \csname the\Hy@SlidesPage\endcsname
        \HyPL@SlidesOptionalPage
      }%
    }%
  }{}%
%    \end{macrocode}
%
%    \begin{macro}{\HyPL@EveryPage}
%    If a page is shipout and the page number is known,
%    \cmd{\HyPL@EveryPage} has to be called. It stores the
%    current page label.
%    \begin{macrocode}
  \def\HyPL@EveryPage{%
    \begingroup
      \ifx\HyPL@thisLabel\relax
        \let\HyPL@page\thepage
        \HyPL@SlidesSetPage
      \else
        \let\HyPL@page\HyPL@thisLabel
        \global\let\HyPL@thisLabel\relax
      \fi
      \let\HyPL@Type\relax
      \ifnum\c@page>0 %
        \ifx\HyPL@SlidesSetPage\ltx@empty
          \expandafter\HyPL@CheckThePage\HyPL@page\@nil
        \fi
      \fi
      \let\Hy@temp Y%
      \ifx\HyPL@Type\HyPL@LastType
      \else
        \let\Hy@temp N%
      \fi
      \ifx\HyPL@Type\relax
         \pdfstringdef\HyPL@Prefix{\HyPL@page}%
      \else
         \pdfstringdef\HyPL@Prefix\HyPL@Prefix
      \fi
      \ifx\HyPL@Prefix\HyPL@LastPrefix
      \else
        \let\Hy@temp N%
      \fi
      \if Y\Hy@temp
        \advance\c@page by -1 %
        \ifnum\HyPL@LastNumber=\the\c@page\relax
        \else
          \let\Hy@temp N%
        \fi
        \Hy@StepCount\c@page
      \fi
      \if N\Hy@temp
        \ifx\HyPL@Type\relax
          \HyPL@StorePageLabel{/P(\HyPL@Prefix)}%
        \else
          \HyPL@StorePageLabel{%
            \ifx\HyPL@Prefix\@empty
            \else
              /P(\HyPL@Prefix)%
            \fi
            /S/\csname HyPL\HyPL@Type\endcsname
            \ifnum\the\c@page=1 %
            \else
              \space/St \the\c@page
            \fi
          }%
        \fi
      \fi
      \xdef\HyPL@LastNumber{\the\c@page}%
      \global\let\HyPL@LastType\HyPL@Type
      \global\let\HyPL@LastPrefix\HyPL@Prefix
    \endgroup
    \Hy@GlobalStepCount\Hy@abspage
  }%
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\HyPL@CheckThePage}
%    Macro \cmd{\HyPL@CheckThePage} calls \cmd{\HyPL@@CheckThePage}
%    that does the job.
%    \begin{macrocode}
  \def\HyPL@CheckThePage#1\@nil{%
    \HyPL@@CheckThePage{#1}#1\csname\endcsname\c@page\@nil
  }%
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyPL@@CheckThePage}
%    The first check is, is \cmd{\thepage} is defined
%    such as in \LaTeX, e.\,g.: |\csname @arabic\endcsname\c@page|.
%    In the current implemenation the check fails, if there is
%    another \cmd{\csname} before.
%
%    The second check tries to detect |\arabic{page}| at the
%    end of the definition text of \cmd{\thepage}.
%    \begin{macrocode}
  \def\HyPL@@CheckThePage#1#2\csname#3\endcsname\c@page#4\@nil{%
    \def\Hy@tempa{#4}%
    \def\Hy@tempb{\csname\endcsname\c@page}%
    \ifx\Hy@tempa\Hy@tempb
      \expandafter\ifx\csname HyPL#3\endcsname\relax
      \else
        \def\HyPL@Type{#3}%
        \def\HyPL@Prefix{#2}%
      \fi
    \else
      \begingroup
        \let\Hy@next\endgroup
        \let\HyPL@found\@undefined
        \def\arabic{\HyPL@Format{arabic}}%
        \def\Roman{\HyPL@Format{Roman}}%
        \def\roman{\HyPL@Format{roman}}%
        \def\Alph{\HyPL@Format{Alph}}%
        \def\alph{\HyPL@Format{alph}}%
        \protected@edef\Hy@temp{#1}%
        \ifx\HyPL@found\relax
          \toks@\expandafter{\Hy@temp}%
          \edef\Hy@next{\endgroup
            \noexpand\HyPL@@@CheckThePage\the\toks@
               \noexpand\HyPL@found\relax\noexpand\@nil
          }%
        \fi
      \Hy@next
    \fi
  }%
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\HyPL@Format}
%    The help macro \cmd{\HyPL@Format} is executed while
%    a \cmd{\protected@edef} in the second check
%    method of \cmd{\HyPL@@CheckPage}.
%    The first occurences of, for example, |\arabic{page}| is
%    marked by \cmd{\HyPL@found} that is also defined by
%    \cmd{\csname}.
%    \begin{macrocode}
  \def\HyPL@Format#1#2{%
    \ifx\HyPL@found\@undefined
      \expandafter\ifx\csname c@#2\endcsname\c@page
        \expandafter\noexpand\csname HyPL@found\endcsname{#1}%
      \else
        \expandafter\noexpand\csname#1\endcsname{#2}%
      \fi
    \else
      \expandafter\noexpand\csname#1\endcsname{#2}%
    \fi
  }%
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\HyPL@@@CheckThePage}
%    If the second check method is successful,
%    \cmd{\HyPL@@@CheckThePage} scans the result of
%    \cmd{\HyPL@Format} and stores the found values.
%    \begin{macrocode}
  \def\HyPL@@@CheckThePage#1\HyPL@found#2#3\@nil{%
    \def\Hy@tempa{#3}%
    \def\Hy@tempb{\HyPL@found\relax}%
    \ifx\Hy@tempa\Hy@tempb
      \def\HyPL@Type{@#2}%
      \def\HyPL@Prefix{#1}%
    \fi
  }%
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\HyPL@StorePageLabel}
%    Dummy for drivers that does not support /PageLabel.
%    \begin{macrocode}
  \providecommand*{\HyPL@StorePageLabel}[1]{}%
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\HyPL@Useless}
%    The |/PageLabels| entry does not make sense,
%    if the absolute page numbers and the page labels are the
%    same. Then \cmd{\HyPL@Labels} has the meaning of \cmd{\HyPL@Useless}.
%    \begin{macrocode}
  \def\HyPL@Useless{0<</S/D>>}%
  \@onelevel@sanitize\HyPL@Useless
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\HyPL@SetPageLabels}
%    The page labels are written to the PDF cataloge.
%    The command \cmd{\Hy@PutCatalog} is defined in the
%    driver files.
%    \begin{macrocode}
  \def\HyPL@SetPageLabels{%
    \@onelevel@sanitize\HyPL@Labels
    \ifx\HyPL@Labels\@empty
    \else
      \ifx\HyPL@Labels\HyPL@Useless
      \else
        \Hy@PutCatalog{/PageLabels<</Nums[\HyPL@Labels]>>}%
      \fi
    \fi
  }%
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macrocode}
  \g@addto@macro\Hy@EveryPageHook{\HyPL@EveryPage}%
\fi
%    \end{macrocode}
%
%    Option `pdfpagelabels' has been used and is now disabled.
%    \begin{macrocode}
\Hy@DisableOption{pdfpagelabels}
%    \end{macrocode}
%
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
% \subsubsection{pdfTeX and VTeX}
%
%    Because of pdfTeX's \cmd{\pdfcatalog} command
%    the /PageLabels entry can set at end of document
%    in the first run.
%
%    \begin{macro}{\Hy@PutCatalog}
%    \begin{macrocode}
%<*pdftex>
\pdf@ifdraftmode{%
  \let\Hy@PutCatalog\ltx@gobble
}{%
  \let\Hy@PutCatalog\pdfcatalog
}
%</pdftex>
%    \end{macrocode}
%    The code for VTeX is more complicate, because it does
%    not allow the direct access to the /Catalog object.
%    The command scans its argument and looks
%    for a /PageLabels entry.
%
%    VTeX 6.59g is the first version, that
%    implements \verb|\special{!pdfpagelabels...}|.
%    For this version \cmd{\VTeXversion} reports 660.
%    \begin{macrocode}
%<*vtex>
\providecommand*{\XR@ext}{pdf}
\edef\Hy@VTeXversion{%
  \ifx\VTeXversion\@undefined
    \z@
  \else
    \ifx\VTeXversion\relax
      \z@
    \else
      \VTeXversion
    \fi
  \fi
}
\begingroup
  \ifnum\Hy@VTeXversion<660 %
    \gdef\Hy@PutCatalog#1{%
      \Hy@WarningNoLine{%
        VTeX 6.59g or above required for pdfpagelabels%
      }%
    }%
  \else
    \gdef\Hy@PutCatalog#1{%
      \Hy@vt@PutCatalog#1/PageLabels<<>>\@nil
    }%
    \gdef\Hy@vt@PutCatalog#1/PageLabels<<#2>>#3\@nil{%
      \ifx\\#2\\%
      \else
        \immediate\special{!pdfpagelabels #2}%
      \fi
    }%
  \fi
\endgroup
%</vtex>
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macrocode}
%<*pdftex|vtex>
%    \end{macrocode}
%
%    \begin{macro}{\HyPL@StorePageLabel}
%    This macro adds the entry |#1| to \cmd{\HyPL@Labels}.
%    \begin{macrocode}
\ifHy@pdfpagelabels
  \def\HyPL@StorePageLabel#1{%
    \toks@\expandafter{\HyPL@Labels}%
    \xdef\HyPL@Labels{%
      \the\toks@
      \the\Hy@abspage<<#1>>%
    }%
  }%
%    \end{macrocode}
%    \end{macro}
%
%    Package \textsf{atveryend} is used to get behind the
%    final \cs{clearpage} and to avoid a \cs{clearpage}
%    in \cs{AtEndDocument}.
%    Then the PDF catalog entry for |\PageLabels| is set.
%    \begin{macrocode}
  \RequirePackage{atveryend}[2009/12/07]%
  \AtVeryEndDocument{%
    \HyPL@SetPageLabels
  }%
%    \end{macrocode}
%
%    \begin{macrocode}
\fi
%</pdftex|vtex>
%    \end{macrocode}
%
% \subsubsection{xetex}
%
%    \begin{macrocode}
%<*xetex>
\HyPsd@LoadUnicode
\Hy@unicodetrue
\ifx\HyPsd@pdfencoding\HyPsd@pdfencoding@unicode
\else
  \let\HyPsd@pdfencoding\HyPsd@pdfencoding@auto
\fi
\HyPsd@LoadStringEnc
\define@key{Hyp}{unicode}[true]{%
  \Hy@boolkey{unicode}{#1}%
  \ifHy@unicode
  \else
    \Hy@Warning{%
      XeTeX driver only supports `unicode=true'. Ignoring\MessageBreak
      option setting `unicode=false'%
    }%
    \Hy@unicodetrue
  \fi
}
\define@key{Hyp}{pdfencoding}{%
  \edef\HyPsd@temp{#1}%
  \ifx\HyPsd@temp\HyPsd@pdfencoding@unicode
    \let\HyPsd@pdfencoding\HyPsd@temp
  \else
    \ifx\HyPsd@temp\HyPsd@pdfencoding@auto
      \let\HyPsd@pdfencoding\HyPsd@temp
    \else
      \Hy@Warning{%
        XeTeX driver only supports\MessageBreak
        `pdfencoding=unicode|auto'. Ignoring option\MessageBreak
        setting `pdfencoding=\HyPsd@temp'%
      }%
    \fi
  \fi
}
\let\HyXeTeX@CheckUnicode\relax
%</xetex>
%    \end{macrocode}
%
% \subsubsection{pdfmarkbase, dvipdfm, xetex}
%
%    \begin{macrocode}
%<*pdfmarkbase>
\begingroup
  \@ifundefined{headerps@out}{}{%
    \toks@\expandafter{\Hy@FirstPageHook}%
    \xdef\Hy@FirstPageHook{%
      \noexpand\headerps@out{%
        systemdict /pdfmark known%
        {%
          userdict /?pdfmark systemdict /exec get put%
        }{%
          userdict /?pdfmark systemdict /pop get put %
          userdict /pdfmark systemdict /cleartomark get put%
        }%
        ifelse%
      }%
      \the\toks@
    }%
  }%
\endgroup
%</pdfmarkbase>
%    \end{macrocode}
%
%    \begin{macro}{\Hy@PutCatalog}
%    \begin{macrocode}
%<dvipdfm|xetex>\def\Hy@PutCatalog#1{\@pdfm@mark{docview << #1 >>}}
%<*pdfmarkbase>
\def\Hy@PutCatalog#1{%
  \pdfmark{pdfmark=/PUT,Raw={\string{Catalog\string} << #1 >>}}%
}
%</pdfmarkbase>
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macrocode}
%<*pdfmarkbase|dvipdfm|xetex>
\ifHy@pdfpagelabels
%    \end{macrocode}
%
%    \begin{macro}{\HyPL@StorePageLabel}
%    This macro writes a string to the .aux file.
%    \begin{macrocode}
  \def\HyPL@StorePageLabel#1{%
    \if@filesw
      \begingroup
        \edef\Hy@tempa{\the\Hy@abspage<<#1>>}%
        \immediate\write\@mainaux{%
          \string\HyPL@Entry{\Hy@tempa}%
        }%
      \endgroup
    \fi
  }%
%    \end{macrocode}
%    \end{macro}
%
%    Write a dummy definition of \cmd{\HyPL@Entry} for the case,
%    that the next run is done without hyperref.
%    A marker for the rerun warning is set and the /PageLabels
%    is written.
%    \begin{macrocode}
  \Hy@AtBeginDocument{%
    \if@filesw
      \immediate\write\@mainaux{%
        \string\providecommand\string*\string\HyPL@Entry[1]{}%
      }%
    \fi
    \ifx\HyPL@Labels\@empty
      \Hy@WarningNoLine{Rerun to get /PageLabels entry}%
    \else
      \HyPL@SetPageLabels
    \fi
    \let\HyPL@Entry\@gobble
  }%
%    \end{macrocode}
%
%    \begin{macro}{\HyPL@Entry}
%    \begin{macrocode}
  \def\HyPL@Entry#1{%
    \expandafter\gdef\expandafter\HyPL@Labels\expandafter{%
      \HyPL@Labels
      #1%
    }%
  }%
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macrocode}
\fi
%</pdfmarkbase|dvipdfm|xetex>
%    \end{macrocode}
%
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
%    \begin{macrocode}
\ifx\MaybeStopEarly\relax
\else
  \Hy@stoppedearlytrue
  \expandafter\MaybeStopEarly
\fi
\Hy@stoppedearlyfalse
%    \end{macrocode}
%
% \section{Automated \LaTeX\ hypertext cross-references}\label{latexxref}
% Anything which can be referenced advances some counter; we overload
% this to put in a hypertext starting point (with no visible anchor),
% and make a note of that for later use in |\label|.
% This will fail badly if |\theH<name>|
% does not expand to a sensible reference. This means that classes
% or package which introduce new elements need to define
% an equivalent  |\theH<name>|  for every  |\the<name>|. We do make
% a trap to make |\theH<name>| be the same as |\arabic{<name>}|,
% if |\theH<name>| is not defined, but this is not necessarily a good idea.
% Alternatively, the `naturalnames' option uses whatever \LaTeX\
% provides, which may be useable. But then its up to you to make
% sure these are legal PDF and HTML names. The `hypertexnames=false' option
% just makes up arbitrary names.
%
% All the shenanigans is to make sure section numbers etc
% are always arabic, separated by dots. Who knows how people
% will set up |\@currentlabel|? If they put spaces in, or brackets
% (quite legal) then the hypertext processors will get upset.
%
% But this is flaky, and open to abuse. Styles like
% |subeqn| will mess it up, for starters. Appendices are an issue, too.
% We just hope to cover most situations. We can at least cope
% with the standard sectioning structure, allowing for |\part|
% and |\chapter|.
%
% Start with a fallback for equations
%    \begin{macrocode}
\def\Hy@CounterExists#1{%
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname c@#1\endcsname\relax
    \expandafter\@gobble
  \else
    \begingroup\expandafter\expandafter\expandafter\endgroup
    \expandafter\ifx\csname the#1\endcsname\relax
      \expandafter\expandafter\expandafter\@gobble
    \else
      \expandafter\expandafter\expandafter\@firstofone
    \fi
  \fi
}
\Hy@CounterExists{section}{%
  \providecommand\theHequation{\theHsection.\arabic{equation}}%
}
\Hy@CounterExists{part}{%
  \providecommand\theHpart{\arabic{part}}%
}
\ltx@IfUndefined{thechapter}{%
  \providecommand\theHsection    {\arabic{section}}%
  \providecommand\theHfigure     {\arabic{figure}}%
  \providecommand\theHtable      {\arabic{table}}%
}{%
  \providecommand\theHchapter    {\arabic{chapter}}%
  \providecommand\theHfigure     {\theHchapter.\arabic{figure}}%
  \providecommand\theHtable      {\theHchapter.\arabic{table}}%
  \providecommand\theHsection    {\theHchapter.\arabic{section}}%
}
\providecommand\theHsubsection   {\theHsection.\arabic{subsection}}
\providecommand\theHsubsubsection{\theHsubsection.\arabic{subsubsection}}
\providecommand\theHparagraph    {\theHsubsubsection.\arabic{paragraph}}
\providecommand\theHsubparagraph {\theHparagraph.\arabic{subparagraph}}
\providecommand\theHtheorem      {\theHsection.\arabic{theorem}}
\providecommand\theHthm          {\theHsection.\arabic{thm}}
%    \end{macrocode}
% Thanks to Greta Meyer (gbd@pop.cwru.edu) for making me realize
% that enumeration starts at 0 for every list! But |\item|
% occurs inside |\trivlist|, so check if its a real |\item| before
% incrementing counters.
%    \begin{macrocode}
\let\H@item\item
\newcounter{Item}
\def\theHItem{\arabic{Item}}
\def\item{%
  \@hyper@itemfalse
  \if@nmbrlist\@hyper@itemtrue\fi
  \H@item
}
%    \end{macrocode}
%
%    \begin{macrocode}
\providecommand\theHenumi     {\theHItem}
\providecommand\theHenumii    {\theHItem}
\providecommand\theHenumiii   {\theHItem}
\providecommand\theHenumiv    {\theHItem}
\providecommand\theHHfootnote {\arabic{Hfootnote}}
\providecommand\theHmpfootnote{\arabic{mpfootnote}}
\@ifundefined{theHHmpfootnote}{%
  \let\theHHmpfootnote\theHHfootnote
}{}
%    \end{macrocode}
% Tanmoy asked for this default handling of undefined |\theH<name>|
% situations. It really isn't clear what would be ideal, whether to
% turn off hyperizing of unknown elements, to pick up the textual
% definition of the counter, or to default it to something like
% |\arabic{name}|. We take the latter course, slightly worriedly.
%    \begin{macrocode}
\let\H@refstepcounter\refstepcounter
\edef\name@of@eq{equation}%
\edef\name@of@slide{slide}%
%    \end{macrocode}
% We do not want the handler for |\refstepcounter| to cut in
% during the processing of |\item| (we handle that separately),
% so we provide a bypass conditional.
%    \begin{macrocode}
\newif\if@hyper@item
\newif\if@skiphyperref
\@hyper@itemfalse
\@skiphyperreffalse
\def\refstepcounter#1{%
  \ifHy@pdfstring
  \else
    \H@refstepcounter{#1}%
    \edef\This@name{#1}%
    \ifx\This@name\name@of@slide
    \else
      \if@skiphyperref
      \else
        \if@hyper@item
          \stepcounter{Item}%
          \hyper@refstepcounter{Item}%
          \@hyper@itemfalse
        \else
          \hyper@refstepcounter{#1}%
        \fi
      \fi
    \fi
  \fi
}
\let\Hy@saved@refstepcounter\refstepcounter
%    \end{macrocode}
% AMS\LaTeX\ processes all equations twice; we want to make sure
% that the hyper stuff is not executed twice, so we use the AMS
% |\ifmeasuring@|, initialized if AMS math is not used.
%    \begin{macrocode}
\@ifpackageloaded{amsmath}{}{\newif\ifmeasuring@\measuring@false}
%    \end{macrocode}
%
%    \begin{macro}{\hyper@refstepcounter}
%    \begin{macrocode}
\def\hyper@refstepcounter#1{%
  \edef\This@name{#1}%
  \ifx\This@name\name@of@eq
    \@ifundefined{theHequation}{%
      \make@stripped@name{\theequation}%
      \let\theHequation\newname
    }{}%
  \fi
  \@ifundefined{theH#1}{%
    \expandafter\def\csname theH#1\endcsname{\arabic{#1}}%
  }{}%
  \hyper@makecurrent{#1}%
  \ifmeasuring@
  \else
    \Hy@raisedlink{%
      \hyper@anchorstart{\@currentHref}\hyper@anchorend
    }%
  \fi
}
%    \end{macrocode}
%    \end{macro}
%
%    After \cmd{\appendix} ``chapter'' (or ``section'' for classes
%    without chapter) should be replaced
%    by ``appendix'' to get \cmd{\autoref} work.
%    Macro \cmd{\Hy@chapapp} contains the current valid
%    name like \cmd{\@chapapp}, which cannot be used,
%    because this string depends on the current language.
%
%    The ``french'' package defines counter \cmd{\thechapter}
%    by \cmd{\newcounter{chapter}}, if \cmd{\@ifundefined{chapter}}.
%    \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname chapter\endcsname\relax
  \def\Hy@chapterstring{section}%
\else
  \def\Hy@chapterstring{chapter}%
\fi
\def\Hy@appendixstring{appendix}
\def\Hy@chapapp{\Hy@chapterstring}
\ltx@IfUndefined{appendix}{%
}{%
  \let\HyOrg@appendix\appendix
  \def\appendix{%
    \ltx@IfUndefined{chapter}%
      {\gdef\theHsection{\Alph{section}}}%
      {\gdef\theHchapter{\Alph{chapter}}}%
    \xdef\Hy@chapapp{\Hy@appendixstring}%
    \HyOrg@appendix
  }%
}
%    \end{macrocode}
%    \begin{macro}{\Hy@Test@alph}
%    \begin{macrocode}
\def\Hy@Test@alph#1{%
  \ifcase#1\or
    a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or
    k\or l\or m\or n\or o\or p\or q\or r\or s\or t\or
    u\or v\or w\or x\or y\or z%
  \else
    \@ctrerr
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Hy@Test@Alph}
%    \begin{macrocode}
\def\Hy@Test@Alph#1{%
  \ifcase#1\or
    A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or
    K\or L\or M\or N\or O\or P\or Q\or R\or S\or T\or
    U\or V\or W\or X\or Y\or Z%
  \else
    \@ctrerr
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\hyper@makecurrent}
% Because of Babel mucking around, nullify |\textlatin| when making names.
% And |\@number| because of babel's lrbabel.def.
%    \begin{macrocode}
\def\hyper@makecurrent#1{%
  \begingroup
    \edef\Hy@param{#1}%
    \ifx\Hy@param\Hy@chapterstring
      \let\Hy@param\Hy@chapapp
    \fi
    \ifHy@hypertexnames
      \let\@number\@firstofone
      \def\@fnsymbol##1{fnsymbol\number##1}%
      \def\@arabic##1{\number##1}%
      \ifx\@alph\Hy@Test@alph
      \else
        \def\@alph{alph\number}%
      \fi
      \ifx\@Alph\Hy@Test@Alph
      \else
        \def\@Alph{Alph\number}%
      \fi
      \ifHy@naturalnames
        \let\textlatin\@firstofone
        \xdef\HyperGlobalCurrentHref{\csname the#1\endcsname}%
      \else
        \xdef\HyperGlobalCurrentHref{%
          \csname
            the%
            \expandafter\ifx\csname theH#1\endcsname\relax\else H\fi
            #1%
          \endcsname
        }%
      \fi
      \xdef\HyperGlobalCurrentHref{%
        \Hy@param.\expandafter\strip@prefix\meaning\HyperGlobalCurrentHref
      }%
    \else
      \Hy@GlobalStepCount\Hy@linkcounter
      \xdef\HyperGlobalCurrentHref{\Hy@param.\the\Hy@linkcounter}%
    \fi
  \endgroup
  \let\HyperLocalCurrentHref\HyperGlobalCurrentHref
  \ifHy@localanchorname
    \let\@currentHref\HyperLocalCurrentHref
  \else
    \global\let\@currentHref\HyperGlobalCurrentHref
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Hy@MakeCurrentHref}
%    \begin{macrocode}
\def\Hy@MakeCurrentHref#1{%
  \edef\HyperLocalCurrentHref{#1}%
  \@onelevel@sanitize\HyperLocalCurrentHref
  \global\let\HyperGlobalCurrentHref\HyperLocalCurrentHref
  \let\HyperLocalCurrentHref\HyperGlobalCurrentHref
  \ifHy@localanchorname
    \let\@currentHref\HyperLocalCurrentHref
  \else
    \global\let\@currentHref\HyperGlobalCurrentHref
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Hy@MakeCurrentHrefAuto}
%    \begin{macrocode}
\def\Hy@MakeCurrentHrefAuto#1{%
  \Hy@GlobalStepCount\Hy@linkcounter
  \Hy@MakeCurrentHref{#1.\the\Hy@linkcounter}%
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\@currentHlabel}
%    \cs{@currrentHlabel} is only defined for compatibility with
%    package `hypdvips'.
%    \begin{macrocode}
\def\@currentHlabel{\@currentHref}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macrocode}
\@ifpackageloaded{fancyvrb}{%
  \@ifpackagelater{fancyvrb}{1998/05/20}{}{%
    \def\FV@StepLineNo{%
      \FV@SetLineNo
      \def\FV@StepLineNo{\H@refstepcounter{FancyVerbLine}}%
      \FV@StepLineNo
    }%
  }%
}{}
%    \end{macrocode}
%
% \section{Package lastpage support}
%    Package lastpage directly writes the |\newlabel| command to the
%    aux file. Because package hyperref requires additional arguments,
%    the internal command |\lastpage@putlabel| is redefined.
%    The patch is deferred by |\AtBeginDocument|, because it is possible
%    that package lastpage is loaded after package hyperref.
%    The same algorithm (options hypertexnames and plainpages)
%    is used to get the page anchor name as
%    in |\Hy@EveryPageAnchor| (see sec. \ref{pagenum}).
%    The link will not work if option pageanchor is set to false.
%    \begin{macro}{\lastpage@putlabel}
%    \begin{macrocode}
\Hy@AtBeginDocument{%
  \@ifclassloaded{revtex4}{%
    \@namedef{ver@lastpage.sty}{1994/06/25}%
  }{}%
  \@ifpackageloaded{lastpage}{%
    \ifHy@pageanchor
    \else
      \Hy@WarningNoLine{%
        The \string\pageref{LastPage} link doesn't work\MessageBreak
        with disabled option `pageanchor'%
      }%
    \fi
    \def\lastpage@putlabel{%
      \addtocounter{page}{-1}%
      \if@filesw
        \begingroup
          \let\@number\@firstofone
          \ifHy@pageanchor
            \ifHy@hypertexnames
              \ifHy@plainpages
                \def\Hy@temp{\arabic{page}}%
              \else
                \Hy@unicodefalse
                \pdfstringdef\Hy@temp{\thepage}%
              \fi
            \else
              \def\Hy@temp{\the\Hy@pagecounter}%
            \fi
          \fi
          \immediate\write\@auxout{%
            \string\newlabel
              {LastPage}{{}{\thepage}{}{%
                \ifHy@pageanchor page.\Hy@temp\fi}{}}%
          }%
        \endgroup
      \fi
      \addtocounter{page}{1}%
    }%
    \@ifclassloaded{revtex4}{%
      \begingroup
        \toks@\expandafter{\lastpage@putlabel}%
        \edef\x{\endgroup
          \def\noexpand\lastpage@putlabel{%
            \noexpand\stepcounter{page}%
            \the\toks@
            \noexpand\addtocounter{page}\noexpand\m@ne
          }%
        }%
      \x
    }{}%
  }{}%
}
%</package>
%<*check>
\checkpackage{lastpage}[1994/06/25]
\checkcommand\def\lastpage@putlabel{%
  \addtocounter{page}{-1}%
  \immediate\write\@auxout{%
    \string\newlabel{LastPage}{{}{\thepage}}%
  }%
  \addtocounter{page}{1}%
}
%</check>
%<*package>
%    \end{macrocode}
%    \end{macro}
%
% \section{Package ifthen support}
%
%    Since version 6.75a this is done in package nameref.
%
%    For compatibility \cmd{\hypergetref} and
%    \cmd{\hypergetpageref} are still provided.
%    But they do not generate warnings, if the reference is
%    undefined.
%    \begin{macrocode}
\def\hypergetref#1{\getrefbykeydefault{#1}{}{??}}
\def\hypergetpageref#1{\getrefbykeydefault{#1}{page}{0}}
%    \end{macrocode}
%
% \section{Package titlesec and titletoc support}
%
%    This code is contributed by Javier Bezos
%    (Email: \Email{jbezos@arrakis.es}).
%
%    Package titlesec support:
%    \begin{macrocode}
\@ifpackageloaded{titlesec}{%
  \def\ttl@Hy@steplink#1{%
    \Hy@MakeCurrentHrefAuto{#1*}%
    \edef\ttl@Hy@saveanchor{%
      \noexpand\Hy@raisedlink{%
        \noexpand\hyper@anchorstart{\@currentHref}%
        \noexpand\hyper@anchorend
        \def\noexpand\ttl@Hy@SavedCurrentHref{\@currentHref}%
        \noexpand\ttl@Hy@PatchSaveWrite
      }%
    }%
  }%
  \def\ttl@Hy@PatchSaveWrite{%
    \begingroup
      \toks@\expandafter{\ttl@savewrite}%
      \edef\x{\endgroup
        \def\noexpand\ttl@savewrite{%
          \let\noexpand\@currentHref
              \noexpand\ttl@Hy@SavedCurrentHref
          \the\toks@
        }%
      }%
    \x
  }%
  \def\ttl@Hy@refstepcounter#1{%
    \let\ttl@b\Hy@raisedlink
    \def\Hy@raisedlink##1{%
      \def\ttl@Hy@saveanchor{\Hy@raisedlink{##1}}%
    }%
    \refstepcounter{#1}%
    \let\Hy@raisedlink\ttl@b
  }%
}{}
%    \end{macrocode}
%
%    Package titletoc support:
%    \begin{macrocode}
\@ifpackageloaded{titletoc}{%
  \def\ttl@gobblecontents#1#2#3#4{\ignorespaces}%
}{}
%    \end{macrocode}
%
% \section{Package varioref support}
%
%    Package nameref uses five arguments for the ref system.
%    Fix provided by Felix Neubauer (\Email{felix.neubauer@gmx.net}).
%    \begin{macrocode}
\def\Hy@varioref@undefined{{??}{??}{}{}{}}
\@ifpackageloaded{varioref}{%
  \def\vref@pagenum#1#2{%
    \@ifundefined{r@#2}{%
      \expandafter\let\csname r@#2\endcsname\Hy@varioref@undefined
    }{}%
    \edef#1{\getpagerefnumber{#2}}%
  }%
}{}
%    \end{macrocode}
%
%    Package varioref redefines \cs{refstepcounter}, thus it needs
%    fixing, if the package is loaded *after* hyperref.
%    \begin{macrocode}
\def\Hy@varioref@refstepcounter#1{%
  \stepcounter{#1}%
  \protected@edef\@currentlabel{%
    \csname p@#1\expandafter\endcsname\csname the#1\endcsname
  }%
}
\AtBeginDocument{%
  \ifx\refstepcounter\Hy@varioref@refstepcounter
    \let\H@refstepcounter\refstepcounter
    \let\refstepcounter\Hy@saved@refstepcounter
  \fi
}
%    \end{macrocode}
%
% \section{Package longtable support}
%
%    Sometimes the anchor of the longtable goes to the previous
%    page. Thus the following patch separates the anchor setting
%    and counter incrementation by hyperref's \verb|\refstepcounter|
%    and the anchor setting is moved after \verb|\vskip\LTpre|.
%
%    Patch of \cmd{\LT@array}:
%    replace \cmd{\refstepcounter} by the original
%    \cmd{\H@refstepcounter} without anchor generation
%    \begin{macrocode}
\@ifpackageloaded{longtable}{%
  \begingroup
    \def\y{\LT@array}%
    \@ifundefined{scr@LT@array}{%
      \@ifundefined{adl@LT@array}{}{\def\y{\adl@LT@array}}%
    }{\def\y{\scr@LT@array}}%
    \long\def\x\refstepcounter#1#2\@sharp#3#4\@nil{%
      \expandafter\endgroup
      \expandafter\def\y[##1]##2{%
        \H@refstepcounter{#1}%
        \hyper@makecurrent{table}%
        \let\Hy@LT@currentHref\@currentHref
        #2\@sharp#####4%
      }%
    }%
  \expandafter\expandafter\expandafter\x\y[{#1}]{#2}\@nil
%    \end{macrocode}
%    Patch of \cmd{\LT@start}:
%    add anchor before first line after \verb|\vskip\LTpre|
%    \begin{macrocode}
  \begingroup
    \def\x#1\ifvoid\LT@foot#2\fi#3\@nil{%
      \endgroup
      \def\LT@start{%
        #1%
        \ifvoid\LT@foot#2\fi
        \let\@currentHref\Hy@LT@currentHref
        \Hy@raisedlink{%
          \hyper@anchorstart{\@currentHref}\hyper@anchorend
        }%
        #3%
      }%
    }%
  \expandafter\x\LT@start\@nil
}{}
%    \end{macrocode}
%
% \section{Equations}\label{equations}
% We want to  make the whole equation a target anchor.
% Overload equation, temporarily reverting to original
% |\refstepcounter|. If, however, it is in AMS math, we do not
% do anything, as the tag mechanism is used there (see section \ref{ams}).
% The execption is that we move the equation incrementation inside
% the math environment to avoid specials outside and a wrong vertical
% spacing of equation environments.
%    \begin{macrocode}
\let\new@refstepcounter\refstepcounter
\let\H@equation\equation
\let\H@endequation\endequation
%    \end{macrocode}
%
%    \begin{macrocode}
\@ifpackageloaded{amsmath}{%
  \long\def\Hy@temp{%
    \incr@eqnum
    \mathdisplay@push
    \st@rredfalse \global\@eqnswtrue
    \mathdisplay{equation}%
  }%
  \ifx\Hy@temp\equation
    \expandafter\ifx\csname if@fleqn\expandafter\endcsname
                    \csname iftrue\endcsname
    \else
      \long\def\equation{%
        \mathdisplay@push
        \st@rredfalse \global\@eqnswtrue
        \mathdisplay{equation}%
        \incr@eqnum
      }%
    \fi
  \fi
}{%
  \def\equation{%
    \let\refstepcounter\H@refstepcounter
    \H@equation
    \@ifundefined{theHequation}{%
      \make@stripped@name{\theequation}%
      \let\theHequation\newname
    }{}%
    \hyper@makecurrent{equation}%
    \Hy@raisedlink{\hyper@anchorstart{\@currentHref}}%
    \let\refstepcounter\new@refstepcounter
  }%
  \def\endequation{\Hy@raisedlink{\hyper@anchorend}\H@endequation}%
}
%    \end{macrocode}
% My goodness, why can't \LaTeX{} be consistent? Why is |\eqnarray|
% set up differently from other objects?
%
% People (you know who you are, Thomas Beuth) sometimes make
% an eqnarray where \emph{all} the lines end with  |\notag|,
% so there is no suitable anchor at all. In this case, pass by
% on the other side.
%    \begin{macrocode}
\newif\if@eqnstar
\@eqnstarfalse
\let\H@eqnarray\eqnarray
\let\H@endeqnarray\endeqnarray
\def\eqnarray{%
  \let\Hy@reserved@a\relax
  \def\@currentHref{}%
  \H@eqnarray
  \if@eqnstar
  \else
    \ifx\\\@currentHref\\%
    \else
      \@ifundefined{theHequation}{%
        \make@stripped@name{\theequation}%
        \let\theHequation\newname
      }{}%
      \hyper@makecurrent{equation}%
      \hyper@anchorstart{\@currentHref}{}\hyper@anchorend
    \fi
  \fi
}
\def\endeqnarray{%
  \H@endeqnarray
}
%    \end{macrocode}
% This is quite heavy-handed, but it works for now. If its an |eqnarray*|
% we need to disable the hyperref actions. There may well be a cleaner
% way to trap this. Bill Moss found this.
%    \begin{macrocode}
\@namedef{eqnarray*}{%
  \def\@eqncr{\nonumber\@seqncr}\@eqnstartrue\eqnarray
}
\@namedef{endeqnarray*}{%
  \nonumber\endeqnarray\@eqnstarfalse
}
%    \end{macrocode}
% Then again, we have the \emph{subeqnarray}
% package. Tanmoy provided some code for this:
%    \begin{macrocode}
\ltx@IfUndefined{subeqnarray}{}{%
  \let\H@subeqnarray\subeqnarray
  \let\H@endsubeqnarray\endsubeqnarray
  \def\subeqnarray{%
    \let\Hy@reserved@a\relax
    \H@subeqnarray
    \@ifundefined{theHequation}{%
      \make@stripped@name{\theequation}%
      \let\theHequation\newname
    }{}%
    \hyper@makecurrent{equation}%
    \hyper@anchorstart{\@currentHref}{}\hyper@anchorend
  }%
  \def\endsubeqnarray{%
    \H@endsubeqnarray
  }%
  \providecommand\theHsubequation{\theHequation\alph{subequation}}%
}
%    \end{macrocode}
% The aim of this macro is to produce a sanitized version of
% its argument, to make it a safe label.
%    \begin{macrocode}
\def\make@stripped@name#1{%
  \begingroup
    \escapechar\m@ne
    \global\let\newname\@empty
    \protected@edef\Hy@tempa{#1}%
    \edef\@tempb{%
      \noexpand\@tfor\noexpand\Hy@tempa:=%
        \expandafter\strip@prefix\meaning\Hy@tempa
    }%
    \@tempb\do{%
      \if{\Hy@tempa\else
        \if}\Hy@tempa\else
          \xdef\newname{\newname\Hy@tempa}%
        \fi
      \fi
    }%
  \endgroup
}
%    \end{macrocode}
%
% Support for amsmath's \texttt{subequations}:
%    \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname subequations\endcsname\relax
\else
  \let\HyOrg@subequations\subequations
  \def\subequations{%
    \stepcounter{equation}%
    \protected@edef\theHparentequation{%
      \@ifundefined{theHequation}\theequation\theHequation
    }%
    \addtocounter{equation}{-1}%
    \HyOrg@subequations
    \def\theHequation{\theHparentequation\alph{equation}}%
    \ignorespaces
  }%
\fi
%    \end{macrocode}
%
% Support for package \texttt{amsthm} (Daniel M\"ullner):
%    \begin{macrocode}
\@ifpackageloaded{amsthm}{%
%    \end{macrocode}
% Class amsbook uses a different definition of \cs{@thm},
% where two lines are added (thanks to Dan Luecking for
% his analysis):
%\begin{quote}
%\begin{verbatim}
%\let\thm@indent\indent % indent
%\thm@headfont{\scshape}% heading font small caps
%\end{verbatim}
%\end{quote}
%    \begin{macrocode}
  \def\Hy@temp#1#2#3{%
    \ifhmode\unskip\unskip\par\fi
    \normalfont
    \trivlist
    \let\thmheadnl\relax
    \let\thm@swap\@gobble
    \let\thm@indent\indent % indent
    \thm@headfont{\scshape}% heading font small caps
    \thm@notefont{\fontseries\mddefault\upshape}%
    \thm@headpunct{.}% add period after heading
    \thm@headsep 5\p@ plus\p@ minus\p@\relax
    \thm@space@setup
    #1% style overrides
    \@topsep \thm@preskip               % used by thm head
    \@topsepadd \thm@postskip           % used by \@endparenv
    \def\@tempa{#2}\ifx\@empty\@tempa
      \def\@tempa{\@oparg{\@begintheorem{#3}{}}[]}%
    \else
      \refstepcounter{#2}%
      \def\@tempa{\@oparg{\@begintheorem{#3}{\csname the#2\endcsname}}[]}%
    \fi
    \@tempa
  }%
  \ifx\Hy@temp\@thm
    \def\@thm#1#2#3{%
      \ifhmode
        \unskip\unskip\par
      \fi
      \normalfont
      \trivlist
      \let\thmheadnl\relax
      \let\thm@swap\@gobble
      \let\thm@indent\indent % indent
      \thm@headfont{\scshape}% heading font small caps
      \thm@notefont{\fontseries\mddefault\upshape}%
      \thm@headpunct{.}% add period after heading
      \thm@headsep 5\p@ plus\p@ minus\p@\relax
      \thm@space@setup
      #1% style overrides
      \@topsep \thm@preskip               % used by thm head
      \@topsepadd \thm@postskip           % used by \@endparenv
      \def\dth@counter{#2}%
      \ifx\@empty\dth@counter
        \def\@tempa{%
          \@oparg{\@begintheorem{#3}{}}[]%
        }%
      \else
        \H@refstepcounter{#2}%
        \hyper@makecurrent{#2}%
        \let\Hy@dth@currentHref\@currentHref
        \def\@tempa{%
          \@oparg{\@begintheorem{#3}{\csname the#2\endcsname}}[]%
        }%
      \fi
      \@tempa
    }%
  \else
    \def\@thm#1#2#3{%
      \ifhmode
        \unskip\unskip\par
      \fi
      \normalfont
      \trivlist
      \let\thmheadnl\relax
      \let\thm@swap\@gobble
      \thm@notefont{\fontseries\mddefault\upshape}%
      \thm@headpunct{.}% add period after heading
      \thm@headsep 5\p@ plus\p@ minus\p@\relax
      \thm@space@setup
      #1% style overrides
      \@topsep \thm@preskip               % used by thm head
      \@topsepadd \thm@postskip           % used by \@endparenv
      \def\dth@counter{#2}%
      \ifx\@empty\dth@counter
        \def\@tempa{%
          \@oparg{\@begintheorem{#3}{}}[]%
        }%
      \else
        \H@refstepcounter{#2}%
        \hyper@makecurrent{#2}%
        \let\Hy@dth@currentHref\@currentHref
        \def\@tempa{%
          \@oparg{\@begintheorem{#3}{\csname the#2\endcsname}}[]%
        }%
      \fi
      \@tempa
    }%
  \fi
  \dth@everypar={%
    \@minipagefalse
    \global\@newlistfalse
    \@noparitemfalse
    \if@inlabel
      \global\@inlabelfalse
      \begingroup
        \setbox\z@\lastbox
        \ifvoid\z@
          \kern-\itemindent
        \fi
      \endgroup
      \ifx\@empty\dth@counter
      \else
        \Hy@raisedlink{%
          \hyper@anchorstart{%
            \ltx@ifundefined{Hy@dth@currentHref}%
            \@currentHref\Hy@dth@currentHref
          }\hyper@anchorend
        }%
      \fi
      \unhbox\@labels
    \fi
    \if@nobreak
      \@nobreakfalse \clubpenalty\@M
    \else
      \clubpenalty\@clubpenalty \everypar{}%
    \fi
  }%
}{}
%    \end{macrocode}
%
% \section{Footnotes}\label{footnotes}
% The footnote mark is a hypertext link, and the text is a target.
% We separately number the footnotes sequentially through the
% text, separately from whatever labels the text assigns. Too hard
% to keep track of markers otherwise. If the raw forms |\footnotemark|
% and |\footnotetext| are used, force them to use un-hyper original.
%
%    \begin{macrocode}
\ifHy@hyperfootnotes
  \newcounter{Hfootnote}%
  \let\H@@footnotetext\@footnotetext
  \let\H@@footnotemark\@footnotemark
  \def\@xfootnotenext[#1]{%
    \begingroup
      \csname c@\@mpfn\endcsname #1\relax
      \unrestored@protected@xdef\@thefnmark{\thempfn}%
    \endgroup
    \ifx\@footnotetext\@mpfootnotetext
      \expandafter\H@@mpfootnotetext
    \else
      \expandafter\H@@footnotetext
    \fi
  }%
  \def\@xfootnotemark[#1]{%
    \begingroup
      \c@footnote #1\relax
      \unrestored@protected@xdef\@thefnmark{\thefootnote}%
    \endgroup
    \H@@footnotemark
  }%
  \let\H@@mpfootnotetext\@mpfootnotetext
  \long\def\@mpfootnotetext#1{%
    \H@@mpfootnotetext{%
      \ifHy@nesting
        \expandafter\ltx@firstoftwo
      \else
        \expandafter\ltx@secondoftwo
      \fi
      {%
        \expandafter\hyper@@anchor\expandafter{%
          \Hy@footnote@currentHref
         }{#1}%
      }{%
        \Hy@raisedlink{%
          \expandafter\hyper@@anchor\expandafter{%
            \Hy@footnote@currentHref
          }{\relax}%
        }#1%
      }%
    }%
  }%
  \long\def\@footnotetext#1{%
    \H@@footnotetext{%
      \ifHy@nesting
        \expandafter\ltx@firstoftwo
      \else
        \expandafter\ltx@secondoftwo
      \fi
      {%
        \expandafter\hyper@@anchor\expandafter{%
          \Hy@footnote@currentHref
        }{#1}%
      }{%
        \Hy@raisedlink{%
          \expandafter\hyper@@anchor\expandafter{%
            \Hy@footnote@currentHref
          }{\relax}%
        }%
        \let\@currentHref\Hy@footnote@currentHref
        \let\@currentlabelname\@empty
        #1%
      }%
    }%
  }%
%    \end{macrocode}
%    Redefine \verb+\@footnotemark+, borrowing its code (at the
%    cost of getting out of sync with latex.ltx), to take
%    advantage of its white space and hyphenation fudges. If we just
%    overload it, we can get variant documents (the word before the
%    footnote is treated differently). Thanks to David Carlisle and
%    Brian Ripley for confusing and helping me on this.
%    \begin{macrocode}
  \def\@footnotemark{%
    \leavevmode
    \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi
    \stepcounter{Hfootnote}%
    \global\let\Hy@saved@currentHref\@currentHref
    \hyper@makecurrent{Hfootnote}%
    \global\let\Hy@footnote@currentHref\@currentHref
    \global\let\@currentHref\Hy@saved@currentHref
    \hyper@linkstart{link}{\Hy@footnote@currentHref}%
    \@makefnmark
    \hyper@linkend
    \ifhmode\spacefactor\@x@sf\fi
    \relax
  }%
%    \end{macrocode}
%
% Tabularx causes footnote problems, disable the linking if that is loaded.
% Since v6.82i footnotes are only disabled inside the environment
% `tabularx'.
%    \begin{macrocode}
  \@ifpackageloaded{tabularx}{%
    \let\HyOrg@TX@endtabularx\TX@endtabularx
    \def\Hy@tabularx@hook{%
      \let\@footnotetext\H@@footnotetext
      \let\@footnotemark\H@@footnotemark
      \let\@mpfootnotetext\H@@mpfootnotetext
    }%
    \begingroup
      \toks@\expandafter{\TX@endtabularx}%
      \xdef\Hy@gtemp{%
        \noexpand\Hy@tabularx@hook
        \the\toks@
      }%
    \endgroup
    \let\TX@endtabularx\Hy@gtemp
  }{}%
%    \end{macrocode}
%
%    Support for footnotes in p columns of longtable.
%    Here \verb+\footnote+ commands are splitted into
%    \verb+\footnotemark+ and a call of \verb+\footnotetext+
%    with the optional argument, that is not supported
%    by hyperref. The result is a link by \verb+\footnotemark+
%    without valid anchor
%    \begin{macrocode}
  \@ifpackageloaded{longtable}{%
    \CheckCommand*{\LT@p@ftntext}[1]{%
      \edef\@tempa{%
        \the\LT@p@ftn
        \noexpand\footnotetext[\the\c@footnote]%
      }%
      \global\LT@p@ftn\expandafter{\@tempa{#1}}%
    }%
    \long\def\LT@p@ftntext#1{%
      \edef\@tempa{%
        \the\LT@p@ftn
        \begingroup
          \noexpand\c@footnote=\the\c@footnote\relax
          \noexpand\protected@xdef\noexpand\@thefnmark{%
            \noexpand\thempfn
          }%
          \noexpand\Hy@LT@footnotetext{%
            \Hy@footnote@currentHref
          }%
      }%
      \global\LT@p@ftn\expandafter{%
          \@tempa{#1}%
        \endgroup
      }%
    }%
    \long\def\Hy@LT@footnotetext#1#2{%
      \H@@footnotetext{%
        \ifHy@nesting
          \hyper@@anchor{#1}{#2}%
        \else
          \Hy@raisedlink{%
            \hyper@@anchor{#1}{\relax}%
          }%
          \def\@currentHref{#1}%
          \let\@currentlabelname\@empty
          #2%
        \fi
      }%
    }%
  }{}%
%    \end{macrocode}
%
%    Footnotes for fancyvrb (Fix by Manuel P\'egouri\'e-Gonnard).
%    \begin{macrocode}
  \@ifpackageloaded{fancyvrb}{%
    \def\V@@footnotetext{%
      \insert\footins\bgroup
      \csname reset@font\endcsname
      \footnotesize
      \interlinepenalty\interfootnotelinepenalty
      \splittopskip\footnotesep
      \splitmaxdepth\dp\strutbox
      \floatingpenalty \@MM
      \hsize\columnwidth
      \@parboxrestore
      \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}%
      \@makefntext{}%
      \rule{\z@}{\footnotesep}%
      \bgroup
      \aftergroup\V@@@footnotetext
      \Hy@raisedlink{%
        \expandafter\hyper@@anchor\expandafter{%
          \Hy@footnote@currentHref
        }{\relax}%
      }%
      \let\@currentHref\Hy@footnote@currentHref
      \let\@currentlabelname\@empty
      \ignorespaces
    }%
  }{}%
%    \end{macrocode}
%
%    KOMA-Script defines \cs{footref} that uses both
%    \cs{ref} and \cs{@footnotemark} resulting in two links,
%    one of them wrong.
%    \begin{macrocode}
  \def\Hy@temp#1{%
    \begingroup
      \unrestored@protected@xdef\@thefnmark{\ref{#1}}%
    \endgroup
    \@footnotemark
  }%
  \ifx\Hy@temp\footref
    \def\footref#1{%
    \begingroup
      \unrestored@protected@xdef\@thefnmark{\ref{#1}}%
    \endgroup
    \H@@footnotemark
    }%
  \fi
%    \end{macrocode}
%
%    But the special footnotes
%    in |\maketitle| are much too hard to deal with
%    properly. Let them revert to plain behaviour.
%    The koma classes add an optional argument.
%    \begin{macrocode}
  \let\HyOrg@maketitle\maketitle
  \def\maketitle{%
    \let\Hy@saved@footnotemark\@footnotemark
    \let\Hy@saved@footnotetext\@footnotetext
    \let\@footnotemark\H@@footnotemark
    \let\@footnotetext\H@@footnotetext
    \@ifnextchar[\Hy@maketitle@optarg{% ]
      \HyOrg@maketitle
      \Hy@maketitle@end
    }%
  }%
  \def\Hy@maketitle@optarg[#1]{%
    \HyOrg@maketitle[{#1}]%
    \Hy@maketitle@end
  }%
  \def\Hy@maketitle@end{%
    \ifx\@footnotemark\H@@footnotemark
      \let\@footnotemark\Hy@saved@footnotemark
    \fi
    \ifx\@footnotetext\H@@footnotetext
      \let\@footnotetext\Hy@saved@footnotetext
    \fi
  }%
%    \end{macrocode}
%    \begin{macro}{\realfootnote}
%    Does anyone remember the function and purpose of \cmd{\realfootnote}?
%    \begin{macrocode}
  \def\realfootnote{%
    \@ifnextchar[\@xfootnote{%
      \stepcounter{\@mpfn}%
      \protected@xdef\@thefnmark{\thempfn}%
      \H@@footnotemark\H@@footnotetext
    }%
  }%
%    \end{macrocode}
%    \begin{macrocode}
\fi
\Hy@DisableOption{hyperfootnotes}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macrocode}
%</package>
%<*check>
\checklatex
\checkcommand\def\@xfootnotenext[#1]{%
  \begingroup
    \csname c@\@mpfn\endcsname #1\relax
    \unrestored@protected@xdef\@thefnmark{\thempfn}%
  \endgroup
  \@footnotetext
}
\checkcommand\def\@xfootnotemark[#1]{%
  \begingroup
    \c@footnote #1\relax
    \unrestored@protected@xdef\@thefnmark{\thefootnote}%
  \endgroup
  \@footnotemark
}
\checkcommand\def\@footnotemark{%
  \leavevmode
  \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi
  \@makefnmark
  \ifhmode\spacefactor\@x@sf\fi
  \relax
}
%</check>
%<*package>
%    \end{macrocode}
%
% \section{Float captions}\label{captions}
% Make the float caption the hypertext anchor; curiously enough,
% we can't just copy the definition of |\@caption|. Its all to do
% with expansion. It screws up. Sigh.
%    \begin{macrocode}
\def\caption{%
  \ifx\@captype\@undefined
    \@latex@error{\noexpand\caption outside float}\@ehd
    \expandafter\@gobble
  \else
    \H@refstepcounter\@captype
    \let\Hy@tempa\@caption
    \@ifundefined{float@caption}{%
    }{%
      \expandafter\ifx\csname @float@c@\@captype\endcsname
                      \float@caption
        \let\Hy@tempa\Hy@float@caption
      \fi
    }%
    \expandafter\@firstofone
  \fi
  {\@dblarg{\Hy@tempa\@captype}}%
}
\long\def\@caption#1[#2]#3{%
  \expandafter\ifx\csname if@capstart\expandafter\endcsname
                  \csname iftrue\endcsname
    \global\let\@currentHref\hc@currentHref
  \else
    \hyper@makecurrent{\@captype}%
  \fi
  \@ifundefined{NR@gettitle}{%
    \def\@currentlabelname{#2}%
  }{%
    \NR@gettitle{#2}%
  }%
  \par\addcontentsline{\csname ext@#1\endcsname}{#1}{%
    \protect\numberline{\csname the#1\endcsname}{\ignorespaces #2}%
  }%
  \begingroup
    \@parboxrestore
    \if@minipage
      \@setminipage
    \fi
    \normalsize
    \expandafter\ifx\csname if@capstart\expandafter\endcsname
                    \csname iftrue\endcsname
      \global\@capstartfalse
      \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces#3}%
    \else
      \@makecaption{\csname fnum@#1\endcsname}{%
        \ignorespaces
%    \end{macrocode}
% If we cannot have nesting, the anchor is empty.
%    \begin{macrocode}
        \ifHy@nesting
          \expandafter\hyper@@anchor\expandafter{\@currentHref}{#3}%
        \else
          \Hy@raisedlink{%
            \expandafter\hyper@@anchor\expandafter{%
              \@currentHref
            }{\relax}%
          }%
          #3%
        \fi
      }%
    \fi
    \par
  \endgroup
}
%    \end{macrocode}
%    Compatibility with float.sty: anchor setting at the top
%    of the float, if the float is controlled by float.sty.
%    Several \verb|\caption| commands inside one float are
%    not supported.
%    \begin{macrocode}
\let\Hy@float@caption\@caption
\@ifpackageloaded{float}{%
  \def\Hy@float@caption{%
    \ifx\Hy@float@currentHref\@undefined
      \hyper@makecurrent{\@captype}%
      \global\let\Hy@float@currentHref\@currentHref
    \else
      \let\@currentHref\Hy@float@currentHref
    \fi
    \float@caption
  }%
  \let\HyOrg@float@makebox\float@makebox
  \renewcommand{\float@makebox}[1]{%
    \HyOrg@float@makebox{%
      #1\relax
      \ifx\Hy@float@currentHref\@undefined
      \else
        \expandafter\hyper@@anchor\expandafter{%
          \Hy@float@currentHref
        }{\relax}%
        \global\let\Hy@float@currentHref\@undefined
      \fi
    }%
  }%
}{}
%    \end{macrocode}
%
%    \begin{macrocode}
%</package>
%<*check>
\checklatex[1999/06/01 - 2000/06/01]
\checkcommand\def\caption{%
  \ifx\@captype\@undefined
    \@latex@error{\noexpand\caption outside float}\@ehd
    \expandafter\@gobble
  \else
    \refstepcounter\@captype
    \expandafter\@firstofone
  \fi
  {\@dblarg{\@caption\@captype}}%
}
\checkcommand\long\def\@caption#1[#2]#3{%
  \par
  \addcontentsline{\csname ext@#1\endcsname}{#1}{%
    \protect\numberline{\csname the#1\endcsname}{\ignorespaces #2}%
  }%
  \begingroup
    \@parboxrestore
    \if@minipage
      \@setminipage
    \fi
    \normalsize
    \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
  \endgroup
}
%</check>
%<*package>
%    \end{macrocode}
%
% \section{Bibliographic references}\label{bib}
% This is not very robust, since many styles redefine these things.
% The package used to redefine |\@citex| and the like; then we tried
% adding the hyperref call explicitly into the .aux file.
% Now we redefine |\bibcite|; this still breaks some citation packages
% so we have to work around them. But this remains extremely dangerous.
% Any or all of \emph{achemso}
% and \emph{drftcite} may break.
%
% However, lets make an attempt to get \emph{natbib} right, because
% thats a powerful, important package.
% Patrick Daly (\Email{daly@linmpi.mpg.de}) has
% provided hooks for us, so all we need to do is activate them.
%    \begin{macrocode}
\def\hyper@natlinkstart#1{%
  \Hy@backout{#1}%
  \hyper@linkstart{cite}{cite.#1}%
  \def\hyper@nat@current{#1}%
}
\def\hyper@natlinkend{%
  \hyper@linkend
}
\def\hyper@natlinkbreak#1#2{%
  \hyper@linkend#1\hyper@linkstart{cite}{cite.#2}%
}
\def\hyper@natanchorstart#1{%
  \Hy@raisedlink{\hyper@anchorstart{cite.#1}}%
}
\def\hyper@natanchorend{\hyper@anchorend}
%    \end{macrocode}
% Do not play games if we have natbib support.
% Macro \@extra@binfo added for chapterbib support. Chapterbib also
% wants \cs{@extra@binfo} in the hyper-link, but since the link tag is
% not expanded immediately, we use \cs{@extra@b@citeb}, so cites in a
% chapter will link to the bibliography in that chapter.
%    \begin{macrocode}
\ltx@IfUndefined{NAT@parse}{%
  \providecommand*\@extra@binfo{}%
  \providecommand*\@extra@b@citeb{}%
  \def\bibcite#1#2{%
    \@newl@bel{b}{#1\@extra@binfo}{%
      \hyper@@link[cite]{}{cite.#1\@extra@b@citeb}{#2}%
    }%
  }%
  \gdef\@extra@binfo{}%
%    \end{macrocode}
%    Package |babel| redefines \cmd{\bibcite} with
%    macro \cmd{\bbl@cite@choice}. It needs to be overwritten
%    to avoid the warning ``Label(s) may have changed.''.
%    \begin{macrocode}
  \let\Hy@bibcite\bibcite
  \begingroup
    \@ifundefined{bbl@cite@choice}{}{%
      \g@addto@macro\bbl@cite@choice{%
        \let\bibcite\Hy@bibcite
      }%
    }%
  \endgroup
%    \end{macrocode}
% |\@BIBLABEL| is working around a `feature' of Rev\TeX.
%    \begin{macrocode}
  \providecommand*{\@BIBLABEL}{\@biblabel}%
  \def\@lbibitem[#1]#2{%
    \@skiphyperreftrue
    \H@item[%
      \ifx\Hy@raisedlink\@empty
        \hyper@anchorstart{cite.#2\@extra@b@citeb}%
          \@BIBLABEL{#1}%
        \hyper@anchorend
      \else
        \Hy@raisedlink{%
          \hyper@anchorstart{cite.#2\@extra@b@citeb}\hyper@anchorend
        }%
        \@BIBLABEL{#1}%
      \fi
      \hfill
    ]%
    \@skiphyperreffalse
    \if@filesw
      \begingroup
        \let\protect\noexpand
        \immediate\write\@auxout{%
          \string\bibcite{#2}{#1}%
        }%
      \endgroup
    \fi
    \ignorespaces
  }%
%    \end{macrocode}
% Since |\bibitem| is doing its own labelling, call the raw
% version of |\item|, to avoid extra spurious labels
%    \begin{macrocode}
  \def\@bibitem#1{%
    \@skiphyperreftrue\H@item\@skiphyperreffalse
    \Hy@raisedlink{%
      \hyper@anchorstart{cite.#1\@extra@b@citeb}\relax\hyper@anchorend
    }%
    \if@filesw
      \begingroup
        \let\protect\noexpand
        \immediate\write\@auxout{%
          \string\bibcite{#1}{\the\value{\@listctr}}%
        }%
      \endgroup
    \fi
    \ignorespaces
  }%
}{}
%    \end{macrocode}
%
%    \begin{macrocode}
%</package>
%<*check>
\checklatex
\checkcommand\def\@lbibitem[#1]#2{%
  \item[\@biblabel{#1}\hfill]%
  \if@filesw
    {%
      \let\protect\noexpand
      \immediate\write\@auxout{%
        \string\bibcite{#2}{#1}%
      }%
    }%
  \fi
  \ignorespaces
}
\checkcommand\def\@bibitem#1{%
  \item
  \if@filesw
    \immediate\write\@auxout{%
      \string\bibcite{#1}{\the\value{\@listctr}}%
    }%
  \fi
  \ignorespaces
}
%</check>
%<*package>
%    \end{macrocode}
%
% Revtex (bless its little heart) takes over |\bibcite| and looks
% at the result to measure something. Make this a hypertext link
% and it goes ape. Therefore, make an anodyne result first, call
% its business, then go back to the real thing.
%    \begin{macrocode}
\@ifclassloaded{revtex}{%
  \Hy@Info{*** compatibility with revtex **** }%
  \def\revtex@checking#1#2{%
    \expandafter\let\expandafter\T@temp\csname b@#1\endcsname
    \expandafter\def\csname b@#1\endcsname{#2}%
    \@SetMaxRnhefLabel{#1}%
    \expandafter\let\csname b@#1\endcsname\T@temp
  }%
%    \end{macrocode}
% Tanmoy provided this replacement for CITEX. Lord knows what it does.
% For chapterbib added: \@extra@b@citeb
%    \begin{macrocode}
  \@ifundefined{@CITE}{\def\@CITE{\@cite}}{}%
  \providecommand*{\@extra@b@citeb}{}%
  \def\@CITEX[#1]#2{%
    \let\@citea\@empty
    \leavevmode
    \unskip
    $^{%
      \scriptstyle
      \@CITE{%
        \@for\@citeb:=#2\do{%
          \@citea
          \def\@citea{,\penalty\@m\ }%
          \edef\@citeb{\expandafter\@firstofone\@citeb}%
          \if@filesw
            \immediate\write\@auxout{\string\citation{\@citeb}}%
          \fi
          \@ifundefined{b@\@citeb\extra@b@citeb}{%
            \mbox{\reset@font\bfseries ?}%
            \G@refundefinedtrue
            \@latex@warning{%
              Citation `\@citeb' on page \thepage \space undefined%
            }%
          }{%
            {\csname b@\@citeb\@extra@b@citeb\endcsname}%
          }%
        }%
      }{#1}%
    }$%
  }%
%    \end{macrocode}
% No, life is too short. I am not going to understand the
% Revtex |\@collapse| macro, I shall
% just restore the original behaviour of |\@citex|;
% sigh. This is SO vile.
%    \begin{macrocode}
  \def\@citex[#1]#2{%
    \let\@citea\@empty
    \@cite{%
      \@for\@citeb:=#2\do{%
        \@citea
        \def\@citea{,\penalty\@m\ }%
        \edef\@citeb{\expandafter\@firstofone\@citeb}%
        \if@filesw
          \immediate\write\@auxout{\string\citation{\@citeb}}%
        \fi
        \@ifundefined{b@\@citeb\@extra@b@citeb}{%
          \mbox{\reset@font\bfseries ?}%
          \G@refundefinedtrue
          \@latex@warning{%
            Citation `\@citeb' on page \thepage \space undefined%
          }%
        }{%
          \hbox{\csname b@\@citeb\@extra@b@citeb\endcsname}%
        }%
      }%
    }{#1}%
  }%
}{}
%    \end{macrocode}
%
% \subsection{Package harvard}
%
% Override Peter Williams' Harvard package; we have to
% a) make each of the citation types into a link; b) make
% each citation write a backref entry, and c) kick off a backreference
% section for each bibliography entry.
%
% The redefinitions have to be deferred to |\begin{document}|,
% because if harvard.sty is loaded and html.sty is present and
% detects pdf\TeX, then hyperref is already loaded at the begin
% of harvard.sty, and the |\newcommand| macros causes error
% messages.
%    \begin{macrocode}
\@ifpackageloaded{harvard}{%
  \Hy@AtBeginDocument{%
    \Hy@Info{*** compatibility with harvard **** }%
    \Hy@raiselinksfalse
    \def\harvardcite#1#2#3#4{%
      \global\@namedef{HAR@fn@#1}{\hyper@@link[cite]{}{cite.#1}{#2}}%
      \global\@namedef{HAR@an@#1}{\hyper@@link[cite]{}{cite.#1}{#3}}%
      \global\@namedef{HAR@yr@#1}{\hyper@@link[cite]{}{cite.#1}{#4}}%
      \global\@namedef{HAR@df@#1}{\csname HAR@fn@#1\endcsname}%
    }%
    \def\HAR@citetoaux#1{%
      \if@filesw\immediate\write\@auxout{\string\citation{#1}}\fi%
      \ifHy@backref
        \ifx\@empty\@currentlabel
        \else
          \@bsphack
          \if@filesw
            \protected@write\@auxout{}{%
              \string\@writefile{brf}{%
                \string\backcite{#1}{%
                  {\thepage}{\@currentlabel}{\@currentHref}%
                }%
              }%
            }%
          \fi
          \@esphack
        \fi
      \fi
    }%
    \def\harvarditem{%
      \@ifnextchar[{\@harvarditem}{\@harvarditem[\null]}%
    }%
    \def\@harvarditem[#1]#2#3#4#5\par{%
      \item[]%
      \hyper@anchorstart{cite.#4}\relax\hyper@anchorend
      \if@filesw
        \begingroup
          \def\protect##1{\string ##1\space}%
          \ifthenelse{\equal{#1}{\null}}%
            {\def\next{{#4}{#2}{#2}{#3}}}%
            {\def\next{{#4}{#2}{#1}{#3}}}%
          \immediate\write\@auxout{\string\harvardcite\codeof\next}%
       \endgroup
      \fi
      \protect\hspace*{-\labelwidth}%
      \protect\hspace*{-\labelsep}%
      \ignorespaces
      #5%
      \ifHy@backref
        \newblock
        \backref{\csname br@#4\endcsname}%
      \fi
      \par
    }%
%    \end{macrocode}
%    \begin{macro}{\HAR@checkcitations}
%    Package hyperref has added \cmd{\hyper@@link}, so
%    the original test \cmd{\HAR@checkcitations} will
%    fail every time and always will appear the ``Changed
%    labels'' warning. So we have to redefine
%    \cmd{\Har@checkcitations}:
%    \begin{macrocode}
    \long\def\HAR@checkcitations#1#2#3#4{%
      \def\HAR@tempa{\hyper@@link[cite]{}{cite.#1}{#2}}%
      \expandafter\ifx\csname HAR@fn@#1\endcsname\HAR@tempa
        \def\HAR@tempa{\hyper@@link[cite]{}{cite.#1}{#3}}%
        \expandafter\ifx\csname HAR@an@#1\endcsname\HAR@tempa
          \def\HAR@tempa{\hyper@@link[cite]{}{cite.#1}{#4}}%
          \expandafter\ifx\csname HAR@yr@#1\endcsname\HAR@tempa
          \else
            \@tempswatrue
          \fi
        \else
          \@tempswatrue
        \fi
      \else
        \@tempswatrue
      \fi
    }%
  }%
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
}{}
%    \end{macrocode}
%
% \subsection{Package chicago}
%    The links by \cmd{\citeN} and \cmd{\shortciteN} should
%    include the closing parentheses.
%
%    \begin{macrocode}
\@ifpackageloaded{chicago}{%
%    \end{macrocode}
%    \begin{macro}{\citeN}
%    \begin{macrocode}
  \def\citeN{%
    \def\@citeseppen{-1000}%
    \def\@cite##1##2{##1}%
    \def\citeauthoryear##1##2##3{##1 (##3\@cite@opt)}%
    \@citedata@opt
  }%
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\shortciteN}
%    \begin{macrocode}
  \def\shortciteN{%
    \def\@citeseppen{-1000}%
    \def\@cite##1##2{##1}%
    \def\citeauthoryear##1##2##3{##2 (##3\@cite@opt)}%
    \@citedata@opt
  }%
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\@citedata@opt}
%    \begin{macrocode}
  \def\@citedata@opt{%
    \let\@cite@opt\@empty
    \@ifnextchar [{%
      \@tempswatrue
      \@citedatax@opt
    }{%
      \@tempswafalse
      \@citedatax[]%
    }%
  }%
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\@citedatax@opt}
%    \begin{macrocode}
  \def\@citedatax@opt[#1]{%
    \def\@cite@opt{, #1}%
    \@citedatax[{#1}]%
  }%
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
}{}
%    \end{macrocode}
%
% \section{Page numbers}\label{pagenum}
%
%    The last page should not contain a /Dur key, because there
%    is no page after the last page. Therefore at the last page
%    there should be a command |\hypersetup{pdfpageduration={}}|.
%    This can be set with \cmd{\AtEndDocument}, but it can
%    be too late, if the last page is already finished, or too
%    early, if lots of float pages will follow.
%    Therefore currently nothing is done by hyperref.
%
% This where we supply a destination for each page.
%    \begin{macrocode}
\ltx@ifclassloaded{slides}{%
  \def\Hy@SlidesFormatOptionalPage#1{(#1)}%
  \def\Hy@PageAnchorSlidesPlain{%
    \advance\c@page\ltx@one
    \edef\Hy@TempPageAnchor{%
      \noexpand\hyper@@anchor{%
        page.\the\c@slide.\the\c@overlay.\the\c@note%
        \ifnum\c@page=\ltx@one
        \else
          .\the\c@page
        \fi
      }%
    }%
    \advance\c@page-\ltx@one
  }%
  \def\Hy@PageAnchorSlide{%
    \advance\c@page\ltx@one
    \ifnum\c@page>\ltx@one
      \ltx@IfUndefined{theHpage}{%
        \protected@edef\Hy@TheSlideOptionalPage{%
          \Hy@SlidesFormatOptionalPage{\thepage}%
        }%
      }{%
        \protected@edef\Hy@TheSlideOptionalPage{%
          \Hy@SlidesFormatOptionalPage{\theHpage}%
        }%
      }%
    \else
      \def\Hy@TheSlideOptionalPage{}%
    \fi
    \advance\c@page-\ltx@one
    \pdfstringdef\@the@H@page{%
      \csname
        the%
        \ltx@ifundefined{theH\Hy@SlidesPage}{}{H}%
        \Hy@SlidesPage
      \endcsname
      \Hy@TheSlideOptionalPage
    }%
    \ltx@gobblethree
  }%
  \def\Hy@SlidesPage{slide}%
  \g@addto@macro\slide{%
    \def\Hy@SlidesPage{slide}%
  }%
  \g@addto@macro\overlay{%
    \def\Hy@SlidesPage{overlay}%
  }%
  \g@addto@macro\note{%
    \def\Hy@SlidesPage{note}%
  }%
}{%
  \def\Hy@PageAnchorSlidesPlain{}%
  \def\Hy@PageAnchorSlide{}%
}
\def\Hy@EveryPageAnchor{%
  \Hy@DistillerDestFix
  \ifHy@pageanchor
    \ifHy@hypertexnames
      \ifHy@plainpages
        \def\Hy@TempPageAnchor{\hyper@@anchor{page.\the\c@page}}%
        \Hy@PageAnchorSlidesPlain
      \else
        \begingroup
          \let\@number\@firstofone
          \Hy@unicodefalse
          \Hy@PageAnchorSlide
          \pdfstringdef\@the@H@page{\thepage}%
        \endgroup
        \EdefUnescapeString\@the@H@page{\@the@H@page}%
        \def\Hy@TempPageAnchor{\hyper@@anchor{page.\@the@H@page}}%
      \fi
    \else
      \Hy@GlobalStepCount\Hy@pagecounter
      \def\Hy@TempPageAnchor{%
        \hyper@@anchor{page.\the\Hy@pagecounter}%
      }%
    \fi
    \vbox to 0pt{%
      \kern\voffset
      \kern\topmargin
      \kern-1bp\relax
      \hbox to 0pt{%
        \kern\hoffset
        \kern\ifodd\value{page}%
               \oddsidemargin
             \else
               \evensidemargin
             \fi
        \kern-1bp\relax
        \Hy@TempPageAnchor\relax
        \hss
      }%
      \vss
    }%
  \fi
}
\g@addto@macro\Hy@EveryPageBoxHook{%
  \Hy@EveryPageAnchor
}
%    \end{macrocode}
%
% \section{Table of contents}\label{toc}
% TV Raman noticed that people who add arbitrary material into the TOC
% generate a bad or null link. We avoid that by checking if the current
% destination is empty. But if `the most recent destination' is not
% what you expect, you will be in trouble.
%    \begin{macrocode}
\def\addcontentsline#1#2#3{% toc extension, type, tag
  \begingroup
    \let\label\@gobble
    \ifx\@currentHref\@empty
      \Hy@Warning{%
        No destination for bookmark of \string\addcontentsline,%
        \MessageBreak destination is added%
      }%
      \phantomsection
    \fi
    \expandafter\ifx\csname toclevel@#2\endcsname\relax
      \begingroup
        \def\Hy@tempa{#1}%
        \ifx\Hy@tempa\Hy@bookmarkstype
          \Hy@WarningNoLine{%
            bookmark level for unknown #2 defaults to 0%
          }%
        \else
          \Hy@Info{bookmark level for unknown #2 defaults to 0}%
        \fi
      \endgroup
      \expandafter\gdef\csname toclevel@#2\endcsname{0}%
    \fi
    \edef\Hy@toclevel{\csname toclevel@#2\endcsname}%
    \Hy@writebookmark{\csname the#2\endcsname}%
      {#3}%
      {\@currentHref}%
      {\Hy@toclevel}%
      {#1}%
    \ifHy@verbose
      \begingroup
        \def\Hy@tempa{#3}%
        \@onelevel@sanitize\Hy@tempa
        \let\temp@online\on@line
        \let\on@line\@empty
        \Hy@Info{%
          bookmark\temp@online:\MessageBreak
          thecounter {\csname the#2\endcsname}\MessageBreak
          text {\Hy@tempa}\MessageBreak
          reference {\@currentHref}\MessageBreak
          toclevel {\Hy@toclevel}\MessageBreak
          type {#1}%
        }%
      \endgroup
    \fi
    \addtocontents{#1}{%
      \protect\contentsline{#2}{#3}{\thepage}{\@currentHref}%
    }%
  \endgroup
}
\def\contentsline#1#2#3#4{%
  \ifx\\#4\\%
    \csname l@#1\endcsname{#2}{#3}%
  \else
    \ifcase\Hy@linktoc % none
      \csname l@#1\endcsname{#2}{#3}%
    \or % section
      \csname l@#1\endcsname{%
        \hyper@linkstart{link}{#4}{#2}\hyper@linkend
      }{#3}%
    \or % page
      \csname l@#1\endcsname{{#2}}{%
        \hyper@linkstart{link}{#4}{#3}\hyper@linkend
      }%
    \else % all
      \csname l@#1\endcsname{%
        \hyper@linkstart{link}{#4}{#2}\hyper@linkend
      }{%
        \hyper@linkstart{link}{#4}{#3}\hyper@linkend
      }%
    \fi
  \fi
}
%    \end{macrocode}
%
%    \begin{macrocode}
%</package>
%<*check>
\checklatex
\checkcommand\def\addcontentsline#1#2#3{%
  \addtocontents{#1}{\protect\contentsline{#2}{#3}{\thepage}}%
}
\checkcommand\def\contentsline#1{\csname l@#1\endcsname}
%</check>
%<*package>
%    \end{macrocode}
%
% \section{New counters}\label{counters}
% The whole theorem business makes up new counters on the fly;
% we are going to intercept this. Sigh. Do it at the level where
% new counters are defined.
%    \begin{macrocode}
\let\H@definecounter\@definecounter
\def\@definecounter#1{%
  \H@definecounter{#1}%
  \expandafter\def\csname theH#1\endcsname{\arabic{#1}}%
}
%    \end{macrocode}
% But what if they have used the optional argument to e.g. |\newtheorem|
% to determine when the numbering is reset? OK, we'll trap that too.
%    \begin{macrocode}
\let\H@newctr\@newctr
\def\@newctr#1[#2]{%
  \H@newctr#1[{#2}]%
  \expandafter\def\csname theH#1\endcsname{%
    \csname the\@ifundefined{theH#2}{}{H}#2\endcsname.\arabic{#1}%
  }%
}
%    \end{macrocode}
% \section{AMS\LaTeX\ compatibility}\label{ams}
% Oh, no, they don't use anything as simple as |\refstepcounter|
% in the AMS! We need to intercept some low-level operations
% of theirs. Damned if we are going to try and work out what
% they get up to. Just stick a label of `AMS' on the front, and use the
% label \emph{they} worked out. If that produces something invalid, I give
% up. They'll change all the code again anyway, I expect (SR).
%
% Version 6.77p uses a patch by Ross Moore.
%    \begin{macrocode}
\@ifpackageloaded{amsmath}{%
  \def\Hy@make@anchor{%
    \Hy@MakeCurrentHrefAuto{AMS}%
    \Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
  }%
  \def\Hy@make@df@tag@@#1{%
    \gdef\df@tag{%
      \maketag@@@{\Hy@make@anchor#1}%
      \def\@currentlabel{#1}%
    }%
  }%
  \def\Hy@make@df@tag@@@#1{%
    \gdef\df@tag{%
      \tagform@{\Hy@make@anchor#1}%
      \toks@\@xp{\p@equation{#1}}%
      \edef\@currentlabel{\the\toks@}%
    }%
  }%
  \let\HyOrg@make@df@tag@@\make@df@tag@@
  \let\HyOrg@make@df@tag@@@\make@df@tag@@@
  \let\make@df@tag@@\Hy@make@df@tag@@
  \let\make@df@tag@@@\Hy@make@df@tag@@@
}{}
%    \end{macrocode}
% Only play with |\seteqlebal| if we are using pdftex. Other drivers
% cause problems; requested by Michael Downes (AMS).
%    \begin{macrocode}
\@ifpackagewith{hyperref}{pdftex}{%
   \let\H@seteqlabel\@seteqlabel
   \def\@seteqlabel#1{%
     \H@seteqlabel{#1}%
     \xdef\@currentHref{AMS.\the\Hy@linkcounter}%
     \Hy@raisedlink{%
       \hyper@anchorstart{\@currentHref}\hyper@anchorend
     }%
   }%
}{}
%    \end{macrocode}
% This code I simply cannot remember what I was trying to achieve.
% The final result seems to do nothing anyway.
%\begin{verbatim}
%\let\H@tagform@\tagform@
%\def\tagform@#1{%
%  \maketag@@@{\hyper@@anchor{\@currentHref}%
%  {(\ignorespaces#1\unskip)}}%
%}
%\def\eqref#1{\textup{\H@tagform@{\ref{#1}}}}
%\end{verbatim}
%
% \subsection{\texorpdfstring{\cs{@addtoreset}}{\\@addtoreset} and
%             \texorpdfstring{\cs{numberwithin}}{\\numberwithin} patches}
%
%    \cs{@addtoreset} puts a counter to the reset list of
%    another counter. After a reset the counter starts
%    again with perhaps already used values. Therefore
%    the hyperref version of the counter print command
%    \cs{theHcounter} is redefined in order to add the
%    parent counter.
%    \begin{macrocode}
\let\HyOrg@addtoreset\@addtoreset
\def\@addtoreset#1#2{%
  \HyOrg@addtoreset{#1}{#2}%
  \expandafter\xdef\csname theH#1\endcsname{%
    \expandafter\noexpand
        \csname the\@ifundefined{theH#2}{}H#2\endcsname
    .\noexpand\the\noexpand\value{#1}%
  }%
}
%    \end{macrocode}
%
%    \begin{macro}{\numberwithin}
%    A appropiate definition of hyperref's companion counter
%    (\cmd{\theH...}) is added for correct link names.
%    \begin{macrocode}
%</package>
%<*check>
\checkpackage{amsmath}[1999/12/14 - 2000/06/06]
\checkcommand\newcommand{\numberwithin}[3][\arabic]{%
  \@ifundefined{c@#2}{\@nocounterr{#2}}{%
    \@ifundefined{c@#3}{\@nocnterr{#3}}{%
      \@addtoreset{#2}{#3}%
      \@xp\xdef\csname the#2\endcsname{%
        \@xp\@nx\csname the#3\endcsname .\@nx#1{#2}%
      }%
    }%
  }%
}%
%</check>
%<*package>
\@ifpackageloaded{amsmath}{%
  \@ifpackagelater{amsmath}{1999/12/14}{%
    \renewcommand*{\numberwithin}[3][\arabic]{%
      \@ifundefined{c@#2}{\@nocounterr{#2}}{%
        \@ifundefined{c@#3}{\@nocnterr{#3}}{%
          \HyOrg@addtoreset{#2}{#3}%
          \@xp\xdef\csname the#2\endcsname{%
            \@xp\@nx\csname the#3\endcsname .\@nx#1{#2}%
          }%
          \@xp\xdef\csname theH#2\endcsname{%
            \@xp\@nx
            \csname the\@ifundefined{theH#3}{}H#3\endcsname
            .\@nx#1{#2}%
          }%
        }%
      }%
    }%
  }{%
    \Hy@WarningNoLine{%
      \string\numberwithin\space of package `amsmath' %
      only fixed\MessageBreak
      for version 2000/06/06 v2.12 or newer%
    }%
  }%
}{}
%    \end{macrocode}
%    \end{macro}
%
% \section{Included figures}
% Simply intercept the low level graphics package macro.
%    \begin{macrocode}
\ifHy@hyperfigures
  \let\Hy@Gin@setfile\Gin@setfile
  \def\Gin@setfile#1#2#3{%
    \hyperimage{#3}{\Hy@Gin@setfile{#1}{#2}{#3}}%
  }%
\fi
\Hy@DisableOption{hyperfigures}
%    \end{macrocode}
%
% \section{hyperindex entries}\label{hyperindex}
% Internal command names are prefixed with \cmd{\HyInd@}.
%
% Hyper-indexing works crudely, by forcing code onto the end of the index
% entry with the \verb+|+ feature; this puts a hyperlink around
% the printed page numbers. It will not proceed if the author has already
% used the \verb+|+ specifier for something like emboldening entries.
% That would make Makeindex fail (cannot have two \verb+|+ specifiers).
% The solution is for the author to use generic coding, and put in
% the requisite |\hyperpage| in his/her own macros along with the boldness.
%
% This section is poor stuff; it's open to all sorts of abuse. Sensible
% large projects will design their own indexing macros any bypass this.
%    \begin{macrocode}
\ifHy@hyperindex
  \def\HyInd@ParenLeft{(}%
  \def\HyInd@ParenRight{)}%
  \def\hyperindexformat#1#2{%
    \let\HyOrg@hyperpage\hyperpage
    \let\hyperpage\@firstofone
    #1{\HyOrg@hyperpage{#2}}%
    \let\hyperpage\HyOrg@hyperpage
  }%
  \Hy@nextfalse
  \@ifpackageloaded{multind}{\Hy@nexttrue}{}%
  \@ifpackageloaded{index}{\Hy@nexttrue}{}%
  \@ifpackageloaded{amsmidx}{\Hy@nexttrue}{}%
  \begingroup
    \lccode`\|=\expandafter`\HyInd@EncapChar\relax
    \lccode`\/=`\\\relax
  \lowercase{\endgroup
    \ifHy@next
      \let\HyInd@org@wrindex\@wrindex
      \def\@wrindex#1#2{\HyInd@@wrindex{#1}#2||\\}%
      \def\HyInd@@wrindex#1#2|#3|#4\\{%
        \ifx\\#3\\%
          \HyInd@org@wrindex{#1}{#2|hyperpage}%
        \else
          \HyInd@@@wrindex{#1}{#2}#3\\%
        \fi
      }%
      \def\HyInd@@@wrindex#1#2#3#4\\{%
        \def\Hy@temp@A{#3}%
        \ifcase0\ifx\Hy@temp@A\HyInd@ParenLeft 1\fi
                \ifx\Hy@temp@A\HyInd@ParenRight 1\fi
                \relax
          \HyInd@org@wrindex{#1}{%
            #2|hyperindexformat{/#3#4}%
          }%
        \else
          \ifx\\#4\\%
            \ifx\Hy@temp@A\HyInd@ParenRight
              \HyInd@org@wrindex{#1}{#2|#3}%
            \else
              \HyInd@org@wrindex{#1}{#2|#3hyperpage}%
            \fi
          \else
            \HyInd@org@wrindex{#1}{%
              #2|#3hyperindexformat{/#4}%
            }%
          \fi
        \fi
      }%
    \else
      \def\@wrindex#1{\@@wrindex#1||\\}%
      \def\@@wrindex#1|#2|#3\\{%
        \if@filesw
          \ifx\\#2\\%
            \protected@write\@indexfile{}{%
              \string\indexentry{#1|hyperpage}{\thepage}%
            }%
          \else
            \HyInd@@@wrindex{#1}#2\\%
          \fi
        \fi
        \endgroup
        \@esphack
      }%
      \def\HyInd@@@wrindex#1#2#3\\{%
        \def\Hy@temp@A{#2}%
        \ifcase0\ifx\Hy@temp@A\HyInd@ParenLeft 1\fi
                \ifx\Hy@temp@A\HyInd@ParenRight 1\fi
                \relax
          \protected@write\@indexfile{}{%
            \string\indexentry{%
              #1|hyperindexformat{/#2#3}%
            }{\thepage}%
          }%
        \else
          \ifx\\#3\\%
            \ifx\Hy@temp@A\HyInd@ParenRight
              \protected@write\@indexfile{}{%
                 \string\indexentry{#1|#2}{\thepage}%
              }%
            \else
              \protected@write\@indexfile{}{%
                 \string\indexentry{#1|#2hyperpage}{\thepage}%
              }%
            \fi
          \else
            \protected@write\@indexfile{}{%
               \string\indexentry{%
                 #1|#2hyperindexformat{/#3}%
               }{\thepage}%
            }%
          \fi
        \fi
      }%
    \fi
  }%
\fi
\Hy@DisableOption{hyperindex}
\Hy@DisableOption{encap}
%    \end{macrocode}
%
%    \begin{macro}{\nohyperpage}
%    The definition of \cs{nohyperpage} is just a precaution.
%    It is used to mark code that does not belong to a page
%    number, but \cs{nohyperpage} is never executed.
%    \begin{macrocode}
\def\nohyperpage#1{#1}
%    \end{macrocode}
%    \end{macro}
% This again is quite flaky, but allow for the common situation of a
% page range separated by en-rule. We split this into two different
% hyperlinked pages.
%    \begin{macrocode}
\def\hyperpage#1{%
  \HyInd@hyperpage#1\nohyperpage{}\@nil
}
\def\HyInd@hyperpage#1\nohyperpage#2#3\@nil{%
  \HyInd@@hyperpage{#1}%
  #2%
  \def\Hy@temp{#3}%
  \ifx\Hy@temp\@empty
  \else
    \ltx@ReturnAfterFi{%
      \HyInd@hyperpage#3\@nil
    }%
  \fi
}
\def\HyInd@@hyperpage#1{\@hyperpage#1----\\}
\def\@hyperpage#1--#2--#3\\{%
  \ifx\\#2\\%
    \@commahyperpage{#1}%
  \else
    \HyInd@pagelink{#1}--\HyInd@pagelink{#2}%
  \fi
}
\def\@commahyperpage#1{\@@commahyperpage#1, ,\\}
\def\@@commahyperpage#1, #2,#3\\{%
  \ifx\\#2\\%
    \HyInd@pagelink{#1}%
  \else
    \HyInd@pagelink{#1}, \HyInd@pagelink{#2}%
  \fi
}
%    \end{macrocode}
%
%    The argument of \cmd{\hyperpage} can be empty. And the
%    line breaking algorithm of Makeindex can introduce spaces.
%    So we have to remove them.
%    \begin{macrocode}
\def\HyInd@pagelink#1{%
  \begingroup
    \toks@={}%
    \HyInd@removespaces#1 \@nil
  \endgroup
}
\def\HyInd@removespaces#1 #2\@nil{%
  \toks@=\expandafter{\the\toks@#1}%
  \ifx\\#2\\%
    \edef\x{\the\toks@}%
    \ifx\x\@empty
    \else
      \hyperlink{page.\the\toks@}{\the\toks@}%
    \fi
  \else
    \ltx@ReturnAfterFi{%
      \HyInd@removespaces#2\@nil
    }%
  \fi
}
%    \end{macrocode}
%
% \section{Compatibility with foiltex}
%
%    \begin{macrocode}
\@ifclassloaded{foils}{%
  \providecommand*\ext@table{lot}%
  \providecommand*\ext@figure{lof}%
}{}
%    \end{macrocode}
%
% \section{Compatibility with seminar slide package}\label{seminar}
%    This requires \texttt{seminar.bg2}, version 1.6 or later.
%    Contributions by Denis Girou (\Email{denis.girou@idris.fr}).
%    \begin{macrocode}
\@ifclassloaded{seminar}{%
  \Hy@seminarslidestrue
  \providecommand\theHslide{\arabic{slide}}%
}{%
  \Hy@seminarslidesfalse
}
\@ifpackageloaded{slidesec}{%
  \providecommand\theHslidesection   {\arabic{slidesection}}%
  \providecommand\theHslidesubsection{%
    \theHslidesection.\arabic{slidesubsection}%
  }%
  \def\slide@heading[#1]#2{%
    \H@refstepcounter{slidesection}%
    \@addtoreset{slidesubsection}{slidesection}%
    \addtocontents{los}{%
      \protect\l@slide{\the\c@slidesection}{\ignorespaces#1}%
        {\@SCTR}{slideheading.\theslidesection}%
    }%
    \def\Hy@tempa{#2}%
    \ifx\Hy@tempa\@empty
    \else
      {%
        \edef\@currentlabel{%
          \csname p@slidesection\endcsname\theslidesection
        }%
        \makeslideheading{#2}%
      }%
    \fi
    \gdef\theslideheading{#1}%
    \gdef\theslidesubheading{}%
    \ifHy@bookmarksnumbered
      \def\Hy@slidetitle{\theslidesection\space #1}%
    \else
      \def\Hy@slidetitle{#1}%
    \fi
    \ifHy@hypertexnames
       \ifHy@naturalnames
         \hyper@@anchor{slideheading.\theslidesection}{\relax}%
         \Hy@writebookmark
           {\theslidesection}%
           {\Hy@slidetitle}%
           {slideheading.\theslidesection}%
           {1}%
           {toc}%
       \else
         \hyper@@anchor{slideheading.\theHslidesection}{\relax}%
         \Hy@writebookmark
           {\theslidesection}%
           {\Hy@slidetitle}%
           {slideheading.\theHslidesection}%
           {1}%
           {toc}%
       \fi
    \else
      \Hy@GlobalStepCount\Hy@linkcounter
      \hyper@@anchor{slideheading.\the\Hy@linkcounter}{\relax}%
      \Hy@writebookmark
        {\theslidesection}%
        {\Hy@slidetitle}%
        {slideheading.\the\Hy@linkcounter}%
        {1}%
        {toc}%
    \fi
  }%
  \def\slide@subheading[#1]#2{%
    \H@refstepcounter{slidesubsection}%
    \addtocontents{los}{%
      \protect\l@subslide{\the\c@slidesubsection}{\ignorespaces#1}%
        {\@SCTR}{slideheading.\theslidesubsection}%
    }%
    \def\Hy@tempa{#2}%
    \ifx\Hy@tempa\@empty
    \else
      {%
        \edef\@currentlabel{%
          \csname p@slidesubsection\endcsname\theslidesubsection
        }%
        \makeslidesubheading{#2}%
      }%
    \fi
    \gdef\theslidesubheading{#1}%
    \ifHy@bookmarksnumbered
      \def\Hy@slidetitle{\theslidesubsection\space #1}%
    \else
      \def\Hy@slidetitle{#1}%
    \fi
    \ifHy@hypertexnames
      \ifHy@naturalnames
        \hyper@@anchor{slideheading.\theslidesubsection}{\relax}%
        \Hy@writebookmark
          {\theslidesubsection}%
          {\Hy@slidetitle}%
          {slideheading.\theslidesubsection}%
          {2}%
          {toc}%
      \else
        \hyper@@anchor{slideheading.\theHslidesubsection}{\relax}%
        \Hy@writebookmark
          {\theslidesubsection}%
          {\Hy@slidetitle}%
          {slideheading.\theHslidesubsection}%
          {2}%
          {toc}%
      \fi
    \else
      \Hy@GlobalStepCount\Hy@linkcounter
      \hyper@@anchor{slideheading.\the\Hy@linkcounter}{\relax}%
      \Hy@writebookmark
        {\theslidesubsection}%
        {\Hy@slidetitle}%
        {slideheading.\the\Hy@linkcounter}%
        {1}%
        {toc}%
    \fi
  }%
  \providecommand*{\listslidename}{List of Slides}%
  \def\listofslides{%
    \section*{%
      \listslidename
      \@mkboth{%
        \expandafter\MakeUppercase\listslidename
      }{%
        \expandafter\MakeUppercase\listslidename
      }%
    }%
    \def\l@slide##1##2##3##4{%
      \slide@undottedcline{%
        \slidenumberline{##3}{\hyperlink{##4}{##2}}%
      }{}%
    }%
    \let\l@subslide\l@slide
    \@startlos
  }%
  \def\slide@contents{%
    \def\l@slide##1##2##3##4{%
      \slide@cline{\slidenumberline{##3}{\hyperlink{##4}{##2}}}{##3}%
    }%
    \let\l@subslide\@gobblefour
    \@startlos
  }%
  \def\Slide@contents{%
    \def\l@slide##1##2##3##4{%
      \ifcase\lslide@flag
        \message{##1 ** \the\c@slidesection}%
        \ifnum##1>\c@slidesection
          \def\lslide@flag{1}%
          {%
            \large
            \slide@cline{%
              \slidenumberline{$\Rightarrow\bullet$}%
                {\hyperlink{##4}{##2}}%
            }{##3}%
          }%
        \else
          {%
            \large
            \slide@cline{%
              \slidenumberline{$\surd\;\bullet$}%
                {\hyperlink{##4}{##2}}%
            }{##3}%
          }%
        \fi
      \or
        \def\lslide@flag{2}%
        {%
          \large
          \slide@cline{%
            \slidenumberline{$\bullet$}%
              {\hyperlink{##4}{##2}}%
          }{##3}%
        }%
      \or
        {%
          \large
          \slide@cline{%
            \slidenumberline{$\bullet$}%
             {\hyperlink{##4}{##2}}%
          }{##3}%
        }%
      \fi
    }%
    \def\l@subslide##1##2##3##4{%
      \ifnum\lslide@flag=1 %
        \@undottedtocline{2}{3.8em}{3.2em}{\hyperlink{##4}{##2}}{}%
      \fi
    }%
    \def\lslide@flag{0}%
    \@startlos
  }%
}{}
%    \end{macrocode}
% This breaks TeX4ht, so leave it to last.
% Emend |\@setref| to put out a hypertext link as well as its
% normal text (which is used as an anchor).
% (|\endinput| have to be on the same line like |\fi|, or you
% have to use |\expandafter| before.)
%    \begin{macrocode}
\ifHy@texht
  \expandafter\endinput
\fi
\let\real@setref\@setref
\def\@setref#1#2#3{% csname, extract group, refname
  \ifx#1\relax
    \protect\G@refundefinedtrue
    \nfss@text{\reset@font\bfseries ??}%
    \@latex@warning{%
      Reference `#3' on page \thepage \space undefined%
    }%
  \else
    \expandafter\Hy@setref@link#1\@empty\@empty\@nil{#2}%
  \fi
}
%    \end{macrocode}
%    \cmd{\Hy@setref@link} extracts the reference information entries,
%    because \cmd{\hyper@@link} does not expand arguments for the
%    automatic link type detection.
%    \begin{macrocode}
\def\Hy@setref@link#1#2#3#4#5#6\@nil#7{%
  \begingroup
    \toks0={\hyper@@link{#5}{#4}}%
    \toks1=\expandafter{#7{#1}{#2}{#3}{#4}{#5}}%
    \edef\x{\endgroup
      \the\toks0 {\the\toks1 }%
    }%
  \x
}
\def\@pagesetref#1#2#3{% csname, extract macro, ref
  \ifx#1\relax
    \protect\G@refundefinedtrue
    \nfss@text{\reset@font\bfseries ??}%
    \@latex@warning{%
      Reference `#3' on page \thepage \space undefined%
    }%
  \else
    \protect\hyper@@link
      {\expandafter\@fifthoffive#1}%
      {page.\expandafter\@secondoffive#1}%
      {\expandafter\@secondoffive#1}%
  \fi
}
%    \end{macrocode}
%
%    \begin{macrocode}
%</package>
%<*check>
\checklatex
\checkcommand\def\@setref#1#2#3{%
  \ifx#1\relax
    \protect\G@refundefinedtrue
    \nfss@text{\reset@font\bfseries ??}%
    \@latex@warning{%
      Reference `#3' on page \thepage\space undefined%
    }%
  \else
    \expandafter#2#1\null
  \fi
}
%</check>
%<*package>
%    \end{macrocode}
%
% Now some extended referencing. |\ref*| and |\pageref*| are not linked,
% and |\autoref| prefixes with a tag based on the type.
%    \begin{macrocode}
\def\HyRef@StarSetRef#1{%
  \begingroup
    \Hy@safe@activestrue
    \edef\x{#1}%
    \@onelevel@sanitize\x
    \edef\x{\endgroup
      \noexpand\HyRef@@StarSetRef
        \expandafter\noexpand\csname r@\x\endcsname{\x}%
    }%
  \x
}
\def\HyRef@@StarSetRef#1#2#3{%
  \ifx#1\@undefined
    \let#1\relax
  \fi
  \real@setref#1#3{#2}%
}
\def\@refstar#1{%
  \HyRef@StarSetRef{#1}\@firstoffive
}
\def\@pagerefstar#1{%
  \HyRef@StarSetRef{#1}\@secondoffive
}
\def\@namerefstar#1{%
  \HyRef@StarSetRef{#1}\@thirdoffive
}
\Hy@AtBeginDocument{%
  \@ifpackageloaded{varioref}{%
    \def\@Refstar#1{%
      \HyRef@StarSetRef{#1}\HyRef@MakeUppercaseFirstOfFive
    }%
    \def\HyRef@MakeUppercaseFirstOfFive#1#2#3#4#5{%
      \MakeUppercase#1%
    }%
    \DeclareRobustCommand*{\Ref}{%
      \@ifstar\@Refstar\HyRef@Ref
    }%
    \def\HyRef@Ref#1{%
      \hyperref[{#1}]{\Ref*{#1}}%
    }%
    \def\Vr@f#1{%
      \leavevmode\unskip\vref@space
      \hyperref[{#1}]{%
        \Ref*{#1}%
        \let\vref@space\nobreakspace
        \@vpageref[\unskip]{#1}%
      }%
    }%
    \def\vr@f#1{%
      \leavevmode\unskip\vref@space
      \begingroup
        \let\T@pageref\@pagerefstar
        \hyperref[{#1}]{%
          \ref*{#1}%
          \vpageref[\unskip]{#1}%
        }%
      \endgroup
    }%
  }{}%
}
\DeclareRobustCommand*{\autopageref}{%
  \@ifstar{%
    \HyRef@autopagerefname\pageref*%
  }\HyRef@autopageref
}
\def\HyRef@autopageref#1{%
  \hyperref[{#1}]{\HyRef@autopagerefname\pageref*{#1}}%
}
\def\HyRef@autopagerefname{%
  \ltx@IfUndefined{pageautorefname}{%
    \ltx@IfUndefined{pagename}{%
      \Hy@Warning{No autoref name for `page'}%
    }{%
      \pagename\nobreakspace
    }%
  }{%
    \pageautorefname\nobreakspace
  }%
}
%    \end{macrocode}
%    \cs{leavevmode} is added to make package wrapfigure happy, if
%    \cs{autoref} starts a paragraph.
%    \begin{macrocode}
\DeclareRobustCommand*{\autoref}{%
  \leavevmode
  \@ifstar{\HyRef@autoref\@gobbletwo}{\HyRef@autoref\hyper@@link}%
}
\def\HyRef@autoref#1#2{%
  \begingroup
    \Hy@safe@activestrue
    \expandafter\HyRef@autosetref\csname r@#2\endcsname{#2}{#1}%
  \endgroup
}
\def\HyRef@autosetref#1#2#3{% link command, csname, refname
  \HyRef@ShowKeysRef{#2}%
  \ifcase 0\ifx#1\relax 1\fi\ifx#1\Hy@varioref@undefined 1\fi\relax
    \edef\HyRef@thisref{%
      \expandafter\@fourthoffive#1\@empty\@empty\@empty
    }%
    \expandafter\HyRef@testreftype\HyRef@thisref.\\%
    \Hy@safe@activesfalse
    #3{%
      \expandafter\@fifthoffive#1\@empty\@empty\@empty
    }{%
      \expandafter\@fourthoffive#1\@empty\@empty\@empty
    }{%
      \HyRef@currentHtag
      \expandafter\@firstoffive#1\@empty\@empty\@empty
      \null
    }%
  \else
    \protect\G@refundefinedtrue
    \nfss@text{\reset@font\bfseries ??}%
    \@latex@warning{%
      Reference `#2' on page \thepage\space undefined%
    }%
  \fi
}
\def\HyRef@testreftype#1.#2\\{%
  \ltx@IfUndefined{#1autorefname}{%
    \ltx@IfUndefined{#1name}{%
      \HyRef@StripStar#1\\*\\\@nil{#1}%
      \ltx@IfUndefined{\HyRef@name autorefname}{%
        \ltx@IfUndefined{\HyRef@name name}{%
          \def\HyRef@currentHtag{}%
          \Hy@Warning{No autoref name for `#1'}%
        }{%
          \edef\HyRef@currentHtag{%
            \expandafter\noexpand\csname\HyRef@name name\endcsname
            \noexpand~%
          }%
        }%
      }{%
        \edef\HyRef@currentHtag{%
          \expandafter\noexpand
          \csname\HyRef@name autorefname\endcsname
          \noexpand~%
        }%
      }%
    }{%
      \edef\HyRef@currentHtag{%
        \expandafter\noexpand\csname#1name\endcsname
        \noexpand~%
      }%
    }%
  }{%
    \edef\HyRef@currentHtag{%
      \expandafter\noexpand\csname#1autorefname\endcsname
      \noexpand~%
    }%
  }%
}
\def\HyRef@StripStar#1*\\#2\@nil#3{%
  \def\HyRef@name{#2}%
  \ifx\HyRef@name\HyRef@CaseStar
    \def\HyRef@name{#1}%
  \else
    \def\HyRef@name{#3}%
  \fi
}
\def\HyRef@CaseStar{*\\}
\def\HyRef@currentHtag{}
%    \end{macrocode}
%
%    Support for package |showkeys|.
%    \begin{macro}{\HyRef@ShowKeysRef}
%    \begin{macrocode}
\let\HyRef@ShowKeysRef\@gobble
\def\HyRef@ShowKeysInit{%
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname SK@@label\endcsname\relax
  \else
    \ifx\SK@ref\@empty
    \else
      \def\HyRef@ShowKeysRef{%
        \SK@\SK@@ref
      }%
    \fi
  \fi
}
\@ifpackageloaded{showkeys}{%
  \HyRef@ShowKeysInit
}{%
  \Hy@AtBeginDocument{%
    \@ifpackageloaded{showkeys}{%
      \HyRef@ShowKeysInit
    }{}%
  }%
}
%    \end{macrocode}
%    \end{macro}
%
%    Defaults for the names that \cmd{\autoref} uses.
%    \begin{macrocode}
\providecommand*\AMSautorefname{\equationautorefname}
\providecommand*\Hfootnoteautorefname{\footnoteautorefname}
\providecommand*\Itemautorefname{\itemautorefname}
\providecommand*\itemautorefname{item}
\providecommand*\equationautorefname{Equation}
\providecommand*\footnoteautorefname{footnote}
\providecommand*\itemautorefname{item}
\providecommand*\figureautorefname{Figure}
\providecommand*\tableautorefname{Table}
\providecommand*\partautorefname{Part}
\providecommand*\appendixautorefname{Appendix}
\providecommand*\chapterautorefname{chapter}
\providecommand*\sectionautorefname{section}
\providecommand*\subsectionautorefname{subsection}
\providecommand*\subsubsectionautorefname{subsubsection}
\providecommand*\paragraphautorefname{paragraph}
\providecommand*\subparagraphautorefname{subparagraph}
\providecommand*\FancyVerbLineautorefname{line}
\providecommand*\theoremautorefname{Theorem}
\providecommand*\pageautorefname{page}
%    \end{macrocode}
%
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
% \section{Configuration files}
%
% \subsection{PS/PDF strings}
%
%    Some drivers write PS or PDF strings. These strings are delimited
%    by parentheses, therefore a lonely unmatched parenthesis must be
%    avoided to avoid PS or PDF syntax errors. Also the backslash character
%    itself has to be protected.
%
%    \begin{macro}{\Hy@pstringdef}
%    Therefore such strings should be passed through |\Hy@pstringdef|.
%    The first argument holds a macro for the result, the second
%    argument is the string that needs protecting.
%    Since version 1.30.0 pdf\TeX\ offers \cs{pdfescapestring}.
%    \begin{macrocode}
%<*pdftex|dvipdfm|xetex|vtex|pdfmarkbase|dviwindo>
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname pdf@escapestring\endcsname\relax
  \begingroup
    \catcode`\|=0 %
    \@makeother\\%
  |@firstofone{|endgroup
    |def|Hy@pstringdef#1#2{%
      |begingroup
        |edef~{|string~}%
        |xdef|Hy@gtemp{#2}%
      |endgroup
      |let#1|Hy@gtemp
      |@onelevel@sanitize#1%
      |edef#1{|expandafter|Hy@ExchangeBackslash#1\|@nil}%
      |edef#1{|expandafter|Hy@ExchangeLeftParenthesis#1(|@nil}%
      |edef#1{|expandafter|Hy@ExchangeRightParenthesis#1)|@nil}%
    }%
    |def|Hy@ExchangeBackslash#1\#2|@nil{%
      #1%
      |ifx|\#2|\%%
      |else
        \\%
        |ltx@ReturnAfterFi{%
          |Hy@ExchangeBackslash#2|@nil
        }%
      |fi
    }%
  }%
  \def\Hy@ExchangeLeftParenthesis#1(#2\@nil{%
    #1%
    \ifx\\#2\\%
    \else
      \@backslashchar(%
      \ltx@ReturnAfterFi{%
        \Hy@ExchangeLeftParenthesis#2\@nil
      }%
    \fi
  }%
  \def\Hy@ExchangeRightParenthesis#1)#2\@nil{%
    #1%
    \ifx\\#2\\%
    \else
      \@backslashchar)%
      \ltx@ReturnAfterFi{%
        \Hy@ExchangeRightParenthesis#2\@nil
      }%
    \fi
  }%
\else
  \def\Hy@pstringdef#1#2{%
    \begingroup
      \edef~{\string~}%
      \xdef\Hy@gtemp{\pdf@escapestring{#2}}%
    \endgroup
    \let#1\Hy@gtemp
  }%
\fi
%</pdftex|dvipdfm|xetex|vtex|pdfmarkbase|dviwindo>
%    \end{macrocode}
%    \end{macro}
%
% \subsection{pdftex}
%
%    \begin{macrocode}
%<*pdftex>
\providecommand*{\XR@ext}{pdf}
\Hy@setbreaklinks{true}
\def\HyPat@ObjRef{%
  [0-9]*[1-9][0-9]* 0 R%
}
%    \end{macrocode}
% This driver is for Han The Thanh's \TeX{} variant
% which produces PDF directly. This has new primitives
% to do PDF things, which usually translate almost directly to
% PDF code, so there is a lot of flexibility which we do not at
% present harness.
%
%    Set PDF version if requested by option \textsf{pdfversion}.
%    \begin{itemize}
%    \item pdf\TeX\ 1.10a, 2003-01-16: \cs{pdfoptionpdfminorversion}
%    \item pdf\TeX\ 1.30, 2005-08-081: \cs{pdfminorversion}
%    \end{itemize}
%    \begin{macrocode}
\let\Hy@pdfminorversion\relax
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname pdfminorversion\endcsname\relax
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname pdfoptionpdfminorversion\endcsname\relax
  \else
    \def\Hy@pdfminorversion{\pdfoptionpdfminorversion}%
  \fi
\else
  \def\Hy@pdfminorversion{\pdfminorversion}%
\fi
\@ifundefined{Hy@pdfminorversion}{%
  \PackageInfo{hyperref}{%
    PDF version is not set, because pdfTeX is too old (<1.10a)%
  }%
}{%
  \ifHy@ocgcolorlinks
    \ifnum\Hy@pdfminorversion<5 %
      \kvsetkeys{Hyp}{pdfversion=1.5}%
    \fi
  \fi
  \ifHy@setpdfversion
    \ifnum\Hy@pdfminorversion=\Hy@pdfversion\relax
    \else
      \Hy@pdfminorversion=\Hy@pdfversion\relax
    \fi
    \PackageInfo{hyperref}{%
      \expandafter\string\Hy@pdfminorversion
      :=\number\Hy@pdfversion\space
    }%
  \fi
  \edef\Hy@pdfversion{\number\Hy@pdfminorversion}%
}
\Hy@DisableOption{pdfversion}%
%    \end{macrocode}
%
%    \begin{macrocode}
\ifHy@ocgcolorlinks
  \pdf@ifdraftmode{}{%
    \immediate\pdfobj{%
      <<%
        /Type/OCG%
        /Name(View)%
        /Usage<<%
          /Print<<%
            /PrintState/OFF%
          >>%
          /View<<%
            /ViewState/ON%
          >>%
        >>%
      >>%
    }%
    \edef\OBJ@OCG@view{\the\pdflastobj\space 0 R}%
    \immediate\pdfobj{%
      <<%
        /Type/OCG%
        /Name(Print)%
        /Usage<<%
          /Print<<%
            /PrintState/ON%
          >>%
          /View<<%
            /ViewState/OFF%
          >>%
        >>%
      >>%
    }%
    \edef\OBJ@OCG@print{\the\pdflastobj\space 0 R}%
    \immediate\pdfobj{%
      [%
        \OBJ@OCG@view\space\OBJ@OCG@print
      ]%
    }%
    \edef\OBJ@OCGs{\the\pdflastobj\space 0 R}%
    \pdfcatalog{%
      /OCProperties<<%
        /OCGs \OBJ@OCGs
        /D<<%
          /OFF[\OBJ@OCG@print]%
          /AS[%
            <<%
              /Event/View%
              /OCGs \OBJ@OCGs
              /Category[/View]%
            >>%
            <<%
              /Event/Print%
              /OCGs \OBJ@OCGs
              /Category[/Print]%
            >>%
            <<%
              /Event/Export%
              /OCGs \OBJ@OCGs
              /Category[/Print]%
            >>%
          ]%
        >>%
      >>%
    }%
    \begingroup
      \edef\x{\endgroup
        \pdfpageresources{%
          /Properties<<%
            /OCView \OBJ@OCG@view
            /OCPrint \OBJ@OCG@print
          >>%
        }%
      }%
    \x
  }%
  \Hy@AtBeginDocument{%
    \def\Hy@colorlink#1{%
      \begingroup
        \ifHy@ocgcolorlinks
          \def\Hy@ocgcolor{#1}%
          \setbox0=\hbox\bgroup\color@begingroup
        \else
          \HyColor@UseColor#1%
        \fi
    }%
    \def\Hy@endcolorlink{%
      \ifHy@ocgcolorlinks
        \color@endgroup\egroup
        \mbox{%
          \pdfliteral page{/OC/OCPrint BDC}%
          \rlap{\copy0}%
          \pdfliteral page{EMC/OC/OCView BDC}%
          \begingroup
            \expandafter\HyColor@UseColor\Hy@ocgcolor
            \box0 %
          \endgroup
          \pdfliteral page{EMC}%
        }%
      \fi
      \endgroup
    }%
  }%
\else
  \Hy@DisableOption{ocgcolorlinks}%
\fi
%    \end{macrocode}
%
% First, allow for some changes and additions to pdftex  syntax:
%    \begin{macrocode}
\def\setpdflinkmargin#1{\pdflinkmargin#1}
\ifx\pdfstartlink\@undefined% less than version 14
  \let\pdfstartlink\pdfannotlink
  \let\pdflinkmargin\@tempdima
  \let\pdfxform\pdfform
  \let\pdflastxform\pdflastform
  \let\pdfrefxform\pdfrefform
\else
  \pdflinkmargin1pt %
\fi
%    \end{macrocode}
% First set up the default linking
%    \begin{macrocode}
\providecommand*\@pdfview{XYZ}
%    \end{macrocode}
% First define the anchors:
%    \begin{macrocode}
\Hy@WrapperDef\new@pdflink#1{%
  \ifhmode
    \@savsf\spacefactor
  \fi
  \Hy@SaveLastskip
  \Hy@VerboseAnchor{#1}%
  \Hy@pstringdef\Hy@pstringDest{\HyperDestNameFilter{#1}}%
  \Hy@DestName\Hy@pstringDest\@pdfview
  \Hy@RestoreLastskip
  \ifhmode
    \spacefactor\@savsf
  \fi
}
\let\pdf@endanchor\@empty
%    \end{macrocode}
%    \begin{macro}{\Hy@DestName}
%    Wrap the call of \verb|\pdfdest name| in \cs{Hy@DestName}.
%    Then it can easier be catched by package |hypdestopt|.
%    \begin{macrocode}
\def\Hy@DestName#1#2{%
  \pdfdest name{#1}#2\relax
}
%    \end{macrocode}
%    \end{macro}
%
% Now the links; the interesting part here is the set of attributes
% which define how the link looks. We probably want to add a border
% and color it, but there are other choices. This directly translates
% to PDF code, so consult the manual for how to change this. We will
% add an interface at some point.
%    \begin{macrocode}
\providecommand*\@pdfborder{0 0 1}
\providecommand*\@pdfborderstyle{}
\def\Hy@undefinedname{UNDEFINED}
\def\find@pdflink#1#2{%
  \leavevmode
  \protected@edef\Hy@testname{#2}%
  \ifx\Hy@testname\@empty
    \Hy@Warning{%
      Empty destination name,\MessageBreak
      using `\Hy@undefinedname'%
    }%
    \let\Hy@testname\Hy@undefinedname
  \else
    \Hy@pstringdef\Hy@testname{%
      \expandafter\HyperDestNameFilter\expandafter{\Hy@testname}%
    }%
  \fi
  \Hy@StartlinkName{%
    \ifHy@pdfa /F 4\fi
    \Hy@setpdfborder
    \ifx\@pdfhighlight\@empty
    \else
      /H\@pdfhighlight
    \fi
    \ifx\CurrentBorderColor\relax
    \else
      /C[\CurrentBorderColor]%
    \fi
  }\Hy@testname
  \expandafter\Hy@colorlink\csname @#1color\endcsname
}
\def\Hy@StartlinkName#1#2{%
  \pdfstartlink attr{#1}goto name{#2}\relax
}
\def\close@pdflink{%
  \Hy@endcolorlink
  \Hy@VerboseLinkStop
  \pdfendlink
}
\def\hyper@anchor#1{%
  \new@pdflink{#1}\anchor@spot\pdf@endanchor
}
\def\hyper@anchorstart#1{%
  \new@pdflink{#1}%
  \Hy@activeanchortrue
}
\def\hyper@anchorend{%
  \pdf@endanchor
  \Hy@activeanchorfalse
}
\def\hyper@linkstart#1#2{%
  \Hy@VerboseLinkStart{#1}{#2}%
  \ltx@IfUndefined{@#1bordercolor}{%
    \let\CurrentBorderColor\relax
  }{%
    \edef\CurrentBorderColor{\csname @#1bordercolor\endcsname}%
  }%
  \find@pdflink{#1}{#2}%
}
\def\hyper@linkend{\close@pdflink}
\def\hyper@link#1#2#3{%
  \Hy@VerboseLinkStart{#1}{#2}%
  \ltx@IfUndefined{@#1bordercolor}{%
    \let\CurrentBorderColor\relax
  }{%
    \edef\CurrentBorderColor{\csname @#1bordercolor\endcsname}%
  }%
  \find@pdflink{#1}{#2}#3\Hy@xspace@end
  \close@pdflink
}
\let\CurrentBorderColor\@linkbordercolor
\def\hyper@linkurl#1#2{%
  \begingroup
    \Hy@pstringdef\Hy@pstringURI{#2}%
    \hyper@chars
    \leavevmode
    \pdfstartlink
      attr{%
        \Hy@setpdfborder
        \ifx\@pdfhightlight\@empty
        \else
          /H\@pdfhighlight
        \fi
        \ifx\@urlbordercolor\relax
        \else
          /C[\@urlbordercolor]%
        \fi
      }%
      user{%
       /Subtype/Link%
       \ifHy@pdfa /F 4\fi
       /A<<%
         /Type/Action%
         /S/URI%
         /URI(\Hy@pstringURI)%
         \ifHy@href@ismap
           /IsMap true%
         \fi
         \Hy@href@nextactionraw
       >>%
      }%
      \relax
    \Hy@colorlink\@urlcolor#1\Hy@xspace@end
    \close@pdflink
  \endgroup
}
\def\hyper@linkfile#1#2#3{% anchor text, filename, linkname
  \begingroup
    \def\Hy@pstringF{#2}%
    \Hy@CleanupFile\Hy@pstringF
    \Hy@pstringdef\Hy@pstringF\Hy@pstringF
    \Hy@pstringdef\Hy@pstringD{#3}%
    \Hy@MakeRemoteAction
    \leavevmode
    \pdfstartlink
      attr{%
        \Hy@setpdfborder
        \ifx\@pdfhighlight\@empty
        \else
          /H\@pdfhighlight
        \fi
        \ifx\@filebordercolor\relax
        \else
          /C[\@filebordercolor]%
        \fi
      }%
      user {%
        /Subtype/Link%
        \ifHy@pdfa /F 4\fi
        /A<<%
          /F(\Hy@pstringF)%
          /S/GoToR%
          \Hy@SetNewWindow
%    \end{macrocode}
% If |#3| is empty, page 0; if its a number, Page number, otherwise
% a named destination.
% \begin{verbatim}
% \afterassignment\xxx\count@=0\foo!%
%
%\def\xxx#1!{%
%  \ifx\xxx#1\xxx
%     foo was an integer
%  \else
%     it wasnt
%  \fi}
% \end{verbatim}
%    \begin{macrocode}
          \ifx\\#3\\%
            /D[\Hy@href@page\@pdfremotestartview]%
          \else
            /D(\Hy@pstringD)%
          \fi
          \Hy@href@nextactionraw
        >>%
      }%
      \relax
    \Hy@colorlink\@filecolor#1\Hy@xspace@end
    \close@pdflink
  \endgroup
}
\def\@hyper@launch run:#1\\#2#3{% filename, anchor text linkname
  \begingroup
    \Hy@pstringdef\Hy@pstringF{#1}%
    \Hy@pstringdef\Hy@pstringP{#3}%
    \leavevmode
    \pdfstartlink
      attr{%
        \Hy@setpdfborder
        \ifx\@pdfhighlight\@empty
        \else
          /H\@pdfhighlight
        \fi
        \ifx\@runbordercolor\relax
        \else
          /C[\@runbordercolor]%
        \fi
      }%
      user {%
        /Subtype/Link%
        \ifHy@pdfa /F 4\fi
        /A<<%
          /F(\Hy@pstringF)%
          /S/Launch%
          \Hy@SetNewWindow
          \ifx\\#3\\%
          \else
            /Win<</P(\Hy@pstringP)/F(\Hy@pstringF)>>%
          \fi
          \Hy@href@nextactionraw
        >>%
      }%
      \relax
    \Hy@colorlink\@runcolor#2\Hy@xspace@end
    \close@pdflink
  \endgroup
}
%    \end{macrocode}
%    \begin{macro}{\@pdfproducer}
%    \begin{macrocode}
\ifx\@pdfproducer\relax
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname luatexversion\endcsname\relax
    \def\@pdfproducer{pdfTeX}%
    \ifx\eTeXversion\@undefined
    \else
      \ifx\eTeXversion\relax
      \else
        \ifnum\eTeXversion>0 %
          \def\@pdfproducer{pdfeTeX}%
        \fi
      \fi
    \fi
    \ifx\pdftexversion\@undefined
    \else
      \ifnum\pdftexversion<100 %
        \edef\@pdfproducer{%
          \@pdfproducer
          \the\pdftexversion.\pdftexrevision
        }%
      \else
        \ifnum\pdftexversion<130 %
          \edef\@pdfproducer{%
            \@pdfproducer-%
            \expandafter\@car\the\pdftexversion\@empty\@nil.%
            \expandafter\@cdr\the\pdftexversion\@empty\@nil
            \pdftexrevision
          }%
        \else
          \ifnum\pdftexversion<140 %
          \else
            \def\@pdfproducer{pdfTeX}%
          \fi
          \edef\@pdfproducer{%
            \@pdfproducer-%
            \expandafter\@car\the\pdftexversion\@empty\@nil.%
            \expandafter\@cdr\the\pdftexversion\@empty\@nil.%
            \pdftexrevision
          }%
        \fi
      \fi
    \fi
  \else
    \begingroup
      \count@=\luatexversion
      \divide\count@ by 100 %
      \edef\x{\the\count@}%
      \count@=-\x\relax
      \multiply\count@ by 100 %
      \advance\count@ by \luatexversion
      \edef\x{\endgroup
        \def\noexpand\@pdfproducer{%
          LuaTeX-\x.\the\count@.\luatexrevision
        }%
      }%
    \x
  \fi
\fi
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\PDF@SetupDox}
%    \begin{macrocode}
\def\PDF@SetupDoc{%
  \ifx\@pdfpagescrop\@empty
  \else
    \edef\process@me{%
      \pdfpagesattr={%
        /CropBox[\@pdfpagescrop]%
        \expandafter\ifx\expandafter\\\the\pdfpagesattr\\%
        \else
          ^^J\the\pdfpagesattr
        \fi
      }%
    }%
    \process@me
  \fi
  \Hy@pstringdef\Hy@pstringB{\@baseurl}%
  \pdfcatalog{%
    /PageMode/\@pdfpagemode
    \ifx\@baseurl\@empty
    \else
      /URI<</Base(\Hy@pstringB)>>%
    \fi
  }%
  \ifx\@pdfstartpage\@empty
  \else
    \ifx\@pdfstartview\@empty
    \else
      openaction goto page\@pdfstartpage{\@pdfstartview}%
    \fi
  \fi
  \edef\Hy@temp{%
    \ifHy@pdftoolbar\else /HideToolbar true\fi
    \ifHy@pdfmenubar\else /HideMenubar true\fi
    \ifHy@pdfwindowui\else /HideWindowUI true\fi
    \ifHy@pdffitwindow /FitWindow true\fi
    \ifHy@pdfcenterwindow /CenterWindow true\fi
    \ifHy@pdfdisplaydoctitle /DisplayDocTitle true\fi
    \Hy@UseNameKey{NonFullScreenPageMode}\@pdfnonfullscreenpagemode
    \Hy@UseNameKey{Direction}\@pdfdirection
    \Hy@UseNameKey{ViewArea}\@pdfviewarea
    \Hy@UseNameKey{ViewClip}\@pdfviewclip
    \Hy@UseNameKey{PrintArea}\@pdfprintarea
    \Hy@UseNameKey{PrintClip}\@pdfprintclip
    \Hy@UseNameKey{PrintScaling}\@pdfprintscaling
    \Hy@UseNameKey{Duplex}\@pdfduplex
    \ifx\@pdfpicktraybypdfsize\@empty
    \else
      /PickTrayByPDFSize \@pdfpicktraybypdfsize
    \fi
    \ifx\@pdfprintpagerange\@empty
    \else
      /PrintPageRange[\@pdfprintpagerange]%
    \fi
    \ifx\@pdfnumcopies\@empty
    \else
      /NumCopies \@pdfnumcopies
    \fi
  }%
  \pdfcatalog{%
    \ifx\Hy@temp\@empty
    \else
      /ViewerPreferences<<\Hy@temp>>%
    \fi
    \Hy@UseNameKey{PageLayout}\@pdfpagelayout
    \ifx\@pdflang\@empty
    \else
      /Lang(\@pdflang)%
    \fi
  }%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\PDF@FinishDoc}
%    \begin{macrocode}
\def\PDF@FinishDoc{%
  \pdf@ifdraftmode{}{%
    \Hy@UseMaketitleInfos
    \HyInfo@GenerateAddons
    \pdfinfo{%
      /Author(\@pdfauthor)%
      /Title(\@pdftitle)%
      /Subject(\@pdfsubject)%
      /Creator(\@pdfcreator)%
      \ifx\@pdfcreationdate\@empty
      \else
        /CreationDate(\@pdfcreationdate)%
      \fi
      \ifx\@pdfmoddate\@empty
      \else
        /ModDate(\@pdfmoddate)%
      \fi
      \ifx\@pdfproducer\relax
      \else
        /Producer(\@pdfproducer)%
      \fi
      /Keywords(\@pdfkeywords)%
      \ifx\@pdftrapped\@empty
      \else
        /Trapped/\@pdftrapped
      \fi
      \HyInfo@Addons
    }%
  }%
  \Hy@DisableOption{pdfauthor}%
  \Hy@DisableOption{pdftitle}%
  \Hy@DisableOption{pdfsubject}%
  \Hy@DisableOption{pdfcreator}%
  \Hy@DisableOption{pdfcreationdate}%
  \Hy@DisableOption{pdfmoddate}%
  \Hy@DisableOption{pdfproducer}%
  \Hy@DisableOption{pdfkeywords}%
  \Hy@DisableOption{pdftrapped}%
  \Hy@DisableOption{pdfinfo}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\hyper@pagetransition}
%    \cmd{\@pdfpagetransition} is initialized with \cmd{\relax}. So
%    it indicates, if option pdfpagetransition is used. First previous
%    |/Trans| entries are removed. If a new |/Trans| key exists, it is
%    appended to \cmd{\pdfpageattr}.
%    \begin{macrocode}
\def\hyper@pagetransition{%
  \ifx\@pdfpagetransition\relax
  \else
    \expandafter\Hy@RemoveTransPageAttr
    \the\pdfpageattr^^J/Trans{}>>\END
    \ifx\@pdfpagetransition\@empty
    \else
      \edef\@processme{%
        \global\pdfpageattr{%
          \the\pdfpageattr
          ^^J/Trans << /S /\@pdfpagetransition\space >>%
        }%
      }%
      \@processme
    \fi
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Hy@RemoveTransPageAttr}
%    Macro \cmd{\Hy@RemoveTransPageAttr} removes a |/Trans|
%    entry from \cmd{\pdfpageattr}. It is called with
%    the end marker |^^J/Trans{}>>\END|. The trick is the
%    empty group that does not appear in legal
%    \cmd{\pdfpageattr} code. It appears in argument
%    |#2| and shows, whether the parameter text
%    catches a really |/Trans| object or the end marker.
%    \begin{macrocode}
\gdef\Hy@RemoveTransPageAttr#1^^J/Trans#2#3>>#4\END{%
  \ifx\\#2\\%
    \global\pdfpageattr{#1}%
  \else
    \Hy@RemoveTransPageAttr#1#4\END
  \fi
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\hyper@pageduration}
%    \cmd{\@pdfpageduration} is initialized with \cmd{\relax}. So
%    it indicates, if option pdfpageduration is used. First previous
%    |/Dur| entries are removed. If a new |/Dur| key exists, it is
%    appended to \cmd{\pdfpageattr}.
%    \begin{macrocode}
\def\hyper@pageduration{%
  \ifx\@pdfpageduration\relax
  \else
    \expandafter
    \Hy@RemoveDurPageAttr\the\pdfpageattr^^J/Dur{} \END
    \ifx\@pdfpageduration\@empty
    \else
      \edef\@processme{%
        \global\pdfpageattr{%
          \the\pdfpageattr
          ^^J/Dur \@pdfpageduration\space
        }%
      }%
      \@processme
    \fi
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Hy@RemoveDurPageAttr}
%    Macro \cmd{\Hy@RemoveDurPageAttr} removes a |/Dur|
%    entry from \cmd{\pdfpageattr}. It is called with
%    the end marker |^^J/Dur{} \END|. The trick is the
%    empty group that does not appear in legal
%    \cmd{\pdfpageattr} code. It appears in argument
%    |#2| and shows, whether the parameter text
%    catches a really |/Dur| object or the end marker.
%    \begin{macrocode}
\gdef\Hy@RemoveDurPageAttr#1^^J/Dur#2#3 #4\END{%
  \ifx\\#2\\%
    \global\pdfpageattr{#1}%
  \else
    \Hy@RemoveDurPageAttr#1#4\END
  \fi
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\hyper@pagehidden}
%    The boolean value of the key |/Hid| is stored in switch
%    \cmd{\ifHy@pdfpagehidden}.
%    First previous |/Hid| entries are removed, then the new
%    one is appended, if the value is true (the PDF default
%    is false).
%    \begin{macrocode}
\def\hyper@pagehidden{%
  \ifHy@useHidKey
    \expandafter
    \Hy@RemoveHidPageAttr\the\pdfpageattr^^J/Hid{} \END
    \ifHy@pdfpagehidden
      \edef\@processme{%
        \global\pdfpageattr{%
          \the\pdfpageattr
          ^^J/Hid true % SPACE
        }%
      }%
      \@processme
    \fi
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Hy@RemoveHidPageAttr}
%    Macro \cmd{\Hy@RemoveHidPageAttr} removes a |/Hid|
%    entry from \cmd{\pdfpageattr}. It is called with
%    the end marker |^^J/Hid{} \END|. The trick is the
%    empty group that does not appear in legal
%    \cmd{\pdfpageattr} code. It appears in argument
%    |#2| and shows, whether the parameter text
%    catches a really |/Hid| object or the end marker.
%    \begin{macrocode}
\gdef\Hy@RemoveHidPageAttr#1^^J/Hid#2#3 #4\END{%
  \ifx\\#2\\%
    \global\pdfpageattr{#1}%
  \else
    \Hy@RemoveHidPageAttr#1#4\END
  \fi
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macrocode}
\pdf@ifdraftmode{}{%
  \g@addto@macro\Hy@EveryPageHook{%
    \hyper@pagetransition
    \hyper@pageduration
    \hyper@pagehidden
  }%
}
%    \end{macrocode}
%
%    Also Xe\TeX\ support \cs{pdfpagewidth} and \cs{pdfpageheight},
%    but it does not provide \cs{pdfhorigin} and \cs{pdfvorigin}.
%    \begin{macrocode}
%</pdftex>
%<*pdftex|xetex>
\Hy@AtBeginDocument{%
  \ifHy@setpagesize
    \expandafter\@firstofone
  \else
    \expandafter\@gobble
  \fi
  {%
    \@ifclassloaded{seminar}{%
%<*pdftex>
      \setlength{\pdfhorigin}{1truein}%
      \setlength{\pdfvorigin}{1truein}%
%</pdftex>
      \ifportrait
        \ifdim\paperwidth=\z@
        \else
          \setlength{\pdfpagewidth}{\strip@pt\paperwidth truept}%
        \fi
        \ifdim\paperheight=\z@
        \else
          \setlength{\pdfpageheight}{\strip@pt\paperheight truept}%
        \fi
      \else
        \ifdim\paperheight=\z@
        \else
          \setlength{\pdfpagewidth}{\strip@pt\paperheight truept}%
        \fi
        \ifdim\paperwidth=\z@
        \else
          \setlength{\pdfpageheight}{\strip@pt\paperwidth truept}%
        \fi
      \fi
    }{%
      \ltx@IfUndefined{stockwidth}{%
        \ifdim\paperwidth>\z@
          \setlength{\pdfpagewidth}{\paperwidth}%
        \fi
        \ifdim\paperheight>\z@
          \setlength{\pdfpageheight}{\paperheight}%
        \fi
      }{%
        \ifdim\stockwidth>\z@
          \setlength{\pdfpagewidth}{\stockwidth}%
        \fi
        \ifdim\stockheight>\z@
          \setlength{\pdfpageheight}{\stockheight}%
        \fi
      }%
    }%
  }%
  \Hy@DisableOption{setpagesize}%
}
%</pdftex|xetex>
%<*pdftex>
\def\Acrobatmenu#1#2{%
  \Hy@Acrobatmenu{#1}{#2}{%
    \leavevmode
    \pdfstartlink
      attr{%
        \Hy@setpdfborder
        \ifx\@pdfhighlight\@empty
        \else
          /H\@pdfhighlight
        \fi
        \ifx\@menubordercolor\relax
        \else
          /C[\@menubordercolor]%
        \fi
      }%
      user{%
        /Subtype/Link%
        \ifHy@pdfa /F 4\fi
        /A<<%
          /S/Named%
          /N/#1%
          \Hy@href@nextactionraw
        >>%
      }%
      \relax
    \Hy@colorlink\@menucolor#2%
    \close@pdflink
  }%
}
%    \end{macrocode}
%
% \subsubsection{Fix for problem with different nesting levels}
%
%    \cs{AtBeginShipoutFirst} adds an additional box layer around
%    the first output page. This disturbs pdf\TeX's low level
%    link commands \cs{pdfstartlink} and \cs{pdfendlink}, if a
%    link is broken across the first and second output page.
%
%    The problem could be fixed by replacing \cs{AtBeginShipoutFirst},
%    because the box layer is not necessary for pdf\TeX -- no \cs{special}s
%    need to be inserted. However it's easier to add an additional
%    box level for the pages after the first one. Also \cs{AtBeginShipoutFirst}
%    could be invoked independently from hyperref.
%    \begin{macrocode}
\def\Hy@FixNotFirstPage{%
  \gdef\Hy@FixNotFirstPage{%
    \setbox\AtBeginShipoutBox=\hbox{%
      \copy\AtBeginShipoutBox
    }%
  }%
}
\AtBeginShipout{\Hy@FixNotFirstPage}
%    \end{macrocode}
%
%    \begin{macrocode}
%</pdftex>
%    \end{macrocode}
%
% \subsection{hypertex}
%
% The Hyper\TeX\ specification (this is
% borrowed from an article by Arthur Smith)
% says that conformant viewers/translators
% must recognize the following set of |\special| commands:
% \begin{description}
% \item[href:] |html:<a href = "href_string">|
% \item[name:] |html:<a name = "name_string">|
% \item[end:] |html:</a>|
% \item[image:] |html:<img src = "href_string">|
% \item[base\_name:] |html:<base href = "href_string">|
% \end{description}
%
% The \emph{href}, \emph{name} and \emph{end} commands are used to do
% the basic hypertext operations of establishing links between sections
% of documents. The \emph{image} command is intended (as with current
% html viewers) to place an image of arbitrary graphical
% format on the page in the current location.  The \emph{base\_name}
% command is be used to communicate to the \emph{dvi} viewer the full (URL)
% location of the current document so that
% files specified by relative URL's may be retrieved correctly.
%
% The \emph{href} and \emph{name} commands must be paired with an
% \emph{end} command later in
% the \TeX{} file --- the \TeX{} commands between the two ends of a pair
% form an \emph{anchor} in the document. In the case of an \emph{href}
% command, the \emph{anchor} is to be highlighted in the
% \emph{dvi} viewer, and
% when clicked on will cause the scene to shift to the destination
% specified by \emph{href\_string}. The \emph{anchor} associated with a
% name command represents a possible location to which other hypertext
% links may refer, either as local references (of the form
% \texttt{href="\#name\_string"} with the \emph{name\_string}
% identical to the one in the name command) or as part of a URL (of the
% form \emph{URL\#name\_string}). Here \emph{href\_string} is a valid
% URL or local identifier, while name\_string could be any string at
% all: the only caveat is that `|"|' characters should be escaped with a
% backslash (|\|), and if it looks like a URL name it may cause
% problems.
%
%    \begin{macrocode}
%<*hypertex>
\providecommand*{\XR@ext}{dvi}
\let\PDF@FinishDoc\ltx@empty
\def\PDF@SetupDoc{%
  \ifx\@baseurl\@empty
  \else
    \special{html:<base href="\@baseurl">}%
  \fi
}
\Hy@WrapperDef\hyper@anchor#1{%
  \Hy@SaveLastskip
  \Hy@VerboseAnchor{#1}%
  \begingroup
    \let\protect=\string
    \hyper@chars
    \special{html:<a name=%
        \hyper@quote\HyperDestNameFilter{#1}\hyper@quote>}%
  \endgroup
  \Hy@activeanchortrue
  \Hy@colorlink\@anchorcolor\anchor@spot\Hy@endcolorlink
  \special{html:</a>}%
  \Hy@activeanchorfalse
  \Hy@RestoreLastskip
}
\Hy@WrapperDef\hyper@anchorstart#1{%
  \Hy@SaveLastskip
  \Hy@VerboseAnchor{#1}%
  \begingroup
    \hyper@chars
    \special{html:<a name=%
        \hyper@quote\HyperDestNameFilter{#1}\hyper@quote>}%
  \endgroup
  \Hy@activeanchortrue
}
\def\hyper@anchorend{%
  \special{html:</a>}%
  \Hy@activeanchorfalse
  \Hy@RestoreLastskip
}
\def\@urltype{url}
\def\hyper@linkstart#1#2{%
  \Hy@VerboseLinkStart{#1}{#2}%
  \expandafter\Hy@colorlink\csname @#1color\endcsname
  \def\Hy@tempa{#1}%
  \ifx\Hy@tempa\@urltype
    \special{html:<a href=\hyper@quote#2\hyper@quote>}%
  \else
    \begingroup
      \hyper@chars
      \special{html:<a href=%
          \hyper@quote\#\HyperDestNameFilter{#2}\hyper@quote>}%
    \endgroup
  \fi
}
\def\hyper@linkend{%
  \special{html:</a>}%
  \Hy@endcolorlink
}
\def\hyper@linkfile#1#2#3{%
  \hyper@linkurl{#1}{\Hy@linkfileprefix#2\ifx\\#3\\\else\##3\fi}%
}
\def\hyper@linkurl#1#2{%
%    \end{macrocode}
% If we want to raise up the final link |\special|, we need to
% get its height; ask me why \LaTeX\ constructs make this totally
% foul up, and make us revert to basic \TeX. I do not know.
%    \begin{macrocode}
  \leavevmode
  \ifHy@raiselinks
    \Hy@SaveSpaceFactor
    \Hy@SaveSavedSpaceFactor
    \sbox\@tempboxa{\Hy@RestoreSpaceFactor#1}%
    \Hy@RestoreSavedSpaceFactor
    \@linkdim\dp\@tempboxa
    \lower\@linkdim\hbox{%
      \hyper@chars
      \special{html:<a href=\hyper@quote#2\hyper@quote>}%
    }%
    \Hy@colorlink\@urlcolor
      \Hy@RestoreSpaceFactor
      #1%
      \Hy@SaveSpaceFactor
    \@linkdim\ht\@tempboxa
%    \end{macrocode}
% Because of the interaction with the dvihps processor, we have to subtract a
% little from the height. This is not clean, or checked. Check with Mark
% Doyle about what gives here. It may not be needed with
% the new dvips (Jan 1997).
%    \begin{macrocode}
    \advance\@linkdim by -6.5\p@
    \raise\@linkdim\hbox{\special{html:</a>}}%
    \Hy@endcolorlink
    \Hy@RestoreSpaceFactor
  \else
    \begingroup
      \hyper@chars
      \special{html:<a href=\hyper@quote#2\hyper@quote>}%
      \Hy@colorlink\@urlcolor#1\Hy@xspace@end
      \special{html:</a>}%
      \Hy@endcolorlink
    \endgroup
  \fi
}
%    \end{macrocode}
%    Very poor implementation of \cs{hyper@link} without considering |#1|.
%    \begin{macrocode}
\def\hyper@link#1#2#3{%
  \Hy@VerboseLinkStart{#1}{#2}%
  \hyper@linkurl{#3}{\#\HyperDestNameFilter{#2}}%
}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\hyper@image#1#2{%
  \begingroup
    \hyper@chars
    \special{html:<img src=\hyper@quote#1\hyper@quote>}%
  \endgroup
}
%</hypertex>
%<*dviwindo>
%    \end{macrocode}
% \subsection{dviwindo}
% [This was developed by David Carlisle].
% Within a file dviwindo hyperlinking is used, for external
% URL's a call to |\wwwbrowser| is made. (You can define
% this command before or after loading the hyperref package
% if the default |c:/netscape/netscape| is not suitable)
% Dviwindo could in fact handle external links to dvi files on
% the same machine without calling a web browser, but that would
% mean parsing the URL to recognise such, and this is currently
% not done.
%
% This was more or less blindly copied from the hypertex cfg.
% For dviwindo,  \LaTeX{} must specify the size of the active area
% for links. For some hooks this information is available
% but for some, the start and end of the link are
% specified separately in which case a fixed size area
% of 10000000sp wide by |\baselineskip| high is used.
%    \begin{macrocode}
\providecommand*{\XR@ext}{dvi}
\providecommand*\wwwbrowser{c:\string\netscape\string\netscape}
\Hy@WrapperDef\hyper@anchor#1{%
  \Hy@SaveLastskip
  \Hy@VerboseAnchor{#1}%
  \begingroup
    \let\protect=\string
    \special{mark: #1}%
  \endgroup
  \Hy@activeanchortrue
  \Hy@colorlink\@anchorcolor\anchor@spot\Hy@endcolorlink
  \Hy@activeanchorfalse
  \Hy@RestoreLastskip
}
\Hy@WrapperDef\hyper@anchorstart#1{%
  \Hy@SaveLastskip
  \Hy@VerboseAnchor{#1}%
  \special{mark: #1}%
  \Hy@activeanchortrue
}
\def\hyper@anchorend{%
  \Hy@activeanchorfalse
  \Hy@RestoreLastskip
}
\def\hyper@linkstart#1#2{%
  \Hy@VerboseLinkStart{#1}{#2}%
  \expandafter\Hy@colorlink\csname @#1color\endcsname
  \special{button: %
    10000000 %
    \number\baselineskip\space
    #2%
  }%
}
\def\hyper@linkend{%
  \Hy@endcolorlink
}
\def\hyper@link#1#2#3{%
  \Hy@VerboseLinkStart{#1}{#2}%
  \leavevmode
  \ifHy@raiselinks
    \Hy@SaveSpaceFactor
    \Hy@SaveSavedSpaceFactor
    \sbox\@tempboxa{\Hy@RestoreSpaceFactor#3}%
    \Hy@RestoreSavedSpaceFactor
    \@linkdim\dp\@tempboxa
    \lower\@linkdim\hbox{%
      \special{button: %
        \number\wd\@tempboxa\space
        \number\ht\@tempboxa\space
        #2%
      }%
      \expandafter\Hy@colorlink\csname @#1color\endcsname
      \Hy@RestoreSpaceFactor
      #3\Hy@xspace@end
      \Hy@SaveSpaceFactor
      \Hy@endcolorlink
    }%
    \@linkdim\ht\@tempboxa
    \advance\@linkdim by -6.5\p@
    \raise\@linkdim\hbox{}%
    \Hy@RestoreSpaceFactor
  \else
    \special{button: %
      \number\wd\@tempboxa\space
      \number\ht\@tempboxa\space
      #2%
    }%
    \expandafter\Hy@colorlink\csname @#1color\endcsname
    #3\Hy@xspace@end
    \Hy@endcolorlink
  \fi
}
\def\hyper@linkurl#1#2{%
  \begingroup
    \hyper@chars
    \leavevmode
    \ifHy@raiselinks
      \Hy@SaveSpaceFactor
      \Hy@SaveSavedSpaceFactor
      \sbox\@tempboxa{\Hy@RestoreSpaceFactor#1}%
      \Hy@RestoreSavedSpaceFactor
      \@linkdim\dp\@tempboxa
      \lower\@linkdim\hbox{%
        \special{button: %
          \number\wd\@tempboxa\space
          \number\ht\@tempboxa\space
          launch: \wwwbrowser\space
          #2%
        }%
        \Hy@colorlink\@urlcolor
          \Hy@RestoreSpaceFactor
          #1\Hy@xspace@end
          \Hy@SaveSpaceFactor
        \Hy@endcolorlink
      }%
      \@linkdim\ht\@tempboxa
      \advance\@linkdim by -6.5\p@
      \raise\@linkdim\hbox{}%
      \Hy@RestoreSpaceFactor
    \else
      \special{button: %
        \number\wd\@tempboxa\space
        \number\ht\@tempboxa\space
        launch: \wwwbrowser\space
        #2%
      }%
      \Hy@colorlink\@urlcolor
        #1\Hy@xspace@end
      \Hy@endcolorlink
    \fi
  \endgroup
}
\def\hyper@linkfile#1#2#3{%
  \begingroup
    \hyper@chars
    \leavevmode
    \ifHy@raiselinks
      \Hy@SaveSpaceFactor
      \Hy@SaveSavedSpaceFactor
      \sbox\@tempboxa{\Hy@RestoreSpaceFactor#1}%
      \Hy@RestoreSavedSpaceFactor
      \@linkdim\dp\@tempboxa
      \lower\@linkdim\hbox{%
        \special{button: %
          \number\wd\@tempboxa\space
          \number\ht\@tempboxa\space
          #3,%
          file: #2%
        }%
        \Hy@colorlink\@filecolor
          \Hy@RestoreSpaceFactor
          #1\Hy@xspace@end
          \Hy@SaveSpaceFactor
        \Hy@endcolorlink
      }%
      \@linkdim\ht\@tempboxa
      \advance\@linkdim by -6.5\p@
      \raise\@linkdim\hbox{}%
      \Hy@RestoreSpaceFactor
    \else
      \special{button: %
        \number\wd\@tempboxa\space
        \number\ht\@tempboxa\space
        #3,%
        file: #2%
      }%
      \Hy@colorlink\@filecolor
        #1\Hy@xspace@end
      \Hy@endcolorlink
    \fi
  \endgroup
}
\ifx\@pdfproducer\relax
  \def\@pdfproducer{dviwindo + Distiller}%
\fi
\HyInfo@AddonUnsupportedtrue
\def\PDF@FinishDoc{%
  \Hy@UseMaketitleInfos
  \HyInfo@TrappedUnsupported
  \special{PDF: Keywords \@pdfkeywords}%
  \special{PDF: Title \@pdftitle}%
  \special{PDF: Creator \@pdfcreator}%
  \ifx\@pdfcreationdate\@empty
  \else
    \special{PDF: CreationDate \@pdfcreationdate}%
  \fi
  \ifx\@pdfmoddate\@empty
  \else
    \special{PDF: ModDate \@pdfmoddate}%
  \fi
  \special{PDF: Author \@pdfauthor}%
  \ifx\@pdfproducer\relax
  \else
    \special{PDF: Producer \@pdfproducer}%
  \fi
  \special{PDF: Subject \@pdfsubject}%
  \Hy@DisableOption{pdfauthor}%
  \Hy@DisableOption{pdftitle}%
  \Hy@DisableOption{pdfsubject}%
  \Hy@DisableOption{pdfcreator}%
  \Hy@DisableOption{pdfcreationdate}%
  \Hy@DisableOption{pdfmoddate}%
  \Hy@DisableOption{pdfproducer}%
  \Hy@DisableOption{pdfkeywords}%
  \Hy@DisableOption{pdftrapped}%
  \Hy@DisableOption{pdfinfo}%
}
\def\PDF@SetupDoc{%
  \ifx\@baseurl\@empty
  \else
    \special{PDF: Base \@baseurl}%
  \fi
  \ifx\@pdfpagescrop\@empty\else
    \special{PDF: BBox \@pdfpagescrop}%
  \fi
  \def\Hy@temp{}%
  \ifx\@pdfstartpage\@empty
  \else
    \ifx\@pdfstartview\@empty
    \else
      \edef\Hy@temp{%
        ,Page=\@pdfstartpage
        ,View=\@pdfstartview
      }%
    \fi
  \fi
  \edef\Hy@temp{%
    \noexpand\pdfmark{%
      pdfmark=/DOCVIEW,%
      PageMode=/\@pdfpagemode
      \Hy@temp
    }%
  }%
  \Hy@temp
  \ifx\@pdfpagescrop\@empty
  \else
    \pdfmark{pdfmark=/PAGES,CropBox=\@pdfpagescrop}%
  \fi
  \edef\Hy@temp{%
    \ifHy@pdftoolbar\else /HideToolbar true\fi
    \ifHy@pdfmenubar\else /HideMenubar true\fi
    \ifHy@pdfwindowui\else /HideWindowUI true\fi
    \ifHy@pdffitwindow /FitWindow true\fi
    \ifHy@pdfcenterwindow /CenterWindow true\fi
    \ifHy@pdfdisplaydoctitle /DisplayDocTitle true\fi
    \Hy@UseNameKey{NonFullScreenPageMode}\@pdfnonfullscreenpagemode
    \Hy@UseNameKey{Direction}\@pdfdirection
    \Hy@UseNameKey{ViewArea}\@pdfviewarea
    \Hy@UseNameKey{ViewClip}\@pdfviewclip
    \Hy@UseNameKey{PrintArea}\@pdfprintarea
    \Hy@UseNameKey{PrintClip}\@pdfprintclip
    \Hy@UseNameKey{PrintScaling}\@pdfprintscaling
    \Hy@UseNameKey{Duplex}\@pdfduplex
    \ifx\@pdfpicktraybypdfsize\@empty
    \else
      /PickTrayByPDFSize \@pdfpicktraybypdfsize
    \fi
    \ifx\@pdfprintpagerange\@empty
    \else
      /PrintPageRange[\@pdfprintpagerange]%
    \fi
    \ifx\@pdfnumcopies\@empty
    \else
      /NumCopies \@pdfnumcopies
    \fi
  }%
  \pdfmark{pdfmark=/PUT,%
    Raw={%
      \string{Catalog\string}<<%
        \ifx\Hy@temp\@empty
        \else
          /ViewerPreferences<<\Hy@temp>>%
        \fi
        \Hy@UseNameKey{PageLayout}\@pdfpagelayout
        \ifx\@pdflang\@empty
        \else
          /Lang(\@pdflang)%
        \fi
      >>%
    }%
  }%
}
%</dviwindo>
%<*dvipdfm|xetex>
%    \end{macrocode}
% \subsection{dvipdfm/xetex dvi to PDF converter}
% Provided by Mark Wicks (mwicks@kettering.edu)
%    \begin{macrocode}
\providecommand*{\XR@ext}{pdf}
\Hy@setbreaklinks{true}
\def\HyPat@ObjRef{%
  @[^ ]+%
}
\newsavebox{\pdfm@box}
\def\@pdfm@mark#1{\special{pdf:#1}}
\Hy@WrapperDef\@pdfm@dest#1{%
  \Hy@SaveLastskip
  \Hy@VerboseAnchor{#1}%
  \begingroup
    \Hy@pstringdef\Hy@pstringDest{\HyperDestNameFilter{#1}}%
    \def\x{XYZ}%
    \ifx\x\@pdfview
      \def\x{XYZ @xpos @ypos null}%
    \else
      \def\x{FitH}%
      \ifx\x\@pdfview
        \def\x{FitH @ypos}%
      \else
        \def\x{FitBH}%
        \ifx\x\@pdfview
          \def\x{FitBH @ypos}%
        \else
          \def\x{FitV}%
          \ifx\x\@pdfview
            \def\x{FitV @xpos}%
          \else
            \def\x{FitBV}%
            \ifx\x\@pdfview
              \def\x{FitBV @xpos}%
            \else
              \def\x{Fit}%
              \ifx\x\@pdfview
                \let\x\@pdfview
              \else
                \def\x{FitB}%
                \ifx\x\@pdfview
                  \let\x\@pdfview
                \else
                  \def\x{FitR}%
                  \ifx\x\@pdfview
                    \Hy@Warning{`pdfview=FitR' is not supported}%
                    \def\x{XYZ @xpos @ypos null}%
                  \else
                    \@onelevel@sanitize\@pdfview
                    \Hy@Warning{%
                      Unknown value `\@pdfview' for pdfview%
                    }%
                    \def\x{XYZ @xpos @ypos null}%
                  \fi
                \fi
              \fi
            \fi
          \fi
        \fi
      \fi
    \fi
    \@pdfm@mark{dest (\Hy@pstringDest) [@thispage /\x]}%
  \endgroup
  \Hy@RestoreLastskip
}
\providecommand*\@pdfview{XYZ}
\providecommand*\@pdfborder{0 0 1}
\providecommand*\@pdfborderstyle{}
\def\hyper@anchor#1{%
  \@pdfm@dest{#1}%
}
\def\hyper@anchorstart#1{%
  \Hy@activeanchortrue
  \@pdfm@dest{#1}%
}
\def\hyper@anchorend{%
  \Hy@activeanchorfalse
}
%    \end{macrocode}
%    \begin{macrocode}
\newcounter{Hy@AnnotLevel}
%    \end{macrocode}
%    \begin{macrocode}
\ifHy@ocgcolorlinks
  \def\OBJ@OCG@view{@OCG@view}%
  \@pdfm@mark{%
    obj \OBJ@OCG@view <<%
      /Type/OCG%
      /Name(View)%
      /Usage<<%
        /Print<<%
          /PrintState/OFF%
        >>%
        /View<<%
          /ViewState/ON%
        >>%
      >>%
    >>%
  }%
  \@pdfm@mark{close \OBJ@OCG@view}%
  \def\OBJ@OCG@print{@OCG@print}%
  \@pdfm@mark{%
    obj \OBJ@OCG@print <<%
      /Type/OCG%
      /Name(Print)%
      /Usage<<%
        /Print<<%
          /PrintState/ON%
        >>%
        /View<<%
          /ViewState/OFF%
        >>%
      >>%
    >>%
  }%
  \@pdfm@mark{close \OBJ@OCG@print}%
  \def\OBJ@OCGs{@OCGs}%
  \@pdfm@mark{%
    obj \OBJ@OCGs [%
      \OBJ@OCG@view\space\OBJ@OCG@print
    ]%
  }%
  \@pdfm@mark{close \OBJ@OCGs}%
  \@pdfm@mark{%
    put @catalog <<%
      /OCProperties<<%
        /OCGs \OBJ@OCGs
        /D<<%
          /OFF[\OBJ@OCG@print]%
          /AS[%
            <<%
              /Event/View%
              /OCGs \OBJ@OCGs
              /Category[/View]%
            >>%
            <<%
              /Event/Print%
              /OCGs \OBJ@OCGs
              /Category[/Print]%
            >>%
            <<%
              /Event/Export%
              /OCGs \OBJ@OCGs
              /Category[/Print]%
            >>%
          ]%
        >>%
      >>%
    >>%
  }%
  \AtBeginShipout{%
    \setbox\AtBeginShipoutBox=\hbox{%
      \copy\AtBeginShipoutBox
      \@pdfm@mark{%
        put @resources <<%
          /Properties<<%
            /OCView \OBJ@OCG@view
            /OCPrint \OBJ@OCG@print
          >>%
        >>%
      }%
    }%
  }%
  \Hy@AtBeginDocument{%
    \def\Hy@colorlink#1{%
      \begingroup
        \ifHy@ocgcolorlinks
          \def\Hy@ocgcolor{#1}%
          \setbox0=\hbox\bgroup\color@begingroup
        \else
          \HyColor@UseColor#1%
        \fi
    }%
    \def\Hy@endcolorlink{%
      \ifHy@ocgcolorlinks
        \color@endgroup\egroup
        \mbox{%
          \@pdfm@mark{content /OC/OCPrint BDC}%
          \rlap{\copy0}%
          \@pdfm@mark{content EMC/OC/OCView BDC}%
          \begingroup
            \expandafter\HyColor@UseColor\Hy@ocgcolor
            \box0 %
          \endgroup
          \@pdfm@mark{content EMC}%
        }%
      \fi
      \endgroup
    }%
  }%
\else
  \Hy@DisableOption{ocgcolorlinks}%
\fi
%    \end{macrocode}
%    \begin{macrocode}
\def\Hy@BeginAnnot#1{%
  \stepcounter{Hy@AnnotLevel}%
  \ifnum\value{Hy@AnnotLevel}=\@ne
    #1%
  \fi
}
\def\Hy@EndAnnot{%
  \ifnum\value{Hy@AnnotLevel}=\@ne
    \Hy@endcolorlink
    \@pdfm@mark{eann}%
  \fi
  \addtocounter{Hy@AnnotLevel}\m@ne
}
%    \end{macrocode}
%    \begin{macrocode}
\def\Hy@undefinedname{UNDEFINED}
\def\hyper@linkstart#1#2{%
  \Hy@VerboseLinkStart{#1}{#2}%
  \leavevmode
  \Hy@BeginAnnot{%
    \protected@edef\Hy@testname{#2}%
    \ifx\Hy@testname\@empty
      \Hy@Warning{%
        Empty destination name,\MessageBreak
        using `\Hy@undefinedname'%
      }%
      \let\Hy@testname\Hy@undefinedname
    \else
      \Hy@pstringdef\Hy@testname{%
        \expandafter\HyperDestNameFilter\expandafter{%
          \Hy@testname
        }%
      }%
    \fi
    \@pdfm@mark{%
      bann<<%
        /Type/Annot%
        /Subtype/Link%
        \ifHy@pdfa /F 4\fi
        \Hy@setpdfborder
        \expandafter\ifx\csname @#1bordercolor\endcsname\relax
        \else
          /C[\csname @#1bordercolor\endcsname]%
        \fi
        /A<<%
          /S/GoTo%
          /D(\Hy@testname)%
          \Hy@href@nextactionraw
        >>%
      >>%
    }%
    \expandafter\Hy@colorlink\csname @#1color\endcsname
  }%
}
\def\hyper@linkend{\Hy@EndAnnot}%
\def\hyper@link#1#2#3{%
  \hyper@linkstart{#1}{#2}#3\Hy@xspace@end\hyper@linkend
}
\def\hyper@linkfile#1#2#3{%
  \leavevmode
  \Hy@BeginAnnot{%
    \def\Hy@pstringF{#2}%
    \Hy@CleanupFile\Hy@pstringF
    \Hy@pstringdef\Hy@pstringF\Hy@pstringF
    \Hy@pstringdef\Hy@pstringD{#3}%
    \Hy@MakeRemoteAction
    \@pdfm@mark{%
      bann<<%
        /Type/Annot%
        /Subtype/Link%
        \ifHy@pdfa /F 4\fi
        \Hy@setpdfborder
        \ifx\@filebordercolor\relax
        \else
          /C[\@filebordercolor]%
        \fi
        /A<<%
          /S/GoToR%
          /F(\Hy@pstringF)%
          /D%
          \ifx\\#3\\%
            [\Hy@href@page\@pdfremotestartview]%
          \else
            (\Hy@pstringD)%
          \fi
          \Hy@SetNewWindow
          \Hy@href@nextactionraw
        >>%
      >>%
    }%
    \Hy@colorlink\@filecolor
  }%
  #1\Hy@xspace@end
  \Hy@EndAnnot
}
\def\@hyper@launch run:#1\\#2#3{% filename, anchor text linkname
  \leavevmode
  \Hy@BeginAnnot{%
    \Hy@pstringdef\Hy@pstringF{#1}%
    \Hy@pstringdef\Hy@pstringP{#3}%
    \@pdfm@mark{%
      bann<<%
        /Type/Annot%
        /Subtype/Link%
        \ifHy@pdfa /F 4\fi
        \Hy@setpdfborder
        \ifx\@runbordercolor\relax
        \else
          /C[\@runbordercolor]%
        \fi
        /A<<%
          /F(\Hy@pstringF)%
          /S/Launch%
          \Hy@SetNewWindow
          \ifx\\#3\\%
          \else
            /Win<</P(\Hy@pstringP)/F(\Hy@pstringF)>>%
          \fi
          \Hy@href@nextactionraw
        >>%
      >>%
    }%
    \Hy@colorlink\@runcolor
  }%
  #2\Hy@xspace@end
  \Hy@EndAnnot
}
\def\hyper@linkurl#1#2{%
  \leavevmode
  \Hy@BeginAnnot{%
    \Hy@pstringdef\Hy@pstringURI{#2}%
    \@pdfm@mark{%
      bann<<%
        /Type/Annot%
        /Subtype/Link%
        \ifHy@pdfa /F 4\fi
        \Hy@setpdfborder
        \ifx\@urlbordercolor\relax
        \else
          /C[\@urlbordercolor]%
        \fi
        /A<<%
          /S/URI%
          /URI(\Hy@pstringURI)%
          \ifHy@href@ismap
            /IsMap true%
          \fi
          \Hy@href@nextactionraw
        >>%
      >>%
    }%
    \Hy@colorlink\@urlcolor
  }%
  #1\Hy@xspace@end
  \Hy@EndAnnot
}
\def\Acrobatmenu#1#2{%
  \Hy@Acrobatmenu{#1}{#2}{%
    \Hy@BeginAnnot{%
      \@pdfm@mark{%
        bann<<%
          /Type/Annot%
          /Subtype/Link%
          \ifHy@pdfa /F 4\fi
          /A<<%
            /S/Named%
            /N/#1%
            \Hy@href@nextactionraw
          >>%
          \Hy@setpdfborder
          \ifx\@menubordercolor\relax
          \relax
            /C[\@menubordercolor]%
          \fi
        >>%
      }%
      \Hy@colorlink\@menucolor
    }%
    #2\Hy@xspace@end
    \Hy@EndAnnot
  }%
}
\ifx\@pdfproducer\relax
  \def\@pdfproducer{dvipdfm}%
%    \end{macrocode}
%    Detect Xe\TeX. However, but \textsf{xdvipdfmx} will overwrite it
%    in the final PDF file.
%    \begin{macrocode}
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname XeTeXversion\endcsname\relax
  \else
    \edef\@pdfproducer{XeTeX \the\XeTeXversion\XeTeXrevision}%
  \fi
\fi
\def\PDF@FinishDoc{%
  \Hy@UseMaketitleInfos
  \HyInfo@GenerateAddons
  \@pdfm@mark{%
    docinfo<<%
      /Title(\@pdftitle)%
      /Subject(\@pdfsubject)%
      /Creator(\@pdfcreator)%
      \ifx\@pdfcreationdate\@empty
      \else
        /CreationDate(\@pdfcreationdate)%
      \fi
      \ifx\@pdfmoddate\@empty
      \else
        /ModDate(\@pdfmoddate)%
      \fi
      /Author(\@pdfauthor)%
      \ifx\@pdfproducer\relax
      \else
        /Producer(\@pdfproducer)%
      \fi
      /Keywords(\@pdfkeywords)%
      \ifx\@pdftrapped\@empty
      \else
        /Trapped/\@pdftrapped
      \fi
      \HyInfo@Addons
    >>%
  }%
  \Hy@DisableOption{pdfauthor}%
  \Hy@DisableOption{pdftitle}%
  \Hy@DisableOption{pdfsubject}%
  \Hy@DisableOption{pdfcreator}%
  \Hy@DisableOption{pdfcreationdate}%
  \Hy@DisableOption{pdfmoddate}%
  \Hy@DisableOption{pdfproducer}%
  \Hy@DisableOption{pdfkeywords}%
  \Hy@DisableOption{pdftrapped}%
  \Hy@DisableOption{pdfinfo}%
}
%    \end{macrocode}
%    \begin{macrocode}
\def\PDF@SetupDoc{%
  \edef\Hy@temp{%
    \ifHy@pdftoolbar\else /HideToolbar true\fi
    \ifHy@pdfmenubar\else /HideMenubar true\fi
    \ifHy@pdfwindowui\else /HideWindowUI true\fi
    \ifHy@pdffitwindow /FitWindow true\fi
    \ifHy@pdfcenterwindow /CenterWindow true\fi
    \ifHy@pdfdisplaydoctitle /DisplayDocTitle true\fi
    \Hy@UseNameKey{NonFullScreenPageMode}\@pdfnonfullscreenpagemode
    \Hy@UseNameKey{Direction}\@pdfdirection
    \Hy@UseNameKey{ViewArea}\@pdfviewarea
    \Hy@UseNameKey{ViewClip}\@pdfviewclip
    \Hy@UseNameKey{PrintArea}\@pdfprintarea
    \Hy@UseNameKey{PrintClip}\@pdfprintclip
    \Hy@UseNameKey{PrintScaling}\@pdfprintscaling
    \Hy@UseNameKey{Duplex}\@pdfduplex
    \ifx\@pdfpicktraybypdfsize\@empty
    \else
      /PickTrayByPDFSize \@pdfpicktraybypdfsize
    \fi
    \ifx\@pdfprintpagerange\@empty
    \else
      /PrintPageRange[\@pdfprintpagerange]%
    \fi
    \ifx\@pdfnumcopies\@empty
    \else
      /NumCopies \@pdfnumcopies
    \fi
  }%
  \Hy@pstringdef\Hy@pstringB{\@baseurl}%
  \@pdfm@mark{%
    docview<<%
      \ifx\@pdfstartpage\@empty
      \else
        \ifx\@pdfstartview\@empty
        \else
          /OpenAction[@page\@pdfstartpage\@pdfstartview]%
        \fi
      \fi
      \ifx\@baseurl\@empty
      \else
        /URI<</Base(\Hy@pstringB)>>%
      \fi
      /PageMode/\@pdfpagemode
      \ifx\Hy@temp\@empty
      \else
        /ViewerPreferences<<\Hy@temp>>%
      \fi
      \Hy@UseNameKey{PageLayout}\@pdfpagelayout
      \ifx\@pdflang\@empty
      \else
        /Lang(\@pdflang)%
      \fi
    >>%
  }%
  \ifx\@pdfpagescrop\@empty
  \else
    \@pdfm@mark{put @pages <</CropBox[\@pdfpagescrop]>>}%
  \fi
}
%</dvipdfm|xetex>
%    \end{macrocode}
%
%    \begin{macrocode}
%<*dvipdfm|xetex>
%    \end{macrocode}
%    \begin{macro}{\hyper@pagetransition}
%    \begin{macrocode}
\def\hyper@pagetransition{%
  \ifx\@pdfpagetransition\relax
  \else
    \ifx\@pdfpagetransition\@empty
    \else
      \special{pdf:put @thispage %
        <</Trans<</S/\@pdfpagetransition>>>>%
      }%
    \fi
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\hyper@pageduration}
%    \begin{macrocode}
\def\hyper@pageduration{%
  \ifx\@pdfpageduration\relax
  \else
    \ifx\@pdfpageduration\@empty
    \else
      \special{pdf:put @thispage %
        <</Dur \@pdfpageduration>>%
      }%
    \fi
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\hyper@pagehidden}
%    \begin{macrocode}
\def\hyper@pagehidden{%
  \ifHy@useHidKey
    \special{pdf:put @thispage %
      <</Hid \ifHy@pdfpagehidden true\else false\fi>>%
    }%
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
\g@addto@macro\Hy@EveryPageBoxHook{%
  \hyper@pagetransition
  \hyper@pageduration
  \hyper@pagehidden
}
%    \end{macrocode}
%    \begin{macrocode}
%</dvipdfm|xetex>
%    \end{macrocode}
%
%    Xe\TeX\ uses pdf\TeX's method \cs{pdfpagewidth}
%    and \cs{pdfpageheight} for setting the paper size.
%    \begin{macrocode}
%<*dvipdfm>
\AtBeginShipoutFirst{%
  \ifHy@setpagesize
    \begingroup
      \@ifundefined{stockwidth}{%
        \ifdim\paperwidth>\z@
          \ifdim\paperheight>\z@
            \special{papersize=\the\paperwidth,\the\paperheight}%
          \fi
        \fi
      }{%
        \ifdim\stockwidth>\z@
          \ifdim\stockheight>\z@
            \special{papersize=\the\stockwidth,\the\stockheight}%
          \fi
        \fi
      }%
    \endgroup
  \fi
  \Hy@DisableOption{setpagesize}%
}
%</dvipdfm>
%    \end{macrocode}
%
% \subsection{VTeX typesetting system}
% Provided by MicroPress, May 1998.
% They require VTeX version 6.02 or newer;
% see \url{http://www.micropress-inc.com/} for details.
%    \begin{macrocode}
%<*vtexhtml>
\providecommand*{\XR@ext}{htm}
\RequirePackage{vtexhtml}
\newif\if@Localurl
\let\PDF@FinishDoc\ltx@empty
\def\PDF@SetupDoc{%
  \ifx\@baseurl\@empty
  \else
    \special{!direct <base href="\@baseurl">}%
  \fi
}
\def\@urltype{url}
\def\hyper@link#1#2#3{%
  \Hy@VerboseLinkStart{#1}{#2}%
  \leavevmode
  \special{!direct <a href=%
      \hyper@quote\hyper@hash\HyperDestNameFilter{#2}\hyper@quote>}%
  #3\Hy@xspace@end
  \special{!direct </a>}%
}
\def\hyper@linkurl#1#2{%
  \begingroup
    \hyper@chars
    \leavevmode
    \MathBSuppress=1\relax
    \special{!direct <a href=%
        \hyper@quote\HyperDestNameFilter{#2}\hyper@quote>}%
    #1\Hy@xspace@end
    \MathBSuppress=0\relax
    \special{!direct </a>}%
  \endgroup
}
\def\hyper@linkfile#1#2#3{%
  \hyper@linkurl{#1}{\Hy@linkfileprefix#2\ifx\\#3\\\else\##3\fi}%
}
\def\hyper@linkstart#1#2{%
  \Hy@VerboseLinkStart{#1}{#2}%
  \def\Hy@tempa{#1}\ifx\Hy@tempa\@urltype
    \@Localurltrue
    \special{!direct <a href=\hyper@quote#2\hyper@quote>}%
  \else
    \@Localurlfalse
    \begingroup
      \hyper@chars
      \special{!aref \HyperDestNameFilter{#2}}%
    \endgroup
  \fi
}
\def\hyper@linkend{%
  \if@Localurl
    \special{!endaref}%
  \else
    \special{!direct </a>}%
  \fi
}
\Hy@WrapperDef\hyper@anchorstart#1{%
  \Hy@SaveLastskip
  \Hy@VerboseAnchor{#1}%
  \begingroup
    \hyper@chars
    \special{!aname #1}%
    \special{!direct <a name=%
        \hyper@quote\HyperDestNameFilter{#1}\hyper@quote>}%
  \endgroup
  \Hy@activeanchortrue
}
\def\hyper@anchorend{%
  \special{!direct </a>}%
  \Hy@activeanchorfalse
  \Hy@RestoreLastskip
}
\Hy@WrapperDef\hyper@anchor#1{%
  \Hy@SaveLastskip
  \Hy@VerboseAnchor{#1}%
  \begingroup
    \let\protect=\string
    \hyper@chars
    \leavevmode
    \special{!aname #1}%
    \special{!direct <a name=%
        \hyper@quote\HyperDestNameFilter{#1}\hyper@quote>}%
  \endgroup
  \Hy@activeanchortrue
  \bgroup\anchor@spot\egroup
  \special{!direct </a>}%
  \Hy@activeanchorfalse
  \Hy@RestoreLastskip
}
\def\@Form[#1]{%
  \Hy@Message{Sorry, TeXpider does not yet support FORMs}%
}
\let\@endForm\ltx@empty
\def\@Gauge[#1]#2#3#4{% parameters, label, minimum, maximum
  \Hy@Message{Sorry, TeXpider does not yet support FORM gauges}%
}
\def\@TextField[#1]#2{% parameters, label
  \Hy@Message{Sorry, TeXpider does not yet support FORM text fields}%
}
\def\@CheckBox[#1]#2{% parameters, label
  \Hy@Message{Sorry, TeXpider does not yet support FORM checkboxes}%
}
\def\@ChoiceMenu[#1]#2#3{% parameters, label, choices
  \Hy@Message{Sorry, TeXpider does not yet support FORM choice menus}%
}
\def\@PushButton[#1]#2{% parameters, label
  \Hy@Message{Sorry, TeXpider does not yet support FORM pushbuttons}%
}
\def\@Reset[#1]#2{%
  \Hy@Message{Sorry, TeXpider does not yet support FORMs}%
}
\def\@Submit[#1]#2{%
  \Hy@Message{Sorry, TeXpider does not yet support FORMs}%
}
%</vtexhtml>
%    \end{macrocode}
%    \begin{macrocode}
%<*vtex>
%    \end{macrocode}
%    VTeX version 6.68 supports \cs{mediawidth} and \cs{mediaheight}.
%    The \cs{ifx} construct is better than a \cs{csname}, because
%    it avoids the definition and the hash table entry of a
%    previous undefined macro.
%    \begin{macrocode}
\ifx\mediaheight\@undefined
\else
  \ifx\mediaheight\relax
  \else
    \ifHy@setpagesize
       \providecommand*{\VTeXInitMediaSize}{%
         \ltx@IfUndefined{stockwidth}{%
           \ifdim\paperheight>0pt %
             \setlength\mediaheight\paperheight
           \fi
           \ifdim\paperheight>0pt %
             \setlength\mediawidth\paperwidth
           \fi
         }{%
           \ifdim\stockheight>0pt %
             \setlength\mediaheight\stockheight
           \fi
           \ifdim\stockwidth>0pt %
             \setlength\mediawidth\stockwidth
           \fi
         }%
       }%
       \Hy@AtBeginDocument{\VTeXInitMediaSize}%
    \fi
    \Hy@DisableOption{setpagesize}%
  \fi
\fi
%    \end{macrocode}
%    Older versions of VTeX require |xyz| in lower case.
%    \begin{macrocode}
\providecommand*\@pdfview{xyz}
\providecommand*\@pdfborder{0 0 1}
\providecommand*\@pdfborderstyle{}
\let\CurrentBorderColor\@linkbordercolor
\Hy@WrapperDef\hyper@anchor#1{%
  \Hy@SaveLastskip
  \Hy@VerboseAnchor{#1}%
  \begingroup
    \let\protect=\string
    \hyper@chars
    \special{!aname \HyperDestNameFilter{#1};\@pdfview}%
  \endgroup
  \Hy@activeanchortrue
  \Hy@colorlink\@anchorcolor\anchor@spot\Hy@endcolorlink
  \Hy@activeanchorfalse
  \Hy@RestoreLastskip
}
\Hy@WrapperDef\hyper@anchorstart#1{%
  \Hy@SaveLastskip
  \Hy@VerboseAnchor{#1}%
  \begingroup
    \hyper@chars
    \special{!aname \HyperDestNameFilter{#1};\@pdfview}%
  \endgroup
  \Hy@activeanchortrue
}
\def\hyper@anchorend{%
  \Hy@activeanchorfalse
  \Hy@RestoreLastskip
}
\def\@urltype{url}
\def\Hy@undefinedname{UNDEFINED}
\def\hyper@linkstart#1#2{%
  \Hy@VerboseLinkStart{#1}{#2}%
  \Hy@pstringdef\Hy@pstringURI{#2}%
  \expandafter\Hy@colorlink\csname @#1color\endcsname
  \ltx@IfUndefined{@#1bordercolor}{%
    \let\CurrentBorderColor\relax
  }{%
    \edef\CurrentBorderColor{%
      \csname @#1bordercolor\endcsname
    }%
  }%
  \def\Hy@tempa{#1}%
  \ifx\Hy@tempa\@urltype
    \special{!%
      aref <u=/Type/Action/S/URI/URI(\Hy@pstringURI)%
        \ifHy@href@ismap
          /IsMap true%
        \fi
        \Hy@href@nextactionraw
        >;%
      a=<%
        \ifHy@pdfa /F 4\fi
        \Hy@setpdfborder
        \ifx\CurrentBorderColor\relax
        \else
          /C [\CurrentBorderColor]%
        \fi
      >%
    }%
  \else
    \protected@edef\Hy@testname{#2}%
    \ifx\Hy@testname\@empty
      \Hy@Warning{%
        Empty destination name,\MessageBreak
        using `\Hy@undefinedname'%
      }%
      \let\Hy@testname\Hy@undefinedname
    \fi
    \special{!%
      aref \expandafter\HyperDestNameFilter
           \expandafter{\Hy@testname};%
      a=<%
        \ifHy@pdfa /F 4\fi
        \Hy@setpdfborder
        \ifx\CurrentBorderColor\relax
        \else
          /C [\CurrentBorderColor]%
        \fi
      >%
    }%
  \fi
}
\def\hyper@linkend{%
  \special{!endaref}%
  \Hy@endcolorlink
}
\def\hyper@linkfile#1#2#3{%
  \leavevmode
  \def\Hy@pstringF{#2}%
  \Hy@CleanupFile\Hy@pstringF
  \special{!%
    aref <%
    \ifnum\Hy@VTeXversion>753 \ifHy@pdfnewwindow n\fi\fi
    f=\Hy@pstringF>#3;%
    a=<%
      \ifHy@pdfa /F 4\fi
      \Hy@setpdfborder
      \ifx\@filebordercolor\relax
      \else
        /C [\@filebordercolor]%
      \fi
    >%
  }%
  \Hy@colorlink\@filecolor
    #1\Hy@xspace@end
  \Hy@endcolorlink
  \special{!endaref}%
}
\def\hyper@linkurl#1#2{%
  \begingroup
    \Hy@pstringdef\Hy@pstringURI{#2}%
    \hyper@chars
    \leavevmode
    \special{!%
      aref <u=/Type/Action/S/URI/URI(\Hy@pstringURI)%
        \ifHy@href@ismap
          /IsMap true%
        \fi
        \Hy@href@nextactionraw
        >;%
      a=<%
        \ifHy@pdfa /F 4\fi
        \Hy@setpdfborder
        \ifx\@urlbordercolor\relax
        \else
          /C [\@urlbordercolor]%
        \fi
      >%
    }%
    \Hy@colorlink\@urlcolor
      #1\Hy@xspace@end
    \Hy@endcolorlink
    \special{!endaref}%
  \endgroup
}
\def\hyper@link#1#2#3{%
  \Hy@VerboseLinkStart{#1}{#2}%
  \ltx@IfUndefined{@#1bordercolor}{%
    \let\CurrentBorderColor\relax
  }{%
    \edef\CurrentBorderColor{\csname @#1bordercolor\endcsname}%
  }%
  \leavevmode
  \protected@edef\Hy@testname{#2}%
  \ifx\Hy@testname\@empty
    \Hy@Warning{%
      Empty destination name,\MessageBreak
      using `\Hy@undefinedname'%
    }%
    \let\Hy@testname\Hy@undefinedname
  \fi
  \special{!%
    aref \expandafter\HyperDestNameFilter
         \expandafter{\Hy@testname};%
    a=<%
      \ifHy@pdfa /F 4\fi
      \Hy@setpdfborder
      \ifx\CurrentBorderColor\relax
      \else
        /C [\CurrentBorderColor]%
      \fi
    >%
  }%
  \expandafter
  \Hy@colorlink\csname @#1color\endcsname
    #3\Hy@xspace@end
  \Hy@endcolorlink
  \special{!endaref}%
}
\def\hyper@image#1#2{%
  \hyper@linkurl{#2}{#1}%
}
\def\@hyper@launch run:#1\\#2#3{%
  \Hy@pstringdef\Hy@pstringF{#1}%
  \Hy@pstringdef\Hy@pstringP{#3}%
  \leavevmode
  \special{!aref %
    <u=%
      /Type/Action%
      /S/Launch%
      /F(\Hy@pstringF)%
      \Hy@SetNewWindow
      \ifx\\#3\\%
      \else
        /Win<</F(\Hy@pstringF)/P(\Hy@pstringP)>>%
      \fi
      \Hy@href@nextactionraw
    >;%
    a=<%
      \ifHy@pdfa /F 4\fi
      \Hy@setpdfborder
      \ifx\@runbordercolor\relax
      \else
        /C[\@runbordercolor]%
      \fi
    >%
  }%
  \Hy@colorlink\@runcolor
    #2\Hy@xspace@end
  \Hy@endcolorlink
  \special{!endaref}%
}
\def\Acrobatmenu#1#2{%
  \Hy@Acrobatmenu{#1}{#2}{%
    \special{!%
      aref <u=/S /Named /N /#1>;%
      a=<%
        \ifHy@pdfa /F 4\fi
        \Hy@setpdfborder
        \ifx\@menubordercolor\relax
        \else
          /C[\@menubordercolor]%
        \fi
      >%
    }%
    \Hy@colorlink\@menucolor
      #2\Hy@xspace@end
    \Hy@endcolorlink
    \special{!endaref}%
  }%
}
%    \end{macrocode}
%
%    The following code (transition effects) is
%    made by Alex Kostin.
%
%    The code below makes sense for V\TeX\ 7.02 or later.
%
%    Please never use |\@ifundefined{VTeXversion}{..}{..}| \emph{globally}.
%    \begin{macrocode}
\ifnum\Hy@VTeXversion<702 %
\else
  \def\hyper@pagetransition{%
    \ifx\@pdfpagetransition\relax
    \else
      \ifx\@pdfpagetransition\@empty
%    \end{macrocode}
%
%    Standard incantation.
%
%    1. Does an old entry have to be deleted?
%    2. If 1=yes, how to delete?
%    \begin{macrocode}
      \else
        \hvtex@parse@trans\@pdfpagetransition
      \fi
    \fi
  }%
%    \end{macrocode}
%
%    I have to write an ``honest'' parser to convert raw PDF code
%    into V\TeX\ |\special|. (AVK)
%
%    Syntax of V\TeX\ |\special{!trans <transition_effect>}|:
%\begin{verbatim}
%<transition_effect> ::= <transition_style>[,<transition_duration>]
%<transition_style> ::= <Blinds_effect> | <Box_effect> |
%                       <Dissolve_effect> | <Glitter_effect> |
%                       <Split_effect> | <Wipe_effect>
%<Blinds_effect> ::= B[<effect_dimension>]
%<Box_effect> ::= X[<effect_motion>]
%<Dissolve_effect> ::= D
%<Glitter_effect> ::= G[<effect_direction>]
%<Split_effect> ::= S[<effect_motion>][<effect_dimension>]
%<Wipe_effect> ::= W[<effect_direction>]
%<Replace_effect> ::= R
%<effect_direction> ::= <number>
%<effect_dimension> ::= H | V
%<effect_motion> ::= I | O
%<transition_duration> ::= <number>
%\end{verbatim}
%
%    Transition codes:
%    \begin{macrocode}
  \def\hvtex@trans@effect@Blinds{\def\hvtex@trans@code{B}}%
  \def\hvtex@trans@effect@Box{\def\hvtex@trans@code{X}}%
  \def\hvtex@trans@effect@Dissolve{\def\hvtex@trans@code{D}}%
  \def\hvtex@trans@effect@Glitter{\def\hvtex@trans@code{G}}%
  \def\hvtex@trans@effect@Split{\def\hvtex@trans@code{S}}%
  \def\hvtex@trans@effect@Wipe{\def\hvtex@trans@code{W}}%
  \def\hvtex@trans@effect@R{\def\hvtex@trans@code{R}}%
%    \end{macrocode}
%
%    Optional parameters:
%    \begin{macrocode}
  \def\hvtex@par@dimension{/Dm}%
  \def\hvtex@par@direction{/Di}%
  \def\hvtex@par@duration{/D}%
  \def\hvtex@par@motion{/M}%
%    \end{macrocode}
%
%    Tokenizer:
%    \begin{macrocode}
  \def\hvtex@gettoken{%
    \expandafter\hvtex@gettoken@\hvtex@buffer\@nil
  }%
%    \end{macrocode}
%
%    Notice that tokens in the input buffer must be space delimited.
%    \begin{macrocode}
  \def\hvtex@gettoken@#1 #2\@nil{%
    \edef\hvtex@token{#1}%
    \edef\hvtex@buffer{#2}%
  }%
  \def\hvtex@parse@trans#1{%
%    \end{macrocode}
%
%    Initializing code:
%    \begin{macrocode}
    \let\hvtex@trans@code\@empty
    \let\hvtex@param@dimension\@empty
    \let\hvtex@param@direction\@empty
    \let\hvtex@param@duration\@empty
    \let\hvtex@param@motion\@empty
    \edef\hvtex@buffer{#1\space}%
%    \end{macrocode}
%    First token is the PDF transition name without escape.
%    \begin{macrocode}
    \hvtex@gettoken
    \ifx\hvtex@token\@empty
%    \end{macrocode}
%    Leading space(s)?
%    \begin{macrocode}
      \ifx\hvtex@buffer\@empty
%    \end{macrocode}
%    The buffer is empty, nothing to do.
%    \begin{macrocode}
      \else
        \hvtex@gettoken
      \fi
    \fi
    \csname hvtex@trans@effect@\hvtex@token\endcsname
%    \end{macrocode}
%    Now is time to parse optional parameters.
%    \begin{macrocode}
    \hvtex@trans@params
  }%
%    \end{macrocode}
%
%    Reentrable macro to parse optional parameters.
%    \begin{macrocode}
  \def\hvtex@trans@params{%
    \ifx\hvtex@buffer\@empty
    \else
      \hvtex@gettoken
      \let\hvtex@trans@par\hvtex@token
      \ifx\hvtex@buffer\@empty
      \else
        \hvtex@gettoken
        \ifx\hvtex@trans@par\hvtex@par@duration
%    \end{macrocode}
%    /D is the effect duration in seconds. V\TeX\ special
%    takes it in milliseconds.
%    \begin{macrocode}
          \let\hvtex@param@duration\hvtex@token
        \else \ifx\hvtex@trans@par\hvtex@par@motion
%    \end{macrocode}
%    /M can be either /I or /O
%    \begin{macrocode}
          \expandafter\edef\expandafter\hvtex@param@motion
            \expandafter{\expandafter\@gobble\hvtex@token}%
        \else \ifx\hvtex@trans@par\hvtex@par@dimension
%    \end{macrocode}
%    /Dm can be either /H or /V
%    \begin{macrocode}
          \expandafter\edef\expandafter\hvtex@param@dimension
            \expandafter{\expandafter\@gobble\hvtex@token}%
        \else \ifx\hvtex@trans@par\hvtex@par@direction
%    \end{macrocode}
%
%    Valid values for /Di are 0, 270, 315 (the Glitter effect) or
%    0, 90, 180, 270 (the Wipe effect).
%    \begin{macrocode}
          \let\hvtex@param@direction\hvtex@token
        \fi\fi\fi\fi
      \fi
    \fi
    \ifx\hvtex@buffer\@empty
      \let\next\hvtex@produce@trans
    \else
      \let\next\hvtex@trans@params
    \fi
    \next
  }%
%    \end{macrocode}
%
%    Merge |<transition_effect>| and issue the special when possible.
%    Too lazy to validate optional parameters.
%    \begin{macrocode}
  \def\hvtex@produce@trans{%
    \let\vtex@trans@special\@empty
    \if S\hvtex@trans@code
      \edef\vtex@trans@special{\hvtex@trans@code
        \hvtex@param@dimension\hvtex@param@motion}%
    \else\if B\hvtex@trans@code
      \edef\vtex@trans@special{%
        \hvtex@trans@code\hvtex@param@dimension
      }%
    \else\if X\hvtex@trans@code
      \edef\vtex@trans@special{%
        \hvtex@trans@code\hvtex@param@motion
      }%
    \else\if W\hvtex@trans@code
      \edef\vtex@trans@special{%
        \hvtex@trans@code\hvtex@param@direction
      }%
    \else\if D\hvtex@trans@code
      \let\vtex@trans@special\hvtex@trans@code
    \else\if R\hvtex@trans@code
      \let\vtex@trans@special\hvtex@trans@code
    \else\if G\hvtex@trans@code
      \edef\vtex@trans@special{%
        \hvtex@trans@code\hvtex@param@direction
      }%
    \fi\fi\fi\fi\fi\fi\fi
    \ifx\vtex@trans@special\@empty
    \else
      \ifx\hvtex@param@duration\@empty
      \else
        \setlength{\dimen@}{\hvtex@param@duration\p@}%
%    \end{macrocode}
%    I'm not guilty of possible overflow.
%    \begin{macrocode}
        \multiply\dimen@\@m
        \edef\vtex@trans@special{%
          \vtex@trans@special,\strip@pt\dimen@
        }%
      \fi
%    \end{macrocode}
%
%    And all the mess is just for this.
%
%    \begin{macrocode}
      \special{!trans \vtex@trans@special}%
    \fi
  }%
%    \end{macrocode}
%    \begin{macrocode}
  \def\hyper@pageduration{%
    \ifx\@pdfpageduration\relax
    \else
      \ifx\@pdfpageduration\@empty
        \special{!duration-}%
      \else
        \special{!duration \@pdfpageduration}%
      \fi
    \fi
  }%
  \def\hyper@pagehidden{%
    \ifHy@useHidKey
      \special{!hidden\ifHy@pdfpagehidden +\else -\fi}%
    \fi
  }%
  \g@addto@macro\Hy@EveryPageBoxHook{%
    \hyper@pagetransition
    \hyper@pageduration
    \hyper@pagehidden
  }%
\fi
%    \end{macrocode}
%
%    Caution: In opposite to the other drivers,
%    the argument of |\special{!onopen #1}| is
%    a reference name. The VTeX's postscript
%    mode will work with a version higher than
%    7.0x.
%
%    The command \verb|\VTeXOS| is defined since version 7.45.
%    Magic values encode the operating system:\\
%    \begin{tabular}{@{}l@{: }l@{}}
%      1 & WinTel\\
%      2 & Linux\\
%      3 & OS/2\\
%      4 & MacOS\\
%      5 & MacOS/X\\
%    \end{tabular}
%    \begin{macrocode}
\ifx\@pdfproducer\relax
  \def\@pdfproducer{VTeX}%
  \ifnum\Hy@VTeXversion>\z@
    \count@\VTeXversion
    \divide\count@ 100 %
    \edef\@pdfproducer{\@pdfproducer\space v\the\count@}%
    \multiply\count@ -100 %
    \advance\count@\VTeXversion
    \edef\@pdfproducer{%
      \@pdfproducer
      .\ifnum\count@<10 0\fi\the\count@
      \ifx\VTeXOS\@undefined\else
        \ifnum\VTeXOS>0 %
          \ifnum\VTeXOS<6 %
            \space(%
            \ifcase\VTeXOS
            \or Windows\or Linux\or OS/2\or MacOS\or MacOS/X%
            \fi
            )%
          \fi
        \fi
      \fi
      ,\space
      \ifnum\OpMode=\@ne PDF\else PS\fi
      \space backend%
      \ifx\gexmode\@undefined\else
        \ifnum\gexmode>\z@\space with GeX\fi
      \fi
    }%
  \fi
\fi
%    \end{macrocode}
%
%    Current |!pdfinfo| key syntax:
%
%    \begin{tabular}{lll}
%     \hline
%      Key        & Field                    & Type   \\
%     \hline
%     \texttt{a} & \textbf{A}uthor          & String \\
%     \texttt{b} & Crop\textbf{B}ox         & String \\
%     \texttt{c} & \textbf{C}reator         & String \\
%     \texttt{k} & \textbf{K}eywords        & String \\
%     \texttt{l} & Page\textbf{L}ayout      & PS     \\
%     \texttt{p} & \textbf{P}ageMode        & PS     \\
%     \texttt{r} & P\textbf{r}oducer        & String \\
%     \texttt{s} & \textbf{S}ubject         & String \\
%     \texttt{t} & \textbf{T}itle           & String \\
%     \texttt{u} & \textbf{U}RI             & PS     \\
%     \texttt{v} & \textbf{V}iewPreferences & PS     \\
%    \hline
%    \end{tabular}
%
%    Note: PS objects that are dicts are in |<<<..>>>| (yuck; no choice).
%
%    \begin{macrocode}
\def\PDF@SetupDoc{%
  \ifx\@pdfpagescrop\@empty
  \else
    \special{!pdfinfo b=<\@pdfpagescrop>}%
  \fi
  \ifx\@pdfstartpage\@empty
  \else
    \ifx\@pdfstartview\@empty
    \else
      \special{!onopen Page\@pdfstartpage}%
    \fi
  \fi
  \special{!pdfinfo p=</\@pdfpagemode>}%
  \ifx\@baseurl\@empty
  \else
    \special{!pdfinfo u=<<</Base (\@baseurl)>>>}%
  \fi
  \special{!pdfinfo v=<<<%
    \ifHy@pdftoolbar\else /HideToolbar true\fi
    \ifHy@pdfmenubar\else /HideMenubar true\fi
    \ifHy@pdfwindowui\else /HideWindowUI true\fi
    \ifHy@pdffitwindow /FitWindow true\fi
    \ifHy@pdfcenterwindow /CenterWindow true\fi
    \ifHy@pdfdisplaydoctitle /DisplayDocTitle true\fi
    \Hy@UseNameKey{NonFullScreenPageMode}\@pdfnonfullscreenpagemode
    \Hy@UseNameKey{Direction}\@pdfdirection
    \Hy@UseNameKey{ViewArea}\@pdfviewarea
    \Hy@UseNameKey{ViewClip}\@pdfviewclip
    \Hy@UseNameKey{PrintArea}\@pdfprintarea
    \Hy@UseNameKey{PrintClip}\@pdfprintclip
    \Hy@UseNameKey{PrintScaling}\@pdfprintscaling
    \Hy@UseNameKey{Duplex}\@pdfduplex
    \ifx\@pdfpicktraybypdfsize\@empty
    \else
      /PickTrayByPDFSize \@pdfpicktraybypdfsize
    \fi
    \ifx\@pdfprintpagerange\@empty
    \else
      /PrintPageRange[\@pdfprintpagerange]%
    \fi
    \ifx\@pdfnumcopies\@empty
    \else
      /NumCopies \@pdfnumcopies
    \fi
  >>>}%
  \ifx\@pdfpagelayout\@empty
  \else
    \special{!pdfinfo l=</\@pdfpagelayout\space>}%
  \fi
}%
\HyInfo@AddonUnsupportedtrue
\def\PDF@FinishDoc{%
  \Hy@UseMaketitleInfos
  \HyInfo@TrappedUnsupported
  \special{!pdfinfo a=<\@pdfauthor>}%
  \special{!pdfinfo t=<\@pdftitle>}%
  \special{!pdfinfo s=<\@pdfsubject>}%
  \special{!pdfinfo c=<\@pdfcreator>}%
  \ifx\@pdfproducer\relax
  \else
    \special{!pdfinfo r=<\@pdfproducer>}%
  \fi
  \special{!pdfinfo k=<\@pdfkeywords>}%
  \Hy@DisableOption{pdfauthor}%
  \Hy@DisableOption{pdftitle}%
  \Hy@DisableOption{pdfsubject}%
  \Hy@DisableOption{pdfcreator}%
  \Hy@DisableOption{pdfcreationdate}%
  \Hy@DisableOption{pdfmoddate}%
  \Hy@DisableOption{pdfproducer}%
  \Hy@DisableOption{pdfkeywords}%
  \Hy@DisableOption{pdftrapped}%
  \Hy@DisableOption{pdfinfo}%
}
%</vtex>
%    \end{macrocode}
%
% \subsection{Fix for Adobe bug number 466320}
%    If a destination occurs at the very begin of a page,
%    the destination is moved to the previous page by
%    Adobe Distiller 5.
%    As workaround Adobe suggests:
%\begin{verbatim}
%/showpage {
%  //showpage
%  clippath stroke erasepage
%} bind def
%\end{verbatim}
%
%    But unfortunately this fix generates an empty page
%    at the end of the document. Therefore another fix
%    is used by writing some clipped text.
%    \begin{macrocode}
%<dviwindo>\def\literalps@out#1{\special{ps:#1}}%
%<package>\providecommand*{\Hy@DistillerDestFix}{}
%<*pdfmark|dviwindo>
\def\Hy@DistillerDestFix{%
  \begingroup
    \let\x\literalps@out
%    \end{macrocode}
%    The fix has to be passed unchanged through GeX, if
%    VTeX in PostScript mode with GeX is used.
%    \begin{macrocode}
    \ifnum \@ifundefined{OpMode}{0}{%
           \@ifundefined{gexmode}{0}{%
           \ifnum\gexmode>0 \OpMode\else 0\fi
           }}>1 %
      \def\x##1{%
        \immediate\special{!=##1}%
      }%
    \fi
    \x{%
      /product where{%
        pop %
        product(Distiller)search{%
          pop pop pop %
          version(.)search{%
            exch pop exch pop%
            (3011)eq{%
              gsave %
              newpath 0 0 moveto closepath clip%
              /Courier findfont 10 scalefont setfont %
              72 72 moveto(.)show %
              grestore%
            }if%
          }{pop}ifelse%
        }{pop}ifelse%
      }if%
    }%
  \endgroup
}
%</pdfmark|dviwindo>
%    \end{macrocode}
%
% \subsection{Direct pdfmark support}
%    Drivers that load |pdfmark.def| have to provide the
%    correct macro definitions of
%    \begin{center}
%      \begin{tabular}{@{}ll@{}}
%        |\@pdfproducer|& for document information\\
%        |\literalps@out|& PostScript output\\
%        |\headerps@out|& PostScript output that goes in the header area\\
%      \end{tabular}
%    \end{center}
%    and the correct definitions of the following PostScript procedures:
%    \begin{center}
%      \begin{tabular}{@{}ll@{}}
%        |H.S|& start of anchor, link or rect\\
%        |#1 H.A|& end of anchor, argument=baselineskip in pt\\
%        |#1 H.L|& end of link, argument=baselineskip in pt\\
%        |H.R|& end of rect\\
%        |H.B|& raw rect code\\
%      \end{tabular}
%    \end{center}
%
%    \begin{macrocode}
%<*pdfmark>
\Hy@breaklinks@unsupported
\def\HyPat@ObjRef{%
  \{[^{}]+\}%
}
\Hy@WrapperDef\hyper@anchor#1{%
  \Hy@SaveLastskip
  \Hy@VerboseAnchor{#1}%
  \begingroup
    \pdfmark[\anchor@spot]{%
      pdfmark=/DEST,%
      linktype=anchor,%
      View=/\@pdfview \@pdfviewparams,%
      DestAnchor={#1}%
    }%
  \endgroup
  \Hy@RestoreLastskip
}
\ltx@IfUndefined{hyper@anchorstart}{}{\endinput}
\Hy@WrapperDef\hyper@anchorstart#1{%
  \Hy@SaveLastskip
  \Hy@VerboseAnchor{#1}%
  \literalps@out{H.S}%
  \Hy@AllowHyphens
  \xdef\hyper@currentanchor{#1}%
  \Hy@activeanchortrue
}
\def\hyper@anchorend{%
  \literalps@out{\strip@pt@and@otherjunk\baselineskip\space H.A}%
  \pdfmark{%
    pdfmark=/DEST,%
    linktype=anchor,%
    View=/\@pdfview \@pdfviewparams,%
    DestAnchor=\hyper@currentanchor,%
  }%
  \Hy@activeanchorfalse
  \Hy@RestoreLastskip
}
\def\hyper@linkstart#1#2{%
  \Hy@VerboseLinkStart{#1}{#2}%
  \ifHy@breaklinks
  \else
    \leavevmode
    \ifmmode
      \def\Hy@LinkMath{$}%
    \else
      \let\Hy@LinkMath\ltx@empty
    \fi
    \Hy@SaveSpaceFactor
    \hbox\bgroup
    \Hy@RestoreSpaceFactor
    \Hy@LinkMath
  \fi
  \expandafter\Hy@colorlink\csname @#1color\endcsname
  \literalps@out{H.S}%
  \Hy@AllowHyphens
  \xdef\hyper@currentanchor{#2}%
  \gdef\hyper@currentlinktype{#1}%
}
\def\hyper@linkend{%
  \literalps@out{\strip@pt@and@otherjunk\baselineskip\space H.L}%
  \ltx@IfUndefined{@\hyper@currentlinktype bordercolor}{%
    \let\Hy@tempcolor\relax
  }{%
    \edef\Hy@tempcolor{%
      \csname @\hyper@currentlinktype bordercolor\endcsname
    }%
  }%
  \pdfmark{%
    pdfmark=/ANN,%
    linktype=link,%
    Subtype=/Link,%
    PDFAFlags=4,%
    Dest=\hyper@currentanchor,%
    AcroHighlight=\@pdfhighlight,%
    Border=\@pdfborder,%
    BorderStyle=\@pdfborderstyle,%
    Color=\Hy@tempcolor,%
    Raw=H.B%
  }%
  \Hy@endcolorlink
  \ifHy@breaklinks
  \else
    \Hy@LinkMath
    \Hy@SaveSpaceFactor
    \egroup
    \Hy@RestoreSpaceFactor
  \fi
}
%    \end{macrocode}
%
% We have to allow for |\baselineskip| having an optional
% stretch and shrink (you meet this in slide packages, for instance),
% so we need to strip off the junk. David Carlisle, of course,
% wrote this bit of code.
%    \begin{macrocode}
\begingroup
  \catcode`P=12 %
  \catcode`T=12 %
  \lowercase{\endgroup
  \gdef\rem@ptetc#1.#2PT#3!{#1\ifnum#2>\z@.#2\fi}%
}
\def\strip@pt@and@otherjunk#1{\expandafter\rem@ptetc\the#1!}
%    \end{macrocode}
%
%    \begin{macro}{\hyper@pagetransition}
%    \begin{macrocode}
\def\hyper@pagetransition{%
  \ifx\@pdfpagetransition\relax
  \else
    \ifx\@pdfpagetransition\@empty
      % 1. Does an old entry have to be deleted?
      % 2. If 1=yes, how to delete?
    \else
      \pdfmark{%
        pdfmark=/PUT,%
        Raw={%
          \string{ThisPage\string}%
          <</Trans << /S /\@pdfpagetransition\space >> >>%
        }%
      }%
    \fi
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\hyper@pageduration}
%    \begin{macrocode}
\def\hyper@pageduration{%
  \ifx\@pdfpageduration\relax
  \else
    \ifx\@pdfpageduration\@empty
      % 1. Does an old entry have to be deleted?
      % 2. If 1=yes, how to delete?
    \else
      \pdfmark{%
        pdfmark=/PUT,%
        Raw={%
          \string{ThisPage\string}%
          <</Dur \@pdfpageduration>>%
        }%
      }%
    \fi
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\hyper@pagehidden}
%    \begin{macrocode}
\def\hyper@pagehidden{%
  \ifHy@useHidKey
    \pdfmark{%
      pdfmark=/PUT,%
      Raw={%
        \string{ThisPage\string}%
        <</Hid \ifHy@pdfpagehidden true\else false\fi>>%
      }%
    }%
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
\g@addto@macro\Hy@EveryPageBoxHook{%
  \hyper@pagetransition
  \hyper@pageduration
  \hyper@pagehidden
}
%    \end{macrocode}
%    \begin{macrocode}
\def\hyper@image#1#2{%
  \hyper@linkurl{#2}{#1}%
}
\def\Hy@undefinedname{UNDEFINED}
\def\hyper@link#1#2#3{%
  \Hy@VerboseLinkStart{#1}{#2}%
  \ltx@IfUndefined{@#1bordercolor}{%
    \let\Hy@tempcolor\relax
  }{%
    \edef\Hy@tempcolor{\csname @#1bordercolor\endcsname}%
  }%
  \begingroup
    \protected@edef\Hy@testname{#2}%
    \ifx\Hy@testname\@empty
      \Hy@Warning{%
        Empty destination name,\MessageBreak
        using `\Hy@undefinedname'%
      }%
      \let\Hy@testname\Hy@undefinedname
    \fi
    \pdfmark[{#3}]{%
      Color=\Hy@tempcolor,%
      linktype={#1},%
      AcroHighlight=\@pdfhighlight,%
      Border=\@pdfborder,%
      BorderStyle=\@pdfborderstyle,%
      pdfmark=/ANN,%
      Subtype=/Link,%
      PDFAFlags=4,%
      Dest=\Hy@testname
    }%
  \endgroup
}
\newtoks\pdf@docset
\def\PDF@FinishDoc{%
  \Hy@UseMaketitleInfos
  \HyInfo@GenerateAddons
  \let\Hy@temp\@empty
  \ifx\@pdfcreationdate\@empty
  \else
    \def\Hy@temp{CreationDate=\@pdfcreationdate,}%
  \fi
  \ifx\@pdfmoddate\@empty
  \else
    \expandafter\def\expandafter\Hy@temp\expandafter{%
      \Hy@temp
      ModDate=\@pdfmoddate,%
    }%
  \fi
  \ifx\@pdfproducer\relax
  \else
    \expandafter\def\expandafter\Hy@temp\expandafter{%
      \Hy@temp
      Producer=\@pdfproducer,%
    }%
  \fi
  \expandafter
  \pdfmark\expandafter{%
    \Hy@temp
    pdfmark=/DOCINFO,%
    Title=\@pdftitle,%
    Subject=\@pdfsubject,%
    Creator=\@pdfcreator,%
    Author=\@pdfauthor,%
    Keywords=\@pdfkeywords,%
    Trapped=\@pdftrapped
  }%
  \ifx\HyInfo@Addons\@empty
  \else
    \pdfmark{%
      pdfmark=/DOCINFO,%
      Raw={\HyInfo@Addons}%
    }%
  \fi
  \Hy@DisableOption{pdfauthor}%
  \Hy@DisableOption{pdftitle}%
  \Hy@DisableOption{pdfsubject}%
  \Hy@DisableOption{pdfcreator}%
  \Hy@DisableOption{pdfcreationdate}%
  \Hy@DisableOption{pdfmoddate}%
  \Hy@DisableOption{pdfproducer}%
  \Hy@DisableOption{pdfkeywords}%
  \Hy@DisableOption{pdftrapped}%
  \Hy@DisableOption{pdfinfo}%
}
\def\PDF@SetupDoc{%
  \def\Hy@temp{}%
  \ifx\@pdfstartpage\@empty
  \else
    \ifx\@pdfstartview\@empty
    \else
      \edef\Hy@temp{%
        ,Page=\@pdfstartpage
        ,View=\@pdfstartview
      }%
    \fi
  \fi
  \edef\Hy@temp{%
    \noexpand\pdfmark{%
      pdfmark=/DOCVIEW,%
      PageMode=/\@pdfpagemode
      \Hy@temp
    }%
  }%
  \Hy@temp
  \ifx\@pdfpagescrop\@empty
  \else
    \pdfmark{pdfmark=/PAGES,CropBox=\@pdfpagescrop}%
  \fi
  \edef\Hy@temp{%
    \ifHy@pdftoolbar\else /HideToolbar true\fi
    \ifHy@pdfmenubar\else /HideMenubar true\fi
    \ifHy@pdfwindowui\else /HideWindowUI true\fi
    \ifHy@pdffitwindow /FitWindow true\fi
    \ifHy@pdfcenterwindow /CenterWindow true\fi
    \ifHy@pdfdisplaydoctitle /DisplayDocTitle true\fi
    \Hy@UseNameKey{NonFullScreenPageMode}\@pdfnonfullscreenpagemode
    \Hy@UseNameKey{Direction}\@pdfdirection
    \Hy@UseNameKey{ViewArea}\@pdfviewarea
    \Hy@UseNameKey{ViewClip}\@pdfviewclip
    \Hy@UseNameKey{PrintArea}\@pdfprintarea
    \Hy@UseNameKey{PrintClip}\@pdfprintclip
    \Hy@UseNameKey{PrintScaling}\@pdfprintscaling
    \Hy@UseNameKey{Duplex}\@pdfduplex
    \ifx\@pdfpicktraybypdfsize\@empty
    \else
      /PickTrayByPDFSize \@pdfpicktraybypdfsize
    \fi
    \ifx\@pdfprintpagerange\@empty
    \else
      /PrintPageRange[\@pdfprintpagerange]%
    \fi
    \ifx\@pdfnumcopies\@empty
    \else
      /NumCopies \@pdfnumcopies
    \fi
  }%
  \Hy@pstringdef\Hy@pstringB{\@baseurl}%
  \pdfmark{%
    pdfmark=/PUT,%
    Raw={%
      \string{Catalog\string}<<%
        \ifx\Hy@temp\@empty
        \else
          /ViewerPreferences<<\Hy@temp>>%
        \fi
        \Hy@UseNameKey{PageLayout}\@pdfpagelayout
        \ifx\@pdflang\@empty
        \else
          /Lang(\@pdflang)%
        \fi
        \ifx\@baseurl\@empty
        \else
          /URI<</Base(\Hy@pstringB)>>%
        \fi
      >>%
    }%
  }%
}
%</pdfmark>
%<*pdfmarkbase>
%    \end{macrocode}
% We define a single macro, pdfmark, which uses the `keyval' system
% to define the various allowable keys; these are \emph{exactly}
% as listed in the pdfmark reference for Acrobat 3.0. The only addition
% is \texttt{pdfmark} which specifies the type of pdfmark to create
% (like ANN, LINK etc). The
% surrounding round and square brackets in the pdfmark commands
% are supplied, but you have to put in / characters as needed for the
% values.
%
%    \begin{macrocode}
\newif\ifHy@pdfmarkerror
\def\pdfmark{\@ifnextchar[{\pdfmark@}{\pdfmark@[]}}
\def\pdfmark@[#1]#2{%
  \Hy@pdfmarkerrorfalse
  \edef\@processme{\noexpand\pdf@toks={\the\pdf@defaulttoks}}%
  \@processme
  \let\pdf@type\relax
  \kvsetkeys{PDF}{#2}%
  \ifHy@pdfmarkerror
  \else
    \ifx\pdf@type\relax
       \Hy@WarningNoLine{no pdfmark type specified in #2!!}%
       \ifx\\#1\\%
       \else
         \pdf@rect{#1}%
       \fi
    \else
       \ifx\\#1\\%
         \literalps@out{%
           [\the\pdf@toks\space\pdf@type\space pdfmark%
         }%
       \else
         \ltx@IfUndefined{@\pdf@linktype color}{%
           \Hy@colorlink\@linkcolor
         }{%
           \expandafter\Hy@colorlink
                       \csname @\pdf@linktype color\endcsname
         }%
         \pdf@rect{#1}%
         \literalps@out{%
           [\the\pdf@toks\space\pdf@type\space pdfmark%
         }%
         \Hy@endcolorlink
       \fi
    \fi
  \fi
}
%    \end{macrocode}
% The complicated bit is working out the right enclosing rectangle of
% some piece of \TeX\ text, needed by the /Rect key. This solution originates
% with  Toby Thain (\texttt{tobyt@netspace.net.au}).
%
% For the case breaklinks is enabled, I have added two hooks,
% the first one for package setouterhbox, it provides
% a hopefully better method without setting the text twice.
% \begin{quote}
%  \verb|\usepackage[hyperref]{setouterhbox}|
% \end{quote}
% With the second hook, also you can set the text twice, e.g.:
% \begin{quote}
%  \verb|\long\def\Hy@setouterhbox#1#2{\long\def\my@temp{#2}}|\\
%  \verb|\def\Hy@breaklinksunhbox#1{\my@temp}|
% \end{quote}
%    \begin{macrocode}
\newsavebox{\pdf@box}
\providecommand*{\Hy@setouterhbox}{\sbox}
\providecommand*{\Hy@breaklinksunhbox}{\unhbox}
\def\Hy@DEST{/DEST}
\def\pdf@rect#1{%
  \begingroup
    \chardef\x=1 %
    \def\Hy@temp{#1}%
    \ifx\Hy@temp\ltx@empty
      \chardef\x=0 %
    \else
      \def\y{\anchor@spot}%
      \ifx\Hy@temp\y
        \def\y{\relax}%
        \ifx\anchor@spot\y
          \chardef\x=0 %
        \fi
      \fi
    \fi
  \expandafter\endgroup
  \ifcase\x
    \literalps@out{H.S}%
    \literalps@out{H.R}%
  \else
    \leavevmode
    \Hy@SaveSpaceFactor
    \ifmmode
      \def\Hy@LinkMath{$}%
    \else
      \let\Hy@LinkMath\ltx@empty
    \fi
    \ifHy@breaklinks
      \Hy@setouterhbox\pdf@box{%
        \Hy@RestoreSpaceFactor
        \Hy@LinkMath
        \Hy@AllowHyphens#1\Hy@xspace@end
        \Hy@LinkMath
        \Hy@SaveSpaceFactor
      }%
    \else
      \sbox\pdf@box{%
        \Hy@RestoreSpaceFactor
        \Hy@LinkMath
        #1\Hy@xspace@end
        \Hy@LinkMath
        \Hy@SaveSpaceFactor
      }%
    \fi
    \dimen@\ht\pdf@box
    \ifdim\dp\pdf@box=\z@
      \literalps@out{H.S}%
    \else
      \lower\dp\pdf@box\hbox{\literalps@out{H.S}}%
    \fi
%    \end{macrocode}
% If the text has to be horizontal mode stuff then just unbox
% the saved box like this, which saves executing it twice, which can
% mess up counters etc (thanks DPC\ldots).
%    \begin{macrocode}
    \ifHy@breaklinks
      \ifhmode
        \Hy@breaklinksunhbox\pdf@box
      \else
        \box\pdf@box
      \fi
    \else
      \expandafter\box\pdf@box
    \fi
%    \end{macrocode}
% but if it can have multiple paragraphs you'd need one of these,
% but in that case the measured box size would be wrong anyway.
%    \begin{quote}
%   |\ifHy@breaklinks#1\else\box\pdf@box\fi|\\
%   |\ifHy@breaklinks{#1}\else\box\pdf@box\fi|
%    \end{quote}
%    \begin{macrocode}
    \ifdim\dimen@=\z@
      \literalps@out{H.R}%
    \else
      \raise\dimen@\hbox{\literalps@out{H.R}}%
    \fi
    \Hy@RestoreSpaceFactor
  \fi
  \ifx\pdf@type\Hy@DEST
  \else
    \pdf@addtoksx{H.B}%
  \fi
}
%    \end{macrocode}
% All the supplied material is stored in a token list; since I do not
% feel sure I quite understand these, things may not work as expected
% with expansion. We'll have to experiment.
%    \begin{macrocode}
\newtoks\pdf@toks
\newtoks\pdf@defaulttoks
\pdf@defaulttoks={}%
\def\pdf@addtoks#1#2{%
  \edef\@processme{\pdf@toks{\the\pdf@toks/#2 #1}}%
  \@processme
}
\def\pdf@addtoksx#1{%
  \edef\@processme{\pdf@toks{\the\pdf@toks\space #1}}%
  \@processme
}
\def\PDFdefaults#1{%
  \pdf@defaulttoks={#1}%
}
%    \end{macrocode}
% This is the list of allowed keys. See the Acrobat manual for an
% explanation.
%    \begin{macrocode}
% what is the type of pdfmark?
\define@key{PDF}{pdfmark}{\def\pdf@type{#1}}
% what is the link type?
\define@key{PDF}{linktype}{\def\pdf@linktype{#1}}
\def\pdf@linktype{link}
% parameter is a stream of PDF
\define@key{PDF}{Raw}{\pdf@addtoksx{#1}}
% parameter is a name
\define@key{PDF}{Action}{\pdf@addtoks{#1}{Action}}
% parameter is a array
\define@key{PDF}{Border}{%
  \edef\Hy@temp{#1}%
  \ifx\Hy@temp\@empty
  \else
    \pdf@addtoks{[#1]\Hy@BorderArrayPatch}{Border}% hash-ok
  \fi
}
\let\Hy@BorderArrayPatch\@empty
% parameter is a dictionary
\define@key{PDF}{BorderStyle}{%
  \edef\Hy@temp{#1}%
  \ifx\Hy@temp\@empty
  \else
    \pdf@addtoks{<<#1>>}{BS}%
  \fi
}
% parameter is a array
\define@key{PDF}{Color}{%
  \ifx\relax#1\relax
  \else
    \pdf@addtoks{[#1]}{Color}% hash-ok
  \fi
}
% parameter is a string
\define@key{PDF}{Contents}{\pdf@addtoks{(#1)}{Contents}}
% parameter is a integer
\define@key{PDF}{Count}{\pdf@addtoks{#1}{Count}}
% parameter is a array
\define@key{PDF}{CropBox}{\pdf@addtoks{[#1]}{CropBox}}% hash-ok
% parameter is a string
\define@key{PDF}{DOSFile}{\pdf@addtoks{(#1)}{DOSFile}}
% parameter is a string or file
\define@key{PDF}{DataSource}{\pdf@addtoks{(#1)}{DataSource}}
% parameter is a destination
\define@key{PDF}{Dest}{%
  \Hy@pstringdef\Hy@pstringDest{\HyperDestNameFilter{#1}}%
  \ifx\Hy@pstringDest\@empty
    \Hy@pdfmarkerrortrue
    \Hy@Warning{Destination with empty name ignored}%
  \else
    \pdf@addtoks{(\Hy@pstringDest) cvn}{Dest}%
  \fi
}
\define@key{PDF}{DestAnchor}{%
  \Hy@pstringdef\Hy@pstringDest{\HyperDestNameFilter{#1}}%
  \ifx\Hy@pstringDest\@empty
    \Hy@pdfmarkerrortrue
    \Hy@Warning{Destination with empty name ignored}%
  \else
    \pdf@addtoks{(\Hy@pstringDest) cvn}{Dest}%
  \fi
}
% parameter is a string
\define@key{PDF}{Dir}{\pdf@addtoks{(#1)}{Dir}}
% parameter is a string
\define@key{PDF}{File}{\pdf@addtoks{(#1)}{File}}
% parameter is a int
\define@key{PDF}{Flags}{\pdf@addtoks{#1}{Flags}}
\define@key{PDF}{PDFAFlags}{%
  \ifHy@pdfa
    \pdf@addtoks{#1}{F}%
  \fi
}
% parameter is a name
\define@key{PDF}{AcroHighlight}{%
  \begingroup
    \edef\x{#1}%
  \expandafter\endgroup\ifx\x\@empty
  \else
    \pdf@addtoks{#1}{H}%
  \fi
}
% parameter is a string
\define@key{PDF}{ID}{\pdf@addtoks{[#1]}{ID}}% hash-ok
% parameter is a string
\define@key{PDF}{MacFile}{\pdf@addtoks{(#1)}{MacFile}}
% parameter is a string
\define@key{PDF}{ModDate}{\pdf@addtoks{(#1)}{ModDate}}
% parameter is a string
\define@key{PDF}{Op}{\pdf@addtoks{(#1)}{Op}}
% parameter is a Boolean
\define@key{PDF}{Open}{\pdf@addtoks{#1}{Open}}
% parameter is a integer or name
\define@key{PDF}{Page}{\pdf@addtoks{#1}{Page}}
% parameter is a name
\define@key{PDF}{PageMode}{\pdf@addtoks{#1}{PageMode}}
% parameter is a string
\define@key{PDF}{Params}{\pdf@addtoks{(#1)}{Params}}
% parameter is a array
\define@key{PDF}{Rect}{\pdf@addtoks{[#1]}{Rect}}% hash-ok
% parameter is a integer
\define@key{PDF}{SrcPg}{\pdf@addtoks{#1}{SrcPg}}
% parameter is a name
\define@key{PDF}{Subtype}{\pdf@addtoks{#1}{Subtype}}
% parameter is a string
\define@key{PDF}{Title}{\pdf@addtoks{(#1)}{Title}}
% parameter is a string
\define@key{PDF}{Unix}{\pdf@addtoks{(#1)}{Unix}}
% parameter is a string
\define@key{PDF}{UnixFile}{\pdf@addtoks{(#1)}{UnixFile}}
% parameter is an array
\define@key{PDF}{View}{\pdf@addtoks{[#1]}{View}}% hash-ok
% parameter is a string
\define@key{PDF}{WinFile}{\pdf@addtoks{(#1)}{WinFile}}
%    \end{macrocode}
% These are the keys used in the DOCINFO section.
%    \begin{macrocode}
\define@key{PDF}{Author}{\pdf@addtoks{(#1)}{Author}}
\define@key{PDF}{Creator}{\pdf@addtoks{(#1)}{Creator}}
\define@key{PDF}{CreationDate}{\pdf@addtoks{(#1)}{CreationDate}}
\define@key{PDF}{ModDate}{\pdf@addtoks{(#1)}{ModDate}}
\define@key{PDF}{Producer}{\pdf@addtoks{(#1)}{Producer}}
\define@key{PDF}{Subject}{\pdf@addtoks{(#1)}{Subject}}
\define@key{PDF}{Keywords}{\pdf@addtoks{(#1)}{Keywords}}
\define@key{PDF}{ModDate}{\pdf@addtoks{(#1)}{ModDate}}
\define@key{PDF}{Base}{\pdf@addtoks{(#1)}{Base}}
\define@key{PDF}{URI}{\pdf@addtoks{#1}{URI}}
\define@key{PDF}{Trapped}{%
  \edef\Hy@temp{#1}%
  \ifx\Hy@temp\@empty
  \else
    \pdf@addtoks{/#1}{Trapped}%
  \fi
}

%</pdfmarkbase>
%<*pdfmark>
\def\Acrobatmenu#1#2{%
  \Hy@Acrobatmenu{#1}{#2}{%
    \pdfmark[{#2}]{%
      linktype=menu,%
      pdfmark=/ANN,%
      AcroHighlight=\@pdfhighlight,%
      Border=\@pdfborder,%
      BorderStyle=\@pdfborderstyle,%
      Action={<< /Subtype /Named /N /#1 >>},%
      Subtype=/Link,%
      PDFAFlags=4%
    }%
  }%
}
%    \end{macrocode}
% And now for some useful examples:
%    \begin{macrocode}
\def\PDFNextPage{\@ifnextchar[{\PDFNextPage@}{\PDFNextPage@[]}}
\def\PDFNextPage@[#1]#2{%
  \pdfmark[{#2}]{%
    #1,%
    Border=\@pdfborder,%
    BorderStyle=\@pdfborderstyle,%
    Color=.2 .1 .5,%
    pdfmark=/ANN,%
    Subtype=/Link,%
    PDFAFlags=4,%
    Page=/Next%
  }%
}
\def\PDFPreviousPage{%
  \@ifnextchar[{\PDFPreviousPage@}{\PDFPreviousPage@[]}%
}
\def\PDFPreviousPage@[#1]#2{%
  \pdfmark[{#2}]{%
    #1,%
    Border=\@pdfborder,%
    BorderStyle=\@pdfborderstyle,%
    Color=.4 .4 .1,%
    pdfmark=/ANN,%
    Subtype=/Link,%
    PDFAFlags=4,%
    Page=/Prev%
  }%
}
\def\PDFOpen#1{%
  \pdfmark{#1,pdfmark=/DOCVIEW}%
}
%    \end{macrocode}
% This will only work if you use Distiller 2.1 or higher.
%    \begin{macrocode}
\def\hyper@linkurl#1#2{%
  \begingroup
    \Hy@pstringdef\Hy@pstringURI{#2}%
    \hyper@chars
    \leavevmode
    \pdfmark[{#1}]{%
      pdfmark=/ANN,%
      linktype=url,%
      AcroHighlight=\@pdfhighlight,%
      Border=\@pdfborder,%
      BorderStyle=\@pdfborderstyle,%
      Color=\@urlbordercolor,%
      Action={<<%
        /Subtype/URI%
        /URI(\Hy@pstringURI)%
        \ifHy@href@ismap
          /IsMap true%
        \fi
      >>},%
      Subtype=/Link,%
      PDFAFlags=4%
    }%
  \endgroup
}
\def\hyper@linkfile#1#2#3{%
  \begingroup
    \def\Hy@pstringF{#2}%
    \Hy@CleanupFile\Hy@pstringF
    \Hy@pstringdef\Hy@pstringF\Hy@pstringF
    \Hy@pstringdef\Hy@pstringD{#3}%
    \Hy@MakeRemoteAction
    \leavevmode
    \pdfmark[{#1}]{%
      pdfmark=/ANN,%
      Subtype=/Link,%
      PDFAFlags=4,%
      AcroHighlight=\@pdfhighlight,%
      Border=\@pdfborder,%
      BorderStyle=\@pdfborderstyle,%
      linktype=file,%
      Color=\@filebordercolor,%
      Action={%
        <<%
          /S/GoToR%
          \Hy@SetNewWindow
          /F(\Hy@pstringF)%
          /D%
          \ifx\\#3\\%
            [\Hy@href@page\@pdfremotestartview]%
          \else
            (\Hy@pstringD)cvn%
          \fi
          \Hy@href@nextactionraw
        >>%
      }%
    }%
  \endgroup
}
\def\@hyper@launch run:#1\\#2#3{%
  \begingroup
    \Hy@pstringdef\Hy@pstringF{#1}%
    \Hy@pstringdef\Hy@pstringP{#3}%
    \leavevmode
    \pdfmark[{#2}]{%
      pdfmark=/ANN,%
      Subtype=/Link,%
      PDFAFlags=4,%
      AcroHighlight=\@pdfhighlight,%
      Border=\@pdfborder,%
      BorderStyle=\@pdfborderstyle,%
      linktype=run,%
      Color=\@runbordercolor,%
      Action={%
        <<%
          /S/Launch%
          \Hy@SetNewWindow
          /F(\Hy@pstringF)%
          \ifx\\#3\\%
          \else
            /Win<</P(\Hy@pstringP)/F(\Hy@pstringF)>>%
          \fi
          \Hy@href@nextactionraw
        >>%
      }%
    }%
  \endgroup
}
%</pdfmark>
%    \end{macrocode}
% Unfortunately, some parts of the |pdfmark|
% PostScript code depend on vagaries
% of the dvi driver. We isolate here all the problems.
%
% \subsection{Rokicki's dvips}
% dvips thinks in 10ths of a big point, its
% coordinate space is resolution dependent,
% and its $y$ axis starts at the top of the
% page. Other drivers can and will be different!
%
% The work is done in |SDict|, because we add in some header
% definitions in a moment.
%    \begin{macrocode}
%<*dvips>
\providecommand*{\XR@ext}{pdf}
\let\Hy@raisedlink\ltx@empty
\def\literalps@out#1{\special{ps:SDict begin #1 end}}%
\def\headerps@out#1{\special{! #1}}%
\input{pdfmark.def}%
\ifx\@pdfproducer\relax
  \def\@pdfproducer{dvips + Distiller}%
\fi
\providecommand*\@pdfborder{0 0 1}
\providecommand*\@pdfborderstyle{}
\providecommand*\@pdfview{XYZ}
\providecommand*\@pdfviewparams{ H.V}
\def\Hy@BorderArrayPatch{BorderArrayPatch}
%    \end{macrocode}
%
%    \begin{macrocode}
\g@addto@macro\Hy@FirstPageHook{%
  \headerps@out{%
%    \end{macrocode}
% Unless I am going mad, this \emph{appears} to be the relationship
% between the default coordinate system (PDF), and dvips;
% \begin{verbatim}
% /DvipsToPDF { .01383701 div Resolution div } def
% /PDFToDvips { .01383701 mul Resolution mul } def
% \end{verbatim}
% the latter's coordinates are resolution dependent, but what that
% .01383701 is, who knows? well, almost everyone except me, I expect\ldots
% And yes, Maarten Gelderman \texttt{<mgelderman@econ.vu.nl>}
% points out that its 1/72.27 (the number of points to an inch, big points
% to inch is 1/72). This also suggests that the code would be more
% understandable (and exact) if 0.013 div would be replaced by 72.27 mul,
% so here we go. If this isn't right, I'll revert it.
%    \begin{macrocode}
    /DvipsToPDF{72.27 mul Resolution div} def%
    /PDFToDvips{72.27 div Resolution mul} def%
    /BPToDvips{72 div Resolution mul}def%
%    \end{macrocode}
% The values inside the /Boder array are not taken literally, but
% interpreted by ghostscript using the resolution of the dvi driver.
% I don't know how other distiller programs behaves in this manner.
%    \begin{macrocode}
    /BorderArrayPatch{%
      [exch{%
        dup dup type/integertype eq exch type/realtype eq or%
        {BPToDvips}if%
      }forall]%
    }def%
%    \end{macrocode}
% The rectangle around the links starts off
% \emph{exactly} the size of the box;
% we will to make it slightly bigger, 1 point on all sides.
%    \begin{macrocode}
    /HyperBorder {1 PDFToDvips} def%
    /H.V {pdf@hoff pdf@voff null} def%
    /H.B {/Rect[pdf@llx pdf@lly pdf@urx pdf@ury]} def%
%    \end{macrocode}
% |H.S| (start of anchor, link, or rect) stores
% the $x$ and $y$ coordinates of the current point, in PDF coordinates
%    \begin{macrocode}
    /H.S {%
      currentpoint %
      HyperBorder add /pdf@lly exch def %
      dup DvipsToPDF 72 add /pdf@hoff exch def %
      HyperBorder sub /pdf@llx exch def%
    } def%
%    \end{macrocode}
%
% The calculation of upper left $y$ is done without
% raising the point in \TeX,
% by simply adding on the current |\baselineskip| to the current $y$.
% This is usually too much, so we remove a notional 2 points.
%
% We have to see what the current baselineskip is, and convert it
% to the dvips coordinate system.
%
% Argument: baselineskip in pt.
% The $x$ and $y$ coordinates of the current point, minus the baselineskip
%    \begin{macrocode}
    /H.L {%
      2 sub dup%
      /HyperBasePt exch def %
      PDFToDvips /HyperBaseDvips exch def %
      currentpoint %
      HyperBaseDvips sub /pdf@ury exch def%
      /pdf@urx exch def%
    } def%
    /H.A {%
      H.L %
% |/pdf@voff| = the distance from the top of the page to a point
% |\baselineskip| above the current point in PDF coordinates
      currentpoint exch pop %
      vsize 72 sub exch DvipsToPDF %
      HyperBasePt sub % baseline skip
      sub /pdf@voff exch def%
    } def%
    /H.R {%
      currentpoint %
      HyperBorder sub /pdf@ury exch def %
      HyperBorder add /pdf@urx exch def %
% |/pdf@voff| = the distance from the top of the page to the current point, in
% PDF coordinates
      currentpoint exch pop vsize 72 sub %
      exch DvipsToPDF sub /pdf@voff exch def%
    } def%
  }%
}
\AtBeginShipoutFirst{%
  \ifHy@setpagesize
    \begingroup
      \@ifundefined{stockwidth}{%
        \ifdim\paperwidth>\z@
          \ifdim\paperheight>\z@
            \special{papersize=\the\paperwidth,\the\paperheight}%
          \fi
        \fi
      }{%
        \ifdim\stockwidth>\z@
          \ifdim\stockheight>\z@
            \special{papersize=\the\stockwidth,\the\stockheight}%
          \fi
        \fi
      }%
    \endgroup
  \fi
  \Hy@DisableOption{setpagesize}%
}
%</dvips>
%    \end{macrocode}
%
% \subsection{VTeX's vtexpdfmark driver}
%
% This part is derived from the dvips
% (many names reflect this).
%
% The origin seems to be the same as TeX's origin,
% 1 in from the left and 1 in downwards from the top.
% The direction of the $y$ axis is downwards,
% the opposite of the dvips case. Units seems
% to be pt or bp.
%
%    \begin{macrocode}
%<*vtexpdfmark>
\providecommand*{\XR@ext}{pdf}
\let\Hy@raisedlink\ltx@empty
\def\literalps@out#1{\special{pS:#1}}%
\def\headerps@out#1{\immediate\special{pS:#1}}%
\input{pdfmark.def}%
\ifx\@pdfproducer\relax
  \ifnum\OpMode=\@ne
    \def\@pdfproducer{VTeX}%
  \else
    \def\@pdfproducer{VTeX + Distiller}%
  \fi
\fi
\providecommand*\@pdfborder{0 0 1}
\providecommand*\@pdfborderstyle{}
\providecommand*\@pdfview{XYZ}
\providecommand*\@pdfviewparams{ H.V}
%    \end{macrocode}
%
%    \begin{macrocode}
\g@addto@macro\Hy@FirstPageHook{%
  \headerps@out{%
    /vsize {\Hy@pageheight} def%
%    \end{macrocode}
% The rectangle around the links starts off
% \emph{exactly} the size of the box;
% we will to make it slightly bigger, 1 point on all sides.
%    \begin{macrocode}
    /HyperBorder {1} def%
    /H.V {pdf@hoff pdf@voff null} def%
    /H.B {/Rect[pdf@llx pdf@lly pdf@urx pdf@ury]} def%
%    \end{macrocode}
%
% |H.S| (start of anchor, link, or rect) stores
% the $x$ and $y$ coordinates of the current point, in PDF coordinates:
% $\mathtt{pdf@lly}  = Y_c - \mathtt{HyperBorder}$,
% $\mathtt{pdf@hoff} = X_c + 72$,
% $\mathtt{pdf@llx}  = X_c - \mathtt{HyperBorder}$
%    \begin{macrocode}
    /H.S {%
      currentpoint %
      HyperBorder sub%
      /pdf@lly exch def %
      dup 72 add /pdf@hoff exch def %
      HyperBorder sub%
      /pdf@llx exch def%
    } def%
%    \end{macrocode}
% The $x$ and $y$ coordinates of the current point, minus the
% |\baselineskip|:
% $\mathtt{pdf@ury} = Y_c + \mathtt{HyperBasePt} + \mathtt{HyperBorder}$,
% $\mathtt{pdf@urx} = X_c + \mathtt{HyperBorder}$
%    \begin{macrocode}
    /H.L {%
      2 sub%
      /HyperBasePt exch def %
      currentpoint %
      HyperBasePt add HyperBorder add%
      /pdf@ury exch def %
      HyperBorder add%
      /pdf@urx exch def%
    } def%
    /H.A {%
      H.L %
      currentpoint exch pop %
      vsize 72 sub exch %
      HyperBasePt add add%
      /pdf@voff exch def%
    } def%
%    \end{macrocode}
% $\mathtt{pdf@ury} = Y_c + \mathtt{HyperBorder}$,
% $\mathtt{pdf@urx} = X_c + \mathtt{HyperBorder}$
%    \begin{macrocode}
    /H.R {%
      currentpoint %
      HyperBorder add%
      /pdf@ury exch def %
      HyperBorder add%
      /pdf@urx exch def %
      currentpoint exch pop vsize 72 sub add%
      /pdf@voff exch def%
    } def%
  }%
}
%</vtexpdfmark>
%    \end{macrocode}
%
% \subsection{Textures}
%
%    \begin{macrocode}
%<*textures>
\providecommand*{\XR@ext}{pdf}
%    \end{macrocode}
%
% At the suggestion of Jacques Distler (distler@golem.ph.utexas.edu), try
% to derive a suitable driver for Textures. This was initially a copy of
% dvips, with some guesses about Textures behaviour.
% Ross Moore (\Email{ross@maths.mq.edu.au}) has added modifications
% for better compatibility, and to support use of pdfmark.
%
% Start by defining a macro that expands to the end-of-line character.
% This will be used to format the appearance of PostScript code,
% to enhance readability, and avoid excessively long lines which
% might otherwise become broken to bad places.
%
%    \begin{macro}{\Hy@ps@CR}
%    The macro \verb|\Hy@ps@CR| contains the end-of-line character.
%    \begin{macrocode}
\begingroup
  \obeylines %
  \gdef\Hy@ps@CR{\noexpand
  }%
\endgroup %
%    \end{macrocode}
%    \end{macro}
%
% Textures has two types of \verb|\special| command for inserting
% PostScript code directly into the dvi output. The `postscript'
% way preserves TeX's idea of where on the page the \verb|\special|
% occurred, but it wraps the contents with a \verb|save|--\verb|restore|
% pair, and adjusts the user-space coordinate system for local drawing
% commands. The `rawpostscript' way simply inserts code, without regard
% for the location on the page.
%
% Thus, to put arbitrary PostScript coding at a fixed location requires
% using \emph{both} \verb|\special| constructions.
% It works by pushing the device-space coordinates onto the operand stack,
% where they can be used to transform back to the correct user-space
% coordinates for the whole page, within a `rawpostscript' \verb|\special|.
%
%    \begin{macrocode}
\def\literalps@out#1{%
  \special{postscript 0 0 transform}%
  \special{rawpostscript itransform moveto\Hy@ps@CR #1}%
}%
%
%    \end{macrocode}
%
% The `prepostscript' is a 3rd kind of \verb|\special|, used for
% inserting definitions into the dictionaries, before page-building
% begins. These are to be available for use on all pages.
%
%    \begin{macrocode}
\def\headerps@out#1{%
  \special{%
    prepostscript TeXdict begin\Hy@ps@CR
      #1\Hy@ps@CR
    end%
  }%
}%
%
%    \end{macrocode}
%
% To correctly support the \verb|pdfmark| method, for embedding
% PDF definitions with \verb|.ps| files in a non-intrusive way,
% an appropriate definition needs to be made \emph{before}
% the file \verb|pdfmark.def| is read. Other parameters are best
% set afterwards.
%
%    \begin{macrocode}
\g@addto@macro\Hy@FirstPageHook{%
  \headerps@out{%
    /betterpdfmark {%
      systemdict begin %
        dup /BP eq%
        {cleartomark gsave nulldevice [}%
        {dup /EP eq%
          {cleartomark cleartomark grestore}%
          {cleartomark}%
          ifelse%
        }ifelse %
      end%
    }def\Hy@ps@CR
    __pdfmark__ not{/pdfmark /betterpdfmark load def}if%
  }% end of \headerps@out
}% end of \AtBeginShipoutFirst
%
\input{pdfmark.def}%
%
\ifx\@pdfproducer\relax
  \def\@pdfproducer{Textures + Distiller}%
\fi
\providecommand*\@pdfborder{0 0 1}
\providecommand*\@pdfborderstyle{}
\providecommand*\@pdfview{XYZ}
\providecommand*\@pdfviewparams{ H.V}
%
%    \end{macrocode}
% These are called at the start and end of unboxed links;
% their job is to leave available PS variables called
% |pdf@llx pdf@lly pdf@urx pdf@ury|, which are the coordinates
% of the bounding rectangle of the link, and |pdf@hoff pdf@voff|
% which are the PDF page offsets.
% The Rect pair are called at the LL and UR corners of a box
% known to \TeX.
%    \begin{macrocode}
\Hy@AtBeginDocument{%
  \headerps@out{%
%    \end{macrocode}
% Textures lives in normal points, I think. So conversion from one
% coordinate system to another involves doing nothing.
%
%    \begin{macrocode}
    /vsize {\Hy@pageheight} def%
    /DvipsToPDF {} def%
    /PDFToDvips {} def%
    /BPToDvips {} def%
    /HyperBorder  { 1 PDFToDvips } def\Hy@ps@CR
    /H.V {pdf@hoff pdf@voff null} def\Hy@ps@CR
    /H.B {/Rect[pdf@llx pdf@lly pdf@urx pdf@ury]} def\Hy@ps@CR
    /H.S {%
      currentpoint %
      HyperBorder add /pdf@lly exch def %
      dup DvipsToPDF 72 add /pdf@hoff exch def %
      HyperBorder sub /pdf@llx exch def%
    } def\Hy@ps@CR
    /H.L {%
      2 sub %
      PDFToDvips /HyperBase exch def %
      currentpoint %
      HyperBase sub /pdf@ury exch def%
      /pdf@urx exch def%
    } def\Hy@ps@CR
    /H.A {%
      H.L %
      currentpoint exch pop %
      vsize 72 sub exch DvipsToPDF %
      HyperBase sub % baseline skip
      sub /pdf@voff exch def%
    } def\Hy@ps@CR
    /H.R {%
      currentpoint %
      HyperBorder sub /pdf@ury exch def %
      HyperBorder add /pdf@urx exch def %
      currentpoint exch pop vsize 72 sub %
      exch DvipsToPDF sub /pdf@voff exch def%
    } def\Hy@ps@CR
  }%
}
%    \end{macrocode}
%    \begin{macrocode}
\Hy@AtBeginDocument{%
  \ifHy@colorlinks
    \headerps@out{/PDFBorder{/Border [0 0 0]}def}%
  \fi
}
%    \end{macrocode}
%    Textures provides built-in support for HyperTeX specials
%    so this part combines code from  \verb|hypertex.def| with what
%    is established by loading \verb|pdfmark.def|, or any other driver.
%    \begin{macrocode}
\expandafter\let\expandafter\keepPDF@SetupDoc
  \csname PDF@SetupDoc\endcsname
\def\PDF@SetupDoc{%
  \ifx\@baseurl\@empty
  \else
    \special{html:<base href="\@baseurl">}%
  \fi
  \keepPDF@SetupDoc
}
\Hy@WrapperDef\hyper@anchor#1{%
  \Hy@SaveLastskip
  \Hy@VerboseAnchor{#1}%
  \begingroup
    \let\protect=\string
    \special{html:<a name=%
        \hyper@quote\HyperDestNameFilter{#1}\hyper@quote>}%
  \endgroup
  \Hy@activeanchortrue
  \Hy@colorlink\@anchorcolor\anchor@spot\Hy@endcolorlink
  \special{html:</a>}%
  \Hy@activeanchorfalse
  \Hy@RestoreLastskip
}
\Hy@WrapperDef\hyper@anchorstart#1{%
  \Hy@SaveLastskip
  \Hy@VerboseAnchor{#1}%
  \begingroup
    \hyper@chars
    \special{html:<a name=%
        \hyper@quote\HyperDestNameFilter{#1}\hyper@quote>}%
  \endgroup
  \Hy@activeanchortrue
}
\def\hyper@anchorend{%
  \special{html:</a>}%
  \Hy@activeanchorfalse
  \Hy@RestoreLastskip
}
\def\@urltype{url}
\def\hyper@linkstart#1#2{%
  \Hy@VerboseLinkStart{#1}{#2}%
  \expandafter\Hy@colorlink\csname @#1color\endcsname
  \def\Hy@tempa{#1}%
  \ifx\Hy@tempa\@urltype
    \special{html:<a href=\hyper@quote#2\hyper@quote>}%
  \else
    \begingroup
      \hyper@chars
      \special{%
        html:<a href=%
        \hyper@quote\#\HyperDestNameFilter{#2}\hyper@quote>%
      }%
    \endgroup
  \fi
}
\def\hyper@linkend{%
  \special{html:</a>}%
  \Hy@endcolorlink
}
\def\hyper@linkfile#1#2#3{%
  \hyper@linkurl{#1}{%
    \Hy@linkfileprefix#2\ifx\\#3\\\else\##3\fi
  }%
}
\def\hyper@linkurl#1#2{%
  \leavevmode
  \ifHy@raiselinks
    \Hy@SaveSpaceFactor
    \Hy@SaveSavedSpaceFactor
    \sbox\@tempboxa{\Hy@RestoreSpaceFactor#1}%
    \Hy@RestoreSavedSpaceFactor
    \@linkdim\dp\@tempboxa
    \lower\@linkdim\hbox{%
      \hyper@chars
      \special{html:<a href=\hyper@quote#2\hyper@quote>}%
    }%
    \Hy@colorlink\@urlcolor
      \Hy@RestoreSpaceFactor
      #1\Hy@xspace@end
      \Hy@SaveSpaceFactor
      \@linkdim\ht\@tempboxa
      \advance\@linkdim by -6.5\p@
      \raise\@linkdim\hbox{\special{html:</a>}}%
    \Hy@endcolorlink
    \Hy@RestoreSpaceFactor
  \else
    \begingroup
      \hyper@chars
      \special{html:<a href=\hyper@quote#2\hyper@quote>}%
      \Hy@colorlink\@urlcolor#1\Hy@xspace@end
      \special{html:</a>}%
      \Hy@endcolorlink
    \endgroup
  \fi
}
%    \end{macrocode}
%    Very poor implementation of \cs{hyper@link} without considering |#1|.
%    \begin{macrocode}
\def\hyper@link#1#2#3{%
  \Hy@VerboseLinkStart{#1}{#2}%
  \hyper@linkurl{#3}{\#\HyperDestNameFilter{#2}}%
}
\def\hyper@image#1#2{%
  \begingroup
    \hyper@chars
    \special{html:<img src=\hyper@quote#1\hyper@quote>}%
  \endgroup
}
%</textures>
%    \end{macrocode}
% \subsection{dvipsone}
%    \begin{macrocode}
% \subsection{dvipsone driver}
% Over-ride the default setup macro in pdfmark driver to use Y\&Y
% |\special| commands.
%<*dvipsone>
\providecommand*{\XR@ext}{pdf}
\let\Hy@raisedlink\ltx@empty
\providecommand*\@pdfborder{0 0 1}
\providecommand*\@pdfborderstyle{}
\def\literalps@out#1{\special{ps:#1}}%
\def\headerps@out#1{\special{headertext=#1}}%
\input{pdfmark.def}%
\ifx\@pdfproducer\relax
  \def\@pdfproducer{dvipsone + Distiller}%
\fi
\HyInfo@AddonUnsupportedtrue
\def\PDF@FinishDoc{%
  \Hy@UseMaketitleInfos
  \HyInfo@TrappedUnsupported
  \special{PDF: Keywords \@pdfkeywords}%
  \special{PDF: Title \@pdftitle}%
  \special{PDF: Creator \@pdfcreator}%
  \ifx\@pdfcreationdate\@empty
  \else
    \special{PDF: CreationDate \@pdfcreationdate}%
  \fi
  \ifx\@pdfmoddate\@empty
  \else
    \special{PDF: ModDate \@pdfmoddate}%
  \fi
  \special{PDF: Author \@pdfauthor}%
  \ifx\@pdfproducer\relax
  \else
    \special{PDF: Producer \@pdfproducer}%
  \fi
  \special{PDF: Subject \@pdfsubject}%
  \Hy@DisableOption{pdfauthor}%
  \Hy@DisableOption{pdftitle}%
  \Hy@DisableOption{pdfsubject}%
  \Hy@DisableOption{pdfcreator}%
  \Hy@DisableOption{pdfcreationdate}%
  \Hy@DisableOption{pdfmoddate}%
  \Hy@DisableOption{pdfproducer}%
  \Hy@DisableOption{pdfkeywords}%
  \Hy@DisableOption{pdftrapped}%
  \Hy@DisableOption{pdfinfo}%
}
\def\PDF@SetupDoc{%
  \def\Hy@temp{}%
  \ifx\@pdfstartpage\@empty
  \else
    \ifx\@pdfstartview\@empty
    \else
      \edef\Hy@temp{%
        ,Page=\@pdfstartpage
        ,View=\@pdfstartview
      }%
    \fi
  \fi
  \edef\Hy@temp{%
    \noexpand\pdfmark{%
      pdfmark=/DOCVIEW,%
      PageMode=/\@pdfpagemode
      \Hy@temp
    }%
  }%
  \Hy@temp
  \ifx\@pdfpagescrop\@empty
  \else
    \pdfmark{pdfmark=/PAGES,CropBox=\@pdfpagescrop}%
  \fi
  \edef\Hy@temp{%
    \ifHy@pdftoolbar\else /HideToolbar true\fi
    \ifHy@pdfmenubar\else /HideMenubar true\fi
    \ifHy@pdfwindowui\else /HideWindowUI true\fi
    \ifHy@pdffitwindow /FitWindow true\fi
    \ifHy@pdfcenterwindow /CenterWindow true\fi
    \ifHy@pdfdisplaydoctitle /DisplayDocTitle true\fi
    \Hy@UseNameKey{NonFullScreenPageMode}\@pdfnonfullscreenpagemode
    \Hy@UseNameKey{Direction}\@pdfdirection
    \Hy@UseNameKey{ViewArea}\@pdfviewarea
    \Hy@UseNameKey{ViewClip}\@pdfviewclip
    \Hy@UseNameKey{PrintArea}\@pdfprintarea
    \Hy@UseNameKey{PrintClip}\@pdfprintclip
    \Hy@UseNameKey{PrintScaling}\@pdfprintscaling
    \Hy@UseNameKey{Duplex}\@pdfduplex
    \ifx\@pdfpicktraybypdfsize\@empty
    \else
      /PickTrayByPDFSize \@pdfpicktraybypdfsize
    \fi
    \ifx\@pdfprintpagerange\@empty
    \else
      /PrintPageRange[\@pdfprintpagerange]%
    \fi
    \ifx\@pdfnumcopies\@empty
    \else
      /NumCopies \@pdfnumcopies
    \fi
  }%
  \Hy@pstringdef\Hy@pstringB{\@baseurl}%
  \pdfmark{%
    pdfmark=/PUT,%
    Raw={%
      \string{Catalog\string}<<%
        \ifx\Hy@temp\@empty
        \else
          /ViewerPreferences<<\Hy@temp>>%
        \fi
        \Hy@UseNameKey{PageLayout}\@pdfpagelayout
        \ifx\@pdflang\@empty
        \else
          /Lang(\@pdflang)%
        \fi
        \ifx\@baseurl\@empty
        \else
          /URI<</Base(\Hy@pstringB)>>%
        \fi
      >>%
    }%
  }%
}
\providecommand*\@pdfview{XYZ}
\providecommand*\@pdfviewparams{ %
  gsave revscl currentpoint grestore %
  72 add exch pop null exch null%
}
\def\Hy@BorderArrayPatch{BorderArrayPatch}
%    \end{macrocode}
% These are called at the start and end of unboxed links;
% their job is to leave available PS variables called
% |pdf@llx pdf@lly pdf@urx pdf@ury|, which are the coordinates
% of the bounding rectangle of the link, and |pdf@hoff pdf@voff|
% which are the PDF page offsets. These latter are currently not
% used in the dvipsone setup.
% The Rect pair are called at the LL and UR corners of a box
% known to \TeX.
%    \begin{macrocode}
\g@addto@macro\Hy@FirstPageHook{%
  \headerps@out{%
%    \end{macrocode}
% dvipsone lives in scaled points; does this mean 65536 or 65781?
%    \begin{macrocode}
    /DvipsToPDF { 65781 div  } def%
    /PDFToDvips { 65781 mul } def%
    /BPToDvips{65781 mul}def%
    /HyperBorder  { 1 PDFToDvips } def%
    /H.B {/Rect[pdf@llx pdf@lly pdf@urx pdf@ury]} def%
%    \end{macrocode}
% The values inside the /Boder array are not taken literally, but
% interpreted by ghostscript using the resolution of the dvi driver.
% I don't know how other distiller programs behaves in this manner.
%    \begin{macrocode}
    /BorderArrayPatch{%
      [exch{%
        dup dup type/integertype eq exch type/realtype eq or%
        {BPToDvips}if%
      }forall]%
    }def%
%    \end{macrocode}
%
%    \begin{macrocode}
    /H.S {%
      currentpoint %
      HyperBorder add /pdf@lly exch def %
      dup DvipsToPDF 72 add /pdf@hoff exch def %
      HyperBorder sub /pdf@llx exch def%
    } def%
    /H.L {%
      2 sub %
      PDFToDvips /HyperBase exch def %
      currentpoint %
      HyperBase sub /pdf@ury exch def%
      /pdf@urx exch def%
    } def%
    /H.A {%
      H.L %
      currentpoint exch pop %
      HyperBase sub % baseline skip
      DvipsToPDF /pdf@voff exch def%
    } def%
    /H.R {%
      currentpoint %
      HyperBorder sub /pdf@ury exch def %
      HyperBorder add /pdf@urx exch def %
      currentpoint exch pop DvipsToPDF /pdf@voff exch def%
    } def%
  }%
}
%</dvipsone>
%    \end{macrocode}
%
% \subsection{TeX4ht}
%    \begin{macrocode}
%<*tex4ht>
\providecommand*{\XR@ext}{html}
\let\Hy@raisedlink\ltx@empty
\@ifpackageloaded{tex4ht}{%
  \Hy@InfoNoLine{tex4ht is already loaded}%
}{%
  \RequirePackage[htex4ht]{tex4ht}%
}
\hyperlinkfileprefix{}
\let\PDF@FinishDoc\ltx@empty
\def\PDF@SetupDoc{%
  \ifx\@baseurl\@empty
  \else
    \special{t4ht=<base href="\@baseurl">}%
  \fi
}
\Hy@WrapperDef\hyper@anchor#1{%
  \Hy@SaveLastskip
  \Hy@VerboseAnchor{#1}%
  \begingroup
    \let\protect=\string
    \special{t4ht=<a name=%
        \hyper@quote\HyperDestNameFilter{#1}\hyper@quote>}%
  \endgroup
  \Hy@activeanchortrue
  \Hy@colorlink\@anchorcolor\anchor@spot\Hy@endcolorlink
  \special{t4ht=</a>}%
  \Hy@activeanchorfalse
  \Hy@RestoreLastskip
}
\Hy@WrapperDef\hyper@anchorstart#1{%
  \Hy@SaveLastskip
  \Hy@VerboseAnchor{#1}%
  \begingroup
    \hyper@chars\special{t4ht=<a name=%
        \hyper@quote\HyperDestNameFilter{#1}\hyper@quote>}%
  \endgroup
  \Hy@activeanchortrue
}
\def\hyper@anchorend{%
  \special{t4ht=</a>}%
  \Hy@activeanchorfalse
  \Hy@RestoreLastskip
}
\def\@urltype{url}
\def\hyper@linkstart#1#2{%
  \Hy@VerboseLinkStart{#1}{#2}%
  \expandafter\Hy@colorlink\csname @#1color\endcsname
  \def\Hy@tempa{#1}%
  \ifx\Hy@tempa\@urltype
    \special{t4ht=<a href=\hyper@quote#2\hyper@quote>}%
  \else
    \begingroup
      \hyper@chars
      \special{t4ht=<a href=%
          \hyper@quote\#\HyperDestNameFilter{#2}\hyper@quote>}%
    \endgroup
  \fi
}
\def\hyper@linkend{%
  \special{t4ht=</a>}%
  \Hy@endcolorlink
}
\def\hyper@linkfile#1#2#3{%
  \hyper@linkurl{#1}{\Hy@linkfileprefix#2\ifx\\#3\\\else\##3\fi}%
}
\def\hyper@linkurl#1#2{%
  \leavevmode
  \ifHy@raiselinks
    \Hy@SaveSpaceFactor
    \Hy@SaveSavedSpaceFactor
    \sbox\@tempboxa{\Hy@RestoreSpaceFactor#1}%
    \Hy@RestoreSavedSpaceFactor
    \@linkdim\dp\@tempboxa
    \lower\@linkdim\hbox{%
      \begingroup
        \hyper@chars
        \special{%
          t4ht=<a href=\hyper@quote#2\hyper@quote>%
        }%
      \endgroup
    }%
    \Hy@colorlink\@urlcolor
      \Hy@RestoreSpaceFactor
      #1\Hy@xspace@end
      \Hy@SaveSpaceFactor
    \Hy@endcolorlink
    \@linkdim\ht\@tempboxa
    \advance\@linkdim by -6.5\p@
    \raise\@linkdim\hbox{\special{t4ht=</a>}}%
    \Hy@RestoreSpaceFactor
 \else
   \begingroup
     \hyper@chars
     \special{t4ht=<a href=\hyper@quote#2\hyper@quote>}%
     \Hy@colorlink\@urlcolor
       #1\Hy@xspace@end
     \Hy@endcolorlink
     \special{t4ht=</a>}%
   \endgroup
 \fi
}
%    \end{macrocode}
%    Poor implementation of \cs{hyper@link} without considering |#1|.
%    \begin{macrocode}
\def\hyper@link#1#2#3{%
  \Hy@VerboseLinkStart{#1}{#2}%
  \hyper@linkurl{#3}{\#\HyperDestNameFilter{#2}}%
}
\def\hyper@image#1#2{%
  \begingroup
    \hyper@chars
    \special{t4ht=<img src=\hyper@quote#1\hyper@quote>}%
  \endgroup
}
\let\autoref\ref
\ifx \rEfLiNK \UnDef
  \def\rEfLiNK #1#2{#2}%
\fi
\let\backref\ltx@gobble
%    \end{macrocode}
%    Fix for tex4ht.
%    \begin{macrocode}
\AtBeginDocument{%
  \expandafter\let\expandafter\Hy@OrgMakeLabel\csname Make:Label\endcsname
  \expandafter\def\csname Make:Label\endcsname#1#2{%
    \ifhmode
      \Hy@SaveSpaceFactor
    \else
      \global\Hy@SavedSpaceFactor=1000 %
    \fi
    \Hy@OrgMakeLabel{#1}{%
      \Hy@RestoreSpaceFactor
      #2\Hy@xspace@end%
      \Hy@SaveSpaceFactor
    }%
    \Hy@RestoreSpaceFactor
  }%
}
%</tex4ht>
%<*tex4htcfg>
\IfFileExists{\jobname.cfg}{\endinput}{}
\Preamble{html}
   \begin{document}%
\EndPreamble
\def\TeX{TeX}
\def\OMEGA{Omega}
\def\LaTeX{La\TeX}
\def\LaTeXe{\LaTeX2e}
\def\eTeX{e-\TeX}
\def\MF{Metafont}
\def\MP{MetaPost}
%</tex4htcfg>
%    \end{macrocode}
%
% \section{Driver-specific form support}
% \subsection{pdfmarks}
%    \begin{macrocode}
%<*pdfmark>
\long\def\@Form[#1]{%
\g@addto@macro\Hy@FirstPageHook{%
  \headerps@out{%
[%
  /_objdef{pdfDocEncoding}%
  /type/dict%
/OBJ pdfmark%
[%
  {pdfDocEncoding}%
  <<%
    /Type/Encoding%
    /Differences[%
      24/breve/caron/circumflex/dotaccent/hungarumlaut/ogonek/ring%
        /tilde %
      39/quotesingle %
      96/grave %
      128/bullet/dagger/daggerdbl/ellipsis/emdash/endash/florin%
         /fraction/guilsinglleft/guilsinglright/minus/perthousand%
         /quotedblbase/quotedblleft/quotedblright/quoteleft%
         /quoteright/quotesinglbase/trademark/fi/fl/Lslash/OE/Scaron%
         /Ydieresis/Zcaron/dotlessi/lslash/oe/scaron/zcaron %
      164/currency %
      166/brokenbar %
      168/dieresis/copyright/ordfeminine %
      172/logicalnot/.notdef/registered/macron/degree/plusminus%
         /twosuperior/threesuperior/acute/mu %
      183/periodcentered/cedilla/onesuperior/ordmasculine %
      188/onequarter/onehalf/threequarters %
      192/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE%
         /Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave%
         /Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute%
         /Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave%
         /Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls%
         /agrave/aacute/acircumflex/atilde/adieresis/aring/ae%
         /ccedilla/egrave/eacute/ecircumflex/edieresis/igrave%
         /iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute%
         /ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute%
         /ucircumflex/udieresis/yacute/thorn/ydieresis%
    ]%
  >>%
/PUT pdfmark%
[%
   /_objdef{ZaDb}%
   /type/dict%
/OBJ pdfmark%
[%
  {ZaDb}%
  <<%
    /Type/Font%
    /Subtype/Type1%
    /Name/ZaDb%
    /BaseFont/ZapfDingbats%
  >>%
/PUT pdfmark%
[%
  /_objdef{Helv}%
  /type/dict%
/OBJ pdfmark%
[%
  {Helv}%
  <<%
    /Type/Font%
    /Subtype/Type1%
    /Name/Helv%
    /BaseFont/Helvetica%
    /Encoding{pdfDocEncoding}%
  >>%
/PUT pdfmark%
[%
  /_objdef{aform}%
  /type/dict%
/OBJ pdfmark%
[%
  /_objdef{afields}%
  /type/array%
/OBJ pdfmark%
{%
  [%
    /BBox[0 0 100 100]%
    /_objdef{Check}%
  /BP pdfmark %
  1 0 0 setrgbcolor%
  /ZapfDingbats 80 selectfont %
  20 20 moveto%
  (4)show%
  [/EP pdfmark%
  [%
    /BBox[0 0 100 100]%
    /_objdef{Cross}%
  /BP pdfmark %
  1 0 0 setrgbcolor%
  /ZapfDingbats 80 selectfont %
  20 20 moveto%
  (8)show%
  [/EP pdfmark%
  [%
    /BBox[0 0 250 100]%
    /_objdef{Submit}%
  /BP pdfmark %
  0.6 setgray %
  0 0 250 100 rectfill %
  1 setgray %
  2 2 moveto %
  2 98 lineto %
  248 98 lineto %
  246 96 lineto %
  4 96 lineto %
  4 4 lineto %
  fill %
  0.34 setgray %
  248 98 moveto %
  248 2 lineto %
  2 2 lineto %
  4 4 lineto %
  246 4 lineto %
  246 96 lineto %
  fill%
  /Helvetica 76 selectfont %
  0 setgray %
  8 22.5 moveto%
  (Submit)show%
  [/EP pdfmark%
  [%
    /BBox[0 0 250 100]%
    /_objdef{SubmitP}%
  /BP pdfmark %
  0.6 setgray %
  0 0 250 100 rectfill %
  0.34 setgray %
  2 2 moveto %
  2 98 lineto %
  248 98 lineto %
  246 96 lineto %
  4 96 lineto %
  4 4 lineto %
  fill %
  1 setgray %
  248 98 moveto %
  248 2 lineto %
  2 2 lineto %
  4 4 lineto %
  246 4 lineto %
  246 96 lineto %
  fill%
  /Helvetica 76 selectfont %
  0 setgray %
   10 20.5 moveto%
  (Submit)show%
  [/EP pdfmark%
} ?pdfmark%
[%
  {aform}%
  <<%
    /Fields{afields}%
    /DR<<%
      /Font<<%
        /ZaDb{ZaDb}%
        /Helv{Helv}%
      >>%
    >>%
    /DA(/Helv 10 Tf 0 g)%
    /CO{corder}%
    \ifHy@pdfa
    \else
      \ifHyField@NeedAppearances
        /NeedAppearances true%
      \fi
    \fi
  >>%
/PUT pdfmark%
[%
  {Catalog}%
  <<%
    /AcroForm{aform}%
  >>%
/PUT pdfmark%
[%
  /_objdef{corder}%
  /type/array%
/OBJ pdfmark% dps
}}%
  \kvsetkeys{Form}{#1}%
}
\let\@endForm\ltx@empty
\def\@Gauge[#1]#2#3#4{% parameters, label, minimum, maximum
  \Hy@Message{Sorry, pdfmark drivers do not support FORM gauges}%
}
\def\@TextField[#1]#2{% parameters, label
  \def\Fld@name{#2}%
  \let\Fld@default\ltx@empty
  \let\Fld@value\@empty
  \def\Fld@width{\DefaultWidthofText}%
  \def\Fld@height{%
    \ifFld@multiline
      \DefaultHeightofTextMultiline
    \else
      \DefaultHeightofText
    \fi
  }%
  \begingroup
    \expandafter\HyField@SetKeys\expandafter{%
      \DefaultOptionsofText,#1%
    }%
    \HyField@FlagsText
    \ifFld@hidden\def\Fld@width{1sp}\fi
    \ifx\Fld@value\@empty\def\Fld@value{\Fld@default}\fi
    \LayoutTextField{#2}{%
      \leavevmode
      \Hy@escapeform\PDFForm@Text
      \pdfmark[\MakeTextField{\Fld@width}{\Fld@height}]{%
        pdfmark=/ANN,Raw={\PDFForm@Text}%
      }%
    }%
  \endgroup
}
\def\@ChoiceMenu[#1]#2#3{% parameters, label, choices
  \def\Fld@name{#2}%
  \let\Fld@default\relax
  \let\Fld@value\relax
  \def\Fld@width{\DefaultWidthofChoiceMenu}%
  \def\Fld@height{\DefaultHeightofChoiceMenu}%
  \begingroup
    \Fld@menulength=0 %
    \@tempdima\z@
    \@for\@curropt:=#3\do{%
      \expandafter\Fld@checkequals\@curropt==\\%
      \Hy@StepCount\Fld@menulength
      \settowidth{\@tempdimb}{\@currDisplay}%
      \ifdim\@tempdimb>\@tempdima\@tempdima\@tempdimb\fi
    }%
    \advance\@tempdima by 15\p@
    \begingroup
      \HyField@SetKeys{#1}%
    \edef\x{\endgroup
      \noexpand\expandafter
      \noexpand\HyField@SetKeys
      \noexpand\expandafter{%
        \expandafter\noexpand\csname DefaultOptionsof%
          \ifFld@radio
            Radio%
          \else
            \ifFld@combo
              \ifFld@popdown
                PopdownBox%
              \else
                ComboBox%
              \fi
            \else
              ListBox%
            \fi
          \fi
        \endcsname
      }%
    }\x
    \HyField@SetKeys{#1}%
    \ifFld@hidden\def\Fld@width{1sp}\fi
    \ifx\Fld@value\relax
      \let\Fld@value\Fld@default
    \fi
    \LayoutChoiceField{#2}{%
      \ifFld@radio
        \HyField@FlagsRadioButton
        \@@Radio{#3}%
      \else
        \begingroup
          \HyField@FlagsChoice
          \ifdim\Fld@width<\@tempdima
            \ifdim\@tempdima<1cm\@tempdima1cm\fi
            \edef\Fld@width{\the\@tempdima}%
          \fi
          \ifFld@combo
          \else
            \@tempdima=\the\Fld@menulength\Fld@charsize
            \advance\@tempdima by \Fld@borderwidth bp %
            \advance\@tempdima by \Fld@borderwidth bp %
            \edef\Fld@height{\the\@tempdima}%
          \fi
          \@@Listbox{#3}%
        \endgroup
      \fi
    }%
  \endgroup
}
\def\@@Radio#1{%
  \Fld@listcount=0 %
  \EdefEscapeName\Fld@default{\Fld@default}%
  \@for\@curropt:=#1\do{%
    \expandafter\Fld@checkequals\@curropt==\\%
    \EdefEscapeName\@currValue{\@currValue}%
    \Hy@StepCount\Fld@listcount
    \@currDisplay\space
    \Hy@escapeform\PDFForm@Radio
    \pdfmark[\MakeRadioField{\Fld@width}{\Fld@height}]{%
      pdfmark=/ANN,%
      Raw={%
        \PDFForm@Radio /AP <</N <</\@currValue\space {Check}>> >>%
      }%
    } % deliberate space between radio buttons
  }%
}
\newcount\Fld@listcount
\def\@@Listbox#1{%
  \HyField@PDFChoices{#1}%
  \Hy@escapeform\PDFForm@List
  \pdfmark[\MakeChoiceField{\Fld@width}{\Fld@height}]{%
    pdfmark=/ANN,Raw={\PDFForm@List}%
  }%
}
\def\@PushButton[#1]#2{% parameters, label
  \def\Fld@name{#2}%
  \begingroup
    \expandafter\HyField@SetKeys\expandafter{%
      \DefaultOptionsofPushButton,#1%
    }%
    \ifHy@pdfa
      \Hy@Error{%
        PDF/A: Push button with JavaScript is prohibited%
      }\@ehc
      \LayoutPushButtonField{%
        \leavevmode
        \MakeButtonField{#2}%
      }%
    \else
      \HyField@FlagsPushButton
      \ifFld@hidden\def\Fld@width{1sp}\fi
      \LayoutPushButtonField{%
        \leavevmode
        \Hy@escapeform\PDFForm@Push
        \pdfmark[\MakeButtonField{#2}]{%
          pdfmark=/ANN,Raw={\PDFForm@Push}%
        }%
      }%
    \fi
  \endgroup
}
\def\@Submit[#1]#2{%
  \def\Fld@width{\DefaultWidthofSubmit}%
  \def\Fld@height{\DefaultHeightofSubmit}%
  \begingroup
    \expandafter\HyField@SetKeys\expandafter{%
      \DefaultOptionsofSubmit,#1%
    }%
    \HyField@FlagsPushButton
    \HyField@FlagsSubmit
    \ifFld@hidden\def\Fld@width{1sp}\fi
    \Hy@escapeform\PDFForm@Submit
    \pdfmark[\MakeButtonField{#2}]{%
      pdfmark=/ANN,%
      Raw={\PDFForm@Submit /AP << /N {Submit} /D {SubmitP} >>}%
    }%
  \endgroup
}
\def\@Reset[#1]#2{%
  \def\Fld@width{\DefaultWidthofReset}%
  \def\Fld@height{\DefaultHeightofReset}%
  \begingroup
    \expandafter\HyField@SetKeys\expandafter{%
      \DefaultOptionsofReset,#1%
    }%
    \leavevmode
    \ifHy@pdfa
      \Hy@Error{%
        PDF/A: Reset action is prohibited%
      }\@ehc
      \MakeButtonField{#2}%
    \else
      \HyField@FlagsPushButton
      \ifFld@hidden\def\Fld@width{1sp}\fi
      \Hy@escapeform\PDFForm@Reset
      \pdfmark[\MakeButtonField{#2}]{%
        pdfmark=/ANN,Raw={\PDFForm@Reset}%
      }%
    \fi
  \endgroup
}%
\def\@CheckBox[#1]#2{% parameters, label
  \def\Fld@name{#2}%
  \def\Fld@default{0}%
  \begingroup
    \def\Fld@width{\DefaultWidthofCheckBox}%
    \def\Fld@height{\DefaultHeightofCheckBox}%
    \expandafter\HyField@SetKeys\expandafter{%
      \DefaultOptionsofCheckBox,#1%
    }%
    \HyField@FlagsCheckBox
    \ifFld@hidden\def\Fld@width{1sp}\fi
    \LayoutCheckField{#2}{%
      \leavevmode
      \Hy@escapeform\PDFForm@Check
      \pdfmark[\MakeCheckField{\Fld@width}{\Fld@height}]{%
        pdfmark=/ANN,Raw={\PDFForm@Check}%
      }%
    }%
  \endgroup
}
%</pdfmark>
%    \end{macrocode}
%
% \subsection{HyperTeX}
%    \begin{macrocode}
%<*hypertex>
\def\@Form[#1]{\Hy@Message{Sorry, HyperTeX does not support FORMs}}
\let\@endForm\ltx@empty
\def\@Gauge[#1]#2#3#4{% parameters, label, minimum, maximum
  \Hy@Message{Sorry, HyperTeX does not support FORM gauges}%
}
\def\@TextField[#1]#2{% parameters, label
  \Hy@Message{Sorry, HyperTeX does not support FORM text fields}%
}
\def\@CheckBox[#1]#2{% parameters, label
  \Hy@Message{Sorry, HyperTeX does not support FORM checkboxes}%
}
\def\@ChoiceMenu[#1]#2#3{% parameters, label, choices
  \Hy@Message{Sorry, HyperTeX does not support FORM choice menus}%
}
\def\@PushButton[#1]#2{% parameters, label
  \Hy@Message{Sorry, HyperTeX does not support FORM pushbuttons}%
}
\def\@Reset[#1]#2{\Hy@Message{Sorry, HyperTeX does not support FORMs}}
\def\@Submit[#1]#2{\Hy@Message{Sorry, HyperTeX does not support FORMs}}
%</hypertex>
%    \end{macrocode}
% \subsection{TeX4ht}
%    \begin{macrocode}
%<*tex4ht>
\def\@Form[#1]{%
  \kvsetkeys{Form}{#1}%
  \HCode{<form action="\Form@action" method="\Form@method">}%
}
\def\@endForm{\HCode{</form>}}
\def\@Gauge[#1]#2#3#4{% parameters, label, minimum, maximum
  \Hy@Message{Sorry, TeX4ht does not support gauges}%
}
\def\@TextField[#1]#2{% parameters, label
  \let\Hy@reserved@a\@empty
  \def\Fld@name{#2}%
  \let\Fld@default\ltx@empty
  \bgroup
    \Field@toks={ }%
    \kvsetkeys{Field}{#1}%
    \HCode{<label for="\Fld@name">#2</label>}%
    \ifFld@password
      \@@PasswordField
    \else
      \@@TextField
    \fi
  \egroup
}
\def\@@PasswordField{%
  \HCode{%
    <input type="password" %
     id="\Fld@name" %
     name="\Fld@name" %
     \ifFld@hidden type="hidden" \fi
     value="\Fld@default" %
     \the\Field@toks
    >%
  }%
}
\def\@@TextField{%
  \ifFld@multiline
    \HCode{<textarea %
      \ifFld@readonly readonly \fi
      id="\Fld@name" %
      name="\Fld@name" %
      \ifFld@hidden type="hidden" \fi
      \the\Field@toks>%
    }%
    \Fld@default
    \HCode{</textarea>}%
  \else
    \HCode{<input type="textbox" %
      \ifFld@readonly readonly \fi
      id="\Fld@name" %
      name="\Fld@name" %
      \ifFld@hidden type="hidden" \fi
      value="\Fld@default" %
      \the\Field@toks>%
    }%
  \fi
}
\def\@ChoiceMenu[#1]#2#3{% parameters, label, choices
  \def\Fld@name{#2}%
  \let\Fld@default\ltx@empty
  \let\Hy@reserved@a\relax
  \begingroup
    \expandafter\Fld@findlength#3\\%
    \Field@toks={ }%
    \kvsetkeys{Field}{#1}%
    #2%
    \ifFld@radio
      \expandafter\@@Radio#3\\%
    \else
      \expandafter\@@Menu#3\\%
    \fi
  \endgroup
}
\def\Fld@findlength#1\\{%
  \Fld@menulength=0 %
  \@for\@curropt:=#1\do{\Hy@StepCount\Fld@menulength}%
}
\def\@@Menu#1\\{%
  \HCode{<select size="\the\Fld@menulength" %
    name="\Fld@name" %
    \the\Field@toks>%
  }%
  \@for\@curropt:=#1\do{%
    \expandafter\Fld@checkequals\@curropt==\\%
    \HCode{<option %
      \ifx\@curropt\Fld@default selected \fi
      value="\@currValue">\@currDisplay</option>%
    }%
  }%
  \HCode{</select>}%
}
\def\@@Radio#1\\{%
  \@for\@curropt:=#1\do{%
    \expandafter\Fld@checkequals\@curropt==\\%
    \HCode{<input type="radio" %
      \ifx\@curropt\Fld@default checked \fi
      name="\Fld@name" %
      value="\@currValue" %
      \the\Field@toks>%
    }%
    \@currDisplay
  }%
}
\def\@PushButton[#1]#2{% parameters, label
  \def\Fld@name{#2}%
  \bgroup
    \Field@toks={ }%
    \kvsetkeys{Field}{#1}%
    \HCode{<input type="button" %
      name="\Fld@name" %
      value="#2" %
      \the\Field@toks>%
    }%
    \HCode{</button>}%
  \egroup
}
\def\@Submit[#1]#2{%
  \HCode{<button type="submit">#2</button>}%
}
\def\@Reset[#1]#2{%
  \HCode{<button type="reset">#2</button>}%
}
\def\@CheckBox[#1]#2{% parameters, label
  \let\Hy@reserved@a\@empty
  \def\Fld@name{#2}%
  \def\Fld@default{0}%
  \bgroup
    \Field@toks={ }%
    \kvsetkeys{Field}{#1}%
    \HCode{<input type="checkbox" %
      \ifFld@checked checked \fi
      \ifFld@disabled disabled \fi
      \ifFld@readonly readonly \fi
      name="\Fld@name" %
      \ifFld@hidden type="hidden" \fi
      value="\Fld@default" %
      \the\Field@toks>%
      #2%
    }%
  \egroup
}
%</tex4ht>
%    \end{macrocode}
%
% \subsection{pdfTeX}
%    \begin{macrocode}
%<*pdftex>
\def\@Gauge[#1]#2#3#4{% parameters, label, minimum, maximum
  \Hy@Message{Sorry, pdftex does not support FORM gauges}%
}
\def\MakeFieldObject#1#2{\sbox0{#1}%
  \immediate\pdfxform0 %
  \expandafter\edef\csname #2Object\endcsname{%
    \the\pdflastxform\space 0 R%
  }%
% \hbox to 0pt{\hskip-\maxdimen{\pdfrefxform \the\pdflastxform}}%
}%
\let\HyField@afields\ltx@empty
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname pdflastlink\endcsname\relax
  \let\HyField@AddToFields\relax
  \PackageInfo{hyperref}{%
    You need pdfTeX 1.40.0 for setting the /Fields entry.%
    \MessageBreak
    Adobe Reader/Acrobat accepts an empty /Field array,%
    \MessageBreak
    but other PDF viewers might complain%
  }%
\else
  \let\HyField@AuxAddToFields\ltx@gobble
  \def\HyField@AfterAuxOpen{\Hy@AtBeginDocument}%
  \Hy@AtBeginDocument{%
    \if@filesw
      \immediate\write\@mainaux{%
        \string\providecommand\string\HyField@AuxAddToFields[1]{}%
      }%
    \fi
    \let\HyField@AfterAuxOpen\@firstofone
    \def\HyField@AuxAddToFields#1{%
      \xdef\HyField@afields{%
        \ifx\HyField@afields\@empty
        \else
          \HyField@afields
          \space
        \fi
        #1 0 R%
      }%
    }%
  }%
  \def\HyField@AddToFields{%
    \expandafter\HyField@@AddToFields\expandafter{%
      \the\pdflastlink
    }%
  }%
  \def\HyField@@AddToFields#1{%
    \HyField@AfterAuxOpen{%
      \if@filesw
        \write\@mainaux{%
          \string\HyField@AuxAddToFields{#1}%
        }%
      \fi
    }%
  }%
\fi
\def\@Form[#1]{%
  \@ifundefined{textcolor}{\let\textcolor\@gobble}{}%
  \kvsetkeys{Form}{#1}%
  \pdf@ifdraftmode{}{%
    \Hy@FormObjects
    \ifnum\pdftexversion>13 %
      \pdfrefobj\OBJ@pdfdocencoding
      \pdfrefobj\OBJ@ZaDb
      \pdfrefobj\OBJ@Helv
    \fi
    \AtVeryEndDocument{%
      \immediate\pdfobj{%
        <<%
          /Fields[\HyField@afields]%
          /DR<<%
            /Font<<%
              /ZaDb \OBJ@ZaDb\space 0 R%
              /Helv \OBJ@Helv\space 0 R%
            >>%
          >>%
          /DA(/Helv 10 Tf 0 g)%
          \ifHy@pdfa
          \else
            \ifHyField@NeedAppearances
              /NeedAppearances true%
            \fi
          \fi
        >>%
      }%
      \edef\OBJ@acroform{\the\pdflastobj}%
      \pdfcatalog{/AcroForm \OBJ@acroform\space 0 R}%
    }%
  }%
  \MakeFieldObject{%
%    \end{macrocode}
%    Same as \verb|\ding{123}| of package pifont.
%    \begin{macrocode}
    \begingroup
      \fontfamily{pzd}%
      \fontencoding{U}%
      \fontseries{m}%
      \fontshape{n}%
      \selectfont
      \char123 %
    \endgroup
  }{Ding}%
  \MakeFieldObject{%
    \fbox{\textcolor{yellow}{\textsf{Submit}}}%
  }{Submit}%
  \MakeFieldObject{%
    \fbox{\textcolor{yellow}{\textsf{SubmitP}}}%
  }{SubmitP}%
}
\let\@endForm\ltx@empty
\def\@TextField[#1]#2{% parameters, label
  \def\Fld@name{#2}%
  \let\Fld@default\ltx@empty
  \let\Fld@value\@empty
  \def\Fld@width{\DefaultWidthofText}%
  \def\Fld@height{%
    \ifFld@multiline
      \DefaultHeightofTextMultiline
    \else
      \DefaultHeightofText
    \fi
  }%
  \begingroup
    \expandafter\HyField@SetKeys\expandafter{%
      \DefaultOptionsofText,#1%
    }%
    \PDFForm@Name
    \HyField@FlagsText
    \ifFld@hidden\def\Fld@width{1sp}\fi
    \ifx\Fld@value\@empty\def\Fld@value{\Fld@default}\fi
    \LayoutTextField{#2}{%
      \leavevmode
      \Hy@escapeform\PDFForm@Text
      \pdfstartlink user {\PDFForm@Text}\relax
      \MakeTextField{\Fld@width}{\Fld@height}\pdfendlink
      \HyField@AddToFields
    }%
  \endgroup
}
\def\@ChoiceMenu[#1]#2#3{% parameters, label, choices
  \def\Fld@name{#2}%
  \let\Fld@default\relax
  \let\Fld@value\relax
  \def\Fld@width{\DefaultWidthofChoiceMenu}%
  \def\Fld@height{\DefaultHeightofChoiceMenu}%
  \begingroup
    \Fld@menulength=0 %
    \@tempdima\z@
    \@for\@curropt:=#3\do{%
      \expandafter\Fld@checkequals\@curropt==\\%
      \Hy@StepCount\Fld@menulength
      \settowidth{\@tempdimb}{\@currDisplay}%
      \ifdim\@tempdimb>\@tempdima\@tempdima\@tempdimb\fi
    }%
    \advance\@tempdima by 15\p@
    \begingroup
      \HyField@SetKeys{#1}%
    \edef\x{\endgroup
      \noexpand\expandafter
      \noexpand\HyField@SetKeys
      \noexpand\expandafter{%
        \expandafter\noexpand\csname DefaultOptionsof%
          \ifFld@radio
            Radio%
          \else
            \ifFld@combo
              \ifFld@popdown
                PopdownBox%
              \else
                ComboBox%
              \fi
            \else
              ListBox%
            \fi
          \fi
        \endcsname
      }%
    }\x
    \HyField@SetKeys{#1}%
    \PDFForm@Name
    \ifFld@hidden\def\Fld@width{1sp}\fi
    \ifx\Fld@value\relax
      \let\Fld@value\Fld@default
    \fi
    \LayoutChoiceField{#2}{%
      \ifFld@radio
        \HyField@FlagsRadioButton
        \@@Radio{#3}%
      \else
        \begingroup
          \HyField@FlagsChoice
          \ifdim\Fld@width<\@tempdima
            \ifdim\@tempdima<1cm\@tempdima1cm\fi
            \edef\Fld@width{\the\@tempdima}%
          \fi
          \ifFld@combo
          \else
            \@tempdima=\the\Fld@menulength\Fld@charsize
            \advance\@tempdima by \Fld@borderwidth bp %
            \advance\@tempdima by \Fld@borderwidth bp %
            \edef\Fld@height{\the\@tempdima}%
          \fi
          \@@Listbox{#3}%
        \endgroup
      \fi
    }%
  \endgroup
}
\def\@@Radio#1{%
  \Fld@listcount=0 %
  \EdefEscapeName\Fld@default{\Fld@default}%
  \@for\@curropt:=#1\do{%
    \expandafter\Fld@checkequals\@curropt==\\%
    \EdefEscapeName\@currValue{\@currValue}%
    \Hy@StepCount\Fld@listcount
    \@currDisplay\space
    \leavevmode
    \Hy@escapeform\PDFForm@Radio
    \pdfstartlink user {%
      \PDFForm@Radio
      /AP<<%
        /N<<%
%    \end{macrocode}
% Laurent.Guillope@math.univ-nantes.fr (Laurent Guillope)
% persuades me that this was wrong:
% |/\Fld@name\the\Fld@listcount|. But I leave it here to remind
% me that it is untested.
%    \begin{macrocode}
          /\@currValue\space \DingObject
        >>%
      >>%
    }%
    \relax
    \MakeRadioField{\Fld@width}{\Fld@height}\pdfendlink
    \ifnum\Fld@listcount=1 %
      \HyField@AddToFields
    \fi
    \space % deliberate space between radio buttons
  }%
}
\newcount\Fld@listcount
\def\@@Listbox#1{%
  \HyField@PDFChoices{#1}%
  \leavevmode
  \Hy@escapeform\PDFForm@List
  \pdfstartlink user {\PDFForm@List}\relax
  \MakeChoiceField{\Fld@width}{\Fld@height}%
  \pdfendlink
  \HyField@AddToFields
}
\def\@PushButton[#1]#2{% parameters, label
  \def\Fld@name{#2}%
  \begingroup
    \expandafter\HyField@SetKeys\expandafter{%
      \DefaultOptionsofPushButton,#1%
    }%
    \PDFForm@Name
    \ifHy@pdfa
      \Hy@Error{%
        PDF/A: Push button with JavaScript is prohibited%
      }\@ehc
      \LayoutPushButtonField{%
        \leavevmode
        \MakeButtonField{#2}%
      }%
    \else
      \HyField@FlagsPushButton
      \ifFld@hidden\def\Fld@width{1sp}\fi
      \LayoutPushButtonField{%
        \leavevmode
        \Hy@escapeform\PDFForm@Push
        \pdfstartlink user {\PDFForm@Push}\relax
        \MakeButtonField{#2}%
        \pdfendlink
        \HyField@AddToFields
      }%
    \fi
  \endgroup
}
\def\@Submit[#1]#2{%
  \def\Fld@width{\DefaultWidthofSubmit}%
  \def\Fld@height{\DefaultHeightofSubmit}%
  \begingroup
    \expandafter\HyField@SetKeys\expandafter{%
      \DefaultOptionsofSubmit,#1%
    }%
    \HyField@FlagsPushButton
    \HyField@FlagsSubmit
    \ifFld@hidden\def\Fld@width{1sp}\fi
    \leavevmode
    \Hy@escapeform\PDFForm@Submit
    \pdfstartlink user {%
      \PDFForm@Submit
      /AP<</N \SubmitObject/D \SubmitPObject>>%
    }%
    \relax
    \MakeButtonField{#2}%
    \pdfendlink
    \HyField@AddToFields
  \endgroup
}
\def\@Reset[#1]#2{%
  \def\Fld@width{\DefaultWidthofReset}%
  \def\Fld@height{\DefaultHeightofReset}%
  \begingroup
    \expandafter\HyField@SetKeys\expandafter{%
      \DefaultOptionsofReset,#1%
    }%
    \leavevmode
    \ifHy@pdfa
      \Hy@Error{%
        PDF/A: Reset action is prohibited%
      }\@ehc
      \MakeButtonField{#2}%
    \else
      \HyField@FlagsPushButton
      \ifFld@hidden\def\Fld@width{1sp}\fi
      \Hy@escapeform\PDFForm@Reset
      \pdfstartlink user {\PDFForm@Reset}\relax
      \MakeButtonField{#2}%
      \pdfendlink
      \HyField@AddToFields
    \fi
  \endgroup
}
\def\@CheckBox[#1]#2{% parameters, label
  \def\Fld@name{#2}%
  \def\Fld@default{0}%
  \begingroup
    \def\Fld@width{\DefaultWidthofCheckBox}%
    \def\Fld@height{\DefaultHeightofCheckBox}%
    \expandafter\HyField@SetKeys\expandafter{%
      \DefaultOptionsofCheckBox,#1%
    }%
    \PDFForm@Name
    \HyField@FlagsCheckBox
    \ifFld@hidden\def\Fld@width{1sp}\fi
    \LayoutCheckField{#2}{%
      \leavevmode
      \Hy@escapeform\PDFForm@Check
      \pdfstartlink user {\PDFForm@Check}\relax
      \MakeCheckField{\Fld@width}{\Fld@height}%
      \pdfendlink
      \HyField@AddToFields
    }%
  \endgroup
}
\def\Hy@FormObjects{%
  \pdfobj {%
    <<%
      /Type/Encoding%
      /Differences[%
        24/breve/caron/circumflex/dotaccent/hungarumlaut/ogonek%
          /ring/tilde %
        39/quotesingle %
        96/grave %
        128/bullet/dagger/daggerdbl/ellipsis/emdash/endash/florin%
           /fraction/guilsinglleft/guilsinglright/minus/perthousand%
           /quotedblbase/quotedblleft/quotedblright/quoteleft%
           /quoteright/quotesinglbase/trademark/fi/fl/Lslash/OE%
           /Scaron/Ydieresis/Zcaron/dotlessi/lslash/oe/scaron/zcaron %
        164/currency %
        166/brokenbar %
        168/dieresis/copyright/ordfeminine %
        172/logicalnot/.notdef/registered/macron/degree/plusminus%
           /twosuperior/threesuperior/acute/mu %
        183/periodcentered/cedilla/onesuperior/ordmasculine %
        188/onequarter/onehalf/threequarters %
        192/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE%
           /Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave%
           /Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute%
           /Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave%
           /Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls%
           /agrave/aacute/acircumflex/atilde/adieresis/aring/ae%
           /ccedilla/egrave/eacute/ecircumflex/edieresis/igrave%
           /iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute%
           /ocircumflex/otilde/odieresis/divide/oslash/ugrave%
           /uacute/ucircumflex/udieresis/yacute/thorn/ydieresis%
      ]%
    >>%
  }%
  \xdef\OBJ@pdfdocencoding{\the\pdflastobj}%
  \pdfobj{%
    <<%
      /Type/Font%
      /Subtype/Type1%
      /Name/ZaDb%
      /BaseFont/ZapfDingbats%
    >>%
  }%
  \xdef\OBJ@ZaDb{\the\pdflastobj}%
  \pdfobj{%
    <<%
      /Type/Font%
      /Subtype/Type1%
      /Name/Helv%
      /BaseFont/Helvetica%
      /Encoding \OBJ@pdfdocencoding\space 0 R%
    >>%
  }%
  \xdef\OBJ@Helv{\the\pdflastobj}%
  \global\let\Hy@FormObjects\relax
}
%</pdftex>
%    \end{macrocode}
%
% \subsection{dvipdfm, xetex}
%    D. P. Story adapted the pdf\TeX{} forms part for dvipdfm, of which
%    version 0.12.7b or higher is required because of a bug.
%    \begin{macrocode}
%<*dvipdfm|xetex>
%    \end{macrocode}
%
%    \begin{macro}{\@Gauge}
%    \begin{macrocode}
\def\@Gauge[#1]#2#3#4{% parameters, label, minimum, maximum
  \Hy@Message{Sorry, dvipdfm/XeTeX does not support FORM gauges}%
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\@Form}
%    \begin{macrocode}
\def\@Form[#1]{%
  \@ifundefined{textcolor}{\let\textcolor\@gobble}{}%
  \kvsetkeys{Form}{#1}%
  \Hy@FormObjects
  \@pdfm@mark{obj @afields []}%
  \@pdfm@mark{obj @corder []}%
  \@pdfm@mark{%
    obj @aform <<%
      /Fields @afields%
      /DR<<%
        /Font<<%
          /ZaDb @OBJZaDb%
          /Helv @OBJHelv%
        >>%
      >>%
      /DA(/Helv 10 Tf 0 g)%
      /CO @corder%
      \ifHy@pdfa
      \else
        \ifHyField@NeedAppearances
          /NeedAppearances true%
        \fi
      \fi
    >>%
  }%
  \@pdfm@mark{put @catalog <</AcroForm @aform>>}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\@endForm}
%    \begin{macrocode}
\let\@endForm\ltx@empty
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\dvipdfm@setdim}
%    \cmd{\dvipdfm@setdim} sets dimensions for ann using
%    \cmd{\pdfm@box}.
%    \begin{macrocode}
\def\dvipdfm@setdim{%
  height \the\ht\pdfm@box\space
  width  \the\wd\pdfm@box\space
  depth  \the\dp\pdfm@box\space
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\HyField@AnnotCount}
%    \begin{macrocode}
\newcount\HyField@AnnotCount
\HyField@AnnotCount=\z@
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyField@AdvanceAnnotCount}
%    \begin{macrocode}
\def\HyField@AdvanceAnnotCount{%
  \global\advance\HyField@AnnotCount\@ne
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\HyField@TheAnnotCount}
%    \begin{macrocode}
\def\HyField@TheAnnotCount{%
  \the\HyField@AnnotCount
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\@TextField}
%    \begin{macrocode}
\def\@TextField[#1]#2{% parameters, label
  \def\Fld@name{#2}%
  \let\Fld@default\ltx@empty
  \let\Fld@value\@empty
  \def\Fld@width{\DefaultWidthofText}%
  \def\Fld@height{%
    \ifFld@multiline
      \DefaultHeightofTextMultiline
    \else
      \DefaultHeightofText
    \fi
  }%
  \begingroup
    \expandafter\HyField@SetKeys\expandafter{%
      \DefaultOptionsofText,#1%
    }%
    \PDFForm@Name
    \HyField@FlagsText
    \ifFld@hidden\def\Fld@width{1sp}\fi
    \ifx\Fld@value\@empty\def\Fld@value{\Fld@default}\fi
    \setbox\pdfm@box=\hbox{%
      \MakeTextField{\Fld@width}{\Fld@height}%
    }%
    \HyField@AdvanceAnnotCount
    \LayoutTextField{#2}{%
      \leavevmode
      \Hy@escapeform\PDFForm@Text
      \@pdfm@mark{%
        ann @text\HyField@TheAnnotCount\space
        \dvipdfm@setdim << \PDFForm@Text >>%
      }%
    }%
    \unhbox\pdfm@box
    \@pdfm@mark{put @afields @text\HyField@TheAnnotCount}%
    % record in @afields array
  \endgroup
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\@ChoiceMenu}
%    \begin{macrocode}
\def\@ChoiceMenu[#1]#2#3{% parameters, label, choices
  \def\Fld@name{#2}%
  \let\Fld@default\relax
  \let\Fld@value\relax
  \def\Fld@width{\DefaultWidthofChoiceMenu}%
  \def\Fld@height{\DefaultHeightofChoiceMenu}%
  \begingroup
    \Fld@menulength=0 %
    \@tempdima\z@
    \@for\@curropt:=#3\do{%
      \expandafter\Fld@checkequals\@curropt==\\%
      \Hy@StepCount\Fld@menulength
      \settowidth{\@tempdimb}{\@currDisplay}%
      \ifdim\@tempdimb>\@tempdima\@tempdima\@tempdimb\fi
    }%
    \advance\@tempdima by 15\p@
    \begingroup
      \HyField@SetKeys{#1}%
    \edef\x{\endgroup
      \noexpand\expandafter
      \noexpand\HyField@SetKeys
      \noexpand\expandafter{%
        \expandafter\noexpand\csname DefaultOptionsof%
          \ifFld@radio
            Radio%
          \else
            \ifFld@combo
              \ifFld@popdown
                PopdownBox%
              \else
                ComboBox%
              \fi
            \else
              ListBox%
            \fi
          \fi
        \endcsname
      }%
    }\x
    \HyField@SetKeys{#1}%
    \PDFForm@Name
    \ifFld@hidden\def\Fld@width{1sp}\fi
    \ifx\Fld@value\relax
      \let\Fld@value\Fld@default
    \fi
    \LayoutChoiceField{#2}{%
      \ifFld@radio
        \HyField@FlagsRadioButton
        \@@Radio{#3}%
      \else
        \begingroup
          \HyField@FlagsChoice
          \ifdim\Fld@width<\@tempdima
            \ifdim\@tempdima<1cm\@tempdima1cm\fi
            \edef\Fld@width{\the\@tempdima}%
          \fi
          \ifFld@combo
          \else
            \@tempdima=\the\Fld@menulength\Fld@charsize
            \advance\@tempdima by \Fld@borderwidth bp %
            \advance\@tempdima by \Fld@borderwidth bp %
            \edef\Fld@height{\the\@tempdima}%
          \fi
          \@@Listbox{#3}%
        \endgroup
      \fi
    }%
  \endgroup
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\@@Radio}
%    \begin{macrocode}
\def\@@Radio#1{%
  \Fld@listcount=0 %
  \EdefEscapeName\Fld@default{\Fld@default}%
  \setbox\pdfm@box=\hbox{%
    \MakeRadioField{\Fld@width}{\Fld@height}%
  }%
  \@for\@curropt:=#1\do{%
    \expandafter\Fld@checkequals\@curropt==\\%
    \EdefEscapeName\@currValue{\@currValue}%
    \Hy@StepCount\Fld@listcount
    \@currDisplay\space
    \leavevmode
    \Hy@escapeform\PDFForm@Radio
    \ifnum\Fld@listcount=1 %
      \HyField@AdvanceAnnotCount
    \fi
    \@pdfm@mark{%
      ann %
      \ifnum\Fld@listcount=1 %
        @radio\HyField@TheAnnotCount%
        \space
      \fi
      \dvipdfm@setdim
      <<%
        \PDFForm@Radio
        /AP<</N<</\@currValue /null>>>>%
      >>%
    }%
    \unhcopy\pdfm@box\space% deliberate space between radio buttons
    \ifnum\Fld@listcount=1 %
      \@pdfm@mark{%
        put @afields @radio\HyField@TheAnnotCount
      }%
    \fi
  }%
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\Fld@listcount}
%    \begin{macrocode}
\newcount\Fld@listcount
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\@@Listbox}
%    \begin{macrocode}
\def\@@Listbox#1{%
  \HyField@PDFChoices{#1}%
  \setbox\pdfm@box=\hbox{%
    \MakeChoiceField{\Fld@width}{\Fld@height}%
  }%
  \leavevmode
  \Hy@escapeform\PDFForm@List
  \HyField@AdvanceAnnotCount
  \@pdfm@mark{%
    ann @list\HyField@TheAnnotCount\space
    \dvipdfm@setdim
    <<\PDFForm@List>>%
  }%
  \unhbox\pdfm@box
  \@pdfm@mark{put @afields @list\HyField@TheAnnotCount}%
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\@PushButton}
%    \begin{macrocode}
\def\@PushButton[#1]#2{% parameters, label
  \def\Fld@name{#2}%
  \begingroup
    \expandafter\HyField@SetKeys\expandafter{%
      \DefaultOptionsofPushButton,#1%
    }%
    \PDFForm@Name
    \ifHy@pdfa
      \Hy@Error{%
        PDF/A: Push button with JavaScript is prohibited%
      }\@ehc
      \LayoutPushButtonField{%
        \leavevmode
        \MakeButtonField{#2}%
      }%
    \else
      \setbox\pdfm@box=\hbox{\MakeButtonField{#2}}%
      \HyField@FlagsPushButton
      \ifFld@hidden\def\Fld@width{1sp}\fi
      \HyField@AdvanceAnnotCount
      \LayoutPushButtonField{%
        \leavevmode
        \Hy@escapeform\PDFForm@Push
        \@pdfm@mark{%
          ann @push\HyField@TheAnnotCount\space
          \dvipdfm@setdim
          <<\PDFForm@Push>>%
        }%
      }%
      \unhbox\pdfm@box
      \@pdfm@mark{put @afields @push\HyField@TheAnnotCount}%
    \fi
  \endgroup
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\@Submit}
%    \begin{macrocode}
\def\@Submit[#1]#2{%
  \def\Fld@width{\DefaultWidthofSubmit}%
  \def\Fld@height{\DefaultHeightofSubmit}%
  \begingroup
    \expandafter\HyField@SetKeys\expandafter{%
      \DefaultOptionsofSubmit,#1%
    }%
    \HyField@FlagsPushButton
    \HyField@FlagsSubmit
    \ifFld@hidden\def\Fld@width{1sp}\fi
    \setbox\pdfm@box=\hbox{\MakeButtonField{#2}}%
    \leavevmode
    \Hy@escapeform\PDFForm@Submit
    \HyField@AdvanceAnnotCount
    \@pdfm@mark{%
      ann @submit\HyField@TheAnnotCount\space
      \dvipdfm@setdim
      <<\PDFForm@Submit>>%
    }%
    \unhbox\pdfm@box%
    \@pdfm@mark{put @afields @submit\HyField@TheAnnotCount}%
  \endgroup
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\@Reset}
%    \begin{macrocode}
\def\@Reset[#1]#2{%
  \def\Fld@width{\DefaultWidthofReset}%
  \def\Fld@height{\DefaultHeightofReset}%
  \begingroup
    \expandafter\HyField@SetKeys\expandafter{%
      \DefaultOptionsofReset,#1%
    }%
    \leavevmode
    \ifHy@pdfa
      \Hy@Error{%
        PDF/A: Reset action is prohibited%
      }\@ehc
      \MakeButtonField{#2}%
    \else
      \HyField@FlagsPushButton
      \ifFld@hidden\def\Fld@width{1sp}\fi
      \setbox\pdfm@box=\hbox{\MakeButtonField{#2}}%
      \Hy@escapeform\PDFForm@Reset
      \HyField@AdvanceAnnotCount
      \@pdfm@mark{%
        ann @reset\HyField@TheAnnotCount\space
        \dvipdfm@setdim
        <<\PDFForm@Reset>>%
      }%
      \unhbox\pdfm@box
      \@pdfm@mark{put @afields @reset\HyField@TheAnnotCount}%
    \fi
  \endgroup
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\@CheckBox}
%    \begin{macrocode}
\def\@CheckBox[#1]#2{% parameters, label
  \def\Fld@name{#2}%
  \def\Fld@default{0}%
  \begingroup
    \def\Fld@width{\DefaultWidthofCheckBox}%
    \def\Fld@height{\DefaultHeightofCheckBox}%
    \expandafter\HyField@SetKeys\expandafter{%
      \DefaultOptionsofCheckBox,#1%
    }%
    \PDFForm@Name
    \HyField@FlagsCheckBox
    \ifFld@hidden\def\Fld@width{1sp}\fi
    \setbox\pdfm@box=\hbox{%
      \MakeCheckField{\Fld@width}{\Fld@height}%
    }%
    \HyField@AdvanceAnnotCount
    \LayoutCheckField{#2}{%
      \leavevmode
      \Hy@escapeform\PDFForm@Check
      \@pdfm@mark{%
        ann @check\HyField@TheAnnotCount\space
        \dvipdfm@setdim
        <<\PDFForm@Check>>%
      }%
      \unhbox\pdfm@box
      \@pdfm@mark{put @afields @check\HyField@TheAnnotCount}%
    }%
  \endgroup
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macrocode}
\def\Hy@FormObjects{%
  \@pdfm@mark{obj @OBJpdfdocencoding%
    <<%
      /Type/Encoding%
      /Differences[%
         24/breve/caron/circumflex/dotaccent/hungarumlaut/ogonek/ring/tilde %
         39/quotesingle %
         96/grave %
        128/bullet/dagger/daggerdbl/ellipsis/emdash/endash/florin%
          /fraction/guilsinglleft/guilsinglright/minus/perthousand%
          /quotedblbase/quotedblleft/quotedblright/quoteleft/quoteright%
          /quotesinglbase/trademark/fi/fl/Lslash/OE/Scaron/Ydieresis%
          /Zcaron/dotlessi/lslash/oe/scaron/zcaron %
        164/currency %
        166/brokenbar %
        168/dieresis/copyright/ordfeminine %
        172/logicalnot/.notdef/registered/macron/degree/plusminus%
           /twosuperior/threesuperior/acute/mu %
        183/periodcentered/cedilla/onesuperior/ordmasculine %
        188/onequarter/onehalf/threequarters %
        192/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE%
           /Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute%
           /Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex%
           /Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex%
           /Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex%
           /atilde/adieresis/aring/ae/ccedilla/egrave/eacute%
           /ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis%
           /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis%
           /divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute%
           /thorn/ydieresis%
      ]%
    >>%
  }%
  \@pdfm@mark{obj @OBJZaDb%
    <<%
      /Type/Font%
      /Subtype/Type1%
      /Name/ZaDb%
      /BaseFont/ZapfDingbats%
    >>%
  }%
  \@pdfm@mark{obj @OBJHelv%
    <<%
      /Type/Font%
      /Subtype/Type1%
      /Name/Helv%
      /BaseFont/Helvetica%
      /Encoding @OBJpdfdocencoding%
    >>%
  }%
  \global\let\Hy@FormObjects\relax
}
%</dvipdfm|xetex>
%    \end{macrocode}
%
% \subsection{Common forms part}
%    \begin{macrocode}
%<*pdfform>
%    \end{macrocode}
%
%    \begin{macro}{\Hy@escapestring}
%    \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname pdfescapestring\endcsname\relax
  \let\Hy@escapestring\@firstofone
  \def\Hy@escapeform#1{%
    \ifHy@pdfescapeform
      \def\Hy@escapestring##1{%
        \noexpand\Hy@escapestring{\noexpand##1}%
      }%
      \edef\Hy@temp{#1}%
      \expandafter\Hy@@escapeform\Hy@temp\Hy@escapestring{}\@nil
      \def\Hy@escapestring##1{%
        \@ifundefined{Hy@esc@\string##1}{%
          ##1%
          \ThisShouldNotHappen
        }{%
          \csname Hy@esc@\string##1\endcsname
        }%
      }%
    \else
      \let\Hy@escapestring\@firstofone
    \fi
  }%
  \def\Hy@@escapeform#1\Hy@escapestring#2#3\@nil{%
    \ifx\\#3\\%
    \else
      \expandafter
      \Hy@pstringdef\csname Hy@esc@\string#2\endcsname{#2}%
      \ltx@ReturnAfterFi{%
        \Hy@@escapeform#3\@nil
      }%
    \fi
  }%
\else
  \def\Hy@escapeform#1{%
    \ifHy@pdfescapeform
      \let\Hy@escapestring\pdfescapestring
    \else
      \let\Hy@escapestring\@firstofone
    \fi
  }%
  \Hy@escapeform{}%
\fi
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\PDFForm@Name}
%    \begin{macrocode}
\def\PDFForm@Name{%
  \PDFForm@@Name\Fld@name
  \ifx\Fld@altname\relax
  \else
    \PDFForm@@Name\Fld@altname
  \fi
  \ifx\Fld@mappingname\relax
  \else
    \PDFForm@@Name\Fld@mappingname
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\PDFForm@@Name}
%    \begin{macrocode}
\def\PDFForm@@Name#1{%
  \begingroup
    \ifnum\Hy@pdfversion<5 % implementation note 117, PDF spec 1.7
      \ifHy@unicode
        \Hy@unicodefalse
      \fi
    \fi
    \HyPsd@XeTeXBigCharstrue
    \pdfstringdef\Hy@gtemp#1%
  \endgroup
  \let#1\Hy@gtemp
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\Fld@additionalactions}
%    \begin{macrocode}
\def\Fld@@additionalactions{%
%    \end{macrocode}
%    K input (keystroke) format
%    \begin{macrocode}
  \ifx\Fld@keystroke@code\@empty
  \else
    /K<</S/JavaScript/JS(\Hy@escapestring{\Fld@keystroke@code})>>%
  \fi
%    \end{macrocode}
%    F display format
%    \begin{macrocode}
  \ifx\Fld@format@code\@empty
  \else
    /F<</S/JavaScript/JS(\Hy@escapestring{\Fld@format@code})>>%
  \fi
%    \end{macrocode}
%    V validation
%    \begin{macrocode}
  \ifx\Fld@validate@code\@empty
  \else
    /V<</S/JavaScript/JS(\Hy@escapestring{\Fld@validate@code})>>%
  \fi
%    \end{macrocode}
%    C calculation
%    \begin{macrocode}
  \ifx\Fld@calculate@code\@empty
  \else
    /C<</S/JavaScript/JS(\Hy@escapestring{\Fld@calculate@code})>>%
  \fi
%    \end{macrocode}
%    Fo receiving the input focus
%    \begin{macrocode}
  \ifx\Fld@onfocus@code\@empty
  \else
    /Fo<</S/JavaScript/JS(\Hy@escapestring{\Fld@onfocus@code})>>%
  \fi
%    \end{macrocode}
%    Bl loosing the input focus (blurred)
%    \begin{macrocode}
  \ifx\Fld@onblur@code\@empty
  \else
    /Bl<</S/JavaScript/JS(\Hy@escapestring{\Fld@onblur@code})>>%
  \fi
%    \end{macrocode}
%    D pressing the mouse button (down)
%    \begin{macrocode}
  \ifx\Fld@onmousedown@code\@empty
  \else
    /D<</S/JavaScript/JS(\Hy@escapestring{\Fld@onmousedown@code})>>%
  \fi
%    \end{macrocode}
%    U releasing the mouse button (up)
%    \begin{macrocode}
  \ifx\Fld@onmouseup@code\@empty
  \else
    /U<</S/JavaScript/JS(\Hy@escapestring{\Fld@onmouseup@code})>>%
  \fi
%    \end{macrocode}
%    E cursor enters the annotation's active area.
%    \begin{macrocode}
  \ifx\Fld@onenter@code\@empty
  \else
    /E<</S/JavaScript/JS(\Hy@escapestring{\Fld@onenter@code})>>%
  \fi
%    \end{macrocode}
%    X cursor exits the annotation's active area.
%    \begin{macrocode}
  \ifx\Fld@onexit@code\@empty
  \else
    /X<</S/JavaScript/JS(\Hy@escapestring{\Fld@onexit@code})>>%
  \fi
}
\def\Fld@additionalactions{%
  \if-\Fld@@additionalactions-%
  \else
    \ifHy@pdfa
    \else
      /AA<<\Fld@@additionalactions>>%
    \fi
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Fld@annotnames}
%    \begin{macrocode}
\def\Fld@annotnames{%
  /T(\Fld@name)%
  \ifx\Fld@altname\relax
  \else
    /TU(\Fld@altname)%
  \fi
  \ifx\Fld@mappingname\relax
  \else
    /TM(\Fld@mappingname)%
  \fi
}
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\PDFForm@Check}
%    \begin{macrocode}
\def\PDFForm@Check{%
  /Subtype/Widget%
  \Fld@annotflags
  \Fld@annotnames
  /FT/Btn%
  \Fld@flags
  /Q \Fld@align
  /BS<</W \Fld@borderwidth /S/\Fld@borderstyle>>%
  /MK<<%
    \ifnum\Fld@rotation=\z@
    \else
      /R \Fld@rotation
    \fi
    \ifx\Fld@bordercolor\relax
    \else
      /BC[\Fld@bordercolor]%
    \fi
    \ifx\Fld@bcolor\relax
    \else
      /BG[\Fld@bcolor]%
    \fi
    /CA(\Hy@escapestring{\Fld@cbsymbol})%
  >>%
  /DA(/ZaDb \strip@pt\Fld@charsize\space Tf%
      \ifx\Fld@color\@empty\else\space\Fld@color\fi)%
  /H/P%
  \ifFld@checked /V/Yes\else /V/Off\fi
  \Fld@additionalactions
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\PDFForm@Push}
%    \begin{macrocode}
\ifHy@pdfa
\else
  \def\PDFForm@Push{%
    /Subtype/Widget%
    \Fld@annotflags
    \Fld@annotnames
    /FT/Btn%
    \Fld@flags
    /H/P%
    /BS<</W \Fld@borderwidth/S/\Fld@borderstyle>>%
    \ifcase0\ifnum\Fld@rotation=\z@   \else 1\fi
            \ifx\Fld@bordercolor\relax\else 1\fi
            \space
    \else
      /MK<<%
        \ifnum\Fld@rotation=\z@
        \else
          /R \Fld@rotation
        \fi
        \ifx\Fld@bordercolor\relax
        \else
          /BC[\Fld@bordercolor]%
        \fi
      >>%
    \fi
    /A<</S/JavaScript/JS(\Hy@escapestring{\Fld@onclick@code})>>%
    \Fld@additionalactions
  }%
\fi
%    \end{macrocode}
%    \end{macro}
%
%    \begin{macro}{\PDFForm@List}
%    \begin{macrocode}
\def\PDFForm@List{%
  /Subtype/Widget%
  \Fld@annotflags
  \Fld@annotnames
  /FT/Ch%
  \Fld@flags
  /Q \Fld@align
  /BS<</W \Fld@borderwidth/S/\Fld@borderstyle>>%
  \ifcase0\ifnum\Fld@rotation=\z@   \else 1\fi
          \ifx\Fld@bordercolor\relax\else 1\fi
          \ifx\fld@bcolor\relax     \else 1\fi
          \space
  \else
    /MK<<%
      \ifnum\Fld@rotation=\z@
      \else
        /R \Fld@rotation
      \fi
      \ifx\Fld@bordercolor\relax
      \else
        /BC[\Fld@bordercolor]%
      \fi
      \ifx\Fld@bcolor\relax
      \else
        /BG[\Fld@bcolor]%
      \fi
    >>%
  \fi
  /DA(/Helv \strip@pt\Fld@charsize\space Tf%
      \ifx\Fld@color\@empty\else\space\Fld@color\fi)%
  \Fld@choices
  \Fld@additionalactions
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\PDFForm@Radio}
%    \begin{macrocode}
\def\PDFForm@Radio{%
  /Subtype/Widget%
  \Fld@annotflags
  \Fld@annotnames
  /FT/Btn%
  \Fld@flags
  /H/P%
  /BS<</W \Fld@borderwidth/S/\Fld@borderstyle>>%
  /MK<<%
    \ifnum\Fld@rotation=\z@
    \else
      /R \Fld@rotation
    \fi
    \ifx\Fld@bordercolor\relax
    \else
      /BC[\Fld@bordercolor]%
    \fi
    \ifx\Fld@bcolor\relax
    \else
      /BG[\Fld@bcolor]%
    \fi
    /CA(\Fld@radiosymbol)%
  >>%
  /DA(/ZaDb \strip@pt\Fld@charsize\space Tf%
      \ifx\Fld@color\@empty\else\space\Fld@color\fi)%
  \ifx\@currValue\Fld@default
    /V/\Fld@default
    /DV/\Fld@default
  \else
    /V/Off%
    /DV/Off%
  \fi
  \Fld@additionalactions
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\PDFForm@Text}
%    \begin{macrocode}
\def\PDFForm@Text{%
  /Subtype/Widget%
  \Fld@annotflags
  \Fld@annotnames
  /FT/Tx%
  \Fld@flags
  /Q \Fld@align
  /BS<</W \Fld@borderwidth\space /S /\Fld@borderstyle>>%
  \ifcase0\ifnum\Fld@rotation=\z@   \else 1\fi
          \ifx\Fld@bordercolor\relax\else 1\fi
          \ifx\Fld@bcolor\relax     \else 1\fi
          \space
  \else
    /MK<<%
      \ifnum\Fld@rotation=\z@
      \else
        /R \Fld@rotation
      \fi
      \ifx\Fld@bordercolor\relax
      \else
        /BC[\Fld@bordercolor]%
      \fi
      \ifx\Fld@bcolor\relax
      \else
        /BG[\Fld@bcolor]%
      \fi
    >>%
  \fi
  /DA(/Helv \strip@pt\Fld@charsize\space Tf%
      \ifx\Fld@color\@empty\else\space\Fld@color\fi)%
  /DV(\Hy@escapestring{\Fld@default})%
  /V(\Hy@escapestring{\Fld@value})%
  \Fld@additionalactions
  \ifnum\Fld@maxlen>\z@/MaxLen \Fld@maxlen \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\PDFForm@Submit}
%    \begin{macrocode}
\def\PDFForm@Submit{%
  /Subtype/Widget%
  \Fld@annotflags
  \Fld@annotnames
  /FT/Btn%
  \Fld@flags
  /H/P%
  /BS<</W \Fld@borderwidth/S/\Fld@borderstyle>>%
  \ifcase0\ifnum\Fld@rotation=\z@   \else 1\fi
          \ifx\Fld@bordercolor\relax\else 1\fi
          \space
  \else
    /MK<<%
      \ifnum\Fld@rotation=\z@
      \else
        /R \Fld@rotation
      \fi
      \ifx\Fld@bordercolor\relax
      \else
        /BC[\Fld@bordercolor]%
      \fi
    >>%
  \fi
  /A<<%
    /S/SubmitForm%
    /F<<%
      /FS/URL%
      /F(\Hy@escapestring{\Form@action})%
    >>%
    \Fld@submitflags
  >>%
  \Fld@additionalactions
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\PDFForm@Reset}
%    \begin{macrocode}
\ifHy@pdfa
\else
  \def\PDFForm@Reset{%
    /Subtype/Widget%
    \Fld@annotflags
    \Fld@annotnames
    /FT/Btn%
    \Fld@flags
    /H/P%
    /DA(/Helv \strip@pt\Fld@charsize\space Tf 0 0 1 rg)%
    \ifcase0\ifnum\Fld@rotation=\z@   \else 1\fi
            \ifx\Fld@bordercolor\relax\else 1\fi
            \space
    \else
      /MK<<%
        \ifnum\Fld@rotation=\z@
        \else
          /R \Fld@rotation
        \fi
        \ifx\Fld@bordercolor\relax
        \else
          /BC[\Fld@bordercolor]%
        \fi
%      /CA (Clear)
%      /AC (Done)
      >>%
    \fi
    /BS<</W \Fld@borderwidth/S/\Fld@borderstyle>>%
    /A<</S/ResetForm>>%
    \Fld@additionalactions
  }%
\fi
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
%</pdfform>
%<*package>
%    \end{macrocode}
%
% \section{Bookmarks in the PDF file}
% This was originally developed by Yannis Haralambous
% (it was the separate |repere.sty|); it needed
% the |repere| or |makebook.pl| post-processor to work properly. Now
% redundant, as it is done entirely in \LaTeX{} macros.
%
% To write out the current section title, and its rationalized number,
% we have to intercept the |\@sect| command, which is rather
% dangerous. But how else to see the information we need?
% We do the \emph{same} for |\@ssect|, giving anchors to
% unnumbered sections. This allows things like bibliographies
% to get bookmarks when used with a manual |\addcontentsline|
%    \begin{macrocode}
\def\phantomsection{%
  \Hy@MakeCurrentHrefAuto{section*}%
  \Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
}
%</package>
%    \end{macrocode}
%
% \subsection{Bookmarks}
%    \begin{macrocode}
%<*outlines>
%    \end{macrocode}
%
% This section was written by Heiko Oberdiek; the code replaces
% an earlier version by David Carlisle.
%
% The first part of bookmark code is in section \ref{sec:pdfstring}.
% Further documentation is available as paper and slides of the
% talk, that Heiko Oberdiek has given at the EuroTeX'99 meating
% in Heidelberg. See |paper.pdf| and |slides.pdf| in the
% |doc| directory of hyperref.
%
% When using the right-to-left typesetting based on \eTeX, the order
% of the |\BOOKMARK| commands written to the |\@outlinefile| could
% appear wrong, because of mis-feature of \eTeX's implementation (that
% it processes the shipped out lines left-to-right, instead of the
% order in which they appear in the document). The wrong order will
% appear when the file contains two bookmarks on the same line typeset
% right-to-left.
%
% To work around this problem, the |bookmark@seq@number| counter is
% used to write the bookmark's sequential number into a comment in the
% |\@outlinefile|, which could be used to post-process it to achieve
% the proper ordering of |\BOOKMARK| commands in that file.
%
%    \begin{macrocode}
\def\Hy@writebookmark#1#2#3#4#5{%
    % section number, text, label, level, file
  \ifx\WriteBookmarks\relax%
  \else
    \ifnum#4>\Hy@bookmarksdepth\relax
    \else
      \@@writetorep{#1}{#2}{#3}{#4}{#5}%
    \fi
  \fi
}
\def\Hy@currentbookmarklevel{0}
\def\Hy@numberline#1{#1 }
\def\@@writetorep#1#2#3#4#5{%
  \begingroup
    \edef\Hy@tempa{#5}%
    \ifx\Hy@tempa\Hy@bookmarkstype
      \edef\Hy@level{#4}%
      \ifx\Hy@levelcheck Y%
        \@tempcnta\Hy@level\relax
        \advance\@tempcnta by -1 %
        \ifnum\Hy@currentbookmarklevel<\@tempcnta
          \advance\@tempcnta by -\Hy@currentbookmarklevel\relax
          \advance\@tempcnta by 1 %
          \Hy@Warning{%
            Difference (\the\@tempcnta) between bookmark levels is %
            greater \MessageBreak than one, level fixed%
          }%
          \@tempcnta\Hy@currentbookmarklevel
          \advance\@tempcnta by 1 %
          \edef\Hy@level{\the\@tempcnta}%
        \fi
      \else
        \global\let\Hy@levelcheck Y%
      \fi
      \global\let\Hy@currentbookmarklevel\Hy@level
      \@tempcnta\Hy@level\relax
      \expandafter\xdef\csname Parent\Hy@level\endcsname{#3}%
      \advance\@tempcnta by -1 %
      \edef\Hy@tempa{#3}%
      \edef\Hy@tempb{\csname Parent\the\@tempcnta\endcsname}%
      \ifx\Hy@tempa\Hy@tempb
        \Hy@Warning{%
          The anchor of a bookmark and its parent's must not%
          \MessageBreak be the same. Added a new anchor%
        }%
        \phantomsection
      \fi
      \ifHy@bookmarksnumbered
        \let\numberline\Hy@numberline
        \let\booknumberline\Hy@numberline
        \let\partnumberline\Hy@numberline
        \let\chapternumberline\Hy@numberline
      \else
        \let\numberline\@gobble
        \let\booknumberline\@gobble
        \let\partnumberline\@gobble
        \let\chapternumberline\@gobble
      \fi
      \HyPsd@XeTeXBigCharstrue
      \pdfstringdef\Hy@tempa{#2}%
      \HyPsd@SanitizeForOutFile\Hy@tempa
      \if@filesw
        \stepcounter{bookmark@seq@number}%
        \@ifundefined{@outlinefile}{%
        }{%
          \protected@write\@outlinefile{}{%
            \protect\BOOKMARK
              [\Hy@level][\@bookmarkopenstatus{\Hy@level}]{#3}%
              {\Hy@tempa}{\Hy@tempb}%
              \@percentchar\space\thebookmark@seq@number
          }%
        }%
      \fi
    \fi
  \endgroup
}
\newcounter{bookmark@seq@number}
%    \end{macrocode}
%    \begin{macrocode}
\begingroup
  \lccode`(=`{%
  \lccode`)=`}%
  \lccode`1=\z@
  \lccode`2=\z@
  \lccode`3=\z@
  \lccode`5=\z@
  \lccode`7=\z@
  \lccode`\#=\z@
  \lccode`\`=\z@
  \lccode`\{=\z@
  \lccode`\}=\z@
\lowercase{%
  \endgroup
  \def\HyPsd@SanitizeForOutFile#1{%
    \@onelevel@sanitize\Hy@tempa
    \escapechar`\\%
    \edef\Hy@tempa{%
      \expandafter\HyPsd@SanitizeOut@BraceLeft\Hy@tempa(\@nil
    }%
    \edef\Hy@tempa{%
      \expandafter\HyPsd@SanitizeOut@BraceRight\Hy@tempa)\@nil
    }%
  }%
  \def\HyPsd@SanitizeOut@BraceLeft#1(#2\@nil{%
    #1%
    \ifx\\#2\\%
      \expandafter\ltx@gobble
    \else
      \expandafter\ltx@firstofone
    \fi
    {%
      \string\173%
      \HyPsd@SanitizeOut@BraceLeft#2\@nil
    }%
  }%
  \def\HyPsd@SanitizeOut@BraceRight#1)#2\@nil{%
    #1%
    \ifx\\#2\\%
      \expandafter\ltx@gobble
    \else
      \expandafter\ltx@firstofone
    \fi
    {%
      \string\175%
      \HyPsd@SanitizeOut@BraceRight#2\@nil
    }%
  }%
}
%    \end{macrocode}
%    In the call of \cmd{\BOOKMARK} the braces around \verb|#4|
%    are omitted, because it is not likely, that the level number
%    contains \verb|]|.
%    \begin{macrocode}
\newcommand{\currentpdfbookmark}{%
  \pdfbookmark[\Hy@currentbookmarklevel]%
}
\newcommand{\subpdfbookmark}{%
  \@tempcnta\Hy@currentbookmarklevel
  \Hy@StepCount\@tempcnta
  \expandafter\pdfbookmark\expandafter[\the\@tempcnta]%
}
\newcommand{\belowpdfbookmark}[2]{%
  \@tempcnta\Hy@currentbookmarklevel
  \Hy@StepCount\@tempcnta
  \expandafter\pdfbookmark\expandafter[\the\@tempcnta]{#1}{#2}%
  \advance\@tempcnta by -1 %
  \xdef\Hy@currentbookmarklevel{\the\@tempcnta}%
}
%    \end{macrocode}
% Tobias Oetiker rightly points out that we need a way to
% force a bookmark entry. So we introduce |\pdfbookmark|,
% with two parameters, the title, and a symbolic name.
% By default this is at level 1, but we can reset that with the
% optional first argument.
%    \begin{macrocode}
\renewcommand\pdfbookmark[3][0]{%
  \Hy@writebookmark{}{#2}{#3.#1}{#1}{toc}%
  \hyper@anchorstart{#3.#1}\hyper@anchorend
}
\def\BOOKMARK{%
  \@ifnextchar[{\@BOOKMARK}{\@@BOOKMARK[1][-]}%
}
\def\@BOOKMARK[#1]{%
  \@ifnextchar[{\@@BOOKMARK[{#1}]}{\@@BOOKMARK[{#1}][-]}%
}
%    \end{macrocode}
% The macros for calculating structure of outlines
% are derived from those by  Petr Olsak used in the texinfopdf macros.
%
% \subsubsection{Rerun warning}
%
%    \begin{macro}{\Hy@OutlineRerunCheck}
%    \begin{macrocode}
\RequirePackage{rerunfilecheck}[2009/12/10]
\def\Hy@OutlineRerunCheck{%
  \RerunFileCheck{\jobname.out}{%
    \immediate\closeout\@outlinefile
  }{%
    Rerun to get outlines right\MessageBreak
    or use package `bookmark'%
  }%
}
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{Driver stuff}
%
% The VTEX section was written originally by VTEX, but then
% amended by Denis Girou (\Email{denis.girou@idris.fr}),
% then by by Taco Hoekwater (\Email{taco.hoekwater@wkap.nl}. The problem
% is that VTEX, with its close integration of the PDF backend, does
% look at the contents of bookmarks, escaping |\| and the like.
%    \begin{macrocode}
%<*vtex>
%    \end{macrocode}
%    \begin{macrocode}
\newcount\@serial@counter\@serial@counter=1\relax
%    \end{macrocode}
%    \begin{macro}{\hv@pdf@char}
% Plain octal codes doesn't work with versions below 6.50.
% So for early versions hex numbers have to be used.
% It would be possible to program this instead of the
% large |\ifcase|, but I'm too lazy to sort that out now.
%    \begin{macrocode}
\begingroup
  \catcode`\'=12 %
  \ifnum\Hy@VTeXversion<650 %
    \catcode`\"=12 %
    \gdef\hv@pdf@char#1#2#3{%
      \char
      \ifcase'#1#2#3 %
         "00\or"01\or"02\or"03\or"04\or"05\or"06\or"07%
      \or"08\or"09\or"0A\or"0B\or"0C\or"0D\or"0E\or"0F%
      \or"10\or"11\or"12\or"13\or"14\or"15\or"16\or"17%
      \or"18\or"19\or"1A\or"1B\or"1C\or"1D\or"1E\or"1F%
      \or"20\or"21\or"22\or"23\or"24\or"25\or"26\or"27%
      \or"28\or"29\or"2A\or"2B\or"2C\or"2D\or"2E\or"2F%
      \or"30\or"31\or"32\or"33\or"34\or"35\or"36\or"37%
      \or"38\or"39\or"3A\or"3B\or"3C\or"3D\or"3E\or"3F%
      \or"40\or"41\or"42\or"43\or"44\or"45\or"46\or"47%
      \or"48\or"49\or"4A\or"4B\or"4C\or"4D\or"4E\or"4F%
      \or"50\or"51\or"52\or"53\or"54\or"55\or"56\or"57%
      \or"58\or"59\or"5A\or"5B\or"5C\or"5D\or"5E\or"5F%
      \or"60\or"61\or"62\or"63\or"64\or"65\or"66\or"67%
      \or"68\or"69\or"6A\or"6B\or"6C\or"6D\or"6E\or"6F%
      \or"70\or"71\or"72\or"73\or"74\or"75\or"76\or"77%
      \or"78\or"79\or"7A\or"7B\or"7C\or"7D\or"7E\or"7F%
      \or"80\or"81\or"82\or"83\or"84\or"85\or"86\or"87%
      \or"88\or"89\or"8A\or"8B\or"8C\or"8D\or"8E\or"8F%
      \or"90\or"91\or"92\or"93\or"94\or"95\or"96\or"97%
      \or"98\or"99\or"9A\or"9B\or"9C\or"9D\or"9E\or"9F%
      \or"A0\or"A1\or"A2\or"A3\or"A4\or"A5\or"A6\or"A7%
      \or"A8\or"A9\or"AA\or"AB\or"AC\or"AD\or"AE\or"AF%
      \or"B0\or"B1\or"B2\or"B3\or"B4\or"B5\or"B6\or"B7%
      \or"B8\or"B9\or"BA\or"BB\or"BC\or"BD\or"BE\or"BF%
      \or"C0\or"C1\or"C2\or"C3\or"C4\or"C5\or"C6\or"C7%
      \or"C8\or"C9\or"CA\or"CB\or"CC\or"CD\or"CE\or"CF%
      \or"D0\or"D1\or"D2\or"D3\or"D4\or"D5\or"D6\or"D7%
      \or"D8\or"D9\or"DA\or"DB\or"DC\or"DD\or"DE\or"DF%
      \or"E0\or"E1\or"E2\or"E3\or"E4\or"E5\or"E6\or"E7%
      \or"E8\or"E9\or"EA\or"EB\or"EC\or"ED\or"EE\or"EF%
      \or"F0\or"F1\or"F2\or"F3\or"F4\or"F5\or"F6\or"F7%
      \or"F8\or"F9\or"FA\or"FB\or"FC\or"FD\or"FE\or"FF%
      \fi
    }%
  \else
    \gdef\hv@pdf@char{\char'}%
  \fi
\endgroup
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\@@BOOKMARK}
%    \begin{macrocode}
\def\@@BOOKMARK[#1][#2]#3#4#5{%
  \expandafter\edef\csname @count@#3\endcsname{%
    \the\@serial@counter
  }%
  \edef\@mycount{\the\@serial@counter}%
  \Hy@StepCount\@serial@counter
  \edef\@parcount{%
    \expandafter\ifx\csname @count@#5\endcsname\relax
      0%
    \else
      \csname @count@#5\endcsname
    \fi
  }%
  \immediate\special{%
    !outline \HyperDestNameFilter{#3};p=\@parcount,i=\@mycount,%
    s=\ifx#2-c\else o\fi,t=#4%
  }%
}%
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\ReadBookmarks}
%    \begin{macrocode}
\def\ReadBookmarks{%
  \begingroup
    \def\0{\hv@pdf@char 0}%
    \def\1{\hv@pdf@char 1}%
    \def\2{\hv@pdf@char 2}%
    \def\3{\hv@pdf@char 3}%
    \def\({(}%
    \def\){)}%
    \def\do##1{%
      \ifnum\catcode`##1=\active
        \@makeother##1%
      \else
        \ifnum\catcode`##1=6 %
          \@makeother##1%
        \fi
      \fi
    }%
    \dospecials
    \Hy@safe@activestrue
    \InputIfFileExists{\jobname.out}{}{}%
  \endgroup
  \ifx\WriteBookmarks\relax
  \else
    \if@filesw
      \newwrite\@outlinefile
      \Hy@OutlineRerunCheck
      \immediate\openout\@outlinefile=\jobname.out\relax
      \ifHy@typexml
        \immediate\write\@outlinefile{<relaxxml>\relax}%
      \fi
    \fi
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
%</vtex>
%    \end{macrocode}
%    \begin{macrocode}
%<*!vtex>
\def\ReadBookmarks{%
  \pdf@ifdraftmode{}{%
    \begingroup
      \def\do##1{%
        \ifnum\catcode`##1=\active
          \@makeother##1%
        \else
          \ifnum\catcode`##1=6 %
            \@makeother##1%
          \fi
        \fi
      }%
      \dospecials
      \Hy@safe@activestrue
      \escapechar=`\\%
      \def\@@BOOKMARK[##1][##2]##3##4##5{%
        \calc@bm@number{##5}%
      }%
      \InputIfFileExists{\jobname.out}{}{}%
      \ifx\WriteBookmarks\relax
        \global\let\WriteBookmarks\relax
      \fi
      \def\@@BOOKMARK[##1][##2]##3##4##5{%
        \def\Hy@temp{##4}%
%<*pdftex>
        \Hy@pstringdef\Hy@pstringName{\HyperDestNameFilter{##3}}%
        \Hy@OutlineName{}\Hy@pstringName{%
          ##2\check@bm@number{##3}%
        }{%
          \expandafter\strip@prefix\meaning\Hy@temp
        }%
%</pdftex>
%<*pdfmark>
        \pdfmark{%
          pdfmark=/OUT,%
          Count={##2\check@bm@number{##3}},%
          Dest={##3},%
          Title=\expandafter\strip@prefix\meaning\Hy@temp
        }%
%</pdfmark>
%<*dvipdfm|xetex>
        \Hy@pstringdef\Hy@pstringName{\HyperDestNameFilter{##3}}%
        \@pdfm@mark{%
          outline \ifHy@DvipdfmxOutlineOpen
                    [%
                    \ifnum##21>\z@
                    \else
                      -%
                    \fi
                    ] %
                  \fi
                  ##1<<%
            /Title(\expandafter\strip@prefix\meaning\Hy@temp)%
            /A<<%
              /S/GoTo%
              /D(\Hy@pstringName)%
            >>%
          >>%
        }%
%</dvipdfm|xetex>
      }%
      \begingroup
        \def\WriteBookmarks{0}%
        \InputIfFileExists{\jobname.out}{}{}%
      \endgroup
      %{\escapechar\m@ne\InputIfFileExists{\jobname.out}{}{}}%
    \endgroup
  }%
  \ifx\WriteBookmarks\relax
  \else
    \if@filesw
      \newwrite\@outlinefile
      \Hy@OutlineRerunCheck
      \immediate\openout\@outlinefile=\jobname.out\relax
      \ifHy@typexml
        \immediate\write\@outlinefile{<relaxxml>\relax}%
      \fi
    \fi
  \fi
}
%<*pdftex>
\def\Hy@OutlineName#1#2#3#4{%
  \pdfoutline goto name{#2}count#3{#4}%
}
%</pdftex>
\def\check@bm@number#1{%
  \expandafter\ifx\csname B_#1\endcsname\relax
    0%
  \else
    \csname B_#1\endcsname
  \fi
}
\def\calc@bm@number#1{%
  \@tempcnta=\check@bm@number{#1}\relax
  \advance\@tempcnta by 1 %
  \expandafter\xdef\csname B_#1\endcsname{\the\@tempcnta}%
}
%</!vtex>
%    \end{macrocode}
%
%    \begin{macrocode}
\ifHy@implicit
\else
  \expandafter\endinput
\fi
%    \end{macrocode}
%
%    \begin{macrocode}
%</outlines>
%<*outlines|hypertex>
%    \end{macrocode}
%    \begin{macrocode}
\newlength\Hy@SectionHShift
\def\Hy@SectionAnchorHref#1{%
  \ifx\protect\@typeset@protect
    \Hy@@SectionAnchor{#1}%
  \fi
}
\DeclareRobustCommand*{\Hy@@SectionAnchor}[1]{%
  \leavevmode
  \hbox to 0pt{%
    \kern-\Hy@SectionHShift
    \Hy@raisedlink{%
      \hyper@anchorstart{#1}\hyper@anchorend
    }%
    \hss
  }%
}
\let\H@old@ssect\@ssect
\def\@ssect#1#2#3#4#5{%
  \Hy@MakeCurrentHrefAuto{section*}%
  \setlength{\Hy@SectionHShift}{#1}%
  \begingroup
    \toks@{\H@old@ssect{#1}{#2}{#3}{#4}}%
    \toks\tw@\expandafter{%
      \expandafter\Hy@SectionAnchorHref\expandafter{\@currentHref}%
      #5%
    }%
  \edef\x{\endgroup
    \the\toks@{\the\toks\tw@}%
  }\x
}
\let\H@old@schapter\@schapter
\def\@schapter#1{%
  \begingroup
    \let\@mkboth\@gobbletwo
    \Hy@MakeCurrentHrefAuto{\Hy@chapapp*}%
    \Hy@raisedlink{%
      \hyper@anchorstart{\@currentHref}\hyper@anchorend
    }%
  \endgroup
  \H@old@schapter{#1}%
}
%    \end{macrocode}
%    If there is no chapter number (\cmd{\frontmatter} or
%    \cmd{\backmatter}) then |\refstepcounter{chapter}| is not
%    executed, so there will be no destination for \cmd{addcontentsline}.
%    So \cmd{\@chapter} is overloaded to avoid this:
%    \begin{macrocode}
\ltx@IfUndefined{@chapter}{}{%
  \let\Hy@org@chapter\@chapter
  \def\@chapter{%
    \def\Hy@next{%
      \Hy@MakeCurrentHrefAuto{\Hy@chapapp*}%
      \Hy@raisedlink{%
        \hyper@anchorstart{\@currentHref}\hyper@anchorend
      }%
    }%
    \ifnum\c@secnumdepth>\m@ne
      \ltx@IfUndefined{if@mainmatter}%
      \iftrue{\csname if@mainmatter\endcsname}%
        \let\Hy@next\relax
      \fi
    \fi
    \Hy@next
    \Hy@org@chapter
  }%
}
%    \end{macrocode}
%    \begin{macrocode}
\let\H@old@part\@part
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname chapter\endcsname\relax
  \let\Hy@secnum@part\z@
\else
  \let\Hy@secnum@part\m@ne
\fi
\def\@part{%
  \ifnum\Hy@secnum@part>\c@secnumdepth
    \phantomsection
  \fi
  \H@old@part
}
%    \end{macrocode}
%    \begin{macrocode}
\let\H@old@spart\@spart
\def\@spart#1{%
  \Hy@MakeCurrentHrefAuto{part*}%
  \Hy@raisedlink{%
    \hyper@anchorstart{\@currentHref}\hyper@anchorend
  }%
  \H@old@spart{#1}%
}
\let\H@old@sect\@sect
\def\@sect#1#2#3#4#5#6[#7]#8{%
  \ifnum #2>\c@secnumdepth
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
  {%
    \Hy@MakeCurrentHrefAuto{section*}%
    \setlength{\Hy@SectionHShift}{#3}%
    \begingroup
      \toks@{\H@old@sect{#1}{#2}{#3}{#4}{#5}{#6}[{#7}]}%
      \toks\tw@\expandafter{%
        \expandafter\Hy@SectionAnchorHref\expandafter{\@currentHref}%
        #8%
      }%
    \edef\x{\endgroup
      \the\toks@{\the\toks\tw@}%
    }\x
  }{%
    \H@old@sect{#1}{#2}{#3}{#4}{#5}{#6}[{#7}]{#8}%
  }%
}
%    \end{macrocode}
%    \begin{macrocode}
%</outlines|hypertex>
%<*outlines>
%    \end{macrocode}
%
%    \begin{macrocode}
\expandafter\def\csname Parent-4\endcsname{}
\expandafter\def\csname Parent-3\endcsname{}
\expandafter\def\csname Parent-2\endcsname{}
\expandafter\def\csname Parent-1\endcsname{}
\expandafter\def\csname Parent0\endcsname{}
\expandafter\def\csname Parent1\endcsname{}
\expandafter\def\csname Parent2\endcsname{}
\expandafter\def\csname Parent3\endcsname{}
\expandafter\def\csname Parent4\endcsname{}
%    \end{macrocode}
%
%    \begin{macrocode}
%</outlines>
%    \end{macrocode}
%
% \section{Compatibility with koma-script classes}
%
%    \begin{macrocode}
%<*outlines|hypertex>
%    \end{macrocode}
%
% Hard-wire in an unpleasant over-ride of komascript `scrbook' class
% for Tobias Isenberg (\Email{Tobias.Isenberg@gmx.de}).
% With version 6.71b the hack is also applied to `scrreprt' class
% and is removed for koma-script versions since 2001/01/01,
% because Markus Kohm supports hyperref in komascript.
%    \begin{macrocode}
\def\Hy@tempa{%
  \def\@addchap[##1]##2{%
    \typeout{##2}%
    \if@twoside
      \@mkboth{##1}{}%
    \else
      \@mkboth{}{##1}%
    \fi
    \addtocontents{lof}{\protect\addvspace{10\p@}}%
    \addtocontents{lot}{\protect\addvspace{10\p@}}%
    \Hy@MakeCurrentHrefAuto{\Hy@chapapp*}%
    \Hy@raisedlink{%
      \hyper@anchorstart{\@currentHref}\hyper@anchorend
    }%
    \if@twocolumn
       \@topnewpage[\@makeschapterhead{##2}]%
    \else
       \@makeschapterhead{##2}%
       \@afterheading
    \fi
    \addcontentsline{toc}{chapter}{##1}%
  }%
}
\@ifclassloaded{scrbook}{%
  \@ifclasslater{scrbook}{2001/01/01}{%
    \let\Hy@tempa\@empty
  }{}%
}{%
  \@ifclassloaded{scrreprt}{%
    \@ifclasslater{scrreprt}{2001/01/01}{%
      \let\Hy@tempa\@empty
    }{}%
  }{%
    \let\Hy@tempa\@empty
  }%
}%
\Hy@tempa
%    \end{macrocode}
%
%    \begin{macrocode}
%</outlines|hypertex>
%    \end{macrocode}
%
% \section{Encoding definition files for encodings of PDF strings}
% This was contributed by
% Heiko Oberdiek.
%
% \subsection{PD1 encoding}
%    \begin{macrocode}
%<*pd1enc>
\DeclareFontEncoding{PD1}{}{}
%    \end{macrocode}
%    Accents
%    \begin{macrocode}
\DeclareTextAccent{\`}{PD1}{\textasciigrave}
\DeclareTextAccent{\'}{PD1}{\textacute}
\DeclareTextAccent{\^}{PD1}{\textasciicircum}
\DeclareTextAccent{\~}{PD1}{\texttilde}
\DeclareTextAccent{\"}{PD1}{\textasciidieresis}
\DeclareTextAccent{\r}{PD1}{\textring}
\DeclareTextAccent{\v}{PD1}{\textasciicaron}
\DeclareTextAccent{\.}{PD1}{\textdotaccent}
\DeclareTextAccent{\c}{PD1}{\textcedilla}
\DeclareTextAccent{\=}{PD1}{\textasciimacron}
\DeclareTextAccent{\b}{PD1}{\textmacronbelow}
\DeclareTextAccent{\d}{PD1}{\textdotbelow}
\DeclareTextCompositeCommand{\`}{PD1}{\@empty}{\textasciigrave}
\DeclareTextCompositeCommand{\'}{PD1}{\@empty}{\textacute}
\DeclareTextCompositeCommand{\^}{PD1}{\@empty}{\textasciicircum}
\DeclareTextCompositeCommand{\~}{PD1}{\@empty}{\texttilde}
\DeclareTextCompositeCommand{\"}{PD1}{\@empty}{\textasciidieresis}
\DeclareTextCompositeCommand{\r}{PD1}{\@empty}{\textring}
\DeclareTextCompositeCommand{\v}{PD1}{\@empty}{\textasciicaron}
\DeclareTextCompositeCommand{\.}{PD1}{\@empty}{\textdotaccent}
\DeclareTextCompositeCommand{\c}{PD1}{\@empty}{\textcedilla}
\DeclareTextCompositeCommand{\=}{PD1}{\@empty}{\textasciimacron}
\DeclareTextCompositeCommand{\b}{PD1}{\@empty}{\textmacronbelow}
\DeclareTextCompositeCommand{\d}{PD1}{\@empty}{\textdotbelow}
\DeclareTextCompositeCommand{\`}{PD1}{\ }{\textasciigrave}
\DeclareTextCompositeCommand{\'}{PD1}{\ }{\textacute}
\DeclareTextCompositeCommand{\^}{PD1}{\ }{\textasciicircum}
\DeclareTextCompositeCommand{\~}{PD1}{\ }{\texttilde}
\DeclareTextCompositeCommand{\"}{PD1}{\ }{\textasciidieresis}
\DeclareTextCompositeCommand{\r}{PD1}{\ }{\textring}
\DeclareTextCompositeCommand{\v}{PD1}{\ }{\textasciicaron}
\DeclareTextCompositeCommand{\.}{PD1}{\ }{\textdotaccent}
\DeclareTextCompositeCommand{\c}{PD1}{\ }{\textcedilla}
\DeclareTextCompositeCommand{\=}{PD1}{\ }{\textasciimacron}
\DeclareTextCompositeCommand{\b}{PD1}{\ }{\textmacronbelow}
\DeclareTextCompositeCommand{\d}{PD1}{\ }{\textdotbelow}
\DeclareTextCommand{\k}{PD1}[1]{\TextSymbolUnavailable{\k{#1}}#1}
\DeclareTextCommand{\t}{PD1}[1]{\TextSymbolUnavailable{\t{#1}}#1}
\DeclareTextCommand{\newtie}{PD1}[1]{%
  \TextSymbolUnavailable{\newtie{#1}}#1%
}
%    \end{macrocode}
%    Special white space escape characters
%    not for use in bookmarks but for other PDF strings.
%    \begin{macrocode}
% U+0009 (CHARACTER TABULATION)
\DeclareTextCommand{\textHT}{PD1}{\011}% U+0009
% U+000A (LINE FEED)
\DeclareTextCommand{\textLF}{PD1}{\012}% U+000A
% U+000D (CARRIAGE RETURN)
\DeclareTextCommand{\textCR}{PD1}{\015}% U+000D
%    \end{macrocode}
%    Accent glyph names
%    \begin{macrocode}
% U+02D8 BREVE; breve
\DeclareTextCommand{\textasciibreve}{PD1}{\030}% U+02D8
% U+02C7 CARON; caron
\DeclareTextCommand{\textasciicaron}{PD1}{\031}% U+02C7
% U+02C6 MODIFIER LETTER CIRCUMFLEX ACCENT; circumflex
\DeclareTextCommand{\textcircumflex}{PD1}{\032}% U+02C6
% U+02D9 DOT ABOVE; dotaccent
\DeclareTextCommand{\textdotaccent}{PD1}{\033}% U+02D9
% U+02DD DOUBLE ACUTE ACCENT; hungarumlaut
\DeclareTextCommand{\texthungarumlaut}{PD1}{\034}% U+02DD
% U+02DB OGONEK; ogonek
\DeclareTextCommand{\textogonek}{PD1}{\035}% U+02DB
% U+02DA RING ABOVE; ring
\DeclareTextCommand{\textring}{PD1}{\036}% U+02DA
% U+02DC SMALL TILDE; ilde, *tilde
\DeclareTextCommand{\texttilde}{PD1}{\037}% U+02DC
%    \end{macrocode}
%    \cs{040}: U+0020 SPACE; *space, spacehackarabic\\
%    \cs{041}: U+0021 EXCLAMATION MARK; exclam
%    \begin{macrocode}
% U+0022 QUOTATION MARK; quotedbl
\DeclareTextCommand{\textquotedbl}{PD1}{\string"}% \042 U+0022
% U+0023 NUMBER SIGN; numbersign
\DeclareTextCommand{\textnumbersign}{PD1}{\043}% U+0023
% U+0024 DOLLAR SIGN; dollar
\DeclareTextCommand{\textdollar}{PD1}{\044}% U+0024
% U+0025 PERCENT SIGN; percent
\DeclareTextCommand{\textpercent}{PD1}{\045}% U+0025
% U+0026 AMPERSAND; ampersand
\DeclareTextCommand{\textampersand}{PD1}{\046}% U+0026
%    \end{macrocode}
%    \cs{047}: U+0027 APOSTROPHE; quotesingle\\
%    \begin{macrocode}
% U+0028 LEFT PARENTHESIS; parenleft
\DeclareTextCommand{\textparenleft}{PD1}{\string\(}% \050 U+0028
% U+0029 RIGHT PARENTHESIS; parenright
\DeclareTextCommand{\textparenright}{PD1}{\string\)}% \051 U+0029
%    \end{macrocode}
%    \cs{052}: U+002A ASTERISK; asterisk\\
%    \cs{053}: U+002B PLUS SIGN; plus\\
%    \cs{054}: U+002C COMMA; comma\\
%    \cs{055}: U+002D HYPHEN-MINUS; hyphen\\
%    \cs{056}: U+002E FULL STOP; period
%    \begin{macrocode}
% U+002E FULL STOP; period
\DeclareTextCommand{\textdotbelow}{PD1}{.}% \056 U+002E
%    \end{macrocode}
%    \cs{057}: % U+002F SOLIDUS; slash\\
%    \cs{060}: U+0030 DIGIT ZERO; zero\\
%    \dots\\
%    \cs{071}: U+0039 DIGIT NINE; nine\\
%    \cs{072}: U+003A COLON; colon\\
%    \cs{073}: U+003B SEMICOLON; semicolon
%    \begin{macrocode}
% U+003C LESS-THAN SIGN; less
\DeclareTextCommand{\textless}{PD1}{<}% \074 U+003C
%    \end{macrocode}
%    \cs{075}: U+003D EQUALS SIGN; equal
%    \begin{macrocode}
% U+003E GREATER-THAN SIGN; greater
\DeclareTextCommand{\textgreater}{PD1}{>}% \076 U+003E
%    \end{macrocode}
%    \cs{077}: U+003F QUESTION MARK; question\\
%    \cs{100}: U+0040 COMMERCIAL AT; at\\
%    \cs{101}: U+0041 LATIN CAPITAL LETTER A; A\\
%    \dots\\
%    \cs{132}: U+005A LATIN CAPITAL LETTER Z; Z\\
%    \cs{133}: U+005B LEFT SQUARE BRACKET; bracketleft
%    \begin{macrocode}
% U+005C REVERSE SOLIDUS; backslash
\DeclareTextCommand{\textbackslash}{PD1}{\134}% U+005C
%    \end{macrocode}
%    \cs{135}: U+005D RIGHT SQUARE BRACKET; bracketright
%    \begin{macrocode}
% U+005E CIRCUMFLEX ACCENT; asciicircum
\DeclareTextCommand{\textasciicircum}{PD1}{\136}% U+005E
% U+005F LOW LINE; underscore
\DeclareTextCommand{\textunderscore}{PD1}{\137}% U+005F
\DeclareTextCommand{\textmacronbelow}{PD1}{\137}% U+005F
% U+0060 GRAVE ACCENT; grave
\DeclareTextCommand{\textasciigrave}{PD1}{\140}% U+0060
%    \end{macrocode}
%    \cs{141}: U+0061 LATIN SMALL LETTER A; a\\
%    \dots\\
%    \cs{150}: U+0068 LATIN SMALL LETTER H; h
%    \begin{macrocode}
% U+0069 LATIN SMALL LETTER I; i
\DeclareTextCompositeCommand{\.}{PD1}{i}{i}% \151 U+0069
%    \end{macrocode}
%    \cs{152}: U+006A LATIN SMALL LETTER J; j\\
%    \dots\\
%    \cs{172}: U+007A LATIN SMALL LETTER Z; z
%    \begin{macrocode}
% U+007B LEFT CURLY BRACKET; braceleft
\DeclareTextCommand{\textbraceleft}{PD1}{\173}% U+007B
% U+007C VERTICAL LINE; *bar, verticalbar
\DeclareTextCommand{\textbar}{PD1}{|}% U+007C
% U+007D RIGHT CURLY BRACKET; braceright
\DeclareTextCommand{\textbraceright}{PD1}{\175}% U+007D
% U+007E TILDE; asciitilde
\DeclareTextCommand{\textasciitilde}{PD1}{\176}% U+007E
%    \end{macrocode}
%    Slot \cs{177} (0x7F) is undefined in PDFDocEncoding.
%    \begin{macrocode}
% U+2022 BULLET; bullet
\DeclareTextCommand{\textbullet}{PD1}{\200}% U+2022
% U+2020 DAGGER; dagger
\DeclareTextCommand{\textdagger}{PD1}{\201}% U+2020
% U+2021 DOUBLE DAGGER; daggerdbl
\DeclareTextCommand{\textdaggerdbl}{PD1}{\202}% U+2021
% U+2026 HORIZONTAL ELLIPSIS; ellipsis
\DeclareTextCommand{\textellipsis}{PD1}{\203}% U+2026
% U+2014 EM DASH; emdash
\DeclareTextCommand{\textemdash}{PD1}{\204}% U+2014
% U+2013 EN DASH; endash
\DeclareTextCommand{\textendash}{PD1}{\205}% U+2013
% U+0192 LATIN SMALL LETTER F WITH HOOK; florin
\DeclareTextCommand{\textflorin}{PD1}{\206}% U+0192
% U+2044 FRACTION SLASH; fraction
\DeclareTextCommand{\textfractionsolidus}{PD1}{\207}% U+2044
% U+2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK; guilsinglleft
\DeclareTextCommand{\guilsinglleft}{PD1}{\210}% U+2039
% U+203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK; guilsinglright
\DeclareTextCommand{\guilsinglright}{PD1}{\211}% U+203A
% U+2212 MINUS SIGN; minus
\DeclareTextCommand{\textminus}{PD1}{\212}% U+2212
% U+2030 PER MILLE SIGN; perthousand
\DeclareTextCommand{\textperthousand}{PD1}{\213}% U+2030
% U+201E DOUBLE LOW-9 QUOTATION MARK; quotedblbase
\DeclareTextCommand{\quotedblbase}{PD1}{\214}% U+201E
% U+201C LEFT DOUBLE QUOTATION MARK; quotedblleft
\DeclareTextCommand{\textquotedblleft}{PD1}{\215}% U+201C
% U+201D RIGHT DOUBLE QUOTATION MARK; quotedblright
\DeclareTextCommand{\textquotedblright}{PD1}{\216}% U+201D
% U+2018 LEFT SINGLE QUOTATION MARK; quoteleft
\DeclareTextCommand{\textquoteleft}{PD1}{\217}% U+2018
% U+2019 RIGHT SINGLE QUOTATION MARK; quoteright
\DeclareTextCommand{\textquoteright}{PD1}{\220}% U+2019
% U+201A SINGLE LOW-9 QUOTATION MARK; quotesinglbase
\DeclareTextCommand{\quotesinglbase}{PD1}{\221}% U+201A
% U+2122 TRADE MARK SIGN; trademark
\DeclareTextCommand{\texttrademark}{PD1}{\222}% U+2122
% U+FB01 LATIN SMALL LIGATURE FI; fi
\DeclareTextCommand{\textfi}{PD1}{\223}% U+FB01
% U+FB02 LATIN SMALL LIGATURE FL; fl
\DeclareTextCommand{\textfl}{PD1}{\224}% U+FB02
% U+0141 LATIN CAPITAL LETTER L WITH STROKE; Lslash
\DeclareTextCommand{\L}{PD1}{\225}% U+0141
% U+0152 LATIN CAPITAL LIGATURE OE; OE
\DeclareTextCommand{\OE}{PD1}{\226}% U+0152
% U+0160 LATIN CAPITAL LETTER S WITH CARON; Scaron
\DeclareTextCompositeCommand{\v}{PD1}{S}{\227}% U+0160
% U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS; Ydieresis
\DeclareTextCompositeCommand{\"}{PD1}{Y}{\230}% U+0178
\DeclareTextCommand{\IJ}{PD1}{\230}
% U+017D LATIN CAPITAL LETTER Z WITH CARON; Zcaron
\DeclareTextCompositeCommand{\v}{PD1}{Z}{\231}% U+017D
% U+0131 LATIN SMALL LETTER DOTLESS I; dotlessi
\DeclareTextCommand{\i}{PD1}{\232}% U+0131
% U+0142 LATIN SMALL LETTER L WITH STROKE; lslash
\DeclareTextCommand{\l}{PD1}{\233}% U+0142
% U+0153 LATIN SMALL LIGATURE OE; oe
\DeclareTextCommand{\oe}{PD1}{\234}% U+0153
% U+0161 LATIN SMALL LETTER S WITH CARON; scaron
\DeclareTextCompositeCommand{\v}{PD1}{s}{\235}% U+0161
% U+017E LATIN SMALL LETTER Z WITH CARON; zcaron
\DeclareTextCompositeCommand{\v}{PD1}{z}{\236}% U+017E
%    \end{macrocode}
%    Slot \cs{237} (0x9F) is not defined in PDFDocEncoding.\\
%    The euro \cs{240} is inserted in version 1.3 of the pdf
%    specification.
%    \begin{macrocode}
% U+20AC EURO SIGN; *Euro, euro
\DeclareTextCommand{\texteuro}{PD1}{\240}% U+20AC
% U+00A1 INVERTED EXCLAMATION MARK; exclamdown
\DeclareTextCommand{\textexclamdown}{PD1}{\241}% U+00A1
% U+00A2 CENT SIGN; cent
\DeclareTextCommand{\textcent}{PD1}{\242}% U+00A2
% U+00A3 POUND SIGN; sterling
\DeclareTextCommand{\textsterling}{PD1}{\243}% U+00A3
% U+00A4 CURRENCY SIGN; currency
\DeclareTextCommand{\textcurrency}{PD1}{\244}% U+00A4
% U+00A5 YEN SIGN; yen
\DeclareTextCommand{\textyen}{PD1}{\245}% U+00A5
% U+00A6 BROKEN BAR; brokenbar
\DeclareTextCommand{\textbrokenbar}{PD1}{\246}% U+00A6
% U+00A7 SECTION SIGN; section
\DeclareTextCommand{\textsection}{PD1}{\247}% U+00A7
% U+00A8 DIAERESIS; dieresis
\DeclareTextCommand{\textasciidieresis}{PD1}{\250}% U+00A8
% U+00A9 COPYRIGHT SIGN; copyright
\DeclareTextCommand{\textcopyright}{PD1}{\251}% U+00A9
% U+00AA FEMININE ORDINAL INDICATOR; ordfeminine
\DeclareTextCommand{\textordfeminine}{PD1}{\252}% U+00AA
% U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK; guillemotleft
\DeclareTextCommand{\guillemotleft}{PD1}{\253}% U+00AB
% U+00AC NOT SIGN; logicalnot
\DeclareTextCommand{\textlogicalnot}{PD1}{\254}% U+00AC
\DeclareTextCommand{\textlnot}{PD1}{\254}% logical not
%    \end{macrocode}
%    No glyph \cs{255} in PDFDocEncoding.
%    \begin{macrocode}
% U+00AE REGISTERED SIGN; registered
\DeclareTextCommand{\textregistered}{PD1}{\256}% U+00AE
% U+00AF MACRON; *macron, overscore
\DeclareTextCommand{\textasciimacron}{PD1}{\257}% U+00AF
% U+00B0 DEGREE SIGN; degree
\DeclareTextCommand{\textdegree}{PD1}{\260}% U+00B0
% U+00B1 PLUS-MINUS SIGN; plusminus
\DeclareTextCommand{\textplusminus}{PD1}{\261}% U+00B1
% U+00B2 SUPERSCRIPT TWO; twosuperior
\DeclareTextCommand{\texttwosuperior}{PD1}{\262}% U+00B2
% U+00B3 SUPERSCRIPT THREE; threesuperior
\DeclareTextCommand{\textthreesuperior}{PD1}{\263}% U+00B3
% U+00B4 ACUTE ACCENT; acute
\DeclareTextCommand{\textacute}{PD1}{\264}% U+00B4
% U+00B5 MICRO SIGN; mu, mu1
\DeclareTextCommand{\textmu}{PD1}{\265}% U+00B5
% U+00B6 PILCROW SIGN; paragraph
\DeclareTextCommand{\textparagraph}{PD1}{\266}% U+00B6
% U+00B7 MIDDLE DOT; middot, *periodcentered
\DeclareTextCommand{\textperiodcentered}{PD1}{\267}% U+00B7
% U+00B8 CEDILLA; cedilla
\DeclareTextCommand{\textcedilla}{PD1}{\270}% U+00B8
% U+00B9 SUPERSCRIPT ONE; onesuperior
\DeclareTextCommand{\textonesuperior}{PD1}{\271}% U+00B9
% U+00BA MASCULINE ORDINAL INDICATOR; ordmasculine
\DeclareTextCommand{\textordmasculine}{PD1}{\272}% U+00BA
% U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK; guillemotright
\DeclareTextCommand{\guillemotright}{PD1}{\273}% U+00BB
% U+00BC VULGAR FRACTION ONE QUARTER; onequarter
\DeclareTextCommand{\textonequarter}{PD1}{\274}% U+00BC
% U+00BD VULGAR FRACTION ONE HALF; onehalf
\DeclareTextCommand{\textonehalf}{PD1}{\275}% U+00BD
% U+00BE VULGAR FRACTION THREE QUARTERS; threequarters
\DeclareTextCommand{\textthreequarters}{PD1}{\276}% U+00BE
% U+00BF INVERTED QUESTION MARK; questiondown
\DeclareTextCommand{\textquestiondown}{PD1}{\277}% U+00BF
% U+00C0 LATIN CAPITAL LETTER A WITH GRAVE; Agrave
\DeclareTextCompositeCommand{\`}{PD1}{A}{\300}% U+00C0
% U+00C1 LATIN CAPITAL LETTER A WITH ACUTE; Aacute
\DeclareTextCompositeCommand{\'}{PD1}{A}{\301}% U+00C1
% U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX; Acircumflex
\DeclareTextCompositeCommand{\^}{PD1}{A}{\302}% U+00C2
% U+00C3 LATIN CAPITAL LETTER A WITH TILDE; Atilde
\DeclareTextCompositeCommand{\~}{PD1}{A}{\303}% U+00C3
% U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS; Adieresis
\DeclareTextCompositeCommand{\"}{PD1}{A}{\304}% U+00C4
% U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE; Aring
\DeclareTextCompositeCommand{\r}{PD1}{A}{\305}% U+00C5
% U+00C6 LATIN CAPITAL LETTER AE; AE
\DeclareTextCommand{\AE}{PD1}{\306}% U+00C6
% U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA; Ccedilla
\DeclareTextCompositeCommand{\c}{PD1}{C}{\307}% U+00C7
% U+00C8 LATIN CAPITAL LETTER E WITH GRAVE; Egrave
\DeclareTextCompositeCommand{\`}{PD1}{E}{\310}% U+00C8
% U+00C9 LATIN CAPITAL LETTER E WITH ACUTE; Eacute
\DeclareTextCompositeCommand{\'}{PD1}{E}{\311}% U+00C9
% U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX; Ecircumflex
\DeclareTextCompositeCommand{\^}{PD1}{E}{\312}% U+00CA
% U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS; Edieresis
\DeclareTextCompositeCommand{\"}{PD1}{E}{\313}% U+00CB
% U+00CC LATIN CAPITAL LETTER I WITH GRAVE; Igrave
\DeclareTextCompositeCommand{\`}{PD1}{I}{\314}% U+00CC
% U+00CD LATIN CAPITAL LETTER I WITH ACUTE; Iacute
\DeclareTextCompositeCommand{\'}{PD1}{I}{\315}% U+00CD
% U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX; Icircumflex
\DeclareTextCompositeCommand{\^}{PD1}{I}{\316}% U+00CE
% U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS; Idieresis
\DeclareTextCompositeCommand{\"}{PD1}{I}{\317}% U+00CF
% U+00D0 LATIN CAPITAL LETTER ETH; Eth
\DeclareTextCommand{\DH}{PD1}{\320}% U+00D0
\DeclareTextCommand{\DJ}{PD1}{\320}% U+00D0
% U+00D1 LATIN CAPITAL LETTER N WITH TILDE; Ntilde
\DeclareTextCompositeCommand{\~}{PD1}{N}{\321}% U+00D1
% U+00D2 LATIN CAPITAL LETTER O WITH GRAVE; Ograve
\DeclareTextCompositeCommand{\`}{PD1}{O}{\322}% U+00D2
% U+00D3 LATIN CAPITAL LETTER O WITH ACUTE; Oacute
\DeclareTextCompositeCommand{\'}{PD1}{O}{\323}% U+00D3
% U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX; Ocircumflex
\DeclareTextCompositeCommand{\^}{PD1}{O}{\324}% U+00D4
% U+00D5 LATIN CAPITAL LETTER O WITH TILDE; Otilde
\DeclareTextCompositeCommand{\~}{PD1}{O}{\325}% U+00D5
% U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS; Odieresis
\DeclareTextCompositeCommand{\"}{PD1}{O}{\326}% U+00D6
% U+00D7 MULTIPLICATION SIGN; multiply
\DeclareTextCommand{\textmultiply}{PD1}{\327}% U+00D7
% U+00D8 LATIN CAPITAL LETTER O WITH STROKE; Oslash
\DeclareTextCommand{\O}{PD1}{\330}% U+00D8
% U+00D9 LATIN CAPITAL LETTER U WITH GRAVE; Ugrave
\DeclareTextCompositeCommand{\`}{PD1}{U}{\331}% U+00D9
% U+00DA LATIN CAPITAL LETTER U WITH ACUTE; Uacute
\DeclareTextCompositeCommand{\'}{PD1}{U}{\332}% U+00DA
% U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX; Ucircumflex
\DeclareTextCompositeCommand{\^}{PD1}{U}{\333}% U+00DB
% U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS; Udieresis
\DeclareTextCompositeCommand{\"}{PD1}{U}{\334}% U+00DC
% U+00DD LATIN CAPITAL LETTER Y WITH ACUTE; Yacute
\DeclareTextCompositeCommand{\'}{PD1}{Y}{\335}% U+00DD
% U+00DE LATIN CAPITAL LETTER THORN; Thorn
\DeclareTextCommand{\TH}{PD1}{\336}% U+00DE
% U+00DF LATIN SMALL LETTER SHARP S; germandbls
\DeclareTextCommand{\ss}{PD1}{\337}% U+00DF
% U+00E0 LATIN SMALL LETTER A WITH GRAVE; agrave
\DeclareTextCompositeCommand{\`}{PD1}{a}{\340}% U+00E0
% U+00E1 LATIN SMALL LETTER A WITH ACUTE; aacute
\DeclareTextCompositeCommand{\'}{PD1}{a}{\341}% U+00E1
% U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX; acircumflex
\DeclareTextCompositeCommand{\^}{PD1}{a}{\342}% U+00E2
% U+00E3 LATIN SMALL LETTER A WITH TILDE; atilde
\DeclareTextCompositeCommand{\~}{PD1}{a}{\343}% U+00E3
% U+00E4 LATIN SMALL LETTER A WITH DIAERESIS; adieresis
\DeclareTextCompositeCommand{\"}{PD1}{a}{\344}% U+00E4
% U+00E5 LATIN SMALL LETTER A WITH RING ABOVE; aring
\DeclareTextCompositeCommand{\r}{PD1}{a}{\345}% U+00E5
% U+00E6 LATIN SMALL LETTER AE; ae
\DeclareTextCommand{\ae}{PD1}{\346}% U+00E6
% U+00E7 LATIN SMALL LETTER C WITH CEDILLA; ccedilla
\DeclareTextCompositeCommand{\c}{PD1}{c}{\347}% U+00E7
% U+00E8 LATIN SMALL LETTER E WITH GRAVE; egrave
\DeclareTextCompositeCommand{\`}{PD1}{e}{\350}% U+00E8
% U+00E9 LATIN SMALL LETTER E WITH ACUTE; eacute
\DeclareTextCompositeCommand{\'}{PD1}{e}{\351}% U+00E9
% U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX; ecircumflex
\DeclareTextCompositeCommand{\^}{PD1}{e}{\352}% U+00EA
% U+00EB LATIN SMALL LETTER E WITH DIAERESIS; edieresis
\DeclareTextCompositeCommand{\"}{PD1}{e}{\353}% U+00EB
% U+00EC LATIN SMALL LETTER I WITH GRAVE; igrave
\DeclareTextCompositeCommand{\`}{PD1}{i}{\354}% U+00EC
\DeclareTextCompositeCommand{\`}{PD1}{\i}{\354}% U+00EC
% U+00ED LATIN SMALL LETTER I WITH ACUTE; iacute
\DeclareTextCompositeCommand{\'}{PD1}{i}{\355}% U+00ED
\DeclareTextCompositeCommand{\'}{PD1}{\i}{\355}% U+00ED
% U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX; icircumflex
\DeclareTextCompositeCommand{\^}{PD1}{i}{\356}% U+00EE
\DeclareTextCompositeCommand{\^}{PD1}{\i}{\356}% U+00EE
% U+00EF LATIN SMALL LETTER I WITH DIAERESIS; idieresis
\DeclareTextCompositeCommand{\"}{PD1}{i}{\357}% U+00EF
\DeclareTextCompositeCommand{\"}{PD1}{\i}{\357}% U+00EF
% U+00F0 LATIN SMALL LETTER ETH; eth
\DeclareTextCommand{\dh}{PD1}{\360}% U+00F0
% U+00F1 LATIN SMALL LETTER N WITH TILDE; ntilde
\DeclareTextCompositeCommand{\~}{PD1}{n}{\361}% U+00F1
% U+00F2 LATIN SMALL LETTER O WITH GRAVE; ograve
\DeclareTextCompositeCommand{\`}{PD1}{o}{\362}% U+00F2
% U+00F3 LATIN SMALL LETTER O WITH ACUTE; oacute
\DeclareTextCompositeCommand{\'}{PD1}{o}{\363}% U+00F3
% U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX; ocircumflex
\DeclareTextCompositeCommand{\^}{PD1}{o}{\364}% U+00F4
% U+00F5 LATIN SMALL LETTER O WITH TILDE; otilde
\DeclareTextCompositeCommand{\~}{PD1}{o}{\365}% U+00F5
% U+00F6 LATIN SMALL LETTER O WITH DIAERESIS; odieresis
\DeclareTextCompositeCommand{\"}{PD1}{o}{\366}% U+00F6
% U+00F7 DIVISION SIGN; divide
\DeclareTextCommand{\textdivide}{PD1}{\367}% U+00F7
% U+00F8 LATIN SMALL LETTER O WITH STROKE; oslash
\DeclareTextCommand{\o}{PD1}{\370}% U+00F8
% U+00F9 LATIN SMALL LETTER U WITH GRAVE; ugrave
\DeclareTextCompositeCommand{\`}{PD1}{u}{\371}% U+00F9
% U+00FA LATIN SMALL LETTER U WITH ACUTE; uacute
\DeclareTextCompositeCommand{\'}{PD1}{u}{\372}% U+00FA
% U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX; ucircumflex
\DeclareTextCompositeCommand{\^}{PD1}{u}{\373}% U+00FB
% U+00FC LATIN SMALL LETTER U WITH DIAERESIS; udieresis
\DeclareTextCompositeCommand{\"}{PD1}{u}{\374}% U+00FC
% U+00FD LATIN SMALL LETTER Y WITH ACUTE; yacute
\DeclareTextCompositeCommand{\'}{PD1}{y}{\375}% U+00FD
% U+00FE LATIN SMALL LETTER THORN; thorn
\DeclareTextCommand{\th}{PD1}{\376}% U+00FE
% U+00FF LATIN SMALL LETTER Y WITH DIAERESIS; ydieresis
\DeclareTextCompositeCommand{\"}{PD1}{y}{\377}% U+00FF
\DeclareTextCommand{\ij}{PD1}{\377}% U+00FF
%    \end{macrocode}
%    Glyphs that consist of several characters.
%    \begin{macrocode}
\DeclareTextCommand{\SS}{PD1}{SS}
\DeclareTextCommand{\textcelsius}{PD1}{\textdegree C}
%    \end{macrocode}
%    Aliases (german.sty)
%    \begin{macrocode}
\DeclareTextCommand{\textglqq}{PD1}{\quotedblbase}
\DeclareTextCommand{\textgrqq}{PD1}{\textquotedblleft}
\DeclareTextCommand{\textglq}{PD1}{\quotesinglbase}
\DeclareTextCommand{\textgrq}{PD1}{\textquoteleft}
\DeclareTextCommand{\textflqq}{PD1}{\guillemotleft}
\DeclareTextCommand{\textfrqq}{PD1}{\guillemotright}
\DeclareTextCommand{\textflq}{PD1}{\guilsinglleft}
\DeclareTextCommand{\textfrq}{PD1}{\guilsinglright}
%    \end{macrocode}
%    Aliases (math names)
%    \begin{macrocode}
\DeclareTextCommand{\textneg}{PD1}{\textlogicalnot}
\DeclareTextCommand{\texttimes}{PD1}{\textmultiply}
\DeclareTextCommand{\textdiv}{PD1}{\textdivide}
\DeclareTextCommand{\textpm}{PD1}{\textplusminus}
\DeclareTextCommand{\textcdot}{PD1}{\textperiodcentered}
\DeclareTextCommand{\textbeta}{PD1}{\ss}
%    \end{macrocode}
% Polish aliases. PDF encoding does not have the characters, but it
% is useful to Poles to have the plain letters regardless. Requested by
%  Wojciech Myszka (\Email{W.Myszka@immt.pwr.wroc.pl}).
%    \begin{macrocode}
\DeclareTextCompositeCommand{\k}{PD1}{a}{a}% aogonek
\DeclareTextCompositeCommand{\'}{PD1}{c}{c}% cacute
\DeclareTextCompositeCommand{\k}{PD1}{e}{e}% eogonek
\DeclareTextCompositeCommand{\'}{PD1}{n}{n}% nacute
\DeclareTextCompositeCommand{\'}{PD1}{s}{s}% sacute
\DeclareTextCompositeCommand{\'}{PD1}{z}{z}% zacute
\DeclareTextCompositeCommand{\.}{PD1}{z}{z}% zdot
%    \end{macrocode}
%    \begin{macrocode}
\DeclareTextCompositeCommand{\k}{PD1}{A}{A}% Aogonek
\DeclareTextCompositeCommand{\'}{PD1}{C}{C}% Cacute
\DeclareTextCompositeCommand{\k}{PD1}{E}{E}% Eogonek
\DeclareTextCompositeCommand{\'}{PD1}{N}{N}% Nacute
\DeclareTextCompositeCommand{\'}{PD1}{S}{S}% Sacute
\DeclareTextCompositeCommand{\'}{PD1}{Z}{Z}% Zacute
\DeclareTextCompositeCommand{\.}{PD1}{Z}{Z}% Zdot
%    \end{macrocode}
%    \begin{macrocode}
%</pd1enc>
%    \end{macrocode}
%
% \subsection{PU encoding}
%    \begin{macrocode}
%<*puenc>
\DeclareFontEncoding{PU}{}{}
%    \end{macrocode}
%
% \subsubsection{NFSS2 accents}
%
%    \begin{macrocode}
% U+0300 COMBINING GRAVE ACCENT; gravecmb, *gravecomb
\DeclareTextCommand{\`}{PU}[1]{#1\83\000}% U+0300
% U+0301 COMBINING ACUTE ACCENT; acutecmb, *acutecomb
\DeclareTextCommand{\'}{PU}[1]{#1\83\001}% U+0301
% U+0302 COMBINING CIRCUMFLEX ACCENT; circumflexcmb
\DeclareTextCommand{\^}{PU}[1]{#1\83\002}% U+0302
% U+0303 COMBINING TILDE; tildecmb, *tildecomb
\DeclareTextCommand{\~}{PU}[1]{#1\83\003}% U+0303
% U+0304 COMBINING MACRON; macroncmb
\DeclareTextCommand{\=}{PU}[1]{#1\83\004}% U+0304
% U+0306 COMBINING BREVE; brevecmb
\DeclareTextCommand{\u}{PU}[1]{#1\83\006}% U+0306
\DeclareTextCommand{\U}{PU}[1]{#1\83\006}% U+0306
% U+0307 COMBINING DOT ABOVE; dotaccentcmb
\DeclareTextCommand{\.}{PU}[1]{#1\83\007}% U+0307
% U+0308 COMBINING DIAERESIS; dieresiscmb
\DeclareTextCommand{\"}{PU}[1]{#1\83\010}% U+0308
% U+030A COMBINING RING ABOVE; ringcmb
\DeclareTextCommand{\r}{PU}[1]{#1\83\012}% U+030A
% U+030B COMBINING DOUBLE ACUTE ACCENT; hungarumlautcmb
\DeclareTextCommand{\H}{PU}[1]{#1\83\013}% U+030B
% U+030C COMBINING CARON; caroncmb
\DeclareTextCommand{\v}{PU}[1]{#1\83\014}% U+030C
% U+030F COMBINING DOUBLE GRAVE ACCENT; dblgravecmb
\DeclareTextCommand{\G}{PU}[1]{#1\83\017}% U+030F
\DeclareTextCommand{\C}{PU}[1]{#1\83\017}% U+030F
% U+0311 COMBINING INVERTED BREVE; breveinvertedcmb
\DeclareTextCommand{\newtie}{PU}[1]{#1\83\021}% U+0311
% U+0323 COMBINING DOT BELOW; dotbelowcmb, *dotbelowcomb
\DeclareTextCommand{\d}{PU}[1]{#1\83\043}% U+0323
% U+0331 COMBINING MACRON BELOW; macronbelowcmb
\DeclareTextCommand{\b}{PU}[1]{#1\83\061}% U+0331
% U+0327 COMBINING CEDILLA; cedillacmb
\DeclareTextCommand{\c}{PU}[1]{#1\83\047}% U+0327
% U+0328 COMBINING OGONEK; ogonekcmb
\DeclareTextCommand{\k}{PU}[1]{#1\83\050}% U+0328
% U+0361 COMBINING DOUBLE INVERTED BREVE; breveinverteddoublecmb
\DeclareTextCommand{\t}{PU}[1]{#1\83\141}% U+0361
% U+20DD COMBINING ENCLOSING CIRCLE
\DeclareTextCommand{\textcircled}{PU}[1]{#1\9040\335}% U+20DD
%    \end{macrocode}
%    \cs{@empty} is an artefact of the NFSS2 machinery, it
%    gets inserted for empty arguments and spaces.
%    \begin{macrocode}
\DeclareTextCompositeCommand{\`}{PU}{\@empty}{\textasciigrave}
\DeclareTextCompositeCommand{\'}{PU}{\@empty}{\textacute}
\DeclareTextCompositeCommand{\^}{PU}{\@empty}{\textasciicircum}
\DeclareTextCompositeCommand{\~}{PU}{\@empty}{\texttilde}
\DeclareTextCompositeCommand{\"}{PU}{\@empty}{\textasciidieresis}
\DeclareTextCompositeCommand{\r}{PU}{\@empty}{\textring}
\DeclareTextCompositeCommand{\v}{PU}{\@empty}{\textasciicaron}
\DeclareTextCompositeCommand{\.}{PU}{\@empty}{\textdotaccent}
\DeclareTextCompositeCommand{\c}{PU}{\@empty}{\textcedilla}
\DeclareTextCompositeCommand{\u}{PU}{\@empty}{\textasciibreve}
\DeclareTextCompositeCommand{\G}{PU}{\@empty}{\textdoublegrave}
\DeclareTextCompositeCommand{\=}{PU}{\@empty}{\textasciimacron}
\DeclareTextCompositeCommand{\H}{PU}{\@empty}{\texthungarumlaut}
\DeclareTextCompositeCommand{\k}{PU}{\@empty}{\textogonek}
\DeclareTextCompositeCommand{\b}{PU}{\@empty}{\textmacronbelow}
\DeclareTextCompositeCommand{\d}{PU}{\@empty}{\textdotbelow}
\DeclareTextCompositeCommand{\t}{PU}{\@empty}{\texttie}
\DeclareTextCompositeCommand{\newtie}{PU}{\@empty}{\textnewtie}
\DeclareTextCompositeCommand{\textcircled}{PU}{\@empty}{\textbigcircle}
%    \end{macrocode}
%    \begin{macrocode}
\DeclareTextCompositeCommand{\`}{PU}{\ }{\textasciigrave}
\DeclareTextCompositeCommand{\'}{PU}{\ }{\textacute}
\DeclareTextCompositeCommand{\^}{PU}{\ }{\textasciicircum}
\DeclareTextCompositeCommand{\~}{PU}{\ }{\texttilde}
\DeclareTextCompositeCommand{\"}{PU}{\ }{\textasciidieresis}
\DeclareTextCompositeCommand{\r}{PU}{\ }{\textring}
\DeclareTextCompositeCommand{\v}{PU}{\ }{\textasciicaron}
\DeclareTextCompositeCommand{\.}{PU}{\ }{\textdotaccent}
\DeclareTextCompositeCommand{\c}{PU}{\ }{\textcedilla}
\DeclareTextCompositeCommand{\u}{PU}{\ }{\textasciibreve}
\DeclareTextCompositeCommand{\G}{PU}{\ }{\textdoublegrave}
\DeclareTextCompositeCommand{\=}{PU}{\ }{\textasciimacron}
\DeclareTextCompositeCommand{\H}{PU}{\ }{\texthungarumlaut}
\DeclareTextCompositeCommand{\k}{PU}{\ }{\textogonek}
\DeclareTextCompositeCommand{\b}{PU}{\ }{\textmacronbelow}
\DeclareTextCompositeCommand{\d}{PU}{\ }{\textdotbelow}
\DeclareTextCompositeCommand{\t}{PU}{\ }{\texttie}
\DeclareTextCompositeCommand{\newtie}{PU}{\ }{\textnewtie}
\DeclareTextCompositeCommand{\textcircled}{PU}{\ }{\textbigcircle}
%    \end{macrocode}
%    Accents for capitals (see encoding TS1)
%    \begin{macrocode}
\DeclareTextCommand{\capitalcedilla}{PU}[1]{\c{#1}}
\DeclareTextCommand{\capitalogonek}{PU}[1]{\k{#1}}
\DeclareTextCommand{\capitalgrave}{PU}[1]{\`{#1}}
\DeclareTextCommand{\capitalacute}{PU}[1]{\'{#1}}
\DeclareTextCommand{\capitalcircumflex}{PU}[1]{\^{#1}}
\DeclareTextCommand{\capitaltilde}{PU}[1]{\~{#1}}
\DeclareTextCommand{\capitaldieresis}{PU}[1]{\"{#1}}
\DeclareTextCommand{\capitalhungarumlaut}{PU}[1]{\H{#1}}
\DeclareTextCommand{\capitalring}{PU}[1]{\r{#1}}
\DeclareTextCommand{\capitalcaron}{PU}[1]{\v{#1}}
\DeclareTextCommand{\capitalbreve}{PU}[1]{\u{#1}}
\DeclareTextCommand{\capitalmacron}{PU}[1]{\={#1}}
\DeclareTextCommand{\capitaldotaccent}{PU}[1]{\.{#1}}
\DeclareTextCommand{\capitaltie}{PU}[1]{\t{#1}}
\DeclareTextCommand{\capitalnewtie}{PU}[1]{\newtie{#1}}
%    \end{macrocode}
%
% \subsubsection{Basic Latin: U+0000 to U+007F}
%
%    Special white space escape characters.
%    \begin{macrocode}
% U+0009 (CHARACTER TABULATION)
\DeclareTextCommand{\textHT}{PU}{\80\011}% U+0009
% U+000A (LINE FEED)
\DeclareTextCommand{\textLF}{PU}{\80\012}% U+000A
% U+000D (CARRIAGE RETURN)
\DeclareTextCommand{\textCR}{PU}{\80\015}% U+000D
%    \end{macrocode}
%    |\80\040|: U+0020 SPACE; space, spacehackarabic\\
%    |\80\041|: U+0021 EXCLAMATION MARK; exclam
%    \begin{macrocode}
% U+0022 QUOTATION MARK; quotedbl
\DeclareTextCommand{\textquotedbl}{PU}{\string"}% \80\042 U+0022
% U+0023 NUMBER SIGN; numbersign
\DeclareTextCommand{\textnumbersign}{PU}{\80\043}% U+0023
% U+0024 DOLLAR SIGN; dollar
\DeclareTextCommand{\textdollar}{PU}{\80\044}% U+0024
% U+0025 PERCENT SIGN; percent
\DeclareTextCommand{\textpercent}{PU}{\80\045}% U+0025
% U+0026 AMPERSAND; ampersand
\DeclareTextCommand{\textampersand}{PU}{\80\046}% U+0026
% U+0027 APOSTROPHE; quotesingle
\DeclareTextCommand{\textquotesingle}{PU}{\80\047}% U+0027
% U+0028 LEFT PARENTHESIS; parenleft
\DeclareTextCommand{\textparenleft}{PU}{\80\050}% U+0028
% U+0029 RIGHT PARENTHESIS; parenright
\DeclareTextCommand{\textparenright}{PU}{\80\051}% U+0029
% U+002A ASTERISK; asterisk
\DeclareTextCommand{\textasteriskcentered}{PU}{\80\052}% U+002A (?)
%    \end{macrocode}
%    |\80\053|: U+002B PLUS SIGN; plus\\
%    |\80\054|: U+002C COMMA; comma\\
%    |\80\055|: U+002D HYPHEN-MINUS; hyphen\\
%    |\80\056|: U+002E FULL STOP; period\\
%    |\80\057|: U+002F SOLIDUS; slash\\
%    |\80\060|: U+0030 DIGIT ZERO; zero\\
%    \dots\\
%    |\80\071|: U+0039 DIGIT NINE; nine\\
%    |\80\072|: U+003A COLON; colon\\
%    |\80\073|: U+003B SEMICOLON; semicolon
%    \begin{macrocode}
% U+003C LESS-THAN SIGN; less
\DeclareTextCommand{\textless}{PU}{<}% \80\074 U+003C
%    \end{macrocode}
%    |\80\075|: U+003D EQUALS SIGN; equal
%    \begin{macrocode}
% U+003E GREATER-THAN SIGN; greater
\DeclareTextCommand{\textgreater}{PU}{>}% \80\076 U+003E
%    \end{macrocode}
%    |\80\077|: U+003F QUESTION MARK; question\\
%    |\80\100|: U+0040 COMMERCIAL AT; at\\
%    |\80\101|: U+0041 LATIN CAPITAL LETTER A; A\\
%    \dots\\
%    |\80\132|: U+005A LATIN CAPITAL LETTER Z; Z\\
%    |\80\133|: U+005B LEFT SQUARE BRACKET; bracketleft
%    \begin{macrocode}
% U+005C REVERSE SOLIDUS; backslash
\DeclareTextCommand{\textbackslash}{PU}{\80\134}% U+005C
%    \end{macrocode}
%    |\80\135|: U+005D RIGHT SQUARE BRACKET; bracketright
%    \begin{macrocode}
% U+005E CIRCUMFLEX ACCENT; asciicircum
\DeclareTextCommand{\textasciicircum}{PU}{\80\136}% U+005E
% U+005F LOW LINE; underscore
\DeclareTextCommand{\textunderscore}{PU}{\80\137}% U+005F
% U+0060 GRAVE ACCENT; grave
\DeclareTextCommand{\textasciigrave}{PU}{\80\140}% U+0060
%    \end{macrocode}
%    |\80\141|: U+0061 LATIN SMALL LETTER A; a\\
%    \dots\\
%    |\80\150|: U+0068 LATIN SMALL LETTER H; h
%    \begin{macrocode}
% U+0069 LATIN SMALL LETTER I; i
\DeclareTextCompositeCommand{\.}{PU}{\i}{i} % \80\151 U+0069
\DeclareTextCompositeCommand{\.}{PU}{i}{i}% \80\151 U+0069
%    \end{macrocode}
%    |\80\152|: U+006A LATIN SMALL LETTER J; j\\
%    \dots\\
%    |\80\172|: U+007A LATIN SMALL LETTER Z; z
%    \begin{macrocode}
% U+007B LEFT CURLY BRACKET; braceleft
\DeclareTextCommand{\textbraceleft}{PU}{\80\173}% U+007B
% U+007C VERTICAL LINE; *bar, verticalbar
\DeclareTextCommand{\textbar}{PU}{|}% \80\174 U+007C
% U+007D RIGHT CURLY BRACKET; braceright
\DeclareTextCommand{\textbraceright}{PU}{\80\175}% U+007D
% U+007E TILDE; asciitilde
\DeclareTextCommand{\textasciitilde}{PU}{\80\176}% U+007E
%    \end{macrocode}
%
% \subsubsection{Latin-1 Supplement: U+0080 to U+00FF}
%
%    |\80\240|: U+00A0 NO-BREAK SPACE; nbspace, nonbreakingspace
%    \begin{macrocode}
% U+00A1 INVERTED EXCLAMATION MARK; exclamdown
\DeclareTextCommand{\textexclamdown}{PU}{\80\241}% U+00A1
% U+00A2 CENT SIGN; cent
\DeclareTextCommand{\textcent}{PU}{\80\242}% U+00A2
% U+00A3 POUND SIGN; sterling
\DeclareTextCommand{\textsterling}{PU}{\80\243}% U+00A3
% U+00A4 CURRENCY SIGN; currency
\DeclareTextCommand{\textcurrency}{PU}{\80\244}% U+00A4
% U+00A5 YEN SIGN; yen
\DeclareTextCommand{\textyen}{PU}{\80\245}% U+00A5
% U+00A6 BROKEN BAR; brokenbar
\DeclareTextCommand{\textbrokenbar}{PU}{\80\246}% U+00A6
% U+00A7 SECTION SIGN; section
\DeclareTextCommand{\textsection}{PU}{\80\247}% U+00A7
% U+00A8 DIAERESIS; dieresis
\DeclareTextCommand{\textasciidieresis}{PU}{\80\250}% U+00A8
% U+00A9 COPYRIGHT SIGN; copyright
\DeclareTextCommand{\textcopyright}{PU}{\80\251}% U+00A9
% U+00AA FEMININE ORDINAL INDICATOR; ordfeminine
\DeclareTextCommand{\textordfeminine}{PU}{\80\252}% U+00AA
% U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK; guillemotleft
\DeclareTextCommand{\guillemotleft}{PU}{\80\253}% U+00AB
% U+00AC NOT SIGN; logicalnot
\DeclareTextCommand{\textlogicalnot}{PU}{\80\254}% U+00AC
\DeclareTextCommand{\textlnot}{PU}{\80\254}% U+00AC
%    \end{macrocode}
%    |\80\255|: U+00AD SOFT HYPHEN; sfthyphen, softhyphen
%    \begin{macrocode}
% U+00AE REGISTERED SIGN; registered
\DeclareTextCommand{\textregistered}{PU}{\80\256}% U+00AE
% U+00AF MACRON; *macron, overscore
\DeclareTextCommand{\textasciimacron}{PU}{\80\257}% U+00AF
% U+00B0 DEGREE SIGN; degree
\DeclareTextCommand{\textdegree}{PU}{\80\260}% U+00B0
% U+00B1 PLUS-MINUS SIGN; plusminus
\DeclareTextCommand{\textplusminus}{PU}{\80\261}% U+00B1
% U+00B2 SUPERSCRIPT TWO; twosuperior
\DeclareTextCommand{\texttwosuperior}{PU}{\80\262}% U+00B2
% U+00B3 SUPERSCRIPT THREE; threesuperior
\DeclareTextCommand{\textthreesuperior}{PU}{\80\263}% U+00B3
% U+00B4 ACUTE ACCENT; acute
\DeclareTextCommand{\textacute}{PU}{\80\264}% U+00B4
\DeclareTextCommand{\textasciiacute}{PU}{\80\264}% U+00B4
% U+00B5 MICRO SIGN; mu, mu1
\DeclareTextCommand{\textmu}{PU}{\80\265}% U+00B5
% U+00B6 PILCROW SIGN; paragraph
\DeclareTextCommand{\textparagraph}{PU}{\80\266}% U+00B6
% U+00B7 MIDDLE DOT; middot, *periodcentered
\DeclareTextCommand{\textperiodcentered}{PU}{\80\267}% U+00B7
% U+00B8 CEDILLA; cedilla
\DeclareTextCommand{\textcedilla}{PU}{\80\270}% U+00B8
% U+00B9 SUPERSCRIPT ONE; onesuperior
\DeclareTextCommand{\textonesuperior}{PU}{\80\271}% U+00B9
% U+00BA MASCULINE ORDINAL INDICATOR; ordmasculine
\DeclareTextCommand{\textordmasculine}{PU}{\80\272}% U+00BA
% U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK; guillemotright
\DeclareTextCommand{\guillemotright}{PU}{\80\273}% U+00BB
% U+00BC VULGAR FRACTION ONE QUARTER; onequarter
\DeclareTextCommand{\textonequarter}{PU}{\80\274}% U+00BC
% U+00BD VULGAR FRACTION ONE HALF; onehalf
\DeclareTextCommand{\textonehalf}{PU}{\80\275}% U+00BD
% U+00BE VULGAR FRACTION THREE QUARTERS; threequarters
\DeclareTextCommand{\textthreequarters}{PU}{\80\276}% U+00BE
% U+00BF INVERTED QUESTION MARK; questiondown
\DeclareTextCommand{\textquestiondown}{PU}{\80\277}% U+00BF
% U+00C0 LATIN CAPITAL LETTER A WITH GRAVE; Agrave
\DeclareTextCompositeCommand{\`}{PU}{A}{\80\300}% U+00C0
% U+00C1 LATIN CAPITAL LETTER A WITH ACUTE; Aacute
\DeclareTextCompositeCommand{\'}{PU}{A}{\80\301}% U+00C1
% U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX; Acircumflex
\DeclareTextCompositeCommand{\^}{PU}{A}{\80\302}% U+00C2
% U+00C3 LATIN CAPITAL LETTER A WITH TILDE; Atilde
\DeclareTextCompositeCommand{\~}{PU}{A}{\80\303}% U+00C3
% U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS; Adieresis
\DeclareTextCompositeCommand{\"}{PU}{A}{\80\304}% U+00C4
% U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE; Aring
\DeclareTextCompositeCommand{\r}{PU}{A}{\80\305}% U+00C5
% U+00C6 LATIN CAPITAL LETTER AE; AE
\DeclareTextCommand{\AE}{PU}{\80\306}% U+00C6
% U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA; Ccedilla
\DeclareTextCompositeCommand{\c}{PU}{C}{\80\307}% U+00C7
% U+00C8 LATIN CAPITAL LETTER E WITH GRAVE; Egrave
\DeclareTextCompositeCommand{\`}{PU}{E}{\80\310}% U+00C8
% U+00C9 LATIN CAPITAL LETTER E WITH ACUTE; Eacute
\DeclareTextCompositeCommand{\'}{PU}{E}{\80\311}% U+00C9
% U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX; Ecircumflex
\DeclareTextCompositeCommand{\^}{PU}{E}{\80\312}% U+00CA
% U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS; Edieresis
\DeclareTextCompositeCommand{\"}{PU}{E}{\80\313}% U+00CB
% U+00CC LATIN CAPITAL LETTER I WITH GRAVE; Igrave
\DeclareTextCompositeCommand{\`}{PU}{I}{\80\314}% U+00CC
% U+00CD LATIN CAPITAL LETTER I WITH ACUTE; Iacute
\DeclareTextCompositeCommand{\'}{PU}{I}{\80\315}% U+00CD
% U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX; Icircumflex
\DeclareTextCompositeCommand{\^}{PU}{I}{\80\316}% U+00CE
% U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS; Idieresis
\DeclareTextCompositeCommand{\"}{PU}{I}{\80\317}% U+00CF
% U+00D0 LATIN CAPITAL LETTER ETH; Eth
\DeclareTextCommand{\DH}{PU}{\80\320}% U+00D0
% U+00D1 LATIN CAPITAL LETTER N WITH TILDE; Ntilde
\DeclareTextCompositeCommand{\~}{PU}{N}{\80\321}% U+00D1
% U+00D2 LATIN CAPITAL LETTER O WITH GRAVE; Ograve
\DeclareTextCompositeCommand{\`}{PU}{O}{\80\322}% U+00D2
% U+00D3 LATIN CAPITAL LETTER O WITH ACUTE; Oacute
\DeclareTextCompositeCommand{\'}{PU}{O}{\80\323}% U+00D3
% U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX; Ocircumflex
\DeclareTextCompositeCommand{\^}{PU}{O}{\80\324}% U+00D4
% U+00D5 LATIN CAPITAL LETTER O WITH TILDE; Otilde
\DeclareTextCompositeCommand{\~}{PU}{O}{\80\325}% U+00D5
% U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS; Odieresis
\DeclareTextCompositeCommand{\"}{PU}{O}{\80\326}% U+00D6
% U+00D7 MULTIPLICATION SIGN; multiply
\DeclareTextCommand{\textmultiply}{PU}{\80\327}% U+00D7
% U+00D8 LATIN CAPITAL LETTER O WITH STROKE; Oslash
\DeclareTextCommand{\O}{PU}{\80\330}% U+00D8
% U+00D9 LATIN CAPITAL LETTER U WITH GRAVE; Ugrave
\DeclareTextCompositeCommand{\`}{PU}{U}{\80\331}% U+00D9
% U+00DA LATIN CAPITAL LETTER U WITH ACUTE; Uacute
\DeclareTextCompositeCommand{\'}{PU}{U}{\80\332}% U+00DA
% U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX; Ucircumflex
\DeclareTextCompositeCommand{\^}{PU}{U}{\80\333}% U+00DB
% U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS; Udieresis
\DeclareTextCompositeCommand{\"}{PU}{U}{\80\334}% U+00DC
% U+00DD LATIN CAPITAL LETTER Y WITH ACUTE; Yacute
\DeclareTextCompositeCommand{\'}{PU}{Y}{\80\335}% U+00DD
% U+00DE LATIN CAPITAL LETTER THORN; Thorn
\DeclareTextCommand{\TH}{PU}{\80\336}% U+00DE
% U+00DF LATIN SMALL LETTER SHARP S; germandbls
\DeclareTextCommand{\ss}{PU}{\80\337}% U+00DF
% U+00E0 LATIN SMALL LETTER A WITH GRAVE; agrave
\DeclareTextCompositeCommand{\`}{PU}{a}{\80\340}% U+00E0
% U+00E1 LATIN SMALL LETTER A WITH ACUTE; aacute
\DeclareTextCompositeCommand{\'}{PU}{a}{\80\341}% U+00E1
% U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX; acircumflex
\DeclareTextCompositeCommand{\^}{PU}{a}{\80\342}% U+00E2
% U+00E3 LATIN SMALL LETTER A WITH TILDE; atilde
\DeclareTextCompositeCommand{\~}{PU}{a}{\80\343}% U+00E3
% U+00E4 LATIN SMALL LETTER A WITH DIAERESIS; adieresis
\DeclareTextCompositeCommand{\"}{PU}{a}{\80\344}% U+00E4
% U+00E5 LATIN SMALL LETTER A WITH RING ABOVE; aring
\DeclareTextCompositeCommand{\r}{PU}{a}{\80\345}% U+00E5
% U+00E6 LATIN SMALL LETTER AE; ae
\DeclareTextCommand{\ae}{PU}{\80\346}% U+00E6
% U+00E7 LATIN SMALL LETTER C WITH CEDILLA; ccedilla
\DeclareTextCompositeCommand{\c}{PU}{c}{\80\347}% U+00E7
% U+00E8 LATIN SMALL LETTER E WITH GRAVE; egrave
\DeclareTextCompositeCommand{\`}{PU}{e}{\80\350}% U+00E8
% U+00E9 LATIN SMALL LETTER E WITH ACUTE; eacute
\DeclareTextCompositeCommand{\'}{PU}{e}{\80\351}% U+00E9
% U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX; ecircumflex
\DeclareTextCompositeCommand{\^}{PU}{e}{\80\352}% U+00EA
% U+00EB LATIN SMALL LETTER E WITH DIAERESIS; edieresis
\DeclareTextCompositeCommand{\"}{PU}{e}{\80\353}% U+00EB
% U+00EC LATIN SMALL LETTER I WITH GRAVE; igrave
\DeclareTextCompositeCommand{\`}{PU}{i}{\80\354}% U+00EC
\DeclareTextCompositeCommand{\`}{PU}{\i}{\80\354}% U+00EC
% U+00ED LATIN SMALL LETTER I WITH ACUTE; iacute
\DeclareTextCompositeCommand{\'}{PU}{i}{\80\355}% U+00ED
\DeclareTextCompositeCommand{\'}{PU}{\i}{\80\355}% U+00ED
% U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX; icircumflex
\DeclareTextCompositeCommand{\^}{PU}{i}{\80\356}% U+00EE
\DeclareTextCompositeCommand{\^}{PU}{\i}{\80\356}% U+00EE
% U+00EF LATIN SMALL LETTER I WITH DIAERESIS; idieresis
\DeclareTextCompositeCommand{\"}{PU}{i}{\80\357}% U+00EF
\DeclareTextCompositeCommand{\"}{PU}{\i}{\80\357}% U+00EF
% U+00F0 LATIN SMALL LETTER ETH; eth
\DeclareTextCommand{\dh}{PU}{\80\360}% U+00F0
% U+00F1 LATIN SMALL LETTER N WITH TILDE; ntilde
\DeclareTextCompositeCommand{\~}{PU}{n}{\80\361}% U+00F1
% U+00F2 LATIN SMALL LETTER O WITH GRAVE; ograve
\DeclareTextCompositeCommand{\`}{PU}{o}{\80\362}% U+00F2
% U+00F3 LATIN SMALL LETTER O WITH ACUTE; oacute
\DeclareTextCompositeCommand{\'}{PU}{o}{\80\363}% U+00F3
% U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX; ocircumflex
\DeclareTextCompositeCommand{\^}{PU}{o}{\80\364}% U+00F4
% U+00F5 LATIN SMALL LETTER O WITH TILDE; otilde
\DeclareTextCompositeCommand{\~}{PU}{o}{\80\365}% U+00F5
% U+00F6 LATIN SMALL LETTER O WITH DIAERESIS; odieresis
\DeclareTextCompositeCommand{\"}{PU}{o}{\80\366}% U+00F6
% U+00F7 DIVISION SIGN; divide
\DeclareTextCommand{\textdivide}{PU}{\80\367}% U+00F7
% U+00F8 LATIN SMALL LETTER O WITH STROKE; oslash
\DeclareTextCommand{\o}{PU}{\80\370}% U+00F8
% U+00F9 LATIN SMALL LETTER U WITH GRAVE; ugrave
\DeclareTextCompositeCommand{\`}{PU}{u}{\80\371}% U+00F9
% U+00FA LATIN SMALL LETTER U WITH ACUTE; uacute
\DeclareTextCompositeCommand{\'}{PU}{u}{\80\372}% U+00FA
% U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX; ucircumflex
\DeclareTextCompositeCommand{\^}{PU}{u}{\80\373}% U+00FB
% U+00FC LATIN SMALL LETTER U WITH DIAERESIS; udieresis
\DeclareTextCompositeCommand{\"}{PU}{u}{\80\374}% U+00FC
% U+00FD LATIN SMALL LETTER Y WITH ACUTE; yacute
\DeclareTextCompositeCommand{\'}{PU}{y}{\80\375}% U+00FD
% U+00FE LATIN SMALL LETTER THORN; thorn
\DeclareTextCommand{\th}{PU}{\80\376}% U+00FE
% U+00FF LATIN SMALL LETTER Y WITH DIAERESIS; ydieresis
\DeclareTextCompositeCommand{\"}{PU}{y}{\80\377}% U+00FF
%    \end{macrocode}
%
% \subsubsection{Latin Extended-A: U+0080 to U+017F}
%
%    \begin{macrocode}
% U+0100 LATIN CAPITAL LETTER A WITH MACRON; Amacron
\DeclareTextCompositeCommand{\=}{PU}{A}{\81\000}% U+0100
% U+0101 LATIN SMALL LETTER A WITH MACRON; amacron
\DeclareTextCompositeCommand{\=}{PU}{a}{\81\001}% U+0101
% U+0102 LATIN CAPITAL LETTER A WITH BREVE; Abreve
\DeclareTextCompositeCommand{\u}{PU}{A}{\81\002}% U+0102
% U+0103 LATIN SMALL LETTER A WITH BREVE; abreve
\DeclareTextCompositeCommand{\u}{PU}{a}{\81\003}% U+0103
% U+0104 LATIN CAPITAL LETTER A WITH OGONEK; Aogonek
\DeclareTextCompositeCommand{\k}{PU}{A}{\81\004}% U+0104
% U+0105 LATIN SMALL LETTER A WITH OGONEK; aogonek
\DeclareTextCompositeCommand{\k}{PU}{a}{\81\005}% U+0105
% U+0106 LATIN CAPITAL LETTER C WITH ACUTE; Cacute
\DeclareTextCompositeCommand{\'}{PU}{C}{\81\006}% U+0106
% U+0107 LATIN SMALL LETTER C WITH ACUTE; cacute
\DeclareTextCompositeCommand{\'}{PU}{c}{\81\007}% U+0107
% U+0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX; Ccircumflex
\DeclareTextCompositeCommand{\^}{PU}{C}{\81\010}% U+0108
% U+0109 LATIN SMALL LETTER C WITH CIRCUMFLEX; ccircumflex
\DeclareTextCompositeCommand{\^}{PU}{c}{\81\011}% U+0109
% U+010A LATIN CAPITAL LETTER C WITH DOT ABOVE; Cdot, Cdotaccent
\DeclareTextCompositeCommand{\.}{PU}{C}{\81\012}% U+010A
% U+010B LATIN SMALL LETTER C WITH DOT ABOVE; cdot, cdotaccent
\DeclareTextCompositeCommand{\.}{PU}{c}{\81\013}% U+010B
% U+010C LATIN CAPITAL LETTER C WITH CARON; Ccaron
\DeclareTextCompositeCommand{\v}{PU}{C}{\81\014}% U+010C
% U+010D LATIN SMALL LETTER C WITH CARON; ccaron
\DeclareTextCompositeCommand{\v}{PU}{c}{\81\015}% U+010D
% U+010E LATIN CAPITAL LETTER D WITH CARON; Dcaron
\DeclareTextCompositeCommand{\v}{PU}{D}{\81\016}% U+010E
% U+010F LATIN SMALL LETTER D WITH CARON; dcaron
\DeclareTextCompositeCommand{\v}{PU}{d}{\81\017}% U+010F
% U+0110 LATIN CAPITAL LETTER D WITH STROKE; Dcroat, Dslash
\DeclareTextCommand{\DJ}{PU}{\81\020}% U+0110
% U+0111 LATIN SMALL LETTER D WITH STROKE; dcroat, dmacron
\DeclareTextCommand{\dj}{PU}{\81\021}% U+0111
% U+0112 LATIN CAPITAL LETTER E WITH MACRON; Emacron
\DeclareTextCompositeCommand{\=}{PU}{E}{\81\022}% U+0112
% U+0113 LATIN SMALL LETTER E WITH MACRON; emacron
\DeclareTextCompositeCommand{\=}{PU}{e}{\81\023}% U+0113
% U+0114 LATIN CAPITAL LETTER E WITH BREVE; Ebreve
\DeclareTextCompositeCommand{\u}{PU}{E}{\81\024}% U+0114
% U+0115 LATIN SMALL LETTER E WITH BREVE; ebreve
\DeclareTextCompositeCommand{\u}{PU}{e}{\81\025}% U+0115
% U+0116 LATIN CAPITAL LETTER E WITH DOT ABOVE; Edot, Edotaccent
\DeclareTextCompositeCommand{\.}{PU}{E}{\81\026}% U+0116
% U+0117 LATIN SMALL LETTER E WITH DOT ABOVE; edot, edotaccent
\DeclareTextCompositeCommand{\.}{PU}{e}{\81\027}% U+0117
% U+0118 LATIN CAPITAL LETTER E WITH OGONEK; Eogonek
\DeclareTextCompositeCommand{\k}{PU}{E}{\81\030}% U+0118
% U+0119 LATIN SMALL LETTER E WITH OGONEK; eogonek
\DeclareTextCompositeCommand{\k}{PU}{e}{\81\031}% U+0119
% U+011A LATIN CAPITAL LETTER E WITH CARON; Ecaron
\DeclareTextCompositeCommand{\v}{PU}{E}{\81\032}% U+011A
% U+011B LATIN SMALL LETTER E WITH CARON; ecaron
\DeclareTextCompositeCommand{\v}{PU}{e}{\81\033}% U+011B
% U+011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX; Gcircumflex
\DeclareTextCompositeCommand{\^}{PU}{G}{\81\034}% U+011C
% U+011D LATIN SMALL LETTER G WITH CIRCUMFLEX; gcircumflex
\DeclareTextCompositeCommand{\^}{PU}{g}{\81\035}% U+011D
% U+011E LATIN CAPITAL LETTER G WITH BREVE; Gbreve
\DeclareTextCompositeCommand{\u}{PU}{G}{\81\036}% U+011E
% U+011F LATIN SMALL LETTER G WITH BREVE; gbreve
\DeclareTextCompositeCommand{\u}{PU}{g}{\81\037}% U+011F
% U+0120 LATIN CAPITAL LETTER G WITH DOT ABOVE; Gdot, Gdotaccent
\DeclareTextCompositeCommand{\.}{PU}{G}{\81\040}% U+0120
% U+0121 LATIN SMALL LETTER G WITH DOT ABOVE; gdot, gdotaccent
\DeclareTextCompositeCommand{\.}{PU}{g}{\81\041}% U+0121
% U+0122 LATIN CAPITAL LETTER G WITH CEDILLA; Gcedilla, Gcommaaccent
\DeclareTextCompositeCommand{\c}{PU}{G}{\81\042}% U+0122
% U+0123 LATIN SMALL LETTER G WITH CEDILLA; gcedilla, gcommaaccent
\DeclareTextCompositeCommand{\c}{PU}{g}{\81\043}% U+0123
% U+0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX; Hcircumflex
\DeclareTextCompositeCommand{\^}{PU}{H}{\81\044}% U+0124
% U+0125 LATIN SMALL LETTER H WITH CIRCUMFLEX; hcircumflex
\DeclareTextCompositeCommand{\^}{PU}{h}{\81\045}% U+0125
% U+0126 LATIN CAPITAL LETTER H WITH STROKE; Hbar
\DeclareTextCommand{\textHslash}{PU}{\81\046}% U+0126
% U+0127 LATIN SMALL LETTER H WITH STROKE; hbar
\DeclareTextCommand{\texthslash}{PU}{\81\047}% U+0127
% U+0128 LATIN CAPITAL LETTER I WITH TILDE; Itilde
\DeclareTextCompositeCommand{\~}{PU}{I}{\81\050}% U+0128
% U+0129 LATIN SMALL LETTER I WITH TILDE; itilde
\DeclareTextCompositeCommand{\~}{PU}{i}{\81\051}% U+0129
\DeclareTextCompositeCommand{\~}{PU}{\i}{\81\051}% U+0129
% U+012A LATIN CAPITAL LETTER I WITH MACRON; Imacron
\DeclareTextCompositeCommand{\=}{PU}{I}{\81\052}% U+012A
% U+012B LATIN SMALL LETTER I WITH MACRON; imacron
\DeclareTextCompositeCommand{\=}{PU}{i}{\81\053}% U+012B
\DeclareTextCompositeCommand{\=}{PU}{\i}{\81\053}% U+012B
% U+012C LATIN CAPITAL LETTER I WITH BREVE; Ibreve
\DeclareTextCompositeCommand{\u}{PU}{I}{\81\054}% U+012C
% U+012D LATIN SMALL LETTER I WITH BREVE; ibreve
\DeclareTextCompositeCommand{\u}{PU}{i}{\81\055}% U+012D
\DeclareTextCompositeCommand{\u}{PU}{\i}{\81\055}% U+012D
% U+012E LATIN CAPITAL LETTER I WITH OGONEK; Iogonek
\DeclareTextCompositeCommand{\k}{PU}{I}{\81\056}% U+012E
% U+012F LATIN SMALL LETTER I WITH OGONEK; iogonek
\DeclareTextCompositeCommand{\k}{PU}{i}{\81\057}% U+012F
\DeclareTextCompositeCommand{\k}{PU}{\i}{\81\057}% U+012F
% U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE; Idot, Idotaccent
\DeclareTextCompositeCommand{\.}{PU}{I}{\81\060}% U+0130
% U+0131 LATIN SMALL LETTER DOTLESS I; dotlessi
\DeclareTextCommand{\i}{PU}{\81\061}% U+0131
% U+0132 LATIN CAPITAL LIGATURE IJ; IJ
\DeclareTextCommand{\IJ}{PU}{\81\062}% U+0132
% U+0133 LATIN SMALL LIGATURE IJ; ij
\DeclareTextCommand{\ij}{PU}{\81\063}% U+0133
% U+0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX; Jcircumflex
\DeclareTextCompositeCommand{\^}{PU}{J}{\81\064}% U+0134
% U+0135 LATIN SMALL LETTER J WITH CIRCUMFLEX; jcircumflex
\DeclareTextCompositeCommand{\^}{PU}{j}{\81\065}% U+0135
\DeclareTextCompositeCommand{\^}{PU}{\j}{\81\065}% U+0135
% U+0136 LATIN CAPITAL LETTER K WITH CEDILLA; Kcedilla, Kcommaaccent
\DeclareTextCompositeCommand{\c}{PU}{K}{\81\066}% U+0136
% U+0137 LATIN SMALL LETTER K WITH CEDILLA; kcedilla, kcommaaccent
\DeclareTextCompositeCommand{\c}{PU}{k}{\81\067}% U+0137
%    \end{macrocode}
%    The canonical name of U+0138, small letter kra, would be
%    \cs{textkgreenlandic}, following the glyph naming convention.
%    However |latex/base/inputenc.dtx| has choosen \cs{textkra}.
%    \begin{macrocode}
% U+0138 LATIN SMALL LETTER KRA; kgreenlandic
\DeclareTextCommand{\textkra}{PU}{\81\070}% U+0138
% U+0139 LATIN CAPITAL LETTER L WITH ACUTE; Lacute
\DeclareTextCompositeCommand{\'}{PU}{L}{\81\071}% U+0139
% U+013A LATIN SMALL LETTER L WITH ACUTE; lacute
\DeclareTextCompositeCommand{\'}{PU}{l}{\81\072}% U+013A
% U+013B LATIN CAPITAL LETTER L WITH CEDILLA; Lcedilla, Lcommaaccent
\DeclareTextCompositeCommand{\c}{PU}{L}{\81\073}% U+013B
% U+013C LATIN SMALL LETTER L WITH CEDILLA; lcedilla, lcommaaccent
\DeclareTextCompositeCommand{\c}{PU}{l}{\81\074}% U+013C
% U+013D LATIN CAPITAL LETTER L WITH CARON; Lcaron
\DeclareTextCompositeCommand{\v}{PU}{L}{\81\075}% U+013D
% U+013E LATIN SMALL LETTER L WITH CARON; lcaron
\DeclareTextCompositeCommand{\v}{PU}{l}{\81\076}% U+013E
%    \end{macrocode}
%    There seems to be no variants of letters `L' and `l' with
%    a dot above (reasonable). Therefore the \cs{.} accent
%    is reused instead of making a separate accent macro
%    \cs{textmiddledot}.
%    \begin{macrocode}
% U+013F LATIN CAPITAL LETTER L WITH MIDDLE DOT; Ldot, Ldotaccent
\DeclareTextCompositeCommand{\.}{PU}{L}{\81\077}% U+013F
% U+0140 LATIN SMALL LETTER L WITH MIDDLE DOT; ldot, ldotaccent
\DeclareTextCompositeCommand{\.}{PU}{l}{\81\100}% U+0140
% U+0141 LATIN CAPITAL LETTER L WITH STROKE; Lslash
\DeclareTextCommand{\L}{PU}{\81\101}% U+0141
% U+0142 LATIN SMALL LETTER L WITH STROKE; lslash
\DeclareTextCommand{\l}{PU}{\81\102}% U+0142
% U+0143 LATIN CAPITAL LETTER N WITH ACUTE; Nacute
\DeclareTextCompositeCommand{\'}{PU}{N}{\81\103}% U+0143
% U+0144 LATIN SMALL LETTER N WITH ACUTE; nacute
\DeclareTextCompositeCommand{\'}{PU}{n}{\81\104}% U+0144
% U+0145 LATIN CAPITAL LETTER N WITH CEDILLA; Ncedilla, Ncommaaccent
\DeclareTextCompositeCommand{\c}{PU}{N}{\81\105}% U+0145
% U+0146 LATIN SMALL LETTER N WITH CEDILLA; ncedilla, ncommaaccent
\DeclareTextCompositeCommand{\c}{PU}{n}{\81\106}% U+0146
% U+0147 LATIN CAPITAL LETTER N WITH CARON; Ncaron
\DeclareTextCompositeCommand{\v}{PU}{N}{\81\107}% U+0147
% U+0148 LATIN SMALL LETTER N WITH CARON; ncaron
\DeclareTextCompositeCommand{\v}{PU}{n}{\81\110}% U+0148
% U+0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE; napostrophe, quoterightn
\DeclareTextCommand{\textnapostrophe}{PU}{\81\111}% U+0149
% U+014A LATIN CAPITAL LETTER ENG; Eng
\DeclareTextCommand{\NG}{PU}{\81\112}% U+014A
% U+014B LATIN SMALL LETTER ENG; eng
\DeclareTextCommand{\ng}{PU}{\81\113}% U+014B
% U+014C LATIN CAPITAL LETTER O WITH MACRON; Omacron
\DeclareTextCompositeCommand{\=}{PU}{O}{\81\114}% U+014C
% U+014D LATIN SMALL LETTER O WITH MACRON; omacron
\DeclareTextCompositeCommand{\=}{PU}{o}{\81\115}% U+014D
% U+014E LATIN CAPITAL LETTER O WITH BREVE; Obreve
\DeclareTextCompositeCommand{\u}{PU}{O}{\81\116}% U+014E
% U+014F LATIN SMALL LETTER O WITH BREVE; obreve
\DeclareTextCompositeCommand{\u}{PU}{o}{\81\117}% U+014F
% U+0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE; Odblacute, Ohungarumlaut
\DeclareTextCompositeCommand{\H}{PU}{O}{\81\120}% U+0150
% U+0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE; odblacute, ohungarumlaut
\DeclareTextCompositeCommand{\H}{PU}{o}{\81\121}% U+0151
% U+0152 LATIN CAPITAL LIGATURE OE; OE
\DeclareTextCommand{\OE}{PU}{\81\122}% U+0152
% U+0153 LATIN SMALL LIGATURE OE; oe
\DeclareTextCommand{\oe}{PU}{\81\123}% U+0153
% U+0154 LATIN CAPITAL LETTER R WITH ACUTE; Racute
\DeclareTextCompositeCommand{\'}{PU}{R}{\81\124}% U+0154
% U+0155 LATIN SMALL LETTER R WITH ACUTE; racute
\DeclareTextCompositeCommand{\'}{PU}{r}{\81\125}% U+0155
% U+0156 LATIN CAPITAL LETTER R WITH CEDILLA; Rcedilla, Rcommaaccent
\DeclareTextCompositeCommand{\c}{PU}{R}{\81\126}% U+0156
% U+0157 LATIN SMALL LETTER R WITH CEDILLA; rcedilla, rcommaaccent
\DeclareTextCompositeCommand{\c}{PU}{r}{\81\127}% U+0157
% U+0158 LATIN CAPITAL LETTER R WITH CARON; Rcaron
\DeclareTextCompositeCommand{\v}{PU}{R}{\81\130}% U+0158
% U+0159 LATIN SMALL LETTER R WITH CARON; rcaron
\DeclareTextCompositeCommand{\v}{PU}{r}{\81\131}% U+0159
% U+015A LATIN CAPITAL LETTER S WITH ACUTE; Sacute
\DeclareTextCompositeCommand{\'}{PU}{S}{\81\132}% U+015A
% U+015B LATIN SMALL LETTER S WITH ACUTE; sacute
\DeclareTextCompositeCommand{\'}{PU}{s}{\81\133}% U+015B
% U+015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX; Scircumflex
\DeclareTextCompositeCommand{\^}{PU}{S}{\81\134}% U+015C
% U+015D LATIN SMALL LETTER S WITH CIRCUMFLEX; scircumflex
\DeclareTextCompositeCommand{\^}{PU}{s}{\81\135}% U+015D
% U+015E LATIN CAPITAL LETTER S WITH CEDILLA; Scedilla
\DeclareTextCompositeCommand{\c}{PU}{S}{\81\136}% U+015E
% U+015F LATIN SMALL LETTER S WITH CEDILLA; scedilla
\DeclareTextCompositeCommand{\c}{PU}{s}{\81\137}% U+015F
% U+0160 LATIN CAPITAL LETTER S WITH CARON; Scaron
\DeclareTextCompositeCommand{\v}{PU}{S}{\81\140}% U+0160
% U+0161 LATIN SMALL LETTER S WITH CARON; scaron
\DeclareTextCompositeCommand{\v}{PU}{s}{\81\141}% U+0161
% U+0162 LATIN CAPITAL LETTER T WITH CEDILLA; Tcedilla, Tcommaaccent
\DeclareTextCompositeCommand{\c}{PU}{T}{\81\142}% U+0162
% U+0163 LATIN SMALL LETTER T WITH CEDILLA; tcedilla, tcommaaccent
\DeclareTextCompositeCommand{\c}{PU}{t}{\81\143}% U+0163
% U+0164 LATIN CAPITAL LETTER T WITH CARON; Tcaron
\DeclareTextCompositeCommand{\v}{PU}{T}{\81\144}% U+0164
% U+0165 LATIN SMALL LETTER T WITH CARON; tcaron
\DeclareTextCompositeCommand{\v}{PU}{t}{\81\145}% U+0165
% U+0166 LATIN CAPITAL LETTER T WITH STROKE; Tbar
\DeclareTextCommand{\textTslash}{PU}{\81\146}% U+0166
% U+0167 LATIN SMALL LETTER T WITH STROKE; tbar
\DeclareTextCommand{\texttslash}{PU}{\81\147}% U+0167
% U+0168 LATIN CAPITAL LETTER U WITH TILDE; Utilde
\DeclareTextCompositeCommand{\~}{PU}{U}{\81\150}% U+0168
% U+0169 LATIN SMALL LETTER U WITH TILDE; utilde
\DeclareTextCompositeCommand{\~}{PU}{u}{\81\151}% U+0169
% U+016A LATIN CAPITAL LETTER U WITH MACRON; Umacron
\DeclareTextCompositeCommand{\=}{PU}{U}{\81\152}% U+016A
% U+016B LATIN SMALL LETTER U WITH MACRON; umacron
\DeclareTextCompositeCommand{\=}{PU}{u}{\81\153}% U+016B
% U+016C LATIN CAPITAL LETTER U WITH BREVE; Ubreve
\DeclareTextCompositeCommand{\u}{PU}{U}{\81\154}% U+016C
% U+016D LATIN SMALL LETTER U WITH BREVE; ubreve
\DeclareTextCompositeCommand{\u}{PU}{u}{\81\155}% U+016D
% U+016E LATIN CAPITAL LETTER U WITH RING ABOVE; Uring
\DeclareTextCompositeCommand{\r}{PU}{U}{\81\156}% U+016E
% U+016F LATIN SMALL LETTER U WITH RING ABOVE; uring
\DeclareTextCompositeCommand{\r}{PU}{u}{\81\157}% U+016F
% U+0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE; Udblacute, Uhungarumlaut
\DeclareTextCompositeCommand{\H}{PU}{U}{\81\160}% U+0170
% U+0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE; udblacute, uhungarumlaut
\DeclareTextCompositeCommand{\H}{PU}{u}{\81\161}% U+0171
% U+0172 LATIN CAPITAL LETTER U WITH OGONEK; Uogonek
\DeclareTextCompositeCommand{\k}{PU}{U}{\81\162}% U+0172
% U+0173 LATIN SMALL LETTER U WITH OGONEK; uogonek
\DeclareTextCompositeCommand{\k}{PU}{u}{\81\163}% U+0173
% U+0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX; Wcircumflex
\DeclareTextCompositeCommand{\^}{PU}{W}{\81\164}% U+0174
% U+0175 LATIN SMALL LETTER W WITH CIRCUMFLEX; wcircumflex
\DeclareTextCompositeCommand{\^}{PU}{w}{\81\165}% U+0175
% U+0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX; Ycircumflex
\DeclareTextCompositeCommand{\^}{PU}{Y}{\81\166}% U+0176
% U+0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX; ycircumflex
\DeclareTextCompositeCommand{\^}{PU}{y}{\81\167}% U+0177
% U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS; Ydieresis
\DeclareTextCompositeCommand{\"}{PU}{Y}{\81\170}% U+0178
% U+0179 LATIN CAPITAL LETTER Z WITH ACUTE; Zacute
\DeclareTextCompositeCommand{\'}{PU}{Z}{\81\171}% U+0179
% U+017A LATIN SMALL LETTER Z WITH ACUTE; zacute
\DeclareTextCompositeCommand{\'}{PU}{z}{\81\172}% U+017A
% U+017B LATIN CAPITAL LETTER Z WITH DOT ABOVE; Zdot, Zdotaccent
\DeclareTextCompositeCommand{\.}{PU}{Z}{\81\173}% U+017B
% U+017C LATIN SMALL LETTER Z WITH DOT ABOVE; zdot, zdotaccent
\DeclareTextCompositeCommand{\.}{PU}{z}{\81\174}% U+017C
% U+017D LATIN CAPITAL LETTER Z WITH CARON; Zcaron
\DeclareTextCompositeCommand{\v}{PU}{Z}{\81\175}% U+017D
% U+017E LATIN SMALL LETTER Z WITH CARON; zcaron
\DeclareTextCompositeCommand{\v}{PU}{z}{\81\176}% U+017E
% U+017F LATIN SMALL LETTER LONG S; longs, slong
\DeclareTextCommand{\textlongs}{PU}{\81\177}% U+017F
%    \end{macrocode}
%
% \subsubsection{Latin Extended-B: U+0180 to U+024F}
%
%    \begin{macrocode}
% U+0192 LATIN SMALL LETTER F WITH HOOK; florin
\DeclareTextCommand{\textflorin}{PU}{\81\222}% U+0192
% U+01CD LATIN CAPITAL LETTER A WITH CARON; Acaron
\DeclareTextCompositeCommand{\v}{PU}{A}{\81\315}% U+01CD
% U+01CE LATIN SMALL LETTER A WITH CARON; acaron
\DeclareTextCompositeCommand{\v}{PU}{a}{\81\316}% U+01CE
% U+01CF LATIN CAPITAL LETTER I WITH CARON; Icaron
\DeclareTextCompositeCommand{\v}{PU}{I}{\81\317}% U+01CF
% U+01D0 LATIN SMALL LETTER I WITH CARON; icaron
\DeclareTextCompositeCommand{\v}{PU}{\i}{\81\320}% U+01D0
\DeclareTextCompositeCommand{\v}{PU}{i}{\81\320}% U+01D0
% U+01D1 LATIN CAPITAL LETTER O WITH CARON; Ocaron
\DeclareTextCompositeCommand{\v}{PU}{O}{\81\321}% U+01D1
% U+01D2 LATIN SMALL LETTER O WITH CARON; ocaron
\DeclareTextCompositeCommand{\v}{PU}{o}{\81\322}% U+01D2
% U+01D3 LATIN CAPITAL LETTER U WITH CARON; Ucaron
\DeclareTextCompositeCommand{\v}{PU}{U}{\81\323}% U+01D3
% U+01D4 LATIN SMALL LETTER U WITH CARON; ucaron
\DeclareTextCompositeCommand{\v}{PU}{u}{\81\324}% U+01D4
% U+01E4 LATIN CAPITAL LETTER G WITH STROKE; Gstroke
\DeclareTextCommand{\textGslash}{PU}{\81\344}% U+01E4
% U+01E5 LATIN SMALL LETTER G WITH STROKE; gstroke
\DeclareTextCommand{\textgslash}{PU}{\81\345}% U+01E5
% U+01E6 LATIN CAPITAL LETTER G WITH CARON; Gcaron
\DeclareTextCompositeCommand{\v}{PU}{G}{\81\346}% U+01E6
% U+01E7 LATIN SMALL LETTER G WITH CARON; gcaron
\DeclareTextCompositeCommand{\v}{PU}{g}{\81\347}% U+01E7
% U+01E8 LATIN CAPITAL LETTER K WITH CARON; Kcaron
\DeclareTextCompositeCommand{\v}{PU}{K}{\81\350}% U+01E8
% U+01E9 LATIN SMALL LETTER K WITH CARON; kcaron
\DeclareTextCompositeCommand{\v}{PU}{k}{\81\351}% U+01E9
% U+01EA LATIN CAPITAL LETTER O WITH OGONEK; Oogonek
\DeclareTextCompositeCommand{\k}{PU}{O}{\81\352}% U+01EA
% U+01EB LATIN SMALL LETTER O WITH OGONEK; oogonek
\DeclareTextCompositeCommand{\k}{PU}{o}{\81\353}% U+01EB
% U+01F0 LATIN SMALL LETTER J WITH CARON; jcaron
\DeclareTextCompositeCommand{\v}{PU}{\j}{\81\360}% U+01F0
\DeclareTextCompositeCommand{\v}{PU}{j}{\81\360}% U+01F0
% U+01F4 LATIN CAPITAL LETTER G WITH ACUTE; Gacute
\DeclareTextCompositeCommand{\'}{PU}{G}{\81\364}% U+01F4
% U+01F5 LATIN SMALL LETTER G WITH ACUTE; gacute
\DeclareTextCompositeCommand{\'}{PU}{g}{\81\365}% U+01F5
% U+01F8 LATIN CAPITAL LETTER N WITH GRAVE
\DeclareTextCompositeCommand{\`}{PU}{N}{\81\370}% U+01F8
% U+01F9 LATIN SMALL LETTER N WITH GRAVE
\DeclareTextCompositeCommand{\`}{PU}{n}{\81\371}% U+01F9
% U+01FC LATIN CAPITAL LETTER AE WITH ACUTE; AEacute
\DeclareTextCompositeCommand{\'}{PU}{\AE}{\81\374}% U+01FC
% U+01FD LATIN SMALL LETTER AE WITH ACUTE; aeacute
\DeclareTextCompositeCommand{\'}{PU}{\ae}{\81\375}% U+01FD
% U+01FE LATIN CAPITAL LETTER O WITH STROKE AND ACUTE; *Oslashacute, Ostrokeacut
\DeclareTextCompositeCommand{\'}{PU}{\O}{\81\376}% U+01FE
% U+01FF LATIN SMALL LETTER O WITH STROKE AND ACUTE; *oslashacute, ostrokeacute
\DeclareTextCompositeCommand{\'}{PU}{\o}{\81\377}% U+01FF
% U+0200 LATIN CAPITAL LETTER A WITH DOUBLE GRAVE; Adblgrave
\DeclareTextCompositeCommand{\G}{PU}{A}{\82\000}% U+0200
% U+0201 LATIN SMALL LETTER A WITH DOUBLE GRAVE; adblgrave
\DeclareTextCompositeCommand{\G}{PU}{a}{\82\001}% U+0201
% U+0204 LATIN CAPITAL LETTER E WITH DOUBLE GRAVE; Edblgrave
\DeclareTextCompositeCommand{\G}{PU}{E}{\82\004}% U+0204
% U+0205 LATIN SMALL LETTER E WITH DOUBLE GRAVE; edblgrave
\DeclareTextCompositeCommand{\G}{PU}{e}{\82\005}% U+0205
% U+0208 LATIN CAPITAL LETTER I WITH DOUBLE GRAVE; Idblgrave
\DeclareTextCompositeCommand{\G}{PU}{I}{\82\010}% U+0208
% U+0209 LATIN SMALL LETTER I WITH DOUBLE GRAVE; idblgrave
\DeclareTextCompositeCommand{\G}{PU}{\i}{\82\011}% U+0209
\DeclareTextCompositeCommand{\G}{PU}{i}{\82\011}% U+0209
% U+020C LATIN CAPITAL LETTER O WITH DOUBLE GRAVE; Odblgrave
\DeclareTextCompositeCommand{\G}{PU}{O}{\82\014}% U+020C
% U+020D LATIN SMALL LETTER O WITH DOUBLE GRAVE; odblgrave
\DeclareTextCompositeCommand{\G}{PU}{o}{\82\015}% U+020D
% U+0210 LATIN CAPITAL LETTER R WITH DOUBLE GRAVE; Rdblgrave
\DeclareTextCompositeCommand{\G}{PU}{R}{\82\020}% U+0210
% U+0211 LATIN SMALL LETTER R WITH DOUBLE GRAVE; rdblgrave
\DeclareTextCompositeCommand{\G}{PU}{r}{\82\021}% U+0211
% U+0214 LATIN CAPITAL LETTER U WITH DOUBLE GRAVE; Udblgrave
\DeclareTextCompositeCommand{\G}{PU}{U}{\82\024}% U+0214
% U+0215 LATIN SMALL LETTER U WITH DOUBLE GRAVE; udblgrave
\DeclareTextCompositeCommand{\G}{PU}{u}{\82\025}% U+0215
% U+021E LATIN CAPITAL LETTER H WITH CARON
\DeclareTextCompositeCommand{\v}{PU}{H}{\82\036}% U+021E
% U+021F LATIN SMALL LETTER H WITH CARON
\DeclareTextCompositeCommand{\v}{PU}{h}{\82\037}% U+021F
% U+0226 LATIN CAPITAL LETTER A WITH DOT ABOVE
\DeclareTextCompositeCommand{\.}{PU}{A}{\82\046}% U+0226
% U+0227 LATIN SMALL LETTER A WITH DOT ABOVE
\DeclareTextCompositeCommand{\.}{PU}{a}{\82\047}% U+0227
% U+0228 LATIN CAPITAL LETTER E WITH CEDILLA
\DeclareTextCompositeCommand{\c}{PU}{E}{\82\050}% U+0228
% U+0229 LATIN SMALL LETTER E WITH CEDILLA
\DeclareTextCompositeCommand{\c}{PU}{e}{\82\051}% U+0229
% U+022E LATIN CAPITAL LETTER O WITH DOT ABOVE
\DeclareTextCompositeCommand{\.}{PU}{O}{\82\056}% U+022E
% U+022F LATIN SMALL LETTER O WITH DOT ABOVE
\DeclareTextCompositeCommand{\.}{PU}{o}{\82\057}% U+022F
% U+0232 LATIN CAPITAL LETTER Y WITH MACRON
\DeclareTextCompositeCommand{\=}{PU}{Y}{\82\062}% U+0232
% U+0233 LATIN SMALL LETTER Y WITH MACRON
\DeclareTextCompositeCommand{\=}{PU}{y}{\82\063}% U+0233
% U+0237 LATIN SMALL LETTER DOTLESS J
\DeclareTextCommand{\j}{PU}{\82\067}% U+0237
%    \end{macrocode}
%
% \subsubsection{Spacing Modifier Letters: U+02B0 to U+02FF}
%
%    \begin{macrocode}
% U+02C7 CARON; caron
\DeclareTextCommand{\textasciicaron}{PU}{\82\307}% U+02C7
% U+02D8 BREVE; breve
\DeclareTextCommand{\textasciibreve}{PU}{\82\330}% U+02D8
% U+02D9 DOT ABOVE; dotaccent
\DeclareTextCommand{\textdotaccent}{PU}{\82\331}% U+02D9
% U+02DA RING ABOVE; ring
\DeclareTextCommand{\textring}{PU}{\82\332}% U+02DA
% U+02DB OGONEK; ogonek
\DeclareTextCommand{\textogonek}{PU}{\82\333}% U+02DB
% U+02DC SMALL TILDE; ilde, *tilde
\DeclareTextCommand{\texttilde}{PU}{\82\334}% U+02DC
% U+02DD DOUBLE ACUTE ACCENT; hungarumlaut
\DeclareTextCommand{\texthungarumlaut}{PU}{\82\335}% U+02DD
\DeclareTextCommand{\textacutedbl}{PU}{\texthungarumlaut}% U+02DD
% U+02F5 MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT
\DeclareTextCommand{\textgravedbl}{PU}{\82\365}% U+02F5
% U+02F7 MODIFIER LETTER LOW TILDE
\DeclareTextCommand{\texttildelow}{PU}{\82\367}% U+02F7
%    \end{macrocode}
%
% \subsubsection{Combining Diacritical Marks: U+0300 to U+036F}
%
%    \begin{macrocode}
% U+030F COMBINING DOUBLE GRAVE ACCENT; dblgravecmb
\DeclareTextCommand{\textdoublegrave}{PU}{ \83\017}% U+030F
% U+0311 COMBINING INVERTED BREVE; breveinvertedcmb
\DeclareTextCommand{\textnewtie}{PU}{ \83\021}% U+0311
% U+0323 COMBINING DOT BELOW; dotbelowcmb, *dotbelowcomb
\DeclareTextCommand{\textdotbelow}{PU}{ \83\043}% U+0323
% U+0331 COMBINING MACRON BELOW; macronbelowcmb
\DeclareTextCommand{\textmacronbelow}{PU}{ \83\061}% U+0331
% U+0361 COMBINING DOUBLE INVERTED BREVE; breveinverteddoublecmb
\DeclareTextCommand{\texttie}{PU}{ \83\141}% U+0361
%    \end{macrocode}
%
% \subsubsection{Greek and Coptic: U+0370 to U+03FF}
%
%    \begin{macrocode}
% U+0374 GREEK NUMERAL SIGN; numeralsigngreek
\DeclareTextCommand{\textnumeralsigngreek}{PU}{\83\164}% U+0374
% U+0375 GREEK LOWER NUMERAL SIGN; numeralsignlowergreek
\DeclareTextCommand{\textnumeralsignlowergreek}{PU}{\83\165}% U+0375
% U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS; Alphatonos
\DeclareTextCompositeCommand{\'}{PU}{\textAlpha}{\83\206}% U+0386
% U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS; Epsilontonos
\DeclareTextCompositeCommand{\'}{PU}{\textEpsilon}{\83\210}% U+0388
% U+0389 GREEK CAPITAL LETTER ETA WITH TONOS; Etatonos
\DeclareTextCompositeCommand{\'}{PU}{\textEta}{\83\211}% U+0389
% U+038A GREEK CAPITAL LETTER IOTA WITH TONOS; Iotatonos
\DeclareTextCompositeCommand{\'}{PU}{\textIota}{\83\212}% U+038A
% U+038C GREEK CAPITAL LETTER OMICRON WITH TONOS; Omicrontonos
\DeclareTextCompositeCommand{\'}{PU}{\textOmicron}{\83\214}% U+038C
% U+038E GREEK CAPITAL LETTER UPSILON WITH TONOS; Upsilontonos
\DeclareTextCompositeCommand{\'}{PU}{\textUpsilon}{\83\216}% U+038E
% U+038F GREEK CAPITAL LETTER OMEGA WITH TONOS; Omegatonos
\DeclareTextCompositeCommand{\'}{PU}{\textOmega}{\83\217}% U+038F
% U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS; iotadieresistonos
\DeclareTextCompositeCommand{\'}{PU}{\textIotadieresis}{\83\220}% U+0390
% U+0391 GREEK CAPITAL LETTER ALPHA; Alpha
\DeclareTextCommand{\textAlpha}{PU}{\83\221}% U+0391
% U+0392 GREEK CAPITAL LETTER BETA; Beta
\DeclareTextCommand{\textBeta}{PU}{\83\222}% U+0392
% U+0393 GREEK CAPITAL LETTER GAMMA; Gamma
\DeclareTextCommand{\textGamma}{PU}{\83\223}% U+0393
% U+0394 GREEK CAPITAL LETTER DELTA; Deltagreek, *Delta
\DeclareTextCommand{\textDelta}{PU}{\83\224}% U+0394
% U+0395 GREEK CAPITAL LETTER EPSILON; Epsilon
\DeclareTextCommand{\textEpsilon}{PU}{\83\225}% U+0395
% U+0396 GREEK CAPITAL LETTER ZETA; Zeta
\DeclareTextCommand{\textZeta}{PU}{\83\226}% U+0396
% U+0397 GREEK CAPITAL LETTER ETA; Eta
\DeclareTextCommand{\textEta}{PU}{\83\227}% U+0397
% U+0398 GREEK CAPITAL LETTER THETA; Theta
\DeclareTextCommand{\textTheta}{PU}{\83\230}% U+0398
% U+0399 GREEK CAPITAL LETTER IOTA; Iota
\DeclareTextCommand{\textIota}{PU}{\83\231}% U+0399
% U+039A GREEK CAPITAL LETTER KAPPA; Kappa
\DeclareTextCommand{\textKappa}{PU}{\83\232}% U+039A
% U+039B GREEK CAPITAL LETTER LAMDA; Lambda
\DeclareTextCommand{\textLambda}{PU}{\83\233}% U+039B
% U+039C GREEK CAPITAL LETTER MU; Mu
\DeclareTextCommand{\textMu}{PU}{\83\234}% U+039C
% U+039D GREEK CAPITAL LETTER NU; Nu
\DeclareTextCommand{\textNu}{PU}{\83\235}% U+039D
% U+039E GREEK CAPITAL LETTER XI; Xi
\DeclareTextCommand{\textXi}{PU}{\83\236}% U+039E
% U+039F GREEK CAPITAL LETTER OMICRON; Omicron
\DeclareTextCommand{\textOmicron}{PU}{\83\237}% U+039F
% U+03A0 GREEK CAPITAL LETTER PI; Pi
\DeclareTextCommand{\textPi}{PU}{\83\240}% U+03A0
% U+03A1 GREEK CAPITAL LETTER RHO; Rho
\DeclareTextCommand{\textRho}{PU}{\83\241}% U+03A1
% U+03A3 GREEK CAPITAL LETTER SIGMA; Sigma
\DeclareTextCommand{\textSigma}{PU}{\83\243}% U+03A3
% U+03A4 GREEK CAPITAL LETTER TAU; Tau
\DeclareTextCommand{\textTau}{PU}{\83\244}% U+03A4
% U+03A5 GREEK CAPITAL LETTER UPSILON; Upsilon
\DeclareTextCommand{\textUpsilon}{PU}{\83\245}% U+03A5
% U+03A6 GREEK CAPITAL LETTER PHI; Phi
\DeclareTextCommand{\textPhi}{PU}{\83\246}% U+03A6
% U+03A7 GREEK CAPITAL LETTER CHI; Chi
\DeclareTextCommand{\textChi}{PU}{\83\247}% U+03A7
% U+03A8 GREEK CAPITAL LETTER PSI; Psi
\DeclareTextCommand{\textPsi}{PU}{\83\250}% U+03A8
% U+03A9 GREEK CAPITAL LETTER OMEGA; Omegagreek, *Omega
\DeclareTextCommand{\textOmega}{PU}{\83\251}% U+03A9
% U+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA; Iotadieresis
\DeclareTextCommand{\textIotadieresis}{PU}{\83\252}% U+03AA
\DeclareTextCompositeCommand{\"}{PU}{\textIota}{\83\252}% U+03AA
% U+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA; Upsilondieresis
\DeclareTextCompositeCommand{\"}{PU}{\textUpsilon}{\83\253}% U+03AB
% U+03AC GREEK SMALL LETTER ALPHA WITH TONOS; alphatonos
\DeclareTextCompositeCommand{\'}{PU}{\textalpha}{\83\254}% U+03AC
% U+03AD GREEK SMALL LETTER EPSILON WITH TONOS; epsilontonos
\DeclareTextCompositeCommand{\'}{PU}{\textepsilon}{\83\255}% U+03AD
% U+03AE GREEK SMALL LETTER ETA WITH TONOS; etatonos
\DeclareTextCompositeCommand{\'}{PU}{\texteta}{\83\256}% U+03AE
% U+03AF GREEK SMALL LETTER IOTA WITH TONOS; iotatonos
\DeclareTextCompositeCommand{\'}{PU}{\textiota}{\83\257}% U+03AF
% U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS; upsilondieresisto
\DeclareTextCompositeCommand{\"}{PU}{\textupsilonacute}{\83\260}% U+03B0
% U+03B1 GREEK SMALL LETTER ALPHA; alpha
\DeclareTextCommand{\textalpha}{PU}{\83\261}% U+03B1
% U+03B2 GREEK SMALL LETTER BETA; beta
\DeclareTextCommand{\textbeta}{PU}{\83\262}% U+03B2
% U+03B3 GREEK SMALL LETTER GAMMA; gamma
\DeclareTextCommand{\textgamma}{PU}{\83\263}% U+03B3
% U+03B4 GREEK SMALL LETTER DELTA; delta
\DeclareTextCommand{\textdelta}{PU}{\83\264}% U+03B4
% U+03B5 GREEK SMALL LETTER EPSILON; epsilon
\DeclareTextCommand{\textepsilon}{PU}{\83\265}% U+03B5
% U+03B6 GREEK SMALL LETTER ZETA; zeta
\DeclareTextCommand{\textzeta}{PU}{\83\266}% U+03B6
% U+03B7 GREEK SMALL LETTER ETA; eta
\DeclareTextCommand{\texteta}{PU}{\83\267}% U+03B7
% U+03B8 GREEK SMALL LETTER THETA; theta
\DeclareTextCommand{\texttheta}{PU}{\83\270}% U+03B8
% U+03B9 GREEK SMALL LETTER IOTA; iota
\DeclareTextCommand{\textiota}{PU}{\83\271}% U+03B9
% U+03BA GREEK SMALL LETTER KAPPA; kappa
\DeclareTextCommand{\textkappa}{PU}{\83\272}% U+03BA
% U+03BB GREEK SMALL LETTER LAMDA; lambda
\DeclareTextCommand{\textlambda}{PU}{\83\273}% U+03BB
% U+03BC GREEK SMALL LETTER MU; mugreek, *mu
\DeclareTextCommand{\textmugreek}{PU}{\83\274}% U+03BC
% U+03BD GREEK SMALL LETTER NU; nu
\DeclareTextCommand{\textnu}{PU}{\83\275}% U+03BD
% U+03BE GREEK SMALL LETTER XI; xi
\DeclareTextCommand{\textxi}{PU}{\83\276}% U+03BE
% U+03BF GREEK SMALL LETTER OMICRON; omicron
\DeclareTextCommand{\textomicron}{PU}{\83\277}% U+03BF
% U+03C0 GREEK SMALL LETTER PI; pi
\DeclareTextCommand{\textpi}{PU}{\83\300}% U+03C0
% U+03C1 GREEK SMALL LETTER RHO; rho
\DeclareTextCommand{\textrho}{PU}{\83\301}% U+03C1
% U+03C2 GREEK SMALL LETTER FINAL SIGMA; *sigma1, sigmafinal
\DeclareTextCommand{\textvarsigma}{PU}{\83\302}% U+03C2
% U+03C3 GREEK SMALL LETTER SIGMA; sigma
\DeclareTextCommand{\textsigma}{PU}{\83\303}% U+03C3
% U+03C4 GREEK SMALL LETTER TAU; tau
\DeclareTextCommand{\texttau}{PU}{\83\304}% U+03C4
% U+03C5 GREEK SMALL LETTER UPSILON; upsilon
\DeclareTextCommand{\textupsilon}{PU}{\83\305}% U+03C5
% U+03C6 GREEK SMALL LETTER PHI; phi
\DeclareTextCommand{\textphi}{PU}{\83\306}% U+03C6
% U+03C7 GREEK SMALL LETTER CHI; chi
\DeclareTextCommand{\textchi}{PU}{\83\307}% U+03C7
% U+03C8 GREEK SMALL LETTER PSI; psi
\DeclareTextCommand{\textpsi}{PU}{\83\310}% U+03C8
% U+03C9 GREEK SMALL LETTER OMEGA; omega
\DeclareTextCommand{\textomega}{PU}{\83\311}% U+03C9
% U+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA; iotadieresis
\DeclareTextCompositeCommand{\"}{PU}{\textiota}{\83\312}% U+03CA
% U+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA; upsilondieresis
\DeclareTextCompositeCommand{\"}{PU}{\textupsilon}{\83\313}% U+03CB
% U+03CC GREEK SMALL LETTER OMICRON WITH TONOS; omicrontonos
\DeclareTextCompositeCommand{\'}{PU}{\textomicron}{\83\314}% U+03CC
% U+03CD GREEK SMALL LETTER UPSILON WITH TONOS; upsilontonos
\DeclareTextCommand{\textupsilonacute}{PU}{\83\315}% U+03CD
\DeclareTextCompositeCommand{\'}{PU}{\textupsilon}{\83\315}% U+03CD
% U+03CE GREEK SMALL LETTER OMEGA WITH TONOS; omegatonos
\DeclareTextCompositeCommand{\'}{PU}{\textomega}{\83\316}% U+03CE
% U+03DA GREEK LETTER STIGMA; Stigmagreek
\DeclareTextCommand{\textStigmagreek}{PU}{\83\332}% U+03DA
% U+03DB GREEK SMALL LETTER STIGMA
\DeclareTextCommand{\textstigmagreek}{PU}{\83\333}% U+03DB
% U+03DC GREEK LETTER DIGAMMA; Digammagreek
\DeclareTextCommand{\textDigammagreek}{PU}{\83\334}% U+03DC
% U+03DD GREEK SMALL LETTER DIGAMMA
\DeclareTextCommand{\textdigammagreek}{PU}{\83\335}% U+03DD
% U+03DE GREEK LETTER KOPPA; Koppagreek
\DeclareTextCommand{\textKoppagreek}{PU}{\83\336}% U+03DE
% U+03DF GREEK SMALL LETTER KOPPA
\DeclareTextCommand{\textkoppagreek}{PU}{\83\337}% U+03DF
% U+03E0 GREEK LETTER SAMPI; Sampigreek
\DeclareTextCommand{\textSampigreek}{PU}{\83\340}% U+03E0
% U+03E1 GREEK SMALL LETTER SAMPI
\DeclareTextCommand{\textsampigreek}{PU}{\83\341}% U+03E1
%    \end{macrocode}
%
% \subsubsection{Cyrillic: U+0400 to U+04FF}
%
%    Thanks to Vladimir Volovich (\Email{vvv@vvv.vsu.ru}) for
%    the help with the Cyrillic glyph names.
%    \begin{macrocode}
% U+0400 CYRILLIC CAPITAL LETTER IE WITH GRAVE
\DeclareTextCompositeCommand{\`}{PU}{\CYRE}{\84\000}% U+0400
% U+0401 CYRILLIC CAPITAL LETTER IO; Iocyrillic, *afii10023
\DeclareTextCommand{\CYRYO}{PU}{\84\001}% U+0401
\DeclareTextCompositeCommand{\"}{PU}{\CYRE}{\84\001}% ???
% U+0402 CYRILLIC CAPITAL LETTER DJE; Djecyrillic, *afii10051
\DeclareTextCommand{\CYRDJE}{PU}{\84\002}% U+0402
% U+0403 CYRILLIC CAPITAL LETTER GJE; Gjecyrillic, *afii10052
\DeclareTextCompositeCommand{\'}{PU}{\CYRG}{\84\003}% U+0403
% U+0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE; Ecyrillic, *afii10053
\DeclareTextCommand{\CYRIE}{PU}{\84\004}% U+0404
% U+0405 CYRILLIC CAPITAL LETTER DZE; Dzecyrillic, *afii10054
\DeclareTextCommand{\CYRDZE}{PU}{\84\005}% U+0405
% U+0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I; Icyrillic, *afii10055
\DeclareTextCommand{\CYRII}{PU}{\84\006}% U+0406
% U+0407 CYRILLIC CAPITAL LETTER YI; Yicyrillic, *afii10056
\DeclareTextCommand{\CYRYI}{PU}{\84\007}% U+0407
\DeclareTextCompositeCommand{\"}{PU}{\CYRII}{\84\007}% U+0407
% U+0408 CYRILLIC CAPITAL LETTER JE; Jecyrillic, *afii10057
\DeclareTextCommand{\CYRJE}{PU}{\84\010}% U+0408
% U+0409 CYRILLIC CAPITAL LETTER LJE; Ljecyrillic, *afii10058
\DeclareTextCommand{\CYRLJE}{PU}{\84\011}% U+0409
% U+040A CYRILLIC CAPITAL LETTER NJE; Njecyrillic, *afii10059
\DeclareTextCommand{\CYRNJE}{PU}{\84\012}% U+040A
% U+040B CYRILLIC CAPITAL LETTER TSHE; Tshecyrillic, *afii10060
\DeclareTextCommand{\CYRTSHE}{PU}{\84\013}% U+040B
% U+040C CYRILLIC CAPITAL LETTER KJE; Kjecyrillic, *afii10061
\DeclareTextCompositeCommand{\'}{PU}{\CYRK}{\84\014}% U+040C
% U+040D CYRILLIC CAPITAL LETTER I WITH GRAVE
\DeclareTextCompositeCommand{\`}{PU}{\CYRI}{\84\015}% U+040D
% U+040E CYRILLIC CAPITAL LETTER SHORT U; Ushortcyrillic, *afii10062
\DeclareTextCommand{\CYRUSHRT}{PU}{\84\016}% U+040E
\DeclareTextCompositeCommand{\U}{PU}{\CYRU}{\84\016}% U+040E
% U+040F CYRILLIC CAPITAL LETTER DZHE; Dzhecyrillic, *afii10145
\DeclareTextCommand{\CYRDZHE}{PU}{\84\017}% U+040F
% U+0410 CYRILLIC CAPITAL LETTER A; Acyrillic, *afii10017
\DeclareTextCommand{\CYRA}{PU}{\84\020}% U+0410
% U+0411 CYRILLIC CAPITAL LETTER BE; Becyrillic, *afii10018
\DeclareTextCommand{\CYRB}{PU}{\84\021}% U+0411
% U+0412 CYRILLIC CAPITAL LETTER VE; Vecyrillic, *afii10019
\DeclareTextCommand{\CYRV}{PU}{\84\022}% U+0412
% U+0413 CYRILLIC CAPITAL LETTER GHE; Gecyrillic, *afii10020
\DeclareTextCommand{\CYRG}{PU}{\84\023}% U+0413
% U+0414 CYRILLIC CAPITAL LETTER DE; Decyrillic, *afii10021
\DeclareTextCommand{\CYRD}{PU}{\84\024}% U+0414
% U+0415 CYRILLIC CAPITAL LETTER IE; Iecyrillic, *afii10022
\DeclareTextCommand{\CYRE}{PU}{\84\025}% U+0415
% U+0416 CYRILLIC CAPITAL LETTER ZHE; Zhecyrillic, *afii10024
\DeclareTextCommand{\CYRZH}{PU}{\84\026}% U+0416
% U+0417 CYRILLIC CAPITAL LETTER ZE; Zecyrillic, *afii10025
\DeclareTextCommand{\CYRZ}{PU}{\84\027}% U+0417
% U+0418 CYRILLIC CAPITAL LETTER I; Iicyrillic, *afii10026
\DeclareTextCommand{\CYRI}{PU}{\84\030}% U+0418
% U+0419 CYRILLIC CAPITAL LETTER SHORT I; Iishortcyrillic, *afii10027
\DeclareTextCommand{\CYRISHRT}{PU}{\84\031}% U+0419
\DeclareTextCompositeCommand{\U}{PU}{\CYRI}{\84\031}% U+0419
% U+041A CYRILLIC CAPITAL LETTER KA; Kacyrillic, *afii10028
\DeclareTextCommand{\CYRK}{PU}{\84\032}% U+041A
% U+041B CYRILLIC CAPITAL LETTER EL; Elcyrillic, *afii10029
\DeclareTextCommand{\CYRL}{PU}{\84\033}% U+041B
% U+041C CYRILLIC CAPITAL LETTER EM; Emcyrillic, *afii10030
\DeclareTextCommand{\CYRM}{PU}{\84\034}% U+041C
% U+041D CYRILLIC CAPITAL LETTER EN; Encyrillic, *afii10031
\DeclareTextCommand{\CYRN}{PU}{\84\035}% U+041D
% U+041E CYRILLIC CAPITAL LETTER O; Ocyrillic, *afii10032
\DeclareTextCommand{\CYRO}{PU}{\84\036}% U+041E
% U+041F CYRILLIC CAPITAL LETTER PE; Pecyrillic, *afii10033
\DeclareTextCommand{\CYRP}{PU}{\84\037}% U+041F
% U+0420 CYRILLIC CAPITAL LETTER ER; Ercyrillic, *afii10034
\DeclareTextCommand{\CYRR}{PU}{\84\040}% U+0420
% U+0421 CYRILLIC CAPITAL LETTER ES; Escyrillic, *afii10035
\DeclareTextCommand{\CYRS}{PU}{\84\041}% U+0421
% U+0422 CYRILLIC CAPITAL LETTER TE; Tecyrillic, *afii10036
\DeclareTextCommand{\CYRT}{PU}{\84\042}% U+0422
% U+0423 CYRILLIC CAPITAL LETTER U; Ucyrillic, *afii10037
\DeclareTextCommand{\CYRU}{PU}{\84\043}% U+0423
% U+0424 CYRILLIC CAPITAL LETTER EF; Efcyrillic, *afii10038
\DeclareTextCommand{\CYRF}{PU}{\84\044}% U+0424
% U+0425 CYRILLIC CAPITAL LETTER HA; Khacyrillic, *afii10039
\DeclareTextCommand{\CYRH}{PU}{\84\045}% U+0425
% U+0426 CYRILLIC CAPITAL LETTER TSE; Tsecyrillic, *afii10040
\DeclareTextCommand{\CYRC}{PU}{\84\046}% U+0426
% U+0427 CYRILLIC CAPITAL LETTER CHE; Checyrillic, *afii10041
\DeclareTextCommand{\CYRCH}{PU}{\84\047}% U+0427
% U+0428 CYRILLIC CAPITAL LETTER SHA; Shacyrillic, *afii10042
\DeclareTextCommand{\CYRSH}{PU}{\84\050}% U+0428
% U+0429 CYRILLIC CAPITAL LETTER SHCHA; Shchacyrillic, *afii10043
\DeclareTextCommand{\CYRSHCH}{PU}{\84\051}% U+0429
% U+042A CYRILLIC CAPITAL LETTER HARD SIGN; Hardsigncyrillic, *afii10044
\DeclareTextCommand{\CYRHRDSN}{PU}{\84\052}% U+042A
% U+042B CYRILLIC CAPITAL LETTER YERU; Yericyrillic, *afii10045
\DeclareTextCommand{\CYRERY}{PU}{\84\053}% U+042B
% U+042C CYRILLIC CAPITAL LETTER SOFT SIGN; Softsigncyrillic, *afii10046
\DeclareTextCommand{\CYRSFTSN}{PU}{\84\054}% U+042C
% U+042D CYRILLIC CAPITAL LETTER E; Ereversedcyrillic, *afii10047
\DeclareTextCommand{\CYREREV}{PU}{\84\055}% U+042D
% U+042E CYRILLIC CAPITAL LETTER YU; IUcyrillic, *afii10048
\DeclareTextCommand{\CYRYU}{PU}{\84\056}% U+042E
% U+042F CYRILLIC CAPITAL LETTER YA; IAcyrillic, *afii10049
\DeclareTextCommand{\CYRYA}{PU}{\84\057}% U+042F
% U+0430 CYRILLIC SMALL LETTER A; acyrillic, *afii10065
\DeclareTextCommand{\cyra}{PU}{\84\060}% U+0430
% U+0431 CYRILLIC SMALL LETTER BE; *afii10066, becyrillic
\DeclareTextCommand{\cyrb}{PU}{\84\061}% U+0431
% U+0432 CYRILLIC SMALL LETTER VE; *afii10067, vecyrillic
\DeclareTextCommand{\cyrv}{PU}{\84\062}% U+0432
% U+0433 CYRILLIC SMALL LETTER GHE; *afii10068, gecyrillic
\DeclareTextCommand{\cyrg}{PU}{\84\063}% U+0433
% U+0434 CYRILLIC SMALL LETTER DE; *afii10069, decyrillic
\DeclareTextCommand{\cyrd}{PU}{\84\064}% U+0434
% U+0435 CYRILLIC SMALL LETTER IE; *afii10070, iecyrillic
\DeclareTextCommand{\cyre}{PU}{\84\065}% U+0435
% U+0436 CYRILLIC SMALL LETTER ZHE; *afii10072, zhecyrillic
\DeclareTextCommand{\cyrzh}{PU}{\84\066}% U+0436
% U+0437 CYRILLIC SMALL LETTER ZE; *afii10073, zecyrillic
\DeclareTextCommand{\cyrz}{PU}{\84\067}% U+0437
% U+0438 CYRILLIC SMALL LETTER I; *afii10074, iicyrillic
\DeclareTextCommand{\cyri}{PU}{\84\070}% U+0438
% U+0439 CYRILLIC SMALL LETTER SHORT I; *afii10075, iishortcyrillic
\DeclareTextCommand{\cyrishrt}{PU}{\84\071}% U+0439
\DeclareTextCompositeCommand{\U}{PU}{\cyri}{\84\071}% U+0439
% U+043A CYRILLIC SMALL LETTER KA; *afii10076, kacyrillic
\DeclareTextCommand{\cyrk}{PU}{\84\072}% U+043A
% U+043B CYRILLIC SMALL LETTER EL; *afii10077, elcyrillic
\DeclareTextCommand{\cyrl}{PU}{\84\073}% U+043B
% U+043C CYRILLIC SMALL LETTER EM; *afii10078, emcyrillic
\DeclareTextCommand{\cyrm}{PU}{\84\074}% U+043C
% U+043D CYRILLIC SMALL LETTER EN; *afii10079, encyrillic
\DeclareTextCommand{\cyrn}{PU}{\84\075}% U+043D
% U+043E CYRILLIC SMALL LETTER O; *afii10080, ocyrillic
\DeclareTextCommand{\cyro}{PU}{\84\076}% U+043E
% U+043F CYRILLIC SMALL LETTER PE; *afii10081, pecyrillic
\DeclareTextCommand{\cyrp}{PU}{\84\077}% U+043F
% U+0440 CYRILLIC SMALL LETTER ER; *afii10082, ercyrillic
\DeclareTextCommand{\cyrr}{PU}{\84\100}% U+0440
% U+0441 CYRILLIC SMALL LETTER ES; *afii10083, escyrillic
\DeclareTextCommand{\cyrs}{PU}{\84\101}% U+0441
% U+0442 CYRILLIC SMALL LETTER TE; *afii10084, tecyrillic
\DeclareTextCommand{\cyrt}{PU}{\84\102}% U+0442
% U+0443 CYRILLIC SMALL LETTER U; *afii10085, ucyrillic
\DeclareTextCommand{\cyru}{PU}{\84\103}% U+0443
% U+0444 CYRILLIC SMALL LETTER EF; *afii10086, efcyrillic
\DeclareTextCommand{\cyrf}{PU}{\84\104}% U+0444
% U+0445 CYRILLIC SMALL LETTER HA; *afii10087, khacyrillic
\DeclareTextCommand{\cyrh}{PU}{\84\105}% U+0445
% U+0446 CYRILLIC SMALL LETTER TSE; *afii10088, tsecyrillic
\DeclareTextCommand{\cyrc}{PU}{\84\106}% U+0446
% U+0447 CYRILLIC SMALL LETTER CHE; *afii10089, checyrillic
\DeclareTextCommand{\cyrch}{PU}{\84\107}% U+0447
% U+0448 CYRILLIC SMALL LETTER SHA; *afii10090, shacyrillic
\DeclareTextCommand{\cyrsh}{PU}{\84\110}% U+0448
% U+0449 CYRILLIC SMALL LETTER SHCHA; *afii10091, shchacyrillic
\DeclareTextCommand{\cyrshch}{PU}{\84\111}% U+0449
% U+044A CYRILLIC SMALL LETTER HARD SIGN; *afii10092, hardsigncyrillic
\DeclareTextCommand{\cyrhrdsn}{PU}{\84\112}% U+044A
% U+044B CYRILLIC SMALL LETTER YERU; *afii10093, yericyrillic
\DeclareTextCommand{\cyrery}{PU}{\84\113}% U+044B
% U+044C CYRILLIC SMALL LETTER SOFT SIGN; *afii10094, softsigncyrillic
\DeclareTextCommand{\cyrsftsn}{PU}{\84\114}% U+044C
% U+044D CYRILLIC SMALL LETTER E; *afii10095, ereversedcyrillic
\DeclareTextCommand{\cyrerev}{PU}{\84\115}% U+044D
% U+044E CYRILLIC SMALL LETTER YU; *afii10096, iucyrillic
\DeclareTextCommand{\cyryu}{PU}{\84\116}% U+044E
% U+044F CYRILLIC SMALL LETTER YA; *afii10097, iacyrillic
\DeclareTextCommand{\cyrya}{PU}{\84\117}% U+044F
% U+0450 CYRILLIC SMALL LETTER IE WITH GRAVE
\DeclareTextCompositeCommand{\`}{PU}{\cyre}{\84\120}% U+0450
% U+0451 CYRILLIC SMALL LETTER IO; *afii10071, iocyrillic
\DeclareTextCommand{\cyryo}{PU}{\84\121}% U+0451
\DeclareTextCompositeCommand{\"}{PU}{\cyre}{\84\121}% U+0451
% U+0452 CYRILLIC SMALL LETTER DJE; *afii10099, djecyrillic
\DeclareTextCommand{\cyrdje}{PU}{\84\122}% U+0452
% U+0453 CYRILLIC SMALL LETTER GJE; *afii10100, gjecyrillic
\DeclareTextCompositeCommand{\'}{PU}{\cyrg}{\84\123}% U+0453
% U+0454 CYRILLIC SMALL LETTER UKRAINIAN IE; *afii10101, ecyrillic
\DeclareTextCommand{\cyrie}{PU}{\84\124}% U+0454
% U+0455 CYRILLIC SMALL LETTER DZE; *afii10102, dzecyrillic
\DeclareTextCommand{\cyrdze}{PU}{\84\125}% U+0455
% U+0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I; *afii10103, icyrillic
\DeclareTextCommand{\cyrii}{PU}{\84\126}% U+0456
% U+0457 CYRILLIC SMALL LETTER YI; *afii10104, yicyrillic
\DeclareTextCommand{\cyryi}{PU}{\84\127}% U+0457
\DeclareTextCompositeCommand{\"}{PU}{\cyrii}{\84\127}% U+0457
% U+0458 CYRILLIC SMALL LETTER JE; *afii10105, jecyrillic
\DeclareTextCommand{\cyrje}{PU}{\84\130}% U+0458
% U+0459 CYRILLIC SMALL LETTER LJE; *afii10106, ljecyrillic
\DeclareTextCommand{\cyrlje}{PU}{\84\131}% U+0459
% U+045A CYRILLIC SMALL LETTER NJE; *afii10107, njecyrillic
\DeclareTextCommand{\cyrnje}{PU}{\84\132}% U+045A
% U+045B CYRILLIC SMALL LETTER TSHE; *afii10108, tshecyrillic
\DeclareTextCommand{\cyrtshe}{PU}{\84\133}% U+045B
% U+045C CYRILLIC SMALL LETTER KJE; *afii10109, kjecyrillic
\DeclareTextCompositeCommand{\'}{PU}{\cyrk}{\84\134}% U+045C
% U+045D CYRILLIC SMALL LETTER I WITH GRAVE
\DeclareTextCompositeCommand{\`}{PU}{\cyri}{\84\135}% U+045D
% U+045E CYRILLIC SMALL LETTER SHORT U; *afii10110, ushortcyrillic
\DeclareTextCommand{\cyrushrt}{PU}{\84\136}% U+045E
\DeclareTextCompositeCommand{\U}{PU}{\curu}{\84\136}% U+045E
% U+045F CYRILLIC SMALL LETTER DZHE; *afii10193, dzhecyrillic
\DeclareTextCommand{\cyrdzhe}{PU}{\84\137}% U+045F
% U+0460 CYRILLIC CAPITAL LETTER OMEGA; Omegacyrillic
\DeclareTextCommand{\CYROMEGA}{PU}{\84\140}% U+0460
% U+0461 CYRILLIC SMALL LETTER OMEGA; omegacyrillic
\DeclareTextCommand{\cyromega}{PU}{\84\141}% U+0461
% U+0462 CYRILLIC CAPITAL LETTER YAT; Yatcyrillic, *afii10146
\DeclareTextCommand{\CYRYAT}{PU}{\84\142}% U+0462
% U+0463 CYRILLIC SMALL LETTER YAT; *afii10194, yatcyrillic
\DeclareTextCommand{\cyryat}{PU}{\84\143}% U+0463
% U+0464 CYRILLIC CAPITAL LETTER IOTIFIED E; Eiotifiedcyrillic
\DeclareTextCommand{\CYRIOTE}{PU}{\84\144}% U+0464
% U+0465 CYRILLIC SMALL LETTER IOTIFIED E; eiotifiedcyrillic
\DeclareTextCommand{\cyriote}{PU}{\84\145}% U+0465
% U+0466 CYRILLIC CAPITAL LETTER LITTLE YUS; Yuslittlecyrillic
\DeclareTextCommand{\CYRLYUS}{PU}{\84\146}% U+0466
% U+0467 CYRILLIC SMALL LETTER LITTLE YUS; yuslittlecyrillic
\DeclareTextCommand{\cyrlyus}{PU}{\84\147}% U+0467
% U+0468 CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS; Yuslittleiotifiedcyrillic
\DeclareTextCommand{\CYRIOTLYUS}{PU}{\84\150}% U+0468
% U+0469 CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS; yuslittleiotifiedcyrillic
\DeclareTextCommand{\cyriotlyus}{PU}{\84\151}% U+0469
% U+046A CYRILLIC CAPITAL LETTER BIG YUS; Yusbigcyrillic
\DeclareTextCommand{\CYRBYUS}{PU}{\84\152}% U+046A
% U+046B CYRILLIC SMALL LETTER BIG YUS; yusbigcyrillic
\DeclareTextCommand{\cyrbyus}{PU}{\84\153}% U+046B
% U+046C CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS; Yusbigiotifiedcyrillic
\DeclareTextCommand{\CYRIOTBYUS}{PU}{\84\154}% U+046C
% U+046D CYRILLIC SMALL LETTER IOTIFIED BIG YUS; yusbigiotifiedcyrillic
\DeclareTextCommand{\cyriotbyus}{PU}{\84\155}% U+046D
% U+046E CYRILLIC CAPITAL LETTER KSI; Ksicyrillic
\DeclareTextCommand{\CYRKSI}{PU}{\84\156}% U+046E
% U+046F CYRILLIC SMALL LETTER KSI; ksicyrillic
\DeclareTextCommand{\cyrksi}{PU}{\84\157}% U+046F
% U+0470 CYRILLIC CAPITAL LETTER PSI; Psicyrillic
\DeclareTextCommand{\CYRPSI}{PU}{\84\160}% U+0470
% U+0471 CYRILLIC SMALL LETTER PSI; psicyrillic
\DeclareTextCommand{\cyrpsi}{PU}{\84\161}% U+0471
% U+0472 CYRILLIC CAPITAL LETTER FITA; Fitacyrillic, *afii10147
\DeclareTextCommand{\CYRFITA}{PU}{\84\162}% U+0472
% U+0473 CYRILLIC SMALL LETTER FITA; *afii10195, fitacyrillic
\DeclareTextCommand{\cyrfita}{PU}{\84\163}% U+0473
% U+0474 CYRILLIC CAPITAL LETTER IZHITSA; Izhitsacyrillic, *afii10148
\DeclareTextCommand{\CYRIZH}{PU}{\84\164}% U+0474
% U+0475 CYRILLIC SMALL LETTER IZHITSA; *afii10196, izhitsacyrillic
\DeclareTextCommand{\cyrizh}{PU}{\84\165}% U+0475
% U+0476 CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT; Izhitsadblgravecyrillic
\DeclareTextCompositeCommand{\C}{PU}{\CYRIZH}{\84\166}% U+0476
% U+0477 CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT; izhitsadblgravecyrillic
\DeclareTextCompositeCommand{\C}{PU}{\cyrizh}{\84\167}% U+0477
% U+0478 CYRILLIC CAPITAL LETTER UK; Ukcyrillic
\DeclareTextCommand{\CYRUK}{PU}{\84\170}% U+0478
% U+0479 CYRILLIC SMALL LETTER UK; ukcyrillic
\DeclareTextCommand{\cyruk}{PU}{\84\171}% U+0479
% U+047A CYRILLIC CAPITAL LETTER ROUND OMEGA; Omegaroundcyrillic
\DeclareTextCommand{\CYROMEGARND}{PU}{\84\172}% U+047A
% U+047B CYRILLIC SMALL LETTER ROUND OMEGA; omegaroundcyrillic
\DeclareTextCommand{\cyromegarnd}{PU}{\84\173}% U+047B
% U+047C CYRILLIC CAPITAL LETTER OMEGA WITH TITLO; Omegatitlocyrillic
\DeclareTextCommand{\CYROMEGATITLO}{PU}{\84\174}% U+047C
% U+047D CYRILLIC SMALL LETTER OMEGA WITH TITLO; omegatitlocyrillic
\DeclareTextCommand{\cyromegatitlo}{PU}{\84\175}% U+047D
% U+047E CYRILLIC CAPITAL LETTER OT; Otcyrillic
\DeclareTextCommand{\CYROT}{PU}{\84\176}% U+047E
% U+047F CYRILLIC SMALL LETTER OT; otcyrillic
\DeclareTextCommand{\cyrot}{PU}{\84\177}% U+047F
% U+0480 CYRILLIC CAPITAL LETTER KOPPA; Koppacyrillic
\DeclareTextCommand{\CYRKOPPA}{PU}{\84\200}% U+0480
% U+0481 CYRILLIC SMALL LETTER KOPPA; koppacyrillic
\DeclareTextCommand{\cyrkoppa}{PU}{\84\201}% U+0481
% U+0482 CYRILLIC THOUSANDS SIGN; thousandcyrillic
\DeclareTextCommand{\cyrthousands}{PU}{\84\202}% U+0482
%    \end{macrocode}
%    |\84\203|: U+0483 COMBINING CYRILLIC TITLO; titlocyrilliccmb\\
%    |\84\204|: U+0484 COMBINING CYRILLIC PALATALIZATION; palatalizationcyrilliccmb\\
%    |\84\205|: U+0485 COMBINING CYRILLIC DASIA PNEUMATA; dasiapneumatacyrilliccmb\\
%    |\84\206|: U+0486 COMBINING CYRILLIC PSILI PNEUMATA; psilipneumatacyrilliccmb\\
%    |\84\207|: U+0487 COMBINING CYRILLIC POKRYTIE\\
%    |\84\210|: U+0488 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN\\
%    |\84\211|: U+0489 COMBINING CYRILLIC MILLIONS SIGN
%    \begin{macrocode}
% U+048A CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
\DeclareTextCommand{\CYRISHRTDSC}{PU}{\84\212}% U+048A
% U+048B CYRILLIC SMALL LETTER SHORT I WITH TAIL
\DeclareTextCommand{\cyrishrtdsc}{PU}{\84\213}% U+048B
% U+048C CYRILLIC CAPITAL LETTER SEMISOFT SIGN
\DeclareTextCommand{\CYRSEMISFTSN}{PU}{\84\214}% U+048C
% U+048D CYRILLIC SMALL LETTER SEMISOFT SIGN
\DeclareTextCommand{\cyrsemisftsn}{PU}{\84\215}% U+048D
% U+048E CYRILLIC CAPITAL LETTER ER WITH TICK
\DeclareTextCommand{\CYRRTICK}{PU}{\84\216}% U+048E
% U+048F CYRILLIC SMALL LETTER ER WITH TICK
\DeclareTextCommand{\cyrrtick}{PU}{\84\217}% U+048F
% U+0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN; Gheupturncyrillic, *afii10050
\DeclareTextCommand{\CYRGUP}{PU}{\84\220}% U+0490
% U+0491 CYRILLIC SMALL LETTER GHE WITH UPTURN; *afii10098, gheupturncyrillic
\DeclareTextCommand{\cyrgup}{PU}{\84\221}% U+0491
% U+0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE; Ghestrokecyrillic
\DeclareTextCommand{\CYRGHCRS}{PU}{\84\222}% U+0492
% U+0493 CYRILLIC SMALL LETTER GHE WITH STROKE; ghestrokecyrillic
\DeclareTextCommand{\cyrghcrs}{PU}{\84\223}% U+0493
% U+0494 CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK; Ghemiddlehookcyrillic
\DeclareTextCommand{\CYRGHK}{PU}{\84\224}% U+0494
% U+0495 CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK; ghemiddlehookcyrillic
\DeclareTextCommand{\cyrghk}{PU}{\84\225}% U+0495
% U+0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER; Zhedescendercyrillic
\DeclareTextCommand{\CYRZHDSC}{PU}{\84\226}% U+0496
% U+0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER; zhedescendercyrillic
\DeclareTextCommand{\cyrzhdsc}{PU}{\84\227}% U+0497
% U+0498 CYRILLIC CAPITAL LETTER ZE WITH DESCENDER; Zedescendercyrillic
\DeclareTextCommand{\CYRZDSC}{PU}{\84\230}% U+0498
\DeclareTextCompositeCommand{\c}{PU}{\CYRZ}{\84\230}% U+0498
% U+0499 CYRILLIC SMALL LETTER ZE WITH DESCENDER; zedescendercyrillic
\DeclareTextCommand{\cyrzdsc}{PU}{\84\231}% U+0499
\DeclareTextCompositeCommand{\c}{PU}{\cyrz}{\84\231}% U+0499
% U+049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER; Kadescendercyrillic
\DeclareTextCommand{\CYRKDSC}{PU}{\84\232}% U+049A
% U+049B CYRILLIC SMALL LETTER KA WITH DESCENDER; kadescendercyrillic
\DeclareTextCommand{\cyrkdsc}{PU}{\84\233}% U+049B
% U+049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE; Kaverticalstrokecyrillic
\DeclareTextCommand{\CYRKVCRS}{PU}{\84\234}% U+049C
% U+049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE; kaverticalstrokecyrillic
\DeclareTextCommand{\cyrkvcrs}{PU}{\84\235}% U+049D
% U+049E CYRILLIC CAPITAL LETTER KA WITH STROKE; Kastrokecyrillic
\DeclareTextCommand{\CYRKHCRS}{PU}{\84\236}% U+049E
% U+049F CYRILLIC SMALL LETTER KA WITH STROKE; kastrokecyrillic
\DeclareTextCommand{\cyrkhcrs}{PU}{\84\237}% U+049F
% U+04A0 CYRILLIC CAPITAL LETTER BASHKIR KA; Kabashkircyrillic
\DeclareTextCommand{\CYRKBEAK}{PU}{\84\240}% U+04A0
% U+04A1 CYRILLIC SMALL LETTER BASHKIR KA; kabashkircyrillic
\DeclareTextCommand{\cyrkbeak}{PU}{\84\241}% U+04A1
% U+04A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER; Endescendercyrillic
\DeclareTextCommand{\CYRNDSC}{PU}{\84\242}% U+04A2
% U+04A3 CYRILLIC SMALL LETTER EN WITH DESCENDER; endescendercyrillic
\DeclareTextCommand{\cyrndsc}{PU}{\84\243}% U+04A3
% U+04A4 CYRILLIC CAPITAL LIGATURE EN GHE; Enghecyrillic
\DeclareTextCommand{\CYRNG}{PU}{\84\244}% U+04A4
% U+04A5 CYRILLIC SMALL LIGATURE EN GHE; enghecyrillic
\DeclareTextCommand{\cyrng}{PU}{\84\245}% U+04A5
% U+04A6 CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK; Pemiddlehookcyrillic
\DeclareTextCommand{\CYRPHK}{PU}{\84\246}% U+04A6
% U+04A7 CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK; pemiddlehookcyrillic
\DeclareTextCommand{\cyrphk}{PU}{\84\247}% U+04A7
% U+04A8 CYRILLIC CAPITAL LETTER ABKHASIAN HA; Haabkhasiancyrillic
\DeclareTextCommand{\CYRABHHA}{PU}{\84\250}% U+04A8
% U+04A9 CYRILLIC SMALL LETTER ABKHASIAN HA; haabkhasiancyrillic
\DeclareTextCommand{\cyrabhha}{PU}{\84\251}% U+04A9
% U+04AA CYRILLIC CAPITAL LETTER ES WITH DESCENDER; Esdescendercyrillic
\DeclareTextCommand{\CYRSDSC}{PU}{\84\252}% U+04AA
\DeclareTextCompositeCommand{\CYRSDSC}{PU}{\CYRS}{\84\252}% U+04AA
% U+04AB CYRILLIC SMALL LETTER ES WITH DESCENDER; esdescendercyrillic
\DeclareTextCommand{\cyrsdsc}{PU}{\84\253}% U+04AB
\DeclareTextCompositeCommand{\k}{PU}{\cyrs}{\84\253}% U+04AB
% U+04AC CYRILLIC CAPITAL LETTER TE WITH DESCENDER; Tedescendercyrillic
\DeclareTextCommand{\CYRTDSC}{PU}{\84\254}% U+04AC
% U+04AD CYRILLIC SMALL LETTER TE WITH DESCENDER; tedescendercyrillic
\DeclareTextCommand{\cyrtdsc}{PU}{\84\255}% U+04AD
% U+04AE CYRILLIC CAPITAL LETTER STRAIGHT U; Ustraightcyrillic
\DeclareTextCommand{\CYRY}{PU}{\84\256}% U+04AE
% U+04AF CYRILLIC SMALL LETTER STRAIGHT U; ustraightcyrillic
\DeclareTextCommand{\cyry}{PU}{\84\257}% U+04AF
% U+04B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE; Ustraightstrokecyrillic
\DeclareTextCommand{\CYRYHCRS}{PU}{\84\260}% U+04B0
% U+04B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE; ustraightstrokecyrillic
\DeclareTextCommand{\cyryhcrs}{PU}{\84\261}% U+04B1
% U+04B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER; Hadescendercyrillic
\DeclareTextCommand{\CYRHDSC}{PU}{\84\262}% U+04B2
% U+04B3 CYRILLIC SMALL LETTER HA WITH DESCENDER; hadescendercyrillic
\DeclareTextCommand{\cyrhdsc}{PU}{\84\263}% U+04B3
% U+04B4 CYRILLIC CAPITAL LIGATURE TE TSE; Tetsecyrillic
\DeclareTextCommand{\CYRTETSE}{PU}{\84\264}% U+04B4
% U+04B5 CYRILLIC SMALL LIGATURE TE TSE; tetsecyrillic
\DeclareTextCommand{\cyrtetse}{PU}{\84\265}% U+04B5
% U+04B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER; Chedescendercyrillic
\DeclareTextCommand{\CYRCHRDSC}{PU}{\84\266}% U+04B6
% U+04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER; chedescendercyrillic
\DeclareTextCommand{\cyrchrdsc}{PU}{\84\267}% U+04B7
% U+04B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE; Cheverticalstrokecyrillic
\DeclareTextCommand{\CYRCHVCRS}{PU}{\84\270}% U+04B8
% U+04B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE; cheverticalstrokecyrillic
\DeclareTextCommand{\cyrchvcrs}{PU}{\84\271}% U+04B9
% U+04BA CYRILLIC CAPITAL LETTER SHHA; Shhacyrillic
\DeclareTextCommand{\CYRSHHA}{PU}{\84\272}% U+04BA
% U+04BB CYRILLIC SMALL LETTER SHHA; shhacyrillic
\DeclareTextCommand{\cyrshha}{PU}{\84\273}% U+04BB
% U+04BC CYRILLIC CAPITAL LETTER ABKHASIAN CHE; Cheabkhasiancyrillic
\DeclareTextCommand{\CYRABHCH}{PU}{\84\274}% U+04BC
% U+04BD CYRILLIC SMALL LETTER ABKHASIAN CHE; cheabkhasiancyrillic
\DeclareTextCommand{\cyrabhch}{PU}{\84\275}% U+04BD
% U+04BE CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER; Chedescenderabkhasiancyrillic
\DeclareTextCommand{\CYRABHCHDSC}{PU}{\84\276}% U+04BE
\DeclareTextCompositeCommand{\k}{PU}{\CYRABHCH}{\84\276}% U+04BE
% U+04BF CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER; chedescenderabkhasiancyrillic
\DeclareTextCommand{\cyrabhchdsc}{PU}{\84\277}% U+04BF
\DeclareTextCompositeCommand{\k}{PU}{\cyrabhch}{\84\277}% U+04BF
% U+04C0 CYRILLIC LETTER PALOCHKA; palochkacyrillic
\DeclareTextCommand{\CYRpalochka}{PU}{\84\300}% U+04C0
% U+04C1 CYRILLIC CAPITAL LETTER ZHE WITH BREVE; Zhebrevecyrillic
\DeclareTextCompositeCommand{\U}{PU}{\CYRZH}{\84\301}% U+04C1
% U+04C2 CYRILLIC SMALL LETTER ZHE WITH BREVE; zhebrevecyrillic
\DeclareTextCompositeCommand{\U}{PU}{\cyrzh}{\84\302}% U+04C2
% U+04C3 CYRILLIC CAPITAL LETTER KA WITH HOOK; Kahookcyrillic
\DeclareTextCommand{\CYRKHK}{PU}{\84\303}% U+04C3
% U+04C4 CYRILLIC SMALL LETTER KA WITH HOOK; kahookcyrillic
\DeclareTextCommand{\cyrkhk}{PU}{\84\304}% U+04C4
% U+04C5 CYRILLIC CAPITAL LETTER EL WITH TAIL
\DeclareTextCommand{\CYRLDSC}{PU}{\84\305}% U+04C5
% U+04C6 CYRILLIC SMALL LETTER EL WITH TAIL
\DeclareTextCommand{\cyrldsc}{PU}{\84\306}% U+04C6
% U+04C7 CYRILLIC CAPITAL LETTER EN WITH HOOK; Enhookcyrillic
\DeclareTextCommand{\CYRNHK}{PU}{\84\307}% U+04C7
% U+04C8 CYRILLIC SMALL LETTER EN WITH HOOK; enhookcyrillic
\DeclareTextCommand{\cyrnhk}{PU}{\84\310}% U+04C8
% U+04CB CYRILLIC CAPITAL LETTER KHAKASSIAN CHE; Chekhakassiancyrillic
\DeclareTextCommand{\CYRCHLDSC}{PU}{\84\313}% U+04CB
% U+04CC CYRILLIC SMALL LETTER KHAKASSIAN CHE; chekhakassiancyrillic
\DeclareTextCommand{\cyrchldsc}{PU}{\84\314}% U+04CC
% U+04CD CYRILLIC CAPITAL LETTER EM WITH TAIL
\DeclareTextCommand{\CYRMDSC}{PU}{\84\315}% U+04CD
% U+04CE CYRILLIC SMALL LETTER EM WITH TAIL
\DeclareTextCommand{\cyrmdsc}{PU}{\84\316}% U+04CE
%    \end{macrocode}
%    |\84\317|: U+04CF CYRILLIC SMALL LETTER PALOCHKA
%    \begin{macrocode}
% U+04D0 CYRILLIC CAPITAL LETTER A WITH BREVE; Abrevecyrillic
\DeclareTextCompositeCommand{\U}{PU}{\CYRA}{\84\320}% U+04D0
% U+04D1 CYRILLIC SMALL LETTER A WITH BREVE; abrevecyrillic
\DeclareTextCompositeCommand{\U}{PU}{\cyra}{\84\321}% U+04D1
% U+04D2 CYRILLIC CAPITAL LETTER A WITH DIAERESIS; Adieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\CYRA}{\84\322}% U+04D2
% U+04D3 CYRILLIC SMALL LETTER A WITH DIAERESIS; adieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\cyra}{\84\323}% U+04D3
% U+04D4 CYRILLIC CAPITAL LIGATURE A IE; Aiecyrillic
\DeclareTextCommand{\CYRAE}{PU}{\84\324}% U+04D4
% U+04D5 CYRILLIC SMALL LIGATURE A IE; aiecyrillic
\DeclareTextCommand{\cyrae}{PU}{\84\325}% U+04D5
% U+04D6 CYRILLIC CAPITAL LETTER IE WITH BREVE; Iebrevecyrillic
\DeclareTextCompositeCommand{\U}{PU}{\CYRE}{\84\326}% U+04D6
% U+04D7 CYRILLIC SMALL LETTER IE WITH BREVE; iebrevecyrillic
\DeclareTextCompositeCommand{\U}{PU}{\cyre}{\84\327}% U+04D7
% U+04D8 CYRILLIC CAPITAL LETTER SCHWA; Schwacyrillic
\DeclareTextCommand{\CYRSCHWA}{PU}{\84\330}% U+04D8
% U+04D9 CYRILLIC SMALL LETTER SCHWA; *afii10846, schwacyrillic
\DeclareTextCommand{\cyrschwa}{PU}{\84\331}% U+04D9
% U+04DA CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS; Schwadieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\CYRSCHWA}{\84\332}% U+04DA
% U+04DB CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS; schwadieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\cyrschwa}{\84\333}% U+04DB
% U+04DC CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS; Zhedieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\CYRZH}{\84\334}% U+04DC
% U+04DD CYRILLIC SMALL LETTER ZHE WITH DIAERESIS; zhedieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\cyrzh}{\84\335}% U+04DD
% U+04DE CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS; Zedieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\CYRZ}{\84\336}% U+04DE
% U+04DF CYRILLIC SMALL LETTER ZE WITH DIAERESIS; zedieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\cyrz}{\84\337}% U+04DF
% U+04E0 CYRILLIC CAPITAL LETTER ABKHASIAN DZE; Dzeabkhasiancyrillic
\DeclareTextCommand{\CYRABHDZE}{PU}{\84\340}% U+04E0
% U+04E1 CYRILLIC SMALL LETTER ABKHASIAN DZE; dzeabkhasiancyrillic
\DeclareTextCommand{\cyrabhdze}{PU}{\84\341}% U+04E1
% U+04E2 CYRILLIC CAPITAL LETTER I WITH MACRON; Imacroncyrillic
\DeclareTextCompositeCommand{\=}{PU}{\CYRI}{\84\342}% U+04E2
% U+04E3 CYRILLIC SMALL LETTER I WITH MACRON; imacroncyrillic
\DeclareTextCompositeCommand{\=}{PU}{\cyri}{\84\343}% U+04E3
% U+04E4 CYRILLIC CAPITAL LETTER I WITH DIAERESIS; Idieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\CYRI}{\84\344}% U+04E4
% U+04E5 CYRILLIC SMALL LETTER I WITH DIAERESIS; idieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\cyri}{\84\345}% U+04E5
% U+04E6 CYRILLIC CAPITAL LETTER O WITH DIAERESIS; Odieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\CYRO}{\84\346}% U+04E6
% U+04E7 CYRILLIC SMALL LETTER O WITH DIAERESIS; odieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\cyro}{\84\347}% U+04E7
% U+04E8 CYRILLIC CAPITAL LETTER BARRED O; Obarredcyrillic
\DeclareTextCommand{\CYROTLD}{PU}{\84\350}% U+04E8
% U+04E9 CYRILLIC SMALL LETTER BARRED O; obarredcyrillic
\DeclareTextCommand{\cyrotld}{PU}{\84\351}% U+04E9
% U+04EA CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS; Obarreddieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\CYROTLD}{\84\352}% U+04EA
% U+04EB CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS; obarreddieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\cyrotld}{\84\353}% U+04EB
% U+04EC CYRILLIC CAPITAL LETTER E WITH DIAERESIS
\DeclareTextCompositeCommand{\"}{PU}{\CYREREV}{\84\354}% U+04EC
% U+04ED CYRILLIC SMALL LETTER E WITH DIAERESIS
\DeclareTextCompositeCommand{\"}{PU}{\cyreref}{\84\355}% U+04ED
% U+04EE CYRILLIC CAPITAL LETTER U WITH MACRON; Umacroncyrillic
\DeclareTextCompositeCommand{\=}{PU}{\CYRU}{\84\356}% U+04EE
% U+04EF CYRILLIC SMALL LETTER U WITH MACRON; umacroncyrillic
\DeclareTextCompositeCommand{\=}{PU}{\cyru}{\84\357}% U+04EF
% U+04F0 CYRILLIC CAPITAL LETTER U WITH DIAERESIS; Udieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\CYRU}{\84\360}% U+04F0
% U+04F1 CYRILLIC SMALL LETTER U WITH DIAERESIS; udieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\cyru}{\84\361}% U+04F1
% U+04F2 CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE; Uhungarumlautcyrillic
\DeclareTextCompositeCommand{\H}{PU}{\CYRU}{\84\362}% U+04F2
% U+04F3 CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE; uhungarumlautcyrillic
\DeclareTextCompositeCommand{\H}{PU}{\cyru}{\84\363}% U+04F3
% U+04F4 CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS; Chedieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\CYRCH}{\84\364}% U+04F4
% U+04F5 CYRILLIC SMALL LETTER CHE WITH DIAERESIS; chedieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\cyrch}{\84\365}% U+04F5
% U+04F6 CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
\DeclareTextCommand{\CYRGDSC}{PU}{\84\366}% U+04F6
% U+04F7 CYRILLIC SMALL LETTER GHE WITH DESCENDER
\DeclareTextCommand{\cyrgdsc}{PU}{\84\367}% U+04F7
% U+04F8 CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS; Yerudieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\CYRERY}{\84\370}% U+04F8
% U+04F9 CYRILLIC SMALL LETTER YERU WITH DIAERESIS; yerudieresiscyrillic
\DeclareTextCompositeCommand{\"}{PU}{\cyrery}{\84\371}% U+04F9
%    \end{macrocode}
%    |\84\372|: U+04FA CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK\\
%    |\84\373|: U+04FB CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK
%    \begin{macrocode}
% U+04FC CYRILLIC CAPITAL LETTER HA WITH HOOK
\DeclareTextCommand{\CYRHHK}{PU}{\84\374}% U+04FC
% U+04FD CYRILLIC SMALL LETTER HA WITH HOOK
\DeclareTextCommand{\cyrhhk}{PU}{\84\375}% U+04FD
%    \end{macrocode}
%    |\84\376|: U+04FE CYRILLIC CAPITAL LETTER HA WITH STROKE\\
%    |\84\377|: U+04FF CYRILLIC SMALL LETTER HA WITH STROKE
%
% \subsubsection{Thai: U+0E00 to U+0E7F}
%
%    \begin{macrocode}
% U+0E3F THAI CURRENCY SYMBOL BAHT; bahtthai
\DeclareTextCommand{\textbaht}{PU}{\9016\077}% U+0E3F
%    \end{macrocode}
%
% \subsubsection{Latin Extended Additional: U+1E00 to U+1EFF}
%
%    \begin{macrocode}
% U+1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE; Bdotaccent
\DeclareTextCompositeCommand{\.}{PU}{B}{\9036\002}% U+1E02
% U+1E03 LATIN SMALL LETTER B WITH DOT ABOVE; bdotaccent
\DeclareTextCompositeCommand{\.}{PU}{b}{\9036\003}% U+1E03
% U+1E06 LATIN CAPITAL LETTER B WITH LINE BELOW; Blinebelow
\DeclareTextCompositeCommand{\b}{PU}{B}{\9036\006}% U+1E06
% U+1E07 LATIN SMALL LETTER B WITH LINE BELOW; blinebelow
\DeclareTextCompositeCommand{\b}{PU}{b}{\9036\007}% U+1E07
% U+1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE; Ddotaccent
\DeclareTextCompositeCommand{\.}{PU}{D}{\9036\012}% U+1E0A
% U+1E0B LATIN SMALL LETTER D WITH DOT ABOVE; ddotaccent
\DeclareTextCompositeCommand{\.}{PU}{d}{\9036\013}% U+1E0B
% U+1E0E LATIN CAPITAL LETTER D WITH LINE BELOW; Dlinebelow
\DeclareTextCompositeCommand{\b}{PU}{D}{\9036\016}% U+1E0E
% U+1E0F LATIN SMALL LETTER D WITH LINE BELOW; dlinebelow
\DeclareTextCompositeCommand{\b}{PU}{d}{\9036\017}% U+1E0F
% U+1E10 LATIN CAPITAL LETTER D WITH CEDILLA; Dcedilla
\DeclareTextCompositeCommand{\c}{PU}{D}{\9036\020}% U+1E10
% U+1E11 LATIN SMALL LETTER D WITH CEDILLA; dcedilla
\DeclareTextCompositeCommand{\c}{PU}{d}{\9036\021}% U+1E11
% U+1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE; Fdotaccent
\DeclareTextCompositeCommand{\.}{PU}{F}{\9036\036}% U+1E1E
% U+1E1F LATIN SMALL LETTER F WITH DOT ABOVE; fdotaccent
\DeclareTextCompositeCommand{\.}{PU}{f}{\9036\037}% U+1E1F
% U+1E20 LATIN CAPITAL LETTER G WITH MACRON; Gmacron
\DeclareTextCompositeCommand{\=}{PU}{G}{\9036\040}% U+1E20
% U+1E21 LATIN SMALL LETTER G WITH MACRON; gmacron
\DeclareTextCompositeCommand{\=}{PU}{g}{\9036\041}% U+1E21
% U+1E22 LATIN CAPITAL LETTER H WITH DOT ABOVE; Hdotaccent
\DeclareTextCompositeCommand{\.}{PU}{H}{\9036\042}% U+1E22
% U+1E23 LATIN SMALL LETTER H WITH DOT ABOVE; hdotaccent
\DeclareTextCompositeCommand{\.}{PU}{h}{\9036\043}% U+1E23
% U+1E26 LATIN CAPITAL LETTER H WITH DIAERESIS; Hdieresis
\DeclareTextCompositeCommand{\"}{PU}{H}{\9036\046}% U+1E26
% U+1E27 LATIN SMALL LETTER H WITH DIAERESIS; hdieresis
\DeclareTextCompositeCommand{\"}{PU}{h}{\9036\047}% U+1E27
% U+1E28 LATIN CAPITAL LETTER H WITH CEDILLA; Hcedilla
\DeclareTextCompositeCommand{\c}{PU}{H}{\9036\050}% U+1E28
% U+1E29 LATIN SMALL LETTER H WITH CEDILLA; hcedilla
\DeclareTextCompositeCommand{\c}{PU}{h}{\9036\051}% U+1E29
% U+1E30 LATIN CAPITAL LETTER K WITH ACUTE; Kacute
\DeclareTextCompositeCommand{\'}{PU}{K}{\9036\060}% U+1E30
% U+1E31 LATIN SMALL LETTER K WITH ACUTE; kacute
\DeclareTextCompositeCommand{\'}{PU}{k}{\9036\061}% U+1E31
% U+1E34 LATIN CAPITAL LETTER K WITH LINE BELOW; Klinebelow
\DeclareTextCompositeCommand{\b}{PU}{K}{\9036\064}% U+1E34
% U+1E35 LATIN SMALL LETTER K WITH LINE BELOW; klinebelow
\DeclareTextCompositeCommand{\b}{PU}{k}{\9036\065}% U+1E35
% U+1E3A LATIN CAPITAL LETTER L WITH LINE BELOW; Llinebelow
\DeclareTextCompositeCommand{\b}{PU}{L}{\9036\072}% U+1E3A
% U+1E3B LATIN SMALL LETTER L WITH LINE BELOW; llinebelow
\DeclareTextCompositeCommand{\b}{PU}{l}{\9036\073}% U+1E3B
% U+1E3E LATIN CAPITAL LETTER M WITH ACUTE; Macute
\DeclareTextCompositeCommand{\'}{PU}{M}{\9036\076}% U+1E3E
% U+1E3F LATIN SMALL LETTER M WITH ACUTE; macute
\DeclareTextCompositeCommand{\'}{PU}{m}{\9036\077}% U+1E3F
% U+1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE; Mdotaccent
\DeclareTextCompositeCommand{\.}{PU}{M}{\9036\100}% U+1E40
% U+1E41 LATIN SMALL LETTER M WITH DOT ABOVE; mdotaccent
\DeclareTextCompositeCommand{\.}{PU}{m}{\9036\101}% U+1E41
% U+1E44 LATIN CAPITAL LETTER N WITH DOT ABOVE; Ndotaccent
\DeclareTextCompositeCommand{\.}{PU}{N}{\9036\104}% U+1E44
% U+1E45 LATIN SMALL LETTER N WITH DOT ABOVE; ndotaccent
\DeclareTextCompositeCommand{\.}{PU}{n}{\9036\105}% U+1E45
% U+1E48 LATIN CAPITAL LETTER N WITH LINE BELOW; Nlinebelow
\DeclareTextCompositeCommand{\b}{PU}{N}{\9036\110}% U+1E48
% U+1E49 LATIN SMALL LETTER N WITH LINE BELOW; nlinebelow
\DeclareTextCompositeCommand{\b}{PU}{n}{\9036\111}% U+1E49
% U+1E54 LATIN CAPITAL LETTER P WITH ACUTE; Pacute
\DeclareTextCompositeCommand{\'}{PU}{P}{\9036\124}% U+1E54
% U+1E55 LATIN SMALL LETTER P WITH ACUTE; pacute
\DeclareTextCompositeCommand{\'}{PU}{p}{\9036\125}% U+1E55
% U+1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE; Pdotaccent
\DeclareTextCompositeCommand{\.}{PU}{P}{\9036\126}% U+1E56
% U+1E57 LATIN SMALL LETTER P WITH DOT ABOVE; pdotaccent
\DeclareTextCompositeCommand{\.}{PU}{p}{\9036\127}% U+1E57
% U+1E58 LATIN CAPITAL LETTER R WITH DOT ABOVE; Rdotaccent
\DeclareTextCompositeCommand{\.}{PU}{R}{\9036\130}% U+1E58
% U+1E59 LATIN SMALL LETTER R WITH DOT ABOVE; rdotaccent
\DeclareTextCompositeCommand{\.}{PU}{r}{\9036\131}% U+1E59
% U+1E5E LATIN CAPITAL LETTER R WITH LINE BELOW; Rlinebelow
\DeclareTextCompositeCommand{\b}{PU}{R}{\9036\136}% U+1E5E
% U+1E5F LATIN SMALL LETTER R WITH LINE BELOW; rlinebelow
\DeclareTextCompositeCommand{\b}{PU}{r}{\9036\137}% U+1E5F
% U+1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE; Sdotaccent
\DeclareTextCompositeCommand{\.}{PU}{S}{\9036\140}% U+1E60
% U+1E61 LATIN SMALL LETTER S WITH DOT ABOVE; sdotaccent
\DeclareTextCompositeCommand{\.}{PU}{s}{\9036\141}% U+1E61
% U+1E6E LATIN CAPITAL LETTER T WITH LINE BELOW; Tlinebelow
\DeclareTextCompositeCommand{\b}{PU}{T}{\9036\156}% U+1E6E
% U+1E6F LATIN SMALL LETTER T WITH LINE BELOW; tlinebelow
\DeclareTextCompositeCommand{\b}{PU}{t}{\9036\157}% U+1E6F
% U+1E7C LATIN CAPITAL LETTER V WITH TILDE; Vtilde
\DeclareTextCompositeCommand{\~}{PU}{V}{\9036\174}% U+1E7C
% U+1E7D LATIN SMALL LETTER V WITH TILDE; vtilde
\DeclareTextCompositeCommand{\~}{PU}{v}{\9036\175}% U+1E7D
% U+1E80 LATIN CAPITAL LETTER W WITH GRAVE; Wgrave
\DeclareTextCompositeCommand{\`}{PU}{W}{\9036\200}% U+1E80
% U+1E81 LATIN SMALL LETTER W WITH GRAVE; wgrave
\DeclareTextCompositeCommand{\`}{PU}{w}{\9036\201}% U+1E81
% U+1E82 LATIN CAPITAL LETTER W WITH ACUTE; Wacute
\DeclareTextCompositeCommand{\'}{PU}{W}{\9036\202}% U+1E82
% U+1E83 LATIN SMALL LETTER W WITH ACUTE; wacute
\DeclareTextCompositeCommand{\'}{PU}{w}{\9036\203}% U+1E83
% U+1E84 LATIN CAPITAL LETTER W WITH DIAERESIS; Wdieresis
\DeclareTextCompositeCommand{\"}{PU}{W}{\9036\204}% U+1E84
% U+1E85 LATIN SMALL LETTER W WITH DIAERESIS; wdieresis
\DeclareTextCompositeCommand{\"}{PU}{w}{\9036\205}% U+1E85
% U+1E86 LATIN CAPITAL LETTER W WITH DOT ABOVE; Wdotaccent
\DeclareTextCompositeCommand{\.}{PU}{W}{\9036\206}% U+1E86
% U+1E87 LATIN SMALL LETTER W WITH DOT ABOVE; wdotaccent
\DeclareTextCompositeCommand{\.}{PU}{w}{\9036\207}% U+1E87
% U+1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE; Xdotaccent
\DeclareTextCompositeCommand{\.}{PU}{X}{\9036\212}% U+1E8A
% U+1E8B LATIN SMALL LETTER X WITH DOT ABOVE; xdotaccent
\DeclareTextCompositeCommand{\.}{PU}{x}{\9036\213}% U+1E8B
% U+1E8C LATIN CAPITAL LETTER X WITH DIAERESIS; Xdieresis
\DeclareTextCompositeCommand{\"}{PU}{X}{\9036\214}% U+1E8C
% U+1E8D LATIN SMALL LETTER X WITH DIAERESIS; xdieresis
\DeclareTextCompositeCommand{\"}{PU}{x}{\9036\215}% U+1E8D
% U+1E8E LATIN CAPITAL LETTER Y WITH DOT ABOVE; Ydotaccent
\DeclareTextCompositeCommand{\.}{PU}{Y}{\9036\216}% U+1E8E
% U+1E8F LATIN SMALL LETTER Y WITH DOT ABOVE; ydotaccent
\DeclareTextCompositeCommand{\.}{PU}{y}{\9036\217}% U+1E8F
% U+1E90 LATIN CAPITAL LETTER Z WITH CIRCUMFLEX; Zcircumflex
\DeclareTextCompositeCommand{\^}{PU}{Z}{\9036\220}% U+1E90
% U+1E91 LATIN SMALL LETTER Z WITH CIRCUMFLEX; zcircumflex
\DeclareTextCompositeCommand{\^}{PU}{z}{\9036\221}% U+1E91
% U+1E94 LATIN CAPITAL LETTER Z WITH LINE BELOW; Zlinebelow
\DeclareTextCompositeCommand{\b}{PU}{Z}{\9036\224}% U+1E94
% U+1E95 LATIN SMALL LETTER Z WITH LINE BELOW; zlinebelow
\DeclareTextCompositeCommand{\b}{PU}{z}{\9036\225}% U+1E95
% U+1E96 LATIN SMALL LETTER H WITH LINE BELOW; hlinebelow
\DeclareTextCompositeCommand{\b}{PU}{h}{\9036\226}% U+1E96
% U+1E97 LATIN SMALL LETTER T WITH DIAERESIS; tdieresis
\DeclareTextCompositeCommand{\"}{PU}{t}{\9036\227}% U+1E97
% U+1E98 LATIN SMALL LETTER W WITH RING ABOVE; wring
\DeclareTextCompositeCommand{\r}{PU}{w}{\9036\230}% U+1E98
% U+1E99 LATIN SMALL LETTER Y WITH RING ABOVE; yring
\DeclareTextCompositeCommand{\r}{PU}{y}{\9036\231}% U+1E99
% U+1E9B LATIN SMALL LETTER LONG S WITH DOT ABOVE; slongdotaccent
\DeclareTextCompositeCommand{\.}{PU}{\textlongs}{\9036\233}% U+1E9B
% U+1EBC LATIN CAPITAL LETTER E WITH TILDE; Etilde
\DeclareTextCompositeCommand{\~}{PU}{E}{\9036\274}% U+1EBC
% U+1EBD LATIN SMALL LETTER E WITH TILDE; etilde
\DeclareTextCompositeCommand{\~}{PU}{e}{\9036\275}% U+1EBD
% U+1EF2 LATIN CAPITAL LETTER Y WITH GRAVE; Ygrave
\DeclareTextCompositeCommand{\`}{PU}{Y}{\9036\362}% U+1EF2
% U+1EF3 LATIN SMALL LETTER Y WITH GRAVE; ygrave
\DeclareTextCompositeCommand{\`}{PU}{y}{\9036\363}% U+1EF3
% U+1EF8 LATIN CAPITAL LETTER Y WITH TILDE; Ytilde
\DeclareTextCompositeCommand{\~}{PU}{Y}{\9036\370}% U+1EF8
% U+1EF9 LATIN SMALL LETTER Y WITH TILDE; ytilde
\DeclareTextCompositeCommand{\~}{PU}{y}{\9036\371}% U+1EF9
%    \end{macrocode}
%
% \subsubsection{General Punctuation: U+2000 to U+206F}
%
%    \begin{macrocode}
% U+200C ZERO WIDTH NON-JOINER; *afii61664, zerowidthnonjoiner
\DeclareTextCommand{\textcompwordmark}{PU}{\9040\014}% U+200C
% U+2013 EN DASH; endash
\DeclareTextCommand{\textendash}{PU}{\9040\023}% U+2013
% U+2014 EM DASH; emdash
\DeclareTextCommand{\textemdash}{PU}{\9040\024}% U+2014
% U+2016 DOUBLE VERTICAL LINE; dblverticalbar
\DeclareTextCommand{\textbardbl}{PU}{\9040\026}% U+2016
% U+2018 LEFT SINGLE QUOTATION MARK; quoteleft
\DeclareTextCommand{\textquoteleft}{PU}{\9040\030}% U+2018
% U+2019 RIGHT SINGLE QUOTATION MARK; quoteright
\DeclareTextCommand{\textquoteright}{PU}{\9040\031}% U+2019
% U+201A SINGLE LOW-9 QUOTATION MARK; quotesinglbase
\DeclareTextCommand{\quotesinglbase}{PU}{\9040\032}% U+201A
% U+201C LEFT DOUBLE QUOTATION MARK; quotedblleft
\DeclareTextCommand{\textquotedblleft}{PU}{\9040\034}% U+201C
% U+201D RIGHT DOUBLE QUOTATION MARK; quotedblright
\DeclareTextCommand{\textquotedblright}{PU}{\9040\035}% U+201D
% U+201E DOUBLE LOW-9 QUOTATION MARK; quotedblbase
\DeclareTextCommand{\quotedblbase}{PU}{\9040\036}% U+201E
% U+2020 DAGGER; dagger
\DeclareTextCommand{\textdagger}{PU}{\9040\040}% U+2020
% U+2021 DOUBLE DAGGER; daggerdbl
\DeclareTextCommand{\textdaggerdbl}{PU}{\9040\041}% U+2021
% U+2022 BULLET; bullet
\DeclareTextCommand{\textbullet}{PU}{\9040\042}% U+2022
% U+2026 HORIZONTAL ELLIPSIS; ellipsis
\DeclareTextCommand{\textellipsis}{PU}{\9040\046}% U+2026
% U+2030 PER MILLE SIGN; perthousand
\DeclareTextCommand{\textperthousand}{PU}{\9040\060}% U+2030
% U+2031 PER TEN THOUSAND SIGN
\DeclareTextCommand{\textpertenthousand}{PU}{\9040\061}% U+2031
% U+2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK; guilsinglleft
\DeclareTextCommand{\guilsinglleft}{PU}{\9040\071}% U+2039
% U+203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK; guilsinglright
\DeclareTextCommand{\guilsinglright}{PU}{\9040\072}% U+203A
% U+203B REFERENCE MARK; referencemark
\DeclareTextCommand{\textreferencemark}{PU}{\9040\073}% U+203B
% U+203D INTERROBANG
\DeclareTextCommand{\textinterrobang}{PU}{\9040\075}% U+203D
% U+2044 FRACTION SLASH; fraction
\DeclareTextCommand{\textfractionsolidus}{PU}{\9040\104}% U+2044
% U+2045 LEFT SQUARE BRACKET WITH QUILL
\DeclareTextCommand{\textlquill}{PU}{\9040\105}% U+2045
% U+2046 RIGHT SQUARE BRACKET WITH QUILL
\DeclareTextCommand{\textrquill}{PU}{\9040\106}% U+2046
% U+2052 COMMERCIAL MINUS SIGN
\DeclareTextCommand{\textdiscount}{PU}{\9040\122}% U+2052
%    \end{macrocode}
%
% \subsubsection{Superscripts and Subscripts: U+2070 to U+209F}
%
%    \begin{macrocode}
% U+2070 SUPERSCRIPT ZERO; zerosuperior
\DeclareTextCommand{\textzerosuperior}{PU}{\9040\160}% U+2070
% U+2074 SUPERSCRIPT FOUR; foursuperior
\DeclareTextCommand{\textfoursuperior}{PU}{\9040\164}% U+2074
% U+2075 SUPERSCRIPT FIVE; fivesuperior
\DeclareTextCommand{\textfivesuperior}{PU}{\9040\165}% U+2075
% U+2076 SUPERSCRIPT SIX; sixsuperior
\DeclareTextCommand{\textsixsuperior}{PU}{\9040\166}% U+2076
% U+2077 SUPERSCRIPT SEVEN; sevensuperior
\DeclareTextCommand{\textsevensuperior}{PU}{\9040\167}% U+2077
% U+2078 SUPERSCRIPT EIGHT; eightsuperior
\DeclareTextCommand{\texteightsuperior}{PU}{\9040\170}% U+2078
% U+2079 SUPERSCRIPT NINE; ninesuperior
\DeclareTextCommand{\textninesuperior}{PU}{\9040\171}% U+2079
% U+207A SUPERSCRIPT PLUS SIGN; plussuperior
\DeclareTextCommand{\textplussuperior}{PU}{\9040\172}% U+207A
% U+207B SUPERSCRIPT MINUS
\DeclareTextCommand{\textminussuperior}{PU}{\9040\173}
% U+207C SUPERSCRIPT EQUALS SIGN; equalsuperior
\DeclareTextCommand{\textequalsuperior}{PU}{\9040\174}
% U+207D SUPERSCRIPT LEFT PARENTHESIS; parenleftsuperior
\DeclareTextCommand{\textparenleftsuperior}{PU}{\9040\175}
% U+207E SUPERSCRIPT RIGHT PARENTHESIS; parenrightsuperior
\DeclareTextCommand{\textparenrightsuperior}{PU}{\9040\176}
% U+207F SUPERSCRIPT LATIN SMALL LETTER N; nsuperior
\DeclareTextCommand{\textnsuperior}{PU}{\9040\177}
% U+2080 SUBSCRIPT ZERO; zeroinferior
\DeclareTextCommand{\textzeroinferior}{PU}{\9040\200}% U+2080
% U+2081 SUBSCRIPT ONE; oneinferior
\DeclareTextCommand{\textoneinferior}{PU}{\9040\201}% U+2081
% U+2082 SUBSCRIPT TWO; twoinferior
\DeclareTextCommand{\texttwoinferior}{PU}{\9040\202}% U+2082
% U+2083 SUBSCRIPT THREE; threeinferior
\DeclareTextCommand{\textthreeinferior}{PU}{\9040\203}% U+2083
% U+2084 SUBSCRIPT FOUR; fourinferior
\DeclareTextCommand{\textfourinferior}{PU}{\9040\204}% U+2084
% U+2085 SUBSCRIPT FIVE; fiveinferior
\DeclareTextCommand{\textfiveinferior}{PU}{\9040\205}% U+2085
% U+2086 SUBSCRIPT SIX; sixinferior
\DeclareTextCommand{\textsixinferior}{PU}{\9040\206}% U+2086
% U+2087 SUBSCRIPT SEVEN; seveninferior
\DeclareTextCommand{\textseveninferior}{PU}{\9040\207}% U+2087
% U+2088 SUBSCRIPT EIGHT; eightinferior
\DeclareTextCommand{\texteightinferior}{PU}{\9040\210}% U+2088
% U+2089 SUBSCRIPT NINE; nineinferior
\DeclareTextCommand{\textnineinferior}{PU}{\9040\211}% U+2089
% U+208D SUBSCRIPT LEFT PARENTHESIS; parenleftinferior
\DeclareTextCommand{\textparenleftinferior}{PU}{\9040\215}% U+208D
% U+208E SUBSCRIPT RIGHT PARENTHESIS; parenrightinferior
\DeclareTextCommand{\textparenrightinferior}{PU}{\9040\216}% U+208E
%    \end{macrocode}
%
% \subsubsection{Currency Symbols: U+20A0 to U+20CF}
%
%    \begin{macrocode}
% U+20A1 COLON SIGN; *colonmonetary, colonsign
\DeclareTextCommand{\textcolonmonetary}{PU}{\9040\241}% U+20A1
% U+20A4 LIRA SIGN; afii08941, *lira
\DeclareTextCommand{\textlira}{PU}{\9040\244}% U+20A4
% U+20A6 NAIRA SIGN
\DeclareTextCommand{\textnaira}{PU}{\9040\246}% U+20A6
% U+20A7 PESETA SIGN; peseta
\DeclareTextCommand{\textpeseta}{PU}{\9040\247}% U+20A7
% U+20A9 WON SIGN; won
\DeclareTextCommand{\textwon}{PU}{\9040\251}% U+20A9
% U+20AB DONG SIGN; dong
\DeclareTextCommand{\textdong}{PU}{\9040\253}% U+20AB
% U+20AC EURO SIGN; *Euro, euro
\DeclareTextCommand{\texteuro}{PU}{\9040\254}% U+20AC
% U+20B1 PESO SIGN
\DeclareTextCommand{\textpeso}{PU}{\9040\261}% U+20B1
% U+20B2 GUARANI SIGN
\DeclareTextCommand{\textguarani}{PU}{\9040\262}% U+20B2
%    \end{macrocode}
%
% \subsubsection{Letterlike Symbols: U+2100 to U+214F}
%
%    \begin{macrocode}
% U+2103 DEGREE CELSIUS; centigrade
\DeclareTextCommand{\textcelsius}{PU}{\9041\003}% U+2103
% U+2116 NUMERO SIGN; *afii61352, numero
\DeclareTextCommand{\textnumero}{PU}{\9041\026}% U+2116
% U+2117 SOUND RECORDING COPYRIGHT
\DeclareTextCommand{\textcircledP}{PU}{\9041\027}% U+2117
% U+211E PRESCRIPTION TAKE; prescription
\DeclareTextCommand{\textrecipe}{PU}{\9041\036}% U+211E
% U+2120 SERVICE MARK
\DeclareTextCommand{\textservicemark}{PU}{\9041\040}% U+2120
% U+2122 TRADE MARK SIGN; trademark
\DeclareTextCommand{\texttrademark}{PU}{\9041\042}% U+2122
% U+2126 OHM SIGN; Ohm, Omega
\DeclareTextCommand{\textohm}{PU}{\9041\046}% U+2126
% U+2127 INVERTED OHM SIGN
\DeclareTextCommand{\textmho}{PU}{\9041\047}% U+2127
% U+212B ANGSTROM SIGN; angstrom
\DeclareTextCommand{\textangstrom}{PU}{\9041\053}% U+212B
% U+212E ESTIMATED SYMBOL; estimated
\DeclareTextCommand{\textestimated}{PU}{\9041\056}% U+212E
% U+2135 ALEF SYMBOL; aleph
\DeclareTextCommand{\textaleph}{PU}{\9041\065}% U+2135
%    \end{macrocode}
%
% \subsubsection{Arrows: U+2190 to U+21FF}
%
%    \begin{macrocode}
% U+2190 LEFTWARDS ARROW; arrowleft
\DeclareTextCommand{\textleftarrow}{PU}{\9041\220}% U+2190
% U+2191 UPWARDS ARROW; arrowup
\DeclareTextCommand{\textuparrow}{PU}{\9041\221}% U+2191
% U+2192 RIGHTWARDS ARROW; arrowright
\DeclareTextCommand{\textrightarrow}{PU}{\9041\222}% U+2192
% U+2193 DOWNWARDS ARROW; arrowdown
\DeclareTextCommand{\textdownarrow}{PU}{\9041\223}% U+2193
%    \end{macrocode}
%
% \subsubsection{Mathematical Operators: U+2200 to U+22FF}
%
%    \begin{macrocode}
% U+2212 MINUS SIGN; minus
\DeclareTextCommand{\textminus}{PU}{\9042\022}% U+2212
% U+221A SQUARE ROOT; radical
\DeclareTextCommand{\textsurd}{PU}{\9042\032}% U+221A
%    \end{macrocode}
%
% \subsubsection{Miscellaneous Technical: U+2300 to U+23FF}
%
%    \begin{macrocode}
% U+2329 LEFT-POINTING ANGLE BRACKET; angleleft
\DeclareTextCommand{\textlangle}{PU}{\9043\051}% U+2329
% U+232A RIGHT-POINTING ANGLE BRACKET; angleright
\DeclareTextCommand{\textrangle}{PU}{\9043\052}% U+232A
%    \end{macrocode}
%
% \subsubsection{Control Pictures: U+2400 to U+243F}
%
%    \begin{macrocode}
% U+2422 BLANK SYMBOL
\DeclareTextCommand{\textblank}{PU}{\9044\042}% U+2422
% U+2423 OPEN BOX; blank
\DeclareTextCommand{\textvisiblespace}{PU}{\9044\043}% U+2423
%    \end{macrocode}
%
% \subsubsection{Enclosed Alphanumerics: U+2460 to U+24FF}
%
%    \begin{macrocode}
% U+2460 CIRCLED DIGIT ONE; onecircle
\DeclareTextCompositeCommand{\textcircled}{PU}{1}{\9044\140}% U+2460
% U+2461 CIRCLED DIGIT TWO; twocircle
\DeclareTextCompositeCommand{\textcircled}{PU}{2}{\9044\141}% U+2461
% U+2462 CIRCLED DIGIT THREE; threecircle
\DeclareTextCompositeCommand{\textcircled}{PU}{3}{\9044\142}% U+2462
% U+2463 CIRCLED DIGIT FOUR; fourcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{4}{\9044\143}% U+2463
% U+2464 CIRCLED DIGIT FIVE; fivecircle
\DeclareTextCompositeCommand{\textcircled}{PU}{5}{\9044\144}% U+2464
% U+2465 CIRCLED DIGIT SIX; sixcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{6}{\9044\145}% U+2465
% U+2466 CIRCLED DIGIT SEVEN; sevencircle
\DeclareTextCompositeCommand{\textcircled}{PU}{7}{\9044\146}% U+2466
% U+2467 CIRCLED DIGIT EIGHT; eightcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{8}{\9044\147}% U+2467
% U+2468 CIRCLED DIGIT NINE; ninecircle
\DeclareTextCompositeCommand{\textcircled}{PU}{9}{\9044\150}% U+2468
% U+2469 CIRCLED NUMBER TEN; tencircle
\DeclareTextCompositeCommand{\textcircled}{PU}{10}{\9044\151}% U+2469
% U+246A CIRCLED NUMBER ELEVEN; elevencircle
\DeclareTextCompositeCommand{\textcircled}{PU}{11}{\9044\152}% U+246A
% U+246B CIRCLED NUMBER TWELVE; twelvecircle
\DeclareTextCompositeCommand{\textcircled}{PU}{12}{\9044\153}% U+246B
% U+246C CIRCLED NUMBER THIRTEEN; thirteencircle
\DeclareTextCompositeCommand{\textcircled}{PU}{13}{\9044\154}% U+246C
% U+246D CIRCLED NUMBER FOURTEEN; fourteencircle
\DeclareTextCompositeCommand{\textcircled}{PU}{14}{\9044\155}% U+246D
% U+246E CIRCLED NUMBER FIFTEEN; fifteencircle
\DeclareTextCompositeCommand{\textcircled}{PU}{15}{\9044\156}% U+246E
% U+246F CIRCLED NUMBER SIXTEEN; sixteencircle
\DeclareTextCompositeCommand{\textcircled}{PU}{16}{\9044\157}% U+246F
% U+2470 CIRCLED NUMBER SEVENTEEN; seventeencircle
\DeclareTextCompositeCommand{\textcircled}{PU}{17}{\9044\160}% U+2470
% U+2471 CIRCLED NUMBER EIGHTEEN; eighteencircle
\DeclareTextCompositeCommand{\textcircled}{PU}{18}{\9044\161}% U+2471
% U+2472 CIRCLED NUMBER NINETEEN; nineteencircle
\DeclareTextCompositeCommand{\textcircled}{PU}{19}{\9044\162}% U+2472
% U+2473 CIRCLED NUMBER TWENTY; twentycircle
\DeclareTextCompositeCommand{\textcircled}{PU}{20}{\9044\163}% U+2473
% U+24B6 CIRCLED LATIN CAPITAL LETTER A; Acircle
\DeclareTextCompositeCommand{\textcircled}{PU}{A}{\9044\266}% U+24B6
% U+24B7 CIRCLED LATIN CAPITAL LETTER B; Bcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{B}{\9044\267}% U+24B7
% U+24B8 CIRCLED LATIN CAPITAL LETTER C; Ccircle
\DeclareTextCompositeCommand{\textcircled}{PU}{C}{\9044\270}% U+24B8
% U+24B9 CIRCLED LATIN CAPITAL LETTER D; Dcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{D}{\9044\271}% U+24B9
% U+24BA CIRCLED LATIN CAPITAL LETTER E; Ecircle
\DeclareTextCompositeCommand{\textcircled}{PU}{E}{\9044\272}% U+24BA
% U+24BB CIRCLED LATIN CAPITAL LETTER F; Fcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{F}{\9044\273}% U+24BB
% U+24BC CIRCLED LATIN CAPITAL LETTER G; Gcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{G}{\9044\274}% U+24BC
% U+24BD CIRCLED LATIN CAPITAL LETTER H; Hcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{H}{\9044\275}% U+24BD
% U+24BE CIRCLED LATIN CAPITAL LETTER I; Icircle
\DeclareTextCompositeCommand{\textcircled}{PU}{I}{\9044\276}% U+24BE
% U+24BF CIRCLED LATIN CAPITAL LETTER J; Jcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{J}{\9044\277}% U+24BF
% U+24C0 CIRCLED LATIN CAPITAL LETTER K; Kcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{K}{\9044\300}% U+24C0
% U+24C1 CIRCLED LATIN CAPITAL LETTER L; Lcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{L}{\9044\301}% U+24C1
% U+24C2 CIRCLED LATIN CAPITAL LETTER M; Mcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{M}{\9044\302}% U+24C2
% U+24C3 CIRCLED LATIN CAPITAL LETTER N; Ncircle
\DeclareTextCompositeCommand{\textcircled}{PU}{N}{\9044\303}% U+24C3
% U+24C4 CIRCLED LATIN CAPITAL LETTER O; Ocircle
\DeclareTextCompositeCommand{\textcircled}{PU}{O}{\9044\304}% U+24C4
% U+24C5 CIRCLED LATIN CAPITAL LETTER P; Pcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{P}{\9044\305}% U+24C5
% U+24C6 CIRCLED LATIN CAPITAL LETTER Q; Qcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{Q}{\9044\306}% U+24C6
% U+24C7 CIRCLED LATIN CAPITAL LETTER R; Rcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{R}{\9044\307}% U+24C7
% U+24C8 CIRCLED LATIN CAPITAL LETTER S; Scircle
\DeclareTextCompositeCommand{\textcircled}{PU}{S}{\9044\310}% U+24C8
% U+24C9 CIRCLED LATIN CAPITAL LETTER T; Tcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{T}{\9044\311}% U+24C9
% U+24CA CIRCLED LATIN CAPITAL LETTER U; Ucircle
\DeclareTextCompositeCommand{\textcircled}{PU}{U}{\9044\312}% U+24CA
% U+24CB CIRCLED LATIN CAPITAL LETTER V; Vcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{V}{\9044\313}% U+24CB
% U+24CC CIRCLED LATIN CAPITAL LETTER W; Wcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{W}{\9044\314}% U+24CC
% U+24CD CIRCLED LATIN CAPITAL LETTER X; Xcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{X}{\9044\315}% U+24CD
% U+24CE CIRCLED LATIN CAPITAL LETTER Y; Ycircle
\DeclareTextCompositeCommand{\textcircled}{PU}{Y}{\9044\316}% U+24CE
% U+24CF CIRCLED LATIN CAPITAL LETTER Z; Zcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{Z}{\9044\317}% U+24CF
% U+24D0 CIRCLED LATIN SMALL LETTER A; acircle
\DeclareTextCompositeCommand{\textcircled}{PU}{a}{\9044\320}% U+24D0
% U+24D1 CIRCLED LATIN SMALL LETTER B; bcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{b}{\9044\321}% U+24D1
% U+24D2 CIRCLED LATIN SMALL LETTER C; ccircle
\DeclareTextCompositeCommand{\textcircled}{PU}{c}{\9044\322}% U+24D2
% U+24D3 CIRCLED LATIN SMALL LETTER D; dcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{d}{\9044\323}% U+24D3
% U+24D4 CIRCLED LATIN SMALL LETTER E; ecircle
\DeclareTextCompositeCommand{\textcircled}{PU}{e}{\9044\324}% U+24D4
% U+24D5 CIRCLED LATIN SMALL LETTER F; fcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{f}{\9044\325}% U+24D5
% U+24D6 CIRCLED LATIN SMALL LETTER G; gcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{g}{\9044\326}% U+24D6
% U+24D7 CIRCLED LATIN SMALL LETTER H; hcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{h}{\9044\327}% U+24D7
% U+24D8 CIRCLED LATIN SMALL LETTER I; icircle
\DeclareTextCompositeCommand{\textcircled}{PU}{i}{\9044\330}% U+24D8
% U+24D9 CIRCLED LATIN SMALL LETTER J; jcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{j}{\9044\331}% U+24D9
% U+24DA CIRCLED LATIN SMALL LETTER K; kcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{k}{\9044\332}% U+24DA
% U+24DB CIRCLED LATIN SMALL LETTER L; lcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{l}{\9044\333}% U+24DB
% U+24DC CIRCLED LATIN SMALL LETTER M; mcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{m}{\9044\334}% U+24DC
% U+24DD CIRCLED LATIN SMALL LETTER N; ncircle
\DeclareTextCompositeCommand{\textcircled}{PU}{n}{\9044\335}% U+24DD
% U+24DE CIRCLED LATIN SMALL LETTER O; ocircle
\DeclareTextCompositeCommand{\textcircled}{PU}{o}{\9044\336}% U+24DE
% U+24DF CIRCLED LATIN SMALL LETTER P; pcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{p}{\9044\337}% U+24DF
% U+24E0 CIRCLED LATIN SMALL LETTER Q; qcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{q}{\9044\340}% U+24E0
% U+24E1 CIRCLED LATIN SMALL LETTER R; rcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{r}{\9044\341}% U+24E1
% U+24E2 CIRCLED LATIN SMALL LETTER S; scircle
\DeclareTextCompositeCommand{\textcircled}{PU}{s}{\9044\342}% U+24E2
% U+24E3 CIRCLED LATIN SMALL LETTER T; tcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{t}{\9044\343}% U+24E3
% U+24E4 CIRCLED LATIN SMALL LETTER U; ucircle
\DeclareTextCompositeCommand{\textcircled}{PU}{u}{\9044\344}% U+24E4
% U+24E5 CIRCLED LATIN SMALL LETTER V; vcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{v}{\9044\345}% U+24E5
% U+24E6 CIRCLED LATIN SMALL LETTER W; wcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{w}{\9044\346}% U+24E6
% U+24E7 CIRCLED LATIN SMALL LETTER X; xcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{x}{\9044\347}% U+24E7
% U+24E8 CIRCLED LATIN SMALL LETTER Y; ycircle
\DeclareTextCompositeCommand{\textcircled}{PU}{y}{\9044\350}% U+24E8
% U+24E9 CIRCLED LATIN SMALL LETTER Z; zcircle
\DeclareTextCompositeCommand{\textcircled}{PU}{z}{\9044\351}% U+24E9
% U+24EA CIRCLED DIGIT ZERO
\DeclareTextCompositeCommand{\textcircled}{PU}{0}{\9044\352}% U+24EA
%    \end{macrocode}
%
% \subsubsection{Box Drawing: U+2500 to U+257F}
%
%    \begin{macrocode}
% U+25E6 WHITE BULLET; *openbullet, whitebullet
\DeclareTextCommand{\textopenbullet}{PU}{\9045\346}% U+25E6
% U+25EF LARGE CIRCLE; largecircle
\DeclareTextCommand{\textbigcircle}{PU}{\9045\357}% U+25EF
%    \end{macrocode}
%
% \subsubsection{Miscellaneous Symbols: U+2600 to U+26FF}
%
%    \begin{macrocode}
% U+266A EIGHTH NOTE; musicalnote
\DeclareTextCommand{\textmusicalnote}{PU}{\9046\152}% U+266A
% U+26AD MARRIAGE SYMBOL
\DeclareTextCommand{\textmarried}{PU}{\9046\255}% U+26AD
% U+26AE DIVORCE SYMBOL
\DeclareTextCommand{\textdivorced}{PU}{\9046\256}% U+26AE
%    \end{macrocode}
%
% \subsubsection{Miscellaneous Mathematical Symbols-A: U+27C0 to U+27EF}
%
%    \begin{macrocode}
% U+27E6 MATHEMATICAL LEFT WHITE SQUARE BRACKET
\DeclareTextCommand{\textlbrackdbl}{PU}{\9047\346}% U+27E6
% U+27E7 MATHEMATICAL RIGHT WHITE SQUARE BRACKET
\DeclareTextCommand{\textrbrackdbl}{PU}{\9047\347}% U+27E7
%    \end{macrocode}
%
% \subsubsection{Alphabetic Presentation Forms: U+FB00 to U+FB4F}
%
%    \begin{macrocode}
% U+FB01 LATIN SMALL LIGATURE FI; fi
\DeclareTextCommand{\textfi}{PU}{\9373\001}% U+FB01
% U+FB02 LATIN SMALL LIGATURE FL; fl
\DeclareTextCommand{\textfl}{PU}{\9373\002}% U+FB02
%    \end{macrocode}
%
% \subsubsection{Miscellaneous}
%
%    \begin{macrocode}
\DeclareTextCommand{\SS}{PU}{SS}
%    \end{macrocode}
%
% \subsubsection{Aliases}
%
%    Aliases (german.sty)
%    \begin{macrocode}
\DeclareTextCommand{\textglqq}{PU}{\quotedblbase}
\DeclareTextCommand{\textgrqq}{PU}{\textquotedblleft}
\DeclareTextCommand{\textglq}{PU}{\quotesinglbase}
\DeclareTextCommand{\textgrq}{PU}{\textquoteleft}
\DeclareTextCommand{\textflqq}{PU}{\guillemotleft}
\DeclareTextCommand{\textfrqq}{PU}{\guillemotright}
\DeclareTextCommand{\textflq}{PU}{\guilsinglleft}
\DeclareTextCommand{\textfrq}{PU}{\guilsinglright}
%    \end{macrocode}
%    Aliases (math names)
%    \begin{macrocode}
\DeclareTextCommand{\textneg}{PU}{\textlogicalnot}
\DeclareTextCommand{\texttimes}{PU}{\textmultiply}
\DeclareTextCommand{\textdiv}{PU}{\textdivide}
\DeclareTextCommand{\textpm}{PU}{\textplusminus}
\DeclareTextCommand{\textcdot}{PU}{\textperiodcentered}
%    \end{macrocode}
%
%    \begin{macrocode}
%</puenc>
%    \end{macrocode}
%
% \subsection{PU encoding, additions for Vn\TeX}
%
%    This file is provided by Han The Thanh.
%
%    \begin{macrocode}
%<*puvnenc>
%    \end{macrocode}
%    \begin{macrocode}
\DeclareTextCommand{\abreve}{PU}{\81\003}
\DeclareTextCommand{\acircumflex}{PU}{\80\342}
\DeclareTextCommand{\dj}{PU}{\81\021}
\DeclareTextCommand{\ecircumflex}{PU}{\80\352}
\DeclareTextCommand{\ocircumflex}{PU}{\80\364}
\DeclareTextCommand{\ohorn}{PU}{\81\241}
\DeclareTextCommand{\uhorn}{PU}{\81\260}
\DeclareTextCommand{\ABREVE}{PU}{\81\002}
\DeclareTextCommand{\ACIRCUMFLEX}{PU}{\80\302}
\DeclareTextCommand{\DJ}{PU}{\81\020}
\DeclareTextCommand{\ECIRCUMFLEX}{PU}{\80\312}
\DeclareTextCommand{\OCIRCUMFLEX}{PU}{\80\324}
\DeclareTextCommand{\OHORN}{PU}{\81\240}
\DeclareTextCommand{\UHORN}{PU}{\81\257}
%    \end{macrocode}
%    \begin{macrocode}
\DeclareTextCompositeCommand{\'}{PU}{a}{\80\341}
\DeclareTextCompositeCommand{\d}{PU}{a}{\9036\241}
\DeclareTextCompositeCommand{\`}{PU}{a}{\80\340}
\DeclareTextCompositeCommand{\h}{PU}{a}{\9036\243}
\DeclareTextCompositeCommand{\~}{PU}{a}{\80\343}
\DeclareTextCompositeCommand{\'}{PU}{\abreve}{\9036\257}
\DeclareTextCompositeCommand{\d}{PU}{\abreve}{\9036\267}
\DeclareTextCompositeCommand{\`}{PU}{\abreve}{\9036\261}
\DeclareTextCompositeCommand{\h}{PU}{\abreve}{\9036\263}
\DeclareTextCompositeCommand{\~}{PU}{\abreve}{\9036\265}
\DeclareTextCompositeCommand{\'}{PU}{\acircumflex}{\9036\245}
\DeclareTextCompositeCommand{\d}{PU}{\acircumflex}{\9036\255}
\DeclareTextCompositeCommand{\`}{PU}{\acircumflex}{\9036\247}
\DeclareTextCompositeCommand{\h}{PU}{\acircumflex}{\9036\251}
\DeclareTextCompositeCommand{\~}{PU}{\acircumflex}{\9036\253}
\DeclareTextCompositeCommand{\'}{PU}{e}{\80\351}
\DeclareTextCompositeCommand{\d}{PU}{e}{\9036\271}
\DeclareTextCompositeCommand{\`}{PU}{e}{\80\350}
\DeclareTextCompositeCommand{\h}{PU}{e}{\9036\273}
\DeclareTextCompositeCommand{\~}{PU}{e}{\9036\275}
\DeclareTextCompositeCommand{\'}{PU}{\ecircumflex}{\9036\277}
\DeclareTextCompositeCommand{\d}{PU}{\ecircumflex}{\9036\307}
\DeclareTextCompositeCommand{\`}{PU}{\ecircumflex}{\9036\301}
\DeclareTextCompositeCommand{\h}{PU}{\ecircumflex}{\9036\303}
\DeclareTextCompositeCommand{\~}{PU}{\ecircumflex}{\9036\305}
\DeclareTextCompositeCommand{\'}{PU}{i}{\80\355}
\DeclareTextCompositeCommand{\d}{PU}{i}{\9036\313}
\DeclareTextCompositeCommand{\`}{PU}{i}{\80\354}
\DeclareTextCompositeCommand{\h}{PU}{i}{\9036\311}
\DeclareTextCompositeCommand{\~}{PU}{i}{\81\051}
\DeclareTextCompositeCommand{\'}{PU}{o}{\80\363}
\DeclareTextCompositeCommand{\d}{PU}{o}{\9036\315}
\DeclareTextCompositeCommand{\`}{PU}{o}{\80\362}
\DeclareTextCompositeCommand{\h}{PU}{o}{\9036\317}
\DeclareTextCompositeCommand{\~}{PU}{o}{\80\365}
\DeclareTextCompositeCommand{\'}{PU}{\ocircumflex}{\9036\321}
\DeclareTextCompositeCommand{\d}{PU}{\ocircumflex}{\9036\331}
\DeclareTextCompositeCommand{\`}{PU}{\ocircumflex}{\9036\323}
\DeclareTextCompositeCommand{\h}{PU}{\ocircumflex}{\9036\325}
\DeclareTextCompositeCommand{\~}{PU}{\ocircumflex}{\9036\327}
\DeclareTextCompositeCommand{\'}{PU}{\ohorn}{\9036\333}
\DeclareTextCompositeCommand{\d}{PU}{\ohorn}{\9036\343}
\DeclareTextCompositeCommand{\`}{PU}{\ohorn}{\9036\335}
\DeclareTextCompositeCommand{\h}{PU}{\ohorn}{\9036\337}
\DeclareTextCompositeCommand{\~}{PU}{\ohorn}{\9036\341}
\DeclareTextCompositeCommand{\'}{PU}{u}{\80\372}
\DeclareTextCompositeCommand{\d}{PU}{u}{\9036\345}
\DeclareTextCompositeCommand{\`}{PU}{u}{\80\371}
\DeclareTextCompositeCommand{\h}{PU}{u}{\9036\347}
\DeclareTextCompositeCommand{\~}{PU}{u}{\81\151}
\DeclareTextCompositeCommand{\'}{PU}{\uhorn}{\9036\351}
\DeclareTextCompositeCommand{\d}{PU}{\uhorn}{\9036\361}
\DeclareTextCompositeCommand{\`}{PU}{\uhorn}{\9036\353}
\DeclareTextCompositeCommand{\h}{PU}{\uhorn}{\9036\355}
\DeclareTextCompositeCommand{\~}{PU}{\uhorn}{\9036\357}
\DeclareTextCompositeCommand{\'}{PU}{y}{\80\375}
\DeclareTextCompositeCommand{\d}{PU}{y}{\9036\365}
\DeclareTextCompositeCommand{\`}{PU}{y}{\9036\363}
\DeclareTextCompositeCommand{\h}{PU}{y}{\9036\367}
\DeclareTextCompositeCommand{\~}{PU}{y}{\9036\371}
\DeclareTextCompositeCommand{\'}{PU}{A}{\80\301}
\DeclareTextCompositeCommand{\d}{PU}{A}{\9036\240}
\DeclareTextCompositeCommand{\`}{PU}{A}{\80\300}
\DeclareTextCompositeCommand{\h}{PU}{A}{\9036\242}
\DeclareTextCompositeCommand{\~}{PU}{A}{\80\303}
\DeclareTextCompositeCommand{\'}{PU}{\ABREVE}{\9036\256}
\DeclareTextCompositeCommand{\d}{PU}{\ABREVE}{\9036\266}
\DeclareTextCompositeCommand{\`}{PU}{\ABREVE}{\9036\260}
\DeclareTextCompositeCommand{\h}{PU}{\ABREVE}{\9036\262}
\DeclareTextCompositeCommand{\~}{PU}{\ABREVE}{\9036\264}
\DeclareTextCompositeCommand{\'}{PU}{\ACIRCUMFLEX}{\9036\244}
\DeclareTextCompositeCommand{\d}{PU}{\ACIRCUMFLEX}{\9036\254}
\DeclareTextCompositeCommand{\`}{PU}{\ACIRCUMFLEX}{\9036\246}
\DeclareTextCompositeCommand{\h}{PU}{\ACIRCUMFLEX}{\9036\250}
\DeclareTextCompositeCommand{\~}{PU}{\ACIRCUMFLEX}{\9036\252}
\DeclareTextCompositeCommand{\'}{PU}{E}{\80\311}
\DeclareTextCompositeCommand{\d}{PU}{E}{\9036\270}
\DeclareTextCompositeCommand{\`}{PU}{E}{\80\310}
\DeclareTextCompositeCommand{\h}{PU}{E}{\9036\272}
\DeclareTextCompositeCommand{\~}{PU}{E}{\9036\274}
\DeclareTextCompositeCommand{\'}{PU}{\ECIRCUMFLEX}{\9036\276}
\DeclareTextCompositeCommand{\d}{PU}{\ECIRCUMFLEX}{\9036\306}
\DeclareTextCompositeCommand{\`}{PU}{\ECIRCUMFLEX}{\9036\300}
\DeclareTextCompositeCommand{\h}{PU}{\ECIRCUMFLEX}{\9036\302}
\DeclareTextCompositeCommand{\~}{PU}{\ECIRCUMFLEX}{\9036\304}
\DeclareTextCompositeCommand{\'}{PU}{I}{\80\315}
\DeclareTextCompositeCommand{\d}{PU}{I}{\9036\312}
\DeclareTextCompositeCommand{\`}{PU}{I}{\80\314}
\DeclareTextCompositeCommand{\h}{PU}{I}{\9036\310}
\DeclareTextCompositeCommand{\~}{PU}{I}{\81\050}
\DeclareTextCompositeCommand{\'}{PU}{O}{\80\323}
\DeclareTextCompositeCommand{\d}{PU}{O}{\9036\314}
\DeclareTextCompositeCommand{\`}{PU}{O}{\80\322}
\DeclareTextCompositeCommand{\h}{PU}{O}{\9036\316}
\DeclareTextCompositeCommand{\~}{PU}{O}{\80\325}
\DeclareTextCompositeCommand{\'}{PU}{\OCIRCUMFLEX}{\9036\320}
\DeclareTextCompositeCommand{\d}{PU}{\OCIRCUMFLEX}{\9036\330}
\DeclareTextCompositeCommand{\`}{PU}{\OCIRCUMFLEX}{\9036\322}
\DeclareTextCompositeCommand{\h}{PU}{\OCIRCUMFLEX}{\9036\324}
\DeclareTextCompositeCommand{\~}{PU}{\OCIRCUMFLEX}{\9036\326}
\DeclareTextCompositeCommand{\'}{PU}{\OHORN}{\9036\332}
\DeclareTextCompositeCommand{\d}{PU}{\OHORN}{\9036\342}
\DeclareTextCompositeCommand{\`}{PU}{\OHORN}{\9036\334}
\DeclareTextCompositeCommand{\h}{PU}{\OHORN}{\9036\336}
\DeclareTextCompositeCommand{\~}{PU}{\OHORN}{\9036\340}
\DeclareTextCompositeCommand{\'}{PU}{U}{\80\332}
\DeclareTextCompositeCommand{\d}{PU}{U}{\9036\344}
\DeclareTextCompositeCommand{\`}{PU}{U}{\80\331}
\DeclareTextCompositeCommand{\h}{PU}{U}{\9036\346}
\DeclareTextCompositeCommand{\~}{PU}{U}{\81\150}
\DeclareTextCompositeCommand{\'}{PU}{\UHORN}{\9036\350}
\DeclareTextCompositeCommand{\d}{PU}{\UHORN}{\9036\360}
\DeclareTextCompositeCommand{\`}{PU}{\UHORN}{\9036\352}
\DeclareTextCompositeCommand{\h}{PU}{\UHORN}{\9036\354}
\DeclareTextCompositeCommand{\~}{PU}{\UHORN}{\9036\356}
\DeclareTextCompositeCommand{\'}{PU}{Y}{\80\335}
\DeclareTextCompositeCommand{\d}{PU}{Y}{\9036\364}
\DeclareTextCompositeCommand{\`}{PU}{Y}{\9036\362}
\DeclareTextCompositeCommand{\h}{PU}{Y}{\9036\366}
\DeclareTextCompositeCommand{\~}{PU}{Y}{\9036\370}
%    \end{macrocode}
%    \begin{macrocode}
%</puvnenc>
%    \end{macrocode}
%
% \subsection{PU encoding, additions for Arabi}
%
%    This file is provided and maintained by Youssef Jabri.
%
%    \begin{macrocode}
%<*puarenc>
%    \end{macrocode}
%    \begin{macrocode}
\DeclareTextCommand{\hamza}{PU}{\86\041}% 0621;afii57409;ARABIC LETTER HAMZA
\DeclareTextCommand{\alefmadda}{PU}{\86\042}% 0622;afii57410;ARABIC LETTER ALEF WITH MADDA ABOVE
\DeclareTextCommand{\alefhamza}{PU}{\86\043}% 0623;afii57411;ARABIC LETTER ALEF WITH HAMZA ABOVE
\DeclareTextCommand{\wawhamza}{PU}{\86\044} % 0624;afii57412;ARABIC LETTER WAW WITH HAMZA ABOVE
\DeclareTextCommand{\aleflowerhamza}{PU}{\86\045}% 0625;afii57413;ARABIC LETTER ALEF WITH HAMZA BELOW
\DeclareTextCommand{\yahamza}{PU}{\86\046}% 0626;afii57414;ARABIC LETTER YEH WITH HAMZA ABOVE
\DeclareTextCommand{\alef}{PU}{\86\047}% 0627;afii57415;ARABIC LETTER ALEF
\DeclareTextCommand{\baa}{PU}{\86\050}% 0628;afii57416;ARABIC LETTER BEH
\DeclareTextCommand{\T}{PU}{\86\051}% 0629;afii57417;ARABIC LETTER TEH MARBUTA
\DeclareTextCommand{\taa}{PU}{\86\052}% 062A;afii57418;ARABIC LETTER TEH
\DeclareTextCommand{\thaa}{PU}{\86\053}% 062B;afii57419;ARABIC LETTER THEH
\DeclareTextCommand{\jeem}{PU}{\86\054}% 062C;afii57420;ARABIC LETTER JEEM
\DeclareTextCommand{\Haa}{PU}{\86\055}% 062D;afii57421;ARABIC LETTER HAH
\DeclareTextCommand{\kha}{PU}{\86\056}% 062E;afii57422;ARABIC LETTER KHAH
\DeclareTextCommand{\dal}{PU}{\86\057}% 062F;afii57423;ARABIC LETTER DAL
\DeclareTextCommand{\dhal}{PU}{\86\060}% 0630;afii57424;ARABIC LETTER THAL
\DeclareTextCommand{\ra}{PU}{\86\061}% 0631;afii57425;ARABIC LETTER REH
\DeclareTextCommand{\zay}{PU}{\86\062}% 0632;afii57426;ARABIC LETTER ZAIN
\DeclareTextCommand{\seen}{PU}{\86\063}% 0633;afii57427;ARABIC LETTER SEEN
\DeclareTextCommand{\sheen}{PU}{\86\064}% 0634;afii57428;ARABIC LETTER SHEEN
\DeclareTextCommand{\sad}{PU}{\86\065}% 0635;afii57429;ARABIC LETTER SAD
\DeclareTextCommand{\dad}{PU}{\86\066}% 0636;afii57430;ARABIC LETTER DAD
\DeclareTextCommand{\Ta}{PU}{\86\067}% 0637;afii57431;ARABIC LETTER TAH
\DeclareTextCommand{\za}{PU}{\86\070}% 0638;afii57432;ARABIC LETTER ZAH
\DeclareTextCommand{\ayn}{PU}{\86\071}% 0639;afii57433;ARABIC LETTER AIN
\DeclareTextCommand{\ghayn}{PU}{\86\072}% 063A;afii57434;ARABIC LETTER GHAIN
\DeclareTextCommand{\tatweel}{PU}{\86\100}% 0640;afii57440;ARABIC TATWEEL
\DeclareTextCommand{\fa}{PU}{\86\101}% 0641;afii57441;ARABIC LETTER FEH
\DeclareTextCommand{\qaf}{PU}{\86\102}% 0642;afii57442;ARABIC LETTER QAF
\DeclareTextCommand{\kaf}{PU}{\86\103}% 0643;afii57443;ARABIC LETTER KAF
\DeclareTextCommand{\lam}{PU}{\86\104}% 0644;afii57444;ARABIC LETTER LAM
\DeclareTextCommand{\meem}{PU}{\86\105}% 0645;afii57445;ARABIC LETTER MEEM
\DeclareTextCommand{\nun}{PU}{\86\106}% 0646;afii57446;ARABIC LETTER NOON
\DeclareTextCommand{\ha}{PU}{\86\107}% 0647;afii57470;ARABIC LETTER HEH
\DeclareTextCommand{\waw}{PU}{\86\110}% 0648;afii57448;ARABIC LETTER WAW
\DeclareTextCommand{\alefmaqsura}{PU}{\86\111}% 0649;afii57449;ARABIC LETTER ALEF MAKSURA
\DeclareTextCommand{\ya}{PU}{\86\112}% 064A;afii57450;ARABIC LETTER YEH
%    \end{macrocode}
%    \begin{macrocode}
\DeclareTextCommand{\nasb}{PU}{\86\113}% 064B;afii57451;ARABIC FATHATAN
\DeclareTextCommand{\raff}{PU}{\86\114}% 064C;afii57452;ARABIC DAMMATAN
\DeclareTextCommand{\jarr}{PU}{\86\115}% 064D;afii57453;ARABIC KASRATAN
\DeclareTextCommand{\fatha}{PU}{\86\116}% 064E;afii57454;ARABIC FATHA
\DeclareTextCommand{\damma}{PU}{\86\117}% 064F;afii57455;ARABIC DAMMA
\DeclareTextCommand{\kasra}{PU}{\86\120}% 0650;afii57456;ARABIC KASRA
\DeclareTextCommand{\shadda}{PU}{\86\121}% 0651;afii57457;ARABIC SHADDA
\DeclareTextCommand{\sukun}{PU}{\86\122}% 0652;afii57458;ARABIC SUKUN
%    \end{macrocode}
%    Farsi
%    \begin{macrocode}
\DeclareTextCommand{\peh}{PU}{\86\176}% 067E;afii57506;ARABIC LETTER PEH
\DeclareTextCommand{\tcheh}{PU}{\86\206}% 0686;afii57507;ARABIC LETTER TCHEH
\DeclareTextCommand{\jeh}{PU}{\86\230}% 0698;afii57508;ARABIC LETTER JEH
\DeclareTextCommand{\farsikaf}{PU}{\86\251}% 06A9???;afii?????;FARSI LETTER KAF
\DeclareTextCommand{\gaf}{PU}{\86\257}% 06AF;afii57509;ARABIC LETTER GAF
\DeclareTextCommand{\farsiya}{PU}{\86\314}% 06CC;afii?????;FARSI LETTER YEH
%    \end{macrocode}
%    \begin{macrocode}
\DeclareTextCommand{\ZWNJ}{PU}{\9040\014}% 200C;ZWNJ%
\DeclareTextCommand{\noboundary}{PU}{\86\325}% 200D;ZWJ
%    \end{macrocode}
%    \begin{macrocode}
%</puarenc>
%    \end{macrocode}
%
% \section{End of file hycheck.tex}
%
%    \begin{macrocode}
%<*check>
\typeout{}
\begin{document}
\end{document}
%</check>
%    \end{macrocode}
%
% \Finale
%
\endinput
