texlive[46549] Master: cleveref (5feb18)

commits+karl at tug.org commits+karl at tug.org
Mon Feb 5 22:55:40 CET 2018


Revision: 46549
          http://tug.org/svn/texlive?view=revision&revision=46549
Author:   karl
Date:     2018-02-05 22:55:39 +0100 (Mon, 05 Feb 2018)
Log Message:
-----------
cleveref (5feb18)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/cleveref/cleveref.pdf
    trunk/Master/texmf-dist/source/latex/cleveref/cleveref.dtx
    trunk/Master/texmf-dist/source/latex/cleveref/cleveref.ins
    trunk/Master/texmf-dist/tex/latex/cleveref/cleveref.sty
    trunk/Master/tlpkg/libexec/ctan2tds

Modified: trunk/Master/texmf-dist/doc/latex/cleveref/cleveref.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/cleveref/cleveref.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/cleveref/cleveref.dtx	2018-02-05 12:35:05 UTC (rev 46548)
+++ trunk/Master/texmf-dist/source/latex/cleveref/cleveref.dtx	2018-02-05 21:55:39 UTC (rev 46549)
@@ -1,9 +1,9 @@
-\def\packagedate{2013/12/28}
-\def\packageversion{0.19}
+\def\packagedate{2017/07/10}
+\def\packageversion{0.21}
 % \iffalse meta-comment
 %
 % Package 'cleveref' to use with LaTeX2e
-% Copyright 2006--2013 Toby Cubitt
+% Copyright 2006--2017 Toby Cubitt
 %
 % Written and maintained by Toby Cubitt
 %
@@ -46,7 +46,7 @@
 %</driver>
 % \fi
 %
-% \CheckSum{19622}
+% \CheckSum{19606}
 %% \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
@@ -279,13 +279,47 @@
 %   \package{algorithm2e} + \package{hyperref} support.}
 % \changes{v0.18.9}{2013/03/22}{Fixed regression that broke
 %   \option{nameinlink} option.}
-%   \changes{v0.19}{2013/12/28}{Added \package{breqn} package support.
+% \changes{v0.19}{2013/12/28}{Added \package{breqn} package support.
 %   Remove unwanted spaces in some macros. Added abbreviation for
-%   ``Abbildung'' to German translations. Added \package{xr-hyperref}
+%   ``Abbildung'' to German translations. Added \package{xr-hyper}
 %   package support. Fixed bug in \package{amsmath} \textbackslash{}tag
 %   support. Added \textbackslash{}crefstripprefix utility macro and
 %   example usage. Added separate \texttt{subequation} cross-reference
 %   type.}
+% \changes{v0.19.1}{2014/08/14}{Fixed bug in \textbackslash{}labelcref
+%   format customization. Fixed subtle \textbackslash{}varioref bug
+%   caused by a stray \%. Fixed typo in Swedish translations. Fix
+%   \textbackslash{}setcrefrange to use same test for matching reference
+%   types \textbackslash{}cref at processgroup and
+%   \textbackslash{}cref at processgroupall.}
+% \changes{v0.19.2}{2015/11/18}{Fixed compatibility with REFTeX
+%   \textbackslash{}appendix* command. Added catalan language support.
+%   Fix \textbackslash{}@bsphack/\textbackslash{}@esphack spacing issues
+%   in \textbackslash{}label refefinitions. Fix \textbackslash{}crefalias
+%   mechanism in \package{hyperref} support. Fix bugs in \package{breqn}
+%   and \package{varioref} support. Ensure any undefined
+%   \textbackslash{}labelcref formats for sub-types (subsections,
+%   subequations etc.) are copied from parent types. (This fixes missing
+%   brackets around \textbackslash{}labelcref subequation references.)}
+% \changes{v0.20}{2016/08/10}{Fix erroneous \%'s after
+%   \textbackslash{}advance which broke \package{varioref} support.
+%   Add \textbackslash{}cref at ifstreq utility macro for
+%   catcode-independent string comparison.
+%   Fix sorting of enum\meta{x} labels.}
+% \changes{v0.21}{2017/07/10}{Add \texttt{cref@} prefix to
+%   \textbackslash{}gobble at optarg to avoid conflicts with other packages.
+%   Compress away duplicate references in \textbackslash{}cref etc.\ just
+%   as we already did for \textbackslash{}cpageref. Fix
+%   \textbackslash{}cpageref error on non-arabic page numbers. Fix bug
+%   that disabled warning on more than one reference type within a
+%   \textbackslash{}labelcref. Refactor \textbackslash{}cpageref to use
+%   same machinery as \textbackslash{}cref, treating different page
+%   numbering schemes within a document as different page number
+%   ``types''. Refactor and simplify main \textbackslash{}@cref macro.
+%   Fix compatibility with newer IEEEtrantools versions. Fix subtle
+%   bug in \package{amsmath}$+$\package{hyperref} subequations support,
+%   which made hyperlinks point to wrong location in \emph{all} equations
+%   following the first use of subequations in a document.}
 %
 % \GetFileInfo{cleveref.sty}
 %
@@ -415,21 +449,21 @@
 % it all out for you automaticaly.
 %
 % \package{Cleveref} supports a number of languages other than English,
-% and also supports the \package{babel} package for those languages.
-% Either pass the desired language as an option to \package{cleveref}, or
-% pass it as a global option to |\documentclass|. Note that if you're
-% writing in a language in which nouns decline, the |\cref| and
-% |\cpageref| commands may be less useful, as they always produce the
-% cross-reference name in the nominative case.\footnote{Providing
-% separate variants of the \package{cleveref} commands for each noun case
-% quickly becomes more cumbersome than just typing the cross-reference
-% name by hand. Trying to determine the appropriate case automatically
-% would be tantamount to solving the full natural-language processing
-% problem in \package{cleveref}. Check back in a century or so for this
-% feature.} In such languages, you may instead prefer to use the
-% |\labelcref| and |\labelcpageref| commands. Unlike |\cref| and
-% |\cpageref|, these don't produce the name in front of the
-% cross-reference, so you must supply it (in the appropriate case)
+% and also supports the \package{babel} and \package{polyglossia}
+% packages for those languages. Either pass the desired language as an
+% option to \package{cleveref}, or pass it as a global option to
+% |\documentclass|. Note that if you're writing in a language in which
+% nouns decline, the |\cref| and |\cpageref| commands may be less useful,
+% as they always produce the cross-reference name in the nominative
+% case.\footnote{Providing separate variants of the \package{cleveref}
+% commands for each noun case quickly becomes more cumbersome than just
+% typing the cross-reference name by hand. Trying to determine the
+% appropriate case automatically would be tantamount to solving the full
+% natural-language processing problem in \package{cleveref}. Check back
+% in a century or so for this feature.} In such languages, you may
+% instead prefer to use the |\labelcref| and |\labelcpageref| commands.
+% Unlike |\cref| and |\cpageref|, these don't produce the name in front
+% of the cross-reference, so you must supply it (in the appropriate case)
 % yourself. But they do still cope with multi-references, so you still
 % gain some benefit from using \package{cleveref}.
 %
@@ -837,7 +871,7 @@
 % hyperlink target than the others.
 %
 %
-% \subsection{Avoiding Abbreviations in Cross-Reference Names}
+% \subsection{Abbreviations in Cross-Reference Names}
 % \label{sec:noabbrev}
 % \DescribeMacro{noabbrev}
 % The default cross-reference names for some languages use common
@@ -848,9 +882,19 @@
 % abbreviations in the default cross-reference names, pass the
 % \option{noabbrev} option to the \package{cleveref} package.
 %
+% Note that the default names \emph{never} use abbreviations for the
+% start-of-sentence variants (|\Cref| etc.)
+% This is because in good written English (and likely other languages
+% too), abbreviations should never be used at the beginning of a
+% sentence. Many of \TeX{}'s default settings (e.g.\ page margins) are
+% specifically chosen to encourage good typesetting style.
+% \package{Cleveref} tried to follow the same philosophy. If despite this
+% you insist on using abbreviations at the start of sentences, you will
+% need to customise the start-of-sentence formats yourself.
 %
 %
 %
+%
 % \section{Customising the Cross-Reference Formats}
 % \label{sec:customising}
 % The \package{cleveref} package allows you to take full control of the
@@ -1414,12 +1458,17 @@
 % the usual way, though not all languages are supported
 % yet.\footnote{Contributions of translations for missing languages are
 % very welcome! See \cref{sec:new-features} for information on how to
-% contribute translations.} The \package{babel} package is also supported
-% when it is loaded, allowing you to change the language used in
-% cross-references using the \package{babel} language switching commands,
-% such as |\selectlanguage| and |\foreignlanguage|. Similar support is
-% provided for the \package{polyglossia} babel replacement package.
+% contribute translations.} Basic \package{cleveref} language support
+% will work even if \package{babel} or \package{polyglossia} are not
+% loaded. The only exception currently is Catalan (which requires the
+% |\lgem| command provided by these packages).
 %
+% The \package{babel} package is fully supported if it is loaded,
+% allowing you to change the language used in cross-references using the
+% \package{babel} language switching commands, such as |\selectlanguage|
+% and |\foreignlanguage|. Similar support is provided for the
+% \package{polyglossia} babel replacement package.
+%
 % Note that when using \package{babel}, you still need to tell
 % \package{cleveref} which language it should use for the default
 % cross-reference formats. It is \emph{not} sufficient to pass the
@@ -1502,7 +1551,7 @@
 % cross-reference names are stored in macros called
 % |\cref@|\meta{type}|@name|, |\Cref@|\meta{type}|@name|,
 % |\cref@|\meta{type}|@name at plural|, and
-% |\Cref@|\meta{type}|@name at plural|.\linebreak[4] (Note that since these
+% |\Cref@|\meta{type}|@name at plural|. (Note that since these
 % macro names contain the ``@'' character, you must use |\makeatletter|
 % and |\makeatother| to access them.)
 %
@@ -1694,7 +1743,7 @@
 %
 %
 %
-% \section{Known Bugs, Non-Bugs, and Possible}
+% \section{Known Bugs, Non-Bugs, and Possible Improvements}
 % \label{sec:known_bugs}
 %
 % \subsection{Non-Bugs}\label{sec:non-bugs}
@@ -1842,23 +1891,28 @@
 % contributing the \package{amsthm} support code, and to Stefan Pinnow,
 % Gonzalo Medina, Massimo Redaelli, Philip H\"olzenspies, Aleksander
 % Gorohovski, Benjamin H{\o}yer, Johannes Mueller, Paulo Roberto Massa
-% Cereda and Simon Sigurdhsson for contributing translations. Thanks also
-% to Susanna Goldschmidt for additional help with the translations. Many
-% people have suggested improvements or reported bugs -- indeed, many
-% have put significant effort into helping investigate and fix them. So
-% thanks (in alphabetical order) to: Adrian Knoth, Akim Demaille, Alan
-% Munn, Aleksander Gorohovski, Anand Deopurkar, Andreas Haselbacher, Arne
-% Meier, Bas Ploeger, Dan Luecking, David Gleich, Denis Bitouz\'e,
-% Domenic Denicola, Donald Ars\-en\-eau, Hendrik Maryns, Iain Cunningham,
-% James Sharam, Jens Mueller, Joel C. Salomon, Jonas Nyrup, Joris Pinkse,
-% Kristian Debrabant, Leo Shidai Liu, Lev Bishop, Mak Trifkovic, Matej
-% Batic, Matt Gately, Matthew Skala, Michael Barber, Michael Gorven,
-% Michal Kaut, Mico Loretan, Nicolas Dudebout, Olivier Roy, Patrick
-% H\"acker, Paul Gomme, Ricardo de Aldama S\'anchez, Robert Fischer,
-% Stefan Pinnow, Steve Dower, Ted Pavlic, Thomas Arildsen, and Uwe L\"uck
-% for their help. (If I missed you out, please let me know!)
+% Cereda, Simon Sigurdhsson, Rafel Jaume Dey\`a and Eva Bosch Roura for
+% contributing translations. Thanks also to Susanna Goldschmidt for
+% additional help with the translations.
 %
+% Many people have suggested improvements or reported bugs -- indeed,
+% many have put significant effort into helping investigate and fix them.
+% So thanks (in alphabetical order) to: Adrian Knoth, Akim Demaille, Alan
+% Munn, Aleksander Gorohovski, Amar Ghaisas, Anand Deopurkar, Andreas
+% Haselbacher, Arne Meier, Bas Ploeger, Christian Tuma, Dan Luecking,
+% David Gleich, Denis Bitouz\'e, Domenic Denicola, Donald Ars\-en\-eau,
+% Eric Ahlberg, Frank Mittlebach, Hendrik Maryns, Iain Cunningham, Ingolf
+% Becker, James Sharam, Jens Mueller, Joel C.
+% Salomon, Jonas Nyrup, Joris Pinkse, Kristian Debrabant, Leo Shidai Liu,
+% Lev Bishop, Mak Trifkovic, Matej Batic, Matt Gately, Matthew Skala,
+% Michael Barber, Michael Gorven, Michal Kaut, Mico Loretan, Milania,
+% Nicolas Dudebout, Olivier Roy, Patrick H\"acker, Paul Gomme, Ricardo de
+% Aldama S\'anchez, Robert Fischer, Sebastian \O{}rsted, Stefan Pinnow,
+% Steve Dower, Ted Pavlic, Thomas Arildsen, Tobias Jores, Uwe L\"uck and
+% Vadim Makarov for their help.
+% (If I inadvertently missed you out, please let me know!)
 %
+%
 % \StopEventually{\clearpage\PrintChanges\clearpage\PrintIndex}
 %
 %
@@ -1973,19 +2027,31 @@
   \def\label{\@ifnextchar[\label at optarg\label at noarg}%]
   \let\cref at label\label%
   \def\label at noarg#1{%
+    \cref at old@label{#1}%
     \@bsphack%
-    \cref at old@label{#1}%
+    \edef\@tempa{{page}{\the\c at page}}%
+    \setcounter{page}{1}%
+    \edef\@tempb{\thepage}%
+    \expandafter\setcounter\@tempa%
+    \cref at constructprefix{page}{\cref at result}%
     \protected at write\@auxout{}%
-      {\string\newlabel{#1 at cref}{{\cref at currentlabel}{\thepage}}}%
+      {\string\newlabel{#1 at cref}{{\cref at currentlabel}%
+      {[\@tempb][\arabic{page}][\cref at result]\thepage}}}%
     \@esphack}%
   \def\label at optarg[#1]#2{%
+    \cref at old@label{#2}%
     \@bsphack%
-    \cref at old@label{#2}%
+    \edef\@tempa{{page}{\the\c at page}}%
+    \setcounter{page}{1}%
+    \edef\@tempb{\thepage}%
+    \expandafter\setcounter\@tempa%
+    \cref at constructprefix{page}{\cref at result}%
     \protected at edef\cref at currentlabel{%
       \expandafter\cref at override@label at type%
         \cref at currentlabel\@nil{#1}}%
     \protected at write\@auxout{}%
-      {\string\newlabel{#2 at cref}{{\cref at currentlabel}{\thepage}}}%
+      {\string\newlabel{#2 at cref}{{\cref at currentlabel}%
+      {[\@tempb][\arabic{page}][\cref at result]\thepage}}}%
     \@esphack}%
 }% end of AtBeginDocument
 %    \end{macrocode}
@@ -2151,11 +2217,12 @@
 %   ``chapter'' fulfils that role.
 %    \begin{macrocode}
 \@ifundefined{appendix}{}{%
-  \g at addto@macro\appendix{%
+  \let\cref at old@appendix\appendix%
+  \def\appendix{%
     \@ifundefined{chapter}{%
-      \gdef\refstepcounter at noarg#1{%
-        \cref at old@refstepcounter{#1}%
-        \cref at constructprefix{#1}{\cref at result}%
+      \gdef\refstepcounter at noarg##1{%
+        \cref at old@refstepcounter{##1}%
+        \cref at constructprefix{##1}{\cref at result}%
 %    \end{macrocode}
 %     We add a large value to the front of the counter data, to force
 %     references to anything in appendices to be sorted after everything
@@ -2169,40 +2236,41 @@
 %    \end{macrocode}
 %       Override the cross-reference type of sectioning commands.
 %    \begin{macrocode}
-        \def\@tempa{#1}%
+        \def\@tempa{##1}%
         \def\@tempb{section}%
         \ifx\@tempa\@tempb%
           \protected at edef\cref at currentlabel{%
-            [appendix][\arabic{#1}][\cref at result]%
-            \csname p@#1\endcsname\csname the#1\endcsname}%
+            [appendix][\arabic{##1}][\cref at result]%
+            \csname p@##1\endcsname\csname the##1\endcsname}%
         \else%
-          \def\@tempa{#1}%
+          \def\@tempa{##1}%
           \def\@tempb{subsection}%
           \ifx\@tempa\@tempb%
             \protected at edef\cref at currentlabel{%
-              [subappendix][\arabic{#1}][\cref at result]%
-              \csname p@#1\endcsname\csname the#1\endcsname}%
+              [subappendix][\arabic{##1}][\cref at result]%
+              \csname p@##1\endcsname\csname the##1\endcsname}%
           \else%
-            \def\@tempa{#1}%
+            \def\@tempa{##1}%
             \def\@tempb{subsubsection}%
             \ifx\@tempa\@tempb%
               \protected at edef\cref at currentlabel{%
-                [subsubappendix][\arabic{#1}][\cref at result]%
-                \csname p@#1\endcsname\csname the#1\endcsname}%
+                [subsubappendix][\arabic{##1}][\cref at result]%
+                \csname p@##1\endcsname\csname the##1\endcsname}%
             \else%
-              \@ifundefined{cref@#1 at alias}%
-                {\def\@tempa{#1}}%
-                {\def\@tempa{\csname cref@#1 at alias\endcsname}}%
+              \@ifundefined{cref@##1 at alias}%
+                {\def\@tempa{##1}}%
+                {\def\@tempa{\csname cref@##1 at alias\endcsname}}%
               \protected at edef\cref at currentlabel{%
-                [\@tempa][\arabic{#1}][\cref at result]%
-                \csname p@#1\endcsname\csname the#1\endcsname}%
+                [\@tempa][\arabic{##1}][\cref at result]%
+                \csname p@##1\endcsname\csname the##1\endcsname}%
             \fi%
           \fi%
         \fi}%
+      \cref at old@appendix%
     }{%
-      \def\refstepcounter at noarg#1{%
-        \cref at old@refstepcounter{#1}%
-        \cref at constructprefix{#1}{\cref at result}%
+      \def\refstepcounter at noarg##1{%
+        \cref at old@refstepcounter{##1}%
+        \cref at constructprefix{##1}{\cref at result}%
 %    \end{macrocode}
 %     Again, the large value added to the front of the counter data forces
 %     references to appendix items to be sorted last.
@@ -2215,45 +2283,45 @@
 %    \end{macrocode}
 %       Override the cross-reference type of sectioning commands.
 %    \begin{macrocode}
-        \def\@tempa{#1}%
+        \def\@tempa{##1}%
         \def\@tempb{chapter}%
         \ifx\@tempa\@tempb%
           \protected at edef\cref at currentlabel{%
-            [appendix][\arabic{#1}][\cref at result]%
-            \csname p@#1\endcsname\csname the#1\endcsname}%
+            [appendix][\arabic{##1}][\cref at result]%
+            \csname p@##1\endcsname\csname the##1\endcsname}%
         \else%
-          \def\@tempa{#1}%
+          \def\@tempa{##1}%
           \def\@tempb{section}%
           \ifx\@tempa\@tempb%
             \protected at edef\cref at currentlabel{%
-              [subappendix][\arabic{#1}][\cref at result]%
-              \csname p@#1\endcsname\csname the#1\endcsname}%
+              [subappendix][\arabic{##1}][\cref at result]%
+              \csname p@##1\endcsname\csname the##1\endcsname}%
           \else%
-            \def\@tempa{#1}%
+            \def\@tempa{##1}%
             \def\@tempb{subsection}%
             \ifx\@tempa\@tempb%
               \protected at edef\cref at currentlabel{%
-                [subsubappendix][\arabic{#1}][\cref at result]%
-                \csname p@#1\endcsname\csname the#1\endcsname}%
+                [subsubappendix][\arabic{##1}][\cref at result]%
+                \csname p@##1\endcsname\csname the##1\endcsname}%
             \else%
-              \def\@tempa{#1}%
+              \def\@tempa{##1}%
               \def\@tempb{subsubsection}%
               \ifx\@tempa\@tempb%
                 \protected at edef\cref at currentlabel{%
-                  [subsubsubappendix][\arabic{#1}][\cref at result]%
-                  \csname p@#1\endcsname\csname the#1\endcsname}%
+                  [subsubsubappendix][\arabic{##1}][\cref at result]%
+                  \csname p@##1\endcsname\csname the##1\endcsname}%
               \else%
-                \@ifundefined{cref@#1 at alias}%
-                  {\def\@tempa{#1}}%
-                  {\def\@tempa{\csname cref@#1 at alias\endcsname}}%
+                \@ifundefined{cref@##1 at alias}%
+                  {\def\@tempa{##1}}%
+                  {\def\@tempa{\csname cref@##1 at alias\endcsname}}%
                 \protected at edef\cref at currentlabel{%
-                  [\@tempa][\arabic{#1}][\cref at result]%
-                  \csname p@#1\endcsname\csname the#1\endcsname}%
+                  [\@tempa][\arabic{##1}][\cref at result]%
+                  \csname p@##1\endcsname\csname the##1\endcsname}%
               \fi%
             \fi%
           \fi%
         \fi}%
-    }%
+    \cref at old@appendix}%
   }%
 }% end of \@ifundefined{appendix}
 %    \end{macrocode}
@@ -2264,13 +2332,13 @@
 % \subsection{Utility Macros}
 %
 % \subsubsection{miscellaneous}
-% \begin{macro}{\@gobble at optarg}
+% \begin{macro}{\cref at gobble@optarg}
 %   A basic macro that gobbles one argument plus, if present, one
 %   optional argument.
 %    \begin{macrocode}
-\def\@gobble at optarg{\@ifnextchar[\@@gobble at optarg\@gobble at orig}%]
-\def\@gobble at orig#1{}%
-\def\@@gobble at optarg[#1]#2{}%
+\def\cref at gobble@optarg{\@ifnextchar[\@cref at gobble@optarg\cref at gobble}%]
+\def\cref at gobble#1{}%
+\def\@cref at gobble@optarg[#1]#2{}%
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2283,7 +2351,30 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\cref at ifstreq}
+%   A utility macro to test string equality in a catcode-independent
+%   fashion. Assumes both arguments are fully expandable. Note: using the
+%   |\pdfstrcmp| primitive from |pdftex| would be more robust, but we don't
+%   want to depend on |pdftex|. This macro suffices for our purposes.
+%    \begin{macrocode}
+\def\cref at ifstreq#1#2#3#4{%
+  \begingroup%
+    \edef\@tempa{#1}%
+    \edef\@tempb{#2}%
+    \expandafter\def\expandafter\@tempa\expandafter{\csname\@tempa\endcsname}%
+    \expandafter\def\expandafter\@tempb\expandafter{\csname\@tempb\endcsname}%
+    \ifx\@tempa\@tempb%
+      \let\@tempc\@firstoftwo%
+    \else%
+      \let\@tempc\@secondoftwo%
+    \fi%
+    \expandafter%
+  \endgroup%
+  \@tempc{#3}{#4}}%
+%    \end{macrocode}
+% \end{macro}
 %
+%
 % \subsubsection{\file{aux} file information}
 % \begin{macro}{\cref at getlabel}
 % \begin{macro}{\cref at gettype}
@@ -2310,12 +2401,6 @@
     \expandafter\expandafter\expandafter#2%
     \expandafter\expandafter\expandafter{%
       \expandafter\@firstoftwo#2}}%
-\def\cref at getpageref#1#2{%
-  \expandafter\let\expandafter#2\csname r@#1 at cref\endcsname%
-  \expandafter\expandafter\expandafter\def%
-    \expandafter\expandafter\expandafter#2%
-    \expandafter\expandafter\expandafter{%
-      \expandafter\@secondoftwo#2}}%
 \def\cref at getlabel#1#2{%
   \cref at getref{#1}{\@tempa}%
   \expandafter\@cref at getlabel\@tempa\@nil#2}%
@@ -2345,6 +2430,49 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \begin{macro}{\cpageref at getlabel}
+% \begin{macro}{\cpageref at gettype}
+% \begin{macro}{\cpageref at getcounter}
+%   Similarly for the page number information. Here, the information we
+%   store in addition to the page label is the page label ``type'' (used
+%   to distinguish different page numbering sequences, e.g.\ roman in the
+%   front-matter and arabic in the main text), and the numerical value of
+%   the page counter.
+%    \begin{macrocode}
+\def\cpageref at getref#1#2{%
+  \expandafter\let\expandafter#2\csname r@#1 at cref\endcsname%
+  \expandafter\expandafter\expandafter\def%
+    \expandafter\expandafter\expandafter#2%
+    \expandafter\expandafter\expandafter{%
+      \expandafter\@secondoftwo#2}}%
+\def\cpageref at getlabel#1#2{%
+  \cpageref at getref{#1}{\@tempa}%
+  \expandafter\@cpageref at getlabel\@tempa\@nil#2}%
+\def\@cpageref at getlabel{\@ifnextchar[%]
+  \@@cpageref at getlabel{\@@cpageref at getlabel[][][]}}%
+\def\@@cpageref at getlabel[#1][#2][#3]#4\@nil#5{\def#5{#4}}%
+\def\cpageref at gettype#1#2{%
+  \cpageref at getref{#1}{\@tempa}%
+  \expandafter\@cpageref at gettype\@tempa\@nil#2}%
+\def\@cpageref at gettype{\@ifnextchar[%]
+  \@@cpageref at gettype{\@@cpageref at gettype[][][]}}%
+\def\@@cpageref at gettype[#1][#2][#3]#4\@nil#5{\def#5{#1}}%
+\def\cpageref at getcounter#1#2{%
+  \cpageref at getref{#1}{\@tempa}%
+  \expandafter\@cpageref at getcounter\@tempa\@nil#2}%
+\def\@cpageref at getcounter{\@ifnextchar[%]
+  \@@cpageref at getcounter{\@@cpageref at getcounter[][][]}}%
+\def\@@cpageref at getcounter[#1][#2][#3]#4\@nil#5{\def#5{#2}}%
+\def\cpageref at getprefix#1#2{%
+  \cpageref at getref{#1}{\@tempa}%
+  \expandafter\@cpageref at getprefix\@tempa\@nil#2}%
+\def\@cpageref at getprefix{\@ifnextchar[%]
+  \@@cpageref at getprefix{\@@cpageref at getprefix[][][]}}%
+\def\@@cpageref at getprefix[#1][#2][#3]#4\@nil#5{\def#5{#3}}%
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 %
 % \cmd{\cref at override@label at type} is a convenience macro for overriding
 % the label type stored in \cmd{\cref at currentlabel}.
@@ -2497,9 +2625,25 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}{\cref at stack@dropempty}
+%   Drop any empty references from head of a stack.
+%    \begin{macrocode}
+\def\cref at stack@dropempty#1{%
+  \edef\@tempa{\cref at stack@top{#1}}%
+  \@whilesw\ifx\@tempa\@empty\fi{%
+    \cref at stack@pop{#1}%
+    \cref at isstackempty{#1}%
+    \if at cref@stackempty%
+      \let\@tempa\relax%
+    \else%
+      \edef\@tempa{\cref at stack@top{#1}}%
+    \fi}}%
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\cref at stack@sort}
-%   The \cmd{\cref at stack@sort} macro sorts a stack, using the comparison
-%   macro passed in the second argument, which we use later to sort lists
+%   The \cmd{\cref at stack@sort} macro sorts a stack passed in |#2|, using
+%   the comparison macro passed in |#1|, which we use later to sort lists
 %   of references. We use insertion sort despite its $O(n^2)$ scaling
 %   because it's simpler to code, and because we're very unlikely to
 %   encounter lists of more than ten or so references, so in practice a
@@ -2512,49 +2656,49 @@
 %    \end{macrocode}
 % Push first element into sorted stack.
 %    \begin{macrocode}
-  \edef\@element{\cref at stack@top{#1}}%
+  \edef\@element{\cref at stack@top{#2}}%
   \expandafter\cref at stack@push\expandafter{\@element}{\@sortstack}%
-  \cref at stack@pop{#1}%
+  \cref at stack@pop{#2}%
 %    \end{macrocode}
 % If empty elements follow first one, need to add them after it in sorted
 % stack.
 %    \begin{macrocode}
-  \cref at isstackfull{#1}%
+  \cref at isstackfull{#2}%
   \if at cref@stackfull%
-    \edef\@tempa{\cref at stack@top{#1}}%
+    \edef\@tempa{\cref at stack@top{#2}}%
     \@whilesw\ifx\@tempa\@empty\fi{%
       \cref at stack@pull{}{\@sortstack}%
-      \cref at stack@pop{#1}%
-      \cref at isstackempty{#1}%
+      \cref at stack@pop{#2}%
+      \cref at isstackempty{#2}%
       \if at cref@stackempty%
         \let\@tempa\relax%
       \else%
-        \edef\@tempa{\cref at stack@top{#1}}%
+        \edef\@tempa{\cref at stack@top{#2}}%
       \fi}%
   \fi%
 %    \end{macrocode}
 % Process elements from stack.
 %    \begin{macrocode}
-  \cref at isstackfull{#1}%
+  \cref at isstackfull{#2}%
   \@whilesw\if at cref@stackfull\fi{%
-    \edef\@element{\cref at stack@top{#1}}%
-    \cref at stack@pop{#1}%
+    \edef\@element{\cref at stack@top{#2}}%
+    \cref at stack@pop{#2}%
 %    \end{macrocode}
 % If empty elements follow current one, need to add them to sorted stack,
 % right after element we're currently dealing with.
 %    \begin{macrocode}
     \def\@empties{}%
-    \cref at isstackfull{#1}%
+    \cref at isstackfull{#2}%
     \if at cref@stackfull%
-      \edef\@tempa{\cref at stack@top{#1}}%
+      \edef\@tempa{\cref at stack@top{#2}}%
       \@whilesw\ifx\@tempa\@empty\fi{%
         \edef\@empties{\@empties,}%
-        \cref at stack@pop{#1}%
-        \cref at isstackempty{#1}%
+        \cref at stack@pop{#2}%
+        \cref at isstackempty{#2}%
         \if at cref@stackempty%
           \let\@tempa\relax%
         \else%
-          \edef\@tempa{\cref at stack@top{#1}}%
+          \edef\@tempa{\cref at stack@top{#2}}%
         \fi}%
     \fi%
 %    \end{macrocode}
@@ -2563,11 +2707,11 @@
 %    \begin{macrocode}
     \edef\@tempa{{\expandafter\noexpand\@element}%
       {\expandafter\noexpand\@empties}%
-      {\noexpand\@sortstack}{\noexpand#2}}%
+      {\noexpand\@sortstack}{\noexpand#1}}%
     \expandafter\cref at stack@insert\@tempa%
-    \cref at isstackfull{#1}}%
+    \cref at isstackfull{#2}}%
   \expandafter\endgroup\expandafter%
-  \def\expandafter#1\expandafter{\@sortstack}}%
+  \def\expandafter#2\expandafter{\@sortstack}}%
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2610,20 +2754,110 @@
 % \end{macro}
 %
 %
-% \subsubsection{Sorting and comparison of counters}
+% \subsubsection{Reference comparison and sorting}
+% \begin{macro}{\cref at isrefsametype}
+% \begin{macro}{\if at cref@sametype}
+%   Test if two references have same type, and set |\if at cref@sametype|
+%   conditional accordingly.
+%    \begin{macrocode}
+\newif\if at cref@sametype%
+\def\cref at isrefsametype#1#2{%
+  \begingroup%
+%    \end{macrocode}
+% Undefined references are treated as different from any other type, but
+% the same type as each other.
+%    \begin{macrocode}
+  \expandafter\ifx\csname r@#1 at cref\endcsname\relax%
+    \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
+      \def\@after{\@cref at sametypetrue}%
+    \else%
+      \def\@after{\@cref at sametypefalse}%
+    \fi%
+  \else%
+    \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
+      \def\@after{\@cref at sametypefalse}%
+%    \end{macrocode}
+% To test if two references have the same type, we actually compare the
+% expansion of |\cref@|\meta{type}|@format| rather than the \meta{type}
+% per se. This allows references with different counters but identical
+% formatting (e.g.\ equations and subequations with the default
+% formatting) to be typeset as part of the same reference group, which is
+% almost always what we want.
+%    \begin{macrocode}
+    \else%
+      \cref at gettype{#1}{\@type}%
+      \expandafter\expandafter\expandafter\def%
+        \expandafter\expandafter\expandafter\@formata%
+        \expandafter\expandafter\expandafter{%
+          \csname cref@\@type @format\endcsname%
+          {\@dummya}{\@dummyb}{\@dummyc}}%
+      \cref at gettype{#2}{\@type}%
+      \expandafter\expandafter\expandafter\def%
+        \expandafter\expandafter\expandafter\@formatb%
+        \expandafter\expandafter\expandafter{%
+          \csname cref@\@type @format\endcsname%
+          {\@dummya}{\@dummyb}{\@dummyc}}%
+      \ifx\@formata\@formatb%
+        \def\@after{\@cref at sametypetrue}%
+      \else%
+        \def\@after{\@cref at sametypefalse}%
+      \fi%
+    \fi%
+  \fi%
+  \expandafter\endgroup\@after}%
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cpageref at isrefsametype}
+%   Test if two page references have same ``type'', and set
+%   |\if at cref@sametype| conditional accordingly.
+%    \begin{macrocode}
+\def\cpageref at isrefsametype#1#2{%
+  \begingroup%
+%    \end{macrocode}
+% Undefined references are treated as different from any other type, but
+% the same type as each other.
+%    \begin{macrocode}
+  \expandafter\ifx\csname r@#1 at cref\endcsname\relax%
+    \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
+      \def\@after{\@cref at sametypetrue}%
+    \else%
+      \def\@after{\@cref at sametypefalse}%
+    \fi%
+  \else%
+    \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
+      \def\@after{\@cref at sametypefalse}%
+    \else%
+      \cpageref at gettype{#1}{\@typea}%
+      \cpageref at gettype{#2}{\@typeb}%
+      \ifx\@typea\@typeb%
+        \def\@after{\@cref at sametypetrue}%
+      \else%
+        \def\@after{\@cref at sametypefalse}%
+      \fi%
+    \fi%
+  \fi%
+  \expandafter\endgroup\@after}%
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\cref at countercmp}
-%   The \cmd{\cref at countercmp} macro compares two references according to
-%   their respective sets of counter data, as returned by
-%   \cmd{\cref at getcounter}. It \cmd{\chardef}'s its third argument to 0
-%   if they're equal, 1 if the first comes earlier than the second, or 2
-%   if the first comes later than the second. This is used later for
-%   sorting references.
+%   The \cmd{\cref at countercmp} macro compares references |#1| and |#2|
+%   according to their respective sets of counter data (stored in the
+%   \file{aux} file). It \cmd{\chardef}'s |#3| to 0 if they're equal, 1
+%   if the first comes earlier than the second, or 2 if the first
+%   reference comes later than the second. This is used later for sorting
+%   references. \cmd{\cref at countercmp} compares the references
+%   themselves, \cmd{\cpageref at countercmp} compares their page numbers.
 %    \begin{macrocode}
 \def\cref at counter@first#1#2\@nil{#1}%
 \def\cref at counter@rest#1#2\@nil{#2}%
-\def\cref at countercmp#1#2#3{%
+\def\cref at countercmp{\@cref at countercmp{cref}}%
+\def\cpageref at countercmp{\@cref at countercmp{cpageref}}%
+\def\@cref at countercmp#1#2#3#4{%
   \begingroup%
-  \def\@tempa{#1}%
+  \def\@tempa{#2}%
 %    \end{macrocode}
 % In order to ensure empty references end up in the right place when
 % sorting lists of multiple references, we make the comparison macro
@@ -2632,7 +2866,7 @@
   \ifx\@tempa\@empty%
     \def\cref at result{1}%
   \else%
-    \def\@tempa{#2}%
+    \def\@tempa{#3}%
     \ifx\@tempa\@empty%
       \def\cref at result{2}%
     \else%
@@ -2639,20 +2873,20 @@
 %    \end{macrocode}
 % Conversely, undefined references come after everything else.
 %    \begin{macrocode}
-      \expandafter\ifx\csname r@#1 at cref\endcsname\relax%
+      \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
         \def\cref at result{2}%
       \else%
-        \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
+        \expandafter\ifx\csname r@#3 at cref\endcsname\relax%
           \def\cref at result{1}%
         \else%
 %    \end{macrocode}
 % The real work of comparing two references is done by
-% \cmd{\@cref at countercmp}.
+% \cmd{\@@cref at countercmp}.
 %    \begin{macrocode}
-          \cref at getcounter{#1}{\@countera}%
-          \cref at getprefix{#1}{\@prefixa}%
-          \cref at getcounter{#2}{\@counterb}%
-          \cref at getprefix{#2}{\@prefixb}%
+          \csname #1 at getcounter\endcsname{#2}{\@countera}%
+          \csname #1 at getprefix\endcsname{#2}{\@prefixa}%
+          \csname #1 at getcounter\endcsname{#3}{\@counterb}%
+          \csname #1 at getprefix\endcsname{#3}{\@prefixb}%
           \cref at stack@init{\@countstacka}%
           \expandafter\cref at stack@push\expandafter%
             {\@countera}{\@countstacka}%
@@ -2667,21 +2901,21 @@
             \expandafter\cref at stack@push\expandafter%
               {\@prefixb}{\@countstackb}%
           \fi%
-          \@cref at countercmp%
+          \@@cref at countercmp%
         \fi%
       \fi%
     \fi%
   \fi%
   \expandafter\endgroup\expandafter%
-  \chardef\expandafter#3\expandafter=\cref at result\relax}%
+  \chardef\expandafter#4\expandafter=\cref at result\relax}%
 %    \end{macrocode}
 % \end{macro}
-% \begin{macro}{\@cref at countercmp}
-%   The \cmd{\@cref at countercmp} macro recursively compares counter
+% \begin{macro}{\@@cref at countercmp}
+%   The \cmd{\@@cref at countercmp} macro recursively compares counter
 %   components until it runs out of components for one of the references,
 %   or finds two corresponding components that are unequal.
 %    \begin{macrocode}
-\def\@cref at countercmp{%
+\def\@@cref at countercmp{%
   \let\@iterate\relax%
   \cref at isstackempty{\@countstacka}%
   \if at cref@stackempty%
@@ -2706,7 +2940,7 @@
         \ifnum\@tempa>\@tempb\relax%
           \def\cref at result{2}%
         \else%
-          \def\@iterate{\@cref at countercmp}%
+          \def\@iterate{\@@cref at countercmp}%
         \fi%
       \fi%
     \fi%
@@ -2715,60 +2949,6 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\cref at pagecmp}
-%   The \cmd{\cref at pagecmp} macro compares two references according to
-%   their page numbers, as returned by \cmd{\cref at getpage}. It
-%   \cmd{\chardef}'s its third argument to 0 if they're equal, 1 if the
-%   first comes earlier than the second, or 2 if the first comes later
-%   than the second. This is used later for sorting page references.
-%   \begin{macrocode}
-\def\cref at pagecmp#1#2#3{%
-  \begingroup%
-  \def\@tempa{#1}%
-%    \end{macrocode}
-% In order to ensure empty references end up in the right place when
-% sorting lists of multiple references, we make the comparison macro
-% sort them before a non-empty reference.
-%    \begin{macrocode}
-  \ifx\@tempa\@empty%
-    \def\cref at result{1}%
-  \else%
-    \def\@tempa{#2}%
-    \ifx\@tempa\@empty%
-      \def\cref at result{2}%
-    \else%
-%    \end{macrocode}
-% Conversely, undefined references come after everything else.
-%    \begin{macrocode}
-      \expandafter\ifx\csname r@#1 at cref\endcsname\relax%
-        \def\cref at result{2}%
-      \else%
-        \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
-          \def\cref at result{1}%
-        \else%
-%    \end{macrocode}
-% If both references are non-empty and are defined, we compare their page
-% numbers.
-%    \begin{macrocode}
-          \cref at getpageref{#1}{\@tempa}%
-          \cref at getpageref{#2}{\@tempb}%
-          \ifnum\@tempa<\@tempb\relax%
-            \def\cref at result{1}\relax%
-          \else%
-            \ifnum\@tempa>\@tempb\relax%
-              \def\cref at result{2}\relax%
-                \else%
-              \def\cref at result{0}\relax%
-            \fi%
-          \fi%
-        \fi%
-      \fi%
-    \fi%
-  \fi%
-  \expandafter\endgroup\expandafter%
-  \chardef\expandafter#3\expandafter=\cref at result\relax}%
-%    \end{macrocode}
-% \end{macro}
 %
 % \begin{macro}{\if at cref@inresetlist}
 % \begin{macro}{\cref at isinresetlist}
@@ -2833,22 +3013,18 @@
 % If counter in question is |subfigure| or |subtable|, check if it's
 % reset by |figure| or |table|, respectively.
 %    \begin{macrocode}
-  \def\@tempa{#1}%
-  \def\@tempb{subfigure}%
-  \ifx\@tempa\@tempb%
+  \cref at ifstreq{#1}{subfigure}{%
     \cref at isinresetlist{#1}{figure}%
     \if at cref@inresetlist%
       \def#2{figure}%
     \fi%
-  \fi%
-  \def\@tempa{#1}%
-  \def\@tempb{subtable}%
-  \ifx\@tempa\@tempb%
+  }{}%
+  \cref at ifstreq{#1}{subtable}{%
     \cref at isinresetlist{#1}{table}%
     \if at cref@inresetlist%
       \def#2{table}%
     \fi%
-  \fi%
+  }{}%
 %    \end{macrocode}
 % If counter in question is |equation|, and the counter |parentequation|
 % is defined, check if it's reset by that. The |parentequation| counter
@@ -2861,9 +3037,7 @@
 % implement amsmath's |subequations| environment (are there any?).
 %    \begin{macrocode}
   \@ifundefined{cl at parentequation}{}{%
-    \def\@tempa{#1}%
-    \def\@tempb{equation}%
-    \ifx\@tempa\@tempb%
+    \cref at ifstreq{#1}{equation}{%
       \cref at isinresetlist{#1}{parentequation}%
       \if at cref@inresetlist%
         \expandafter\ifnum\c at parentequation=0\else%
@@ -2870,57 +3044,23 @@
           \def#2{parentequation}%
         \fi%
       \fi%
-    \fi}%
+    }{}}%
 %    \end{macrocode}
-% If counter in question is |enum|\meta{x}, check if it's reset by a
-% higher-level |enum|\meta{x}.
+% \LaTeX{} hard-codes resetting of |enum|\meta{x} counters by
+% higher-level |enum|\meta{x} counters, so we hard-code the results for
+% these cases.
 %    \begin{macrocode}
-  \def\@tempa{#1}%
-  \def\@tempb{enumii}%
-  \ifx\@tempa\@tempb%
-    \def#2{enum}%
-  \fi%
-  \def\@tempb{enumiii}%
-  \ifx\@tempa\@tempb%
-    \def#2{enum}%
-  \fi%
-  \def\@tempb{enumiv}%
-  \ifx\@tempa\@tempb%
-    \def#2{enum}%
-  \fi%
-  \def\@tempb{enumv}%
-  \ifx\@tempa\@tempb%
-    \def#2{enum}%
-  \fi%
-  \def\@tempb{enum}%
-  \ifx#2\@tempb%
-    \cref at isinresetlist{#1}{enumiv}%
-    \if at cref@inresetlist%
-      \def#2{enumiv}%
-    \else%
-      \cref at isinresetlist{#1}{enumiii}%
-      \if at cref@inresetlist%
+  \cref at ifstreq{#1}{enumii}{%
+    \def#2{enumi}%
+  }{%
+    \cref at ifstreq{#1}{enumiii}{%
+      \def#2{enumii}%
+    }{%
+      \cref at ifstreq{#1}{enumiv}{%
         \def#2{enumiii}%
-      \else%
-        \cref at isinresetlist{#1}{enumii}%
-        \if at cref@inresetlist%
-          \def#2{enumii}%
-        \else%
-          \cref at isinresetlist{#1}{enumi}%
-          \if at cref@inresetlist%
-            \def#2{enumi}%
-          \else%
-           \cref at isinresetlist{#1}{part}%
-            \if at cref@inresetlist%
-              \def#2{part}%
-            \else%
-              \let#2\relax%
-            \fi%
-          \fi%
-        \fi%
-      \fi%
-    \fi%
-  \fi%
+      }{}%
+    }%
+  }%
 %    \end{macrocode}
 % If we haven't found anything so far, check if it's reset by a
 % sectioning command.
@@ -2965,66 +3105,49 @@
 %
 % \begin{macro}{\if at cref@refconsecutive}
 % \begin{macro}{\cref at isrefconsecutive}
+% \begin{macro}{\cpageref at isrefconsecutive}
 %   Define a new conditional to test whether two references are
-%   consecutive (needed when typesetting reference ranges). This uses
-%   the counter and prefix (i.e.\ formatted version of the counter that
-%   resets the label's counter) information provided by
+%   consecutive (needed when compressing references and typesetting
+%   reference ranges). This uses the counter and prefix (i.e.\ chain of
+%   counters that reset the reference's counter) information provided by
 %   \cmd{\r@\meta{label}@cref} (via the \file{aux} file) to check if the
 %   prefixes are identical (i.e.\ the references come from the same
 %   chapter, section or whatever), and that the label counters differ
-%   by~0 or~1.
+%   by~0 or~1. \cmd{\cref at isrefconsecutive} tests the references
+%   themselves, \cmd{\cpageref at isrefconsecutve} tests their page numbers.
 %    \begin{macrocode}
 \newif\if at cref@refconsecutive%
-\def\cref at isrefconsecutive#1#2{%
+\def\cref at isrefconsecutive{\@cref at isrefconsecutive{cref}}%
+\def\cpageref at isrefconsecutive{\@cref at isrefconsecutive{cpageref}}%
+\def\@cref at isrefconsecutive#1#2#3{%
   \begingroup%
-    \countdef\refa at counter=0%
-    \countdef\refb at counter=1%
-    \cref at getcounter{#1}{\cref at result}%
-    \refa at counter=\cref at result%
-    \cref at getcounter{#2}{\cref at result}%
-    \refb at counter=\cref at result%
-    \cref at getprefix{#1}{\refa at prefix}%
-    \cref at getprefix{#2}{\refb at prefix}%
-    \def\@after{\@cref at refconsecutivefalse}%
-    \ifx\refa at prefix\refb at prefix%
-      \ifnum\refa at counter=\refb at counter\relax%
-        \def\@after{\@cref at refconsecutivetrue}%
-      \else%
-        \advance\refa at counter 1\relax%
+  \def\@after{\@cref at refconsecutivefalse}%
+  \expandafter\ifx\csname r@#2 at cref\endcsname\relax\else%
+    \expandafter\ifx\csname r@#3 at cref\endcsname\relax\else%
+      \countdef\refa at counter=0%
+      \countdef\refb at counter=1%
+      \csname #1 at getcounter\endcsname{#2}{\cref at result}%
+      \refa at counter=\cref at result%
+      \csname #1 at getcounter\endcsname{#3}{\cref at result}%
+      \refb at counter=\cref at result%
+      \csname #1 at getprefix\endcsname{#2}{\refa at prefix}%
+      \csname #1 at getprefix\endcsname{#3}{\refb at prefix}%
+      \ifx\refa at prefix\refb at prefix%
         \ifnum\refa at counter=\refb at counter\relax%
           \def\@after{\@cref at refconsecutivetrue}%
+        \else%
+          \advance\refa at counter 1\relax%
+          \ifnum\refa at counter=\refb at counter\relax%
+            \def\@after{\@cref at refconsecutivetrue}%
+          \fi%
         \fi%
       \fi%
     \fi%
+  \fi%
   \expandafter\endgroup\@after}%
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
-%
-% \begin{macro}{\cref at ispagerefconsecutive}
-%   Similarly, define a test for whether two page references are
-%   consecutive (needed when typesetting page ranges). We use the same
-%   |\if at cref@refconsecutive| conditional as above.
-%    \begin{macrocode}
-\def\cref at ispagerefconsecutive#1#2{%
-  \begingroup%
-  \countdef\refa at counter=0%
-  \countdef\refb at counter=1%
-  \cref at getpageref{#1}{\cref at result}%
-  \refa at counter=\cref at result%
-  \cref at getpageref{#2}{\cref at result}%
-  \refb at counter=\cref at result%
-  \def\@after{\@cref at refconsecutivefalse}%
-  \ifnum\refa at counter=\refb at counter\relax%
-    \def\@after{\@cref at refconsecutivetrue}%
-  \else%
-    \advance\refa at counter 1\relax%
-    \ifnum\refa at counter=\refb at counter\relax%
-      \def\@after{\@cref at refconsecutivetrue}%
-    \fi%
-  \fi%
-  \expandafter\endgroup\@after}%
-%    \end{macrocode}
 % \end{macro}
 %
 %
@@ -3031,162 +3154,96 @@
 % \subsubsection{Reference stack processing}
 % \begin{macro}{\cref at processgroup}
 %   \cmd{\cref at processgroup} processes the first group of references from
-%   the stack passed in argument |#1|, by moving references to the stack
-%   passed in argument |#2| until it encounters a reference that has a
+%   the stack passed in argument |#2|, by moving references to the stack
+%   passed in argument |#3| until it encounters a reference that has a
 %   different type to those that came before. Note that empty references
-%   are treated as having the same type as the preceding one.
+%   are treated as having the same type as the preceding one. If argument
+%   |#1| is |cref| it processes references, it it's |cpageref| it
+%   processes page references.
 %    \begin{macrocode}
-\def\cref at processgroup#1#2{%
-  \edef\@nextref{\cref at stack@top{#1}}%
-  \expandafter\ifx\csname r@\@nextref @cref\endcsname\relax%
-    \def\@grouptype{\@undefined}%
-    \def\@groupformat{\@undefined}%
-  \else%
-    \expandafter\cref at gettype\expandafter{\@nextref}{\@grouptype}%
-    \expandafter\expandafter\expandafter\def%
-      \expandafter\expandafter\expandafter\@groupformat%
-      \expandafter\expandafter\expandafter{%
-        \csname cref@\@grouptype @format\endcsname%
-        {\@dummya}{\@dummyb}{\@dummyc}}%
-  \fi%
-  \let\@nexttype\@grouptype%
-  \let\@nextformat\@groupformat%
-%
-  \@whilesw\ifx\@nextformat\@groupformat\fi{%
-    \expandafter\cref at stack@pull\expandafter{\@nextref}{#2}%
-    \cref at stack@pop{#1}%
-    \cref at isstackempty{#1}%
+\def\cref at processgroup#1#2#3{%
+  \cref at stack@dropempty{#2}%
+  \edef\@firstref{\cref at stack@top{#2}}%
+  \let\@nextref\@firstref%
+  \cref at isrefsametypetrue%
+  \@whilesw\if at cref@sametype\fi{%
+    \expandafter\cref at stack@pull\expandafter{\@nextref}{#3}%
+    \cref at stack@pop{#2}%
+    \cref at isstackempty{#2}%
     \if at cref@stackempty%
-      \let\@nexttype\relax%
-      \let\@nextformat\relax%
+      \@cref at sametypefalse%
     \else%
-      \edef\@nextref{\cref at stack@top{#1}}%
+      \edef\@nextref{\cref at stack@top{#2}}%
       \ifx\@nextref\@empty%
-        \let\@nexttype\@grouptype%
-        \let\@nextforamt\@groupformat%
+        \@cref at sametypetrue%
       \else%
-        \expandafter\ifx\csname r@\@nextref @cref\endcsname\relax%
-          \def\@nexttype{\@undefined}%
-          \def\@nextformat{\@undefined}%
-        \else%
-          \expandafter\cref at gettype\expandafter%
-            {\@nextref}{\@nexttype}%
-          \def\@tempa{\@undefined}%
-          \ifx\@nexttype\@tempa%
-            \def\@nextformat{\@undefined}%
-          \else%
-            \expandafter\expandafter\expandafter\def%
-              \expandafter\expandafter\expandafter\@nextformat%
-              \expandafter\expandafter\expandafter{%
-                \csname cref@\@nexttype @format\endcsname%
-                {\@dummya}{\@dummyb}{\@dummyc}}%
-          \fi%
-        \fi%
+        \csname #1 at isrefsametype\endcsname{\@firstref}{\@nextref}%
       \fi%
-    \fi}%
-}%
+    \fi}}%
 %    \end{macrocode}
 % \end{macro}
 %
 % \begin{macro}{\cref at processgroupall}
 %   \cmd{\cref at processgroupall} processes the first group of references
-%   from the stack passed in argument |#1|, by moving all references with
+%   from the stack passed in argument |#2|, by moving all references with
 %   the same type as the first one into the stack passed in argument
-%   |#2|.
+%   |#3|. If argument |#1| is |cref| it processes references, if it's
+%   |cpageref| it processes page references.
 %    \begin{macrocode}
-\def\cref at processgroupall#1#2{%
+\def\cref at processgroupall#1#2#3{%
   \cref at stack@init{\@tempstack}%
-  \edef\@nextref{\cref at stack@top{#1}}%
-  \expandafter\ifx\csname r@\@nextref @cref\endcsname\relax%
-    \def\@grouptype{\@undefined}%
-    \def\@groupformat{\@undefined}%
-  \else%
-    \expandafter\cref at gettype\expandafter{\@nextref}{\@grouptype}%
-    \expandafter\expandafter\expandafter\def%
-      \expandafter\expandafter\expandafter\@groupformat%
-      \expandafter\expandafter\expandafter{%
-        \csname cref@\@grouptype @format\endcsname%
-        {\@dummya}{\@dummyb}{\@dummyc}}%
-  \fi%
-  \let\@lasttype\@grouptype%
-  \let\@lastformat\@groupformat%
-  \cref at isstackfull{#1}%
-%
+  \cref at stack@dropempty{#2}%
+  \edef\@firstref{\cref at stack@top{#2}}%
+  \cref at isstackfull{#2}%
   \@whilesw\if at cref@stackfull\fi{%
-    \edef\@nextref{\cref at stack@top{#1}}%
+    \edef\@nextref{\cref at stack@top{#2}}%
     \ifx\@nextref\@empty%
-      \ifx\@lastformat\@groupformat%
-        \let\@nexttype\@grouptype%
-        \let\@nextformat\@groupformat%
-      \else%
-        \let\@nexttype\relax%
-        \let\@nextformat\relax%
-      \fi%
+      \expandafter\cref at stack@pull\expandafter{\@nextref}{#3}%
     \else%
-      \expandafter\ifx\csname r@\@nextref @cref\endcsname\relax%
-        \def\@nexttype{\@undefined}%
-        \def\@nextformat{\@undefined}%
+      \edef\@tempa{{\@firstref}{\@nextref}}%
+      \csname #1 at isrefsametype\expandafter\endcsname\@tempa%
+      \if at cref@sametype%
+        \expandafter\cref at stack@pull\expandafter{\@nextref}{#3}%
       \else%
-        \expandafter\cref at gettype\expandafter%
-          {\@nextref}{\@nexttype}%
-        \def\@tempa{\@undefined}%
-        \ifx\@nexttype\@tempa%
-          \def\@nextformat{\@undefined}%
-        \else%
-          \expandafter\expandafter\expandafter\def%
-            \expandafter\expandafter\expandafter\@nextformat%
-            \expandafter\expandafter\expandafter{%
-              \csname cref@\@nexttype @format\endcsname%
-              {\@dummya}{\@dummyb}{\@dummyc}}%
-        \fi%
+        \expandafter\cref at stack@pull\expandafter{\@nextref}{\@tempstack}%
       \fi%
     \fi%
-%
-    \ifx\@nextformat\@groupformat%
-      \expandafter\cref at stack@pull\expandafter{\@nextref}{#2}%
-    \else%
-      \expandafter\cref at stack@pull\expandafter{\@nextref}{\@tempstack}%
-    \fi%
-    \cref at stack@pop{#1}%
-    \let\@lasttype\@nexttype%
-    \let\@lastformat\@nextformat%
-    \cref at isstackfull{#1}}%
-  \let#1\@tempstack}%
+    \cref at stack@pop{#2}%
+    \cref at isstackfull{#2}}%
+  \let#2\@tempstack}%
 %    \end{macrocode}
 % \end{macro}
 %
+%
 % \begin{macro}{\cref at processconsecutive}
 %   \cmd{\cref at processconsecutive} processes the first sequence of
-%   consecutive references from the stack passed in |#1|, sets the macro
-%   passed as |#2| to the first reference in the sequence, sets |#3| to
-%   the last reference, and sets the counter passed in |#4| to the number
-%   of consecutive references in the sequence.
+%   consecutive references from the stack passed in |#2|, sets the macro
+%   passed as |#3| to the first reference in the sequence, sets |#4| to
+%   the last reference, and sets the counter passed in |#5| to the number
+%   of consecutive references in the sequence. If argument |#1| is |cref|
+%   it processes references, if it's |cpageref| it processes page
+%   references.
 %    \begin{macrocode}
 \def\cref at processconsecutive#1#2#3#4#5{%
-  #4=0%
-  \edef\@nextref{\cref at stack@top{#1}}%
-  \cref at stack@pop{#1}%
 %    \end{macrocode}
-% If stack only contains one reference, set appropriate return values.
+% Initialise return values to those appropriate for a single reference.
 %    \begin{macrocode}
-  \cref at isstackempty{#1}%
-  \if at cref@stackempty%
-    \edef#2{\@nextref}%
-    \let#3\relax%
-    #4=1\relax%
+  \let#4\relax%
+  #5=1\relax%
+  \edef\@nextref{\cref at stack@top{#2}}%
+  \edef#3{\@nextref}%
+  \cref at stack@pop{#2}%
+  \cref at isstackfull{#2}%
 %    \end{macrocode}
 % If stack contains multiple references, find end of consecutive references.
 %    \begin{macrocode}
-  \else%
-    \edef#2{\@nextref}%
-    \let#3\relax%
-    \edef\@nextref{\cref at stack@top{#1}}%
-    #4=1\relax%
-    \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
+  \if at cref@stackfull%
+    \edef\@nextref{\cref at stack@top{#2}}%
+    \expandafter\ifx\csname r@#3 at cref\endcsname\relax%
       \@cref at refconsecutivefalse%
     \else%
 %    \end{macrocode}
-%     If next reference in substack is empty, it indicates that no
+%     If next reference in stack is empty, it indicates that no
 %     further compression should take place. Having served its purpose,
 %     the empty reference and any consecutive empty references are
 %     removed from the stack.
@@ -3193,24 +3250,13 @@
 %    \begin{macrocode}
       \ifx\@nextref\@empty%
         \@cref at refconsecutivefalse%
-        \@whilesw\ifx\@nextref\@empty\fi{%
-          \cref at stack@pop{#1}%
-          \cref at isstackempty{#1}%
-          \if at cref@stackempty%
-            \let\@nextref\relax%
-          \else%
-            \edef\@nextref{\cref at stack@top{#1}}%
-          \fi}%
+        \cref at stack@dropempty{#2}%
 %    \end{macrocode}
 %     Otherwise, test whether next reference is consecutive or not.
 %    \begin{macrocode}
       \else%
-        \expandafter\ifx\csname r@\@nextref @cref\endcsname\relax%
-          \@cref at refconsecutivefalse%
-        \else%
-          \edef\@tempa{{#2}{\@nextref}}%
-          \expandafter#5\@tempa%
-        \fi%
+        \edef\@tempa{{#3}{\@nextref}}%
+        \csname #1 at isrefconsecutive\expandafter\endcsname\@tempa%
       \fi%
     \fi%
 %    \end{macrocode}
@@ -3218,14 +3264,14 @@
 %   sequence.
 %    \begin{macrocode}
     \@whilesw\if at cref@refconsecutive\fi{%
-      \advance#4 1%
-      \let#3\@nextref%
-      \cref at stack@pop{#1}%
-      \cref at isstackempty{#1}%
+      \advance#5 1\relax%
+      \let#4\@nextref%
+      \cref at stack@pop{#2}%
+      \cref at isstackempty{#2}%
       \if at cref@stackempty%
         \@cref at refconsecutivefalse%
       \else%
-        \edef\@nextref{\cref at stack@top{#1}}%
+        \edef\@nextref{\cref at stack@top{#2}}%
 %    \end{macrocode}
 %       If next reference is empty, remove any consecutive empty
 %       references and we're done.
@@ -3233,23 +3279,19 @@
         \ifx\@nextref\@empty%
           \@cref at refconsecutivefalse%
           \@whilesw\ifx\@nextref\@empty\fi{%
-            \cref at stack@pop{#1}%
-            \cref at isstackempty{#1}%
+            \cref at stack@pop{#2}%
+            \cref at isstackempty{#2}%
             \if at cref@stackempty%
               \let\@nextref\relax%
             \else%
-              \edef\@nextref{\cref at stack@top{#1}}%
+              \edef\@nextref{\cref at stack@top{#2}}%
             \fi}%
 %    \end{macrocode}
 %         Otherwise, test whether next reference is consecutive or not.
 %    \begin{macrocode}
         \else%
-          \expandafter\ifx\csname r@\@nextref @cref\endcsname\relax%
-            \@cref at refconsecutivefalse%
-          \else%
-            \edef\@tempa{{#3}{\@nextref}}%
-            \expandafter#5\@tempa%
-          \fi%
+          \edef\@tempa{{#4}{\@nextref}}%
+          \csname #1 at isrefconsecutive\expandafter\endcsname\@tempa%
         \fi%
       \fi}%
   \fi}%
@@ -3272,7 +3314,7 @@
     \let\cref at acc\@empty%
     \@crefstripprefix%
     \cref at result%
-  \endgroup}
+  \endgroup}%
 %    \end{macrocode}
 % \end{macro}
 %
@@ -3279,7 +3321,7 @@
 % The real work is done by the recursive \cmd{\@crefstripprefix} macro,
 % which compares characters one-by-one (accumulating runs of the same
 % type of character -- digit or letter as it goes). It removes matching
-% characters them from the strings, and outputs the remaining characters
+% characters from the strings, and outputs the remaining characters
 % from the second string (plus any accumulated characters of the same
 % type) when it encounters the first non-matching character;
 %    \begin{macrocode}
@@ -3341,7 +3383,7 @@
     \fi%
     \edef\cref at result{\cref at acc\@tempb\@toksb}%
   \fi%
-  \@iterate}
+  \@iterate}%
 %    \end{macrocode}
 %
 % \begin{macro}{\cref at poptok}
@@ -3357,9 +3399,9 @@
   \expandafter\expandafter\expandafter\def%
     \expandafter\expandafter\expandafter#1%
     \expandafter\expandafter\expandafter{%
-      \expandafter\@cref at poptok#1\@nil}}
-\def\@cref at firsttok#1#2\@nil{#1}
-\def\@cref at poptok#1#2\@nil{#2}
+      \expandafter\@cref at poptok#1\@nil}}%
+\def\@cref at firsttok#1#2\@nil{#1}%
+\def\@cref at poptok#1#2\@nil{#2}%
 %    \end{macrocode}
 % \end{macro}
 %
@@ -3376,8 +3418,8 @@
 %    \begin{macrocode}
 \DeclareRobustCommand{\cref}[1]{\@cref{cref}{#1}}%
 \DeclareRobustCommand{\Cref}[1]{\@cref{Cref}{#1}}%
-\DeclareRobustCommand{\crefrange}[2]{\@setcrefrange{#1}{#2}{cref}{}}%
-\DeclareRobustCommand{\Crefrange}[2]{\@setcrefrange{#1}{#2}{Cref}{}}%
+\DeclareRobustCommand{\crefrange}[2]{\@setcrefrange{#1}{#2}{}}%
+\DeclareRobustCommand{\Crefrange}[2]{\@setCrefrange{#1}{#2}{}}%
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -3411,6 +3453,14 @@
 \def\@cref#1#2{%
   \leavevmode%
   \begingroup%
+  \def\cref at variant{#1}%
+  \def\@tempa{\in@{page}}%
+  \expandafter\@tempa\expandafter{\cref at variant}%
+  \ifin@%
+    \def\cref at variant@get{cpageref}%
+  \else%
+    \def\cref at variant@get{cref}%
+  \fi%
 %    \end{macrocode}
 % Initialise some things, and put all the references into a stack called
 % \cmd{\@refstack}. Note that we fully expand the second argument, in
@@ -3420,13 +3470,13 @@
   \countdef\count at consecutive=0%
   \countdef\count at group=1%
   \count at group=1%
-  \def\cref at variant{#1}%
-  \newif\if at secondref%
+  \countdef\count at subgroup=2%
   \cref at stack@init{\@refstack}%
   \edef\@tempa{#2}%
   \expandafter\cref at stack@push\expandafter{\@tempa}{\@refstack}%
   \cref at isstackfull{\@refstack}%
 %    \end{macrocode}
+%
 % Loop until the reference stack is empty.
 %    \begin{macrocode}
   \@whilesw\if at cref@stackfull\fi{%
@@ -3435,17 +3485,20 @@
 %    \begin{macrocode}
     \cref at stack@init{\@refsubstack}%
     \if at cref@sort%
-      \cref at processgroupall{\@refstack}{\@refsubstack}%
-      \cref at stack@sort{\@refsubstack}{\cref at countercmp}%
+      \expandafter\cref at processgroupall\expandafter%
+        {\cref at variant@get}{\@refstack}{\@refsubstack}%
+      \expandafter\cref at stack@sort\expandafter%
+        {\csname\cref at variant@get @countercmp\endcsname}{\@refsubstack}%
     \else%
-      \cref at processgroup{\@refstack}{\@refsubstack}%
+      \expandafter\cref at processgroup\expandafter%
+        {\cref at variant@get}{\@refstack}{\@refsubstack}%
     \fi%
 %    \end{macrocode}
 %
-%   typeset appropriate conjunction between groups of reference types.
+% Typeset appropriate conjunction between groups of reference types.
 %    \begin{macrocode}
     \ifnum\count at group=1\relax%
-      \advance\count at group 1%
+      \advance\count at group 1\relax%
     \else%
       \cref at isstackfull{\@refstack}%
       \if at cref@stackfull%
@@ -3457,151 +3510,99 @@
           \@setcref at lastgroupconjunction%
         \fi%
       \fi%
-      \advance\count at group 1%
-      \def\cref at variant{cref}%
+      \advance\count at group 1\relax%
+      \lowercase{\def\cref at variant{#1}}%
     \fi%
 %    \end{macrocode}
 %
-%   Process first group of consecutive references.
+% Process groups of consecutive references until substack is empty.
 %    \begin{macrocode}
-    \if at cref@compress%
-      \cref at processconsecutive%
-        {\@refsubstack}{\@beginref}{\@endref}{\count at consecutive}%
-        {\cref at isrefconsecutive}%
-    \else%
-      \edef\@beginref{\cref at stack@top{\@refsubstack}}%
-      \cref at stack@pop{\@refsubstack}%
+    \count at subgroup=1%
+    \cref at isstackfull{\@refsubstack}%
+    \@whilesw\if at cref@stackfull\fi{%
+      \if at cref@compress%
+        \expandafter\cref at processconsecutive\expandafter{\cref at variant@get}%
+          {\@refsubstack}{\@beginref}{\@endref}{\count at consecutive}%
 %    \end{macrocode}
-%     Empty references serve no purpose when we're not compressing
-%     consecutive references, so we simply remove them.
+% Empty references serve no purpose when we're not compressing, so we
+% simply remove them and process the first non-empty reference..
 %    \begin{macrocode}
-      \@whilesw\ifx\@beginref\@empty\fi{%
+      \else%
+        \cref at stack@dropempty{\@refsubstack}%
+        \edef\@beginref{\cref at stack@top{\@refsubstack}}%
         \cref at stack@pop{\@refsubstack}%
-        \cref at isstackempty{\@refsubstack}%
-        \if at cref@stackempty%
-          \let\@beginref\relax%
-        \else%
-          \edef\@beginref{\cref at stack@top{\@refsubstack}}%
-        \fi}%
-      \let\@endref\relax%
-      \count at consecutive=1\relax%
-    \fi%
-%    \end{macrocode}
-%   If there were no consecutive references, typeset the first reference;
-%    \begin{macrocode}
-    \ifnum\count at consecutive=1\relax%
-      \cref at isstackfull{\@refsubstack}%
-      \if at cref@stackfull%
-        \expandafter\@setcref%
-          \expandafter{\@beginref}{\cref at variant}{@first}%
-      \else%
-        \expandafter\@setcref%
-          \expandafter{\@beginref}{\cref at variant}{}%
+        \let\@endref\relax%
+        \count at consecutive=1\relax%
       \fi%
 %    \end{macrocode}
-%   if there were only two consecutive references, typeset the first one
-%   and return the second to the substack (we add an empty reference
-%   after it just to make sure there's no further compression);
+% If the start and end labels are identical, treat it as a single
+% reference instead of a range
 %    \begin{macrocode}
-    \else%
-      \ifnum\count at consecutive=2\relax%
-        \expandafter\@setcref%
-          \expandafter{\@beginref}{\cref at variant}{@first}%
-        \expandafter\cref at stack@push\expandafter%
-          {\@endref,}{\@refsubstack}%
-%    \end{macrocode}
-%     otherwise, typeset a reference range.
-%    \begin{macrocode}
-      \else%
-        \edef\@tempa{{\@beginref}{\@endref}}%
-        \if at cref@stackempty%
-          \expandafter\@setcrefrange\@tempa{\cref at variant}{}%
-        \else%
-          \expandafter\@setcrefrange\@tempa{\cref at variant}{@first}%
+      \ifnum\count at consecutive>1\relax%
+        \csname\cref at variant@get @getlabel\endcsname{\@beginref}{\@labela}%
+        \csname\cref at variant@get @getlabel\endcsname{\@endref}{\@labelb}%
+        \ifx\@labela\@labelb%
+          \let\@endref\relax%
+          \count at consecutive=1\relax%
         \fi%
       \fi%
-    \fi%
 %    \end{macrocode}
-%
-%   Process further groups of consecutive references, until substack is
-%   empty.
+% If there were only two consecutive references, keep the first one and
+% return the second one to the substack. (We add an empty reference after
+% it just to make sure there's no further compression.)
 %    \begin{macrocode}
-    \@secondreftrue%
-    \cref at isstackfull{\@refsubstack}%
-    \@whilesw\if at cref@stackfull\fi{%
-      \if at cref@compress%
-        \cref at processconsecutive%
-          {\@refsubstack}{\@beginref}{\@endref}{\count at consecutive}%
-          {\cref at isrefconsecutive}%
-      \else%
-        \edef\@beginref{\cref at stack@top{\@refsubstack}}%
-        \cref at stack@pop{\@refsubstack}%
-%    \end{macrocode}
-%       Empty references serve no purpose when we're not compressing
-%       consecutive references, so we simply remove them.
-%    \begin{macrocode}
-        \@whilesw\ifx\@beginref\@empty\fi{%
-          \cref at stack@pop{\@refsubstack}%
-          \cref at isstackempty{\@refsubstack}%
-          \if at cref@stackempty%
-            \let\@beginref\relax%
-          \else%
-            \edef\@beginref{\cref at stack@top{\@refsubstack}}%
-          \fi}%
+      \ifnum\count at consecutive=2\relax%
+        \expandafter\cref at stack@push\expandafter{\@endref,}{\@refsubstack}%
         \let\@endref\relax%
         \count at consecutive=1\relax%
       \fi%
 %    \end{macrocode}
-%     If the substack is now empty, we will need to typeset an ``end''
-%     reference, otherwise we will need to typeset a ``middle''
-%     reference.
+% Work out which type of reference we need to typeset.
 %    \begin{macrocode}
-      \cref at isstackempty{\@refsubstack}%
-      \if at cref@stackempty%
-        \if at secondref%
-          \def\@pos{@second}%
+      \cref at isstackfull{\@refsubstack}%
+      \if at cref@stackfull%
+        \ifnum\count at subgroup=1\relax%
+          \def\@pos{@first}%
         \else%
-          \def\@pos{@last}%
+          \def\@pos{@middle}%
         \fi%
       \else%
-        \def\@pos{@middle}%
+        \ifnum\count at subgroup=1\relax%
+          \def\@pos{}%
+        \else%
+          \ifnum\count at subgroup=2\relax%
+            \def\@pos{@second}%
+          \else%
+            \def\@pos{@last}%
+          \fi%
+        \fi%
       \fi%
 %    \end{macrocode}
-%     If there were no consecutive references, just typeset the next
-%     reference;
+% If there were no consecutive references, just typeset the next
+% reference;
 %    \begin{macrocode}
       \ifnum\count at consecutive=1\relax%
-        \edef\@tempa{{\@beginref}{cref}{\@pos}}%
-        \expandafter\@setcref\@tempa%
-      \else%
+        \edef\@tempa{{\@beginref}{\@pos}}%
+        \csname @set\cref at variant\expandafter\endcsname\@tempa%
 %    \end{macrocode}
-%       if there were only two consecutive references, typeset the first
-%       one, and return the second one to the substack,
+% otherwise, typeset a reference range.
 %    \begin{macrocode}
-        \ifnum\count at consecutive=2\relax%
-          \expandafter\@setcref\expandafter%
-            {\@beginref}{cref}{@middle}%
-          \expandafter\cref at stack@push\expandafter%
-            {\@endref}{\@refsubstack}%
-%    \end{macrocode}
-%       otherwise, typeset a reference range.
-%    \begin{macrocode}
-        \else%
-          \edef\@tempa{{\@beginref}{\@endref}{cref}{\@pos}}%
-          \expandafter\@setcrefrange\@tempa%
-        \fi%
+      \else%
+        \edef\@tempa{{\@beginref}{\@endref}{\@pos}}%
+        \csname @set\cref at variant range\expandafter\endcsname\@tempa%
       \fi%
-      \@secondreffalse%
+      \advance\count at subgroup 1\relax%
       \cref at isstackfull{\@refsubstack}%
     }% end loop over reference substack
     \cref at isstackfull{\@refstack}%
 %    \end{macrocode}
-%   If we're typesetting a \cmd{\labelcref} reference and references in
-%   stack have different types, throw a warning and stop processing.
+%
+% If we're typesetting a \cmd{\labelcref} reference and references in
+% stack have different types, throw a warning and stop processing.
 %    \begin{macrocode}
     \if at cref@stackfull%
-      \def\@tempa{#1}\def\@tempb{labelcref}%
-      \ifx\@tempa\@tempb\relax%
+      \def\@tempa{labelcref}%
+      \ifx\cref at variant\@tempa%
         \protect\G at refundefinedtrue%
         \nfss at text{\reset at font\bfseries\space ??}%
         \@latex at warning{References in label reference on page \thepage
@@ -3616,88 +3617,113 @@
 %
 %
 % \begin{macro}{\@setcref}
-%   The internal \cmd{\@setcref} macro deals with actually typesetting
-%   the reference, by calling the appropriate type-dependent formatting
-%   macro defined by \cmd{\crefformat} etc. |#1| contains the reference
-%   itself, |#2| is either ``cref'' or ``Cref'' and determines the
-%   capitalisation variant, and |#3| is either empty or one of
-%   ``@second'', ``@middle'' or ``@last'', determining the type of
-%   reference group to typeset.
+% \begin{macro}{\@setCref}
+% \begin{macro}{\@setlavelcref}
+% \begin{macro}{\@@setcref}
+%   The \cmd{\@setcref}, \cmd{\@setCref} and \cmd{\@setlabelcref} macros
+%   are called as appropriate by \cmd{\@cref} to typeset a reference.
+%   These macros just turn the |cref|, |Cref| or |labelcref| variant into
+%   a macro argument and pass it along to \cmd{\@@setcref}, which deals
+%   with actually typesetting the reference by calling the appropriate
+%   type-dependent formatting macro defined by \cmd{\crefformat} etc.
+%   \cmd{\@@setcref} takes three arguments. |#1| is the variant passed
+%   along by |\@set|\meta{x}|ref|. |#2| contains the reference itself.
+%   |#3| is either empty or one of ``@second'', ``@middle'' or ``@last'',
+%   determining the type of reference group to typeset.
 %    \begin{macrocode}
-\def\@setcref#1#2#3{%
-  \expandafter\ifx\csname r@#1 at cref\endcsname\relax%
+\def\@setcref{\@@setcref{cref}}%
+\def\@setCref{\@@setcref{Cref}}%
+\def\@setlabelcref{\@@setcref{labelcref}}%
+\def\@@setcref#1#2#3{%
+  \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
     \protect\G at refundefinedtrue%
     \nfss at text{\reset at font\bfseries ??}%
-    \@latex at warning{Reference `#1' on page \thepage \space undefined}%
+    \@latex at warning{Reference `#2' on page \thepage \space undefined}%
   \else%
-    \cref at gettype{#1}{\@temptype}%  puts label type in \@temptype
-    \cref at getlabel{#1}{\@templabel}%  puts label in \@templabel
-    \expandafter\ifx\csname #2@\@temptype @format#3\endcsname\relax%
+    \cref at gettype{#2}{\@temptype}%  puts label type in \@temptype
+    \cref at getlabel{#2}{\@templabel}%  puts label in \@templabel
+    \expandafter\ifx\csname #1@\@temptype @format#3\endcsname\relax%
 %    \end{macrocode}
 %     If reference format is undefined, but we're typesetting a
 %     \cmd{\labelcref}, fall back to default \cmd{\labelcref} format.
 %    \begin{macrocode}
-      \edef\@tempa{#2}\def\@tempb{labelcref}%
+      \edef\@tempa{#1}\def\@tempb{labelcref}%
       \ifx\@tempa\@tempb\relax%
-        \expandafter\@@setcref\expandafter%
-          {\csname #2 at default@format#3\endcsname}{#1}%
+        \expandafter\@@@setcref\expandafter%
+          {\csname #1 at default@format#3\endcsname}{#2}%
       \else%
         \protect\G at refundefinedtrue%
         \nfss at text{\reset at font\bfseries ??}~\@templabel%
-        \@latex at warning{#2 \space reference format for label type
+        \@latex at warning{#1\space reference format for label type
           `\@temptype' undefined}%
       \fi%
     \else%
-      \expandafter\@@setcref\expandafter%
-        {\csname #2@\@temptype @format#3\endcsname}{#1}%
+      \expandafter\@@@setcref\expandafter%
+        {\csname #1@\@temptype @format#3\endcsname}{#2}%
     \fi%
   \fi}%
 %    \end{macrocode}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 %
-% \begin{macro}{\@@setcref}
+% \begin{macro}{\@@@setcref}
 %   We separate out the very final typesetting step into a separate
 %   macro, in order to make it easier to redefine things later to make
 %   them work with the \package{hyperref} package.
 %    \begin{macrocode}
-\def\@@setcref#1#2{\cref at getlabel{#2}{\@templabel}#1{\@templabel}{}{}}%
+\def\@@@setcref#1#2{\cref at getlabel{#2}{\@templabel}#1{\@templabel}{}{}}%
 %    \end{macrocode}
 % \end{macro}
 %
 % \begin{macro}{\@setcrefrange}
-%   The internal \cmd{\@setcrefrange} macro deals with typesetting
-%   reference ranges, just as \cmd{\@setcref} does for normal
-%   references. The actual typesetting is no more complicated in the
-%   range case; it's the error checking that makes the code so much
+% \begin{macro}{\@setCrefrange}
+% \begin{macro}{\@setlabelcrefrange}
+% \begin{macro}{\@@setcrefrange}
+%   The \cmd{\@setcrefrange}, \cmd{\@setCrefrange} and
+%   \cmd{\@setlabelrefrange} macros are called as appropriate by
+%   \cmd{\@cref} to typeset a reference. The internal
+%   \cmd{\@@setcrefrange} macro deals with actually typesetting reference
+%   ranges, and takes four arguments. |#1| is the variant passed along by
+%   |\@set|\meta{x}|ref|. |#2| and |#3| contains the references
+%   themselves. |#4| is either empty or one of ``@second'', ``@middle''
+%   or ``@last'', determining the type of reference group to typeset.
+%
+%   The actual typesetting is no more complicated than in the
+%   \cmd{\@@setcref} case; it's the error checking that makes the code
 %   longer. We now have to check whether \emph{two} references are
 %   undefined, whether \emph{two} reference formats are undefined,
 %   whether the reference types are consistent, and also combinations of
 %   these various errors.
 %    \begin{macrocode}
-\def\@setcrefrange#1#2#3#4{%
+\def\@setcrefrange{\@@setcrefrange{cref}}%
+\def\@setCrefrange{\@@setcrefrange{Cref}}%
+\def\@setlabelcrefrange{\@@setcrefrange{labelcref}}%
+\def\@@setcrefrange#1#2#3#4{%
   \begingroup%
 %    \end{macrocode}
 % Check if both references are defined.
 %    \begin{macrocode}
-    \expandafter\ifx\csname r@#1 at cref\endcsname\relax%
+    \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
       \protect\G at refundefinedtrue%
-      \@latex at warning{Reference `#1' on page \thepage \space%
+      \@latex at warning{Reference `#2' on page \thepage \space%
         undefined}%
-      \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
+      \expandafter\ifx\csname r@#3 at cref\endcsname\relax%
         \nfss at text{\reset at font\bfseries ??}--%
         \nfss at text{\reset at font\bfseries ??}%
-        \@latex at warning{Reference `#2' on page \thepage \space%
+        \@latex at warning{Reference `#3' on page \thepage \space%
           undefined}%
       \else%
-        \cref at getlabel{#2}{\@labelb}%
+        \cref at getlabel{#3}{\@labelb}%
         \nfss at text{\reset at font\bfseries ??}--\@labelb%
       \fi%
     \else%
-      \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
+      \expandafter\ifx\csname r@#3 at cref\endcsname\relax%
         \protect\G at refundefinedtrue%
-        \cref at getlabel{#1}{\@labela}%
+        \cref at getlabel{#2}{\@labela}%
         \@labela--\nfss at text{\reset at font\bfseries ??}%
-        \@latex at warning{Reference `#2' on page \thepage %
+        \@latex at warning{Reference `#3' on page \thepage %
           \space undefined}%
 %    \end{macrocode}
 %   If both references are defined, check that the reference format is
@@ -3704,28 +3730,26 @@
 %   defined.
 %    \begin{macrocode}
       \else%
-        \cref at gettype{#1}{\@typea}%
-        \cref at gettype{#2}{\@typeb}%
-        \cref at getlabel{#1}{\@labela}%
-        \cref at getlabel{#2}{\@labelb}%
-        \edef\@formata{\expandafter\noexpand%
-          \csname #3range@\@typea @format#4\endcsname}%
-        \edef\@formatb{\expandafter\noexpand%
-          \csname #3range@\@typeb @format#4\endcsname}%
-        \expandafter\ifx\@formata\relax%
+        \cref at gettype{#2}{\@typea}%
+        \cref at gettype{#3}{\@typeb}%
+        \cref at getlabel{#2}{\@labela}%
+        \cref at getlabel{#3}{\@labelb}%
+        \edef\@format{\expandafter\noexpand%
+          \csname #1range@\@typea @format#4\endcsname}%
+        \expandafter\ifx\@format\relax%
 %    \end{macrocode}
 %         If reference format is undefined, but we're typesetting a
 %         \cmd{\labelcref}, fall back to default \cmd{\labelcref}
 %         formats.
 %    \begin{macrocode}
-          \edef\@tempa{#3}\def\@tempb{labelcref}%
+          \edef\@tempa{#1}\def\@tempb{labelcref}%
           \ifx\@tempa\@tempb\relax%
-            \expandafter\@@setcrefrange\expandafter%
-              {\csname #3range at default@format#4\endcsname}{#1}{#2}%
+            \expandafter\@@@setcrefrange\expandafter%
+              {\csname #1range at default@format#4\endcsname}{#2}{#3}%
           \else%
             \protect\G at refundefinedtrue%
             \nfss at text{\reset at font\bfseries ??}~\@labela--\@labelb%
-            \@latex at warning{#3\space reference range format for label
+            \@latex at warning{#1 reference range format for label
               type `\@typea' undefined}%
           \fi%
         \else%
@@ -3736,12 +3760,22 @@
 %     is defined, since if it isn't it will be caught here as a
 %     non-identical type.)
 %    \begin{macrocode}
+          \expandafter\expandafter\expandafter\def%
+            \expandafter\expandafter\expandafter\@formata%
+            \expandafter\expandafter\expandafter{%
+              \csname #1range@\@typea @format#4\endcsname%
+              {\@dummya}{\@dummyb}{\@dummyc}{\@dummyd}{\@dummye}{\@dummyf}}%
+          \expandafter\expandafter\expandafter\def%
+            \expandafter\expandafter\expandafter\@formatb%
+            \expandafter\expandafter\expandafter{%
+              \csname #1range@\@typeb @format#4\endcsname%
+              {\@dummya}{\@dummyb}{\@dummyc}{\@dummyd}{\@dummye}{\@dummyf}}%
           \ifx\@formata\@formatb%
-            \expandafter\@@setcrefrange\expandafter{\@formata}{#1}{#2}%
+            \expandafter\@@@setcrefrange\expandafter{\@format}{#2}{#3}%
           \else%
             \protect\G at refundefinedtrue%
             \nfss at text{\reset at font\bfseries ??}~\@labela--\@labelb%
-            \@latex at warning{References `#1' and `#2' in reference range
+            \@latex at warning{References `#2' and `#3' in reference range
               on page \thepage \space have different types
               `\@typea' and `\@typeb'}%
           \fi%
@@ -3751,13 +3785,16 @@
   \endgroup}%
 %    \end{macrocode}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 %
-% \begin{macro}{\@@setcrefrange}
+% \begin{macro}{\@@@setcrefrange}
 %   We again separate out the very final typesetting step into a
 %   separate macro, in order to make it easier to redefine things later
 %   to make them work with the \package{hyperref} package.
 %    \begin{macrocode}
-\def\@@setcrefrange#1#2#3{%
+\def\@@@setcrefrange#1#2#3{%
   \cref at getlabel{#2}{\@labela}%
   \cref at getlabel{#3}{\@labelb}%
   #1{\@labela}{\@labelb}{}{}{}{}}%
@@ -3815,7 +3852,10 @@
 %
 % \begin{macro}{\@setnamecref}
 %   \cmd{\@setnamecref} is the real macro underlying all the
-%   \cmd{\namecref} commands.
+%   \cmd{\namecref} commands. |#1| is the capitalisation variant, |#2|
+%   the reference, |#3| is either empty or |@plural| if the plural name
+%   should be generated, and |#4| is either empty or contains
+%   \cmd{\MakeLowercase} if a lower-cased name should be generated.
 %    \begin{macrocode}
 \def\@setnamecref#1#2#3#4{%
   \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
@@ -3831,17 +3871,17 @@
     }{%
       \edef\@tempa{%
         \expandafter\noexpand\csname #1@\@tempa @name#3\endcsname}%
-      \expandafter\@@setnamecref\expandafter{\@tempa}{#4}%
+      \expandafter\@@@setnamecref\expandafter{\@tempa}{#4}%
     }%
   \fi}%
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@setnamecref}
+% \begin{macro}{\@@@setnamecref}
 %   We again separate out the final typesetting step of the
 %   \cmd{\namecref} commands.
 %    \begin{macrocode}
-\def\@@setnamecref#1#2{%
+\def\@@@setnamecref#1#2{%
   \expandafter\def\expandafter\@tempa\expandafter{#1}%
   \expandafter#2\@tempa}%
 %    \end{macrocode}
@@ -3860,16 +3900,14 @@
 %   commands, and \cmd{\labelcpageref} (the counterpart to
 %   \cmd{\labelcref}).
 %    \begin{macrocode}
-\DeclareRobustCommand{\cpageref}[1]{%
-  \@cpageref{cref}{#1}{\@setcpageref}{\@setcpagerefrange}}%
-\DeclareRobustCommand{\Cpageref}[1]{%
-  \@cpageref{Cref}{#1}{\@setcpageref}{\@setcpagerefrange}}%
+\DeclareRobustCommand{\cpageref}[1]{\@cref{cpageref}{#1}}%
+\DeclareRobustCommand{\Cpageref}[1]{\@cref{Cpageref}{#1}}%
 \DeclareRobustCommand{\cpagerefrange}[2]{%
-  \@setcpagerefrange{#1}{#2}{cref}{}}%
+  \@@setcpagerefrange{#1}{#2}{cref}{}}%
 \DeclareRobustCommand{\Cpagerefrange}[2]{%
-  \@setcpagerefrange{#1}{#2}{Cref}{}}%
+  \@@setcpagerefrange{#1}{#2}{Cref}{}}%
 \DeclareRobustCommand{\labelcpageref}[1]{%
-  \@cpageref{labelcref}{#1}{\@setcpageref}{\@setcpagerefrange}}%
+  \@cref{labelcpageref}{#1}}%
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -3876,214 +3914,80 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\@cpageref}
-%   The \cmd{\@cpageref} macro is the work-horse of the clever page
-%   referencing features (analogous to the role of \cmd{\@cref} for
-%   cross-references, though slightly simpler as it does not have to deal
-%   with grouping references by type, all page references being
-%   references to pages!). It deals with typesetting the conjunctions
-%   between groups of page references, and any sorting and compressing of
-%   the page references. |#1| contains the list of references, |#2| is
-%   ``cref'' or ``Cref'' and determines the capitalisation variant, |#3|
-%   and |#4| are the macros to use for typesetting page references and
-%   page range references, respectively. (The \cmd{\cpageref} and
-%   \cmd{\Cpageref} commands always set these to \cmd{\@setcpageref} and
-%   \cmd{\@setcpagerangeref}; the \package{varioref} package support uses
-%   these arguments to integrate the \package{cleveref} and
-%   \package{varioref} page referencing features.)
-%    \begin{macrocode}
-\def\@cpageref#1#2#3#4{%
-  \leavevmode%
-  \begingroup%
-%    \end{macrocode}
-% Initialise some things, and put all the references into a stack called
-% \cmd{\@refstack}. Note that we fully expand the second argument, in
-% case it contains commands that \emph{expand to} label names, rather
-% than label names per se.
-%    \begin{macrocode}
-  \countdef\count at consecutive=0%
-  \countdef\count at group=1%
-  \countdef\@counta=2%
-  \countdef\@countb=3%
-  \count at group=0%
-  \cref at stack@init{\@refstack}%
-  \edef\@tempa{#2}%
-  \expandafter\cref at stack@push\expandafter{\@tempa}{\@refstack}%
-  \if at cref@sort%
-    \cref at stack@sort{\@refstack}{\cref at pagecmp}%
-  \fi%
-%    \end{macrocode}
-% Loop until the reference stack is empty.
-%    \begin{macrocode}
-  \cref at isstackfull{\@refstack}%
-  \@whilesw\if at cref@stackfull\fi{%
-    \if at cref@compress%
-      \cref at processconsecutive%
-        {\@refstack}{\@beginref}{\@endref}{\count at consecutive}%
-        {\cref at ispagerefconsecutive}%
-    \else%
-      \edef\@beginref{\cref at stack@top{\@refstack}}%
-      \cref at stack@pop{\@refstack}%
-%    \end{macrocode}
-%     Empty references serve no purpose when we're not compressing
-%     consecutive references, so we simply remove them.
-%    \begin{macrocode}
-      \@whilesw\ifx\@beginref\@empty\fi{%
-        \cref at stack@pop{\@refstack}%
-        \cref at isstackempty{\@refstack}%
-        \if at cref@stackempty%
-          \let\@beginref\relax%
-        \else%
-          \edef\@beginref{\cref at stack@top{\@refstack}}%
-        \fi}%
-      \let\@endref\relax%
-      \count at consecutive=1\relax%
-    \fi%
-%    \end{macrocode}
-%    If the start and end pages of a reference range are the same, treat it as
-%    a single page reference instead of a page range. If start and end pages
-%    of a reference range differ by 1, treat it as a pair of page references
-%    instead of a range.
-%    \begin{macrocode}
-    \ifx\@endref\relax\else%
-      \expandafter\ifx\csname r@\@beginref @cref\endcsname\relax\else%
-        \expandafter\ifx\csname r@\@endref @cref\endcsname\relax\else%
-          \cref at getpageref{\@beginref}{\@tempa}%
-          \cref at getpageref{\@endref}{\@tempb}%
-          \ifx\@tempa\@tempb\relax%
-            \count at consecutive=1%
-            \let\@endref\relax%
-          \else%
-            \@counta=\@tempa\relax%
-            \@countb=\@tempb\relax%
-            \advance\@counta 1\relax%
-            \ifnum\@counta=\@countb\relax%
-              \count at consecutive=2%
-            \fi%
-          \fi%
-        \fi%
-      \fi%
-    \fi%
-%    \end{macrocode}
-%    Determine whereabouts the current group of page references comes in the
-%    overall list of page references.
-%    \begin{macrocode}
-    \cref at isstackempty{\@refstack}%
-    \if at cref@stackempty%
-      \ifcase\count at group\relax%
-        \ifnum\count at consecutive=2\relax%
-          \def\@pos{@first}%
-        \else%
-          \def\@pos{}%
-        \fi%
-      \or%
-        \ifnum\count at consecutive=2\relax%
-          \def\@pos{@middle}%
-        \else%
-          \def\@pos{@second}%
-        \fi%
-      \else%
-        \def\@pos{@last}%
-      \fi%
-    \else%
-      \ifnum\count at group=0\relax%
-        \def\@pos{@first}%
-      \else%
-        \def\@pos{@middle}%
-      \fi%
-    \fi%
-%    \end{macrocode}
-%     If there were no consecutive references, just typeset the next
-%     reference;
-%    \begin{macrocode}
-    \ifnum\count at consecutive=1\relax%
-      \def\@tempa{#3}%
-      \edef\@tempb{{\@beginref}{#1}{\@pos}}%
-      \expandafter\@tempa\@tempb%
-    \else%
-%    \end{macrocode}
-%   if there were only two consecutive references, typeset the first one
-%   and return the second to the substack (we add an empty reference
-%   after it just to make sure there's no further compression);
-%    \begin{macrocode}
-      \ifnum\count at consecutive=2\relax%
-        \def\@tempa{#3}%
-        \edef\@tempb{{\@beginref}{#1}{\@pos}}%
-        \expandafter\@tempa\@tempb%
-        \expandafter\cref at stack@push\expandafter%
-          {\@endref,}{\@refstack}%
-%    \end{macrocode}
-%     otherwise, typeset a reference range.
-%    \begin{macrocode}
-      \else%
-        \def\@tempa{#4}%
-        \edef\@tempb{{\@beginref}{\@endref}{#1}{\@pos}}%
-        \expandafter\@tempa\@tempb%
-      \fi%
-    \fi%
-    \advance\count at group 1%
-    \cref at isstackfull{\@refstack}%
-  }% end loop over reference stack
-  \endgroup}%
-%    \end{macrocode}
-% \end{macro}
-%
-%
 % \begin{macro}{\@setcpageref}
-%   The internal \cmd{\@setcpageref} macro deals with actually typesetting
-%   the page reference, by calling the appropriate type-dependent
-%   formatting macro defined by \cmd{\crefformat} etc. |#1| contains the
-%   reference itself, |#2| is either ``cref'' or ``Cref'' and determines
-%   the capitalisation variant, and |#3| is either empty or one of
-%   ``@second'', ``@middle'' or ``@last'', determining the type of
-%   reference group to typeset.
+% \begin{macro}{\@setCpageref}
+% \begin{macro}{\@setlabelcpageref}
+% \begin{macro}{\@@setcpageref}
+%   The \cmd{\@setcpageref}, \cmd{\@setCpageref} and
+%   \cmd{\@setlabelcpageref} macros are called as appropriate by
+%   \cmd{\@cref} to typeset a page reference. These macros just turn the
+%   |cref|, |Cref| or |labelcref| variant into a macro argument and pass
+%   it along to \cmd{\@@setcpageref}, which deals with actually
+%   typesetting the page reference by calling the appropriate page
+%   reference formatting macro defined by \cmd{\crefformat}|{page}| etc.
+%   \cmd{\@@setcpageref} takes four arguments. |#1| is the variant passed
+%   along by |\@set|\meta{x}|pageref|. |#2| contains the reference
+%   itself. |#3| is either empty or one of ``@second'', ``@middle'' or
+%   ``@last'', determining the type of page reference group to typeset.
 %    \begin{macrocode}
-\def\@setcpageref#1#2#3{%
-  \expandafter\ifx\csname r@#1 at cref\endcsname\relax%
+\def\@setcpageref{\@@setcpageref{cref}}
+\def\@setCpageref{\@@setcpageref{Cref}}
+\def\@setlabelcpageref{\@@setcpageref{labelcref}}
+\def\@@setcpageref#1#2#3{%
+  \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
     \protect\G at refundefinedtrue%
     \nfss at text{\reset at font\bfseries ??}%
-    \@latex at warning{Reference `#1' on page \thepage \space undefined}%
+    \@latex at warning{Reference `#2' on page \thepage \space undefined}%
   \else%
-    \cref at getpageref{#1}{\@temppage}%
-    \expandafter\ifx\csname #2 at page@format#3\endcsname\relax%
+    \cpageref at getlabel{#2}{\@temppage}%
+    \expandafter\ifx\csname #1 at page@format#3\endcsname\relax%
 %    \end{macrocode}
 %     If reference format is undefined, but we're typesetting a
 %     \cmd{\labelcpageref}, fall back to default \cmd{\labelcref} format.
 %    \begin{macrocode}
-      \edef\@tempa{#2}\def\@tempb{labelcref}%
+      \edef\@tempa{#1}\def\@tempb{labelcref}%
       \ifx\@tempa\@tempb\relax%
-        \expandafter\@@setcpageref\expandafter%
-          {\csname #2 at default@format#3\endcsname}{#1}%
+        \expandafter\@@@setcpageref\expandafter%
+          {\csname #1 at default@format#3\endcsname}{#2}%
       \else%
         \protect\G at refundefinedtrue%
         \nfss at text{\reset at font\bfseries ??}~\@temppage%
-        \@latex at warning{#2 \space reference format for
+        \@latex at warning{ #1 reference format for
           page references undefined}%
       \fi%
     \else%
-      \expandafter\@@setcpageref\expandafter%
-        {\csname #2 at page@format#3\endcsname}{#1}%
+      \expandafter\@@@setcpageref\expandafter%
+        {\csname #1 at page@format#3\endcsname}{#2}%
     \fi%
   \fi}%
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@setcpageref}
+% \begin{macro}{\@@@setcpageref}
 %   We separate out the very final typesetting step into a separate
 %   macro, in order to make it easier to redefine things later to make
 %   them work with the \package{hyperref} package.
 %    \begin{macrocode}
-\def\@@setcpageref#1#2{%
-  \cref at getpageref{#2}{\@temppage}#1{\@temppage}{}{}}%
+\def\@@@setcpageref#1#2{%
+  \cpageref at getlabel{#2}{\@temppage}#1{\@temppage}{}{}}%
 %    \end{macrocode}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 %
 % \begin{macro}{\@setcpagerefrange}
-%   The internal \cmd{\@setcpagerefrange} macro deals with typesetting
-%   page range references, just as \cmd{\@setcpageref} does for normal
-%   page references.
+% \begin{macro}{\@setCpagerefrange}
+% \begin{macro}{\@setlabelcpagerefrange}
+% \begin{macro}{\@@setcpagerefrange}
+%   The \cmd{\@@setcpagerefrange} macro deals with typesetting page range
+%   references, just as \cmd{\@@setcpageref} does for normal page
+%   references.
 %    \begin{macrocode}
-\def\@setcpagerefrange#1#2#3#4{%
+\def\@setcpagerefrange#1#2#3{\@@setcpagerefrange{#1}{#2}{cref}{#3}}%
+\def\@setCpagerefrange#1#2#3{\@@setcpagerefrange{#1}{#2}{Cref}{#3}}%
+\def\@setlabelcpagerefrange#1#2#3{\@@setcpagerefrange{#1}{#2}{labelcref}{#3}}%
+\def\@@setcpagerefrange#1#2#3#4{%
   \begingroup%
 %    \end{macrocode}
 % Check if both references are defined.
@@ -4098,13 +4002,13 @@
         \@latex at warning{Reference `#2' on page \thepage \space%
           undefined}%
       \else%
-        \cref at getpageref{#2}{\@pageb}%
+        \cpageref at getlabel{#2}{\@pageb}%
         \nfss at text{\reset at font\bfseries ??}--\@pageb%
       \fi%
     \else%
       \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
         \protect\G at refundefinedtrue%
-        \cref at getpageref{#1}{\@pagea}%
+        \cpageref at getlabel{#1}{\@pagea}%
         \@pagea--\nfss at text{\reset at font\bfseries ??}%
         \@latex at warning{Reference `#2' on page \thepage %
           \space undefined}%
@@ -4113,10 +4017,10 @@
 %   defined.
 %    \begin{macrocode}
       \else%
-        \cref at getpageref{#1}{\@pagea}%
-        \cref at getpageref{#2}{\@pageb}%
+        \cpageref at getlabel{#1}{\@pagea}%
+        \cpageref at getlabel{#2}{\@pageb}%
         \edef\@format{\expandafter\noexpand%
-          \csname #3range at page@format#4\endcsname}%
+          \csname#3range at page@format#4\endcsname}%
         \expandafter\ifx\@format\relax%
 %    \end{macrocode}
 %         If page reference format is undefined, but we're typesetting a
@@ -4125,12 +4029,12 @@
 %    \begin{macrocode}
           \edef\@tempa{#3}\def\@tempb{labelcref}%
           \ifx\@tempa\@tempb\relax%
-            \expandafter\@@setcpagerefrange\expandafter%
-              {\csname #3range at default@format#4\endcsname}{#1}{#2}%
+            \expandafter\@@@setcpagerefrange\expandafter%
+              {\csname#3range at default@format#4\endcsname}{#1}{#2}%
           \else%
             \protect\G at refundefinedtrue%
             \nfss at text{\reset at font\bfseries ??}~\@pagea--\@pageb%
-            \@latex at warning{#3\space reference range format for page
+            \@latex at warning{#3 reference range format for page
               references undefined}%
           \fi%
         \else%
@@ -4137,7 +4041,7 @@
 %    \end{macrocode}
 %     typeset page reference range,
 %    \begin{macrocode}
-          \expandafter\@@setcpagerefrange\expandafter{\@format}{#1}{#2}%
+          \expandafter\@@@setcpagerefrange\expandafter{\@format}{#1}{#2}%
         \fi%
       \fi%
     \fi%
@@ -4144,15 +4048,18 @@
   \endgroup}%
 %    \end{macrocode}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 %
-% \begin{macro}{\@@setcpagerefrange}
+% \begin{macro}{\@@@setcpagerefrange}
 %   We again separate out the very final typesetting step into a
 %   separate macro, in order to make it easier to redefine things later
 %   to make them work with the \package{hyperref} package.
 %    \begin{macrocode}
-\def\@@setcpagerefrange#1#2#3{%
-  \cref at getpageref{#2}{\@pagea}%
-  \cref at getpageref{#3}{\@pageb}%
+\def\@@@setcpagerefrange#1#2#3{%
+  \cpageref at getlabel{#2}{\@pagea}%
+  \cpageref at getlabel{#3}{\@pageb}%
   #1{\@pagea}{\@pageb}{}{}{}{}}%
 %    \end{macrocode}
 % \end{macro}
@@ -4485,6 +4392,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
+%
 % \begin{macro}{\@crefdefineformat}
 %   The \cmd{\@crefdefineformat} et al.\ macros construct calls to
 %   \cmd{\crefformat} et al.\ for the supplied reference type, which
@@ -4537,6 +4445,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
+%
 % \begin{macro}{\@crefrangedefineformat}
 %   Construct call to \cmd{\crefrangeformat}.
 %    \begin{macrocode}
@@ -4596,6 +4505,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
+%
 % \begin{macro}{\@crefdefinemultiformat}
 %   Construct call to \cmd{\crefmultiformat}.
 %    \begin{macrocode}
@@ -4690,6 +4600,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
+%
 % \begin{macro}{\@crefrangedefinemultiformat}
 %   Construct call to \cmd{\crefrangemultiformat}.
 %    \begin{macrocode}
@@ -4789,6 +4700,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
+%
 % \begin{macro}{\@labelcrefdefinedefaultformats}
 %   \cmd{\@labelcrefdefinedefaultformats} defines the default formats for
 %   the\linebreak[4] \cmd{\labelcref} command, which are used when no
@@ -4880,6 +4792,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
+%
 % \begin{macro}{\@crefdefineallformats}
 %   \cmd{\@crefdefineallformats} calls each of the above, to define all
 %   formats for the given type from the corresponding components.
@@ -4893,6 +4806,153 @@
 % \end{macro}
 %
 %
+% \begin{macro}{\@crefcopyformats}
+%   \cmd{\@crefcopyformats} copies any undefined formats for type |#2|
+%   from those for type |#1|.
+%    \begin{macrocode}
+\def\@crefcopyformats#1#2{%
+  \@ifundefined{cref@#2 at name}{%
+    \edef\@tempa{\expandafter\noexpand\csname cref@#2 at name\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname cref@#1 at name\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb%
+    \edef\@tempa{\expandafter\noexpand\csname cref@#2 at name@plural\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname cref@#1 at name@plural\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{cref@#2 at format}{%
+    \edef\@tempa{\expandafter\noexpand\csname cref@#2 at format\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname cref@#1 at format\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{crefrange@#2 at format}{%
+    \edef\@tempa{\expandafter\noexpand\csname crefrange@#2 at format\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname crefrange@#1 at format\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{cref@#2 at format@first}{%
+    \edef\@tempa{\expandafter\noexpand\csname cref@#2 at format@first\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname cref@#1 at format@first\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{cref@#2 at format@second}{%
+    \edef\@tempa{\expandafter\noexpand\csname cref@#2 at format@second\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname cref@#1 at format@second\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{cref@#2 at format@middle}{%
+    \edef\@tempa{\expandafter\noexpand\csname cref@#2 at format@middle\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname cref@#1 at format@middle\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{cref@#2 at format@last}{%
+    \edef\@tempa{\expandafter\noexpand\csname cref@#2 at format@last\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname cref@#1 at format@last\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{crefrange@#2 at format@first}{%
+    \edef\@tempa{\expandafter\noexpand\csname crefrange@#2 at format@first\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname crefrange@#1 at format@first\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{crefrange@#2 at format@second}{%
+    \edef\@tempa{\expandafter\noexpand\csname crefrange@#2 at format@second\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname crefrange@#1 at format@second\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{crefrange@#2 at format@middle}{%
+    \edef\@tempa{\expandafter\noexpand\csname crefrange@#2 at format@middle\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname crefrange@#1 at format@middle\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{crefrange@#2 at format@last}{%
+    \edef\@tempa{\expandafter\noexpand\csname crefrange@#2 at format@last\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname crefrange@#1 at format@last\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+%
+  \@ifundefined{Cref@#2 at name}{%
+    \edef\@tempa{\expandafter\noexpand\csname Cref@#2 at name\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Cref@#1 at name\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb%
+    \edef\@tempa{\expandafter\noexpand\csname Cref@#2 at name@plural\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Cref@#1 at name@plural\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Cref@#2 at format}{%
+    \edef\@tempa{\expandafter\noexpand\csname Cref@#2 at format\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Cref@#1 at format\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Crefrange@#2 at format}{%
+    \edef\@tempa{\expandafter\noexpand\csname Crefrange@#2 at format\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Crefrange@#1 at format\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Cref@#2 at format@first}{%
+    \edef\@tempa{\expandafter\noexpand\csname Cref@#2 at format@first\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Cref@#1 at format@first\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Cref@#2 at format@second}{%
+    \edef\@tempa{\expandafter\noexpand\csname Cref@#2 at format@second\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Cref@#1 at format@second\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Cref@#2 at format@middle}{%
+    \edef\@tempa{\expandafter\noexpand\csname Cref@#2 at format@middle\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Cref@#1 at format@middle\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Cref@#2 at format@last}{%
+    \edef\@tempa{\expandafter\noexpand\csname Cref@#2 at format@last\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Cref@#1 at format@last\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Crefrange@#2 at format@first}{%
+    \edef\@tempa{\expandafter\noexpand\csname Crefrange@#2 at format@first\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Crefrange@#1 at format@first\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Crefrange@#2 at format@second}{%
+    \edef\@tempa{\expandafter\noexpand\csname Crefrange@#2 at format@second\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Crefrange@#1 at format@second\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Crefrange@#2 at format@middle}{%
+    \edef\@tempa{\expandafter\noexpand\csname Crefrange@#2 at format@middle\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Crefrange@#1 at format@middle\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Crefrange@#2 at format@last}{%
+    \edef\@tempa{\expandafter\noexpand\csname Crefrange@#2 at format@last\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Crefrange@#1 at format@last\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+%
+  \@ifundefined{labelcref@#2 at format}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcref@#2 at format\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcref@#1 at format\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcrefrange@#2 at format}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcrefrange@#2 at format\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcrefrange@#1 at format\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcref@#2 at format@first}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcref@#2 at format@first\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcref@#1 at format@first\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcref@#2 at format@second}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcref@#2 at format@second\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcref@#1 at format@second\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcref@#2 at format@middle}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcref@#2 at format@middle\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcref@#1 at format@middle\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcref@#2 at format@last}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcref@#2 at format@last\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcref@#1 at format@last\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcrefrange@#2 at format@first}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcrefrange@#2 at format@first\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcrefrange@#1 at format@first\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcrefrange@#2 at format@second}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcrefrange@#2 at format@second\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcrefrange@#1 at format@second\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcrefrange@#2 at format@middle}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcrefrange@#2 at format@middle\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcrefrange@#1 at format@middle\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcrefrange@#2 at format@last}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcrefrange@#2 at format@last\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcrefrange@#1 at format@last\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+%
 % \subsubsection{Format definition commands}
 % \label{sec:crefformat}
 % \begin{macro}{\crefformat}
@@ -4907,7 +4967,7 @@
 %   control over the format of different reference types. They override
 %   the component-based formats, simply using the supplied arguments to
 %   define appropriately named formatting macros, which are called by
-%   \cmd{\@setcref} etc. If the corresponding \cmd{\Crefformat} or
+%   \cmd{\@@setcref} etc. If the corresponding \cmd{\Crefformat} or
 %   \cmd{\crefformat} variant is not already defined, they define it to
 %   be a version with the first letter capitalised or lower-cased.
 %    \begin{macrocode}
@@ -5212,11 +5272,21 @@
 %   \package{cleveref}.
 %    \begin{macrocode}
 \let\if at cref@hyperrefloaded\iffalse%
+\let\cref at addtoreset\@addtoreset%
 \@ifpackageloaded{hyperref}{%
   \@ifpackagewith{hyperref}{implicit=false}{}{%
     \let\if at cref@hyperrefloaded\iftrue%
     \PackageInfo{cleveref}{`hyperref' support loaded}%
 %    \end{macrocode}
+% \package{hyperref} redefines the \LaTeX{} kernel \cmd{\@addtoreset}
+% macro (sigh), but we sometimes need the vanilla version without the
+% \package{hyperref} shennanigans. \package{hyperref} saves the
+% original in \cmd{\HyOrg at addtoreset}. So we create yet
+% \emph{another} version called \cmd{\cref at addtotreset}, which is always
+% let to the original \cmd{\@addtoreset}, whereever that's found.
+%    \begin{macrocode}
+    \let\cref at addtoreset\HyOrg at addtoreset%
+%    \end{macrocode}
 % \begin{macro}{\cref at hyperlinkname}
 % \begin{macro}{\cref at hyperlinkurl}
 %   We define a utility macro to extract the hyperlink supplied by
@@ -5244,7 +5314,7 @@
 %   \package{cleveref}, so we don't bother providing \cmd{\hyper@@link}'s
 %   optional argument.)
 %    \begin{macrocode}
-    \def\cref at hyperlink#1#2#3\@nil{\hyper@@link[link]{#1}{#2}{#3}}
+    \def\cref at hyperlink#1#2#3\@nil{\hyper@@link[link]{#1}{#2}{#3}}%
 %    \end{macrocode}
 % \end{macro}
 %
@@ -5289,9 +5359,12 @@
     \let\refstepcounter at noarg\cref at old@refstepcounter%
     \def\refstepcounter at optarg[#1]#2{%
       \cref at old@refstepcounter{#2}%
+      \@ifundefined{cref@#1 at alias}%
+        {\def\@tempa{#1}}%
+        {\def\@tempa{\csname cref@#1 at alias\endcsname}}%
       \protected at edef\cref at currentlabel{%
         \expandafter\cref at override@label at type%
-          \cref at currentlabel\@nil{#1}}}%
+          \cref at currentlabel\@nil{\@tempa}}}%
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -5303,11 +5376,11 @@
 %   that needs to be redefined.
 %    \begin{macrocode}
     \@ifundefined{appendix}{}{%
-      \g at addto@macro\appendix{%
+      \def\appendix{%
         \@ifundefined{chapter}{%
-          \def\H at refstepcounter#1{%
-            \cref at old@H at refstepcounter{#1}%
-            \cref at constructprefix{#1}{\cref at result}%
+          \def\H at refstepcounter##1{%
+            \cref at old@H at refstepcounter{##1}%
+            \cref at constructprefix{##1}{\cref at result}%
 %    \end{macrocode}
 %         We add a large value to the front of the counter data, to force
 %         references to anything in appendices to be sorted after
@@ -5321,40 +5394,41 @@
 %    \end{macrocode}
 %         Override the cross-reference type of sectioning commands.
 %    \begin{macrocode}
-            \def\@tempa{#1}%
+            \def\@tempa{##1}%
             \def\@tempb{section}%
             \ifx\@tempa\@tempb%
               \protected at edef\cref at currentlabel{%
-                [appendix][\arabic{#1}][\cref at result]%
-                \csname p@#1\endcsname\csname the#1\endcsname}%
+                [appendix][\arabic{##1}][\cref at result]%
+                \csname p@##1\endcsname\csname the##1\endcsname}%
             \else%
-              \def\@tempa{#1}%
+              \def\@tempa{##1}%
               \def\@tempb{subsection}%
               \ifx\@tempa\@tempb%
                 \protected at edef\cref at currentlabel{%
-                  [subappendix][\arabic{#1}][\cref at result]%
-                  \csname p@#1\endcsname\csname the#1\endcsname}%
+                  [subappendix][\arabic{##1}][\cref at result]%
+                  \csname p@##1\endcsname\csname the##1\endcsname}%
               \else%
-                \def\@tempa{#1}%
+                \def\@tempa{##1}%
                 \def\@tempb{subsubsection}%
                 \ifx\@tempa\@tempb%
                   \protected at edef\cref at currentlabel{%
-                    [subsubappendix][\arabic{#1}][\cref at result]%
-                    \csname p@#1\endcsname\csname the#1\endcsname}%
+                    [subsubappendix][\arabic{##1}][\cref at result]%
+                    \csname p@##1\endcsname\csname the##1\endcsname}%
                 \else%
-                  \@ifundefined{cref@#1 at alias}%
-                    {\def\@tempa{#1}}%
-                    {\def\@tempa{\csname cref@#1 at alias\endcsname}}%
+                  \@ifundefined{cref@##1 at alias}%
+                    {\def\@tempa{##1}}%
+                    {\def\@tempa{\csname cref@##1 at alias\endcsname}}%
                   \protected at edef\cref at currentlabel{%
-                    [\@tempa][\arabic{#1}][\cref at result]%
-                    \csname p@#1\endcsname\csname the#1\endcsname}%
+                    [\@tempa][\arabic{##1}][\cref at result]%
+                    \csname p@##1\endcsname\csname the##1\endcsname}%
                 \fi%
               \fi%
             \fi}%
+          \cref at old@appendix%
         }{%
-          \def\H at refstepcounter#1{%
-            \cref at old@H at refstepcounter{#1}%
-            \cref at constructprefix{#1}{\cref at result}%
+          \def\H at refstepcounter##1{%
+            \cref at old@H at refstepcounter{##1}%
+            \cref at constructprefix{##1}{\cref at result}%
 %    \end{macrocode}
 %         Again, the large value added to the front of the counter data
 %         forces references to appendix items to be sorted last.
@@ -5367,45 +5441,45 @@
 %    \end{macrocode}
 %         Override the cross-reference type of sectioning commands.
 %    \begin{macrocode}
-            \def\@tempa{#1}%
+            \def\@tempa{##1}%
             \def\@tempb{chapter}%
             \ifx\@tempa\@tempb%
               \protected at edef\cref at currentlabel{%
-                [appendix][\arabic{#1}][\cref at result]%
-                \csname p@#1\endcsname\csname the#1\endcsname}%
+                [appendix][\arabic{##1}][\cref at result]%
+                \csname p@##1\endcsname\csname the##1\endcsname}%
             \else%
-              \def\@tempa{#1}%
+              \def\@tempa{##1}%
               \def\@tempb{section}%
               \ifx\@tempa\@tempb%
                 \protected at edef\cref at currentlabel{%
-                  [subappendix][\arabic{#1}][\cref at result]%
-                  \csname p@#1\endcsname\csname the#1\endcsname}%
+                  [subappendix][\arabic{##1}][\cref at result]%
+                  \csname p@##1\endcsname\csname the##1\endcsname}%
               \else%
-                \def\@tempa{#1}%
+                \def\@tempa{##1}%
                 \def\@tempb{subsection}%
                 \ifx\@tempa\@tempb%
                   \protected at edef\cref at currentlabel{%
-                    [subsubappendix][\arabic{#1}][\cref at result]%
-                    \csname p@#1\endcsname\csname the#1\endcsname}%
+                    [subsubappendix][\arabic{##1}][\cref at result]%
+                    \csname p@##1\endcsname\csname the##1\endcsname}%
                 \else%
-                  \def\@tempa{#1}%
+                  \def\@tempa{##1}%
                   \def\@tempb{subsubsection}%
                   \ifx\@tempa\@tempb%
                     \protected at edef\cref at currentlabel{%
-                      [subsubsubappendix][\arabic{#1}][\cref at result]%
-                      \csname p@#1\endcsname\csname the#1\endcsname}%
+                      [subsubsubappendix][\arabic{##1}][\cref at result]%
+                      \csname p@##1\endcsname\csname the##1\endcsname}%
                   \else%
-                    \@ifundefined{cref@#1 at alias}%
-                      {\def\@tempa{#1}}%
-                      {\def\@tempa{\csname cref@#1 at alias\endcsname}}%
+                    \@ifundefined{cref@##1 at alias}%
+                      {\def\@tempa{##1}}%
+                      {\def\@tempa{\csname cref@##1 at alias\endcsname}}%
                     \protected at edef\cref at currentlabel{%
-                      [\@tempa][\arabic{#1}][\cref at result]%
-                      \csname p@#1\endcsname\csname the#1\endcsname}%
+                      [\@tempa][\arabic{##1}][\cref at result]%
+                      \csname p@##1\endcsname\csname the##1\endcsname}%
                   \fi%
                 \fi%
               \fi%
             \fi}%
-        }%
+      \cref at old@appendix}%
       }%
     }% end of \@ifundefined{appendix}
 %    \end{macrocode}
@@ -5414,21 +5488,23 @@
 % \begin{macro}{\cref*}
 % \begin{macro}{\Cref*}
 % \begin{macro}{\@crefstar}
-% \begin{macro}{\@crefnostar}
 %   We redefine \cmd{\cref} and all the others to allow starred variants,
 %   which don't create hyperlinks. The starred variants simply set a
 %   flag, which is tested in the very final stage of reference
-%   typesetting in \cmd{\@@setcref}, \cmd{\@@setcrefrange},
-%   \cmd{\@@setcpageref} and \cmd{\@@setcpagerefrange} (below).
+%   typesetting in \cmd{\@@@setcref}, \cmd{\@@@setcrefrange},
+%   \cmd{\@@@setcpageref} and \cmd{\@@@setcpagerefrange} (below).
 %    \begin{macrocode}
     \DeclareRobustCommand{\cref}{%
-      \@ifstar{\@crefstar{cref}}{\@crefnostar{cref}}}%
+      \@ifstar{\@crefstar{cref}}{\@cref{cref}}}%
     \DeclareRobustCommand{\Cref}{%
-      \@ifstar{\@crefstar{Cref}}{\@crefnostar{Cref}}}%
-    \def\@crefnostar#1#2{\@cref{#1}{#2}}%
+      \@ifstar{\@crefstar{Cref}}{\@cref{Cref}}}%
     \def\@crefstar#1#2{%
       \@crefstarredtrue\@cref{#1}{#2}\@crefstarredfalse}%
 %    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
 % \begin{macro}{\crefrange*}
 % \begin{macro}{\Crefrange*}
 % \begin{macro}{\@crefrangestar}
@@ -5438,62 +5514,58 @@
       \@ifstar{\@crefrangestar{cref}}{\@crefrangenostar{cref}}}%
     \DeclareRobustCommand{\Crefrange}{%
       \@ifstar{\@crefrangestar{Cref}}{\@crefrangenostar{Cref}}}%
-    \def\@crefrangenostar#1#2#3{\@setcrefrange{#2}{#3}{#1}{}}%
+    \def\@crefrangenostar#1#2#3{\@@setcrefrange{#1}{#2}{#3}{}}
     \def\@crefrangestar#1#2#3{%
-      \@crefstarredtrue\@setcrefrange{#2}{#3}{#1}{}\@crefstarredfalse}%
+      \@crefstarredtrue\@@setcrefrange{#1}{#2}{#3}{}\@crefstarredfalse}%
 %    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
 % \begin{macro}{\cpageref*}
 % \begin{macro}{\Cpageref*}
-% \begin{macro}{\@cpagerefstar}
-% \begin{macro}{\@cpagerefnostar}
 %    \begin{macrocode}
     \DeclareRobustCommand{\cpageref}{%
-      \@ifstar{\@cpagerefstar{cref}}{\@cpagerefnostar{cref}}}%
+      \@ifstar{\@crefstar{cpageref}}{\@cref{cpageref}}}%
     \DeclareRobustCommand{\Cpageref}{%
-      \@ifstar{\@cpagerefstar{Cref}}{\@cpagerefnostar{Cref}}}%
-    \def\@cpagerefnostar#1#2{%
-      \@cpageref{#1}{#2}{\@setcpageref}{\@setcpagerefrange}}%
-    \def\@cpagerefstar#1#2{%
-      \@crefstarredtrue%
-      \@cpageref{#1}{#2}{\@setcpageref}{\@setcpagerefrange}%
-      \@crefstarredfalse}%
+      \@ifstar{\@crefstar{Cpageref}}{\@cref{Cpageref}}}%
 %    \end{macrocode}
+% \end{macro}
+% \end{macro}
 % \begin{macro}{\cpagerefrange*}
 % \begin{macro}{\Cpagerefrange*}
 % \begin{macro}{\@cpagerefrangestar}
-% \begin{macro}{\@cpagerefrangenostar}
 %    \begin{macrocode}
     \DeclareRobustCommand{\cpagerefrange}{%
-      \@ifstar{\@cpagerefrangestar{cref}}{\@cpagerefrangenostar{cref}}}%
+      \@ifstar{\@cpagerefrangestar{cpageref}}{\@setcpagerefrange}}%
     \DeclareRobustCommand{\Cpagerefrange}{%
-      \@ifstar{\@cpagerefrangestar{Cref}}{\@cpagerefrangenostar{Cref}}}%
-    \def\@cpagerefrangenostar#1#2#3{\@setcpagerefrange{#2}{#3}{#1}{}}%
+      \@ifstar{\@cpagerefrangestar{Cpageref}}{\@setCpagerefrange}}%
     \def\@cpagerefrangestar#1#2#3{%
       \@crefstarredtrue%
-      \@setcpagerefrange{#2}{#3}{#1}{}%
+      \@@setcpagerefrange{#1}{#2}{#3}{}%
       \@crefstarredfalse}%
 %    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
 % \begin{macro}{\labelcref*}
 % \begin{macro}{\labelcpageref*}
 % \begin{macro}{\@labelcrefstar}
-% \begin{macro}{\@labelcrefnostar}
 % \begin{macro}{\@labelcpagerefstar}
-% \begin{macro}{\@labelcpagerefnostar}
 %    \begin{macrocode}
     \DeclareRobustCommand{\labelcref}{%
-      \@ifstar{\@labelcrefstar}{\@labelcrefnostar}}%
-    \def\@labelcrefnostar#1{\@cref{labelcref}{#1}}%
+      \@ifstar{\@labelcrefstar}{\@cref{labelcref}}}%
     \def\@labelcrefstar#1{%
       \@crefstarredtrue%
       \@cref{labelcref}{#1}%
       \@crefstarredfalse}%
     \DeclareRobustCommand{\labelcpageref}{%
-      \@ifstar{\@labelcpagerefstar}{\@labelcpagerefnostar}}%
-    \def\@labelcpagerefnostar#1{%
-      \@cpageref{labelcref}{#1}{\@setcpageref}{\@setcpagerefrange}}%
+      \@ifstar{\@labelcpagerefstar}{\@cref{labelcpageref}}}%
     \def\@labelcpagerefstar#1{%
       \@crefstarredtrue%
-      \@cpageref{labelcref}{#1}{\@setcpageref}{\@setcpagerefrange}%
+      \@cref{labelcpageref}{#1}%
       \@crefstarredfalse}%
 %    \end{macrocode}
 % \end{macro}
@@ -5500,35 +5572,17 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
 %
-% \begin{macro}{\@@setcref}
-% \begin{macro}{\@@setcrefrange}
-% \begin{macro}{\@@setcpageref}
-% \begin{macro}{\@@setcpagerefrange}
+% \begin{macro}{\@@@setcref}
+% \begin{macro}{\@@@setcrefrange}
+% \begin{macro}{\@@@setcpageref}
+% \begin{macro}{\@@@setcpagerefrange}
 %   Redefine the final reference typesetting macros to create hyperlinks
 %   (unless the starred flag is set), using the extra arguments supplied
 %   in \cmd{\r@\meta{label}} (via the \file{aux} file) by
 %   \package{hyperref}.
 %    \begin{macrocode}
-    \def\@@setcref#1#2{%
+    \def\@@@setcref#1#2{%
       \cref at getlabel{#2}{\@templabel}%
       \if at crefstarred%
         #1{\@templabel}{}{}%
@@ -5537,7 +5591,7 @@
         \edef\@tempurl{\cref at hyperlinkurl{#2}}%
         #1{\@templabel}{\cref at hyperlink{\@tempurl}{\@tempname}}{\@nil}%
       \fi}%
-    \def\@@setcrefrange#1#2#3{%
+    \def\@@@setcrefrange#1#2#3{%
       \cref at getlabel{#2}{\@labela}%
       \cref at getlabel{#3}{\@labelb}%
       \if at crefstarred%
@@ -5551,8 +5605,8 @@
           {\cref at hyperlink{\@tempurla}{\@tempnamea}}{\@nil}%
           {\cref at hyperlink{\@tempurlb}{\@tempnameb}}{\@nil}%
       \fi}%
-    \def\@@setcpageref#1#2{%
-      \cref at getpageref{#2}{\@temppage}%
+    \def\@@@setcpageref#1#2{%
+      \cpageref at getlabel{#2}{\@temppage}%
       \if at crefstarred%
         #1{\@temppage}{}{}%
       \else%
@@ -5560,9 +5614,9 @@
         \edef\@tempurl{\cref at hyperlinkurl{#2}}%
         #1{\@temppage}{\cref at hyperlink{\@tempurl}{\@tempname}}{\@nil}%
       \fi}%
-    \def\@@setcpagerefrange#1#2#3{%
-      \cref at getpageref{#2}{\@pagea}%
-      \cref at getpageref{#3}{\@pageb}%
+    \def\@@@setcpagerefrange#1#2#3{%
+      \cpageref at getlabel{#2}{\@pagea}%
+      \cpageref at getlabel{#3}{\@pageb}%
       \if at crefstarred%
         #1{\@pagea}{\@pageb}{}{}{}{}%
       \else%
@@ -5599,10 +5653,131 @@
       \protected at edef\cref at currentlabel{%
         [\@tempa][\arabic{#1}][\cref at result]%
         \csname p@#1\endcsname\csname the#1\endcsname}}%
-  \fi%
+%    \end{macrocode}
+%   We also need to redefine |\appendix| to use
+%    \begin{macrocode}
+    \@ifundefined{appendix}{}{%
+      \def\appendix{%
+        \@ifundefined{chapter}{%
+          \def\H at refstepcounter##1{%
+            \cref at old@H at refstepcounter{##1}%
+            \cref at constructprefix{##1}{\cref at result}%
+%    \end{macrocode}
+%         We add a large value to the front of the counter data, to force
+%         references to anything in appendices to be sorted after
+%         everything else.
+%    \begin{macrocode}
+            \ifx\cref at result\@empty%
+              \def\cref at result{2147483647}%
+            \else%
+              \edef\cref at result{2147483647,\cref at result}%
+            \fi%
+%    \end{macrocode}
+%         Override the cross-reference type of sectioning commands.
+%    \begin{macrocode}
+            \def\@tempa{##1}%
+            \def\@tempb{section}%
+            \ifx\@tempa\@tempb%
+              \protected at edef\cref at currentlabel{%
+                [appendix][\arabic{##1}][\cref at result]%
+                \csname p@##1\endcsname\csname the##1\endcsname}%
+            \else%
+              \def\@tempa{##1}%
+              \def\@tempb{subsection}%
+              \ifx\@tempa\@tempb%
+                \protected at edef\cref at currentlabel{%
+                  [subappendix][\arabic{##1}][\cref at result]%
+                  \csname p@##1\endcsname\csname the##1\endcsname}%
+              \else%
+                \def\@tempa{##1}%
+                \def\@tempb{subsubsection}%
+                \ifx\@tempa\@tempb%
+                  \protected at edef\cref at currentlabel{%
+                    [subsubappendix][\arabic{##1}][\cref at result]%
+                    \csname p@##1\endcsname\csname the##1\endcsname}%
+                \else%
+                  \@ifundefined{cref@##1 at alias}%
+                    {\def\@tempa{##1}}%
+                    {\def\@tempa{\csname cref@##1 at alias\endcsname}}%
+                  \protected at edef\cref at currentlabel{%
+                    [\@tempa][\arabic{##1}][\cref at result]%
+                    \csname p@##1\endcsname\csname the##1\endcsname}%
+                \fi%
+              \fi%
+            \fi}%
+          \cref at old@appendix%
+        }{%
+          \def\H at refstepcounter##1{%
+            \cref at old@H at refstepcounter{##1}%
+            \cref at constructprefix{##1}{\cref at result}%
+%    \end{macrocode}
+%         Again, the large value added to the front of the counter data
+%         forces references to appendix items to be sorted last.
+%    \begin{macrocode}
+            \ifx\cref at result\@empty%
+              \def\cref at result{2147483647}%
+            \else%
+              \edef\cref at result{2147483647,\cref at result}%
+            \fi%
+%    \end{macrocode}
+%         Override the cross-reference type of sectioning commands.
+%    \begin{macrocode}
+            \def\@tempa{##1}%
+            \def\@tempb{chapter}%
+            \ifx\@tempa\@tempb%
+              \protected at edef\cref at currentlabel{%
+                [appendix][\arabic{##1}][\cref at result]%
+                \csname p@##1\endcsname\csname the##1\endcsname}%
+            \else%
+              \def\@tempa{##1}%
+              \def\@tempb{section}%
+              \ifx\@tempa\@tempb%
+                \protected at edef\cref at currentlabel{%
+                  [subappendix][\arabic{##1}][\cref at result]%
+                  \csname p@##1\endcsname\csname the##1\endcsname}%
+              \else%
+                \def\@tempa{##1}%
+                \def\@tempb{subsection}%
+                \ifx\@tempa\@tempb%
+                  \protected at edef\cref at currentlabel{%
+                    [subsubappendix][\arabic{##1}][\cref at result]%
+                    \csname p@##1\endcsname\csname the##1\endcsname}%
+                \else%
+                  \def\@tempa{##1}%
+                  \def\@tempb{subsubsection}%
+                  \ifx\@tempa\@tempb%
+                    \protected at edef\cref at currentlabel{%
+                      [subsubsubappendix][\arabic{##1}][\cref at result]%
+                      \csname p@##1\endcsname\csname the##1\endcsname}%
+                  \else%
+                    \@ifundefined{cref@##1 at alias}%
+                      {\def\@tempa{##1}}%
+                      {\def\@tempa{\csname cref@##1 at alias\endcsname}}%
+                    \protected at edef\cref at currentlabel{%
+                      [\@tempa][\arabic{##1}][\cref at result]%
+                      \csname p@##1\endcsname\csname the##1\endcsname}%
+                  \fi%
+                \fi%
+              \fi%
+            \fi}%
+      \cref at old@appendix}%
+      }%
+    }% end of \@ifundefined{appendix}
+  \fi% end of \if at cref@hyperrefloaded
   \let\if at cref@hyperrefloaded\iffalse%
 }% end of \@ifpackageloaded{hyperref}
 %    \end{macrocode}
+% Add check to AtBeginDocument to throw error if \package{hyperref} was
+% loaded after cleveref.
+%    \begin{macrocode}
+\AtBeginDocument{%
+  \if at cref@hyperrefloaded\else%
+    \@ifpackageloaded{hyperref}{%
+      \PackageError{cleveref}{cleveref must be loaded after hyperref!}%
+        {Package load order is wrong: load cleveref *after* hyperref.}
+    }{}%
+  \fi}
+%    \end{macrocode}
 % \end{macro}
 % \end{macro}
 % \end{macro}
@@ -5618,7 +5793,7 @@
 %   \cmd{\cref} instead of \cmd{\ref} to produce the reference. Since
 %   \cmd{\cref} can cope with multiple references, we extend the page
 %   referencing magic of \cmd{\vref} et al.\ to use \cmd{\cpageref}
-%   instead, assisted by \cmd{\@setvpageref} and \cmd{\@vpagerefrange}
+%   instead, assisted by \cmd{\@@setvpageref} and \cmd{\@vpagerefrange}
 %   (which typeset page references using \package{varioref} commands).
 %   The former takes care of multi-references, the latter take care of
 %   the \package{varioref} page referencing magic.
@@ -5625,7 +5800,9 @@
 % \end{macro}
 %
 %    \begin{macrocode}
+\let\if at cref@variorefloaded\iffalse%
 \@ifpackageloaded{varioref}{%
+  \let\if at cref@variorefloaded\iftrue%
   \PackageInfo{cleveref}{`varioref' support loaded}%
   \PackageInfo{cleveref}{`cleveref' supersedes `varioref's
     \string\labelformat command}%
@@ -5632,6 +5809,91 @@
 %    \end{macrocode}
 %
 %
+% \begin{macro}{\cref at old@@vpageref}
+%   Unfortunately, \package{varioref}'s |\@@vpageref| macro calls a
+%   |\vref at label| \emph{before} it typesets the page reference. The
+%   |\protected at write| within |\vref at label| seems to prevent an |\unskip|
+%   command coming after the |\vref at label| from removing any space that
+%   was inserted before the |\vref at label|. This means that setting a
+%   |\reftext|\meta{x} command to |\unskip| won't work; it won't properly
+%   remove any preceding space in the event that an empty page reference
+%   is typeset.
+%
+%   This didn't matter in the original \package{varioref} implementation,
+%   because it \emph{always} removed any preceding space, then inserted
+%   its own space \emph{after} the |\vref at label|, which the |\unskip|
+%   could then gobble. But we want to get rid of this irritating
+%   always-space-gobbling behaviour here. So we have to redefine
+%   |\@@vpageref| (here renamed |\cref at old@@vpageref|) in order to move
+%   the |\vref at label| to the end of the macro, after the page reference
+%   has been typeset. We also remove the |\unskip| from the start of
+%   |\@@vpageref|.
+%    \begin{macrocode}
+  \def\cref at old@@vpageref#1[#2]#3{%
+    \leavevmode%\unskip  <<<
+    \global\advance\c at vrcnt\@ne\relax%
+    \vref at pagenum\@tempa{\the\c at vrcnt @vr}%
+    \vref at pagenum\@tempb{\the\c at vrcnt @xvr}%
+    %\vref at label{\the\c at vrcnt @xvr}%  <<<
+    \ifx\@tempa\@tempb\else%
+      \vref at err{\noexpand\vref or \noexpand\vpageref at page boundary
+                \@tempb-\@tempa\space (may loop)%
+                }%
+    \fi%
+    \vrefpagenum\thevpagerefnum{#3}%
+    \vref at space%
+    \ifx\@tempa\thevpagerefnum%
+      \def\@tempc{#1}%
+      \ifx\@tempc\@empty%
+         \unskip%
+      \else%
+         #1%
+      \fi%
+    \else%
+      #2%
+      \is at pos@number\thevpagerefnum%
+         {%
+          \is at pos@number\@tempa%
+           {\@tempcnta\@tempa%
+            \advance\@tempcnta\@ne\relax%
+           }%
+           {\@tempcnta\maxdimen}%
+          \ifnum \thevpagerefnum =\@tempcnta%
+           \ifodd\@tempcnta%
+             \if at twoside%
+               \reftextfaceafter%
+             \else%
+               \reftextafter%
+             \fi%
+           \else%
+             \reftextafter%
+           \fi%
+          \else%
+            \advance\@tempcnta-2\relax%
+            \ifnum \thevpagerefnum =\@tempcnta%
+              \ifodd\@tempcnta%
+                \reftextbefore%
+              \else%
+                \if at twoside%
+                  \reftextfacebefore%
+                \else%
+                  \reftextbefore%
+                \fi%
+              \fi%
+            \else%
+              \reftextfaraway{#3}%
+            \fi%
+          \fi%
+         }%
+         {\reftextfaraway{#3}}%
+    \fi%
+    \vref at label{\the\c at vrcnt @xvr}%  <<<
+    \vref at label{\the\c at vrcnt @vr}%
+  }%
+%    \end{macrocode}
+% \end{macro}
+%
+%
 % \begin{macro}{\cref@@vpageref}
 %   We first enhance the core \package{varioref} |\vpageref| macro to
 %   allow it to cope with lists of page references. This is done by
@@ -5641,10 +5903,18 @@
 %   \package{varioref}'s own page-referencing commands. (The alternative
 %   version of \cmd{\vpagerefrange} is there to facilitate later
 %   redefinitions.)
+%
+%   Most of the work is done by defining suitable |\@setvpageref| etc.\
+%   commands (below), called as appropriate by our ever-faithful
+%   \cmd{\@cref} work-horse. We only make use of one of the optional
+%   arguments to the original \package{varioref} |\@@vpageref| macro,
+%   which we store here in \cmd{\cref@@vpageref} for later.
 %    \begin{macrocode}
   \def\cref@@vpageref#1[#2]#3{%
-    \@cpageref{cref}{#3}%
-      {\@setvpageref[#1][\vref at space]}{\@setvpagerefrange[#1]}}%
+    \begingroup%
+    \def\cref@@vpageref at arg{#1}%
+    \@cref{vpageref}{#3}%
+    \endgroup}%
 %    \end{macrocode}
 % \end{macro}
 %
@@ -5675,10 +5945,9 @@
       \cref@@vpageref{\reftextcurrent}[]{#2}%
     \endgroup}%
   \def\cref at vrefrange#1#2#3{%
-    \@setcrefrange{#2}{#3}{#1}{}\@setcref at space\vpagerefrange{#2}{#3}}%
+    \@@setcrefrange{#1}{#2}{#3}{}\@setcref at space\vpagerefrange{#2}{#3}}%
   \def\cref at fullref#1#2{%
-    \@cref{#1}{#2}\@setcref at space%
-    \@cpageref{cref}{#2}{\@setfullpageref}{\@setfullpagerefrange}}%
+    \@cref{#1}{#2}\@setcref at space\@cref{fullpageref}{#2}}%
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -5720,29 +5989,22 @@
 %
 %
 % \begin{macro}{\@setvpageref}
-%   The \cmd{\@setvpageref} and \cmd{\@setvpagerefrange} macros typeset
+%   The \cmd{\@setvpageref} macro is called by \cmd{\@cref} to typeset
 %   page references using \package{varioref} commands, tweaked to work
-%   with the enhanced \package{cleveref} page-referencing features. They
-%   are passed to \cmd{\@cpageref} by the \package{cleveref}-enhanced
-%   \cmd{\vpageref} command, thereby combining the \package{cleveref} and
-%   \package{varioref} page-referencing features.
-%
-%   |#1| and |#2| are \package{varioref} arguments that get passed
-%   straight through to the (original) \package{varioref} |\@@vpageref|
-%   macro. |#3| is the reference label itself. |#4| is either |cref| or
-%   |Cref|, identifying the capitalisation variant, and |#5| is either
-%   empty if we're typesetting a single page reference, or one of
-%   |@first|, |@second|, |@middle| or |@end|, identifying where the page
-%   reference comes in a multi-reference. The arguments in square
-%   brackets are passed all the way through from the
-%   \package{cleveref}-enhanced \package{varioref} commands. The others
-%   are added by |\@cpageref| when it calls |\@setvpageref|.
+%   with the enhanced \package{cleveref} page-referencing features.
+%   |#1| is the reference itself. |#2| is either empty if we're
+%   typesetting a single page reference, or one of |@first|, |@second|,
+%   |@middle| or |@end|, identifying where the page reference comes in a
+%   multi-reference. We only make use of one of the optional arguments to
+%   the original \package{varioref} |\@@vpageref| macro, available here
+%   as \cmd{\cref@@vpageref at arg} (stored there by \cmd{\cref@@vpageref},
+%   above).
 %    \begin{macrocode}
-  \def\@setvpageref[#1][#2]#3#4#5{%
+  \def\@setvpageref#1#2{%
 %    \end{macrocode}
 %   Add the appropriate conjunction before the page reference.
 %    \begin{macrocode}
-    \cref at vpagerefconjunction{#5}%
+    \cref at vpagerefconjunction{#2}%
 %    \end{macrocode}
 %   Undefining |\vref at space| prevents the original \package{varioref}
 %   |\@@vpageref| macro from |\unskip|ing any preceding space and
@@ -5761,17 +6023,18 @@
 %   typeset the page reference.
 %    \begin{macrocode}
     \begingroup%
-      \cref at patchreftexts{#5}%
-      \@@setvpageref{#1}[#2]{#3}%
+      \cref at patchreftexts{#2}%
+      \expandafter\@@@setvpageref\expandafter%
+        {\cref@@vpageref at arg}[\vref at space]{#1}%
     \endgroup}%
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@setvpageref}
+% \begin{macro}{\@@@setvpageref}
 %   We separate out the final type setting step, as always, to make it
 %   easier to redefine things later.
 %    \begin{macrocode}
-  \def\@@setvpageref#1[#2]#3{\cref at old@@vpageref{#1}[#2]{#3}}%
+  \let\@@@setvpageref\cref at old@@vpageref%
 %    \end{macrocode}
 % \end{macro}
 %
@@ -5778,22 +6041,19 @@
 %
 % \begin{macro}{\@setvpagerefrange}
 %   |\@setvpagerefrange| is similar to |\@setvpageref|, but typesets page
-%   ranges. |#1| is a \package{varioref} spacing argument that get passed
-%   straight through to the \package{varioref} |\vpagerefrange| macro.
-%   |#2| and |#3| are the labels themselves. |#4| is either |cref| or
-%   |Cref|, identifying the capitalisation variant, and |#5| is either
-%   empty if we're typesetting a single page range, or one of |@first|,
+%   ranges. |#1| and |#2| are the labels themselves. |#3| is either empty
+%   if we're typesetting a single page range, or one of |@first|,
 %   |@second|, |@middle| or |@end|, identifying where the page reference
-%   comes in a multi-reference. The arguments in square brackets are
-%   passed all the way through from the \package{cleveref}-enhanced
-%   \package{varioref} commands. The others are added by |\@cpageref|
-%   when it calls |\@setvpagerefrange|.
+%   comes in a multi-reference. We only make use of one of the optional
+%   arguments to the original \package{varioref} |\@@vpageref| macro,
+%   available here as \cmd{\cref@@vpageref at arg} (stored there by
+%   \cmd{\cref@@vpageref}, above).
 %    \begin{macrocode}
-  \def\@setvpagerefrange[#1]#2#3#4#5{%
+  \def\@setvpagerefrange#1#2#3{%
 %    \end{macrocode}
 % Add the appropriate conjunction before the page range reference.
 %    \begin{macrocode}
-    \cref at vpagerefconjunction{#5}%
+    \cref at vpagerefconjunction{#3}%
 %    \end{macrocode}
 %   Unlike |\vpageref|, \package{varioref}'s |\vpagerefrange| command
 %   \emph{doesn't} go in for quite the same space-mangling behaviour. We
@@ -5806,26 +6066,30 @@
 % typeset the page range.
 %    \begin{macrocode}
     \begingroup%
-      \cref at patchreftexts{#5}%
-      \@@setvpagerefrange[#1]{#2}{#3}%
+      \cref at patchreftexts{#3}%
+      \expandafter\@@@setvpagerefrange\expandafter%
+        [\cref@@vpageref at arg]{#1}{#2}%
     \endgroup}%
 %    \end{macrocode}
+% \end{macro}
 %
+% \begin{macro}{\@@@setvpagerefrange}
 % Again, we separate out the final typesetting step, to aid later
 % redefinition.
 %    \begin{macrocode}
-  \def\@@setvpagerefrange[#1]#2#3{\vpagerefrange[#1]{#2}{#3}}%
+  \let\@@@setvpagerefrange\vpagerefrange
 %    \end{macrocode}
 % \end{macro}
 %
-%
 % \begin{macro}{\@setfullpageref}
+%   Ditto for \cmd{\@setfullpageref}, with |#1| the reference, |#2|
+%   either empty, |@first|, |@second|, |@middle| or |@end|.
 %    \begin{macrocode}
-  \def\@setfullpageref#1#2#3{%
+  \def\@setfullpageref#1#2{%
 %    \end{macrocode}
 % Add the appropriate conjunction before the page reference.
 %    \begin{macrocode}
-    \cref at vpagerefconjunction{#3}%
+    \cref at vpagerefconjunction{#2}%
 %    \end{macrocode}
 % Modify the \package{varioref} |\reftext|\meta{x} commands as
 % appropriate for the page reference we're currently typesetting, then
@@ -5832,25 +6096,30 @@
 % typeset the page reference.
 %    \begin{macrocode}
     \begingroup%
-      \cref at patchreftexts{#3}%
-      \@@setfullpageref{#1}%
+      \cref at patchreftexts{#2}%
+      \@@@setfullpageref{#1}%
     \endgroup}%
 %    \end{macrocode}
+% \end{macro}
 %
-% Separate out the final typesetting step, as usual.
+% \begin{macro}{\@@@setfullpageref}
+%   Separate out the final typesetting step, as usual.
 %    \begin{macrocode}
-  \def\@@setfullpageref#1{\reftextfaraway{#1}}%
+  \let\@@@setfullpageref\reftextfaraway%
 %    \end{macrocode}
 % \end{macro}
 %
 %
 % \begin{macro}{\@setfullpagerefrange}
+%   Ditto for \cmd{\@setfullpagerefrange}, with |#1| and |#2| the
+%   references, |#3| either empty, |@first|, |@second|, |@middle| or
+%   |@end|.
 %    \begin{macrocode}
-  \def\@setfullpagerefrange#1#2#3#4{%
+  \def\@setfullpagerefrange#1#2#3{%
 %    \end{macrocode}
 % Add the appropriate conjunction before the page reference.
 %    \begin{macrocode}
-    \cref at vpagerefconjunction{#4}%
+    \cref at vpagerefconjunction{#3}%
 %    \end{macrocode}
 % Modify the \package{varioref} |\reftext|\meta{x} commands as
 % appropriate for the page reference we're currently typesetting, then
@@ -5857,99 +6126,16 @@
 % typeset the page reference.
 %    \begin{macrocode}
     \begingroup%
-      \cref at patchreftexts{#4}%
-      \@@setfullpagerefrange{#1}{#2}%
+      \cref at patchreftexts{#3}%
+      \@@@setfullpagerefrange{#1}{#2}%
     \endgroup}%
 %    \end{macrocode}
-%
-% Separate out the final typesetting step, as usual.
-%    \begin{macrocode}
-  \def\@@setfullpagerefrange#1#2{\reftextpagerange{#1}{#2}}%
-%    \end{macrocode}
 % \end{macro}
 %
-%
-% \begin{macro}{\cref at old@@vpageref}
-%   Unfortunately, \package{varioref}'s |\@@vpageref| macro calls a
-%   |\vref at label| \emph{before} it typesets the page reference. The
-%   |\protected at write| within |\vref at label| seems to prevent an |\unskip|
-%   command coming after the |\vref at label| from removing any space that
-%   was inserted before the |\vref at label|. This means that setting a
-%   |\reftext|\meta{x} command to |\unskip| won't work; it won't properly
-%   remove any preceding space in the event that the an empty page
-%   reference is typeset.
-%
-%   This didn't matter in the original \package{varioref} implementation,
-%   because it \emph{always} removed any preceding space, then inserted
-%   its own space \emph{after} the |\vref at label|, which the |\unskip|
-%   could then gobble. But we want to get rid of this irritating
-%   always-space-gobbling behaviour here. So we have to redefine
-%   |\@@vpageref| (here renamed |\cref at old@@vpageref|) in order to move
-%   the |\vref at label| to the end of the macro, after the page reference
-%   has been typeset. We also remove the |\unskip| from the start of
-%   |\@@vpageref|.
+% \begin{macro}{\@@@setfullpagerefrange}
+%   Separate out the final typesetting step, as usual.
 %    \begin{macrocode}
-  \def\cref at old@@vpageref#1[#2]#3{%
-    \leavevmode%\unskip  <<<
-    \global\advance\c at vrcnt\@ne%
-    \vref at pagenum\@tempa{\the\c at vrcnt @vr}%
-    \vref at pagenum\@tempb{\the\c at vrcnt @xvr}%
-    %\vref at label{\the\c at vrcnt @xvr}%  <<<
-    \ifx\@tempa\@tempb\else%
-      \vref at err{\noexpand\vref or \noexpand\vpageref at page boundary
-                \@tempb-\@tempa\space (may loop)%
-                }%
-    \fi%
-    \vrefpagenum\thevpagerefnum{#3}%
-    \vref at space%
-    \ifx\@tempa\thevpagerefnum%
-      \def\@tempc{#1}%
-      \ifx\@tempc\@empty%
-         \unskip%
-      \else%
-         #1%
-      \fi%
-    \else%
-      #2%
-      \is at pos@number\thevpagerefnum%
-         {%
-          \is at pos@number\@tempa%
-           {\@tempcnta\@tempa%
-            \advance\@tempcnta\@ne%
-           }%
-           {\@tempcnta\maxdimen}%
-          \ifnum \thevpagerefnum =\@tempcnta%
-           \ifodd\@tempcnta%
-             \if at twoside%
-               \reftextfaceafter%
-             \else%
-               \reftextafter%
-             \fi%
-           \else%
-             \reftextafter%
-           \fi%
-          \else%
-            \advance\@tempcnta-2%
-            \ifnum \thevpagerefnum =\@tempcnta%
-              \ifodd\@tempcnta%
-                \reftextbefore%
-              \else%
-                \if at twoside%
-                  \reftextfacebefore%
-                \else%
-                  \reftextbefore%
-                \fi%
-              \fi%
-            \else%
-              \reftextfaraway{#3}%
-            \fi%
-          \fi%
-         }%
-         {\reftextfaraway{#3}}%
-    \fi%
-    \vref at label{\the\c at vrcnt @xvr}%  <<<
-    \vref at label{\the\c at vrcnt @vr}%
-  }%
+  \let\@@@setfullpagerefrange\reftextpagerange%
 %    \end{macrocode}
 % \end{macro}
 %
@@ -5971,8 +6157,8 @@
 % \begin{macro}{\cref at patchreftexts}
 % \begin{macro}{\cref at restorereftexts}
 %   The |\cref at patchreftexts| command modifies \package{varioref}
-%   |\reftext|\meta{x} commands, for use within |\@setvpageref| and
-%   |\@setvpagerefrange|.
+%   |\reftext|\meta{x} commands, for use within |\@@setvpageref| and
+%   |\@@setvpagerefrange|.
 %    \begin{macrocode}
   \def\cref at patchreftexts#1{%
     \cref at patchreftext{reftextcurrent}{#1}%
@@ -5988,8 +6174,8 @@
 %   |\cref at patchreftext| does the hard work of modifying the
 %   |\reftext|\meta{x} command given in |#1| as appropriate for the
 %   |\@setvpageref| or |\@setvpagerefrange| command that it's called
-%   from. (It can only be called from within one of those commands.) |#2|
-%   is empty if we're typesetting a single page reference, or one of
+%   from. (It can only be called from within one of those commands.)
+%   |#2| is empty if we're typesetting a single page reference, or one of
 %   |@first|, |@second|, |@middle| or |@end| when typesetting a
 %   multi-reference.
 % \begin{macrocode}
@@ -6006,12 +6192,12 @@
       \def\@tempc{}%
       \expandafter\ifx\csname #1\endcsname\@tempc\relax%
         \expandafter\def\csname #1\endcsname{\unskip}%
-          %{\advance\count at group -1\reftextcurrent at orig}%
+          %{\advance\count at group -1\relax\reftextcurrent at orig}%
       \else%
         \long\def\@tempc{}%
         \expandafter\ifx\csname #1\endcsname\@tempc\relax%
           \expandafter\def\csname #1\endcsname{\unskip}%
-            %{\advance\count at group -1\reftextcurrent at orig}%
+            %{\advance\count at group -1\relax\reftextcurrent at orig}%
         \fi%
       \fi%
 %    \end{macrocode}
@@ -6083,11 +6269,10 @@
 % (if loaded).
 %    \begin{macrocode}
   \AtBeginDocument{%
-    \def\@@vpageref#1[#2]#3{\cref@@vpageref{#1}[#2]{#3}}%
+    \let\@@vpageref\cref@@vpageref%
   }%
 %    \end{macrocode}
 %
-% \begin{macro}{\vpageref}
 % \begin{macro}{\vref}
 % \begin{macro}{\vref*}
 % \begin{macro}{\Vref}
@@ -6116,7 +6301,6 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
-% \end{macro}
 % \begin{macrocode}
   \if at cref@hyperrefloaded\relax%  hyperref loaded%
     \DeclareRobustCommand{\vref}{%
@@ -6151,8 +6335,19 @@
     \DeclareRobustCommand{\fullref}{\cref at fullref{cref}}%
     \DeclareRobustCommand{\Fullref}{\cref at fullref{Cref}}%
   \fi%  end of test for hyperref
-}{}%  end of \@ifpackageloaded{varioref}
+}{\let\if at cref@variorefloaded\iffalse}%  end of \@ifpackageloaded{varioref}
 %    \end{macrocode}
+% Add check to AtBeginDocument to throw error if \package{varioref} was
+% loaded after cleveref.
+%    \begin{macrocode}
+\AtBeginDocument{%
+  \if at cref@variorefloaded\relax\else%
+    \@ifpackageloaded{varioref}{%
+      \PackageError{cleveref}{cleveref must be loaded after varioref!}%
+        {Package load order is wrong: load cleveref *after* varioref.}
+    }{}%
+  \fi}
+%    \end{macrocode}
 %
 %
 %
@@ -6180,7 +6375,9 @@
 %   before, we must postpone the redefinition of \cmd{\label} until the
 %   beginning of the document, since other packages do so.
 %    \begin{macrocode}
+\let\if at cref@amsmathloaded\iffalse%
 \@ifpackageloaded{amsmath}{%
+  \let\if at cref@amsmathloaded\iftrue%
   \AtBeginDocument{%
     \let\cref at old@label at in@display\label at in@display%
     \def\label at in@display{%
@@ -6203,7 +6400,7 @@
 %   But this isn't sufficient to gobble all the arguments any more if an
 %   optional argument is supplied to our new \cmd{\label}, so we have to
 %   modify the \package{amsmath} measuring commands so that they let
-%   \cmd{\label} to \cmd{\@gobble at optarg} instead.
+%   \cmd{\label} to \cmd{\cref at gobble@optarg} instead.
 %
 %   Unfortunately, \package{amsmath} wasn't designed with redefinitions
 %   of \cmd{\label} in mind, so there appears to be no safe way of doing
@@ -6225,7 +6422,7 @@
             \let\math at cr@@@\math at cr@@@align at measure%
             \everycr{\noalign{\global\tag at false%
               \global\let\raise at tag\@empty \global\column@\z@}}%
-            \let\label\@gobble at optarg%  <<< cleveref modification
+            \let\label\cref at gobble@optarg%  <<< cleveref modification
             \global\row@\z@%
             \tabskip\z@%
             \halign{\span\align at preamble\crcr%
@@ -6237,7 +6434,7 @@
         }%
         \restorecounters@%
         \ifodd\maxfields@%
-            \global\advance\maxfields@\@ne%
+            \global\advance\maxfields@\@ne\relax%
         \fi%
         \ifnum\xatlevel@=\tw@%
             \ifnum\maxfields@<\thr@@%
@@ -6248,7 +6445,7 @@
           \unvbox\z@ \unpenalty \global\setbox\@ne\lastbox%
         }%
         \global\totwidth@\wd\@ne%
-        \if at fleqn \global\advance\totwidth@\@mathmargin \fi%
+        \if at fleqn \global\advance\totwidth@\@mathmargin\relax\fi%
         \global\let\maxcolumn at widths\@empty%
         \begingroup%
           \let\or\relax%
@@ -6261,7 +6458,7 @@
           \repeat%
         \endgroup%
         \dimen@\displaywidth%
-        \advance\dimen at -\totwidth@%
+        \advance\dimen at -\totwidth@\relax%
         \ifcase\xatlevel@%
             \global\alignsep@\z@%
             \let\minalignsep\z@%
@@ -6272,34 +6469,34 @@
             \else%
                 \@tempcnta\tw@%
                 \global\eqnshift@\dimen@%
-                \global\divide\eqnshift@\@tempcnta%
+                \global\divide\eqnshift@\@tempcnta\relax%
             \fi%
         \or%
             \@tempcntb\maxfields@%
-            \divide\@tempcntb\tw@%
+            \divide\@tempcntb\tw@\relax%
             \@tempcnta\@tempcntb%
-            \advance\@tempcntb\m at ne%
+            \advance\@tempcntb\m at ne\relax%
             \if at fleqn%
                 \global\eqnshift@\@mathmargin%
                 \global\alignsep@\dimen@%
-                \global\divide\alignsep@\@tempcnta%
+                \global\divide\alignsep@\@tempcnta\relax%
             \else%
-                \global\advance\@tempcnta\@ne%
+                \global\advance\@tempcnta\@ne\relax%
                 \global\eqnshift@\dimen@%
-                \global\divide\eqnshift@\@tempcnta%
+                \global\divide\eqnshift@\@tempcnta\relax%
                 \global\alignsep@\eqnshift@%
             \fi%
         \or%
             \@tempcntb\maxfields@%
-            \divide\@tempcntb\tw@%
-            \global\advance\@tempcntb\m at ne%
-            \global\@tempcnta\@tempcntb%
+            \divide\@tempcntb\tw@\relax%
+            \global\advance\@tempcntb\m at ne\relax%
+            \global\@tempcnta\@tempcntb\relax%
             \global\eqnshift@\z@%
             \global\alignsep@\dimen@%
             \if at fleqn%
                 \global\advance\alignsep@\@mathmargin\relax%
             \fi%
-            \global\divide\alignsep@\@tempcntb%
+            \global\divide\alignsep@\@tempcntb\relax%
         \fi%
         \ifdim\alignsep@<\minalignsep\relax%
             \global\alignsep@\minalignsep\relax%
@@ -6306,9 +6503,9 @@
             \ifdim\eqnshift@>\z@%
                 \if at fleqn\else%
                     \global\eqnshift@\displaywidth%
-                    \global\advance\eqnshift at -\totwidth@%
-                    \global\advance\eqnshift at -\@tempcntb\alignsep@%
-                    \global\divide\eqnshift@\tw@%
+                    \global\advance\eqnshift at -\totwidth@\relax%
+                    \global\advance\eqnshift at -\@tempcntb\alignsep@\relax%
+                    \global\divide\eqnshift@\tw@\relax%
                 \fi%
             \fi%
         \fi%
@@ -6317,19 +6514,19 @@
         \fi%
         \calc at shift@align%
         \global\tagshift@\totwidth@%
-        \global\advance\tagshift@\@tempcntb\alignsep@%
+        \global\advance\tagshift@\@tempcntb\alignsep@\relax%
         \if at fleqn%
             \ifnum\xatlevel@=\tw@%
                 \global\advance\tagshift at -\@mathmargin\relax%
             \fi%
         \else%
-            \global\advance\tagshift@\eqnshift@%
+            \global\advance\tagshift@\eqnshift@\relax%
         \fi%
         \iftagsleft@ \else%
-            \global\advance\tagshift at -\displaywidth%
+            \global\advance\tagshift at -\displaywidth\relax%
         \fi%
         \dimen@\minalignsep\relax%
-        \global\advance\totwidth@\@tempcntb\dimen@%
+        \global\advance\totwidth@\@tempcntb\dimen@\relax%
         \ifdim\totwidth@>\displaywidth%
             \global\let\displaywidth@\totwidth@%
         \else%
@@ -6361,7 +6558,7 @@
         }%
         \restorecounters@%
         \if at fleqn%
-            \global\advance\totwidth@\@mathmargin%
+            \global\advance\totwidth@\@mathmargin\relax%
         \fi%
         \iftagsleft@%
             \ifdim\totwidth@>\displaywidth%
@@ -6389,17 +6586,17 @@
 %    \begin{macrocode}
   \def\multline@#1{%
     \Let@%
-    \@display at init{\global\advance\row@\@ne \global\dspbrk at lvl\m at ne}%
+    \@display at init{\global\advance\row@\@ne\relax\global\dspbrk at lvl\m at ne}%
     \chardef\dspbrk at context\z@%
     \restore at math@cr%
     \let\tag\tag at in@align%
     \global\tag at false \global\let\raise at tag\@empty%
     \mmeasure@{#1}%
-    \let\tag\gobble at tag \let\label\@gobble at optarg%  <<< cleveref modification
+    \let\tag\gobble at tag \let\label\cref at gobble@optarg%  <<< cleveref modification
     \tabskip \if at fleqn \@mathmargin \else \z at skip \fi%
     \totwidth@\displaywidth%
     \if at fleqn%
-        \advance\totwidth at -\@mathmargin%
+        \advance\totwidth at -\@mathmargin\relax%
     \fi%
     \halign\bgroup%
         \hbox to\totwidth@{%
@@ -6436,7 +6633,7 @@
                         \multline at indent%
                     \else%
                         \setbox\z@\hbox{\make at display@tag}%
-                        \dimen@\@mathmargin \advance\dimen at -\wd\z@%
+                        \dimen@\@mathmargin \advance\dimen at -\wd\z@\relax%
                         \ifdim\dimen@<\multlinetaggap%
                           \dimen@\multlinetaggap%
                         \fi%
@@ -6492,11 +6689,11 @@
             }%
             \global\tagwidth@\wdz@%
             \dimen@\totwidth@%
-            \advance\dimen@\tagwidth@%
-            \advance\dimen@\multlinetaggap%
+            \advance\dimen@\tagwidth@\relax%
+            \advance\dimen@\multlinetaggap\relax%
             \iftagsleft@\else%
                 \if at fleqn%
-                    \advance\dimen@\@mathmargin%
+                    \advance\dimen@\@mathmargin\relax%
                 \fi%
             \fi%
             \ifdim\dimen@>\displaywidth%
@@ -6545,13 +6742,13 @@
   \let\cref at old@endsubequations\endsubequations%
   \cref at resetby{equation}{\cref at result}%
   \ifx\cref at result\relax\else%
-    \@addtoreset{parentequation}{\cref at result}%
+    \cref at addtoreset{parentequation}{\cref at result}%
   \fi%
   \renewenvironment{subequations}{%
 %    \end{macrocode}
 %    Temporarily declare |equation| counter to be reset by |parentequation|.
 %    \begin{macrocode}
-    \@addtoreset{equation}{parentequation}%
+    \cref at addtoreset{equation}{parentequation}%
 %    \end{macrocode}
 %    Temporarily alias |equation| to |subequation|, or to whatever
 %    |subequation| has been aliased to.
@@ -6609,8 +6806,19 @@
 % \end{macro}
 % \end{macro}
 %
+% Add check to AtBeginDocument to throw error if \package{amsmath} was
+% loaded after cleveref.
+%    \begin{macrocode}
+\AtBeginDocument{%
+  \if at cref@amsmathloaded\else%
+    \@ifpackageloaded{amsmath}{%
+      \PackageError{cleveref}{cleveref must be loaded after amsmath!}%
+        {Package load order is wrong: load cleveref *after* amsmath.}
+    }{}%
+  \fi}
 %
 %
+%
 % \subsubsection{\package{amsthm} support}
 % \begin{macro}{amsthm}
 %   If \package{amsthm} is loaded, we need to modify its theorem
@@ -6717,7 +6925,6 @@
 }{}%  end of \@ifpackageloaded{amsthm}
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
 %
 %
@@ -6762,12 +6969,12 @@
     \refstepcounter[#1]{#2}%  <<< cleveref modification
     \theorem at prework%
     \thm at topsepadd \theorempostskipamount%
-    \ifvmode \advance\thm at topsepadd\partopsep\fi%
+    \ifvmode \advance\thm at topsepadd\partopsep\relax\fi%
     \trivlist%
     \@topsep \theorempreskipamount%
     \@topsepadd \thm at topsepadd%
-    \advance\linewidth -\theorem at indent%
-    \advance\@totalleftmargin \theorem at indent%
+    \advance\linewidth -\theorem at indent\relax%
+    \advance\@totalleftmargin \theorem at indent\relax%
     \parshape \@ne \@totalleftmargin \linewidth%
     \@ifnextchar[{\@ythm{#1}{#2}{#3}}{\@xthm{#1}{#2}{#3}}%]
   }%
@@ -6781,7 +6988,7 @@
 %
 % \subsubsection{\package{IEEEtrantools} support}
 % \begin{macro}{IEEEtrantools}
-%   The |IEEEeqnarray| environment and \cmd{\IEEEeqnarraccr} command call
+%   The |IEEEeqnarray| environment and \cmd{\IEEEeqnarraccr} command calls
 %   \cmd{\stepcounter} instead of \cmd{\refstepcounter} to increment the
 %   equation counters, so they fail to set the cross-reference type for
 %   \package{cleveref}. We patch in calls to \cmd{\refstepcounter} to fix
@@ -6812,18 +7019,36 @@
 % \begin{macro}{\@IEEEeqnarrayXCR}
 %    \begin{macrocode}
   \let\cref at orig@IEEEeqnarrayXCR\@IEEEeqnarrayXCR%
-  \def\@IEEEeqnarrayXCR[#1]{%
-    \if at eqnsw%
-      \if at IEEEissubequation%
-        %\addtocounter{equation}{1}%
-        \refstepcounter{IEEEsubequation}%
-        \addtocounter{IEEEsubequation}{-1}%
-      \else%
-        \refstepcounter{equation}%
-        \addtocounter{equation}{-1}%
+%    \end{macrocode}
+% Newer versions of \package{IEEEtrantools} replace
+% |\if at IEEEissubequation| conditional with a counter |\c at IEEEsubequation|
+% that is $>0$ in subequations.
+%    \begin{macrocode}
+  \@ifundefined{c at IEEEsubequation}{%
+    \def\@IEEEeqnarrayXCR[#1]{%
+      \if at eqnsw%
+        \if at IEEEissubequation%
+          \refstepcounter{IEEEsubequation}%
+          \addtocounter{IEEEsubequation}{-1}%
+        \else%
+          \refstepcounter{equation}%
+          \addtocounter{equation}{-1}%
+        \fi%
       \fi%
-    \fi%
-  \cref at orig@IEEEeqnarrayXCR[#1]}%
+      \cref at orig@IEEEeqnarrayXCR[#1]}%
+  }{
+    \def\@IEEEeqnarrayXCR[#1]{%
+      \if at eqnsw%
+        \ifnum\c at IEEEsubequation>0\relax%
+          \refstepcounter{IEEEsubequation}%
+          \addtocounter{IEEEsubequation}{-1}%
+        \else%
+          \refstepcounter{equation}%
+          \addtocounter{equation}{-1}%
+        \fi%
+      \fi%
+      \cref at orig@IEEEeqnarrayXCR[#1]}%
+  }% end of \@ifundefined{c at IEEEsubequation}
 %    \end{macrocode}
 % \end{macro}
 %
@@ -6847,10 +7072,10 @@
 %   To get the subequation formatting right, we harmlessly add the
 %   |IEEEsubequation| counter to the |equation| counter reset list so
 %   that \package{cleveref} can figure out the subnumbering relationship,
-%   and define |IEEEsubequation| to be an alias of the |equation| format.
+%   and define |IEEEsubequation| to be an alias of the |subequation| format.
 %    \begin{macrocode}
-  \@addtoreset{IEEEsubequation}{equation}%
-  \crefalias{IEEEsubequation}{equation}%
+  \cref at addtoreset{IEEEsubequation}{subequation}%
+  \crefalias{IEEEsubequation}{subequation}%
 %    \end{macrocode}
 % \end{macro}
 %
@@ -6876,7 +7101,7 @@
     \cref at old@eq at setnumber%
     \cref at constructprefix{equation}{\cref at result}%
     \protected at xdef\cref at currentlabel{%
-      [equation][\arabic{equation}][\cref at result]\p at equation\theequation}}%
+      [equation][\arabic{equation}][\cref at result]\p at equation\eq at number}}%
 }{}% end of \@ifpackageloaded{breqn}
 %    \end{macrocode}
 % \end{macro}
@@ -7240,7 +7465,7 @@
     \cref at old@newaliascnt{#1}{#2}%
     \cref at resetby{#2}{\cref at result}%
     \ifx\cref at result\relax\else%
-      \@addtoreset{#1}{\cref at result}%
+      \cref at addtoreset{#1}{\cref at result}%
     \fi}%
   }{}%  end of \@ifpackageloaded{aliascnt}
 %    \end{macrocode}
@@ -7726,7 +7951,7 @@
       \@tempa#1\@nil}%
     \def\@crefrangenostar#1#2#3{%
       \gdef\cref at poorman@text{}%
-      \@setcrefrange{#2}{#3}{#1}{}%
+      \@@setcrefrange{#2}{#3}{#1}{}%
       \def\@tempa##1##2\@nil{%
         \if##1c%
           \cref at writescript{}{%
@@ -7733,12 +7958,12 @@
             \string\crefrange\string{#2\string}\string{#3\string}}%
         \else%
           \cref at writescript{}{%
-            \string\Crefrange\string{#2\string}\string{#3\string}}%
+            \strinsg\Crefrange\string{#2\string}\string{#3\string}}%
         \fi}%
       \@tempa#1\@nil}%
     \def\@crefrangestar#1#2#3{%
       \gdef\cref at poorman@text{}%
-      \@crefstarredtrue\@setcrefrange{#2}{#3}{#1}{}\@crefstarredfalse%
+      \@crefstarredtrue\@@setcrefrange{#2}{#3}{#1}{}\@crefstarredfalse%
       \def\@tempa##1##2\@nil{%
         \if##1c%
           \cref at writescript{}{%
@@ -7748,31 +7973,9 @@
             \string\Crefrange*\string{#2\string}\string{#3\string}}%
         \fi}%
       \@tempa#1\@nil}%
-    \def\@cpagerefnostar#1#2{%
-      \gdef\cref at poorman@text{}%
-      \@cpageref{#1}{#2}{\@setcpageref}{\@setcpagerefrange}%
-      \def\@tempa##1##2\@nil{%
-        \if##1c%
-          \cref at writescript{}{\string\cpageref\string{#2\string}}%
-        \else%
-          \cref at writescript{}{\string\Cpageref\string{#2\string}}%
-        \fi}%
-      \@tempa#1\@nil}%
-    \def\@cpagerefstar#1#2{%
-      \gdef\cref at poorman@text{}%
-      \@crefstarredtrue%
-      \@cpageref{#1}{#2}{\@setcpageref}{\@setcpagerefrange}%
-      \@crefstarredfalse%
-      \def\@tempa##1##2\@nil{%
-        \if##1c%
-          \cref at writescript{}{\string\cpageref*\string{#2\string}}%
-        \else%
-          \cref at writescript{}{\string\Cpageref*\string{#2\string}}%
-        \fi}%
-      \@tempa#1\@nil}%
     \def\@cpagerefrangenostar#1#2#3{%
       \gdef\cref at poorman@text{}%
-      \@setcpagerefrange{#2}{#3}{#1}{}%
+      \@@setcpagerefrange{#2}{#3}{#1}{}%
       \def\@tempa##1##2\@nil{%
         \if##1c%
           \cref at writescript{}{%
@@ -7785,7 +7988,7 @@
     \def\@cpagerefrangestar#1#2#3{%
       \gdef\cref at poorman@text{}%
       \@crefstarredtrue%
-      \@setcpagerefrange{#2}{#3}{#1}{}%
+      \@@setcpagerefrange{#2}{#3}{#1}{}%
       \@crefstarredfalse%
       \def\@tempa##1##2\@nil{%
         \if##1c%
@@ -7808,12 +8011,12 @@
       \cref at writescript{}{\string\labelcref*\string{#1\string}}}%
     \def\@labelcpagerefnostar#1{%
       \gdef\cref at poorman@text{}%
-      \@cpageref{labelcref}{#1}{\@setcpageref}{\@setcpagerefrange}%
+      \@cref{labelcpageref}{#1}%
       \cref at writescript{}{\string\labelcpageref\string{#1\string}}}%
     \def\@labelcpagerefstar#1{%
       \gdef\cref at poorman@text{}%
       \@crefstarredtrue%
-      \@cpageref{labelcref}{#1}{\@setcpageref}{\@setcpagerefrange}%
+      \@cref{labelcpageref}{#1}%
       \@crefstarredfalse%
       \cref at writescript{}{\string\labelcpageref*\string{#1\string}}}%
 %
@@ -7828,30 +8031,30 @@
       \cref at writescript{}{\string\Cref\string{#1\string}}}%
     \DeclareRobustCommand{\crefrange}[2]{%
       \gdef\cref at poorman@text{}%
-      \@setcrefrange{#1}{#2}{cref}{}%
+      \@@setcrefrange{#1}{#2}{cref}{}%
       \cref at writescript{}{%
         \string\crefrange\string{#1\string}\string{#2\string}}}%
     \DeclareRobustCommand{\Crefrange}[2]{%
       \gdef\cref at poorman@text{}%
-      \@setcrefrange{#1}{#2}{Cref}{}%
+      \@@setcrefrange{#1}{#2}{Cref}{}%
       \cref at writescript{}{%
         \string\Crefrange\string{#1\string}\string{#2\string}}}%
     \DeclareRobustCommand{\cpageref}[1]{%
       \gdef\cref at poorman@text{}%
-      \@cpageref{cref}{#1}{\@setcpageref}{\@setcpagerefrange}%
+      \@cref{cpageref}{#1}%
       \cref at writescript{}{\string\cpageref\string{#1\string}}}%
     \DeclareRobustCommand{\Cpageref}[1]{%
       \gdef\cref at poorman@text{}%
-      \@cpageref{Cref}{#1}{\@setcpageref}{\@setcpagerefrange}%
+      \@cref{Cpageref}{#1}%
       \cref at writescript{}{\string\Cpageref\string{#1\string}}}%
     \DeclareRobustCommand{\cpagerefrange}[2]{%
       \gdef\cref at poorman@text{}%
-      \@setcpagerefrange{#1}{#2}{cref}{}%
+      \@@setcpagerefrange{#1}{#2}{cref}{}%
       \cref at writescript{}{%
         \string\cpagerefrange\string{#1\string}\string{#2\string}}}%
     \DeclareRobustCommand{\Cpagerefrange}[2]{%
       \gdef\cref at poorman@text{}%
-      \@setcpagerefrange{#1}{#2}{Cref}{}%
+      \@@setcpagerefrange{#1}{#2}{Cref}{}%
       \cref at writescript{}{%
         \string\Cpagerefrange\string{#1\string}\string{#2\string}}}%
     \DeclareRobustCommand{\labelcref}[1]{%
@@ -7860,7 +8063,7 @@
       \cref at writescript{}{\string\labelcref\string{#1\string}}}%
     \DeclareRobustCommand{\labelcpageref}[1]{%
       \gdef\cref at poorman@text{}%
-      \@cpageref{labelcref}{#1}{\@setcpageref}{\@setcpagerefrange}%
+      \@cref{labelcpageref}{#1}%
       \cref at writescript{}{\string\labelcpageref\string{#1\string}}}%
   \fi%  end of test for hyperref
 %    \end{macrocode}
@@ -7918,8 +8121,8 @@
 % \begin{macro}{\@setcref at pairgroupconjunction}
 % \begin{macro}{\@setcref at middlegroupconjunction}
 % \begin{macro}{\@setcref at lastgroupconjunction}
-%   Redefine \cmd{\@@setcref}, \cmd{\@@setcrefrange},
-%   \cmd{\@@setcpageref} and\linebreak[4] \cmd{\@@setcpagerefrange}, as
+%   Redefine \cmd{\@@@setcref}, \cmd{\@@@setcrefrange},
+%   \cmd{\@@@setcpageref} and\linebreak[4] \cmd{\@@@setcpagerefrange}, as
 %   well as the conjunction macros\linebreak[4]
 %   \cmd{\@setcref at middlegroupconjunction},
 %   \cmd{\@setcref at lastgroupconjunction} and
@@ -7943,21 +8146,21 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
-% \begin{macro}{\@@setcref}
-% \begin{macro}{\@@setcrefrange}
-% \begin{macro}{\@@setcpageref}
-% \begin{macro}{\@@setcpagerefrange}
+% \begin{macro}{\@@@setcref}
+% \begin{macro}{\@@@setcrefrange}
+% \begin{macro}{\@@@setcpageref}
+% \begin{macro}{\@@@setcpagerefrange}
 %   The necessary redefinitions of most of the cross-referencing commands
 %   differ slightly depending on whether \package{hyperref} is loaded or
 %   not.
 %    \begin{macrocode}
-  \let\old@@setcref\@@setcref%
-  \let\old@@setcrefrange\@@setcrefrange%
-  \let\old@@setcpageref\@@setcpageref%
-  \let\old@@setcpagerefrange\@@setcpagerefrange%
+  \let\old@@@setcref\@@@setcref%
+  \let\old@@@setcrefrange\@@@setcrefrange%
+  \let\old@@@setcpageref\@@@setcpageref%
+  \let\old@@@setcpagerefrange\@@@setcpagerefrange%
   \if at cref@hyperrefloaded\relax%  hyperref loaded
-    \def\@@setcref#1#2{%
-      \old@@setcref{#1}{#2}%
+    \def\@@@setcref#1#2{%
+      \old@@@setcref{#1}{#2}%
       \if at crefstarred%
         \expandafter\g at addto@macro\expandafter\cref at poorman@text%
           \expandafter{#1{\ref*{#2}}{}{}}%
@@ -7965,8 +8168,8 @@
         \expandafter\g at addto@macro\expandafter\cref at poorman@text%
           \expandafter{#1{\ref{#2}}{}{}}%
       \fi}%
-    \def\@@setcrefrange#1#2#3{%
-      \old@@setcrefrange{#1}{#2}{#3}%
+    \def\@@@setcrefrange#1#2#3{%
+      \old@@@setcrefrange{#1}{#2}{#3}%
       \if at crefstarred%
         \expandafter\g at addto@macro\expandafter\cref at poorman@text%
           \expandafter{#1{\ref*{#2}}{\ref*{#3}}{}{}{}{}}%
@@ -7974,8 +8177,8 @@
         \expandafter\g at addto@macro\expandafter\cref at poorman@text%
           \expandafter{#1{\ref{#2}}{\ref{#3}}{}{}{}{}}%
       \fi}%
-    \def\@@setcpageref#1#2{%
-      \old@@setcpageref{#1}{#2}%
+    \def\@@@setcpageref#1#2{%
+      \old@@@setcpageref{#1}{#2}%
       \if at crefstarred%
         \expandafter\g at addto@macro\expandafter\cref at poorman@text%
           \expandafter{#1{\pageref*{#2}}{}{}}%
@@ -7983,8 +8186,8 @@
         \expandafter\g at addto@macro\expandafter\cref at poorman@text%
           \expandafter{#1{\pageref{#2}}{}{}}%
       \fi}%
-    \def\@@setcpagerefrange#1#2#3{%
-      \old@@setcpagerefrange{#1}{#2}{#3}%
+    \def\@@@setcpagerefrange#1#2#3{%
+      \old@@@setcpagerefrange{#1}{#2}{#3}%
       \if at crefstarred%
         \expandafter\g at addto@macro\expandafter\cref at poorman@text%
           \expandafter{#1{\pageref*{#2}}{\pageref*{#3}}{}{}{}{}}%
@@ -7994,23 +8197,23 @@
       \fi}%
 %
   \else%  hyperref not loaded
-    \def\@@setcref#1#2{%
-      \old@@setcref{#1}{#2}%
+    \def\@@@setcref#1#2{%
+      \old@@@setcref{#1}{#2}%
       \expandafter\g at addto@macro\expandafter{%
         \expandafter\cref at poorman@text\expandafter}%
         \expandafter{#1{\ref{#2}}{}{}}}%
-    \def\@@setcrefrange#1#2#3{%
-      \old@@setcrefrange{#1}{#2}{#3}%
+    \def\@@@setcrefrange#1#2#3{%
+      \old@@@setcrefrange{#1}{#2}{#3}%
       \expandafter\g at addto@macro%
         \expandafter{\expandafter\cref at poorman@text\expandafter}%
         \expandafter{#1{\ref{#2}}{\ref{#3}}{}{}{}{}}}%
-    \def\@@setcpageref#1#2{%
-      \old@@setcpageref{#1}{#2}%
+    \def\@@@setcpageref#1#2{%
+      \old@@@setcpageref{#1}{#2}%
       \expandafter\g at addto@macro\expandafter{%
         \expandafter\cref at poorman@text\expandafter}%
         \expandafter{#1{\pageref{#2}}{}{}}}%
-    \def\@@setcpagerefrange#1#2#3{%
-      \old@@setcpagerefrange{#1}{#2}{#3}%
+    \def\@@@setcpagerefrange#1#2#3{%
+      \old@@@setcpagerefrange{#1}{#2}{#3}%
       \expandafter\g at addto@macro%
         \expandafter{\expandafter\cref at poorman@text\expandafter}%
         \expandafter{#1{\pageref{#2}}{\pageref{#3}}{}{}{}{}}}%
@@ -8020,14 +8223,14 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
-% \begin{macro}{\@@setnamecref}
+% \begin{macro}{\@@@setnamecref}
 %   The \cmd{\namecref} et al.\ commands don't do anything different when
 %   \package{hyperref} is loaded, so we don't need to test for
-%   \package{hyperref} when redefining \cmd{\@@setnamecref}.
+%   \package{hyperref} when redefining \cmd{\@@@setnamecref}.
 %    \begin{macrocode}
-  \let\old@@setnamecref\@@setnamecref%
-  \def\@@setnamecref#1#2{%
-    \old@@setnamecref{#1}{#2}%
+  \let\old@@@setnamecref\@@@setnamecref%
+  \def\@@@setnamecref#1#2{%
+    \old@@@setnamecref{#1}{#2}%
     \expandafter\def\expandafter\@tempa\expandafter{#1}%
     \def\@tempb{#2}%
     \expandafter\expandafter\expandafter\g at addto@macro%
@@ -8139,25 +8342,25 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\@@setvpageref}
-% \begin{macro}{\@@setvpagerefrange}
+% \begin{macro}{\@@@setvpageref}
+% \begin{macro}{\@@@setvpagerefrange}
 %   In order to get the appropriate substitution for \package{varioref}
 %   commands appended to \cmd{\cref at poorman@text}, we have to redefine
-%   \cmd{\@@setvpageref} and\linebreak[4] \cmd{\@@setvpagerefrange},
+%   \cmd{\@@@setvpageref} and\linebreak[4] \cmd{\@@@setvpagerefrange},
 %   which perform the final typesetting of \package{varioref} page
 %   references, so that they append an appropriate substitution for the
 %   page reference they're typesetting.
 %    \begin{macrocode}
-      \def\@@setvpageref#1[#2]#3{%
+      \def\@@@setvpageref#1[#2]#3{%
         \cref at old@@vpageref{#1}[#2]{#3}%
         \g at addto@macro\cref at poorman@text{\vpageref{#3}}}%
-      \def\@@setvpagerefrange[#1]#2#3{%
+      \def\@@@setvpagerefrange[#1]#2#3{%
         \vpagerefrange[#1]{#2}{#3}%
         \g at addto@macro\cref at poorman@text{\vpagerefrange{#2}{#3}}}%
-      \def\@@setfullpageref#1{%
+      \def\@@@setfullpageref#1{%
         \reftextfaraway{#1}%
         \g at addto@macro\cref at poorman@text{\reftextfaraway{#1}}}%
-      \def\@@setfullpagerefrange#1#2{%
+      \def\@@@setfullpagerefrange#1#2{%
         \reftextpagerange{#1}{#2}%
         \g at addto@macro\cref at poorman@text{\reftextpagerange{#1}{#2}}}%
 %    \end{macrocode}
@@ -12190,7 +12393,7 @@
       \crefname{subfigure}{Figur}{Figur}%
     \fi%
     \crefname{page}{Sida}{Sida}%
-    \crefname{table}{Tablell}{Tabell}%
+    \crefname{table}{Tabell}{Tabell}%
     \crefname{subtable}{Tabell}{Tabell}%
     \crefname{part}{Del}{Del}%
     \crefname{chapter}{Kapitel}{Kapitel}%
@@ -12232,7 +12435,7 @@
       \crefname{subfigure}{figur}{figur}%
       \crefname{page}{sida}{sida}%
     \fi%
-    \crefname{table}{tablell}{tabell}%
+    \crefname{table}{tabell}{tabell}%
     \crefname{subtable}{tabell}{tabell}%
     \crefname{part}{del}{del}%
     \crefname{chapter}{kapitel}{kapitel}%
@@ -12510,6 +12713,232 @@
 %    \end{macrocode}
 %
 %
+% \subsubsection{Catalan}
+% \begin{macro}{catalan}
+%   Catalan definitions thanks to Rafel Jaume Deya and Eva Bosch Roura.
+% \end{macro}
+%
+% Set up the definitions used at the beginning of the document to define
+% the formats created by the document preamble.
+%    \begin{macrocode}
+\DeclareOption{catalan}{%
+  \AtBeginDocument{%
+    \def\crefrangeconjunction at preamble{ a\nobreakspace}%
+    \def\crefrangepreconjunction at preamble{}%
+    \def\crefrangepostconjunction at preamble{}%
+    \def\crefpairconjunction at preamble{ i\nobreakspace}%
+    \def\crefmiddleconjunction at preamble{, }%
+    \def\creflastconjunction at preamble{ i\nobreakspace}%
+%    \end{macrocode}
+% We have to define the group conjunctions explicitly here, rather than
+% relying on fall-back definitions in terms of the above conjunctions
+% (see \cref{sec:code:default_formats}), in case any other language
+% option defines them explicitly and we need to override those.
+%    \begin{macrocode}
+    \def\crefpairgroupconjunction at preamble{ i\nobreakspace}%
+    \def\crefmiddlegroupconjunction at preamble{, }%
+    \def\creflastgroupconjunction at preamble{ i\nobreakspace}%
+ %
+    \Crefname at preamble{equation}{Equaci\'o}{Equacions}%
+    \Crefname at preamble{figure}{Gr\`afic}{Gr\`afics}%
+    \Crefname at preamble{table}{Taula}{Taules}%
+    \Crefname at preamble{page}{P\`agina}{P\`agines}%
+    \Crefname at preamble{part}{Part}{Parts}%
+    \Crefname at preamble{chapter}{Cap\'itol}{Cap\'itols}%
+    \Crefname at preamble{section}{Secci\'o}{Seccions}%
+    \Crefname at preamble{appendix}{Ap\`endix}{Ap\`endixs}%
+    \Crefname at preamble{enumi}{Punt}{Punts}%
+    \Crefname at preamble{footnote}{Nota}{Notes}%
+    \Crefname at preamble{theorem}{Teorema}{Teoremes}%
+    \Crefname at preamble{lemma}{Lema}{Lemes}%
+    \Crefname at preamble{corollary}{Coro\lgem ari}{Coro\lgem aris}%
+    \Crefname at preamble{proposition}{Proposici\'o}{Proposicions}%
+    \Crefname at preamble{definition}{Definici\'o}{Definicions}%
+    \Crefname at preamble{result}{Resultat}{Resultats}%
+    \Crefname at preamble{example}{Exemple}{Exemples}%
+    \Crefname at preamble{remark}{Observaci\'o}{Observacions}%
+    \Crefname at preamble{note}{Nota}{Notes}%
+    \Crefname at preamble{algorithm}{Algorisme}{Algorismes}%
+    \Crefname at preamble{listing}{Llistat}{Llistats}%
+    \Crefname at preamble{line}{L\'inia}{L\'inies}%
+ %
+    \if at cref@capitalise%  capitalise set
+      \crefname at preamble{equation}{Equaci\'o}{Equacions}%
+      \crefname at preamble{figure}{Gr\`afic}{Gr\`afics}%
+      \crefname at preamble{table}{Taula}{Taules}%
+      \crefname at preamble{page}{P\`agina}{P\`agines}%
+      \crefname at preamble{part}{Part}{Parts}%
+      \crefname at preamble{chapter}{Cap\'itol}{Cap\'itols}%
+      \crefname at preamble{section}{Secci\'o}{Seccions}%
+      \crefname at preamble{appendix}{Ap\`endix}{Ap\`endixs}%
+      \crefname at preamble{enumi}{Punt}{Punts}%
+      \crefname at preamble{footnote}{Nota}{Notes}%
+      \crefname at preamble{theorem}{Teorema}{Teoremes}%
+      \crefname at preamble{lemma}{Lema}{Lemes}%
+      \crefname at preamble{corollary}{Coro\lgem ari}{Coro\lgem aris}%
+      \crefname at preamble{proposition}{Proposici\'o}{Proposicions}%
+      \crefname at preamble{definition}{Definici\'o}{Definicions}%
+      \crefname at preamble{result}{Resultat}{Resultats}%
+      \crefname at preamble{example}{Exemple}{Exemples}%
+      \crefname at preamble{remark}{Observaci\'o}{Observacions}%
+      \crefname at preamble{note}{Nota}{Notes}%
+      \crefname at preamble{algorithm}{Algorisme}{Algorismes}%
+      \crefname at preamble{listing}{Llistat}{Llistats}%
+      \crefname at preamble{line}{L\'inia}{L\'inies}%
+ %
+    \else%  capitalise unset
+      \crefname at preamble{equation}{equaci\'o}{equacions}%
+      \crefname at preamble{figure}{gr\`afic}{gr\`afics}%
+      \crefname at preamble{table}{taula}{taules}%
+      \crefname at preamble{page}{p\`agina}{p\`agines}%
+      \crefname at preamble{part}{part}{parts}%
+      \crefname at preamble{chapter}{cap\'itol}{cap\'itols}%
+      \crefname at preamble{section}{secci\'o}{seccions}%
+      \crefname at preamble{appendix}{ap\`endix}{ap\`endixs}%
+      \crefname at preamble{enumi}{punt}{punts}%
+      \crefname at preamble{footnote}{nota}{notes}%
+      \crefname at preamble{theorem}{teorema}{teoremes}%
+      \crefname at preamble{lemma}{lema}{lemes}%
+      \crefname at preamble{corollary}{coro\lgem ari}{coro\lgem aris}%
+      \crefname at preamble{proposition}{proposici\'o}{proposicions}%
+      \crefname at preamble{definition}{definici\'o}{definicions}%
+      \crefname at preamble{result}{resultat}{resultats}%
+      \crefname at preamble{example}{exemple}{exemples}%
+      \crefname at preamble{remark}{observaci\'o}{observacions}%
+      \crefname at preamble{note}{nota}{notes}%
+      \crefname at preamble{algorithm}{algorisme}{algorismes}%
+      \crefname at preamble{listing}{llistat}{llistats}%
+      \crefname at preamble{line}{l\'inia}{l\'inies}%
+    \fi%
+    \def\cref at language{catalan}%
+  }}% end \AtBeginDocument and \DeclareOption
+%    \end{macrocode}
+%
+% If using \package{babel} and the corresponding option is set, or if
+% using \package{polyglossia} and the language has been loaded, add
+% format definition commands to \cmd{\extras}\meta{language} or
+% \cmd{\captions}\meta{language} so that language switching commands will
+% change the cross-reference formats appropriately.
+%    \begin{macrocode}
+\cref at addlanguagedefs{catalan}{%
+  \PackageInfo{cleveref}{loaded `catalan language definitions}%
+  \renewcommand{\crefrangeconjunction}{ a\nobreakspace}%
+  \renewcommand{\crefrangepreconjunction}{}%
+  \renewcommand{\crefrangepostconjunction}{}%
+  \renewcommand{\crefpairconjunction}{ i\nobreakspace}%
+  \renewcommand{\crefmiddleconjunction}{, }%
+  \renewcommand{\creflastconjunction}{ i\nobreakspace}%
+  \renewcommand{\crefpairgroupconjunction}{ i\nobreakspace}%
+  \renewcommand{\crefmiddlegroupconjunction}{, }%
+  \renewcommand{\creflastgroupconjunction}{ i\nobreakspace}%
+ %
+  \Crefname{equation}{Equaci\'o}{Equacions}%
+  \Crefname{figure}{Gr\`afic}{Gr\`afics}%
+  \Crefname{subfigure}{Gr\`afic}{Gr\`afics}%
+  \Crefname{table}{Taula}{Taules}%
+  \Crefname{subtable}{Taula}{Taules}%
+  \Crefname{page}{P\`agina}{P\`aginas}%
+  \Crefname{part}{Part}{Parts}%
+  \Crefname{chapter}{Cap\'itol}{Cap\'itols}%
+  \Crefname{section}{Secci\'o}{Seccions}%
+  \Crefname{subsection}{Secci\'o}{Seccions}%
+  \Crefname{subsubsection}{Secci\'o}{Seccions}%
+  \Crefname{appendix}{Ap\`endix}{Ap\`endixs}%
+  \Crefname{subappendix}{Ap\`endix}{Ap\`endixs}%
+  \Crefname{subsubappendix}{Ap\`endix}{Ap\`endixs}%
+  \Crefname{subsubsubappendix}{Ap\`endix}{Ap\`endixs}%
+  \Crefname{enumi}{Punt}{Punts}%
+  \Crefname{enumii}{Punt}{Punts}%
+  \Crefname{enumiii}{Punt}{Punts}%
+  \Crefname{enumiv}{Punt}{Punts}%
+  \Crefname{enumv}{Punt}{Punts}%
+  \Crefname{footnote}{Nota}{Notes}%
+  \Crefname{theorem}{Teorema}{Teoremes}%
+  \Crefname{lemma}{Lema}{Lemes}%
+  \Crefname{corollary}{Coro\lgem ari}{Coro\lgem aris}%
+  \Crefname{proposition}{Proposici\'o}{Proposicions}%
+  \Crefname{definition}{Definici\'o}{Definicions}%
+  \Crefname{result}{Resultat}{Resultats}%
+  \Crefname{example}{Exemple}{Exemples}%
+  \Crefname{remark}{Observaci\'o}{Observacions}%
+  \Crefname{note}{Nota}{Notes}%
+  \Crefname{algorithm}{Algorisme}{Algorismes}%
+  \Crefname{listing}{Llistat}{Llistats}%
+  \Crefname{line}{L\'inia}{L\'inies}%
+ %
+  \if at cref@capitalise%  capitalise set
+    \crefname{equation}{Equaci\'o}{Equacions}%
+    \crefname{figure}{Gr\`afic}{Gr\`afics}%
+    \crefname{subfigure}{Gr\`afic}{Gr\`afics}%
+    \crefname{table}{Taula}{Taules}%
+    \crefname{subtable}{Taula}{Taules}%
+    \crefname{page}{P\`agina}{P\`aginas}%
+    \crefname{part}{Part}{Parts}%
+    \crefname{chapter}{Cap\'itol}{Cap\'itols}%
+    \crefname{section}{Secci\'o}{Seccions}%
+    \crefname{subsection}{Secci\'o}{Seccions}%
+    \crefname{subsubsection}{Secci\'o}{Seccions}%
+    \crefname{appendix}{Ap\`endix}{Ap\`endixs}%
+    \crefname{subappendix}{Ap\`endix}{Ap\`endixs}%
+    \crefname{subsubappendix}{Ap\`endix}{Ap\`endixs}%
+    \crefname{subsubsubappendix}{Ap\`endix}{Ap\`endixs}%
+    \crefname{enumi}{Punt}{Punts}%
+    \crefname{enumii}{Punt}{Punts}%
+    \crefname{enumiii}{Punt}{Punts}%
+    \crefname{enumiv}{Punt}{Punts}%
+    \crefname{enumv}{Punt}{Punts}%
+    \crefname{footnote}{Nota}{Notes}%
+    \crefname{theorem}{Teorema}{Teoremes}%
+    \crefname{lemma}{Lema}{Lemes}%
+    \crefname{corollary}{Coro\lgem ari}{Coro\lgem aris}%
+    \crefname{proposition}{Proposici\'o}{Proposicions}%
+    \crefname{definition}{Definici\'o}{Definicions}%
+    \crefname{result}{Resultat}{Resultats}%
+    \crefname{example}{Exemple}{Exemples}%
+    \crefname{remark}{Observaci\'o}{Observacions}%
+    \crefname{note}{Nota}{Notes}%
+    \crefname{algorithm}{Algorisme}{Algorismes}%
+    \crefname{listing}{Llistat}{Llistats}%
+    \crefname{line}{L\'inia}{L\'inies}%
+ %
+  \else%  capitalise unset
+    \crefname{equation}{equaci\'o}{equacions}%
+    \crefname{figure}{gr\`afic}{gr\`afics}%
+    \crefname{subfigure}{gr\`afic}{gr\`afics}%
+    \crefname{table}{taula}{taules}%
+    \crefname{subtable}{taula}{taules}%
+    \crefname{page}{p\`agina}{p\`aginas}%
+    \crefname{part}{part}{parts}%
+    \crefname{chapter}{cap\'itol}{cap\'itols}%
+    \crefname{section}{secci\'o}{seccions}%
+    \crefname{subsection}{secci\'o}{seccions}%
+    \crefname{subsubsection}{secci\'o}{seccions}%
+    \crefname{appendix}{ap\`endix}{ap\`endixs}%
+    \crefname{subappendix}{ap\`endix}{ap\`endixs}%
+    \crefname{subsubappendix}{ap\`endix}{ap\`endixs}%
+    \crefname{subsubsubappendix}{ap\`endix}{ap\`endixs}%
+    \crefname{enumi}{punt}{punts}%
+    \crefname{enumii}{punt}{punts}%
+    \crefname{enumiii}{punt}{punts}%
+    \crefname{enumiv}{punt}{punts}%
+    \crefname{enumv}{punt}{punts}%
+    \crefname{footnote}{nota}{notes}%
+    \crefname{theorem}{teorema}{teoremes}%
+    \crefname{lemma}{lema}{lemes}%
+    \crefname{corollary}{coro\lgem ari}{coro\lgem aris}%
+    \crefname{proposition}{proposici\'o}{proposicions}%
+    \crefname{definition}{definici\'o}{definicions}%
+    \crefname{result}{resultat}{resultats}%
+    \crefname{example}{exemple}{exemples}%
+    \crefname{remark}{observaci\'o}{observacions}%
+    \crefname{note}{nota}{notes}%
+    \crefname{algorithm}{algorisme}{algorismes}%
+    \crefname{listing}{llistat}{llistats}%
+    \crefname{line}{l\'inia}{l\'inies}%
+  \fi}% end \cref at loadlanguagedefs
+%    \end{macrocode}
+%
+%
 % \subsection{Default Cross-Reference Formats}
 % \label{sec:code:default_formats}
 % The \option{capitalise} and \option{nameinlink} options must be
@@ -12553,7 +12982,6 @@
 \else%
   \creflabelformat{equation}{\textup{(#2#1#3)}}%
 \fi%
-\@labelcrefdefinedefaultformats%
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -12793,772 +13221,28 @@
 %    \end{macrocode}
 %
 % If formats for subsections are undefined, define them to be identical
-% to the formats for sections.
+% to the formats for sections. Similarly for subsections within
+% appendices, subfigures, subtables, subequations and enums.
 %    \begin{macrocode}
-    \@ifundefined{cref at subsection@name}{%
-      \let\cref at subsection@name\cref at section@name%
-        \let\cref at subsection@name at plural\cref at section@name at plural}{}%
-    \@ifundefined{Cref at subsection@name}{%
-      \let\Cref at subsection@name\Cref at section@name%
-        \let\Cref at subsection@name at plural\Cref at section@name at plural}{}%
-    \@ifundefined{cref at subsection@format}{%
-      \let\cref at subsection@format\cref at section@format}{}%
-    \@ifundefined{Cref at subsection@format}{%
-      \let\Cref at subsection@format\Cref at section@format}{}%
-    \@ifundefined{crefrange at subsection@format}{%
-      \let\crefrange at subsection@format%
-        \crefrange at section@format}{}%
-    \@ifundefined{Crefrange at subsection@format}{%
-      \let\Crefrange at subsection@format%
-        \Crefrange at section@format}{}%
-    \@ifundefined{cref at subsection@format at first}{%
-      \let\cref at subsection@format at first%
-        \cref at section@format at first}{}%
-    \@ifundefined{Cref at subsection@format at first}{%
-      \let\Cref at subsection@format at first%
-        \Cref at section@format at first}{}%
-    \@ifundefined{cref at subsection@format at second}{%
-      \let\cref at subsection@format at second%
-        \cref at section@format at second}{}%
-    \@ifundefined{Cref at subsection@format at second}{%
-      \let\Cref at subsection@format at second%
-        \Cref at section@format at second}{}%
-    \@ifundefined{cref at subsection@format at middle}{%
-      \let\cref at subsection@format at middle%
-        \cref at section@format at middle}{}%
-    \@ifundefined{Cref at subsection@format at middle}{%
-      \let\Cref at subsection@format at middle%
-        \Cref at section@format at middle}{}%
-    \@ifundefined{cref at subsection@format at last}{%
-      \let\cref at subsection@format at last%
-        \cref at section@format at last}{}%
-    \@ifundefined{Cref at subsection@format at last}{%
-      \let\Cref at subsection@format at last%
-        \Cref at section@format at last}{}%
-    \@ifundefined{crefrange at subsection@format at first}{%
-      \let\crefrange at subsection@format at first%
-        \crefrange at section@format at first}{}%
-    \@ifundefined{Crefrange at subsection@format at first}{%
-      \let\Crefrange at subsection@format at first%
-        \Crefrange at section@format at first}{}%
-    \@ifundefined{crefrange at subsection@format at second}{%
-      \let\crefrange at subsection@format at second%
-        \crefrange at section@format at second}{}%
-    \@ifundefined{Crefrange at subsection@format at second}{%
-      \let\Crefrange at subsection@format at second%
-        \Crefrange at section@format at second}{}%
-    \@ifundefined{crefrange at subsection@format at middle}{%
-      \let\crefrange at subsection@format at middle%
-        \crefrange at section@format at middle}{}%
-    \@ifundefined{Crefrange at subsection@format at middle}{%
-      \let\Crefrange at subsection@format at middle%
-        \Crefrange at section@format at middle}{}%
-    \@ifundefined{crefrange at subsection@format at last}{%
-      \let\crefrange at subsection@format at last%
-        \crefrange at section@format at last}{}%
-    \@ifundefined{Crefrange at subsection@format at last}{%
-      \let\Crefrange at subsection@format at last%
-        \Crefrange at section@format at last}{}%
+  \@crefcopyformats{section}{subsection}%
+  \@crefcopyformats{section}{subsubsection}%
+  \@crefcopyformats{appendix}{subappendix}%
+  \@crefcopyformats{appendix}{subsubappendix}%
+  \@crefcopyformats{figure}{subfigure}%
+  \@crefcopyformats{table}{subtable}%
+  \@crefcopyformats{equation}{subequation}%
 %
-    \@ifundefined{cref at subsubsection@name}{%
-      \let\cref at subsubsection@name\cref at section@name%
-        \let\cref at subsubsection@name at plural\cref at section@name at plural}{}%
-    \@ifundefined{Cref at subsection@name}{%
-      \let\Cref at subsection@name\Cref at section@name%
-        \let\Cref at subsection@name at plural\Cref at section@name at plural}{}%
-    \@ifundefined{cref at subsubsection@format}{%
-      \let\cref at subsubsection@format%
-        \cref at subsection@format}{}%
-    \@ifundefined{Cref at subsubsection@format}{%
-      \let\Cref at subsubsection@format%
-        \Cref at subsection@format}{}%
-    \@ifundefined{crefrange at subsubsection@format}{%
-      \let\crefrange at subsubsection@format%
-        \crefrange at subsection@format}{}%
-    \@ifundefined{Crefrange at subsubsection@format}{%
-      \let\Crefrange at subsubsection@format%
-        \Crefrange at subsection@format}{}%
-    \@ifundefined{cref at subsubsection@format at first}{%
-      \let\cref at subsubsection@format at first%
-        \cref at subsection@format at first}{}%
-    \@ifundefined{Cref at subsubsection@format at first}{%
-      \let\Cref at subsubsection@format at first%
-        \Cref at subsection@format at first}{}%
-    \@ifundefined{cref at subsubsection@format at second}{%
-      \let\cref at subsubsection@format at second%
-        \cref at subsection@format at second}{}%
-    \@ifundefined{Cref at subsubsection@format at second}{%
-      \let\Cref at subsubsection@format at second%
-        \Cref at subsection@format at second}{}%
-    \@ifundefined{cref at subsubsection@format at middle}{%
-      \let\cref at subsubsection@format at middle%
-        \cref at subsection@format at middle}{}%
-    \@ifundefined{Cref at subsubsection@format at middle}{%
-      \let\Cref at subsubsection@format at middle%
-        \Cref at subsection@format at middle}{}%
-    \@ifundefined{cref at subsubsection@format at last}{%
-      \let\cref at subsubsection@format at last%
-        \cref at subsection@format at last}{}%
-    \@ifundefined{Cref at subsubsection@format at last}{%
-      \let\Cref at subsubsection@format at last%
-        \Cref at subsection@format at last}{}%
-    \@ifundefined{crefrange at subsubsection@format at first}{%
-      \let\crefrange at subsubsection@format at first%
-        \crefrange at subsection@format at first}{}%
-    \@ifundefined{Crefrange at subsubsection@format at first}{%
-      \let\Crefrange at subsubsection@format at first%
-        \Crefrange at subsection@format at first}{}%
-    \@ifundefined{crefrange at subsubsection@format at second}{%
-      \let\crefrange at subsubsection@format at second%
-        \crefrange at subsection@format at second}{}%
-    \@ifundefined{Crefrange at subsubsection@format at second}{%
-      \let\Crefrange at subsubsection@format at second%
-        \Crefrange at subsection@format at second}{}%
-    \@ifundefined{crefrange at subsubsection@format at middle}{%
-      \let\crefrange at subsubsection@format at middle%
-        \crefrange at subsection@format at middle}{}%
-    \@ifundefined{Crefrange at subsubsection@format at middle}{%
-      \let\Crefrange at subsubsection@format at middle%
-        \Crefrange at subsection@format at middle}{}%
-    \@ifundefined{crefrange at subsubsection@format at last}{%
-      \let\crefrange at subsubsection@format at last%
-        \crefrange at subsection@format at last}{}%
-    \@ifundefined{Crefrange at subsubsection@format at last}{%
-      \let\Crefrange at subsubsection@format at last%
-        \Crefrange at subsection@format at last}{}%
+  \@crefcopyformats{enumi}{enumii}%
+  \@crefcopyformats{enumii}{enumiii}%
+  \@crefcopyformats{enumiii}{enumiv}%
+  \@crefcopyformats{enumiv}{enumv}%
 %    \end{macrocode}
-% Similarly for subsections within appendices.
+% Definition of default |\labelcref| formats also needs to be postponed
+% until beginning of document, in case |\crefdefaultlabelformat| has been
+% modified.
 %    \begin{macrocode}
-    \@ifundefined{cref at subappendix@name}{%
-      \let\cref at subappendix@name\cref at appendix@name%
-      \let\cref at subappendix@name at plural%
-        \cref at appendix@name at plural}{}%
-    \@ifundefined{Cref at subappendix@name}{%
-      \let\Cref at subappendix@name\Cref at section@name%
-      \let\Cref at subappendixsection@name at plural%
-        \Cref at appendix@name at plural}{}%
-    \@ifundefined{cref at subappendix@format}{%
-      \let\cref at subappendix@format\cref at appendix@format}{}%
-    \@ifundefined{Cref at subappendix@format}{%
-      \let\Cref at subappendix@format\Cref at appendix@format}{}%
-    \@ifundefined{crefrange at subappendix@format}{%
-      \let\crefrange at subappendix@format%
-        \crefrange at appendix@format}{}%
-    \@ifundefined{Crefrange at subappendix@format}{%
-      \let\Crefrange at subappendix@format%
-        \Crefrange at appendix@format}{}%
-    \@ifundefined{cref at subappendix@format at first}{%
-      \let\cref at subappendix@format at first%
-        \cref at appendix@format at first}{}%
-    \@ifundefined{Cref at subappendix@format at first}{%
-      \let\Cref at subappendix@format at first%
-        \Cref at appendix@format at first}{}%
-    \@ifundefined{cref at subappendix@format at second}{%
-      \let\cref at subappendix@format at second%
-        \cref at appendix@format at second}{}%
-    \@ifundefined{Cref at subappendix@format at second}{%
-      \let\Cref at subappendix@format at second%
-        \Cref at appendix@format at second}{}%
-    \@ifundefined{cref at subappendix@format at middle}{%
-      \let\cref at subappendix@format at middle%
-        \cref at appendix@format at middle}{}%
-    \@ifundefined{Cref at subappendix@format at middle}{%
-      \let\Cref at subappendix@format at middle%
-        \Cref at appendix@format at middle}{}%
-    \@ifundefined{cref at subappendix@format at last}{%
-      \let\cref at subappendix@format at last%
-        \cref at appendix@format at last}{}%
-    \@ifundefined{Cref at subappendix@format at last}{%
-      \let\Cref at subappendix@format at last%
-        \Cref at appendix@format at last}{}%
-    \@ifundefined{crefrange at subappendix@format at first}{%
-      \let\crefrange at subappendix@format at first%
-        \crefrange at appendix@format at first}{}%
-    \@ifundefined{Crefrange at subappendix@format at first}{%
-      \let\Crefrange at subappendix@format at first%
-        \Crefrange at appendix@format at first}{}%
-    \@ifundefined{crefrange at subappendix@format at second}{%
-      \let\crefrange at subappendix@format at second%
-        \crefrange at appendix@format at second}{}%
-    \@ifundefined{Crefrange at subappendix@format at second}{%
-      \let\Crefrange at subappendix@format at second%
-        \Crefrange at appendix@format at second}{}%
-    \@ifundefined{crefrange at subappendix@format at middle}{%
-      \let\crefrange at subappendix@format at middle%
-        \crefrange at appendix@format at middle}{}%
-    \@ifundefined{Crefrange at subappendix@format at middle}{%
-      \let\Crefrange at subappendix@format at middle%
-        \Crefrange at appendix@format at middle}{}%
-    \@ifundefined{crefrange at subappendix@format at last}{%
-      \let\crefrange at subappendix@format at last%
-        \crefrange at appendix@format at last}{}%
-    \@ifundefined{Crefrange at subappendix@format at last}{%
-      \let\Crefrange at subappendix@format at last%
-        \Crefrange at appendix@format at last}{}%
-%
-    \@ifundefined{cref at subsubappendix@name}{%
-      \let\cref at subsubappendix@name\cref at appendix@name%
-      \let\cref at subsubappendix@name at plural%
-        \cref at appendix@name at plural}{}%
-    \@ifundefined{Cref at subsubappendix@name}{%
-      \let\Cref at subsubappendix@name\Cref at section@name%
-      \let\Cref at subsubappendixsection@name at plural%
-        \Cref at appendix@name at plural}{}%
-    \@ifundefined{cref at subsubappendix@format}{%
-      \let\cref at subsubappendix@format%
-        \cref at subappendix@format}{}%
-    \@ifundefined{Cref at subsubappendix@format}{%
-      \let\Cref at subsubappendix@format%
-        \Cref at subappendix@format}{}%
-    \@ifundefined{crefrange at subsubappendix@format}{%
-      \let\crefrange at subsubappendix@format%
-        \crefrange at subappendix@format}{}%
-    \@ifundefined{Crefrange at subsubappendix@format}{%
-      \let\Crefrange at subsubappendix@format%
-        \Crefrange at subappendix@format}{}%
-    \@ifundefined{cref at subsubappendix@format at first}{%
-      \let\cref at subsubappendix@format at first%
-        \cref at subappendix@format at first}{}%
-    \@ifundefined{Cref at subsubappendix@format at first}{%
-      \let\Cref at subsubappendix@format at first%
-        \Cref at subappendix@format at first}{}%
-    \@ifundefined{cref at subsubappendix@format at second}{%
-      \let\cref at subsubappendix@format at second%
-        \cref at subappendix@format at second}{}%
-    \@ifundefined{Cref at subsubappendix@format at second}{%
-      \let\Cref at subsubappendix@format at second%
-        \Cref at subappendix@format at second}{}%
-    \@ifundefined{cref at subsubappendix@format at middle}{%
-      \let\cref at subsubappendix@format at middle%
-        \cref at subappendix@format at middle}{}%
-    \@ifundefined{Cref at subsubappendix@format at middle}{%
-      \let\Cref at subsubappendix@format at middle%
-        \Cref at subappendix@format at middle}{}%
-    \@ifundefined{cref at subsubappendix@format at last}{%
-      \let\cref at subsubappendix@format at last%
-        \cref at subappendix@format at last}{}%
-    \@ifundefined{Cref at subsubappendix@format at last}{%
-      \let\Cref at subsubappendix@format at last%
-        \Cref at subappendix@format at last}{}%
-    \@ifundefined{crefrange at subsubappendix@format at first}{%
-      \let\crefrange at subsubappendix@format at first%
-        \crefrange at subappendix@format at first}{}%
-    \@ifundefined{Crefrange at subsubappendix@format at first}{%
-      \let\Crefrange at subsubappendix@format at first%
-        \Crefrange at subappendix@format at first}{}%
-    \@ifundefined{crefrange at subsubappendix@format at second}{%
-      \let\crefrange at subsubappendix@format at second%
-        \crefrange at subappendix@format at second}{}%
-    \@ifundefined{Crefrange at subsubappendix@format at second}{%
-      \let\Crefrange at subsubappendix@format at second%
-        \Crefrange at subappendix@format at second}{}%
-    \@ifundefined{crefrange at subsubappendix@format at middle}{%
-      \let\crefrange at subsubappendix@format at middle%
-        \crefrange at subappendix@format at middle}{}%
-    \@ifundefined{Crefrange at subsubappendix@format at middle}{%
-      \let\Crefrange at subsubappendix@format at middle%
-        \Crefrange at subappendix@format at middle}{}%
-    \@ifundefined{crefrange at subsubappendix@format at last}{%
-      \let\crefrange at subsubappendix@format at last%
-        \crefrange at subappendix@format at last}{}%
-    \@ifundefined{Crefrange at subsubappendix@format at last}{%
-      \let\Crefrange at subsubappendix@format at last%
-        \Crefrange at subappendix@format at last}{}%
-%
-    \@ifundefined{cref at subsubsubappendix@format}{%
-      \let\cref at subsubsubappendix@format%
-        \cref at subsubappendix@format}{}%
-    \@ifundefined{Cref at subsubsubappendix@format}{%
-      \let\Cref at subsubsubappendix@format%
-        \Cref at subsubappendix@format}{}%
-    \@ifundefined{crefrange at subsubsubappendix@format}{%
-      \let\crefrange at subsubsubappendix@format%
-        \crefrange at subsubappendix@format}{}%
-    \@ifundefined{Crefrange at subsubsubappendix@format}{%
-      \let\Crefrange at subsubsubappendix@format%
-        \Crefrange at subsubappendix@format}{}%
-    \@ifundefined{cref at subsubsubappendix@format at first}{%
-      \let\cref at subsubsubappendix@format at first%
-        \cref at subsubappendix@format at first}{}%
-    \@ifundefined{Cref at subsubsubappendix@format at first}{%
-      \let\Cref at subsubsubappendix@format at first%
-        \Cref at subsubappendix@format at first}{}%
-    \@ifundefined{cref at subsubsubappendix@format at second}{%
-      \let\cref at subsubsubappendix@format at second%
-        \cref at subsubappendix@format at second}{}%
-    \@ifundefined{Cref at subsubsubappendix@format at second}{%
-      \let\Cref at subsubsubappendix@format at second%
-        \Cref at subsubappendix@format at second}{}%
-    \@ifundefined{cref at subsubsubappendix@format at middle}{%
-      \let\cref at subsubsubappendix@format at middle%
-        \cref at subsubappendix@format at middle}{}%
-    \@ifundefined{Cref at subsubsubappendix@format at middle}{%
-      \let\Cref at subsubsubappendix@format at middle%
-        \Cref at subsubappendix@format at middle}{}%
-    \@ifundefined{cref at subsubsubappendix@format at last}{%
-      \let\cref at subsubsubappendix@format at last%
-        \cref at subsubappendix@format at last}{}%
-    \@ifundefined{Cref at subsubsubappendix@format at last}{%
-      \let\Cref at subsubsubappendix@format at last%
-        \Cref at subsubappendix@format at last}{}%
-    \@ifundefined{crefrange at subsubsubappendix@format at first}{%
-      \let\crefrange at subsubsubappendix@format at first%
-        \crefrange at subsubappendix@format at first}{}%
-    \@ifundefined{Crefrange at subsubsubappendix@format at first}{%
-      \let\Crefrange at subsubsubappendix@format at first%
-        \Crefrange at subsubappendix@format at first}{}%
-    \@ifundefined{crefrange at subsubsubappendix@format at second}{%
-      \let\crefrange at subsubsubappendix@format at second%
-        \crefrange at subsubappendix@format at second}{}%
-    \@ifundefined{Crefrange at subsubsubappendix@format at second}{%
-      \let\Crefrange at subsubsubappendix@format at second%
-        \Crefrange at subsubappendix@format at second}{}%
-    \@ifundefined{crefrange at subsubsubappendix@format at middle}{%
-      \let\crefrange at subsubsubappendix@format at middle%
-        \crefrange at subsubappendix@format at middle}{}%
-    \@ifundefined{Crefrange at subsubsubappendix@format at middle}{%
-      \let\Crefrange at subsubsubappendix@format at middle%
-        \Crefrange at subsubappendix@format at middle}{}%
-    \@ifundefined{crefrange at subsubsubappendix@format at last}{%
-      \let\crefrange at subsubsubappendix@format at last%
-        \crefrange at subsubappendix@format at last}{}%
-    \@ifundefined{Crefrange at subsubsubappendix@format at last}{%
-      \let\Crefrange at subsubsubappendix@format at last%
-        \Crefrange at subsubappendix@format at last}{}%
-%    \end{macrocode}
-% Ditto for subfigures and subtables.
-%    \begin{macrocode}
-    \@ifundefined{cref at subfigure@format}{%
-      \let\cref at subfigure@format%
-        \cref at figure@format}{}%
-    \@ifundefined{Cref at subfigure@format}{%
-      \let\Cref at subfigure@format%
-        \Cref at figure@format}{}%
-    \@ifundefined{crefrange at subfigure@format}{%
-      \let\crefrange at subfigure@format%
-        \crefrange at figure@format}{}%
-    \@ifundefined{Crefrange at subfigure@format}{%
-      \let\Crefrange at subfigure@format%
-        \Crefrange at figure@format}{}%
-    \@ifundefined{cref at subfigure@format at first}{%
-      \let\cref at subfigure@format at first%
-        \cref at figure@format at first}{}%
-    \@ifundefined{Cref at subfigure@format at first}{%
-      \let\Cref at subfigure@format at first%
-        \Cref at figure@format at first}{}%
-    \@ifundefined{cref at subfigure@format at second}{%
-      \let\cref at subfigure@format at second%
-        \cref at figure@format at second}{}%
-    \@ifundefined{Cref at subfigure@format at second}{%
-      \let\Cref at subfigure@format at second%
-        \Cref at figure@format at second}{}%
-    \@ifundefined{cref at subfigure@format at middle}{%
-      \let\cref at subfigure@format at middle%
-        \cref at figure@format at middle}{}%
-    \@ifundefined{Cref at subfigure@format at middle}{%
-      \let\Cref at subfigure@format at middle%
-        \Cref at figure@format at middle}{}%
-    \@ifundefined{cref at subfigure@format at last}{%
-      \let\cref at subfigure@format at last%
-        \cref at figure@format at last}{}%
-    \@ifundefined{Cref at subfigure@format at last}{%
-      \let\Cref at subfigure@format at last%
-        \Cref at figure@format at last}{}%
-    \@ifundefined{crefrange at subfigure@format at first}{%
-      \let\crefrange at subfigure@format at first%
-        \crefrange at figure@format at first}{}%
-    \@ifundefined{Crefrange at subfigure@format at first}{%
-      \let\Crefrange at subfigure@format at first%
-        \Crefrange at figure@format at first}{}%
-    \@ifundefined{crefrange at subfigure@format at second}{%
-      \let\crefrange at subfigure@format at second%
-        \crefrange at figure@format at second}{}%
-    \@ifundefined{Crefrange at subfigure@format at second}{%
-      \let\Crefrange at subfigure@format at second%
-        \Crefrange at figure@format at second}{}%
-    \@ifundefined{crefrange at subfigure@format at middle}{%
-      \let\crefrange at subfigure@format at middle%
-        \crefrange at figure@format at middle}{}%
-    \@ifundefined{Crefrange at subfigure@format at middle}{%
-      \let\Crefrange at subfigure@format at middle%
-        \Crefrange at figure@format at middle}{}%
-    \@ifundefined{crefrange at subfigure@format at last}{%
-      \let\crefrange at subfigure@format at last%
-        \crefrange at figure@format at last}{}%
-    \@ifundefined{Crefrange at subfigure@format at last}{%
-      \let\Crefrange at subfigure@format at last%
-        \Crefrange at figure@format at last}{}%
-%
-    \@ifundefined{cref at subtable@format}{%
-      \let\cref at subtable@format%
-        \cref at table@format}{}%
-    \@ifundefined{Cref at subtable@format}{%
-      \let\Cref at subtable@format%
-        \Cref at table@format}{}%
-    \@ifundefined{crefrange at subtable@format}{%
-      \let\crefrange at subtable@format%
-        \crefrange at table@format}{}%
-    \@ifundefined{Crefrange at subtable@format}{%
-      \let\Crefrange at subtable@format%
-        \Crefrange at table@format}{}%
-    \@ifundefined{cref at subtable@format at first}{%
-      \let\cref at subtable@format at first%
-        \cref at table@format at first}{}%
-    \@ifundefined{Cref at subtable@format at first}{%
-      \let\Cref at subtable@format at first%
-        \Cref at table@format at first}{}%
-    \@ifundefined{cref at subtable@format at second}{%
-      \let\cref at subtable@format at second%
-        \cref at table@format at second}{}%
-    \@ifundefined{Cref at subtable@format at second}{%
-      \let\Cref at subtable@format at second%
-        \Cref at table@format at second}{}%
-    \@ifundefined{cref at subtable@format at middle}{%
-      \let\cref at subtable@format at middle%
-        \cref at table@format at middle}{}%
-    \@ifundefined{Cref at subtable@format at middle}{%
-      \let\Cref at subtable@format at middle%
-        \Cref at table@format at middle}{}%
-    \@ifundefined{cref at subtable@format at last}{%
-      \let\cref at subtable@format at last%
-        \cref at table@format at last}{}%
-    \@ifundefined{Cref at subtable@format at last}{%
-      \let\Cref at subtable@format at last%
-        \Cref at table@format at last}{}%
-    \@ifundefined{crefrange at subtable@format at first}{%
-      \let\crefrange at subtable@format at first%
-        \crefrange at table@format at first}{}%
-    \@ifundefined{Crefrange at subtable@format at first}{%
-      \let\Crefrange at subtable@format at first%
-        \Crefrange at table@format at first}{}%
-    \@ifundefined{crefrange at subtable@format at second}{%
-      \let\crefrange at subtable@format at second%
-        \crefrange at table@format at second}{}%
-    \@ifundefined{Crefrange at subtable@format at second}{%
-      \let\Crefrange at subtable@format at second%
-        \Crefrange at table@format at second}{}%
-    \@ifundefined{crefrange at subtable@format at middle}{%
-      \let\crefrange at subtable@format at middle%
-        \crefrange at table@format at middle}{}%
-    \@ifundefined{Crefrange at subtable@format at middle}{%
-      \let\Crefrange at subtable@format at middle%
-        \Crefrange at table@format at middle}{}%
-    \@ifundefined{crefrange at subtable@format at last}{%
-      \let\crefrange at subtable@format at last%
-        \crefrange at table@format at last}{}%
-    \@ifundefined{Crefrange at subtable@format at last}{%
-      \let\Crefrange at subtable@format at last%
-        \Crefrange at table@format at last}{}%
-%    \end{macrocode}
-% Ditto for subequations.
-%    \begin{macrocode}
-    \@ifundefined{cref at subequation@format}{%
-      \let\cref at subequation@format%
-        \cref at equation@format}{}%
-    \@ifundefined{Cref at subequation@format}{%
-      \let\Cref at subequation@format%
-        \Cref at equation@format}{}%
-    \@ifundefined{crefrange at subequation@format}{%
-      \let\crefrange at subequation@format%
-        \crefrange at equation@format}{}%
-    \@ifundefined{Crefrange at subequation@format}{%
-      \let\Crefrange at subequation@format%
-        \Crefrange at equation@format}{}%
-    \@ifundefined{cref at subequation@format at first}{%
-      \let\cref at subequation@format at first%
-        \cref at equation@format at first}{}%
-    \@ifundefined{Cref at subequation@format at first}{%
-      \let\Cref at subequation@format at first%
-        \Cref at equation@format at first}{}%
-    \@ifundefined{cref at subequation@format at second}{%
-      \let\cref at subequation@format at second%
-        \cref at equation@format at second}{}%
-    \@ifundefined{Cref at subequation@format at second}{%
-      \let\Cref at subequation@format at second%
-        \Cref at equation@format at second}{}%
-    \@ifundefined{cref at subequation@format at middle}{%
-      \let\cref at subequation@format at middle%
-        \cref at equation@format at middle}{}%
-    \@ifundefined{Cref at subequation@format at middle}{%
-      \let\Cref at subequation@format at middle%
-        \Cref at equation@format at middle}{}%
-    \@ifundefined{cref at subequation@format at last}{%
-      \let\cref at subequation@format at last%
-        \cref at equation@format at last}{}%
-    \@ifundefined{Cref at subequation@format at last}{%
-      \let\Cref at subequation@format at last%
-        \Cref at equation@format at last}{}%
-    \@ifundefined{crefrange at subequation@format at first}{%
-      \let\crefrange at subequation@format at first%
-        \crefrange at equation@format at first}{}%
-    \@ifundefined{Crefrange at subequation@format at first}{%
-      \let\Crefrange at subequation@format at first%
-        \Crefrange at equation@format at first}{}%
-    \@ifundefined{crefrange at subequation@format at second}{%
-      \let\crefrange at subequation@format at second%
-        \crefrange at equation@format at second}{}%
-    \@ifundefined{Crefrange at subequation@format at second}{%
-      \let\Crefrange at subequation@format at second%
-        \Crefrange at equation@format at second}{}%
-    \@ifundefined{crefrange at subequation@format at middle}{%
-      \let\crefrange at subequation@format at middle%
-        \crefrange at equation@format at middle}{}%
-    \@ifundefined{Crefrange at subequation@format at middle}{%
-      \let\Crefrange at subequation@format at middle%
-        \Crefrange at equation@format at middle}{}%
-    \@ifundefined{crefrange at subequation@format at last}{%
-      \let\crefrange at subequation@format at last%
-        \crefrange at equation@format at last}{}%
-    \@ifundefined{Crefrange at subequation@format at last}{%
-      \let\Crefrange at subequation@format at last%
-        \Crefrange at equation@format at last}{}%
-%    \end{macrocode}
-% Ditto for enums.
-%    \begin{macrocode}
-    \@ifundefined{cref at enumii@format}{%
-      \let\cref at enumii@format%
-        \cref at enumi@format}{}%
-    \@ifundefined{Cref at enumii@format}{%
-      \let\Cref at enumii@format%
-        \Cref at enumi@format}{}%
-    \@ifundefined{crefrange at enumii@format}{%
-      \let\crefrange at enumii@format%
-        \crefrange at enumi@format}{}%
-    \@ifundefined{Crefrange at enumii@format}{%
-      \let\Crefrange at enumii@format%
-        \Crefrange at enumi@format}{}%
-    \@ifundefined{cref at enumii@format at first}{%
-      \let\cref at enumii@format at first%
-        \cref at enumi@format at first}{}%
-    \@ifundefined{Cref at enumii@format at first}{%
-      \let\Cref at enumii@format at first%
-        \Cref at enumi@format at first}{}%
-    \@ifundefined{cref at enumii@format at second}{%
-      \let\cref at enumii@format at second%
-        \cref at enumi@format at second}{}%
-    \@ifundefined{Cref at enumii@format at second}{%
-      \let\Cref at enumii@format at second%
-        \Cref at enumi@format at second}{}%
-    \@ifundefined{cref at enumii@format at middle}{%
-      \let\cref at enumii@format at middle%
-        \cref at enumi@format at middle}{}%
-    \@ifundefined{Cref at enumii@format at middle}{%
-      \let\Cref at enumii@format at middle%
-        \Cref at enumi@format at middle}{}%
-    \@ifundefined{cref at enumii@format at last}{%
-      \let\cref at enumii@format at last%
-        \cref at enumi@format at last}{}%
-    \@ifundefined{Cref at enumii@format at last}{%
-      \let\Cref at enumii@format at last%
-        \Cref at enumi@format at last}{}%
-    \@ifundefined{crefrange at enumii@format at first}{%
-      \let\crefrange at enumii@format at first%
-        \crefrange at enumi@format at first}{}%
-    \@ifundefined{Crefrange at enumii@format at first}{%
-      \let\Crefrange at enumii@format at first%
-        \Crefrange at enumi@format at first}{}%
-    \@ifundefined{crefrange at enumii@format at second}{%
-      \let\crefrange at enumii@format at second%
-        \crefrange at enumi@format at second}{}%
-    \@ifundefined{Crefrange at enumii@format at second}{%
-      \let\Crefrange at enumii@format at second%
-        \Crefrange at enumi@format at second}{}%
-    \@ifundefined{crefrange at enumii@format at middle}{%
-      \let\crefrange at enumii@format at middle%
-        \crefrange at enumi@format at middle}{}%
-    \@ifundefined{Crefrange at enumii@format at middle}{%
-      \let\Crefrange at enumii@format at middle%
-        \Crefrange at enumi@format at middle}{}%
-    \@ifundefined{crefrange at enumii@format at last}{%
-      \let\crefrange at enumii@format at last%
-        \crefrange at enumi@format at last}{}%
-    \@ifundefined{Crefrange at enumii@format at last}{%
-      \let\Crefrange at enumii@format at last%
-        \Crefrange at enumi@format at last}{}%
-%
-    \@ifundefined{cref at enumiii@format}{%
-      \let\cref at enumiii@format%
-        \cref at enumii@format}{}%
-    \@ifundefined{Cref at enumiii@format}{%
-      \let\Cref at enumiii@format%
-        \Cref at enumii@format}{}%
-    \@ifundefined{crefrange at enumiii@format}{%
-      \let\crefrange at enumiii@format%
-        \crefrange at enumii@format}{}%
-    \@ifundefined{Crefrange at enumiii@format}{%
-      \let\Crefrange at enumiii@format%
-        \Crefrange at enumii@format}{}%
-    \@ifundefined{cref at enumiii@format at first}{%
-      \let\cref at enumiii@format at first%
-        \cref at enumii@format at first}{}%
-    \@ifundefined{Cref at enumiii@format at first}{%
-      \let\Cref at enumiii@format at first%
-        \Cref at enumii@format at first}{}%
-    \@ifundefined{cref at enumiii@format at second}{%
-      \let\cref at enumiii@format at second%
-        \cref at enumii@format at second}{}%
-    \@ifundefined{Cref at enumiii@format at second}{%
-      \let\Cref at enumiii@format at second%
-        \Cref at enumii@format at second}{}%
-    \@ifundefined{cref at enumiii@format at middle}{%
-      \let\cref at enumiii@format at middle%
-        \cref at enumii@format at middle}{}%
-    \@ifundefined{Cref at enumiii@format at middle}{%
-      \let\Cref at enumiii@format at middle%
-        \Cref at enumii@format at middle}{}%
-    \@ifundefined{cref at enumiii@format at last}{%
-      \let\cref at enumiii@format at last%
-        \cref at enumii@format at last}{}%
-    \@ifundefined{Cref at enumiii@format at last}{%
-      \let\Cref at enumiii@format at last%
-        \Cref at enumii@format at last}{}%
-    \@ifundefined{crefrange at enumiii@format at first}{%
-      \let\crefrange at enumiii@format at first%
-        \crefrange at enumii@format at first}{}%
-    \@ifundefined{Crefrange at enumiii@format at first}{%
-      \let\Crefrange at enumiii@format at first%
-        \Crefrange at enumii@format at first}{}%
-    \@ifundefined{crefrange at enumiii@format at second}{%
-      \let\crefrange at enumiii@format at second%
-        \crefrange at enumii@format at second}{}%
-    \@ifundefined{Crefrange at enumiii@format at second}{%
-      \let\Crefrange at enumiii@format at second%
-        \Crefrange at enumii@format at second}{}%
-    \@ifundefined{crefrange at enumiii@format at middle}{%
-      \let\crefrange at enumiii@format at middle%
-        \crefrange at enumii@format at middle}{}%
-    \@ifundefined{Crefrange at enumiii@format at middle}{%
-      \let\Crefrange at enumiii@format at middle%
-        \Crefrange at enumii@format at middle}{}%
-    \@ifundefined{crefrange at enumiii@format at last}{%
-      \let\crefrange at enumiii@format at last%
-        \crefrange at enumii@format at last}{}%
-    \@ifundefined{Crefrange at enumiii@format at last}{%
-      \let\Crefrange at enumiii@format at last%
-        \Crefrange at enumii@format at last}{}%
-%
-    \@ifundefined{cref at enumiv@format}{%
-      \let\cref at enumiv@format%
-        \cref at enumiii@format}{}%
-    \@ifundefined{Cref at enumiv@format}{%
-      \let\Cref at enumiv@format%
-        \Cref at enumiii@format}{}%
-    \@ifundefined{crefrange at enumiv@format}{%
-      \let\crefrange at enumiv@format%
-        \crefrange at enumiii@format}{}%
-    \@ifundefined{Crefrange at enumiv@format}{%
-      \let\Crefrange at enumiv@format%
-        \Crefrange at enumiii@format}{}%
-    \@ifundefined{cref at enumiv@format at first}{%
-      \let\cref at enumiv@format at first%
-        \cref at enumiii@format at first}{}%
-    \@ifundefined{Cref at enumiv@format at first}{%
-      \let\Cref at enumiv@format at first%
-        \Cref at enumiii@format at first}{}%
-    \@ifundefined{cref at enumiv@format at second}{%
-      \let\cref at enumiv@format at second%
-        \cref at enumiii@format at second}{}%
-    \@ifundefined{Cref at enumiv@format at second}{%
-      \let\Cref at enumiv@format at second%
-        \Cref at enumiii@format at second}{}%
-    \@ifundefined{cref at enumiv@format at middle}{%
-      \let\cref at enumiv@format at middle%
-        \cref at enumiii@format at middle}{}%
-    \@ifundefined{Cref at enumiv@format at middle}{%
-      \let\Cref at enumiv@format at middle%
-        \Cref at enumiii@format at middle}{}%
-    \@ifundefined{cref at enumiv@format at last}{%
-      \let\cref at enumiv@format at last%
-        \cref at enumiii@format at last}{}%
-    \@ifundefined{Cref at enumiv@format at last}{%
-      \let\Cref at enumiv@format at last%
-        \Cref at enumiii@format at last}{}%
-    \@ifundefined{crefrange at enumiv@format at first}{%
-      \let\crefrange at enumiv@format at first%
-        \crefrange at enumiii@format at first}{}%
-    \@ifundefined{Crefrange at enumiv@format at first}{%
-      \let\Crefrange at enumiv@format at first%
-        \Crefrange at enumiii@format at first}{}%
-    \@ifundefined{crefrange at enumiv@format at second}{%
-      \let\crefrange at enumiv@format at second%
-        \crefrange at enumiii@format at second}{}%
-    \@ifundefined{Crefrange at enumiv@format at second}{%
-      \let\Crefrange at enumiv@format at second%
-        \Crefrange at enumiii@format at second}{}%
-    \@ifundefined{crefrange at enumiv@format at middle}{%
-      \let\crefrange at enumiv@format at middle%
-        \crefrange at enumiii@format at middle}{}%
-    \@ifundefined{Crefrange at enumiv@format at middle}{%
-      \let\Crefrange at enumiv@format at middle%
-        \Crefrange at enumiii@format at middle}{}%
-    \@ifundefined{crefrange at enumiv@format at last}{%
-      \let\crefrange at enumiv@format at last%
-        \crefrange at enumiii@format at last}{}%
-    \@ifundefined{Crefrange at enumiv@format at last}{%
-      \let\Crefrange at enumiv@format at last%
-        \Crefrange at enumiii@format at last}{}%
-%
-    \@ifundefined{cref at enumv@format}{%
-      \let\cref at enumv@format%
-        \cref at enumiv@format}{}%
-    \@ifundefined{Cref at enumv@format}{%
-      \let\Cref at enumv@format%
-        \Cref at enumiv@format}{}%
-    \@ifundefined{crefrange at enumv@format}{%
-      \let\crefrange at enumv@format%
-        \crefrange at enumiv@format}{}%
-    \@ifundefined{Crefrange at enumv@format}{%
-      \let\Crefrange at enumv@format%
-        \Crefrange at enumiv@format}{}%
-    \@ifundefined{cref at enumv@format at first}{%
-      \let\cref at enumv@format at first%
-        \cref at enumiv@format at first}{}%
-    \@ifundefined{Cref at enumv@format at first}{%
-      \let\Cref at enumv@format at first%
-        \Cref at enumiv@format at first}{}%
-    \@ifundefined{cref at enumv@format at second}{%
-      \let\cref at enumv@format at second%
-        \cref at enumiv@format at second}{}%
-    \@ifundefined{Cref at enumv@format at second}{%
-      \let\Cref at enumv@format at second%
-        \Cref at enumiv@format at second}{}%
-    \@ifundefined{cref at enumv@format at middle}{%
-      \let\cref at enumv@format at middle%
-        \cref at enumiv@format at middle}{}%
-    \@ifundefined{Cref at enumv@format at middle}{%
-      \let\Cref at enumv@format at middle%
-        \Cref at enumiv@format at middle}{}%
-    \@ifundefined{cref at enumv@format at last}{%
-      \let\cref at enumv@format at last%
-        \cref at enumiv@format at last}{}%
-    \@ifundefined{Cref at enumv@format at last}{%
-      \let\Cref at enumv@format at last%
-        \Cref at enumiv@format at last}{}%
-    \@ifundefined{crefrange at enumv@format at first}{%
-      \let\crefrange at enumv@format at first%
-        \crefrange at enumiv@format at first}{}%
-    \@ifundefined{Crefrange at enumv@format at first}{%
-      \let\Crefrange at enumv@format at first%
-        \Crefrange at enumiv@format at first}{}%
-    \@ifundefined{crefrange at enumv@format at second}{%
-      \let\crefrange at enumv@format at second%
-        \crefrange at enumiv@format at second}{}%
-    \@ifundefined{Crefrange at enumv@format at second}{%
-      \let\Crefrange at enumv@format at second%
-        \Crefrange at enumiv@format at second}{}%
-    \@ifundefined{crefrange at enumv@format at middle}{%
-      \let\crefrange at enumv@format at middle%
-        \crefrange at enumiv@format at middle}{}%
-    \@ifundefined{Crefrange at enumv@format at middle}{%
-      \let\Crefrange at enumv@format at middle%
-        \Crefrange at enumiv@format at middle}{}%
-    \@ifundefined{crefrange at enumv@format at last}{%
-      \let\crefrange at enumv@format at last%
-        \crefrange at enumiv@format at last}{}%
-    \@ifundefined{Crefrange at enumv@format at last}{%
-      \let\Crefrange at enumv@format at last%
-        \Crefrange at enumiv@format at last}{}%
-%
+  \@labelcrefdefinedefaultformats%
+  %
   \let\cref at language\relax%
 }%  end of \AtBeginDocument
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/cleveref/cleveref.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/cleveref/cleveref.ins	2018-02-05 12:35:05 UTC (rev 46548)
+++ trunk/Master/texmf-dist/source/latex/cleveref/cleveref.ins	2018-02-05 21:55:39 UTC (rev 46549)
@@ -11,7 +11,7 @@
 
 LaTeX package for intelligent cross-referencing.
 
-Copyright (C) 2006--2013  Toby Cubitt
+Copyright (C) 2006--2016  Toby Cubitt
 See the files README and COPYING.
 
 \endpreamble

Modified: trunk/Master/texmf-dist/tex/latex/cleveref/cleveref.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/cleveref/cleveref.sty	2018-02-05 12:35:05 UTC (rev 46548)
+++ trunk/Master/texmf-dist/tex/latex/cleveref/cleveref.sty	2018-02-05 21:55:39 UTC (rev 46549)
@@ -8,11 +8,11 @@
 %% 
 %% LaTeX package for intelligent cross-referencing.
 %% 
-%% Copyright (C) 2006--2013  Toby Cubitt
+%% Copyright (C) 2006--2016  Toby Cubitt
 %% See the files README and COPYING.
 %% 
-\def\packagedate{2013/12/28}
-\def\packageversion{0.19}
+\def\packagedate{2017/07/10}
+\def\packageversion{0.21}
 %% This file may be distributed and/or modified under the
 %% conditions of the LaTeX Project Public License, either version 1.2
 %% of this license or (at your option) any later version.
@@ -68,19 +68,31 @@
   \def\label{\@ifnextchar[\label at optarg\label at noarg}%]
   \let\cref at label\label%
   \def\label at noarg#1{%
+    \cref at old@label{#1}%
     \@bsphack%
-    \cref at old@label{#1}%
+    \edef\@tempa{{page}{\the\c at page}}%
+    \setcounter{page}{1}%
+    \edef\@tempb{\thepage}%
+    \expandafter\setcounter\@tempa%
+    \cref at constructprefix{page}{\cref at result}%
     \protected at write\@auxout{}%
-      {\string\newlabel{#1 at cref}{{\cref at currentlabel}{\thepage}}}%
+      {\string\newlabel{#1 at cref}{{\cref at currentlabel}%
+      {[\@tempb][\arabic{page}][\cref at result]\thepage}}}%
     \@esphack}%
   \def\label at optarg[#1]#2{%
+    \cref at old@label{#2}%
     \@bsphack%
-    \cref at old@label{#2}%
+    \edef\@tempa{{page}{\the\c at page}}%
+    \setcounter{page}{1}%
+    \edef\@tempb{\thepage}%
+    \expandafter\setcounter\@tempa%
+    \cref at constructprefix{page}{\cref at result}%
     \protected at edef\cref at currentlabel{%
       \expandafter\cref at override@label at type%
         \cref at currentlabel\@nil{#1}}%
     \protected at write\@auxout{}%
-      {\string\newlabel{#2 at cref}{{\cref at currentlabel}{\thepage}}}%
+      {\string\newlabel{#2 at cref}{{\cref at currentlabel}%
+      {[\@tempb][\arabic{page}][\cref at result]\thepage}}}%
     \@esphack}%
 }% end of AtBeginDocument
 \let\cref at old@makefntext\@makefntext%
@@ -160,102 +172,118 @@
   \cref at stack@add{#1}{\cref at label@types}%
   \cref at old@ynthm{#1}{#2}}%
 \@ifundefined{appendix}{}{%
-  \g at addto@macro\appendix{%
+  \let\cref at old@appendix\appendix%
+  \def\appendix{%
     \@ifundefined{chapter}{%
-      \gdef\refstepcounter at noarg#1{%
-        \cref at old@refstepcounter{#1}%
-        \cref at constructprefix{#1}{\cref at result}%
+      \gdef\refstepcounter at noarg##1{%
+        \cref at old@refstepcounter{##1}%
+        \cref at constructprefix{##1}{\cref at result}%
         \ifx\cref at result\@empty%
           \def\cref at result{2147483647}%
         \else%
           \edef\cref at result{2147483647,\cref at result}%
         \fi%
-        \def\@tempa{#1}%
+        \def\@tempa{##1}%
         \def\@tempb{section}%
         \ifx\@tempa\@tempb%
           \protected at edef\cref at currentlabel{%
-            [appendix][\arabic{#1}][\cref at result]%
-            \csname p@#1\endcsname\csname the#1\endcsname}%
+            [appendix][\arabic{##1}][\cref at result]%
+            \csname p@##1\endcsname\csname the##1\endcsname}%
         \else%
-          \def\@tempa{#1}%
+          \def\@tempa{##1}%
           \def\@tempb{subsection}%
           \ifx\@tempa\@tempb%
             \protected at edef\cref at currentlabel{%
-              [subappendix][\arabic{#1}][\cref at result]%
-              \csname p@#1\endcsname\csname the#1\endcsname}%
+              [subappendix][\arabic{##1}][\cref at result]%
+              \csname p@##1\endcsname\csname the##1\endcsname}%
           \else%
-            \def\@tempa{#1}%
+            \def\@tempa{##1}%
             \def\@tempb{subsubsection}%
             \ifx\@tempa\@tempb%
               \protected at edef\cref at currentlabel{%
-                [subsubappendix][\arabic{#1}][\cref at result]%
-                \csname p@#1\endcsname\csname the#1\endcsname}%
+                [subsubappendix][\arabic{##1}][\cref at result]%
+                \csname p@##1\endcsname\csname the##1\endcsname}%
             \else%
-              \@ifundefined{cref@#1 at alias}%
-                {\def\@tempa{#1}}%
-                {\def\@tempa{\csname cref@#1 at alias\endcsname}}%
+              \@ifundefined{cref@##1 at alias}%
+                {\def\@tempa{##1}}%
+                {\def\@tempa{\csname cref@##1 at alias\endcsname}}%
               \protected at edef\cref at currentlabel{%
-                [\@tempa][\arabic{#1}][\cref at result]%
-                \csname p@#1\endcsname\csname the#1\endcsname}%
+                [\@tempa][\arabic{##1}][\cref at result]%
+                \csname p@##1\endcsname\csname the##1\endcsname}%
             \fi%
           \fi%
         \fi}%
+      \cref at old@appendix%
     }{%
-      \def\refstepcounter at noarg#1{%
-        \cref at old@refstepcounter{#1}%
-        \cref at constructprefix{#1}{\cref at result}%
+      \def\refstepcounter at noarg##1{%
+        \cref at old@refstepcounter{##1}%
+        \cref at constructprefix{##1}{\cref at result}%
         \ifx\cref at result\@empty%
           \def\cref at result{2147483647}%
         \else%
           \edef\cref at result{2147483647,\cref at result}%
         \fi%
-        \def\@tempa{#1}%
+        \def\@tempa{##1}%
         \def\@tempb{chapter}%
         \ifx\@tempa\@tempb%
           \protected at edef\cref at currentlabel{%
-            [appendix][\arabic{#1}][\cref at result]%
-            \csname p@#1\endcsname\csname the#1\endcsname}%
+            [appendix][\arabic{##1}][\cref at result]%
+            \csname p@##1\endcsname\csname the##1\endcsname}%
         \else%
-          \def\@tempa{#1}%
+          \def\@tempa{##1}%
           \def\@tempb{section}%
           \ifx\@tempa\@tempb%
             \protected at edef\cref at currentlabel{%
-              [subappendix][\arabic{#1}][\cref at result]%
-              \csname p@#1\endcsname\csname the#1\endcsname}%
+              [subappendix][\arabic{##1}][\cref at result]%
+              \csname p@##1\endcsname\csname the##1\endcsname}%
           \else%
-            \def\@tempa{#1}%
+            \def\@tempa{##1}%
             \def\@tempb{subsection}%
             \ifx\@tempa\@tempb%
               \protected at edef\cref at currentlabel{%
-                [subsubappendix][\arabic{#1}][\cref at result]%
-                \csname p@#1\endcsname\csname the#1\endcsname}%
+                [subsubappendix][\arabic{##1}][\cref at result]%
+                \csname p@##1\endcsname\csname the##1\endcsname}%
             \else%
-              \def\@tempa{#1}%
+              \def\@tempa{##1}%
               \def\@tempb{subsubsection}%
               \ifx\@tempa\@tempb%
                 \protected at edef\cref at currentlabel{%
-                  [subsubsubappendix][\arabic{#1}][\cref at result]%
-                  \csname p@#1\endcsname\csname the#1\endcsname}%
+                  [subsubsubappendix][\arabic{##1}][\cref at result]%
+                  \csname p@##1\endcsname\csname the##1\endcsname}%
               \else%
-                \@ifundefined{cref@#1 at alias}%
-                  {\def\@tempa{#1}}%
-                  {\def\@tempa{\csname cref@#1 at alias\endcsname}}%
+                \@ifundefined{cref@##1 at alias}%
+                  {\def\@tempa{##1}}%
+                  {\def\@tempa{\csname cref@##1 at alias\endcsname}}%
                 \protected at edef\cref at currentlabel{%
-                  [\@tempa][\arabic{#1}][\cref at result]%
-                  \csname p@#1\endcsname\csname the#1\endcsname}%
+                  [\@tempa][\arabic{##1}][\cref at result]%
+                  \csname p@##1\endcsname\csname the##1\endcsname}%
               \fi%
             \fi%
           \fi%
         \fi}%
-    }%
+    \cref at old@appendix}%
   }%
 }% end of \@ifundefined{appendix}
-\def\@gobble at optarg{\@ifnextchar[\@@gobble at optarg\@gobble at orig}%]
-\def\@gobble at orig#1{}%
-\def\@@gobble at optarg[#1]#2{}%
+\def\cref at gobble@optarg{\@ifnextchar[\@cref at gobble@optarg\cref at gobble}%]
+\def\cref at gobble#1{}%
+\def\@cref at gobble@optarg[#1]#2{}%
 \def\cref at append@toks#1#2{\toks0={#2}%
   \edef\act{\noexpand#1={\the#1\the\toks0}}%
   \act}%
+\def\cref at ifstreq#1#2#3#4{%
+  \begingroup%
+    \edef\@tempa{#1}%
+    \edef\@tempb{#2}%
+    \expandafter\def\expandafter\@tempa\expandafter{\csname\@tempa\endcsname}%
+    \expandafter\def\expandafter\@tempb\expandafter{\csname\@tempb\endcsname}%
+    \ifx\@tempa\@tempb%
+      \let\@tempc\@firstoftwo%
+    \else%
+      \let\@tempc\@secondoftwo%
+    \fi%
+    \expandafter%
+  \endgroup%
+  \@tempc{#3}{#4}}%
 \def\cref at getref#1#2{%
   \expandafter\let\expandafter#2\csname r@#1 at cref\endcsname%
   \expandafter\expandafter\expandafter\def%
@@ -262,12 +290,6 @@
     \expandafter\expandafter\expandafter#2%
     \expandafter\expandafter\expandafter{%
       \expandafter\@firstoftwo#2}}%
-\def\cref at getpageref#1#2{%
-  \expandafter\let\expandafter#2\csname r@#1 at cref\endcsname%
-  \expandafter\expandafter\expandafter\def%
-    \expandafter\expandafter\expandafter#2%
-    \expandafter\expandafter\expandafter{%
-      \expandafter\@secondoftwo#2}}%
 \def\cref at getlabel#1#2{%
   \cref at getref{#1}{\@tempa}%
   \expandafter\@cref at getlabel\@tempa\@nil#2}%
@@ -292,6 +314,36 @@
 \def\@cref at getprefix{\@ifnextchar[%]
   \@@cref at getprefix{\@@cref at getprefix[][][]}}%
 \def\@@cref at getprefix[#1][#2][#3]#4\@nil#5{\def#5{#3}}%
+\def\cpageref at getref#1#2{%
+  \expandafter\let\expandafter#2\csname r@#1 at cref\endcsname%
+  \expandafter\expandafter\expandafter\def%
+    \expandafter\expandafter\expandafter#2%
+    \expandafter\expandafter\expandafter{%
+      \expandafter\@secondoftwo#2}}%
+\def\cpageref at getlabel#1#2{%
+  \cpageref at getref{#1}{\@tempa}%
+  \expandafter\@cpageref at getlabel\@tempa\@nil#2}%
+\def\@cpageref at getlabel{\@ifnextchar[%]
+  \@@cpageref at getlabel{\@@cpageref at getlabel[][][]}}%
+\def\@@cpageref at getlabel[#1][#2][#3]#4\@nil#5{\def#5{#4}}%
+\def\cpageref at gettype#1#2{%
+  \cpageref at getref{#1}{\@tempa}%
+  \expandafter\@cpageref at gettype\@tempa\@nil#2}%
+\def\@cpageref at gettype{\@ifnextchar[%]
+  \@@cpageref at gettype{\@@cpageref at gettype[][][]}}%
+\def\@@cpageref at gettype[#1][#2][#3]#4\@nil#5{\def#5{#1}}%
+\def\cpageref at getcounter#1#2{%
+  \cpageref at getref{#1}{\@tempa}%
+  \expandafter\@cpageref at getcounter\@tempa\@nil#2}%
+\def\@cpageref at getcounter{\@ifnextchar[%]
+  \@@cpageref at getcounter{\@@cpageref at getcounter[][][]}}%
+\def\@@cpageref at getcounter[#1][#2][#3]#4\@nil#5{\def#5{#2}}%
+\def\cpageref at getprefix#1#2{%
+  \cpageref at getref{#1}{\@tempa}%
+  \expandafter\@cpageref at getprefix\@tempa\@nil#2}%
+\def\@cpageref at getprefix{\@ifnextchar[%]
+  \@@cpageref at getprefix{\@@cpageref at getprefix[][][]}}%
+\def\@@cpageref at getprefix[#1][#2][#3]#4\@nil#5{\def#5{#3}}%
 \def\cref at override@label at type[#1][#2][#3]#4\@nil#5{[#5][#2][#3]#4}%
 \def\cref at constructprefix#1#2{%
   \cref at stack@init{\@tempstack}%
@@ -373,50 +425,60 @@
   \def\@tempa{\@nil}%
   \ifx#1\@tempa\@cref at stackfullfalse%
   \else\@cref at stackfulltrue\fi}%
+\def\cref at stack@dropempty#1{%
+  \edef\@tempa{\cref at stack@top{#1}}%
+  \@whilesw\ifx\@tempa\@empty\fi{%
+    \cref at stack@pop{#1}%
+    \cref at isstackempty{#1}%
+    \if at cref@stackempty%
+      \let\@tempa\relax%
+    \else%
+      \edef\@tempa{\cref at stack@top{#1}}%
+    \fi}}%
 \def\cref at stack@sort#1#2{%
   \begingroup%
   \cref at stack@init{\@sortstack}%
-  \edef\@element{\cref at stack@top{#1}}%
+  \edef\@element{\cref at stack@top{#2}}%
   \expandafter\cref at stack@push\expandafter{\@element}{\@sortstack}%
-  \cref at stack@pop{#1}%
-  \cref at isstackfull{#1}%
+  \cref at stack@pop{#2}%
+  \cref at isstackfull{#2}%
   \if at cref@stackfull%
-    \edef\@tempa{\cref at stack@top{#1}}%
+    \edef\@tempa{\cref at stack@top{#2}}%
     \@whilesw\ifx\@tempa\@empty\fi{%
       \cref at stack@pull{}{\@sortstack}%
-      \cref at stack@pop{#1}%
-      \cref at isstackempty{#1}%
+      \cref at stack@pop{#2}%
+      \cref at isstackempty{#2}%
       \if at cref@stackempty%
         \let\@tempa\relax%
       \else%
-        \edef\@tempa{\cref at stack@top{#1}}%
+        \edef\@tempa{\cref at stack@top{#2}}%
       \fi}%
   \fi%
-  \cref at isstackfull{#1}%
+  \cref at isstackfull{#2}%
   \@whilesw\if at cref@stackfull\fi{%
-    \edef\@element{\cref at stack@top{#1}}%
-    \cref at stack@pop{#1}%
+    \edef\@element{\cref at stack@top{#2}}%
+    \cref at stack@pop{#2}%
     \def\@empties{}%
-    \cref at isstackfull{#1}%
+    \cref at isstackfull{#2}%
     \if at cref@stackfull%
-      \edef\@tempa{\cref at stack@top{#1}}%
+      \edef\@tempa{\cref at stack@top{#2}}%
       \@whilesw\ifx\@tempa\@empty\fi{%
         \edef\@empties{\@empties,}%
-        \cref at stack@pop{#1}%
-        \cref at isstackempty{#1}%
+        \cref at stack@pop{#2}%
+        \cref at isstackempty{#2}%
         \if at cref@stackempty%
           \let\@tempa\relax%
         \else%
-          \edef\@tempa{\cref at stack@top{#1}}%
+          \edef\@tempa{\cref at stack@top{#2}}%
         \fi}%
     \fi%
     \edef\@tempa{{\expandafter\noexpand\@element}%
       {\expandafter\noexpand\@empties}%
-      {\noexpand\@sortstack}{\noexpand#2}}%
+      {\noexpand\@sortstack}{\noexpand#1}}%
     \expandafter\cref at stack@insert\@tempa%
-    \cref at isstackfull{#1}}%
+    \cref at isstackfull{#2}}%
   \expandafter\endgroup\expandafter%
-  \def\expandafter#1\expandafter{\@sortstack}}%
+  \def\expandafter#2\expandafter{\@sortstack}}%
 \def\cref at stack@insert#1#2#3#4{%
   \let\@cmp#4%
   \@cref at stack@insert{}{#1}{#2}{#3}%
@@ -440,28 +502,85 @@
     \fi%
   \fi%
   \cref at iterate}%
+\newif\if at cref@sametype%
+\def\cref at isrefsametype#1#2{%
+  \begingroup%
+  \expandafter\ifx\csname r@#1 at cref\endcsname\relax%
+    \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
+      \def\@after{\@cref at sametypetrue}%
+    \else%
+      \def\@after{\@cref at sametypefalse}%
+    \fi%
+  \else%
+    \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
+      \def\@after{\@cref at sametypefalse}%
+    \else%
+      \cref at gettype{#1}{\@type}%
+      \expandafter\expandafter\expandafter\def%
+        \expandafter\expandafter\expandafter\@formata%
+        \expandafter\expandafter\expandafter{%
+          \csname cref@\@type @format\endcsname%
+          {\@dummya}{\@dummyb}{\@dummyc}}%
+      \cref at gettype{#2}{\@type}%
+      \expandafter\expandafter\expandafter\def%
+        \expandafter\expandafter\expandafter\@formatb%
+        \expandafter\expandafter\expandafter{%
+          \csname cref@\@type @format\endcsname%
+          {\@dummya}{\@dummyb}{\@dummyc}}%
+      \ifx\@formata\@formatb%
+        \def\@after{\@cref at sametypetrue}%
+      \else%
+        \def\@after{\@cref at sametypefalse}%
+      \fi%
+    \fi%
+  \fi%
+  \expandafter\endgroup\@after}%
+\def\cpageref at isrefsametype#1#2{%
+  \begingroup%
+  \expandafter\ifx\csname r@#1 at cref\endcsname\relax%
+    \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
+      \def\@after{\@cref at sametypetrue}%
+    \else%
+      \def\@after{\@cref at sametypefalse}%
+    \fi%
+  \else%
+    \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
+      \def\@after{\@cref at sametypefalse}%
+    \else%
+      \cpageref at gettype{#1}{\@typea}%
+      \cpageref at gettype{#2}{\@typeb}%
+      \ifx\@typea\@typeb%
+        \def\@after{\@cref at sametypetrue}%
+      \else%
+        \def\@after{\@cref at sametypefalse}%
+      \fi%
+    \fi%
+  \fi%
+  \expandafter\endgroup\@after}%
 \def\cref at counter@first#1#2\@nil{#1}%
 \def\cref at counter@rest#1#2\@nil{#2}%
-\def\cref at countercmp#1#2#3{%
+\def\cref at countercmp{\@cref at countercmp{cref}}%
+\def\cpageref at countercmp{\@cref at countercmp{cpageref}}%
+\def\@cref at countercmp#1#2#3#4{%
   \begingroup%
-  \def\@tempa{#1}%
+  \def\@tempa{#2}%
   \ifx\@tempa\@empty%
     \def\cref at result{1}%
   \else%
-    \def\@tempa{#2}%
+    \def\@tempa{#3}%
     \ifx\@tempa\@empty%
       \def\cref at result{2}%
     \else%
-      \expandafter\ifx\csname r@#1 at cref\endcsname\relax%
+      \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
         \def\cref at result{2}%
       \else%
-        \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
+        \expandafter\ifx\csname r@#3 at cref\endcsname\relax%
           \def\cref at result{1}%
         \else%
-          \cref at getcounter{#1}{\@countera}%
-          \cref at getprefix{#1}{\@prefixa}%
-          \cref at getcounter{#2}{\@counterb}%
-          \cref at getprefix{#2}{\@prefixb}%
+          \csname #1 at getcounter\endcsname{#2}{\@countera}%
+          \csname #1 at getprefix\endcsname{#2}{\@prefixa}%
+          \csname #1 at getcounter\endcsname{#3}{\@counterb}%
+          \csname #1 at getprefix\endcsname{#3}{\@prefixb}%
           \cref at stack@init{\@countstacka}%
           \expandafter\cref at stack@push\expandafter%
             {\@countera}{\@countstacka}%
@@ -476,14 +595,14 @@
             \expandafter\cref at stack@push\expandafter%
               {\@prefixb}{\@countstackb}%
           \fi%
-          \@cref at countercmp%
+          \@@cref at countercmp%
         \fi%
       \fi%
     \fi%
   \fi%
   \expandafter\endgroup\expandafter%
-  \chardef\expandafter#3\expandafter=\cref at result\relax}%
-\def\@cref at countercmp{%
+  \chardef\expandafter#4\expandafter=\cref at result\relax}%
+\def\@@cref at countercmp{%
   \let\@iterate\relax%
   \cref at isstackempty{\@countstacka}%
   \if at cref@stackempty%
@@ -508,45 +627,12 @@
         \ifnum\@tempa>\@tempb\relax%
           \def\cref at result{2}%
         \else%
-          \def\@iterate{\@cref at countercmp}%
+          \def\@iterate{\@@cref at countercmp}%
         \fi%
       \fi%
     \fi%
   \fi%
   \@iterate}%
-\def\cref at pagecmp#1#2#3{%
-  \begingroup%
-  \def\@tempa{#1}%
-  \ifx\@tempa\@empty%
-    \def\cref at result{1}%
-  \else%
-    \def\@tempa{#2}%
-    \ifx\@tempa\@empty%
-      \def\cref at result{2}%
-    \else%
-      \expandafter\ifx\csname r@#1 at cref\endcsname\relax%
-        \def\cref at result{2}%
-      \else%
-        \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
-          \def\cref at result{1}%
-        \else%
-          \cref at getpageref{#1}{\@tempa}%
-          \cref at getpageref{#2}{\@tempb}%
-          \ifnum\@tempa<\@tempb\relax%
-            \def\cref at result{1}\relax%
-          \else%
-            \ifnum\@tempa>\@tempb\relax%
-              \def\cref at result{2}\relax%
-                \else%
-              \def\cref at result{0}\relax%
-            \fi%
-          \fi%
-        \fi%
-      \fi%
-    \fi%
-  \fi%
-  \expandafter\endgroup\expandafter%
-  \chardef\expandafter#3\expandafter=\cref at result\relax}%
 \newif\if at cref@inresetlist%
 \def\cref at isinresetlist#1#2{%
   \begingroup%
@@ -578,26 +664,20 @@
   \@next}%
 \def\cref at resetby#1#2{%
   \let#2\relax%
-  \def\@tempa{#1}%
-  \def\@tempb{subfigure}%
-  \ifx\@tempa\@tempb%
+  \cref at ifstreq{#1}{subfigure}{%
     \cref at isinresetlist{#1}{figure}%
     \if at cref@inresetlist%
       \def#2{figure}%
     \fi%
-  \fi%
-  \def\@tempa{#1}%
-  \def\@tempb{subtable}%
-  \ifx\@tempa\@tempb%
+  }{}%
+  \cref at ifstreq{#1}{subtable}{%
     \cref at isinresetlist{#1}{table}%
     \if at cref@inresetlist%
       \def#2{table}%
     \fi%
-  \fi%
+  }{}%
   \@ifundefined{cl at parentequation}{}{%
-    \def\@tempa{#1}%
-    \def\@tempb{equation}%
-    \ifx\@tempa\@tempb%
+    \cref at ifstreq{#1}{equation}{%
       \cref at isinresetlist{#1}{parentequation}%
       \if at cref@inresetlist%
         \expandafter\ifnum\c at parentequation=0\else%
@@ -604,53 +684,18 @@
           \def#2{parentequation}%
         \fi%
       \fi%
-    \fi}%
-  \def\@tempa{#1}%
-  \def\@tempb{enumii}%
-  \ifx\@tempa\@tempb%
-    \def#2{enum}%
-  \fi%
-  \def\@tempb{enumiii}%
-  \ifx\@tempa\@tempb%
-    \def#2{enum}%
-  \fi%
-  \def\@tempb{enumiv}%
-  \ifx\@tempa\@tempb%
-    \def#2{enum}%
-  \fi%
-  \def\@tempb{enumv}%
-  \ifx\@tempa\@tempb%
-    \def#2{enum}%
-  \fi%
-  \def\@tempb{enum}%
-  \ifx#2\@tempb%
-    \cref at isinresetlist{#1}{enumiv}%
-    \if at cref@inresetlist%
-      \def#2{enumiv}%
-    \else%
-      \cref at isinresetlist{#1}{enumiii}%
-      \if at cref@inresetlist%
+    }{}}%
+  \cref at ifstreq{#1}{enumii}{%
+    \def#2{enumi}%
+  }{%
+    \cref at ifstreq{#1}{enumiii}{%
+      \def#2{enumii}%
+    }{%
+      \cref at ifstreq{#1}{enumiv}{%
         \def#2{enumiii}%
-      \else%
-        \cref at isinresetlist{#1}{enumii}%
-        \if at cref@inresetlist%
-          \def#2{enumii}%
-        \else%
-          \cref at isinresetlist{#1}{enumi}%
-          \if at cref@inresetlist%
-            \def#2{enumi}%
-          \else%
-           \cref at isinresetlist{#1}{part}%
-            \if at cref@inresetlist%
-              \def#2{part}%
-            \else%
-              \let#2\relax%
-            \fi%
-          \fi%
-        \fi%
-      \fi%
-    \fi%
-  \fi%
+      }{}%
+    }%
+  }%
   \ifx#2\relax%
     \cref at isinresetlist{#1}{table}%
     \if at cref@inresetlist%
@@ -685,212 +730,116 @@
     \fi%
   \fi}%
 \newif\if at cref@refconsecutive%
-\def\cref at isrefconsecutive#1#2{%
+\def\cref at isrefconsecutive{\@cref at isrefconsecutive{cref}}%
+\def\cpageref at isrefconsecutive{\@cref at isrefconsecutive{cpageref}}%
+\def\@cref at isrefconsecutive#1#2#3{%
   \begingroup%
-    \countdef\refa at counter=0%
-    \countdef\refb at counter=1%
-    \cref at getcounter{#1}{\cref at result}%
-    \refa at counter=\cref at result%
-    \cref at getcounter{#2}{\cref at result}%
-    \refb at counter=\cref at result%
-    \cref at getprefix{#1}{\refa at prefix}%
-    \cref at getprefix{#2}{\refb at prefix}%
-    \def\@after{\@cref at refconsecutivefalse}%
-    \ifx\refa at prefix\refb at prefix%
-      \ifnum\refa at counter=\refb at counter\relax%
-        \def\@after{\@cref at refconsecutivetrue}%
-      \else%
-        \advance\refa at counter 1\relax%
+  \def\@after{\@cref at refconsecutivefalse}%
+  \expandafter\ifx\csname r@#2 at cref\endcsname\relax\else%
+    \expandafter\ifx\csname r@#3 at cref\endcsname\relax\else%
+      \countdef\refa at counter=0%
+      \countdef\refb at counter=1%
+      \csname #1 at getcounter\endcsname{#2}{\cref at result}%
+      \refa at counter=\cref at result%
+      \csname #1 at getcounter\endcsname{#3}{\cref at result}%
+      \refb at counter=\cref at result%
+      \csname #1 at getprefix\endcsname{#2}{\refa at prefix}%
+      \csname #1 at getprefix\endcsname{#3}{\refb at prefix}%
+      \ifx\refa at prefix\refb at prefix%
         \ifnum\refa at counter=\refb at counter\relax%
           \def\@after{\@cref at refconsecutivetrue}%
+        \else%
+          \advance\refa at counter 1\relax%
+          \ifnum\refa at counter=\refb at counter\relax%
+            \def\@after{\@cref at refconsecutivetrue}%
+          \fi%
         \fi%
       \fi%
     \fi%
-  \expandafter\endgroup\@after}%
-\def\cref at ispagerefconsecutive#1#2{%
-  \begingroup%
-  \countdef\refa at counter=0%
-  \countdef\refb at counter=1%
-  \cref at getpageref{#1}{\cref at result}%
-  \refa at counter=\cref at result%
-  \cref at getpageref{#2}{\cref at result}%
-  \refb at counter=\cref at result%
-  \def\@after{\@cref at refconsecutivefalse}%
-  \ifnum\refa at counter=\refb at counter\relax%
-    \def\@after{\@cref at refconsecutivetrue}%
-  \else%
-    \advance\refa at counter 1\relax%
-    \ifnum\refa at counter=\refb at counter\relax%
-      \def\@after{\@cref at refconsecutivetrue}%
-    \fi%
   \fi%
   \expandafter\endgroup\@after}%
-\def\cref at processgroup#1#2{%
-  \edef\@nextref{\cref at stack@top{#1}}%
-  \expandafter\ifx\csname r@\@nextref @cref\endcsname\relax%
-    \def\@grouptype{\@undefined}%
-    \def\@groupformat{\@undefined}%
-  \else%
-    \expandafter\cref at gettype\expandafter{\@nextref}{\@grouptype}%
-    \expandafter\expandafter\expandafter\def%
-      \expandafter\expandafter\expandafter\@groupformat%
-      \expandafter\expandafter\expandafter{%
-        \csname cref@\@grouptype @format\endcsname%
-        {\@dummya}{\@dummyb}{\@dummyc}}%
-  \fi%
-  \let\@nexttype\@grouptype%
-  \let\@nextformat\@groupformat%
-  \@whilesw\ifx\@nextformat\@groupformat\fi{%
-    \expandafter\cref at stack@pull\expandafter{\@nextref}{#2}%
-    \cref at stack@pop{#1}%
-    \cref at isstackempty{#1}%
+\def\cref at processgroup#1#2#3{%
+  \cref at stack@dropempty{#2}%
+  \edef\@firstref{\cref at stack@top{#2}}%
+  \let\@nextref\@firstref%
+  \cref at isrefsametypetrue%
+  \@whilesw\if at cref@sametype\fi{%
+    \expandafter\cref at stack@pull\expandafter{\@nextref}{#3}%
+    \cref at stack@pop{#2}%
+    \cref at isstackempty{#2}%
     \if at cref@stackempty%
-      \let\@nexttype\relax%
-      \let\@nextformat\relax%
+      \@cref at sametypefalse%
     \else%
-      \edef\@nextref{\cref at stack@top{#1}}%
+      \edef\@nextref{\cref at stack@top{#2}}%
       \ifx\@nextref\@empty%
-        \let\@nexttype\@grouptype%
-        \let\@nextforamt\@groupformat%
+        \@cref at sametypetrue%
       \else%
-        \expandafter\ifx\csname r@\@nextref @cref\endcsname\relax%
-          \def\@nexttype{\@undefined}%
-          \def\@nextformat{\@undefined}%
-        \else%
-          \expandafter\cref at gettype\expandafter%
-            {\@nextref}{\@nexttype}%
-          \def\@tempa{\@undefined}%
-          \ifx\@nexttype\@tempa%
-            \def\@nextformat{\@undefined}%
-          \else%
-            \expandafter\expandafter\expandafter\def%
-              \expandafter\expandafter\expandafter\@nextformat%
-              \expandafter\expandafter\expandafter{%
-                \csname cref@\@nexttype @format\endcsname%
-                {\@dummya}{\@dummyb}{\@dummyc}}%
-          \fi%
-        \fi%
+        \csname #1 at isrefsametype\endcsname{\@firstref}{\@nextref}%
       \fi%
-    \fi}%
-}%
-\def\cref at processgroupall#1#2{%
+    \fi}}%
+\def\cref at processgroupall#1#2#3{%
   \cref at stack@init{\@tempstack}%
-  \edef\@nextref{\cref at stack@top{#1}}%
-  \expandafter\ifx\csname r@\@nextref @cref\endcsname\relax%
-    \def\@grouptype{\@undefined}%
-    \def\@groupformat{\@undefined}%
-  \else%
-    \expandafter\cref at gettype\expandafter{\@nextref}{\@grouptype}%
-    \expandafter\expandafter\expandafter\def%
-      \expandafter\expandafter\expandafter\@groupformat%
-      \expandafter\expandafter\expandafter{%
-        \csname cref@\@grouptype @format\endcsname%
-        {\@dummya}{\@dummyb}{\@dummyc}}%
-  \fi%
-  \let\@lasttype\@grouptype%
-  \let\@lastformat\@groupformat%
-  \cref at isstackfull{#1}%
+  \cref at stack@dropempty{#2}%
+  \edef\@firstref{\cref at stack@top{#2}}%
+  \cref at isstackfull{#2}%
   \@whilesw\if at cref@stackfull\fi{%
-    \edef\@nextref{\cref at stack@top{#1}}%
+    \edef\@nextref{\cref at stack@top{#2}}%
     \ifx\@nextref\@empty%
-      \ifx\@lastformat\@groupformat%
-        \let\@nexttype\@grouptype%
-        \let\@nextformat\@groupformat%
-      \else%
-        \let\@nexttype\relax%
-        \let\@nextformat\relax%
-      \fi%
+      \expandafter\cref at stack@pull\expandafter{\@nextref}{#3}%
     \else%
-      \expandafter\ifx\csname r@\@nextref @cref\endcsname\relax%
-        \def\@nexttype{\@undefined}%
-        \def\@nextformat{\@undefined}%
+      \edef\@tempa{{\@firstref}{\@nextref}}%
+      \csname #1 at isrefsametype\expandafter\endcsname\@tempa%
+      \if at cref@sametype%
+        \expandafter\cref at stack@pull\expandafter{\@nextref}{#3}%
       \else%
-        \expandafter\cref at gettype\expandafter%
-          {\@nextref}{\@nexttype}%
-        \def\@tempa{\@undefined}%
-        \ifx\@nexttype\@tempa%
-          \def\@nextformat{\@undefined}%
-        \else%
-          \expandafter\expandafter\expandafter\def%
-            \expandafter\expandafter\expandafter\@nextformat%
-            \expandafter\expandafter\expandafter{%
-              \csname cref@\@nexttype @format\endcsname%
-              {\@dummya}{\@dummyb}{\@dummyc}}%
-        \fi%
+        \expandafter\cref at stack@pull\expandafter{\@nextref}{\@tempstack}%
       \fi%
     \fi%
-    \ifx\@nextformat\@groupformat%
-      \expandafter\cref at stack@pull\expandafter{\@nextref}{#2}%
-    \else%
-      \expandafter\cref at stack@pull\expandafter{\@nextref}{\@tempstack}%
-    \fi%
-    \cref at stack@pop{#1}%
-    \let\@lasttype\@nexttype%
-    \let\@lastformat\@nextformat%
-    \cref at isstackfull{#1}}%
-  \let#1\@tempstack}%
+    \cref at stack@pop{#2}%
+    \cref at isstackfull{#2}}%
+  \let#2\@tempstack}%
 \def\cref at processconsecutive#1#2#3#4#5{%
-  #4=0%
-  \edef\@nextref{\cref at stack@top{#1}}%
-  \cref at stack@pop{#1}%
-  \cref at isstackempty{#1}%
-  \if at cref@stackempty%
-    \edef#2{\@nextref}%
-    \let#3\relax%
-    #4=1\relax%
-  \else%
-    \edef#2{\@nextref}%
-    \let#3\relax%
-    \edef\@nextref{\cref at stack@top{#1}}%
-    #4=1\relax%
-    \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
+  \let#4\relax%
+  #5=1\relax%
+  \edef\@nextref{\cref at stack@top{#2}}%
+  \edef#3{\@nextref}%
+  \cref at stack@pop{#2}%
+  \cref at isstackfull{#2}%
+  \if at cref@stackfull%
+    \edef\@nextref{\cref at stack@top{#2}}%
+    \expandafter\ifx\csname r@#3 at cref\endcsname\relax%
       \@cref at refconsecutivefalse%
     \else%
       \ifx\@nextref\@empty%
         \@cref at refconsecutivefalse%
-        \@whilesw\ifx\@nextref\@empty\fi{%
-          \cref at stack@pop{#1}%
-          \cref at isstackempty{#1}%
-          \if at cref@stackempty%
-            \let\@nextref\relax%
-          \else%
-            \edef\@nextref{\cref at stack@top{#1}}%
-          \fi}%
+        \cref at stack@dropempty{#2}%
       \else%
-        \expandafter\ifx\csname r@\@nextref @cref\endcsname\relax%
-          \@cref at refconsecutivefalse%
-        \else%
-          \edef\@tempa{{#2}{\@nextref}}%
-          \expandafter#5\@tempa%
-        \fi%
+        \edef\@tempa{{#3}{\@nextref}}%
+        \csname #1 at isrefconsecutive\expandafter\endcsname\@tempa%
       \fi%
     \fi%
     \@whilesw\if at cref@refconsecutive\fi{%
-      \advance#4 1%
-      \let#3\@nextref%
-      \cref at stack@pop{#1}%
-      \cref at isstackempty{#1}%
+      \advance#5 1\relax%
+      \let#4\@nextref%
+      \cref at stack@pop{#2}%
+      \cref at isstackempty{#2}%
       \if at cref@stackempty%
         \@cref at refconsecutivefalse%
       \else%
-        \edef\@nextref{\cref at stack@top{#1}}%
+        \edef\@nextref{\cref at stack@top{#2}}%
         \ifx\@nextref\@empty%
           \@cref at refconsecutivefalse%
           \@whilesw\ifx\@nextref\@empty\fi{%
-            \cref at stack@pop{#1}%
-            \cref at isstackempty{#1}%
+            \cref at stack@pop{#2}%
+            \cref at isstackempty{#2}%
             \if at cref@stackempty%
               \let\@nextref\relax%
             \else%
-              \edef\@nextref{\cref at stack@top{#1}}%
+              \edef\@nextref{\cref at stack@top{#2}}%
             \fi}%
         \else%
-          \expandafter\ifx\csname r@\@nextref @cref\endcsname\relax%
-            \@cref at refconsecutivefalse%
-          \else%
-            \edef\@tempa{{#3}{\@nextref}}%
-            \expandafter#5\@tempa%
-          \fi%
+          \edef\@tempa{{#4}{\@nextref}}%
+          \csname #1 at isrefconsecutive\expandafter\endcsname\@tempa%
         \fi%
       \fi}%
   \fi}%
@@ -901,7 +850,7 @@
     \let\cref at acc\@empty%
     \@crefstripprefix%
     \cref at result%
-  \endgroup}
+  \endgroup}%
 \def\@crefstripprefix{%
   \let\@iterate\relax%
   \def\accum at flag{0}%
@@ -939,7 +888,7 @@
     \fi%
     \edef\cref at result{\cref at acc\@tempb\@toksb}%
   \fi%
-  \@iterate}
+  \@iterate}%
 \def\cref at poptok#1#2{%
   \expandafter\expandafter\expandafter\def%
     \expandafter\expandafter\expandafter#2%
@@ -948,13 +897,13 @@
   \expandafter\expandafter\expandafter\def%
     \expandafter\expandafter\expandafter#1%
     \expandafter\expandafter\expandafter{%
-      \expandafter\@cref at poptok#1\@nil}}
-\def\@cref at firsttok#1#2\@nil{#1}
-\def\@cref at poptok#1#2\@nil{#2}
+      \expandafter\@cref at poptok#1\@nil}}%
+\def\@cref at firsttok#1#2\@nil{#1}%
+\def\@cref at poptok#1#2\@nil{#2}%
 \DeclareRobustCommand{\cref}[1]{\@cref{cref}{#1}}%
 \DeclareRobustCommand{\Cref}[1]{\@cref{Cref}{#1}}%
-\DeclareRobustCommand{\crefrange}[2]{\@setcrefrange{#1}{#2}{cref}{}}%
-\DeclareRobustCommand{\Crefrange}[2]{\@setcrefrange{#1}{#2}{Cref}{}}%
+\DeclareRobustCommand{\crefrange}[2]{\@setcrefrange{#1}{#2}{}}%
+\DeclareRobustCommand{\Crefrange}[2]{\@setCrefrange{#1}{#2}{}}%
 \@ifpackageloaded{hyperref}{\newif\if at crefstarred}{%
   \@ifpackageloaded{varioref}{\newif\if at crefstarred}{}}%
 \let\if at crefstarred\iffalse%
@@ -961,11 +910,18 @@
 \def\@cref#1#2{%
   \leavevmode%
   \begingroup%
+  \def\cref at variant{#1}%
+  \def\@tempa{\in@{page}}%
+  \expandafter\@tempa\expandafter{\cref at variant}%
+  \ifin@%
+    \def\cref at variant@get{cpageref}%
+  \else%
+    \def\cref at variant@get{cref}%
+  \fi%
   \countdef\count at consecutive=0%
   \countdef\count at group=1%
   \count at group=1%
-  \def\cref at variant{#1}%
-  \newif\if at secondref%
+  \countdef\count at subgroup=2%
   \cref at stack@init{\@refstack}%
   \edef\@tempa{#2}%
   \expandafter\cref at stack@push\expandafter{\@tempa}{\@refstack}%
@@ -973,13 +929,16 @@
   \@whilesw\if at cref@stackfull\fi{%
     \cref at stack@init{\@refsubstack}%
     \if at cref@sort%
-      \cref at processgroupall{\@refstack}{\@refsubstack}%
-      \cref at stack@sort{\@refsubstack}{\cref at countercmp}%
+      \expandafter\cref at processgroupall\expandafter%
+        {\cref at variant@get}{\@refstack}{\@refsubstack}%
+      \expandafter\cref at stack@sort\expandafter%
+        {\csname\cref at variant@get @countercmp\endcsname}{\@refsubstack}%
     \else%
-      \cref at processgroup{\@refstack}{\@refsubstack}%
+      \expandafter\cref at processgroup\expandafter%
+        {\cref at variant@get}{\@refstack}{\@refsubstack}%
     \fi%
     \ifnum\count at group=1\relax%
-      \advance\count at group 1%
+      \advance\count at group 1\relax%
     \else%
       \cref at isstackfull{\@refstack}%
       \if at cref@stackfull%
@@ -991,103 +950,67 @@
           \@setcref at lastgroupconjunction%
         \fi%
       \fi%
-      \advance\count at group 1%
-      \def\cref at variant{cref}%
+      \advance\count at group 1\relax%
+      \lowercase{\def\cref at variant{#1}}%
     \fi%
-    \if at cref@compress%
-      \cref at processconsecutive%
-        {\@refsubstack}{\@beginref}{\@endref}{\count at consecutive}%
-        {\cref at isrefconsecutive}%
-    \else%
-      \edef\@beginref{\cref at stack@top{\@refsubstack}}%
-      \cref at stack@pop{\@refsubstack}%
-      \@whilesw\ifx\@beginref\@empty\fi{%
-        \cref at stack@pop{\@refsubstack}%
-        \cref at isstackempty{\@refsubstack}%
-        \if at cref@stackempty%
-          \let\@beginref\relax%
-        \else%
-          \edef\@beginref{\cref at stack@top{\@refsubstack}}%
-        \fi}%
-      \let\@endref\relax%
-      \count at consecutive=1\relax%
-    \fi%
-    \ifnum\count at consecutive=1\relax%
-      \cref at isstackfull{\@refsubstack}%
-      \if at cref@stackfull%
-        \expandafter\@setcref%
-          \expandafter{\@beginref}{\cref at variant}{@first}%
-      \else%
-        \expandafter\@setcref%
-          \expandafter{\@beginref}{\cref at variant}{}%
-      \fi%
-    \else%
-      \ifnum\count at consecutive=2\relax%
-        \expandafter\@setcref%
-          \expandafter{\@beginref}{\cref at variant}{@first}%
-        \expandafter\cref at stack@push\expandafter%
-          {\@endref,}{\@refsubstack}%
-      \else%
-        \edef\@tempa{{\@beginref}{\@endref}}%
-        \if at cref@stackempty%
-          \expandafter\@setcrefrange\@tempa{\cref at variant}{}%
-        \else%
-          \expandafter\@setcrefrange\@tempa{\cref at variant}{@first}%
-        \fi%
-      \fi%
-    \fi%
-    \@secondreftrue%
+    \count at subgroup=1%
     \cref at isstackfull{\@refsubstack}%
     \@whilesw\if at cref@stackfull\fi{%
       \if at cref@compress%
-        \cref at processconsecutive%
+        \expandafter\cref at processconsecutive\expandafter{\cref at variant@get}%
           {\@refsubstack}{\@beginref}{\@endref}{\count at consecutive}%
-          {\cref at isrefconsecutive}%
       \else%
+        \cref at stack@dropempty{\@refsubstack}%
         \edef\@beginref{\cref at stack@top{\@refsubstack}}%
         \cref at stack@pop{\@refsubstack}%
-        \@whilesw\ifx\@beginref\@empty\fi{%
-          \cref at stack@pop{\@refsubstack}%
-          \cref at isstackempty{\@refsubstack}%
-          \if at cref@stackempty%
-            \let\@beginref\relax%
-          \else%
-            \edef\@beginref{\cref at stack@top{\@refsubstack}}%
-          \fi}%
         \let\@endref\relax%
         \count at consecutive=1\relax%
       \fi%
-      \cref at isstackempty{\@refsubstack}%
-      \if at cref@stackempty%
-        \if at secondref%
-          \def\@pos{@second}%
+      \ifnum\count at consecutive>1\relax%
+        \csname\cref at variant@get @getlabel\endcsname{\@beginref}{\@labela}%
+        \csname\cref at variant@get @getlabel\endcsname{\@endref}{\@labelb}%
+        \ifx\@labela\@labelb%
+          \let\@endref\relax%
+          \count at consecutive=1\relax%
+        \fi%
+      \fi%
+      \ifnum\count at consecutive=2\relax%
+        \expandafter\cref at stack@push\expandafter{\@endref,}{\@refsubstack}%
+        \let\@endref\relax%
+        \count at consecutive=1\relax%
+      \fi%
+      \cref at isstackfull{\@refsubstack}%
+      \if at cref@stackfull%
+        \ifnum\count at subgroup=1\relax%
+          \def\@pos{@first}%
         \else%
-          \def\@pos{@last}%
+          \def\@pos{@middle}%
         \fi%
       \else%
-        \def\@pos{@middle}%
+        \ifnum\count at subgroup=1\relax%
+          \def\@pos{}%
+        \else%
+          \ifnum\count at subgroup=2\relax%
+            \def\@pos{@second}%
+          \else%
+            \def\@pos{@last}%
+          \fi%
+        \fi%
       \fi%
       \ifnum\count at consecutive=1\relax%
-        \edef\@tempa{{\@beginref}{cref}{\@pos}}%
-        \expandafter\@setcref\@tempa%
+        \edef\@tempa{{\@beginref}{\@pos}}%
+        \csname @set\cref at variant\expandafter\endcsname\@tempa%
       \else%
-        \ifnum\count at consecutive=2\relax%
-          \expandafter\@setcref\expandafter%
-            {\@beginref}{cref}{@middle}%
-          \expandafter\cref at stack@push\expandafter%
-            {\@endref}{\@refsubstack}%
-        \else%
-          \edef\@tempa{{\@beginref}{\@endref}{cref}{\@pos}}%
-          \expandafter\@setcrefrange\@tempa%
-        \fi%
+        \edef\@tempa{{\@beginref}{\@endref}{\@pos}}%
+        \csname @set\cref at variant range\expandafter\endcsname\@tempa%
       \fi%
-      \@secondreffalse%
+      \advance\count at subgroup 1\relax%
       \cref at isstackfull{\@refsubstack}%
     }% end loop over reference substack
     \cref at isstackfull{\@refstack}%
     \if at cref@stackfull%
-      \def\@tempa{#1}\def\@tempb{labelcref}%
-      \ifx\@tempa\@tempb\relax%
+      \def\@tempa{labelcref}%
+      \ifx\cref at variant\@tempa%
         \protect\G at refundefinedtrue%
         \nfss at text{\reset at font\bfseries\space ??}%
         \@latex at warning{References in label reference on page \thepage
@@ -1097,80 +1020,94 @@
     \fi%
   }% end loop over main reference stack
   \endgroup}%
-\def\@setcref#1#2#3{%
-  \expandafter\ifx\csname r@#1 at cref\endcsname\relax%
+\def\@setcref{\@@setcref{cref}}%
+\def\@setCref{\@@setcref{Cref}}%
+\def\@setlabelcref{\@@setcref{labelcref}}%
+\def\@@setcref#1#2#3{%
+  \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
     \protect\G at refundefinedtrue%
     \nfss at text{\reset at font\bfseries ??}%
-    \@latex at warning{Reference `#1' on page \thepage \space undefined}%
+    \@latex at warning{Reference `#2' on page \thepage \space undefined}%
   \else%
-    \cref at gettype{#1}{\@temptype}%  puts label type in \@temptype
-    \cref at getlabel{#1}{\@templabel}%  puts label in \@templabel
-    \expandafter\ifx\csname #2@\@temptype @format#3\endcsname\relax%
-      \edef\@tempa{#2}\def\@tempb{labelcref}%
+    \cref at gettype{#2}{\@temptype}%  puts label type in \@temptype
+    \cref at getlabel{#2}{\@templabel}%  puts label in \@templabel
+    \expandafter\ifx\csname #1@\@temptype @format#3\endcsname\relax%
+      \edef\@tempa{#1}\def\@tempb{labelcref}%
       \ifx\@tempa\@tempb\relax%
-        \expandafter\@@setcref\expandafter%
-          {\csname #2 at default@format#3\endcsname}{#1}%
+        \expandafter\@@@setcref\expandafter%
+          {\csname #1 at default@format#3\endcsname}{#2}%
       \else%
         \protect\G at refundefinedtrue%
         \nfss at text{\reset at font\bfseries ??}~\@templabel%
-        \@latex at warning{#2 \space reference format for label type
+        \@latex at warning{#1\space reference format for label type
           `\@temptype' undefined}%
       \fi%
     \else%
-      \expandafter\@@setcref\expandafter%
-        {\csname #2@\@temptype @format#3\endcsname}{#1}%
+      \expandafter\@@@setcref\expandafter%
+        {\csname #1@\@temptype @format#3\endcsname}{#2}%
     \fi%
   \fi}%
-\def\@@setcref#1#2{\cref at getlabel{#2}{\@templabel}#1{\@templabel}{}{}}%
-\def\@setcrefrange#1#2#3#4{%
+\def\@@@setcref#1#2{\cref at getlabel{#2}{\@templabel}#1{\@templabel}{}{}}%
+\def\@setcrefrange{\@@setcrefrange{cref}}%
+\def\@setCrefrange{\@@setcrefrange{Cref}}%
+\def\@setlabelcrefrange{\@@setcrefrange{labelcref}}%
+\def\@@setcrefrange#1#2#3#4{%
   \begingroup%
-    \expandafter\ifx\csname r@#1 at cref\endcsname\relax%
+    \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
       \protect\G at refundefinedtrue%
-      \@latex at warning{Reference `#1' on page \thepage \space%
+      \@latex at warning{Reference `#2' on page \thepage \space%
         undefined}%
-      \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
+      \expandafter\ifx\csname r@#3 at cref\endcsname\relax%
         \nfss at text{\reset at font\bfseries ??}--%
         \nfss at text{\reset at font\bfseries ??}%
-        \@latex at warning{Reference `#2' on page \thepage \space%
+        \@latex at warning{Reference `#3' on page \thepage \space%
           undefined}%
       \else%
-        \cref at getlabel{#2}{\@labelb}%
+        \cref at getlabel{#3}{\@labelb}%
         \nfss at text{\reset at font\bfseries ??}--\@labelb%
       \fi%
     \else%
-      \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
+      \expandafter\ifx\csname r@#3 at cref\endcsname\relax%
         \protect\G at refundefinedtrue%
-        \cref at getlabel{#1}{\@labela}%
+        \cref at getlabel{#2}{\@labela}%
         \@labela--\nfss at text{\reset at font\bfseries ??}%
-        \@latex at warning{Reference `#2' on page \thepage %
+        \@latex at warning{Reference `#3' on page \thepage %
           \space undefined}%
       \else%
-        \cref at gettype{#1}{\@typea}%
-        \cref at gettype{#2}{\@typeb}%
-        \cref at getlabel{#1}{\@labela}%
-        \cref at getlabel{#2}{\@labelb}%
-        \edef\@formata{\expandafter\noexpand%
-          \csname #3range@\@typea @format#4\endcsname}%
-        \edef\@formatb{\expandafter\noexpand%
-          \csname #3range@\@typeb @format#4\endcsname}%
-        \expandafter\ifx\@formata\relax%
-          \edef\@tempa{#3}\def\@tempb{labelcref}%
+        \cref at gettype{#2}{\@typea}%
+        \cref at gettype{#3}{\@typeb}%
+        \cref at getlabel{#2}{\@labela}%
+        \cref at getlabel{#3}{\@labelb}%
+        \edef\@format{\expandafter\noexpand%
+          \csname #1range@\@typea @format#4\endcsname}%
+        \expandafter\ifx\@format\relax%
+          \edef\@tempa{#1}\def\@tempb{labelcref}%
           \ifx\@tempa\@tempb\relax%
-            \expandafter\@@setcrefrange\expandafter%
-              {\csname #3range at default@format#4\endcsname}{#1}{#2}%
+            \expandafter\@@@setcrefrange\expandafter%
+              {\csname #1range at default@format#4\endcsname}{#2}{#3}%
           \else%
             \protect\G at refundefinedtrue%
             \nfss at text{\reset at font\bfseries ??}~\@labela--\@labelb%
-            \@latex at warning{#3\space reference range format for label
+            \@latex at warning{#1 reference range format for label
               type `\@typea' undefined}%
           \fi%
         \else%
+          \expandafter\expandafter\expandafter\def%
+            \expandafter\expandafter\expandafter\@formata%
+            \expandafter\expandafter\expandafter{%
+              \csname #1range@\@typea @format#4\endcsname%
+              {\@dummya}{\@dummyb}{\@dummyc}{\@dummyd}{\@dummye}{\@dummyf}}%
+          \expandafter\expandafter\expandafter\def%
+            \expandafter\expandafter\expandafter\@formatb%
+            \expandafter\expandafter\expandafter{%
+              \csname #1range@\@typeb @format#4\endcsname%
+              {\@dummya}{\@dummyb}{\@dummyc}{\@dummyd}{\@dummye}{\@dummyf}}%
           \ifx\@formata\@formatb%
-            \expandafter\@@setcrefrange\expandafter{\@formata}{#1}{#2}%
+            \expandafter\@@@setcrefrange\expandafter{\@format}{#2}{#3}%
           \else%
             \protect\G at refundefinedtrue%
             \nfss at text{\reset at font\bfseries ??}~\@labela--\@labelb%
-            \@latex at warning{References `#1' and `#2' in reference range
+            \@latex at warning{References `#2' and `#3' in reference range
               on page \thepage \space have different types
               `\@typea' and `\@typeb'}%
           \fi%
@@ -1178,7 +1115,7 @@
       \fi%
     \fi%
   \endgroup}%
-\def\@@setcrefrange#1#2#3{%
+\def\@@@setcrefrange#1#2#3{%
   \cref at getlabel{#2}{\@labela}%
   \cref at getlabel{#3}{\@labelb}%
   #1{\@labela}{\@labelb}{}{}{}{}}%
@@ -1212,146 +1149,52 @@
     }{%
       \edef\@tempa{%
         \expandafter\noexpand\csname #1@\@tempa @name#3\endcsname}%
-      \expandafter\@@setnamecref\expandafter{\@tempa}{#4}%
+      \expandafter\@@@setnamecref\expandafter{\@tempa}{#4}%
     }%
   \fi}%
-\def\@@setnamecref#1#2{%
+\def\@@@setnamecref#1#2{%
   \expandafter\def\expandafter\@tempa\expandafter{#1}%
   \expandafter#2\@tempa}%
-\DeclareRobustCommand{\cpageref}[1]{%
-  \@cpageref{cref}{#1}{\@setcpageref}{\@setcpagerefrange}}%
-\DeclareRobustCommand{\Cpageref}[1]{%
-  \@cpageref{Cref}{#1}{\@setcpageref}{\@setcpagerefrange}}%
+\DeclareRobustCommand{\cpageref}[1]{\@cref{cpageref}{#1}}%
+\DeclareRobustCommand{\Cpageref}[1]{\@cref{Cpageref}{#1}}%
 \DeclareRobustCommand{\cpagerefrange}[2]{%
-  \@setcpagerefrange{#1}{#2}{cref}{}}%
+  \@@setcpagerefrange{#1}{#2}{cref}{}}%
 \DeclareRobustCommand{\Cpagerefrange}[2]{%
-  \@setcpagerefrange{#1}{#2}{Cref}{}}%
+  \@@setcpagerefrange{#1}{#2}{Cref}{}}%
 \DeclareRobustCommand{\labelcpageref}[1]{%
-  \@cpageref{labelcref}{#1}{\@setcpageref}{\@setcpagerefrange}}%
-\def\@cpageref#1#2#3#4{%
-  \leavevmode%
-  \begingroup%
-  \countdef\count at consecutive=0%
-  \countdef\count at group=1%
-  \countdef\@counta=2%
-  \countdef\@countb=3%
-  \count at group=0%
-  \cref at stack@init{\@refstack}%
-  \edef\@tempa{#2}%
-  \expandafter\cref at stack@push\expandafter{\@tempa}{\@refstack}%
-  \if at cref@sort%
-    \cref at stack@sort{\@refstack}{\cref at pagecmp}%
-  \fi%
-  \cref at isstackfull{\@refstack}%
-  \@whilesw\if at cref@stackfull\fi{%
-    \if at cref@compress%
-      \cref at processconsecutive%
-        {\@refstack}{\@beginref}{\@endref}{\count at consecutive}%
-        {\cref at ispagerefconsecutive}%
-    \else%
-      \edef\@beginref{\cref at stack@top{\@refstack}}%
-      \cref at stack@pop{\@refstack}%
-      \@whilesw\ifx\@beginref\@empty\fi{%
-        \cref at stack@pop{\@refstack}%
-        \cref at isstackempty{\@refstack}%
-        \if at cref@stackempty%
-          \let\@beginref\relax%
-        \else%
-          \edef\@beginref{\cref at stack@top{\@refstack}}%
-        \fi}%
-      \let\@endref\relax%
-      \count at consecutive=1\relax%
-    \fi%
-    \ifx\@endref\relax\else%
-      \expandafter\ifx\csname r@\@beginref @cref\endcsname\relax\else%
-        \expandafter\ifx\csname r@\@endref @cref\endcsname\relax\else%
-          \cref at getpageref{\@beginref}{\@tempa}%
-          \cref at getpageref{\@endref}{\@tempb}%
-          \ifx\@tempa\@tempb\relax%
-            \count at consecutive=1%
-            \let\@endref\relax%
-          \else%
-            \@counta=\@tempa\relax%
-            \@countb=\@tempb\relax%
-            \advance\@counta 1\relax%
-            \ifnum\@counta=\@countb\relax%
-              \count at consecutive=2%
-            \fi%
-          \fi%
-        \fi%
-      \fi%
-    \fi%
-    \cref at isstackempty{\@refstack}%
-    \if at cref@stackempty%
-      \ifcase\count at group\relax%
-        \ifnum\count at consecutive=2\relax%
-          \def\@pos{@first}%
-        \else%
-          \def\@pos{}%
-        \fi%
-      \or%
-        \ifnum\count at consecutive=2\relax%
-          \def\@pos{@middle}%
-        \else%
-          \def\@pos{@second}%
-        \fi%
-      \else%
-        \def\@pos{@last}%
-      \fi%
-    \else%
-      \ifnum\count at group=0\relax%
-        \def\@pos{@first}%
-      \else%
-        \def\@pos{@middle}%
-      \fi%
-    \fi%
-    \ifnum\count at consecutive=1\relax%
-      \def\@tempa{#3}%
-      \edef\@tempb{{\@beginref}{#1}{\@pos}}%
-      \expandafter\@tempa\@tempb%
-    \else%
-      \ifnum\count at consecutive=2\relax%
-        \def\@tempa{#3}%
-        \edef\@tempb{{\@beginref}{#1}{\@pos}}%
-        \expandafter\@tempa\@tempb%
-        \expandafter\cref at stack@push\expandafter%
-          {\@endref,}{\@refstack}%
-      \else%
-        \def\@tempa{#4}%
-        \edef\@tempb{{\@beginref}{\@endref}{#1}{\@pos}}%
-        \expandafter\@tempa\@tempb%
-      \fi%
-    \fi%
-    \advance\count at group 1%
-    \cref at isstackfull{\@refstack}%
-  }% end loop over reference stack
-  \endgroup}%
-\def\@setcpageref#1#2#3{%
-  \expandafter\ifx\csname r@#1 at cref\endcsname\relax%
+  \@cref{labelcpageref}{#1}}%
+\def\@setcpageref{\@@setcpageref{cref}}
+\def\@setCpageref{\@@setcpageref{Cref}}
+\def\@setlabelcpageref{\@@setcpageref{labelcref}}
+\def\@@setcpageref#1#2#3{%
+  \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
     \protect\G at refundefinedtrue%
     \nfss at text{\reset at font\bfseries ??}%
-    \@latex at warning{Reference `#1' on page \thepage \space undefined}%
+    \@latex at warning{Reference `#2' on page \thepage \space undefined}%
   \else%
-    \cref at getpageref{#1}{\@temppage}%
-    \expandafter\ifx\csname #2 at page@format#3\endcsname\relax%
-      \edef\@tempa{#2}\def\@tempb{labelcref}%
+    \cpageref at getlabel{#2}{\@temppage}%
+    \expandafter\ifx\csname #1 at page@format#3\endcsname\relax%
+      \edef\@tempa{#1}\def\@tempb{labelcref}%
       \ifx\@tempa\@tempb\relax%
-        \expandafter\@@setcpageref\expandafter%
-          {\csname #2 at default@format#3\endcsname}{#1}%
+        \expandafter\@@@setcpageref\expandafter%
+          {\csname #1 at default@format#3\endcsname}{#2}%
       \else%
         \protect\G at refundefinedtrue%
         \nfss at text{\reset at font\bfseries ??}~\@temppage%
-        \@latex at warning{#2 \space reference format for
+        \@latex at warning{ #1 reference format for
           page references undefined}%
       \fi%
     \else%
-      \expandafter\@@setcpageref\expandafter%
-        {\csname #2 at page@format#3\endcsname}{#1}%
+      \expandafter\@@@setcpageref\expandafter%
+        {\csname #1 at page@format#3\endcsname}{#2}%
     \fi%
   \fi}%
-\def\@@setcpageref#1#2{%
-  \cref at getpageref{#2}{\@temppage}#1{\@temppage}{}{}}%
-\def\@setcpagerefrange#1#2#3#4{%
+\def\@@@setcpageref#1#2{%
+  \cpageref at getlabel{#2}{\@temppage}#1{\@temppage}{}{}}%
+\def\@setcpagerefrange#1#2#3{\@@setcpagerefrange{#1}{#2}{cref}{#3}}%
+\def\@setCpagerefrange#1#2#3{\@@setcpagerefrange{#1}{#2}{Cref}{#3}}%
+\def\@setlabelcpagerefrange#1#2#3{\@@setcpagerefrange{#1}{#2}{labelcref}{#3}}%
+\def\@@setcpagerefrange#1#2#3#4{%
   \begingroup%
     \expandafter\ifx\csname r@#1 at cref\endcsname\relax%
       \protect\G at refundefinedtrue%
@@ -1363,41 +1206,41 @@
         \@latex at warning{Reference `#2' on page \thepage \space%
           undefined}%
       \else%
-        \cref at getpageref{#2}{\@pageb}%
+        \cpageref at getlabel{#2}{\@pageb}%
         \nfss at text{\reset at font\bfseries ??}--\@pageb%
       \fi%
     \else%
       \expandafter\ifx\csname r@#2 at cref\endcsname\relax%
         \protect\G at refundefinedtrue%
-        \cref at getpageref{#1}{\@pagea}%
+        \cpageref at getlabel{#1}{\@pagea}%
         \@pagea--\nfss at text{\reset at font\bfseries ??}%
         \@latex at warning{Reference `#2' on page \thepage %
           \space undefined}%
       \else%
-        \cref at getpageref{#1}{\@pagea}%
-        \cref at getpageref{#2}{\@pageb}%
+        \cpageref at getlabel{#1}{\@pagea}%
+        \cpageref at getlabel{#2}{\@pageb}%
         \edef\@format{\expandafter\noexpand%
-          \csname #3range at page@format#4\endcsname}%
+          \csname#3range at page@format#4\endcsname}%
         \expandafter\ifx\@format\relax%
           \edef\@tempa{#3}\def\@tempb{labelcref}%
           \ifx\@tempa\@tempb\relax%
-            \expandafter\@@setcpagerefrange\expandafter%
-              {\csname #3range at default@format#4\endcsname}{#1}{#2}%
+            \expandafter\@@@setcpagerefrange\expandafter%
+              {\csname#3range at default@format#4\endcsname}{#1}{#2}%
           \else%
             \protect\G at refundefinedtrue%
             \nfss at text{\reset at font\bfseries ??}~\@pagea--\@pageb%
-            \@latex at warning{#3\space reference range format for page
+            \@latex at warning{#3 reference range format for page
               references undefined}%
           \fi%
         \else%
-          \expandafter\@@setcpagerefrange\expandafter{\@format}{#1}{#2}%
+          \expandafter\@@@setcpagerefrange\expandafter{\@format}{#1}{#2}%
         \fi%
       \fi%
     \fi%
   \endgroup}%
-\def\@@setcpagerefrange#1#2#3{%
-  \cref at getpageref{#2}{\@pagea}%
-  \cref at getpageref{#3}{\@pageb}%
+\def\@@@setcpagerefrange#1#2#3{%
+  \cpageref at getlabel{#2}{\@pagea}%
+  \cpageref at getlabel{#3}{\@pageb}%
   #1{\@pagea}{\@pageb}{}{}{}{}}%
 \cref at stack@init{\cref at label@types}%
 \newcommand\crefdefaultlabelformat[1]{%
@@ -1824,6 +1667,142 @@
   \@crefrangedefineformat{#1}%
   \@crefdefinemultiformat{#1}%
   \@crefrangedefinemultiformat{#1}}%
+\def\@crefcopyformats#1#2{%
+  \@ifundefined{cref@#2 at name}{%
+    \edef\@tempa{\expandafter\noexpand\csname cref@#2 at name\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname cref@#1 at name\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb%
+    \edef\@tempa{\expandafter\noexpand\csname cref@#2 at name@plural\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname cref@#1 at name@plural\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{cref@#2 at format}{%
+    \edef\@tempa{\expandafter\noexpand\csname cref@#2 at format\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname cref@#1 at format\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{crefrange@#2 at format}{%
+    \edef\@tempa{\expandafter\noexpand\csname crefrange@#2 at format\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname crefrange@#1 at format\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{cref@#2 at format@first}{%
+    \edef\@tempa{\expandafter\noexpand\csname cref@#2 at format@first\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname cref@#1 at format@first\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{cref@#2 at format@second}{%
+    \edef\@tempa{\expandafter\noexpand\csname cref@#2 at format@second\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname cref@#1 at format@second\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{cref@#2 at format@middle}{%
+    \edef\@tempa{\expandafter\noexpand\csname cref@#2 at format@middle\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname cref@#1 at format@middle\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{cref@#2 at format@last}{%
+    \edef\@tempa{\expandafter\noexpand\csname cref@#2 at format@last\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname cref@#1 at format@last\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{crefrange@#2 at format@first}{%
+    \edef\@tempa{\expandafter\noexpand\csname crefrange@#2 at format@first\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname crefrange@#1 at format@first\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{crefrange@#2 at format@second}{%
+    \edef\@tempa{\expandafter\noexpand\csname crefrange@#2 at format@second\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname crefrange@#1 at format@second\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{crefrange@#2 at format@middle}{%
+    \edef\@tempa{\expandafter\noexpand\csname crefrange@#2 at format@middle\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname crefrange@#1 at format@middle\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{crefrange@#2 at format@last}{%
+    \edef\@tempa{\expandafter\noexpand\csname crefrange@#2 at format@last\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname crefrange@#1 at format@last\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Cref@#2 at name}{%
+    \edef\@tempa{\expandafter\noexpand\csname Cref@#2 at name\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Cref@#1 at name\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb%
+    \edef\@tempa{\expandafter\noexpand\csname Cref@#2 at name@plural\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Cref@#1 at name@plural\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Cref@#2 at format}{%
+    \edef\@tempa{\expandafter\noexpand\csname Cref@#2 at format\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Cref@#1 at format\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Crefrange@#2 at format}{%
+    \edef\@tempa{\expandafter\noexpand\csname Crefrange@#2 at format\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Crefrange@#1 at format\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Cref@#2 at format@first}{%
+    \edef\@tempa{\expandafter\noexpand\csname Cref@#2 at format@first\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Cref@#1 at format@first\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Cref@#2 at format@second}{%
+    \edef\@tempa{\expandafter\noexpand\csname Cref@#2 at format@second\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Cref@#1 at format@second\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Cref@#2 at format@middle}{%
+    \edef\@tempa{\expandafter\noexpand\csname Cref@#2 at format@middle\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Cref@#1 at format@middle\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Cref@#2 at format@last}{%
+    \edef\@tempa{\expandafter\noexpand\csname Cref@#2 at format@last\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Cref@#1 at format@last\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Crefrange@#2 at format@first}{%
+    \edef\@tempa{\expandafter\noexpand\csname Crefrange@#2 at format@first\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Crefrange@#1 at format@first\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Crefrange@#2 at format@second}{%
+    \edef\@tempa{\expandafter\noexpand\csname Crefrange@#2 at format@second\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Crefrange@#1 at format@second\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Crefrange@#2 at format@middle}{%
+    \edef\@tempa{\expandafter\noexpand\csname Crefrange@#2 at format@middle\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Crefrange@#1 at format@middle\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{Crefrange@#2 at format@last}{%
+    \edef\@tempa{\expandafter\noexpand\csname Crefrange@#2 at format@last\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname Crefrange@#1 at format@last\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcref@#2 at format}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcref@#2 at format\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcref@#1 at format\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcrefrange@#2 at format}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcrefrange@#2 at format\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcrefrange@#1 at format\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcref@#2 at format@first}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcref@#2 at format@first\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcref@#1 at format@first\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcref@#2 at format@second}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcref@#2 at format@second\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcref@#1 at format@second\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcref@#2 at format@middle}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcref@#2 at format@middle\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcref@#1 at format@middle\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcref@#2 at format@last}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcref@#2 at format@last\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcref@#1 at format@last\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcrefrange@#2 at format@first}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcrefrange@#2 at format@first\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcrefrange@#1 at format@first\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcrefrange@#2 at format@second}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcrefrange@#2 at format@second\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcrefrange@#1 at format@second\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcrefrange@#2 at format@middle}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcrefrange@#2 at format@middle\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcrefrange@#1 at format@middle\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+  \@ifundefined{labelcrefrange@#2 at format@last}{%
+    \edef\@tempa{\expandafter\noexpand\csname labelcrefrange@#2 at format@last\endcsname}%
+    \edef\@tempb{\expandafter\noexpand\csname labelcrefrange@#1 at format@last\endcsname}%
+    \expandafter\expandafter\expandafter\let\expandafter\@tempa\@tempb}{}%
+}
 \newcommand\crefformat[2]{\@crefformat{cref}{#1}{#2}}%
 \newcommand\Crefformat[2]{\@crefformat{Cref}{#1}{#2}}%
 \newcommand\crefrangeformat[2]{\@crefrangeformat{crefrange}{#1}{#2}}%
@@ -2000,15 +1979,17 @@
     }{}%
   \endgroup}%
 \let\if at cref@hyperrefloaded\iffalse%
+\let\cref at addtoreset\@addtoreset%
 \@ifpackageloaded{hyperref}{%
   \@ifpackagewith{hyperref}{implicit=false}{}{%
     \let\if at cref@hyperrefloaded\iftrue%
     \PackageInfo{cleveref}{`hyperref' support loaded}%
+    \let\cref at addtoreset\HyOrg at addtoreset%
     \def\cref at hyperlinkname#1{\expandafter\expandafter\expandafter%
       \@fourthoffive\csname r@#1\endcsname}%
     \def\cref at hyperlinkurl#1{\expandafter\expandafter\expandafter%
       \@fifthoffive\csname r@#1\endcsname}%
-    \def\cref at hyperlink#1#2#3\@nil{\hyper@@link[link]{#1}{#2}{#3}}
+    \def\cref at hyperlink#1#2#3\@nil{\hyper@@link[link]{#1}{#2}{#3}}%
     \let\cref at old@H at refstepcounter\H at refstepcounter%
     \def\H at refstepcounter#1{%
       \cref at old@H at refstepcounter{#1}%
@@ -2022,105 +2003,108 @@
     \let\refstepcounter at noarg\cref at old@refstepcounter%
     \def\refstepcounter at optarg[#1]#2{%
       \cref at old@refstepcounter{#2}%
+      \@ifundefined{cref@#1 at alias}%
+        {\def\@tempa{#1}}%
+        {\def\@tempa{\csname cref@#1 at alias\endcsname}}%
       \protected at edef\cref at currentlabel{%
         \expandafter\cref at override@label at type%
-          \cref at currentlabel\@nil{#1}}}%
+          \cref at currentlabel\@nil{\@tempa}}}%
     \@ifundefined{appendix}{}{%
-      \g at addto@macro\appendix{%
+      \def\appendix{%
         \@ifundefined{chapter}{%
-          \def\H at refstepcounter#1{%
-            \cref at old@H at refstepcounter{#1}%
-            \cref at constructprefix{#1}{\cref at result}%
+          \def\H at refstepcounter##1{%
+            \cref at old@H at refstepcounter{##1}%
+            \cref at constructprefix{##1}{\cref at result}%
             \ifx\cref at result\@empty%
               \def\cref at result{2147483647}%
             \else%
               \edef\cref at result{2147483647,\cref at result}%
             \fi%
-            \def\@tempa{#1}%
+            \def\@tempa{##1}%
             \def\@tempb{section}%
             \ifx\@tempa\@tempb%
               \protected at edef\cref at currentlabel{%
-                [appendix][\arabic{#1}][\cref at result]%
-                \csname p@#1\endcsname\csname the#1\endcsname}%
+                [appendix][\arabic{##1}][\cref at result]%
+                \csname p@##1\endcsname\csname the##1\endcsname}%
             \else%
-              \def\@tempa{#1}%
+              \def\@tempa{##1}%
               \def\@tempb{subsection}%
               \ifx\@tempa\@tempb%
                 \protected at edef\cref at currentlabel{%
-                  [subappendix][\arabic{#1}][\cref at result]%
-                  \csname p@#1\endcsname\csname the#1\endcsname}%
+                  [subappendix][\arabic{##1}][\cref at result]%
+                  \csname p@##1\endcsname\csname the##1\endcsname}%
               \else%
-                \def\@tempa{#1}%
+                \def\@tempa{##1}%
                 \def\@tempb{subsubsection}%
                 \ifx\@tempa\@tempb%
                   \protected at edef\cref at currentlabel{%
-                    [subsubappendix][\arabic{#1}][\cref at result]%
-                    \csname p@#1\endcsname\csname the#1\endcsname}%
+                    [subsubappendix][\arabic{##1}][\cref at result]%
+                    \csname p@##1\endcsname\csname the##1\endcsname}%
                 \else%
-                  \@ifundefined{cref@#1 at alias}%
-                    {\def\@tempa{#1}}%
-                    {\def\@tempa{\csname cref@#1 at alias\endcsname}}%
+                  \@ifundefined{cref@##1 at alias}%
+                    {\def\@tempa{##1}}%
+                    {\def\@tempa{\csname cref@##1 at alias\endcsname}}%
                   \protected at edef\cref at currentlabel{%
-                    [\@tempa][\arabic{#1}][\cref at result]%
-                    \csname p@#1\endcsname\csname the#1\endcsname}%
+                    [\@tempa][\arabic{##1}][\cref at result]%
+                    \csname p@##1\endcsname\csname the##1\endcsname}%
                 \fi%
               \fi%
             \fi}%
+          \cref at old@appendix%
         }{%
-          \def\H at refstepcounter#1{%
-            \cref at old@H at refstepcounter{#1}%
-            \cref at constructprefix{#1}{\cref at result}%
+          \def\H at refstepcounter##1{%
+            \cref at old@H at refstepcounter{##1}%
+            \cref at constructprefix{##1}{\cref at result}%
             \ifx\cref at result\@empty%
               \def\cref at result{2147483647}%
             \else%
               \edef\cref at result{2147483647,\cref at result}%
             \fi%
-            \def\@tempa{#1}%
+            \def\@tempa{##1}%
             \def\@tempb{chapter}%
             \ifx\@tempa\@tempb%
               \protected at edef\cref at currentlabel{%
-                [appendix][\arabic{#1}][\cref at result]%
-                \csname p@#1\endcsname\csname the#1\endcsname}%
+                [appendix][\arabic{##1}][\cref at result]%
+                \csname p@##1\endcsname\csname the##1\endcsname}%
             \else%
-              \def\@tempa{#1}%
+              \def\@tempa{##1}%
               \def\@tempb{section}%
               \ifx\@tempa\@tempb%
                 \protected at edef\cref at currentlabel{%
-                  [subappendix][\arabic{#1}][\cref at result]%
-                  \csname p@#1\endcsname\csname the#1\endcsname}%
+                  [subappendix][\arabic{##1}][\cref at result]%
+                  \csname p@##1\endcsname\csname the##1\endcsname}%
               \else%
-                \def\@tempa{#1}%
+                \def\@tempa{##1}%
                 \def\@tempb{subsection}%
                 \ifx\@tempa\@tempb%
                   \protected at edef\cref at currentlabel{%
-                    [subsubappendix][\arabic{#1}][\cref at result]%
-                    \csname p@#1\endcsname\csname the#1\endcsname}%
+                    [subsubappendix][\arabic{##1}][\cref at result]%
+                    \csname p@##1\endcsname\csname the##1\endcsname}%
                 \else%
-                  \def\@tempa{#1}%
+                  \def\@tempa{##1}%
                   \def\@tempb{subsubsection}%
                   \ifx\@tempa\@tempb%
                     \protected at edef\cref at currentlabel{%
-                      [subsubsubappendix][\arabic{#1}][\cref at result]%
-                      \csname p@#1\endcsname\csname the#1\endcsname}%
+                      [subsubsubappendix][\arabic{##1}][\cref at result]%
+                      \csname p@##1\endcsname\csname the##1\endcsname}%
                   \else%
-                    \@ifundefined{cref@#1 at alias}%
-                      {\def\@tempa{#1}}%
-                      {\def\@tempa{\csname cref@#1 at alias\endcsname}}%
+                    \@ifundefined{cref@##1 at alias}%
+                      {\def\@tempa{##1}}%
+                      {\def\@tempa{\csname cref@##1 at alias\endcsname}}%
                     \protected at edef\cref at currentlabel{%
-                      [\@tempa][\arabic{#1}][\cref at result]%
-                      \csname p@#1\endcsname\csname the#1\endcsname}%
+                      [\@tempa][\arabic{##1}][\cref at result]%
+                      \csname p@##1\endcsname\csname the##1\endcsname}%
                   \fi%
                 \fi%
               \fi%
             \fi}%
-        }%
+      \cref at old@appendix}%
       }%
     }% end of \@ifundefined{appendix}
     \DeclareRobustCommand{\cref}{%
-      \@ifstar{\@crefstar{cref}}{\@crefnostar{cref}}}%
+      \@ifstar{\@crefstar{cref}}{\@cref{cref}}}%
     \DeclareRobustCommand{\Cref}{%
-      \@ifstar{\@crefstar{Cref}}{\@crefnostar{Cref}}}%
-    \def\@crefnostar#1#2{\@cref{#1}{#2}}%
+      \@ifstar{\@crefstar{Cref}}{\@cref{Cref}}}%
     \def\@crefstar#1#2{%
       \@crefstarredtrue\@cref{#1}{#2}\@crefstarredfalse}%
     \DeclareRobustCommand{\crefrange}{%
@@ -2127,44 +2111,34 @@
       \@ifstar{\@crefrangestar{cref}}{\@crefrangenostar{cref}}}%
     \DeclareRobustCommand{\Crefrange}{%
       \@ifstar{\@crefrangestar{Cref}}{\@crefrangenostar{Cref}}}%
-    \def\@crefrangenostar#1#2#3{\@setcrefrange{#2}{#3}{#1}{}}%
+    \def\@crefrangenostar#1#2#3{\@@setcrefrange{#1}{#2}{#3}{}}
     \def\@crefrangestar#1#2#3{%
-      \@crefstarredtrue\@setcrefrange{#2}{#3}{#1}{}\@crefstarredfalse}%
+      \@crefstarredtrue\@@setcrefrange{#1}{#2}{#3}{}\@crefstarredfalse}%
     \DeclareRobustCommand{\cpageref}{%
-      \@ifstar{\@cpagerefstar{cref}}{\@cpagerefnostar{cref}}}%
+      \@ifstar{\@crefstar{cpageref}}{\@cref{cpageref}}}%
     \DeclareRobustCommand{\Cpageref}{%
-      \@ifstar{\@cpagerefstar{Cref}}{\@cpagerefnostar{Cref}}}%
-    \def\@cpagerefnostar#1#2{%
-      \@cpageref{#1}{#2}{\@setcpageref}{\@setcpagerefrange}}%
-    \def\@cpagerefstar#1#2{%
-      \@crefstarredtrue%
-      \@cpageref{#1}{#2}{\@setcpageref}{\@setcpagerefrange}%
-      \@crefstarredfalse}%
+      \@ifstar{\@crefstar{Cpageref}}{\@cref{Cpageref}}}%
     \DeclareRobustCommand{\cpagerefrange}{%
-      \@ifstar{\@cpagerefrangestar{cref}}{\@cpagerefrangenostar{cref}}}%
+      \@ifstar{\@cpagerefrangestar{cpageref}}{\@setcpagerefrange}}%
     \DeclareRobustCommand{\Cpagerefrange}{%
-      \@ifstar{\@cpagerefrangestar{Cref}}{\@cpagerefrangenostar{Cref}}}%
-    \def\@cpagerefrangenostar#1#2#3{\@setcpagerefrange{#2}{#3}{#1}{}}%
+      \@ifstar{\@cpagerefrangestar{Cpageref}}{\@setCpagerefrange}}%
     \def\@cpagerefrangestar#1#2#3{%
       \@crefstarredtrue%
-      \@setcpagerefrange{#2}{#3}{#1}{}%
+      \@@setcpagerefrange{#1}{#2}{#3}{}%
       \@crefstarredfalse}%
     \DeclareRobustCommand{\labelcref}{%
-      \@ifstar{\@labelcrefstar}{\@labelcrefnostar}}%
-    \def\@labelcrefnostar#1{\@cref{labelcref}{#1}}%
+      \@ifstar{\@labelcrefstar}{\@cref{labelcref}}}%
     \def\@labelcrefstar#1{%
       \@crefstarredtrue%
       \@cref{labelcref}{#1}%
       \@crefstarredfalse}%
     \DeclareRobustCommand{\labelcpageref}{%
-      \@ifstar{\@labelcpagerefstar}{\@labelcpagerefnostar}}%
-    \def\@labelcpagerefnostar#1{%
-      \@cpageref{labelcref}{#1}{\@setcpageref}{\@setcpagerefrange}}%
+      \@ifstar{\@labelcpagerefstar}{\@cref{labelcpageref}}}%
     \def\@labelcpagerefstar#1{%
       \@crefstarredtrue%
-      \@cpageref{labelcref}{#1}{\@setcpageref}{\@setcpagerefrange}%
+      \@cref{labelcpageref}{#1}%
       \@crefstarredfalse}%
-    \def\@@setcref#1#2{%
+    \def\@@@setcref#1#2{%
       \cref at getlabel{#2}{\@templabel}%
       \if at crefstarred%
         #1{\@templabel}{}{}%
@@ -2173,7 +2147,7 @@
         \edef\@tempurl{\cref at hyperlinkurl{#2}}%
         #1{\@templabel}{\cref at hyperlink{\@tempurl}{\@tempname}}{\@nil}%
       \fi}%
-    \def\@@setcrefrange#1#2#3{%
+    \def\@@@setcrefrange#1#2#3{%
       \cref at getlabel{#2}{\@labela}%
       \cref at getlabel{#3}{\@labelb}%
       \if at crefstarred%
@@ -2187,8 +2161,8 @@
           {\cref at hyperlink{\@tempurla}{\@tempnamea}}{\@nil}%
           {\cref at hyperlink{\@tempurlb}{\@tempnameb}}{\@nil}%
       \fi}%
-    \def\@@setcpageref#1#2{%
-      \cref at getpageref{#2}{\@temppage}%
+    \def\@@@setcpageref#1#2{%
+      \cpageref at getlabel{#2}{\@temppage}%
       \if at crefstarred%
         #1{\@temppage}{}{}%
       \else%
@@ -2196,9 +2170,9 @@
         \edef\@tempurl{\cref at hyperlinkurl{#2}}%
         #1{\@temppage}{\cref at hyperlink{\@tempurl}{\@tempname}}{\@nil}%
       \fi}%
-    \def\@@setcpagerefrange#1#2#3{%
-      \cref at getpageref{#2}{\@pagea}%
-      \cref at getpageref{#3}{\@pageb}%
+    \def\@@@setcpagerefrange#1#2#3{%
+      \cpageref at getlabel{#2}{\@pagea}%
+      \cpageref at getlabel{#3}{\@pageb}%
       \if at crefstarred%
         #1{\@pagea}{\@pageb}{}{}{}{}%
       \else%
@@ -2225,78 +2199,117 @@
       \protected at edef\cref at currentlabel{%
         [\@tempa][\arabic{#1}][\cref at result]%
         \csname p@#1\endcsname\csname the#1\endcsname}}%
-  \fi%
+    \@ifundefined{appendix}{}{%
+      \def\appendix{%
+        \@ifundefined{chapter}{%
+          \def\H at refstepcounter##1{%
+            \cref at old@H at refstepcounter{##1}%
+            \cref at constructprefix{##1}{\cref at result}%
+            \ifx\cref at result\@empty%
+              \def\cref at result{2147483647}%
+            \else%
+              \edef\cref at result{2147483647,\cref at result}%
+            \fi%
+            \def\@tempa{##1}%
+            \def\@tempb{section}%
+            \ifx\@tempa\@tempb%
+              \protected at edef\cref at currentlabel{%
+                [appendix][\arabic{##1}][\cref at result]%
+                \csname p@##1\endcsname\csname the##1\endcsname}%
+            \else%
+              \def\@tempa{##1}%
+              \def\@tempb{subsection}%
+              \ifx\@tempa\@tempb%
+                \protected at edef\cref at currentlabel{%
+                  [subappendix][\arabic{##1}][\cref at result]%
+                  \csname p@##1\endcsname\csname the##1\endcsname}%
+              \else%
+                \def\@tempa{##1}%
+                \def\@tempb{subsubsection}%
+                \ifx\@tempa\@tempb%
+                  \protected at edef\cref at currentlabel{%
+                    [subsubappendix][\arabic{##1}][\cref at result]%
+                    \csname p@##1\endcsname\csname the##1\endcsname}%
+                \else%
+                  \@ifundefined{cref@##1 at alias}%
+                    {\def\@tempa{##1}}%
+                    {\def\@tempa{\csname cref@##1 at alias\endcsname}}%
+                  \protected at edef\cref at currentlabel{%
+                    [\@tempa][\arabic{##1}][\cref at result]%
+                    \csname p@##1\endcsname\csname the##1\endcsname}%
+                \fi%
+              \fi%
+            \fi}%
+          \cref at old@appendix%
+        }{%
+          \def\H at refstepcounter##1{%
+            \cref at old@H at refstepcounter{##1}%
+            \cref at constructprefix{##1}{\cref at result}%
+            \ifx\cref at result\@empty%
+              \def\cref at result{2147483647}%
+            \else%
+              \edef\cref at result{2147483647,\cref at result}%
+            \fi%
+            \def\@tempa{##1}%
+            \def\@tempb{chapter}%
+            \ifx\@tempa\@tempb%
+              \protected at edef\cref at currentlabel{%
+                [appendix][\arabic{##1}][\cref at result]%
+                \csname p@##1\endcsname\csname the##1\endcsname}%
+            \else%
+              \def\@tempa{##1}%
+              \def\@tempb{section}%
+              \ifx\@tempa\@tempb%
+                \protected at edef\cref at currentlabel{%
+                  [subappendix][\arabic{##1}][\cref at result]%
+                  \csname p@##1\endcsname\csname the##1\endcsname}%
+              \else%
+                \def\@tempa{##1}%
+                \def\@tempb{subsection}%
+                \ifx\@tempa\@tempb%
+                  \protected at edef\cref at currentlabel{%
+                    [subsubappendix][\arabic{##1}][\cref at result]%
+                    \csname p@##1\endcsname\csname the##1\endcsname}%
+                \else%
+                  \def\@tempa{##1}%
+                  \def\@tempb{subsubsection}%
+                  \ifx\@tempa\@tempb%
+                    \protected at edef\cref at currentlabel{%
+                      [subsubsubappendix][\arabic{##1}][\cref at result]%
+                      \csname p@##1\endcsname\csname the##1\endcsname}%
+                  \else%
+                    \@ifundefined{cref@##1 at alias}%
+                      {\def\@tempa{##1}}%
+                      {\def\@tempa{\csname cref@##1 at alias\endcsname}}%
+                    \protected at edef\cref at currentlabel{%
+                      [\@tempa][\arabic{##1}][\cref at result]%
+                      \csname p@##1\endcsname\csname the##1\endcsname}%
+                  \fi%
+                \fi%
+              \fi%
+            \fi}%
+      \cref at old@appendix}%
+      }%
+    }% end of \@ifundefined{appendix}
+  \fi% end of \if at cref@hyperrefloaded
   \let\if at cref@hyperrefloaded\iffalse%
 }% end of \@ifpackageloaded{hyperref}
+\AtBeginDocument{%
+  \if at cref@hyperrefloaded\else%
+    \@ifpackageloaded{hyperref}{%
+      \PackageError{cleveref}{cleveref must be loaded after hyperref!}%
+        {Package load order is wrong: load cleveref *after* hyperref.}
+    }{}%
+  \fi}
+\let\if at cref@variorefloaded\iffalse%
 \@ifpackageloaded{varioref}{%
+  \let\if at cref@variorefloaded\iftrue%
   \PackageInfo{cleveref}{`varioref' support loaded}%
   \PackageInfo{cleveref}{`cleveref' supersedes `varioref's
     \string\labelformat command}%
-  \def\cref@@vpageref#1[#2]#3{%
-    \@cpageref{cref}{#3}%
-      {\@setvpageref[#1][\vref at space]}{\@setvpagerefrange[#1]}}%
-  \def\cref at vref#1#2{%
-    \leavevmode%
-    \begingroup%
-      \def\reftextcurrent{}%
-      \@cref{#1}{#2}\@setcref at space%
-      \cref@@vpageref{\reftextcurrent}[]{#2}%
-    \endgroup}%
-  \def\cref at vrefrange#1#2#3{%
-    \@setcrefrange{#2}{#3}{#1}{}\@setcref at space\vpagerefrange{#2}{#3}}%
-  \def\cref at fullref#1#2{%
-    \@cref{#1}{#2}\@setcref at space%
-    \@cpageref{cref}{#2}{\@setfullpageref}{\@setfullpagerefrange}}%
-  \def\cref at vpagerefconjunction#1{%
-    \def\@tempa{#1}%
-    \def\@tempb{@second}%
-    \ifx\@tempa\@tempb\relax%
-      \@setcref at pairconjunction%
-    \else%
-      \def\@tempb{@middle}%
-      \ifx\@tempa\@tempb\relax%
-        \@setcref at middleconjunction%
-      \else%
-        \def\@tempb{@last}%
-        \ifx\@tempa\@tempb\relax%
-          \@setcref at lastconjunction%
-        \fi%
-      \fi%
-    \fi}%
-  \def\@setcref at space{ }%
-  \def\@setvpageref[#1][#2]#3#4#5{%
-    \cref at vpagerefconjunction{#5}%
-    \def\vref at space{}%
-    \begingroup%
-      \cref at patchreftexts{#5}%
-      \@@setvpageref{#1}[#2]{#3}%
-    \endgroup}%
-  \def\@@setvpageref#1[#2]#3{\cref at old@@vpageref{#1}[#2]{#3}}%
-  \def\@setvpagerefrange[#1]#2#3#4#5{%
-    \cref at vpagerefconjunction{#5}%
-    \let\vref at space\relax%
-    \begingroup%
-      \cref at patchreftexts{#5}%
-      \@@setvpagerefrange[#1]{#2}{#3}%
-    \endgroup}%
-  \def\@@setvpagerefrange[#1]#2#3{\vpagerefrange[#1]{#2}{#3}}%
-  \def\@setfullpageref#1#2#3{%
-    \cref at vpagerefconjunction{#3}%
-    \begingroup%
-      \cref at patchreftexts{#3}%
-      \@@setfullpageref{#1}%
-    \endgroup}%
-  \def\@@setfullpageref#1{\reftextfaraway{#1}}%
-  \def\@setfullpagerefrange#1#2#3#4{%
-    \cref at vpagerefconjunction{#4}%
-    \begingroup%
-      \cref at patchreftexts{#4}%
-      \@@setfullpagerefrange{#1}{#2}%
-    \endgroup}%
-  \def\@@setfullpagerefrange#1#2{\reftextpagerange{#1}{#2}}%
   \def\cref at old@@vpageref#1[#2]#3{%
     \leavevmode%\unskip  <<<
-    \global\advance\c at vrcnt\@ne%
+    \global\advance\c at vrcnt\@ne\relax%
     \vref at pagenum\@tempa{\the\c at vrcnt @vr}%
     \vref at pagenum\@tempb{\the\c at vrcnt @xvr}%
     %\vref at label{\the\c at vrcnt @xvr}%  <<<
@@ -2320,7 +2333,7 @@
          {%
           \is at pos@number\@tempa%
            {\@tempcnta\@tempa%
-            \advance\@tempcnta\@ne%
+            \advance\@tempcnta\@ne\relax%
            }%
            {\@tempcnta\maxdimen}%
           \ifnum \thevpagerefnum =\@tempcnta%
@@ -2334,7 +2347,7 @@
              \reftextafter%
            \fi%
           \else%
-            \advance\@tempcnta-2%
+            \advance\@tempcnta-2\relax%
             \ifnum \thevpagerefnum =\@tempcnta%
               \ifodd\@tempcnta%
                 \reftextbefore%
@@ -2355,6 +2368,71 @@
     \vref at label{\the\c at vrcnt @xvr}%  <<<
     \vref at label{\the\c at vrcnt @vr}%
   }%
+  \def\cref@@vpageref#1[#2]#3{%
+    \begingroup%
+    \def\cref@@vpageref at arg{#1}%
+    \@cref{vpageref}{#3}%
+    \endgroup}%
+  \def\cref at vref#1#2{%
+    \leavevmode%
+    \begingroup%
+      \def\reftextcurrent{}%
+      \@cref{#1}{#2}\@setcref at space%
+      \cref@@vpageref{\reftextcurrent}[]{#2}%
+    \endgroup}%
+  \def\cref at vrefrange#1#2#3{%
+    \@@setcrefrange{#1}{#2}{#3}{}\@setcref at space\vpagerefrange{#2}{#3}}%
+  \def\cref at fullref#1#2{%
+    \@cref{#1}{#2}\@setcref at space\@cref{fullpageref}{#2}}%
+  \def\cref at vpagerefconjunction#1{%
+    \def\@tempa{#1}%
+    \def\@tempb{@second}%
+    \ifx\@tempa\@tempb\relax%
+      \@setcref at pairconjunction%
+    \else%
+      \def\@tempb{@middle}%
+      \ifx\@tempa\@tempb\relax%
+        \@setcref at middleconjunction%
+      \else%
+        \def\@tempb{@last}%
+        \ifx\@tempa\@tempb\relax%
+          \@setcref at lastconjunction%
+        \fi%
+      \fi%
+    \fi}%
+  \def\@setcref at space{ }%
+  \def\@setvpageref#1#2{%
+    \cref at vpagerefconjunction{#2}%
+    \def\vref at space{}%
+    \begingroup%
+      \cref at patchreftexts{#2}%
+      \expandafter\@@@setvpageref\expandafter%
+        {\cref@@vpageref at arg}[\vref at space]{#1}%
+    \endgroup}%
+  \let\@@@setvpageref\cref at old@@vpageref%
+  \def\@setvpagerefrange#1#2#3{%
+    \cref at vpagerefconjunction{#3}%
+    \let\vref at space\relax%
+    \begingroup%
+      \cref at patchreftexts{#3}%
+      \expandafter\@@@setvpagerefrange\expandafter%
+        [\cref@@vpageref at arg]{#1}{#2}%
+    \endgroup}%
+  \let\@@@setvpagerefrange\vpagerefrange
+  \def\@setfullpageref#1#2{%
+    \cref at vpagerefconjunction{#2}%
+    \begingroup%
+      \cref at patchreftexts{#2}%
+      \@@@setfullpageref{#1}%
+    \endgroup}%
+  \let\@@@setfullpageref\reftextfaraway%
+  \def\@setfullpagerefrange#1#2#3{%
+    \cref at vpagerefconjunction{#3}%
+    \begingroup%
+      \cref at patchreftexts{#3}%
+      \@@@setfullpagerefrange{#1}{#2}%
+    \endgroup}%
+  \let\@@@setfullpagerefrange\reftextpagerange%
   \let\creftextcurrent\reftextcurrent%
   \let\creftextfaceafter\reftextfaceafter%
   \let\creftextfacebefore\reftextfacebefore%
@@ -2374,12 +2452,12 @@
       \def\@tempc{}%
       \expandafter\ifx\csname #1\endcsname\@tempc\relax%
         \expandafter\def\csname #1\endcsname{\unskip}%
-          %{\advance\count at group -1\reftextcurrent at orig}%
+          %{\advance\count at group -1\relax\reftextcurrent at orig}%
       \else%
         \long\def\@tempc{}%
         \expandafter\ifx\csname #1\endcsname\@tempc\relax%
           \expandafter\def\csname #1\endcsname{\unskip}%
-            %{\advance\count at group -1\reftextcurrent at orig}%
+            %{\advance\count at group -1\relax\reftextcurrent at orig}%
         \fi%
       \fi%
     \else%
@@ -2415,7 +2493,7 @@
   \def\@setcref at middleconjunction{\crefmiddleconjunction}%
   \def\@setcref at lastconjunction{\creflastconjunction}%
   \AtBeginDocument{%
-    \def\@@vpageref#1[#2]#3{\cref@@vpageref{#1}[#2]{#3}}%
+    \let\@@vpageref\cref@@vpageref%
   }%
   \if at cref@hyperrefloaded\relax%  hyperref loaded%
     \DeclareRobustCommand{\vref}{%
@@ -2450,8 +2528,17 @@
     \DeclareRobustCommand{\fullref}{\cref at fullref{cref}}%
     \DeclareRobustCommand{\Fullref}{\cref at fullref{Cref}}%
   \fi%  end of test for hyperref
-}{}%  end of \@ifpackageloaded{varioref}
+}{\let\if at cref@variorefloaded\iffalse}%  end of \@ifpackageloaded{varioref}
+\AtBeginDocument{%
+  \if at cref@variorefloaded\relax\else%
+    \@ifpackageloaded{varioref}{%
+      \PackageError{cleveref}{cleveref must be loaded after varioref!}%
+        {Package load order is wrong: load cleveref *after* varioref.}
+    }{}%
+  \fi}
+\let\if at cref@amsmathloaded\iffalse%
 \@ifpackageloaded{amsmath}{%
+  \let\if at cref@amsmathloaded\iftrue%
   \AtBeginDocument{%
     \let\cref at old@label at in@display\label at in@display%
     \def\label at in@display{%
@@ -2473,7 +2560,7 @@
             \let\math at cr@@@\math at cr@@@align at measure%
             \everycr{\noalign{\global\tag at false%
               \global\let\raise at tag\@empty \global\column@\z@}}%
-            \let\label\@gobble at optarg%  <<< cleveref modification
+            \let\label\cref at gobble@optarg%  <<< cleveref modification
             \global\row@\z@%
             \tabskip\z@%
             \halign{\span\align at preamble\crcr%
@@ -2485,7 +2572,7 @@
         }%
         \restorecounters@%
         \ifodd\maxfields@%
-            \global\advance\maxfields@\@ne%
+            \global\advance\maxfields@\@ne\relax%
         \fi%
         \ifnum\xatlevel@=\tw@%
             \ifnum\maxfields@<\thr@@%
@@ -2496,7 +2583,7 @@
           \unvbox\z@ \unpenalty \global\setbox\@ne\lastbox%
         }%
         \global\totwidth@\wd\@ne%
-        \if at fleqn \global\advance\totwidth@\@mathmargin \fi%
+        \if at fleqn \global\advance\totwidth@\@mathmargin\relax\fi%
         \global\let\maxcolumn at widths\@empty%
         \begingroup%
           \let\or\relax%
@@ -2509,7 +2596,7 @@
           \repeat%
         \endgroup%
         \dimen@\displaywidth%
-        \advance\dimen at -\totwidth@%
+        \advance\dimen at -\totwidth@\relax%
         \ifcase\xatlevel@%
             \global\alignsep@\z@%
             \let\minalignsep\z@%
@@ -2520,34 +2607,34 @@
             \else%
                 \@tempcnta\tw@%
                 \global\eqnshift@\dimen@%
-                \global\divide\eqnshift@\@tempcnta%
+                \global\divide\eqnshift@\@tempcnta\relax%
             \fi%
         \or%
             \@tempcntb\maxfields@%
-            \divide\@tempcntb\tw@%
+            \divide\@tempcntb\tw@\relax%
             \@tempcnta\@tempcntb%
-            \advance\@tempcntb\m at ne%
+            \advance\@tempcntb\m at ne\relax%
             \if at fleqn%
                 \global\eqnshift@\@mathmargin%
                 \global\alignsep@\dimen@%
-                \global\divide\alignsep@\@tempcnta%
+                \global\divide\alignsep@\@tempcnta\relax%
             \else%
-                \global\advance\@tempcnta\@ne%
+                \global\advance\@tempcnta\@ne\relax%
                 \global\eqnshift@\dimen@%
-                \global\divide\eqnshift@\@tempcnta%
+                \global\divide\eqnshift@\@tempcnta\relax%
                 \global\alignsep@\eqnshift@%
             \fi%
         \or%
             \@tempcntb\maxfields@%
-            \divide\@tempcntb\tw@%
-            \global\advance\@tempcntb\m at ne%
-            \global\@tempcnta\@tempcntb%
+            \divide\@tempcntb\tw@\relax%
+            \global\advance\@tempcntb\m at ne\relax%
+            \global\@tempcnta\@tempcntb\relax%
             \global\eqnshift@\z@%
             \global\alignsep@\dimen@%
             \if at fleqn%
                 \global\advance\alignsep@\@mathmargin\relax%
             \fi%
-            \global\divide\alignsep@\@tempcntb%
+            \global\divide\alignsep@\@tempcntb\relax%
         \fi%
         \ifdim\alignsep@<\minalignsep\relax%
             \global\alignsep@\minalignsep\relax%
@@ -2554,9 +2641,9 @@
             \ifdim\eqnshift@>\z@%
                 \if at fleqn\else%
                     \global\eqnshift@\displaywidth%
-                    \global\advance\eqnshift at -\totwidth@%
-                    \global\advance\eqnshift at -\@tempcntb\alignsep@%
-                    \global\divide\eqnshift@\tw@%
+                    \global\advance\eqnshift at -\totwidth@\relax%
+                    \global\advance\eqnshift at -\@tempcntb\alignsep@\relax%
+                    \global\divide\eqnshift@\tw@\relax%
                 \fi%
             \fi%
         \fi%
@@ -2565,19 +2652,19 @@
         \fi%
         \calc at shift@align%
         \global\tagshift@\totwidth@%
-        \global\advance\tagshift@\@tempcntb\alignsep@%
+        \global\advance\tagshift@\@tempcntb\alignsep@\relax%
         \if at fleqn%
             \ifnum\xatlevel@=\tw@%
                 \global\advance\tagshift at -\@mathmargin\relax%
             \fi%
         \else%
-            \global\advance\tagshift@\eqnshift@%
+            \global\advance\tagshift@\eqnshift@\relax%
         \fi%
         \iftagsleft@ \else%
-            \global\advance\tagshift at -\displaywidth%
+            \global\advance\tagshift at -\displaywidth\relax%
         \fi%
         \dimen@\minalignsep\relax%
-        \global\advance\totwidth@\@tempcntb\dimen@%
+        \global\advance\totwidth@\@tempcntb\dimen@\relax%
         \ifdim\totwidth@>\displaywidth%
             \global\let\displaywidth@\totwidth@%
         \else%
@@ -2609,7 +2696,7 @@
         }%
         \restorecounters@%
         \if at fleqn%
-            \global\advance\totwidth@\@mathmargin%
+            \global\advance\totwidth@\@mathmargin\relax%
         \fi%
         \iftagsleft@%
             \ifdim\totwidth@>\displaywidth%
@@ -2622,17 +2709,17 @@
 }%
   \def\multline@#1{%
     \Let@%
-    \@display at init{\global\advance\row@\@ne \global\dspbrk at lvl\m at ne}%
+    \@display at init{\global\advance\row@\@ne\relax\global\dspbrk at lvl\m at ne}%
     \chardef\dspbrk at context\z@%
     \restore at math@cr%
     \let\tag\tag at in@align%
     \global\tag at false \global\let\raise at tag\@empty%
     \mmeasure@{#1}%
-    \let\tag\gobble at tag \let\label\@gobble at optarg%  <<< cleveref modification
+    \let\tag\gobble at tag \let\label\cref at gobble@optarg%  <<< cleveref modification
     \tabskip \if at fleqn \@mathmargin \else \z at skip \fi%
     \totwidth@\displaywidth%
     \if at fleqn%
-        \advance\totwidth at -\@mathmargin%
+        \advance\totwidth at -\@mathmargin\relax%
     \fi%
     \halign\bgroup%
         \hbox to\totwidth@{%
@@ -2669,7 +2756,7 @@
                         \multline at indent%
                     \else%
                         \setbox\z@\hbox{\make at display@tag}%
-                        \dimen@\@mathmargin \advance\dimen at -\wd\z@%
+                        \dimen@\@mathmargin \advance\dimen at -\wd\z@\relax%
                         \ifdim\dimen@<\multlinetaggap%
                           \dimen@\multlinetaggap%
                         \fi%
@@ -2725,11 +2812,11 @@
             }%
             \global\tagwidth@\wdz@%
             \dimen@\totwidth@%
-            \advance\dimen@\tagwidth@%
-            \advance\dimen@\multlinetaggap%
+            \advance\dimen@\tagwidth@\relax%
+            \advance\dimen@\multlinetaggap\relax%
             \iftagsleft@\else%
                 \if at fleqn%
-                    \advance\dimen@\@mathmargin%
+                    \advance\dimen@\@mathmargin\relax%
                 \fi%
             \fi%
             \ifdim\dimen@>\displaywidth%
@@ -2755,10 +2842,10 @@
   \let\cref at old@endsubequations\endsubequations%
   \cref at resetby{equation}{\cref at result}%
   \ifx\cref at result\relax\else%
-    \@addtoreset{parentequation}{\cref at result}%
+    \cref at addtoreset{parentequation}{\cref at result}%
   \fi%
   \renewenvironment{subequations}{%
-    \@addtoreset{equation}{parentequation}%
+    \cref at addtoreset{equation}{parentequation}%
     \let\cref at orig@equation at alias\cref at equation@alias%
     \@ifundefined{cref at subequation@alias}%
       {\crefalias{equation}{subequation}}%
@@ -2791,6 +2878,13 @@
       \toks@\@xp{\p at equation{#1}}%
       \edef\cref at currentlabel{[equation][2147483647][]\the\toks@}}}%
 }{}%  end of \@ifpackageloaded{amsmath}
+\AtBeginDocument{%
+  \if at cref@amsmathloaded\else%
+    \@ifpackageloaded{amsmath}{%
+      \PackageError{cleveref}{cleveref must be loaded after amsmath!}%
+        {Package load order is wrong: load cleveref *after* amsmath.}
+    }{}%
+  \fi}
 \@ifpackageloaded{amsthm}{%
   \PackageInfo{cleveref}{`amsthm' support loaded}%
   \let\cref at thmnoarg\@thm%
@@ -2875,12 +2969,12 @@
     \refstepcounter[#1]{#2}%  <<< cleveref modification
     \theorem at prework%
     \thm at topsepadd \theorempostskipamount%
-    \ifvmode \advance\thm at topsepadd\partopsep\fi%
+    \ifvmode \advance\thm at topsepadd\partopsep\relax\fi%
     \trivlist%
     \@topsep \theorempreskipamount%
     \@topsepadd \thm at topsepadd%
-    \advance\linewidth -\theorem at indent%
-    \advance\@totalleftmargin \theorem at indent%
+    \advance\linewidth -\theorem at indent\relax%
+    \advance\@totalleftmargin \theorem at indent\relax%
     \parshape \@ne \@totalleftmargin \linewidth%
     \@ifnextchar[{\@ythm{#1}{#2}{#3}}{\@xthm{#1}{#2}{#3}}%]
   }%
@@ -2893,18 +2987,31 @@
     \addtocounter{equation}{-1}%
     \cref at orig@@IEEEeqnarray[#1]{#2}}%
   \let\cref at orig@IEEEeqnarrayXCR\@IEEEeqnarrayXCR%
-  \def\@IEEEeqnarrayXCR[#1]{%
-    \if at eqnsw%
-      \if at IEEEissubequation%
-        %\addtocounter{equation}{1}%
-        \refstepcounter{IEEEsubequation}%
-        \addtocounter{IEEEsubequation}{-1}%
-      \else%
-        \refstepcounter{equation}%
-        \addtocounter{equation}{-1}%
+  \@ifundefined{c at IEEEsubequation}{%
+    \def\@IEEEeqnarrayXCR[#1]{%
+      \if at eqnsw%
+        \if at IEEEissubequation%
+          \refstepcounter{IEEEsubequation}%
+          \addtocounter{IEEEsubequation}{-1}%
+        \else%
+          \refstepcounter{equation}%
+          \addtocounter{equation}{-1}%
+        \fi%
       \fi%
-    \fi%
-  \cref at orig@IEEEeqnarrayXCR[#1]}%
+      \cref at orig@IEEEeqnarrayXCR[#1]}%
+  }{
+    \def\@IEEEeqnarrayXCR[#1]{%
+      \if at eqnsw%
+        \ifnum\c at IEEEsubequation>0\relax%
+          \refstepcounter{IEEEsubequation}%
+          \addtocounter{IEEEsubequation}{-1}%
+        \else%
+          \refstepcounter{equation}%
+          \addtocounter{equation}{-1}%
+        \fi%
+      \fi%
+      \cref at orig@IEEEeqnarrayXCR[#1]}%
+  }% end of \@ifundefined{c at IEEEsubequation}
   \let\cref at orig@IEEEyessubnumber\IEEEyessubnumber%
   \def\IEEEyessubnumber{%
     \if at IEEEeqnarrayISinner%
@@ -2914,8 +3021,8 @@
       \fi%
     \fi%
     \cref at orig@IEEEyessubnumber}%
-  \@addtoreset{IEEEsubequation}{equation}%
-  \crefalias{IEEEsubequation}{equation}%
+  \cref at addtoreset{IEEEsubequation}{subequation}%
+  \crefalias{IEEEsubequation}{subequation}%
 }{}% end of \@ifpackageloaded{IEEEtrantools}
 \@ifpackageloaded{breqn}{%
   \PackageInfo{cleveref}{`breqn' support loaded}%
@@ -2924,7 +3031,7 @@
     \cref at old@eq at setnumber%
     \cref at constructprefix{equation}{\cref at result}%
     \protected at xdef\cref at currentlabel{%
-      [equation][\arabic{equation}][\cref at result]\p at equation\theequation}}%
+      [equation][\arabic{equation}][\cref at result]\p at equation\eq at number}}%
 }{}% end of \@ifpackageloaded{breqn}
   \@ifpackageloaded{algorithmicx}{%
   \PackageInfo{cleveref}{`algorithmicx' support loaded}%
@@ -3007,7 +3114,7 @@
     \cref at old@newaliascnt{#1}{#2}%
     \cref at resetby{#2}{\cref at result}%
     \ifx\cref at result\relax\else%
-      \@addtoreset{#1}{\cref at result}%
+      \cref at addtoreset{#1}{\cref at result}%
     \fi}%
   }{}%  end of \@ifpackageloaded{aliascnt}
 \DeclareOption{poorman}{%
@@ -3291,7 +3398,7 @@
       \@tempa#1\@nil}%
     \def\@crefrangenostar#1#2#3{%
       \gdef\cref at poorman@text{}%
-      \@setcrefrange{#2}{#3}{#1}{}%
+      \@@setcrefrange{#2}{#3}{#1}{}%
       \def\@tempa##1##2\@nil{%
         \if##1c%
           \cref at writescript{}{%
@@ -3298,12 +3405,12 @@
             \string\crefrange\string{#2\string}\string{#3\string}}%
         \else%
           \cref at writescript{}{%
-            \string\Crefrange\string{#2\string}\string{#3\string}}%
+            \strinsg\Crefrange\string{#2\string}\string{#3\string}}%
         \fi}%
       \@tempa#1\@nil}%
     \def\@crefrangestar#1#2#3{%
       \gdef\cref at poorman@text{}%
-      \@crefstarredtrue\@setcrefrange{#2}{#3}{#1}{}\@crefstarredfalse%
+      \@crefstarredtrue\@@setcrefrange{#2}{#3}{#1}{}\@crefstarredfalse%
       \def\@tempa##1##2\@nil{%
         \if##1c%
           \cref at writescript{}{%
@@ -3313,31 +3420,9 @@
             \string\Crefrange*\string{#2\string}\string{#3\string}}%
         \fi}%
       \@tempa#1\@nil}%
-    \def\@cpagerefnostar#1#2{%
-      \gdef\cref at poorman@text{}%
-      \@cpageref{#1}{#2}{\@setcpageref}{\@setcpagerefrange}%
-      \def\@tempa##1##2\@nil{%
-        \if##1c%
-          \cref at writescript{}{\string\cpageref\string{#2\string}}%
-        \else%
-          \cref at writescript{}{\string\Cpageref\string{#2\string}}%
-        \fi}%
-      \@tempa#1\@nil}%
-    \def\@cpagerefstar#1#2{%
-      \gdef\cref at poorman@text{}%
-      \@crefstarredtrue%
-      \@cpageref{#1}{#2}{\@setcpageref}{\@setcpagerefrange}%
-      \@crefstarredfalse%
-      \def\@tempa##1##2\@nil{%
-        \if##1c%
-          \cref at writescript{}{\string\cpageref*\string{#2\string}}%
-        \else%
-          \cref at writescript{}{\string\Cpageref*\string{#2\string}}%
-        \fi}%
-      \@tempa#1\@nil}%
     \def\@cpagerefrangenostar#1#2#3{%
       \gdef\cref at poorman@text{}%
-      \@setcpagerefrange{#2}{#3}{#1}{}%
+      \@@setcpagerefrange{#2}{#3}{#1}{}%
       \def\@tempa##1##2\@nil{%
         \if##1c%
           \cref at writescript{}{%
@@ -3350,7 +3435,7 @@
     \def\@cpagerefrangestar#1#2#3{%
       \gdef\cref at poorman@text{}%
       \@crefstarredtrue%
-      \@setcpagerefrange{#2}{#3}{#1}{}%
+      \@@setcpagerefrange{#2}{#3}{#1}{}%
       \@crefstarredfalse%
       \def\@tempa##1##2\@nil{%
         \if##1c%
@@ -3373,12 +3458,12 @@
       \cref at writescript{}{\string\labelcref*\string{#1\string}}}%
     \def\@labelcpagerefnostar#1{%
       \gdef\cref at poorman@text{}%
-      \@cpageref{labelcref}{#1}{\@setcpageref}{\@setcpagerefrange}%
+      \@cref{labelcpageref}{#1}%
       \cref at writescript{}{\string\labelcpageref\string{#1\string}}}%
     \def\@labelcpagerefstar#1{%
       \gdef\cref at poorman@text{}%
       \@crefstarredtrue%
-      \@cpageref{labelcref}{#1}{\@setcpageref}{\@setcpagerefrange}%
+      \@cref{labelcpageref}{#1}%
       \@crefstarredfalse%
       \cref at writescript{}{\string\labelcpageref*\string{#1\string}}}%
   \else%  hyperref not loaded
@@ -3392,30 +3477,30 @@
       \cref at writescript{}{\string\Cref\string{#1\string}}}%
     \DeclareRobustCommand{\crefrange}[2]{%
       \gdef\cref at poorman@text{}%
-      \@setcrefrange{#1}{#2}{cref}{}%
+      \@@setcrefrange{#1}{#2}{cref}{}%
       \cref at writescript{}{%
         \string\crefrange\string{#1\string}\string{#2\string}}}%
     \DeclareRobustCommand{\Crefrange}[2]{%
       \gdef\cref at poorman@text{}%
-      \@setcrefrange{#1}{#2}{Cref}{}%
+      \@@setcrefrange{#1}{#2}{Cref}{}%
       \cref at writescript{}{%
         \string\Crefrange\string{#1\string}\string{#2\string}}}%
     \DeclareRobustCommand{\cpageref}[1]{%
       \gdef\cref at poorman@text{}%
-      \@cpageref{cref}{#1}{\@setcpageref}{\@setcpagerefrange}%
+      \@cref{cpageref}{#1}%
       \cref at writescript{}{\string\cpageref\string{#1\string}}}%
     \DeclareRobustCommand{\Cpageref}[1]{%
       \gdef\cref at poorman@text{}%
-      \@cpageref{Cref}{#1}{\@setcpageref}{\@setcpagerefrange}%
+      \@cref{Cpageref}{#1}%
       \cref at writescript{}{\string\Cpageref\string{#1\string}}}%
     \DeclareRobustCommand{\cpagerefrange}[2]{%
       \gdef\cref at poorman@text{}%
-      \@setcpagerefrange{#1}{#2}{cref}{}%
+      \@@setcpagerefrange{#1}{#2}{cref}{}%
       \cref at writescript{}{%
         \string\cpagerefrange\string{#1\string}\string{#2\string}}}%
     \DeclareRobustCommand{\Cpagerefrange}[2]{%
       \gdef\cref at poorman@text{}%
-      \@setcpagerefrange{#1}{#2}{Cref}{}%
+      \@@setcpagerefrange{#1}{#2}{Cref}{}%
       \cref at writescript{}{%
         \string\Cpagerefrange\string{#1\string}\string{#2\string}}}%
     \DeclareRobustCommand{\labelcref}[1]{%
@@ -3424,7 +3509,7 @@
       \cref at writescript{}{\string\labelcref\string{#1\string}}}%
     \DeclareRobustCommand{\labelcpageref}[1]{%
       \gdef\cref at poorman@text{}%
-      \@cpageref{labelcref}{#1}{\@setcpageref}{\@setcpagerefrange}%
+      \@cref{labelcpageref}{#1}%
       \cref at writescript{}{\string\labelcpageref\string{#1\string}}}%
   \fi%  end of test for hyperref
   \DeclareRobustCommand{\namecref}[1]{%
@@ -3463,13 +3548,13 @@
     \creflastgroupconjunction%
     \expandafter\g at addto@macro\expandafter\cref at poorman@text%
       \expandafter{\creflastgroupconjunction}}%
-  \let\old@@setcref\@@setcref%
-  \let\old@@setcrefrange\@@setcrefrange%
-  \let\old@@setcpageref\@@setcpageref%
-  \let\old@@setcpagerefrange\@@setcpagerefrange%
+  \let\old@@@setcref\@@@setcref%
+  \let\old@@@setcrefrange\@@@setcrefrange%
+  \let\old@@@setcpageref\@@@setcpageref%
+  \let\old@@@setcpagerefrange\@@@setcpagerefrange%
   \if at cref@hyperrefloaded\relax%  hyperref loaded
-    \def\@@setcref#1#2{%
-      \old@@setcref{#1}{#2}%
+    \def\@@@setcref#1#2{%
+      \old@@@setcref{#1}{#2}%
       \if at crefstarred%
         \expandafter\g at addto@macro\expandafter\cref at poorman@text%
           \expandafter{#1{\ref*{#2}}{}{}}%
@@ -3477,8 +3562,8 @@
         \expandafter\g at addto@macro\expandafter\cref at poorman@text%
           \expandafter{#1{\ref{#2}}{}{}}%
       \fi}%
-    \def\@@setcrefrange#1#2#3{%
-      \old@@setcrefrange{#1}{#2}{#3}%
+    \def\@@@setcrefrange#1#2#3{%
+      \old@@@setcrefrange{#1}{#2}{#3}%
       \if at crefstarred%
         \expandafter\g at addto@macro\expandafter\cref at poorman@text%
           \expandafter{#1{\ref*{#2}}{\ref*{#3}}{}{}{}{}}%
@@ -3486,8 +3571,8 @@
         \expandafter\g at addto@macro\expandafter\cref at poorman@text%
           \expandafter{#1{\ref{#2}}{\ref{#3}}{}{}{}{}}%
       \fi}%
-    \def\@@setcpageref#1#2{%
-      \old@@setcpageref{#1}{#2}%
+    \def\@@@setcpageref#1#2{%
+      \old@@@setcpageref{#1}{#2}%
       \if at crefstarred%
         \expandafter\g at addto@macro\expandafter\cref at poorman@text%
           \expandafter{#1{\pageref*{#2}}{}{}}%
@@ -3495,8 +3580,8 @@
         \expandafter\g at addto@macro\expandafter\cref at poorman@text%
           \expandafter{#1{\pageref{#2}}{}{}}%
       \fi}%
-    \def\@@setcpagerefrange#1#2#3{%
-      \old@@setcpagerefrange{#1}{#2}{#3}%
+    \def\@@@setcpagerefrange#1#2#3{%
+      \old@@@setcpagerefrange{#1}{#2}{#3}%
       \if at crefstarred%
         \expandafter\g at addto@macro\expandafter\cref at poorman@text%
           \expandafter{#1{\pageref*{#2}}{\pageref*{#3}}{}{}{}{}}%
@@ -3505,30 +3590,30 @@
           \expandafter{#1{\pageref{#2}}{\pageref{#3}}{}{}{}{}}%
       \fi}%
   \else%  hyperref not loaded
-    \def\@@setcref#1#2{%
-      \old@@setcref{#1}{#2}%
+    \def\@@@setcref#1#2{%
+      \old@@@setcref{#1}{#2}%
       \expandafter\g at addto@macro\expandafter{%
         \expandafter\cref at poorman@text\expandafter}%
         \expandafter{#1{\ref{#2}}{}{}}}%
-    \def\@@setcrefrange#1#2#3{%
-      \old@@setcrefrange{#1}{#2}{#3}%
+    \def\@@@setcrefrange#1#2#3{%
+      \old@@@setcrefrange{#1}{#2}{#3}%
       \expandafter\g at addto@macro%
         \expandafter{\expandafter\cref at poorman@text\expandafter}%
         \expandafter{#1{\ref{#2}}{\ref{#3}}{}{}{}{}}}%
-    \def\@@setcpageref#1#2{%
-      \old@@setcpageref{#1}{#2}%
+    \def\@@@setcpageref#1#2{%
+      \old@@@setcpageref{#1}{#2}%
       \expandafter\g at addto@macro\expandafter{%
         \expandafter\cref at poorman@text\expandafter}%
         \expandafter{#1{\pageref{#2}}{}{}}}%
-    \def\@@setcpagerefrange#1#2#3{%
-      \old@@setcpagerefrange{#1}{#2}{#3}%
+    \def\@@@setcpagerefrange#1#2#3{%
+      \old@@@setcpagerefrange{#1}{#2}{#3}%
       \expandafter\g at addto@macro%
         \expandafter{\expandafter\cref at poorman@text\expandafter}%
         \expandafter{#1{\pageref{#2}}{\pageref{#3}}{}{}{}{}}}%
   \fi%  end of hyperref test
-  \let\old@@setnamecref\@@setnamecref%
-  \def\@@setnamecref#1#2{%
-    \old@@setnamecref{#1}{#2}%
+  \let\old@@@setnamecref\@@@setnamecref%
+  \def\@@@setnamecref#1#2{%
+    \old@@@setnamecref{#1}{#2}%
     \expandafter\def\expandafter\@tempa\expandafter{#1}%
     \def\@tempb{#2}%
     \expandafter\expandafter\expandafter\g at addto@macro%
@@ -3603,16 +3688,16 @@
             \fi%
           \fi}%
         \@tempa#1\@nil}%
-      \def\@@setvpageref#1[#2]#3{%
+      \def\@@@setvpageref#1[#2]#3{%
         \cref at old@@vpageref{#1}[#2]{#3}%
         \g at addto@macro\cref at poorman@text{\vpageref{#3}}}%
-      \def\@@setvpagerefrange[#1]#2#3{%
+      \def\@@@setvpagerefrange[#1]#2#3{%
         \vpagerefrange[#1]{#2}{#3}%
         \g at addto@macro\cref at poorman@text{\vpagerefrange{#2}{#3}}}%
-      \def\@@setfullpageref#1{%
+      \def\@@@setfullpageref#1{%
         \reftextfaraway{#1}%
         \g at addto@macro\cref at poorman@text{\reftextfaraway{#1}}}%
-      \def\@@setfullpagerefrange#1#2{%
+      \def\@@@setfullpagerefrange#1#2{%
         \reftextpagerange{#1}{#2}%
         \g at addto@macro\cref at poorman@text{\reftextpagerange{#1}{#2}}}%
       \def\@setcref at space{ % space here is deliberate
@@ -7163,7 +7248,7 @@
       \crefname{subfigure}{Figur}{Figur}%
     \fi%
     \crefname{page}{Sida}{Sida}%
-    \crefname{table}{Tablell}{Tabell}%
+    \crefname{table}{Tabell}{Tabell}%
     \crefname{subtable}{Tabell}{Tabell}%
     \crefname{part}{Del}{Del}%
     \crefname{chapter}{Kapitel}{Kapitel}%
@@ -7205,7 +7290,7 @@
       \crefname{subfigure}{figur}{figur}%
       \crefname{page}{sida}{sida}%
     \fi%
-    \crefname{table}{tablell}{tabell}%
+    \crefname{table}{tabell}{tabell}%
     \crefname{subtable}{tabell}{tabell}%
     \crefname{part}{del}{del}%
     \crefname{chapter}{kapitel}{kapitel}%
@@ -7458,6 +7543,207 @@
     \crefname{listing}{listagem}{listagens}%
     \crefname{line}{linha}{linhas}%
   \fi}% end \cref at addlangagedefs
+\DeclareOption{catalan}{%
+  \AtBeginDocument{%
+    \def\crefrangeconjunction at preamble{ a\nobreakspace}%
+    \def\crefrangepreconjunction at preamble{}%
+    \def\crefrangepostconjunction at preamble{}%
+    \def\crefpairconjunction at preamble{ i\nobreakspace}%
+    \def\crefmiddleconjunction at preamble{, }%
+    \def\creflastconjunction at preamble{ i\nobreakspace}%
+    \def\crefpairgroupconjunction at preamble{ i\nobreakspace}%
+    \def\crefmiddlegroupconjunction at preamble{, }%
+    \def\creflastgroupconjunction at preamble{ i\nobreakspace}%
+ %
+    \Crefname at preamble{equation}{Equaci\'o}{Equacions}%
+    \Crefname at preamble{figure}{Gr\`afic}{Gr\`afics}%
+    \Crefname at preamble{table}{Taula}{Taules}%
+    \Crefname at preamble{page}{P\`agina}{P\`agines}%
+    \Crefname at preamble{part}{Part}{Parts}%
+    \Crefname at preamble{chapter}{Cap\'itol}{Cap\'itols}%
+    \Crefname at preamble{section}{Secci\'o}{Seccions}%
+    \Crefname at preamble{appendix}{Ap\`endix}{Ap\`endixs}%
+    \Crefname at preamble{enumi}{Punt}{Punts}%
+    \Crefname at preamble{footnote}{Nota}{Notes}%
+    \Crefname at preamble{theorem}{Teorema}{Teoremes}%
+    \Crefname at preamble{lemma}{Lema}{Lemes}%
+    \Crefname at preamble{corollary}{Coro\lgem ari}{Coro\lgem aris}%
+    \Crefname at preamble{proposition}{Proposici\'o}{Proposicions}%
+    \Crefname at preamble{definition}{Definici\'o}{Definicions}%
+    \Crefname at preamble{result}{Resultat}{Resultats}%
+    \Crefname at preamble{example}{Exemple}{Exemples}%
+    \Crefname at preamble{remark}{Observaci\'o}{Observacions}%
+    \Crefname at preamble{note}{Nota}{Notes}%
+    \Crefname at preamble{algorithm}{Algorisme}{Algorismes}%
+    \Crefname at preamble{listing}{Llistat}{Llistats}%
+    \Crefname at preamble{line}{L\'inia}{L\'inies}%
+ %
+    \if at cref@capitalise%  capitalise set
+      \crefname at preamble{equation}{Equaci\'o}{Equacions}%
+      \crefname at preamble{figure}{Gr\`afic}{Gr\`afics}%
+      \crefname at preamble{table}{Taula}{Taules}%
+      \crefname at preamble{page}{P\`agina}{P\`agines}%
+      \crefname at preamble{part}{Part}{Parts}%
+      \crefname at preamble{chapter}{Cap\'itol}{Cap\'itols}%
+      \crefname at preamble{section}{Secci\'o}{Seccions}%
+      \crefname at preamble{appendix}{Ap\`endix}{Ap\`endixs}%
+      \crefname at preamble{enumi}{Punt}{Punts}%
+      \crefname at preamble{footnote}{Nota}{Notes}%
+      \crefname at preamble{theorem}{Teorema}{Teoremes}%
+      \crefname at preamble{lemma}{Lema}{Lemes}%
+      \crefname at preamble{corollary}{Coro\lgem ari}{Coro\lgem aris}%
+      \crefname at preamble{proposition}{Proposici\'o}{Proposicions}%
+      \crefname at preamble{definition}{Definici\'o}{Definicions}%
+      \crefname at preamble{result}{Resultat}{Resultats}%
+      \crefname at preamble{example}{Exemple}{Exemples}%
+      \crefname at preamble{remark}{Observaci\'o}{Observacions}%
+      \crefname at preamble{note}{Nota}{Notes}%
+      \crefname at preamble{algorithm}{Algorisme}{Algorismes}%
+      \crefname at preamble{listing}{Llistat}{Llistats}%
+      \crefname at preamble{line}{L\'inia}{L\'inies}%
+ %
+    \else%  capitalise unset
+      \crefname at preamble{equation}{equaci\'o}{equacions}%
+      \crefname at preamble{figure}{gr\`afic}{gr\`afics}%
+      \crefname at preamble{table}{taula}{taules}%
+      \crefname at preamble{page}{p\`agina}{p\`agines}%
+      \crefname at preamble{part}{part}{parts}%
+      \crefname at preamble{chapter}{cap\'itol}{cap\'itols}%
+      \crefname at preamble{section}{secci\'o}{seccions}%
+      \crefname at preamble{appendix}{ap\`endix}{ap\`endixs}%
+      \crefname at preamble{enumi}{punt}{punts}%
+      \crefname at preamble{footnote}{nota}{notes}%
+      \crefname at preamble{theorem}{teorema}{teoremes}%
+      \crefname at preamble{lemma}{lema}{lemes}%
+      \crefname at preamble{corollary}{coro\lgem ari}{coro\lgem aris}%
+      \crefname at preamble{proposition}{proposici\'o}{proposicions}%
+      \crefname at preamble{definition}{definici\'o}{definicions}%
+      \crefname at preamble{result}{resultat}{resultats}%
+      \crefname at preamble{example}{exemple}{exemples}%
+      \crefname at preamble{remark}{observaci\'o}{observacions}%
+      \crefname at preamble{note}{nota}{notes}%
+      \crefname at preamble{algorithm}{algorisme}{algorismes}%
+      \crefname at preamble{listing}{llistat}{llistats}%
+      \crefname at preamble{line}{l\'inia}{l\'inies}%
+    \fi%
+    \def\cref at language{catalan}%
+  }}% end \AtBeginDocument and \DeclareOption
+\cref at addlanguagedefs{catalan}{%
+  \PackageInfo{cleveref}{loaded `catalan language definitions}%
+  \renewcommand{\crefrangeconjunction}{ a\nobreakspace}%
+  \renewcommand{\crefrangepreconjunction}{}%
+  \renewcommand{\crefrangepostconjunction}{}%
+  \renewcommand{\crefpairconjunction}{ i\nobreakspace}%
+  \renewcommand{\crefmiddleconjunction}{, }%
+  \renewcommand{\creflastconjunction}{ i\nobreakspace}%
+  \renewcommand{\crefpairgroupconjunction}{ i\nobreakspace}%
+  \renewcommand{\crefmiddlegroupconjunction}{, }%
+  \renewcommand{\creflastgroupconjunction}{ i\nobreakspace}%
+ %
+  \Crefname{equation}{Equaci\'o}{Equacions}%
+  \Crefname{figure}{Gr\`afic}{Gr\`afics}%
+  \Crefname{subfigure}{Gr\`afic}{Gr\`afics}%
+  \Crefname{table}{Taula}{Taules}%
+  \Crefname{subtable}{Taula}{Taules}%
+  \Crefname{page}{P\`agina}{P\`aginas}%
+  \Crefname{part}{Part}{Parts}%
+  \Crefname{chapter}{Cap\'itol}{Cap\'itols}%
+  \Crefname{section}{Secci\'o}{Seccions}%
+  \Crefname{subsection}{Secci\'o}{Seccions}%
+  \Crefname{subsubsection}{Secci\'o}{Seccions}%
+  \Crefname{appendix}{Ap\`endix}{Ap\`endixs}%
+  \Crefname{subappendix}{Ap\`endix}{Ap\`endixs}%
+  \Crefname{subsubappendix}{Ap\`endix}{Ap\`endixs}%
+  \Crefname{subsubsubappendix}{Ap\`endix}{Ap\`endixs}%
+  \Crefname{enumi}{Punt}{Punts}%
+  \Crefname{enumii}{Punt}{Punts}%
+  \Crefname{enumiii}{Punt}{Punts}%
+  \Crefname{enumiv}{Punt}{Punts}%
+  \Crefname{enumv}{Punt}{Punts}%
+  \Crefname{footnote}{Nota}{Notes}%
+  \Crefname{theorem}{Teorema}{Teoremes}%
+  \Crefname{lemma}{Lema}{Lemes}%
+  \Crefname{corollary}{Coro\lgem ari}{Coro\lgem aris}%
+  \Crefname{proposition}{Proposici\'o}{Proposicions}%
+  \Crefname{definition}{Definici\'o}{Definicions}%
+  \Crefname{result}{Resultat}{Resultats}%
+  \Crefname{example}{Exemple}{Exemples}%
+  \Crefname{remark}{Observaci\'o}{Observacions}%
+  \Crefname{note}{Nota}{Notes}%
+  \Crefname{algorithm}{Algorisme}{Algorismes}%
+  \Crefname{listing}{Llistat}{Llistats}%
+  \Crefname{line}{L\'inia}{L\'inies}%
+ %
+  \if at cref@capitalise%  capitalise set
+    \crefname{equation}{Equaci\'o}{Equacions}%
+    \crefname{figure}{Gr\`afic}{Gr\`afics}%
+    \crefname{subfigure}{Gr\`afic}{Gr\`afics}%
+    \crefname{table}{Taula}{Taules}%
+    \crefname{subtable}{Taula}{Taules}%
+    \crefname{page}{P\`agina}{P\`aginas}%
+    \crefname{part}{Part}{Parts}%
+    \crefname{chapter}{Cap\'itol}{Cap\'itols}%
+    \crefname{section}{Secci\'o}{Seccions}%
+    \crefname{subsection}{Secci\'o}{Seccions}%
+    \crefname{subsubsection}{Secci\'o}{Seccions}%
+    \crefname{appendix}{Ap\`endix}{Ap\`endixs}%
+    \crefname{subappendix}{Ap\`endix}{Ap\`endixs}%
+    \crefname{subsubappendix}{Ap\`endix}{Ap\`endixs}%
+    \crefname{subsubsubappendix}{Ap\`endix}{Ap\`endixs}%
+    \crefname{enumi}{Punt}{Punts}%
+    \crefname{enumii}{Punt}{Punts}%
+    \crefname{enumiii}{Punt}{Punts}%
+    \crefname{enumiv}{Punt}{Punts}%
+    \crefname{enumv}{Punt}{Punts}%
+    \crefname{footnote}{Nota}{Notes}%
+    \crefname{theorem}{Teorema}{Teoremes}%
+    \crefname{lemma}{Lema}{Lemes}%
+    \crefname{corollary}{Coro\lgem ari}{Coro\lgem aris}%
+    \crefname{proposition}{Proposici\'o}{Proposicions}%
+    \crefname{definition}{Definici\'o}{Definicions}%
+    \crefname{result}{Resultat}{Resultats}%
+    \crefname{example}{Exemple}{Exemples}%
+    \crefname{remark}{Observaci\'o}{Observacions}%
+    \crefname{note}{Nota}{Notes}%
+    \crefname{algorithm}{Algorisme}{Algorismes}%
+    \crefname{listing}{Llistat}{Llistats}%
+    \crefname{line}{L\'inia}{L\'inies}%
+ %
+  \else%  capitalise unset
+    \crefname{equation}{equaci\'o}{equacions}%
+    \crefname{figure}{gr\`afic}{gr\`afics}%
+    \crefname{subfigure}{gr\`afic}{gr\`afics}%
+    \crefname{table}{taula}{taules}%
+    \crefname{subtable}{taula}{taules}%
+    \crefname{page}{p\`agina}{p\`aginas}%
+    \crefname{part}{part}{parts}%
+    \crefname{chapter}{cap\'itol}{cap\'itols}%
+    \crefname{section}{secci\'o}{seccions}%
+    \crefname{subsection}{secci\'o}{seccions}%
+    \crefname{subsubsection}{secci\'o}{seccions}%
+    \crefname{appendix}{ap\`endix}{ap\`endixs}%
+    \crefname{subappendix}{ap\`endix}{ap\`endixs}%
+    \crefname{subsubappendix}{ap\`endix}{ap\`endixs}%
+    \crefname{subsubsubappendix}{ap\`endix}{ap\`endixs}%
+    \crefname{enumi}{punt}{punts}%
+    \crefname{enumii}{punt}{punts}%
+    \crefname{enumiii}{punt}{punts}%
+    \crefname{enumiv}{punt}{punts}%
+    \crefname{enumv}{punt}{punts}%
+    \crefname{footnote}{nota}{notes}%
+    \crefname{theorem}{teorema}{teoremes}%
+    \crefname{lemma}{lema}{lemes}%
+    \crefname{corollary}{coro\lgem ari}{coro\lgem aris}%
+    \crefname{proposition}{proposici\'o}{proposicions}%
+    \crefname{definition}{definici\'o}{definicions}%
+    \crefname{result}{resultat}{resultats}%
+    \crefname{example}{exemple}{exemples}%
+    \crefname{remark}{observaci\'o}{observacions}%
+    \crefname{note}{nota}{notes}%
+    \crefname{algorithm}{algorisme}{algorismes}%
+    \crefname{listing}{llistat}{llistats}%
+    \crefname{line}{l\'inia}{l\'inies}%
+  \fi}% end \cref at loadlanguagedefs
 \edef\@curroptions{\@ptionlist{\@currname.\@currext}}%
 \@expandtwoargs\in@{,capitalise,}{%
   ,\@classoptionslist,\@curroptions,}%
@@ -7481,7 +7767,6 @@
 \else%
   \creflabelformat{equation}{\textup{(#2#1#3)}}%
 \fi%
-\@labelcrefdefinedefaultformats%
 \@ifpackageloaded{polyglossia}%
   {\ifcsdef{languagename}%
     {\ExecuteOptions{\languagename}}%
@@ -7674,750 +7959,19 @@
         \expandafter{\@tempa}}}{}%
     \cref at stack@pop{\@tempstack}%
     \cref at isstackfull{\@tempstack}}%
-    \@ifundefined{cref at subsection@name}{%
-      \let\cref at subsection@name\cref at section@name%
-        \let\cref at subsection@name at plural\cref at section@name at plural}{}%
-    \@ifundefined{Cref at subsection@name}{%
-      \let\Cref at subsection@name\Cref at section@name%
-        \let\Cref at subsection@name at plural\Cref at section@name at plural}{}%
-    \@ifundefined{cref at subsection@format}{%
-      \let\cref at subsection@format\cref at section@format}{}%
-    \@ifundefined{Cref at subsection@format}{%
-      \let\Cref at subsection@format\Cref at section@format}{}%
-    \@ifundefined{crefrange at subsection@format}{%
-      \let\crefrange at subsection@format%
-        \crefrange at section@format}{}%
-    \@ifundefined{Crefrange at subsection@format}{%
-      \let\Crefrange at subsection@format%
-        \Crefrange at section@format}{}%
-    \@ifundefined{cref at subsection@format at first}{%
-      \let\cref at subsection@format at first%
-        \cref at section@format at first}{}%
-    \@ifundefined{Cref at subsection@format at first}{%
-      \let\Cref at subsection@format at first%
-        \Cref at section@format at first}{}%
-    \@ifundefined{cref at subsection@format at second}{%
-      \let\cref at subsection@format at second%
-        \cref at section@format at second}{}%
-    \@ifundefined{Cref at subsection@format at second}{%
-      \let\Cref at subsection@format at second%
-        \Cref at section@format at second}{}%
-    \@ifundefined{cref at subsection@format at middle}{%
-      \let\cref at subsection@format at middle%
-        \cref at section@format at middle}{}%
-    \@ifundefined{Cref at subsection@format at middle}{%
-      \let\Cref at subsection@format at middle%
-        \Cref at section@format at middle}{}%
-    \@ifundefined{cref at subsection@format at last}{%
-      \let\cref at subsection@format at last%
-        \cref at section@format at last}{}%
-    \@ifundefined{Cref at subsection@format at last}{%
-      \let\Cref at subsection@format at last%
-        \Cref at section@format at last}{}%
-    \@ifundefined{crefrange at subsection@format at first}{%
-      \let\crefrange at subsection@format at first%
-        \crefrange at section@format at first}{}%
-    \@ifundefined{Crefrange at subsection@format at first}{%
-      \let\Crefrange at subsection@format at first%
-        \Crefrange at section@format at first}{}%
-    \@ifundefined{crefrange at subsection@format at second}{%
-      \let\crefrange at subsection@format at second%
-        \crefrange at section@format at second}{}%
-    \@ifundefined{Crefrange at subsection@format at second}{%
-      \let\Crefrange at subsection@format at second%
-        \Crefrange at section@format at second}{}%
-    \@ifundefined{crefrange at subsection@format at middle}{%
-      \let\crefrange at subsection@format at middle%
-        \crefrange at section@format at middle}{}%
-    \@ifundefined{Crefrange at subsection@format at middle}{%
-      \let\Crefrange at subsection@format at middle%
-        \Crefrange at section@format at middle}{}%
-    \@ifundefined{crefrange at subsection@format at last}{%
-      \let\crefrange at subsection@format at last%
-        \crefrange at section@format at last}{}%
-    \@ifundefined{Crefrange at subsection@format at last}{%
-      \let\Crefrange at subsection@format at last%
-        \Crefrange at section@format at last}{}%
-    \@ifundefined{cref at subsubsection@name}{%
-      \let\cref at subsubsection@name\cref at section@name%
-        \let\cref at subsubsection@name at plural\cref at section@name at plural}{}%
-    \@ifundefined{Cref at subsection@name}{%
-      \let\Cref at subsection@name\Cref at section@name%
-        \let\Cref at subsection@name at plural\Cref at section@name at plural}{}%
-    \@ifundefined{cref at subsubsection@format}{%
-      \let\cref at subsubsection@format%
-        \cref at subsection@format}{}%
-    \@ifundefined{Cref at subsubsection@format}{%
-      \let\Cref at subsubsection@format%
-        \Cref at subsection@format}{}%
-    \@ifundefined{crefrange at subsubsection@format}{%
-      \let\crefrange at subsubsection@format%
-        \crefrange at subsection@format}{}%
-    \@ifundefined{Crefrange at subsubsection@format}{%
-      \let\Crefrange at subsubsection@format%
-        \Crefrange at subsection@format}{}%
-    \@ifundefined{cref at subsubsection@format at first}{%
-      \let\cref at subsubsection@format at first%
-        \cref at subsection@format at first}{}%
-    \@ifundefined{Cref at subsubsection@format at first}{%
-      \let\Cref at subsubsection@format at first%
-        \Cref at subsection@format at first}{}%
-    \@ifundefined{cref at subsubsection@format at second}{%
-      \let\cref at subsubsection@format at second%
-        \cref at subsection@format at second}{}%
-    \@ifundefined{Cref at subsubsection@format at second}{%
-      \let\Cref at subsubsection@format at second%
-        \Cref at subsection@format at second}{}%
-    \@ifundefined{cref at subsubsection@format at middle}{%
-      \let\cref at subsubsection@format at middle%
-        \cref at subsection@format at middle}{}%
-    \@ifundefined{Cref at subsubsection@format at middle}{%
-      \let\Cref at subsubsection@format at middle%
-        \Cref at subsection@format at middle}{}%
-    \@ifundefined{cref at subsubsection@format at last}{%
-      \let\cref at subsubsection@format at last%
-        \cref at subsection@format at last}{}%
-    \@ifundefined{Cref at subsubsection@format at last}{%
-      \let\Cref at subsubsection@format at last%
-        \Cref at subsection@format at last}{}%
-    \@ifundefined{crefrange at subsubsection@format at first}{%
-      \let\crefrange at subsubsection@format at first%
-        \crefrange at subsection@format at first}{}%
-    \@ifundefined{Crefrange at subsubsection@format at first}{%
-      \let\Crefrange at subsubsection@format at first%
-        \Crefrange at subsection@format at first}{}%
-    \@ifundefined{crefrange at subsubsection@format at second}{%
-      \let\crefrange at subsubsection@format at second%
-        \crefrange at subsection@format at second}{}%
-    \@ifundefined{Crefrange at subsubsection@format at second}{%
-      \let\Crefrange at subsubsection@format at second%
-        \Crefrange at subsection@format at second}{}%
-    \@ifundefined{crefrange at subsubsection@format at middle}{%
-      \let\crefrange at subsubsection@format at middle%
-        \crefrange at subsection@format at middle}{}%
-    \@ifundefined{Crefrange at subsubsection@format at middle}{%
-      \let\Crefrange at subsubsection@format at middle%
-        \Crefrange at subsection@format at middle}{}%
-    \@ifundefined{crefrange at subsubsection@format at last}{%
-      \let\crefrange at subsubsection@format at last%
-        \crefrange at subsection@format at last}{}%
-    \@ifundefined{Crefrange at subsubsection@format at last}{%
-      \let\Crefrange at subsubsection@format at last%
-        \Crefrange at subsection@format at last}{}%
-    \@ifundefined{cref at subappendix@name}{%
-      \let\cref at subappendix@name\cref at appendix@name%
-      \let\cref at subappendix@name at plural%
-        \cref at appendix@name at plural}{}%
-    \@ifundefined{Cref at subappendix@name}{%
-      \let\Cref at subappendix@name\Cref at section@name%
-      \let\Cref at subappendixsection@name at plural%
-        \Cref at appendix@name at plural}{}%
-    \@ifundefined{cref at subappendix@format}{%
-      \let\cref at subappendix@format\cref at appendix@format}{}%
-    \@ifundefined{Cref at subappendix@format}{%
-      \let\Cref at subappendix@format\Cref at appendix@format}{}%
-    \@ifundefined{crefrange at subappendix@format}{%
-      \let\crefrange at subappendix@format%
-        \crefrange at appendix@format}{}%
-    \@ifundefined{Crefrange at subappendix@format}{%
-      \let\Crefrange at subappendix@format%
-        \Crefrange at appendix@format}{}%
-    \@ifundefined{cref at subappendix@format at first}{%
-      \let\cref at subappendix@format at first%
-        \cref at appendix@format at first}{}%
-    \@ifundefined{Cref at subappendix@format at first}{%
-      \let\Cref at subappendix@format at first%
-        \Cref at appendix@format at first}{}%
-    \@ifundefined{cref at subappendix@format at second}{%
-      \let\cref at subappendix@format at second%
-        \cref at appendix@format at second}{}%
-    \@ifundefined{Cref at subappendix@format at second}{%
-      \let\Cref at subappendix@format at second%
-        \Cref at appendix@format at second}{}%
-    \@ifundefined{cref at subappendix@format at middle}{%
-      \let\cref at subappendix@format at middle%
-        \cref at appendix@format at middle}{}%
-    \@ifundefined{Cref at subappendix@format at middle}{%
-      \let\Cref at subappendix@format at middle%
-        \Cref at appendix@format at middle}{}%
-    \@ifundefined{cref at subappendix@format at last}{%
-      \let\cref at subappendix@format at last%
-        \cref at appendix@format at last}{}%
-    \@ifundefined{Cref at subappendix@format at last}{%
-      \let\Cref at subappendix@format at last%
-        \Cref at appendix@format at last}{}%
-    \@ifundefined{crefrange at subappendix@format at first}{%
-      \let\crefrange at subappendix@format at first%
-        \crefrange at appendix@format at first}{}%
-    \@ifundefined{Crefrange at subappendix@format at first}{%
-      \let\Crefrange at subappendix@format at first%
-        \Crefrange at appendix@format at first}{}%
-    \@ifundefined{crefrange at subappendix@format at second}{%
-      \let\crefrange at subappendix@format at second%
-        \crefrange at appendix@format at second}{}%
-    \@ifundefined{Crefrange at subappendix@format at second}{%
-      \let\Crefrange at subappendix@format at second%
-        \Crefrange at appendix@format at second}{}%
-    \@ifundefined{crefrange at subappendix@format at middle}{%
-      \let\crefrange at subappendix@format at middle%
-        \crefrange at appendix@format at middle}{}%
-    \@ifundefined{Crefrange at subappendix@format at middle}{%
-      \let\Crefrange at subappendix@format at middle%
-        \Crefrange at appendix@format at middle}{}%
-    \@ifundefined{crefrange at subappendix@format at last}{%
-      \let\crefrange at subappendix@format at last%
-        \crefrange at appendix@format at last}{}%
-    \@ifundefined{Crefrange at subappendix@format at last}{%
-      \let\Crefrange at subappendix@format at last%
-        \Crefrange at appendix@format at last}{}%
-    \@ifundefined{cref at subsubappendix@name}{%
-      \let\cref at subsubappendix@name\cref at appendix@name%
-      \let\cref at subsubappendix@name at plural%
-        \cref at appendix@name at plural}{}%
-    \@ifundefined{Cref at subsubappendix@name}{%
-      \let\Cref at subsubappendix@name\Cref at section@name%
-      \let\Cref at subsubappendixsection@name at plural%
-        \Cref at appendix@name at plural}{}%
-    \@ifundefined{cref at subsubappendix@format}{%
-      \let\cref at subsubappendix@format%
-        \cref at subappendix@format}{}%
-    \@ifundefined{Cref at subsubappendix@format}{%
-      \let\Cref at subsubappendix@format%
-        \Cref at subappendix@format}{}%
-    \@ifundefined{crefrange at subsubappendix@format}{%
-      \let\crefrange at subsubappendix@format%
-        \crefrange at subappendix@format}{}%
-    \@ifundefined{Crefrange at subsubappendix@format}{%
-      \let\Crefrange at subsubappendix@format%
-        \Crefrange at subappendix@format}{}%
-    \@ifundefined{cref at subsubappendix@format at first}{%
-      \let\cref at subsubappendix@format at first%
-        \cref at subappendix@format at first}{}%
-    \@ifundefined{Cref at subsubappendix@format at first}{%
-      \let\Cref at subsubappendix@format at first%
-        \Cref at subappendix@format at first}{}%
-    \@ifundefined{cref at subsubappendix@format at second}{%
-      \let\cref at subsubappendix@format at second%
-        \cref at subappendix@format at second}{}%
-    \@ifundefined{Cref at subsubappendix@format at second}{%
-      \let\Cref at subsubappendix@format at second%
-        \Cref at subappendix@format at second}{}%
-    \@ifundefined{cref at subsubappendix@format at middle}{%
-      \let\cref at subsubappendix@format at middle%
-        \cref at subappendix@format at middle}{}%
-    \@ifundefined{Cref at subsubappendix@format at middle}{%
-      \let\Cref at subsubappendix@format at middle%
-        \Cref at subappendix@format at middle}{}%
-    \@ifundefined{cref at subsubappendix@format at last}{%
-      \let\cref at subsubappendix@format at last%
-        \cref at subappendix@format at last}{}%
-    \@ifundefined{Cref at subsubappendix@format at last}{%
-      \let\Cref at subsubappendix@format at last%
-        \Cref at subappendix@format at last}{}%
-    \@ifundefined{crefrange at subsubappendix@format at first}{%
-      \let\crefrange at subsubappendix@format at first%
-        \crefrange at subappendix@format at first}{}%
-    \@ifundefined{Crefrange at subsubappendix@format at first}{%
-      \let\Crefrange at subsubappendix@format at first%
-        \Crefrange at subappendix@format at first}{}%
-    \@ifundefined{crefrange at subsubappendix@format at second}{%
-      \let\crefrange at subsubappendix@format at second%
-        \crefrange at subappendix@format at second}{}%
-    \@ifundefined{Crefrange at subsubappendix@format at second}{%
-      \let\Crefrange at subsubappendix@format at second%
-        \Crefrange at subappendix@format at second}{}%
-    \@ifundefined{crefrange at subsubappendix@format at middle}{%
-      \let\crefrange at subsubappendix@format at middle%
-        \crefrange at subappendix@format at middle}{}%
-    \@ifundefined{Crefrange at subsubappendix@format at middle}{%
-      \let\Crefrange at subsubappendix@format at middle%
-        \Crefrange at subappendix@format at middle}{}%
-    \@ifundefined{crefrange at subsubappendix@format at last}{%
-      \let\crefrange at subsubappendix@format at last%
-        \crefrange at subappendix@format at last}{}%
-    \@ifundefined{Crefrange at subsubappendix@format at last}{%
-      \let\Crefrange at subsubappendix@format at last%
-        \Crefrange at subappendix@format at last}{}%
-    \@ifundefined{cref at subsubsubappendix@format}{%
-      \let\cref at subsubsubappendix@format%
-        \cref at subsubappendix@format}{}%
-    \@ifundefined{Cref at subsubsubappendix@format}{%
-      \let\Cref at subsubsubappendix@format%
-        \Cref at subsubappendix@format}{}%
-    \@ifundefined{crefrange at subsubsubappendix@format}{%
-      \let\crefrange at subsubsubappendix@format%
-        \crefrange at subsubappendix@format}{}%
-    \@ifundefined{Crefrange at subsubsubappendix@format}{%
-      \let\Crefrange at subsubsubappendix@format%
-        \Crefrange at subsubappendix@format}{}%
-    \@ifundefined{cref at subsubsubappendix@format at first}{%
-      \let\cref at subsubsubappendix@format at first%
-        \cref at subsubappendix@format at first}{}%
-    \@ifundefined{Cref at subsubsubappendix@format at first}{%
-      \let\Cref at subsubsubappendix@format at first%
-        \Cref at subsubappendix@format at first}{}%
-    \@ifundefined{cref at subsubsubappendix@format at second}{%
-      \let\cref at subsubsubappendix@format at second%
-        \cref at subsubappendix@format at second}{}%
-    \@ifundefined{Cref at subsubsubappendix@format at second}{%
-      \let\Cref at subsubsubappendix@format at second%
-        \Cref at subsubappendix@format at second}{}%
-    \@ifundefined{cref at subsubsubappendix@format at middle}{%
-      \let\cref at subsubsubappendix@format at middle%
-        \cref at subsubappendix@format at middle}{}%
-    \@ifundefined{Cref at subsubsubappendix@format at middle}{%
-      \let\Cref at subsubsubappendix@format at middle%
-        \Cref at subsubappendix@format at middle}{}%
-    \@ifundefined{cref at subsubsubappendix@format at last}{%
-      \let\cref at subsubsubappendix@format at last%
-        \cref at subsubappendix@format at last}{}%
-    \@ifundefined{Cref at subsubsubappendix@format at last}{%
-      \let\Cref at subsubsubappendix@format at last%
-        \Cref at subsubappendix@format at last}{}%
-    \@ifundefined{crefrange at subsubsubappendix@format at first}{%
-      \let\crefrange at subsubsubappendix@format at first%
-        \crefrange at subsubappendix@format at first}{}%
-    \@ifundefined{Crefrange at subsubsubappendix@format at first}{%
-      \let\Crefrange at subsubsubappendix@format at first%
-        \Crefrange at subsubappendix@format at first}{}%
-    \@ifundefined{crefrange at subsubsubappendix@format at second}{%
-      \let\crefrange at subsubsubappendix@format at second%
-        \crefrange at subsubappendix@format at second}{}%
-    \@ifundefined{Crefrange at subsubsubappendix@format at second}{%
-      \let\Crefrange at subsubsubappendix@format at second%
-        \Crefrange at subsubappendix@format at second}{}%
-    \@ifundefined{crefrange at subsubsubappendix@format at middle}{%
-      \let\crefrange at subsubsubappendix@format at middle%
-        \crefrange at subsubappendix@format at middle}{}%
-    \@ifundefined{Crefrange at subsubsubappendix@format at middle}{%
-      \let\Crefrange at subsubsubappendix@format at middle%
-        \Crefrange at subsubappendix@format at middle}{}%
-    \@ifundefined{crefrange at subsubsubappendix@format at last}{%
-      \let\crefrange at subsubsubappendix@format at last%
-        \crefrange at subsubappendix@format at last}{}%
-    \@ifundefined{Crefrange at subsubsubappendix@format at last}{%
-      \let\Crefrange at subsubsubappendix@format at last%
-        \Crefrange at subsubappendix@format at last}{}%
-    \@ifundefined{cref at subfigure@format}{%
-      \let\cref at subfigure@format%
-        \cref at figure@format}{}%
-    \@ifundefined{Cref at subfigure@format}{%
-      \let\Cref at subfigure@format%
-        \Cref at figure@format}{}%
-    \@ifundefined{crefrange at subfigure@format}{%
-      \let\crefrange at subfigure@format%
-        \crefrange at figure@format}{}%
-    \@ifundefined{Crefrange at subfigure@format}{%
-      \let\Crefrange at subfigure@format%
-        \Crefrange at figure@format}{}%
-    \@ifundefined{cref at subfigure@format at first}{%
-      \let\cref at subfigure@format at first%
-        \cref at figure@format at first}{}%
-    \@ifundefined{Cref at subfigure@format at first}{%
-      \let\Cref at subfigure@format at first%
-        \Cref at figure@format at first}{}%
-    \@ifundefined{cref at subfigure@format at second}{%
-      \let\cref at subfigure@format at second%
-        \cref at figure@format at second}{}%
-    \@ifundefined{Cref at subfigure@format at second}{%
-      \let\Cref at subfigure@format at second%
-        \Cref at figure@format at second}{}%
-    \@ifundefined{cref at subfigure@format at middle}{%
-      \let\cref at subfigure@format at middle%
-        \cref at figure@format at middle}{}%
-    \@ifundefined{Cref at subfigure@format at middle}{%
-      \let\Cref at subfigure@format at middle%
-        \Cref at figure@format at middle}{}%
-    \@ifundefined{cref at subfigure@format at last}{%
-      \let\cref at subfigure@format at last%
-        \cref at figure@format at last}{}%
-    \@ifundefined{Cref at subfigure@format at last}{%
-      \let\Cref at subfigure@format at last%
-        \Cref at figure@format at last}{}%
-    \@ifundefined{crefrange at subfigure@format at first}{%
-      \let\crefrange at subfigure@format at first%
-        \crefrange at figure@format at first}{}%
-    \@ifundefined{Crefrange at subfigure@format at first}{%
-      \let\Crefrange at subfigure@format at first%
-        \Crefrange at figure@format at first}{}%
-    \@ifundefined{crefrange at subfigure@format at second}{%
-      \let\crefrange at subfigure@format at second%
-        \crefrange at figure@format at second}{}%
-    \@ifundefined{Crefrange at subfigure@format at second}{%
-      \let\Crefrange at subfigure@format at second%
-        \Crefrange at figure@format at second}{}%
-    \@ifundefined{crefrange at subfigure@format at middle}{%
-      \let\crefrange at subfigure@format at middle%
-        \crefrange at figure@format at middle}{}%
-    \@ifundefined{Crefrange at subfigure@format at middle}{%
-      \let\Crefrange at subfigure@format at middle%
-        \Crefrange at figure@format at middle}{}%
-    \@ifundefined{crefrange at subfigure@format at last}{%
-      \let\crefrange at subfigure@format at last%
-        \crefrange at figure@format at last}{}%
-    \@ifundefined{Crefrange at subfigure@format at last}{%
-      \let\Crefrange at subfigure@format at last%
-        \Crefrange at figure@format at last}{}%
-    \@ifundefined{cref at subtable@format}{%
-      \let\cref at subtable@format%
-        \cref at table@format}{}%
-    \@ifundefined{Cref at subtable@format}{%
-      \let\Cref at subtable@format%
-        \Cref at table@format}{}%
-    \@ifundefined{crefrange at subtable@format}{%
-      \let\crefrange at subtable@format%
-        \crefrange at table@format}{}%
-    \@ifundefined{Crefrange at subtable@format}{%
-      \let\Crefrange at subtable@format%
-        \Crefrange at table@format}{}%
-    \@ifundefined{cref at subtable@format at first}{%
-      \let\cref at subtable@format at first%
-        \cref at table@format at first}{}%
-    \@ifundefined{Cref at subtable@format at first}{%
-      \let\Cref at subtable@format at first%
-        \Cref at table@format at first}{}%
-    \@ifundefined{cref at subtable@format at second}{%
-      \let\cref at subtable@format at second%
-        \cref at table@format at second}{}%
-    \@ifundefined{Cref at subtable@format at second}{%
-      \let\Cref at subtable@format at second%
-        \Cref at table@format at second}{}%
-    \@ifundefined{cref at subtable@format at middle}{%
-      \let\cref at subtable@format at middle%
-        \cref at table@format at middle}{}%
-    \@ifundefined{Cref at subtable@format at middle}{%
-      \let\Cref at subtable@format at middle%
-        \Cref at table@format at middle}{}%
-    \@ifundefined{cref at subtable@format at last}{%
-      \let\cref at subtable@format at last%
-        \cref at table@format at last}{}%
-    \@ifundefined{Cref at subtable@format at last}{%
-      \let\Cref at subtable@format at last%
-        \Cref at table@format at last}{}%
-    \@ifundefined{crefrange at subtable@format at first}{%
-      \let\crefrange at subtable@format at first%
-        \crefrange at table@format at first}{}%
-    \@ifundefined{Crefrange at subtable@format at first}{%
-      \let\Crefrange at subtable@format at first%
-        \Crefrange at table@format at first}{}%
-    \@ifundefined{crefrange at subtable@format at second}{%
-      \let\crefrange at subtable@format at second%
-        \crefrange at table@format at second}{}%
-    \@ifundefined{Crefrange at subtable@format at second}{%
-      \let\Crefrange at subtable@format at second%
-        \Crefrange at table@format at second}{}%
-    \@ifundefined{crefrange at subtable@format at middle}{%
-      \let\crefrange at subtable@format at middle%
-        \crefrange at table@format at middle}{}%
-    \@ifundefined{Crefrange at subtable@format at middle}{%
-      \let\Crefrange at subtable@format at middle%
-        \Crefrange at table@format at middle}{}%
-    \@ifundefined{crefrange at subtable@format at last}{%
-      \let\crefrange at subtable@format at last%
-        \crefrange at table@format at last}{}%
-    \@ifundefined{Crefrange at subtable@format at last}{%
-      \let\Crefrange at subtable@format at last%
-        \Crefrange at table@format at last}{}%
-    \@ifundefined{cref at subequation@format}{%
-      \let\cref at subequation@format%
-        \cref at equation@format}{}%
-    \@ifundefined{Cref at subequation@format}{%
-      \let\Cref at subequation@format%
-        \Cref at equation@format}{}%
-    \@ifundefined{crefrange at subequation@format}{%
-      \let\crefrange at subequation@format%
-        \crefrange at equation@format}{}%
-    \@ifundefined{Crefrange at subequation@format}{%
-      \let\Crefrange at subequation@format%
-        \Crefrange at equation@format}{}%
-    \@ifundefined{cref at subequation@format at first}{%
-      \let\cref at subequation@format at first%
-        \cref at equation@format at first}{}%
-    \@ifundefined{Cref at subequation@format at first}{%
-      \let\Cref at subequation@format at first%
-        \Cref at equation@format at first}{}%
-    \@ifundefined{cref at subequation@format at second}{%
-      \let\cref at subequation@format at second%
-        \cref at equation@format at second}{}%
-    \@ifundefined{Cref at subequation@format at second}{%
-      \let\Cref at subequation@format at second%
-        \Cref at equation@format at second}{}%
-    \@ifundefined{cref at subequation@format at middle}{%
-      \let\cref at subequation@format at middle%
-        \cref at equation@format at middle}{}%
-    \@ifundefined{Cref at subequation@format at middle}{%
-      \let\Cref at subequation@format at middle%
-        \Cref at equation@format at middle}{}%
-    \@ifundefined{cref at subequation@format at last}{%
-      \let\cref at subequation@format at last%
-        \cref at equation@format at last}{}%
-    \@ifundefined{Cref at subequation@format at last}{%
-      \let\Cref at subequation@format at last%
-        \Cref at equation@format at last}{}%
-    \@ifundefined{crefrange at subequation@format at first}{%
-      \let\crefrange at subequation@format at first%
-        \crefrange at equation@format at first}{}%
-    \@ifundefined{Crefrange at subequation@format at first}{%
-      \let\Crefrange at subequation@format at first%
-        \Crefrange at equation@format at first}{}%
-    \@ifundefined{crefrange at subequation@format at second}{%
-      \let\crefrange at subequation@format at second%
-        \crefrange at equation@format at second}{}%
-    \@ifundefined{Crefrange at subequation@format at second}{%
-      \let\Crefrange at subequation@format at second%
-        \Crefrange at equation@format at second}{}%
-    \@ifundefined{crefrange at subequation@format at middle}{%
-      \let\crefrange at subequation@format at middle%
-        \crefrange at equation@format at middle}{}%
-    \@ifundefined{Crefrange at subequation@format at middle}{%
-      \let\Crefrange at subequation@format at middle%
-        \Crefrange at equation@format at middle}{}%
-    \@ifundefined{crefrange at subequation@format at last}{%
-      \let\crefrange at subequation@format at last%
-        \crefrange at equation@format at last}{}%
-    \@ifundefined{Crefrange at subequation@format at last}{%
-      \let\Crefrange at subequation@format at last%
-        \Crefrange at equation@format at last}{}%
-    \@ifundefined{cref at enumii@format}{%
-      \let\cref at enumii@format%
-        \cref at enumi@format}{}%
-    \@ifundefined{Cref at enumii@format}{%
-      \let\Cref at enumii@format%
-        \Cref at enumi@format}{}%
-    \@ifundefined{crefrange at enumii@format}{%
-      \let\crefrange at enumii@format%
-        \crefrange at enumi@format}{}%
-    \@ifundefined{Crefrange at enumii@format}{%
-      \let\Crefrange at enumii@format%
-        \Crefrange at enumi@format}{}%
-    \@ifundefined{cref at enumii@format at first}{%
-      \let\cref at enumii@format at first%
-        \cref at enumi@format at first}{}%
-    \@ifundefined{Cref at enumii@format at first}{%
-      \let\Cref at enumii@format at first%
-        \Cref at enumi@format at first}{}%
-    \@ifundefined{cref at enumii@format at second}{%
-      \let\cref at enumii@format at second%
-        \cref at enumi@format at second}{}%
-    \@ifundefined{Cref at enumii@format at second}{%
-      \let\Cref at enumii@format at second%
-        \Cref at enumi@format at second}{}%
-    \@ifundefined{cref at enumii@format at middle}{%
-      \let\cref at enumii@format at middle%
-        \cref at enumi@format at middle}{}%
-    \@ifundefined{Cref at enumii@format at middle}{%
-      \let\Cref at enumii@format at middle%
-        \Cref at enumi@format at middle}{}%
-    \@ifundefined{cref at enumii@format at last}{%
-      \let\cref at enumii@format at last%
-        \cref at enumi@format at last}{}%
-    \@ifundefined{Cref at enumii@format at last}{%
-      \let\Cref at enumii@format at last%
-        \Cref at enumi@format at last}{}%
-    \@ifundefined{crefrange at enumii@format at first}{%
-      \let\crefrange at enumii@format at first%
-        \crefrange at enumi@format at first}{}%
-    \@ifundefined{Crefrange at enumii@format at first}{%
-      \let\Crefrange at enumii@format at first%
-        \Crefrange at enumi@format at first}{}%
-    \@ifundefined{crefrange at enumii@format at second}{%
-      \let\crefrange at enumii@format at second%
-        \crefrange at enumi@format at second}{}%
-    \@ifundefined{Crefrange at enumii@format at second}{%
-      \let\Crefrange at enumii@format at second%
-        \Crefrange at enumi@format at second}{}%
-    \@ifundefined{crefrange at enumii@format at middle}{%
-      \let\crefrange at enumii@format at middle%
-        \crefrange at enumi@format at middle}{}%
-    \@ifundefined{Crefrange at enumii@format at middle}{%
-      \let\Crefrange at enumii@format at middle%
-        \Crefrange at enumi@format at middle}{}%
-    \@ifundefined{crefrange at enumii@format at last}{%
-      \let\crefrange at enumii@format at last%
-        \crefrange at enumi@format at last}{}%
-    \@ifundefined{Crefrange at enumii@format at last}{%
-      \let\Crefrange at enumii@format at last%
-        \Crefrange at enumi@format at last}{}%
-    \@ifundefined{cref at enumiii@format}{%
-      \let\cref at enumiii@format%
-        \cref at enumii@format}{}%
-    \@ifundefined{Cref at enumiii@format}{%
-      \let\Cref at enumiii@format%
-        \Cref at enumii@format}{}%
-    \@ifundefined{crefrange at enumiii@format}{%
-      \let\crefrange at enumiii@format%
-        \crefrange at enumii@format}{}%
-    \@ifundefined{Crefrange at enumiii@format}{%
-      \let\Crefrange at enumiii@format%
-        \Crefrange at enumii@format}{}%
-    \@ifundefined{cref at enumiii@format at first}{%
-      \let\cref at enumiii@format at first%
-        \cref at enumii@format at first}{}%
-    \@ifundefined{Cref at enumiii@format at first}{%
-      \let\Cref at enumiii@format at first%
-        \Cref at enumii@format at first}{}%
-    \@ifundefined{cref at enumiii@format at second}{%
-      \let\cref at enumiii@format at second%
-        \cref at enumii@format at second}{}%
-    \@ifundefined{Cref at enumiii@format at second}{%
-      \let\Cref at enumiii@format at second%
-        \Cref at enumii@format at second}{}%
-    \@ifundefined{cref at enumiii@format at middle}{%
-      \let\cref at enumiii@format at middle%
-        \cref at enumii@format at middle}{}%
-    \@ifundefined{Cref at enumiii@format at middle}{%
-      \let\Cref at enumiii@format at middle%
-        \Cref at enumii@format at middle}{}%
-    \@ifundefined{cref at enumiii@format at last}{%
-      \let\cref at enumiii@format at last%
-        \cref at enumii@format at last}{}%
-    \@ifundefined{Cref at enumiii@format at last}{%
-      \let\Cref at enumiii@format at last%
-        \Cref at enumii@format at last}{}%
-    \@ifundefined{crefrange at enumiii@format at first}{%
-      \let\crefrange at enumiii@format at first%
-        \crefrange at enumii@format at first}{}%
-    \@ifundefined{Crefrange at enumiii@format at first}{%
-      \let\Crefrange at enumiii@format at first%
-        \Crefrange at enumii@format at first}{}%
-    \@ifundefined{crefrange at enumiii@format at second}{%
-      \let\crefrange at enumiii@format at second%
-        \crefrange at enumii@format at second}{}%
-    \@ifundefined{Crefrange at enumiii@format at second}{%
-      \let\Crefrange at enumiii@format at second%
-        \Crefrange at enumii@format at second}{}%
-    \@ifundefined{crefrange at enumiii@format at middle}{%
-      \let\crefrange at enumiii@format at middle%
-        \crefrange at enumii@format at middle}{}%
-    \@ifundefined{Crefrange at enumiii@format at middle}{%
-      \let\Crefrange at enumiii@format at middle%
-        \Crefrange at enumii@format at middle}{}%
-    \@ifundefined{crefrange at enumiii@format at last}{%
-      \let\crefrange at enumiii@format at last%
-        \crefrange at enumii@format at last}{}%
-    \@ifundefined{Crefrange at enumiii@format at last}{%
-      \let\Crefrange at enumiii@format at last%
-        \Crefrange at enumii@format at last}{}%
-    \@ifundefined{cref at enumiv@format}{%
-      \let\cref at enumiv@format%
-        \cref at enumiii@format}{}%
-    \@ifundefined{Cref at enumiv@format}{%
-      \let\Cref at enumiv@format%
-        \Cref at enumiii@format}{}%
-    \@ifundefined{crefrange at enumiv@format}{%
-      \let\crefrange at enumiv@format%
-        \crefrange at enumiii@format}{}%
-    \@ifundefined{Crefrange at enumiv@format}{%
-      \let\Crefrange at enumiv@format%
-        \Crefrange at enumiii@format}{}%
-    \@ifundefined{cref at enumiv@format at first}{%
-      \let\cref at enumiv@format at first%
-        \cref at enumiii@format at first}{}%
-    \@ifundefined{Cref at enumiv@format at first}{%
-      \let\Cref at enumiv@format at first%
-        \Cref at enumiii@format at first}{}%
-    \@ifundefined{cref at enumiv@format at second}{%
-      \let\cref at enumiv@format at second%
-        \cref at enumiii@format at second}{}%
-    \@ifundefined{Cref at enumiv@format at second}{%
-      \let\Cref at enumiv@format at second%
-        \Cref at enumiii@format at second}{}%
-    \@ifundefined{cref at enumiv@format at middle}{%
-      \let\cref at enumiv@format at middle%
-        \cref at enumiii@format at middle}{}%
-    \@ifundefined{Cref at enumiv@format at middle}{%
-      \let\Cref at enumiv@format at middle%
-        \Cref at enumiii@format at middle}{}%
-    \@ifundefined{cref at enumiv@format at last}{%
-      \let\cref at enumiv@format at last%
-        \cref at enumiii@format at last}{}%
-    \@ifundefined{Cref at enumiv@format at last}{%
-      \let\Cref at enumiv@format at last%
-        \Cref at enumiii@format at last}{}%
-    \@ifundefined{crefrange at enumiv@format at first}{%
-      \let\crefrange at enumiv@format at first%
-        \crefrange at enumiii@format at first}{}%
-    \@ifundefined{Crefrange at enumiv@format at first}{%
-      \let\Crefrange at enumiv@format at first%
-        \Crefrange at enumiii@format at first}{}%
-    \@ifundefined{crefrange at enumiv@format at second}{%
-      \let\crefrange at enumiv@format at second%
-        \crefrange at enumiii@format at second}{}%
-    \@ifundefined{Crefrange at enumiv@format at second}{%
-      \let\Crefrange at enumiv@format at second%
-        \Crefrange at enumiii@format at second}{}%
-    \@ifundefined{crefrange at enumiv@format at middle}{%
-      \let\crefrange at enumiv@format at middle%
-        \crefrange at enumiii@format at middle}{}%
-    \@ifundefined{Crefrange at enumiv@format at middle}{%
-      \let\Crefrange at enumiv@format at middle%
-        \Crefrange at enumiii@format at middle}{}%
-    \@ifundefined{crefrange at enumiv@format at last}{%
-      \let\crefrange at enumiv@format at last%
-        \crefrange at enumiii@format at last}{}%
-    \@ifundefined{Crefrange at enumiv@format at last}{%
-      \let\Crefrange at enumiv@format at last%
-        \Crefrange at enumiii@format at last}{}%
-    \@ifundefined{cref at enumv@format}{%
-      \let\cref at enumv@format%
-        \cref at enumiv@format}{}%
-    \@ifundefined{Cref at enumv@format}{%
-      \let\Cref at enumv@format%
-        \Cref at enumiv@format}{}%
-    \@ifundefined{crefrange at enumv@format}{%
-      \let\crefrange at enumv@format%
-        \crefrange at enumiv@format}{}%
-    \@ifundefined{Crefrange at enumv@format}{%
-      \let\Crefrange at enumv@format%
-        \Crefrange at enumiv@format}{}%
-    \@ifundefined{cref at enumv@format at first}{%
-      \let\cref at enumv@format at first%
-        \cref at enumiv@format at first}{}%
-    \@ifundefined{Cref at enumv@format at first}{%
-      \let\Cref at enumv@format at first%
-        \Cref at enumiv@format at first}{}%
-    \@ifundefined{cref at enumv@format at second}{%
-      \let\cref at enumv@format at second%
-        \cref at enumiv@format at second}{}%
-    \@ifundefined{Cref at enumv@format at second}{%
-      \let\Cref at enumv@format at second%
-        \Cref at enumiv@format at second}{}%
-    \@ifundefined{cref at enumv@format at middle}{%
-      \let\cref at enumv@format at middle%
-        \cref at enumiv@format at middle}{}%
-    \@ifundefined{Cref at enumv@format at middle}{%
-      \let\Cref at enumv@format at middle%
-        \Cref at enumiv@format at middle}{}%
-    \@ifundefined{cref at enumv@format at last}{%
-      \let\cref at enumv@format at last%
-        \cref at enumiv@format at last}{}%
-    \@ifundefined{Cref at enumv@format at last}{%
-      \let\Cref at enumv@format at last%
-        \Cref at enumiv@format at last}{}%
-    \@ifundefined{crefrange at enumv@format at first}{%
-      \let\crefrange at enumv@format at first%
-        \crefrange at enumiv@format at first}{}%
-    \@ifundefined{Crefrange at enumv@format at first}{%
-      \let\Crefrange at enumv@format at first%
-        \Crefrange at enumiv@format at first}{}%
-    \@ifundefined{crefrange at enumv@format at second}{%
-      \let\crefrange at enumv@format at second%
-        \crefrange at enumiv@format at second}{}%
-    \@ifundefined{Crefrange at enumv@format at second}{%
-      \let\Crefrange at enumv@format at second%
-        \Crefrange at enumiv@format at second}{}%
-    \@ifundefined{crefrange at enumv@format at middle}{%
-      \let\crefrange at enumv@format at middle%
-        \crefrange at enumiv@format at middle}{}%
-    \@ifundefined{Crefrange at enumv@format at middle}{%
-      \let\Crefrange at enumv@format at middle%
-        \Crefrange at enumiv@format at middle}{}%
-    \@ifundefined{crefrange at enumv@format at last}{%
-      \let\crefrange at enumv@format at last%
-        \crefrange at enumiv@format at last}{}%
-    \@ifundefined{Crefrange at enumv@format at last}{%
-      \let\Crefrange at enumv@format at last%
-        \Crefrange at enumiv@format at last}{}%
+  \@crefcopyformats{section}{subsection}%
+  \@crefcopyformats{section}{subsubsection}%
+  \@crefcopyformats{appendix}{subappendix}%
+  \@crefcopyformats{appendix}{subsubappendix}%
+  \@crefcopyformats{figure}{subfigure}%
+  \@crefcopyformats{table}{subtable}%
+  \@crefcopyformats{equation}{subequation}%
+  \@crefcopyformats{enumi}{enumii}%
+  \@crefcopyformats{enumii}{enumiii}%
+  \@crefcopyformats{enumiii}{enumiv}%
+  \@crefcopyformats{enumiv}{enumv}%
+  \@labelcrefdefinedefaultformats%
+  %
   \let\cref at language\relax%
 }%  end of \AtBeginDocument
 \InputIfFileExists{cleveref.cfg}%

Modified: trunk/Master/tlpkg/libexec/ctan2tds
===================================================================
--- trunk/Master/tlpkg/libexec/ctan2tds	2018-02-05 12:35:05 UTC (rev 46548)
+++ trunk/Master/tlpkg/libexec/ctan2tds	2018-02-05 21:55:39 UTC (rev 46549)
@@ -255,6 +255,7 @@
  'cmcyr',               "&MAKEflatten",
  'cmcyralt',            "die 'skipping, noinfo license",
  'cmexb',		"&MAKEflatten",
+ 'cmsrb',               "&MAKEflatten",
  'cnbwp',               "&MAKEflatten",
  'cntdwn',              "die 'skipping, author (dps) request",
  'comicsans',           "die 'skipping, Comic Sans is nonfree'",



More information about the tex-live-commits mailing list