summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/hypdestopt
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-09-04 03:03:07 +0000
committerNorbert Preining <norbert@preining.info>2020-09-04 03:03:07 +0000
commit547e0bdac8f18f25b4cac1bb8234b9aecb2bcea8 (patch)
treed780e2601b5cbdd3aae05d5141d84689813fe4e6 /macros/latex/contrib/hypdestopt
parentfc732340b62b41cedbe82bcb3675a86c65343a21 (diff)
CTAN sync 202009040303
Diffstat (limited to 'macros/latex/contrib/hypdestopt')
-rw-r--r--macros/latex/contrib/hypdestopt/README.md17
-rw-r--r--macros/latex/contrib/hypdestopt/hypdestopt.dtx964
-rw-r--r--macros/latex/contrib/hypdestopt/hypdestopt.pdfbin0 -> 323028 bytes
3 files changed, 981 insertions, 0 deletions
diff --git a/macros/latex/contrib/hypdestopt/README.md b/macros/latex/contrib/hypdestopt/README.md
new file mode 100644
index 0000000000..0610b53e58
--- /dev/null
+++ b/macros/latex/contrib/hypdestopt/README.md
@@ -0,0 +1,17 @@
+# hypdestopt package for LaTeX
+
+Version: 2020-09-02 v2.7
+
+Hyperref destination optimizer
+
+Package hypdestopt supports hyperref's
+pdftex driver. It removes unnecessary destinations
+and shortens the destination names or uses numbered destinations
+to get smaller PDF files.
+
+## Copyright (C)
+* 2007, 2009-2011 Heiko Oberdiek
+* 2016-2020 Oberdiek Package Support Group
+
+## License
+LATEX Project Public License, version 1.3c or later.
diff --git a/macros/latex/contrib/hypdestopt/hypdestopt.dtx b/macros/latex/contrib/hypdestopt/hypdestopt.dtx
new file mode 100644
index 0000000000..03006db27b
--- /dev/null
+++ b/macros/latex/contrib/hypdestopt/hypdestopt.dtx
@@ -0,0 +1,964 @@
+% \iffalse meta-comment
+%
+% File: hypdestopt.dtx
+% Version: 2020-09-02 v2.7
+% Info: Hyperref destination optimizer
+%
+% Copyright (C)
+% 2006-2008, 2011 Heiko Oberdiek
+% 2016-2020 Oberdiek Package Support Group
+% https://github.com/ho-tex/hypdestopt/issues
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either
+% version 1.3c of this license or (at your option) any later
+% version. This version of this license is in
+% https://www.latex-project.org/lppl/lppl-1-3c.txt
+% and the latest version of this license is in
+% https://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 Maintainers of this work are
+% Heiko Oberdiek and the Oberdiek Package Support Group
+% https://github.com/ho-tex/hypdestopt/issues
+%
+% This work consists of the main source file hypdestopt.dtx
+% and the derived files
+% hypdestopt.sty, hypdestopt.pdf, hypdestopt.ins, hypdestopt.drv.
+%
+% Distribution:
+% CTAN:macros/latex/contrib/hypdestopt/hypdestopt.dtx
+% CTAN:macros/latex/contrib/hypdestopt/hypdestopt.pdf
+%
+% Unpacking:
+% (a) If hypdestopt.ins is present:
+% tex hypdestopt.ins
+% (b) Without hypdestopt.ins:
+% tex hypdestopt.dtx
+% (c) If you insist on using LaTeX
+% latex \let\install=y\input{hypdestopt.dtx}
+% (quote the arguments according to the demands of your shell)
+%
+% Documentation:
+% (a) If hypdestopt.drv is present:
+% latex hypdestopt.drv
+% (b) Without hypdestopt.drv:
+% latex hypdestopt.dtx; ...
+% The class ltxdoc loads the configuration file ltxdoc.cfg
+% if available. Here you can specify further options, e.g.
+% use A4 as paper format:
+% \PassOptionsToClass{a4paper}{article}
+%
+% Programm calls to get the documentation (example):
+% pdflatex hypdestopt.dtx
+% makeindex -s gind.ist hypdestopt.idx
+% pdflatex hypdestopt.dtx
+% makeindex -s gind.ist hypdestopt.idx
+% pdflatex hypdestopt.dtx
+%
+% Installation:
+% TDS:tex/latex/hypdestopt/hypdestopt.sty
+% TDS:doc/latex/hypdestopt/hypdestopt.pdf
+% TDS:source/latex/hypdestopt/hypdestopt.dtx
+%
+%<*ignore>
+\begingroup
+ \catcode123=1 %
+ \catcode125=2 %
+ \def\x{LaTeX2e}%
+\expandafter\endgroup
+\ifcase 0\ifx\install y1\fi\expandafter
+ \ifx\csname processbatchFile\endcsname\relax\else1\fi
+ \ifx\fmtname\x\else 1\fi\relax
+\else\csname fi\endcsname
+%</ignore>
+%<*install>
+\input docstrip.tex
+\Msg{************************************************************************}
+\Msg{* Installation}
+\Msg{* Package: hypdestopt 2020-09-02 v2.7 Hyperref destination optimizer (HO)}
+\Msg{************************************************************************}
+
+\keepsilent
+\askforoverwritefalse
+
+\let\MetaPrefix\relax
+\preamble
+
+This is a generated file.
+
+Project: hypdestopt
+Version: 2020-09-02 v2.7
+
+Copyright (C)
+ 2006-2008, 2011 Heiko Oberdiek
+ 2016-2020 Oberdiek Package Support Group
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either
+version 1.3c of this license or (at your option) any later
+version. This version of this license is in
+ https://www.latex-project.org/lppl/lppl-1-3c.txt
+and the latest version of this license is in
+ https://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 Maintainers of this work are
+Heiko Oberdiek and the Oberdiek Package Support Group
+https://github.com/ho-tex/hypdestopt/issues
+
+
+This work consists of the main source file hypdestopt.dtx
+and the derived files
+ hypdestopt.sty, hypdestopt.pdf, hypdestopt.ins, hypdestopt.drv.
+
+\endpreamble
+\let\MetaPrefix\DoubleperCent
+
+\generate{%
+ \file{hypdestopt.ins}{\from{hypdestopt.dtx}{install}}%
+ \file{hypdestopt.drv}{\from{hypdestopt.dtx}{driver}}%
+ \usedir{tex/latex/oberdiek}%
+ \file{hypdestopt.sty}{\from{hypdestopt.dtx}{package}}%
+}
+
+\catcode32=13\relax% active space
+\let =\space%
+\Msg{************************************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* hypdestopt.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file `hypdestopt.drv'}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*}
+\Msg{************************************************************************}
+
+\endbatchfile
+%</install>
+%<*ignore>
+\fi
+%</ignore>
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{hypdestopt.drv}%
+ [2020-09-02 v2.7 Hyperref destination optimizer (HO)]%
+\documentclass{ltxdoc}
+\usepackage{holtxdoc}[2011/11/22]
+\begin{document}
+ \DocInput{hypdestopt.dtx}%
+\end{document}
+%</driver>
+% \fi
+%
+%
+%
+% \GetFileInfo{hypdestopt.drv}
+%
+% \title{The \xpackage{hypdestopt} package}
+% \date{2020-09-02 v2.7}
+% \author{Heiko Oberdiek\thanks
+% {Please report any issues at \url{https://github.com/ho-tex/hypdestopt/issues}}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% Package \xpackage{hypdestopt} supports \xpackage{hyperref}'s
+% \xoption{pdftex} and \xoption{luatex} driver. It removes unnecessary destinations
+% and shortens the destination names or uses numbered destinations
+% to get smaller PDF files.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{User interface}
+%
+% \subsection{Introduction}
+%
+% Before PDF-1.5 annotations and destinations cannot be compressed.
+% If the destination names are not needed for external use, the
+% file size can be decreased by the following means:
+% \begin{itemize}
+% \item Unused destinations are removed.
+% \item The destination names are shortened (option \xoption{name}).
+% \item Using numbered destinations (option \xoption{num}).
+% \end{itemize}
+%
+% \subsection{Requirements}
+%
+% \begin{itemize}
+% \item Package \xpackage{hyperref} 2006/06/01 v6.75a or newer
+% (\cite{hyperref}).
+% \item Package \xpackage{alphalph} 2006/05/30 v1.4 or newer
+% (\cite{alphalph}), if option \xoption{name} is used.
+% \item Package \xpackage{iftex}.
+% \item \pdfTeX\ 1.30.0 or newer.
+% \item \pdfTeX\ or lua\TeX\ in PDF mode.
+% \item \eTeX\ extensions enabled.
+% \item Probably an additional compile run of \pdfLaTeX\ or lua\LaTeX\ is necessary.
+% \end{itemize}
+%
+% In the first compile runs you can get warnings such as:
+%\begin{quote}
+%\begin{verbatim}
+%! pdfTeX warning (dest): name{...} has been referenced ...
+%\end{verbatim}
+%\end{quote}
+% These warnings should vanish in later compile runs.
+% However these warnings also can occur without this package.
+% The package does not cure them, thus these warnings will remain,
+% but the destination name can be different. In such cases test
+% without the package, too.
+%
+% \subsection{Use}
+%
+% If the requirements are met, load the package:
+%\begin{quote}
+%\verb|\usepackage{hypdestopt}|
+%\end{quote}
+%
+% The following options are supported:
+% \begin{description}
+% \item[\xoption{verbose}:] Verbose debug output is enabled and written
+% in the protocol file.
+% \item[\xoption{num}:] Numbered destinations are used. The file size
+% is smaller, because names are no longer used.
+% This is the default.
+% \item[\xoption{name}:] Destinations are identified by names.
+% \end{description}
+%
+% \subsection{Limitations}
+%
+% \begin{itemize}
+% \item Forget this package, if you need preserved destination names.
+% \item Destination name strings use all bytes (0..255) except
+% the carriage return (13), left parenthesis (40), right
+% parenthesis (41), and backslash (92), because they
+% must be quoted in general and therefore occupy two bytes
+% instead of one.
+%
+% Further the zero byte (0) is avoided for programs
+% that implement strings using zero terminated C strings.
+% And 255 (0xFF) is avoided to get rid of a possible
+% unicode marker at the begin.
+%
+% So far I have not seen problems with:
+% \begin{itemize}
+% \item AcrobatReader 5.08/Linux
+% \item AcrobatReader 7.0/Linux
+% \item xpdf 3.00
+% \item Ghostscript 8.50
+% \item gv 3.5.8
+% \item GSview 4.6
+% \end{itemize}
+% But I have not tested all and all possible PDF viewers.
+% \item Use of named destinations (\cs{pdfdest}, \cs{pdfoutline},
+% \cs{pdfstartlink}, \dots) that are not supported by this
+% package.
+% \item Currently only \xpackage{hyperref} with \pdfTeX\ and lua\TeX\ in PDF
+% mode is supported.
+% \end{itemize}
+%
+% \subsection{Future}
+%
+% A more general approach is a PDF postprocessor that takes
+% a PDF file, performs some transformations and writes the
+% result in a more optimized PDF file. Then it does not depend,
+% how the original PDF file was generated and further improvements
+% are easier to apply. For example, the destination names could be sorted:
+% often used destination names would then be shorter than seldom used ones.
+%
+% \StopEventually{
+% }
+%
+% \section{Implementation}
+%
+% \subsection{Identification}
+%
+% \begin{macrocode}
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{hypdestopt}%
+ [2020-09-02 v2.7 Hyperref destination optimizer (HO)]%
+% \end{macrocode}
+%
+% \subsection{Options}
+%
+% \subsubsection{Option \xoption{verbose}}
+%
+% \begin{macrocode}
+\newif\ifHypDest@Verbose
+\DeclareOption{verbose}{\HypDest@Verbosetrue}
+% \end{macrocode}
+%
+% \begin{macro}{\HypDest@VerboseInfo}
+% Wrapper for verbose messages.
+% \begin{macrocode}
+\def\HypDest@VerboseInfo#1{%
+ \ifHypDest@Verbose
+ \PackageInfo{hypdestopt}{#1}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Options \xoption{num} and \xoption{name}}
+%
+% The options \xoption{num} or \xoption{name} specify
+% the method, how destinations are referenced (by name or
+% number). Default is option \xoption{num}.
+% \begin{macrocode}
+\newif\ifHypDest@name
+\DeclareOption{num}{\HypDest@namefalse}
+\DeclareOption{name}{\HypDest@nametrue}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ProcessOptions*\relax
+% \end{macrocode}
+%
+% \subsection{Check requirements}
+%
+% First \pdfTeX\ must running in PDF mode.
+% \begin{macrocode}
+\RequirePackage{iftex}[2019/11/07]
+\RequirePackage{pdftexcmds}[2007/11/11]
+\ifpdf
+\else
+ \PackageError{hypdestopt}{%
+ This package requires pdfTeX or luaTeX in PDF mode%
+ }\@ehc
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+% The version of \pdfTeX\ must not be too old, because
+% \cs{pdfescapehex} and \cs{pdfunescapehex} are used.
+% \begin{macrocode}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname pdf@escapehex\endcsname\relax
+ \PackageError{hypdestopt}{%
+ This pdfTeX is too old, at least 1.30.0 is required%
+ }\@ehc
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+% Features of \eTeX\ are used, e.g. \cs{numexpr}.
+% \begin{macrocode}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname numexpr\endcsname\relax
+ \PackageError{hypdestopt}{%
+ e-TeX features are missing%
+ }\@ehc
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+% Package \xpackage{alphalph} provides \cs{newalphalph} since
+% version 2006/05/30 v1.4.
+% \begin{macrocode}
+\ifHypDest@name
+ \RequirePackage{alphalph}[2006/05/30]%
+\fi
+% \end{macrocode}
+% \begin{macrocode}
+\RequirePackage{auxhook}[2009/12/14]
+\RequirePackage{pdfescape}[2007/04/21]
+% \end{macrocode}
+%
+% \subsection{Preamble for auxiliary file}
+%
+% Provide dummy definitions for the macros that are used in the
+% auxiliary files. If the package is used no longer, then these
+% commands will not generate errors.
+%
+% \begin{macro}{\HypDest@PrependDocument}
+% We add our stuff in front of the \cs{AtBeginDocument} hook
+% to ensure that we are before \xpackage{hyperref}'s stuff.
+% Starting with LaTeX 2020/10/01 we use the hook and a rule.
+% \begin{macrocode}
+\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
+\IfFormatAtLeastTF{2020/10/01}
+ {
+ \long\def\HypDest@PrependDocument#1{%
+ \AddToHook{begindocument}{#1}}%
+ \DeclareHookRule{begindocument}{.}{before}{hyperref}
+ }
+ {
+ \long\def\HypDest@PrependDocument#1{%
+ \begingroup
+ \toks\z@{#1}%
+ \toks\tw@\expandafter{\@begindocumenthook}%
+ \xdef\@begindocumenthook{\the\toks\z@\the\toks\tw@}%
+ \endgroup
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\AddLineBeginAux{%
+ \string\providecommand{\string\HypDest@Use}[1]{}%
+}
+% \end{macrocode}
+%
+% \subsection{Generation of destination names}
+%
+% Counter |HypDest| is used for identifying destinations.
+% \begin{macrocode}
+\newcounter{HypDest}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ifHypDest@name
+% \end{macrocode}
+%
+% \begin{macro}{\HypDest@HexChar}
+% Destination names are generated by automatically
+% numbering with the help of package \xpackage{alphalph}.
+% \cs{HypDest@HexChar} converts a number of the range 1 until 252
+% into the hexadecimal representation of the string character.
+% \begin{macrocode}
+ \def\HypDest@HexChar#1{%
+ \ifcase#1\or
+% \end{macrocode}
+% Avoid zero byte because of C strings in PDF viewer
+% applications.
+% \begin{macrocode}
+ 01\or 02\or 03\or 04\or 05\or 06\or 07\or
+% \end{macrocode}
+% Omit carriage return (13/\verb|^^0d|).
+% It needs quoting, otherwise it would be converted
+% to line feed (10/\verb|^^0a|).
+% \begin{macrocode}
+ 08\or 09\or 0A\or 0B\or 0C\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
+% \end{macrocode}
+% Omit left and right parentheses (40/\verb|^^28|, 41/\verb|^^39|),
+% they need quoting in general.
+% \begin{macrocode}
+ 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
+% \end{macrocode}
+% Omit backslash (92/\verb|^^5C|), it needs quoting.
+% \begin{macrocode}
+ 58\or 59\or 5A\or 5B\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
+% \end{macrocode}
+% Avoid 255 (0xFF) to get rid of a possible unicode
+% marker at the begin of the string.
+% \begin{macrocode}
+ F8\or F9\or FA\or FB\or FC\or FD\or FE%
+ \fi
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{HypDest@HexString}
+% Now package \xpackage{alphalph} comes into play.
+% \cs{HypDest@HexString} is defined and converts
+% a positive number into a string, given in hexadecimal
+% representation.
+% \begin{macrocode}
+ \newalphalph\HypDest@HexString\HypDest@HexChar{250}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\theHypDest}
+% For use, the hexadecimal string is converted back.
+% \begin{macrocode}
+ \renewcommand*{\theHypDest}{%
+ \pdf@unescapehex{\HypDest@HexString{\value{HypDest}}}%
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% With option \xoption{num} we use the number directly.
+% \begin{macrocode}
+\else
+ \renewcommand*{\theHypDest}{%
+ \number\value{HypDest}%
+ }%
+\fi
+% \end{macrocode}
+%
+% \subsection{Assign destination names}
+%
+% \begin{macro}{\HypDest@Prefix}
+% The new destination names are remembered in macros whose names
+% start with prefix \cs{HypDest@Prefix}.
+% \begin{macrocode}
+\edef\HypDest@Prefix{HypDest\string:}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\HypDest@Use}
+% During the first read of the auxiliary files, the used destinations
+% get fresh generated short destination names. Also for the old
+% destination names we use the hexadecimal representation. That
+% avoid problems with arbitrary names.
+% \begin{macrocode}
+\def\HypDest@Use#1{%
+ \begingroup
+ \edef\x{%
+ \expandafter\noexpand
+ \csname\HypDest@Prefix\pdf@unescapehex{#1}\endcsname
+ }%
+ \expandafter\ifx\x\relax
+ \stepcounter{HypDest}%
+ \expandafter\xdef\x{\theHypDest}%
+ \let\on@line\@empty
+ \ifHypDest@name
+ \HypDest@VerboseInfo{%
+ Use: (\pdf@unescapehex{#1}) -\string> %
+ 0x\pdf@escapehex{\x} (\number\value{HypDest})%
+ }%
+ \else
+ \HypDest@VerboseInfo{%
+ Use: (\pdf@unescapehex{#1}) -\string> num \x
+ }%
+ \fi
+ \fi
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% After the first \xfile{.aux} file processing the destination names
+% are assigned and we can disable \cs{HypDest@Use}.
+% \begin{macrocode}
+\AtBeginDocument{%
+ \let\HypDest@Use\@gobble
+}
+% \end{macrocode}
+%
+% \begin{macro}{\HypDest@MarkUsed}
+% Destinations that are actually used are marked by \cs{HypDest@MarkUsed}.
+% \cs{nofiles} is respected.
+% \begin{macrocode}
+\def\HypDest@MarkUsed#1{%
+ \HypDest@VerboseInfo{%
+ MarkUsed: (#1)%
+ }%
+ \if@filesw
+ \immediate\write\@auxout{%
+ \string\HypDest@Use{\pdf@escapehex{#1}}%
+ }%
+ \fi
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Redefinition of \xpackage{hyperref}'s hooks}
+%
+% Package \xpackage{hyperref} can be loaded later, therefore
+% we redefine \xpackage{hyperref}'s macros at |\begin{document}|.
+% \begin{macrocode}
+\HypDest@PrependDocument{%
+% \end{macrocode}
+%
+%
+% \subsubsection{Destination setting}
+%
+% luatex compatibility
+% \begin{macrocode}
+\ifx\pdfextension\@undefined\else
+ \protected\def\pdfdest{\pdfextension dest }
+\fi
+% \end{macrocode}
+% \begin{macrocode}
+ \ifHypDest@name
+ \let\HypDest@Org@DestName\Hy@DestName
+ \renewcommand*{\Hy@DestName}[2]{%
+ \EdefUnescapeString\HypDest@temp{#1}%
+ \@ifundefined{\HypDest@Prefix\HypDest@temp}{%
+ \HypDest@VerboseInfo{%
+ DestName: (\HypDest@temp) unused%
+ }%
+ }{%
+ \HypDest@Org@DestName{%
+ \csname\HypDest@Prefix\HypDest@temp\endcsname
+ }{#2}%
+ \HypDest@VerboseInfo{%
+ DestName: (\HypDest@temp) %
+ 0x\pdf@escapehex{%
+ \csname\HypDest@Prefix\HypDest@temp\endcsname
+ }%
+ }%
+ }%
+ }%
+ \else
+ \renewcommand*{\Hy@DestName}[2]{%
+ \EdefUnescapeString\HypDest@temp{#1}%
+ \@ifundefined{\HypDest@Prefix\HypDest@temp}{%
+ \HypDest@VerboseInfo{%
+ DestName: (\HypDest@temp) unused%
+ }%
+ }{%
+ \pdfdest num%
+ \csname\HypDest@Prefix\HypDest@temp\endcsname#2\relax
+ \HypDest@VerboseInfo{%
+ DestName: (\HypDest@temp) %
+ num \csname\HypDest@Prefix\HypDest@temp\endcsname
+ }%
+ }%
+ }%
+ \fi
+% \end{macrocode}
+%
+% \subsubsection{Links}
+%
+% \begin{macrocode}
+ \let\HypDest@Org@StartlinkName\Hy@StartlinkName
+ \ifHypDest@name
+ \renewcommand*{\Hy@StartlinkName}[2]{%
+ \HypDest@MarkUsed{#2}%
+ \HypDest@Org@StartlinkName{#1}{%
+ \@ifundefined{\HypDest@Prefix#2}{%
+ #2%
+ }{%
+ \csname\HypDest@Prefix#2\endcsname
+ }%
+ }%
+ }%
+ \else
+ \renewcommand*{\Hy@StartlinkName}[2]{%
+ \HypDest@MarkUsed{#2}%
+ \@ifundefined{\HypDest@Prefix#2}{%
+ \HypDest@Org@StartlinkName{#1}{#2}%
+ }{%
+ \pdfstartlink attr{#1}%
+ goto num\csname\HypDest@Prefix#2\endcsname
+ \relax
+ }%
+ }%
+ \fi
+% \end{macrocode}
+%
+% \subsubsection{Outlines of package \xpackage{hyperref}}
+%
+% \begin{macrocode}
+ \let\HypDest@Org@OutlineName\Hy@OutlineName
+ \ifHypDest@name
+ \renewcommand*{\Hy@OutlineName}[4]{%
+ \HypDest@Org@OutlineName{#1}{%
+ \@ifundefined{\HypDest@Prefix#2}{%
+ #2%
+ }{%
+ \csname\HypDest@Prefix#2\endcsname
+ }%
+ }{#3}{#4}%
+ }%
+ \else
+ \renewcommand*{\Hy@OutlineName}[4]{%
+ \@ifundefined{\HypDest@Prefix#2}{%
+ \HypDest@Org@OutlineName{#1}{#2}{#3}{#4}%
+ }{%
+ \pdfoutline goto num\csname\HypDest@Prefix#2\endcsname
+ count#3{#4}%
+ }%
+ }%
+ \fi
+% \end{macrocode}
+% Because \cs{Hy@OutlineName} is called after the \xfile{.out} file
+% is written in the previous run. Therefore we mark the destination
+% earlier in \cs{@@writetorep}.
+% \begin{macrocode}
+ \let\HypDest@Org@@writetorep\@@writetorep
+ \renewcommand*{\@@writetorep}[5]{%
+ \begingroup
+ \edef\Hy@tempa{#5}%
+ \ifx\Hy@tempa\Hy@bookmarkstype
+ \HypDest@MarkUsed{#3}%
+ \fi
+ \endgroup
+ \HypDest@Org@@writetorep{#1}{#2}{#3}{#4}{#5}%
+ }%
+% \end{macrocode}
+%
+% \subsubsection{Outlines of package \xpackage{bookmark}}
+%
+% \begin{macrocode}
+ \@ifpackageloaded{bookmark}{%
+ \renewcommand*{\BKM@DefGotoNameAction}[2]{%
+ \@ifundefined{\HypDest@Prefix#2}{%
+ \edef#1{goto name{hypdestopt\string :unknown}}%
+ }{%
+ \ifHypDest@name
+ \edef#1{goto name{\csname\HypDest@Prefix#2\endcsname}}%
+ \else
+ \edef#1{goto num\csname\HypDest@Prefix#2\endcsname}%
+ \fi
+ }%
+ }%
+ \def\BKM@HypDestOptHook{%
+ \ifx\BKM@dest\@empty
+ \else
+ \ifx\BKM@gotor\@empty
+ \HypDest@MarkUsed\BKM@dest
+ \fi
+ \fi
+ }%
+ }{}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \section{Installation}
+%
+% \subsection{Download}
+%
+% \paragraph{Package.} This package is available on
+% CTAN\footnote{\CTANpkg{hypdestopt}}:
+% \begin{description}
+% \item[\CTAN{macros/latex/contrib/oberdiek/hypdestopt.dtx}] The source file.
+% \item[\CTAN{macros/latex/contrib/oberdiek/hypdestopt.pdf}] Documentation.
+% \end{description}
+%
+%
+% \paragraph{Bundle.} All the packages of the bundle `oberdiek'
+% are also available in a TDS compliant ZIP archive. There
+% the packages are already unpacked and the documentation files
+% are generated. The files and directories obey the TDS standard.
+% \begin{description}
+% \item[\CTANinstall{install/macros/latex/contrib/oberdiek.tds.zip}]
+% \end{description}
+% \emph{TDS} refers to the standard ``A Directory Structure
+% for \TeX\ Files'' (\CTANpkg{tds}). Directories
+% with \xfile{texmf} in their name are usually organized this way.
+%
+% \subsection{Bundle installation}
+%
+% \paragraph{Unpacking.} Unpack the \xfile{oberdiek.tds.zip} in the
+% TDS tree (also known as \xfile{texmf} tree) of your choice.
+% Example (linux):
+% \begin{quote}
+% |unzip oberdiek.tds.zip -d ~/texmf|
+% \end{quote}
+%
+% \subsection{Package installation}
+%
+% \paragraph{Unpacking.} The \xfile{.dtx} file is a self-extracting
+% \docstrip\ archive. The files are extracted by running the
+% \xfile{.dtx} through \plainTeX:
+% \begin{quote}
+% \verb|tex hypdestopt.dtx|
+% \end{quote}
+%
+% \paragraph{TDS.} Now the different files must be moved into
+% the different directories in your installation TDS tree
+% (also known as \xfile{texmf} tree):
+% \begin{quote}
+% \def\t{^^A
+% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
+% hypdestopt.sty & tex/latex/oberdiek/hypdestopt.sty\\
+% hypdestopt.pdf & doc/latex/oberdiek/hypdestopt.pdf\\
+% hypdestopt.dtx & source/latex/oberdiek/hypdestopt.dtx\\
+% \end{tabular}^^A
+% }^^A
+% \sbox0{\t}^^A
+% \ifdim\wd0>\linewidth
+% \begingroup
+% \advance\linewidth by\leftmargin
+% \advance\linewidth by\rightmargin
+% \edef\x{\endgroup
+% \def\noexpand\lw{\the\linewidth}^^A
+% }\x
+% \def\lwbox{^^A
+% \leavevmode
+% \hbox to \linewidth{^^A
+% \kern-\leftmargin\relax
+% \hss
+% \usebox0
+% \hss
+% \kern-\rightmargin\relax
+% }^^A
+% }^^A
+% \ifdim\wd0>\lw
+% \sbox0{\small\t}^^A
+% \ifdim\wd0>\linewidth
+% \ifdim\wd0>\lw
+% \sbox0{\footnotesize\t}^^A
+% \ifdim\wd0>\linewidth
+% \ifdim\wd0>\lw
+% \sbox0{\scriptsize\t}^^A
+% \ifdim\wd0>\linewidth
+% \ifdim\wd0>\lw
+% \sbox0{\tiny\t}^^A
+% \ifdim\wd0>\linewidth
+% \lwbox
+% \else
+% \usebox0
+% \fi
+% \else
+% \lwbox
+% \fi
+% \else
+% \usebox0
+% \fi
+% \else
+% \lwbox
+% \fi
+% \else
+% \usebox0
+% \fi
+% \else
+% \lwbox
+% \fi
+% \else
+% \usebox0
+% \fi
+% \else
+% \lwbox
+% \fi
+% \else
+% \usebox0
+% \fi
+% \end{quote}
+% If you have a \xfile{docstrip.cfg} that configures and enables \docstrip's
+% TDS installing feature, then some files can already be in the right
+% place, see the documentation of \docstrip.
+%
+% \subsection{Refresh file name databases}
+%
+% If your \TeX~distribution
+% (\TeX\,Live, \mikTeX, \dots) relies on file name databases, you must refresh
+% these. For example, \TeX\,Live\ users run \verb|texhash| or
+% \verb|mktexlsr|.
+%
+% \subsection{Some details for the interested}
+%
+% \paragraph{Unpacking with \LaTeX.}
+% The \xfile{.dtx} chooses its action depending on the format:
+% \begin{description}
+% \item[\plainTeX:] Run \docstrip\ and extract the files.
+% \item[\LaTeX:] Generate the documentation.
+% \end{description}
+% If you insist on using \LaTeX\ for \docstrip\ (really,
+% \docstrip\ does not need \LaTeX), then inform the autodetect routine
+% about your intention:
+% \begin{quote}
+% \verb|latex \let\install=y\input{hypdestopt.dtx}|
+% \end{quote}
+% Do not forget to quote the argument according to the demands
+% of your shell.
+%
+% \paragraph{Generating the documentation.}
+% You can use both the \xfile{.dtx} or the \xfile{.drv} to generate
+% the documentation. The process can be configured by the
+% configuration file \xfile{ltxdoc.cfg}. For instance, put this
+% line into this file, if you want to have A4 as paper format:
+% \begin{quote}
+% \verb|\PassOptionsToClass{a4paper}{article}|
+% \end{quote}
+% An example follows how to generate the
+% documentation with pdf\LaTeX:
+% \begin{quote}
+%\begin{verbatim}
+%pdflatex hypdestopt.dtx
+%makeindex -s gind.ist hypdestopt.idx
+%pdflatex hypdestopt.dtx
+%makeindex -s gind.ist hypdestopt.idx
+%pdflatex hypdestopt.dtx
+%\end{verbatim}
+% \end{quote}
+%
+% \begin{thebibliography}{9}
+%
+% \bibitem{alphalph}
+% Heiko Oberdiek: \textit{The \xpackage{alphalph} package};
+% 2006/05/30 v1.4;
+% \CTANpkg{alphalph}.
+%
+% \bibitem{hyperref}
+% Sebastian Rahtz, Heiko Oberdiek:
+% \textit{The \xpackage{hyperref} package};
+% 2006/06/01 v6.75a;
+% \CTANpkg{hyperref}.
+%
+% \end{thebibliography}
+%
+% \begin{History}
+% \begin{Version}{2006/06/01 v1.0}
+% \item
+% First version.
+% \end{Version}
+% \begin{Version}{2006/06/01 v2.0}
+% \item
+% New method for referencing destinations by number; an idea
+% proposed by Lars Hellstr\"om in the mailing list LATEX-L.
+% \item
+% Options \xoption{name} and \xoption{num} added.
+% \end{Version}
+% \begin{Version}{2007/11/11 v2.1}
+% \item
+% Use of package \xpackage{pdftexcmds} for \LuaTeX\ support.
+% \end{Version}
+% \begin{Version}{2008/08/08 v2.2}
+% \item
+% Support for package \xpackage{bookmark} added.
+% \end{Version}
+% \begin{Version}{2011/05/13 v2.3}
+% \item
+% Fix for \cs{Hy@DestName} if the destination name contains
+% special characters.
+% \item
+% Fix for option \xoption{name} and package \xpackage{bookmark}.
+% \end{Version}
+% \begin{Version}{2016/05/16 v2.4}
+% \item
+% Documentation updates.
+% \end{Version}
+% \begin{Version}{2016/05/21 v2.5}
+% \item
+% LuaTeX compatibility
+% \end{Version}
+% \begin{Version}{2019/12/29 v2.6}
+% \item
+% use \xpackage{iftex} package.
+% \end{Version}
+% \begin{Version}{2020-09-02 v2.7}
+% \item Adapted to the new hook management of LaTeX (github issue 1)
+% \end{Version}
+% \end{History}
+%
+% \PrintIndex
+%
+% \Finale
+\endinput
diff --git a/macros/latex/contrib/hypdestopt/hypdestopt.pdf b/macros/latex/contrib/hypdestopt/hypdestopt.pdf
new file mode 100644
index 0000000000..1835545dc8
--- /dev/null
+++ b/macros/latex/contrib/hypdestopt/hypdestopt.pdf
Binary files differ