summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/zref
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2019-11-30 22:16:13 +0000
committerKarl Berry <karl@freefriends.org>2019-11-30 22:16:13 +0000
commit3820b8f6b5f78e1d878a74dfb643539cfc047855 (patch)
treeef2293c0bfb6b57361e7c29d6b9c818aee66eab9 /Master/texmf-dist/source/latex/zref
parent056882cabf31fe024953a0cd404e81529bf4af2d (diff)
zref (30nov19)
git-svn-id: svn://tug.org/texlive/trunk@52980 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/zref')
-rw-r--r--Master/texmf-dist/source/latex/zref/zref.dtx6873
1 files changed, 6873 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/zref/zref.dtx b/Master/texmf-dist/source/latex/zref/zref.dtx
new file mode 100644
index 00000000000..c1c76e7210f
--- /dev/null
+++ b/Master/texmf-dist/source/latex/zref/zref.dtx
@@ -0,0 +1,6873 @@
+% \iffalse meta-comment
+%
+% File: zref.dtx
+% Version: 2019/11/29 v2.28
+% Info: A new reference scheme for LaTeX
+%
+% Copyright (C)
+% 2006-2012 Heiko Oberdiek
+% 2016-2019 Oberdiek Package Support Group
+% https://github.com/ho-tex/zref/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/zref/issues
+%
+% This work consists of the main source file zref.dtx
+% and the derived files
+% zref.sty, zref.pdf, zref.ins, zref.drv, zref-base.sty,
+% zref-abspage.sty, zref-abspos.sty, zref-counter.sty,
+% zref-dotfill.sty, zref-env.sty, zref-hyperref.sty,
+% zref-lastpage.sty, zref-marks.sty, zref-nextpage.sty,
+% zref-pageattr.sty, zref-pagelayout.sty, zref-perpage.sty,
+% zref-runs.sty, zref-savepos.sty, zref-thepage.sty,
+% zref-titleref.sty, zref-totpages.sty, zref-user.sty,
+% zref-xr.sty, zref-example.tex, zref-example-lastpage.tex,
+% zref-example-nextpage.tex, zref-test1.tex,
+% zref-test-base.tex, zref-test-runs.tex,
+% zref-test-titleref-memoir.tex.
+%
+% Distribution:
+% CTAN:macros/latex/contrib/zref/zref.dtx
+% CTAN:macros/latex/contrib/zref/zref.pdf
+%
+% Unpacking:
+% (a) If zref.ins is present:
+% tex zref.ins
+% (b) Without zref.ins:
+% tex zref.dtx
+% (c) If you insist on using LaTeX
+% latex \let\install=y\input{zref.dtx}
+% (quote the arguments according to the demands of your shell)
+%
+% Documentation:
+% (a) If zref.drv is present:
+% latex zref.drv
+% (b) Without zref.drv:
+% latex zref.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 zref.dtx
+% makeindex -s gind.ist zref.idx
+% pdflatex zref.dtx
+% makeindex -s gind.ist zref.idx
+% pdflatex zref.dtx
+%
+% Installation:
+% TDS:tex/latex/zref/zref.sty
+% TDS:tex/latex/zref/zref-base.sty
+% TDS:tex/latex/zref/zref-abspage.sty
+% TDS:tex/latex/zref/zref-abspos.sty
+% TDS:tex/latex/zref/zref-counter.sty
+% TDS:tex/latex/zref/zref-dotfill.sty
+% TDS:tex/latex/zref/zref-env.sty
+% TDS:tex/latex/zref/zref-hyperref.sty
+% TDS:tex/latex/zref/zref-lastpage.sty
+% TDS:tex/latex/zref/zref-marks.sty
+% TDS:tex/latex/zref/zref-nextpage.sty
+% TDS:tex/latex/zref/zref-pageattr.sty
+% TDS:tex/latex/zref/zref-pagelayout.sty
+% TDS:tex/latex/zref/zref-perpage.sty
+% TDS:tex/latex/zref/zref-runs.sty
+% TDS:tex/latex/zref/zref-savepos.sty
+% TDS:tex/latex/zref/zref-thepage.sty
+% TDS:tex/latex/zref/zref-titleref.sty
+% TDS:tex/latex/zref/zref-totpages.sty
+% TDS:tex/latex/zref/zref-user.sty
+% TDS:tex/latex/zref/zref-xr.sty
+% TDS:doc/latex/zref/zref.pdf
+% TDS:doc/latex/zref/zref-example.tex
+% TDS:doc/latex/zref/zref-example-lastpage.tex
+% TDS:doc/latex/zref/zref-example-nextpage.tex
+% TDS:doc/latex/zref/test/zref-test1.tex
+% TDS:doc/latex/zref/test/zref-test-base.tex
+% TDS:doc/latex/zref/test/zref-test-runs.tex
+% TDS:doc/latex/zref/test/zref-test-titleref-memoir.tex
+% TDS:source/latex/zref/zref.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: zref 2019/11/29 v2.28 A new reference scheme for LaTeX (HO)}
+\Msg{************************************************************************}
+
+\keepsilent
+\askforoverwritefalse
+
+\let\MetaPrefix\relax
+\preamble
+
+This is a generated file.
+
+Project: zref
+Version: 2019/11/29 v2.28
+
+Copyright (C)
+ 2006-2012 Heiko Oberdiek
+ 2016-2019 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/zref/issues
+
+
+This work consists of the main source file zref.dtx
+and the derived files
+ zref.sty, zref.pdf, zref.ins, zref.drv, zref-base.sty,
+ zref-abspage.sty, zref-abspos.sty, zref-counter.sty,
+ zref-dotfill.sty, zref-env.sty, zref-hyperref.sty,
+ zref-lastpage.sty, zref-marks.sty, zref-nextpage.sty,
+ zref-pageattr.sty, zref-pagelayout.sty, zref-perpage.sty,
+ zref-runs.sty, zref-savepos.sty, zref-thepage.sty,
+ zref-titleref.sty, zref-totpages.sty, zref-user.sty,
+ zref-xr.sty, zref-example.tex, zref-example-lastpage.tex,
+ zref-example-nextpage.tex, zref-test1.tex,
+ zref-test-base.tex, zref-test-runs.tex,
+ zref-test-titleref-memoir.tex.
+
+\endpreamble
+\let\MetaPrefix\DoubleperCent
+
+\generate{%
+ \file{zref.ins}{\from{zref.dtx}{install}}%
+ \file{zref.drv}{\from{zref.dtx}{driver}}%
+ \usedir{tex/latex/zref}%
+ \file{zref.sty}{\from{zref.dtx}{package}}%
+ \file{zref-base.sty}{\from{zref.dtx}{base}}%
+ \file{zref-abspage.sty}{\from{zref.dtx}{abspage}}%
+ \file{zref-abspos.sty}{\from{zref.dtx}{abspos}}%
+ \file{zref-counter.sty}{\from{zref.dtx}{counter}}%
+ \file{zref-dotfill.sty}{\from{zref.dtx}{dotfill}}%
+ \file{zref-env.sty}{\from{zref.dtx}{env}}%
+ \file{zref-hyperref.sty}{\from{zref.dtx}{hyperref}}%
+ \file{zref-lastpage.sty}{\from{zref.dtx}{lastpage}}%
+ \file{zref-marks.sty}{\from{zref.dtx}{marks}}%
+ \file{zref-nextpage.sty}{\from{zref.dtx}{nextpage}}%
+ \file{zref-pageattr.sty}{\from{zref.dtx}{pageattr}}%
+ \file{zref-pagelayout.sty}{\from{zref.dtx}{pagelayout}}%
+ \file{zref-perpage.sty}{\from{zref.dtx}{perpage}}%
+ \file{zref-runs.sty}{\from{zref.dtx}{runs}}%
+ \file{zref-savepos.sty}{\from{zref.dtx}{savepos}}%
+ \file{zref-thepage.sty}{\from{zref.dtx}{thepage}}%
+ \file{zref-titleref.sty}{\from{zref.dtx}{titleref}}%
+ \file{zref-totpages.sty}{\from{zref.dtx}{totpages}}%
+ \file{zref-user.sty}{\from{zref.dtx}{user}}%
+ \file{zref-xr.sty}{\from{zref.dtx}{xr}}%
+ \usedir{doc/latex/zref}%
+ \file{zref-example.tex}{\from{zref.dtx}{example}}%
+ \file{zref-example-lastpage.tex}{\from{zref.dtx}{example-lastpage}}%
+ \file{zref-example-nextpage.tex}{\from{zref.dtx}{example-nextpage}}%
+% \usedir{doc/latex/zref/test}%
+% \file{zref-test1.tex}{\from{zref.dtx}{test1}}%
+% \file{zref-test-base.tex}{\from{zref.dtx}{test-base}}%
+% \file{zref-test-runs.tex}{\from{zref.dtx}{test-runs}}%
+% \file{zref-test-titleref-memoir.tex}{\from{zref.dtx}{test-titleref-memoir}}%
+ \nopreamble
+ \nopostamble
+% \usedir{source/latex/zref/catalogue}%
+% \file{zref.xml}{\from{zref.dtx}{catalogue}}%
+}
+
+\catcode32=13\relax% active space
+\let =\space%
+\Msg{************************************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* files into a directory searched by TeX:}
+\Msg{*}
+\Msg{* zref.sty, zref-base.sty, zref-abspage.sty, zref-abspos.sty,}
+\Msg{* zref-counter.sty, zref-dotfill.sty, zref-env.sty,}
+\Msg{* zref-hyperref.sty, zref-lastpage.sty, zref-marks.sty,}
+\Msg{* zref-nextpage.sty, zref-pageattr.sty, zref-pagelayout.sty,}
+\Msg{* zref-perpage.sty, zref-runs.sty, zref-savepos.sty,}
+\Msg{* zref-thepage.sty, zref-titleref.sty, zref-totpages.sty,}
+\Msg{* zref-user.sty, zref-xr.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file `zref.drv'}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*}
+\Msg{************************************************************************}
+
+\endbatchfile
+%</install>
+%<*ignore>
+\fi
+%</ignore>
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{zref.drv}%
+ [2019/11/29 v2.28 A new reference scheme for LaTeX (HO)]%
+\documentclass{ltxdoc}
+\usepackage{holtxdoc}[2011/11/22]
+\setlength{\emergencystretch}{1em}
+\begin{document}
+ \DocInput{zref.dtx}%
+\end{document}
+%</driver>
+% \fi
+%
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+% \GetFileInfo{zref.drv}
+%
+% \title{The \xpackage{zref} package}
+% \date{2019/11/29 v2.28}
+% \author{Heiko Oberdiek\thanks
+% {Please report any issues at \url{https://github.com/ho-tex/zref/issues}}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% Package \xpackage{zref} tries to get rid of the restriction
+% in \hologo{LaTeX}'s reference system that only two properties are
+% supported. The package implements an extensible referencing
+% system, where properties are handled in a more flexible way.
+% It offers an interface for macro programmers for the access
+% to the system and some applications that uses the new
+% reference scheme.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \newcommand*{\metacs}[1]{\texttt{\itshape #1}}
+%
+% \newcommand{\markexp}{^^A
+% \textsuperscript{exp}^^A
+% \space
+% }
+% \newcommand{\markexptwo}{^^A
+% \textsuperscript{exp2}^^A
+% \space
+% }
+% \newcommand{\markrobust}{^^A
+% \textsuperscript{robust}^^A
+% \space
+% }
+% \newcommand{\marknowarn}{^^A
+% \textsuperscript{nowarn}^^A
+% \space
+% }
+% \newcommand{\markbabel}{^^A
+% \textsuperscript{babel}^^A
+% \space
+% }
+%
+% \section{Introduction}
+%
+% Standard \hologo{LaTeX}'s reference system with \cs{label}, \cs{ref},
+% and \cs{pageref} supports two properties, the apperance of
+% the counter that is last incremented by \cs{refstepcounter} and
+% the page with the \cs{label} command.
+%
+% Unhappily \hologo{LaTeX} does not provide an interface for adding
+% another properties. Packages such as \xpackage{hyperref},
+% \xpackage{nameref}, or \xpackage{titleref} are forced to
+% use ugly hacks to extend the reference system.
+% These ugly hacks are one of the causes for \xpackage{hyperref}'s
+% difficulty regarding compatibility with other packages.
+%
+% \subsection{Standard \hologo{LaTeX} behaviour}
+%
+% References are created by the \cs{label} command:
+% \begin{quote}
+% |\chapter{Second chapter}|\\
+% |\section{First section on page 7} % section 2.1|\\
+% |\label{myref}|
+% \end{quote}
+% Now \hologo{LaTeX} records the section number |2.1| and the page |7|
+% in the reference. Internally the reference is a list with
+% two entries:
+% \begin{quote}
+% |\r@myref| $\rightarrow$ |{2.1}{7}|
+% \end{quote}
+% The length of the list if fixed in the \hologo{LaTeX} kernel,
+% An interface for adding new properties is missing.
+%
+% There are several tries to add new properties:
+% \begin{description}
+% \item[\xpackage{hyperref}] uses a list of five
+% properties instead of the standard list with two entries.
+% This causes many compatibility problems with \hologo{LaTeX} and
+% other packages.
+% \item[\xpackage{titleref}] stores its title data into the
+% first entry in the list. \hologo{LaTeX} is happy because it
+% does only see its list with two entries. The situation
+% becomes more difficult, if more properties are added
+% this way. Then the macros form a nested structure
+% inside the first reference argument for the label.
+% Expandable extractions will then become painful.
+% \end{description}
+%
+% \subsection{Basic idea}
+%
+% Some time ago Morten H\o gholm sent me an experimental
+% cross referencing mechanism as ``expl3'' code. His
+% idea is:
+% \begin{quote}
+% |\g_xref_mylabel_plist| $\rightarrow$\\
+% \mbox{}\qquad|\xref_dance_key{salsa}\xref_name_key{Morten}|\dots
+% \end{quote}
+% The entries have the following format:
+% \begin{quote}
+% |\xref_|\meta{your key}|_key{|\meta{some text}|}|
+% \end{quote}
+% This approach is much more flexible:
+% \begin{itemize}
+% \item New properties can easily be added, just use a new key.
+% \item The length of the list is not fixed. A reference
+% can use a subset of the keys.
+% \item The order of the entries does not matter.
+% \end{itemize}
+% Unhappily I am not familiar with the experimental code
+% for \hologo{LaTeX3} that will need some time before its first release.
+% Thus I have implemented it as \hologo{LaTeXe} package without disturbing
+% the existing \hologo{LaTeX} reference system.
+%
+% \subsection{Interfaces}
+%
+% The package provides a generic \emph{interface for programmers}.
+% Commands of this interface are prefixed by \cs{zref@}.
+%
+% Option \xoption{user} enabels the \emph{user interface}.
+% Here the commands are prefixed by \cs{z} to avoid name
+% clashes with existing macros.
+%
+% Then the packages provides some \emph{modules}. They
+% are applications for the reference system and can also be
+% considered as examples how to use the reference system.
+%
+% The modules can be loaded as packages. The package
+% name is prefixed with |zref-|, for example:
+%\begin{quote}
+%\begin{verbatim}
+%\RequirePackage{zref-abspage}
+%\end{verbatim}
+%\end{quote}
+% This is the preferred way if the package is loaded from
+% within other packages to avoid option clashes.
+%
+% As alternative package |zref| can be used and the modules
+% are given as options:
+%\begin{quote}
+%\begin{verbatim}
+%\usepackage[perpage,user]{zref}
+%\end{verbatim}
+%\end{quote}
+%
+% \section{Interface for programmers}
+%
+% The user interface is described in the next section \ref{sec:user}.
+%
+% \subsection{Entities}
+%
+% \paragraph{Reference.}
+% Internally a reference is a list of key value pairs:
+% \begin{quote}
+% |\Z@R@myref| $\rightarrow$
+% |\default{2.1}\page{7}|
+% \end{quote}
+% The generic format of a entry is:
+% \begin{quote}
+% |\Z@R@|\meta{refname} $\rightarrow$
+% |\|\meta{propname}|{|\meta{value}|}|
+% \end{quote}
+% \meta{refname} is the name that denoted references
+% (the name used in \cs{label} and \cs{ref}). \meta{propname}
+% is the name of the property or key. The property key macro
+% is never executed, it is used in parameter text matching only.
+%
+% \paragraph{Property.}
+% Because the name of a property is used in a macro name
+% that must survive the \xfile{.aux} file, the name is
+% restricted to letters and `@'.
+%
+% \paragraph{Property list.}
+% Often references are used for special purposes. Thus it
+% saves memory if just the properties are used in this
+% reference that are necessary for its purpose.
+%
+% Therefore this package uses the concept of \emph{property lists}.
+% A property list is a set of properties. The set of properties
+% that is used by the default \cs{label} command is the
+% \emph{main property list}.
+%
+% \subsection{Property list}
+%
+% \markexp means that the implementation of the
+% marked macro is expandable. \markexptwo goes a step further
+% and marks the macro expandable in exact two expansion steps.
+%
+% \begin{declcs}{zref@newlist}
+% \M{listname}
+% \end{declcs}
+% Declares a new empty property list.
+%
+% \begin{declcs}{zref@addprop}
+% \M{listname} \M{propname}\\
+% \cs{zref@localaddprop} \M{listname} \M{propname}
+% \end{declcs}
+% Adds the property \meta{propname}
+% to the property list \meta{listname}.
+% The property and list must exist.
+% The addition is global by \cs{zref@addprop} and limited to
+% local scope by \cs{zref@localaddprop}.
+% Between 2010/04/19 v2.13 and 2010/10/22 v2.19 a comma separated list
+% of properties could be used as argument \meta{propname}.
+% Since 2010/10/22 v2.19 the addition of several properties
+% at once is supported by \cs{zref@addprops}.
+%
+% \begin{declcs}{zref@addprops}
+% \M{listname} \M{propname list}\\
+% \cs{zref@localaddprops} \M{listname} \M{propname list}
+% \end{declcs}
+% These macros add a comma separated list of properties
+% \meta{propname list} to list \meta{listname}.
+% \cs{zref@addprops} works globally and \cs{zref@localaddprops}
+% locally. Since 2010/10/22 v2.19.
+%
+% \begin{declcs}{zref@listexists}
+% \M{listname} \M{then}
+% \end{declcs}
+% Executes \meta{then} if the property list \meta{listname} exists
+% or raise an error otherwise.
+%
+% \begin{declcs}{zref@iflistundefined}\markexp \M{listname}
+% \M{then} \M{else}
+% \end{declcs}
+% Executes \meta{then} if the list exists or \meta{else}
+% otherwise.
+%
+% \begin{declcs}{zref@iflistcontainsprop}
+% \M{listname} \M{propname} \M{then} \M{else}
+% \end{declcs}
+% Executes \meta{then} if the property \meta{propname} is part
+% of property list \meta{listname} or otherwise it
+% runs the \meta{else} part.
+%
+% \subsection{Property}
+%
+% \begin{declcs}{zref@newprop}
+% \* \M{propname} |[|\meta{default}|]| \M{value}
+% \end{declcs}
+% This command declares and configures a new property with
+% name \meta{propname}.
+%
+% In case of unknown references
+% or the property does not exist in the reference, the
+% \meta{default} is used as value. If it is not specified
+% here, a global default is used, see \cs{zref@setdefault}.
+%
+% The correct values of some properties are not known
+% immediately but at page shipout time. Prominent example
+% is the page number. These properties are declared with
+% the star form of the command.
+%
+% \begin{declcs}{zref@setcurrent}
+% \M{propname} \M{value}
+% \end{declcs}
+% This sets the current value of the property \meta{propname}.
+% It is a generalization of setting \hologo{LaTeX}'s \cs{currentlabel}.
+%
+% \begin{declcs}{zref@getcurrent}\markexptwo
+% \M{propname}
+% \end{declcs}
+% This returns the current value of the property \meta{propname}.
+% The value may not be correct, especially if the property
+% is bound to a page (start form of \cs{zref@newprop}) and the
+% right value is only known at shipout time (e.g. property `page').
+% In case of errors (e.g. unknown property) the empty string is
+% returned.
+%
+% Since version 2010/04/22 v2.14 \cs{zref@getcurrent} supports
+% \cs{zref@wrapper@unexpanded}.
+%
+% \begin{declcs}{zref@propexists}
+% \M{propname} \M{then}
+% \end{declcs}
+% Calls \meta{then} if the property \meta{propname} is available
+% or generates an error message otherwise.
+%
+% \begin{declcs}{zref@ifpropundefined}\markexp
+% \M{propname} \M{then} \M{else}
+% \end{declcs}
+% Calls \meta{then} or \meta{else} depending on the existence
+% of property \meta{propname}.
+%
+% \subsection{Reference generation}
+%
+% \begin{declcs}{zref@label}
+% \M{refname}
+% \end{declcs}
+% This works similar to \cs{label}. The reference \meta{refname} is
+% created and put into the \xfile{.aux} file with the
+% properties of the main property list.
+%
+% \begin{declcs}{zref@labelbylist}
+% \M{refname} \M{listname}
+% \end{declcs}
+% Same as \cs{zref@label} except that the properties are
+% taken from the specified property list \meta{listname}.
+%
+% \begin{declcs}{zref@labelbyprops}
+% \M{refname} |{|\meta{propnameA}|,|\meta{propnameB}|,|\dots|}|
+% \end{declcs}
+% Same as \cs{zref@label} except that these properties
+% are used that are given as comma separated list in the
+% second argument.
+%
+% \begin{declcs}{zref@newlabel}
+% \M{refname} |{|\dots|}|
+% \end{declcs}
+% This is the macro that is used in the \xfile{.aux} file.
+% It is basically the same as \cs{newlabel} apart from
+% the format of the data in the second argument.
+%
+% \subsection{Data extraction}
+%
+% \begin{declcs}{zref@extractdefault}\markexptwo
+% \M{refname} \M{propname} \M{default}
+% \end{declcs}
+% This is the basic command that refernces the value of a
+% property \meta{propname} for the reference \meta{refname}.
+% In case of errors such as undefined reference the \meta{default}
+% is used instead.
+%
+% \begin{declcs}{zref@extract}\markexptwo
+% \M{refname} \M{propname}
+% \end{declcs}
+% The command is an abbreviation for \cs{zref@extractdefault}.
+% As default the default of the property is taken, otherwise
+% the global default.
+%
+% Example for page references:
+% \begin{quote}
+% \begin{tabular}{@{}ll}
+% \hologo{LaTeX}:& |\pageref{foobar}|\\
+% \xpackage{zref}:& |\zref@extract{foobar}{page}|
+% \end{tabular}
+% \end{quote}
+% Both \cs{zref@extract} and \cs{zref@extractdefault} are
+% expandable. That means, these macros can directly
+% be used in expandable calculations, see the example file.
+% On the other side, babel's shorthands are not supported,
+% there are no warnings in case of undefined references.
+%
+% If an user interface doesn't need expandable macros
+% then it can use \cs{zref@refused} and \cs{zref@wrapper@babel}
+% for its user macros.
+%
+% \begin{declcs}{zref@refused}
+% \M{refname}
+% \end{declcs}
+% This command is not expandable. It causes the warnings if
+% the reference \meta{refname} is not defined. Use the
+% \cs{zref@extract} commands inside expandable contexts and
+% mark their use outside by \cs{zref@refused}, see the example
+% file.
+%
+% \begin{declcs}{zref@def@extract}%
+% \M{cmd} \M{refname} \M{propname}\\
+% \cs{zref@def@extractdefault}
+% \M{cmd} \M{refname} \M{propname} \M{default}
+% \end{declcs}
+% Both macros extract the property \meta{propname} from the reference
+% \meta{refname} the same way as macros \cs{zref@extract} and
+% \cs{zref@extractdefault}. The result is stored in macro \meta{cmd}.
+% Also \cs{zref@refused} is called to notify \hologo{LaTeX} that
+% the reference \meta{refname} is used. Added in 2011/10/04 v2.22.
+%
+% \begin{declcs}{zref@ifrefundefined}\markexp
+% \M{refname} \M{then} \M{else}
+% \end{declcs}
+% Macro \cs{zref@ifrefundefined} calls arguments \meta{then} or \meta{else}
+% dependent on the existence of the reference \meta{refname}.
+%
+% \begin{declcs}{zifrefundefined}
+% \M{refname} \M{then} \M{else}
+% \end{declcs}
+% Macro \cs{zifrefundefined} calls \cs{ref@refused} before
+% executing \cs{zref@ifrefundefined}. Babel shorthands are
+% supported in \meta{refname}.
+%
+% \begin{declcs}{zref@ifrefcontainsprop}\markexp
+% \M{refname} \M{propname} \M{then} \M{else}
+% \end{declcs}
+% Test whether a reference provides a property.
+%
+% \subsection{Setup}
+%
+% \begin{declcs}{zref@default}
+% \end{declcs}
+% Holds the global default for unknown values.
+%
+% \begin{declcs}{zref@setdefault}
+% |{|\meta{value}|}|
+% \end{declcs}
+% Sets the global default for unknown values.
+% The global default is used, if a property does not specify
+% an own default and the value for a property
+% cannot be extracted. This can happen if the reference is
+% unknown or the reference does not have the property.
+%
+% \begin{declcs}{zref@setmainlist}
+% |{|\meta{value}|}|
+% \end{declcs}
+% Sets the name of the main property list. The package
+% sets and uses |main|.
+%
+% \subsection{Declared properties}
+%
+% \begin{quote}
+% \renewcommand*{\arraystretch}{1.05}
+% \setlength{\tabcolsep}{2\tabcolsep}
+% \def\VV{\vphantom{\large \"Ag}}
+% \def\EMPTY{{\itshape\textless empty\textgreater}}
+% \def\pl#1{&#1&thepage&\cs{number}\cs{#1}}
+% \begin{tabular}{@{}>{\sffamily}l|>{\ttfamily}l|>{\ttfamily}l|>{\ttfamily}l@{}}
+% \rmfamily Module&
+% \rmfamily Property&
+% \rmfamily Property list&
+% \rmfamily Default\\
+% \hline
+% (base)
+% & default & main & \EMPTY\\
+% & page & main & \EMPTY\\
+% \hline
+% abspage
+% & abspage & main & 0\\
+% \hline
+% counter
+% & counter & main & \EMPTY\\
+% \hline
+% hyperref
+% & anchor & main & \EMPTY\\
+% & url & & \EMPTY\\
+% \hline
+% pageattr
+% & pdfpageattr & thepage & \dots\\
+% & pdfpagesattr & LastPage & \dots\\
+% \hline
+% pagelayout\footnotemark
+% \pl{mag}\\
+% \pl{paperwidth}\\
+% \pl{paperheight}\\
+% \pl{stockwidth}\\
+% \pl{stockheight}\\
+% \pl{pdfpageheight}\\
+% \pl{pdfpagewidth}\\
+% \pl{pdfhorigin}\\
+% \pl{pdfvorigin}\\
+% \pl{hoffset}\\
+% \pl{voffset}\\
+% \pl{topmargin}\\
+% \pl{oddsidemargin}\\
+% \pl{evensidemargin}\\
+% \pl{textwidth}\\
+% \pl{textheight}\\
+% \pl{headheight}\\
+% \pl{headsep}\\
+% \pl{footskip}\\
+% \pl{marginparwidth}\\
+% \pl{marginparsep}\\
+% \pl{columnwidth}\\
+% \pl{columnsep}\\
+% \hline
+% perpage
+% & pagevalue & perpage & 0\\
+% & page & perpage & \EMPTY\\
+% & abspage & perpage & 0\\
+% \hline
+% savepos
+% & posx & savepos & 0\\
+% & posy & savepos & 0\\
+% \hline
+% titleref
+% & title & main & \EMPTY\\
+% \hline
+% xr
+% & anchor & & \EMPTY\\
+% & externaldocument & & \EMPTY\\
+% & theotype & & \EMPTY\\
+% & title & & \EMPTY\\
+% & url & & \EMPTY\\
+% \end{tabular}
+% \footnotetext{Module \xmodule{pagelayout} only defines properties
+% if the parameter exists.}%
+% \end{quote}
+%
+% \subsection{Wrapper for advanced situations}
+%
+% \begin{declcs}{zref@wrapper@babel}
+% |{|\dots|}| \M{name}
+% \end{declcs}
+% This macro helps to add shorthand support. The second
+% argument is protected, then the code of the first argument
+% is called with the protected name appended. Examples
+% are in the sources.
+%
+% \begin{declcs}{zref@wrapper@immediate}
+% |{|\dots|}|
+% \end{declcs}
+% There are situations where a label must be written instantly
+% to the \xfile{.aux} file, for example after the last page.
+% If the \cs{zlabel} or \cs{label} command is put inside this wrapper,
+% immediate writing is enabled. See the implementation for
+% module \xmodule{lastpage} for an example of its use.
+%
+% \begin{declcs}{zref@wrapper@unexpanded}
+% |{|\dots|}|
+% \end{declcs}
+% Assuming someone wants to extract a value for property |bar|
+% and store the result in a macro |\foo| without traces of
+% the expanding macros and without expanding the value.
+% This (theoretical?) problem can be solved by this wrapper:
+% \begin{quote}
+%\begin{verbatim}
+%\zref@wrapper@unexpanded{%
+% \edef\foo{%
+% \zref@extract{someref}{bar}%
+% }%
+%}
+%\end{verbatim}
+% \end{quote}
+% The \cs{edef} forces the expansion of \cs{zref@extract},
+% but the extraction of the value is prevented by
+% the wrapper that uses \hologo{eTeX}'\ \cs{unexpanded} for this
+% purpose. Supported macros are \cs{zref@extract}, \cs{zref@extractdefault}
+% and since version 2010/04/22 v2.14 macro \cs{zref@getcurrent}.
+%
+% \subsection{Counter for unique names}
+%
+% Some modules (\xmodule{titleref} and \xmodule{dotfillmin})
+% need unique names for automatically generated label names.
+%
+% \begin{declcs}{zref@require@unique}
+% \end{declcs}
+% This command creates the unique counter |zref@unique| if the
+% counter does not already exist.
+%
+% \begin{declcs}{thezref@unique}
+% \end{declcs}
+% This command is used to generate unique label names.
+%
+% \section{User interface}\label{sec:user}
+%
+% \subsection{Module \xmodule{user}}
+%
+% The user interface for this package and its modules
+% is enabled by \xpackage{zref}'s package option \xmodule{user}
+% or package \xpackage{zref-user}.
+% The names of user commands are prefixed by |z| in order
+% to avoid name clashes with existing macros of the same
+% functionality. Thus the package does not disturb the
+% traditional reference scheme, both can be used together.
+%
+% The syntax descriptions contain the following markers
+% that are intended as hints for programmers:
+% \begin{quote}
+% \begin{tabular}{@{}ll@{}}
+% \markbabel\unskip & Babel shorthands are allowed.\\
+% \markrobust\unskip & Robust macro.\\
+% \markexp\unskip & Expandable version:\\
+% & \textbullet\ robust,
+% unless the extracted values are fragile,\\
+% & \textbullet\ no babel shorthand suport.\\
+% \markexptwo\unskip & Expandable like \markexp and:\\
+% & \textbullet\ expandable in exact two steps.\\
+% \end{tabular}
+% \end{quote}
+%
+% The basic user interface of the package without modules
+% are commands that mimic the standard \hologo{LaTeX} behaviour
+% of \cs{label}, \cs{ref}, and \cs{pageref}:
+%
+% \begin{declcs}{zlabel}
+% \M{refname}\markbabel
+% \end{declcs}
+% Similar to \cs{label}. It generates a label with name
+% \meta{refname} in the new reference scheme.
+%
+% \begin{declcs}{zref}
+% |[|\meta{propname}|]| \M{refname}\markbabel
+% \end{declcs}
+% Without optional argument similar to \cs{ref}, it returns
+% the default reference property. This property is named
+% |default|:
+% \[
+% |\zref{|x|}| \equiv |\zref[default]{|x|}|
+% \]
+%
+% \begin{declcs}{zpageref}
+% \M{refname}\markbabel
+% \end{declcs}
+% Convenience macro, similar to \cs{pageref}.
+% \[
+% |\zpageref{|x|}| \equiv |\zref[page]{|x|}|
+% \]
+%
+% \begin{declcs}{zrefused}
+% \M{refname}\markbabel
+% \end{declcs}
+% Some of the user commands in the modules are expandable.
+% The use of such commands do not cause any undefined
+% reference warnings, because inside of expandable
+% contexts this is not possible. However, if there is
+% a place outside of expandable contexts, \cs{refused}
+% is strongly recommended. The reference \meta{refname}
+% is marked as used, undefined ones will generate
+% warnings.
+%
+% \subsection{Module \xmodule{abspage}}
+%
+% With the help of package \xpackage{atbegshi}
+% a new counter |abspage| with absolute page numbers is provided.
+% Also a new property |abspage| is defined and added to the
+% main property list. Thus you can reference the absolute
+% page number:
+% \begin{quote}
+% |Section \zref{foo} is on page \zpageref{foo}.|\\
+% |This is page \zref[abspage]{foo}|\\
+% |of \zref[abspage]{LastPage}.|
+% \end{quote}
+% The example also makes use of module \xmodule{lastpage}.
+%
+% \subsection{Module \xmodule{lastpage}}
+%
+% Provides the functionality of package \xpackage{lastpage}
+% \cite{lastpage} in the new reference scheme.
+% The label |LastPage| is put at the end of the document.
+% You can refer the last page number with:
+% \begin{quote}
+% |\zref@extract{LastPage}{page}| (+ |\zref@refused{LastPage}|)\\
+% \end{quote}
+% or
+% \begin{quote}
+% |\zpageref{LastPage}| (module \xmodule{user})
+% \end{quote}
+%
+% Since version 2008/10/01 v2.3 the module defines the list |LastPage|.
+% In addition to the properties of the main list label |LastPage| also
+% stores the properties of this list |LastPage|. The default of this
+% list is empty. The list can be used by the user to add additional
+% properties for label |LastPage|.
+%
+% \subsubsection{Tests for last page}
+%
+% Since version 2010/03/26 v2.8 the macros \cs{zref@iflastpage}
+% and \cs{ziflastpage} were added. They test the reference,
+% whether it is a reference of the last page.
+%
+% \begin{declcs}{zref@iflastpage}\markexp \M{refname} \M{then} \M{else}
+% \end{declcs}
+% Macro \cs{zref@iflastpage} compares the references \meta{refname}
+% with \meta{LastPage}. Basis of the comparison is the value of
+% property |abspage|, because the values are different for different
+% pages. This is not ensured by property |page|. Therefore module
+% \xmodule{abspage} is loaded by module \xmodule{lastpage}.
+% If both values of property |abspage| are present and match,
+% then \meta{then} is executed, otherwise code \meta{else} is called.
+% If one or both references are undefined or lack the property |abspage|,
+% then \meta{else} is executed.
+%
+% Macro \cs{zref@iflastpage} is expandable, therefore \cs{zref@refused}
+% should be called on \meta{refname} and \meta{LastPage}.
+%
+% \begin{declcs}{ziflastpage} \M{refname} \M{then} \M{else}
+% \end{declcs}
+% Macro \cs{ziflastpage} has the same function as \cs{zref@iflastpage},
+% but adds support for babel shorthands in \meta{refname} and
+% calls \cs{zref@refused}. However macro \cs{ziflastpage} is not
+% expandable.
+%
+% \subsubsection{Example}
+%
+% \begin{macrocode}
+%<*example-lastpage>
+%<<END_EXAMPLE
+\NeedsTeXFormat{LaTeX2e}
+\documentclass{report}
+
+\newcounter{foo}
+\renewcommand*{\thefoo}{\Alph{foo}}
+
+\usepackage{zref-lastpage,zref-user}[2019/11/29]
+
+\makeatletter
+\zref@newprop{thefoo}{\thefoo}
+\zref@newprop{valuefoo}{\the\value{foo}}
+\zref@newprop{chapter}{\thechapter}
+\zref@addprops{LastPage}{thefoo,valuefoo,chapter}
+\makeatother
+
+\newcommand*{\foo}{%
+ \stepcounter{foo}%
+ [Current foo: \thefoo]%
+}
+
+\begin{document}
+ \chapter{First chapter}
+ Last page is \zref{LastPage}.\\
+ Last chapter is \zref[chapter]{LastPage}.\\
+ Last foo is \zref[thefoo]{LastPage}.\\
+ Last value of foo is \zref[valuefoo]{LastPage}.\\
+ \foo
+ \chapter{Second chapter}
+ \foo\foo\foo
+ \chapter{Last chapter}
+ \foo
+\end{document}
+%END_EXAMPLE
+%</example-lastpage>
+% \end{macrocode}
+%
+% \subsection{Module \xmodule{thepage}}
+%
+% This module \xmodule{thepage} loads module \xmodule{abspage},
+% constructs a reference name using the absolute page number
+% and remembers property |page|. Other properties can be added
+% by adding them to the property list |thepage|.
+%
+% \begin{declcs}{zthepage} \M{absolute page number}\\
+% \end{declcs}
+% Macro \cs{zthepage} is basically a \cs{zpageref}. The reference
+% name is yield by the \meta{absolute page number}. If the reference
+% is not defined, then the default for property |page| is used.
+%
+% \begin{declcs}{zref@thepage@name}\markexp \M{absolute page number}
+% \end{declcs}
+% Macro \cs{zref@thepage@name} returns the internal reference
+% name that is constructed using the \meta{absolute page number}.
+% The internal reference name should not be used directly, because
+% it might change in future versions.
+%
+% \begin{declcs}{zref@thepage}\markexp \M{absolute page number}\\
+% \cs{zref@thepage@refused} \M{absolute page number}
+% \end{declcs}
+% Macro \cs{zref@thepage} returns the page number (\cs{thepage})
+% of \meta{absolute page number}. Because this macro is expandable,
+% \cs{zref@thepage@refused} is used outside an expandable context
+% to mark the reference as used.
+%
+%
+% \subsection{Module \xmodule{nextpage}}
+%
+% \begin{declcs}{znextpage}
+% \end{declcs}
+% Macro \cs{znextpage} prints \cs{thepage} of the following page.
+% It gets the current absolute page number by using a label.
+% There are three cases for the next page:
+% \begin{enumerate}
+% \item The next page is not known yet because of undefined references.
+% Then \cs{zunknownnextpagename} is used instead. The default for
+% this macro is the default of property |page|.
+% \item This page is the last page. Then \cs{znonextpagename}
+% is used. Its default is empty.
+% \item The next page is known, then \cs{thepage} of the next
+% page is used (the value of property |page| of the next page).
+% \end{enumerate}
+%
+% \subsubsection{Configuration}
+%
+% The behaviour can be configured by the following macros.
+%
+% \begin{declcs}{zunknownnextpagename}\\
+% \cs{znonextpagename}
+% \end{declcs}
+% If the next page is not known or available, then
+% \cs{znextpage} uses these name macros as default.
+% \cs{zunknownnextpagename} is used in case of undefined
+% references. Default is the value of property |page| of the
+% next page (\cs{thepage}). Module \xmodule{thepage} is used.
+%
+% Macro \cs{znonextpagename} is used, if the next page does
+% not exists. That means that the current page is last page.
+% The default is empty.
+%
+% \begin{declcs}{znextpagesetup} \M{unknown} \M{no next}
+% \M{next}
+% \end{declcs}
+% Acording to the case (see \cs{znextpage}) macro \cs{znextpage}
+% calls an internal macro with an argument. The argument is
+% either \cs{thepage} of the next page or one of \cs{zunknownnextpagename}
+% or \cs{znonextpagename}. These internal macro can be changed by
+% \cs{znextpagesetup}. It expects the definition texts for these
+% three cases of a macro with one argument.
+% The default is
+% \begin{quote}
+% |\znextpagesetup{#1}{#1}{#1}|
+% \end{quote}
+%
+% \subsubsection{Example}
+%
+% \begin{macrocode}
+%<*example-nextpage>
+%<<END_EXAMPLE
+\documentclass{book}
+
+\usepackage{zref-nextpage}[2019/11/29]
+\znextpagesetup
+ {\thepage}% next page is unknown
+ {\thepage\ (#1)}% this page is last page
+ {\thepage\ $\rightarrow$ #1}% next page is known
+\renewcommand*{\znonextpagename}{last page}
+
+\usepackage{fancyhdr}
+\pagestyle{fancy}
+\fancyhf{}
+\fancyhead[LE,RO]{\znextpage}
+\fancypagestyle{plain}{%
+ \fancyhf{}%
+ \fancyhead[LE,RO]{\znextpage}%
+}
+
+\begin{document}
+\frontmatter
+ \tableofcontents
+\mainmatter
+ \chapter{Hello World}
+ \clearpage
+ \section{Last section}
+\end{document}
+%END_EXAMPLE
+%</example-nextpage>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{totpages}}
+%
+% For the total number of pages of a document you need to
+% know the absolute page number of the last page.
+% Both modules \xmodule{abspage} and \xmodule{lastpage}
+% are necessary and automatically enabled.
+%
+% \begin{declcs}{ztotpages}\markexp
+% \end{declcs}
+% Prints the total number of pages or |0| if this
+% number is not yet known. It expands to an explicit number
+% and can also used even in expandable calculations (\cs{numexpr})
+% or counter assignments.
+%
+% \subsection{Module \xmodule{pagelayout}}
+%
+% The module defines additional properties for each parameter
+% of the page layout that is effective during page shipout.
+% The value of length parameters is given in sp without the
+% unit as plain number.
+%
+% Some parameters are specific for a class (e.g.\@ \xoption{stockwidth}
+% and \xoption{stockheight} for class \xclass{memoir}) or the
+% \hologo{TeX} engine like \hologo{pdfTeX}. If the parameter is not
+% available, then the property will not be defined. The default value
+% of the property is the current setting of the parameter.
+%
+% The module \xmodule{thepage} is loaded that generates a label
+% for each page. The properties of module \xmodule{pagelayout}
+% are added to the property list |thepage| of module \xmodule{thepage}.
+%
+% List of properties:
+% \begin{quote}
+% \def\x#1{\cs{#1}&#1}%
+% \begin{tabular}{l>{\sffamily}ll}
+% \textrm{parameter} & \textrm{property} & remarks\\
+% \hline
+% \x{mag}\\
+% \x{paperwidth}\\
+% \x{paperheight}\\
+% \x{stockwidth}& class \xclass{memoir}\\
+% \x{stockheight}& class \xclass{memoir}\\
+% \x{pdfpagewidth}& \hologo{pdfTeX}, \hologo{LuaTeX}\\
+% \x{pdfpageheight}& \hologo{pdfTeX}, \hologo{LuaTeX}\\
+% \x{pdfhorigin}& \hologo{pdfTeX}, \hologo{LuaTeX}\\
+% \x{pdfvorigin}& \hologo{pdfTeX}, \hologo{LuaTeX}\\
+% \x{hoffset}\\
+% \x{voffset}\\
+% \x{topmargin}\\
+% \x{oddsidemargin}\\
+% \x{evensidemargin}\\
+% \x{textwidth}\\
+% \x{textheight}\\
+% \x{headheight}\\
+% \x{headsep}\\
+% \x{footskip}\\
+% \x{marginparwidth}\\
+% \x{marginparsep}\\
+% \x{columnwidth}\\
+% \x{columnsep}\\
+% \end{tabular}
+% \end{quote}
+%
+% \begin{declcs}{zlistpagelayout}
+% \end{declcs}
+% At the end of document the page layout parameter for each page are
+% printed into the \xext{log} file if macro \cs{zlistpagelayout}
+% is called before |\end{document}| (preamble is a good place).
+%
+% \subsection{Module \xmodule{marks}}
+%
+% ToDo.
+%
+% \subsection{Module \xmodule{runs}}
+%
+% Module \xmodule{runs} counts the \hologo{LaTeX} runs since last
+% \xext{aux} file creation and prints the number in the
+% \xext{log} file.
+%
+% \begin{declcs}{zruns}\markexp
+% \end{declcs}
+% Prints the the total number of \hologo{LaTeX} runs including
+% the current one. It expands to an explicit number.
+% Before |begin{document}| the value is zero meaning
+% the \xext{aux} file is not read yet. If a previous
+% \xext{aux} file exists, the value found there increased
+% by one is the new number. Otherwise \cs{zruns} is set to one.
+% \hologo{LaTeX}~runs where the \xext{aux} files are not rewritten
+% are not counted (see \cs{nofiles}).
+%
+% \subsection{Module \xmodule{perpage}}
+%
+% With \cs{@addtoreset} or \cs{numberwithin} a counter can be
+% reset if another counter is incremented. This do not work
+% well if the other counter is the page counter. The page counter is
+% incremented in the output routine that is often called asynchronous
+% somewhere on the next page. A reference mechanism costs at least
+% two \hologo{LaTeX} runs, but ensures correct page counter values.
+%
+% \begin{declcs}{zmakeperpage}
+% |[|\meta{reset}|]| \M{counter}
+% \end{declcs}
+% At the of a new page counter \meta{counter} starts
+% counting with value \meta{reset} (default is \texttt{1}).
+% The macro has the same
+% syntax and semantics as \cs{MakePerPage} of package
+% \xpackage{perpage} \cite{perpage}.
+% Also \xoption{perpage} of package \xpackage{footmisc} \cite{footmisc}
+% can easily be simulated by
+% \begin{quote}
+% |\zmakeperpage{footnote}| \itshape |% \usepackage[perpage]{footmisc}|
+%\end{quote}
+% If footnote symbols are used, some people dislike the
+% first symbol \ensuremath{\dagger}. It can easily be skipped:
+% \begin{quote}
+% |\zmakeperpage[2]{footnote}|
+% \end{quote}
+%
+% \begin{declcs}{thezpage}\\
+% counter |zpage|
+% \end{declcs}
+% If the formatted counter value of the counter that is reset at
+% a new page contains the page value, then you can use \cs{thezpage},
+% the page number of the current page. Or counter |zpage| can be
+% used, if the page number should be formatted differently from
+% the current page number. Example:
+%\begin{quote}
+%\begin{verbatim}
+%\newcounter{foobar}
+%\zmakeperpage{foobar}
+%\renewcommand*{\thefoobar}{\thezpage-\arabic{foobar}}
+% % or
+%\renewcommand*{\thefoobar}{\roman{zpage}-\arabic{foobar}}
+%\end{verbatim}
+%\end{quote}
+%
+% \begin{declcs}{zunmakeperpage}
+% \M{counter}
+% \end{declcs}
+% The reset mechanism for this counter is deactivated.
+%
+%
+% \subsection{Module \xmodule{counter}}
+%
+% This option just add the property |counter| to the main
+% property list. The property stores the counter name,
+% that was responsible for the reference. This is the
+% property \xpackage{hyperref}'s \cs{autoref} feature
+% uses. Thus this property |counter| may be useful
+% for a reimplementation of the autoref feature,
+% see the section \ref{sec:todo} with the todo list.
+%
+% \subsection{Module \xmodule{titleref}}
+%
+% This option makes section and caption titles available
+% to the reference system similar to packages \xpackage{titleref}
+% or \xpackage{nameref}.
+%
+% \begin{declcs}{ztitleref}
+% \M{refname}\markbabel
+% \end{declcs}
+% Print the section or caption title of reference \meta{refname},
+% similar to \cs{nameref} or \cs{titleref}.
+%
+% \begin{declcs}{ztitlerefsetup}
+% |{|\textit{key$_1$=value$_1$, key$_2$=value$_2$, \dots}|}|
+% \end{declcs}
+% This command allows to configure the behaviour of module
+% \xmodule{titleref}. The following keys are available:
+% \begin{description}
+% \let\bfseries\relax
+% \item[\texttt{title=}\meta{value}]\mbox{}\\*
+% Sets the current title.
+% \item[\texttt{stripperiod=true\string|false}]\mbox{}\\*
+% Follow package \xpackage{nameref} that
+% removes a last period. Default: |true|.
+% \item[\texttt{expand=true\string|false}]\mbox{}\\*
+% Package \cs{titleref} expands the title first. This way
+% garbage and dangerous commands can be removed, e.g.
+% \cs{label}, \cs{index}\dots. See implementation section
+% for more details. Default is |false|.
+% \item[\texttt{cleanup=\{}\textrm{\dots}\texttt{\}}]\mbox{}\\*
+% Hook to add own cleanup code, if method |expand| is used.
+% See implementation section for more details.
+% \end{description}
+%
+% \subsection{Module \xmodule{savepos}}
+%
+% This option supports a feature that \pdfTeX\ provides
+% (and \hologo{XeTeX}).
+% \pdfTeX\ is able to tell the current position on the
+% page. The page position is not instantly known. First the
+% page must be constructed by \hologo{TeX}'s asynchronous output
+% routine. Thus the time where the position is known is
+% the page shipout time. Thus a reference system where the
+% information is recorded in the first run and made available
+% for use in the second run comes in handy.
+%
+% \begin{declcs}{zsavepos}
+% \M{refname}
+% \end{declcs}
+% It generates a reference with name \meta{refname}.
+% The reference stores the location where \cs{zsavepos}
+% is executed in properties |posx| and |posy|.
+%
+% \begin{declcs}{zsaveposx}
+% \M{refname}\\
+% \cs{zsaveposy}
+% \M{refname}
+% \end{declcs}
+% Same as \cs{zsavepos} except that only the |x| or |y| component
+% of the position is stored. Since 2011/12/05 v2.23.
+%
+% \begin{declcs}{zposx}\markexp
+% \M{refname}\\
+% \SpecialUsageIndex{\zposy}\cs{zposy}\markexp \M{refname}
+% \end{declcs}
+% Get the position as number. Unit is sp. Horizontal
+% positions by \cs{zposx} increase from left to right.
+% Vertical positions by \cs{zposy} from bottom to top.
+%
+% Do not rely on absolute page numbers. Because of problems
+% with the origin the numbers may differ in DVI or PDF mode
+% of \pdfTeX. Therefore work with relative values by comparisons.
+%
+% Both \cs{zposx} and \cs{zposy} are expandable and can be
+% used inside calculations (\cs{setcounter}, \cs{addtocounter},
+% package \xpackage{calc}, \cs{numexpr}). However this property
+% prevents from notifying \hologo{LaTeX} that the reference is actually
+% used (the notifying is not expandable). Therefore you should
+% mark the reference as used by \cs{zrefused}.
+%
+% This module uses \pdfTeX's \cs{pdfsavepos}, \cs{pdflastxpos},
+% and \cs{pdflastypos}. They are available in PDF mode and
+% since version 1.40.0 also in DVI mode.
+%
+% \begin{declcs}{zref@savepos}
+% \end{declcs}
+% Macro \cs{zref@savepos} performs the first part of \cs{zsavepos}
+% by calling \cs{pdfsavepos} (if \xext{aux} files are writable).
+%
+% Thus \cs{zsavepos} is basically \cs{zref@savepos} followed
+% by |\zref@labelbylist{|\texttt{\meta{refname}}|}{savepos}|.
+% If \cs{TeXXeTstate} is detected and enabled, \cs{savepos}
+% also adds \cs{zref@savepos} at the end to support \cs{beginR}
+% where the whatits are processed in reverse order.
+% The property list |savepos| contains the properties |posx|
+% and |posy|.
+%
+% \subsection{Module \xmodule{dotfill}}
+%
+% \begin{declcs}{zdotfill}
+% \end{declcs}
+% This package provides the command \cs{zdotfill} that works
+% similar to \cs{dotfill}, but can be configured. Especially
+% it suppresses the dots if a minimum number of dots cannot be set.
+%
+% \begin{declcs}{zdotfillsetup}
+% |{|\textit{key$_1$=value$_1$, key$_2$=value$_2$, \dots}|}|
+% \end{declcs}
+% This command allows to configure the behaviour of \cs{zdotfill}.
+% The following keys are available:
+% \begin{description}
+% \let\bfseries\relax
+% \item[\texttt{min=}\meta{count value}]\mbox{}\\*
+% If the actual number of dots are smaller than \meta{count value},
+% then the dots are suppressed. Default: |2|.
+% \item[\texttt{unit=}\meta{dimen value}]\mbox{}\\*
+% The width of a dot unit is given by \meta{dimen value}.
+% Default: |0.44em| (same as the unit in \cs{dotfill}).
+% \item[\texttt{dot=}\meta{value}]\mbox{}\\*
+% The dot itself is given by \meta{value}. Default: |.| (dot, same as
+% the dot in \cs{dotfill}).
+% \end{description}
+%
+% \subsection{Module \xmodule{env}}
+%
+% This module defines two properties |envname| and |envline|. They
+% remember the name of the environment and the line number at
+% the start of the environment.
+%
+% \subsection{Module \xmodule{xr}}
+%
+% This package provides the functionality of package \xpackage{xr},
+% see \cite{xr}. It also supports the syntax of \xpackage{xr-hyper}.
+%
+% \begin{declcs}{zexternaldocument}
+% \* |[|\meta{prefix}|]|\markbabel \M{external document}
+% |[|\meta{url}|]|
+% \end{declcs}
+% See \cs{externaldocument} for a description of this option.
+% The found labels also get a property |externaldocument| that
+% remembers \meta{external document}.
+% The standard reference scheme and the scheme of this
+% package use different name spaces for reference names.
+% If the external document uses both systems. Then one
+% import statement would put the names in one namespace
+% and probably causing problems with multiple references
+% of the same name. Thus the star form only looks for
+% \cs{newlabel} in the \xfile{.aux} files, whereas without
+% star only \cs{zref@newlabel}s are used.
+%
+% In the star form it tries to detect labels from
+% \xpackage{hyperref}, \xpackage{titleref}, and \xpackage{ntheorem}.
+% If such an extended property from the packages before cannot
+% be found or are empty, they are not included in the
+% imported reference.
+%
+% Warnings are given if a reference name is already in use
+% and the item is ignored. Unknown properties will automatically
+% be declared.
+%
+% If the external references contain |anchor| properties,
+% then we need also a url to be able to address the external
+% file. As default the filename is taken with a default
+% extension.
+%
+% \begin{declcs}{zxrsetup}
+% |{|\textit{key$_1$=value$_1$, key$_2$=value$_2$, \dots}|}|
+% \end{declcs}
+% The following setup options are available:
+% \begin{description}
+% \item[\xoption{ext}:] It sets the default extension.
+% \item[\xoption{tozreflabel}:] Boolean option. The found references
+% are imported as zref labels. This is enabled by default.
+% \item[\xoption{toltxlabel}:] Boolean option. The found references
+% are imported as \hologo{LaTeX} labels. Packages \xpackage{nameref},
+% \xpackage{titleref} and class \xclass{memoir} are supported.
+% \item[\xoption{urluse}:] Boolean option. If enabled, then a URL
+% is stored in a macro and the macro is put in property `urluse'.
+% The URL is not put in property `url'.
+% The purpose is to save \hologo{TeX} memory.
+% \item[\xoption{verbose}:] Boolean option. List the imported labels in the
+% \xext{log} file. Default is |false|.
+% \end{description}
+%
+% \begin{declcs}{zref@xr@ext}
+% \end{declcs}
+% If the \meta{url} is not specified in \cs{zref@externaldocument},
+% then the url will be constructed with the file name and
+% this macro as extension. \cs{XR@ext} is used if
+% \xpackage{hyperref} is loaded, otherwise |pdf|.
+%
+% \section{ToDo}\label{sec:todo}
+%
+% Among other things the following issues are left for future work:
+% \begin{itemize}
+% \item Other applications: autoref, hyperref, \dots
+% \end{itemize}
+%
+% \section{Example}
+%
+% \begin{macrocode}
+%<*example>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\documentclass{book}
+
+\usepackage[ngerman]{babel}%
+
+\usepackage[savepos,totpages,titleref,dotfill,counter,user]{zref}
+
+% \end{macrocode}
+%
+% Chapters are wrapped inside \cs{ChapterStart} and
+% \cs{ChapterStop}. The first argument \verb|#1| of \cs{ChapterStart}
+% is used to form a label id \verb|chap:#1|. At the end of
+% the chapter another label is set by \cs{zref@wrapper@immediate}, because
+% otherwise at the end of document a deferred write would not
+% be written, because there is no page for shipout.
+%
+% Also this example shows how chapter titles can be recorded.
+% A new property \verb|chaptitle| is declared and added to the
+% main property list. In \cs{ChapterStart} the current value
+% of the property is updated.
+% \begin{macrocode}
+\makeatletter
+\zref@newprop{chaptitle}{}
+\zref@addprop{main}{chaptitle}
+
+\newcommand*{\ChapterStart}[2]{%
+ \cleardoublepage
+ \def\current@chapid{#1}%
+ \zref@setcurrent{chaptitle}{#2}%
+ \chapter{#2}%
+ \zlabel{chap:#1}%
+}
+\newcommand*{\ChapterStop}{%
+ \cleardoublepage
+ \zref@wrapper@immediate{%
+ \zref@labelbyprops{chapend:\current@chapid}{abspage}%
+ }%
+}
+% \end{macrocode}
+% \cs{ChapterPages} calculates and returns the number of pages of the
+% referenced chapter.
+% \begin{macrocode}
+\newcommand*{\ChapterPages}[1]{%
+ \zrefused{chap:#1}%
+ \zrefused{chapend:#1}%
+ \number\numexpr
+ \zref@extract{chapend:#1}{abspage}%
+ -\zref@extract{chap:#1}{abspage}%
+ +1\relax
+}
+\makeatother
+% \end{macrocode}
+% \begin{macrocode}
+\begin{document}
+% \end{macrocode}
+% As exception we use \cs{makeatletter} here, because
+% this is just an example file that also should show some of
+% programmer's interface.
+% \begin{macrocode}
+\makeatletter
+
+\frontmatter
+\zlabel{documentstart}
+
+\begin{itemize}
+\item
+ The frontmatter part has
+ \number\numexpr\zref@extract{chap:first}{abspage}-1\relax
+ ~pages.
+\item
+ Chapter \zref{chap:first} has \ChapterPages{first} page(s).
+\item
+ Section \zref{hello} is on the
+ \ifcase\numexpr
+ \zref@extractdefault{hello}{page}{0}%
+ -\zref@extractdefault{chap:first}{page}{0}%
+ +1\relax
+ ??\or first\or second\or third\or forth\fi
+ ~page inside its chapter.
+\item
+ The document has
+ \zref[abspage]{LastPage} pages.
+ This number is \ifodd\ztotpages odd\else even\fi.
+\item
+ The last page is labeled with \zpageref{LastPage}.
+\item
+ The title of chapter \zref{chap:next} %
+ is ``\zref[chaptitle]{chap:next}''.
+\end{itemize}
+
+\tableofcontents
+
+\mainmatter
+\ChapterStart{first}{First chapter}
+
+% \end{macrocode}
+% The user level commands should protect babel shorthands
+% where possible. On the other side, expandable extracting
+% macros are useful in calculations, see above the
+% examples with \cs{numexpr}.
+% \begin{macrocode}
+\section{Test}
+\zlabel{a"o}
+Section \zref{a"o} on page
+\zref@wrapper@babel\zref@extract{a"o}{page}.
+
+Text.
+\newpage
+
+\section{Hello World}
+\zlabel{hello}
+
+\ChapterStop
+
+\ChapterStart{next}{Next chapter with \emph{umlauts}: "a"o"u"s}
+
+% \end{macrocode}
+%
+% Here an example follows that makes use of \pdfTeX's ``savepos''
+% feature. The position on the page is not known before the
+% page is constructed and shipped out. Therefore the position
+% ist stored in references and are available for calculations
+% in the next \hologo{LaTeX} compile run.
+% \begin{macrocode}
+The width of the first column is
+ \the\dimexpr \zposx{secondcol}sp - \zposx{firstcol}sp\relax,\\
+the height difference of the two baselines is
+ \the\dimexpr \zposy{firstcol}sp - \zposy{secondline}sp\relax:\\
+\begin{tabular}{ll}
+ \zsavepos{firstcol}Hello&\zsavepos{secondcol}World\\
+ \zsavepos{secondline}Second line&foobar\\
+\end{tabular}
+
+% \end{macrocode}
+% With \cs{zrefused} \hologo{LaTeX} is notified, if the references
+% are not yet available and \hologo{LaTeX} can generate the rerun
+% hint.
+% \begin{macrocode}
+\zrefused{firstcol}
+\zrefused{secondcol}
+\zrefused{secondline}
+
+\ChapterStop
+% \end{macrocode}
+% Test for module \cs{dotfill}.
+% \begin{macrocode}
+\ChapterStart{dotfill}{Test for dotfill feature}
+\newcommand*{\dftest}[1]{%
+ #1&
+ [\makebox[{#1}]{\dotfill}]&
+ [\makebox[{#1}]{\zdotfill}]\\
+}
+\begin{tabular}{rll}
+& [\verb|\dotfill|] & [\verb|\zdotfill|]\\
+\dftest{0.43em}
+\dftest{0.44em}
+\dftest{0.45em}
+\dftest{0.87em}
+\dftest{0.88em}
+\dftest{0.89em}
+\dftest{1.31em}
+\dftest{1.32em}
+\dftest{1.33em}
+\end{tabular}
+\ChapterStop
+\end{document}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</example>
+% \end{macrocode}
+%
+% \StopEventually{
+% }
+%
+% \section{Implementation}
+%
+% \subsection{Package \xpackage{zref}}
+%
+% \subsubsection{Identification}
+%
+% \begin{macrocode}
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref}
+ [2019/11/29 v2.28 A new reference scheme for LaTeX (HO)]%
+% \end{macrocode}
+%
+% \subsubsection{Load basic module}
+%
+% \begin{macrocode}
+\RequirePackage{zref-base}[2019/11/29]
+% \end{macrocode}
+% Abort package loading if \xpackage{zref-base} could not be
+% loaded successfully.
+% \begin{macrocode}
+\@ifundefined{ZREF@base@ok}{\endinput}{}
+% \end{macrocode}
+%
+% \subsubsection{Process options}
+%
+% Known modules are loaded and the release date is checked.
+% \begin{macrocode}
+\def\ZREF@temp#1{%
+ \DeclareOption{#1}{%
+ \AtEndOfPackage{%
+ \RequirePackage{zref-#1}[2019/11/29]%
+ }%
+ }%
+}
+\ZREF@temp{abspage}
+\ZREF@temp{counter}
+\ZREF@temp{dotfill}
+\ZREF@temp{hyperref}
+\ZREF@temp{lastpage}
+\ZREF@temp{marks}
+\ZREF@temp{nextpage}
+\ZREF@temp{pageattr}
+\ZREF@temp{pagelayout}
+\ZREF@temp{perpage}
+\ZREF@temp{runs}
+\ZREF@temp{savepos}
+\ZREF@temp{thepage}
+\ZREF@temp{titleref}
+\ZREF@temp{totpages}
+\ZREF@temp{user}
+\ZREF@temp{xr}
+% \end{macrocode}
+% \begin{macrocode}
+\ProcessOptions\relax
+%</package>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{base}}
+%
+% \subsubsection{Prefixes}
+%
+% This package uses the following prefixes for macro names:
+% \begin{description}
+% \item[\cs{zref@}:] Macros of the programmer's interface.
+% \item[\cs{ZREF@}:] Internal macros.
+% \item[\cs{Z@L@}\metacs{listname}:]
+% The properties of the list \meta{listname}.
+% \item[\cs{Z@D@}\metacs{propname}:]
+% The default value for property \meta{propname}.
+% \item[\cs{Z@E@}\metacs{propname}:]
+% Extract function for property \meta{propname}.
+% \item[\cs{Z@X@}\metacs{propname}:]
+% Information whether a property value for property
+% \meta{propname} is expanded
+% immediately or at shipout time.
+% \item[\cs{Z@C@}\metacs{propname}:]
+% Current value of the property \meta{propname}.
+% \item[\cs{Z@R@}\metacs{labelname}:]
+% Data for reference \meta{labelname}.
+% \item[\cs{ZREF@org@}:] Original versions of patched commands.
+% \item[\cs{z}:] For macros in user land, defined if
+% module \xmodule{user} is set.
+% \end{description}
+% The following family names are used for keys defined
+% according to the \xpackage{keyval} package:
+% \begin{description}
+% \item[\texttt{ZREF@TR}:] Setup for module \xmodule{titleref}.
+% \end{description}
+%
+% \subsubsection{Identification}
+%
+% \begin{macrocode}
+%<*base>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-base}%
+ [2019/11/29 v2.28 Module base for zref (HO)]%
+% \end{macrocode}
+%
+% \subsubsection{Utilities}
+%
+% \begin{macrocode}
+\RequirePackage{ltxcmds}[2010/12/02]
+\RequirePackage{infwarerr}[2010/04/08]
+\RequirePackage{kvsetkeys}[2010/03/01]
+\RequirePackage{kvdefinekeys}[2010/03/01]
+\RequirePackage{pdftexcmds}[2010/04/01]
+% \end{macrocode}
+%
+% \begin{macro}{\ZREF@name}
+% Several times the package name is used, thus we store it
+% in \cmd{\ZREF@name}.
+% \begin{macrocode}
+\def\ZREF@name{zref}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\ltx@IfUndefined{protected}{%
+ \RequirePackage{makerobust}[2006/03/18]%
+% \end{macrocode}
+% \begin{macro}{\ZREF@Robust}
+% \begin{macrocode}
+ \def\ZREF@Robust#1#2{%
+ \def\ZREF@temp{\MakeRobustcommand#2}%
+ \afterassignment\ZREF@temp
+ #1#2%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+}{%
+% \end{macrocode}
+% \begin{macro}{\ZREF@Robust}
+% \begin{macrocode}
+ \def\ZREF@Robust#1{%
+ \protected#1%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+}
+% \end{macrocode}
+% \begin{macro}{\ZREF@IfDefinable}
+% \begin{macrocode}
+\def\ZREF@IfDefinable#1#2#3{%
+ \@ifdefinable{#1}{%
+ \ZREF@Robust{#2}#1#3%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@UpdatePdfTeX}
+% \cs{ZREF@UpdatePdfTeX} is used as help message text in
+% error messages.
+% \begin{macrocode}
+\def\ZREF@UpdatePdfTeX{Update pdfTeX.}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifZREF@found}
+% The following switch is usded in list processing.
+% \begin{macrocode}
+\newif\ifZREF@found
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@patch}
+% Macro \cs{ZREF@patch} first checks the existence of
+% the command and safes it.
+% \begin{macrocode}
+\def\ZREF@patch#1{%
+ \ltx@IfUndefined{#1}{%
+ \ltx@gobble
+ }{%
+ \expandafter\let\csname ZREF@org@#1\expandafter\endcsname
+ \csname #1\endcsname
+ \ltx@firstofone
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Check for \hologo{eTeX}}
+%
+% The use of \hologo{eTeX} should be standard nowadays for \hologo{LaTeX}.
+% We test for \hologo{eTeX} in order to use its features later.
+% \begin{macrocode}
+\ltx@IfUndefined{eTeXversion}{%
+ \PackageError\ZREF@name{%
+ Missing support for eTeX; package is abandoned%
+ }{%
+ Use a TeX compiler that support eTeX and enable eTeX %
+ in the format.%
+ }%
+ \endinput
+}{}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\RequirePackage{etexcmds}[2007/09/09]
+\ifetex@unexpanded
+\else
+ \PackageError\ZREF@name{%
+ Missing e-TeX's \string\unexpanded.\MessageBreak
+ Add \string\RequirePackage\string{etexcmds\string} before %
+ \string\documentclass%
+ }{%
+ Probably you are using some package (e.g. ConTeXt) that %
+ redefines \string\unexpanded%
+ }%
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% \subsubsection{Auxiliary file stuff}
+%
+% We are using some commands in the \xfile{.aux} files.
+% However sometimes these auxiliary files are interpreted
+% by \hologo{LaTeX} processes that haven't loaded this package
+% (e.g. package \xpackage{xr}).
+% Therefore we provide dummy definitions.
+% \begin{macrocode}
+\RequirePackage{auxhook}
+\AddLineBeginAux{%
+ \string\providecommand\string\zref@newlabel[2]{}%
+}
+% \end{macrocode}
+% \begin{macro}{\ZREF@RefPrefix}
+% \begin{macrocode}
+\def\ZREF@RefPrefix{Z@R}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@newlabel}
+% For the implementation of \cs{zref@newlabel} we call
+% the same internal macro \cs{@newl@bel} that is used
+% in \cs{newlabel}. Thus we have for free:
+% \begin{itemize}
+% \item \cs{Z@R@}\metacs{labelname} is defined.
+% \item \hologo{LaTeX}'s check for multiple references.
+% \item \hologo{LaTeX}'s check for changed references.
+% \end{itemize}
+% \begin{macrocode}
+\ZREF@Robust\edef\zref@newlabel{%
+ \noexpand\@newl@bel{\ZREF@RefPrefix}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Property lists}
+%
+% \begin{macro}{\zref@newlist}
+% Property lists are stored as list of property names
+% enclosed in curly braces. \cs{zref@newlist}
+% creates a new list as empty list. Assignments to
+% property lists are global.
+% \begin{macrocode}
+\ZREF@Robust\def\zref@newlist#1{%
+ \zref@iflistundefined{#1}{%
+ \@ifdefinable{Z@L@#1}{%
+ \global\expandafter\let\csname Z@L@#1\endcsname\ltx@empty
+ \PackageInfo\ZREF@name{New property list: #1}%
+ }%
+ }{%
+ \PackageError\ZREF@name{%
+ Property list `#1' already exists%
+ }\@ehc
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@iflistundefined}
+% \cs{zref@iflistundefined} checks the existence of the
+% property list \verb|#1|. If the property list is present,
+% then \verb|#2| is executed and \verb|#3| otherwise.
+% \begin{macrocode}
+\def\zref@iflistundefined#1{%
+ \ltx@ifundefined{Z@L@#1}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@listexists}
+% \cs{zref@listexists} only executes \verb|#2| if the
+% property list \verb|#1| exists and raises an error
+% message otherwise.
+% \begin{macrocode}
+\ZREF@Robust\def\zref@listexists#1{%
+ \zref@iflistundefined{#1}{%
+ \PackageError\ZREF@name{%
+ Property list `#1' does not exist%
+ }\@ehc
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@iflistcontainsprop}
+% \cs{zref@iflistcontainsprop} checks, whether a property \verb|#2| is
+% already present in a property list \verb|#1|.
+% \begin{macrocode}
+\ZREF@Robust\def\zref@iflistcontainsprop#1#2{%
+ \zref@iflistundefined{#1}{%
+ \ltx@secondoftwo
+ }{%
+ \begingroup\expandafter\endgroup
+ \expandafter\in@
+ \csname#2\expandafter\expandafter\expandafter\endcsname
+ \expandafter\expandafter\expandafter{\csname Z@L@#1\endcsname}%
+ \csname ltx@\ifin@ first\else second\fi oftwo\endcsname
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@listforloop}
+% \begin{macrocode}
+\def\zref@listforloop#1#2{%
+ \zref@listexists{#1}{%
+ \expandafter\expandafter\expandafter\@tfor
+ \expandafter\expandafter\expandafter\zref@prop
+ \expandafter\expandafter\expandafter:%
+ \expandafter\expandafter\expandafter=%
+ \csname Z@L@#1\endcsname
+ \do{%
+ \begingroup
+ \escapechar=-1 %
+ \edef\x{\endgroup
+ \def\noexpand\zref@prop{%
+ \expandafter\string\zref@prop
+ }%
+ }%
+ \x
+ #2\zref@prop
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@addprops}
+% \cs{zref@addprop} adds the properties \verb|#2| to the property
+% list \verb|#1|, if the property is not already in the list.
+% Otherwise a warning is given.
+% \begin{macrocode}
+\ZREF@Robust\def\zref@addprops#1#2{%
+ \zref@listexists{#1}{%
+ \comma@parse{#2}{%
+ \zref@propexists\comma@entry{%
+ \zref@iflistcontainsprop{#1}\comma@entry{%
+ \PackageWarning\ZREF@name{%
+ Property `\comma@entry' is already in list `#1'%
+ }%
+ }{%
+ \begingroup\expandafter\endgroup
+ \expandafter\g@addto@macro
+ \csname Z@L@#1\expandafter\endcsname
+ \expandafter{\csname\comma@entry\endcsname}%
+ }%
+ }%
+ \ltx@gobble
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@addprop}
+% \cs{zref@addprop} adds the property \verb|#2| to the property
+% list \verb|#1|, if the property is not already in the list.
+% Otherwise a warning is given.
+% \begin{macrocode}
+\ZREF@Robust\def\zref@addprop#1#2{%
+ \zref@listexists{#1}{%
+ \zref@propexists{#2}{%
+ \zref@iflistcontainsprop{#1}{#2}{%
+ \PackageWarning\ZREF@name{%
+ Property `#2' is already in list `#1'%
+ }%
+ }{%
+ \begingroup\expandafter\endgroup
+ \expandafter\g@addto@macro
+ \csname Z@L@#1\expandafter\endcsname
+ \expandafter{\csname#2\endcsname}%
+ }%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@localaddprops}
+% \begin{macrocode}
+\ZREF@Robust\def\zref@localaddprops#1#2{%
+ \zref@listexists{#1}{%
+ \comma@parse{#2}{%
+ \zref@propexists\comma@entry{%
+ \zref@iflistcontainsprop{#1}\comma@entry{%
+ \PackageWarning\ZREF@name{%
+ Property `\comma@entry' is already in list `#1'%
+ }%
+ }{%
+ \begingroup\expandafter\endgroup
+ \expandafter\ltx@LocalAppendToMacro
+ \csname Z@L@#1\expandafter\endcsname
+ \expandafter{\csname\comma@entry\endcsname}%
+ }%
+ }%
+ \ltx@gobble
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@localaddprop}
+% \begin{macrocode}
+\ZREF@Robust\def\zref@localaddprop#1#2{%
+ \zref@listexists{#1}{%
+ \zref@propexists{#2}{%
+ \zref@iflistcontainsprop{#1}{#2}{%
+ \PackageWarning\ZREF@name{%
+ Property `#2' is already in list `#1'%
+ }%
+ }{%
+ \begingroup\expandafter\endgroup
+ \expandafter\ltx@LocalAppendToMacro
+ \csname Z@L@#1\expandafter\endcsname
+ \expandafter{\csname#2\endcsname}%
+ }%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\ltx@IfUndefined{pdf@strcmp}{%
+% \end{macrocode}
+% \begin{macro}{\zref@delprop}
+% \begin{macrocode}
+ \ZREF@Robust\def\zref@delprop{%
+ \ZREF@delprop\gdef
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@localdelprop}
+% \begin{macrocode}
+ \ZREF@Robust\def\zref@localdelprop{%
+ \ZREF@delprop\def
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@delprop}
+% \begin{macrocode}
+ \def\ZREF@delprop#1#2#3{%
+ \zref@listexists{#2}{%
+ \begingroup
+ \escapechar=-1 %
+ \def\ZREF@param{#3}%
+ \@onelevel@sanitize\ZREF@param
+ \toks@{}%
+ \expandafter\expandafter\expandafter\ZREF@@delprop
+ \csname Z@L@#2\endcsname!%
+ \expandafter\endgroup
+ \expandafter#1\csname Z@L@#2\expandafter\endcsname
+ \expandafter{%
+ \the\toks@
+ }%
+ }%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@@delprop}
+% \begin{macrocode}
+ \def\ZREF@@delprop#1{%
+ \expandafter\ZREF@@@delprop\expandafter{\string#1}#1%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@@@delprop}
+% \begin{macrocode}
+ \def\ZREF@@@delprop#1#2{%
+ \ifx#2!%
+ \else
+ \def\ZREF@temp{#1}%
+ \@onelevel@sanitize\ZREF@temp
+ \ifx\ZREF@param\ZREF@temp
+ \else
+ \toks@\expandafter{%
+ \the\expandafter\toks@\csname#1\endcsname
+ }%
+ \fi
+ \expandafter\ZREF@@delprop
+ \fi
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+}{%
+% \end{macrocode}
+% \begin{macro}{\zref@delprop}
+% \begin{macrocode}
+ \ZREF@Robust\def\zref@delprop{%
+ \ZREF@delprop\xdef
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@localdelprop}
+% \begin{macrocode}
+ \ZREF@Robust\def\zref@localdelprop{%
+ \ZREF@delprop\edef
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@delprop}
+% \begin{macrocode}
+ \def\ZREF@delprop#1#2#3{%
+ \zref@listexists{#2}{%
+ \def\ZREF@param{#3}%
+ \edef\ZREF@SavedEscapechar{\the\escapechar}%
+ \escapechar=-1 %
+ \expandafter#1\csname Z@L@#2%
+ \expandafter\expandafter\expandafter\endcsname{%
+ \expandafter\expandafter\expandafter\ZREF@@delprop
+ \csname Z@L@#2\endcsname!%
+ }%
+ \escapechar=\ZREF@SavedEscapechar\relax
+ }%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@@delprop}
+% Caution: |#1| might be an \cs{if} or similar token.
+% \begin{macrocode}
+ \def\ZREF@@delprop#1{%
+ \expandafter\ZREF@@@delprop\expandafter{\string#1}#1%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@@@delprop}
+% \begin{macrocode}
+ \def\ZREF@@@delprop#1#2{%
+ \ifx#2!%
+ \else
+ \ifnum\pdf@strcmp{#1}{\ZREF@param}=\ltx@zero
+ \else
+ \expandafter\noexpand\csname#1\endcsname
+ \fi
+ \expandafter\ZREF@@delprop
+ \fi
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+}
+% \end{macrocode}
+%
+% \subsubsection{Properties}
+%
+% \begin{macro}{\zref@ifpropundefined}
+% \cs{zref@ifpropundefined} checks the existence of the
+% property \verb|#1|. If the property is present,
+% then \verb|#2| is executed and \verb|#3| otherwise.
+% \begin{macrocode}
+\def\zref@ifpropundefined#1{%
+ \ltx@ifundefined{Z@E@#1}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@propexists}
+% Some macros rely on the existence of a property.
+% \cs{zref@propexists} only executes \verb|#2| if the
+% property \verb|#1| exists and raises an error
+% message otherwise.
+% \begin{macrocode}
+\ZREF@Robust\def\zref@propexists#1{%
+ \zref@ifpropundefined{#1}{%
+ \PackageError\ZREF@name{%
+ Property `#1' does not exist%
+ }\@ehc
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@newprop}
+% A new property is declared by \cs{zref@newprop}, the
+% property name \meta{propname} is given in \verb|#1|. The
+% property is created and configured. If the star form
+% is given, then the expansion of the property value
+% is delayed to page shipout time, when the reference
+% is written to the \xfile{.aux} file.
+% \begin{description}
+% \item[\cs{Z@D@}\metacs{propname}:]
+% Stores the default value for this property.
+% \item[\cs{Z@E@}\metacs{propname}:]
+% Extract function.
+% \item[\cs{Z@X@}\metacs{propname}:]
+% Information whether the expansion of the property value
+% is delayed to shipout time.
+% \item[\cs{Z@C@}\metacs{propname}:]
+% Current value of the property.
+% \end{description}
+% \begin{macrocode}
+\ZREF@Robust\def\zref@newprop{%
+ \@ifstar{%
+ \let\ZREF@X\noexpand
+ \ZREF@newprop
+ }{%
+ \let\ZREF@X\ltx@empty
+ \ZREF@newprop
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@newprop}
+% \begin{macrocode}
+\def\ZREF@newprop#1{%
+ \edef\ZREF@P{#1}%
+ \@onelevel@sanitize\ZREF@P
+ \begingroup
+ \ifx\ZREF@P\ZREF@par
+ \@PackageError\ZREF@name{%
+ Invalid property name `\ZREF@P'%
+ }{%
+ The property name `par' is not allowed %
+ because of internal reasons.%
+ \MessageBreak
+ \@ehc
+ }%
+ \def\ZREF@@newprop[##1]##2{\endgroup}%
+ \else
+ \zref@ifpropundefined\ZREF@P{%
+ \endgroup
+ \PackageInfo\ZREF@name{%
+ New property: \ZREF@P
+ }%
+ }{%
+ \@PackageError\ZREF@name{%
+ Property `\ZREF@P' already exists%
+ }\@ehc
+ \def\ZREF@@newprop[##1]##2{\endgroup}%
+ }%
+ \fi
+ \@ifnextchar[\ZREF@@newprop{\ZREF@@newprop[\zref@default]}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@par}
+% \begin{macrocode}
+\def\ZREF@par{par}
+\@onelevel@sanitize\ZREF@par
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@@newprop}
+% \begin{macrocode}
+\def\ZREF@@newprop[#1]{%
+ \global\@namedef{Z@D@\ZREF@P}{#1}%
+ \global\expandafter\let\csname Z@X@\ZREF@P\endcsname\ZREF@X
+ \begingroup\expandafter\endgroup
+ \expandafter\ZREF@@@newprop\csname\ZREF@P\endcsname
+ \expandafter\gdef\csname Z@C@\ZREF@P\endcsname{}%
+ \zref@setcurrent\ZREF@P
+}
+\def\ZREF@@@newprop#1{%
+ \expandafter
+ \gdef\csname Z@E@\ZREF@P\endcsname##1#1##2##3\ZREF@nil{##2}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@showprop}
+% \begin{macrocode}
+\ZREF@Robust\def\zref@showprop#1{%
+ \zref@ifpropundefined{#1}{%
+ \@PackageInfoNoLine{\ZREF@name}{%
+ Show property `#1': <undefined>%
+ }%
+ }{%
+ \begingroup
+ \toks@\expandafter\expandafter\expandafter{%
+ \csname Z@C@#1\endcsname
+ }%
+ \edef\ZREF@value{\the\toks@}%
+ \ltx@onelevel@sanitize\ZREF@value
+ \toks@\expandafter\expandafter\expandafter{%
+ \csname Z@D@#1\endcsname
+ }%
+ \edef\ZREF@default{\the\toks@}%
+ \ltx@onelevel@sanitize\ZREF@default
+ \@PackageInfoNoLine{\ZREF@name}{%
+ Show property `#1':\MessageBreak
+ \expandafter\ifx\csname Z@X@#1\endcsname\ltx@empty
+ Immediate %
+ \else
+ Delayed %
+ \fi
+ value: [\ZREF@value]\MessageBreak
+ Default: [\ZREF@default]%
+ }%
+ \endgroup
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@setcurrent}
+% \cs{zref@setcurrent} sets the current value for a property.
+% \begin{macrocode}
+\ZREF@Robust\def\zref@setcurrent#1#2{%
+ \zref@propexists{#1}{%
+ \expandafter\def\csname Z@C@#1\endcsname{#2}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@getcurrent}
+% \cs{zref@getcurrent} gets the current value for a property.
+% \begin{macrocode}
+\def\ZREF@getcurrent#1{%
+ \romannumeral0%
+ \ltx@ifundefined{Z@C@#1}{%
+ \ltx@space
+ }{%
+ \expandafter\expandafter\expandafter\ltx@space
+ \csname Z@C@#1\endcsname
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@u@getcurrent}
+% \begin{macrocode}
+\def\ZREF@wu@getcurrent#1{%
+ \etex@unexpanded\expandafter\expandafter\expandafter{%
+ \ZREF@getcurrent{#1}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@getcurrent}
+% \begin{macrocode}
+\let\zref@getcurrent\ZREF@getcurrent
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Reference generation}
+%
+% \begin{macro}{\zref@label}
+% Label macro that uses the main property list.
+% \begin{macrocode}
+\ZREF@Robust\def\zref@label#1{%
+ \zref@labelbylist{#1}\ZREF@mainlist
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@labelbylist}
+% Label macro that stores the properties, specified in the
+% property list \verb|#2|.
+% \begin{macrocode}
+\ZREF@Robust\def\zref@labelbylist#1#2{%
+ \@bsphack
+ \zref@listexists{#2}{%
+ \expandafter\expandafter\expandafter\ZREF@label
+ \expandafter\expandafter\expandafter{%
+ \csname Z@L@#2\endcsname
+ }{#1}%
+ }%
+ \@esphack
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@labelbyprops}
+% The properties are directly specified in a comma separated list.
+% \begin{macrocode}
+\ZREF@Robust\def\zref@labelbyprops#1#2{%
+ \@bsphack
+ \begingroup
+ \toks@{}%
+ \comma@parse{#2}{%
+ \zref@ifpropundefined\comma@entry{%
+ \PackageWarning\ZREF@name{%
+ Property `\comma@entry' is not known%
+ }%
+ }{%
+ \toks@\expandafter{%
+ \the\expandafter\toks@\csname\comma@entry\endcsname
+ }%
+ }%
+ \ltx@gobble
+ }%
+ \expandafter\endgroup
+ \expandafter\ZREF@label\expandafter{\the\toks@}{#1}%
+ \@esphack
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@labelbykv}
+% \begin{macrocode}
+\ZREF@Robust\def\zref@labelbykv#1#2{%
+ \@bsphack
+ \begingroup
+ \let\Z@L@ZREF@temp\ltx@empty
+ \kvsetkeys{ZREF@LABEL}{#1}%
+ \ifZREF@immediate
+ \expandafter\zref@wrapper@immediate\expandafter{%
+ \expandafter\ZREF@label\expandafter{\Z@L@ZREF@temp}{#2}%
+ }%
+ \else
+ \expandafter\ZREF@label\expandafter{\Z@L@ZREF@temp}{#2}%
+ \fi
+ \endgroup
+ \@esphack
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\kv@define@key{ZREF@LABEL}{prop}{%
+ \edef\ZREF@param{#1}%
+ \zref@propexists\ZREF@param{%
+ \zref@iflistcontainsprop{ZREF@temp}\ZREF@param{}{%
+ \begingroup\expandafter\endgroup
+ \expandafter\ltx@LocalAppendToMacro
+ \expandafter\Z@L@ZREF@temp
+ \expandafter{\csname\ZREF@param\endcsname}%
+ }%
+ }%
+}
+\kv@define@key{ZREF@LABEL}{list}{%
+ \zref@listforloop{#1}{%
+ \zref@iflistcontainsprop{ZREF@temp}\zref@prop{}{%
+ \begingroup\expandafter\endgroup
+ \expandafter\ltx@LocalAppendToMacro
+ \expandafter\Z@L@ZREF@temp
+ \expandafter{\csname\zref@prop\endcsname}%
+ }%
+ \ltx@gobble
+ }%
+}
+\kv@define@key{ZREF@LABEL}{delprop}{%
+ \zref@propexists{#1}{%
+ \zref@localdelprop{ZREF@temp}{#1}%
+ }%
+}
+\kv@define@key{ZREF@LABEL}{immediate}[true]{%
+ \edef\ZREF@param{#1}%
+ \ifx\ZREF@param\ZREF@true
+ \ZREF@immediatetrue
+ \else
+ \ifx\ZREF@param\ZREF@false
+ \ZREF@immediatefalse
+ \else
+ \PackageWarning\ZREF@name{%
+ Option `immediate' expects `true' or `false'.\MessageBreak
+ Ignoring invalid value `\ZREF@param'%
+ }%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \begin{macro}{\ZREF@false}
+% \begin{macrocode}
+\def\ZREF@false{false}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@true}
+% \begin{macrocode}
+\def\ZREF@true{true}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\kv@define@key{ZREF@LABEL}{values}[]{%
+ \kv@parse{#1}{%
+ \ifx\kv@value\relax
+ \@PackageWarning\ZREF@name{%
+ Missing value for property `\kv@key'%
+ }%
+ \expandafter\ltx@gobbletwo
+ \else
+ \expandafter\zref@setcurrent
+ \fi
+ }%
+}
+% \end{macrocode}
+%
+% \begin{macro}{\ifZREF@immediate}
+% The switch \cs{ifZREF@immediate} tells us, whether the
+% label should be written immediately or at page shipout time.
+% \cs{ZREF@label} need to be notified about this, because
+% it must disable the deferred execution of property values,
+% if the label is written immediately.
+% \begin{macrocode}
+\newif\ifZREF@immediate
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@wrapper@immediate}
+% The argument of \cs{zref@wrapper@immediate} is executed inside
+% a group where \cs{write} is redefined by adding
+% \cs{immediate} before its execution. Also \cs{ZREF@label}
+% is notified via the switch \cs{ifZREF@immediate}.
+% \begin{macrocode}
+\ZREF@Robust{\long\def}\zref@wrapper@immediate#1{%
+ \begingroup
+ \ZREF@immediatetrue
+ \let\ZREF@org@write\write
+ \def\write{\immediate\ZREF@org@write}%
+ #1%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@label}
+% \cs{ZREF@label} writes the data in the \xfile{.aux} file.
+% \verb|#1| contains the list of valid properties,
+% \verb|#2| the name of the reference. In case of immediate
+% writing, the deferred execution of property values is
+% disabled. Also \thepage is made expandable in this case.
+% \begin{macrocode}
+\def\ZREF@label#1#2{%
+ \if@filesw
+ \begingroup
+ \ifZREF@immediate
+ \let\ZREF@org@thepage\thepage
+ \fi
+ \protected@write\@auxout{%
+ \ifZREF@immediate
+ \let\thepage\ZREF@org@thepage
+ \fi
+ \let\ZREF@temp\ltx@empty
+ \@tfor\ZREF@P:=#1\do{%
+ \begingroup
+ \escapechar=-1 %
+ \edef\x{\endgroup
+ \def\noexpand\ZREF@P{%
+ \expandafter\string\ZREF@P
+ }%
+ }%
+ \x
+ \expandafter\ifx
+ \csname
+ \ifZREF@immediate
+ relax%
+ \else
+ Z@X@\ZREF@P%
+ \fi
+ \endcsname
+ \noexpand
+ \expandafter\let\csname Z@C@\ZREF@P\endcsname\relax
+ \fi
+ \toks@\expandafter{\ZREF@temp}%
+ \edef\ZREF@temp{%
+ \the\toks@
+ \ltx@backslashchar\ZREF@P{%
+ \expandafter\noexpand\csname Z@C@\ZREF@P\endcsname
+ }%
+ }%
+ }%
+ }{%
+ \string\zref@newlabel{#2}{\ZREF@temp}%
+ }%
+ \endgroup
+ \fi
+}
+\def\ZREF@addtoks#1{%
+ \toks@\expandafter\expandafter\expandafter{%
+ \expandafter\the\expandafter\toks@#1%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Reference querying and extracting}
+%
+% Design goal for the extracting macros is that the extraction
+% process is full expandable. Thus these macros can be used
+% in expandable contexts. But there are problems that cannot
+% be solved by full expandable macros:
+% \begin{itemize}
+% \item In standard \hologo{LaTeX} undefined references sets a flag
+% and generate a warning. Both actions are not expandable.
+% \item Babel's support for its shorthand uses commands that
+% use non-expandable assignments. However currently there
+% is hope, that primitives are added to \pdfTeX\ that
+% allows the detection of contexts. Then the shorthand
+% can detect, if they are executed inside \cs{csname}
+% and protect themselves automatically.
+% \end{itemize}
+% \begin{macro}{\zref@ifrefundefined}
+% If a reference \verb|#1| is undefined, then macro
+% \cs{zref@ifrefundefined} calls \verb|#2| and \verb|#3| otherwise.
+% \begin{macrocode}
+\def\zref@ifrefundefined#1{%
+ \ltx@ifundefined{Z@R@#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zifrefundefined}
+% If a reference \verb|#1| is undefined, then macro
+% \cs{zref@ifrefundefined} calls \verb|#2| and \verb|#3| otherwise.
+% Also the reference is marked used.
+% \begin{macrocode}
+\ZREF@IfDefinable\zifrefundefined\def{%
+ #1{%
+ \zref@wrapper@babel\ZREF@ifrefundefined{#1}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@ifrefundefined}
+% \begin{macrocode}
+\def\ZREF@ifrefundefined#1{%
+ \zref@refused{#1}%
+ \zref@ifrefundefined{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@refused}
+% The problem with undefined references is addressed by
+% the macro \cs{zref@refused}. This can be used outside
+% the expandable context. In case of an undefined reference
+% the flag is set to notify \hologo{LaTeX} and a warning is given.
+% \begin{macrocode}
+\ZREF@Robust\def\zref@refused#1{%
+ \zref@wrapper@babel\ZREF@refused{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@refused}
+% \begin{macrocode}
+\def\ZREF@refused#1{%
+ \zref@ifrefundefined{#1}{%
+ \protect\G@refundefinedtrue
+ \@latex@warning{%
+ Reference `#1' on page \thepage \space undefined%
+ }%
+ }{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@ifrefcontainsprop}
+% \cs{zref@ifrefcontainsprop} looks, if the reference \verb|#1|
+% has the property \verb|#2| and calls then \verb|#3| and
+% \verb|#4| otherwise.
+% \begin{macrocode}
+\def\zref@ifrefcontainsprop#1#2{%
+ \zref@ifrefundefined{#1}{%
+ \ltx@secondoftwo
+ }{%
+ \expandafter\ZREF@ifrefcontainsprop
+ \csname Z@E@#2\expandafter\endcsname
+ \csname#2\expandafter\expandafter\expandafter\endcsname
+ \expandafter\expandafter\expandafter{%
+ \csname Z@R@#1\endcsname
+ }%
+ }%
+}
+\def\ZREF@ifrefcontainsprop#1#2#3{%
+ \expandafter\ifx\expandafter\ZREF@novalue
+ #1#3#2\ZREF@novalue\ZREF@nil\ltx@empty
+ \expandafter\ltx@secondoftwo
+ \else
+ \expandafter\ltx@firstoftwo
+ \fi
+}
+\def\ZREF@novalue{\ZREF@NOVALUE}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@extract}
+% \cs{zref@extract} is an abbreviation for the case
+% that the default of the property is used as default
+% value.
+% \begin{macrocode}
+\def\ZREF@extract#1#2{%
+ \romannumeral0%
+ \ltx@ifundefined{Z@D@#2}{%
+ \expandafter\ltx@space\zref@default
+ }{%
+ \expandafter\expandafter\expandafter\ZREF@@extract
+ \expandafter\expandafter\expandafter{%
+ \csname Z@D@#2\endcsname
+ }{#1}{#2}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@@extract}
+% \begin{macrocode}
+\def\ZREF@@extract#1#2#3{%
+ \expandafter\expandafter\expandafter\ltx@space
+ \zref@extractdefault{#2}{#3}{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@wu@extract}
+% \begin{macrocode}
+\def\ZREF@wu@extract#1#2{%
+ \etex@unexpanded\expandafter\expandafter\expandafter{%
+ \ZREF@extract{#1}{#2}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@extract}
+% \begin{macrocode}
+\let\zref@extract\ZREF@extract
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@extractdefault}
+% The basic extracting macro is \cs{zref@extractdefault} with
+% the reference name in \verb|#1|, the property in \verb|#2| and
+% the default value in \verb|#3| in case for problems.
+% \begin{macrocode}
+\def\ZREF@extractdefault#1#2#3{%
+ \romannumeral0%
+ \zref@ifrefundefined{#1}\ltx@firstoftwo{%
+ \zref@ifpropundefined{#2}\ltx@firstoftwo\ltx@secondoftwo
+ }{%
+ \ltx@space
+ #3%
+ }{%
+ \expandafter\expandafter\expandafter\ltx@space
+ \csname Z@E@#2\expandafter\expandafter\expandafter\endcsname
+ \csname Z@R@#1\expandafter\endcsname
+ \csname#2\endcsname{#3}\ZREF@nil
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@wu@extractdefault}
+% \begin{macrocode}
+\def\ZREF@wu@extractdefault#1#2#3{%
+ \etex@unexpanded\expandafter\expandafter\expandafter{%
+ \ZREF@extractdefault{#1}{#2}{#3}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@extractdefault}
+% \begin{macrocode}
+\let\zref@extractdefault\ZREF@extractdefault
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@def@extract}
+% \begin{macrocode}
+\ZREF@Robust\def\zref@def@extract#1{%
+ \zref@wrapper@babel{\ZREF@def@extract{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@def@extract}
+% \begin{macrocode}
+\def\ZREF@def@extract#1#2#3{%
+ \zref@refused{#2}%
+ \expandafter\expandafter\expandafter\def
+ \expandafter\expandafter\expandafter#1%
+ \expandafter\expandafter\expandafter{%
+ \zref@extract{#2}{#3}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@def@extractdefault}
+% \begin{macrocode}
+\ZREF@Robust\def\zref@def@extractdefault#1{%
+ \zref@wrapper@babel{\ZREF@def@extractdefault{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@def@extractdefault}
+% \begin{macrocode}
+\def\ZREF@def@extractdefault#1#2#3#4{%
+ \zref@refused{#2}%
+ \expandafter\expandafter\expandafter\def
+ \expandafter\expandafter\expandafter#1%
+ \expandafter\expandafter\expandafter{%
+ \zref@extractdefault{#2}{#3}{#4}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@wrapper@unexpanded}
+% \begin{macrocode}
+\ZREF@Robust{\long\def}\ZREF@wrapper@unexpanded#1{%
+ \let\zref@wrapper@unexpanded\ltx@firstofone
+ \let\zref@getcurrent\ZREF@wu@getcurrent
+ \let\zref@extractdefault\ZREF@wu@extractdefault
+ \let\zref@extract\ZREF@wu@extract
+ #1%
+ \let\zref@wrapper@unexpanded\ZREF@wrapper@unexpanded
+ \let\zref@getcurrent\ZREF@getcurrent
+ \let\zref@extractdefault\ZREF@extractdefault
+ \let\zref@extract\ZREF@extract
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@wrapper@unexpanded}
+% \begin{macrocode}
+\ltx@IfUndefined{etex@unexpanded}{%
+ \let\zref@wrapper@unexpanded\ltx@firstofone
+}{%
+ \let\zref@wrapper@unexpanded\ZREF@wrapper@unexpanded
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Compatibility with \xpackage{babel}}
+%
+% \begin{macro}{\zref@wrapper@babel}
+% \begin{macrocode}
+\ZREF@Robust{\long\def}\zref@wrapper@babel#1#2{%
+ \ifcsname if@safe@actives\endcsname
+ \expandafter\ltx@firstofone
+ \else
+ \expandafter\ltx@secondoftwo
+ \fi
+ {%
+ \if@safe@actives
+ \expandafter\ltx@secondoftwo
+ \else
+ \expandafter\ltx@firstoftwo
+ \fi
+ {%
+ \begingroup
+ \csname @safe@activestrue\endcsname
+ \edef\x{#2}%
+ \expandafter\endgroup
+ \expandafter\ZREF@wrapper@babel\expandafter{\x}{#1}%
+ }%
+ }{%
+ #1{#2}%
+ }%
+}
+\long\def\ZREF@wrapper@babel#1#2{%
+ #2{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Unique counter support}
+%
+% \begin{macro}{\zref@require@unique}
+% Generate the counter |zref@unique| if the counter does not
+% already exist.
+% \begin{macrocode}
+\ZREF@Robust\def\zref@require@unique{%
+ \@ifundefined{c@zref@unique}{%
+ \begingroup
+ \let\@addtoreset\ltx@gobbletwo
+ \newcounter{zref@unique}%
+ \endgroup
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\thezref@unique}
+% \cs{thezref@unique} is used for automatically generated unique
+% labelnames.
+% \begin{macrocode}
+ \renewcommand*{\thezref@unique}{%
+ zref@\number\c@zref@unique
+ }%
+ }{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Utilities}
+%
+% \begin{macro}{\ZREF@number}
+% \begin{macrocode}
+\ltx@IfUndefined{numexpr}{%
+ \def\ZREF@number#1{\number#1}%
+}{%
+ \def\ZREF@number#1{\the\numexpr(#1)\relax}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Setup}
+%
+% \begin{macro}{\zref@setdefault}
+% Standard \hologo{LaTeX} prints ``??'' in bold face if a reference
+% is not known. \cs{zref@default} holds the text that is
+% printed in case of unknown references and is used, if
+% the default was not specified during the definition
+% of the new property by \cs{ref@newprop}.
+% The global default value can be set by \cs{zref@setdefault}.
+% \begin{macrocode}
+\ZREF@Robust\def\zref@setdefault#1{%
+ \def\zref@default{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@default}
+% Now we initialize \cs{zref@default} with the same value
+% that \hologo{LaTeX} uses for its undefined references.
+% \begin{macrocode}
+\zref@setdefault{%
+ \nfss@text{\reset@font\bfseries ??}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \paragraph{Main property list.}
+%
+% \begin{macro}{\zref@setmainlist}
+% The name of the default property list is stored in
+% \cs{ZREF@mainlist} and can be set by \cs{zref@setmainlist}.
+% \begin{macrocode}
+\ZREF@Robust\def\zref@setmainlist#1{%
+ \def\ZREF@mainlist{#1}%
+}
+\zref@setmainlist{main}
+% \end{macrocode}
+% \end{macro}
+% Now we create the list.
+% \begin{macrocode}
+\zref@newlist\ZREF@mainlist
+% \end{macrocode}
+%
+% \paragraph{Main properties.}
+%
+% The two properties \texttt{default} and \texttt{page}
+% are created and added to the main property list.
+% They store the data that
+% standard \hologo{LaTeX} uses in its references created by
+% \cs{label}.
+% \begin{description}
+% \item[\texttt{default}] the apperance of the latest
+% counter that is incremented by \cs{refstepcounter}
+% \item[\texttt{page}] the apperance of the page counter
+% \end{description}
+% \begin{macrocode}
+\zref@newprop{default}{\@currentlabel}
+\zref@newprop*{page}{\thepage}
+\zref@addprops\ZREF@mainlist{default,page}
+% \end{macrocode}
+%
+% \paragraph{Properties}
+%
+% \begin{macro}{\ZREF@NewPropAnchor}
+% \begin{macrocode}
+\def\ZREF@NewPropAnchor{%
+ \zref@newprop{anchor}{%
+ \ltx@ifundefined{@currentHref}{}{\@currentHref}%
+ }%
+ \global\let\ZREF@NewPropAnchor\relax
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@titleref@current}
+% Later we will redefine the section and caption macros
+% to catch the current title and remember the value in
+% \cs{zref@titleref@current}.
+% \begin{macro}{\ZREF@NewPropTitle}
+% \begin{macrocode}
+\def\ZREF@NewPropTitle{%
+ \gdef\zref@titleref@current{}%
+ \zref@newprop{title}{\zref@titleref@current}%
+ \global\let\ZREF@NewPropTitle\relax
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\ZREF@NewPropTheotype}
+% \begin{macrocode}
+\def\ZREF@NewPropTheotype{%
+ \zref@newprop{theotype}{}%
+ \global\let\ZREF@NewPropTheotype\relax
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@NewPropPageValue}
+% \begin{macrocode}
+\def\ZREF@NewPropPageValue{%
+ \zref@newprop*{pagevalue}[0]{\number\c@page}%
+ \global\let\ZREF@NewPropPageValue\relax
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \paragraph{Mark successful loading}
+%
+% \begin{macrocode}
+\let\ZREF@base@ok=Y
+%</base>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{user}}
+%
+% \begin{macrocode}
+%<*user>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-user}%
+ [2019/11/29 v2.28 Module user for zref (HO)]%
+\RequirePackage{zref-base}[2019/11/29]
+\ifx\ZREF@base@ok Y%
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% Module \xmodule{user} enables a small user interface.
+% All macros are prefixed by \cs{z}.
+%
+% First we define the pendants to the standard \hologo{LaTeX} referencing
+% commands \cs{label}, \cs{ref}, and \cs{pageref}.
+%
+% \begin{macro}{\zlabel}
+% Similar to \cs{label} the macro \cs{zlabel} writes a reference
+% entry in the \xfile{.aux} file. The main property list is used.
+% Also we add the babel patch. The \cs{label} command can also be
+% used inside section titles, but it must not go into the
+% table of contents. Therefore we have to check this situation.
+% \begin{macrocode}
+\newcommand*\zlabel{%
+ \ifx\label\ltx@gobble
+ \expandafter\ltx@gobble
+ \else
+ \expandafter\zref@wrapper@babel\expandafter\zref@label
+ \fi
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zkvlabel}
+% \begin{macrocode}
+\newcommand*{\zkvlabel}[1]{%
+ \ifx\label\ltx@gobble
+ \expandafter\ltx@gobblethree
+ \fi
+ \zref@wrapper@babel{\zref@labelbykv{#1}}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref}
+% Macro \cs{zref} is the corresponding macro for \cs{ref}.
+% Also it provides an optional argument in order to
+% select another property.
+% \begin{macrocode}
+\newcommand*{\zref}[2][default]{% robust because of optional argument
+ \zref@propexists{#1}{%
+ \zref@wrapper@babel\ZREF@zref{#2}{#1}%
+ }%
+}%
+\def\ZREF@zref#1{%
+ \zref@refused{#1}%
+ \zref@extract{#1}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zpageref}
+% For macro \cs{zpageref} we just call \cs{zref}
+% with property \verb|page|.
+% \begin{macrocode}
+\ZREF@IfDefinable\zpageref\def{%
+ {\zref[page]}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zrefused}
+% For the following expandible user macros \cs{zrefused}
+% should be used to notify \hologo{LaTeX} in case of undefined
+% references.
+% \begin{macrocode}
+\ZREF@IfDefinable\zrefused\def{%
+ {\zref@refused}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</user>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{abspage}}
+%
+% \begin{macrocode}
+%<*abspage>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-abspage}%
+ [2019/11/29 v2.28 Module abspage for zref (HO)]%
+\RequirePackage{zref-base}[2019/11/29]
+\ifx\ZREF@base@ok Y%
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% Module \xmodule{abspage} adds a new property \verb|abspage|
+% to the \verb|main| property list for absolute page numbers.
+% These are recorded by the help of package \xpackage{atbegshi}.
+% \begin{macrocode}
+\RequirePackage{atbegshi}[2011/10/05]%
+% \end{macrocode}
+% The counter \verb|abspage| must not go in the clear list
+% of \verb|@ckpt| that is used to set counters in
+% \xfile{.aux} files of included \hologo{TeX} files.
+% \begin{macrocode}
+\begingroup
+ \let\@addtoreset\ltx@gobbletwo
+ \newcounter{abspage}%
+\endgroup
+\setcounter{abspage}{0}%
+\AtBeginShipout{%
+ \stepcounter{abspage}%
+}%
+\zref@newprop*{abspage}[0]{\the\c@abspage}%
+\zref@addprop\ZREF@mainlist{abspage}%
+% \end{macrocode}
+% Note that counter \verb|abspage| shows the
+% previous page during page processing. Before
+% shipout the counter is incremented.
+% Thus the property is correctly written with
+% deferred writing. If the counter is written
+% using \cs{zref@wrapper@immediate}, then the number
+% is too small by one.
+%
+% \begin{macrocode}
+%</abspage>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{counter}}
+%
+% \begin{macrocode}
+%<*counter>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-counter}%
+ [2019/11/29 v2.28 Module counter for zref (HO)]%
+\RequirePackage{zref-base}[2019/11/29]
+\ifx\ZREF@base@ok Y%
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% For features such as \xpackage{hyperref}'s \cs{autoref}
+% we need the name of the counter. The property
+% \verb|counter| is defined and added to the main property
+% list.
+% \begin{macrocode}
+\zref@newprop{counter}{}
+\zref@addprop\ZREF@mainlist{counter}
+% \end{macrocode}
+%
+% \cs{refstepcounter} is the central macro where we know
+% which counter is responsible for the reference.
+% \begin{macrocode}
+\AtBeginDocument{%
+ \ZREF@patch{refstepcounter}{%
+ \def\refstepcounter#1{%
+ \zref@setcurrent{counter}{#1}%
+ \ZREF@org@refstepcounter{#1}%
+ }%
+ }%
+}
+% \end{macrocode}
+% \begin{macrocode}
+%</counter>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{lastpage}}
+%
+% \begin{macrocode}
+%<*lastpage>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-lastpage}%
+ [2019/11/29 v2.28 Module lastpage for zref (HO)]%
+\RequirePackage{zref-base}[2019/11/29]
+\RequirePackage{zref-abspage}[2019/11/29]
+\RequirePackage{atveryend}[2009/12/07]
+\ifx\ZREF@base@ok Y%
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% The module \xmodule{lastpage} implements the service
+% of package \xpackage{lastpage} by setting a reference
+% \verb|LastPage| at the end of the document.
+% If module \xmodule{abspage} is given, also the absolute
+% page number is available, because the properties of
+% the main property list are used.
+% \begin{macrocode}
+\zref@newlist{LastPage}
+\AfterLastShipout{%
+ \if@filesw
+ \begingroup
+ \advance\c@page\m@ne
+ \toks@\expandafter\expandafter\expandafter{%
+ \expandafter\Z@L@main
+ \Z@L@LastPage
+ }%
+ \expandafter\zref@wrapper@immediate\expandafter{%
+ \expandafter\ZREF@label\expandafter{\the\toks@}{LastPage}%
+ }%
+ \endgroup
+ \fi
+}
+% \end{macrocode}
+% \begin{macro}{\zref@iflastpage}
+% \begin{macrocode}
+\def\zref@iflastpage#1{%
+ \ifnum\zref@extractdefault{#1}{abspage}{-1}=%
+ \zref@extractdefault{LastPage}{abspage}{-2} %
+ \expandafter\ltx@firstoftwo
+ \else
+ \expandafter\ltx@secondoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ziflastpage}
+% \begin{macrocode}
+\ZREF@IfDefinable\ziflastpage\def{%
+ {\zref@wrapper@babel\ZREF@iflastpage}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{ZREF@iflastpage}
+% \begin{macrocode}
+\def\ZREF@iflastpage#1{%
+ \zref@refused{LastPage}%
+ \zref@refused{#1}%
+ \zref@iflastpage{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+%</lastpage>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{thepage}}
+%
+% \begin{macrocode}
+%<*thepage>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-thepage}%
+ [2019/11/29 v2.28 Module thepage for zref (HO)]%
+\RequirePackage{zref-base}[2019/11/29]
+\ifx\ZREF@base@ok Y%
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+\RequirePackage{atbegshi}[2011/10/05]
+\RequirePackage{zref-abspage}[2019/11/29]
+% \end{macrocode}
+% \begin{macrocode}
+\zref@newlist{thepage}
+\zref@addprop{thepage}{page}
+\ZREF@NewPropPageValue
+% \end{macrocode}
+% \begin{macro}{\zref@thepage@atbegshi@hook}
+% \begin{macrocode}
+\let\zref@thepage@atbegshi@hook\ltx@empty
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\zref@addprop{thepage}{pagevalue}
+\AtBeginShipout{%
+ \AtBeginShipoutAddToBox{%
+ \zref@thepage@atbegshi@hook
+ \zref@labelbylist{thepage\the\value{abspage}}{thepage}%
+ }%
+}
+% \end{macrocode}
+% \begin{macro}{\zref@thepage@name}
+% \begin{macrocode}
+\ltx@IfUndefined{numexpr}{%
+ \def\zref@thepage@name#1{thepage\number#1}%
+}{%
+ \def\zref@thepage@name#1{thepage\the\numexpr#1}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@thepage}
+% \begin{macrocode}
+\def\zref@thepage#1{%
+ \zref@extract{\zref@thepage@name{#1}}{page}%
+}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@thepage@refused}
+% \begin{macrocode}
+\ZREF@Robust\def\zref@thepage@refused#1{%
+ \zref@refused{\zref@thepage@name{#1}}%
+}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zthepage}
+% \begin{macrocode}
+\ZREF@IfDefinable\zthepage\def{%
+ #1{%
+ \zref@thepage@refused{#1}%
+ \zref@thepage{#1}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+%</thepage>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{nextpage}}
+%
+% \begin{macrocode}
+%<*nextpage>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-nextpage}%
+ [2019/11/29 v2.28 Module nextpage for zref (HO)]%
+\RequirePackage{zref-base}[2019/11/29]
+\ifx\ZREF@base@ok Y%
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+\RequirePackage{zref-abspage}[2019/11/29]
+\RequirePackage{zref-thepage}[2019/11/29]
+\RequirePackage{zref-lastpage}[2019/11/29]
+\RequirePackage{uniquecounter}[2009/12/18]
+% \end{macrocode}
+% \begin{macrocode}
+\UniqueCounterNew{znextpage}
+
+\newcommand*{\znextpagesetup}{%
+ \afterassignment\ZREF@np@setup@i
+ \def\ZREF@np@call@unknown##1%
+}
+\def\ZREF@np@setup@i{%
+ \afterassignment\ZREF@np@setup@ii
+ \def\ZREF@np@call@nonext##1%
+}
+\def\ZREF@np@setup@ii{%
+ \def\ZREF@np@call@next##1%
+}
+\def\ZREF@np@call@unknown#1{#1}
+\def\ZREF@np@call@nonext#1{#1}
+\def\ZREF@np@call@next#1{#1}
+\ZREF@IfDefinable\znextpage\def{%
+ {\UniqueCounterCall{znextpage}{\ZREF@nextpage}}%
+}%
+\newcommand*{\znonextpagename}{}
+\newcommand*{\zunknownnextpagename}{\Z@D@page}
+\def\ZREF@nextpage#1{%
+ \begingroup
+ \def\ZREF@refname@this{zref@np#1}%
+ \zref@labelbyprops\ZREF@refname@this{abspage}%
+ \chardef\ZREF@call=0 % unknown
+ \ZREF@ifrefundefined\ZREF@refname@this{%
+ }{%
+ \edef\ZREF@pagenum@this{%
+ \zref@extractdefault\ZREF@refname@this{abspage}{0}%
+ }%
+ \edef\ZREF@refname@next{%
+ \zref@thepage@name{%
+ \the\numexpr\ZREF@pagenum@this+1%
+ }%
+ }%
+ \ifnum\ZREF@pagenum@this>0 %
+ \ZREF@ifrefundefined{LastPage}{%
+ \zref@ifrefundefined\ZREF@refname@next{%
+ }{%
+ \chardef\ZREF@call=2 % next page
+ }%
+ }{%
+ \edef\ZREF@pagenum@last{%
+ \zref@extractdefault{LastPage}{abspage}{0}%
+ }%
+ \ifnum\ZREF@pagenum@this<\ZREF@pagenum@last\ltx@space
+ \ZREF@ifrefundefined\ZREF@refname@next{%
+ }{%
+ \chardef\ZREF@call=2 % next page
+ }%
+ \else
+ \ifnum\ZREF@pagenum@this=\ZREF@pagenum@this\ltx@space
+ \chardef\ZREF@call=1 % no next page
+ \fi
+ \fi
+ }%
+ \fi
+ }%
+ \edef\x{%
+ \endgroup
+ \ifcase\ZREF@call
+ \noexpand\ZREF@np@call@unknown{%
+ \noexpand\zunknownnextpagename
+ }%
+ \or
+ \noexpand\ZREF@np@call@nonext{%
+ \noexpand\znonextpagename
+ }%
+ \else
+ \noexpand\ZREF@np@call@next{%
+ \noexpand\zref@extract{\ZREF@refname@next}{page}%
+ }%
+ \fi
+ }%
+ \x
+}
+% \end{macrocode}
+% \begin{macrocode}
+%</nextpage>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{totpages}}
+%
+% \begin{macrocode}
+%<*totpages>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-totpages}%
+ [2019/11/29 v2.28 Module totpages for zref (HO)]%
+\RequirePackage{zref-base}[2019/11/29]
+\ifx\ZREF@base@ok Y%
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% The absolute page number of the last page is the total
+% page number.
+% \begin{macrocode}
+\RequirePackage{zref-abspage}[2019/11/29]
+\RequirePackage{zref-lastpage}[2019/11/29]
+% \end{macrocode}
+%
+% \begin{macro}{\ztotpages}
+% Macro \cs{ztotpages} contains the number of pages. It can be
+% used inside expandable calculations. It expands to zero if
+% the reference is not yet available.
+% \begin{macrocode}
+\newcommand*{\ztotpages}{%
+ \zref@extractdefault{LastPage}{abspage}{0}%
+}
+% \end{macrocode}
+% \end{macro}
+% Also we mark the reference |LastPage| as used:
+% \begin{macrocode}
+\AtBeginDocument{%
+ \zref@refused{LastPage}%
+}
+% \end{macrocode}
+% \begin{macrocode}
+%</totpages>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{pagelayout}}
+%
+% \begin{macrocode}
+%<*pagelayout>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-pagelayout}%
+ [2019/11/29 v2.28 Module pagelayout for zref (HO)]%
+\RequirePackage{zref-base}[2019/11/29]
+\ifx\ZREF@base@ok Y%
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+\RequirePackage{zref-thepage}[2019/11/29]
+\RequirePackage{iftex}[2019/11/07]%
+\RequirePackage{atveryend}[2010/03/24]
+% \end{macrocode}
+%
+% \subsubsection{Support for \hologo{LuaTeX}}
+%
+% \begin{macrocode}
+\ifluatex
+ \ifnum\luatexversion<39 %
+ \else
+ \begingroup
+ \escapechar=-1 %
+ \def\ZREF@temp#1{%
+ \ltx@IfUndefined{\string#1}{%
+ \let#1\ltx@undefined
+ \directlua{%
+ if tex.enableprimitives then %
+ tex.enableprimitives('', {'\string#1'})%
+ end%
+ }%
+ \ltx@ifundefined{\string#1}{%
+ }{%
+ \global#1=#1%
+ \@PackageInfoNoLine{zref-pagelayout}{%
+ \string#1 enabled%
+ }%
+ }%
+ }{}%
+ }%
+ \ZREF@temp\pdfpagewidth
+ \ZREF@temp\pdfpageheight
+ \ZREF@temp\pdfhorigin
+ \ZREF@temp\pdfvorigin
+ \endgroup
+ \fi
+\fi
+% \end{macrocode}
+%
+% \subsubsection{Define layout properties}
+%
+% \begin{macrocode}
+\def\ZREF@temp#1{%
+ \begingroup
+ \escapechar=-1 %
+ \ltx@ifundefined{\string#1}{\endgroup}{%
+ \edef\x{%
+ \endgroup
+ \noexpand\zref@newprop*{\string#1}%
+ [\noexpand\number\noexpand#1]% hash-ok
+ {\noexpand\number\noexpand#1}%
+ \noexpand\zref@addprop{thepage}{\string#1}%
+ }%
+ \x
+ }%
+}
+\ZREF@temp\mag
+\ZREF@temp\paperwidth
+\ZREF@temp\paperheight
+\ZREF@temp\stockwidth % memoir.cls, crop.sty
+\ZREF@temp\stockheight % memoir.cls, crop.sty
+\ZREF@temp\mediawidth % VTeX
+\ZREF@temp\mediaheight % VTeX
+\ZREF@temp\pdfpagewidth
+\ZREF@temp\pdfpageheight
+\ZREF@temp\pdfhorigin
+\ZREF@temp\pdfvorigin
+\ZREF@temp\hoffset
+\ZREF@temp\voffset
+\ZREF@temp\topmargin
+\ZREF@temp\oddsidemargin
+\ZREF@temp\evensidemargin
+\ZREF@temp\textwidth
+\ZREF@temp\textheight
+\ZREF@temp\headheight
+\ZREF@temp\headsep
+\ZREF@temp\footskip
+\ZREF@temp\marginparwidth
+\ZREF@temp\marginparsep
+\ZREF@temp\columnwidth
+\ZREF@temp\columnsep
+\ZREF@temp\trimedge % memoir.cls
+\ZREF@temp\spinemargin % memoir.cls
+\ZREF@temp\foremargin % memoir.cls
+\ZREF@temp\trimtop % memoir.cls
+\ZREF@temp\uppermargin % memoir.cls
+\ZREF@temp\headmargin % memoir.cls
+% \end{macrocode}
+%
+% \begin{macrocode}
+\zref@newprop*{outputboxwd}[0pt]{\AtBeginShipoutBoxWidth}
+% \end{macrocode}
+% \begin{macrocode}
+\zref@newprop*{outputboxht}[0pt]{\AtBeginShipoutBoxHeight}
+% \end{macrocode}
+% \begin{macrocode}
+\zref@newprop*{outputboxdp}[0pt]{\AtBeginShipoutBoxDepth}
+% \end{macrocode}
+% \begin{macrocode}
+\zref@addprops{thepage}{outputboxwd,outputboxht,outputboxdp}
+% \end{macrocode}
+%
+% \begin{macro}{\ifZREF@pl@list}
+% \begin{macrocode}
+\ltx@newif\ifZREF@pl@list
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@listpagelayout}
+% \begin{macrocode}
+\ZREF@IfDefinable\zlistpagelayout\def{%
+ {\global\ZREF@pl@listtrue}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@pl@AfterLastShipout}
+% \begin{macrocode}
+\def\ZREF@pl@AfterLastShipout{%
+ \ifZREF@pl@list
+ \edef\ZREF@page@max{\the\value{abspage}}%
+ \ltx@ifundefined{ZREF@org@testdef}{%
+ \let\ZREF@org@testdef\@testdef
+ \def\@testdef##1##2##3{%
+ \ZREF@org@testdef{##1}{##2}{##3}%
+ \def\ZREF@temp{##1}%
+ \ifx\ZREF@temp\ZREF@RefPrefix
+ \expandafter\gdef\csname##1@##2\endcsname{##3}%
+ \fi
+ }%
+ }{}%
+ \AtVeryEndDocument{\ZREF@pl@AtVeryEnd}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@pl@AtVeryEnd}
+% \begin{macrocode}
+\def\ZREF@pl@AtVeryEnd{%
+ \begingroup
+ \toks@{Page layout parameters:\MessageBreak}%
+ \count@=1 %
+ \ZREF@pl@ListPage
+ \edef\x{\endgroup
+ \noexpand\@PackageInfoNoLine{zref-pagelayout}{\the\toks@}%
+ }%
+ \x
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@pl@ListPage}
+% \begin{macrocode}
+\def\ZREF@pl@ListPage{%
+ \edef\x{%
+ \toks@={%
+ \the\toks@
+ Page \the\count@:\noexpand\MessageBreak
+ \zref@ifrefundefined{thepage\the\count@}{}{%
+ \ltx@space\ltx@space mag = %
+ \zref@extract{thepage\the\count@}{mag}%
+ \noexpand\MessageBreak
+ \ZREF@pl@ListEntry{paperwidth}%
+ \ZREF@pl@ListEntry{paperheight}%
+ \ZREF@pl@ListEntry{stockwidth}%
+ \ZREF@pl@ListEntry{stockheight}%
+ \ZREF@pl@ListEntry{mediawidth}%
+ \ZREF@pl@ListEntry{mediaheight}%
+ \ZREF@pl@ListEntry{pdfpagewidth}%
+ \ZREF@pl@ListEntry{pdfpageheight}%
+ \ZREF@pl@ListEntry{pdfhorigin}%
+ \ZREF@pl@ListEntry{pdfvorigin}%
+ \ZREF@pl@ListEntry{hoffset}%
+ \ZREF@pl@ListEntry{voffset}%
+ \ZREF@pl@ListEntry{topmargin}%
+ \ZREF@pl@ListEntry{oddsidemargin}%
+ \ZREF@pl@ListEntry{evensidemargin}%
+ \ZREF@pl@ListEntry{textwidth}%
+ \ZREF@pl@ListEntry{textheight}%
+ \ZREF@pl@ListEntry{headheight}%
+ \ZREF@pl@ListEntry{headsep}%
+ \ZREF@pl@ListEntry{footskip}%
+ \ZREF@pl@ListEntry{marginparwidth}%
+ \ZREF@pl@ListEntry{marginparsep}%
+ \ZREF@pl@ListEntry{columnwidth}%
+ \ZREF@pl@ListEntry{columnsep}%
+ \ZREF@pl@ListEntry{trimedge}%
+ \ZREF@pl@ListEntry{spinemargin}%
+ \ZREF@pl@ListEntry{foremargin}%
+ \ZREF@pl@ListEntry{trimtop}%
+ \ZREF@pl@ListEntry{uppermargin}%
+ \ZREF@pl@ListEntry{headmargin}%
+ }%
+ }%
+ }\x
+ \ifnum\ZREF@page@max>\count@
+ \advance\count@ by\ltx@one
+ \else
+ \expandafter\ltx@gobble
+ \fi
+ \ZREF@pl@ListPage
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@pl@ListEntry}
+% \begin{macrocode}
+\def\ZREF@pl@ListEntry#1{%
+ \zref@ifpropundefined{#1}{%
+ }{%
+ \zref@ifrefcontainsprop{thepage\the\count@}{#1}{%
+ \ltx@space\ltx@space#1 = %
+ \zref@extract{thepage\the\count@}{#1}sp = %
+ \the\dimexpr\zref@extract{thepage\the\count@}{#1}sp\relax
+ \noexpand\MessageBreak
+ }{}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\AfterLastShipout{%
+ \ZREF@pl@AfterLastShipout
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</pagelayout>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{pageattr}}
+%
+% \begin{macrocode}
+%<*pageattr>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-pageattr}%
+ [2019/11/29 v2.28 Module pageattr for zref (HO)]%
+\RequirePackage{zref-base}[2019/11/29]
+\ifx\ZREF@base@ok Y%
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+\RequirePackage{iftex}[2019/11/07]%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ifluatex
+ \ifnum\luatexversion<39 %
+ \else
+ \begingroup
+ \escapechar=-1 %
+ \def\ZREF@temp#1{%
+ \ltx@IfUndefined{\string#1}{%
+ \let#1\ltx@undefined
+ \directlua{%
+ if tex.enableprimitives then %
+ tex.enableprimitives('', {'\string#1'})%
+ end%
+ }%
+ \ltx@ifundefined{\string#1}{%
+ }{%
+ \global#1=#1%
+ \@PackageInfoNoLine{zref-pageattr}{%
+ \string#1 enabled%
+ }%
+ }%
+ }{}%
+ }%
+ \ZREF@temp\pdfpageattr
+ \ZREF@temp\pdfpagesattr
+ \endgroup
+ \fi
+\fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\ZREF@temp=N%
+\ltx@IfUndefined{pdfpageattr}{%
+ \@PackageInfoNoLine{zref-pageattr}{%
+ \string\pdfpageattr\space is not available%
+ }%
+ \def\zref@pdfpageattr#1{}%
+ \def\zref@pdfpageattr@used#1{}%
+}{%
+ \RequirePackage{zref-thepage}[2019/11/29]%
+ \zref@newprop*{pdfpageattr}[]{\zref@hex{\the\pdfpageattr}}%
+ \zref@addprop{thepage}{pdfpageattr}%
+ \let\ZREF@temp=Y%
+}
+\ltx@IfUndefined{pdfpagesattr}{%
+ \@PackageInfoNoLine{zref-pageattr}{%
+ \string\pdfpagesattr\space is not available%
+ }%
+ \def\zref@pdfpagesattr{}%
+ \def\zref@pdfpagesattr@used{}%
+}{%
+ \RequirePackage{zref-lastpage}[2019/11/29]%
+ \zref@newprop*{pdfpagesattr}[]{\zref@hex{\the\pdfpagesattr}}%
+ \zref@addprop{LastPage}{pdfpagesattr}%
+ \let\ZREF@temp=Y%
+}%
+% \end{macrocode}
+% \begin{macrocode}
+\ifx\ZREF@temp N%
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+% \begin{macrocode}
+\RequirePackage{zref-abspage}[2019/11/29]
+\RequirePackage{atveryend}[2010/03/24]
+\RequirePackage{pdftexcmds}[2010/04/01]
+\let\ZREF@temp=Y%
+\ltx@IfUndefined{pdf@escapehex}{\let\ZREF@temp=N}{}
+\ltx@IfUndefined{pdf@unescapehex}{\let\ZREF@temp=N}{}
+\ifx\ZREF@temp N%
+ \let\zref@hex\ltx@firstofone
+ \let\zref@unhex\ltx@firstofone
+\else
+ \let\zref@hex\pdf@escapehex
+ \let\zref@unhex\pdf@unescapehex
+\fi
+% \end{macrocode}
+%
+% \begin{macro}{\ifZREF@pa@list}
+% \begin{macrocode}
+\ltx@newif\ifZREF@pa@list
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@listpageattr}
+% \begin{macrocode}
+\ZREF@IfDefinable\zlistpageattr\def{%
+ {\ZREF@pa@listtrue}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@pa@AfterLastShipout}
+% \begin{macrocode}
+\def\ZREF@pa@AfterLastShipout{%
+ \ifZREF@pa@list
+ \edef\ZREF@page@max{\the\value{abspage}}%
+ \ltx@ifundefined{ZREF@org@testdef}{%
+ \let\ZREF@org@testdef\@testdef
+ \def\@testdef##1##2##3{%
+ \ZREF@org@testdef{##1}{##2}{##3}%
+ \def\ZREF@temp{##1}%
+ \ifx\ZREF@temp\ZREF@RefPrefix
+ \expandafter\xdef\csname##1@##2\endcsname{##3}%
+ \fi
+ }%
+ }{}%
+ \AtVeryEndDocument{\ZREF@pa@AtVeryEnd}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@pa@AtVeryEnd}
+% \begin{macrocode}
+\ltx@IfUndefined{pdfpageattr}{%
+ \def\ZREF@pa@AtVeryEnd{}%
+}{%
+ \def\ZREF@pa@AtVeryEnd{%
+ \begingroup
+ \toks@{List of \ltx@backslashchar pdfpageattr:\MessageBreak}%
+ \count@=1 %
+ \ZREF@pa@ListPage
+ \edef\x{\endgroup
+ \noexpand\@PackageInfoNoLine{zref-pageattr}{%
+ \the\toks@
+ }%
+ }%
+ \x
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@pageattr}
+% \begin{macrocode}
+\def\zref@pageattr#1{%
+ \zref@unhex{%
+ \zref@extract{thepage\ZREF@number{#1}}{pdfpageattr}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@pageattr@used}
+% \begin{macrocode}
+\ZREF@Robust\def\zref@pageattr@used#1{%
+ \zref@refused{thepage\ZREF@number{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@pa@ListPage}
+% \begin{macrocode}
+ \def\ZREF@pa@ListPage{%
+ \edef\x{%
+ \toks@={%
+ \the\toks@
+ Page \the\count@:%
+ \noexpand\MessageBreak
+ \zref@ifrefundefined{thepage\the\count@}{}{%
+ <<\zref@pdfpageattr\count@>>%
+ \noexpand\MessageBreak
+ }%
+ }%
+ }\x
+ \ifnum\ZREF@page@max>\count@
+ \advance\count@ by\ltx@one
+ \else
+ \expandafter\ltx@gobble
+ \fi
+ \ZREF@pa@ListPage
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\ltx@IfUndefined{pdfpagesattr}{%
+}{%
+% \end{macrocode}
+% \begin{macro}{\zref@pdfpagesattr}
+% \begin{macrocode}
+ \def\zref@pdfpagesattr{%
+ \zref@unhex{%
+ \zref@extract{LastPage}{pdfpagesattr}%
+ }%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@pdfpagesattr@used}
+% \begin{macrocode}
+ \ZREF@Robust\def\zref@pdfpagesattr@used{%
+ \zref@refused{LastPage}%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+ \ltx@LocalAppendToMacro\ZREF@pa@AtVeryEnd{%
+ \@PackageInfoNoLine{zref-pageattr}{%
+ \ltx@backslashchar pdfpagesattr:\MessageBreak
+ <<\zref@pdfpagesattr>>%
+ \MessageBreak
+ }%
+ }%
+}
+\AfterLastShipout{%
+ \ZREF@pa@AfterLastShipout
+}
+% \end{macrocode}
+% \begin{macrocode}
+%</pageattr>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{marks}}
+%
+% \begin{macrocode}
+%<*marks>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-marks}%
+ [2019/11/29 v2.28 Module marks for zref (HO)]%
+\RequirePackage{zref-base}[2019/11/29]
+\ifx\ZREF@base@ok Y%
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand*{\zref@marks@register}[3][]{%
+ \edef\ZREF@TempName{#1}%
+ \edef\ZREF@TempNum{\ZREF@number{#2}}%
+ \ifnum\ZREF@TempNum<\ltx@zero %
+ \PackageError\ZREF@name{%
+ \string\zref@marks@register\ltx@space is called with invalid%
+ \MessageBreak
+ marks register number (\ZREF@TempNum)%
+ }{%
+ Use `0' or the command, defined by \string\newmarks.\MessageBreak
+ \@ehc
+ }%
+ \else
+ \ifx\ZREF@TempName\ltx@empty
+ \edef\ZREF@TempName{mark\romannumeral\ZREF@TempNum}%
+ \else
+ \edef\ZREF@TempName{marks\ZREF@TempName}%
+ \fi
+ \ZREF@MARKS@DefineProp{top}%
+ \ZREF@MARKS@DefineProp{first}%
+ \ZREF@MARKS@DefineProp{bot}%
+ \kv@parse{#3}{%
+ \ifx\kv@value\relax
+ \def\kv@value{top,first,bot}%
+ \fi
+ \edef\ZREF@temp{\expandafter\ltx@car\kv@key X\@nil}%
+ \ifx\ZREF@temp\ZREF@STAR
+ \edef\kv@key{\expandafter\ltx@cdr\kv@key\@nil}%
+ \zref@newlist\kv@key
+ \fi
+ \expandafter\comma@parse\expandafter{\kv@value}{%
+ \ifcase0\ifx\comma@entry\ZREF@NAME@top 1\else
+ \ifx\comma@entry\ZREF@NAME@first 1\else
+ \ifx\comma@entry\ZREF@NAME@bot 1\fi\fi\fi\ltx@space
+ \PackageWarning{zref-marks}{%
+ Use `top', `first' or `bot' for the list values%
+ \MessageBreak
+ in the third argument of \string\zref@marks@register.%
+ \MessageBreak
+ Ignoring unkown value `\comma@entry'%
+ }%
+ \else
+ \zref@addprop{\kv@key}{\comma@entry\ZREF@TempName}%
+ \fi
+ \ltx@gobble
+ }%
+ \ltx@gobbletwo
+ }%
+ \fi
+}
+\def\ZREF@STAR{*}
+\def\ZREF@NAME@top{top}
+\def\ZREF@NAME@first{first}
+\def\ZREF@NAME@bot{bot}
+\def\ZREF@MARKS@DefineProp#1{%
+ \zref@ifpropundefined{#1\ZREF@TempName}{%
+ \ifnum\ZREF@TempNum=\ltx@zero
+ \begingroup
+ \edef\x{\endgroup
+ \noexpand\zref@newprop*{#1\ZREF@TempName}[]{%
+ \expandafter\noexpand\csname#1mark\endcsname
+ }%
+ }%
+ \x
+ \else
+ \begingroup
+ \edef\x{\endgroup
+ \noexpand\zref@newprop*{#1\ZREF@TempName}[]{%
+ \expandafter\noexpand\csname#1marks\endcsname
+ \ZREF@TempNum
+ }%
+ }%
+ \x
+ \fi
+ }{%
+ \PackageWarning{zref-marks}{%
+ \string\zref@marks@register\ltx@space does not generate the%
+ \MessageBreak
+ new property `#1\ZREF@TempName', because\MessageBreak
+ it is already defined%
+ }%
+ }%
+}
+% \end{macrocode}
+% \begin{macrocode}
+%</marks>
+% \end{macrocode}
+%
+% \subsection{Module \xmodule{runs}}
+%
+% This module does not use the label-reference-system.
+% The reference changes with each \hologo{LaTeX}~run and would
+% force a rerun warning always.
+% \begin{macrocode}
+%<*runs>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-runs}%
+ [2019/11/29 v2.28 Module runs for zref (HO)]%
+% \end{macrocode}
+%
+% \begin{macro}{\zruns}
+% \begin{macrocode}
+\providecommand*{\zruns}{0}%
+\AtBeginDocument{%
+ \edef\zruns{\number\numexpr\zruns+1}%
+ \begingroup
+ \def\on@line{}%
+ \PackageInfo{zref-runs}{LaTeX runs: \zruns}%
+ \if@filesw
+ \immediate\write\@mainaux{%
+ \string\gdef\string\zruns{\zruns}%
+ }%
+ \fi
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</runs>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{perpage}}
+%
+% \begin{macrocode}
+%<*perpage>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-perpage}%
+ [2019/11/29 v2.28 Module perpage for zref (HO)]%
+\RequirePackage{zref-base}[2019/11/29]
+\ifx\ZREF@base@ok Y%
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% This module resets a counter at page boundaries.
+% Because of the asynchronous output routine
+% page counter properties cannot be asked directly,
+% references are necessary.
+%
+% For detecting changed pages module \xmodule{abspage}
+% is loaded.
+% \begin{macrocode}
+\RequirePackage{zref-abspage}[2019/11/29]
+% \end{macrocode}
+%
+% We group the properties for the needed references
+% in the property list |perpage|. The property |pagevalue|
+% records the correct value of the page counter.
+% \begin{macrocode}
+\ZREF@NewPropPageValue
+\zref@newlist{perpage}
+\zref@addprops{perpage}{abspage,page,pagevalue}
+% \end{macrocode}
+% The page value, known by the reference mechanism, will be
+% stored in counter |zpage|.
+% \begin{macrocode}
+\newcounter{zpage}
+% \end{macrocode}
+% Counter |zref@unique| helps in generating unique reference
+% names.
+% \begin{macrocode}
+\zref@require@unique
+% \end{macrocode}
+% In order to be able to reset the counter, we hook here
+% into \cs{stepcounter}. In fact two nested hooks are used
+% to allow other packages to use the first hook at the beginning
+% of \cs{stepcounter}.
+% \begin{macrocode}
+\let\ZREF@org@stepcounter\stepcounter
+\def\stepcounter#1{%
+ \ifcsname @stepcounterhook@#1\endcsname
+ \csname @stepcounterhook@#1\endcsname
+ \fi
+ \ZREF@org@stepcounter{#1}%
+}
+% \end{macrocode}
+% \cs{@stpelt} must be adapted due to the change in latex
+% 2015-01, see https://github.com/ho-tex/zref/issues/26
+% \begin{macrocode}
+\let\ZREF@org@@stpelt\@stpelt
+\def\@stpelt#1{%
+ \ifcsname ZREF@perpage@#1\endcsname
+ \begingroup
+ \let\stepcounter\ZREF@org@stepcounter
+ \ZREF@org@@stpelt{#1}%
+ \endgroup
+ \expandafter\ltx@gobbletwo
+ \fi
+ \ZREF@org@@stpelt{#1}%
+}
+% \end{macrocode}
+%
+% \begin{macro}{\zmakeperpage}
+% Makro \cs{zmakeperpage} resets a counter at each page
+% break. It uses the same syntax and semantics as
+% \cs{MakePerPage} from package \xpackage{perpage} \cite{perpage}.
+% The initial start value can be given by the optional
+% argument. Default is one that means after the first
+% \cs{stepcounter} on a new page the counter starts with
+% one.
+% \begin{macrocode}
+\ZREF@IfDefinable\zmakeperpage\def{%
+ {%
+ \@ifnextchar[\ZREF@makeperpage@opt{\ZREF@@makeperpage[\ltx@zero]}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% We hook before the counter is incremented in \cs{stepcounter},
+% package \xpackage{perpage} afterwards. Thus a little
+% calculation is necessary.
+% \begin{macrocode}
+\def\ZREF@makeperpage@opt[#1]{%
+ \begingroup
+ \edef\x{\endgroup
+ \noexpand\ZREF@@makeperpage[\number\numexpr#1-1\relax]%
+ }%
+ \x
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\ZREF@@makeperpage[#1]#2{%
+ \@ifundefined{@stepcounterhook@#2}{%
+ \expandafter\gdef\csname @stepcounterhook@#2\endcsname{}%
+ }{}%
+ \expandafter\gdef\csname ZREF@perpage@#2\endcsname{%
+ \ZREF@@perpage@step{#2}{#1}%
+ }%
+ \expandafter\g@addto@macro\csname @stepcounterhook@#2\endcsname{%
+ \ifcsname ZREF@perpage@#2\endcsname
+ \csname ZREF@perpage@#2\endcsname
+ \fi
+ }%
+}
+% \end{macrocode}
+% \begin{macro}{\ZREF@@perpage@step}
+% The heart of this module follows.
+% \begin{macrocode}
+\def\ZREF@@perpage@step#1#2{%
+% \end{macrocode}
+% First the reference is generated.
+% \begin{macrocode}
+ \global\advance\c@zref@unique\ltx@one
+ \begingroup
+ \expandafter
+ \zref@labelbylist\expandafter{\thezref@unique}{perpage}%
+% \end{macrocode}
+% The \cs{expandafter} commands are necessary, because \cs{ZREF@temp}
+% is also used inside of \cs{zref@labelbylist}.
+%
+% The evaluation of the reference follows. If the reference
+% is not yet kwown, we use the page counter as approximation.
+% \begin{macrocode}
+ \zref@ifrefundefined\thezref@unique{%
+ \global\c@zpage=\c@page
+ \global\let\thezpage\thepage
+ \expandafter\xdef\csname ZREF@abspage@#1\endcsname{%
+ \number\c@abspage
+ }%
+ }{%
+% \end{macrocode}
+% The reference is used to set \cs{thezpage} and counter |zpage|.
+% \begin{macrocode}
+ \global\c@zpage=\zref@extract\thezref@unique{pagevalue}\relax
+ \xdef\thezpage{\noexpand\zref@extract{\thezref@unique}{page}}%
+ \expandafter\xdef\csname ZREF@abspage@#1\endcsname{%
+ \zref@extractdefault\thezref@unique
+ {abspage}{\number\c@abspage}%
+ }%
+ }%
+% \end{macrocode}
+% Page changes are detected by a changed absolute page number.
+% \begin{macrocode}
+ \expandafter\ifx\csname ZREF@abspage@#1\expandafter\endcsname
+ \csname ZREF@currentabspage@#1\endcsname
+ \else
+ \global\csname c@#1\endcsname=#2\relax
+ \global\expandafter\let
+ \csname ZREF@currentabspage@#1\expandafter\endcsname
+ \csname ZREF@abspage@#1\endcsname
+ \fi
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zunmakeperpage}
+% Macro \cs{zunmakeperpage} cancels the effect of \cs{zmakeperpage}.
+% \begin{macrocode}
+\ZREF@IfDefinable\zunmakeperpage\def{%
+ #1{%
+ \global\expandafter
+ \let\csname ZREF@perpage@#1\endcsname\@undefined
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</perpage>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{titleref}}
+%
+% \begin{macrocode}
+%<*titleref>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-titleref}%
+ [2019/11/29 v2.28 Module titleref for zref (HO)]%
+\RequirePackage{zref-base}[2019/11/29]
+\ifx\ZREF@base@ok Y%
+\else
+ \expandafter\endinput
+\fi
+\RequirePackage{gettitlestring}[2009/12/08]
+% \end{macrocode}
+%
+% \subsubsection{Implementation}
+% \begin{macrocode}
+\RequirePackage{keyval}
+% \end{macrocode}
+%
+% This module makes section and caption titles available
+% for the reference system. It uses some of the ideas
+% of package \xpackage{nameref} and \xpackage{titleref}.
+%
+% Now we can add the property \verb|title| is added to
+% the main property list.
+% \begin{macrocode}
+\ZREF@NewPropTitle
+\zref@addprop\ZREF@mainlist{title}%
+% \end{macrocode}
+%
+% The title strings go into the \xfile{.aux} file, thus
+% they need some kind of protection.
+% Package \xpackage{titleref} uses a protected expansion
+% method. The advantage is that this can be used to
+% cleanup the string and to remove \cs{label}, \cs{index}
+% and other macros unwanted for referencing.
+% But there is the risk that fragile stuff can break.
+%
+% Therefore package \xpackage{nameref} does not expand
+% the string. Thus the entries can safely be written to
+% the \xfile{.aux} file. But potentially dangerous
+% macros such as \cs{label} remain in the string and
+% can cause problems when using the string in references.
+%
+% \begin{macro}{\ifzref@titleref@expand}
+% The switch \cs{ifzref@titleref@expand} distinguishes
+% between the both methods. Package \xpackage{nameref}'s
+% behaviour is achieved by setting the switch to false,
+% otherwise \xpackage{titleref}'s expansion is used.
+% Default is false.
+% \begin{macrocode}
+\newif\ifzref@titleref@expand
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@titleref@hook}
+% The hook \cs{ZREF@titleref@hook} allows to extend
+% the cleanup for the expansion method. Thus
+% unnecessary macros can be removed or dangerous commands
+% removed. The hook is executed before the expansion of
+% \cs{zref@titleref@current}.
+% \begin{macrocode}
+\let\ZREF@titleref@hook\ltx@empty
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zref@titleref@cleanup}
+% The hook should not be used directly, instead we provide the
+% macro \cs{zref@titleref@cleanup} to add stuff to the hook
+% and prevents that a previous non-empty content is not discarded
+% accidently.
+% \begin{macrocode}
+\ZREF@Robust\def\zref@titleref@cleanup#1{%
+ \begingroup
+ \toks@\expandafter{%
+ \ZREF@titleref@hook
+ #1%
+ }%
+ \expandafter\endgroup
+ \expandafter\def\expandafter\ZREF@titleref@hook\expandafter{%
+ \the\toks@
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifzref@titleref@stripperiod}
+% Sometimes a title contains a period at the end.
+% Package \xpackage{nameref} removes this. This behaviour
+% is controlled by the switch \cs{ifzref@titleref@stripperiod}
+% and works regardless of the setting of option \xoption{expand}.
+% Period stripping is the default.
+% \begin{macrocode}
+\newif\ifzref@titleref@stripperiod
+\zref@titleref@stripperiodtrue
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@titleref@setcurrent}
+% Macro \cs{zref@titleref@setcurrent} sets a new current title
+% stored in \cs{zref@titleref@current}. Some cleanup and
+% expansion is performed that can be controlled by the
+% previous switches.
+% \begin{macrocode}
+\ZREF@Robust\def\zref@titleref@setcurrent#1{%
+ \ifzref@titleref@expand
+ \GetTitleStringExpand{#1}%
+ \else
+ \GetTitleStringNonExpand{#1}%
+ \fi
+ \edef\zref@titleref@current{%
+ \detokenize\expandafter{\GetTitleStringResult}%
+ }%
+ \ifzref@titleref@stripperiod
+ \edef\zref@titleref@current{%
+ \expandafter\ZREF@stripperiod\zref@titleref@current
+ \ltx@empty.\ltx@empty\@nil
+ }%
+ \fi
+}%
+\GetTitleStringDisableCommands{%
+ \ZREF@titleref@hook
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@stripperiod}
+% If \cs{ZREF@stripperiod} is called, the argument consists of
+% space tokens and tokens with catcode 12 (other), because
+% of \hologo{eTeX}'s \cs{detokenize}.
+% \begin{macrocode}
+\def\ZREF@stripperiod#1.\ltx@empty#2\@nil{#1}%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{User interface}
+%
+% \begin{macro}{\ztitlerefsetup}
+% The behaviour of module \xmodule{titleref} is controlled
+% by switches and a hook. They can be set by \cs{ztitlerefsetup}
+% with a key value interface, provided by package \xpackage{keyval}.
+% Also the current title can be given explicitly by the key
+% \verb|title|.
+% \begin{macrocode}
+\define@key{ZREF@TR}{expand}[true]{%
+ \csname zref@titleref@expand#1\endcsname
+}%
+\define@key{ZREF@TR}{stripperiod}[true]{%
+ \csname zref@titleref@stripperiod#1\endcsname
+}%
+\define@key{ZREF@TR}{cleanup}{%
+ \zref@titleref@cleanup{#1}%
+}%
+\define@key{ZREF@TR}{title}{%
+ \def\zref@titleref@current{#1}%
+}%
+\ZREF@IfDefinable\ztitlerefsetup\def{%
+ {\kvsetkeys{ZREF@TR}}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ztitleref}
+% The user command \cs{ztitleref} references the title.
+% For safety \cs{label} is disabled to prevent multiply
+% defined references.
+% \begin{macrocode}
+\ZREF@IfDefinable\ztitleref\def{%
+ {\zref@wrapper@babel\ZREF@titleref}%
+}%
+\def\ZREF@titleref#1{%
+ \begingroup
+ \zref@refused{#1}%
+ \let\label\ltx@gobble
+ \zref@extract{#1}{title}%
+ \endgroup
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Patches for section and caption commands}
+%
+% The section and caption macros are patched to extract the
+% title data.
+%
+% Captions of figures and tables.
+% \begin{macrocode}
+\AtBeginDocument{%
+ \ZREF@patch{@caption}{%
+ \long\def\@caption#1[#2]{%
+ \zref@titleref@setcurrent{#2}%
+ \ZREF@org@@caption{#1}[{#2}]%
+ }%
+ }%
+% \end{macrocode}
+%
+% Section commands without star. The title version for the
+% table of contents is used because it is usually shorter and
+% more robust.
+% \begin{macrocode}
+ \ZREF@patch{@part}{%
+ \def\@part[#1]{%
+ \zref@titleref@setcurrent{#1}%
+ \ZREF@org@@part[{#1}]%
+ }%
+ }%
+ \ZREF@patch{@chapter}{%
+ \def\@chapter[#1]{%
+ \zref@titleref@setcurrent{#1}%
+ \ZREF@org@@chapter[{#1}]%
+ }%
+ }%
+ \ZREF@patch{@sect}{%
+ \def\@sect#1#2#3#4#5#6[#7]{%
+ \zref@titleref@setcurrent{#7}%
+ \ZREF@org@@sect{#1}{#2}{#3}{#4}{#5}{#6}[{#7}]%
+ }%
+ }%
+% \end{macrocode}
+% The star versions of the section commands.
+% \begin{macrocode}
+ \ZREF@patch{@spart}{%
+ \def\@spart#1{%
+ \zref@titleref@setcurrent{#1}%
+ \ZREF@org@@spart{#1}%
+ }%
+ }%
+ \ZREF@patch{@schapter}{%
+ \def\@schapter#1{%
+ \zref@titleref@setcurrent{#1}%
+ \ZREF@org@@schapter{#1}%
+ }%
+ }%
+ \ZREF@patch{@ssect}{%
+ \def\@ssect#1#2#3#4#5{%
+ \zref@titleref@setcurrent{#5}%
+ \ZREF@org@@ssect{#1}{#2}{#3}{#4}{#5}%
+ }%
+ }%
+% \end{macrocode}
+%
+% \subsubsection{Environment \textsf{description}}
+%
+% \begin{macrocode}
+ \ZREF@patch{descriptionlabel}{%
+ \def\descriptionlabel#1{%
+ \zref@titleref@setcurrent{#1}%
+ \ZREF@org@descriptionlabel{#1}%
+ }%
+ }%
+% \end{macrocode}
+%
+% \subsubsection{Class \xclass{memoir}}
+%
+% \begin{macrocode}
+ \@ifclassloaded{memoir}{%
+ \ltx@IfUndefined{ifheadnameref}{}{%
+ \def\@chapter[#1]#2{%
+ \ltx@IfUndefined{ch@pt@c}{%
+ \zref@titleref@setcurrent{#1}%
+ }{%
+ \ifx\ch@pt@c\ltx@empty
+ \zref@titleref@setcurrent{#2}%
+ \else
+ \def\NR@temp{#1}%
+ \ifx\NR@temp\ltx@empty
+ \expandafter\zref@titleref@setcurrent
+ \expandafter{\ch@pt@c}%
+ \else
+ \ifheadnameref
+ \zref@titleref@setcurrent{#1}%
+ \else
+ \expandafter\zref@titleref@setcurrent
+ \expandafter{\ch@pt@c}%
+ \fi
+ \fi
+ \fi
+ }%
+ \ZREF@org@@chapter[{#1}]{#2}%
+ }%
+ \ZREF@patch{M@sect}{%
+ \def\M@sect#1#2#3#4#5#6[#7][#8]{%
+ \ifheadnameref
+ \zref@titleref@setcurrent{#8}%
+ \else
+ \zref@titleref@setcurrent{#7}%
+ \fi
+ \ZREF@org@M@sect{#1}{#2}{#3}{#4}{#5}{#6}[{#7}][{#8}]%
+ }%
+ }%
+ }%
+ }{}%
+% \end{macrocode}
+%
+% \subsubsection{Class \xclass{beamer}}
+%
+% \begin{macrocode}
+ \@ifclassloaded{beamer}{%
+ \ZREF@patch{beamer@section}{%
+ \long\def\beamer@section[#1]{%
+ \zref@titleref@setcurrent{#1}%
+ \ZREF@org@beamer@section[{#1}]%
+ }%
+ }%
+ \ZREF@patch{beamer@subsection}{%
+ \long\def\beamer@subsection[#1]{%
+ \zref@titleref@setcurrent{#1}%
+ \ZREF@org@beamer@subsection[{#1}]%
+ }%
+ }%
+ \ZREF@patch{beamer@subsubsection}{%
+ \long\def\beamer@subsubsection[#1]{%
+ \zref@titleref@setcurrent{#1}%
+ \ZREF@org@beamer@subsubsection[{#1}]%
+ }%
+ }%
+ }{}%
+% \end{macrocode}
+%
+% \subsubsection{Package \xpackage{titlesec}}
+%
+% \begin{macrocode}
+ \@ifpackageloaded{titlesec}{%
+ \ZREF@patch{ttl@sect@i}{%
+ \def\ttl@sect@i#1#2[#3]#4{%
+ \zref@titleref@setcurrent{#4}%
+ \ZREF@org@ttl@sect@i{#1}{#2}[{#3}]{#4}%
+ }%
+ }%
+ \ZREF@patch{ttl@straight@i}{%
+ \def\ttl@straight@i#1[#2]#3{%
+ \def\ZREF@temp{#2}%
+ \ifx\ZREF@temp\ltx@empty
+ \zref@titleref@setcurrent{#3}%
+ \else
+ \zref@titleref@setcurrent{#2}%
+ \fi
+ \ZREF@org@ttl@straight@i{#1}[{#2}]{#3}%
+ }%
+ }%
+ }{}%
+% \end{macrocode}
+%
+% \subsubsection{Package \xpackage{longtable}}
+%
+% Package \xpackage{longtable}: some support for its \cs{caption}.
+% However \cs{label} inside the caption is not supported.
+% \begin{macrocode}
+ \@ifpackageloaded{longtable}{%
+ \ZREF@patch{LT@c@ption}{%
+ \def\LT@c@ption#1[#2]#3{%
+ \ZREF@org@LT@c@ption{#1}[{#2}]{#3}%
+ \zref@titleref@setcurrent{#2}%
+ }%
+ }%
+ }{}%
+% \end{macrocode}
+%
+% \subsubsection{Package \xpackage{listings}}
+%
+% Package \xpackage{listings}: support for its caption.
+% \begin{macrocode}
+ \@ifpackageloaded{listings}{%
+ \ZREF@patch{lst@MakeCaption}{%
+ \def\lst@MakeCaption{%
+ \ifx\lst@label\ltx@empty
+ \else
+ \expandafter\zref@titleref@setcurrent\expandafter{%
+ \lst@@caption
+ }%
+ \fi
+ \ZREF@org@lst@MakeCaption
+ }%
+ }%
+ }{}%
+% \end{macrocode}
+%
+% \subsubsection{Theorems}
+%
+% \begin{macrocode}
+ \ZREF@patch{@opargbegintheorem}{%
+ \def\@opargbegintheorem#1#2#3{%
+ \zref@titleref@setcurrent{#3}%
+ \ZREF@org@@opargbegintheorem{#1}{#2}{#3}%
+ }%
+ }%
+ \@ifpackageloaded{amsthm}{%
+ \begingroup
+ \edef\x{macro:\string#1\string#2[\string#3]}%
+ \@onelevel@sanitize\x
+ \def\y#1->#2\@nil{#1}%
+ \edef\z{\expandafter\y\meaning\@begintheorem->\@nil}%
+ \@onelevel@sanitize\z
+ \expandafter\endgroup
+ \ifx\x\z
+ \ZREF@patch{@begintheorem}{%
+ \def\@begintheorem#1#2[#3]{%
+ \zref@titleref@setcurrent{#3}%
+ \ZREF@org@@begintheorem{#1}{#2}[{#3}]%
+ }%
+ }%
+ \fi
+ }{}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</titleref>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{xr}}
+%
+% \begin{macrocode}
+%<*xr>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-xr}%
+ [2019/11/29 v2.28 Module xr for zref (HO)]%
+\RequirePackage{zref-base}[2019/11/29]
+\ifx\ZREF@base@ok Y%
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+% \begin{macrocode}
+\RequirePackage{keyval}
+\RequirePackage{kvoptions}[2010/02/22]
+% \end{macrocode}
+%
+% We declare property |url|, because this is added,
+% if a reference is imported and has not already set this field.
+% Or if |hyperref| is used, then this property can be asked.
+% \begin{macrocode}
+\zref@newprop{url}{}%
+\zref@newprop{urluse}{}%
+% \end{macrocode}
+% \begin{macrocode}
+\zref@newprop{externaldocument}{}%
+% \end{macrocode}
+%
+% Most code, especially the handling of the \xfile{.aux}
+% files are taken from David Carlisle's \xpackage{xr} package.
+% Therefore I drop the documentation for these macros here.
+%
+% \begin{macro}{\zref@xr@ext}
+% If the URL is not specied, then assume
+% processed file with a guessed extension.
+% Use the setting of \xpackage{hyperref} if available.
+% \begin{macrocode}
+\providecommand*{\zref@xr@ext}{%
+ \ltx@ifundefined{XR@ext}{pdf}{\XR@ext}%
+}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ifZREF@xr@zreflabel}
+% The use of the star form of \cs{zexternaldocument}
+% is remembered in the switch \cs{ifZREF@xr@zreflabel}.
+% \begin{macrocode}
+\newif\ifZREF@xr@zreflabel
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\SetupKeyvalOptions{%
+ family=ZREF@XR,%
+ prefix=ZREF@xr@%
+}
+\DeclareBoolOption[true]{tozreflabel}
+\DeclareBoolOption[false]{toltxlabel}
+\DeclareBoolOption{verbose}
+\define@key{ZREF@XR}{ext}{%
+ \def\zref@xr@{#1}%
+}
+\DeclareBoolOption[false]{urluse}
+% \end{macrocode}
+% \begin{macro}{\zxrsetup}
+% \begin{macrocode}
+\newcommand*{\zxrsetup}{%
+ \kvsetkeys{ZREF@XR}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@xr@URL}
+% \begin{macrocode}
+\newcount\ZREF@xr@URL
+\ZREF@xr@URL=\ltx@zero
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@xr@AddURL}
+% \begin{macrocode}
+\def\ZREF@xr@AddURL#1{%
+ \begingroup
+ \def\ZREF@temp{#1}%
+ \count@=\ltx@one
+ \ZREF@xr@@AddUrl
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@xr@@AddUrl}
+% \begin{macrocode}
+\def\ZREF@xr@@AddUrl{%
+ \ifnum\count@>\ZREF@xr@URL
+ \global\advance\ZREF@xr@URL by\ltx@one
+ \xdef\ZREF@xr@theURL{\romannumeral\ZREF@xr@URL}%
+ \global\expandafter\let
+ \csname Z@U@\ZREF@xr@theURL\endcsname\ZREF@temp
+ \@PackageInfo{zref-xr}{%
+ \ltx@backslashchar Z@U@\ZREF@xr@theURL:\MessageBreak
+ \ZREF@temp\MessageBreak
+ }%
+ \else
+ \expandafter
+ \ifx\csname Z@U@\romannumeral\count@\endcsname\ZREF@temp
+ \xdef\ZREF@xr@theURL{\romannumeral\count@}%
+ \else
+ \expandafter\expandafter\expandafter\ZREF@xr@@AddUrl
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zexternaldocument}
+% In its star form it looks for \cs{newlabel},
+% otherwise for \cs{zref@newlabel}.
+% Later we
+% will read \xfile{.aux} files that expects
+% |@| to have catcode 11 (letter).
+% \begin{macrocode}
+\ZREF@IfDefinable\zexternaldocument\def{%
+ {%
+ \ZREF@NewPropAnchor
+ \ZREF@NewPropTitle
+ \begingroup
+ \csname @safe@actives@true\endcsname
+ \makeatletter
+ \@ifstar{%
+ \ZREF@xr@zreflabelfalse
+ \@testopt\ZREF@xr@externaldocument{}%
+ }{%
+ \ZREF@xr@zreflabeltrue
+ \@testopt\ZREF@xr@externaldocument{}%
+ }%
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% If the \cs{include} featuer was used, there can be
+% several \xfile{.aux} files. These files are read
+% one after another, especially they are not recursively
+% read in order to save read registers. Thus it can
+% happen that the read order of the newlabel commands
+% differs from \hologo{LaTeX}'s order using \cs{input}.
+%
+% \begin{macro}{\ZREF@xr@externaldocument}
+% It reads the remaining arguments. \cs{newcommand}
+% comes in handy for the optional argument.
+% \begin{macrocode}
+\def\ZREF@xr@externaldocument[#1]#2{%
+ \def\ZREF@xr@prefix{#1}%
+ \let\ZREF@xr@filelist\ltx@empty
+ \edef\ZREF@xr@externalfile{#2}%
+ \edef\ZREF@xr@file{\ZREF@xr@externalfile.aux}%
+ \filename@parse{#2}%
+ \@testopt\ZREF@xr@graburl{#2.\zref@xr@ext}%
+}%
+\def\ZREF@xr@graburl[#1]{%
+ \edef\ZREF@xr@url{#1}%
+ \ifZREF@xr@urluse
+ \expandafter\ZREF@xr@AddURL\expandafter{\ZREF@xr@url}%
+ \expandafter\def\expandafter\ZREF@xr@url
+ \expandafter{\csname Z@U@\ZREF@xr@theURL\endcsname}%
+ \fi
+ \ZREF@xr@checkfile
+ \endgroup
+}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@xr@processfile}
+% We follow \xpackage{xr} here, \cs{IfFileExists} offers
+% a nicer test, but we have to open the file anyway.
+% \begin{macrocode}
+\def\ZREF@xr@checkfile{%
+ \openin\@inputcheck\ZREF@xr@file\relax
+ \ifeof\@inputcheck
+ \PackageWarning{zref-xr}{%
+ File `\ZREF@xr@file' not found or empty,\MessageBreak
+ labels not imported%
+ }%
+ \else
+ \PackageInfo{zref-xr}{%
+ Label \ifZREF@xr@zreflabel (zref) \fi
+ import from `\ZREF@xr@file'%
+ }%
+ \def\ZREF@xr@found{0}%
+ \def\ZREF@xr@ignored@empty{0}%
+ \def\ZREF@xr@ignored@zref{0}%
+ \def\ZREF@xr@ignored@ltx{0}%
+ \ZREF@xr@processfile
+ \closein\@inputcheck
+ \begingroup
+ \let\on@line\ltx@empty
+ \PackageInfo{zref-xr}{%
+ Statistics for `\ZREF@xr@file':\MessageBreak
+ \ZREF@xr@found\space
+ \ifZREF@xr@zreflabel zref\else LaTeX\fi\space
+ label(s) found%
+ \ifnum\ZREF@xr@ignored@empty>0 %
+ ,\MessageBreak
+ \ZREF@xr@ignored@empty\space empty label(s) ignored%
+ \fi
+ \ifnum\ZREF@xr@ignored@zref>0 %
+ ,\MessageBreak
+ \ZREF@xr@ignored@zref\space
+ duplicated zref label(s) ignored%
+ \fi
+ \ifnum\ZREF@xr@ignored@ltx>0 %
+ ,\MessageBreak
+ \ZREF@xr@ignored@ltx\space
+ duplicated latex label(s) ignored%
+ \fi
+ }%
+ \endgroup
+ \fi
+ \ifx\ZREF@xr@filelist\ltx@empty
+ \else
+ \edef\ZREF@xr@file{%
+ \expandafter\ltx@car\ZREF@xr@filelist\@nil
+ }%
+ \edef\ZREF@xr@filelist{%
+ \expandafter\ltx@cdr\ZREF@xr@filelist\ltx@empty\@nil
+ }%
+ \expandafter\ZREF@xr@checkfile
+ \fi
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@xr@processfile}
+% \begin{macrocode}
+\def\ZREF@xr@processfile{%
+ \read\@inputcheck to\ZREF@xr@line
+ \expandafter\ZREF@xr@processline\ZREF@xr@line..\ZREF@nil
+ \ifeof\@inputcheck
+ \else
+ \expandafter\ZREF@xr@processfile
+ \fi
+}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@xr@processline}
+% The most work must be done for analyzing the
+% arguments of \cs{newlabel}.
+% \begin{macrocode}
+\long\def\ZREF@xr@processline#1#2#3\ZREF@nil{%
+ \def\x{#1}%
+ \toks@{#2}%
+ \ifZREF@xr@zreflabel
+ \ifx\x\ZREF@xr@zref@newlabel
+ \expandafter
+ \ZREF@xr@process@zreflabel\ZREF@xr@line...\ZREF@nil
+ \fi
+ \else
+ \ifx\x\ZREF@xr@newlabel
+ \expandafter
+ \ZREF@xr@process@label\ZREF@xr@line...[]\ZREF@nil
+ \fi
+ \fi
+ \ifx\x\ZREF@xr@@input
+ \edef\ZREF@xr@filelist{%
+ \etex@unexpanded\expandafter{\ZREF@xr@filelist}%
+ {\filename@area\the\toks@}%
+ }%
+ \fi
+}%
+\def\ZREF@xr@process@zreflabel\zref@newlabel#1#2#3\ZREF@nil{%
+ \edef\ZREF@xr@refname{Z@R@\ZREF@xr@prefix#1}%
+ \edef\ZREF@xr@found{\the\numexpr\ZREF@xr@found+1\relax}%
+ \def\x{#2}%
+ \edef\ZREF@xr@tempname{$temp$}%
+ \edef\ZREF@xr@temprefname{Z@R@\ZREF@xr@tempname}%
+ \let\ZREF@xr@list\x
+ \ifx\ZREF@xr@list\ltx@empty
+ \PackageWarningNoLine{zref-xr}{%
+ Label `#1' without properties ignored\MessageBreak
+ in file `\ZREF@xr@file'%
+ }%
+ \edef\ZREF@xr@ignored@empty{%
+ \the\numexpr\ZREF@xr@ignored@empty+1\relax
+ }%
+ \else
+ \expandafter\ZREF@xr@checklist\x\ZREF@nil
+ \expandafter\let\csname\ZREF@xr@temprefname\endcsname\x
+ \expandafter\ltx@LocalAppendToMacro
+ \csname\ZREF@xr@temprefname\expandafter\endcsname
+ \expandafter{%
+ \expandafter\externaldocument\expandafter{%
+ \ZREF@xr@externalfile
+ }%
+ }%
+ \ZREF@xr@urlcheck\ZREF@xr@tempname
+ \ifZREF@xr@tozreflabel
+ \@ifundefined{\ZREF@xr@refname}{%
+ \ifZREF@xr@verbose
+ \PackageInfo{zref-xr}{%
+ Import to zref label `\ZREF@xr@tempname#1'%
+ }%
+ \fi
+ \global\expandafter
+ \let\csname\ZREF@xr@refname\expandafter\endcsname
+ \csname\ZREF@xr@temprefname\endcsname
+ }{%
+ \ZREF@xr@zref@ignorewarning{\ZREF@xr@prefix#1}%
+ }%
+ \fi
+ \ifZREF@xr@toltxlabel
+ \ZREF@xr@tolabel{\ZREF@xr@tempname}{\ZREF@xr@prefix#1}%
+ \fi
+ \fi
+}%
+\def\ZREF@xr@process@label\newlabel#1#2#3[#4]#5\ZREF@nil{%
+ \def\ZREF@xr@refname{Z@R@\ZREF@xr@prefix#1}%
+ \edef\ZREF@xr@found{\the\numexpr\ZREF@xr@found+1\relax}%
+ \def\x{#2}%
+ \edef\ZREF@xr@tempname{$temp$}%
+ \edef\ZREF@xr@temprefname{Z@R@\ZREF@xr@tempname}%
+ \expandafter\ZREF@xr@scanparams
+ \csname\ZREF@xr@temprefname\expandafter\endcsname
+ \x{}{}{}{}{}\ZREF@nil
+ \ifx\\#4\\%
+ \else
+ % ntheorem knows an optional argument at the end of \newlabel
+ \ZREF@NewPropTheotype
+ \expandafter\ltx@LocalAppendToMacro
+ \csname\ZREF@xr@temprefname\endcsname{\theotype{#4}}%
+ \fi
+ \expandafter\ltx@LocalAppendToMacro
+ \csname\ZREF@xr@temprefname\expandafter\endcsname\expandafter{%
+ \expandafter\externaldocument\expandafter{%
+ \ZREF@xr@externalfile
+ }%
+ }%
+ \ZREF@xr@urlcheck\ZREF@xr@tempname
+ \ifZREF@xr@tozreflabel
+ \@ifundefined{\ZREF@xr@refname}{%
+ \ifZREF@xr@verbose
+ \PackageInfo{zref-xr}{%
+ Import to zref label `\ZREF@xr@prefix#1'%
+ }%
+ \fi
+ \global\expandafter
+ \let\csname\ZREF@xr@refname\expandafter\endcsname
+ \csname\ZREF@xr@temprefname\endcsname
+ }{%
+ \ZREF@xr@zref@ignorewarning{\ZREF@xr@prefix#1}%
+ }%
+ \fi
+ \ifZREF@xr@toltxlabel
+ \ZREF@xr@tolabel{\ZREF@xr@tempname}{\ZREF@xr@prefix#1}%
+ \fi
+}
+\def\ZREF@xr@zref@newlabel{\zref@newlabel}%
+\def\ZREF@xr@newlabel{\newlabel}%
+\def\ZREF@xr@@input{\@input}%
+\def\ZREF@xr@relax{\relax}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@xr@tolabel}
+% \begin{macrocode}
+\def\ZREF@xr@tolabel#1#2{%
+ \ifZREF@xr@verbose
+ \PackageInfo{zref-xr}{%
+ Import to LaTeX label `#2'%
+ }%
+ \fi
+ \zref@wrapper@unexpanded{%
+ \expandafter\xdef\csname r@#2\endcsname{%
+ {%
+ \ltx@ifundefined{M@TitleReference}{%
+ \ltx@ifundefined{TR@TitleReference}{%
+ \zref@extractdefault{#1}{default}{}%
+ }{%
+ \noexpand\TR@TitleReference
+ {\zref@extractdefault{#1}{default}{}}%
+ {\zref@extractdefault{#1}{title}{}}%
+ }%
+ }{%
+ \noexpand\M@TitleReference
+ {\zref@extractdefault{#1}{default}{}}%
+ {\zref@extractdefault{#1}{title}{}}%
+ }%
+ }%
+ {\zref@extractdefault{#1}{page}{}}%
+ \ltx@ifpackageloaded{nameref}{%
+ {\zref@extractdefault{#1}{title}{}}%
+ {\zref@extractdefault{#1}{anchor}{}}%
+ \zref@ifrefcontainsprop{#1}{urluse}{%
+ {\zref@extractdefault{#1}{urluse}{}}%
+ }{%
+ {\zref@extractdefault{#1}{url}{}}%
+ }%
+ }{}%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@xr@zref@ignorewarning}
+% \begin{macrocode}
+\def\ZREF@xr@zref@ignorewarning#1{%
+ \PackageWarningNoLine{zref-xr}{%
+ Zref label `#1' is already in use\MessageBreak
+ in file `\ZREF@xr@file'%
+ }%
+ \edef\ZREF@xr@ignored@zref{%
+ \the\numexpr\ZREF@xr@ignored@zref+1%
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@xr@ltx@ignorewarning}
+% \begin{macrocode}
+\def\ZREF@xr@ltx@ignorewarning#1{%
+ \PackageWarningNoLine{zref-xr}{%
+ LaTeX label `#1' is already in use\MessageBreak
+ in file `\ZREF@xr@file'%
+ }%
+ \edef\ZREF@xr@ignored@ltx{%
+ \the\numexpr\ZREF@xr@ignored@ltx+1%
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@xr@checklist}
+% \begin{macrocode}
+\def\ZREF@xr@checklist#1#2#3\ZREF@nil{%
+ \ifx\@undefined#1\relax
+ \expandafter\ZREF@xr@checkkey\string#1\@nil
+ \fi
+ \ifx\\#3\\%
+ \else
+ \ltx@ReturnAfterFi{%
+ \ZREF@xr@checklist#3\ZREF@nil
+ }%
+ \fi
+}%
+\def\ZREF@xr@checkkey#1#2\@nil{%
+ \zref@ifpropundefined{#2}{%
+ \zref@newprop{#2}{}%
+ }{}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@xr@scanparams}
+% \begin{macrocode}
+\def\ZREF@xr@scanparams#1#2#3#4#5#6#7\ZREF@nil{%
+ \let#1\ltx@empty
+ \ZREF@foundfalse
+ \ZREF@xr@scantitleref#1#2\TR@TitleReference{}{}\ZREF@nil
+ \ifZREF@found
+ \else
+ \ltx@LocalAppendToMacro#1{\default{#2}}%
+ \fi
+ % page
+ \ltx@LocalAppendToMacro#1{\page{#3}}%
+ % nameref title
+ \ifZREF@found
+ \else
+ \ifx\\#4\\%
+ \else
+ \def\ZREF@xr@temp{#4}%
+ \ifx\ZREF@xr@temp\ZREF@xr@relax
+ \else
+ \ltx@LocalAppendToMacro#1{\title{#4}}%
+ \fi
+ \fi
+ \fi
+ % anchor
+ \ifx\\#5\\%
+ \else
+ \ltx@LocalAppendToMacro#1{\anchor{#5}}%
+ \fi
+ \ifx\\#6\\%
+ \else
+ \ifZREF@xr@urluse
+ \ZREF@xr@AddURL{#6}%
+ \expandafter\ltx@LocalAppendToMacro\expandafter#1%
+ \expandafter{%
+ \expandafter\urluse\expandafter{%
+ \csname Z@U@\ZREF@xr@theURL\endcsname
+ }%
+ }%
+ \else
+ \ltx@LocalAppendToMacro#1{\url{#6}}%
+ \fi
+ \fi
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@xr@scantitleref}
+% \begin{macrocode}
+\def\ZREF@xr@scantitleref#1#2\TR@TitleReference#3#4#5\ZREF@nil{%
+ \ifx\\#5\\%
+ \else
+ \ltx@LocalAppendToMacro#1{%
+ \default{#3}%
+ \title{#4}%
+ }%
+ \ZREF@foundtrue
+ \fi
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@xr@urlcheck}%
+% \begin{macrocode}
+\def\ZREF@xr@urlcheck#1{%
+ \zref@ifrefcontainsprop{#1}{anchor}{%
+ \zref@ifrefcontainsprop{#1}{url}{%
+ }{%
+ \expandafter
+ \ltx@LocalAppendToMacro\csname Z@R@#1\expandafter\endcsname
+ \expandafter{%
+ \csname url\ifZREF@xr@urluse use\fi
+ \expandafter\endcsname\expandafter{\ZREF@xr@url}%
+ }%
+ }%
+ }{%
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</xr>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{hyperref}}
+%
+% UNFINISHED :-(
+%
+% \begin{macrocode}
+%<*hyperref>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-hyperref}%
+ [2019/11/29 v2.28 Module hyperref for zref (HO)]%
+\RequirePackage{zref-base}[2019/11/29]
+\ifx\ZREF@base@ok Y%
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ZREF@NewPropAnchor
+\zref@addprop\ZREF@mainlist{anchor}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</hyperref>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{savepos}}
+%
+% Module \xmodule{savepos} provides an interface for
+% \pdfTeX's \cmd{\pdfsavepos}, see the manual for
+% \pdfTeX.
+%
+% \subsubsection{Identification}
+%
+% \begin{macrocode}
+%<*savepos>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-savepos}%
+ [2019/11/29 v2.28 Module savepos for zref (HO)]%
+\RequirePackage{zref-base}[2019/11/29]
+\ifx\ZREF@base@ok Y%
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+% LuaTeX compatibility
+% \begin{macrocode}
+\ifx\pdfsavepos\@undefined
+ \let\pdfsavepos \savepos
+ \let\pdflastxpos \lastxpos
+ \let\pdflastypos \lastypos
+\fi
+% \end{macrocode}
+%
+% \subsubsection{Availability}
+%
+% First we check, whether the feature is available.
+% \begin{macrocode}
+\ltx@IfUndefined{pdfsavepos}{%
+ \PackageError\ZREF@name{%
+ \string\pdfsavepos\space is not supported.\MessageBreak
+ It is provided by pdfTeX (1.40) or XeTeX%
+ }\ZREF@UpdatePdfTeX
+ \endinput
+}{}%
+% \end{macrocode}
+% In PDF mode we are done. However support for DVI mode
+% was added later in version 1.40.0. In earlier versions
+% \cs{pdfsavepos} is defined, but its execution raises
+% an error. Note that \hologo{XeTeX} also provides \cs{pdfsavepos}.
+% \begin{macrocode}
+\RequirePackage{ifpdf}
+\ifpdf
+\else
+ \ltx@IfUndefined{pdftexversion}{%
+ }{%
+ \ifnum\pdftexversion<140 %
+ \PackageError\ZREF@name{%
+ \string\pdfsavepos\space is not supported in DVI mode%
+ \MessageBreak
+ of this pdfTeX version%
+ }\ZREF@UpdatePdfTeX
+ \expandafter\expandafter\expandafter\endinput
+ \fi
+ }%
+\fi
+% \end{macrocode}
+%
+% \subsubsection{Setup}
+%
+% \begin{macrocode}
+\zref@newlist{savepos}
+\zref@newprop*{posx}[0]{\the\pdflastxpos}
+\zref@newprop*{posy}[0]{\the\pdflastypos}
+\zref@addprops{savepos}{posx,posy}
+% \end{macrocode}
+%
+% \subsubsection{User macros}
+%
+% \begin{macro}{\zref@savepos}
+% \begin{macrocode}
+\def\zref@savepos{%
+ \if@filesw
+ \pdfsavepos
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@zsavepos}
+% \begin{macrocode}
+\def\ZREF@zsavepos#1#2#3{%
+ \@bsphack
+ \if@filesw
+ \zref@savepos
+ #1{#3}{#2}%
+ \ltx@IfUndefined{TeXXeTstate}{%
+ }{%
+ \ifnum\TeXXeTstate=\ltx@zero
+ \else
+ \zref@savepos
+ \fi
+ }%
+ \fi
+ \@esphack
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zsavepos}
+% The current location is stored in a reference with the
+% given name.
+% \begin{macrocode}
+\ZREF@IfDefinable\zsavepos\def{%
+ {%
+ \ZREF@zsavepos\zref@labelbylist{savepos}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zsaveposx}
+% \begin{macrocode}
+\ZREF@IfDefinable\zsaveposx\def{%
+ {%
+ \ZREF@zsavepos\zref@labelbyprops{posx}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zsaveposy}
+% \begin{macrocode}
+\ZREF@IfDefinable\zsaveposy\def{%
+ {%
+ \ZREF@zsavepos\zref@labelbyprops{posy}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zposx}
+% \begin{macro}{\zposy}
+% The horizontal and vertical position are available by
+% \cs{zposx} and \cs{zposy}. Do not rely on absolute
+% positions. They differ in DVI and PDF mode of \pdfTeX.
+% Use differences instead. The unit of the position numbers
+% is sp.
+% \begin{macrocode}
+\newcommand*{\zposx}[1]{%
+ \zref@extract{#1}{posx}%
+}%
+\newcommand*{\zposy}[1]{%
+ \zref@extract{#1}{posy}%
+}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Typically horizontal and vertical positions are used
+% inside calculations. Therefore the extracting macros
+% should be expandable and babel's patch is not applyable.
+%
+% Also it is in the responsibility of the user to marked
+% used positions by \cs{zrefused}
+% in order to notify \hologo{LaTeX} about undefined references.
+%
+% \begin{macro}{\ZREF@savepos@ok}
+% \begin{macrocode}
+\let\ZREF@savepos@ok=Y
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</savepos>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{abspos}}
+%
+% \subsubsection{Identification}
+%
+% \begin{macrocode}
+%<*abspos>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-abspos}%
+ [2019/11/29 v2.28 Module abspos for zref (HO)]%
+\RequirePackage{zref-base}[2019/11/29]
+\ifx\ZREF@base@ok Y%
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+\RequirePackage{zref-savepos}[2019/11/29]
+\ifx\ZREF@savepos@ok Y%
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+% \begin{macrocode}
+\RequirePackage{zref-pagelayout}[2019/11/29]
+\zref@addprop{savepos}{abspage}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\RequirePackage{ifpdf}[2010/09/13]
+% \end{macrocode}
+%
+% \begin{macro}{\zref@absposx}
+% \begin{macrocode}
+\newcommand*{\zref@absposx}[3]{%
+ \number
+ \expandafter\zref@absposnumx\expandafter{%
+ \number\zref@extractdefault{#1}{abspage}{0}%
+ }{#2}{#3}%
+ \ltx@space
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@absposy}
+% \begin{macrocode}
+\newcommand*{\zref@absposy}[3]{%
+ \number
+ \expandafter\zref@absposnumy\expandafter{%
+ \number\zref@extractdefault{#1}{abspage}{0}%
+ }{#2}{#3}%
+ \ltx@space
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@absposnumx}
+% \begin{macrocode}
+\newcommand*{\zref@absposnumx}[3]{%
+ \number
+% \ifnum#1>\ltx@zero
+% \zref@ifrefundefined{thepage#1}{%
+% 0%
+% }{%
+ \numexpr\ZREF@absposnum{thepage#1}{#2}{x}{#3}\relax
+% }%
+% \else
+% 0%
+% \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@absposnumy}
+% \begin{macrocode}
+\newcommand*{\zref@absposnumy}[3]{%
+ \number
+% \ifnum#1>\ltx@zero
+% \zref@ifrefundefined{thepage#1}{%
+% 0%
+% }{%
+ \numexpr\ZREF@absposnum{thepage#1}{#2}{y}{#3}\relax
+% }%
+% \else
+% 0%
+% \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@absposnum}
+% \begin{macrocode}
+\def\ZREF@absposnum#1#2#3#4{%
+ \ltx@ifundefined{ZREF@abspos@#2@#3@#4}{%
+ 0%
+ }{%
+ \csname ZREF@abspos@#2@#3@#4\endcsname{#1}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@def@absposx}
+% \begin{macrocode}
+\ZREF@Robust\def\zref@def@absposx#1{%
+ \zref@wrapper@babel{\ZREF@def@abspos{#1}\zref@absposx}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@def@absposy}
+% \begin{macrocode}
+\ZREF@Robust\def\zref@def@absposy#1{%
+ \zref@wrapper@babel{\ZREF@def@abspos{#1}\zref@absposy}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@def@absposnumx}
+% \begin{macrocode}
+\ZREF@Robust\def\zref@def@absposnumx#1{%
+ \zref@wrapper@babel{\ZREF@def@abspos{#1}\zref@absposnumx}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@def@absposnumy}
+% \begin{macrocode}
+\ZREF@Robust\def\zref@def@absposnumy#1{%
+ \zref@wrapper@babel{\ZREF@def@abspos{#1}\zref@absposnumy}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@def@abspos}
+% \begin{macrocode}
+\def\ZREF@def@absposnumy#1#2#3#4#5{%
+ \edef#1{#2{#3}{#4}{#5}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@absposused}
+% \begin{macrocode}
+\ZREF@Robust\def\zref@absposused{%
+ \zref@wrapper@babel\ZREF@abspos@used
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@used}
+% \begin{macrocode}
+\def\ZREF@abspos@used#1{%
+ \zref@refused{#1}%
+ \zref@ifrefundefined{#1}{%
+ }{%
+ \begingroup
+ \edef\ZREF@temp{%
+ \zref@extractdefault{#1}{abspage}{0}%
+ }%
+ \ifnum\ZREF@temp>\ltx@zero
+ \zref@refused{thepage\ZREF@temp}%
+ \else
+ \@PackageError{zref-abspos}{%
+ \string\zref@pos@label@used\ltx@space
+ needs property `abspage'\MessageBreak
+ in label `#1'%
+ }\@ehc
+ \fi
+ \endgroup
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@absposnumused}
+% \begin{macrocode}
+\newcommand*{\zref@absposnumused}[1]{%
+ \ifnum#1>\ltx@zero
+ \zref@refused{thepage\number#1}%
+ \else
+ \@PackageError{zref-abspos}{%
+ Invalid absolute page number (#1)\MessageBreak
+ for \string\zref@pos@num@used.\MessageBreak
+ A positive integer is expected%
+ }\@ehc
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@ifabsposundefined}
+% \begin{macrocode}
+\def\zref@ifabsposundefined#1{%
+ \zref@ifrefundefined{#1}\ltx@firsttwo{%
+ \expandafter\zref@ifabsposnumundefined\expandafter{%
+ \number\zref@extractdefault{#1}{abspage}{0}%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zref@ifabsposnumundefined}
+% \begin{macrocode}
+\def\zref@ifabsposnumundefined#1{%
+ \ifnum\ZREF@number{#1}>\ltx@zero
+ \zref@ifrefundefined{thepage#1}%
+ \ltx@firstoftwo\ltx@secondoftwo
+ \else
+ \expandafter\ltx@firstoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Media}
+%
+% \begin{macro}{\ZREF@abspos@media@width}
+% \begin{macrocode}
+\edef\ZREF@abspos@media@width{%
+ \ltx@ifundefined{pdfpagewidth}{%
+ \ltx@ifundefined{mediawidth}{%
+ \ltx@ifundefined{stockwidth}{%
+ paperwidth%
+ }{%
+ stockwidth%
+ }%
+ }{%
+ mediawidth%
+ }%
+ }{%
+ pdfpagewidth%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@media@height}
+% \begin{macrocode}
+\edef\ZREF@abspos@media@height{%
+ \ltx@ifundefined{pdfpageheight}{%
+ \ltx@ifundefined{mediaheight}{%
+ \ltx@ifundefined{stockheight}{%
+ paperheight%
+ }{%
+ stockheight%
+ }%
+ }{%
+ mediaheight%
+ }%
+ }{%
+ \noexpand\ifcase\pdfpageheight
+ \ltx@ifundefined{stockheight}{%
+ paperheight%
+ }{%
+ stockheight%
+ }%
+ \noexpand\else
+ pdfpageheight%
+ \noexpand\fi
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@abspos@media@x@left}
+% \begin{macrocode}
+\def\ZREF@abspos@media@x@left#1{%
+ 0%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@media@x@right}
+% \begin{macrocode}
+\def\ZREF@abspos@media@x@right#1{%
+ \zref@extract{#1}\ZREF@abspos@media@width
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@media@x@center}
+% \begin{macrocode}
+\def\ZREF@abspos@media@x@center#1{%
+ \ZREF@abspos@media@x@left{#1}%
+ +\zref@extract{#1}\ZREF@abspos@media@width/2%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@abspos@media@y@top}
+% \begin{macrocode}
+\def\ZREF@abspos@media@y@top#1{%
+ \zref@extract{#1}\ZREF@abspos@media@height
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@media@y@bottom}
+% \begin{macrocode}
+\def\ZREF@abspos@media@y@bottom#1{%
+ 0%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@media@y@center}
+% \begin{macrocode}
+\def\ZREF@abspos@media@y@center#1{%
+ \zref@extract{#1}\ZREF@abspos@media@height/2%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Paper}
+%
+% \begin{macro}{\ZREF@abspos@paper@x@left}
+% \begin{macrocode}
+\def\ZREF@abspos@paper@x@left#1{%
+ 0%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@paper@x@right}
+% \begin{macrocode}
+\def\ZREF@abspos@paper@x@right#1{%
+ \zref@extract{#1}{paperwidth}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@paper@x@center}
+% \begin{macrocode}
+\def\ZREF@abspos@paper@x@center#1{%
+ \zref@extract{#1}{paperwidth}/2%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@abspos@paper@y@top}
+% \begin{macrocode}
+\let\ZREF@abspos@paper@y@top\ZREF@abspos@media@y@top
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@paper@y@bottom}
+% \begin{macrocode}
+\def\ZREF@abspos@paper@y@bottom#1{%
+ \ZREF@abspos@paper@y@top{#1}%
+ -\zref@extract{#1}{paperheight}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@paper@y@center}
+% \begin{macrocode}
+\def\ZREF@abspos@paper@y@center#1{%
+ \ZREF@abspos@paper@y@top{#1}%
+ -\zref@extract{#1}{paperheight}/2%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Origin}
+%
+% \begin{macro}{\ZREF@abspos@origin@x}
+% \begin{macrocode}
+\let\ZREF@temp\ltx@two
+\ltx@IfUndefined{pdfhorigin}{}{%
+ \ifpdf
+ \let\ZREF@temp\ltx@zero
+ \fi
+}
+\ifx\ZREF@temp\ltx@two
+ \ifnum\mag=1000 %
+ \let\ZREF@temp\ltx@one
+ \fi
+\fi
+\ifcase\ZREF@temp
+ \def\ZREF@abspos@origin@x#1{%
+ \zref@extract{#1}{pdfhorigin}%
+ }%
+\or
+ \def\ZREF@abspos@origin@x#1{%
+ 4736286%
+ }%
+\or
+ \def\ZREF@abspos@origin@x#1{%
+ \numexpr\mag/1000*\dimexpr 1truein\relax\relax
+ }%
+\fi
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@origin@y}
+% \begin{macrocode}
+\let\ZREF@temp\ltx@two
+\ltx@IfUndefined{pdfvorigin}{}{%
+ \ifpdf
+ \let\ZREF@temp\ltx@zero
+ \fi
+}
+\ifx\ZREF@temp\ltx@two
+ \ifnum\mag=1000 %
+ \let\ZREF@temp\ltx@one
+ \fi
+\fi
+\ifcase\ZREF@temp
+ \def\ZREF@abspos@origin@y#1{%
+ \zref@extract{#1}{pdfvorigin}%
+ }%
+\or
+ \def\ZREF@abspos@origin@y#1{%
+ 4736286%
+ }%
+\or
+ \def\ZREF@abspos@origin@y#1{%
+ \numexpr\mag/1000*\dimexpr 1truein\relax\relax
+ }%
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Header}
+%
+% \begin{macro}{\ZREF@abspos@head@x@left}
+% \begin{macrocode}
+\def\ZREF@abspos@head@x@left#1{%
+ \ZREF@abspos@paper@x@left{#1}%
+ +\ZREF@abspos@origin@x{#1}%
+ +\zref@extract{#1}{hoffset}%
+ +\ifodd\zref@extractdefault{#1}{pagevalue}{\number\c@page} %
+ \zref@extract{#1}{oddsidemargin}%
+ \else
+ \zref@extract{#1}{evensidemargin}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@head@x@right}
+% \begin{macrocode}
+\def\ZREF@abspos@head@x@right#1{%
+ \ZREF@abspos@head@x@left{#1}%
+ +\zref@extract{#1}{textwidth}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@head@x@center}
+% \begin{macrocode}
+\def\ZREF@abspos@head@x@center#1{%
+ \ZREF@abspos@head@x@left{#1}%
+ +\zref@extract{#1}{textwidth}/2%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@abspos@head@y@top}
+% \begin{macrocode}
+\def\ZREF@abspos@head@y@top#1{%
+ \ZREF@abspos@paper@y@top{#1}%
+ -\ZREF@abspos@origin@y{#1}%
+ -\zref@extract{#1}{voffset}%
+ -\zref@extract{#1}{topmargin}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@head@y@bottom}
+% \begin{macrocode}
+\def\ZREF@abspos@head@y@bottom#1{%
+ \ZREF@abspos@head@y@top{#1}%
+ -\zref@extract{#1}{headheight}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@head@y@center}
+% \begin{macrocode}
+\def\ZREF@abspos@head@y@center#1{%
+ \ZREF@abspos@head@y@top{#1}%
+ -\zref@extract{#1}{headheight}/2%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Body}
+%
+% \begin{macro}{\ZREF@abspos@body@x@left}
+% \begin{macrocode}
+\let\ZREF@abspos@body@x@left\ZREF@abspos@head@x@left
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@body@x@right}
+% \begin{macrocode}
+\let\ZREF@abspos@body@x@right\ZREF@abspos@head@x@right
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@body@x@center}
+% \begin{macrocode}
+\let\ZREF@abspos@body@x@center\ZREF@abspos@head@x@center
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@abspos@body@y@top}
+% \begin{macrocode}
+\def\ZREF@abspos@body@y@top#1{%
+ \ZREF@abspos@head@y@bottom{#1}%
+ -\zref@extract{#1}{headsep}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@body@y@bottom}
+% \begin{macrocode}
+\def\ZREF@abspos@body@y@bottom#1{%
+ \ZREF@abspos@body@y@top{#1}%
+ -\zref@extract{#1}{textheight}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@body@y@center}
+% \begin{macrocode}
+\def\ZREF@abspos@body@y@center#1{%
+ \ZREF@abspos@body@y@top{#1}%
+ -\zref@extract{#1}{textheight}/2%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Footer}
+%
+% \begin{macro}{\ZREF@abspos@foot@x@left}
+% \begin{macrocode}
+\let\ZREF@abspos@foot@x@left\ZREF@abspos@head@x@left
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@foot@x@right}
+% \begin{macrocode}
+\let\ZREF@abspos@foot@x@right\ZREF@abspos@head@x@right
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@foot@x@center}
+% \begin{macrocode}
+\let\ZREF@abspos@foot@x@center\ZREF@abspos@head@x@center
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@abspos@foot@y@bottom}
+% \begin{macrocode}
+\def\ZREF@abspos@foot@y@bottom#1{%
+ \ZREF@abspos@body@y@bottom{#1}%
+ -\zref@extract{#1}{footskip}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Marginal notes}
+%
+% \begin{macro}{\ZREF@abspos@marginpar@x@left}
+% \begin{macrocode}
+\def\ZREF@abspos@marginpar@x@left#1{%
+ \ifodd\zref@extractdefault{#1}{pagevalue}{\number\c@page} %
+ \ZREF@abspos@body@x@right{#1}%
+ +\zref@extract{#1}{marginparsep}%
+ \else
+ \ZREF@abspos@body@x@left{#1}%
+ -\zref@extract{#1}{marginparsep}%
+ -\zref@extract{#1}{marginparwidth}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@marginpar@x@right}
+% \begin{macrocode}
+\def\ZREF@abspos@marginpar@x@right#1{%
+ \ZREF@abspos@marginpar@x@left{#1}%
+ +\zref@extract{#1}{marginparwidth}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@marginpar@x@center}
+% \begin{macrocode}
+\def\ZREF@abspos@marginpar@x@center#1{%
+ \ZREF@abspos@marginpar@x@left{#1}%
+ +\zref@extract{#1}{marginparwidth}/2%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@abspos@marginpar@y@top}
+% \begin{macrocode}
+\let\ZREF@abspos@marginpar@y@top\ZREF@abspos@body@y@top
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@marginpar@y@bottom}
+% \begin{macrocode}
+\let\ZREF@abspos@marginpar@y@bottom\ZREF@abspos@body@y@bottom
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@marginpar@y@center}
+% \begin{macrocode}
+\let\ZREF@abspos@marginpar@y@center\ZREF@abspos@body@y@center
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Stock paper}
+%
+% \begin{macro}{\ZREF@abspos@stock@x@left}
+% \begin{macrocode}
+\let\ZREF@abspos@stock@x@left\ZREF@abspos@paper@x@left
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@stock@x@right}
+% \begin{macrocode}
+\let\ZREF@abspos@stock@x@right\ZREF@abspos@paper@x@right
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@stock@x@center}
+% \begin{macrocode}
+\let\ZREF@abspos@stock@x@center\ZREF@abspos@paper@x@center
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ZREF@abspos@stock@y@top}
+% \begin{macrocode}
+\let\ZREF@abspos@stock@y@top\ZREF@abspos@paper@y@top
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@stock@y@bottom}
+% \begin{macrocode}
+\let\ZREF@abspos@stock@y@bottom\ZREF@abspos@paper@y@bottom
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@abspos@stock@y@center}
+% \begin{macrocode}
+\let\ZREF@abspos@stock@y@center\ZREF@abspos@paper@y@center
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</abspos>
+% \end{macrocode}
+%
+%
+% \subsection{Module \xmodule{dotfill}}
+%
+% \begin{macrocode}
+%<*dotfill>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-dotfill}%
+ [2019/11/29 v2.28 Module dotfill for zref (HO)]%
+\RequirePackage{zref-base}[2019/11/29]
+\ifx\ZREF@base@ok Y%
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% For measuring the width of \cs{zdotfill} we use the features
+% provided by module \xmodule{savepos}.
+% \begin{macrocode}
+\RequirePackage{zref-savepos}[2019/11/29]
+% \end{macrocode}
+% For automatically generated label names we use the unique
+% counter of module \xmodule{base}.
+% \begin{macrocode}
+\zref@require@unique
+% \end{macrocode}
+% Configuration is done by the key value interface of package
+% \xpackage{keyval}.
+% \begin{macrocode}
+\RequirePackage{keyval}
+% \end{macrocode}
+% The definitions of the keys follow.
+% \begin{macrocode}
+\define@key{ZREF@DF}{unit}{%
+ \def\ZREF@df@unit{#1}%
+}
+\define@key{ZREF@DF}{min}{%
+ \def\ZREF@df@min{#1}%
+}
+\define@key{ZREF@DF}{dot}{%
+ \def\ZREF@df@dot{#1}%
+}
+% \end{macrocode}
+% Defaults are set, see user interface.
+% \begin{macrocode}
+\providecommand\ZREF@df@min{2}
+\providecommand\ZREF@df@unit{.44em}
+\providecommand\ZREF@df@dot{.}
+% \end{macrocode}
+% \begin{macro}{\zdotfillsetup}
+% Configuration of \cs{zdotfill} is done by \cs{zdotfillsetup}.
+% \begin{macrocode}
+\newcommand*{\zdotfillsetup}{\kvsetkeys{ZREF@DF}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zdotfill}
+% \cs{zdotfill} sets labels at the left and the right to get
+% the horizontal position. \cs{zsavepos} is not used, because
+% we do not need the vertical position.
+% \begin{macrocode}
+\ZREF@IfDefinable\zdotfill\def{%
+ {%
+ \leavevmode
+ \global\advance\c@zref@unique\ltx@one
+ \begingroup
+ \def\ZREF@temp{zref@\number\c@zref@unique}%
+ \pdfsavepos
+ \zref@labelbyprops{\thezref@unique L}{posx}%
+ \setlength{\dimen@}{\ZREF@df@unit}%
+ \zref@ifrefundefined{\thezref@unique R}{%
+ \ZREF@dotfill
+ }{%
+ \ifnum\numexpr\zposx{\thezref@unique R}%
+ -\zposx{\thezref@unique L}\relax
+ <\dimexpr\ZREF@df@min\dimen@\relax
+ \hfill
+ \else
+ \ZREF@dotfill
+ \fi
+ }%
+ \pdfsavepos
+ \zref@labelbyprops{\thezref@unique R}{posx}%
+ \endgroup
+ \kern\z@
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@dotfill}
+% Help macro that actually sets the dots.
+% \begin{macrocode}
+\def\ZREF@dotfill{%
+ \cleaders\hb@xt@\dimen@{\hss\ZREF@df@dot\hss}\hfill
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</dotfill>
+% \end{macrocode}
+%
+% \subsection{Module \xmodule{env}}
+%
+% \begin{macrocode}
+%<*env>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zref-env}%
+ [2019/11/29 v2.28 Module env for zref (HO)]%
+\RequirePackage{zref-base}[2019/11/29]
+\ifx\ZREF@base@ok Y%
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+\zref@newprop{envname}[]{\@currenvir}
+\zref@newprop{envline}[]{\zref@env@line}
+% \end{macrocode}
+%
+% \begin{macro}{\zref@env@line}
+% Macro \cs{zref@env@line} extracts the line number
+% from \cs{@currenvline}.
+% \begin{macrocode}
+\def\zref@env@line{%
+ \ifx\@currenvline\ltx@empty
+ \else
+ \expandafter
+ \ZREF@ENV@line\@currenvline\ltx@empty line \ltx@empty\@nil
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ZREF@ENV@line}
+% \begin{macrocode}
+\def\ZREF@ENV@line#1line #2\ltx@empty#3\@nil{#2}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</env>
+% \end{macrocode}
+%
+%
+% \section{Test}
+%
+% \subsection{\cs{zref@localaddprop}}
+%
+% \begin{macrocode}
+%<*test1>
+\NeedsTeXFormat{LaTeX2e}
+\nofiles
+\documentclass{article}
+\usepackage{zref-base}[2019/11/29]
+\usepackage{qstest}
+\IncludeTests{*}
+\LogTests{log}{*}{*}
+
+\makeatletter
+\def\ExpectList#1#2{%
+ \expandafter\expandafter\expandafter\Expect
+ \expandafter\expandafter\expandafter{\csname Z@L@#1\endcsname}{#2}%
+}
+\begin{qstest}{localaddprop}{localaddprop}
+ \ExpectList{main}{\default\page}%
+ \Expect{undefined}*{\meaning\foobar}%
+ \zref@newprop{foobar}{FOO}%
+ \Expect{undefined}*{\meaning\foobar}%
+ \zref@newlist{alist}%
+ \ExpectList{alist}{}%
+ \begingroup
+ \zref@localaddprop{main}{foobar}%
+ \Expect{undefined}*{\meaning\foobar}%
+ \ExpectList{main}{\default\page\foobar}%
+ \zref@localaddprop{alist}{page}%
+ \ExpectList{alist}{\page}%
+ \endgroup
+ \ExpectList{main}{\default\page}%
+ \ExpectList{alist}{}%
+ \zref@addprop{alist}{foobar}%
+ \ExpectList{alist}{\foobar}%
+ \Expect{undefined}*{\meaning\foobar}%
+\end{qstest}
+\@@end
+%</test1>
+% \end{macrocode}
+%
+% \subsection{Module \xmodule{base}}
+%
+% \begin{macrocode}
+%<*test-base>
+\NeedsTeXFormat{LaTeX2e}
+\documentclass{article}
+\usepackage{zref-base,zref-titleref}[2019/11/29]
+\usepackage{qstest}
+\IncludeTests{*}
+\LogTests{log}{*}{*}
+
+\makeatletter
+\newcommand*{\DefExpand}[2]{%
+ \expandafter\expandafter\expandafter\def
+ \expandafter\expandafter\expandafter#1%
+ \expandafter\expandafter\expandafter{#2}%
+ \@onelevel@sanitize#1%
+}
+\newcommand*{\Test}[3]{%
+ \Expect{#2}*{#1}%
+ \zref@wrapper@unexpanded{%
+ \Expect*{#3}*{#1}%
+ }%
+ \DefExpand\x{#1}%
+ \Expect*{#3}*{\x}%
+}
+\makeatother
+
+\begin{document}
+\section{\textit{Hello} \textbf{World}}
+\label{sec:hello}
+\makeatletter
+\zref@newprop{foo}[\@empty D\@empty efault]{\@empty V\@empty alue}
+\begin{qstest}{getcurrent}{getcurrent}
+ \Test{\zref@getcurrent{foo}}%
+ {Value}{\noexpand\@empty V\noexpand\@empty alue}%
+ \Test{\zref@getcurrent{xy}}{}{}%
+\end{qstest}
+\begin{qstest}{extract}{extract}
+ \def\textbf#1{<#1>}%
+ \def\textit#1{[#1]}% hash-ok
+ \Test{\zref@extractdefault{xy}{page}{\@empty D\@empty efault}}%
+ {Default}{\noexpand\@empty D\noexpand\@empty efault}%
+ \Test{\zref@extractdefault{sec:hello}{foo}{\@empty A\@empty B}}%
+ {AB}{\noexpand\@empty A\noexpand\@empty B}%
+ \Test{\zref@extract{sec:hello}{foo}}%
+ {Default}{\noexpand\@empty D\noexpand\@empty efault}%
+ \zref@ifrefundefined{sec:hello}{%
+ }{%
+ \Test{\zref@extract{sec:hello}{default}}{1}{1}%
+ \Test{\zref@extract{sec:hello}{title}}%
+ {[Hello] <World>}%
+ {\noexpand\textit{Hello} \noexpand\textbf{World}}%
+ }%
+\end{qstest}
+\end{document}
+%</test-base>
+% \end{macrocode}
+%
+% \subsection{Module \xmodule{runs}}
+%
+% \begin{macrocode}
+%<*test-runs>
+\NeedsTeXFormat{LaTeX2e}
+\documentclass{article}
+\usepackage{zref-runs}[2019/11/29]
+\usepackage{qstest}
+\IncludeTests{*}
+\LogTests{log}{*}{*}
+
+\begin{qstest}{zruns-preamble}{zruns-preamble}
+ \Expect{0}*{\zruns}%
+\end{qstest}
+
+\AtBeginDocument{%
+ \begin{qstest}{zruns-atbegindocument}{zruns-atbegindocument}%
+ \Expect*{\number\ExpectRuns}*{\zruns}%
+ \end{qstest}%
+}
+
+\begin{document}
+\begin{qstest}{zruns-document}{zruns-document}
+ \Expect*{\number\ExpectRuns}*{\zruns}%
+\end{qstest}
+\end{document}
+%</test-runs>
+% \end{macrocode}
+%
+% \subsection{Module \xmodule{titleref}}
+%
+% \begin{macrocode}
+%<*test-titleref-memoir>
+\NeedsTeXFormat{LaTeX2e}
+\documentclass{memoir}
+\usepackage{zref-titleref}[2019/11/29]
+\usepackage{qstest}
+\IncludeTests{*}
+\LogTests{log}{*}{*}
+\begin{document}
+\makeatletter
+\def\List{}
+\def\Label#1{%
+ \zref@label{#1}%
+ \g@addto@macro\List{%
+ \par
+ #1: [\ztitleref{#1}]%
+ }%
+ \mbox{}%
+ \zref@refused{#1}%
+ \zref@ifrefundefined{#1}{%
+ }{%
+ \begingroup
+ \edef\x{\zref@extract{#1}{title}}%
+ \Expect{OK/}*{\expandafter\ltx@carthree\x{}{}{}\@nil}%
+ \endgroup
+ }%
+}
+\def\Test#1{%
+ \csname#1\endcsname*{OK/#1}%
+ \Label{#1*}%
+ \csname#1\endcsname{OK/#1}%
+ \Label{#1}%
+ \csname#1\endcsname[OK/#1-toc]%
+ {WRONG-in-titleref/#1-toc-2}%
+ \Label{#1-toc}%
+ \expandafter\ifx\csname#1\endcsname\part
+ \else
+ \headnamereffalse
+ \csname#1\endcsname[OK/#1-th-toc]%
+ [WRONG-in-titleref/#1-th-toc-2]%
+ {WRONG-in-titleref/#1-th-toc-3}%
+ \Label{#1-th-toc}%
+ \headnamereftrue
+ \csname#1\endcsname[WRONG-in-titleref/#1-th-head-1]%
+ [OK/#1-th-head]%
+ {WRONG-in-titleref/#1-th-head-3}%
+ \Label{#1-th-head}%
+ \fi
+}
+\begin{qstest}{section}{section}
+ \@for\x:=part,chapter,section,subsection,subsubsection\do{%
+ \expandafter\Test\expandafter{\x}%
+ }%
+\end{qstest}
+\newpage
+\List
+\end{document}
+%</test-titleref-memoir>
+% \end{macrocode}
+%
+% \section{Installation}
+%
+% \subsection{Download}
+%
+% \paragraph{Package.} This package is available on
+% CTAN\footnote{\CTANpkg{zref}}:
+% \begin{description}
+% \item[\CTAN{macros/latex/contrib/zref/zref.dtx}] The source file.
+% \item[\CTAN{macros/latex/contrib/zref/zref.pdf}] Documentation.
+% \end{description}
+%
+%
+% \paragraph{Bundle.} All the packages of the bundle `zref'
+% 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/zref.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{zref.tds.zip} in the
+% TDS tree (also known as \xfile{texmf} tree) of your choice.
+% Example (linux):
+% \begin{quote}
+% |unzip zref.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 zref.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@{}}
+% zref.sty & tex/latex/zref/zref.sty\\
+% zref-base.sty & tex/latex/zref/zref-base.sty\\
+% zref-abspage.sty & tex/latex/zref/zref-abspage.sty\\
+% zref-abspos.sty & tex/latex/zref/zref-abspos.sty\\
+% zref-counter.sty & tex/latex/zref/zref-counter.sty\\
+% zref-dotfill.sty & tex/latex/zref/zref-dotfill.sty\\
+% zref-env.sty & tex/latex/zref/zref-env.sty\\
+% zref-hyperref.sty & tex/latex/zref/zref-hyperref.sty\\
+% zref-lastpage.sty & tex/latex/zref/zref-lastpage.sty\\
+% zref-marks.sty & tex/latex/zref/zref-marks.sty\\
+% zref-nextpage.sty & tex/latex/zref/zref-nextpage.sty\\
+% zref-pageattr.sty & tex/latex/zref/zref-pageattr.sty\\
+% zref-pagelayout.sty & tex/latex/zref/zref-pagelayout.sty\\
+% zref-perpage.sty & tex/latex/zref/zref-perpage.sty\\
+% zref-runs.sty & tex/latex/zref/zref-runs.sty\\
+% zref-savepos.sty & tex/latex/zref/zref-savepos.sty\\
+% zref-thepage.sty & tex/latex/zref/zref-thepage.sty\\
+% zref-titleref.sty & tex/latex/zref/zref-titleref.sty\\
+% zref-totpages.sty & tex/latex/zref/zref-totpages.sty\\
+% zref-user.sty & tex/latex/zref/zref-user.sty\\
+% zref-xr.sty & tex/latex/zref/zref-xr.sty\\
+% zref.pdf & doc/latex/zref/zref.pdf\\
+% zref-example.tex & doc/latex/zref/zref-example.tex\\
+% zref-example-lastpage.tex & doc/latex/zref/zref-example-lastpage.tex\\
+% zref-example-nextpage.tex & doc/latex/zref/zref-example-nextpage.tex\\
+% test/zref-test1.tex & doc/latex/zref/test/zref-test1.tex\\
+% test/zref-test-base.tex & doc/latex/zref/test/zref-test-base.tex\\
+% test/zref-test-runs.tex & doc/latex/zref/test/zref-test-runs.tex\\
+% test/zref-test-titleref-memoir.tex & doc/latex/zref/test/zref-test-titleref-memoir.tex\\
+% zref.dtx & source/latex/zref/zref.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{zref.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 zref.dtx
+%makeindex -s gind.ist zref.idx
+%pdflatex zref.dtx
+%makeindex -s gind.ist zref.idx
+%pdflatex zref.dtx
+%\end{verbatim}
+% \end{quote}
+%
+% \begin{thebibliography}{99}
+% \bibpackage{footmisc}{Robin Fairbairns}{2004/01/23 v5.3a}
+% {\CTANpkg{footmisc}}
+% \bibpackage{hyperref}{Sebastian Rahtz, Heiko Oberdiek}{2006/08/16 v6.75c}
+% {\CTANpkg{hyperref}}
+% \bibpackage{lastpage}{Jeff Goldberg}{1994/06/25 v0.1b}
+% {\CTANpkg{lastpage}}
+% \bibpackage{nameref}{Sebastian Rahtz, Heiko Oberdiek}{2006/02/12 v2.24}
+% {\CTANpkg{nameref}}
+% \bibpackage{perpage}{David Kastrup}{2002/12/20 v1.0}
+% {\CTANpkg{perpage}}
+% \bibpackage{titleref}{Donald Arsenau}{2001/04/05 v3.1}
+% {\CTANpkg{titleref}}
+% \bibpackage{totpages}{Wilhelm M\"uller}{1999/07/14 v1.00}
+% {\CTANpkg{totpages}}
+% \bibpackage{xr}{David Carlisle}{1994/05/28 v5.02}
+% {\CTANpkg{xr}}
+% \bibpackage{xr-hyper}{David Carlisle}{2000/03/22 v6.00beta4}
+% {\CTANpkg{xr-hyper}}
+% \end{thebibliography}
+%
+% \begin{History}
+% \begin{Version}{2006/02/20 v1.0}
+% \item
+% First version.
+% \end{Version}
+% \begin{Version}{2006/05/03 v1.1}
+% \item
+% Module \xmodule{perpage} added.
+% \item
+% Module redesign as packages.
+% \end{Version}
+% \begin{Version}{2006/05/25 v1.2}
+% \item
+% Module \xmodule{dotfillmin} added.
+% \item
+% Module \xmodule{base}: macros \cs{zref@require@uniqe}
+% and \cs{thezref@unique} added
+% (used by modules \xmodule{titleref} and \xmodule{dotfillmin}).
+% \end{Version}
+% \begin{Version}{2006/09/08 v1.3}
+% \item
+% Typo fixes and English cleanup by Per Starback.
+% \end{Version}
+% \begin{Version}{2007/01/23 v1.4}
+% \item
+% Typo in macro name fixed in documentation.
+% \end{Version}
+% \begin{Version}{2007/02/18 v1.5}
+% \item
+% \cs{zref@getcurrent} added (suggestion of Igor Akkerman).
+% \item
+% Module \xmodule{savepos} also supports \hologo{XeTeX}.
+% \end{Version}
+% \begin{Version}{2007/04/06 v1.6}
+% \item
+% Fix in modules \xmodule{abspage} and \xmodule{base}:
+% Now counter |abspage| and |zref@unique|
+% are not remembered by \cs{include}.
+% \item
+% Beamer support for module \xmodule{titleref}.
+% \end{Version}
+% \begin{Version}{2007/04/17 v1.7}
+% \item
+% Package \xpackage{atbegshi} replaces \xpackage{everyshi}.
+% \end{Version}
+% \begin{Version}{2007/04/22 v1.8}
+% \item
+% \cs{zref@wrapper@babel} and \cs{zref@refused} are now expandable
+% if babel is not used or \cs{if@safe@actives} is already set to true.
+% (Feature request of Josselin Noirel)
+% \end{Version}
+% \begin{Version}{2007/05/02 v1.9}
+% \item
+% Module \xmodule{titleref}: Some support for \cs{caption} of package
+% \xpackage{longtable}, but only if \cs{label} is given after
+% \cs{caption}.
+% \end{Version}
+% \begin{Version}{2007/05/06 v2.0}
+% \item
+% Uses package \xpackage{etexcmds} for accessing \hologo{eTeX}'s \cs{unexpanded}.
+% \end{Version}
+% \begin{Version}{2007/05/28 v2.1}
+% \item
+% Module \xmodule{titleref} supports caption of package \xpackage{listings}.
+% \item
+% Fixes in module \xmodule{titleref} for support
+% of packages \xpackage{titlesec} and \xpackage{longtable}.
+% \end{Version}
+% \begin{Version}{2008/09/21 v2.2}
+% \item
+% Module \xmodule{base}: \cs{zref@iflistcontainsprop} is documented, but
+% a broken \cs{zref@listcontainsprop} implemented. Name and
+% implementation fixed (thanks Ohad Kammar).
+% \end{Version}
+% \begin{Version}{2008/10/01 v2.3}
+% \item
+% \cs{zref@localaddprop} added (feature request of Ohad Kammar).
+% \item
+% Module \xmodule{lastpage}: list `LastPage' added. Label `LastPage' will use
+% the properties of this list (default is empty) along with the
+% properties of the main list.
+% \end{Version}
+% \begin{Version}{2009/08/07 v2.4}
+% \item
+% Module \xmodule{runs} added.
+% \end{Version}
+% \begin{Version}{2009/12/06 v2.5}
+% \item
+% Module \xmodule{lastpage}: Uses package \xpackage{atveryend}.
+% \item
+% Module \xmodule{titleref}: Further commands are disabled
+% during string expansion, imported from package \xpackage{nameref}.
+% \end{Version}
+% \begin{Version}{2009/12/07 v2.6}
+% \item
+% Version date added for package \xpackage{atveryend}.
+% \end{Version}
+% \begin{Version}{2009/12/08 v2.7}
+% \item
+% Module \xmodule{titleref}: Use of package \xpackage{gettitlestring}.
+% \end{Version}
+% \begin{Version}{2010/03/26 v2.8}
+% \item
+% \cs{zifrefundefined} added.
+% \item
+% Module \xmodule{lastpage}: Macros \cs{zref@iflastpage}
+% and \cs{ziflastpage} added.
+% \item
+% Module \xmodule{thepage} added.
+% \item
+% Module \xmodule{nextpage} added.
+% \end{Version}
+% \begin{Version}{2010/03/29 v2.9}
+% \item
+% Module \xmodule{marks} added (without documentation).
+% \item
+% \cs{zref@addprop} now adds expanded property to list.
+% \item
+% Useless \cs{ZREF@ErrorNoLine} removed.
+% \end{Version}
+% \begin{Version}{2010/04/08 v2.10}
+% \item
+% Module \xmodule{xr} remembers the external document name
+% in property `externaldocument'.
+% \end{Version}
+% \begin{Version}{2010/04/15 v2.11}
+% \item
+% Module \xmodule{titleref}: Better support of class \xclass{memoir}.
+% \item
+% Module \xmodule{titleref}: Support of theorems.
+% \end{Version}
+% \begin{Version}{2010/04/17 v2.12}
+% \item
+% Module \xmodule{base}: \cs{zref@newprop} ensures global
+% empty default.
+% \item
+% Module \xmodule{xr}: Setup options \xoption{tozreflabel}
+% and \xoption{toltxlabel} added.
+% \end{Version}
+% \begin{Version}{2010/04/19 v2.13}
+% \item
+% \cs{zref@setcurrent} throws an error if the property
+% does not exist (Florent Chervet).
+% \item
+% \cs{zref@getcurrent} the documentation is fixed (Florent Chervet).
+% Also it returns the empty string in case of errors.
+% \item
+% \cs{zref@addprop} and \cs{zref@localaddprop} now take a list of
+% property names (feature request of Florent Chervet).
+% \item
+% Example for \cs{zref@wrapper@unexpanded} corrected (Florent Chervet).
+% \end{Version}
+% \begin{Version}{2010/04/22 v2.14}
+% \item
+% Bug fix for \cs{zref@getcurrent} second argument wasn't eaten in
+% case of unknown property.
+% \item
+% \cs{zref@getcurrent} supports \cs{zref@wrapper@unexpanded}.
+% \item
+% \cs{zref@wrapper@unexpanded} added for \cs{ZREF@xr@tolabel}.
+% \item
+% \cs{zref@extract}, \cs{zref@extractdefault}, \cs{zref@getcurrent}
+% are expandable in exact two steps
+% except inside \cs{zref@wrapper@unexpanded}.
+% \end{Version}
+% \begin{Version}{2010/04/23 v2.15}
+% \item
+% \cs{zexternaldocument} fixed for property `url' when
+% importing \cs{new@label} (bug found by Victor Ivrii).
+% \item
+% Two expansion steps also in \cs{zref@wrapper@unexpanded}.
+% \item
+% Nested calls of \cs{zref@wrapper@unexpanded} possible.
+% \end{Version}
+% \begin{Version}{2010/04/28 v2.16}
+% \item
+% More consequent use of package `ltxcmds' and `hologo'.
+% \item
+% Module \xmodule{pagelayout} added.
+% \item
+% Module \xmodule{pageattr} added.
+% \item
+% Robustness introduced for non-expandable interface macros.
+% \item
+% Internal change of the data format of property lists
+% (suggestion of Florent Chervet).
+% \item
+% Module \xmodule{titleref}: Support of environment \textsf{description}.
+% \end{Version}
+% \begin{Version}{2010/05/01 v2.17}
+% \item
+% \cs{zref@newprop} throws an error if the property already exists.
+% \item
+% Module \xmodule{xr}: Bug fix for the case of several \xext{aux} files
+% (bug found by Victor Ivrii).
+% \item
+% Module \xmodule{xr}: Property `urluse' and option \xoption{urluse} added.
+% \end{Version}
+% \begin{Version}{2010/05/13 v2.18}
+% \item
+% Module \xmodule{env} added.
+% \item
+% Module \xmodule{savepos}: \cs{zref@savepos} added.
+% \end{Version}
+% \begin{Version}{2010/10/22 v2.19}
+% \item
+% \cs{zref@addprop} and \cs{zref@localaddprop} are limited
+% to one property only
+% (incompatibility to versions v2.13 to v2.18).
+% \item
+% \cs{zref@addprops} and \cs{zref@localaddprops} added.
+% \item
+% \cs{zref@delprop} and \cs{zref@localdelprop} added.
+% \item
+% \cs{zref@labelbykv} and \cs{zkvlabel} (module \xmodule{user})
+% with keys \xoption{prop}, \xoption{list}, \xoption{delprop},
+% \xoption{immediate}, \xoption{values} added.
+% \end{Version}
+% \begin{Version}{2011/02/12 v2.20}
+% \item
+% Fix for warning in \xpackage{zref-xr}.
+% \end{Version}
+% \begin{Version}{2011/03/18 v2.21}
+% \item
+% Fix in module \xmodule{pagelayout} for \cs{zlistpagelayout}.
+% \item
+% Fix for \cs{zref@localaddprop} (probably since v2.19).
+% \end{Version}
+% \begin{Version}{2011/10/05 v2.22}
+% \item
+% Documentation fixed for \cs{zref@(local)addprop(s)}.
+% \item
+% Module \xmodule{base}: \cs{zref@def@extract}, \cs{zref@def@extractdefault}
+% added.
+% \item
+% Fix in module \xmodule{pagelayout}: Because of missing \cs{noexpand}
+% commands the values of the pagelayout properties on all pages were
+% the values at package loading.
+% \item
+% Module \xmodule{base}: \cs{zref@showprop} added.
+% \end{Version}
+% \begin{Version}{2011/12/05 v2.23}
+% \item
+% Module \xmodule{savepos}: \cs{zsaveposx} and \cs{zsaveposy} added.
+% \end{Version}
+% \begin{Version}{2012/04/04 v2.24}
+% \item
+% Module \xmodule{titleref}, package \xpackage{titlesec}:
+% some support for class `straight' (\cs{ttl@straight@i}) added.
+% \end{Version}
+% \begin{Version}{2016/05/16 v2.25}
+% \item
+% Documentation updates.
+% \end{Version}
+% \begin{Version}{2016/05/21 v2.26}
+% \item
+% update zref-savepos for new luatex
+% \end{Version}
+% \begin{Version}{2018/11/21 v2.27}
+% \item
+% adapted zref-perpage, see issue https://github.com/ho-tex/zref/issues/2
+% \end{Version}
+% \begin{Version}{2019/11/29 v2.28}
+% \item
+% Documentation updates.
+% \item
+% Use \xpackage{iftex} directly.
+% \end{Version}
+% \end{History}
+%
+% \PrintIndex
+%
+% \Finale
+\endinput