% \iffalse meta-comment
%
% Package 'cleveref' to use with LaTeX2e
% Copyright 2007--2011 by Toby Cubitt
%
% Written and maintained by Toby Cubitt
%
%% 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.
%% The latest version of this license is in:
%%
%%    http://www.latex-project.org/lppl.txt
%%
%% and version 1.2 or later is part of all distributions of LaTeX
%% version 1999/12/01 or later.
%
% Please send bug reports and suggestions to toby-cleveref@dr-qubit.org
% \fi
%
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{cleveref}
%<package> [2011/03/22 v0.17.9 Intelligent cross-referencing]
%
%<*driver>
\documentclass{ltxdoc}
%\documentclass[draft]{ltxdoc}
\usepackage{url}
\usepackage{pifont} % FIXME: find nicer line-continuation symbol than \ding{229}
% \usepackage{hyperref}  % breaks index
\usepackage[capitalise]{cleveref}
\DisableCrossrefs
\CodelineIndex
\RecordChanges
\setcounter{IndexColumns}{2}
%%\newcommand{\package}[1]{\texttt{#1.sty}}
\newcommand{\package}[1]{\texttt{#1}}
\newcommand{\file}{\texttt}
\newcommand{\option}{\texttt}
\makeatletter
%% Command for writing code descriptions
\def\packeddescr{%
   \begin{list}{}{\leftmargin0.5cm
                  \labelwidth\z@\itemindent-\leftmargin
                  \topsep=0pt\itemsep=0.05cm\parsep=0.05cm
%                 \let\makelabel\nlabel
                }}
\def\endpackeddescr{\end{list}}
%% Commands for referring to code lines
\def\codelabel#1{\@bsphack
 \protected@write\@auxout{}{\string\newlabel{#1}{{\number\the
           \c@CodelineNo}{\thepage}}}\@esphack}
\newcounter{tmpcount}
\def\coderef#1#2{\setcounter{tmpcount}{0}\@ifundefined{r@#1}\relax
          {\setcounter{tmpcount}{\ref{#1}}}\relax
          \addtocounter{tmpcount}{#2}\arabic{tmpcount}}
\makeatother
\begin{document}
  \DocInput{cleveref.dtx}
\end{document}
%</driver>
% \fi
%
% \CheckSum{14751}
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
%
% \changes{v0.01}{2006/06/29}{Initial version}
% \changes{v0.02}{2007/04/18}{Complete rewrite}
% \changes{v0.03}{2007/04/26}{Added reference ranges}
% \changes{v0.04}{2007/05/26}{Renamed "cleveref" -- first public release}
% \changes{v0.05}{2007/05/31}{Added \option{poorman} option}
% \changes{v0.06}{2007/06/11}{\option{poorman} no longer writes extra
%   .tmp file}
% \changes{v0.07}{2007/06/21}{Allow prevention of reference range
%   collapsing}
% \changes{v0.08}{2007/07/10}%
%   {Made referencing commands robust, improved default formats, made
%   starred versions of referencing commands for hyperref, allowed
%   multiple consecutive empty references in list to prevent range
%   collapsing, and fixed bugs. Phew.}
% \changes{v0.08.1}{2007/08/08}{Bug fixes.}
% \changes{v0.09}{2007/10/29}%
%   {Added an extra conjunction and format component, used when a list
%   only contains a single pair of references or reference
%   sub-lists. Formats are now constructed from customisable
%   components, unless overridden using the old format definition
%   commands.}
% \changes{v0.10}{2007/10/30}%
%   {Allow optional argument to \textbackslash{}label to override
%   reference type. Removed \option{hyperref} and \option{ntheorem}
%   options; support for these and \package{amsmath} is enabled
%   automatically if those packages are loaded.}
% \changes{v0.11}{2007/11/21}{Made referencing aware of appendices.}
% \changes{v0.11.1}{2007/11/29}{Bug fixes.}
% \changes{v0.12}{2009/02/11}{Restore working \textbackslash{}ref* when
%   hyperref is loaded -- first release mirrored on www.dr-qubit.org}
% \changes{v0.13}{2009/04/17}{Finally implemented \option{sort} and
%   \option{compress} package options. Support \package{amsmath}
%   \textbackslash{}tag command. Added \package{babel} support for
%   English, German and French. Added \package{varioref} support.}
% \changes{v0.13.1}{2009/07/01}{Bug fix to \textbackslash{}cref@get*
%   commands to allow fragile and non-expandable commands in label tags.}
% \changes{v0.13.2}{2009/07/26}{Added\newline
%   \textbackslash{}crefrangepreconjunction and
%   \textbackslash{}crefrangepostconjunction commands, needed by some
%   languages (such as Italian). Added \package{babel} support for
%   Spanish and Italian. Added notes about \package{memoir}
%   (in)compatibility.}
% \changes{v0.14}{2009/08/07}{Fixed bug that caused labels containing
%   components with values of 10 or higher to be sorted
%   incorrectly. Fixed \textbackslash{}Cref to no longer capitalise all
%   cross-reference names in a multi-reference, just the first one. Added
%   \option{capitalise} option to force capitalisation everywhere.}
% \changes{v0.14.1}{2009/08/18}{Added support for \package{amsmath}'s
%   subequations environment}
% \changes{v0.14.2}{2009/09/22}{Fixed subequations sorting bug. Fixed bug
%   in \option{poorman} when used without babel. \option{capitalise}
%   option no longer uses \textbackslash{}Cref variant everywhere; it now
%   redefines the \textbackslash{}cref variants instead.}
% \changes{v0.14.3}{2009/10/17}{Bug-fix in \textbackslash{}appendix
%   code.}
% \changes{v0.15}{2009/11/26}{Added \package{amsthm} support, contributed
%   by Michael Ummels. Added \textbackslash{}leavevmode before
%   \textbackslash{}begingroup in \textbackslash{}@cref to avoid subtle
%   bug that caused page count to be reset if the output routine was
%   triggered within \textbackslash{}@cref.}
% \changes{v0.15.1}{2009/12/02}{Fixed regression introduced in v0.13 in
%   non-\package{hyperref} \option{poorman} code. Fixed bug in
%   \package{varioref} support that caused \textbackslash{}vref to print
%   \textbackslash{}reftextcurrent string for references on the current
%   page, breaking \package{varioref} backwards-compatibility. Added
%   \package{babel} support for Dutch.}
% \changes{v0.15.2}{2009/12/07}{Fixed bug in \textbackslash{}appendix
%   that produced badly formed prefix data for labels that aren't reset
%   by other counters (e.g. tables and figures in most document
%   classes). Fixed bug in \package{hyperref} \option{poorman} code that
%   caused all label names to be lower-cased in the sed script. Fixed
%   spacing bugs in the \package{cleveref} versions of the
%   \package{varioref} commands.}
% \changes{v0.15.3}{2009/12/11}{Fixed bug in \package{varioref} support.
%   Changed \option{poorman} \textbackslash{}usepackage sed substitution
%   rule to use POSIX regexp syntax.}
% \changes{v0.16}{2010/04/19}{Major changes to the low-level
%   implementation! \package{cleveref} now stores the extra information
%   it requires in its own \textbackslash{}cref@currentlabel and its own
%   parallel series of labels in the aux file, staying out of the way of
%   the standard cross-reference mechanism and \textbackslash{}ref
%   command. Also added \textbackslash{}namecref and
%   \textbackslash{}nameCref commands, fixed a serious bug in the
%   \package{amsmath} support affecting spacing of multi-line equation
%   environments, added support for footnotes, and made
%   \textbackslash{}newtheorem automatically define the singular form of
%   the cross-reference name for new theorem-like environments.}
% \changes{v0.16.1}{2010/04/30}{Fixed bugs in \package{amsmath} spacing
%   fix and \package{amsthm} support.}
% \changes{v0.16.2}{2010/05/12}{Fixed bugs in \textbackslash{}appendix
%   version used with \package{hyperref}, and in \textbackslash{}footnote
%   support.}
% \changes{v0.16.3}{2010/05/25}{Added missing \textbackslash{}namecrefs
%   and \textbackslash{}nameCrefs commands. Fixed bug in
%   \textbackslash{}AtBeginDocument code used to define
%   \textbackslash{}cref<x>groupconjunction macros. Added missing
%   \textbackslash{}crefname definitions for subsection, subsubsection
%   etc. in terms of those for section, so that \textbackslash{}namecref
%   works for those (and also switching language in the middle of a
%   document). Added \package{babel} support for Russian and Ukranian.
%   Fixed bug in \textbackslash{}refstepcounter@optarg.}
% \changes{v0.17}{2010/06/07}{Fixed bug in non-\package{hyperref}
%   version of \textbackslash{}refstepcounter. Added
%   \textbackslash{}crefalias command for aliasing a counter to a
%   different cross-reference type. Added support for \package{algorithm}
%   package. Improved support for \package{subfig} package. Added support
%   for \package{listings} package. Fixed bugs in \package{amsmath}
%   \textbackslash{}tag command when used with \option{sort} option, and
%   in the \package{amsmath} multline environment's support for the
%   optional argument to \textbackslash{}label.}
% \changes{v0.17.1}{2010/06/24}{Modified \textbackslash{}@crefname macro
%   so that it no longer makes global definitions, to fix support for
%   \package{babel}'s \textbackslash{}otherlanguage and
%   \textbackslash{}foreignlanguage commands. Fixed typos in
%   \option{poorman} \textbackslash{}foreignlanguage code. Fixed bug in
%   the \package{amsmath} multline environment's support for the optional
%   argument to \textbackslash{}label\dots again. Added
%   \textbackslash{}labelcref command.}
% \changes{v0.17.2}{2010/07/24}{Removed unneeded argument from
%   \textbackslash{}@footnotetext redefinition, to improve compatibility
%   with other packages that redefine footnotes.}
% \changes{v0.17.3}{2010/08/30}{Added missing default format definitions
%   for ``part''. Fixed bad active character interaction between
%   \package{cleveref} and some \package{babel} languages (in particular
%   Spanish). Fixed \package{hyperref} support code so
%   that it is only enabled if \package{hyperref} was loaded with the
%   \option{implicit} option set to \option{true} (the default).}
% \changes{v0.17.4}{2010/09/04}{Added automatic support for
%   \package{aliascnt} counters whose parent counter gets reset. Fixed
%   serious bug in the test for \package{hyperref}'s \option{implicit}
%   options.}
% \changes{v0.17.5}{2010/09/15}{Fixed bug that broke compilation of
%   documents that didn't use \package{hyperref}, because
%   \textbackslash{}if@cref@hyperrefloaded was not defined.}
% \changes{v0.17.6}{2011/01/05}{Added \package{babel} support for
%   Norwegian. Replaced ``appendice'' with ``annexe'' in French default
%   cross-reference names, to match \package{babel} names. Replaced
%   ``Linie'' with ``Zeile'' in the German default cross-reference names.
%   Added \textbackslash{}lcnamecref and \textbackslash{}lcnamecrefs
%   commands to force lowercase reference names, useful with the
%   \option{capitalise} option.}
% \changes{v0.17.7}{2011/01/10}{Fixed \textbackslash{}crefname to work
%   with empty reference names.}
% \changes{v0.17.8}{2011/01/19}{Fixed automatic
%   \textbackslash{}newtheorem name definitions to work with empty
%   names.}
% \changes{v0.17.9}{2011/03/22}{Added support for \package{algorithm2e}
%   package. Added missing \textbackslash{}crefname definitions for
%   `listing'. Changed case used in plural forms in Norwegian. Fixed bug
%   in redefinition of \package{amsmath} \textbackslash{}tag command.
%   Added \package{babel} support for Danish. Renamed internal
%   \textbackslash{}@result macro to \textbackslash{}cref@result to avoid
%   conflict with \package{tikz-qtree} package. Also renamed internal
%   \textbackslash{}@temp<x> macros to \textbackslash{}@temp<x>, which
%   seems to be more standard for temporary macros, to mitigate against
%   similar (though less likely) conflicts, and also save a minuscule
%   amount of \TeX{} memory.}
%
% \GetFileInfo{cleveref.sty}
%
% \def\fileversion{0.17.9}
% \def\filedate{22/03/2011}
%
% \title{The \package{cleveref} package\thanks{This document
%     corresponds to \textsf{cleveref}~\fileversion, dated
%     \filedate.}}
% \author{Toby Cubitt \\ \texttt{toby-cleveref@dr-qubit.org}}
% \date{\filedate}
%
% \maketitle
%
% \begin{abstract}
%   The \package{cleveref} package enhances \LaTeX{}'s cross-referencing
%   features,\linebreak[4] allowing the format of cross-references to be
%   determined automatically according to the ``type'' of cross-reference
%   (equation, section, etc.) and the context in which the
%   cross-reference is used. The formatting for each cross-reference type
%   can be fully customised in the preamble of your document. In
%   addition, \package{cleveref} can type-set cross-references to lists
%   of multiple labels, automatically formatting them according to their
%   types, sorting them, and compressing sequences of numerically
%   consecutive labels. Again, the multiple-reference formatting is fully
%   customisable.
%
%   Normally, the latest version of the \package{cleveref} package is
%   available via CTAN.\ Occasionally, slightly newer ``pre-release''
%   versions are available at \url{www.dr-qubit.irg/latex.php#cleveref} a
%   little bit before they make their way onto CTAN.
% \end{abstract}
%
% \tableofcontents
% \clearpage
%
%
% \section{Introduction}
% When ``clever'' is used in the name of a computer program, it usually
% signifies that the programmer is overly smug about his own
% achievements! But at the heart of the \LaTeX{} philosophy is the idea
% that it is clever to delegate as much of the type-setting as possible
% to the computer, in order to achieve a beautiful --- and above all
% consistent --- visual appearance.
%
% Both these probably apply to the \package{cleveref} package. Its goals
% are two-fold: to exploit everything that \LaTeX{} inherently knows
% about labels as intelligently as possible (clever processing); and to
% enable you to produce an attractive, consistent formatting of
% cross-references throughout your document, with the minimum of effort
% (you'd be clever to use it!).
%
% The \package{cleveref} package enhances \LaTeX{}'s cross-referencing
% facilities by allowing cross-references to be formatted automatically
% according to the type of thing they refer to (chapter, section,
% equation, theorem, etc.) and the context in which the cross-reference
% is used. It can automatically format cross-references to multiple
% labels, sort lists of multiple cross-references, compress
% cross-references to consecutive labels into a reference range, and all
% kinds of other clever wizardry.
%
% In standard \LaTeX{}, you have almost certainly found yourself writing
% things like |Eq.~(\ref{eq1})| and |Theorems~\ref{thm1} to~\ref{thm3}|
% over and over again. Tedium isn't the only downside to this. What
% happens if you later decide you want equation references to be type-set
% as |Equation~\ref{eq1}| instead (i.e.\ without the abbreviation and
% without the brackets)? What happens if you decide to change the theorem
% labelled |thm1| into a lemma? What if you move |thm3| so that it
% appears (and is numbered) before |thm1|, so that references to the
% sequence of theorems 1 through 3 should be ordered
% |Theorems~\ref{thm3} to~\ref{thm1}| (i.e.\ the other way around)? What
% if you decide you prefer references to multiple theorems to be written
% as |Theorems~\ref{thm1}--\ref{thm3}|? You have to search through the
% entire \LaTeX{} source of your document, modifying all references to
% equations, updating all references to |thm1|, re-ordering all
% references to |thm1| and |thm3|, and changing all the formatting of
% references to multiple theorems!
%
% The \package{cleveref} package allows you to define the format for
% cross-references once-and-for-all in the preamble of your document. If
% you later decide to change the format of equation references, you only
% have to change one preamble definition. If you change a theorem into a
% lemma, you don't need to change any cross-references at all, because
% \package{cleveref} will automatically type-set cross-references to it
% using the appropriate formatting. This makes it far easier to type-set
% cross-references uniformly across your whole document, as well as
% avoiding repetitively typing similar text for each and every
% cross-reference.
%
% Given how useful this is, there are naturally a number of other
% packages with similar goals, most notably \package{varioref},
% \package{fancyref}, \package{hyperref}'s |\autoref| command, and (for
% theorem-like environments) \package{ntheorem} (with the \option{thref}
% option). (There are many others, but these come closest to providing
% similar features to \package{cleveref}.) However, all have certain
% deficiencies which \package{cleveref} attempts to overcome.
%
% The \package{fancyref} package doesn't automatically determine the type
% of thing being referred to. Instead, it relies on you adhering to a
% naming convention for labels. This is usually a good idea in any case,
% but it can be inconvenient. For example, if you change a theorem into a
% lemma, you have to change the label name, and therefore also all
% cross-references to it. So you are back to searching and replacing
% through the entire document, not to mention missing out on all the
% other \package{cleveref} features.
%
% The enhanced referencing feature provided by the \package{varioref}
% package's\linebreak[4] |\labelformat| command decides how to format
% cross-references when the label is \emph{defined}, rather than when it
% is \emph{referenced}. Often this isn't a problem. But it makes it
% impossible to format cross-references differently according the context
% in which they are referenced, which can sometimes be very useful. For
% example, if you want cross-references at the beginning of a sentence
% formatted any other way than by capitalising the first letter of the
% cross-reference text, it is impossible using \package{varioref}.
% Perhaps even more significantly, it makes it impossible to type-set
% multiple references automatically; you are back to typing
% |Eqs.~(\ref{eq1}) to~(\ref{eq3})| by hand. Not to mention missing out
% on automatic sorting and compressing of consecutive references,
% \package{ntheorem} support, precise control over hyper-links, etc.
% \package{cleveref} fully supports \package{varioref}, taking over
% responsibility for type-setting cross-references, whilst retaining all
% the \package{varioref} page-referencing magic.
%
% The \package{hyperref} package's |\autoref| command type-sets a name
% before a cross-reference, determined by the cross-reference type. This
% is less flexible than \package{cleveref}'s fully customisable
% cross-reference formatting but, when combined with \package{varioref},
% the two packages working together come close. However, even with
% \package{hyperref}, it is impossible to customise precisely which part
% of the cross-reference is made into a hyper-link in PDF documents; this
% is very easy with \package{cleveref}. And it still remains impossible
% to type-set multiple references, have consecutive references sorted and
% compressed automatically, etc.
%
% The \package{ntheorem} package (with the \option{thref} option) does
% things right with regards how and when the format is defined\ldots
% except that it only works for theorem-like environments. It is possible
% to use it for other environments, but only in a bastardized form, by
% manually supplying an optional argument to |\label| commands that
% specifies the label type. \package{cleveref} works equally well when
% referencing any type of thing, as well as fully supporting
% \package{ntheorem}. And again, \package{cleveref} also provides a
% number additional features over \package{ntheorem}, such as multiple
% cross-references, automatic sorting and compressing of consecutive
% cross-references, control over the placement of hyper-links, etc.
%
%
%
% \section{Usage}
% The \package{cleveref} package is loaded in the usual way, by putting
% the line
% \begin{quote}
%   |\usepackage{cleveref}|
% \end{quote}
% in your document's preamble. However, care must be taken when using
% \package{cleveref} in conjunction with other packages that modify
% \LaTeX{}'s referencing system (see
% \cref{sec:other_packages}). Basically, \package{cleveref} must be
% loaded \emph{last}.
%
% If you just want to get going quickly with \package{cleveref}, and come
% back later to read up on all the features it provides in more detail,
% here's what you need to do. Wherever you would previously have used
% |\ref|, use |\cref| instead. (Except at the beginning of a sentence,
% where you should use |\Cref|.) You no longer need to put the name of
% the thing you're referencing in front of the |\cref| command, because
% \package{cleveref} will sort that out for you: i.e.\ use |\cref{eq1}|
% instead of |eq.~(\ref{eq1})|. If you want to refer to a range of
% labels, use the |\crefrange| command: |\crefrange{eq1}{eq5}| gives
% |eqs.~(1) to~(5)|. Finally, if you want to refer to multiple things at
% once, you can now combine them all into one cross-reference and leave
% \package{cleveref} to sort it out: e.g.\
% |\cref{eq2,eq1,eq3,eq5,thm2,def1}| produces:%
% |eqs.~(1) to~(3) and~(5),|\linebreak[4] |theorem~5, and definition~1|.
%
%
% \section{Type-Setting Cross-References}
% \label{sec:typesetting}
% \DescribeMacro\cref
% To automatically type-set a cross-reference according to the type of
% thing referred to, simply refer to it using |\cref{|\meta{label}|}|.
% \package{cleveref} imposes just one extra restriction on the names of
% labels: they are no longer allowed to contain commas ``,''. These are
% instead used to type-set multiple cross-references (see below).
%
% \DescribeMacro\Cref
% As it is very difficult\footnote{Actually, very likely impossible!} for
% \LaTeX{} to determine whether a cross-reference appears at the
% beginning of a sentence or not, a beginning-of-sentence variant exists:
% |\Cref{|\meta{label}|}|. By default, this type-sets the cross-reference
% with the first letter capitalised, and without using an abbreviation in
% those cases where the standard variant does use one. (However, the
% formatting of the |\cref| and |\Cref| forms can be fully and
% independently customised, see \cref{sec:customising}.)
%
% \DescribeMacro\crefrange
% \DescribeMacro\Crefrange
% To type-set a cross-reference range, e.g. |Eqs.~(1.1) to~(1.5)|,
% use\linebreak[4] |\crefrange| or |\Crefrange| (depending on the
% capitalisation you require), which take the beginning and end of the
% range as arguments:
% \begin{quote}
%   |\crefrange{|\meta{label1}|}{|\meta{label2}|}|
% \end{quote}
%
% \DescribeMacro\cref
% \DescribeMacro\Cref
% To type-set multiple cross-references, simply list the lables inside
% the |\cref| or |\Cref| command, separated by commas (you are not
% allowed to use commas in label names when using \package{cleveref}):
% \begin{quote}
%   |\cref{|\meta{label1}|,|\meta{label2}|,|\meta{label3}|,...}|
% \end{quote}
%
% \DescribeMacro{\cref*}
% \DescribeMacro{\Cref*}
% \DescribeMacro{\crefrange*}
% \DescribeMacro{\Crefrange*}
% When \package{cleveref} is used along with the \package{hyperref}
% package (see \cref{sec:customising,sec:other_packages}), additional
% starred variants of all the referencing commands are available. The
% standard referencing commands will make cross-references into
% hyper-links; the starred variants prevent this, producing the same
% type-set text but without creating hyper-links.
%
% \DescribeMacro\ref
% \package{cleveref} does \emph{not} modify the standard |\ref| command,
% so you can still use it to type-set the formatted label counter alone,
% without any additional text or formatting.
%
% \pagebreak
% \DescribeMacro{\namecref}
% \DescribeMacro{\nameCref}
% \DescribeMacro{\lcnamecref}
% \DescribeMacro{\namecrefs}
% \DescribeMacro{\nameCrefs}
% \DescribeMacro{\lcnamecrefs}
% Occasinally, it's useful to produce just the name of a reference,
% without the label itself. For example, if you want to refer to ``this
% section'', but you're not sure whether you might later change the
% section into a chapter, it might be useful to produce just the name
% ``section'' associated with the section's label. If you later change
% the section into a chapter, the text will then automatically change to
% ``this chapter''. The |\namecref| and |\nameCref| do exactly this:
% \begin{quote}
%   |\namecref{sec1}|
% \end{quote}
% is type-set as ``section'' (assuming |sec1| labels a section). The
% |\namecref| and |\nameCrefs| commands produce the plural forms. The
% |\lcnamecref| and |\lcnamecrefs| commands force the reference name to
% lowercase, for use when the \option{capitalise} option is enabled (see
% \cref{sec:capitalise}). (When that option is set, |\namecref| produces
% an uppercase reference name.)
%
% \DescribeMacro{\labelcref}
% Conversely, it is occasionally useful to produce just the label part of
% a reference, without the cross-reference name. For example, this could
% be useful when type-setting cross-references in a language for which
% the ending of the cross-reference name changes depending on where it is
% used in a sentence. The |\labelcref| command does exactly this, and can
% also cope with multi-references, processing them just as |\cref| does.
% However, since it type-sets a multi-reference without any name,
% \emph{all} labels in a |\labelcref| multi-reference \emph{must} be of
% the same type.
%
% There is a slight pitfall that you should be aware of when using the
% |\namecref| commands. They get the reference name from the names
% defined for the label's reference type using |\crefname| or |\Crefname|
% (see \cref{sec:individual_customisation}). The default reference
% formats provide these definitions. However, it is possible to customise
% reference formats using lower-level commands that do not create
% |\crefname| definitions (see \cref{sec:low-level_customisation}). If
% the |\crefname| definitions are missing for a particular reference
% type, |\namecref| and |\nameCref| will produce errors for labels of
% that type. You can fix the error by adding explicit |\crefname|
% definitions for these types.
%
% The |\labelcref| command will type-set cross-reference labels using the
% default label format if no type-specific format is defined using
% |\creflabelformat| (see
% \cref{sec:global_customisation,sec:individual_customisation}). However,
% if you customise reference formats using the lower-level commands, you
% may want to also explicitly define the |\labelcref| formats to match,
% using the |\labelcrefformat| etc.\ commands (see
% \cref{sec:low-level_customisation}).
%
%
%
%
% \section{Sorting and Compressing}
% \label{sec:sort&compress}
% When \package{cleveref} type-sets lists of multiple cross-references,
% the default behaviour is to automatically sort the list and compress
% sequences of consecutive cross-references into a reference range. You
% can change this behaviour by supplying one of the following package
% options:
% \begin{description}
% \item[\option{sort}] Sort lists of cross-references, but don't compress
%   consecutive references.
% \item[\option{compress}] Compress sequences of consecutive references
%   into a reference range, but don't sort the list of cross-references.
% \item[\option{nosort}] Neither sort lists of cross-references,
%   \emph{nor} compress consecutive references.
% \item[\option{sort\&compress}] Sort lists of cross-references, and
%   compress sequences of consecutive references into a reference
%   range (this is the default).
% \end{description}
%
% Occasionally, you may want to prevent a particular sequence of
% consecutive cross-references from being compressed to a reference
% range, without disabling this feature globally. To achieve this, you
% can separate the cross-references in the list by one or more empty
% references, at the point at which you want to prevent compression. For
% example,
% \begin{quote}
%   |\cref{eq1,eq2,eq3,,eq4}|
% \end{quote}
% will be type-set as
% \begin{quote}
%   eqs.~(1) to~(3) and (4)
% \end{quote}
% or
% \begin{quote}
%   |\cref{eq1,eq2,,eq3,eq4,eq5,,eq6,eq7,eq8}|
% \end{quote}
% will be type-set as
% \begin{quote}
%   eqs.~(1), (2), (3) to~(5) and (6) to~(8)
% \end{quote}
% You can safely put an empty reference between cross-references that
% would never be compressed anyway; it will simply be ignored.
%
% If lists of cross-references are also being sorted (the default), it
% can be a little confusing to work out where the empty reference should
% go in order to prevent compression of a particular consecutive
% sequence. It's best to think of the empty reference as being
% ``attached'' to the cross-reference preceding it. When the list is
% sorted, the empty reference will still appear after the same preceding
% reference, and will prevent it being compressed with any subsequent
% consecutive cross-references. In other words, an empty reference
% ensures that the preceding reference will appear explicitly in the
% final, type-set cross-reference:
% \begin{quote}
%   |\cref{eq3,,eq2,eq1,eq6,eq4,eq5}|
% \end{quote}
% will be type-set as
% \begin{quote}
%   eqs.~(1) to~(3) and (4) to~(6)
% \end{quote}
%
%
%
% \section{Capitalising All Cross-Reference Names}
% \label{sec:capitalise}
% \DescribeMacro{capitalise} Many authors prefer to always capitalise
% cross-reference names, regardless of where they appear in the sentence,
% writing Theorem~1 and Equation~3 (as opposed to theorem~1 and
% equation~3). If you count yourself among this group, you can pass the
% \option{capitalise} option to the \package{cleveref} package
% (\option{capitalize} also works).
%
% All the default cross-reference formats will then have the first letter
% capitalised, as will the automatically generated |\cref| variants (see
% \cref{sec:individual_customisation,sec:low-level_customisation}).
% (However, if you explicitly define a |\cref| variant to \emph{not} be
% capitalised, \package{cleveref} will still honour your definition. In
% other words, you're responsible for defining the capitalisation
% correctly in your own format definitions.)
%
% You should \emph{still} use the |\Cref| variants at the beginning of
% sentences, for one thing, because abbreviations should not be used at
% the beginning of a sentence,\footnote{At least in English; I'm not sure
% about other languages.} and for another, in case you later change your
% mind and remove the \option{capitalise} option.
%
%
%
% \pagebreak
% \section{Customising the Cross-Reference Format}
% \label{sec:customising}
% The \package{cleveref} package allows you to take full control of the
% type-setting of cross-references, by allowing the formatting to be
% customised. Defaults appropriate for English documents are provided for
% the standard label types,\footnote{For any pedantic classics scholars
% out there: ``lemmas'' is recognised as a valid plural form of ``lemma''
% in all current versions of the Oxford English Dictionary. ``Lemmata''
% was last heard in a mathematical debate that took place in a pub just
% around the corner from Hadrian's wall\dots a few years before the
% Romans pulled out of Britain. \package{cleveref} might have ``clever''
% in its name, but even that doesn't make it pretentious enough to use
% ``lemmata''.} and support for a number of languages is provided via
% package options (see \cref{sec:language_babel}). But if you don't like
% the defaults, or are writing in a different language,\footnote{Any
% contributions of translations for missing languages are very welcome!
% See \cref{sec:code:babel} for information on how to contribute
% translations.} or you need to refer to something for which no default
% format is defined, then you can take charge and define your own
% formats.
%
% If \package{cleveref} encounters a cross-reference to a type it does
% not know, it will produce a ``reference type undefined'' warning, and
% type-set the cross-reference as
% \begin{quote}
%   {\bf ??}~|\ref{|\meta{label}|}|
% \end{quote}
% i.e.\ the label counter preceded by a double question mark. The error
% message indicates the name of the unknown cross-reference type, which
% you will then probably want to define. (References to undefined labels
% still produce a ``reference undefined'' warning and appear as a double
% question mark, as usual.)
%
% The cross-reference formats are usually constructed out of components:
% the cross-reference name (different for each type of cross-reference),
% the format for the label itself, and the conjunctions used in reference
% ranges and lists of multiple cross-references. There are two levels of
% customisation: you can either customise the components, or you can take
% full control and override the component-derived format entirely.
%
%
% \subsection{Customising the Cross-Reference Components}
% \label{sec:component_customisation}
%
% \subsubsection{Global Customisation}
% \label{sec:global_customisation}
% The global customisation commands affect all cross-reference formats,
% unless they are overridden by lower-level customisation commands.
%
% \DescribeMacro\crefdefaultlabelformat
% The format for the label counter itself can be customised globally
% using
% \begin{quote}
%   |\crefdefaultlabelformat{|\meta{format}|}|
% \end{quote}
% The \meta{format} argument can be any valid \LaTeX{} code, though you
% will need to |\protect| fragile commands. It can (and almost certainly
% should!) contain three arguments, |#1|, |#2| and |#3|. The first
% argument is the formatted version of the label counter (e.g.\
% |\theequation|). The other two are used to mark the beginning and end
% of the part of the cross-reference that should form the hyper-link when
% the \package{hyperref} package is used (see
% \cref{sec:other_packages}). The hyper-link arguments |#2| and |#3|
% \emph{must} appear in that order. (Leaving them out completely will not
% cause an error, but in that case no hyper-link will be created when
% \package{hyperref} is used, and there are better ways to achieve
% this. See \cref{sec:typesetting,sec:other_packages}.)
%
% Note that the default format for equation cross-references already
% overrides |\crefdefaultlabelformat| in order to surround the label
% by brackets, so the redefining |\crefdefaultlabelformat| will have no
% effect on equations. The label format for equations must be customised
% separately if you want to change it (see
% \cref{sec:individual_customisation}).
%
% \DescribeMacro\crefrangeconjunction
% The conjunction used in a reference range can be customised by
% defining |\crefrangeconjunction|:
% \begin{quote}
%   |\newcommand{\crefrangeconjunction}{|\meta{conjunction}|}|
% \end{quote}
% It does not have to be an actual conjunction in the linguistic sense,
% e.g.\ it is perfectly reasonable to define it to be an emdash
% ``|--|''. |\crefrangeconjunction| is used directly between the start
% and end references in a reference range, without any additional space
% surrounding it, e.g.\ |\crefrange{thm1}{thm2}| is type-set as
% \begin{quote}
%   |theorems~\ref{thm1}\crefrangeconjunction\ref{thm2}|
% \end{quote}
% so you may or may not want to include surrounding space, depending on
% the formatting you desire. For example,
% \begin{quote}
%   |\newcommand{\crefrangeconjunction}{ and~}|
% \end{quote}
% does require surrounding space, whereas
% \begin{quote}
%   |\newcommand{\crefrangeconjunction}{--}|
% \end{quote}
% does not.
%
% \DescribeMacro\crefrangepreconjunction
% \DescribeMacro\crefrangepostconjunction
% There are two other ``conjunction'' commands available for customizing
% the formating for reference ranges. These are
% |\crefrangepreconjunction| and |\crefrangepostconjunction|, which
% insert text before the first label defining the range, and after the
% second label, respectively. For example, when these commands are
% defined, |\crefrange{thm1}{thm2}| is type-set as
% \begin{quote}
%   |theorems~\crefrangepreconjunction\ref{thm1}|\\
%   | |\ding{229} |\crefrangeconjunction\ref{thm2}\crefrangepostconjunction|
% \end{quote}
% These commands are not used in the default English format definitions,
% but they are needed in some languages to correctly express a range. For
% example, the Italian format defines |\crefrangepreconjunction| to be
% ``da'', so that |\crefrange{thm1}{thm2}| produces
% \begin{quote}
%   |teorema da~\ref{thm1} a~\ref{thm2}|
% \end{quote}
%
% \DescribeMacro\crefpairconjunction
% \DescribeMacro\crefmiddleconjunction
% \DescribeMacro\creflastconjunction
% The conjunctions used in lists of multiple cross-references can be
% customised by defining the commands |\crefpairconjunction|,
% |\crefmiddleconjunction| and |\creflastconjunction|:
% \begin{quote}
%   |\newcommand{\crefpairconjunction}{|\meta{conjunction}|}|\\
%   |\newcommand{\crefmiddleconjunction}{|\meta{conjunction}|}|\\
%   |\newcommand{\creflastconjunction}{|\meta{conjunction}|}|
% \end{quote}
% |\crefpairconjunction| is used when there are only two cross-references
% in the list, |\creflastconjunction| is used between the penultimate and
% final cross-reference in a list of more than two, and
% |\crefmiddleconjunction| is used between all the others. Again, they do
% not have to be conjunctions in the linguistic sense, and the same
% considerations about surrounding space apply as in the case of
% |\crefrangeconjunction|. For example, the default definition of
% |\crefmiddleconjunction| is:
% \begin{quote}
%   |\newcommand{\crefmiddleconjunction}{, }|
% \end{quote}
%
% \DescribeMacro\crefpairgroupconjunction
% \DescribeMacro\crefmiddlegroupconjunction
% \DescribeMacro\creflastgroupconjunction
% By default, the conjunctions used to separate sub-lists of different
% cross-reference types in a multi-reference are identical to those used
% to separate cross-references of the same type.\footnote{More
%   accurately, if you redefine $\backslash$crefpairconjunction etc.\ in
%   your preamble, $\backslash$crefpairgroupconjunction etc.\ are
%   automatically redefined so that they match. (In some languages, the
%   default definition of $\backslash$creflastgroupconjunction has an
%   additional comma lacking in $\backslash$creflastconjunction.)} You
% can override this by defining the conjunction commands
% |\crefpairgroupconjunction|, |\crefmiddlegroupconjunction| and
% |\creflastgroupconjunction|.
%
% For example,
% \begin{quote}
%   |\cref{eq1,eq2,eq3,thm1,thm2,fig1,thm3}|
% \end{quote}
% is type-set as
% \begin{quote}
%   eqs.~(1)|\crefrangeconjunction|(3)|\crefmiddlegroupconjunction|%\\
%   theorems~1|\crefpairconjunction|2|\crefmiddlegroupconjunction|%\\
%   fig.~1|\creflastgroupconjunction{}|theorem~3
% \end{quote}
%
%
% \subsubsection{Customising Individual Cross-Reference Types}
% \label{sec:individual_customisation}
% \DescribeMacro\crefname
% \DescribeMacro\Crefname
% The cross-reference name for a given cross-reference type is customised
% using the |\crefname| and |\Crefname| commands:
% \begin{quote}
%   |\crefname{|\meta{type}|}{|\meta{singular}|}{|\meta{plural}|}|\\
%   |\Crefname{|\meta{type}|}{|\meta{singular}|}{|\meta{plural}|}|
% \end{quote}
% used by the |\cref| and |\Cref| commands, respectively. You must supply
% both \meta{singular} and \meta{plural} forms of the name. If the
% corresponding |\Crefname| is undefined when |\crefname| is called, it
% will automatically define |\Crefname| to be a capitalised version of
% |\crefname|, using |\MakeUppercase|. Conversely, if the corresponding
% |\crefname| is undefined when |\Crefname| is called, it will
% automatically define |\crefname| to be a lower-case version of
% |\Crefname|, using |\MakeLowercase|. Obviously, this will only work
% properly if the names begin with a letter. If the first letter is a
% special character construct, such as an accented character, you will
% need to surround it by braces. If the first thing in the name is
% \emph{not} a letter at all (e.g.\ if it is a \LaTeX{} command), you
% \emph{must} define both capitalisation variants explicitly. Otherwise
% you will get strange and fatal errors when processing the document.
%
% The cross-reference \meta{type} is usually the name of the counter for
% the environment (equation, chapter, section, etc.). The exceptions are
% appendices, labels whose type has been overridden explicitly by
% supplying an optional argument (see \cref{sec:label_type}), and
% theorem-like environments when the \package{ntheorem} package is
% loaded, for which \meta{type} should instead be the environment name
% (lemma, corollary, definition, etc.) even when different environments
% are part of the same numbering sequence. (\package{ntheorem} provides
% extra information about the environment when different theorem-like
% environments share a common counter, which \package{cleveref} makes use
% of to distinguish between them automatically.) In the case of
% appendices, the \meta{type} is ``appendix'' for the top-level
% sectioning command (|\chapter| or |\section|, depending on the document
% class), ``subappendix'' for the sectioning command one level below
% (|\section| or |\subsection|), ``subsubappendix'' for the next level of
% sectioning command, etc.
%
% For convenience, if they have not been otherwise customised by the end
% of the preamble, the cross-reference name (and label format) for
% |subsection| is by default inherited from that of |section|, and that
% of |subsubsection| is inherited from |subsection| (which might itself
% have been inherited from |section|). Similarly for |subappendix|,
% |subsubappendix| and |subsubsubappendix|, and also for |enumii|,
% |enumiii|, |enumiv| and |enumv|, which inherit from |enumi|. Finally,
% |subfigure| and |subtable| inherit from |figure| and |table|,
% respectively.
%
% \DescribeMacro\creflabelformat
% You may want the label format for a particular cross-reference type to
% differ from the global format set by |\crefdefaultlabelformat| (see
% \cref{sec:global_customisation}). You can do this using
% \begin{quote}
%   |\creflabelformat{|\meta{type}|}{|\meta{format}|}|
% \end{quote}
% The \meta{type} argument is the cross-reference type to customise, and
% the \meta{format} argument defines the label format for
% cross-references of that type. As in the case of\linebreak[4]
% |\crefdefaultlabelformat|, the latter should contain the three
% arguments |#1|, |#2| and |#3|, the first being the formatted version of
% the label counter, the others determining the beginning and end of the
% portion that becomes a hyper-link when the \package{hyperref} package
% is loaded (see \cref{sec:other_packages}). |#2| and |#3| \emph{must}
% appear in that order.
%
% \DescribeMacro\crefrangelabelformat
% Normally, the start and end references in a reference range are
% type-set using the usual label format (as defined by
% |\crefdefaultlabelformat| or |\creflabelformat|) separated by
% |\crefrangeconjunction| (\cref{sec:global_customisation}). You can
% override this for a given cross-reference type using
% \begin{quote}
%   |\crefrangelabelformat{|\meta{type}|}{|\meta{format}|}|
% \end{quote}
% The \meta{format} argument should contain six arguments: |#1|, |#2|,
% |#3|, |#4|, |#5|, |#6|. The first two (|#1| and |#2|) are the formatted
% versions of the two label counters defining the reference range. The
% next two (|#3| and |#4|) denote the beginning and end of the hyper-link
% for the first reference, the final two (|#5| and |#6|) the hyper-link
% for the second reference. The hyper-link arguments \emph{must} appear
% in order. For example,
% \begin{quote}
%   |\crefrangelabelformat{equation}{(#3#1#4) to~(#5#2#6)}|
% \end{quote}
%
%
% \subsubsection{Automatic \textbackslash\texttt{newtheorem} Definitions}
% \DescribeMacro\newtheorem
% The standard \LaTeX{} |\newtheorem| command for defining new
% theorem-like environments provides enough information to deduce a
% reasonable cross-reference name for the new environment. So
% \package{cleveref} automatically defines an appropriate cross-reference
% name for new theorem-like environments. This automatic definition is
% only used if no default definition is provided by \package{cleveref}
% itself, and if no |\crefname| or |\Crefname| definition is given
% explicitly (see \cref{sec:individual_customisation}).
%
% The caveat with this automatic definition is that, although
% |\newtheorem| essentially provides the singular form of the
% cross-reference name, it doesn't provide the plural form. And there is
% no reliable way of constructing the plural form from the
% singular.\footnote{If you're a native English-speaker, you might think
% that just adding an `s' would work, though a moment's thought will
% provide examples of words where this will fail. If you're a non-English
% speaker, it probably won't even occur to you to claim that plurals can
% reliably be constructed automatically!} Therefore, if the plural form
% is ever required, \package{cleveref} will produce a ``reference type
% undefined'' warning, and type-set the cross-reference where the plural
% form is required as:
% \begin{quote}
%   {\bf ??}~|\ref{|\meta{label}|}| \dots
% \end{quote}
% In this case, you will have to provide an explicit |\crefname| or
% |\Crefname| definition yourself, to define the plural form as well as
% the singular form.
%
%
%
% \subsection{Low-Level Customisation: Taking Full Control}
% \label{sec:low-level_customisation}
% If you need more precise control over the cross-reference format than
% is possible by customising the individual components, then you can take
% full control of the format for any given type, overriding the
% component-derived format entirely. The formats for single
% cross-references, reference ranges and multi-references are customised
% separately. If you only customise some of these, the other formats will
% be constructed from components, as usual.
%
% Note that when deciding which cross-references should be grouped
% together for sorting and/or compressing, \package{cleveref} does
% something slightly more complicated than simply checking whether the
% reference types match. In fact, it checks whether the reference
% \emph{formats} match.\footnote{To be precise, \package{cleveref} checks
% whether the $\backslash$|crefformat| definitions match.} This will
% always be the case for cross-references of the same type. But it could
% also be the case for cross-references that have different types, if the
% cross-reference formats happen to be identical.
%
% The reason for doing this is to allow cross-references to e.g.\
% sections and subsections to be grouped together if they have identical
% formats. The default formats for the sectioning commands, figures and
% subfigures, tables and subtables, and enumerated lists are set up in
% this way. If you change any of them using the low-level customisation
% commands, but still want them to be grouped together, then you must
% ensure that the formats are \emph{identical}. (It is \emph{not}
% sufficient for the formats to produce identical type-set text; the
% format definitions must contain identical \LaTeX{} code.)
%
% Note that if you use the low-level customisation commands, you might
% still want to provide |\crefname| and |\Crefname| definitions too, so
% that the |\namecref| commands will work (see \cref{sec:typesetting}).
%
%
% \subsubsection{Single Cross-References}
% \label{sec:ref_format}
% \DescribeMacro\crefformat
% \DescribeMacro\Crefformat
% Cross-reference formats for \emph{single} cross-references are defined
% or redefined using the\linebreak[4] |\crefformat| and |\Crefformat|
% commands, which are used by the |\cref| and |\Cref| commands
% respectively. These take two arguments: the cross-reference type, and
% the formatting code:
% \begin{quote}
%   |\crefformat{|\meta{type}|}{|\meta{format}|}|\\
%   |\Crefformat{|\meta{type}|}{|\meta{format}|}|
% \end{quote}
% The \meta{type} is usually the name of the counter, except for labels
% whose type has been overridden explicitly (see \cref{sec:label_type}),
% theorem-like environments when \package{ntheorem} is loaded, in which
% case it is the environment name, and appendices. For the latter, the
% \meta{type} is ``appendix'' for the top-level sectioning command
% (|\chapter| or |\section|, depending on the document class),
% ``subappendix'' for the sectioning command one level below (|\section|
% or |subsection|), ``subsubappendix'' for the next level of sectioning
% command, etc.
%
% As in the case of the |\crefname| and |\Crefname| commands, if the
% corresponding |\Crefformat| is undefined when |\crefformat| is called,
% it will define the |\Crefformat| to produce a capitalised version of
% |\crefformat|, using |\MakeUppercase|. Conversely, if the corresponding
% |\crefformat| is undefined whe |\Crefformat| is called, it will define
% the |\crefformat| to produce a lower-case version of |\Crefformat|,
% using |\MakeLowercase|. Obviously, this will only work properly if the
% format starts with a letter, and letter constructs (such as accented
% letter constructs) must be surrounded by braces (see
% \cref{sec:global_customisation}).
%
% The \meta{format} argument can be any valid \LaTeX{} code, though you
% will need to |\protect| fragile commands. It should contain three
% arguments, |#1|, |#2| and |#3|. The first argument is the formatted
% version of the label counter (e.g.\ |\theequation|). The other two are
% used to mark the beginning and end of the part of the cross-reference
% that forms the hyper-link when the \package{hyperref} package is used,
% and \emph{must} appear in that order (see \cref{sec:other_packages}).
%
% As an example,
% \begin{quote}
%   |\crefformat{equation}{Eq.~(#2#1#3)}|
% \end{quote}
% will type-set equation references as
% \begin{quote}
%   Eq.~(\meta{counter})
% \end{quote}
% with the counter (excluding the brackets) forming the hyper-link.
%
% Note that the hyper-link arguments are \emph{not} letters, so if |#2|
% appears at the beginning of \meta{format}, \package{cleveref} will not
% be able to automatically define the other capitalisation variant
% automatically using |\MakeUppercase| or |\MakeLowercase|. In this case,
% you will have to define both variants separately. For example, if you
% wanted to the ``Eq.'' to be part of the hyper-link, you would have to
% define:
% \begin{quote}
%   |\crefformat{equation}{#2eq.~(#1)#3}|\\
%   |\Crefformat{equation}{#2Eq.~(#1)#3}|
% \end{quote}
%
%
% \subsubsection{Reference Ranges}
% \label{sec:ref_range_format}
% \DescribeMacro\crefrangeformat
% \DescribeMacro\Crefrangeformat
% The format for reference ranges is defined by |\crefrangeformat|
% and\linebreak[4] |\Crefrangeformat|. Like |\creformat| and
% |\Crefformat|, the commands take two arguments: the cross-reference
% type, and the formatting code.
% \begin{quote}
%   |\crefrangeformat{|\meta{type}|}{|\meta{format}|}|\\
%   |\Crefrangeformat{|\meta{type}|}{|\meta{format}|}|
% \end{quote}
% The same comments apply as in the case of single cross-references: the
% \meta{type} is usually the name of the counter, except for appendices,
% labels with explicitly overridden types, and theorem-like environments
% when \package{ntheorem} is loaded. Again, if the other-capitalisation
% variant is not already defined, it will be defined automatically.
%
% The \meta{format} argument can again be any valid \LaTeX{} code, with
% fragile commands |\protect|ed. However, this time it should contain
% \emph{six} arguments, |#1|--|#6|. The first two (|#1| and |#2|) are the
% formatted versions of the label counters, the next two (|#3| and |#4|)
% are used to mark the beginning and end of the hyper-link for the first
% cross-reference, and the final two (|#5| and |#6|) mark the beginning
% and end of the second cross-reference's hyper-link.
%
% As an example,
% \begin{quote}
%   |\crefrangeformat{equation}{eqs.~(#3#1#4) to~(#5#2#6)}|
% \end{quote}
% would type-set equation reference ranges as
% \begin{quote}
%   eqs.~(\meta{counter1}) to~(\meta{counter2})
% \end{quote}
% with the counters (excluding the brackets) forming the hyper-links.
%
%
% \subsubsection{Multiple Cross-References}
% \label{sec:multiple_ref_format}
% \DescribeMacro\crefmultiformat
% \DescribeMacro\Crefmultiformat
% \DescribeMacro\crefrangemultiformat
% \DescribeMacro\Crefrangemultiformat
% The format for multiple cross-references is defined by
% |\crefmultiformat| and\linebreak[4] |\Crefmultiformat|, and that of
% reference ranges within multiple cross-references by
% |\crefrangemultiformat| and |\Crefrangemultiformat|. Multi-references
% also require \emph{all} the other cross-reference formats to be defined
% (see \cref{sec:ref_format,sec:ref_range_format}), including the single
% reference range formats, even if you never use the |\crefrange| and
% |\Crefrange| commands.
%
% The commands all take five arguments: the cross-reference type, the
% format for the first cross-reference in a list, the format for the
% second cross-reference in a list of two, the format for the middle
% cross-references in a list of more than two, and the format for the
% last cross-reference in a list of more than two.
% \begin{quote}
%   |\crefmultiformat{|\meta{type}|}{|\meta{first}|}{|\meta{second}|}{|\meta{middle}|}{|\meta{last}|}|\\
%   |\Crefmultiformat{|\meta{type}|}{|\meta{first}|}{|\meta{second}|}{|\meta{middle}|}{|\meta{last}|}|\\
%   |\crefrangemultiformat{|\meta{type}|}{|\meta{first}|}{|\meta{second}|}{|\meta{middle}|}{|\meta{last}|}|\\
%   |\Crefrangemultiformat{|\meta{type}|}{|\meta{first}|}{|\meta{second}|}{|\meta{middle}|}{|\meta{last}|}|
% \end{quote}
%
% The \meta{type} is, as ever, the counter name, except for appendices,
% explicitly overridden label types, and theorem-like environments then
% the \package{ntheorem} or \package{amsthm} packages are loaded. The
% same considerations apply to the formatting arguments \meta{first},
% \meta{second}, \meta{middle} and \meta{last} as for the \meta{format}
% argument of |\crefformat| or |\crefrangeformat|, including the meaning
% of the arguments that should appear in the formatting code (|#1|, |#2|
% and |#3| for |\crefmultiformat| and |\Crefmultiformat|, |#1|--|#6| for
% |\crefmultiformat| and |\Crefmultiformat|). However, when the
% corresponding other-capitalisation variant is automatically defined,
% only the first letter of the \meta{first} argument is upper- or
% lower-cased; the other arguments are defined to be identical for both
% variants.
%
% Be careful to get the spaces at the beginning and end of the formatting
% code correct: the \meta{first} and \meta{second}, or \meta{first},
% \meta{middle} and \meta{last}, \LaTeX{} code is type-set one after
% another in a multi-reference, with no space separating them. You may or
% may not want spaces at the beginning and end of the formatting code,
% depending on the formatting you desire. For example, in the default
% equation format:
% \begin{quote}
%   |\crefmultiformat{equation}{eqs.~(#2#1#3)}%|\\
%   |  { and~(#2#1#3)}{, (#2#1#3)}{ and~(#2#1#3)}|
% \end{quote}
% the \meta{middle} argument should \emph{not} have a space at the
% beginning, whereas the \meta{second} and \meta{last} arguments
% \emph{should} have a space.
%
%
% \subsubsection{Label Cross-References}
% If you define the format for a particular cross-reference type using
% the low-level customisation commands, and still want to use the
% |\labelcref| command to produce just the label part of the
% cross-reference, then you must also define the appropriate |\labelcref|
% formats for that type. This is done using the |\labelcrefformat|,
% |\labelcrefrangeformat|, |\labelcrefmultiformat| and
% |\labelcrefrangemultiformat| commands. Their syntax is identical to
% that of the corresponding |\crefformat|, |\crefrangmeformat|,
% |\crefmultiformat| or |\crefrangemultiformat| command. Typically, the
% |\labelcref| formats should be defined identically to the standard
% |\cref| formats, except for the \meta{first} part, which should leave
% off the cross-reference name.
%
%
%
% \subsection{Language and \package{babel} support}
% \label{sec:language_babel}
% \package{cleveref} supports different languages via package options, in
% the usual way, though not all languages are supported
% yet.\footnote{Contributions of translations for missing languages are
% very welcome! See \cref{sec:code:babel} for information on how to
% contribute translations.} The \package{babel} package is also supported
% when it is loaded, allowing you to change language using the
% \package{babel} language switching commands such as |\selectlanguage|
% and |\foreignlanguage|.
%
% The \package{babel} support works by redefining the cross-reference
% names and conjunctions for the default cross-reference types. Any
% customisations you make to the default cross-reference names and
% conjunctions \emph{in the preamble} apply to the main language (i.e.\
% the last language listed in the options). A |\selectlanguage|
% \package{babel} command (or similar) in the document body will override
% these customisations, replacing them with the defaults for the newly
% selected language. If you later use |\selectlanguage| to switch back to
% the main language, any customisations from the preamble will be
% restored. If you want to customise cross-reference names or
% conjunctions for any language other than the main one, you either have
% to explicitly redefine them after every language switching command, or
% hook the redefinitions into \package{babel}'s language switching
% mechanism. (See \cref{sec:code:babel} and the \package{babel} package
% documentation.)
%
% If you have defined formats for new cross-reference types for which no
% defaults are provided, then you're on your own. \package{cleveref} will
% not know how to redefine them for other languages, and again you will
% have to take care of it yourself, either by explicitly redefining them
% in your document after each language switch, or by hooking the
% redefinitions into \package{babel}'s language switching mechanism.
%
% On the other hand, since the language switching commands only modify
% the cross-reference components, if you use the low-level customisation
% commands to take full control of the format for a particular
% cross-reference type, then (unless you're careful) you take it out of
% the control of \package{babel} entirely. If you want to use the
% low-level customisation commands, but \emph{do} still want the language
% switching commands to work, then you have to use the component macros
% in your customised formats. The cross-reference names are stored in
% macros called |\cref@|\meta{type}|@name|, |\Cref@|\meta{type}|@name|,
% |\cref@|\meta{type}|@name@plural|, and
% |\Cref@|\meta{type}|@name@plural|.\linebreak[4] (Note that since these
% macro names contain the ``@'' character, you must use |\makeatletter|
% and |\makeatother| to access them.)
%
% For example, if you wanted to redefine the equation format so that the
% cross-reference name (``equation'') was also part of the hyper-link,
% but you still want to be able to switch language using \package{babel},
% you would need something like:
% \begin{quote}
%   |\makeatletter|\\
%   |\crefformat{equation}{#2\cref@equation@name~(#1)#3}|\\
%   \dots\\
%   |\makeatother|
% \end{quote}
% and similarly for |\crefrangeformat|, |\crefmultiformat|,
% |\Crefformat|, etc.
%
% Note that if you define an empty cross-reference name for some type
% using an empty |\crefname|, e.g.\ for equations
% \begin{quote}
%   |\crefname{equation}{}{}|
% \end{quote}
% then the empty cross-reference name will be retained when switching
% languages. This is probably what you want anyway.
%
%
% \section{Overriding the Cross-Reference Type}
% \label{sec:label_type}
% \DescribeMacro\label
% As described previously, a label's ``type'' is usually determined by
% its counter, or in the case of \package{ntheorem} or \package{amsthm}
% theorem-like environments by the environment name. However, sometimes
% it is useful to override the type. \package{cleveref} provides two
% different mechanisms for accomplishing this.
%
% You can alias a counter to a different cross-reference type using the
% |\crefalias| command:
% \begin{quote}
%   |\crefalias{|\meta{counter}|}{|\meta{type}|}|
% \end{quote}
% \meta{counter} will then use the cross-reference formatting of
% \meta{type}. This can be useful if you want multiple counters to use
% the same cross-reference format.
%
% Occasionally, you may want to override the cross-reference type for one
% particular label, one-off. You can do this by supplying the desired
% type as an optional argument to the |\label| command:
% \begin{quote}
%   |\label[|\meta{type}|]{|\meta{label}|}|
% \end{quote}
%
% One circumstance in which is useful is when you want to define a
% special cross-reference format for certain labels of a given type. By
% supplying a type that doesn't already exist as the optional argument to
% |\label|, you can then define the cross-reference format for that new
% type in whatever way you like, without affecting other cross-references
% of the same type. For example, if a particular equation contains
% multiple expressions and you want it to always be referred to in the
% plural, you could use:
% \begin{quote}
%   |\crefname{pluralequation}{eqs.}{eqs.}|\\
%   \dots\\
%   |\label[pluralequation]{eq1}|
% \end{quote}
% You can of course reuse this format for other plural equations, too.
%
% If you need to do this frequently, it can become tedious specifying the
% label explicitly each time. An alternative is to use the
% \package{aliascnt} package. This lets you define one counter to be an
% alias for another, so that effectively the same counter has two names.
% Since \package{cleveref} determines the label type from the counter
% name, the two counter aliases can have different cross-reference
% formats whilst really being the same counter. You have to somehow
% arrange for the correct counter alias to be used depending on which
% cross-reference format you want (probably by defining two variants of
% the environment in question). But the effort involved might be worth
% the convenience of not having to remember to pass an explicit optional
% argument to a large number of labels.
%
% You can use this trick to get different cross-reference formats for
% different theorem-like environments,\footnote{This trick seems to
% belong to \LaTeX{} mythology, and certainly isn't my own idea! But I
% haven't been able to definitively track down who originally came up
% with it.} \emph{without} using the \package{amsthm} or
% \package{ntheorem} package (although using one of those packages is a
% better solution if available). For example,
% \begin{quote}
%   |\usepackage{aliascnt}|\\
%   |\usepackage{cleveref}|\\
%   |\newaliascnt{lemma}{theorem}|\\
%   |\newtheorem{lemma}[lemma]{Lemma}|\\
%   |\aliascntresetthe{lemma}|\\
%   |\crefname{lemma}{lemma}{lemmas}|
% \end{quote}
% Note that \package{aliascnt} must be loaded before \package{cleveref},
% and any \cmd{\newaliascnt} commands \emph{must} come \emph{after}
% \package{cleveref} has been loaded.
%
%
%
% \section{Poor Man's \package{cleveref}}
% Sometimes you may need to send your \LaTeX{} source to someone who
% can't or won't install the \package{cleveref} package themselves. For
% example, many academic journals accept papers in \LaTeX{} format, but
% only support a small subset of the packages available on CTAN. The
% \option{poorman} option was designed specifically to help in this
% situation.
%
% When the \option{poorman} option is supplied, your document will be
% processed as normal. But in addition, a |sed| script will automatically
% be written, containing rules for replacing all the |\cref| commands
% with the \LaTeX{} code that they would produce, and using the standard
% |\ref| command to produce the cross-references themselves. I.e.\ the
% script rewrites your document as you would have done if you had had to
% do it manually!
%
% The advantage, of course, is that you \emph{don't} have to do it
% manually. Instead, you can use all the features of \package{cleveref},
% and once you've created a version of your document that you want to
% send elsewere, you can process it through the |sed| script to
% completely remove the \package{cleveref} dependency. The recipient
% won't even realise you used \package{cleveref}!
%
% The |sed| script is written to the same directory as the (main)
% \LaTeX{} source file, and given the same name as that source file but
% with the extension \file{.sed}. To process your document through the
% script, all you need to do is run the following from your shell:
% \begin{quote}
%   sed -f \meta{name}\file{.sed} \
%   \meta{name}\file{.tex} \textgreater \meta{newname}\file{.tex}
% \end{quote}
% where \meta{name} is the name of the file containing your \LaTeX{}
% source file minus the \file{.tex} extension, and \meta{newname} is
% whatever you want to call the new version. \emph{Do not} make
% \meta{newname} the same as \meta{name}: it won't work. (It's in any
% case wise to keep the original \LaTeX{} source file containing the
% \package{cleveref} commands, in case you need to produce an updated
% version of your document in the future. Think of the
% \meta{newname}\file{.tex} file in the same way as a \file{DVI} file:
% something you can always reproduce from the original source.)
%
% If your document is composed of a number of separate \LaTeX{} source
% files, combined with |\include| commands, only one |sed| script will be
% generated, but you will need to run \emph {each} source file through
% that \emph{same} script (and probably modify the |\include| commands to
% match the new file names). However, using \package{babel}'s language
% switching commands in a document split across multiple separate source
% files is beyond the capabilities of the \package{poorman} option. You
% will almost certainly need to manually tweak the |sed| script in that
% case.
%
% Note that the \option{poorman} script cannot fully reproduce the
% type-setting of the original \package{cleveref} cross-references in all
% cases.\footnote{At least, not without resorting to inserting low-level
% \LaTeX{} code in your document, which would somewhat defeat the purpose
% of the \option{poorman} option.} In particular, any customisation of
% hyper-links will be lost, and if you're using \package{varioref} with
% the \option{legacyvarioref} option (see \cref{sec:other_packages}), the
% spacing before the |\vref| command will not be correct.
%
%
%
% \section{Interaction with Other Packages}
% \label{sec:other_packages}
% The \package{cleveref} package \emph{must} be loaded \emph{after} all
% other packages that don't specifically support it,\footnote{At the time
% of writing, I'm not aware of any that do.} i.e.\ the
% \begin{quote}
%   |\usepackage{cleveref}|
% \end{quote}
% line should always be the last |\usepackage| command in your document's
% preamble.
%
% Since \package{cleveref} redefines many internal commands involved in
% \LaTeX{}'s cross-referencing system, it can interact badly with other
% packages that do the same. \package{cleveref} implements a
% significantly enhanced version of the features found in the
% \package{fancyref} package, \package{ntheorem}'s \option{thref} option,
% and \package{varioref}'s |\labelformat| command. Although these
% features may (or may not) work correctly alongside \package{cleveref},
% there is no good reason to use these when using \package{cleveref}, and
% their use is unsupported. (Note that \package{varioref} \emph{is} fully
% supported by \package{cleveref}, just that \package{cleveref}'s
% features supersede \package{varioref}'s |\labelformat| feature.)
%
% \DescribeMacro{\thref}
% \DescribeMacro{\vref}
% \DescribeMacro{\Vref}
% \DescribeMacro{\vrefrange}
% \DescribeMacro{\Vrefrange}
% \DescribeMacro{\fullref}
% \DescribeMacro{\Fullref}
% In fact, if \package{ntheorem} is loaded with the \option{thref}
% option, \package{cleveref} redefines \package{ntheorem}'s |\thref|
% command for you, to be an alias for |\cref|. Similarly, if
% \package{varioref} is loaded, \package{cleveref} redefines the |\vref|,
% |\vrefrange|, |\fullref| commands and variants to instead use the
% \package{cleveref} features for cross-reference formatting, whilst
% retaining all the \package{varioref} page-referencing magic. You can
% continue to use the other \package{varioref} and \package{ntheorem}
% commands (other than |\labelformat| and the \option{thref} option)
% whilst using \package{cleveref}, as long as \package{cleveref} is
% loaded \emph{last}.
%
% \DescribeMacro{\vref*}
% \DescribeMacro{\Vref*}
% \DescribeMacro{\vrefrange*}
% \DescribeMacro{\Vrefrange*}
% \DescribeMacro{\fullref*}
% \DescribeMacro{\Fullref*}
% Note that, whilst in the business of redefining the \package{varioref}
% commands, \package{cleveref} seizes the opportunity to get rid of the
% irritating spacing behaviour of the |\vref| and |\Vref| commands,
% instead making it consistent with the other \package{cleveref}
% cross-referencing commands. This also frees up the starred variants to
% be used to suppress hyper-links when the \package{hyperref} package is
% loaded, as usual. (Unfortunately, due to lack of support for this in
% \package{varioref}, the page references will still be hyper-links, even
% when using the starred variants. Go bug the \package{varioref}
% maintainer about this if you don't like it.)
%
% \DescribeMacro{legacyvarioref}
% However, the \package{cleveref} redefinitions break strict
% compatibility with the original \package{varioref} commands. If you
% need the original spacing behaviour for compatibility reasons, pass the
% \option{legacyvarioref} option to \package{cleveref}. If this option is
% supplied, only the original \package{varioref} commands |\vref|,
% |\vref*|, |\vrefrange| and |\fullref| will be provided, not any of the
% additional variants, and the starred variants will change the spacing
% around the commands as per the original \package{varioref}
% implementation, rather than supressing hyper-links.
%
% \package{cleveref} should now be compatible with the \package{memoir}
% class, as well as with the \package{titleref}, \package{nameref} and
% \package{byname} packages, and \package{hyperref}'s \option{backref}
% option. This support is quite new, however, so expect some niggles and
% please report any bugs you encounter. Other packages which alter the
% \LaTeX{} referencing system may or may not work properly with
% \package{cleveref}. See \cref{sec:known_bugs} for additional
% information.
%
%
%
% \section{Known Bugs and Possible Improvements}
% \label{sec:known_bugs}
%
% \subsection{Known Bugs, Non-Bugs, and Work-Arounds}
% In no particular order:
% \begin{itemize}
% \item When both the \package{amsmath} \emph{and} \package{hyperref}
%   packages are loaded at the same time, the \package{cleveref}
%   cross-referencing commands do not work when used within section
%   titles. If anyone can figure out why, let me know! As a work-around,
%   use |\ref| within section titles when your document uses both
%   \package{amsmath} and \package{hyperref}.
% \item \package{cleveref} will not work properly with the standard
%   \LaTeX{} |eqnarray| environment. There is no intention to fix this.
%   The |eqnarray| environment is poorly implemented, making it difficult
%   to get it to work properly with \package{cleveref}. You're better off
%   using the \package{amsmath} replacements in any case, such as
%   |gather|, |align|, |multline| and |split|, which \emph{do} work
%   properly with \package{cleveref}. (See
%   \url{http://www.tug.org/pracjourn/2006-4/madsen/}).
% \item \package{cleveref} doesn't include support for all languages yet.
%   Please contribute translations for missing languages!\footnote{See
%   \cref{sec:code:babel} for information on how to contribute
%   translations.}
% \item \package{cleveref} can't cope with active characters being
%   present in cross-reference label names. For example, if French
%   \package{babel} support is loaded, the commonly used ``:'' in label
%   names will often fail, spewing the usual random selection of
%   mysterious \TeX{} errors that accompany such deep-seated errors. The
%   solution is to avoid using active characters in label names. (You may
%   need to consult e.g.\ the \package{babel} documentation to discover
%   which active characters are defined in your language.)
% \item \package{cleveref} assumes that counters are only ever reset by
%   the standard sectioning commands (|\chapter|, |\section|, etc.). If
%   this is not the case, the automatic compression of consecutive
%   cross-references into a reference range may be incorrect. Making this
%   more flexible would be a simple task, but so far there doesn't seem
%   to be much need for it.
% \item \package{cleveref} doesn't know about the \package{subfloat}
%   package, so you have to revert to using |\ref| for cross-references
%   to sub-figures. (This should be fixed in a future version.)
% \item The \package{beamer} document class redefines the |\label|
%   command in a particularly devious way that breaks
%   \package{cleveref}'s optional argument to that command. (This should
%   be fixed in a future version.)
% \item The \option{poorman} |sed| script loses any custom
%   \package{cleveref} hyper-link formatting you might have defined, and
%   does not reproduce the original spacing around the |\vref| command
%   when \package{varioref} is used with the \option{legacyvarioref}
%   option. This is not a bug; it is a side-effect of the intended
%   purpose of the \option{poorman} option. The philosophy behind
%   \option{poorman} is to replace \package{cleveref}'s enhanced
%   cross-referencing with standard \LaTeX{} cross-reference commands
%   that are guaranteed to work with any standard \LaTeX{} installation.
%   Although it would be simple to fix these ``bugs'', it's almost
%   certainly impossible without using low-level \LaTeX{} code that is
%   unlikely to be supported by journals, thereby defeating the whole
%   purpose of the \option{poorman} option.
% \end{itemize}
%
%
% \subsection{Possible Improvements}
% In no particular order:
% \begin{itemize}
% \item The \option{poorman} option could be enhanced to allow a choice
%   of scripting language rather than just |sed| (e.g.\ |awk|, |perl|,
%   \dots?), but these are unlikely to be much better for those apt to
%   complain about the use of |sed|. The portable option would be to
%   output a \TeX{} ``script'', but this would be \emph{much} more
%   work\footnote{\LaTeX{} \emph{really} isn't suited to that kind of
%   pattern matching task -- just take a look at the code for escaping
%   regexp special characters in this package!} than I'm prepared to
%   invest.
% \end{itemize}
%
%
%
% \section{Thanks}
% A number of people have helped improve \package{cleveref} by
% contributing code and translations. Thanks to Michael Ummels for
% contributing the \package{amsthm} support code, and to Stefan Pinnow,
% Gonzalo Medina, Massimo Redaelli, Philip H\"olzenspies, Aleksander
% Gorohovski and Benjamin H{\o}yer for contributing translations. Thanks
% also to Susie Goldschmidt for additional help with some of 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: Alan Munn, Aleksander
% Gorohovski, Anand Deopurkar, Arne Meier, Bas Ploeger, Dan Luecking,
% David Gleich, Denis Bitouz\'e, Domenic Denicola, Donald Arsenau,
% Hendrik Maryns, James Sharam, Jens Mueller, Joel C. Salomon, Joris
% Pinkse, Kristian Debrabant Leo Shidai Liu, Lev Bishop, Mak Trifkovic,
% Matej Batic, Matt Gately, Matthew Skala, Michael Barber, Michael
% Gorven, Michal Kaut, Olivier Roy, Paul Gomme, Ricardo de Aldama
% S\'anchez, Stefan Pinnow, Ted Pavlic, Thomas Arildsen, and Uwe L\"uck
% for their help. (If I missed you out, please let me know!)
%
%
% \StopEventually{\clearpage\PrintChanges\clearpage\PrintIndex}
%
%
% \clearpage
% \section{Implementation}
% Essentially, the core of the implementation consists of causing an
% extra piece of information -- the label ``type'' -- to be written to
% the aux file, and defining \cmd{\cref} commands which use this extra
% information to type-set the reference.
%
% The least invasive implementation of this kind of thing seems to be
% that used by the \package{varioref} package. Namely, to redefine the
% \cmd{\refstepcounter} command so that the \cmd{\@currentlabel} macro,
% which usually just contains the type-set version of the counter, now
% contains the additional type information.
%
% However, even less invasive than \package{varioref}'s implementation is
% to leave \cmd{\@currentlabel} alone, and define a new
% \cmd{\cref@currentlabel} macro to hold the extra information. (In fact,
% we store three extra pieces of information: the type, the counter value
% itself, and the value of the counter that causes the label's counter to
% be reset, which we call the ``prefix'' from now on.)
% \cmd{\@currentlabel} eventually gets written to the aux file as an
% argument to \cmd{\newlabel} by the usual \LaTeX{} label mechanisms. In
% order to get the information in \cmd{\cref@currentlabel} into the aux
% file, we also have to redefine the \cmd{\label} macro so that it writes
% \emph{two} \cmd{\newlabel} lines to the aux file for \emph{each} label:
% the standard one, plus an additional one which contains the extra
% information in \cmd{\cref@currentlabel}. The additional \cmd{\newlabel}
% line has the prefix |cref@| added to the label name. Thus the extra
% information in \cmd{\cref@currentlabel} will end up in
% \cmd{\r@cref@\meta{label}} when the aux file is re-read on the next
% pass.
%
% Doing things this way involves less hacking to get everything else
% working again, since the standard cross-reference mechanism and
% \cmd{\ref} command are left entirely intact. \package{cleveref} can
% then do what it likes with its own parallel set of labels, without
% getting in the way of other packages that play around with the
% cross-reference mechanism. The only downside is the additional memory
% resources this uses, but on modern \TeX{} implementations this is
% unlikely to be a problem.
%
%
% \subsection{Redefinitions of \LaTeX{} kernel macros}
% \begin{macro}{\refstepcounter}
% \begin{macro}{\cref@currentlabel}
% \begin{macro}{\cref@old@refstepcounter}
%   We store the original \cmd{\refstepcounter} in
%   \cmd{\cref@old@refstepcounter}, then redefine \cmd{\refstepcounter}
%   so that it first calls the old version to define the standard
%   \cmd{\@currentlabel} macro, before defining \package{cleveref}'s
%   \cmd{\cref@currentlabel}, which contains the extra information. The
%   cross-reference ``type'' stored in \cmd{cref@currentlabel} is usually
%   inferred from the counter. This can be overridden by aliasing the
%   counter name to a different type using \cmd{\crefalias}. The new
%   \cmd{\refstepcounter} can also take an optional argument, which
%   always overrides the type.
%    \begin{macrocode}
\def\cref@currentlabel{}
\let\cref@old@refstepcounter\refstepcounter
\def\refstepcounter{%
  \@ifnextchar[{\refstepcounter@optarg}{\refstepcounter@noarg}%]
}
\def\refstepcounter@noarg#1{%
  \cref@old@refstepcounter{#1}%
  \cref@constructprefix{#1}{\cref@result}%
  \@ifundefined{cref@#1@alias}%
    {\def\@tempa{#1}}%
    {\def\@tempa{\csname cref@#1@alias\endcsname}}%
  \protected@xdef\cref@currentlabel{%
    [\@tempa][\arabic{#1}][\cref@result]%
    \csname p@#1\endcsname\csname the#1\endcsname}}
\def\refstepcounter@optarg[#1]#2{%
  \cref@old@refstepcounter{#2}%
  \cref@constructprefix{#2}{\cref@result}%
  \protected@xdef\cref@currentlabel{%
    [#1][\arabic{#2}][\cref@result]%
    \csname p@#2\endcsname\csname the#2\endcsname}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@footnotetext}
% \begin{macro}{\@mpfootnotetext}
%   Footnotes don't use the \cmd{\refstepcounter} mechansism, but instead
%   set\linebreak[4] \cmd{\@currentlabel} directly in
%   \cmd{\@footnotetext} or \cmd{\@mpfootnotetext}. We modifiy these to
%   make them also set \cmd{\cref@currentlabel} appropriately.
%    \begin{macrocode}
\let\cref@old@footnotetext\@footnotetext
\let\cref@old@mpfootnotetext\@mpfootnotetext
\def\@footnotetext{%
  \cref@constructprefix{footnote}{\cref@result}%
  \protected@xdef\cref@currentlabel{%
    [footnote][\arabic{footnote}][\cref@result]\p@footnote\@thefnmark}%
  \cref@old@footnotetext}
\def\@mpfootnotetext#1{%
  \cref@constructprefix{mpfootnote}{\cref@result}%
  \protected@xdef\cref@currentlabel{%
    [footnote][\arabic{mpfootnote}][\cref@result]\p@footnote\@thefnmark}%
  \cref@old@mpfootnotetext{#1}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\label}
%   We redefine the \cmd{\label} command to make it define \emph{two}
%   labels each time it's called: the standard one, and an additional
%   \package{cleveref}-specific one with the prefix |cref@| added to the
%   label name, which contains the extra information from
%   \cmd{cref@currentlabel}. We call the original \cmd{\label} command,
%   stored in \cmd{\cref@old@label}, to write the standard label to the
%   aux file. However, to avoid other packages messing around with the
%   content of the parallel set of \package{cleveref}-specific labels, we
%   write those directly to the aux file ourselves. We also allow
%   \cmd{\label} to take an optional argument which overrides the default
%   reference type in \cmd{\cref@currentlabel}.
%
%   The redefinition of \cmd{\label} has to be postponed until the
%   beginning of the document because some other packages postpone their
%   own \cmd{\label} redefinitions too, and we need to override their
%   redefinitions.
%    \begin{macrocode}
\AtBeginDocument{%
  \let\cref@old@label\label
  \def\label{\@ifnextchar[\label@optarg\label@noarg}%]
  \def\label@noarg#1{%
    \@bsphack%
    \cref@old@label{#1}%
    \protected@write\@auxout{}%
      {\string\newlabel{cref@#1}{{\cref@currentlabel}{\thepage}}}%
    \@esphack}%
  \def\label@optarg[#1]#2{%
    \@bsphack%
    \cref@old@label{#2}%
    \protected@xdef\cref@currentlabel{%
      \expandafter\cref@override@label@type%
        \cref@currentlabel\@nil{#1}}%
    \protected@write\@auxout{}%
      {\string\newlabel{cref@#2}{{\cref@currentlabel}{\thepage}}}%
    \@esphack}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{amsmath}
% \begin{macro}{\label}
% \begin{macro}{\label@in@display}
%   The \package{amsmath} package redefines the \cmd{\label} command
%   within equation environments, so if it is loaded we have to extend
%   the behaviour to support the optional argument. With
%   \package{amsmath}, the original \cmd{\label} command is stored in
%   \cmd{\ltx@label}, and \cmd{\label@in@display} replaces \cmd{label}
%   inside equations. \cmd{\label@in@display} just saves the label for
%   later, and defining it is left until the end of the equation, when
%   \cmd{\ltx@label} is finally called.
%
%   To allow \cmd{\label} within equations to support an optional
%   argument, we first store the original \cmd{\label@in@display} and the
%   new \cmd{\label} macro we defined above (since \cmd{\label} will be
%   clobbered inside equations). Then we redefine \cmd{label@in@display}
%   so that it wraps all its arguments, including any optional argument,
%   in an extra set of braces. These are stripped away again by
%   \cmd{\ltx@label} before calling the \cmd{\label} macro we defined
%   above (saved in \cmd{\cref@label}).
%    \begin{macrocode}
  \@ifpackageloaded{amsmath}{%
    \let\cref@label\label
    \let\cref@old@label@in@display\label@in@display
    \def\label@in@display{%
      \@ifnextchar[\label@in@display@optarg\label@in@display@noarg}%]
    \def\label@in@display@noarg#1{\cref@old@label@in@display{{#1}}}
    \def\label@in@display@optarg[#1]#2{%
      \cref@old@label@in@display{[#1]{#2}}}
    \def\ltx@label#1{\cref@label#1}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\measure@}
% \begin{macro}{\gmeasure@}
%   The \package{amsmath} multi-line equation environments scan their
%   bodies twice: once to measure, once to type-set. In the measure
%   phase, the \cmd{\label} command is disabled by letting it to
%   \cmd{\@gobble}. Unfortunately, this won't gobble all the arguments if
%   an optional argument is supplied to \cmd{\label}, so we have to
%   modify the \package{amsmath} measuring commands so that they let
%   \cmd{\label} to \cmd{\@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
%   this other than copying the \package{amsmath} definitions and making
%   the modification directly in the macro's code. This is a recipe for
%   future chaos if these commands are ever modified in a new version of
%   \package{amsmath}, but it seems we have no choice. Luckily,
%   \package{amsmath} isn't updated too often!
%    \begin{macrocode}
\def\measure@#1{%
    \begingroup
        \measuring@true
        \global\eqnshift@\z@
        \global\alignsep@\z@
        \global\let\tag@lengths\@empty
        \global\let\field@lengths\@empty
        \savecounters@
        \global\setbox0\vbox{%
            \let\math@cr@@@\math@cr@@@align@measure
            \everycr{\noalign{\global\tag@false
              \global\let\raise@tag\@empty \global\column@\z@}}%
            \let\label\@gobble@optarg%  <<< cleveref modification
            \global\row@\z@
            \tabskip\z@
            \halign{\span\align@preamble\crcr
                #1%
                \math@cr@@@
                \global\column@\z@
                \add@amps\maxfields@\cr
            }%
        }%
        \restorecounters@
        \ifodd\maxfields@
            \global\advance\maxfields@\@ne
        \fi
        \ifnum\xatlevel@=\tw@
            \ifnum\maxfields@<\thr@@
                \let\xatlevel@\z@
            \fi
        \fi
        \setbox\z@\vbox{%
          \unvbox\z@ \unpenalty \global\setbox\@ne\lastbox
        }%
        \global\totwidth@\wd\@ne
        \if@fleqn \global\advance\totwidth@\@mathmargin \fi
        \global\let\maxcolumn@widths\@empty
        \begingroup
          \let\or\relax
          \loop
            \global\setbox\@ne\hbox{%
              \unhbox\@ne \unskip \global\setbox\thr@@\lastbox
            }%
          \ifhbox\thr@@
           \xdef\maxcolumn@widths{ \or \the\wd\thr@@ \maxcolumn@widths}%
          \repeat
        \endgroup
        \dimen@\displaywidth
        \advance\dimen@-\totwidth@
        \ifcase\xatlevel@
            \global\alignsep@\z@
            \let\minalignsep\z@
            \@tempcntb\z@
            \if@fleqn
                \@tempcnta\@ne
                \global\eqnshift@\@mathmargin
            \else
                \@tempcnta\tw@
                \global\eqnshift@\dimen@
                \global\divide\eqnshift@\@tempcnta
            \fi
        \or
            \@tempcntb\maxfields@
            \divide\@tempcntb\tw@
            \@tempcnta\@tempcntb
            \advance\@tempcntb\m@ne
            \if@fleqn
                \global\eqnshift@\@mathmargin
                \global\alignsep@\dimen@
                \global\divide\alignsep@\@tempcnta
            \else
                \global\advance\@tempcnta\@ne
                \global\eqnshift@\dimen@
                \global\divide\eqnshift@\@tempcnta
                \global\alignsep@\eqnshift@
            \fi
        \or
            \@tempcntb\maxfields@
            \divide\@tempcntb\tw@
            \global\advance\@tempcntb\m@ne
            \global\@tempcnta\@tempcntb
            \global\eqnshift@\z@
            \global\alignsep@\dimen@
            \if@fleqn
                \global\advance\alignsep@\@mathmargin\relax
            \fi
            \global\divide\alignsep@\@tempcntb
        \fi
        \ifdim\alignsep@<\minalignsep\relax
            \global\alignsep@\minalignsep\relax
            \ifdim\eqnshift@>\z@
                \if@fleqn\else
                    \global\eqnshift@\displaywidth
                    \global\advance\eqnshift@-\totwidth@
                    \global\advance\eqnshift@-\@tempcntb\alignsep@
                    \global\divide\eqnshift@\tw@
                \fi
            \fi
        \fi
        \ifdim\eqnshift@<\z@
            \global\eqnshift@\z@
        \fi
        \calc@shift@align
        \global\tagshift@\totwidth@
        \global\advance\tagshift@\@tempcntb\alignsep@
        \if@fleqn
            \ifnum\xatlevel@=\tw@
                \global\advance\tagshift@-\@mathmargin\relax
            \fi
        \else
            \global\advance\tagshift@\eqnshift@
        \fi
        \iftagsleft@ \else
            \global\advance\tagshift@-\displaywidth
        \fi
        \dimen@\minalignsep\relax
        \global\advance\totwidth@\@tempcntb\dimen@
        \ifdim\totwidth@>\displaywidth
            \global\let\displaywidth@\totwidth@
        \else
            \global\let\displaywidth@\displaywidth
        \fi
    \endgroup
}
\def\gmeasure@#1{%
    \begingroup
        \measuring@true
        \totwidth@\z@
        \global\let\tag@lengths\@empty
        \savecounters@
        \setbox\@ne\vbox{%
            \everycr{\noalign{\global\tag@false
              \global\let\raise@tag\@empty \global\column@\z@}}%
            \let\label\@gobble%  <<< cleveref modification
            \halign{%
                \setboxz@h{$\m@th\displaystyle{##}$}%
                \ifdim\wdz@>\totwidth@
                    \global\totwidth@\wdz@
                \fi
               &\setboxz@h{\strut@{##}}%
                \savetaglength@
                \crcr
                #1%
                \math@cr@@@
            }%
        }%
        \restorecounters@
        \if@fleqn
            \global\advance\totwidth@\@mathmargin
        \fi
        \iftagsleft@
            \ifdim\totwidth@>\displaywidth
                \global\let\gdisplaywidth@\totwidth@
            \else
                \global\let\gdisplaywidth@\displaywidth
            \fi
        \fi
    \endgroup
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\multline@}
% \begin{macro}{\mmeasure@}
% \begin{macro}{\label@mmeasure@noarg}
% \begin{macro}{\label@mmeasure@optarg}
%   The |multline| environment works a bit differently to the other
%   \package{amsmath} environments, in that \cmd{\label} is
%   \emph{disabled} during the type-setting phase, and \emph{enabled}
%   during the measuring phase. To cope with \package{cleveref}'s
%   optional argument, we have to define separate versions of
%   \cmd{\label@in@display} specifically for \cmd{\mmeasure@}.
%    \begin{macrocode}
\def\multline@#1{%
    \Let@
    \@display@init{\global\advance\row@\@ne \global\dspbrk@lvl\m@ne}%
    \chardef\dspbrk@context\z@
    \restore@math@cr
    \let\tag\tag@in@align
    \global\tag@false \global\let\raise@tag\@empty
    \mmeasure@{#1}%
    \let\tag\gobble@tag \let\label\@gobble@optarg%  <<< cleveref modification
    \tabskip \if@fleqn \@mathmargin \else \z@skip \fi
    \totwidth@\displaywidth
    \if@fleqn
        \advance\totwidth@-\@mathmargin
    \fi
    \halign\bgroup
        \hbox to\totwidth@{%
            \if@fleqn
                \hskip \@centering \relax
            \else
                \hfil
            \fi
            \strut@
            $\m@th\displaystyle{}##\endmultline@math
            \hfil
        }% $
        \crcr
        \if@fleqn
            \hskip-\@mathmargin
            \def\multline@indent{\hskip\@mathmargin}%
        \else
            \hfilneg
            \def\multline@indent{\hskip\multlinegap}%
        \fi
        \iftagsleft@
            \iftag@
                \begingroup
                    \ifshifttag@
                        \rlap{\vbox{%
                                \normalbaselines
                                \hbox{%
                                    \strut@
                                    \make@display@tag
                                }%
                                \vbox to\lineht@{}%
                                \raise@tag
                        }}%
                        \multline@indent
                    \else
                        \setbox\z@\hbox{\make@display@tag}%
                        \dimen@\@mathmargin \advance\dimen@-\wd\z@
                        \ifdim\dimen@<\multlinetaggap
                          \dimen@\multlinetaggap
                        \fi
                        \box\z@ \hskip\dimen@\relax
                    \fi
                \endgroup
            \else
                \multline@indent
            \fi
        \else
            \multline@indent
        \fi
    #1%
}
\def\mmeasure@#1{%
    \begingroup
        \measuring@true
        \def\label{%                  <<< cleveref modification
          \@ifnextchar[\label@in@mmeasure@optarg%]
            \label@in@mmeasure@noarg}%
        \def\math@cr@@@{\cr}%
        \let\shoveleft\@iden \let\shoveright\@iden
        \savecounters@
        \global\row@\z@
        \setbox\@ne\vbox{%
            \global\let\df@tag\@empty
            \halign{%
                \setboxz@h{\@lign$\m@th\displaystyle{}##$}%
                \iftagsleft@
                    \ifnum\row@=\@ne
                        \global\totwidth@\wdz@
                        \global\lineht@\ht\z@
                    \fi
                \else
                    \global\totwidth@\wdz@
                    \global\lineht@\dp\z@
                \fi
                \crcr
                #1%
                \crcr
            }%
        }%
        \ifx\df@tag\@empty\else\global\tag@true\fi
        \if@eqnsw\global\tag@true\fi
        \iftag@
            \setboxz@h{%
                \if@eqnsw
                    \stepcounter{equation}%
                    \tagform@\theequation
                \else
                    \df@tag
                \fi
            }%
            \global\tagwidth@\wdz@
            \dimen@\totwidth@
            \advance\dimen@\tagwidth@
            \advance\dimen@\multlinetaggap
            \iftagsleft@\else
                \if@fleqn
                    \advance\dimen@\@mathmargin
                \fi
            \fi
            \ifdim\dimen@>\displaywidth
                \global\shifttag@true
            \else
                \global\shifttag@false
            \fi
        \fi
        \restorecounters@
    \endgroup
}
\def\label@in@mmeasure@noarg#1{%
  \begingroup%
    \measuring@false%
    \cref@old@label@in@display{{#1}}%
  \endgroup}
\def\label@in@mmeasure@optarg[#1]#2{%
  \begingroup%
    \measuring@false%
    \cref@old@label@in@display{[#1]{#2}}%
  \endgroup}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{subequations}
%   In order for |subequations| to be sorted properly, \package{cleveref}
%   needs to know that the |equation| counter is effectively reset by the
%   |parentequation| counter within the |subequations| environment. This
%   isn't how |amsmath| implements subequations (for obvious reasons!),
%   but we harmlessly add the |equation| counter to the |parentequation|
%   counter's reset list \emph{within} |subequations| environments, so
%   that \package{cleveref}'s sorting mechanism can figure things out. We
%   also harmlessly make sure |parentequation| is reset by the same
%   counter as |equation|.
%    \begin{macrocode}
  \let\cref@old@subequations\subequations%
  \let\cref@old@endsubequations\endsubequations%
  \cref@resetby{equation}{\cref@result}%
  \ifx\cref@result\relax\else%
    \@addtoreset{parentequation}{\cref@result}%
  \fi%
  \renewenvironment{subequations}{%
    \@addtoreset{equation}{parentequation}%
    \cref@old@subequations%
  }{%
    \gdef\cl@parentequation{}%
    \cref@old@endsubequations%
    \setcounter{parentequation}{0}%
  }%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\make@df@tag@@}
% \begin{macro}{\make@df@tag@@@}
%   We override the internals of the \package{amsmath} \cmd{\tag} command
%   to add the additional information to the label definition. Since
%   labels produced by \cmd{\tag} have no logical ordering when sorting a
%   list of references, we give them a large numerical value so that they
%   get pushed to the end of sorted cross-reference lists.
%    \begin{macrocode}
    \def\make@df@tag@@#1{%
      \gdef\df@tag{\maketag@@@{#1}\def\@currentlabel{#1}%
        \def\cref@currentlabel{[equation][2147483647][]#1}}}
    \def\make@df@tag@@@#1{%
      \gdef\df@tag{\tagform@{#1}%
        \toks@\@xp{\p@equation{#1}}%
          \edef\@currentlabel{\the\toks@}%
          \edef\cref@currentlabel{[equation][2147483647][]\the\toks@}}}
  }{}%  end of \@ifpackageloaded{amsmath}
}%  end of AtBeginDocument
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\appendix}
% \begin{macro}{\cref@old@appendix}
%   The \cmd{\appendix} command causes the top-level sectioning commands
%   (\cmd{\chapter} or \cmd{\section}, depending on the document class)
%   to produce appendices instead. Since we want to be able to format
%   references to appendices separately from references to normal
%   top-level sections, we add to the tasks that \cmd{\appendix} does: it
%   redefines \cmd{\refstepcounter@noarg} to exceptionally override the
%   label type for chapters or sections, as appropriate, setting it to
%   ``appendix'' instead. There are two alternative definitions: one if
%   ``section'' is the top-level sectioning command, and one if
%   ``chapter'' fulfils that role.
%    \begin{macrocode}
\let\cref@old@appendix\appendix
\renewcommand\appendix{%
  \cref@old@appendix%
  \@ifundefined{chapter}{%
    \gdef\refstepcounter@noarg##1{%
      \cref@old@refstepcounter{##1}%
      \cref@constructprefix{##1}{\cref@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@result\@empty%
        \def\cref@result{2147483647}%
      \else%
        \edef\cref@result{2147483647,\cref@result}%
      \fi%
%    \end{macrocode}
%       Override the cross-reference type of sectioning commands.
%    \begin{macrocode}
      \def\@tempa{##1}%
      \def\@tempb{section}%
      \ifx\@tempa\@tempb%
        \protected@xdef\cref@currentlabel{%
          [appendix][\arabic{##1}][\cref@result]%
          \csname p@##1\endcsname\csname the##1\endcsname}%
      \else%
        \def\@tempa{##1}%
        \def\@tempb{subsection}%
        \ifx\@tempa\@tempb%
          \protected@xdef\cref@currentlabel{%
            [subappendix][\arabic{##1}][\cref@result]%
            \csname p@##1\endcsname\csname the##1\endcsname}%
        \else%
          \def\@tempa{##1}%
          \def\@tempb{subsubsection}%
          \ifx\@tempa\@tempb%
            \protected@xdef\cref@currentlabel{%
              [subsubappendix][\arabic{##1}][\cref@result]%
              \csname p@##1\endcsname\csname the##1\endcsname}%
          \else%
            \@ifundefined{cref@##1@alias}%
              {\def\@tempa{##1}}%
              {\def\@tempa{\csname cref@##1@alias\endcsname}}%
            \protected@xdef\cref@currentlabel{%
              [\@tempa][\arabic{##1}][\cref@result]%
              \csname p@##1\endcsname\csname the##1\endcsname}
          \fi%
        \fi%
      \fi}%
  }{%
    \def\refstepcounter@noarg##1{%
      \cref@old@refstepcounter{##1}%
      \cref@constructprefix{##1}{\cref@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@result\@empty%
        \def\cref@result{2147483647}%
      \else%
        \edef\cref@result{2147483647,\cref@result}%
      \fi%
%    \end{macrocode}
%       Override the cross-reference type of sectioning commands.
%    \begin{macrocode}
      \def\@tempa{##1}%
      \def\@tempb{chapter}%
      \ifx\@tempa\@tempb%
        \protected@xdef\cref@currentlabel{%
          [appendix][\arabic{##1}][\cref@result]%
          \csname p@##1\endcsname\csname the##1\endcsname}%
      \else%
        \def\@tempa{##1}%
        \def\@tempb{section}%
        \ifx\@tempa\@tempb%
          \protected@xdef\cref@currentlabel{%
            [subappendix][\arabic{##1}][\cref@result]%
            \csname p@##1\endcsname\csname the##1\endcsname}%
        \else%
          \def\@tempa{##1}%
          \def\@tempb{subsection}%
          \ifx\@tempa\@tempb%
            \protected@xdef\cref@currentlabel{%
              [subsubappendix][\arabic{##1}][\cref@result]%
              \csname p@##1\endcsname\csname the##1\endcsname}%
          \else%
            \def\@tempa{##1}%
            \def\@tempb{subsubsection}%
            \ifx\@tempa\@tempb%
              \protected@xdef\cref@currentlabel{%
                [subsubsubappendix][\arabic{##1}][\cref@result]%
                \csname p@##1\endcsname\csname the##1\endcsname}%
            \else%
              \@ifundefined{cref@##1@alias}%
                {\def\@tempa{##1}}%
                {\def\@tempa{\csname cref@##1@alias\endcsname}}%
              \protected@xdef\cref@currentlabel{%
                [\@tempa][\arabic{##1}][\cref@result]%
                \csname p@##1\endcsname\csname the##1\endcsname}
            \fi%
          \fi%
        \fi%
      \fi}%
  }%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%
% \subsection{Utility Macros}
%
% \subsubsection{miscelaneous}
% \begin{macro}{\@gobble@optarg}
%   A basic macro that gobbles one argument plus, if present, one
%   optional argument.
%    \begin{macrocode}
\def\@gobble@optarg{\@ifnextchar[\@@gobble@optarg\@gobble@orig}%]
\def\@gobble@orig#1{}
\def\@@gobble@optarg[#1]#2{}
%    \end{macrocode}
% \end{macro}
%
%
% \subsubsection{aux file information}
% \begin{macro}{\cref@getlabel}
% \begin{macro}{\cref@gettype}
% \begin{macro}{\cref@getcounter}
% \begin{macro}{\cref@getprefix}
%   Define some utility macros for extracting label, type, and counter
%   information from the contents of \cmd{\cref@currentlabel}, as written to
%   the aux file and stored in \cmd{\r@cref@\meta{label}} when this is re-read
%   on the next pass. Some other packages commandeer the referencing
%   system to write label information to the aux file for other purposes,
%   and probably use \cmd{\ref} to recover it later. We still want them
%   to work, so our utility macros must cope with the type information
%   being absent. However, since we need them to be fully expandable in
%   various places, and \cmd{\@ifnextchar} is definitely \emph{not} fully
%   expandable, we use the work-around of having the macros store their
%   result in another macro, whose name is passed as the second
%   argument. This other macro \emph{will} then be fully expandable, and
%   can be used e.g.\ inside an \cmd{\edef} or
%   \cmd{\csname}\ldots\cmd{\endcsname}.
%    \begin{macrocode}
\def\cref@getlabel#1#2{%
  \expandafter\let\expandafter\@tempa\csname r@cref@#1\endcsname%
  \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\@tempa%
    \expandafter\expandafter\expandafter{%
      \expandafter\@firstoftwo\@tempa}%
  \expandafter\@cref@getlabel\@tempa\@nil#2}%
\def\@cref@getlabel{\@ifnextchar[%]
  \@@cref@getlabel{\@@cref@getlabel[][][]}}
\def\@@cref@getlabel[#1][#2][#3]#4\@nil#5{\def#5{#4}}
\def\cref@gettype#1#2{%
  \expandafter\let\expandafter\@tempa\csname r@cref@#1\endcsname%
  \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\@tempa%
    \expandafter\expandafter\expandafter{%
      \expandafter\@firstoftwo\@tempa}%
  \expandafter\@cref@gettype\@tempa\@nil#2}%
\def\@cref@gettype{\@ifnextchar[%]
  \@@cref@gettype{\@@cref@gettype[][][]}}
\def\@@cref@gettype[#1][#2][#3]#4\@nil#5{\def#5{#1}}
\def\cref@getcounter#1#2{%
  \expandafter\let\expandafter\@tempa\csname r@cref@#1\endcsname%
  \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\@tempa%
    \expandafter\expandafter\expandafter{%
      \expandafter\@firstoftwo\@tempa}%
  \expandafter\@cref@getcounter\@tempa\@nil#2}
\def\@cref@getcounter{\@ifnextchar[%]
  \@@cref@getcounter{\@@cref@getcounter[][][]}}
\def\@@cref@getcounter[#1][#2][#3]#4\@nil#5{\def#5{#2}}
\def\cref@getprefix#1#2{%
  \expandafter\let\expandafter\@tempa\csname r@cref@#1\endcsname%
  \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\@tempa%
    \expandafter\expandafter\expandafter{%
      \expandafter\@firstoftwo\@tempa}%
  \expandafter\@cref@getprefix\@tempa\@nil#2}
\def\@cref@getprefix{\@ifnextchar[%]
  \@@cref@getprefix{\@@cref@getprefix[][][]}}
\def\@@cref@getprefix[#1][#2][#3]#4\@nil#5{\def#5{#3}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \cmd{\cref@override@label@type} is a convenience macro for overriding
% the label type stored in \cmd{\cref@currentlabel}.
% \begin{macro}{\cref@override@label@type}
%    \begin{macrocode}
\def\cref@override@label@type[#1][#2][#3]#4\@nil#5{[#5][#2][#3]#4}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\cref@constructprefix}
%   The \cmd{\cref@constructprefix} macro constructs the prefix
%   information stored in \cmd{\cref@currentlabel} (retrieved using
%   \cmd{\cref@getprefix}). This information consists of the numerical
%   value of each counter that's involved in resetting the label's
%   counter, i.e.\ it contains the numerical values of the chapter,
%   section, subsection\dots numbers that (ought to) make up the
%   formatted label produced by \cmd{\the\meta{counter}}. E.g. if
%   \cmd{\theequation} produces ``B.1.3'', this utility macro will return
%   ``2,1'' (the ``3'' corresponds to the equation number itself, which
%   is stored separately in \cmd{\cref@currentlabel}). The first argument
%   is the counter in question; the return value is stored in the second
%   argument, which should be a macro name.
%
%   The real work is done by the recursive \cmd{\@cref@constructprefix}
%   macro, which works its way upwards through the counters' reset lists
%   until it reaches a counter that isn't reset by any other.
%    \begin{macrocode}
\def\cref@constructprefix#1#2{%
  \cref@stack@init{\@tempstack}%
%    \end{macrocode}
% We fully expand the first argument (the counter name) because sometimes
% a counter name containing a macro gets passed to us.
%    \begin{macrocode}
  \edef\@tempa{\noexpand{#1\noexpand}}%
  \expandafter\def\expandafter\@tempa\expandafter{\@tempa{#2}}%
  \expandafter\@cref@constructprefix\@tempa%
  \cref@stack@to@list{\@tempstack}{\@tempa}%
  \expandafter\def\expandafter#2\expandafter{\@tempa}}
\def\@cref@constructprefix#1#2{%
  \cref@resetby{#1}{#2}%
  \ifx#2\relax%
  \else%
    \edef\@tempa{\the\csname c@#2\endcsname}%
    \expandafter\cref@stack@push\expandafter{\@tempa}{\@tempstack}%
    \edef\@tempa{{#2}}%
    \expandafter\expandafter\expandafter\@cref@constructprefix%
      \expandafter\@tempa\expandafter{\expandafter#2\expandafter}%
  \fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\cref@append@toks}
%   A basic utility macro for appending tokens to a token register.
%    \begin{macrocode}
\def\cref@append@toks#1#2{\toks0={#2}%
  \edef\act{\noexpand#1={\the#1\the\toks0}}%
  \act}%
%    \end{macrocode}
% \end{macro}
%
%
% \subsubsection{Stack data structures}
% \begin{macro}{\cref@stack@init}
% \begin{macro}{\cref@stack@top}
% \begin{macro}{\cref@stack@pop}
% \begin{macro}{\cref@stack@push}
% \begin{macro}{\cref@stack@topandbottom}
% \begin{macro}{\cref@stack@add}
% \begin{macro}{\cref@stack@to@list}
%   We treat multiple references, supplied as a comma-separated list to
%   \cmd{\cref} or \cmd{\Cref}, as a stack structure. So we define some
%   utility macros for manipulating stacks (\cmd{\@nil} is used as an
%   end-of-stack delimeter).
%    \begin{macrocode}
\def\cref@stack@init#1{\def#1{\@nil}}
\def\cref@stack@top#1{\expandafter\@cref@stack@top#1}
\def\@cref@stack@top#1,#2\@nil{#1}
\def\cref@stack@pop#1{\expandafter\@cref@stack@pop#1#1}
\def\@cref@stack@pop#1,#2\@nil#3{\def#3{#2\@nil}}
\def\cref@stack@push#1#2{%
  \expandafter\@cref@stack@push\expandafter{#2}{#1}{#2}}
\def\@cref@stack@push#1#2#3{\def#3{#2,#1}}
\def\cref@stack@pull#1#2{\expandafter\@cref@stack@pull#2{#1}{#2}}
\def\@cref@stack@pull#1\@nil#2#3{\def#3{#1#2,\@nil}}
\def\cref@stack@to@list#1#2{%
  \cref@isstackfull{#1}%
  \if@cref@stackfull%
    \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter#2%
    \expandafter\expandafter\expandafter{%
      \expandafter\@cref@stack@to@list#1}%
  \else%
    \def#2{}%
  \fi}
\def\@cref@stack@to@list#1,\@nil{#1}
\def\cref@stack@topandbottom#1#2#3{%
  \def#2{}%
  \def#3{}%
  \cref@isstackfull{#1}%
  \if@cref@stackfull%
    \edef#2{\cref@stack@top{#1}}%
    \cref@stack@pop{#1}%
    \cref@isstackfull{#1}%
    \@whilesw\if@cref@stackfull\fi{%
      \edef#3{\cref@stack@top{#1}}%
      \cref@stack@pop{#1}%
      \cref@isstackfull{#1}}%
  \fi}
\def\cref@stack@add#1#2{%
  \begingroup%
    \def\@arg1{#1}%
    \let\@tempstack#2%
    \newif\if@notthere%
    \@nottheretrue%
    \cref@isstackfull{\@tempstack}%
    \@whilesw\if@cref@stackfull\fi{%
      \edef\@tempb{\cref@stack@top{\@tempstack}}%
      \def\@tempa{#1}%
      \ifx\@tempa\@tempb%
        \@cref@stackfullfalse%
        \@nottherefalse%
      \else%
        \cref@stack@pop{\@tempstack}%
        \cref@isstackfull{\@tempstack}%
      \fi}%
  \expandafter\endgroup%
  \if@notthere\cref@stack@push{#1}{#2}\fi}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\if@cref@stackempty}
% \begin{macro}{\if@cref@stackfull}
% \begin{macro}{\cref@isstackempty}
% \begin{macro}{\cref@isstackfull}
%   The \cmd{\cref@isstackempty} and \cmd{\cref@isstackfull} macros test
%   whether a stack is empty or full, respectively, and set the
%   corresponding conditionals\linebreak[4] |\if@cref@stackempty| and
%   |\if@cref@stackfull|.
%    \begin{macrocode}
\newif\if@cref@stackempty
\newif\if@cref@stackfull
\def\cref@isstackempty#1{%
  \def\@tempa{\@nil}%
  \ifx#1\@tempa\@cref@stackemptytrue%
  \else\@cref@stackemptyfalse\fi}
\def\cref@isstackfull#1{%
  \def\@tempa{\@nil}%
  \ifx#1\@tempa\@cref@stackfullfalse%
  \else\@cref@stackfulltrue\fi}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\cref@stack@sort}
%   The \cmd{\cref@stack@sort} macro sorts a stack, using the comparison
%   macro passed in the second argument, 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 referrences, so in practice a
%   more complicated $O(n\log n)$ sorting algorithm will very likely be
%   slower anyway in practice.
%    \begin{macrocode}
\def\cref@stack@sort#1#2{%
  \begingroup%
  \cref@stack@init{\@sortstack}%
%    \end{macrocode}
% Push first element into sorted stack.
%    \begin{macrocode}
  \edef\@element{\cref@stack@top{#1}}%
  \expandafter\cref@stack@push\expandafter{\@element}{\@sortstack}%
  \cref@stack@pop{#1}%
%    \end{macrocode}
% If empty elements follow first one, need to add them after it in sorted
% stack.
%    \begin{macrocode}
  \cref@isstackfull{#1}%
  \if@cref@stackfull%
    \edef\@tempa{\cref@stack@top{#1}}%
    \@whilesw\ifx\@tempa\@empty\fi{%
      \cref@stack@pull{}{\@sortstack}%
      \cref@stack@pop{#1}%
      \cref@isstackempty{#1}%
      \if@cref@stackempty%
        \let\@tempa\relax%
      \else%
        \edef\@tempa{\cref@stack@top{#1}}%
      \fi}%
  \fi%
%    \end{macrocode}
% Process elements from stack.
%    \begin{macrocode}
  \cref@isstackfull{#1}%
  \@whilesw\if@cref@stackfull\fi{%
    \edef\@element{\cref@stack@top{#1}}%
    \cref@stack@pop{#1}%
%    \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@isstackfull{#1}%
    \if@cref@stackfull%
      \edef\@tempa{\cref@stack@top{#1}}%
      \@whilesw\ifx\@tempa\@empty\fi{%
        \edef\@empties{\@empties,}%
        \cref@stack@pop{#1}%
        \cref@isstackempty{#1}%
        \if@cref@stackempty%
          \let\@tempa\relax%
        \else%
          \edef\@tempa{\cref@stack@top{#1}}%
        \fi}%
    \fi%
%    \end{macrocode}
% Insert current element into sorted stack, appending any following empty
% elements.
%    \begin{macrocode}
    \edef\@tempa{{\expandafter\noexpand\@element}%
      {\expandafter\noexpand\@empties}%
      {\noexpand\@sortstack}{\noexpand#2}}%
    \expandafter\cref@stack@insert\@tempa%
    \cref@isstackfull{#1}}%
  \expandafter\endgroup\expandafter%
  \def\expandafter#1\expandafter{\@sortstack}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\cref@stack@insert}
%   \cmd{\cref@stack@insert}|{#1}{#2}{#3}{#4}| inserts |#1| into the
%   appropriate location in the sorted stack |#3| (appending |#2| onto
%   the end of |#1| when it's inserted), using the comparison macro |#4|.
%    \begin{macrocode}
\def\cref@stack@insert#1#2#3#4{%
  \let\@cmp#4%
  \@cref@stack@insert{}{#1}{#2}{#3}%
  \cref@stack@pop{#3}}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\@cref@stack@insert}
%   \cmd{\@cref@stack@insert}|{#1}{#2}{#3}{#4}| prepends |#1| to the
%   stack resulting from inserting |#2| (with |#3| appended to it) into
%   the sorted stack |#4|.
%    \begin{macrocode}
\def\@cref@stack@insert#1#2#3#4{%
  \let\@iterate\relax%
  \cref@isstackempty{#4}%
  \if@cref@stackempty%
    \cref@stack@push{#1,#2#3}{#4}%
  \else%
    \edef\@tempa{\cref@stack@top{#4}}%
    \expandafter\@cmp\expandafter{\@tempa}{#2}{\cref@result}%
    \ifnum\cref@result=2\relax%
      \cref@stack@push{#1,#2#3}{#4}%
    \else%
      \cref@stack@pop{#4}%
      \edef\@tempa{{\noexpand#1,\@tempa}{\noexpand#2}%
        {\noexpand#3}{\noexpand#4}}%
      \expandafter\def\expandafter\@iterate\expandafter%
        {\expandafter\@cref@stack@insert\@tempa}%
    \fi%
  \fi%
  \@iterate}
%    \end{macrocode}
% \end{macro}
%
%
% \subsubsection{Sorting and comparison of counters}
% \begin{macro}{\cref@countercmp}
%   The \cmd{\cref@countercmp} macro compares two sets of counter data,
%   as returned by \cmd{\cref@getcounter}, and \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.
%    \begin{macrocode}
\def\cref@counter@first#1#2\@nil{#1}
\def\cref@counter@rest#1#2\@nil{#2}
\def\cref@countercmp#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@result{1}%
  \else%
    \def\@tempa{#2}%
    \ifx\@tempa\@empty%
      \def\cref@result{2}%
    \else%
%    \end{macrocode}
% Conversely, undefined references come after everything else.
%    \begin{macrocode}
      \expandafter\ifx\csname r@cref@#1\endcsname\relax%
        \def\cref@result{2}%
      \else%
        \expandafter\ifx\csname r@cref@#2\endcsname\relax%
          \def\cref@result{1}%
        \else%
%    \end{macrocode}
% The real work of comparing two references is done by
% \cmd{\@cref@countercmp}.
%    \begin{macrocode}
          \cref@getcounter{#1}{\@countera}%
          \cref@getprefix{#1}{\@prefixa}%
          \cref@getcounter{#2}{\@counterb}%
          \cref@getprefix{#2}{\@prefixb}%
          \cref@stack@init{\@countstacka}%
          \expandafter\cref@stack@push\expandafter%
            {\@countera}{\@countstacka}%
          \ifx\@prefixa\@empty\else%
            \expandafter\cref@stack@push\expandafter%
              {\@prefixa}{\@countstacka}%
          \fi%
          \cref@stack@init{\@countstackb}%
          \expandafter\cref@stack@push\expandafter%
            {\@counterb}{\@countstackb}%
          \ifx\@prefixb\@empty\else%
            \expandafter\cref@stack@push\expandafter%
              {\@prefixb}{\@countstackb}%
          \fi%
          \@cref@countercmp%
        \fi%
      \fi%
    \fi%
  \fi%
  \expandafter\endgroup\expandafter%
  \chardef\expandafter#3\expandafter=\cref@result\relax}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\cref@countercmp}
%   The \cmd{\@cref@countercmp} macro recursively compares counter
%   components until it runs out of components for one of the references,
%   or finds an two corresponding components that are unequel.
%    \begin{macrocode}
\def\@cref@countercmp{%
  \let\@iterate\relax%
  \cref@isstackempty{\@countstacka}%
  \if@cref@stackempty%
    \cref@isstackempty{\@countstackb}%
    \if@cref@stackempty%
      \def\cref@result{0}%
    \else%
      \def\cref@result{1}%
    \fi%
  \else%
    \cref@isstackempty{\@countstackb}%
    \if@cref@stackempty%
      \def\cref@result{2}%
    \else%
      \edef\@tempa{\cref@stack@top{\@countstacka}}%
      \cref@stack@pop{\@countstacka}%
      \edef\@tempb{\cref@stack@top{\@countstackb}}%
      \cref@stack@pop{\@countstackb}%
      \ifnum\@tempa<\@tempb\relax%
        \def\cref@result{1}%
      \else%
        \ifnum\@tempa>\@tempb\relax%
          \def\cref@result{2}%
        \else%
          \def\@iterate{\@cref@countercmp}%
        \fi%
      \fi%
    \fi%
  \fi%
  \@iterate}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\if@cref@inresetlist}
% \begin{macro}{\cref@isinresetlist}
% \begin{macro}{\cref@resetby}
%   We need to be able to determine which counter is used to reset a
%   given counter. Usually, resets are done by sectioning counters, and
%   we assume that to be the case here. \cmd{\cref@isinresetlist}
%   searches through one counter's reset list, stored in
%   \cmd{\cl@\meta{counter}}, to determine whether another counter
%   appears there, and sets the new conditional
%   appropriately. \cmd{\cref@reset@by} searches through all the
%   sectioning counters' reset lists, from lowest-level (subsubsection)
%   to highest (part), checking whether the given counter is in the list,
%   and returns the first sectioning counter in whose list it appears.
%   (The value is returned by defining its second argument, which should
%   be a macro name.)
%    \begin{macrocode}
\newif\if@cref@inresetlist
\def\cref@isinresetlist#1#2{%
  \begingroup%
    \def\@counter{#1}%
%    \end{macrocode}
%   We locally redefine \cmd{\@elt}, which appears at the head of the
%   expansion of |\cl@|\meta{counter}, so that entries in the reset list
%   end up separated by commas, thus can be treated as a stack.
%    \begin{macrocode}
    \def\@elt##1{##1,}%
    \expandafter\ifx\csname cl@#2\endcsname\relax%
      \def\cref@resetstack{,\@nil}%
    \else%
      \edef\cref@resetstack{\csname cl@#2\endcsname\noexpand\@nil}%
    \fi%
    \let\@nextcounter\relax%
    \cref@isstackfull{\cref@resetstack}%
    \@whilesw\if@cref@stackfull\fi{%
      \edef\@nextcounter{\cref@stack@top{\cref@resetstack}}%
      \ifx\@nextcounter\@counter%
        \@cref@stackfullfalse%
      \else%
        \let\@nextcounter\relax%
        \cref@stack@pop{\cref@resetstack}%
        \cref@isstackfull{\cref@resetstack}%
      \fi}%
    \ifx\@nextcounter\relax%
      \def\@next{\@cref@inresetlistfalse}%
    \else%
      \def\@next{\@cref@inresetlisttrue}%
    \fi%
  \expandafter%
  \endgroup%
  \@next}
%    \end{macrocode}
%
% FIXME: We could easily remove the hard-coded search order in
% \cmd{\cref@resetby} and, say, replace it with a customisable list of
% counters to search in order. But, so far, I've yet to encounter a need
% for anything other than the hard-coded default.
%    \begin{macrocode}
\def\cref@resetby#1#2{%
  \let#2\relax%
%    \end{macrocode}
% 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@isinresetlist{#1}{figure}%
    \if@cref@inresetlist%
      \def#2{figure}%
    \fi%
  \fi%
  \def\@tempa{#1}%
  \def\@tempb{subtable}%
  \ifx\@tempa\@tempb%
    \cref@isinresetlist{#1}{table}%
    \if@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
% is used by \package{amsmath}'s |subequations| environment. Although
% \package{amsmath} doesn't implement |subequations| using counter reset
% lists, \package{cleveref}'s \package{amsmath} support (above) tweaks
% the reset lists inside |subequations| environments to hook into this
% mechanism. We should really only check this when \package{amsmath} is
% loaded, but checking it anyway might catch other packages that
% independently implement amsmath's |subequations| environment (are there
% any?).
%    \begin{macrocode}
  \@ifundefined{cl@parentequation}{}{%
    \def\@tempa{#1}%
    \def\@tempb{equation}%
    \ifx\@tempa\@tempb%
      \cref@isinresetlist{#1}{parentequation}%
      \if@cref@inresetlist%
        \expandafter\ifnum\c@parentequation=0\else%
          \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}.
%    \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@isinresetlist{#1}{enumiv}%
    \if@cref@inresetlist%
      \def#2{enumiv}%
    \else%
      \cref@isinresetlist{#1}{enumiii}%
      \if@cref@inresetlist%
        \def#2{enumiii}%
      \else%
        \cref@isinresetlist{#1}{enumii}%
        \if@cref@inresetlist%
          \def#2{enumii}%
        \else%
          \cref@isinresetlist{#1}{enumi}%
          \if@cref@inresetlist%
            \def#2{enumi}%
          \else%
           \cref@isinresetlist{#1}{part}%
            \if@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.
%    \begin{macrocode}
  \ifx#2\relax%
    \cref@isinresetlist{#1}{table}%
    \if@cref@inresetlist%
      \def#2{table}%
    \else%
      \cref@isinresetlist{#1}{subsubsection}%
      \if@cref@inresetlist%
        \def#2{subsubsection}%
      \else%
        \cref@isinresetlist{#1}{subsection}%
        \if@cref@inresetlist%
          \def#2{subsection}%
        \else%
          \cref@isinresetlist{#1}{section}%
          \if@cref@inresetlist%
            \def#2{section}%
          \else%
            \cref@isinresetlist{#1}{chapter}%
            \if@cref@inresetlist%
              \def#2{chapter}%
            \else%
             \cref@isinresetlist{#1}{part}%
              \if@cref@inresetlist%
                \def#2{part}%
              \else%
                \let#2\relax%
              \fi%
            \fi%
          \fi%
        \fi%
      \fi%
    \fi%
  \fi}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\if@cref@refconsecutive}
% \begin{macro}{\cref@isrefconsecutive}
%   Define a new conditional to test whether two references are
%   consecutive (needed when type-setting reference ranges). This uses the
%   counter and prefix (i.e. formatted version of the counter that resets
%   the label's counter) information provided by \cmd{\r@cref@\meta{label}}
%   (via the aux file) to check if the prefices are identical (i.e. the
%   references come from the same chapter, section or whatever), and that
%   the label counters differ by 0 or 1.
%    \begin{macrocode}
\newif\if@cref@refconsecutive%
\def\cref@isrefconsecutive#1#2{%
  \begingroup%
    \countdef\refa@counter=0%
    \countdef\refb@counter=1%
    \cref@getcounter{#1}{\cref@result}%
    \refa@counter=\cref@result%
    \cref@getcounter{#2}{\cref@result}%
    \refb@counter=\cref@result%
    \cref@getprefix{#1}{\refa@prefix}%
    \cref@getprefix{#2}{\refb@prefix}%
    \def\@after{\@cref@refconsecutivefalse}%
    \ifx\refa@prefix\refb@prefix%
      \ifnum\refa@counter=\refb@counter\relax%
        \def\@after{\@cref@refconsecutivetrue}%
      \else%
        \advance\refa@counter 1\relax%
        \ifnum\refa@counter=\refb@counter\relax%
          \def\@after{\@cref@refconsecutivetrue}%
        \fi%
      \fi%
    \fi%
  \expandafter\endgroup\@after}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%
% \subsubsection{Reference stack processing}
% \begin{macro}{\cref@processgroup}
%   \cmd{\cref@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
%   different type to those that came before. Note that empty references
%   are treated as having the same type as the preceding one.
%    \begin{macrocode}
\def\cref@processgroup#1#2{%
  \edef\@nextref{\cref@stack@top{#1}}%
  \expandafter\ifx\csname r@cref@\@nextref\endcsname\relax%
    \def\@grouptype{\@undefined}%
    \def\@groupformat{\@undefined}%
  \else%
    \expandafter\cref@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@stack@pull\expandafter{\@nextref}{#2}%
    \cref@stack@pop{#1}%
    \cref@isstackempty{#1}%
    \if@cref@stackempty%
      \let\@nexttype\relax%
      \let\@nextformat\relax%
    \else%
      \edef\@nextref{\cref@stack@top{#1}}%
      \ifx\@nextref\@empty%
        \let\@nexttype\@grouptype%
        \let\@nextforamt\@groupformat%
      \else%
        \expandafter\ifx\csname r@cref@\@nextref\endcsname\relax%
          \def\@nexttype{\@undefined}%
          \def\@nextformat{\@undefined}%
        \else%
          \expandafter\cref@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%
      \fi%
    \fi}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\cref@processgroupall}
%   \cmd{\cref@processgroupall} processes the first group of references
%   from the stack passed in argument |#1|, by moving all references with
%   the same type as the first one into the stack passed in argument
%   |#2|.
%    \begin{macrocode}
\def\cref@processgroupall#1#2{%
  \cref@stack@init{\@tempstack}%
  \edef\@nextref{\cref@stack@top{#1}}%
  \expandafter\ifx\csname r@cref@\@nextref\endcsname\relax%
    \def\@grouptype{\@undefined}%
    \def\@groupformat{\@undefined}%
  \else%
    \expandafter\cref@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@isstackfull{#1}%
%
  \@whilesw\if@cref@stackfull\fi{%
    \edef\@nextref{\cref@stack@top{#1}}%
    \ifx\@nextref\@empty%
      \ifx\@lastformat\@groupformat%
        \let\@nexttype\@grouptype%
        \let\@nextformat\@groupformat%
      \else%
        \let\@nexttype\relax%
        \let\@nextformat\relax%
      \fi%
    \else%
      \expandafter\ifx\csname r@cref@\@nextref\endcsname\relax%
        \def\@nexttype{\@undefined}%
        \def\@nextformat{\@undefined}%
      \else%
        \expandafter\cref@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%
    \fi%
%
    \ifx\@nextformat\@groupformat%
      \expandafter\cref@stack@pull\expandafter{\@nextref}{#2}%
    \else%
      \expandafter\cref@stack@pull\expandafter{\@nextref}{\@tempstack}%
    \fi%
    \cref@stack@pop{#1}%
    \let\@lasttype\@nexttype%
    \let\@lastformat\@nextformat%
    \cref@isstackfull{#1}}%
  \let#1\@tempstack}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\cref@processconsecutive}
%   \cmd{\cref@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.
%    \begin{macrocode}
\def\cref@processconsecutive#1#2#3#4{%
  #4=0%
  \edef\@nextref{\cref@stack@top{#1}}%
  \cref@stack@pop{#1}%
%    \end{macrocode}
% If stack only contains one reference, set appropriate return values.
%    \begin{macrocode}
  \cref@isstackempty{#1}%
  \if@cref@stackempty%
    \edef#2{\@nextref}%
    \let#3\relax%
    #4=1\relax%
%    \end{macrocode}
% If stack contains multiple references, find end of consecutive references.
%    \begin{macrocode}
  \else%
    \edef#2{\@nextref}%
    \let#3\relax%
    \edef\@nextref{\cref@stack@top{#1}}%
    #4=1\relax%
    \expandafter\ifx\csname r@cref@#2\endcsname\relax%
      \@cref@refconsecutivefalse%
    \else%
%    \end{macrocode}
%     If next reference in substack 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.
%    \begin{macrocode}
      \ifx\@nextref\@empty%
        \@cref@refconsecutivefalse%
        \@whilesw\ifx\@nextref\@empty\fi{%
          \cref@stack@pop{#1}%
          \cref@isstackempty{#1}%
          \if@cref@stackempty%
            \let\@nextref\relax%
          \else%
            \edef\@nextref{\cref@stack@top{#1}}%
          \fi}%
%    \end{macrocode}
%     Otherwise, test whether next reference is consecutive or not.
%    \begin{macrocode}
      \else%
        \expandafter\ifx\csname r@cref@\@nextref\endcsname\relax%
          \@cref@refconsecutivefalse%
        \else%
          \edef\@tempa{{#2}{\@nextref}}%
          \expandafter\cref@isrefconsecutive\@tempa%
        \fi%
      \fi%
    \fi%
%    \end{macrocode}
%   Remove references from the stack until we find end of consecutive
%   sequence.
%    \begin{macrocode}
    \@whilesw\if@cref@refconsecutive\fi{%
      \advance#4 1%
      \let#3\@nextref%
      \cref@stack@pop{#1}%
      \cref@isstackempty{#1}%
      \if@cref@stackempty%
        \@cref@refconsecutivefalse%
      \else%
        \edef\@nextref{\cref@stack@top{#1}}%
%    \end{macrocode}
%       If next reference is empty, remove any consecutive empty
%       references and we're done.
%    \begin{macrocode}
        \ifx\@nextref\@empty%
          \@cref@refconsecutivefalse%
          \@whilesw\ifx\@nextref\@empty\fi{%
            \cref@stack@pop{#1}%
            \cref@isstackempty{#1}%
            \if@cref@stackempty%
              \let\@nextref\relax%
            \else%
              \edef\@nextref{\cref@stack@top{#1}}%
            \fi}%
%    \end{macrocode}
%         Otherwise, test whether next reference is consecutive or not.
%    \begin{macrocode}
        \else%
          \expandafter\ifx\csname r@cref@\@nextref\endcsname\relax%
            \@cref@refconsecutivefalse%
          \else%
            \edef\@tempa{{#3}{\@nextref}}%
            \expandafter\cref@isrefconsecutive\@tempa%
          \fi%
        \fi%
      \fi}%
  \fi}
%    \end{macrocode}
% \end{macro}
%
%
%
% \subsection{Cross-Referencing Commands}
% \begin{macro}{\cref}
% \begin{macro}{\Cref}
% \begin{macro}{\crefrange}
% \begin{macro}{\Crefrange}
%   Define the main referencing command \cmd{\cref} and the
%   start-of-sentence variant \cmd{\Cref}, along with the reference range
%   commands \cmd{\crefrange} and \cmd{\Crefrange}.
%    \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}{}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\if@crefstarred}
%   The |\if@crefstarred| flag is set within starred variants of
%   \package{cleveref} commands. Starred variants are only defined if
%   either the \package{hyperref} or \package{varioref} package is
%   loaded, so we only define it in those cases.\footnote{In fact, the
%     flag isn't needed when only \package{varioref} is loaded and the
%     \option{legacyvarioref} is set, \emph{unless} the \option{poorman}
%     option is also set. However, avoiding the redundant
%     \textbackslash{}if in these cases doesn't seem worth the
%     significantly more complicated code that would be required.}
%    \begin{macrocode}
\@ifpackageloaded{hyperref}{\newif\if@crefstarred}{%
  \@ifpackageloaded{varioref}{\newif\if@crefstarred}{}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@cref}
%   To save duplicating code, the referencing macros pass an argument
%   determining the variant to an auxilliary macro \cmd{\@cref}, which
%   does the real work. The \cmd{\@cref} macro is the behemoth at the
%   heart of all the clever referencing features. It deals with grouping
%   references by type, type-setting the conjunctions between groups,
%   choosing the right formatting macro to use for each reference, and
%   compressing consecutive references into ranges.
%    \begin{macrocode}
\def\@cref#1#2{%
  \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 expand to label names rather than label
% names per se.
%    \begin{macrocode}
  \countdef\count@consecutive=0%
  \countdef\count@group=1%
  \count@group=1%
  \def\cref@variant{#1}%
  \newif\if@secondref%
  \cref@stack@init{\@refstack}%
  \edef\@tempa{#2}%
  \expandafter\cref@stack@push\expandafter{\@tempa}{\@refstack}%
  \cref@isstackfull{\@refstack}%
%    \end{macrocode}
% Loop until the reference stack is empty.
%    \begin{macrocode}
  \@whilesw\if@cref@stackfull\fi{%
%    \end{macrocode}
% Move next group of references with same type into \cmd{\@refsubstack}.
%    \begin{macrocode}
    \cref@stack@init{\@refsubstack}%
    \if@cref@sort%
      \cref@processgroupall{\@refstack}{\@refsubstack}%
      \cref@stack@sort{\@refsubstack}{\cref@countercmp}%
    \else%
      \cref@processgroup{\@refstack}{\@refsubstack}%
    \fi%
%    \end{macrocode}
%
%   Type-set appropriate conjunction between groups of reference types.
%    \begin{macrocode}
    \ifnum\count@group=1\relax%
      \advance\count@group 1%
    \else%
      \cref@isstackfull{\@refstack}%
      \if@cref@stackfull%
        \@setcref@middlegroupconjunction%
      \else%
        \ifnum\count@group=2\relax%
          \@setcref@pairgroupconjunction%
        \else%
          \@setcref@lastgroupconjunction%
        \fi%
      \fi%
      \advance\count@group 1%
      \def\cref@variant{cref}%
    \fi%
%    \end{macrocode}
%
%   Process first group of consecutive references.
%    \begin{macrocode}
    \if@cref@compress%
      \cref@processconsecutive%
        {\@refsubstack}{\@beginref}{\@endref}{\count@consecutive}%
    \else%
      \edef\@beginref{\cref@stack@top{\@refsubstack}}%
      \cref@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@stack@pop{\@refsubstack}%
        \cref@isstackempty{\@refsubstack}%
        \if@cref@stackempty%
          \let\@beginref\relax%
        \else%
          \edef\@beginref{\cref@stack@top{\@refsubstack}}%
        \fi}%
      \let\@endref\relax%
      \count@consecutive=1\relax%
    \fi%
%    \end{macrocode}
%   If there were no consecutive references, type-set the first reference;
%    \begin{macrocode}
    \ifnum\count@consecutive=1\relax%
      \cref@isstackfull{\@refsubstack}%
      \if@cref@stackfull%
        \expandafter\@setcref%
          \expandafter{\@beginref}{\cref@variant}{@first}%
      \else%
        \expandafter\@setcref%
          \expandafter{\@beginref}{\cref@variant}{}%
      \fi%
%    \end{macrocode}
%   if there were only two consecutive references, type-set 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}
    \else%
      \ifnum\count@consecutive=2\relax%
        \expandafter\@setcref%
          \expandafter{\@beginref}{\cref@variant}{@first}%
        \expandafter\cref@stack@push\expandafter%
          {\@endref,}{\@refsubstack}%
%    \end{macrocode}
%     otherwise, type-set a reference range.
%    \begin{macrocode}
      \else%
        \edef\@tempa{{\@beginref}{\@endref}}%
        \if@cref@stackempty%
          \expandafter\@setcrefrange\@tempa{\cref@variant}{}%
        \else%
          \expandafter\@setcrefrange\@tempa{\cref@variant}{@first}%
        \fi%
      \fi%
    \fi%
%    \end{macrocode}
%
%   Process further groups of consecutive references, until substack is
%   empty.
%    \begin{macrocode}
    \@secondreftrue%
    \cref@isstackfull{\@refsubstack}%
    \@whilesw\if@cref@stackfull\fi{%
      \if@cref@compress%
        \cref@processconsecutive%
          {\@refsubstack}{\@beginref}{\@endref}{\count@consecutive}%
      \else%
        \edef\@beginref{\cref@stack@top{\@refsubstack}}%
        \cref@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@stack@pop{\@refsubstack}%
          \cref@isstackempty{\@refsubstack}%
          \if@cref@stackempty%
            \let\@beginref\relax%
          \else%
            \edef\@beginref{\cref@stack@top{\@refsubstack}}%
          \fi}%
        \let\@endref\relax%
        \count@consecutive=1\relax%
      \fi%
%    \end{macrocode}
%     If the substack is now empty, we will need to type-set an ``end''
%     reference, otherwise we will need to type-set a ``middle''
%     reference.
%    \begin{macrocode}
      \cref@isstackempty{\@refsubstack}%
      \if@cref@stackempty%
        \if@secondref%
          \def\@pos{@second}%
        \else%
          \def\@pos{@last}%
        \fi%
      \else%
        \def\@pos{@middle}%
      \fi%
%    \end{macrocode}
%     If there were no consecutive references, just type-set the next
%     reference;
%    \begin{macrocode}
      \ifnum\count@consecutive=1\relax%
        \edef\@tempa{{\@beginref}{cref}{\@pos}}%
        \expandafter\@setcref\@tempa%
      \else%
%    \end{macrocode}
%       if there were only two consecutive references, type-set the first
%       one, and return the second one to the substack,
%    \begin{macrocode}
        \ifnum\count@consecutive=2\relax%
          \expandafter\@setcref\expandafter%
            {\@beginref}{cref}{@middle}%
          \expandafter\cref@stack@push\expandafter%
            {\@endref}{\@refsubstack}%
%    \end{macrocode}
%       otherwise, type-set a reference range.
%    \begin{macrocode}
        \else%
          \edef\@tempa{{\@beginref}{\@endref}{cref}{\@pos}}%
          \expandafter\@setcrefrange\@tempa%
        \fi%
      \fi%
      \@secondreffalse%
      \cref@isstackfull{\@refsubstack}%
    }% end loop over reference substack
    \cref@isstackfull{\@refstack}%
%    \end{macrocode}
%   if we're type-setting a \cmd{\labelcref} reference and references in
%   stack have different types, throw a warning and stop processing
%    \begin{macrocode}
    \if@cref@stackfull%
      \def\@tempa{#1}\def\@tempb{labelcref}%
      \ifx\@tempa\@tempb\relax%
        \protect\G@refundefinedtrue%
        \nfss@text{\reset@font\bfseries\space ??}%
        \@latex@warning{References in label reference on page \thepage
          \space have different types}%
        \@cref@stackfullfalse%
      \fi%
    \fi%
  }% end loop over main reference stack
  \endgroup}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@setcref}
%   The internal \cmd{\@setcref} macro deals with actually type-setting
%   the reference, by calling the appropriate type-dependent formatting
%   macro defined by \cmd{\crefformat} etc.
%    \begin{macrocode}
\def\@setcref#1#2#3{%
  \expandafter\ifx\csname r@cref@#1\endcsname\relax%
    \protect\G@refundefinedtrue%
    \nfss@text{\reset@font\bfseries ??}%
    \@latex@warning{Reference `#1' on page \thepage \space undefined}%
  \else%
    \cref@gettype{#1}{\@temptype}%  puts label type in \@temptype
    \cref@getlabel{#1}{\@templabel}%  puts label in \@templabel
    \expandafter\ifx\csname #2@\@temptype @format#3\endcsname\relax%
%    \end{macrocode}
%     If reference format is undefined, but we're type-setting a
%     \cmd{\labelcref}, fall back to default \cmd{\labelcref} formats.
%    \begin{macrocode}
      \edef\@tempa{#2}\def\@tempb{labelcref}%
      \ifx\@tempa\@tempb\relax%
        \expandafter\@@setcref\expandafter%
          {\csname #2@default@format#3\endcsname}{#1}%
      \else%
        \protect\G@refundefinedtrue%
        \nfss@text{\reset@font\bfseries ??}~\@templabel%
        \@latex@warning{#2 \space reference format for label type
          `\@temptype' undefined}%
      \fi%
    \else%
      \expandafter\@@setcref\expandafter%
        {\csname #2@\@temptype @format#3\endcsname}{#1}%
    \fi%
  \fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@setcref}
%   We separate out the very final type-setting 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@getlabel{#2}{\@templabel}#1{\@templabel}{}{}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@setcrefrange}
%   The internal \cmd{\@setcrefrange} macro deals with type-setting
%   reference ranges, just as \cmd{\@setcref} does for normal
%   references. The actual type-setting is no more complicated in the
%   range case; it's the error checking that makes the code so much
%   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{%
  \begingroup%
%    \end{macrocode}
% Check if both references are defined.
%    \begin{macrocode}
    \expandafter\ifx\csname r@cref@#1\endcsname\relax%
      \protect\G@refundefinedtrue%
      \@latex@warning{Reference `#1' on page \thepage \space%
        undefined}%
      \expandafter\ifx\csname r@cref@#2\endcsname\relax%
        \nfss@text{\reset@font\bfseries ??}--%
        \nfss@text{\reset@font\bfseries ??}%
        \@latex@warning{Reference `#2' on page \thepage \space%
          undefined}%
      \else%
        \cref@getlabel{#2}{\@labelb}%
        \nfss@text{\reset@font\bfseries ??}--\@labelb%
      \fi%
    \else%
      \expandafter\ifx\csname r@cref@#2\endcsname\relax%
        \protect\G@refundefinedtrue%
        \cref@getlabel{#1}{\@labela}%
        \@labela--\nfss@text{\reset@font\bfseries ??}%
        \@latex@warning{Reference `#2' on page \thepage %
          \space undefined}%
%    \end{macrocode}
%   If both references are defined, check that the reference format is
%   defined.
%    \begin{macrocode}
      \else%
        \cref@gettype{#1}{\@typea}%
        \cref@gettype{#2}{\@typeb}%
        \cref@getlabel{#1}{\@labela}%
        \cref@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%
%    \end{macrocode}
%         If reference format is undefined, but we're type-setting a
%         \cmd{\labelcref}, fall back to default \cmd{\labelcref}
%         formats.
%    \begin{macrocode}
          \edef\@tempa{#3}\def\@tempb{labelcref}%
          \ifx\@tempa\@tempb\relax%
            \expandafter\@@setcrefrange\expandafter%
              {\csname #3range@default@format#4\endcsname}{#1}{#2}%
          \else%
            \protect\G@refundefinedtrue%
            \nfss@text{\reset@font\bfseries ??}~\@labela--\@labelb%
            \@latex@warning{#3\space reference range format for label
              type `\@typea' undefined}%
          \fi%
        \else%
%    \end{macrocode}
%     If reference types are identical, type-set reference range,
%     otherwise display warning.\\
%     (Note: there's no need to check if reference format for second type
%     is defined, since if it isn't it will be caught here as a
%     non-identical type.)
%    \begin{macrocode}
          \ifx\formata\formatb%
            \expandafter\@@setcrefrange\expandafter{\@formata}{#1}{#2}%
          \else%
            \protect\G@refundefinedtrue%
            \nfss@text{\reset@font\bfseries ??}~\@labela--\@labelb%
            \@latex@warning{References `#1' and `#2' in reference range
              on page \thepage have different types}%
          \fi%
        \fi%
      \fi%
    \fi%
  \endgroup}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@setcrefrange}
%   We again separate out the very final type-setting 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{%
  \cref@getlabel{#2}{\@labela}%
  \cref@getlabel{#3}{\@labelb}%
  #1{\@labela}{\@labelb}{}{}{}{}}
%    \end{macrocode}
% \end{macro}
%
%
% The type-setting of conjunctions is also separated out into separate
% macros, for the same reason.
%    \begin{macrocode}
\def\@setcref@pairgroupconjunction{\crefpairgroupconjunction}
\def\@setcref@middlegroupconjunction{\crefmiddlegroupconjunction}
\def\@setcref@lastgroupconjunction{\creflastgroupconjunction}
%    \end{macrocode}
%
% \begin{macro}{\labelcref}
% \begin{macro}{\namecref}
% \begin{macro}{\nameCref}
% \begin{macro}{\lcnamecref}
% \begin{macro}{\namecrefs}
% \begin{macro}{\nameCrefs}
% \begin{macro}{\lcnamecrefs}
%   Finally, we define a \cmd{\labelcref} that returns just the type-set
%   label part of a (multi-)reference, without the reference name, and
%   conversely \cmd{\namecref}, \cmd{\nameCref}, \cmd{\namecrefs} and
%   \cmd{\nameCrefs} commands that return just the type-set name of a
%   reference, without the reference label. The latter four retrieve the
%   reference name from the corresponding \cmd{\crefname} or
%   \cmd{\Crefname} definition, so they only work when this has been
%   defined. We also define \cmd{\lcnamecref} and \cmd{\lcnamecrefs}
%   commands which force the reference name to lowercase, for use when
%   the \option{capitalise} option is enabled.
%    \begin{macrocode}
\DeclareRobustCommand{\labelcref}[1]{\@cref{labelcref}{#1}}
\DeclareRobustCommand{\namecref}[1]{%
  \expandafter\ifx\csname r@cref@#1\endcsname\relax%
    \protect\G@refundefinedtrue%
    \nfss@text{\reset@font\bfseries ??}%
    \@latex@warning{Reference `#1' on page \thepage \space undefined}%
  \else%
    \cref@gettype{#1}{\@tempa}%
    \@ifundefined{cref@\@tempa @name}{%
      \protect\G@refundefinedtrue%``
      \nfss@text{\reset@font\bfseries ??}%
      \@latex@warning{Reference name for label type `\@tempa' undefined}%
    }{\csname cref@\@tempa @name\endcsname}%
  \fi}
\DeclareRobustCommand{\nameCref}[1]{%
  \expandafter\ifx\csname r@cref@#1\endcsname\relax%
    \protect\G@refundefinedtrue%
    \nfss@text{\reset@font\bfseries ??}%
    \@latex@warning{Reference `#1' on page \thepage \space undefined}%
  \else%
    \cref@gettype{#1}{\@tempa}%
    \@ifundefined{Cref@\@tempa @name}{%
      \protect\G@refundefinedtrue%``
      \nfss@text{\reset@font\bfseries ??}%
      \@latex@warning{Reference name for label type `\@tempa' undefined}%
    }{\csname Cref@\@tempa @name\endcsname}%
  \fi}
\DeclareRobustCommand{\lcnamecref}[1]{%
  \expandafter\ifx\csname r@cref@#1\endcsname\relax%
    \protect\G@refundefinedtrue%
    \nfss@text{\reset@font\bfseries ??}%
    \@latex@warning{Reference `#1' on page \thepage \space undefined}%
  \else%
    \cref@gettype{#1}{\@tempa}%
    \@ifundefined{cref@\@tempa @name}{%
      \protect\G@refundefinedtrue%``
      \nfss@text{\reset@font\bfseries ??}%
      \@latex@warning{Reference name for label type `\@tempa' undefined}%
    }{\expandafter\expandafter\expandafter%
      \MakeLowercase\csname cref@\@tempa @name\endcsname}%
  \fi}
\DeclareRobustCommand{\namecrefs}[1]{%
  \expandafter\ifx\csname r@cref@#1\endcsname\relax%
    \protect\G@refundefinedtrue%
    \nfss@text{\reset@font\bfseries ??}%
    \@latex@warning{Reference `#1' on page \thepage \space undefined}%
  \else%
    \cref@gettype{#1}{\@tempa}%
    \@ifundefined{cref@\@tempa @name@plural}{%
      \protect\G@refundefinedtrue%``
      \nfss@text{\reset@font\bfseries ??}%
      \@latex@warning{Reference name for label type `\@tempa' undefined}%
    }{\csname cref@\@tempa @name@plural\endcsname}%
  \fi}
\DeclareRobustCommand{\nameCrefs}[1]{%
  \expandafter\ifx\csname r@cref@#1\endcsname\relax%
    \protect\G@refundefinedtrue%
    \nfss@text{\reset@font\bfseries ??}%
    \@latex@warning{Reference `#1' on page \thepage \space undefined}%
  \else%
    \cref@gettype{#1}{\@tempa}%
    \@ifundefined{Cref@\@tempa @name@plural}{%
      \protect\G@refundefinedtrue%``
      \nfss@text{\reset@font\bfseries ??}%
      \@latex@warning{Reference name for label type `\@tempa' undefined}%
    }{\csname Cref@\@tempa @name@plural\endcsname}%
  \fi}
\DeclareRobustCommand{\lcnamecrefs}[1]{%
  \expandafter\ifx\csname r@cref@#1\endcsname\relax%
    \protect\G@refundefinedtrue%
    \nfss@text{\reset@font\bfseries ??}%
    \@latex@warning{Reference `#1' on page \thepage \space undefined}%
  \else%
    \cref@gettype{#1}{\@tempa}%
    \@ifundefined{cref@\@tempa @name@plural}{%
      \protect\G@refundefinedtrue%``
      \nfss@text{\reset@font\bfseries ??}%
      \@latex@warning{Reference name for label type `\@tempa' undefined}%
    }{\expandafter\expandafter\expandafter%
      \MakeLowercase\csname cref@\@tempa @name@plural\endcsname}%
  \fi}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
% \subsection{Reference Format Customisation Commands}
%
% \subsubsection{Format Component Commands}
% \begin{macro}{\cref@label@types}
%   The reference formats are usually constructed out of components
%   defined by the user-level \cmd{\crefname}, \cmd{\Crefname},
%   \cmd{\creflabel} and \cmd{\crefrangelabel} commands.
%   \cmd{\cref@label@types} keeps track of label types for which
%   components have been defined, and therefore need constructing at
%   \cmd{\begindocument} (see below).
%
%   FIXME: we don't check if the label type is already in the list, so
%   some formats may needlessly be redefined identically, multiple times.
%
%    \begin{macrocode}
\cref@stack@init{\cref@label@types}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\crefdefaultlabelformat}
% \begin{macro}{\crefname}
% \begin{macro}{\Crefname}
% \begin{macro}{\creflabelformat}
% \begin{macro}{\crefrangelabelformat}
%   The component customisation commands simply use the supplied
%   arguments to define appropriately named macros containing the
%   formatting components. If the corresponding \cmd{\Crefname} or
%   \cmd{\crefname} variant is not already defined, \cmd{\crefname} and
%   \cmd{\Crefname} define it to be a version with the first letter
%   capitalised or lower-cased, respectively.
%    \begin{macrocode}
\newcommand{\crefdefaultlabelformat}[1]{%
  \def\cref@default@label##1##2##3{#1}}
\newcommand{\crefname}[3]{%
  \@crefname{cref}{#1}{#2}{#3}{}}
\newcommand{\Crefname}[3]{%
  \@crefname{Cref}{#1}{#2}{#3}{}}
\newcommand{\creflabelformat}[2]{%
  \expandafter\def\csname cref@#1@label\endcsname##1##2##3{#2}%
  \cref@stack@add{#1}{\cref@label@types}}
\newcommand{\crefrangelabelformat}[2]{%
  \expandafter\def\csname cref@#1@rangelabel\endcsname%
    ##1##2##3##4##5##6{#2}%
  \cref@stack@add{#1}{\cref@label@types}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\crefalias}
%   The \cmd{\crefalias} command aliases a counter name to another
%   cross-reference type, so can be used to make the same cross-reference
%   format apply to multiple different counters.
%\begin{macrocode}
\newcommand{\crefalias}[2]{%
  \expandafter\def\csname cref@#1@alias\endcsname{#2}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\crefname@preamble}
% \begin{macro}{\Crefname@preamble}
%   The \cmd{\crefname@preamble} and \cmd{\Crefname@preamble} commands
%   are very like the \cmd{\crefname} and \cmd{\Crefname} commands, but
%   they tag ``|@preamble|'' onto the end of the generated macro names.
%   They are used when defining the default formats for different
%   languages (see \cref{sec:code:babel}).
%\begin{macrocode}
\newcommand{\crefname@preamble}[3]{%
  \@crefname{cref}{#1}{#2}{#3}{@preamble}}
\newcommand{\Crefname@preamble}[3]{%
  \@crefname{Cref}{#1}{#2}{#3}{@preamble}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@crefname}
%   The \cmd{\@crefname} utility macro does the real work of defining
%   format names, by defining an appropriately named command to contain
%   the format component, and using the additional first argument
%   (``cref'' or ``Cref'') to determine how to define the corresponding
%   command with the other capitalisation. The extra fifth argument gets
%   tagged onto the end of the generated macro names. Note that
%   \cmd{\@crefname} \emph{must not} create global definitions, or else
%   it will break \package{babel}'s \cmd{\otherlanguage},
%   \cmd{\otherlanguage*} and \cmd{\foreignlanguage} commands.
%    \begin{macrocode}
\def\@crefname#1#2#3#4#5{%
  \expandafter\def\csname #1@#2@name#5\endcsname{#3}%
  \expandafter\def\csname #1@#2@name@plural#5\endcsname{#4}%
%    \end{macrocode}
% The following \cmd{\@tempa} macro makes use of the fact that the first
% character of \#1 is ``c'' for lower-case and ``C'' for upper-case, in
% order to wrap the capitalisation-dependent parts in macros so that the
% rest of the code can be capitalisation-variant agnostic.
%    \begin{macrocode}
  \def\@tempa##1##2\@nil{%
    \if##1c%
      \def\@other{C##2}%
      \def\@tempc{\expandafter\MakeUppercase}%
    \else%
      \def\@other{c##2}%
      \if@cref@capitalise%
        \def\@tempc{}%
      \else%
        \def\@tempc{\MakeLowercase}%
      \fi%
    \fi}%
  \@tempa#1\@nil%
%    \end{macrocode}
% If the other capitalisation variant is not already defined...
%    \begin{macrocode}
  \@ifundefined{\@other @#2@name#5}{%
%    \end{macrocode}
% Define \cmd{\@tempa} and \cmd{@tmpb} to be partial expansions (expanded
% just once) of the macros for the capitalisation variant we've just
% defined above.
%    \begin{macrocode}
    \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\@tempa%
    \expandafter\expandafter\expandafter{%
      \csname#1@#2@name\endcsname}%
    \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\@tempb%
    \expandafter\expandafter\expandafter{%
      \csname#1@#2@name@plural\endcsname}%
%    \end{macrocode}
% Add the case-change command stored in \cmd{\@tempc} to the front of the
% definitions of \cmd{\@tempa} and \cmd{\@tempb}.
%    \begin{macrocode}
    \expandafter\ifx\@tempa\@empty\else%
      \expandafter\expandafter\expandafter\def%
      \expandafter\expandafter\expandafter\@tempa%
      \expandafter\expandafter\expandafter{%
        \expandafter\@tempc\@tempa}%
      \expandafter\expandafter\expandafter\def%
      \expandafter\expandafter\expandafter\@tempb%
      \expandafter\expandafter\expandafter{%
        \expandafter\@tempc\@tempb}%
    \fi%
%    \end{macrocode}
% Define the other capitalisation variants to be the partial expansions
% (expanded just once) of \cmd{\@tempa} and \cmd{\@tempb}. The
% \cmd{\@toksa} token register just makes the code less verbose.
%    \begin{macrocode}
    \toksdef\@toksa=0%
    \@toksa={%
      \expandafter\def\csname\@other @#2@name#5\endcsname}%
    \expandafter\the\expandafter\@toksa\expandafter{\@tempa}%
    \@toksa={%
      \expandafter\def\csname\@other @#2@name@plural#5\endcsname}%
    \expandafter\the\expandafter\@toksa\expandafter{\@tempb}%
  }{}%
%    \end{macrocode}
% Add label type to list of types that need defining from components.
%    \begin{macrocode}
  \cref@stack@add{#2}{\cref@label@types}}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@crefconstructcomponents}
%   The \cmd{\@crefconstructcomponents} utility macro puts the reference
%   format components for the specified reference type into temporary
%   macros, for use by later macros. The ridiculous number of ``\#''
%   characters ensure that the correct number remain when they come to be
%   used later (recall that pairs ``\#\#'' are collapsed to a single
%   ``\#'' each time the code is expanded).
%    \begin{macrocode}
\def\@crefconstructcomponents#1{%
%    \end{macrocode}
% Single cross-reference label format.
%    \begin{macrocode}
  \@ifundefined{cref@#1@label}{%
    \let\@templabel\cref@default@label%
  }{%
    \expandafter\let\expandafter\@templabel%
    \csname cref@#1@label\endcsname%
  }%
%    \end{macrocode}
% Reference range label format.
%    \begin{macrocode}
  \@ifundefined{cref@#1@rangelabel}{%
    \expandafter\def\expandafter\@tempa\expandafter{%
      \@templabel{####1}{####3}{####4}}%
    \expandafter\def\expandafter\@tempb\expandafter{%
      \@templabel{####2}{####5}{####6}}%
    \toksdef\@toksa=0%
    \@toksa={\def\@temprangelabel##1##2##3##4##5##6}%
    \expandafter\expandafter\expandafter\the%
    \expandafter\expandafter\expandafter\@toksa%
    \expandafter\expandafter\expandafter{%
      \expandafter\expandafter\expandafter\crefrangepreconjunction%
      \expandafter\@tempa\expandafter\crefrangeconjunction\@tempb%
      \crefrangepostconjunction}%
  }{%
    \expandafter\let\expandafter\@temprangelabel%
    \csname cref@#1@rangelabel\endcsname%
  }%
%    \end{macrocode}
% Get the correct number of ``\#'''s into the label format definitions.
%    \begin{macrocode}
  \expandafter\def\expandafter\@templabel\expandafter{%
    \@templabel{########1}{########2}{########3}}%
  \expandafter\def\expandafter\@temprangelabel\expandafter{%
    \@temprangelabel{########1}{########2}{########3}%
    {########4}{########5}{########6}}%
%    \end{macrocode}
% Lower-case singular cross-reference name.
%    \begin{macrocode}
  \expandafter\def\expandafter\@tempname\expandafter{%
    \csname cref@#1@name\endcsname}%
%    \end{macrocode}
% Upper-case singular cross-reference name.
%    \begin{macrocode}
  \expandafter\def\expandafter\@tempName\expandafter{%
    \csname Cref@#1@name\endcsname}%
%    \end{macrocode}
% Lower-case plural cross-reference name.
%    \begin{macrocode}
  \expandafter\def\expandafter\@tempnameplural\expandafter{%
    \csname cref@#1@name@plural\endcsname}%
%    \end{macrocode}
% Upper-case plural cross-reference name.
%    \begin{macrocode}
  \expandafter\def\expandafter\@tempNameplural\expandafter{%
    \csname Cref@#1@name@plural\endcsname}%
}
%    \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 that define
%   the corresponding formats in terms of the format components. This is
%   mostly just an arduous exercise in controlling macro expansion order.
%    \begin{macrocode}
\def\@crefdefineformat#1{%
  \begingroup%
%    \end{macrocode}
% Put format components into tmp macros.
%    \begin{macrocode}
    \@crefconstructcomponents{#1}%
%    \end{macrocode}
% Assemble the arguments for \cmd{\crefformat}, \cmd{\Crefformat} and
% \cmd{\labelcrefformat} from the components.
%    \begin{macrocode}
    \expandafter\ifx\@tempname\@empty\relax%
      \expandafter\def\expandafter\@tempfirst\expandafter{\@templabel}%
    \else%
      \expandafter\expandafter\expandafter\def%
      \expandafter\expandafter\expandafter\@tempfirst%
      \expandafter\expandafter\expandafter{%
        \expandafter\@tempname\expandafter\nobreakspace\@templabel}%
    \fi%
    \expandafter\ifx\@tempName\@empty\relax%
      \expandafter\def\expandafter\@tempFirst\expandafter{\@templabel}%
    \else%
      \expandafter\expandafter\expandafter\def%
      \expandafter\expandafter\expandafter\@tempFirst%
      \expandafter\expandafter\expandafter{%
        \expandafter\@tempName\expandafter\nobreakspace\@templabel}%
    \fi%
    \expandafter\def\expandafter\@templabel\expandafter{\@templabel}%
%    \end{macrocode}
% Define \cmd{\crefformat} and \cmd{\Crefformat}.
%    \begin{macrocode}
    \toksdef\@toksa=0%
    \@toksa={\crefformat{#1}}%
    \expandafter\the\expandafter\@toksa\expandafter{\@tempfirst}%
    \@toksa={\Crefformat{#1}}%
    \expandafter\the\expandafter\@toksa\expandafter{\@tempFirst}%
%    \end{macrocode}
% Define \cmd{\labelcrefformat} if type has custom label format.
%    \begin{macrocode}
    \@ifundefined{cref@#1@label}{}{%
      \@toksa={\labelcrefformat{#1}}%
      \expandafter\the\expandafter\@toksa\expandafter{\@templabel}}%
  \endgroup}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@crefrangedefineformat}
%   Construct call to \cmd{\crefrangeformat}.
%    \begin{macrocode}
\def\@crefrangedefineformat#1{%
  \begingroup%
%    \end{macrocode}
% Put format components into tmp macros.
%    \begin{macrocode}
    \@crefconstructcomponents{#1}%
%    \end{macrocode}
% Assemble the arguments for \cmd{\crefrangeformat},
% \cmd{\Crefrangeformat} and\linebreak[4] \cmd{\labelcrefrangeformat}
% from the components.
%    \begin{macrocode}
    \expandafter\ifx\@tempname\@empty\relax%
      \expandafter\def\expandafter\@tempfirst%
        \expandafter{\@temprangelabel}%
    \else%
      \expandafter\expandafter\expandafter\def%
      \expandafter\expandafter\expandafter\@tempfirst%
      \expandafter\expandafter\expandafter{%
        \expandafter\@tempnameplural\expandafter\nobreakspace\@temprangelabel}%
    \fi%
    \expandafter\ifx\@tempName\@empty\relax%
      \expandafter\def\expandafter\@tempFirst%
        \expandafter{\@temprangelabel}%
    \else%
      \expandafter\expandafter\expandafter\def%
      \expandafter\expandafter\expandafter\@tempFirst%
      \expandafter\expandafter\expandafter{%
        \expandafter\@tempNameplural\expandafter\nobreakspace\@temprangelabel}%
    \fi%
    \expandafter\def\expandafter\@temprangelabel%
      \expandafter{\@temprangelabel}%
%    \end{macrocode}
% Define \cmd{\crefrangeformat} and \cmd{\Crefrangeformat}.
%    \begin{macrocode}
    \toksdef\@toksa=0%
    \@toksa={\crefrangeformat{#1}}%
    \expandafter\the\expandafter\@toksa\expandafter{\@tempfirst}%
    \@toksa={\Crefrangeformat{#1}}%
    \expandafter\the\expandafter\@toksa\expandafter{\@tempFirst}%
%    \end{macrocode}
% Define \cmd{\labelcrefrangeformat} if type has custom label format.
%    \begin{macrocode}
    \@ifundefined{cref@#1@rangelabel}{%
      \@ifundefined{cref@#1@label}{\let\@tempa\relax}{\def\@tempa{}}}%
        {\def\@tempa{}}%
    \ifx\@tempa\@empty\relax%
      \@toksa={\labelcrefrangeformat{#1}}%
      \expandafter\the\expandafter\@toksa\expandafter{%
        \@temprangelabel}%
    \fi%
  \endgroup}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@crefdefinemultiformat}
%   Construct call to \cmd{\crefmultiformat}.
%    \begin{macrocode}
\def\@crefdefinemultiformat#1{%
  \begingroup%
%    \end{macrocode}
% Put format components into tmp macros.
%    \begin{macrocode}
    \@crefconstructcomponents{#1}%
%    \end{macrocode}
% Assemble the arguments for \cmd{\crefmultiformat},
% \cmd{\Crefmultiformat} and\linebreak[4] \cmd{\labelcrefmultiformat}
% from the components.
%    \begin{macrocode}
    \expandafter\ifx\@tempnameplural\@empty\relax%
      \expandafter\def\expandafter\@tempfirst%
        \expandafter{\@templabel}%
    \else%
      \expandafter\expandafter\expandafter\def%
      \expandafter\expandafter\expandafter\@tempfirst%
      \expandafter\expandafter\expandafter{%
        \expandafter\@tempnameplural\expandafter\nobreakspace\@templabel}%
    \fi%
    \expandafter\ifx\@tempNameplural\@empty\relax%
      \expandafter\def\expandafter\@tempFirst%
        \expandafter{\@templabel}%
    \else%
      \expandafter\expandafter\expandafter\def%
      \expandafter\expandafter\expandafter\@tempFirst%
      \expandafter\expandafter\expandafter{%
        \expandafter\@tempNameplural\expandafter\nobreakspace\@templabel}%
    \fi%
    \expandafter\def\expandafter\@tempsecond\expandafter{%
      \expandafter\crefpairconjunction\@templabel}%
    \expandafter\def\expandafter\@tempmiddle\expandafter{%
      \expandafter\crefmiddleconjunction\@templabel}%
    \expandafter\def\expandafter\@templast\expandafter{%
      \expandafter\creflastconjunction\@templabel}%
    \expandafter\def\expandafter\@templabel\expandafter{\@templabel}%
%    \end{macrocode}
% Bundle all four arguments for \cmd{\crefmultiformat} in token register
% \cmd{\@toksb}, then call it.
%    \begin{macrocode}
    \toksdef\@toksa=0%
    \toksdef\@toksb=1%
    \@toksb={}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tempfirst}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tempsecond}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tempmiddle}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@templast}}%
    \@toksa={\crefmultiformat{#1}}%
    \expandafter\the\expandafter\@toksa\the\@toksb%
%    \end{macrocode}
% Bundle all four arguments for \cmd{\Crefmultiformat} in token register
% \cmd{\@toksb}, then call it.
%    \begin{macrocode}
    \@toksb={}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tempFirst}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tempsecond}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tempmiddle}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@templast}}%
    \@toksa={\Crefmultiformat{#1}}%
    \expandafter\the\expandafter\@toksa\the\@toksb%
%    \end{macrocode}
% If type has custom label format, bundle all four arguments
% for\linebreak[4] \cmd{\labelcrefmultiformat} in token register
% \cmd{\@toksb}, then call it.
%    \begin{macrocode}
    \@ifundefined{cref@#1@label}{}{%
      \@toksb={}%
      \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
        \expandafter{\@templabel}}%
      \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
        \expandafter{\@tempsecond}}%
      \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
        \expandafter{\@tempmiddle}}%
      \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
        \expandafter{\@templast}}%
      \@toksa={\labelcrefmultiformat{#1}}%
      \expandafter\the\expandafter\@toksa\the\@toksb}%
  \endgroup}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@crefrangedefinemultiformat}
%   Construct call to \cmd{\crefrangemultiformat}.
%    \begin{macrocode}
\def\@crefrangedefinemultiformat#1{%
  \begingroup%
%    \end{macrocode}
% Put format components into tmp macros.
%    \begin{macrocode}
    \@crefconstructcomponents{#1}%
%    \end{macrocode}
% Assemble the arguments that need to be passed to
% \cmd{\crefrangemultiformat}, \cmd{\Crefrangemultiformat} and
% \cmd{\labelcrefrangemultiformat} from the reference components.
%    \begin{macrocode}
    \expandafter\ifx\@tempnameplural\@empty\relax%
      \expandafter\def\expandafter\@tempfirst%
        \expandafter{\@temprangelabel}%
    \else%
      \expandafter\expandafter\expandafter\def%
      \expandafter\expandafter\expandafter\@tempfirst%
      \expandafter\expandafter\expandafter{%
        \expandafter\@tempnameplural\expandafter\nobreakspace\@temprangelabel}%
    \fi%
    \expandafter\ifx\@tempNameplural\@empty\relax%
      \expandafter\def\expandafter\@tempFirst%
        \expandafter{\@temprangelabel}%
    \else%
      \expandafter\expandafter\expandafter\def%
      \expandafter\expandafter\expandafter\@tempFirst%
      \expandafter\expandafter\expandafter{%
        \expandafter\@tempNameplural\expandafter\nobreakspace\@temprangelabel}%
    \fi%
    \expandafter\def\expandafter\@tempsecond\expandafter{%
      \expandafter\crefpairconjunction\@temprangelabel}%
    \expandafter\def\expandafter\@tempmiddle\expandafter{%
      \expandafter\crefmiddleconjunction\@temprangelabel}%
    \expandafter\def\expandafter\@templast\expandafter{%
      \expandafter\creflastconjunction\@temprangelabel}%
    \expandafter\def\expandafter\@temprangelabel%
      \expandafter{\@temprangelabel}%
%    \end{macrocode}
% Bundle all four arguments for \cmd{\crefrangemultiformat} in token
% register \cmd{\@toksb}, then call it.
%    \begin{macrocode}
    \toksdef\@toksa=0%
    \toksdef\@toksb=1%
    \@toksb={}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tempfirst}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tempsecond}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tempmiddle}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@templast}}%
    \@toksa={\crefrangemultiformat{#1}}%
    \expandafter\the\expandafter\@toksa\the\@toksb%
%    \end{macrocode}
% Bundle all four arguments for \cmd{\Crefrangemultiformat} in token
% register \cmd{\@toksb}, then call it.
%    \begin{macrocode}
    \@toksb={}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tempFirst}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tempsecond}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tempmiddle}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@templast}}%
    \@toksa={\Crefrangemultiformat{#1}}%
    \expandafter\the\expandafter\@toksa\the\@toksb%
%    \end{macrocode}
% If type has custom label format, bundle all four arguments
% for\linebreak[4] \cmd{\labelcrefrangemultiformat} in token register
% \cmd{\@toksb}, then call it.
%    \begin{macrocode}
    \@ifundefined{cref@#1@rangelabel}{%
      \@ifundefined{cref@#1@label}{\let\@tempa\relax}{\def\@tempa{}}}%
        {\def\@tempa{}}%
    \ifx\@tempa\@empty\relax%
      \@toksb={}%
      \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
        \expandafter{\@temprangelabel}}%
      \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
        \expandafter{\@tempsecond}}%
      \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
        \expandafter{\@tempmiddle}}%
      \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
        \expandafter{\@templast}}%
      \@toksa={\labelcrefrangemultiformat{#1}}%
      \expandafter\the\expandafter\@toksa\the\@toksb%
    \fi%
  \endgroup}
%    \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
%   type-specific formats are defined.
%    \begin{macrocode}
\def\@labelcrefdefinedefaultformats{%
  \begingroup%
    \toksdef\@toksa=0%
    \toksdef\@toksb=1%
%    \end{macrocode}
% Assemble the arguments that need to be passed to
% \cmd{\labelcrefformat},\linebreak[4] \cmd{\labelcrefrangeformat},
% \cmd{\labelcrefmultiformat} and\linebreak[4]
% \cmd{\labelcrefrangemultiformat}.
%    \begin{macrocode}
    \let\@templabel\cref@default@label%
    \expandafter\def\expandafter\@tempa\expandafter{%
      \@templabel{####1}{####3}{####4}}%
    \expandafter\def\expandafter\@tempb\expandafter{%
      \@templabel{####2}{####5}{####6}}%
    \@toksa={\def\@temprangelabel##1##2##3##4##5##6}%
    \expandafter\expandafter\expandafter\the%
    \expandafter\expandafter\expandafter\@toksa%
    \expandafter\expandafter\expandafter{%
      \expandafter\expandafter\expandafter\crefrangepreconjunction%
      \expandafter\@tempa\expandafter\crefrangeconjunction\@tempb%
      \crefrangepostconjunction}%
    \expandafter\def\expandafter\@templabel\expandafter{%
      \@templabel{########1}{########2}{########3}}%
    \expandafter\def\expandafter\@temprangelabel\expandafter{%
      \@temprangelabel{########1}{########2}{########3}%
      {########4}{########5}{########6}}%
    \expandafter\def\expandafter\@tempsecond\expandafter{%
      \expandafter\crefpairconjunction\@templabel}%
    \expandafter\def\expandafter\@tempmiddle\expandafter{%
      \expandafter\crefmiddleconjunction\@templabel}%
    \expandafter\def\expandafter\@templast\expandafter{%
      \expandafter\creflastconjunction\@templabel}%
    \expandafter\def\expandafter\@temprangesecond\expandafter{%
      \expandafter\crefpairconjunction\@temprangelabel}%
    \expandafter\def\expandafter\@temprangemiddle\expandafter{%
      \expandafter\crefmiddleconjunction\@temprangelabel}%
    \expandafter\def\expandafter\@temprangelast\expandafter{%
      \expandafter\creflastconjunction\@temprangelabel}%
    \expandafter\def\expandafter\@templabel\expandafter{\@templabel}%
    \expandafter\def\expandafter\@temprangelabel%
      \expandafter{\@temprangelabel}%
%    \end{macrocode}
% Define default \cmd{\labelcrefformat}.
%    \begin{macrocode}
    \@toksa={\labelcrefformat{default}}%
    \expandafter\the\expandafter\@toksa\expandafter{\@templabel}%
%    \end{macrocode}
% Define default \cmd{\labelcrefrangeformat}.
%    \begin{macrocode}
    \@toksa={\labelcrefrangeformat{default}}%
    \expandafter\the\expandafter\@toksa\expandafter{\@temprangelabel}%
%    \end{macrocode}
% Bundle all four arguments for \cmd{\labelcrefmultiformat} in token
% register \cmd{\@toksb}, then call it to define default formats.
%    \begin{macrocode}
    \@toksb={}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@templabel}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tempsecond}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tempmiddle}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@templast}}%
    \@toksa={\labelcrefmultiformat{default}}%
    \expandafter\the\expandafter\@toksa\the\@toksb%
%    \end{macrocode}
% Bundle all four arguments for \cmd{\labelcrefrangemultiformat} in token
% register \cmd{\@toksb}, then call it to define default formats.
%    \begin{macrocode}
    \@toksb={}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@temprangelabel}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tempsecond}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tempmiddle}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@templast}}%
    \@toksa={\labelcrefrangemultiformat{default}}%
    \expandafter\the\expandafter\@toksa\the\@toksb%
  \endgroup}
%    \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.
%    \begin{macrocode}
\def\@crefdefineallformats#1{%
  \@crefdefineformat{#1}%
  \@crefrangedefineformat{#1}%
  \@crefdefinemultiformat{#1}%
  \@crefrangedefinemultiformat{#1}}
%    \end{macrocode}
% \end{macro}
%
%
% \subsubsection{Cross-Reference Format Definition Commands}
% \label{sec:crefformat}
% \begin{macro}{\crefformat}
% \begin{macro}{\Crefformat}
% \begin{macro}{\crefrangeformat}
% \begin{macro}{\Crefrangeformat}
% \begin{macro}{\crefmultiformat}
% \begin{macro}{\Crefmultiformat}
% \begin{macro}{\crefrangemultiformat}
% \begin{macro}{\Crefrangemultiformat}
%   \cmd{\crefformat} et al.\ are lower-level commands that give complete
%   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}. 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}
\newcommand{\crefformat}[2]{\@crefformat{cref}{#1}{#2}}
\newcommand{\Crefformat}[2]{\@crefformat{Cref}{#1}{#2}}
\newcommand{\crefrangeformat}[2]{\@crefrangeformat{crefrange}{#1}{#2}}
\newcommand{\Crefrangeformat}[2]{\@crefrangeformat{Crefrange}{#1}{#2}}
\newcommand{\crefmultiformat}[5]{%
  \@crefmultiformat{cref}{#1}{#2}{#3}{#4}{#5}}
\newcommand{\Crefmultiformat}[5]{%
  \@crefmultiformat{Cref}{#1}{#2}{#3}{#4}{#5}}
\newcommand{\crefrangemultiformat}[5]{%
  \@crefrangemultiformat{crefrange}{#1}{#2}{#3}{#4}{#5}}
\newcommand{\Crefrangemultiformat}[5]{%
  \@crefrangemultiformat{Crefrange}{#1}{#2}{#3}{#4}{#5}}
\newcommand{\labelcrefformat}[2]{%
  \expandafter\gdef\csname labelcref@#1@format\endcsname##1##2##3{#2}}
\newcommand{\labelcrefrangeformat}[2]{%
  \expandafter\gdef\csname labelcrefrange@#1@format\endcsname%
  ##1##2##3##4##5##6{#2}}
\newcommand{\labelcrefmultiformat}[5]{%
  \expandafter\gdef\csname labelcref@#1@format@first\endcsname%
    ##1##2##3{#2}%
  \expandafter\gdef\csname labelcref@#1@format@second\endcsname%
    ##1##2##3{#3}%
  \expandafter\gdef\csname labelcref@#1@format@middle\endcsname%
    ##1##2##3{#4}%
  \expandafter\gdef\csname labelcref@#1@format@last\endcsname%
    ##1##2##3{#5}}
\newcommand{\labelcrefrangemultiformat}[5]{%
  \expandafter\gdef\csname labelcrefrange@#1@format@first\endcsname%
    ##1##2##3##4##5##6{#2}%
  \expandafter\gdef\csname labelcrefrange@#1@format@second\endcsname%
    ##1##2##3##4##5##6{#3}%
  \expandafter\gdef\csname labelcrefrange@#1@format@middle\endcsname%
    ##1##2##3##4##5##6{#4}%
  \expandafter\gdef\csname labelcrefrange@#1@format@last\endcsname%
    ##1##2##3##4##5##6{#5}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% The utility macros do the real work, by using the first argument
% (``cref'' or ``Cref'', and ``crefrange'' or ``Crefrange'') to determine
% how to define the corresponding command with the other capitalisation.
% \begin{macro}{\@crefformat}
%   \cmd{\@crefformat} defines the macros for single references.
%    \begin{macrocode}
\def\@crefformat#1#2#3{%
  \begingroup%
    \expandafter\gdef\csname #1@#2@format\endcsname##1##2##3{#3}%
%    \end{macrocode}
% The following \cmd{\@tempa} macro makes use of the fact that the first
% character of \#1 is ``c'' for lower-case and ``C'' for upper-case, in
% order to wrap the capitalisation-dependent parts in macros so that the
% rest of the code can be capitalisation-variant agnostic.
%    \begin{macrocode}
    \def\@tempa##1##2\@nil{%
      \if##1c%
        \def\@other{C##2}%
        \def\@changecase{\expandafter\MakeUppercase}%
      \else%
        \def\@other{c##2}%
        \if@cref@capitalise%
          \def\@changecase{}%
        \else%
          \def\@changecase{\MakeLowercase}%
        \fi%
      \fi}%
    \@tempa#1\@nil%
%    \end{macrocode}
% If the other capitalisation variant is not already defined...
%    \begin{macrocode}
    \@ifundefined{\@other @#2@format}{%
%    \end{macrocode}
% Define \cmd{\@tempa} to be a partial expansion (expanded just once) of
% the capitalisation variant we've just defined above. The \cmd{\@toska}
% token register just makes the code less verbose.
%    \begin{macrocode}
      \toksdef\@toksa=0%
      \@toksa={\def\@tempa##1##2##3}%
      \expandafter\expandafter\expandafter\the%
      \expandafter\expandafter\expandafter\@toksa%
      \expandafter\expandafter\expandafter{%
        \csname#1@#2@format\endcsname{##1}{##2}{##3}}%
%    \end{macrocode}
% Add the \cmd{\@changecase} command to the front of the definition of
% \cmd{\@tempa}.
%    \begin{macrocode}
      \expandafter\expandafter\expandafter\the%
      \expandafter\expandafter\expandafter\@toksa%
      \expandafter\expandafter\expandafter{%
        \expandafter\@changecase\@tempa{##1}{##2}{##3}}%
%    \end{macrocode}
% Define the other capitalisation variant to be the partial expansion
% (expanded just once) of \cmd{\@tempa}.
%    \begin{macrocode}
      \@toksa={%
        \expandafter\gdef\csname\@other @#2@format\endcsname##1##2##3}%
      \expandafter\the\expandafter\@toksa\expandafter{%
        \@tempa{##1}{##2}{##3}}%
    }{}%
  \endgroup}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@crefrangeformat}
%   \cmd{\@crefrangeformat} defines the macros for single reference
%   ranges.
%    \begin{macrocode}
\def\@crefrangeformat#1#2#3{%
  \begingroup%
    \expandafter\gdef\csname #1@#2@format\endcsname%
      ##1##2##3##4##5##6{#3}%
%    \end{macrocode}
% The following \cmd{\@tempa} macro makes use of the fact that the first
% character of \#1 is ``c'' for lower-case and ``C'' for upper-case, in
% order to wrap the capitalisation-dependent parts in macros so that the
% rest of the code can be capitalisation-variant agnostic.
%    \begin{macrocode}
    \def\@tempa##1##2\@nil{%
      \if##1c%
        \def\@other{C##2}%
        \def\@changecase{\expandafter\MakeUppercase}%
      \else%
        \def\@other{c##2}%
        \if@cref@capitalise%
          \def\@changecase{}%
        \else%
          \def\@changecase{\MakeLowercase}%
        \fi%
      \fi}%
    \@tempa#1\@nil%
%    \end{macrocode}
% If the other capitalisation variant is not already defined...
%    \begin{macrocode}
    \@ifundefined{\@other @#2@format}{%
%    \end{macrocode}
% Define \cmd{\@tempa} to be a partial expansion (expanded just once) of
% the capitalisation variant we've just defined above. The \cmd{\@toska}
% token register just makes the code less verbose.
%    \begin{macrocode}
      \toksdef\@toksa=0%
      \@toksa={\def\@tempa##1##2##3##4##5##6}%
      \expandafter\expandafter\expandafter\the%
      \expandafter\expandafter\expandafter\@toksa%
      \expandafter\expandafter\expandafter{%
        \csname#1@#2@format\endcsname{##1}{##2}{##3}{##4}{##5}{##6}}%
%    \end{macrocode}
% Add the \cmd{\@changecase} command to the front of the definition of
% \cmd{\@tempa}.
%    \begin{macrocode}
      \expandafter\expandafter\expandafter\the%
      \expandafter\expandafter\expandafter\@toksa%
      \expandafter\expandafter\expandafter{%
        \expandafter\@changecase\@tempa{##1}{##2}{##3}{##4}{##5}{##6}}%
%    \end{macrocode}
% Define the other capitalisation variant to be the partial expansion
% (expanded just once) of \cmd{\@tempa}.
%    \begin{macrocode}
      \@toksa={\expandafter\gdef%
        \csname\@other @#2@format\endcsname##1##2##3##4##5##6}%
      \expandafter\the\expandafter\@toksa\expandafter{%
        \@tempa{##1}{##2}{##3}{##4}{##5}{##6}}%
    }{}%
  \endgroup}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@crefmultiformat}
%   \cmd{\@crefmultiformat} defines the macros for multiple references.
%    \begin{macrocode}
\def\@crefmultiformat#1#2#3#4#5#6{%
  \begingroup%
    \expandafter\gdef\csname #1@#2@format@first\endcsname##1##2##3{#3}%
    \expandafter\gdef\csname #1@#2@format@second\endcsname##1##2##3{#4}%
    \expandafter\gdef\csname #1@#2@format@middle\endcsname##1##2##3{#5}%
    \expandafter\gdef\csname #1@#2@format@last\endcsname##1##2##3{#6}%
%    \end{macrocode}
% The following \cmd{\@tempa} macro makes use of the fact that the first
% character of \#1 is ``c'' for lower-case and ``C'' for upper-case, in
% order to wrap the capitalisation-dependent parts in macros so that the
% rest of the code can be capitalisation-variant agnostic.
%    \begin{macrocode}
    \def\@tempa##1##2\@nil{%
      \if##1c%
        \def\@other{C##2}%
        \def\@changecase{\expandafter\MakeUppercase}%
      \else%
        \def\@other{c##2}%
        \if@cref@capitalise%
          \def\@changecase{}%
        \else%
          \def\@changecase{\MakeLowercase}%
        \fi%
      \fi}%
    \@tempa#1\@nil%
%    \end{macrocode}
% If the other capitalisation variant of the first part of the
% multi-format definition is not already defined...
%    \begin{macrocode}
    \@ifundefined{\@other @#2@format@first}{%
%    \end{macrocode}
% Define \cmd{\@tempa} to be a partial expansion (expanded just once) of
% the capitalisation variant we've just defined above. The \cmd{\@toska}
% token register just makes the code less verbose.
%    \begin{macrocode}
      \toksdef\@toksa=0%
      \@toksa={\def\@tempa##1##2##3}%
      \expandafter\expandafter\expandafter\the%
      \expandafter\expandafter\expandafter\@toksa%
      \expandafter\expandafter\expandafter{%
        \csname#1@#2@format@first\endcsname{##1}{##2}{##3}}%
%    \end{macrocode}
% Add the \cmd{\@changecase} command to the front of the definition of
% \cmd{\@tempa}.
%    \begin{macrocode}
      \expandafter\expandafter\expandafter\the%
      \expandafter\expandafter\expandafter\@toksa%
      \expandafter\expandafter\expandafter{%
        \expandafter\@changecase\@tempa{##1}{##2}{##3}}%
%    \end{macrocode}
% Define the other capitalisation variant to be the partial expansion
% (expanded just once) of \cmd{\@tempa}.
%    \begin{macrocode}
      \@toksa={%
        \expandafter\gdef\csname\@other @#2@format@first\endcsname%
          ##1##2##3}%
      \expandafter\the\expandafter\@toksa\expandafter{%
        \@tempa{##1}{##2}{##3}}%
    }{}%
%    \end{macrocode}
% The other parts of the multi-format definition are defined to be
% identical for both capitalisation variants.
%    \begin{macrocode}
    \@ifundefined{\@other @#2@format@second}{%
      \@toksa={%
        \expandafter\global\expandafter\let%
        \csname\@other @#2@format@second\endcsname}%
      \expandafter\the\expandafter\@toksa%
        \csname #1@#2@format@second\endcsname%
    }{}%
    \@ifundefined{\@other @#2@format@middle}{%
      \@toksa={%
        \expandafter\global\expandafter\let%
        \csname\@other @#2@format@middle\endcsname}%
      \expandafter\the\expandafter\@toksa%
        \csname #1@#2@format@middle\endcsname%
    }{}%
    \@ifundefined{\@other @#2@format@last}{%
      \@toksa={%
        \expandafter\global\expandafter\let%
        \csname\@other @#2@format@last\endcsname}%
      \expandafter\the\expandafter\@toksa%
        \csname #1@#2@format@last\endcsname%
    }{}%
  \endgroup}
%    \end{macrocode}
%\end{macro}
%
% \begin{macro}{\@crefrangemultiformat}
%   \cmd{\@crefmultiformat} defines the macros for reference ranges
%   within multiple references.
%    \begin{macrocode}
\def\@crefrangemultiformat#1#2#3#4#5#6{%
  \begingroup%
    \expandafter\gdef\csname #1@#2@format@first\endcsname%
      ##1##2##3##4##5##6{#3}%
    \expandafter\gdef\csname #1@#2@format@second\endcsname%
      ##1##2##3##4##5##6{#4}%
    \expandafter\gdef\csname #1@#2@format@middle\endcsname%
      ##1##2##3##4##5##6{#5}%
    \expandafter\gdef\csname #1@#2@format@last\endcsname%
      ##1##2##3##4##5##6{#6}%
%    \end{macrocode}
% The following \cmd{\@tempa} macro makes use of the fact that the first
% character of \#1 is ``c'' for lower-case and ``C'' for upper-case, in
% order to wrap the capitalisation-dependent parts in macros so that the
% rest of the code can be capitalisation-variant agnostic.
%    \begin{macrocode}
    \def\@tempa##1##2\@nil{%
      \if##1c%
        \def\@other{C##2}%
        \def\@changecase{\expandafter\MakeUppercase}%
      \else%
        \def\@other{c##2}%
        \if@cref@capitalise%
          \def\@changecase{}%
        \else%
          \def\@changecase{\MakeLowercase}%
        \fi%
      \fi}%
    \@tempa#1\@nil%
%    \end{macrocode}
% If the other capitalisation variant of the first part of the
% multi-format definition is not already defined...
%    \begin{macrocode}
    \@ifundefined{\@other @#2@format@first}{%
%    \end{macrocode}
% Define \cmd{\@tempa} to be a partial expansion (expanded just once) of
% the capitalisation variant we've just defined above. The \cmd{\@toska}
% token register just makes the code less verbose.
%    \begin{macrocode}
      \toksdef\@toksa=0%
      \@toksa={\def\@tempa##1##2##3##4##5##6}%
      \expandafter\expandafter\expandafter\the%
      \expandafter\expandafter\expandafter\@toksa%
      \expandafter\expandafter\expandafter{%
        \csname#1@#2@format@first\endcsname%
          {##1}{##2}{##3}{##4}{##5}{##6}}%
%    \end{macrocode}
% Add the \cmd{\@changecase} command to the front of the definition of
% \cmd{\@tempa}.
%    \begin{macrocode}
      \expandafter\expandafter\expandafter\the%
      \expandafter\expandafter\expandafter\@toksa%
      \expandafter\expandafter\expandafter{%
        \expandafter\@changecase\@tempa{##1}{##2}{##3}{##4}{##5}{##6}}%
%    \end{macrocode}
% Define the other capitalisation variant to be the partial expansion
% (expanded just once) of \cmd{\@tempa}.
%    \begin{macrocode}
      \@toksa={%
        \expandafter\gdef\csname\@other @#2@format@first\endcsname%
          ##1##2##3##4##5##6}%
      \expandafter\the\expandafter\@toksa\expandafter{%
        \@tempa{##1}{##2}{##3}{##4}{##5}{##6}}%
    }{}%
%    \end{macrocode}
% The other parts of the multi-format definition are defined to be
% identical for both capitalisation variants.
%    \begin{macrocode}
    \@ifundefined{\@other @#2@format@second}{%
      \@toksa={%
        \expandafter\global\expandafter\let%
        \csname\@other @#2@format@second\endcsname}%
      \expandafter\the\expandafter\@toksa%
        \csname #1@#2@format@second\endcsname%
    }{}%
    \@ifundefined{\@other @#2@format@middle}{%
      \@toksa={%
        \expandafter\global\expandafter\let%
        \csname\@other @#2@format@middle\endcsname}%
      \expandafter\the\expandafter\@toksa%
        \csname #1@#2@format@middle\endcsname%
    }{}%
    \@ifundefined{\@other @#2@format@last}{%
      \@toksa={%
        \expandafter\global\expandafter\let%
        \csname\@other @#2@format@last\endcsname}%
      \expandafter\the\expandafter\@toksa%
        \csname #1@#2@format@last\endcsname%
    }{}%
  \endgroup}
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{\package{hyperref} Support}
% \begin{macro}{hyperref}
%   If the \package{hyperref} package is loaded, we add hyper-link
%   support to \package{cleveref}. Since \package{hyperref} messes around
%   with some of the same \LaTeX{} internals as we do, we also have to
%   override some of its redefinitions so that they work with
%   \package{cleveref}.
%    \begin{macrocode}
\let\if@cref@hyperrefloaded\iffalse
\@ifpackageloaded{hyperref}{%
  \@ifpackagewith{hyperref}{implicit=false}{%
    \let\if@cref@hyperrefloaded\iffalse%
  }{%
    \let\if@cref@hyperrefloaded\iftrue%
    \PackageInfo{cleveref}{`hyperref' support loaded}
%    \end{macrocode}
% \begin{macro}{\cref@hyperref}
%   We define a utility macro to extract the hyper-link supplied by
%   \package{hyperref} (via the aux file). Note that \package{hyperref}
%   adds the hyper-link information to the standard \cmd{\newlabel} line
%   in the aux file, so we have to retrieve it from the standard
%   \cmd{r@\meta{label}}, \emph{not} the one prefixed with |cref@| that
%   we've created ourselves.
%    \begin{macrocode}
    \def\cref@hyperref#1{\expandafter\expandafter\expandafter%
      \@fourthoffive\csname r@#1\endcsname}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\H@refstepcounter}
%   The \package{hyperref} package stores the original
%   \cmd{\refstepcounter} definition as\linebreak[4]
%   \cmd{\H@refstepcounter}. Unfortunately, it plasters
%   \cmd{H@refstepcounter} all over the place, sometimes bypassing
%   \cmd{\refstepcounter} entirely. So we're forced to modify
%   \cmd{\H@refstepcounter} itself, in order to ensure that the extra
%   information we need is stored in \cmd{\cref@currentlabel}.
%    \begin{macrocode}
    \let\cref@old@H@refstepcounter\H@refstepcounter
    \def\H@refstepcounter#1{%
      \cref@old@H@refstepcounter{#1}%
      \cref@constructprefix{#1}{\cref@result}%
      \@ifundefined{cref@#1@alias}%
        {\def\@tempa{#1}}%
        {\def\@tempa{\csname cref@#1@alias\endcsname}}%
      \protected@xdef\cref@currentlabel{%
        [\@tempa][\arabic{#1}][\cref@result]%
        \csname p@#1\endcsname\csname the#1\endcsname}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\refstepcounter@noarg}
% \begin{macro}{\refstepcounter@optarg}
%   \package{hyperref}'s \cmd{\refstepcounter}, which ends up stored in
%   our\linebreak[4] \cmd{\cref@old@refstepcounter}, already calls
%   \cmd{\H@refstepcounter}, and we just redefined the latter to store
%   the extra information. So we only need to change
%   \cmd{\cref@currentlabel} in \emph{our} \cmd{\refstepcounter} if an
%   optional argument was supplied. Note that, in this case, the
%   mechanism for setting \cmd{\cref@currentlabel} is slightly different
%   than it is without \package{hyperref}: \cmd{\cref@currentlabel} first
%   gets set by our modified \cmd{\H@refstepcounter}, which gets called
%   via \package{hyperref}'s original version, as stored in
%   \cmd{\cref@old@refstepcounter}. The version of
%   \cmd{\cref@refstepcounter@optarg} defined below then overrides the
%   label type.
%    \begin{macrocode}
    \let\refstepcounter@noarg\cref@old@refstepcounter%
    \def\refstepcounter@optarg[#1]#2{%
      \cref@old@refstepcounter{#2}%
      \protected@xdef\cref@currentlabel{%
        \expandafter\cref@override@label@type%
          \cref@currentlabel\@nil{#1}}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\appendix}
%   We again make \cmd{\appendix} redefine things so that the label type
%   for chapters or sections is exceptionally overridden and set to
%   ``appendix'' instead. But this time, it is \cmd{\H@refstepcounter}
%   that needs to be redefined.
%    \begin{macrocode}
    \renewcommand\appendix{%
      \cref@old@appendix%
      \@ifundefined{chapter}{%
        \def\H@refstepcounter##1{%
          \cref@old@H@refstepcounter{##1}%
          \cref@constructprefix{##1}{\cref@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@result\@empty%
            \def\cref@result{2147483647}%
          \else%
            \edef\cref@result{2147483647,\cref@result}%
          \fi%
%    \end{macrocode}
%         Override the cross-reference type of sectioning commands.
%    \begin{macrocode}
          \def\@tempa{##1}%
          \def\@tempb{section}%
          \ifx\@tempa\@tempb%
            \protected@xdef\cref@currentlabel{%
              [appendix][\arabic{##1}][\cref@result]%
              \csname p@##1\endcsname\csname the##1\endcsname}%
          \else%
            \def\@tempa{##1}%
            \def\@tempb{subsection}%
            \ifx\@tempa\@tempb%
              \protected@xdef\cref@currentlabel{%
                [subappendix][\arabic{##1}][\cref@result]%
                \csname p@##1\endcsname\csname the##1\endcsname}%
            \else%
              \def\@tempa{##1}%
              \def\@tempb{subsubsection}%
              \ifx\@tempa\@tempb%
                \protected@xdef\cref@currentlabel{%
                  [subsubappendix][\arabic{##1}][\cref@result]%
                  \csname p@##1\endcsname\csname the##1\endcsname}%
              \else%
                \@ifundefined{cref@##1@alias}%
                  {\def\@tempa{##1}}%
                  {\def\@tempa{\csname cref@##1@alias\endcsname}}%
                \protected@xdef\cref@currentlabel{%
                  [\@tempa][\arabic{##1}][\cref@result]%
                  \csname p@##1\endcsname\csname the##1\endcsname}
              \fi%
            \fi%
          \fi}%
      }{%
        \def\H@refstepcounter##1{%
          \cref@old@H@refstepcounter{##1}%
          \cref@constructprefix{##1}{\cref@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@result\@empty%
            \def\cref@result{2147483647}%
          \else%
            \edef\cref@result{2147483647,\cref@result}%
          \fi%
%    \end{macrocode}
%         Override the cross-reference type of sectioning commands.
%    \begin{macrocode}
          \def\@tempa{##1}%
          \def\@tempb{chapter}%
          \ifx\@tempa\@tempb%
            \protected@xdef\cref@currentlabel{%
              [appendix][\arabic{##1}][\cref@result]%
              \csname p@##1\endcsname\csname the##1\endcsname}%
          \else%
            \def\@tempa{##1}%
            \def\@tempb{section}%
            \ifx\@tempa\@tempb%
              \protected@xdef\cref@currentlabel{%
                [subappendix][\arabic{##1}][\cref@result]%
                \csname p@##1\endcsname\csname the##1\endcsname}%
            \else%
              \def\@tempa{##1}%
              \def\@tempb{subsection}%
              \ifx\@tempa\@tempb%
                \protected@xdef\cref@currentlabel{%
                  [subsubappendix][\arabic{##1}][\cref@result]%
                  \csname p@##1\endcsname\csname the##1\endcsname}%
              \else%
                \def\@tempa{##1}%
                \def\@tempb{subsubsection}%
                \ifx\@tempa\@tempb%
                  \protected@xdef\cref@currentlabel{%
                    [subsubsubappendix][\arabic{##1}][\cref@result]%
                    \csname p@##1\endcsname\csname the##1\endcsname}%
                \else%
                  \@ifundefined{cref@##1@alias}%
                    {\def\@tempa{##1}}%
                    {\def\@tempa{\csname cref@##1@alias\endcsname}}%
                  \protected@xdef\cref@currentlabel{%
                    [\@tempa][\arabic{##1}][\cref@result]%
                    \csname p@##1\endcsname\csname the##1\endcsname}
                \fi%
              \fi%
            \fi%
          \fi}%
      }%
    }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\cref*}
% \begin{macro}{\Cref*}
% \begin{macro}{\crefrange*}
% \begin{macro}{\Crefrange*}
% \begin{macro}{\@crefstar}
% \begin{macro}{\@crefrangestar}
% \begin{macro}{\@crefrangenostar}
%     Redefine \cmd{\cref} and all the others to allow starred variants,
%     which don't create hyper-links. The starred variants simply set a
%     flag, which is tested in \cmd{\@@setcref} and \cmd{\@@setrangeref}
%     (below).
%    \begin{macrocode}
    \DeclareRobustCommand{\cref}{%
      \@ifstar{\@crefstar{cref}}{\@crefnostar{cref}}}
    \DeclareRobustCommand{\Cref}{%
      \@ifstar{\@crefstar{Cref}}{\@crefnostar{Cref}}}
    \def\@crefnostar#1#2{\@cref{#1}{#2}}
    \def\@crefstar#1#2{%
      \@crefstarredtrue\@cref{#1}{#2}\@crefstarredfalse}
    \DeclareRobustCommand{\crefrange}{%
      \@ifstar{\@crefrangestar{cref}}{\@crefrangenostar{cref}}}
    \DeclareRobustCommand{\Crefrange}{%
      \@ifstar{\@crefrangestar{Cref}}{\@crefrangenostar{Cref}}}
    \def\@crefrangenostar#1#2#3{\@setcrefrange{#2}{#3}{#1}{}}
    \def\@crefrangestar#1#2#3{%
      \@crefstarredtrue\@setcrefrange{#2}{#3}{#1}{}\@crefstarredfalse}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@@setcref}
% \begin{macro}{\@@setcrefrange}
%     Redefine \cmd{\@@setcref} and \cmd{\@@setrangeref} to create
%     hyper-links (unless the starred flag is set), using the extra
%     arguments supplied in \cmd{\r@cref@\meta{label}} (via the aux file)
%     by \package{hyperref}.
%    \begin{macrocode}
    \def\@@setcref#1#2{%
      \cref@getlabel{#2}{\@templabel}%
      \if@crefstarred%
        #1{\@templabel}{}{}%
      \else%
        \edef\@templink{\cref@hyperref{#2}}%
        #1{\@templabel}{\hyper@linkstart{link}{\@templink}}{\hyper@linkend}%
      \fi}
    \def\@@setcrefrange#1#2#3{%
      \cref@getlabel{#2}{\@labela}%
      \cref@getlabel{#3}{\@labelb}%
      \if@crefstarred%
        #1{\@labela}{\@labelb}{}{}{}{}%
      \else%
        \edef\@linka{\cref@hyperref{#2}}%
        \edef\@linkb{\cref@hyperref{#3}}%
        #1{\@labela}{\@labelb}%
          {\hyper@linkstart{link}{\@linka}}{\hyper@linkend}%
          {\hyper@linkstart{link}{\@linkb}}{\hyper@linkend}%
      \fi}%
    }%  end of false case of \@ifpackagewith{hyperref}{implicit=false}
  }{}%  end of \@ifpackageloaded{hyperref}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \end{macro}
%
%
% \subsection{\package{ntheorem} Support}
% \begin{macro}{ntheorem}
% \begin{macro}{thref}
%   If \package{ntheorem} is loaded, we need to modify its theorem
%   referencing features so that they work with \package{cleveref}.
%    \begin{macrocode}
  \@ifpackageloaded{ntheorem}{%
  \PackageInfo{cleveref}{`ntheorem' support loaded}
  \@ifpackagewith{ntheorem}{thref}{%
    \PackageWarning{cleveref}{`cleveref' supersedes `ntheorem's `thref'
      option}%
    \renewcommand{\thref}{\cref}}{}
%    \end{macrocode}
%
% \begin{macro}{\theorem@prework}
%   Newer versions of \package{ntheorem} require a call to
%   \cmd{\theorem@prework} when type-setting theorems. If an older
%   version of \package{ntheorem} is being used, we just \cmd{\let} it to
%   \cmd{\relax} to make sure it's defined.
%    \begin{macrocode}
  \@ifundefined{theorem@prework}{\let\theorem@prework\relax}{}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@thm}
%   We modify \package{ntheorem}'s version of the \cmd{\@thm} macro very
%   slightly, to have it call \cmd{\refstepcounter} with an optional
%   argument containing the theorem type.
%    \begin{macrocode}
  \gdef\@thm#1#2#3{%
    \if@thmmarks%
      \stepcounter{end\InTheoType ctr}%
    \fi%
    \renewcommand{\InTheoType}{#1}%
    \if@thmmarks%
      \stepcounter{curr#1ctr}%
      \setcounter{end#1ctr}{0}%
    \fi%
    \refstepcounter[#1]{#2}%  <<< cleveref modification
    \theorem@prework%
    \thm@topsepadd \theorempostskipamount%
    \ifvmode \advance\thm@topsepadd\partopsep\fi%
    \trivlist%
    \@topsep \theorempreskipamount%
    \@topsepadd \thm@topsepadd%
    \advance\linewidth -\theorem@indent%
    \advance\@totalleftmargin \theorem@indent%
    \parshape \@ne \@totalleftmargin \linewidth%
    \@ifnextchar[{\@ythm{#1}{#2}{#3}}{\@xthm{#1}{#2}{#3}}%]
  }
  }{}%  end of \@ifpackageloaded{ntheorem}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
% \subsection{\cmd{\newtheorem} Support}
% \label{sec:newtheorem}
% \begin{macro}{\newtheorem}
%   A \cmd{\newtheorem} command provides sufficient information to
%   automatically define a reasonable cross-reference name for
%   theorem-like environments (\package{ntheorem}'s \option{thmref} does
%   essentially this). So we modify \cmd{\newtheorem} (actually, the
%   lower-level \cmd{\@othm}, \cmd{\@xnthm} and \cmd{\@ynthm} macros) so
%   that it does so. We do this in such a way that default definitions or
%   explicit \cmd{\crefname} definitions for theorem-like environments
%   override those produced automatically by our modified
%   \cmd{\newtheorem}.
%
%   The catch is that, although the \cmd{\newtheorem} command provides
%   the singular form, there's no way of reliably deducing the plural
%   form from this. Rather than implement some half-baked attempt at this
%   which will be wrong more often than it's right (especially in
%   languages other than English) and generally cause more trouble than
%   it's worth, we simply define the singular form but leave the plural
%   form undefined. If the latter is ever needed, it will produce a
%   ``undefined cross-reference type'' warning, prompting the author to
%   provide an appropriate \cmd{\crefname} definition themselves.
%
% \begin{macro}{\@othm}
% \begin{macro}{\@xnthm}
% \begin{macro}{\@ynthm}
%   After sorting out its arguments, \cmd{\newtheorem} calls one of
%   \cmd{\@othm}, \cmd{\@xthm} or \cmd{\@ythm}. We add automatic
%   definitions of \cmd{\cref@\meta{type}@name} and\linebreak[4]
%   \cmd{\Cref@\meta{type}@name} to all three of these, and add the
%   theorem-like environment to the list of cross-reference types that
%   need to be defined from components at |\||begin{document}|. Since we
%   want explicit \cmd{\crefname}'s to override these automatic
%   definitions, we store the definitions in
%   \cmd{\cref@\meta{type}@name@preamble}, which are processed at
%   |\||begin{document}|) if they haven't been overridden. The default
%   definitions also get stored in \cmd{\cref@\meta{type}@name@preamble}
%   later on, so they too will override these automatic definitions,
%   which is what we want.
%
%   All this means that these automatic \cmd{\newtheorem} definitions
%   will only work when \cmd{\newtheorem} is used in the preamble.
%   However, this is also true of (new) cross-reference types defined
%   using \cmd{\crefname}, so it doesn't seem worth the significant
%   effort of getting the automatic definitions to work within the
%   document body.
%    \begin{macrocode}
\let\cref@old@othm\@othm
\def\@othm#1[#2]#3{%
  \edef\@tempa{\expandafter\noexpand%
    \csname cref@#1@name@preamble\endcsname}%
  \edef\@tempb{\expandafter\noexpand%
      \csname Cref@#1@name@preamble\endcsname}%
  \def\@tempc{#3}%
  \ifx\@tempc\@empty\relax%
    \expandafter\gdef\@tempa{}%
    \expandafter\gdef\@tempb{}%
  \else%
    \expandafter\expandafter\expandafter\gdef\expandafter%
      \@tempa\expandafter{\MakeLowercase #3}%
    \expandafter\expandafter\expandafter\gdef\expandafter%
      \@tempa\expandafter{\MakeUppercase #3}%
  \fi%
  \cref@stack@add{#1}{\cref@label@types}%
  \cref@old@othm{#1}[#2]{#3}}
\let\cref@old@xnthm\@xnthm
\def\@xnthm#1#2[#3]{%
  \edef\@tempa{\expandafter\noexpand%
    \csname cref@#1@name@preamble\endcsname}%
  \edef\@tempb{\expandafter\noexpand%
      \csname Cref@#1@name@preamble\endcsname}%
  \def\@tempc{#2}%
  \ifx\@tempc\@empty\relax%
    \expandafter\gdef\@tempa{}%
    \expandafter\gdef\@tempb{}%
  \else%
    \expandafter\expandafter\expandafter\gdef\expandafter%
      \@tempa\expandafter{\MakeLowercase #2}%
    \expandafter\expandafter\expandafter\gdef\expandafter%
      \@tempa\expandafter{\MakeUppercase #2}%
  \fi%
  \cref@stack@add{#1}{\cref@label@types}%
  \cref@old@xnthm{#1}{#2}[#3]}
\let\cref@old@ynthm\@ynthm
\def\@ynthm#1#2{%
  \edef\@tempa{\expandafter\noexpand%
    \csname cref@#1@name@preamble\endcsname}%
  \edef\@tempb{\expandafter\noexpand%
      \csname Cref@#1@name@preamble\endcsname}%
  \def\@tempc{#2}%
  \ifx\@tempc\@empty\relax%
    \expandafter\gdef\@tempa{}%
    \expandafter\gdef\@tempb{}%
  \else%
    \expandafter\expandafter\expandafter\gdef\expandafter%
      \@tempa\expandafter{\MakeLowercase #2}%
    \expandafter\expandafter\expandafter\gdef\expandafter%
      \@tempa\expandafter{\MakeUppercase #2}%
  \fi%
  \cref@stack@add{#1}{\cref@label@types}%
  \cref@old@ynthm{#1}{#2}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
% \subsection{\package{amsthm} Support}
% \begin{macro}{amsthm}
%   If \package{amsthm} is loaded, we need to modify its theorem
%   referencing features so that they work with \package{cleveref}.
%    \begin{macrocode}
  \@ifpackageloaded{amsthm}{%
  \PackageInfo{cleveref}{`amsthm' support loaded}
%    \end{macrocode}
%
% \begin{macro}{\@thm}
%   We modify \package{amsthm}'s version of the \cmd{\@thm} macro, to
%   have it call \cmd{\refstepcounter} with an optional argument
%   containing the theorem type.
%    \begin{macrocode}
\let\cref@thmnoarg\@thm
\def\@thm{\@ifnextchar[{\cref@thmoptarg}{\cref@thmnoarg}}%]
\def\cref@thmoptarg[#1]#2#3#4{%
  \ifhmode\unskip\unskip\par\fi%
  \normalfont%
  \trivlist%
  \let\thmheadnl\relax%
  \let\thm@swap\@gobble%
  \thm@notefont{\fontseries\mddefault\upshape}%
  \thm@headpunct{.}% add period after heading
  \thm@headsep 5\p@ plus\p@ minus\p@\relax%
  \thm@space@setup%
  #2% style overrides
  \@topsep \thm@preskip               % used by thm head
  \@topsepadd \thm@postskip           % used by \@endparenv
  \def\@tempa{#3}\ifx\@empty\@tempa%
    \def\@tempa{\@oparg{\@begintheorem{#4}{}}[]}%
  \else%
    \refstepcounter[#1]{#3}%  <<< cleveref modification
    \def\@tempa{\@oparg{\@begintheorem{#4}{\csname the#3\endcsname}}[]}%
  \fi%
  \@tempa}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@ynthm}
%   We also have to modify \package{amsthm}'s \cmd{\@ynthm} command so
%   that it passes the optional argument to \cmd{\@thm}. Since
%   \package{amsmath}'s \cmd{\@ynthm} takes a different parameter list to
%   the standard \LaTeX{} \cmd{\@ynthm} macro, we deliberately override
%   our previous redefinition, and add the code for the automatic
%   \cmd{\crefname} definitions directly to this version.
%    \begin{macrocode}
\def\@ynthm#1[#2]#3{%
%    \end{macrocode}
%   Here's the automatic \cmd{\crefname} definition.
%    \begin{macrocode}
  \edef\@tempa{\expandafter\noexpand%
    \csname cref@#1@name@preamble\endcsname}%
  \edef\@tempb{\expandafter\noexpand%
      \csname Cref@#1@name@preamble\endcsname}%
  \def\@tempc{#3}%
  \ifx\@tempc\@empty\relax%
    \expandafter\gdef\@tempa{}%
    \expandafter\gdef\@tempb{}%
  \else%
    \expandafter\expandafter\expandafter\gdef\expandafter%
      \@tempa\expandafter{\MakeLowercase #3}%
    \expandafter\expandafter\expandafter\gdef\expandafter%
      \@tempa\expandafter{\MakeUppercase #3}%
  \fi%
  \cref@stack@add{#1}{\cref@label@types}%
%    \end{macrocode}
%   Here's the original \package{amsthm} \cmd{\@ynthm} definition, with
%   the \package{cleveref} modification.
%    \begin{macrocode}
  \ifx\relax#2\relax%
    \def\@tempa{\@oparg{\@xthm{#1}{#3}}[]}%
  \else%
    \@ifundefined{c@#2}{%
      \def\@tempa{\@nocounterr{#2}}%
    }{%
      \@xp\xdef\csname the#1\endcsname{\@xp\@nx\csname the#2\endcsname}%
      \toks@{#3}%
      \@xp\xdef\csname#1\endcsname{%
        \@nx\@thm[#1]{%  <<< new optional argument for theorem name
          \let\@nx\thm@swap%
            \if S\thm@swap\@nx\@firstoftwo\else\@nx\@gobble\fi%
          \@xp\@nx\csname th@\the\thm@style\endcsname}%
            {#2}{\the\toks@}}%
      \let\@tempa\relax%
    }%
  \fi%
  \@tempa}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@xnthm}
%   Finally, we have to restore the \package{amsthm} version of
%   \cmd{\@xnthm}, which we stored earlier in \cmd{\cref@old@xnthm} and
%   redefined. With \package{amsthm}, \cmd{\@xnthm} calls \cmd{\@ynthm},
%   so the automatic \cmd{\crefname} definition is already taken care of.
%    \begin{macrocode}
  \let\@xnthm\cref@old@xnthm
  }{}%  end of \@ifpackageloaded{amsthm}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%
%
% \begin{macro}{algorithm}
%   If \package{algorithm} is loaded, we modify its line numbering
%   mechanism so that labels referring to line numbers in algorithms work
%   with \package{cleveref}.
%    \begin{macrocode}
  \@ifpackageloaded{algorithm}{%
  \PackageInfo{cleveref}{`algorithm' support loaded}
%    \end{macrocode}
%
% \begin{macro}{\ALG@step}
%   We modify \package{algorithm}'s \cmd{ALG@step} macro, which
%   increments the line number, so that it stores the necessary
%   information in \cmd{\cref@currentlabel}. \cmd{ALG@step} already
%   increments the line number counter \cmd{ALG@line} using
%   \cmd{\addtocounter}, but to get \package{cleveref} support working,
%   it's cleaner to hook into the \cmd{\refstepcounter} mechanism, so we
%   first decrement the counter and then re-increment it using
%   \cmd{\refstepcounter}.
%    \begin{macrocode}
  \let\cref@old@ALG@step\ALG@step
  \def\ALG@step{%
    \cref@old@ALG@step%
    \addtocounter{ALG@line}{-1}%
    \refstepcounter[line]{ALG@line}}
  }{}%  end of \@ifpackageloaded{algorithm}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%
%
% \begin{macro}{listings}
%   The only thing we need to do in order to support cross-references to
%   line numbers and listings produced by the \package{listings} package
%   is to alias the counters it uses, \cmd{lstnumber} and
%   \cmd{lstlistings}, to the ``line'' and ``listing'' cross-reference
%   types.
%    \begin{macrocode}
  \@ifpackageloaded{listings}{%
  \PackageInfo{cleveref}{`listings' support loaded}
  \crefalias{lstnumber}{line}%
  \crefalias{lstlisting}{listing}}{}%  end of \@ifpackageloaded{listings}
%    \end{macrocode}
% \end{macro}
%
%
%
% \begin{macro}{algorithm2e}
%   Similarly, all we need to do to support the \package{algorithm2e}
%   package is to alias \emph{its} counters, \cmd{algocf} and
%   \cmd{algocfline}, to the ``algorithm and ``line'' cross-reference
%   types.
%    \begin{macrocode}
  \@ifpackageloaded{algorithm2e}{%
  \PackageInfo{cleveref}{`algorithm2e' support loaded}
  \crefalias{algocf}{algorithm}%
  \crefalias{algocfline}{line}}{}%  end of \@ifpackageloaded{listings}
%    \end{macrocode}
% \end{macro}
%
%
%
% \begin{macro}{subfig}
%   The \package{subfig} package modifies \cmd{\refstepcounter} within
%   floats. Most of the time, this isn't a problem for
%   \package{cleveref}, as \package{subfig}'s modified
%   \cmd{refstepcounter} calls \package{cleveref}'s version after it's
%   done its stuff. However, this breaks support the
%   \cmd{\refstepcounter} optional argument, so we fix that here.
%    \begin{macrocode}
  \@ifpackageloaded{subfig}{%
  \PackageInfo{cleveref}{`subfig' support loaded}
%    \end{macrocode}
%
% \begin{macro}{\refsteponlycounter}
%   \package{subfig} replaces \cmd{\refstepcounter} with
%   \cmd{\refsteonlycounter} within floats, which calls the saved
%   \package{cleveref} \cmd{\refstepcounter} after doing some extra
%   \package{subfig}-related processing. We redefine
%   \cmd{refsteponlycounter} so that passing it an optional argument
%   bypasses \package{subfig}'s code entirely and just calls the
%   \package{cleveref} code directly. Since only
%   \package{cleveref}-specific commands will ever pass an optional
%   argument to \cmd{\refstepcounter}, this won't affect
%   \package{subfig}'s use of \cmd{\refstepcounter}. We have to postpone
%   this redefinition until the beginning of the document because
%   \package{subfig} does.
%    \begin{macrocode}
  \AtBeginDocument{
    \let\cref@old@refsteponlycounter\refsteponlycounter
    \def\refsteponlycounter{%
      \@ifnextchar[{\refstepcounter@optarg}%
        {\cref@old@refsteponlycounter}%]
    }}
  }{}%  end of \@ifpackageloaded{subfig}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%
%
% \subsection{\package{aliascnt} Support}
% \begin{macro}{aliascnt}
%   For the \package{aliascnt} trick described in \cref{sec:label_type}
%   of the documentation to work, we have to inform \package{cleveref}
%   about how aliased counters get reset. \package{aliascnt}'s
%   \cmd{\newaliascnt} command doesn't add the aliased counter to any
%   reset list, but if the counter it's aliased to gets reset, the
%   aliased counter will get reset too. In order for \package{cleveref}
%   to correcly sort cross-references to the aliased counter, we have to
%   add that counter to the appropriate reset list, even though that
%   isn't necessary to actually reset the counter itself. We add this to
%   the \cmd{\newaliascnt} command.
% \end{macro}
% \begin{macro}{\newaliascnt}
%    \begin{macrocode}
\@ifpackageloaded{aliascnt}{%
  \PackageInfo{cleveref}{`aliascnt' support loaded}
  \let\cref@old@newaliascnt\newaliascnt
  \renewcommand*{\newaliascnt}[2]{%
    \cref@old@newaliascnt{#1}{#2}%
    \cref@resetby{#2}{\cref@result}%
    \ifx\cref@result\relax\else%
      \@addtoreset{#1}{\cref@result}%
    \fi}
  }{}%  end of \@ifpackageloaded{aliascnt}
%    \end{macrocode}
% \end{macro}
%
%
%
% \subsection{\package{varioref} Support}
% \begin{macro}{varioref}
%   If \package{varioref} is loaded, we redefine its commands to use
%   \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.\ so that they check whether
%   they need to use \cmd{\vpagerefrange} instead of \cmd{\vpageref}.
% \end{macro}
%    \begin{macrocode}
\@ifpackageloaded{varioref}{%
    \PackageInfo{cleveref}{`varioref' support loaded}
    \PackageInfo{cleveref}{`cleveref' supersedes `varioref's %
      \string\labelformat command}
  \AtBeginDocument{%
    \def\cref@vref#1#2{%
%    \end{macrocode}
% Since we're modifying the \package{varioref} commands anyway, we also
% (by default) take this opportunity to get rid of the irritating spacing
% issues of \cmd{\vref} et al. However, this breaks strict compatibility
% with the original \package{varioref} spacing behaviour, so we also
% provide a \option{legacyvarioref} option to restore the spacing
% behaviour, in case full compatibility is required.
%    \begin{macrocode}
      \if@cref@legacyvarioref%
        \leavevmode\unskip\vref@space%
      \fi%
      \@cref{#1}{#2} % space here is deliberate
      \begingroup%
        \def\@tempstack{#2,\@nil}%
        \cref@stack@topandbottom{\@tempstack}{\@firstref}{\@lastref}%
        \ifx\@lastref\@empty%
          \vpageref[\unskip]{#2}%
        \else%
          \edef\@tempa{{\@firstref}{\@lastref}}%
          \expandafter\def\expandafter\@tempa\expandafter{%
            \expandafter[\expandafter\unskip\expandafter]%
            \@tempa}%
          \expandafter\vpagerefrange\@tempa%
        \fi%
      \endgroup}
    \def\cref@vrefrange#1#2#3{%
      \@setcrefrange{#2}{#3}{#1}{} \vpagerefrange[\unskip]{#2}{#3}}
    \def\cref@fullref#1#2{%
      \@cref{#1}{#2} % space here is deliberate
      \begingroup%
        \def\@tempstack{#2,\@nil}%
        \cref@stack@topandbottom{\@tempstack}{\@firstref}{\@lastref}%
        \ifx\@lastref\@empty%
          \reftextfaraway{#2}%
        \else%
          \expandafter\vrefpagenum\expandafter%
            \@tempa\expandafter{\@firstref}%
          \expandafter\vrefpagenum\expandafter%
            \@tempb\expandafter{\@lastref}%
          \ifx\@tempa\@tempb%
            \expandafter\reftextfaraway\expandafter{\@firstref}%
          \else%
            \edef\@tempa{{\@firstref}{\@lastref}}%
            \expandafter\reftextpagerange\@tempa%
          \fi%
        \fi%
      \endgroup}
%    \end{macrocode}
%
% \begin{macro}{\vref}
% \begin{macro}{\vref*}
% \begin{macro}{\vrefrange}
% \begin{macro}{\fullref}
% \begin{macro}{\vr@f}
% \begin{macro}{\Vr@f}
%   If \option{legacyvarioref} is set, we only modify the original
%   \package{varioref} commands, and don't define any new ones.
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%    \begin{macrocode}
    \if@cref@legacyvarioref%
      \def\vr@f#1{\cref@vref{cref}{#1}}
      \def\Vr@f#1{\cref@vref{Cref}{#1}}
      \renewcommand\vrefrange[3][\reftextcurrent]{%
        \crefrange{#2}{#3} \vpagerefrange[\unskip]{#2}{#3}}
      \def\fullref#1{\cref@fullref{cref}{#1}}
%    \end{macrocode}
%
% \begin{macro}{\vref}
% \begin{macro}{\vref*}
% \begin{macro}{\Vref}
% \begin{macro}{\Vref*}
% \begin{macro}{\vrefrange}
% \begin{macro}{\vrefrange*}
% \begin{macro}{\Vrefrange}
% \begin{macro}{\Vrefrange*}
% \begin{macro}{\fullref}
% \begin{macro}{\fullref*}
% \begin{macro}{\Fullref}
% \begin{macro}{\Fullref*}
%   If we're not providing legacy compatibility with \package{varioref},
%   we define \cmd{\vref} et al. to be consistent with the other
%   \package{cleveref} referencing commands. This frees up the starred
%   variants to be used to suppress hyperlinks when \package{hyperref} is
%   loaded, as usual.
% \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{macrocode}
    \else%
      \if@cref@hyperrefloaded\relax%  hyperref loaded
          \DeclareRobustCommand{\vref}{%
            \@ifstar{\cref@vrefstar{cref}}{\cref@vref{cref}}}
          \DeclareRobustCommand{\Vref}{%
            \@ifstar{\cref@vrefstar{Cref}}{\cref@vref{Cref}}}
          \DeclareRobustCommand{\vrefrange}{%
            \@ifstar{\cref@vrefrangestar{cref}}{\cref@vrefrange{cref}}}
          \DeclareRobustCommand{\Vrefrange}{%
            \@ifstar{\cref@vrefrangestar{Cref}}{\cref@vrefrange{Cref}}}
          \DeclareRobustCommand{\fullref}{%
            \@ifstar{\cref@fullrefstar{cref}}{\cref@fullref{cref}}}
          \DeclareRobustCommand{\Fullref}{%
            \@ifstar{\cref@fullrefstar{Cref}}{\cref@fullref{Cref}}}
          \def\cref@vrefstar#1#2{%
            \@crefstarredtrue%
            \cref@vref{#1}{#2}%
            \@crefstarredfalse}
          \def\cref@vrefrangestar#1#2#3{%
            \@crefstarredtrue%
            \cref@vrefrange{#1}{#2}{#3}%
            \@crefstarredfalse}
          \def\cref@fullrefstar#1#2{%
            \@crefstarredtrue%
            \cref@fullref{#1}{#2}%
            \@crefstarredfalse}
        \else%
          \DeclareRobustCommand{\vref}{\cref@vref{cref}}
          \DeclareRobustCommand{\Vref}{\cref@vref{Cref}}
          \DeclareRobustCommand{\vrefrange}{\cref@vrefrange{cref}}
          \DeclareRobustCommand{\Vrefrange}{\cref@vrefrange{Cref}}
          \DeclareRobustCommand{\fullref}{\cref@fullref{cref}}
          \DeclareRobustCommand{\Fullref}{\cref@fullref{Cref}}
        \fi%  end of test for hyperref
    \fi%
   }%  end of \AtBeginDocument
 }{}%  end of \@ifpackageloaded{varioref}
%   \end{macrocode}
%
% \begin{macro}{legacyvarioref}
%   The \option{legacyvarioref} option just sets a flag, checked in the
%   redefinitions set up at the beginning of the document, above.
% \end{macro}
%    \begin{macrocode}
\let\if@cref@legacyvarioref\iffalse
\DeclareOption{legacyvarioref}{%
  \PackageInfo{cleveref}{legacy `varioref' compatibility enabled}
  \let\if@cref@legacyvarioref\iftrue}
%    \end{macrocode}
%
%
%
% \subsection{Poor Man's \package{cleveref}}
% \begin{macro}{poorman}
%   The \option{poorman} option causes a |sed| script to automatically be
%   written. When the original \LaTeX{} source file is processed through
%   this script, it strips out all the \package{cleveref} commands,
%   type-setting all the reference formatting explicitly, and using the
%   standard \cmd{\ref} command to produce the references themselves.
%    \begin{macrocode}
\DeclareOption{poorman}{%
  \PackageInfo{cleveref}{option `poorman' loaded}
%    \end{macrocode}
%
%
% \begin{macro}{\cref@poorman@text}
%   Define global macro \cmd{\cref@poorman@text} to store the text
%   produced by the \cmd{\cref} commands, and open an output stream for
%   writing the script before starting to process the document body.
%    \begin{macrocode}
  \gdef\cref@poorman@text{}
  \AtBeginDocument{%
    \newwrite\@crefscript%
    \immediate\openout\@crefscript=\jobname.sed}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{select@language}
% \begin{macro}{foreign@language}
%   If \package{babel} is loaded, we add to the \cmd{\select@language}
%   and \cmd{\foreign@language} commands to make them write substitution
%   rules to the script that replace the cross-reference name and
%   conjunction component macros with the appropriate language-dependent
%   names. We use |sed| line-number addresses in the rules to ensure they
%   are only applied to the regions in which that particular language was
%   in use.
%
%   Note that we write substitution rules for the \emph{previous}
%   language block when the language is changed, because we need the
%   rules to appear in the script \emph{after} all the cross-reference
%   substitution rules for that language block. \cmd{cref@inputlineno}
%   stores the input-file line-number of the start of the previous
%   language block.
%
%   We postpone the redefinitions until the beginning of the document not
%   only to ensure that they don't get clobbered by other package's
%   redefinitions, but also because we don't want the redefenitions to
%   take effect until after \package{babel} has called
%   \cmd{\selectlanguage} for the main language (remember, the
%   substitution rules for this first language block will get written at
%   the next language change).
%
%   Note that, since we're writing to the script file within
%   \cmd{\AtBeginDocument} and \cmd{\AtEndDocument}, this code has to
%   come \emph{after} the above \cmd{\AtBeginDocument} code which opens
%   the script file for writing, and \emph{before} the later
%   \cmd{\AtEndDocument} code (below) which closes it.
%
%   The |\if@cref@switched@language| flag is set when a \package{babel}
%   language switching command is called. It is checked by
%   \cmd{\cref@writelanguagerules} when writing substitution rules.
%    \begin{macrocode}
  \newif\if@cref@switched@language
  \@ifpackageloaded{babel}{%
    \AtBeginDocument{%
      \let\cref@old@select@language\select@language
      \def\select@language{%
        \@cref@switched@languagetrue%
        \cref@writelanguagerules%
        \cref@old@select@language}
      \let\cref@old@foreign@language\foreign@language
      \def\foreign@language{%
        \@cref@switched@languagetrue%
        \cref@writelanguagerules%
        \cref@old@foreign@language}
      \edef\cref@inputlineno{\the\inputlineno}}%
    }{}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% The final set of substitution rules gets written at the end of the
% document. This is the only set or rules that gets written if
% \package{babel} is not loaded.
%    \begin{macrocode}
  \AtEndDocument{%
    \let\select@language\cref@old@select@language%
    \let\foreign@language\cref@old@foreign@language%
    \cref@writelanguagerules}
%    \end{macrocode}
%
% \begin{macro}{\cref@writelanguagerules}
%   \cmd{\cref@writelanguagerules} does the grunt work of writing out the
%   necessary substitution rules.
%    \begin{macrocode}
  \def\cref@writelanguagerules{%
    \begingroup%
%    \end{macrocode}
% If |\if@cref@switched@language| hasn't been set, then we must be
% writing the final set of substitution rules at the end of a document,
% in which no language switching command was ever used. In which case,
% the substitution rules don't specify a line-number address.
%    \begin{macrocode}
      \if@cref@switched@language%
        \edef\@address{\cref@inputlineno,\the\inputlineno}%
      \else%
        \def\@address{}%
      \fi%
      \expandafter\def\expandafter\cref@poorman@text\expandafter{%
        \crefrangeconjunction}%
      \expandafter\def\expandafter\@tempa\expandafter{%
        \expandafter{\@address}{\string\crefrangeconjunction}}%
      \expandafter\cref@writescript\@tempa%
      \expandafter\def\expandafter\cref@poorman@text\expandafter{%
        \crefrangepreconjunction}%
      \expandafter\def\expandafter\@tempa\expandafter{%
        \expandafter{\@address}{\string\crefrangepreconjunction}}%
      \expandafter\cref@writescript\@tempa%
      \expandafter\def\expandafter\cref@poorman@text\expandafter{%
        \crefrangepostconjunction}%
      \expandafter\def\expandafter\@tempa\expandafter{%
        \expandafter{\@address}{\string\crefrangepostconjunction}}%
      \expandafter\cref@writescript\@tempa%
      \expandafter\def\expandafter\cref@poorman@text\expandafter{%
        \crefpairconjunction}%
      \expandafter\def\expandafter\@tempa\expandafter{%
        \expandafter{\@address}{\string\crefpairconjunction}}%
      \expandafter\cref@writescript\@tempa%
      \expandafter\def\expandafter\cref@poorman@text\expandafter{%
        \crefmiddleconjunction}%
      \expandafter\def\expandafter\@tempa\expandafter{%
        \expandafter{\@address}{\string\crefmiddleconjunction}}%
      \expandafter\cref@writescript\@tempa%
      \expandafter\def\expandafter\cref@poorman@text\expandafter{%
        \creflastconjunction}%
      \expandafter\def\expandafter\@tempa\expandafter{%
        \expandafter{\@address}{\string\creflastconjunction}}%
      \expandafter\cref@writescript\@tempa%
      \expandafter\def\expandafter\cref@poorman@text\expandafter{%
        \crefpairgroupconjunction}%
      \expandafter\def\expandafter\@tempa\expandafter{%
        \expandafter{\@address}{\string\crefpairgroupconjunction}}%
      \expandafter\cref@writescript\@tempa%
      \expandafter\def\expandafter\cref@poorman@text\expandafter{%
        \crefmiddlegroupconjunction}%
      \expandafter\def\expandafter\@tempa\expandafter{%
        \expandafter{\@address}{\string\crefmiddlegroupconjunction}}%
      \expandafter\cref@writescript\@tempa%
      \expandafter\def\expandafter\cref@poorman@text\expandafter{%
        \creflastgroupconjunction}%
      \expandafter\def\expandafter\@tempa\expandafter{%
        \expandafter{\@address}{\string\creflastgroupconjunction}}%
      \expandafter\cref@writescript\@tempa%
%    \end{macrocode}
% We write substitution rules for all component-derived cross-reference
% formats, as listed in \cmd{\cref@label@types}.
%    \begin{macrocode}
      \let\@tempstack\cref@label@types%
      \cref@isstackfull{\@tempstack}%
      \@whilesw\if@cref@stackfull\fi{%
%    \end{macrocode}
% \cmd{\cref@\meta{type}@name} substitution rules.
%    \begin{macrocode}
        \edef\@tempa{\cref@stack@top{\@tempstack}}%
        \expandafter\expandafter\expandafter\def%
        \expandafter\expandafter\expandafter\cref@poorman@text%
        \expandafter\expandafter\expandafter{%
          \csname cref@\@tempa @name\endcsname}%
        \edef\@tempa{%
          \string\cref@\expandafter\noexpand\@tempa @name\space}%
        \expandafter\expandafter\expandafter\def%
        \expandafter\expandafter\expandafter\@tempa%
        \expandafter\expandafter\expandafter{%
          \expandafter\expandafter\expandafter{%
            \expandafter\@address\expandafter}%
          \expandafter{\@tempa}}%
        \expandafter\cref@writescript\@tempa%
%    \end{macrocode}
% \cmd{\cref@\meta{type}@name@plural} substitution rules.
%    \begin{macrocode}
        \edef\@tempa{\cref@stack@top{\@tempstack}}%
        \expandafter\expandafter\expandafter\def%
        \expandafter\expandafter\expandafter\cref@poorman@text%
        \expandafter\expandafter\expandafter{%
          \csname cref@\@tempa @name@plural\endcsname}%
        \edef\@tempa{%
          \string\cref@\expandafter\noexpand\@tempa%
          @name@plural\space}%
        \expandafter\expandafter\expandafter\def%
        \expandafter\expandafter\expandafter\@tempa%
        \expandafter\expandafter\expandafter{%
          \expandafter\expandafter\expandafter{%
            \expandafter\@address\expandafter}%
          \expandafter{\@tempa}}%
        \expandafter\cref@writescript\@tempa%
%    \end{macrocode}
% \cmd{\Cref@\meta{type}@name} substitution rules.
%    \begin{macrocode}
        \edef\@tempa{\cref@stack@top{\@tempstack}}%
        \expandafter\expandafter\expandafter\def%
        \expandafter\expandafter\expandafter\cref@poorman@text%
        \expandafter\expandafter\expandafter{%
          \csname Cref@\@tempa @name\endcsname}%
        \edef\@tempa{%
          \string\Cref@\expandafter\noexpand\@tempa @name\space}%
        \expandafter\expandafter\expandafter\def%
        \expandafter\expandafter\expandafter\@tempa%
        \expandafter\expandafter\expandafter{%
          \expandafter\expandafter\expandafter%
          {\expandafter\@address\expandafter}%
          \expandafter{\@tempa}}%
        \expandafter\cref@writescript\@tempa%
%    \end{macrocode}
% \cmd{\Cref@\meta{type}@name@plural} substitution rules.
%    \begin{macrocode}
        \edef\@tempa{\cref@stack@top{\@tempstack}}%
        \expandafter\expandafter\expandafter\def%
        \expandafter\expandafter\expandafter\cref@poorman@text%
        \expandafter\expandafter\expandafter{%
          \csname Cref@\@tempa @name@plural\endcsname}%
        \edef\@tempa{%
          \string\Cref@\expandafter\noexpand\@tempa%
          @name@plural\space}%
        \expandafter\expandafter\expandafter\def%
        \expandafter\expandafter\expandafter\@tempa%
        \expandafter\expandafter\expandafter{%
          \expandafter\expandafter\expandafter%
          {\expandafter\@address\expandafter}%
          \expandafter{\@tempa}}%
        \expandafter\cref@writescript\@tempa%
%    \end{macrocode}
% After the loop over cross-reference types, we set
% \cmd{\cref@inputlineno} to the current input-file line, in preparation
% for the next language block.
%    \begin{macrocode}
        \cref@stack@pop{\@tempstack}%
        \cref@isstackfull{\@tempstack}}%
    \endgroup%
    \edef\cref@inputlineno{\the\inputlineno}}%
%    \end{macrocode}
% \end{macro}
%
%
% After processing the document body, we re-read in the temporary script
% file, and write it out again to the final |sed| script file, escaping
% regexp special characters in the process. The escaping is carried out
% by turning the regexp special characters into active characters, and
% defining them to expand to their escaped form. This involves a lot of
% juggling of catcodes and lccodes!
%
% Both \cmd{\DeclareOption} and \cmd{\AtEndDocument} store their
% arguments in token lists, so all the following \TeX code is already
% tokenised long before it is expanded and evaluated. Thus there is no
% (easy) way to change the catcodes of the characters appearing here
% before they are tokenised. In one way this is convenient: the catcode
% changes we make don't ``take'' until evaluated, so we can continue to
% use the standard \TeX characters ($\backslash$, \{, \} etc.) even after
% the lines containing the catcode commands. But in another, more
% significant, way, it is very inconvenient: it makes it difficult to
% define the regexp special characters as active characters, since it's
% impossible to directly create tokens with the correct char- and
% catcodes.
%
% We get around this by creating the unusual charcode/catcode
% combinations using the \cmd{\lowercase} trick (\cmd{\lowercase} changes
% the charcodes of all characters in its argument to their lccodes, but
% \emph{leaves their catcodes alone}). That way, the argument of
% \cmd{\AtEndDocument} is tokenised correctly, and when it comes to be
% expanded and evaluated, the \cmd{\lowercase} commands create tokens
% with the correct char- and catcodes.
%    \begin{macrocode}
  \AtEndDocument{%
    \immediate\closeout\@crefscript%
    \newread\@crefscript%
    \immediate\openin\@crefscript=\jobname.sed%
    \begingroup%
      \newif\if@not@eof%
      \def\@eof{\par }%
%    \end{macrocode}
% Change catcodes of regexp special characters to make them active
% characters and define them to expand to their escaped forms. Change
% those of \TeX special characters to make them normal letters.
%    \begin{macrocode}
      \catcode`.=13 \catcode`*=13
      \catcode`[=13 \catcode`]=13
      \catcode`^=13 \catcode`$=13 %$
      \catcode`\=0 \catcode`<=1 \catcode`>=2
      \catcode`\\=13 \catcode`\{=12 \catcode`\}=12 \catcode`_=12
      \lccode`/=92
      \lccode`~=92\lowercase{\def~{\string/\string/}}%
      \lccode`~=42\lowercase{\def~{\string/\string*}}%
      \lccode`~=46\lowercase{\def~{\string/\string.}}%
      \lccode`~=91\lowercase{\def~{\string/\string[}}%
      \lccode`~=93\lowercase{\def~{\string/\string]}}%
      \lccode`~=94\lowercase{\def~{\string/\string^}}%
      \lccode`~=36\lowercase{\def~{\string/\string$}}% $
      \lccode`~=0 \lccode`/=0 \catcode`~=12
%    \end{macrocode}
% Read lines from the temporary script file, expand them to escape regexp
% special characters, and store them in \cmd{\cref@poorman@text}.
%    \begin{macrocode}
      \def\cref@poorman@text{}%
      \immediate\read\@crefscript to \@tempa%
      \ifx\@tempa\@eof%
        \@not@eoffalse%
      \else%
        \@not@eoftrue%
        \edef\@tempa{\@tempa}%
      \fi%
      \@whilesw\if@not@eof\fi{%
        \expandafter\g@addto@macro\expandafter%
          \cref@poorman@text\expandafter{\@tempa^^J}%
        \immediate\read\@crefscript to \@tempa%
        \ifx\@tempa\@eof%
          \@not@eoffalse%
        \else%
          \@not@eoftrue%
          \edef\@tempa{\@tempa}%
        \fi}%
    \endgroup%
    \immediate\closein\@crefscript%
%    \end{macrocode}
% Add some rules to remove other \package{cleveref} commands. We use the
% \cmd{\lowercase} trick again for writing the $\backslash$, \{ and \}
% characters. (This could be done in other ways, but since we're in
% \cmd{\lowercase} mood, why not stick with it.)
%    \begin{macrocode}
    \begingroup%
      \lccode`|=92 \lccode`<=123 \lccode`>=125 \lccode`C=67
      \lowercase{\def\@tempa{%[
          s/||label|[[^]]*|]/||label/g}}
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tempa^^J}%
      \lowercase{\edef\@tempa{s/||usepackage|(|[.*|]|)|<0,1|><cleveref>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tempa^^J}%
      \lowercase{\edef\@tempa{s/||[cC]refformat<.*><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tempa^^J}%
      \lowercase{\edef\@tempa{s/||[cC]refrangeformat<.*><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tempa^^J}%
      \lowercase{\edef\@tempa{s/||[cC]refmultiformat<.*><.*><.*><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tempa^^J}%
      \lowercase{\edef\@tempa{%
          s/||[cC]refrangemultiformat<.*><.*><.*><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tempa^^J}%
      \lowercase{\edef\@tempa{s/||[cC]refname<.*><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tempa^^J}%
      \lowercase{\edef\@tempa{s/||[cC]reflabelformat<.*><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tempa^^J}%
      \lowercase{\edef\@tempa{s/||[cC]refrangelabelformat<.*><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tempa^^J}%
      \lowercase{\edef\@tempa{s/||[cC]refdefaultlabelformat<.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tempa^^J}%
      \lowercase{\edef\@tempa{%
          s/||renewcommand<||crefpairconjunction><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tempa^^J}%
      \lowercase{\edef\@tempa{%
          s/||renewcommand<||crefpairgroupconjunction><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tempa^^J}%
      \lowercase{\edef\@tempa{%
          s/||renewcommand<||crefmiddleconjunction><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tempa^^J}%
      \lowercase{\edef\@tempa{%
          s/||renewcommand<||crefmiddlegroupconjunction><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tempa^^J}%
      \lowercase{\edef\@tempa{%
          s/||renewcommand<||creflastconjunction><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tempa^^J}%
      \lowercase{\edef\@tempa{%
          s/||renewcommand<||creflastgroupconjunction><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tempa^^J}%
      \lowercase{\edef\@tempa{s/||renewcommand<||[cC]ref><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tempa^^J}%
      \lowercase{\edef\@tempa{s/||renewcommand<||[cC]refrange><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tempa^^J}%
    \endgroup%
%    \end{macrocode}
% Overwrite the script file with the new, escaped regexp rules.
%    \begin{macrocode}
    \newwrite\@crefscript%
    \immediate\openout\@crefscript=\jobname.sed%
    \immediate\write\@crefscript{\cref@poorman@text}%
    \immediate\closeout\@crefscript%
  }%  end of \AtEndDocument
%    \end{macrocode}
%
%
% \begin{macro}{\cref@writescript}
%   The \cmd{\cref@writescript} utility macro does the actual writing of
%   the substitution rule to the script. The first argument is the
%   ``address'', the second argument is the regexp pattern to match,
%   whilst the substitution must be stored in \cmd{\cref@poorman@text}.
%    \begin{macrocode}
  \def\cref@getmeaning#1{\expandafter\@cref@getmeaning\meaning#1\@nil}
  \def\@cref@getmeaning#1->#2\@nil{#2}
  \def\cref@writescript#1#2{%
    \edef\@tempa{\cref@getmeaning{\cref@poorman@text}}%
    \immediate\write\@crefscript{#1 s/#2/\@tempa/g}}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\cref}
% \begin{macro}{\Cref}
% \begin{macro}{\crefrange}
% \begin{macro}{\Crefrange}
% \begin{macro}{\@crefstar}
% \begin{macro}{\@crefnostar}
% \begin{macro}{\@crefrangestar}
% \begin{macro}{\@crefrangenostar}
%   Redefine the user-level referencing commands so that they write a
%   substitution rule for the reference to the script, as well as
%   type-setting the reference itself.
%
%   We use a temporary \cmd{\@tempa} macro that makes use of the fact that
%   the first character of \#1 is ``c'' for lower-case and ``C'' for
%   upper-case in these commands, in order to write out the correct
%   capitalisation in the substitution.
%
%   FIXME: We only resort to this because |\string\#1| doesn't work. But
%   there \emph{must} be a better way to get a backslash character into
%   the token stream, obviating the need for the ugly \cmd{\@tempa} macro.
%    \begin{macrocode}
  \if@cref@hyperrefloaded\relax%  hyperref loaded
    \def\@crefnostar#1#2{%
      \gdef\cref@poorman@text{}%
      \@cref{#1}{#2}%
      \def\@tempa##1##2\@nil{%
        \if##1c%
          \cref@writescript{}{\string\cref\string{#2\string}}%
        \else%
          \cref@writescript{}{\string\Cref\string{#2\string}}%
        \fi}%
      \@tempa#1\@nil}
    \def\@crefstar#1#2{%
      \gdef\cref@poorman@text{}%
      \@crefstarredtrue\@cref{#1}{#2}\@crefstarredfalse%
      \def\@tempa##1##2\@nil{%
        \if##1c%
          \cref@writescript{}{\string\cref*\string{#2\string}}%
        \else%
          \cref@writescript{}{\string\Cref*\string{#2\string}}%
        \fi}%
      \@tempa#1\@nil}
    \def\@crefrangenostar#1#2#3{%
      \gdef\cref@poorman@text{}%
      \@setcrefrange{#2}{#3}{#1}{}%
      \def\@tempa##1##2\@nil{%
        \if##1c%
          \cref@writescript{}{%
            \string\crefrange\string{#2\string}\string{#3\string}}%
        \else%
          \cref@writescript{}{%
            \string\Crefrange\string{#2\string}\string{#3\string}}%
        \fi}%
      \@tempa#1\@nil}
    \def\@crefrangestar#1#2#3{%
      \gdef\cref@poorman@text{}%
      \@crefstarredtrue\@setcrefrange{#2}{#3}{#1}{}\@crefstarredfalse%
      \def\@tempa##1##2\@nil{%
        \if##1c%
          \cref@writescript{}{%
            \string\crefrange*\string{#2\string}\string{#3\string}}%
        \else%
          \cref@writescript{}{%
            \string\Crefrange*\string{#2\string}\string{#3\string}}%
        \fi}%
      \@tempa#1\@nil}
%
  \else%  hyperref not loaded
    \DeclareRobustCommand{\cref}[1]{%
      \edef\cref@poorman@text{}%
      \@cref{cref}{#1}%
      \cref@writescript{}{\string\cref\string{#1\string}}}
    \DeclareRobustCommand{\Cref}[1]{%
      \edef\cref@poorman@text{}%
      \@cref{Cref}{#1}%
      \cref@writescript{}{\string\Cref\string{#1\string}}}
    \DeclareRobustCommand{\crefrange}[2]{%
      \edef\cref@poorman@text{}%
      \@setcrefrange{#1}{#2}{cref}{}%
      \cref@writescript{}{%
        \string\crefrange\string{#1\string}\string{#2\string}}}
    \DeclareRobustCommand{\Crefrange}[2]{%
      \edef\cref@poorman@text{}%
      \@setcrefrange{#1}{#2}{Cref}{}%
      \cref@writescript{}{%
        \string\Crefrange\string{#1\string}\string{#2\string}}}
  \fi%  end of test for hyperref
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
% \begin{macro}{\vref}
% \begin{macro}{\vref*}
% \begin{macro}{\Vref}
% \begin{macro}{\Vref*}
% \begin{macro}{\vrefrange}
% \begin{macro}{\vrefrange*}
% \begin{macro}{\Vrefrange}
% \begin{macro}{\Vrefrange*}
% \begin{macro}{\fullref}
% \begin{macro}{\fullref*}
% \begin{macro}{\Fullref}
% \begin{macro}{\Fullref*}
%   If \package{varioref} is loaded, do the same for the \cmd{\vref} et
%   al.\ commands. Note that we now need to set the |\if@crefstarred|
%   flag for the starred variant \cmd{\vref*} even if
%   \option{legacyvarioef} is set and it changes the spacing rather than
%   suppressing hyper-links, so that we can write the correct
%   substitution rule.
%    \begin{macrocode}
  \@ifpackageloaded{varioref}{%
    \AtBeginDocument{%
      \if@cref@legacyvarioref%
        \DeclareRobustCommand{\vref}{%
          \@ifstar{\cref@vrefstar{cref}}{\cref@vref{cref}}}
        \def\cref@vrefstar#1#2{%
          \@crefstarredtrue\cref@vref{#1}{#2}\@crefstarredfalse}
      \fi%
      \def\cref@vref#1#2{%
        \gdef\cref@poorman@text{}%
        \if@cref@legacyvarioref%
          \leavevmode\unskip\vref@space%
        \fi%
        \begingroup%
%    \end{macrocode}
% If \option{legacyvarioref} is set, \cmd{\vref*} shouldn't suppress
% hyper-links, so temporarily disable then restore the flag whilst
% type-setting the cross-reference.
%    \begin{macrocode}
          \let\if@tmp\if@crefstarred%
          \if@cref@legacyvarioref\@crefstarredfalse\fi%
          \@cref{#1}{#2} % space here is deliberate
          \let\if@crefstarred\if@tmp%
          \def\@tempstack{#2,\@nil}%
          \cref@stack@topandbottom{\@tempstack}{\@firstref}{\@lastref}%
          \ifx\@lastref\@empty%
            \vpageref[\unskip]{#2}%
            \g@addto@macro\cref@poorman@text{ \vpageref[\unskip]{#2}}%
          \else%
            \g@addto@macro\cref@poorman@text{ }%
            \edef\@tempa{{\@firstref}{\@lastref}}%
            \expandafter\def\expandafter\@tempa\expandafter{%
              \expandafter[\expandafter\unskip\expandafter]%
              \@tempa}%
            \expandafter\vpagerefrange\@tempa%
            \expandafter\g@addto@macro\expandafter\cref@poorman@text%
              \expandafter{\expandafter\vpagerefrange\@tempa}%
          \fi%
          \def\@tempa##1##2\@nil{%
            \if##1c%
              \if@crefstarred%
                \cref@writescript{}{\string\vref*\string{#2\string}}%
              \else%
                \cref@writescript{}{\string\vref\string{#2\string}}%
              \fi%
            \else%
              \if@crefstarred%
                \cref@writescript{}{\string\Vref*\string{#2\string}}%
              \else%
                \cref@writescript{}{\string\Vref\string{#2\string}}%
              \fi%
            \fi}%
          \@tempa#1\@nil%
        \endgroup}
%
      \def\cref@vrefrange#1#2#3{%
        \gdef\cref@poorman@text{}%
        \@setcrefrange{#2}{#3}{#1}{} \vpagerefrange[\unskip]{#2}{#3}%
        \g@addto@macro\cref@poorman@text%
          { \vpagerefrange[\unskip]{#2}{#3}}%
        \def\@tempa##1##2\@nil{%
          \if##1c%
            \if@crefstarred%
              \cref@writescript{}{%
                \string\vrefrange*\string{#2\string}\string{#3\string}}%
            \else%
              \cref@writescript{}{%
                \string\vrefrange\string{#2\string}\string{#3\string}}%
            \fi%
          \else%
            \if@crefstarred%
              \cref@writescript{}{%
                \string\Vrefrange*\string{#2\string}\string{#3\string}}%
            \else%
              \cref@writescript{}{%
                \string\Vrefrange\string{#2\string}\string{#3\string}}%
            \fi%
          \fi}%
        \@tempa#1\@nil}
%
      \def\cref@fullref#1#2{%
        \gdef\cref@poorman@text{}%
        \begingroup%
          \@cref{#1}{#2} % space here is deliberate
          \def\@tempstack{#2,\@nil}%
          \cref@stack@topandbottom{\@tempstack}{\@firstref}{\@lastref}%
          \ifx\@lastref\@empty%
            \reftextfaraway{#2}%
            \def\@pageref{\reftextfaraway{#1}}%
          \else%
            \expandafter\vrefpagenum\expandafter%
              \@tempa\expandafter{\@firstref}%
            \expandafter\vrefpagenum\expandafter%
              \@tempb\expandafter{\@lastref}%
            \ifx\@tempa\@tempb%
              \expandafter\reftextfaraway\expandafter{\@firstref}%
              \expandafter\def\expandafter\@pageref\expandafter{%
                \expandafter\reftextfaraway\expandafter{\@firstref}}%
            \else%
              \edef\@tempa{{\@firstref}{\@lastref}}%
              \expandafter\reftextpagerange\@tempa%
              \expandafter\def\expandafter\@pageref\expandafter{%
                \expandafter\reftextpagerange\@tempa}%
            \fi%
          \fi%
          \g@addto@macro\cref@poorman@text{ }%
          \expandafter\g@addto@macro\expandafter\cref@poorman@text%
            \expandafter{\@pageref}%
          \def\@tempa##1##2\@nil{%
            \if##1c%
              \if@crefstarred%
                \cref@writescript{}{\string\fullref*\string{#2\string}}%
              \else%
                \cref@writescript{}{\string\fullref\string{#2\string}}%
              \fi%
            \else%
              \if@crefstarred%
                \cref@writescript{}{\string\Fullref*\string{#2\string}}%
              \else%
                \cref@writescript{}{\string\Fullref\string{#2\string}}%
              \fi%
            \fi}%
          \@tempa#1\@nil%
        \endgroup}
    }% end of \AtBeginDocument
  }{}% end of \@ifpackageloaded{varioref}
%    \end{macrocode}
% \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}
%   Redefine \cmd{\@@setcref} and \cmd{\@@setrangeref}, as well as the
%   conjunction macros \cmd{\@setcref@middlegroupconjunction},
%   \cmd{\@setcref@lastgroupconjunction} and
%   \cmd{\@setcref@pairgroupconjunction}, to append text they type-set
%   to\linebreak[4] the \cmd{\cref@poorman@text} macro, as well as
%   actually doing the type-setting.
%    \begin{macrocode}
  \def\@setcref@pairgroupconjunction{%
    \crefpairgroupconjunction%
    \expandafter\g@addto@macro\expandafter\cref@poorman@text%
      \expandafter{\crefpairgroupconjunction}}
  \def\@setcref@middlegroupconjunction{%
    \crefmiddlegroupconjunction%
    \expandafter\g@addto@macro\expandafter\cref@poorman@text%
      \expandafter{\crefmiddlegroupconjunction}}
  \def\@setcref@lastgroupconjunction{%
    \creflastgroupconjunction%
    \expandafter\g@addto@macro\expandafter\cref@poorman@text%
      \expandafter{\creflastgroupconjunction}}
  \if@cref@hyperrefloaded\relax%  hyperref loaded
    \def\@@setcref#1#2{%
      \cref@getlabel{#2}{\@templabel}%
      \if@crefstarred%
        #1{\@templabel}{}{}%
        \expandafter\g@addto@macro\expandafter\cref@poorman@text%
          \expandafter{#1{\ref*{#2}}{}{}}%
      \else%
        \edef\@templink{\cref@hyperref{#2}}%
        #1{\@templabel}{\hyper@linkstart{link}{\@templink}}%
          {\hyper@linkend}%
        \expandafter\g@addto@macro\expandafter\cref@poorman@text%
          \expandafter{#1{\ref{#2}}{}{}}%
      \fi}
    \def\@@setcrefrange#1#2#3{%
      \cref@getlabel{#2}{\@labela}%
      \cref@getlabel{#3}{\@labelb}%
      \if@crefstarred%
        #1{\@labela}{\@labelb}{}{}{}{}%
        \expandafter\g@addto@macro\expandafter\cref@poorman@text%
          \expandafter{#1{\ref*{#2}}{\ref*{#3}}{}{}{}{}}%
      \else%
        \edef\@linka{\cref@hyperref{#2}}%
        \edef\@linkb{\cref@hyperref{#3}}%
        #1{\@labela}{\@labelb}%
          {\hyper@linkstart{link}{\@linka}}{\hyper@linkend}%
          {\hyper@linkstart{link}{\@linkb}}{\hyper@linkend}%
        \expandafter\g@addto@macro\expandafter\cref@poorman@text%
          \expandafter{#1{\ref{#2}}{\ref{#3}}{}{}{}{}}%
      \fi}
  \else%  hyperref not loaded
    \let\old@@setcref\@@setcref%
    \let\old@@setcrefrange\@@setcrefrange%
    \def\@@setcref#1#2{%
      \old@@setcref{#1}{#2}%
      \expandafter\g@addto@macro\expandafter{%
        \expandafter\cref@poorman@text\expandafter}\expandafter{%
        #1{\ref{#2}}{}{}}}
    \def\@@setcrefrange#1#2#3{%
      \old@@setcrefrange{#1}{#2}{#3}%
      \expandafter\g@addto@macro%
        \expandafter{\expandafter\cref@poorman@text\expandafter}%
        \expandafter{#1{\ref{#2}}{\ref{#3}}{}{}{}{}}}
  \fi%  end of hyperref test
}%  end of poorman option
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
% \subsection{Sort and Compress options}
% \begin{macro}{sort}
% \begin{macro}{compress}
% \begin{macro}{nosort}
% \begin{macro}{\if@cref@sort}
% \begin{macro}{\if@cref@compress}
%   The \option{sort}, \option{compress} or \option{nosort} options
%   determine whether to sort and/or compress lists of multiple
%   references (default is to do both). They work simply by setting the
%   |\if@cref@sort| and |\if@cref@compress| flags appropriately.
%    \begin{macrocode}
\newif\if@cref@sort
\newif\if@cref@compress
%    \end{macrocode}
% Default is to both sort and compress references.
%    \begin{macrocode}
\@cref@sorttrue
\@cref@compresstrue
%    \end{macrocode}
% Options override default.
%    \begin{macrocode}
\DeclareOption{sort}{%
  \PackageInfo{cleveref}{sorting but not compressing references}
  \@cref@sorttrue
  \@cref@compressfalse}
\DeclareOption{compress}{%
  \PackageInfo{cleveref}{compressing but not sorting references}
  \@cref@sortfalse
  \@cref@compresstrue}
\DeclareOption{sort&compress}{%
  \PackageInfo{cleveref}{sorting and compressing references}
  \@cref@sorttrue
  \@cref@compresstrue}
\DeclareOption{nosort}{%
  \PackageInfo{cleveref}{neither sorting nor compressing references}
  \@cref@sortfalse
  \@cref@compressfalse}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
% \subsection{Capitalise option}
% \begin{macro}{capitalise}
% \begin{macro}{\if@cref@capitalise}
%   The \option{capitalise} option causes \package{cleveref} to always
%   use the |\Cref|* variants for type-setting cross-references, so that
%   cross-reference names are always capitalised.
%    \begin{macrocode}
\newif\if@cref@capitalise
%    \end{macrocode}
% Disabled by default.
%    \begin{macrocode}
\@cref@capitalisefalse
%    \end{macrocode}
% Option overrides default.
%    \begin{macrocode}
\DeclareOption{capitalise}{%
  \PackageInfo{cleveref}{always capitalise cross-reference names}
  \@cref@capitalisetrue}
\DeclareOption{capitalize}{%
  \PackageInfo{cleveref}{always capitalise cross-reference names}
  \@cref@capitalisetrue}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%
%
% \subsection{Language and \package{babel} Support}
% \label{sec:code:babel}
% Default reference formats for different languages are supported via
% package options, in the usual way.
%
% Any contributions of translations for missing languages are most
% welcome! If you can contribute definitions for a missing language,
% ideally you should add them below the existing ones (using those as a
% model), generate a patch against the original \package{cleveref.dtx}
% file, and send the patch by email to the package author. However, if
% you don't know how to produce a patch, you can instead just send the
% translations as a plain text file.
%
%
% \begin{macro}{\crefdefaultlabelformat}
% \begin{macro}{\creflabelformat}
% We first define the default label formats, which don't depend on
% language. We override the default format for equations, to follow the
% near universal convention of enclosing equation labels in brackets.
%    \begin{macrocode}
\crefdefaultlabelformat{#2#1#3}
\creflabelformat{equation}{\textup{(#2#1#3)}}
\@labelcrefdefinedefaultformats
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\cref@addto}
%   Utility macro to use instead of \package{babel}'s flawed \cmd{\addto}
%   (copied and modified from \package{varioref}).
%    \begin{macrocode}
\def\cref@addto#1#2{%
  \@temptokena{#2}%
  \ifx#1\undefined%
    \edef#1{\the\@temptokena}%
  \else%
    \toks@\expandafter{#1}%
    \edef#1{\the\toks@\the\@temptokena}%
  \fi%
  \@temptokena{}\toks@\@temptokena%
}
\@onlypreamble\cref@addto
%    \end{macrocode}
% \end{macro}
%
%
% Passing a language option to \package{cleveref} defines the
% cross-reference names and conjunctions as appropriate for that lanauge.
% We can't make the definitions straight away, since they would prevent
% the automatic definition of the other capitalisation variant from
% working if the user chooses to change a default definition in the
% preamble, so we postpone them until the beginning of the document.
% However, if each language option were to simply to define any formats
% that aren't already defined by the end of the preamble, the
% \emph{first} language option would override all the others.
% Unfortunately, the convention in \LaTeX{} and \package{babel} is for
% the \emph{last} language option to take precedence. So we instead used
% the \cmd{\crefname@preamble} command to save the definitions in
% |\cref@|\meta{type}|@name@preamble| etc., and after all the language
% options have been processed, use the contents of these to set the
% default definitions for any undefined formats.
%
% For \package{babel} support, we add the appropriate redefinitions to
% the\linebreak[4] |\extras|\meta{language} macro, which is called by
% \package{babel}'s \cmd{\selectlanguage} at al.\ commands.  The main
% language (the last one listed in the options) is set up by an automatic
% call to \cmd{\selectlanguage} at the beginning of the document, which
% would clobber any redefinitions made by the user in the preamble. To
% avoid this, we postpone adding the redefinitions to
% |\extras|\meta{language} until the beginning of the document. Since
% \package{cleveref} must always be loaded \emph{after} \package{babel},
% the redefinitions won't be added to |\extras|\meta{language} until
% \emph{after} \package{babel} has already called \cmd{\selectlanguage}
% for the main language. Thus the redefinitions will only be in effect
% when \cmd{\selectlanguage} is called explicitly within the
% document. (The definitions for the main language are taken care of by
% the language options passed to \package{cleveref}, independently of
% \package{babel}.)
%
% Note that we define both capitalisation variants explicitly throughout,
% rather than relying on the automatic definition of the other variant,
% in order to make the code produced by the poor man's |sed| script
% slightly cleaner.
%
% \begin{macro}{english}
%   English definitions (these are used by default).
% \end{macro}
%    \begin{macrocode}
\DeclareOption{english}{%
  \PackageInfo{cleveref}{loaded `english' language definitions}
%    \end{macrocode}
% First, we set up the definitions used at the beginning of the document
% to define the formats created by the document preamble.
%    \begin{macrocode}
  \AtBeginDocument{%
    \def\crefrangeconjunction@preamble{ to\nobreakspace}%
    \def\crefrangepreconjunction@preamble{}%
    \def\crefrangepostconjunction@preamble{}%
    \def\crefpairconjunction@preamble{ and\nobreakspace}%
    \def\crefmiddleconjunction@preamble{, }%
    \def\creflastconjunction@preamble{ and\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@preamble{ and\nobreakspace}%
    \def\crefmiddlegroupconjunction@preamble{, }%
    \def\creflastgroupconjunction@preamble{, and\nobreakspace}%
    \Crefname@preamble{equation}{Equation}{Equations}%
    \Crefname@preamble{part}{Part}{Parts}%
    \Crefname@preamble{chapter}{Chapter}{Chapters}%
    \Crefname@preamble{section}{Section}{Sections}%
    \Crefname@preamble{appendix}{Appendix}{Appendices}%
    \Crefname@preamble{enumi}{Item}{Items}%
    \Crefname@preamble{footnote}{Footnote}{Footnotes}%
    \Crefname@preamble{figure}{Figure}{Figures}%
    \Crefname@preamble{table}{Table}{Tables}%
    \Crefname@preamble{theorem}{Theorem}{Theorems}%
    \Crefname@preamble{lemma}{Lemma}{Lemmas}%
    \Crefname@preamble{corollary}{Corollary}{Corollaries}%
    \Crefname@preamble{proposition}{Proposition}{Propositions}%
    \Crefname@preamble{definition}{Definition}{Definitions}%
    \Crefname@preamble{result}{Result}{Results}%
    \Crefname@preamble{example}{Example}{Examples}%
    \Crefname@preamble{remark}{Remark}{Remarks}%
    \Crefname@preamble{note}{Note}{Notes}%
    \Crefname@preamble{algorithm}{Algorithm}{Algorithms}%
    \Crefname@preamble{listing}{Listing}{Listings}%
    \Crefname@preamble{line}{Line}{Lines}%
    \if@cref@capitalise%
      \crefname@preamble{equation}{Eq.}{Eqs.}%
      \crefname@preamble{part}{Part}{Parts}%
      \crefname@preamble{chapter}{Chapter}{Chapters}%
      \crefname@preamble{section}{Section}{Sections}%
      \crefname@preamble{appendix}{Appendix}{Appendices}%
      \crefname@preamble{enumi}{Item}{Items}%
      \crefname@preamble{footnote}{Footnote}{Footnotes}%
      \crefname@preamble{figure}{Fig.}{Figs.}%
      \crefname@preamble{table}{Table}{Tables}%
      \crefname@preamble{theorem}{Theorem}{Theorems}%
      \crefname@preamble{lemma}{Lemma}{Lemmas}%
      \crefname@preamble{corollary}{Corollary}{Corollaries}%
      \crefname@preamble{proposition}{Proposition}{Propositions}%
      \crefname@preamble{definition}{Definition}{Definitions}%
      \crefname@preamble{result}{Result}{Results}%
      \crefname@preamble{example}{Example}{Examples}%
      \crefname@preamble{remark}{Remark}{Remarks}%
      \crefname@preamble{note}{Note}{Notes}%
      \crefname@preamble{algorithm}{Algorithm}{Algorithms}%
      \crefname@preamble{listing}{Listing}{Listings}%
      \crefname@preamble{line}{Line}{Lines}%
    \else%
      \crefname@preamble{equation}{eq.}{eqs.}%
      \crefname@preamble{part}{part}{parts}%
      \crefname@preamble{chapter}{chapter}{chapters}%
      \crefname@preamble{section}{section}{sections}%
      \crefname@preamble{appendix}{appendix}{appendices}%
      \crefname@preamble{enumi}{item}{items}%
      \crefname@preamble{footnote}{footnote}{footnotes}%
      \crefname@preamble{figure}{fig.}{figs.}%
      \crefname@preamble{table}{table}{tables}%
      \crefname@preamble{theorem}{theorem}{theorems}%
      \crefname@preamble{lemma}{lemma}{lemmas}%
      \crefname@preamble{corollary}{corollary}{corollaries}%
      \crefname@preamble{proposition}{proposition}{propositions}%
      \crefname@preamble{definition}{definition}{definitions}%
      \crefname@preamble{result}{result}{results}%
      \crefname@preamble{example}{example}{examples}%
      \crefname@preamble{remark}{remark}{remarks}%
      \crefname@preamble{note}{note}{notes}%
      \crefname@preamble{algorithm}{algorithm}{algorithms}%
      \crefname@preamble{listing}{listing}{listings}%
      \crefname@preamble{line}{line}{lines}%
    \fi%
    \def\cref@language{english}%
%    \end{macrocode}
%
% Next, we add the definitions to \cmd{\extras}\dots so that
% \package{babel}'s \cmd{\selectlanguage} command will change the format
% appropriately.
%    \begin{macrocode}
    \cref@addto\extrasenglish{%
      \renewcommand{\crefrangeconjunction}{ to\nobreakspace}%
      \renewcommand\crefrangepreconjunction{}%
      \renewcommand\crefrangepostconjunction{}%
      \renewcommand{\crefpairconjunction}{ and\nobreakspace}%
      \renewcommand{\crefmiddleconjunction}{, }%
      \renewcommand{\creflastconjunction}{ and\nobreakspace}%
      \renewcommand{\crefpairgroupconjunction}{ and\nobreakspace}%
      \renewcommand{\crefmiddlegroupconjunction}{, }%
      \renewcommand{\creflastgroupconjunction}{, and\nobreakspace}%
      \Crefname{equation}{Equation}{Equations}%
      \Crefname{part}{Part}{Parts}%
      \Crefname{chapter}{Chapter}{Chapters}%
      \Crefname{section}{Section}{Sections}%
      \Crefname{subsection}{Section}{Sections}%
      \Crefname{subsubsection}{Section}{Sections}%
      \Crefname{appendix}{Appendix}{Appendices}%
      \Crefname{subappendix}{Appendix}{Appendices}%
      \Crefname{subsubappendix}{Appendix}{Appendices}%
      \Crefname{subsubsubappendix}{Appendix}{Appendices}%
      \Crefname{enumi}{Item}{Items}%
      \Crefname{enumii}{Item}{Items}%
      \Crefname{enumiii}{Item}{Items}%
      \Crefname{enumiv}{Item}{Items}%
      \Crefname{enumv}{Item}{Items}%
      \Crefname{footnote}{Footnote}{Footnotes}%
      \Crefname{figure}{Figure}{Figures}%
      \Crefname{subfigure}{Figure}{Figures}%
      \Crefname{table}{Table}{Tables}%
      \Crefname{subtable}{Table}{Tables}%
      \Crefname{theorem}{Theorem}{Theorems}%
      \Crefname{lemma}{Lemma}{Lemmas}%
      \Crefname{corollary}{Corollary}{Corollaries}%
      \Crefname{proposition}{Proposition}{Propositions}%
      \Crefname{definition}{Definition}{Definitions}%
      \Crefname{result}{Result}{Results}%
      \Crefname{example}{Example}{Examples}%
      \Crefname{remark}{Remark}{Remarks}%
      \Crefname{note}{Note}{Notes}%
      \Crefname{algorithm}{Algorithm}{Algorithms}%
      \Crefname{listing}{Listing}{Listings}%
      \Crefname{line}{Line}{Lines}%
      \if@cref@capitalise%
        \crefname{equation}{Eq.}{Eqs.}%
        \crefname{part}{Part}{Parts}%
        \crefname{chapter}{Chapter}{Chapters}%
        \crefname{section}{Section}{Sections}%
        \crefname{subsection}{Section}{Sections}%
        \crefname{subsubsection}{Section}{Sections}%
        \crefname{appendix}{Appendix}{Appendices}%
        \crefname{subappendix}{Appendix}{Appendices}%
        \crefname{subsubappendix}{Appendix}{Appendices}%
        \crefname{subsubsubappendix}{Appendix}{Appendices}%
        \crefname{enumi}{Item}{Items}%
        \crefname{enumii}{Item}{Items}%
        \crefname{enumiii}{Item}{Items}%
        \crefname{enumiv}{Item}{Items}%
        \crefname{enumv}{Item}{Items}%
        \crefname{footnote}{Footnote}{Footnotes}%
        \crefname{figure}{Fig.}{Figs.}%
        \crefname{subfigure}{Fig.}{Figs.}%
        \crefname{table}{Table}{Tables}%
        \crefname{subtable}{Table}{Tables}%
        \crefname{theorem}{Theorem}{Theorems}%
        \crefname{lemma}{Lemma}{Lemmas}%
        \crefname{corollary}{Corollary}{Corollaries}%
        \crefname{proposition}{Proposition}{Propositions}%
        \crefname{definition}{Definition}{Definitions}%
        \crefname{result}{Result}{Results}%
        \crefname{example}{Example}{Examples}%
        \crefname{remark}{Remark}{Remarks}%
        \crefname{note}{Note}{Notes}%
        \crefname{algorithm}{Algorithm}{Algorithms}%
        \crefname{listing}{Listing}{Listings}%
        \crefname{line}{Line}{Lines}%
      \else%
        \crefname{equation}{eq.}{eqs.}%
        \crefname{part}{part}{parts}%
        \crefname{chapter}{chapter}{chapters}%
        \crefname{section}{section}{sections}%
        \crefname{subsection}{section}{sections}%
        \crefname{subsubsection}{section}{sections}%
        \crefname{appendix}{appendix}{appendices}%
        \crefname{subappendix}{appendix}{appendices}%
        \crefname{subsubappendix}{appendix}{appendices}%
        \crefname{subsubsubappendix}{appendix}{appendices}%
        \crefname{enumi}{item}{items}%
        \crefname{enumii}{item}{items}%
        \crefname{enumiii}{item}{items}%
        \crefname{enumiv}{item}{items}%
        \crefname{enumv}{item}{items}%
        \crefname{footnote}{footnote}{footnotes}%
        \crefname{figure}{fig.}{figs.}%
        \crefname{subfigure}{fig.}{figs.}%
        \crefname{table}{table}{tables}%
        \crefname{subtable}{table}{tables}%
        \crefname{theorem}{theorem}{theorems}%
        \crefname{lemma}{lemma}{lemmas}%
        \crefname{corollary}{corollary}{corollaries}%
        \crefname{proposition}{proposition}{propositions}%
        \crefname{definition}{definition}{definitions}%
        \crefname{result}{result}{results}%
        \crefname{example}{example}{examples}%
        \crefname{remark}{remark}{remarks}%
        \crefname{note}{note}{notes}%
        \crefname{algorithm}{algorithm}{algorithms}%
        \crefname{listing}{listing}{listings}%
        \crefname{line}{line}{lines}%
      \fi%
    }}}
%    \end{macrocode}
%
% \begin{macro}{german}
%   German translations kindly provided by Stefan Pinnow, with a few
%   additions by the package author (so you know to blame the latter for
%   any errors!).
% \end{macro}
%    \begin{macrocode}
\DeclareOption{german}{%
  \PackageInfo{cleveref}{loaded `german' language definitions}
%    \end{macrocode}
% First, we set up the definitions used at the beginning of the document
% to define the formats created by the document preamble.
%    \begin{macrocode}
  \AtBeginDocument{%
    \def\crefrangeconjunction@preamble{ bis\nobreakspace}%
    \def\crefrangepreconjunction@preamble{}%
    \def\crefrangepostconjunction@preamble{}%
    \def\crefpairconjunction@preamble{ und\nobreakspace}%
    \def\crefmiddleconjunction@preamble{, }%
    \def\creflastconjunction@preamble{ und\nobreakspace}%
%    \end{macrocode}
% We don't want the extra comma before ``und'' that would be added by the
% default fall-back definitions in terms of the above conjunctions, so we
% define \cmd{\crefpairgroupconjunction} explicitly. In fact, we have to
% define the other group conjunctions explicitly too here, in case any
% other language option defines them explicitly and we need to override
% them.
%    \begin{macrocode}
    \def\crefpairgroupconjunction@preamble{ und\nobreakspace}%
    \def\crefmiddlegroupconjunction@preamble{, }%
    \def\creflastgroupconjunction@preamble{ und\nobreakspace}%
    \Crefname@preamble{equation}{Gleichung}{Gleichungen}%
    \Crefname@preamble{part}{Teil}{Teilen}%
    \Crefname@preamble{chapter}{Kapitel}{Kapitel}%
    \Crefname@preamble{section}{Abschnitt}{Abschnitte}%
    \Crefname@preamble{appendix}{Anhang}{Anh\"ange}%
    \Crefname@preamble{enumi}{Punkt}{Punkte}%
    \Crefname@preamble{footnote}{Fu\ss note}{Fu\ss noten}%
    \Crefname@preamble{figure}{Abbildung}{Abbildungen}%
    \Crefname@preamble{table}{Tabelle}{Tabellen}%
    \Crefname@preamble{theorem}{Theorem}{Theoremen}%
    \Crefname@preamble{lemma}{Lemma}{Lemmata}%
    \Crefname@preamble{corollary}{Korollar}{Korollaren}%
    \Crefname@preamble{proposition}{Satz}{S\"atze}%
    \Crefname@preamble{definition}{Definition}{Definitionen}%
    \Crefname@preamble{result}{Ergebnis}{Ergebnisse}%
    \Crefname@preamble{example}{Beispiel}{Beispiele}%
    \Crefname@preamble{remark}{Bemerkung}{Bemerkungen}%
    \Crefname@preamble{note}{Anmerkung}{Anmerkungen}%
    \Crefname@preamble{algorithm}{Algorithmus}{Algorithmen}%
    \Crefname@preamble{listing}{Listing}{Listings}%
    \Crefname@preamble{line}{Zeile}{Zeilen}%
    \if@cref@capitalise%
      \crefname@preamble{equation}{Gleichung}{Gleichungen}%
      \crefname@preamble{part}{Teil}{Teilen}%
      \crefname@preamble{chapter}{Kapitel}{Kapitel}%
      \crefname@preamble{section}{Abschnitt}{Abschnitte}%
      \crefname@preamble{appendix}{Anhang}{Anh\"ange}%
      \crefname@preamble{enumi}{Punkt}{Punkte}%
      \crefname@preamble{footnote}{Fu\ss note}{Fu\ss noten}%
      \crefname@preamble{figure}{Abbildung}{Abbildungen}%
      \crefname@preamble{table}{Tabelle}{Tabellen}%
      \crefname@preamble{theorem}{Theorem}{Theoremen}%
      \crefname@preamble{lemma}{Lemma}{Lemmata}%
      \crefname@preamble{corollary}{Korollar}{Korollaren}%
      \crefname@preamble{proposition}{Satz}{S\"atze}%
      \crefname@preamble{definition}{Definition}{Definitionen}%
      \crefname@preamble{result}{Ergebnis}{Ergebnisse}%
      \crefname@preamble{example}{Beispiel}{Beispiele}%
      \crefname@preamble{remark}{Bemerkung}{Bemerkungen}%
      \crefname@preamble{note}{Anmerkung}{Anmerkungen}%
      \crefname@preamble{algorithm}{Algorithmus}{Algorithmen}%
      \crefname@preamble{listing}{Listing}{Listings}%
      \crefname@preamble{line}{Zeile}{Zeilen}%
    \else%
      \crefname@preamble{equation}{Gleichung}{Gleichungen}%
      \crefname@preamble{part}{Teil}{Teilen}%
      \crefname@preamble{chapter}{Kapitel}{Kapitel}%
      \crefname@preamble{section}{Abschnitt}{Abschnitte}%
      \crefname@preamble{appendix}{Anhang}{Anh\"ange}%
      \crefname@preamble{enumi}{Punkt}{Punkte}%
      \crefname@preamble{footnote}{Fu\ss note}{Fu\ss noten}%
      \crefname@preamble{figure}{Abbildung}{Abbildungen}%
      \crefname@preamble{table}{Tabelle}{Tabellen}%
      \crefname@preamble{theorem}{Theorem}{Theoremen}%
      \crefname@preamble{lemma}{Lemma}{Lemmata}%
      \crefname@preamble{corollary}{Korollar}{Korollaren}%
      \crefname@preamble{proposition}{Satz}{S\"atze}%
      \crefname@preamble{definition}{Definition}{Definitionen}%
      \crefname@preamble{result}{Ergebnis}{Ergebnisse}%
      \crefname@preamble{example}{Beispiel}{Beispiele}%
      \crefname@preamble{remark}{Bemerkung}{Bemerkungen}%
      \crefname@preamble{note}{Anmerkung}{Anmerkungen}%
      \crefname@preamble{algorithm}{Algorithmus}{Algorithmen}%
      \crefname@preamble{listing}{Listing}{Listings}%
      \crefname@preamble{line}{Zeile}{Zeilen}%
    \fi%
    \def\cref@language{german}%
%    \end{macrocode}
%
% Next, we add the definitions to \cmd{\extras}\dots so that
% \package{babel}'s \cmd{\selectlanguage} command will change the format
% appropriately.
%    \begin{macrocode}
    \cref@addto\extrasgerman{%
      \renewcommand{\crefrangeconjunction}{ bis\nobreakspace}%
      \renewcommand\crefrangepreconjunction{}%
      \renewcommand\crefrangepostconjunction{}%
      \renewcommand{\crefpairconjunction}{ und\nobreakspace}%
      \renewcommand{\crefmiddleconjunction}{, }%
      \renewcommand{\creflastconjunction}{ und\nobreakspace}%
      \renewcommand{\crefpairgroupconjunction}{ und\nobreakspace}%
      \renewcommand{\crefmiddlegroupconjunction}{, }%
      \renewcommand{\creflastgroupconjunction}{ und\nobreakspace}%
      \Crefname{equation}{Gleichung}{Gleichungen}%
      \Crefname{part}{Teil}{Teilen}%
      \Crefname{chapter}{Kapitel}{Kapitel}%
      \Crefname{section}{Abschnitt}{Abschnitte}%
      \Crefname{subsection}{Abschnitt}{Abschnitte}%
      \Crefname{subsubsection}{Abschnitt}{Abschnitte}%
      \Crefname{appendix}{Anhang}{Anh\"ange}%
      \Crefname{subappendix}{Anhang}{Anh\"ange}%
      \Crefname{subsubappendix}{Anhang}{Anh\"ange}%
      \Crefname{subsubsubappendix}{Anhang}{Anh\"ange}%
      \Crefname{enumi}{Punkt}{Punkte}%
      \Crefname{enumii}{Punkt}{Punkte}%
      \Crefname{enumiii}{Punkt}{Punkte}%
      \Crefname{enumiv}{Punkt}{Punkte}%
      \Crefname{enumv}{Punkt}{Punkte}%
      \Crefname{footnote}{Fu\ss note}{Fu\ss noten}%
      \Crefname{figure}{Abbildung}{Abbildungen}%
      \Crefname{subfigure}{Abbildung}{Abbildungen}%
      \Crefname{table}{Tabelle}{Tabellen}%
      \Crefname{subtable}{Tabelle}{Tabellen}%
      \Crefname{theorem}{Theorem}{Theoremen}%
      \Crefname{lemma}{Lemma}{Lemmata}%
      \Crefname{corollary}{Korollar}{Korollaren}%
      \Crefname{proposition}{Satz}{S\"atze}%
      \Crefname{definition}{Definition}{Definitionen}%
      \Crefname{result}{Ergebnis}{Ergebnisse}%
      \Crefname{example}{Beispiel}{Beispiele}%
      \Crefname{remark}{Bemerkung}{Bemerkungen}%
      \Crefname{note}{Anmerkung}{Anmerkungen}%
      \Crefname{algorithm}{Algorithmus}{Algorithmen}%
      \Crefname{listing}{Listing}{Listings}%
      \Crefname{line}{Zeile}{Zeilen}%
      \if@cref@capitalise%
        \crefname{equation}{Gleichung}{Gleichungen}%
        \crefname{part}{Teil}{Teilen}%
        \crefname{chapter}{Kapitel}{Kapitel}%
        \crefname{section}{Abschnitt}{Abschnitte}%
        \crefname{subsection}{Abschnitt}{Abschnitte}%
        \crefname{subsubsection}{Abschnitt}{Abschnitte}%
        \crefname{appendix}{Anhang}{Anh\"ange}%
        \crefname{subappendix}{Anhang}{Anh\"ange}%
        \crefname{subsubappendix}{Anhang}{Anh\"ange}%
        \crefname{subsubsubappendix}{Anhang}{Anh\"ange}%
        \crefname{enumi}{Punkt}{Punkte}%
        \crefname{enumii}{Punkt}{Punkte}%
        \crefname{enumiii}{Punkt}{Punkte}%
        \crefname{enumiv}{Punkt}{Punkte}%
        \crefname{enumv}{Punkt}{Punkte}%
        \crefname{footnote}{Fu\ss note}{Fu\ss noten}%
        \crefname{figure}{Abbildung}{Abbildungen}%
        \crefname{subfigure}{Abbildung}{Abbildungen}%
        \crefname{table}{Tabelle}{Tabellen}%
        \crefname{subtable}{Tabelle}{Tabellen}%
        \crefname{theorem}{Theorem}{Theoremen}%
        \crefname{lemma}{Lemma}{Lemmata}%
        \crefname{corollary}{Korollar}{Korollaren}%
        \crefname{proposition}{Satz}{S\"atze}%
        \crefname{definition}{Definition}{Definitionen}%
        \crefname{result}{Ergebnis}{Ergebnisse}%
        \crefname{example}{Beispiel}{Beispiele}%
        \crefname{remark}{Bemerkung}{Bemerkungen}%
        \crefname{note}{Anmerkung}{Anmerkungen}%
        \crefname{algorithm}{Algorithmus}{Algorithmen}%
        \crefname{listing}{Listing}{Listings}%
        \crefname{line}{Zeile}{Zeilen}%
      \else%
        \crefname{equation}{Gleichung}{Gleichungen}%
        \crefname{part}{Teil}{Teilen}%
        \crefname{chapter}{Kapitel}{Kapitel}%
        \crefname{section}{Abschnitt}{Abschnitte}%
        \crefname{subsection}{Abschnitt}{Abschnitte}%
        \crefname{subsubsection}{Abschnitt}{Abschnitte}%
        \crefname{appendix}{Anhang}{Anh\"ange}%
        \crefname{subappendix}{Anhang}{Anh\"ange}%
        \crefname{subsubappendix}{Anhang}{Anh\"ange}%
        \crefname{subsubsubappendix}{Anhang}{Anh\"ange}%
        \crefname{enumi}{Punkt}{Punkte}%
        \crefname{enumii}{Punkt}{Punkte}%
        \crefname{enumiii}{Punkt}{Punkte}%
        \crefname{enumiv}{Punkt}{Punkte}%
        \crefname{enumv}{Punkt}{Punkte}%
        \crefname{footnote}{Fu\ss note}{Fu\ss noten}%
        \crefname{figure}{Abbildung}{Abbildungen}%
        \crefname{subfigure}{Abbildung}{Abbildungen}%
        \crefname{table}{Tabelle}{Tabellen}%
        \crefname{subtable}{Tabelle}{Tabellen}%
        \crefname{theorem}{Theorem}{Theoremen}%
        \crefname{lemma}{Lemma}{Lemmata}%
        \crefname{corollary}{Korollar}{Korollaren}%
        \crefname{proposition}{Satz}{S\"atze}%
        \crefname{definition}{Definition}{Definitionen}%
        \crefname{result}{Ergebnis}{Ergebnisse}%
        \crefname{example}{Beispiel}{Beispiele}%
        \crefname{remark}{Bemerkung}{Bemerkungen}%
        \crefname{note}{Anmerkung}{Anmerkungen}%
        \crefname{algorithm}{Algorithmus}{Algorithmen}%
        \crefname{listing}{Listing}{Listings}%
        \crefname{line}{Zeile}{Zeilen}%
      \fi%
    }}}
%    \end{macrocode}
%
%
% \begin{macro}{ngerman}
%   It so happens that none of the cross-reference names differ in the
%   ``Neuerechtschreibung'', so we make \option{ngerman} execute
%   \option{german}. However, we still need to add the definitions to
%   \cmd{\extrasngerman} (note the ``n'') so that \cmd{\selectlanguage}
%   etc.\ will work.
% \end{macro}
%    \begin{macrocode}
\DeclareOption{ngerman}{%
  \PackageInfo{cleveref}{loaded `ngerman' language definitions}
  \ExecuteOptions{german}
  \def\cref@language{ngerman}
  \AtBeginDocument{%
    \cref@addto\extrasngerman{%
      \renewcommand{\crefrangeconjunction}{ bis\nobreakspace}%
      \renewcommand\crefrangepreconjunction{}%
      \renewcommand\crefrangepostconjunction{}%
      \renewcommand{\crefpairconjunction}{ und\nobreakspace}%
      \renewcommand{\crefmiddleconjunction}{, }%
      \renewcommand{\creflastconjunction}{ und\nobreakspace}%
      \renewcommand{\crefpairgroupconjunction}{ und\nobreakspace}%
      \renewcommand{\crefmiddlegroupconjunction}{, }%
      \renewcommand{\creflastgroupconjunction}{ und\nobreakspace}%
      \Crefname{equation}{Gleichung}{Gleichungen}%
      \Crefname{part}{Teil}{Teilen}%
      \Crefname{chapter}{Kapitel}{Kapitel}%
      \Crefname{section}{Abschnitt}{Abschnitte}%
      \Crefname{subsection}{Abschnitt}{Abschnitte}%
      \Crefname{subsubsection}{Abschnitt}{Abschnitte}%
      \Crefname{appendix}{Anhang}{Anh\"ange}%
      \Crefname{subappendix}{Anhang}{Anh\"ange}%
      \Crefname{subsubappendix}{Anhang}{Anh\"ange}%
      \Crefname{subsubsubappendix}{Anhang}{Anh\"ange}%
      \Crefname{enumi}{Punkt}{Punkte}%
      \Crefname{enumii}{Punkt}{Punkte}%
      \Crefname{enumiii}{Punkt}{Punkte}%
      \Crefname{enumiv}{Punkt}{Punkte}%
      \Crefname{enumv}{Punkt}{Punkte}%
      \Crefname{footnote}{Fu\ss note}{Fu\ss noten}%
      \Crefname{figure}{Abbildung}{Abbildungen}%
      \Crefname{subfigure}{Abbildung}{Abbildungen}%
      \Crefname{table}{Tabelle}{Tabellen}%
      \Crefname{subtable}{Tabelle}{Tabellen}%
      \Crefname{theorem}{Theorem}{Theoremen}%
      \Crefname{lemma}{Lemma}{Lemmata}%
      \Crefname{corollary}{Korollar}{Korollaren}%
      \Crefname{proposition}{Satz}{S\"atze}%
      \Crefname{definition}{Definition}{Definitionen}%
      \Crefname{result}{Ergebnis}{Ergebnisse}%
      \Crefname{example}{Beispiel}{Beispiele}%
      \Crefname{remark}{Bemerkung}{Bemerkungen}%
      \Crefname{note}{Anmerkung}{Anmerkungen}%
      \Crefname{algorithm}{Algorithmus}{Algorithmen}%
      \Crefname{listing}{Listing}{Listings}%
      \Crefname{line}{Zeile}{Zeilen}%
      \if@cref@capitalise%
        \crefname{equation}{Gleichung}{Gleichungen}%
        \crefname{part}{Teil}{Teilen}%
        \crefname{chapter}{Kapitel}{Kapitel}%
        \crefname{section}{Abschnitt}{Abschnitte}%
        \crefname{subsection}{Abschnitt}{Abschnitte}%
        \crefname{subsubsection}{Abschnitt}{Abschnitte}%
        \crefname{appendix}{Anhang}{Anh\"ange}%
        \crefname{subappendix}{Anhang}{Anh\"ange}%
        \crefname{subsubappendix}{Anhang}{Anh\"ange}%
        \crefname{subsubsubappendix}{Anhang}{Anh\"ange}%
        \crefname{enumi}{Punkt}{Punkte}%
        \crefname{enumii}{Punkt}{Punkte}%
        \crefname{enumiii}{Punkt}{Punkte}%
        \crefname{enumiv}{Punkt}{Punkte}%
        \crefname{enumv}{Punkt}{Punkte}%
        \crefname{footnote}{Fu\ss note}{Fu\ss noten}%
        \crefname{figure}{Abbildung}{Abbildungen}%
        \crefname{subfigure}{Abbildung}{Abbildungen}%
        \crefname{table}{Tabelle}{Tabellen}%
        \crefname{subtable}{Tabelle}{Tabellen}%
        \crefname{theorem}{Theorem}{Theoremen}%
        \crefname{lemma}{Lemma}{Lemmata}%
        \crefname{corollary}{Korollar}{Korollaren}%
        \crefname{proposition}{Satz}{S\"atze}%
        \crefname{definition}{Definition}{Definitionen}%
        \crefname{result}{Ergebnis}{Ergebnisse}%
        \crefname{example}{Beispiel}{Beispiele}%
        \crefname{remark}{Bemerkung}{Bemerkungen}%
        \crefname{note}{Anmerkung}{Anmerkungen}%
        \crefname{algorithm}{Algorithmus}{Algorithmen}%
        \crefname{listing}{Listing}{Listings}%
        \crefname{line}{Zeile}{Zeilen}%
      \else%
        \crefname{equation}{Gleichung}{Gleichungen}%
        \crefname{part}{Teil}{Teilen}%
        \crefname{chapter}{Kapitel}{Kapitel}%
        \crefname{section}{Abschnitt}{Abschnitte}%
        \crefname{subsection}{Abschnitt}{Abschnitte}%
        \crefname{subsubsection}{Abschnitt}{Abschnitte}%
        \crefname{appendix}{Anhang}{Anh\"ange}%
        \crefname{subappendix}{Anhang}{Anh\"ange}%
        \crefname{subsubappendix}{Anhang}{Anh\"ange}%
        \crefname{subsubsubappendix}{Anhang}{Anh\"ange}%
        \crefname{enumi}{Punkt}{Punkte}%
        \crefname{enumii}{Punkt}{Punkte}%
        \crefname{enumiii}{Punkt}{Punkte}%
        \crefname{enumiv}{Punkt}{Punkte}%
        \crefname{enumv}{Punkt}{Punkte}%
        \crefname{footnote}{Fu\ss note}{Fu\ss noten}%
        \crefname{figure}{Abbildung}{Abbildungen}%
        \crefname{subfigure}{Abbildung}{Abbildungen}%
        \crefname{table}{Tabelle}{Tabellen}%
        \crefname{subtable}{Tabelle}{Tabellen}%
        \crefname{theorem}{Theorem}{Theoremen}%
        \crefname{lemma}{Lemma}{Lemmata}%
        \crefname{corollary}{Korollar}{Korollaren}%
        \crefname{proposition}{Satz}{S\"atze}%
        \crefname{definition}{Definition}{Definitionen}%
        \crefname{result}{Ergebnis}{Ergebnisse}%
        \crefname{example}{Beispiel}{Beispiele}%
        \crefname{remark}{Bemerkung}{Bemerkungen}%
        \crefname{note}{Anmerkung}{Anmerkungen}%
        \crefname{algorithm}{Algorithmus}{Algorithmen}%
        \crefname{listing}{Listing}{Listings}%
        \crefname{line}{Zeile}{Zeilen}%
      \fi%
    }}}
%    \end{macrocode}
%
% \begin{macro}{dutch}
%   Dutch translations kindly contributed by Philip H\"olzenspies.
% \end{macro}
%    \begin{macrocode}
\DeclareOption{dutch}{%
  \PackageInfo{cleveref}{loaded `dutch' language definitions}
%    \end{macrocode}
% First, we set up the definitions used at the beginning of the document
% to define the formats created by the document preamble.
%    \begin{macrocode}
  \AtBeginDocument{%
    \def\crefrangeconjunction@preamble{ tot\nobreakspace}%
    \def\crefrangepreconjunction@preamble{}%
    \def\crefrangepostconjunction@preamble{}%
    \def\crefpairconjunction@preamble{ en\nobreakspace}%
    \def\crefmiddleconjunction@preamble{, }%
    \def\creflastconjunction@preamble{ en\nobreakspace}%
%    \end{macrocode}
% As in German, we don't want the extra comma before ``en'' that would be
% added by the default fall-back definitions in terms of the above
% conjunctions, so we define \cmd{\crefpairgroupconjunction} explicitly.
% In fact, we have to define the other group conjunctions explicitly too
% here, in case any other language option defines them explicitly and we
% need to override them.
%    \begin{macrocode}
    \def\crefpairgroupconjunction@preamble{ en\nobreakspace}%
    \def\crefmiddlegroupconjunction@preamble{, }%
    \def\creflastgroupconjunction@preamble{ en\nobreakspace}%
    \Crefname@preamble{equation}{Vergel\ij{}king}{Vergel\ij{}kingen}%
    \Crefname@preamble{part}{Deel}{Delen}%
    \Crefname@preamble{chapter}{Hoofdstuk}{Hoofdstuken}%
    \Crefname@preamble{section}{Paragraaf}{Paragrafen}%
    \Crefname@preamble{appendix}{Appendix}{Appendices}%
    \Crefname@preamble{figure}{Figuur}{Figuren}%
    \Crefname@preamble{table}{Tabel}{Tabellen}%
    \Crefname@preamble{enumi}{Punt}{Punten}%
    \Crefname@preamble{footnote}{Voetnote}{Voetnoten}%
    \Crefname@preamble{lemma}{Lemma}{Lemma's}%
    \Crefname@preamble{corollary}{Corollarium}{Corollaria}%
    \Crefname@preamble{proposition}{Bewering}{Beweringen}%
    \Crefname@preamble{definition}{Definitie}{Definities}%
    \Crefname@preamble{result}{Resultaat}{Resultaten}%
    \Crefname@preamble{example}{Voorbeeld}{Voorbeelden}%
    \Crefname@preamble{remark}{Opmerking}{Opmerkingen}%
    \Crefname@preamble{note}{Aantekening}{Aantekeningen}%
    \Crefname@preamble{algorithm}{Algoritme}{Algoritmen}%
    \Crefname@preamble{listing}{Listing}{Listings}%
    \Crefname@preamble{line}{Lijn}{Lijnen}%
    \if@cref@capitalise%
      \crefname@preamble{equation}{Verg.}{Verg's.}%
      \crefname@preamble{part}{Deel}{Delen}%
      \crefname@preamble{chapter}{Hoofdstuk}{Hoofdstukken}%
      \crefname@preamble{section}{Paragraaf}{Paragrafen}%
      \crefname@preamble{appendix}{Appendix}{Appendices}%
      \crefname@preamble{enumi}{Punt}{Punten}%
      \crefname@preamble{footnote}{Voetnote}{Voetnoten}%
      \crefname@preamble{figure}{Fig.}{Fig's.}%
      \crefname@preamble{table}{Tabel}{Tabellen}%
      \crefname@preamble{theorem}{Theorema}{Theorema's}%
      \crefname@preamble{lemma}{Lemma}{Lemma's}%
      \crefname@preamble{corollary}{Corollarium}{Corollaria}%
      \crefname@preamble{proposition}{Bewering}{Beweringen}%
      \crefname@preamble{definition}{Definitie}{Definities}%
      \crefname@preamble{result}{Resultaat}{Resultaten}%
      \crefname@preamble{example}{Voorbeeld}{Voorbeelden}%
      \crefname@preamble{remark}{Opmerking}{Opmerkingen}%
      \crefname@preamble{note}{Aantekening}{Aantekeningen}%
      \crefname@preamble{algorithm}{Algoritme}{Algoritmen}%
      \crefname@preamble{listing}{Listing}{Listings}%
      \crefname@preamble{line}{Lijn}{Lijnen}%
    \else%
      \crefname@preamble{equation}{verg.}{verg's.}%
      \crefname@preamble{part}{deel}{delen}%
      \crefname@preamble{chapter}{hoofdstuk}{hoofdstukken}%
      \crefname@preamble{section}{paragraaf}{paragrafen}%
      \crefname@preamble{appendix}{appendix}{appendices}%
      \crefname@preamble{enumi}{punt}{punten}%
      \crefname@preamble{footnote}{voetnote}{voetnoten}%
      \crefname@preamble{figure}{fig.}{fig's.}%
      \crefname@preamble{table}{tabel}{tabellen}%
      \crefname@preamble{theorem}{theorema}{theorema's}%
      \crefname@preamble{lemma}{lemma}{lemma's}%
      \crefname@preamble{corollary}{corollarium}{corollaria}%
      \crefname@preamble{proposition}{bewering}{beweringen}%
      \crefname@preamble{definition}{definitie}{definities}%
      \crefname@preamble{result}{resultaat}{resultaten}%
      \crefname@preamble{example}{voorbeeld}{voorbeelden}%
      \crefname@preamble{remark}{opmerking}{opmerkingen}%
      \crefname@preamble{note}{aantekening}{aantekeningen}%
      \crefname@preamble{algorithm}{algoritme}{algoritmen}%
      \crefname@preamble{listing}{listing}{listings}%
      \crefname@preamble{line}{lijn}{lijnen}%
    \fi%
    \def\cref@language{dutch}%
%    \end{macrocode}
%
% Next, we add the definitions to \cmd{\extras}\dots so that
% \package{babel}'s \cmd{\selectlanguage} command will change the format
% appropriately.
%    \begin{macrocode}
    \cref@addto\extrasdutch{%
      \renewcommand{\crefrangeconjunction}{ tot\nobreakspace}%
      \renewcommand\crefrangepreconjunction{}%
      \renewcommand\crefrangepostconjunction{}%
      \renewcommand{\crefpairconjunction}{ en\nobreakspace}%
      \renewcommand{\crefmiddleconjunction}{, }%
      \renewcommand{\creflastconjunction}{ en\nobreakspace}%
      \renewcommand{\crefpairgroupconjunction}{ en\nobreakspace}%
      \renewcommand{\crefmiddlegroupconjunction}{, }%
      \renewcommand{\creflastgroupconjunction}{ en\nobreakspace}%
      \Crefname{equation}{Vergel\ij{}king}{Vergel\ij{}kingen}%
      \Crefname{part}{Deel}{Delen}%
      \Crefname{chapter}{Hoofdstuk}{Hoofdstuken}%
      \Crefname{section}{Paragraaf}{Paragrafen}%
      \Crefname{subsection}{Paragraaf}{Paragrafen}%
      \Crefname{subsubsection}{Paragraaf}{Paragrafen}%
      \Crefname{appendix}{Appendix}{Appendices}%
      \Crefname{subappendix}{Appendix}{Appendices}%
      \Crefname{subsubappendix}{Appendix}{Appendices}%
      \Crefname{subsubsubappendix}{Appendix}{Appendices}%
      \Crefname{enumi}{Punt}{Punten}%
      \Crefname{enumii}{Punt}{Punten}%
      \Crefname{enumiii}{Punt}{Punten}%
      \Crefname{enumiv}{Punt}{Punten}%
      \Crefname{enumv}{Punt}{Punten}%
      \Crefname{footnote}{Voetnote}{Voetnoten}%
      \Crefname{figure}{Figuur}{Figuren}%
      \Crefname{subfigure}{Figuur}{Figuren}%
      \Crefname{table}{Tabel}{Tabellen}%
      \Crefname{subtable}{Tabel}{Tabellen}%
      \Crefname{theorem}{Theorema}{Theorema's}%
      \Crefname{lemma}{Lemma}{Lemma's}%
      \Crefname{corollary}{Corollarium}{Corollaria}%
      \Crefname{proposition}{Bewering}{Beweringen}%
      \Crefname{definition}{Definitie}{Definities}%
      \Crefname{result}{Resultaat}{Resultaten}%
      \Crefname{example}{Voorbeeld}{Voorbeelden}%
      \Crefname{remark}{Opmerking}{Opmerkingen}%
      \Crefname{note}{Aantekening}{Aantekeningen}%
      \Crefname{algorithm}{Algoritme}{Algoritmen}%
      \Crefname{listing}{Listing}{Listings}%
      \Crefname{line}{Lijn}{Lijnen}%
      \if@cref@capitalise%
        \crefname{equation}{Verg.}{Verg's.}%
        \crefname{part}{Deel}{Delen}%
        \crefname{chapter}{Hoofdstuk}{Hoofdstukken}%
        \crefname{section}{Paragraaf}{Paragrafen}%
        \crefname{appendix}{Appendix}{Appendices}%
        \crefname{enumi}{Punt}{Punten}%
        \crefname{footnote}{Voetnote}{Voetnoten}%
        \crefname{figure}{Fig.}{Fig's.}%
        \crefname{table}{Tabel}{Tabellen}%
        \crefname{theorem}{Theorema}{Theorema's}%
        \crefname{lemma}{Lemma}{Lemma's}%
        \crefname{corollary}{Corollarium}{Corollaria}%
        \crefname{proposition}{Bewering}{Beweringen}%
        \crefname{definition}{Definitie}{Definities}%
        \crefname{result}{Resultaat}{Resultaten}%
        \crefname{example}{Voorbeeld}{Voorbeelden}%
        \crefname{remark}{Opmerking}{Opmerkingen}%
        \crefname{note}{Aantekening}{Aantekeningen}%
        \crefname{algorithm}{Algoritme}{Algoritmen}%
        \crefname{listing}{Listing}{Listings}%
        \crefname{line}{Lijn}{Lijnen}%
      \else%
        \crefname{equation}{verg.}{verg's.}%
        \crefname{part}{deel}{delen}%
        \crefname{chapter}{hoofdstuk}{hoofdstukken}%
        \crefname{section}{paragraaf}{paragrafen}%
        \crefname{appendix}{appendix}{appendices}%
        \crefname{enumi}{punt}{punten}%
        \crefname{footnote}{voetnote}{voetnoten}%
        \crefname{figure}{fig.}{fig's.}%
        \crefname{table}{tabel}{tabellen}%
        \crefname{theorem}{theorema}{theorema's}%
        \crefname{lemma}{lemma}{lemma's}%
        \crefname{corollary}{corollarium}{corollaria}%
        \crefname{proposition}{bewering}{beweringen}%
        \crefname{definition}{definitie}{definities}%
        \crefname{result}{resultaat}{resultaten}%
        \crefname{example}{voorbeeld}{voorbeelden}%
        \crefname{remark}{opmerking}{opmerkingen}%
        \crefname{note}{aantekening}{aantekeningen}%
        \crefname{algorithm}{algoritme}{algoritmen}%
        \crefname{listing}{listing}{listings}%
        \crefname{line}{lijn}{lijnen}%
      \fi%
    }}}
%    \end{macrocode}
%
%
% \begin{macro}{french}
%   French translations attempted by the package author (please report
%   any corrections that might be needed!).
% \end{macro}
%    \begin{macrocode}
\DeclareOption{french}{%
  \PackageInfo{cleveref}{loaded `french' language definitions}
%    \end{macrocode}
% First, we set up the definitions used at the beginning of the document to
% define the formats created by the document preamble.
%    \begin{macrocode}
  \AtBeginDocument{%
    \def\crefrangeconjunction@preamble{ \`a\nobreakspace}%
    \def\crefrangepreconjunction@preamble{}%
    \def\crefrangepostconjunction@preamble{}%
    \def\crefpairconjunction@preamble{ et\nobreakspace}%
    \def\crefmiddleconjunction@preamble{, }%
    \def\creflastconjunction@preamble{ et\nobreakspace}%
%    \end{macrocode}
% Erring on the side of caution, I've left off the extra comma before
% ``et'' between groups, pending more knowledgeable input on punctuation
% rules from a native French speaker.
%    \begin{macrocode}
    \def\crefpairgroupconjunction@preamble{ et\nobreakspace}%
    \def\crefmiddlegroupconjunction@preamble{, }%
    \def\creflastgroupconjunction@preamble{, et\nobreakspace}%
    \Crefname@preamble{equation}{{\'E}quation}{{\'E}quations}%
    \Crefname@preamble{part}{Partie}{Parties}%
    \Crefname@preamble{chapter}{Chapitre}{Chapitres}%
    \Crefname@preamble{section}{Section}{Sections}%
    \Crefname@preamble{appendix}{Annexe}{Annexes}%
    \Crefname@preamble{enumi}{Point}{Points}%
    \Crefname@preamble{footnote}{Note}{Notes}%
    \Crefname@preamble{figure}{Figure}{Figures}%
    \Crefname@preamble{table}{Tableau}{Tableaux}%
    \Crefname@preamble{theorem}{Th\'eor\`eme}{Th\'eor\`emes}%
    \Crefname@preamble{lemma}{Lemme}{Lemmes}%
    \Crefname@preamble{corollary}{Corollaire}{Corollaires}%
    \Crefname@preamble{proposition}{Proposition}{Propositions}%
    \Crefname@preamble{definition}{D\'efinition}{D\'efinitions}%
    \Crefname@preamble{result}{R\'esultat}{R\'esultats}%
    \Crefname@preamble{example}{Exemple}{Exemples}%
    \Crefname@preamble{remark}{Remarque}{Remarques}%
    \Crefname@preamble{algorithm}{Algorithme}{Algorithmes}%
    \Crefname@preamble{listing}{Liste}{Listes}%
    \Crefname@preamble{line}{Ligne}{Lignes}%
    \if@cref@capitalise%
      \crefname@preamble{equation}{{\'E}quation}{{\'E}quations}%
      \crefname@preamble{part}{Partie}{Parties}%
      \crefname@preamble{chapter}{Chapitre}{Chapitres}%
      \crefname@preamble{section}{Section}{Sections}%
      \crefname@preamble{appendix}{Annexe}{Annexes}%
      \crefname@preamble{enumi}{Point}{Points}%
      \crefname@preamble{footnote}{Note}{Notes}%
      \crefname@preamble{figure}{Figure}{Figures}%
      \crefname@preamble{table}{Tableau}{Tableaux}%
      \crefname@preamble{theorem}{Th\'eor\`eme}{Th\'eor\`emes}%
      \crefname@preamble{lemma}{Lemme}{Lemmes}%
      \crefname@preamble{corollary}{Corollaire}{Corollaires}%
      \crefname@preamble{proposition}{Proposition}{Propositions}%
      \crefname@preamble{definition}{D\'efinition}{D\'efinitions}%
      \crefname@preamble{result}{R\'esultat}{R\'esultats}%
      \crefname@preamble{example}{Exemple}{Exemples}%
      \crefname@preamble{remark}{Remarque}{Remarques}%
      \crefname@preamble{note}{Commentaire}{Commentaires}%
      \crefname@preamble{algorithm}{Algorithme}{Algorithmes}%
      \crefname@preamble{listing}{Liste}{Listes}%
      \crefname@preamble{line}{Ligne}{Lignes}%
    \else%
      \crefname@preamble{equation}{{\'e}quation}{{\'e}quations}%
      \crefname@preamble{part}{partie}{parties}%
      \crefname@preamble{chapter}{chapitre}{chapitres}%
      \crefname@preamble{section}{section}{sections}%
      \crefname@preamble{appendix}{annexe}{annexes}%
      \crefname@preamble{enumi}{point}{points}%
      \crefname@preamble{footnote}{note}{notes}%
      \crefname@preamble{figure}{figure}{figures}%
      \crefname@preamble{table}{tableau}{tableaux}%
      \crefname@preamble{theorem}{th\'eor\`eme}{th\'eor\`emes}%
      \crefname@preamble{lemma}{lemme}{lemmes}%
      \crefname@preamble{corollary}{corollaire}{corollaires}%
      \crefname@preamble{proposition}{proposition}{propositions}%
      \crefname@preamble{definition}{d\'efinition}{d\'efinitions}%
      \crefname@preamble{result}{r\'esultat}{r\'esultats}%
      \crefname@preamble{example}{exemple}{exemples}%
      \crefname@preamble{remark}{remarque}{remarques}%
      \crefname@preamble{note}{commentaire}{commentaires}%
      \crefname@preamble{algorithm}{algorithme}{algorithmes}%
      \crefname@preamble{listing}{liste}{listes}%
      \crefname@preamble{line}{ligne}{lignes}%
    \fi%
    \def\cref@language{french}%
%    \end{macrocode}
%
% Next, we add the definitions to \cmd{\extras}\dots so that
% \package{babel}'s \cmd{\selectlanguage} command will change the format
% appropriately.
%    \begin{macrocode}
    \cref@addto\extrasfrench{%
      \renewcommand{\crefrangeconjunction}{ \`a\nobreakspace}%
      \renewcommand\crefrangepreconjunction{}%
      \renewcommand\crefrangepostconjunction{}%
      \renewcommand{\crefpairconjunction}{ et\nobreakspace}%
      \renewcommand{\crefmiddleconjunction}{, }%
      \renewcommand{\creflastconjunction}{ et\nobreakspace}%
      \renewcommand{\crefpairgroupconjunction}{ et\nobreakspace}%
      \renewcommand{\crefmiddlegroupconjunction}{, }%
      \renewcommand{\creflastgroupconjunction}{ et\nobreakspace}%
      \Crefname{equation}{{\'E}quation}{{\'E}quations}%
      \Crefname{part}{Partie}{Parties}%
      \Crefname{chapter}{Chapitre}{Chapitres}%
      \Crefname{section}{Section}{Sections}%
      \Crefname{subsection}{Section}{Sections}%
      \Crefname{subsubsection}{Section}{Sections}%
      \Crefname{appendix}{Annexe}{Annexes}%
      \Crefname{subappendix}{Annexe}{Annexes}%
      \Crefname{subsubappendix}{Annexe}{Annexes}%
      \Crefname{subsubsubappendix}{Annexe}{Annexes}%
      \Crefname{enumi}{Point}{Points}%
      \Crefname{enumii}{Point}{Points}%
      \Crefname{enumiii}{Point}{Points}%
      \Crefname{enumiv}{Point}{Points}%
      \Crefname{enumv}{Point}{Points}%
      \Crefname{footnote}{Note}{Notes}%
      \Crefname{figure}{Figure}{Figures}%
      \Crefname{subfigure}{Figure}{Figures}%
      \Crefname{table}{Tableau}{Tableaux}%
      \Crefname{subtable}{Tableau}{Tableaux}%
      \Crefname{theorem}{Th\'eor\`eme}{Th\'eor\`emes}%
      \Crefname{lemma}{Lemme}{Lemmes}%
      \Crefname{corollary}{Corollaire}{Corollaires}%
      \Crefname{proposition}{Proposition}{Propositions}%
      \Crefname{definition}{D\'efinition}{D\'efinitions}%
      \Crefname{result}{R\'esultat}{R\'esultats}%
      \Crefname{example}{Exemple}{Exemples}%
      \Crefname{remark}{Remarque}{Remarques}%
      \Crefname{note}{Commentaire}{Commentaires}%
      \Crefname{algorithm}{Algorithme}{Algorithmes}%
      \Crefname{listing}{Liste}{Listes}%
      \Crefname{line}{Ligne}{Lignes}%
      \if@cref@capitalise%
        \crefname{equation}{{\'E}quation}{{\'E}quations}%
        \crefname{part}{Partie}{Parties}%
        \crefname{chapter}{Chapitre}{Chapitres}%
        \crefname{section}{Section}{Sections}%
        \crefname{subsection}{Section}{Sections}%
        \crefname{subsubsection}{Section}{Sections}%
        \crefname{appendix}{Annexe}{Annexes}%
        \crefname{subappendix}{Annexe}{Annexes}%
        \crefname{subsubappendix}{Annexe}{Annexes}%
        \crefname{subsubsubappendix}{Annexe}{Annexes}%
        \crefname{enumi}{Point}{Points}%
        \crefname{enumii}{Point}{Points}%
        \crefname{enumiii}{Point}{Points}%
        \crefname{enumiv}{Point}{Points}%
        \crefname{enumv}{Point}{Points}%
        \crefname{footnote}{Note}{Notes}%
        \crefname{figure}{Figure}{Figures}%
        \crefname{subfigure}{Figure}{Figures}%
        \crefname{table}{Tableau}{Tableaux}%
        \crefname{subtable}{Tableau}{Tableaux}%
        \crefname{theorem}{Th\'eor\`eme}{Th\'eor\`emes}%
        \crefname{lemma}{Lemme}{Lemmes}%
        \crefname{corollary}{Corollaire}{Corollaires}%
        \crefname{proposition}{Proposition}{Propositions}%
        \crefname{definition}{D\'efinition}{D\'efinitions}%
        \crefname{result}{R\'esultat}{R\'esultats}%
        \crefname{example}{Exemple}{Exemples}%
        \crefname{remark}{Remarque}{Remarques}%
        \crefname{note}{Commentaire}{Commentaires}%
        \crefname{algorithm}{Algorithme}{Algorithmes}%
        \crefname{listing}{Liste}{Listes}%
        \crefname{line}{Ligne}{Lignes}%
      \else%
        \crefname{equation}{{\'e}quation}{{\'e}quations}%
        \crefname{part}{partie}{parties}%
        \crefname{chapter}{chapitre}{chapitres}%
        \crefname{section}{section}{sections}%
        \crefname{subsection}{section}{sections}%
        \crefname{subsubsection}{section}{sections}%
        \crefname{appendix}{annexe}{annexes}%
        \crefname{subappendix}{annexe}{annexes}%
        \crefname{subsubappendix}{annexe}{annexes}%
        \crefname{subsubsubappendix}{annexe}{annexes}%
        \crefname{enumi}{point}{points}%
        \crefname{enumii}{point}{points}%
        \crefname{enumiii}{point}{points}%
        \crefname{enumiv}{point}{points}%
        \crefname{enumv}{point}{points}%
        \crefname{footnote}{note}{notes}%
        \crefname{figure}{figure}{figures}%
        \crefname{subfigure}{figure}{figures}%
        \crefname{table}{tableau}{tableaux}%
        \crefname{subtable}{tableau}{tableaux}%
        \crefname{theorem}{th\'eor\`eme}{th\'eor\`emes}%
        \crefname{lemma}{lemme}{lemmes}%
        \crefname{corollary}{corollaire}{corollaires}%
        \crefname{proposition}{proposition}{propositions}%
        \crefname{definition}{d\'efinition}{d\'efinitions}%
        \crefname{result}{r\'esultat}{r\'esultats}%
        \crefname{example}{exemple}{exemples}%
        \crefname{remark}{remarque}{remarques}%
        \crefname{note}{commentaire}{commentaires}%
        \crefname{algorithm}{algorithme}{algorithmes}%
        \crefname{listing}{liste}{listes}%
        \crefname{line}{ligne}{lignes}%
      \fi%
    }}}
%    \end{macrocode}
%
%
% \begin{macro}{spanish}
%   Spanish translations generously contributed by Gonzalo Medina.
% \end{macro}
%    \begin{macrocode}
\DeclareOption{spanish}{%
  \PackageInfo{cleveref}{loaded `spanish' language definitions}
%    \end{macrocode}
% First, we set up the definitions used at the beginning of the document to
% define the formats created by the document preamble.
%    \begin{macrocode}
  \AtBeginDocument{%
    \def\crefrangeconjunction@preamble{ a\nobreakspace}%
    \def\crefrangepreconjunction@preamble{}%
    \def\crefrangepostconjunction@preamble{}%
    \def\crefpairconjunction@preamble{ y\nobreakspace}%
    \def\crefmiddleconjunction@preamble{, }%
    \def\creflastconjunction@preamble{ y\nobreakspace}%
    \def\crefpairgroupconjunction@preamble{ y\nobreakspace}%
    \def\crefmiddlegroupconjunction@preamble{, }%
    \def\creflastgroupconjunction@preamble{ y\nobreakspace}%
    \Crefname@preamble{equation}{Ecuaci\'on}{Ecuaciones}%
    \Crefname@preamble{part}{Parte}{Partes}%
    \Crefname@preamble{chapter}{Cap\'itulo}{Cap\'itulos}%
    \Crefname@preamble{section}{Secci\'on}{Secciones}%
    \Crefname@preamble{appendix}{Ap\'endice}{Ap\'endices}%
    \Crefname@preamble{enumi}{Punto}{Puntos}%
    \Crefname@preamble{footnote}{Nota}{Notas}%
    \Crefname@preamble{figure}{Figura}{Figuras}%
    \Crefname@preamble{table}{Cuadro}{Cuadros}%
    \Crefname@preamble{theorem}{Teorema}{Teoremas}%
    \Crefname@preamble{lemma}{Lema}{Lemas}%
    \Crefname@preamble{corollary}{Corolario}{Corolarios}%
    \Crefname@preamble{proposition}{Proposici\'on}{Proposiciones}%
    \Crefname@preamble{definition}{Definici\'on}{Definiciones}%
    \Crefname@preamble{result}{Resultado}{Resultados}%
    \Crefname@preamble{example}{Ejemplo}{Ejemplos}%
    \Crefname@preamble{remark}{Observaci\'on}{Observaciones}%
    \Crefname@preamble{note}{Nota}{Notas}%
    \Crefname@preamble{algorithm}{Algoritmo}{Algoritmos}%
    \Crefname@preamble{listing}{Listado}{Listados}%
    \Crefname@preamble{line}{L\'inea}{L\'ineas}%
    \if@cref@capitalise%
      \crefname@preamble{equation}{Ecuaci\'on}{Ecuaciones}%
      \crefname@preamble{part}{Parte}{Partes}%
      \crefname@preamble{chapter}{Cap\'itulo}{Cap\'itulos}%
      \crefname@preamble{section}{Secci\'on}{Secciones}%
      \crefname@preamble{appendix}{Ap\'endice}{Ap\'endices}%
      \crefname@preamble{enumi}{Punto}{Puntos}%
      \crefname@preamble{footnote}{Nota}{Notas}%
      \crefname@preamble{figure}{Figura}{Figuras}%
      \crefname@preamble{table}{Cuadro}{Cuadros}%
      \crefname@preamble{theorem}{Teorema}{Teoremas}%
      \crefname@preamble{lemma}{Lema}{Lemas}%
      \crefname@preamble{corollary}{Corolario}{Corolarios}%
      \crefname@preamble{proposition}{Proposici\'on}{Proposiciones}%
      \crefname@preamble{definition}{Definici\'on}{Definiciones}%
      \crefname@preamble{result}{Resultado}{Resultados}%
      \crefname@preamble{example}{Ejemplo}{Ejemplos}%
      \crefname@preamble{remark}{Observaci\'on}{Observaciones}%
      \crefname@preamble{note}{Nota}{Notas}%
      \crefname@preamble{algorithm}{Algoritmo}{Algoritmos}%
      \crefname@preamble{listing}{Listado}{Listados}%
      \crefname@preamble{line}{L\'inea}{L\'ineas}%
    \else%
      \crefname@preamble{equation}{ecuaci\'on}{ecuaciones}%
      \crefname@preamble{part}{parte}{partes}%
      \crefname@preamble{chapter}{cap\'itulo}{cap\'itulos}%
      \crefname@preamble{section}{secci\'on}{secciones}%
      \crefname@preamble{appendix}{ap\'endice}{ap\'endices}%
      \crefname@preamble{enumi}{punto}{puntos}%
      \crefname@preamble{footnote}{nota}{notas}%
      \crefname@preamble{figure}{figura}{figuras}%
      \crefname@preamble{table}{cuadro}{cuadros}%
      \crefname@preamble{theorem}{teorema}{teoremas}%
      \crefname@preamble{lemma}{lema}{lemas}%
      \crefname@preamble{corollary}{corolario}{corolarios}%
      \crefname@preamble{proposition}{proposici\'on}{proposiciones}%
      \crefname@preamble{definition}{definici\'on}{definiciones}%
      \crefname@preamble{result}{resultado}{resultados}%
      \crefname@preamble{example}{ejemplo}{ejemplos}%
      \crefname@preamble{remark}{observaci\'on}{observaciones}%
      \crefname@preamble{note}{nota}{notas}%
      \crefname@preamble{algorithm}{algoritmo}{algoritmos}%
      \crefname@preamble{listing}{listado}{listados}%
      \crefname@preamble{line}{l\'inea}{l\'ineas}%
    \fi%
    \def\cref@language{spanish}%
%    \end{macrocode}
%
% Next, we add the definitions to \cmd{\extras}\dots so that
% \package{babel}'s \cmd{\selectlanguage} command will change the format
% appropriately.
%    \begin{macrocode}
    \cref@addto\extrasspanish{%
      \renewcommand{\crefrangeconjunction}{ a\nobreakspace}%
      \renewcommand{\crefrangepreconjunction}{}%
      \renewcommand{\crefrangepostconjunction}{}%
      \renewcommand{\crefpairconjunction}{ y\nobreakspace}%
      \renewcommand{\crefmiddleconjunction}{, }%
      \renewcommand{\creflastconjunction}{ y\nobreakspace}%
      \renewcommand{\crefpairgroupconjunction}{ y\nobreakspace}%
      \renewcommand{\crefmiddlegroupconjunction}{, }%
      \renewcommand{\creflastgroupconjunction}{ y\nobreakspace}%
      \Crefname{equation}{Ecuaci\'on}{Ecuaciones}%
      \Crefname{part}{Parte}{Partes}%
      \Crefname{chapter}{Cap\'itulo}{Cap\'itulos}%
      \Crefname{section}{Secci\'on}{Secciones}%
      \Crefname{subsection}{Secci\'on}{Secciones}%
      \Crefname{subsubsection}{Secci\'on}{Secciones}%
      \Crefname{appendix}{Ap\'endice}{Ap\'endices}%
      \Crefname{subappendix}{Ap\'endice}{Ap\'endices}%
      \Crefname{subsubappendix}{Ap\'endice}{Ap\'endices}%
      \Crefname{subsubsubappendix}{Ap\'endice}{Ap\'endices}%
      \Crefname{enumi}{Punto}{Puntos}%
      \Crefname{enumii}{Punto}{Puntos}%
      \Crefname{enumiii}{Punto}{Puntos}%
      \Crefname{enumiv}{Punto}{Puntos}%
      \Crefname{enumv}{Punto}{Puntos}%
      \Crefname{footnote}{Nota}{Notas}%
      \Crefname{figure}{Figura}{Figuras}%
      \Crefname{subfigure}{Figura}{Figuras}%
      \Crefname{table}{Cuadro}{Cuadros}%
      \Crefname{subtable}{Cuadro}{Cuadros}%
      \Crefname{theorem}{Teorema}{Teoremas}%
      \Crefname{lemma}{Lema}{Lemas}%
      \Crefname{corollary}{Corolario}{Corolarios}%
      \Crefname{proposition}{Proposici\'on}{Proposiciones}%
      \Crefname{definition}{Definici\'on}{Definiciones}%
      \Crefname{result}{Resultado}{Resultados}%
      \Crefname{example}{Ejemplo}{Ejemplos}%
      \Crefname{remark}{Observaci\'on}{Observaci\'on}%
      \Crefname{note}{Nota}{Notas}%
      \Crefname{algorithm}{Algoritmo}{Algoritmos}%
      \Crefname{listing}{Listado}{Listados}%
      \Crefname{line}{L\'inea}{L\'ineas}%
      \if@cref@capitalise%
        \crefname{equation}{Ecuaci\'on}{Ecuaciones}%
        \crefname{part}{Parte}{Partes}%
        \crefname{chapter}{Cap\'itulo}{Cap\'itulos}%
        \crefname{section}{Secci\'on}{Secciones}%
        \crefname{subsection}{Secci\'on}{Secciones}%
        \crefname{subsubsection}{Secci\'on}{Secciones}%
        \crefname{appendix}{Ap\'endice}{Ap\'endices}%
        \crefname{subappendix}{Ap\'endice}{Ap\'endices}%
        \crefname{subsubappendix}{Ap\'endice}{Ap\'endices}%
        \crefname{subsubsubappendix}{Ap\'endice}{Ap\'endices}%
        \crefname{enumi}{Punto}{Puntos}%
        \crefname{enumii}{Punto}{Puntos}%
        \crefname{enumiii}{Punto}{Puntos}%
        \crefname{enumiv}{Punto}{Puntos}%
        \crefname{enumv}{Punto}{Puntos}%
        \crefname{footnote}{Nota}{Notas}%
        \crefname{figure}{Figura}{Figuras}%
        \crefname{subfigure}{Figura}{Figuras}%
        \crefname{table}{Cuadro}{Cuadros}%
        \crefname{subtable}{Cuadro}{Cuadros}%
        \crefname{theorem}{Teorema}{Teoremas}%
        \crefname{lemma}{Lema}{Lemas}%
        \crefname{corollary}{Corolario}{Corolarios}%
        \crefname{proposition}{Proposici\'on}{Proposiciones}%
        \crefname{definition}{Definici\'on}{Definiciones}%
        \crefname{result}{Resultado}{Resultados}%
        \crefname{example}{Ejemplo}{Ejemplos}%
        \crefname{remark}{Observaci\'on}{Observaci\'ones}%
        \crefname{note}{Nota}{Notas}%
        \crefname{algorithm}{Algoritmo}{Algoritmos}%
        \crefname{listing}{Listado}{Listados}%
        \crefname{line}{L\'inea}{L\'ineas}%
      \else%
        \crefname{equation}{ecuaci\'on}{ecuaciones}%
        \crefname{part}{parte}{partes}%
        \crefname{chapter}{cap\'itulo}{cap\'itulos}%
        \crefname{section}{secci\'on}{secciones}%
        \crefname{subsection}{secci\'on}{secciones}%
        \crefname{subsubsection}{secci\'on}{secciones}%
        \crefname{appendix}{ap\'endice}{ap\'endices}%
        \crefname{subappendix}{ap\'endice}{ap\'endices}%
        \crefname{subsubappendix}{ap\'endice}{ap\'endices}%
        \crefname{subsubsubappendix}{ap\'endice}{ap\'endices}%
        \crefname{enumi}{punto}{puntos}%
        \crefname{enumii}{punto}{puntos}%
        \crefname{enumiii}{punto}{puntos}%
        \crefname{enumiv}{punto}{puntos}%
        \crefname{enumv}{punto}{puntos}%
        \crefname{footnote}{nota}{notas}%
        \crefname{figure}{figura}{figuras}%
        \crefname{subfigure}{figura}{figuras}%
        \crefname{table}{cuadro}{cuadros}%
        \crefname{subtable}{cuadro}{cuadros}%
        \crefname{theorem}{teorema}{teoremas}%
        \crefname{lemma}{lema}{lemas}%
        \crefname{corollary}{corolario}{corolarios}%
        \crefname{proposition}{proposici\'on}{proposiciones}%
        \crefname{definition}{definici\'on}{definiciones}%
        \crefname{result}{resultado}{resultados}%
        \crefname{example}{ejemplo}{ejemplos}%
        \crefname{remark}{observaci\'on}{observaci\'ones}%
        \crefname{note}{nota}{notas}%
        \crefname{algorithm}{algoritmo}{algoritmos}%
        \crefname{listing}{listado}{listados}%
        \crefname{line}{l\'inea}{l\'ineas}%
      \fi%
    }}}
%    \end{macrocode}
%
%
% \begin{macro}{italian}
%   Italian translations kindly contributed by Massimo Redaelli.
% \end{macro}
%    \begin{macrocode}
\DeclareOption{italian}{%
  \PackageInfo{cleveref}{loaded `italian' language definitions}
%    \end{macrocode}
% First, we set up the definitions used at the beginning of the document to
% define the formats created by the document preamble. (Note that Italian
% makes use of |\crefrangepreconjunction|.)
%    \begin{macrocode}
  \AtBeginDocument{%
    \def\crefrangeconjunction@preamble{ a\nobreakspace}%
    \def\crefrangepreconjunction@preamble{da\nobreakspace}%
    \def\crefrangepostconjunction@preamble{}%
    \def\crefpairconjunction@preamble{ e\nobreakspace}%
    \def\crefmiddleconjunction@preamble{, }%
    \def\creflastconjunction@preamble{ e\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@preamble{ e\nobreakspace}%
    \def\crefmiddlegroupconjunction@preamble{, }%
    \def\creflastgroupconjunction@preamble{ e\nobreakspace}%
    \Crefname@preamble{equation}{Equazione}{Equazioni}%
    \Crefname@preamble{part}{Parte}{Parti}%
    \Crefname@preamble{chapter}{Capitolo}{Capitoli}%
    \Crefname@preamble{section}{Sezione}{Sezioni}%
    \Crefname@preamble{appendix}{Appendice}{Appendici}%
    \Crefname@preamble{enumi}{Voce}{Voci}%
    \Crefname@preamble{footnote}{Nota}{Note}%
    \Crefname@preamble{figure}{Figura}{Figure}%
    \Crefname@preamble{table}{Tabella}{Tabelle}%
    \Crefname@preamble{theorem}{Teorema}{Teoremi}%
    \Crefname@preamble{lemma}{Lemma}{Lemmi}%
    \Crefname@preamble{corollary}{Corollario}{Corollari}%
    \Crefname@preamble{proposition}{Proposizione}{Proposizioni}%
    \Crefname@preamble{definition}{Definizioni}{Definizioni}%
    \Crefname@preamble{result}{Risultato}{Risultati}%
    \Crefname@preamble{example}{esempio}{esempi}%
    \Crefname@preamble{remark}{Osservazione}{Osservazioni}%
    \Crefname@preamble{note}{Nota}{Note}%
    \Crefname@preamble{algorithm}{Algoritmo}{Algoritmi}%
    \Crefname@preamble{listing}{Elenco}{Elenchi}%
    \Crefname@preamble{line}{Linea}{Linee}%
    \if@cref@capitalise%
      \crefname@preamble{equation}{Eq.}{Eq.}%
      \crefname@preamble{part}{Parte}{Parti}%
      \crefname@preamble{chapter}{Capitolo}{Capitoli}%
      \crefname@preamble{section}{Sezione}{Sezioni}%
      \crefname@preamble{appendix}{Appendice}{Appendici}%
      \crefname@preamble{enumi}{Voce}{Voci}%
      \crefname@preamble{footnote}{Nota}{Note}%
      \crefname@preamble{figure}{Fig.}{Fig.}%
      \crefname@preamble{table}{Tabella}{Tabelle}%
      \crefname@preamble{theorem}{Teorema}{Teoremi}%
      \crefname@preamble{lemma}{Lemma}{Lemmi}%
      \crefname@preamble{corollary}{Corollario}{Corollari}%
      \crefname@preamble{proposition}{Proposizione}{Proposizioni}%
      \crefname@preamble{definition}{Definizione}{Definizioni}%
      \crefname@preamble{result}{Risultato}{Risultati}%
      \crefname@preamble{example}{Esempio}{Esempi}%
      \crefname@preamble{remark}{Osservazione}{Osservazioni}%
      \crefname@preamble{note}{Nota}{Note}%
      \crefname@preamble{algorithm}{Algoritmo}{Algoritmi}%
      \crefname@preamble{listing}{Elenco}{Elenchi}%
      \crefname@preamble{line}{Linea}{Linee}%
    \else%
      \crefname@preamble{equation}{eq.}{eq.}%
      \crefname@preamble{part}{parte}{parti}%
      \crefname@preamble{chapter}{capitolo}{capitoli}%
      \crefname@preamble{section}{sezione}{sezioni}%
      \crefname@preamble{appendix}{appendice}{appendici}%
      \crefname@preamble{enumi}{voce}{voci}%
      \crefname@preamble{footnote}{nota}{note}%
      \crefname@preamble{figure}{fig.}{fig.}%
      \crefname@preamble{table}{tabella}{tabelle}%
      \crefname@preamble{theorem}{teorema}{teoremi}%
      \crefname@preamble{lemma}{lemma}{lemmi}%
      \crefname@preamble{corollary}{corollario}{corollari}%
      \crefname@preamble{proposition}{proposizione}{proposizioni}%
      \crefname@preamble{definition}{definizione}{definizioni}%
      \crefname@preamble{result}{risultato}{risultati}%
      \crefname@preamble{example}{esempio}{esempi}%
      \crefname@preamble{remark}{osservazione}{osservazioni}%
      \crefname@preamble{note}{nota}{note}%
      \crefname@preamble{algorithm}{algoritmo}{algoritmi}%
      \crefname@preamble{listing}{elenco}{elenchi}%
      \crefname@preamble{line}{linea}{linee}%
    \fi%
    \def\cref@language{italian}%
%    \end{macrocode}
%
% Next, we add the definitions to \cmd{\extras}\dots so that
% \package{babel}'s \cmd{\selectlanguage} command will change the format
% appropriately.
%    \begin{macrocode}
    \cref@addto\extrasitalian{%
      \renewcommand{\crefrangeconjunction}{ a\nobreakspace}%
      \renewcommand\crefrangepreconjunction{da\nobreakspace}%
      \renewcommand\crefrangepostconjunction{}%
      \renewcommand{\crefpairconjunction}{ e\nobreakspace}%
      \renewcommand{\crefmiddleconjunction}{, }%
      \renewcommand{\creflastconjunction}{ e\nobreakspace}%
      \renewcommand{\crefpairgroupconjunction}{ e\nobreakspace}%
      \renewcommand{\crefmiddlegroupconjunction}{, }%
      \renewcommand{\creflastgroupconjunction}{ e\nobreakspace}%
      \Crefname{equation}{Equazione}{Equazioni}%
      \Crefname{part}{Parte}{Parti}%
      \Crefname{chapter}{Capitolo}{Capitoli}%
      \Crefname{section}{Sezione}{Sezioni}%
      \Crefname{subsection}{Sezione}{Sezioni}%
      \Crefname{subsubsection}{Sezione}{Sezioni}%
      \Crefname{appendix}{Appendice}{Appendici}%
      \Crefname{subappendix}{Appendice}{Appendici}%
      \Crefname{subsubappendix}{Appendice}{Appendici}%
      \Crefname{subsubsubappendix}{Appendice}{Appendici}%
      \Crefname{enumi}{Voce}{Voci}%
      \Crefname{enumii}{Voce}{Voci}%
      \Crefname{enumiii}{Voce}{Voci}%
      \Crefname{enumiv}{Voce}{Voci}%
      \Crefname{enumv}{Voce}{Voci}%
      \Crefname{footnote}{Nota}{Note}%
      \Crefname{figure}{Figura}{Figure}%
      \Crefname{subfigure}{Figura}{Figure}%
      \Crefname{table}{Tabella}{Tabelle}%
      \Crefname{subtable}{Tabella}{Tabelle}%
      \Crefname{theorem}{Teorema}{Teoremi}%
      \Crefname{lemma}{Lemma}{Lemmi}%
      \Crefname{corollary}{Corollario}{Corollari}%
      \Crefname{proposition}{Proposizione}{Proposizioni}%
      \Crefname{definition}{Definizione}{Definizione}%
      \Crefname{result}{Risultato}{Risultati}%
      \Crefname{example}{esempio}{esempi}%
      \Crefname{remark}{Osservazione}{Osservazioni}%
      \Crefname{note}{Nota}{Note}%
      \Crefname{algorithm}{Algoritmo}{Algoritmi}%
      \Crefname{listing}{Elenco}{Elenchi}%
      \Crefname{line}{Linea}{Linee}%
      \if@cref@capitalise%
        \crefname{equation}{Eq.}{Eq.}%
        \crefname{part}{Parte}{Parti}%
        \crefname{chapter}{Capitolo}{Capitoli}%
        \crefname{section}{Sezione}{Sezioni}%
        \crefname{subsection}{Sezione}{Sezioni}%
        \crefname{subsubsection}{Sezione}{Sezioni}%
        \crefname{appendix}{Appendice}{Appendici}%
        \crefname{subappendix}{Appendice}{Appendici}%
        \crefname{subsubappendix}{Appendice}{Appendici}%
        \crefname{subsubsubappendix}{Appendice}{Appendici}%
        \crefname{enumi}{Voce}{Voci}%
        \crefname{enumii}{Voce}{Voci}%
        \crefname{enumiii}{Voce}{Voci}%
        \crefname{enumiv}{Voce}{Voci}%
        \crefname{enumv}{Voce}{Voci}%
        \crefname{footnote}{Nota}{Note}%
        \crefname{figure}{Fig.}{Fig.}%
        \crefname{subfigure}{Fig.}{Fig.}%
        \crefname{table}{Tabella}{Tabelle}%
        \crefname{subtable}{Tabella}{Tabelle}%
        \crefname{theorem}{Teorema}{Teoremi}%
        \crefname{lemma}{Lemma}{Lemmi}%
        \crefname{corollary}{Corollario}{Corollari}%
        \crefname{proposition}{Proposizione}{Proposizioni}%
        \crefname{definition}{Definizione}{Definizione}%
        \crefname{result}{Risultato}{Risultati}%
        \crefname{example}{Esempio}{Esempi}%
        \crefname{remark}{Osservazione}{Osservazioni}%
        \crefname{note}{Nota}{Note}%
        \crefname{algorithm}{Algoritmo}{Algoritmi}%
        \crefname{listing}{Elenco}{Elenchi}%
        \crefname{line}{Linea}{Linee}%
      \else%
        \crefname{equation}{eq.}{eq.}%
        \crefname{part}{parte}{parti}%
        \crefname{chapter}{capitolo}{capitoli}%
        \crefname{section}{sezione}{sezioni}%
        \crefname{subsection}{sezione}{sezioni}%
        \crefname{subsubsection}{sezione}{sezioni}%
        \crefname{appendix}{appendice}{appendici}%
        \crefname{subappendix}{appendice}{appendici}%
        \crefname{subsubappendix}{appendice}{appendici}%
        \crefname{subsubsubappendix}{appendice}{appendici}%
        \crefname{enumi}{voce}{voci}%
        \crefname{enumii}{voce}{voci}%
        \crefname{enumiii}{voce}{voci}%
        \crefname{enumiv}{voce}{voci}%
        \crefname{enumv}{voce}{voci}%
        \crefname{footnote}{nota}{note}%
        \crefname{figure}{fig.}{fig.}%
        \crefname{subfigure}{fig.}{fig.}%
        \crefname{table}{tabella}{tabelle}%
        \crefname{subtable}{tabella}{tabelle}%
        \crefname{theorem}{teorema}{teoremi}%
        \crefname{lemma}{lemma}{lemmi}%
        \crefname{corollary}{corollario}{corollari}%
        \crefname{proposition}{proposizione}{proposizioni}%
        \crefname{definition}{definizione}{definizione}%
        \crefname{result}{risultato}{risultati}%
        \crefname{example}{esempio}{esempi}%
        \crefname{remark}{osservazione}{osservazioni}%
        \crefname{note}{nota}{note}%
        \crefname{algorithm}{algoritmo}{algoritmi}%
        \crefname{listing}{elenco}{elenchi}%
        \crefname{line}{linea}{linee}%
      \fi%
    }}}
%    \end{macrocode}
%
%
% \begin{macro}{russian}
%   Russian translations generously contributed by Aleksander Gorohovski.
% \end{macro}
%    \begin{macrocode}
\DeclareOption{russian}{%
  \PackageInfo{cleveref}{loaded `russian' language definitions}
%    \end{macrocode}
% First, we set up the definitions used at the beginning of the document
% to define the formats created by the document preamble.
%    \begin{macrocode}
  \AtBeginDocument{%
    \def\crefrangeconjunction@preamble{--}%
    \def\crefrangepreconjunction@preamble{}%
    \def\crefrangepostconjunction@preamble{}%
    \def\crefpairconjunction@preamble{ \cyri\nobreakspace}%
    \def\crefmiddleconjunction@preamble{, }%
    \def\creflastconjunction@preamble{ \cyri\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@preamble{ \cyri\nobreakspace}%
    \def\crefmiddlegroupconjunction@preamble{, }%
    \def\creflastgroupconjunction@preamble%
      {, \cyra\ \cyrt\cyra\cyrk\cyrzh\cyre\nobreakspace}%
    \Crefname@preamble{equation}%
      {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}%
      {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyrery}%
    \Crefname@preamble{part}%
      {\CYRCH\cyra\cyrs\cyrt\cyrsftsn}%
      {\CYRCH\cyra\cyrs\cyrt\cyri}%
    \Crefname@preamble{chapter}%
      {\CYRG\cyrl\cyra\cyrv\cyra}%
      {\CYRG\cyrl\cyra\cyrv\cyrery}%
    \Crefname@preamble{section}%
      {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}%
      {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}%
    \Crefname@preamble{appendix}%
      {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}%
      {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}%
    \Crefname@preamble{enumi}%
      {\CYRP\cyru\cyrn\cyrk\cyrt}%
      {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}%
    \Crefname@preamble{footnote}%
      {\CYRS\cyrn\cyro\cyrs\cyrk\cyra}%
      {\CYRS\cyrn\cyro\cyrs\cyrk\cyri}%
    \Crefname@preamble{figure}%
      {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}%
      {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}%
    \Crefname@preamble{table}%
      {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyra}%
      {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrery}%
    \Crefname@preamble{theorem}%
      {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}%
      {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyrery}%
    \Crefname@preamble{lemma}%
      {\CYRL\cyre\cyrm\cyrm\cyra}%
      {\CYRL\cyre\cyrm\cyrm\cyrery}%
    \Crefname@preamble{corollary}%
      {\CYRV\cyrery\cyrv\cyro\cyrd}%
      {\CYRV\cyrery\cyrv\cyro\cyrd\cyrery}%
    \Crefname@preamble{proposition}%
      {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyre}%
      {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyrya}%
    \Crefname@preamble{definition}%
      {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyre}%
      {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyrya}%
    \Crefname@preamble{result}%
      {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}%
      {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyrery}%
    \Crefname@preamble{example}%
      {\CYRP\cyrr\cyri\cyrm\cyre\cyrr}%
      {\CYRP\cyrr\cyri\cyrm\cyre\cyrr\cyrery}%
    \Crefname@preamble{remark}%
      {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyre}%
      {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyrya}%
    \Crefname@preamble{note}%
      {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyra}%
      {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyri}%
    \Crefname@preamble{algorithm}%
      {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}%
      {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyrery}%
    \Crefname@preamble{listing}%
      {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg}%
      {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg\cyri}%
    \Crefname@preamble{line}%
      {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}%
      {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}%
    \if@cref@capitalise%
      \crefname@preamble{equation}%
        {\CYRF-\cyrl.}%
        {\CYRF-\cyrl.}%
      \crefname@preamble{part}%
        {\CYRCH\cyra\cyrs\cyrt\cyrsftsn}%
        {\CYRCH\cyra\cyrs\cyrt\cyri}%
      \crefname@preamble{chapter}%
        {\CYRG\cyrl\cyra\cyrv\cyra}%
        {\CYRG\cyrl\cyra\cyrv\cyrery}%
      \crefname@preamble{section}%
        {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}%
        {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}%
      \crefname@preamble{appendix}%
        {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}%
        {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}%
      \crefname@preamble{enumi}{\CYRP.}{\CYRP.\cyrp.}%
      \crefname@preamble{footnote}%
        {\CYRS\cyrn\cyro\cyrs\cyrk\cyra}%
        {\CYRS\cyrn\cyro\cyrs\cyrk\cyri}%
      \crefname@preamble{figure}%
        {\CYRR\cyri\cyrs.}%
        {\CYRR\cyri\cyrs.}%
      \crefname@preamble{table}%
        {\CYRT\cyra\cyrb\cyrl.}%
        {\CYRT\cyra\cyrb\cyrl.}%
      \crefname@preamble{theorem}%
        {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}%
        {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyrery}%
      \crefname@preamble{lemma}%
        {\CYRL\cyre\cyrm\cyrm\cyra}%
        {\CYRL\cyre\cyrm\cyrm\cyrery}%
      \crefname@preamble{corollary}%
        {\CYRV\cyrery\cyrv\cyro\cyrd}%
        {\CYRV\cyrery\cyrv\cyro\cyrd\cyrery}%
      \crefname@preamble{proposition}%
        {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyre}%
        {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyrya}%
      \crefname@preamble{definition}%
        {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyre}%
        {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyrya}%
      \crefname@preamble{result}%
        {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}%
        {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyrery}%
      \crefname@preamble{example}%
        {\CYRP\cyrr\cyri\cyrm\cyre\cyrr}%
        {\CYRP\cyrr\cyri\cyrm\cyre\cyrr\cyrery}%
      \crefname@preamble{remark}%
        {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyre}%
        {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyrya}%
      \crefname@preamble{note}%
        {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyra}%
        {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyri}%
      \crefname@preamble{algorithm}%
        {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}%
        {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyrery}%
      \crefname@preamble{listing}%
        {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg}%
        {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg\cyri}%
      \crefname@preamble{line}%
        {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}%
        {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}%
    \else%
      \crefname@preamble{equation}{\cyrf-\cyrl.}{\cyrf-\cyrl.}%
      \crefname@preamble{part}%
        {\cyrch\cyra\cyrs\cyrt\cyrsftsn}%
        {\cyrch\cyra\cyrs\cyrt\cyri}%
      \crefname@preamble{chapter}%
        {\cyrg\cyrl\cyra\cyrv.}%
        {\cyrg\cyrl\cyra\cyrv.}%
      \crefname@preamble{section}%
        {\cyrr\cyra\cyrz\cyrd.}%
        {\cyrr\cyra\cyrz\cyrd\cyre\cyrl.}%
      \crefname@preamble{appendix}%
        {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}%
        {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}%
      \crefname@preamble{enumi}{\cyrp.}{\cyrp.\cyrp.}%
      \crefname@preamble{footnote}%
        {\cyrs\cyrn\cyro\cyrs\cyrk.}%
        {\cyrs\cyrn\cyro\cyrs\cyrk.}%
      \crefname@preamble{figure}%
        {\cyrr\cyri\cyrs.}%
        {\cyrr\cyri\cyrs.}%
      \crefname@preamble{table}%
        {\cyrt\cyra\cyrb\cyrl.}%
        {\cyrt\cyra\cyrb\cyrl.}%
      \crefname@preamble{theorem}%
        {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}%
        {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}%
      \crefname@preamble{lemma}%
        {\cyrl\cyre\cyrm\cyrm.}%
        {\cyrl\cyre\cyrm\cyrm.}%
      \crefname@preamble{corollary}%
        {\cyrv\cyrery\cyrv\cyro\cyrd}%
        {\cyrv\cyrery\cyrv\cyro\cyrd.}%
      \crefname@preamble{proposition}%
        {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd.}%
        {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd.}%
      \crefname@preamble{definition}%
        {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn.}%
        {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn.}%
      \crefname@preamble{result}%
        {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt.}%
        {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt.}%
      \crefname@preamble{example}%
        {\cyrp\cyrr\cyri\cyrm.}%
        {\cyrp\cyrr\cyri\cyrm\cyre\cyrr.}%
      \crefname@preamble{remark}%
        {\cyrp\cyrr\cyri\cyrm\cyre\cyrch.}%
        {\cyrp\cyrr\cyri\cyrm\cyre\cyrch.}%
      \crefname@preamble{note}%
        {\cyrz\cyra\cyrm\cyre\cyrt\cyrk.}%
        {\cyrz\cyra\cyrm\cyre\cyrt\cyrk.}%
      \crefname@preamble{algorithm}%
        {\cyra\cyrl\cyrg.}%
        {\cyra\cyrl\cyrg.}%
      \crefname@preamble{listing}%
        {\cyrl\cyri\cyrs\cyrt\cyri\cyrn.}%
        {\cyrl\cyri\cyrs\cyrt\cyri\cyrn\cyrg.}%
      \crefname@preamble{line}%
        {\cyrs\cyrt\cyrr\cyrk.}%
        {\cyrs\cyrt\cyrr\cyrk.}%
    \fi%
    \def\cref@language{russian}%
%    \end{macrocode}
%
% Next, we add the definitions to \cmd{\extras}\dots so that
% \package{babel}'s \cmd{\selectlanguage} command will change the format
% appropriately.
%    \begin{macrocode}
    \cref@addto\extrasrussian{%
      \renewcommand{\crefrangeconjunction}{--}%
      \renewcommand\crefrangepreconjunction{}%
      \renewcommand\crefrangepostconjunction{}%
      \renewcommand{\crefpairconjunction}{ \cyri\nobreakspace}%
      \renewcommand{\crefmiddleconjunction}{, }%
      \renewcommand{\creflastconjunction}{ \cyri\nobreakspace}%
      \renewcommand{\crefpairgroupconjunction}{ \cyri\nobreakspace}%
      \renewcommand{\crefmiddlegroupconjunction}{, }%
      \renewcommand{\creflastgroupconjunction}%
        {, \cyra\ \cyrt\cyra\cyrk\cyrzh\cyre\nobreakspace}%
      \Crefname{equation}%
        {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}%
        {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyrery}%
      \Crefname{part}%
        {\CYRCH\cyra\cyrs\cyrt\cyrsftsn}%
        {\CYRCH\cyra\cyrs\cyrt\cyri}%
      \Crefname{chapter}%
        {\CYRG\cyrl\cyra\cyrv\cyra}%
        {\CYRG\cyrl\cyra\cyrv\cyrery}%
      \Crefname{section}%
        {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}%
        {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}%
      \Crefname{subsection}%
        {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}%
        {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}%
      \Crefname{subsubsection}%
        {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}%
        {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}%
      \Crefname{appendix}%
        {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}%
        {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}%
      \Crefname{subappendix}%
        {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}%
        {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}
      \Crefname{subsubappendix}%
        {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}%
        {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}
      \Crefname{subsubsubappendix}%
        {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}%
        {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}
      \Crefname{enumi}%
        {\CYRP\cyru\cyrn\cyrk\cyrt}%
        {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}%
      \Crefname{enumii}%
        {\CYRP\cyru\cyrn\cyrk\cyrt}%
        {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}%
      \Crefname{enumiii}%
        {\CYRP\cyru\cyrn\cyrk\cyrt}%
        {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}%
      \Crefname{enumiv}%
        {\CYRP\cyru\cyrn\cyrk\cyrt}%
        {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}%
      \Crefname{enumv}%
        {\CYRP\cyru\cyrn\cyrk\cyrt}%
        {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}%
      \Crefname{footnote}%
        {\CYRS\cyrn\cyro\cyrs\cyrk\cyra}%
        {\CYRS\cyrn\cyro\cyrs\cyrk\cyri}%
      \Crefname{figure}%
        {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}%
        {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}%
      \Crefname{subfigure}%
        {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}%
        {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}%
      \Crefname{table}%
        {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyra}%
        {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrery}%
      \Crefname{subtable}%
        {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyra}%
        {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrery}%
      \Crefname{theorem}%
        {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}%
        {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyrery}%
      \Crefname{lemma}%
        {\CYRL\cyre\cyrm\cyrm\cyra}%
        {\CYRL\cyre\cyrm\cyrm\cyrery}%
      \Crefname{corollary}%
        {\CYRV\cyrery\cyrv\cyro\cyrd}%
        {\CYRV\cyrery\cyrv\cyro\cyrd\cyrery}%
      \Crefname{proposition}%
        {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyre}%
        {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyrya}%
      \Crefname{definition}%
        {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyre}%
        {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyrya}%
      \Crefname{result}%
        {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}%
        {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyrery}%
      \Crefname{example}%
        {\CYRP\cyrr\cyri\cyrm\cyre\cyrr}%
        {\CYRP\cyrr\cyri\cyrm\cyre\cyrr\cyrery}%
      \Crefname{remark}%
        {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyre}%
        {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyrya}%
      \Crefname{note}%
        {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyra}%
        {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyri}%
      \Crefname{algorithm}%
        {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}%
        {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyrery}%
      \Crefname{listing}%
        {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg}%
        {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg\cyri}%
      \Crefname{line}%
        {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}%
        {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}%
      \if@cref@capitalise%
        \crefname{equation}{\CYRF-\cyrl.}{\CYRF-\cyrl.}%
        \crefname{part}%
          {\CYRCH\cyra\cyrs\cyrt\cyrsftsn}%
          {\CYRCH\cyra\cyrs\cyrt\cyri}%
        \crefname{chapter}%
          {\CYRG\cyrl\cyra\cyrv\cyra}%
          {\CYRG\cyrl\cyra\cyrv\cyrery}%
        \crefname{section}%
          {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}%
          {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}%
        \crefname{subsection}%
          {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}%
          {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}%
        \crefname{subsubsection}%
          {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}%
          {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}%
        \crefname{appendix}%
          {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}%
          {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}%
        \crefname{subappendix}%
          {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}%
          {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}%
        \crefname{subsubappendix}%
          {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}%
          {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}%
        \crefname{subsubsubappendix}%
          {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}%
          {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}%
        \crefname{enumi}{\CYRP.}{\CYRP.\cyrp.}%
        \crefname{enumii}{\CYRP.}{\CYRP.\cyrp.}%
        \crefname{enumiii}{\CYRP.}{\CYRP.\cyrp.}%
        \crefname{enumiv}{\CYRP.}{\CYRP.\cyrp.}%
        \crefname{enumv}{\CYRP.}{\CYRP.\cyrp.}%
        \crefname{footnote}%
          {\CYRS\cyrn\cyro\cyrs\cyrk\cyra}%
          {\CYRS\cyrn\cyro\cyrs\cyrk\cyri}%
        \crefname{figure}%
          {\CYRR\cyri\cyrs.}%
          {\CYRR\cyri\cyrs.}%
        \crefname{subfigure}%
          {\CYRR\cyri\cyrs.}%
          {\CYRR\cyri\cyrs.}%
        \crefname{table}%
          {\CYRT\cyra\cyrb\cyrl.}%
          {\CYRT\cyra\cyrb\cyrl.}%
        \crefname{subtable}%
          {\CYRT\cyra\cyrb\cyrl.}%
          {\CYRT\cyra\cyrb\cyrl.}%
        \crefname{theorem}%
          {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}%
          {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyrery}%
        \crefname{lemma}%
          {\CYRL\cyre\cyrm\cyrm\cyra}%
          {\CYRL\cyre\cyrm\cyrm\cyrery}%
        \crefname{corollary}%
          {\CYRV\cyrery\cyrv\cyro\cyrd}%
          {\CYRV\cyrery\cyrv\cyro\cyrd\cyrery}%
        \crefname{proposition}%
          {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyre}%
          {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyrya}%
        \crefname{definition}%
          {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyre}%
          {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyrya}%
        \crefname{result}%
          {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}%
          {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyrery}%
        \crefname{example}%
          {\CYRP\cyrr\cyri\cyrm\cyre\cyrr}%
          {\CYRP\cyrr\cyri\cyrm\cyre\cyrr\cyrery}%
        \crefname{remark}%
          {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyre}%
          {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyrya}%
        \crefname{note}%
          {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyra}%
          {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyri}%
        \crefname{algorithm}%
          {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}%
          {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyrery}%
        \crefname{listing}%
          {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg}%
          {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg\cyri}%
        \crefname{line}%
          {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}%
          {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}%
      \else%
        \crefname{equation}{\cyrf-\cyrl.}{\cyrf-\cyrl.}%
        \crefname{part}%
          {\cyrch\cyra\cyrs\cyrt\cyrsftsn}%
          {\cyrch\cyra\cyrs\cyrt\cyri}%
        \crefname{chapter}%
          {\cyrg\cyrl\cyra\cyrv.}%
          {\cyrg\cyrl\cyra\cyrv.}%
        \crefname{section}%
          {\cyrr\cyra\cyrz\cyrd.}%
          {\cyrr\cyra\cyrz\cyrd\cyre\cyrl.}%
        \crefname{subsection}%
          {\cyrr\cyra\cyrz\cyrd.}%
          {\cyrr\cyra\cyrz\cyrd\cyre\cyrl.}%
        \crefname{subsubsection}%
          {\cyrr\cyra\cyrz\cyrd.}%
          {\cyrr\cyra\cyrz\cyrd\cyre\cyrl.}%
        \crefname{appendix}%
          {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}%
          {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}%
        \crefname{subappendix}%
          {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}%
          {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}%
        \crefname{subsubappendix}%
          {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}%
          {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}%
        \crefname{subsubsubappendix}%
          {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}%
          {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}%
        \crefname{enumi}{\cyrp.}{\cyrp.\cyrp.}%
        \crefname{enumii}{\cyrp.}{\cyrp.\cyrp.}%
        \crefname{enumiii}{\cyrp.}{\cyrp.\cyrp.}%
        \crefname{enumiv}{\cyrp.}{\cyrp.\cyrp.}%
        \crefname{enumv}{\cyrp.}{\cyrp.\cyrp.}%
        \crefname{footnote}%
          {\cyrs\cyrn\cyro\cyrs\cyrk.}%
          {\cyrs\cyrn\cyro\cyrs\cyrk.}%
        \crefname{figure}%
          {\cyrr\cyri\cyrs.}%
          {\cyrr\cyri\cyrs.}%
        \crefname{subfigure}%
          {\cyrr\cyri\cyrs.}%
          {\cyrr\cyri\cyrs.}%
        \crefname{table}%
          {\cyrt\cyra\cyrb\cyrl.}%
          {\cyrt\cyra\cyrb\cyrl.}%
        \crefname{subtable}%
          {\cyrt\cyra\cyrb\cyrl.}%
          {\cyrt\cyra\cyrb\cyrl.}%
        \crefname{theorem}%
          {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}%
          {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}%
        \crefname{lemma}%
          {\cyrl\cyre\cyrm\cyrm.}%
          {\cyrl\cyre\cyrm\cyrm.}%
        \crefname{corollary}%
          {\cyrv\cyrery\cyrv\cyro\cyrd}%
          {\cyrv\cyrery\cyrv\cyro\cyrd.}%
        \crefname{proposition}%
          {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd.}%
          {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd.}%
        \crefname{definition}%
          {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn.}%
          {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn.}%
        \crefname{result}%
          {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt.}%
          {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt.}%
        \crefname{example}%
          {\cyrp\cyrr\cyri\cyrm.}%
          {\cyrp\cyrr\cyri\cyrm\cyre\cyrr.}%
        \crefname{remark}%
          {\cyrp\cyrr\cyri\cyrm\cyre\cyrch.}%
          {\cyrp\cyrr\cyri\cyrm\cyre\cyrch.}%
        \crefname{note}%
          {\cyrz\cyra\cyrm\cyre\cyrt\cyrk.}%
          {\cyrz\cyra\cyrm\cyre\cyrt\cyrk.}%
        \crefname{algorithm}%
          {\cyra\cyrl\cyrg.}%
          {\cyra\cyrl\cyrg.}%
        \crefname{listing}%
          {\cyrl\cyri\cyrs\cyrt\cyri\cyrn.}%
          {\cyrl\cyri\cyrs\cyrt\cyri\cyrn\cyrg.}%
        \crefname{line}%
          {\cyrs\cyrt\cyrr\cyrk.}%
          {\cyrs\cyrt\cyrr\cyrk.}%
      \fi%
    }}}
%    \end{macrocode}
%
%
% \begin{macro}{ukrainian}
%   Ukrainian translations courtesy of Aleksander Gorohovski.
% \end{macro}
%    \begin{macrocode}
\DeclareOption{ukrainian}{%
  \PackageInfo{cleveref}{loaded `ukrainian' language definitions}
%    \end{macrocode}
% First, we set up the definitions used at the beginning of the document
% to define the formats created by the document preamble.
%    \begin{macrocode}
  \AtBeginDocument{%
    \def\crefrangeconjunction@preamble{--}%
    \def\crefrangepreconjunction@preamble{}%
    \def\crefrangepostconjunction@preamble{}%
    \def\crefpairconjunction@preamble{ \cyrii\nobreakspace}%
    \def\crefmiddleconjunction@preamble{, }%
    \def\creflastconjunction@preamble{ \cyrii\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@preamble{ \cyrt\cyra\nobreakspace}%
    \def\crefmiddlegroupconjunction@preamble{, }%
    \def\creflastgroupconjunction@preamble%
      {, \cyra\ \cyrt\cyra\cyrk\cyro\cyrzh\nobreakspace}%
    \Crefname@preamble{equation}%
      {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}%
      {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyri}%
    \Crefname@preamble{part}%
      {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyra}%
      {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyri}%
    \Crefname@preamble{chapter}%
      {\CYRG\cyrl\cyra\cyrv\cyra}%
      {\CYRG\cyrl\cyra\cyrv\cyri}%
    \Crefname@preamble{section}%
      {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}%
      {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}%
    \Crefname@preamble{appendix}%
      {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}%
      {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}%
    \Crefname@preamble{enumi}%
      {\CYRP\cyru\cyrn\cyrk\cyrt}%
      {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}%
    \Crefname@preamble{footnote}%
      {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyra}%
      {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyri}%
    \Crefname@preamble{figure}%
      {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}%
      {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}%
    \Crefname@preamble{table}%
      {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrya}%
      {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrii}%
    \Crefname@preamble{theorem}%
      {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}%
      {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyri}%
    \Crefname@preamble{lemma}%
      {\CYRL\cyre\cyrm\cyrm\cyra}%
      {\CYRL\cyre\cyrm\cyrm\cyri}%
    \Crefname@preamble{corollary}%
      {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyro\cyrk}%
      {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyrk\cyri}%
    \Crefname@preamble{proposition}%
      {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}%
      {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}%
    \Crefname@preamble{definition}%
      {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}%
      {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}%
    \Crefname@preamble{result}%
      {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}%
      {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyri}%
    \Crefname@preamble{example}%
      {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd}%
      {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd\cyri}%
    \Crefname@preamble{remark}%
      {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyra}%
      {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyri}%
    \Crefname@preamble{note}%
      {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyra}%
      {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyri}%
    \Crefname@preamble{algorithm}%
      {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}%
      {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyri}%
    \Crefname@preamble{listing}%
      {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg}%
      {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg\cyri}%
    \Crefname@preamble{line}%
      {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}%
      {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}%
    \if@cref@capitalise%
      \crefname@preamble{equation}{\CYRF-\cyrl.}{\CYRF-\cyrl.}%
      \crefname@preamble{part}%
        {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyra}%
        {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyri}%
      \crefname@preamble{chapter}%
        {\CYRG\cyrl\cyra\cyrv\cyra}%
        {\CYRG\cyrl\cyra\cyrv\cyri}%
      \crefname@preamble{section}%
        {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}%
        {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}%
      \crefname@preamble{appendix}%
        {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}%
        {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}%
      \crefname@preamble{enumi}{\CYRP.}{\CYRP.\cyrp.}%
      \crefname@preamble{footnote}%
        {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyra}%
        {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyri}%
      \crefname@preamble{figure}%
        {\CYRR\cyri\cyrs.}%
        {\CYRR\cyri\cyrs.}%
      \crefname@preamble{table}%
        {\CYRT\cyra\cyrb\cyrl.}%
        {\CYRT\cyra\cyrb\cyrl.}%
      \crefname@preamble{theorem}%
        {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}%
        {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyri}%
      \crefname@preamble{lemma}%
        {\CYRL\cyre\cyrm\cyrm\cyra}%
        {\CYRL\cyre\cyrm\cyrm\cyri}%
      \crefname@preamble{corollary}%
        {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyro\cyrk}%
        {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyrk\cyri}%
      \crefname@preamble{proposition}%
        {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}%
        {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}%
      \crefname@preamble{definition}%
        {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}%
        {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}%
      \crefname@preamble{result}%
        {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}%
        {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyri}%
      \crefname@preamble{example}%
        {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd}%
        {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd\cyri}%
      \crefname@preamble{remark}%
        {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyra}%
        {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyri}%
      \crefname@preamble{note}%
        {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyra}%
        {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyri}%
      \crefname@preamble{algorithm}%
        {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}%
        {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyri}%
      \crefname@preamble{listing}%
        {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg}%
        {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg\cyri}%
      \crefname@preamble{line}%
        {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}%
        {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}%
    \else%
      \crefname@preamble{equation}{\cyrf-\cyrl.}{\cyrf-\cyrl.}%
      \crefname@preamble{part}%
        {\cyrch\cyra\cyrs\cyrt\cyri\cyrn\cyra}%
        {\cyrch\cyra\cyrs\cyrt\cyri\cyrn\cyri}%
      \crefname@preamble{chapter}%
        {\cyrg\cyrl\cyra\cyrv.}%
        {\cyrg\cyrl\cyra\cyrv.}%
      \crefname@preamble{section}%
        {\cyrr\cyro\cyrz\cyrd.}%
        {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl.}%
      \crefname@preamble{appendix}%
        {\cyrd\cyro\cyrd\cyra\cyrt.}%
        {\cyrd\cyro\cyrd\cyra\cyrt\cyrk.}%
      \crefname@preamble{enumi}{\cyrp.}{\cyrp.\cyrp.}%
      \crefname@preamble{footnote}%
        {\cyrv\cyri\cyrn\cyro\cyrs\cyrk.}%
        {\cyrv\cyri\cyrn\cyro\cyrs\cyrk.}%
      \crefname@preamble{figure}%
        {\cyrr\cyri\cyrs.}%
        {\cyrr\cyri\cyrs.}%
      \crefname@preamble{table}%
        {\cyrt\cyra\cyrb\cyrl.}%
        {\cyrt\cyra\cyrb\cyrl.}%
      \crefname@preamble{theorem}%
        {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}%
        {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}%
      \crefname@preamble{lemma}%
        {\cyrl\cyre\cyrm\cyrm.}%
        {\cyrl\cyre\cyrm\cyrm.}%
      \crefname@preamble{corollary}%
        {\cyrv\cyri\cyrs\cyrn\cyro\cyrv.}%
        {\cyrv\cyri\cyrs\cyrn\cyro\cyrv\cyrk.}%
      \crefname@preamble{proposition}%
        {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn.}%
        {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn.}%
      \crefname@preamble{definition}%
        {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn.}%
        {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn.}%
      \crefname@preamble{result}%
        {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt.}%
        {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt.}%
      \crefname@preamble{example}%
        {\cyrp\cyrr\cyri\cyrk\cyrl.}%
        {\cyrp\cyrr\cyri\cyrk\cyrl\cyra\cyrd.}%
      \crefname@preamble{remark}%
        {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt.}%
        {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt.}%
      \crefname@preamble{note}%
        {\cyrz\cyra\cyrm\cyrii\cyrt.}%
        {\cyrz\cyra\cyrm\cyrii\cyrt.}%
      \crefname@preamble{algorithm}%
        {\cyra\cyrl\cyrg.}%
        {\cyra\cyrl\cyrg.}%
      \crefname@preamble{listing}%
        {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn.}%
        {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn\cyrg.}%
      \crefname@preamble{line}%
        {\cyrs\cyrt\cyrr\cyrk.}%
        {\cyrs\cyrt\cyrr\cyrk.}%
    \fi%
    \def\cref@language{ukrainian}%
%    \end{macrocode}
%
% Next, we add the definitions to \cmd{\extras}\dots so that
% \package{babel}'s \cmd{\selectlanguage} command will change the format
% appropriately.
%    \begin{macrocode}
    \cref@addto\extrasukrainian{%
      \renewcommand{\crefrangeconjunction}{--}%
      \renewcommand\crefrangepreconjunction{}%
      \renewcommand\crefrangepostconjunction{}%
      \renewcommand{\crefpairconjunction}{ \cyrii\nobreakspace}%
      \renewcommand{\crefmiddleconjunction}{, }%
      \renewcommand{\creflastconjunction}{ \cyrii\nobreakspace}%
      \renewcommand{\crefpairgroupconjunction}{ \cyrt\cyra\nobreakspace}%
      \renewcommand{\crefmiddlegroupconjunction}{, }%
      \renewcommand{\creflastgroupconjunction}%
        {, \cyra\ \cyrt\cyra\cyrk\cyro\cyrzh\nobreakspace}%
      \Crefname{equation}%
        {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}%
        {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyri}%
      \Crefname{part}%
        {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyra}%
        {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyri}%
      \Crefname{chapter}%
        {\CYRG\cyrl\cyra\cyrv\cyra}%
        {\CYRG\cyrl\cyra\cyrv\cyri}%
      \Crefname{section}%
        {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}%
        {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}%
      \Crefname{subsection}%
        {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}%
        {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}%
      \Crefname{subsubsection}%
        {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}%
        {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}%
      \Crefname{appendix}%
        {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}%
        {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}%
      \Crefname{subappendix}%
        {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}%
        {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}%
      \Crefname{subsubappendix}%
        {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}%
        {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}%
      \Crefname{subsubsubappendix}%
        {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}%
        {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}%
      \Crefname{enumi}%
        {\CYRP\cyru\cyrn\cyrk\cyrt}%
        {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}%
      \Crefname{enumii}%
        {\CYRP\cyru\cyrn\cyrk\cyrt}%
        {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}%
      \Crefname{enumiii}%
        {\CYRP\cyru\cyrn\cyrk\cyrt}%
        {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}%
      \Crefname{enumiv}%
        {\CYRP\cyru\cyrn\cyrk\cyrt}%
        {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}%
      \Crefname{enumv}%
        {\CYRP\cyru\cyrn\cyrk\cyrt}%
        {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}%
      \Crefname{footnote}%
        {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyra}%
        {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyri}%
      \Crefname{figure}%
        {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}%
        {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}%
      \Crefname{subfigure}%
        {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}%
        {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}%
      \Crefname{table}%
        {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrya}%
        {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrii}%
      \Crefname{subtable}%
        {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrya}%
        {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrii}%
      \Crefname{theorem}%
        {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}%
        {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyri}%
      \Crefname{lemma}%
        {\CYRL\cyre\cyrm\cyrm\cyra}%
        {\CYRL\cyre\cyrm\cyrm\cyri}%
      \Crefname{corollary}%
        {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyro\cyrk}%
        {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyrk\cyri}%
      \Crefname{proposition}%
        {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}%
        {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}%
      \Crefname{definition}%
        {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}%
        {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}%
      \Crefname{result}%
        {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}%
        {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyri}%
      \Crefname{example}%
        {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd}%
        {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd\cyri}%
      \Crefname{remark}%
        {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyra}%
        {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyri}%
      \Crefname{note}%
        {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyra}%
        {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyri}%
      \Crefname{algorithm}%
        {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}%
        {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyri}%
      \Crefname{listing}%
        {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg}%
        {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg\cyri}%
      \Crefname{line}%
        {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}%
        {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}%
      \if@cref@capitalise%
        \crefname{equation}{\CYRF-\cyrl.}{\CYRF-\cyrl.}%
        \crefname{part}%
          {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyra}%
          {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyri}%
        \crefname{chapter}%
          {\CYRG\cyrl\cyra\cyrv\cyra}%
          {\CYRG\cyrl\cyra\cyrv\cyri}%
        \crefname{section}%
          {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}%
          {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}%
        \crefname{subsection}%
          {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}%
          {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}%
        \crefname{subsubsection}%
          {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}%
          {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}%
        \crefname{appendix}%
          {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}%
          {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}%
        \crefname{subappendix}%
          {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}%
          {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}%
        \crefname{subsubappendix}%
          {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}%
          {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}%
        \crefname{subsubsubappendix}%
          {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}%
          {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}%
        \crefname{enumi}{\CYRP.}{\CYRP.\cyrp.}%
        \crefname{enumii}{\CYRP.}{\CYRP.\cyrp.}%
        \crefname{enumiii}{\CYRP.}{\CYRP.\cyrp.}%
        \crefname{enumiv}{\CYRP.}{\CYRP.\cyrp.}%
        \crefname{enumv}{\CYRP.}{\CYRP.\cyrp.}%
        \crefname{footnote}%
          {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyra}%
          {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyri}%
        \crefname{figure}%
          {\CYRR\cyri\cyrs.}%
          {\CYRR\cyri\cyrs.}%
        \crefname{subfigure}%
          {\CYRR\cyri\cyrs.}%
          {\CYRR\cyri\cyrs.}%
        \crefname{table}%
          {\CYRT\cyra\cyrb\cyrl.}%
          {\CYRT\cyra\cyrb\cyrl.}%
        \crefname{subtable}%
          {\CYRT\cyra\cyrb\cyrl.}%
          {\CYRT\cyra\cyrb\cyrl.}%
        \crefname{theorem}%
          {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}%
          {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyri}%
        \crefname{lemma}%
          {\CYRL\cyre\cyrm\cyrm\cyra}%
          {\CYRL\cyre\cyrm\cyrm\cyri}%
        \crefname{corollary}%
          {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyro\cyrk}%
          {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyrk\cyri}%
        \crefname{proposition}%
          {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}%
          {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}%
        \crefname{definition}%
          {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}%
          {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}%
        \crefname{result}%
          {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}%
          {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyri}%
        \crefname{example}%
          {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd}%
          {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd\cyri}%
        \crefname{remark}%
          {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyra}%
          {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyri}%
        \crefname{note}%
          {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyra}%
          {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyri}%
        \crefname{algorithm}%
          {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}%
          {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyri}%
        \crefname{listing}%
          {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg}%
          {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg\cyri}%
        \crefname{line}%
          {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}%
          {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}%
      \else%
        \crefname{equation}{\cyrf-\cyrl.}{\cyrf-\cyrl.}%
        \crefname{part}%
          {\cyrch\cyra\cyrs\cyrt\cyri\cyrn\cyra}%
          {\cyrch\cyra\cyrs\cyrt\cyri\cyrn\cyri}%
        \crefname{chapter}%
          {\cyrg\cyrl\cyra\cyrv.}%
          {\cyrg\cyrl\cyra\cyrv.}%
        \crefname{section}%
          {\cyrr\cyro\cyrz\cyrd.}%
          {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl.}%
        \crefname{subsection}%
          {\cyrr\cyro\cyrz\cyrd.}%
          {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl.}%
        \crefname{subsubsection}%
          {\cyrr\cyro\cyrz\cyrd.}%
          {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl.}%
        \crefname{appendix}%
          {\cyrd\cyro\cyrd\cyra\cyrt.}%
          {\cyrd\cyro\cyrd\cyra\cyrt\cyrk.}%
        \crefname{subappendix}%
          {\cyrd\cyro\cyrd\cyra\cyrt.}%
          {\cyrd\cyro\cyrd\cyra\cyrt\cyrk.}%
        \crefname{subsubappendix}%
          {\cyrd\cyro\cyrd\cyra\cyrt.}%
          {\cyrd\cyro\cyrd\cyra\cyrt\cyrk.}%
        \crefname{subsubsubappendix}%
          {\cyrd\cyro\cyrd\cyra\cyrt.}%
          {\cyrd\cyro\cyrd\cyra\cyrt\cyrk.}%
        \crefname{enumi}{\cyrp.}{\cyrp.\cyrp.}%
        \crefname{enumii}{\cyrp.}{\cyrp.\cyrp.}%
        \crefname{enumiii}{\cyrp.}{\cyrp.\cyrp.}%
        \crefname{enumiv}{\cyrp.}{\cyrp.\cyrp.}%
        \crefname{enumv}{\cyrp.}{\cyrp.\cyrp.}%
        \crefname{footnote}%
          {\cyrv\cyri\cyrn\cyro\cyrs\cyrk.}%
          {\cyrv\cyri\cyrn\cyro\cyrs\cyrk.}%
        \crefname{figure}%
          {\cyrr\cyri\cyrs.}%
          {\cyrr\cyri\cyrs.}%
        \crefname{subfigure}%
          {\cyrr\cyri\cyrs.}%
          {\cyrr\cyri\cyrs.}%
        \crefname{table}%
          {\cyrt\cyra\cyrb\cyrl.}%
          {\cyrt\cyra\cyrb\cyrl.}%
        \crefname{subtable}%
          {\cyrt\cyra\cyrb\cyrl.}%
          {\cyrt\cyra\cyrb\cyrl.}%
        \crefname{theorem}%
          {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}%
          {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}%
        \crefname{lemma}{\cyrl\cyre\cyrm\cyrm.}{\cyrl\cyre\cyrm\cyrm.}%
        \crefname{corollary}%
          {\cyrv\cyri\cyrs\cyrn\cyro\cyrv.}%
          {\cyrv\cyri\cyrs\cyrn\cyro\cyrv\cyrk.}%
        \crefname{proposition}%
          {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn.}%
          {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn.}%
        \crefname{definition}%
          {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn.}%
          {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn.}%
        \crefname{result}%
          {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt.}%
          {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt.}%
        \crefname{example}%
          {\cyrp\cyrr\cyri\cyrk\cyrl.}%
          {\cyrp\cyrr\cyri\cyrk\cyrl\cyra\cyrd.}%
        \crefname{remark}%
          {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt.}%
          {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt.}%
        \crefname{note}%
          {\cyrz\cyra\cyrm\cyrii\cyrt.}%
          {\cyrz\cyra\cyrm\cyrii\cyrt.}%
        \crefname{algorithm}%
          {\cyra\cyrl\cyrg.}%
          {\cyra\cyrl\cyrg.}%
        \crefname{listing}%
          {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn.}%
          {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn\cyrg.}%
        \crefname{line}%
          {\cyrs\cyrt\cyrr\cyrk.}%
          {\cyrs\cyrt\cyrr\cyrk.}%
      \fi%
    }}}
%    \end{macrocode}
%
%
% \begin{macro}{norsk}
%   Norwegian translations kindly donated by Sveinung Heggen.
% \end{macro}
%    \begin{macrocode}
\DeclareOption{norsk}{%
  \PackageInfo{cleveref}{loaded norsk language definitions}
%    \end{macrocode}
% First, we set up the definitions used at the beginning of the document to
% define the formats created by the document preamble.
%    \begin{macrocode}
  \AtBeginDocument{%
    \def\crefrangeconjunction@preamble{ til\nobreakspace}%
    \def\crefrangepreconjunction@preamble{}%
    \def\crefrangepostconjunction@preamble{}%
    \def\crefpairconjunction@preamble{ og\nobreakspace}%
    \def\crefmiddleconjunction@preamble{, }%
    \def\creflastconjunction@preamble{ og\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@preamble{ og\nobreakspace}%
    \def\crefmiddlegroupconjunction@preamble{, }%
    \def\creflastgroupconjunction@preamble{ og\nobreakspace}%
    \Crefname@preamble{equation}{Likning}{Likningene}%
    \Crefname@preamble{part}{Del}{Delene}%
    \Crefname@preamble{chapter}{Kapittel}{Kapitlene}%
    \Crefname@preamble{section}{Avsnitt}{Avsnittene}%
    \Crefname@preamble{appendix}{Tillegg}{Tilleggene}%
    \Crefname@preamble{enumi}{Punkt}{Punktene}%
    \Crefname@preamble{footnote}{Fotnote}{Fotnotene}%
    \Crefname@preamble{figure}{Figur}{Figurene}%
    \Crefname@preamble{table}{Tabell}{Tabellene}%
    \Crefname@preamble{theorem}{Teorem}{Teoremene}%
    \Crefname@preamble{lemma}{Lemma}{Lemma}%
    \Crefname@preamble{corollary}{Korollar}{Korollarene}%
    \Crefname@preamble{proposition}{P\aa stand}{P\aa standene}%
    \Crefname@preamble{definition}{Definisjon}{Definisjonene}%
    \Crefname@preamble{result}{Resultat}{Resultatene}%
    \Crefname@preamble{example}{Eksempel}{Eksemplene}%
    \Crefname@preamble{remark}{Bemerkning}{Bemerkningene}%
    \Crefname@preamble{note}{Note}{Notene}%
    \Crefname@preamble{algorithm}{Algoritme}{Algoritmene}%
    \Crefname@preamble{listing}{Opplisting}{Opplistingene}%
    \Crefname@preamble{line}{Linje}{Linjene}%
    \if@cref@capitalise%
      \crefname@preamble{equation}{Likning}{Likningene}%
      \crefname@preamble{part}{Del}{Delene}%
      \crefname@preamble{chapter}{Kapittel}{Kapitlene}%
      \crefname@preamble{section}{Avsnitt}{Avsnittene}%
      \crefname@preamble{appendix}{Tillegg}{Tilleggene}%
      \crefname@preamble{enumi}{Punkt}{Punktene}%
      \crefname@preamble{footnote}{Fotnote}{Fotnotene}%
      \crefname@preamble{figure}{Figur}{Figurene}%
      \crefname@preamble{table}{Tabell}{Tabellene}%
      \crefname@preamble{theorem}{Teorem}{Teoremene}%
      \crefname@preamble{lemma}{Lemma}{Lemma}%
      \crefname@preamble{corollary}{Korollar}{Korollarene}%
      \crefname@preamble{proposition}{P\aa stand}{P\aa standene}%
      \crefname@preamble{definition}{Definisjon}{Definisjonene}%
      \crefname@preamble{result}{Resultat}{Resultatene}%
      \crefname@preamble{example}{Eksempel}{Eksemplene}%
      \crefname@preamble{remark}{Bemerkning}{Bemerkningene}%
      \crefname@preamble{note}{Note}{Notene}%
      \crefname@preamble{algorithm}{Algoritme}{Algoritmene}%
      \crefname@preamble{listing}{Opplisting}{Opplistingene}%
      \crefname@preamble{line}{Linje}{Linjene}%
    \else%
      \crefname@preamble{equation}{likning}{likningene}%
      \crefname@preamble{part}{del}{delene}%
      \crefname@preamble{chapter}{kapittel}{kapitlene}%
      \crefname@preamble{section}{avsnitt}{avsnittene}%
      \crefname@preamble{appendix}{tillegg}{tilleggene}%
      \crefname@preamble{enumi}{punkt}{punktene}%
      \crefname@preamble{footnote}{fotnote}{fotnotene}%
      \crefname@preamble{figure}{figur}{figurene}%
      \crefname@preamble{table}{tabell}{tabeller}%
      \crefname@preamble{theorem}{teorem}{teoremene}%
      \crefname@preamble{lemma}{lemma}{lemma}%
      \crefname@preamble{corollary}{korollar}{korollarene}%
      \crefname@preamble{proposition}{p\aa stand}{p\aa standene}%
      \crefname@preamble{definition}{definisjon}{definisjonene}%
      \crefname@preamble{result}{resultat}{resultatene}%
      \crefname@preamble{example}{eksempel}{eksemplene}%
      \crefname@preamble{remark}{bemerkning}{bemerkningene}%
      \crefname@preamble{note}{note}{notene}%
      \crefname@preamble{algorithm}{algoritme}{algoritmene}%
      \crefname@preamble{listing}{opplisting}{opplistingene}%
      \crefname@preamble{line}{linje}{linjene}%
    \fi%
    \def\cref@language{norsk}%
%    \end{macrocode}
%
% Next, we add the definitions to \cmd{\extras}\dots so that
% \package{babel}'s \cmd{\selectlanguage} command will change the format
% appropriately.
%    \begin{macrocode}
    \cref@addto\extrasnorsk{%
      \renewcommand{\crefrangeconjunction}{ til\nobreakspace}%
      \renewcommand\crefrangepreconjunction{}%
      \renewcommand\crefrangepostconjunction{}%
      \renewcommand{\crefpairconjunction}{ og\nobreakspace}%
      \renewcommand{\crefmiddleconjunction}{, }%
      \renewcommand{\creflastconjunction}{ og\nobreakspace}%
      \renewcommand{\crefpairgroupconjunction}{ og\nobreakspace}%
      \renewcommand{\crefmiddlegroupconjunction}{, }%
      \renewcommand{\creflastgroupconjunction}{ og\nobreakspace}%
      \Crefname{equation}{Likning}{Likningene}%
      \Crefname{part}{Del}{Delene}%
      \Crefname{chapter}{Kapittel}{Kapitlene}%
      \Crefname{section}{Avsnitt}{Avsnittene}%
      \Crefname{subsection}{Avsnitt}{Avsnittene}%
      \Crefname{subsubsection}{Avsnitt}{Avsnittene}%
      \Crefname{appendix}{Tillegg}{Tilleggene}%
      \Crefname{subappendix}{Tillegg}{Tilleggene}%
      \Crefname{subsubappendix}{Tillegg}{Tilleggene}%
      \Crefname{subsubsubappendix}{Tillegg}{Tilleggene}%
      \Crefname{enumi}{Punkt}{Punktene}%
      \Crefname{enumii}{Punkt}{Punktene}%
      \Crefname{enumiii}{Punkt}{Punktene}%
      \Crefname{enumiv}{Punkt}{Punktene}%
      \Crefname{enumv}{Punkt}{Punktene}%
      \Crefname{footnote}{Fotnote}{Fotnotene}%
      \Crefname{figure}{Figur}{Figurene}%
      \Crefname{subfigure}{Figur}{Figurene}%
      \Crefname{table}{Tabell}{Tabellene}%
      \Crefname{subtable}{Tabell}{Tabellene}%
      \Crefname{theorem}{Teorem}{Teoremene}%
      \Crefname{lemma}{Lemma}{Lemma}%
      \Crefname{corollary}{Korollar}{Korollarene}%
      \Crefname{proposition}{P\aa stand}{P\aa standene}%
      \Crefname{definition}{Definisjon}{Definisjonene}%
      \Crefname{result}{Resultat}{Resultatene}%
      \Crefname{example}{Eksempel}{Eksemplene}%
      \Crefname{remark}{Bemerkning}{Bemerkningene}%
      \Crefname{note}{Note}{Notene}%
      \Crefname{algorithm}{Algoritme}{Algoritmene}%
      \Crefname{listing}{Opplisting}{Opplistingene}%
      \Crefname{line}{Linje}{Linjene}%
      \if@cref@capitalise%
        \crefname{equation}{Likning}{Likningene}%
        \crefname{part}{Del}{Delene}%
        \crefname{chapter}{Kapittel}{Kapitlene}%
        \crefname{section}{Avsnitt}{Avsnittene}%
        \crefname{subsection}{Avsnitt}{Avsnittene}%
        \crefname{subsubsection}{Avsnitt}{Avsnittene}%
        \crefname{appendix}{Tillegg}{Tilleggene}%
        \crefname{subappendix}{Tillegg}{Tilleggene}%
        \crefname{subsubappendix}{Tillegg}{Tilleggene}%
        \crefname{subsubsubappendix}{Tillegg}{Tilleggene}%
        \crefname{enumi}{Punkt}{Punktene}%
        \crefname{enumii}{Punkt}{Punktene}%
        \crefname{enumiii}{Punkt}{Punktene}%
        \crefname{enumiv}{Punkt}{Punktene}%
        \crefname{enumv}{Punkt}{Punktene}%
        \crefname{footnote}{Fotnote}{Fotnotene}%
        \crefname{figure}{Figur}{Figurene}%
        \crefname{subfigure}{Figur}{Figurene}%
        \crefname{table}{Tabell}{Tabellene}%
        \crefname{subtable}{Tabell}{Tabellene}%
        \crefname{theorem}{Teorem}{Teoremene}%
        \crefname{lemma}{Lemma}{Lemma}%
        \crefname{corollary}{Korollar}{Korollarene}%
        \crefname{proposition}{P\aa stand}{P\aa standene}%
        \crefname{definition}{Definisjon}{Definisjonene}%
        \crefname{result}{Resultat}{Resultatene}%
        \crefname{example}{Eksempel}{Eksemplene}%
        \crefname{remark}{Bemerkning}{Bemerkningene}%
        \crefname{note}{Note}{Notene}%
        \crefname{algorithm}{Algoritme}{Algoritmene}%
        \crefname{listing}{Opplisting}{Opplistingene}%
        \crefname{line}{Linje}{Linjene}%
      \else%
        \crefname{equation}{likning}{likningene}%
        \crefname{part}{del}{delene}%
        \crefname{chapter}{kapittel}{kapitlene}%
        \crefname{section}{avsnitt}{avsnittene}%
        \crefname{subsection}{avsnitt}{avsnittene}%
        \crefname{subsubsection}{avsnitt}{avsnittene}%
        \crefname{appendix}{tillegg}{tilleggene}%
        \crefname{subappendix}{tillegg}{tilleggene}%
        \crefname{subsubappendix}{tillegg}{tilleggene}%
        \crefname{subsubsubappendix}{tillegg}{tilleggene}%
        \crefname{enumi}{punkt}{punktene}%
        \crefname{enumii}{punkt}{punktene}%
        \crefname{enumiii}{punkt}{punktene}%
        \crefname{enumiv}{punkt}{punktene}%
        \crefname{enumv}{punkt}{punktene}%
        \crefname{footnote}{fotnote}{fotnotene}%
        \crefname{figure}{figur}{figurene}%
        \crefname{subfigure}{figur}{figurene}%
        \crefname{table}{tabell}{tabellene}%
        \crefname{subtable}{tabell}{tabellene}%
        \crefname{theorem}{teorem}{teoremene}%
        \crefname{lemma}{lemma}{lemma}%
        \crefname{corollary}{korollar}{korollarene}%
        \crefname{proposition}{p\aa stand}{p\aa standene}%
        \crefname{definition}{definisjon}{definisjonene}%
        \crefname{result}{resultat}{resultatene}%
        \crefname{example}{eksempel}{eksemplene}%
        \crefname{remark}{bemerkning}{bemerkningene}%
        \crefname{note}{note}{notene}%
        \crefname{algorithm}{algoritme}{algoritmene}%
        \crefname{listing}{opplisting}{opplistingene}%
        \crefname{line}{linje}{linjene}%
      \fi%
    }}}
%    \end{macrocode}
%
%
% \begin{macro}{danish}
%   Danish translations courtesy of Benjamin H{\o}yer.
% \end{macro}
%    \begin{macrocode}
\DeclareOption{danish}{%
  \PackageInfo{cleveref}{loaded danish language definitions}
%    \end{macrocode}
% First, we set up the definitions used at the beginning of the document to
% define the formats created by the document preamble.
%    \begin{macrocode}
  \AtBeginDocument{%
    \def\crefrangeconjunction@preamble{ til\nobreakspace}%
    \def\crefrangepreconjunction@preamble{}%
    \def\crefrangepostconjunction@preamble{}%
    \def\crefpairconjunction@preamble{ og\nobreakspace}%
    \def\crefmiddleconjunction@preamble{, }%
    \def\creflastconjunction@preamble{ og\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@preamble{ og\nobreakspace}%
    \def\crefmiddlegroupconjunction@preamble{, }%
    \def\creflastgroupconjunction@preamble{ og\nobreakspace}%
    \Crefname@preamble{equation}{Ligning}{Ligninger}%
    \Crefname@preamble{part}{Del}{Dele}%
    \Crefname@preamble{chapter}{Kapitel}{Kapitler}%
    \Crefname@preamble{section}{Afsnit}{Afsnit}%
    \Crefname@preamble{appendix}{Appendiks}{Appendiks}%
    \Crefname@preamble{enumi}{Punkt}{Punkter}%
    \Crefname@preamble{footnote}{Fodnote}{Fodnoter}%
    \Crefname@preamble{figure}{Figur}{Figurer}%
    \Crefname@preamble{table}{Tabel}{Tabeller}%
    \Crefname@preamble{theorem}{Teorem}{Teoremer}%
    \Crefname@preamble{lemma}{Lemma}{Lemma}%
    \Crefname@preamble{corollary}{F\o lgeslutning}{F\o lgeslutninger}%
    \Crefname@preamble{proposition}{Udsagn}{Udsagn}%
    \Crefname@preamble{definition}{Definition}{Definitioner}%
    \Crefname@preamble{result}{Resultat}{Resultater}%
    \Crefname@preamble{example}{Eksempel}{Eksempler}%
    \Crefname@preamble{remark}{Bem\ae rkning}{Bem\ae rkninger}%
    \Crefname@preamble{note}{Note}{Noter}%
    \Crefname@preamble{algorithm}{Algoritme}{Algoritmer}%
    \Crefname@preamble{line}{Linje}{Linjer}%
    \if@cref@capitalise%
      \crefname@preamble{equation}{Ligning}{Ligninger}%
      \crefname@preamble{part}{Del}{Dele}%
      \crefname@preamble{chapter}{Kapitel}{Kapitler}%
      \crefname@preamble{section}{Afsnit}{Afsnit}%
      \crefname@preamble{appendix}{Appendiks}{Appendiks}%
      \crefname@preamble{enumi}{Punkt}{Punkter}%
      \crefname@preamble{footnote}{Fodnote}{Fodnoter}%
      \crefname@preamble{figure}{Figur}{Figurer}%
      \crefname@preamble{table}{Tabel}{Tabeller}%
      \crefname@preamble{theorem}{Teorem}{Teoremer}%
      \crefname@preamble{lemma}{Lemma}{Lemma}%
      \crefname@preamble{corollary}{F\o lgeslutning}{F\o lgeslutninger}%
      \crefname@preamble{proposition}{Udsagn}{Udsagn}%
      \crefname@preamble{definition}{Definition}{Definitioner}%
      \crefname@preamble{result}{Resultat}{Resultater}%
      \crefname@preamble{example}{Eksempel}{Eksempler}%
      \crefname@preamble{remark}{Bem\ae rkning}{Bem\ae rkninger}%
      \crefname@preamble{note}{Note}{Noter}%
      \crefname@preamble{algorithm}{Algoritme}{Algoritmer}%
      \crefname@preamble{line}{Linje}{Linjer}%
    \else%
      \crefname@preamble{equation}{ligning}{ligninger}%
      \crefname@preamble{part}{del}{dele}%
      \crefname@preamble{chapter}{kapitel}{kapitler}%
      \crefname@preamble{section}{afsnit}{afsnit}%
      \crefname@preamble{appendix}{appendiks}{appendiks}%
      \crefname@preamble{enumi}{punkt}{punkter}%
      \crefname@preamble{footnote}{fodnote}{fodnoter}%
      \crefname@preamble{figure}{figur}{figurer}%
      \crefname@preamble{table}{tabel}{tabeller}%
      \crefname@preamble{theorem}{teorem}{teoremer}%
      \crefname@preamble{lemma}{lemma}{lemma}%
      \crefname@preamble{corollary}{f\o lgeslutning}{f\o lgeslutninger}%
      \crefname@preamble{proposition}{udsagn}{udsagn}%
      \crefname@preamble{definition}{definition}{definitioner}%
      \crefname@preamble{result}{resultat}{resultater}%
      \crefname@preamble{example}{eksempel}{eksempler}%
      \crefname@preamble{remark}{bem\ae rkning}{bem\ae rkninger}%
      \crefname@preamble{note}{note}{noter}%
      \crefname@preamble{algorithm}{algoritme}{algoritmer}%
      \crefname@preamble{line}{linje}{linjer}%
    \fi%
    \def\cref@language{danish}%
%    \end{macrocode}
%
% Next, we add the definitions to \cmd{\extras}\dots so that
% \package{babel}'s \cmd{\selectlanguage} command will change the format
% appropriately.
%    \begin{macrocode}
    \cref@addto\extrasdanish{%
    \renewcommand{\crefrangeconjunction@preamble}{ til\nobreakspace}%
    \renewcommand\crefrangepreconjunction@preamble{}%
    \renewcommand\crefrangepostconjunction@preamble{}%
    \renewcommand{\crefpairconjunction@preamble}{ og\nobreakspace}%
    \renewcommand{\crefmiddleconjunction@preamble}{, }%
    \renewcommand{\creflastconjunction@preamble}{ og\nobreakspace}%
    \renewcommand{\crefpairgroupconjunction@preamble}{ og\nobreakspace}%
    \renewcommand{\crefmiddlegroupconjunction@preamble}{, }%
    \renewcommand{\creflastgroupconjunction@preamble}{ og\nobreakspace}%
    \Crefname@preamble{equation}{Ligning}{Ligninger}%
    \Crefname@preamble{part}{Del}{Dele}%
    \Crefname@preamble{chapter}{Kapitel}{Kapitler}%
    \Crefname@preamble{section}{Afsnit}{Afsnit}%
    \Crefname@preamble{appendix}{Appendiks}{Appendiks}%
    \Crefname@preamble{enumi}{Punkt}{Punkter}%
    \Crefname@preamble{footnote}{Fodnote}{Fodnoter}%
    \Crefname@preamble{figure}{Figur}{Figurer}%
    \Crefname@preamble{table}{Tabel}{Tabeller}%
    \Crefname@preamble{theorem}{Teorem}{Teoremer}%
    \Crefname@preamble{lemma}{Lemma}{Lemma}%
    \Crefname@preamble{corollary}{F\o lgeslutning}{F\o lgeslutninger}%
    \Crefname@preamble{proposition}{Udsagn}{Udsagn}%
    \Crefname@preamble{definition}{Definition}{Definitioner}%
    \Crefname@preamble{result}{Resultat}{Resultater}%
    \Crefname@preamble{example}{Eksempel}{Eksempler}%
    \Crefname@preamble{remark}{Bem\ae rkning}{Bem\ae rkninger}%
    \Crefname@preamble{note}{Note}{Noter}%
    \Crefname@preamble{algorithm}{Algoritme}{Algoritmer}%
    \Crefname@preamble{line}{Linje}{Linjer}%
    \if@cref@capitalise%
      \crefname@preamble{equation}{Ligning}{Ligninger}%
      \crefname@preamble{part}{Del}{Dele}%
      \crefname@preamble{chapter}{Kapitel}{Kapitler}%
      \crefname@preamble{section}{Afsnit}{Afsnit}%
      \crefname@preamble{appendix}{Appendiks}{Appendiks}%
      \crefname@preamble{enumi}{Punkt}{Punkter}%
      \crefname@preamble{footnote}{Fodnote}{Fodnoter}%
      \crefname@preamble{figure}{Figur}{Figurer}%
      \crefname@preamble{table}{Tabel}{Tabeller}%
      \crefname@preamble{theorem}{Teorem}{Teoremer}%
      \crefname@preamble{lemma}{Lemma}{Lemma}%
      \crefname@preamble{corollary}{F\o lgeslutning}{F\o lgeslutninger}%
      \crefname@preamble{proposition}{Udsagn}{Udsagn}%
      \crefname@preamble{definition}{Definition}{Definitioner}%
      \crefname@preamble{result}{Resultat}{Resultater}%
      \crefname@preamble{example}{Eksempel}{Eksempler}%
      \crefname@preamble{remark}{Bem\ae rkning}{Bem\ae rkninger}%
      \crefname@preamble{note}{Note}{Noter}%
      \crefname@preamble{algorithm}{Algoritme}{Algoritmer}%
      \crefname@preamble{line}{Linje}{Linjer}%
    \else%
      \crefname@preamble{equation}{ligning}{ligninger}%
      \crefname@preamble{part}{del}{dele}%
      \crefname@preamble{chapter}{kapitel}{kapitler}%
      \crefname@preamble{section}{afsnit}{afsnit}%
      \crefname@preamble{appendix}{appendiks}{appendiks}%
      \crefname@preamble{enumi}{punkt}{punkter}%
      \crefname@preamble{footnote}{fodnote}{fodnoter}%
      \crefname@preamble{figure}{figur}{figurer}%
      \crefname@preamble{table}{tabel}{tabeller}%
      \crefname@preamble{theorem}{teorem}{teoremer}%
      \crefname@preamble{lemma}{lemma}{lemma}%
      \crefname@preamble{corollary}{f\o lgeslutning}{f\o lgeslutninger}%
      \crefname@preamble{proposition}{udsagn}{udsagn}%
      \crefname@preamble{definition}{definition}{definitioner}%
      \crefname@preamble{result}{resultat}{resultater}%
      \crefname@preamble{example}{eksempel}{eksempler}%
      \crefname@preamble{remark}{bem\ae rkning}{bem\ae rkninger}%
      \crefname@preamble{note}{note}{noter}%
      \crefname@preamble{algorithm}{algoritme}{algoritmer}%
      \crefname@preamble{line}{linje}{linjer}%
      \fi%
    }}}
%    \end{macrocode}
%
%
%
% \subsubsection{Default Cross-Reference Formats}
% \label{sec:code:default_formats}
% Setup the default format definitions, then process options in the order
% they were supplied. However, the \option{capitalise} option must be
% processed before the language options, so that it takes effect in the
% default format definitions. Therefore, we have to manually check
% whether it's present, and force processing of it before the other
% options.
%    \begin{macrocode}
\edef\@curroptions{\@ptionlist{\@currname.\@currext}}%
\@expandtwoargs\in@{,capitalise,}{%
  ,\@classoptionslist,\@curroptions,}%
\ifin@%
  \ExecuteOptions{capitalise}%
\else%
  \@expandtwoargs\in@{,capitalize,}{%
    ,\@classoptionslist,\@curroptions,}%
  \ifin@%
    \ExecuteOptions{capitalise}%
  \fi%
\fi%
\ExecuteOptions{english}
\ProcessOptions*\relax
%    \end{macrocode}
%
%
% Define the component-derived formats.
%    \begin{macrocode}
\AtBeginDocument{%
%    \end{macrocode}
% Use whatever's in the \dots|@preamble| definitions at the beginning of
% the document to set up the default cross-reference names, unless
% overridden by explicit definitions.
%    \begin{macrocode}
  \edef\@tempa{%
    \expandafter\noexpand\csname extras\cref@language\endcsname}%
  \@ifundefined{crefrangeconjunction}{%
    \let\crefrangeconjunction\crefrangeconjunction@preamble%
  }{%
    \expandafter\def\expandafter\@tempb\expandafter{%
      \expandafter\renewcommand\expandafter%
      {\expandafter\crefrangeconjunction\expandafter}%
      \expandafter{\crefrangeconjunction}}%
    \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\@tempa\expandafter{\@tempb}%
  }%
  \@ifundefined{crefrangepreconjunction}{%
    \let\crefrangepreconjunction\crefrangepreconjunction@preamble%
  }{%
    \expandafter\def\expandafter\@tempb\expandafter{%
      \expandafter\renewcommand\expandafter%
      {\expandafter\crefrangepreconjunction\expandafter}%
      \expandafter{\crefrangepreconjunction}}%
    \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\@tempa\expandafter{\@tempb}%
  }%
  \@ifundefined{crefrangepostconjunction}{%
    \let\crefrangepostconjunction\crefrangepostconjunction@preamble%
  }{%
    \expandafter\def\expandafter\@tempb\expandafter{%
      \expandafter\renewcommand\expandafter%
      {\expandafter\crefrangepostconjunction\expandafter}%
      \expandafter{\crefrangepostconjunction}}%
    \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\@tempa\expandafter{\@tempb}%
  }%
%    \end{macrocode}
% If the group conjunctions haven't been defined, but explicit
% definitions \emph{have} been given for the reference list conjunctions,
% define the group conjunctions to be identical to the reference
% conjunctions.
%    \begin{macrocode}
  \@ifundefined{crefpairconjunction}{%
    \let\crefpairconjunction\crefpairconjunction@preamble%
  }{%
    \expandafter\def\expandafter\@tempb\expandafter{%
      \expandafter\renewcommand\expandafter%
      {\expandafter\crefpairconjunction\expandafter}%
      \expandafter{\crefpairconjunction}}%
    \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\@tempa\expandafter{\@tempb}%
    \@ifundefined{crefpairgroupconjunction}{%
      \let\crefpairgroupconjunction\crefpairconjunction}{}%
  }%
  \@ifundefined{crefmiddleconjunction}{%
    \let\crefmiddleconjunction\crefmiddleconjunction@preamble%
  }{%
    \expandafter\def\expandafter\@tempb\expandafter{%
      \expandafter\renewcommand\expandafter%
      {\expandafter\crefmiddleconjunction\expandafter}%
      \expandafter{\crefmiddleconjunction}}%
    \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\@tempa\expandafter{\@tempb}%
    \@ifundefined{crefmiddlegroupconjunction}{%
      \let\crefmiddlegroupconjunction\crefmiddleconjunction}{}%
  }%
  \@ifundefined{creflastconjunction}{%
    \let\creflastconjunction\creflastconjunction@preamble%
  }{%
    \expandafter\def\expandafter\@tempb\expandafter{%
      \expandafter\renewcommand\expandafter%
      {\expandafter\creflastconjunction\expandafter}%
      \expandafter{\creflastconjunction}}%
    \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\@tempa\expandafter{\@tempb}%
%    \end{macrocode}
% Define the last group conjunction to include an extra comma.
%    \begin{macrocode}
    \@ifundefined{creflastgroupconjunction}{%
      \edef\creflastgroupconjunction{, \creflastconjunction}}{}%
  }%
  \@ifundefined{crefpairgroupconjunction}{%
    \let\crefpairgroupconjunction%
    \crefpairgroupconjunction@preamble%
  }{%
    \expandafter\def\expandafter\@tempb\expandafter{%
      \expandafter\renewcommand\expandafter%
      {\expandafter\crefpairgroupconjunction\expandafter}%
      \expandafter{\crefpairgroupconjunction}}%
    \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\@tempa\expandafter{\@tempb}%
  }%
  \@ifundefined{crefmiddlegroupconjunction}{%
    \let\crefmiddlegroupconjunction%
      \crefmiddlegroupconjunction@preamble%
  }{%
    \expandafter\def\expandafter\@tempb\expandafter{%
      \expandafter\renewcommand\expandafter%
      {\expandafter\crefmiddlegroupconjunction\expandafter}%
      \expandafter{\crefmiddlegroupconjunction}}%
    \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\@tempa\expandafter{\@tempb}%
  }%
  \@ifundefined{creflastgroupconjunction}{%
    \let\creflastgroupconjunction%
      \creflastgroupconjunction@preamble%
  }{%
    \expandafter\def\expandafter\@tempb\expandafter{%
      \expandafter\renewcommand\expandafter%
      {\expandafter\creflastgroupconjunction\expandafter}%
      \expandafter{\creflastgroupconjunction}}%
    \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\@tempa\expandafter{\@tempb}%
  }%
%    \end{macrocode}
%
% Define any undefined formats listed in \cmd{\cref@label@types} using
% the components.
%    \begin{macrocode}
  \let\@tempstack\cref@label@types%
  \cref@isstackfull{\@tempstack}%
  \@whilesw\if@cref@stackfull\fi{%
    \edef\@tempa{\cref@stack@top{\@tempstack}}%
    \@ifundefined{cref@\@tempa @name}{%
      \expandafter\def\expandafter\@tempb\expandafter{%
        \csname cref@\@tempa @name\endcsname}%
      \expandafter\def\expandafter\@tempc\expandafter{%
        \csname cref@\@tempa @name@preamble\endcsname}%
      \expandafter\expandafter\expandafter\let\expandafter\@tempb\@tempc%
      \expandafter\def\expandafter\@tempb\expandafter{%
        \csname cref@\@tempa @name@plural\endcsname}%
      \expandafter\def\expandafter\@tempc\expandafter{%
        \csname cref@\@tempa @name@plural@preamble\endcsname}%
      \expandafter\expandafter\expandafter\let\expandafter\@tempb\@tempc%
    }{%
      \edef\@tempb{%
        \expandafter\noexpand\csname extras\cref@language\endcsname}%
      \expandafter\def\expandafter\@tempc\expandafter{%
        \expandafter\crefname\expandafter{\@tempa}}%
      \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\expandafter\expandafter\@tempc%
      \expandafter\expandafter\expandafter{%
        \expandafter\expandafter\expandafter{%
          \csname cref@\@tempa @name\endcsname}}%
      \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\expandafter\expandafter\@tempc%
      \expandafter\expandafter\expandafter{%
        \expandafter\expandafter\expandafter{%
          \csname cref@\@tempa @name@plural\endcsname}}%
      \expandafter\expandafter\expandafter\cref@addto%
        \expandafter\@tempb\expandafter{\@tempc}%
    }%
    \@ifundefined{Cref@\@tempa @name}{%
      \expandafter\def\expandafter\@tempb\expandafter{%
        \csname Cref@\@tempa @name\endcsname}%
      \expandafter\def\expandafter\@tempc\expandafter{%
        \csname Cref@\@tempa @name@preamble\endcsname}%
      \expandafter\expandafter\expandafter\let\expandafter\@tempb\@tempc%
      \expandafter\def\expandafter\@tempb\expandafter{%
        \csname Cref@\@tempa @name@plural\endcsname}%
      \expandafter\def\expandafter\@tempc\expandafter{%
        \csname Cref@\@tempa @name@plural@preamble\endcsname}%
      \expandafter\expandafter\expandafter\let\expandafter\@tempb\@tempc%
    }{%
      \edef\@tempb{%
        \expandafter\noexpand\csname extras\cref@language\endcsname}%
      \expandafter\def\expandafter\@tempc\expandafter{%
        \expandafter\Crefname\expandafter{\@tempa}}%
      \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\expandafter\expandafter\@tempc%
      \expandafter\expandafter\expandafter{%
        \expandafter\expandafter\expandafter{%
          \csname Cref@\@tempa @name\endcsname}}%
      \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\expandafter\expandafter\@tempc%
      \expandafter\expandafter\expandafter{%
        \expandafter\expandafter\expandafter{%
          \csname Cref@\@tempa @name@plural\endcsname}}%
      \expandafter\expandafter\expandafter\cref@addto%
        \expandafter\@tempb\expandafter{\@tempc}%
    }%
%    \end{macrocode}
% We only define the reference-range and multi-reference formats if the
% plural form of the name is defined in the corresponding
% \cmd{\cref\meta{type}@name@plural}. Though \cmd{\crefname} and
% \cmd{\Crefname} always define both the singular and plural forms
% together, cross-reference names can also be defined automatically by
% \cmd{\newtheorem}, which can only define the singular form. In this
% case, the singular form might be defined whilst the plural form is
% undefined. For symmetry, we apply the same logic to the normal
% cross-reference format definition (only defining it if
% \cmd{\cref\meta{type}@name} is defined), though currently this should
% always be the case.
%    \begin{macrocode}
    \@ifundefined{cref@\@tempa @format}{%
      \@ifundefined{cref@\@tempa @name}{}{%
        \expandafter\@crefdefineformat\expandafter{\@tempa}}}{}%
    \@ifundefined{crefrange@\@tempa @format}{%
      \@ifundefined{cref@\@tempa @name@plural}{}{%
        \expandafter\@crefrangedefineformat\expandafter{\@tempa}}}{}%
    \@ifundefined{cref@\@tempa @format@first}{%
      \@ifundefined{cref@\@tempa @name@plural}{}{%
        \expandafter\@crefdefinemultiformat\expandafter{\@tempa}}}{}%
    \@ifundefined{crefrange@\@tempa @format@first}{%
      \@ifundefined{cref@\@tempa @name@plural}{}{%
        \expandafter\@crefrangedefinemultiformat%
        \expandafter{\@tempa}}}{}%
    \cref@stack@pop{\@tempstack}%
    \cref@isstackfull{\@tempstack}}%
%    \end{macrocode}
%
% If formats for subsections are undefined, define them to be identical
% to the formats for sections.
%    \begin{macrocode}
    \@ifundefined{cref@subsection@name}{%
      \let\cref@subsection@name\cref@section@name%
      \let\cref@subsection@name@plural\cref@section@name@plural}{}%
    \@ifundefined{Cref@subsection@name}{%
      \let\Cref@subsection@name\Cref@section@name%
      \let\Cref@subsection@name@plural\Cref@section@name@plural}{}%
    \@ifundefined{cref@subsection@format}{%
      \let\cref@subsection@format\cref@section@format}{}%
    \@ifundefined{Cref@subsection@format}{%
      \let\Cref@subsection@format\Cref@section@format}{}%
    \@ifundefined{crefrange@subsection@format}{%
      \let\crefrange@subsection@format%
      \crefrange@section@format}{}%
    \@ifundefined{Crefrange@subsection@format}{%
      \let\Crefrange@subsection@format%
      \Crefrange@section@format}{}%
    \@ifundefined{cref@subsection@format@first}{%
      \let\cref@subsection@format@first%
      \cref@section@format@first}{}%
    \@ifundefined{Cref@subsection@format@first}{%
      \let\Cref@subsection@format@first%
      \Cref@section@format@first}{}%
    \@ifundefined{cref@subsection@format@second}{%
      \let\cref@subsection@format@second%
      \cref@section@format@second}{}%
    \@ifundefined{Cref@subsection@format@second}{%
      \let\Cref@subsection@format@second%
      \Cref@section@format@second}{}%
    \@ifundefined{cref@subsection@format@middle}{%
      \let\cref@subsection@format@middle%
      \cref@section@format@middle}{}%
    \@ifundefined{Cref@subsection@format@middle}{%
      \let\Cref@subsection@format@middle%
      \Cref@section@format@middle}{}%
    \@ifundefined{cref@subsection@format@last}{%
      \let\cref@subsection@format@last%
      \cref@section@format@last}{}%
    \@ifundefined{Cref@subsection@format@last}{%
      \let\Cref@subsection@format@last%
      \Cref@section@format@last}{}%
    \@ifundefined{crefrange@subsection@format@first}{%
      \let\crefrange@subsection@format@first%
      \crefrange@section@format@first}{}%
    \@ifundefined{Crefrange@subsection@format@first}{%
      \let\Crefrange@subsection@format@first%
      \Crefrange@section@format@first}{}%
    \@ifundefined{crefrange@subsection@format@second}{%
      \let\crefrange@subsection@format@second%
      \crefrange@section@format@second}{}%
    \@ifundefined{Crefrange@subsection@format@second}{%
      \let\Crefrange@subsection@format@second%
      \Crefrange@section@format@second}{}%
    \@ifundefined{crefrange@subsection@format@middle}{%
      \let\crefrange@subsection@format@middle%
      \crefrange@section@format@middle}{}%
    \@ifundefined{Crefrange@subsection@format@middle}{%
      \let\Crefrange@subsection@format@middle%
      \Crefrange@section@format@middle}{}%
    \@ifundefined{crefrange@subsection@format@last}{%
      \let\crefrange@subsection@format@last%
      \crefrange@section@format@last}{}%
    \@ifundefined{Crefrange@subsection@format@last}{%
      \let\Crefrange@subsection@format@last%
      \Crefrange@section@format@last}{}%
%
    \@ifundefined{cref@subsubsection@name}{%
      \let\cref@subsubsection@name\cref@section@name%
      \let\cref@subsubsection@name@plural\cref@section@name@plural}{}%
    \@ifundefined{Cref@subsection@name}{%
      \let\Cref@subsection@name\Cref@section@name%
      \let\Cref@subsection@name@plural\Cref@section@name@plural}{}%
    \@ifundefined{cref@subsubsection@format}{%
      \let\cref@subsubsection@format%
      \cref@subsection@format}{}%
    \@ifundefined{Cref@subsubsection@format}{%
      \let\Cref@subsubsection@format%
      \Cref@subsection@format}{}%
    \@ifundefined{crefrange@subsubsection@format}{%
      \let\crefrange@subsubsection@format%
      \crefrange@subsection@format}{}%
    \@ifundefined{Crefrange@subsubsection@format}{%
      \let\Crefrange@subsubsection@format%
      \Crefrange@subsection@format}{}%
    \@ifundefined{cref@subsubsection@format@first}{%
      \let\cref@subsubsection@format@first%
      \cref@subsection@format@first}{}%
    \@ifundefined{Cref@subsubsection@format@first}{%
      \let\Cref@subsubsection@format@first%
      \Cref@subsection@format@first}{}%
    \@ifundefined{cref@subsubsection@format@second}{%
      \let\cref@subsubsection@format@second%
      \cref@subsection@format@second}{}%
    \@ifundefined{Cref@subsubsection@format@second}{%
      \let\Cref@subsubsection@format@second%
      \Cref@subsection@format@second}{}%
    \@ifundefined{cref@subsubsection@format@middle}{%
      \let\cref@subsubsection@format@middle%
      \cref@subsection@format@middle}{}%
    \@ifundefined{Cref@subsubsection@format@middle}{%
      \let\Cref@subsubsection@format@middle%
      \Cref@subsection@format@middle}{}%
    \@ifundefined{cref@subsubsection@format@last}{%
      \let\cref@subsubsection@format@last%
      \cref@subsection@format@last}{}%
    \@ifundefined{Cref@subsubsection@format@last}{%
      \let\Cref@subsubsection@format@last%
      \Cref@subsection@format@last}{}%
    \@ifundefined{crefrange@subsubsection@format@first}{%
      \let\crefrange@subsubsection@format@first%
      \crefrange@subsection@format@first}{}%
    \@ifundefined{Crefrange@subsubsection@format@first}{%
      \let\Crefrange@subsubsection@format@first%
      \Crefrange@subsection@format@first}{}%
    \@ifundefined{crefrange@subsubsection@format@second}{%
      \let\crefrange@subsubsection@format@second%
      \crefrange@subsection@format@second}{}%
    \@ifundefined{Crefrange@subsubsection@format@second}{%
      \let\Crefrange@subsubsection@format@second%
      \Crefrange@subsection@format@second}{}%
    \@ifundefined{crefrange@subsubsection@format@middle}{%
      \let\crefrange@subsubsection@format@middle%
      \crefrange@subsection@format@middle}{}%
    \@ifundefined{Crefrange@subsubsection@format@middle}{%
      \let\Crefrange@subsubsection@format@middle%
      \Crefrange@subsection@format@middle}{}%
    \@ifundefined{crefrange@subsubsection@format@last}{%
      \let\crefrange@subsubsection@format@last%
      \crefrange@subsection@format@last}{}%
    \@ifundefined{Crefrange@subsubsection@format@last}{%
      \let\Crefrange@subsubsection@format@last%
      \Crefrange@subsection@format@last}{}%
%    \end{macrocode}
% Similarly for subsections within appendices.
%    \begin{macrocode}
    \@ifundefined{cref@subappendix@name}{%
      \let\cref@subappendix@name\cref@appendix@name%
      \let\cref@subappendix@name@plural%
        \cref@appendix@name@plural}{}%
    \@ifundefined{Cref@subappendix@name}{%
      \let\Cref@subappendix@name\Cref@section@name%
      \let\Cref@subappendixsection@name@plural%
        \Cref@appendix@name@plural}{}%
    \@ifundefined{cref@subappendix@format}{%
      \let\cref@subappendix@format\cref@appendix@format}{}%
    \@ifundefined{Cref@subappendix@format}{%
      \let\Cref@subappendix@format\Cref@appendix@format}{}%
    \@ifundefined{crefrange@subappendix@format}{%
      \let\crefrange@subappendix@format%
      \crefrange@appendix@format}{}%
    \@ifundefined{Crefrange@subappendix@format}{%
      \let\Crefrange@subappendix@format%
      \Crefrange@appendix@format}{}%
    \@ifundefined{cref@subappendix@format@first}{%
      \let\cref@subappendix@format@first%
      \cref@appendix@format@first}{}%
    \@ifundefined{Cref@subappendix@format@first}{%
      \let\Cref@subappendix@format@first%
      \Cref@appendix@format@first}{}%
    \@ifundefined{cref@subappendix@format@second}{%
      \let\cref@subappendix@format@second%
      \cref@appendix@format@second}{}%
    \@ifundefined{Cref@subappendix@format@second}{%
      \let\Cref@subappendix@format@second%
      \Cref@appendix@format@second}{}%
    \@ifundefined{cref@subappendix@format@middle}{%
      \let\cref@subappendix@format@middle%
      \cref@appendix@format@middle}{}%
    \@ifundefined{Cref@subappendix@format@middle}{%
      \let\Cref@subappendix@format@middle%
      \Cref@appendix@format@middle}{}%
    \@ifundefined{cref@subappendix@format@last}{%
      \let\cref@subappendix@format@last%
      \cref@appendix@format@last}{}%
    \@ifundefined{Cref@subappendix@format@last}{%
      \let\Cref@subappendix@format@last%
      \Cref@appendix@format@last}{}%
    \@ifundefined{crefrange@subappendix@format@first}{%
      \let\crefrange@subappendix@format@first%
      \crefrange@appendix@format@first}{}%
    \@ifundefined{Crefrange@subappendix@format@first}{%
      \let\Crefrange@subappendix@format@first%
      \Crefrange@appendix@format@first}{}%
    \@ifundefined{crefrange@subappendix@format@second}{%
      \let\crefrange@subappendix@format@second%
      \crefrange@appendix@format@second}{}%
    \@ifundefined{Crefrange@subappendix@format@second}{%
      \let\Crefrange@subappendix@format@second%
      \Crefrange@appendix@format@second}{}%
    \@ifundefined{crefrange@subappendix@format@middle}{%
      \let\crefrange@subappendix@format@middle%
      \crefrange@appendix@format@middle}{}%
    \@ifundefined{Crefrange@subappendix@format@middle}{%
      \let\Crefrange@subappendix@format@middle%
      \Crefrange@appendix@format@middle}{}%
    \@ifundefined{crefrange@subappendix@format@last}{%
      \let\crefrange@subappendix@format@last%
      \crefrange@appendix@format@last}{}%
    \@ifundefined{Crefrange@subappendix@format@last}{%
      \let\Crefrange@subappendix@format@last%
      \Crefrange@appendix@format@last}{}%
%
    \@ifundefined{cref@subsubappendix@name}{%
      \let\cref@subsubappendix@name\cref@appendix@name%
      \let\cref@subsubappendix@name@plural%
        \cref@appendix@name@plural}{}%
    \@ifundefined{Cref@subsubappendix@name}{%
      \let\Cref@subsubappendix@name\Cref@section@name%
      \let\Cref@subsubappendixsection@name@plural%
        \Cref@appendix@name@plural}{}%
    \@ifundefined{cref@subsubappendix@format}{%
      \let\cref@subsubappendix@format%
      \cref@subappendix@format}{}%
    \@ifundefined{Cref@subsubappendix@format}{%
      \let\Cref@subsubappendix@format%
      \Cref@subappendix@format}{}%
    \@ifundefined{crefrange@subsubappendix@format}{%
      \let\crefrange@subsubappendix@format%
      \crefrange@subappendix@format}{}%
    \@ifundefined{Crefrange@subsubappendix@format}{%
      \let\Crefrange@subsubappendix@format%
      \Crefrange@subappendix@format}{}%
    \@ifundefined{cref@subsubappendix@format@first}{%
      \let\cref@subsubappendix@format@first%
      \cref@subappendix@format@first}{}%
    \@ifundefined{Cref@subsubappendix@format@first}{%
      \let\Cref@subsubappendix@format@first%
      \Cref@subappendix@format@first}{}%
    \@ifundefined{cref@subsubappendix@format@second}{%
      \let\cref@subsubappendix@format@second%
      \cref@subappendix@format@second}{}%
    \@ifundefined{Cref@subsubappendix@format@second}{%
      \let\Cref@subsubappendix@format@second%
      \Cref@subappendix@format@second}{}%
    \@ifundefined{cref@subsubappendix@format@middle}{%
      \let\cref@subsubappendix@format@middle%
      \cref@subappendix@format@middle}{}%
    \@ifundefined{Cref@subsubappendix@format@middle}{%
      \let\Cref@subsubappendix@format@middle%
      \Cref@subappendix@format@middle}{}%
    \@ifundefined{cref@subsubappendix@format@last}{%
      \let\cref@subsubappendix@format@last%
      \cref@subappendix@format@last}{}%
    \@ifundefined{Cref@subsubappendix@format@last}{%
      \let\Cref@subsubappendix@format@last%
      \Cref@subappendix@format@last}{}%
    \@ifundefined{crefrange@subsubappendix@format@first}{%
      \let\crefrange@subsubappendix@format@first%
      \crefrange@subappendix@format@first}{}%
    \@ifundefined{Crefrange@subsubappendix@format@first}{%
      \let\Crefrange@subsubappendix@format@first%
      \Crefrange@subappendix@format@first}{}%
    \@ifundefined{crefrange@subsubappendix@format@second}{%
      \let\crefrange@subsubappendix@format@second%
      \crefrange@subappendix@format@second}{}%
    \@ifundefined{Crefrange@subsubappendix@format@second}{%
      \let\Crefrange@subsubappendix@format@second%
      \Crefrange@subappendix@format@second}{}%
    \@ifundefined{crefrange@subsubappendix@format@middle}{%
      \let\crefrange@subsubappendix@format@middle%
      \crefrange@subappendix@format@middle}{}%
    \@ifundefined{Crefrange@subsubappendix@format@middle}{%
      \let\Crefrange@subsubappendix@format@middle%
      \Crefrange@subappendix@format@middle}{}%
    \@ifundefined{crefrange@subsubappendix@format@last}{%
      \let\crefrange@subsubappendix@format@last%
      \crefrange@subappendix@format@last}{}%
    \@ifundefined{Crefrange@subsubappendix@format@last}{%
      \let\Crefrange@subsubappendix@format@last%
      \Crefrange@subappendix@format@last}{}%
%
    \@ifundefined{cref@subsubsubappendix@format}{%
      \let\cref@subsubsubappendix@format%
      \cref@subsubappendix@format}{}%
    \@ifundefined{Cref@subsubsubappendix@format}{%
      \let\Cref@subsubsubappendix@format%
      \Cref@subsubappendix@format}{}%
    \@ifundefined{crefrange@subsubsubappendix@format}{%
      \let\crefrange@subsubsubappendix@format%
      \crefrange@subsubappendix@format}{}%
    \@ifundefined{Crefrange@subsubsubappendix@format}{%
      \let\Crefrange@subsubsubappendix@format%
      \Crefrange@subsubappendix@format}{}%
    \@ifundefined{cref@subsubsubappendix@format@first}{%
      \let\cref@subsubsubappendix@format@first%
      \cref@subsubappendix@format@first}{}%
    \@ifundefined{Cref@subsubsubappendix@format@first}{%
      \let\Cref@subsubsubappendix@format@first%
      \Cref@subsubappendix@format@first}{}%
    \@ifundefined{cref@subsubsubappendix@format@second}{%
      \let\cref@subsubsubappendix@format@second%
      \cref@subsubappendix@format@second}{}%
    \@ifundefined{Cref@subsubsubappendix@format@second}{%
      \let\Cref@subsubsubappendix@format@second%
      \Cref@subsubappendix@format@second}{}%
    \@ifundefined{cref@subsubsubappendix@format@middle}{%
      \let\cref@subsubsubappendix@format@middle%
      \cref@subsubappendix@format@middle}{}%
    \@ifundefined{Cref@subsubsubappendix@format@middle}{%
      \let\Cref@subsubsubappendix@format@middle%
      \Cref@subsubappendix@format@middle}{}%
    \@ifundefined{cref@subsubsubappendix@format@last}{%
      \let\cref@subsubsubappendix@format@last%
      \cref@subsubappendix@format@last}{}%
    \@ifundefined{Cref@subsubsubappendix@format@last}{%
      \let\Cref@subsubsubappendix@format@last%
      \Cref@subsubappendix@format@last}{}%
    \@ifundefined{crefrange@subsubsubappendix@format@first}{%
      \let\crefrange@subsubsubappendix@format@first%
      \crefrange@subsubappendix@format@first}{}%
    \@ifundefined{Crefrange@subsubsubappendix@format@first}{%
      \let\Crefrange@subsubsubappendix@format@first%
      \Crefrange@subsubappendix@format@first}{}%
    \@ifundefined{crefrange@subsubsubappendix@format@second}{%
      \let\crefrange@subsubsubappendix@format@second%
      \crefrange@subsubappendix@format@second}{}%
    \@ifundefined{Crefrange@subsubsubappendix@format@second}{%
      \let\Crefrange@subsubsubappendix@format@second%
      \Crefrange@subsubappendix@format@second}{}%
    \@ifundefined{crefrange@subsubsubappendix@format@middle}{%
      \let\crefrange@subsubsubappendix@format@middle%
      \crefrange@subsubappendix@format@middle}{}%
    \@ifundefined{Crefrange@subsubsubappendix@format@middle}{%
      \let\Crefrange@subsubsubappendix@format@middle%
      \Crefrange@subsubappendix@format@middle}{}%
    \@ifundefined{crefrange@subsubsubappendix@format@last}{%
      \let\crefrange@subsubsubappendix@format@last%
      \crefrange@subsubappendix@format@last}{}%
    \@ifundefined{Crefrange@subsubsubappendix@format@last}{%
      \let\Crefrange@subsubsubappendix@format@last%
      \Crefrange@subsubappendix@format@last}{}%
%    \end{macrocode}
% Ditto for subfigures and subtables.
%    \begin{macrocode}
    \@ifundefined{cref@subfigure@format}{%
      \let\cref@subfigure@format%
      \cref@figure@format}{}%
    \@ifundefined{Cref@subfigure@format}{%
      \let\Cref@subfigure@format%
      \Cref@figure@format}{}%
    \@ifundefined{crefrange@subfigure@format}{%
      \let\crefrange@subfigure@format%
      \crefrange@figure@format}{}%
    \@ifundefined{Crefrange@subfigure@format}{%
      \let\Crefrange@subfigure@format%
      \Crefrange@figure@format}{}%
    \@ifundefined{cref@subfigure@format@first}{%
      \let\cref@subfigure@format@first%
      \cref@figure@format@first}{}%
    \@ifundefined{Cref@subfigure@format@first}{%
      \let\Cref@subfigure@format@first%
      \Cref@figure@format@first}{}%
    \@ifundefined{cref@subfigure@format@second}{%
      \let\cref@subfigure@format@second%
      \cref@figure@format@second}{}%
    \@ifundefined{Cref@subfigure@format@second}{%
      \let\Cref@subfigure@format@second%
      \Cref@figure@format@second}{}%
    \@ifundefined{cref@subfigure@format@middle}{%
      \let\cref@subfigure@format@middle%
      \cref@figure@format@middle}{}%
    \@ifundefined{Cref@subfigure@format@middle}{%
      \let\Cref@subfigure@format@middle%
      \Cref@figure@format@middle}{}%
    \@ifundefined{cref@subfigure@format@last}{%
      \let\cref@subfigure@format@last%
      \cref@figure@format@last}{}%
    \@ifundefined{Cref@subfigure@format@last}{%
      \let\Cref@subfigure@format@last%
      \Cref@figure@format@last}{}%
    \@ifundefined{crefrange@subfigure@format@first}{%
      \let\crefrange@subfigure@format@first%
      \crefrange@figure@format@first}{}%
    \@ifundefined{Crefrange@subfigure@format@first}{%
      \let\Crefrange@subfigure@format@first%
      \Crefrange@figure@format@first}{}%
    \@ifundefined{crefrange@subfigure@format@second}{%
      \let\crefrange@subfigure@format@second%
      \crefrange@figure@format@second}{}%
    \@ifundefined{Crefrange@subfigure@format@second}{%
      \let\Crefrange@subfigure@format@second%
      \Crefrange@figure@format@second}{}%
    \@ifundefined{crefrange@subfigure@format@middle}{%
      \let\crefrange@subfigure@format@middle%
      \crefrange@figure@format@middle}{}%
    \@ifundefined{Crefrange@subfigure@format@middle}{%
      \let\Crefrange@subfigure@format@middle%
      \Crefrange@figure@format@middle}{}%
    \@ifundefined{crefrange@subfigure@format@last}{%
      \let\crefrange@subfigure@format@last%
      \crefrange@figure@format@last}{}%
    \@ifundefined{Crefrange@subfigure@format@last}{%
      \let\Crefrange@subfigure@format@last%
      \Crefrange@figure@format@last}{}%
%
    \@ifundefined{cref@subtable@format}{%
      \let\cref@subtable@format%
      \cref@table@format}{}%
    \@ifundefined{Cref@subtable@format}{%
      \let\Cref@subtable@format%
      \Cref@table@format}{}%
    \@ifundefined{crefrange@subtable@format}{%
      \let\crefrange@subtable@format%
      \crefrange@table@format}{}%
    \@ifundefined{Crefrange@subtable@format}{%
      \let\Crefrange@subtable@format%
      \Crefrange@table@format}{}%
    \@ifundefined{cref@subtable@format@first}{%
      \let\cref@subtable@format@first%
      \cref@table@format@first}{}%
    \@ifundefined{Cref@subtable@format@first}{%
      \let\Cref@subtable@format@first%
      \Cref@table@format@first}{}%
    \@ifundefined{cref@subtable@format@second}{%
      \let\cref@subtable@format@second%
      \cref@table@format@second}{}%
    \@ifundefined{Cref@subtable@format@second}{%
      \let\Cref@subtable@format@second%
      \Cref@table@format@second}{}%
    \@ifundefined{cref@subtable@format@middle}{%
      \let\cref@subtable@format@middle%
      \cref@table@format@middle}{}%
    \@ifundefined{Cref@subtable@format@middle}{%
      \let\Cref@subtable@format@middle%
      \Cref@table@format@middle}{}%
    \@ifundefined{cref@subtable@format@last}{%
      \let\cref@subtable@format@last%
      \cref@table@format@last}{}%
    \@ifundefined{Cref@subtable@format@last}{%
      \let\Cref@subtable@format@last%
      \Cref@table@format@last}{}%
    \@ifundefined{crefrange@subtable@format@first}{%
      \let\crefrange@subtable@format@first%
      \crefrange@table@format@first}{}%
    \@ifundefined{Crefrange@subtable@format@first}{%
      \let\Crefrange@subtable@format@first%
      \Crefrange@table@format@first}{}%
    \@ifundefined{crefrange@subtable@format@second}{%
      \let\crefrange@subtable@format@second%
      \crefrange@table@format@second}{}%
    \@ifundefined{Crefrange@subtable@format@second}{%
      \let\Crefrange@subtable@format@second%
      \Crefrange@table@format@second}{}%
    \@ifundefined{crefrange@subtable@format@middle}{%
      \let\crefrange@subtable@format@middle%
      \crefrange@table@format@middle}{}%
    \@ifundefined{Crefrange@subtable@format@middle}{%
      \let\Crefrange@subtable@format@middle%
      \Crefrange@table@format@middle}{}%
    \@ifundefined{crefrange@subtable@format@last}{%
      \let\crefrange@subtable@format@last%
      \crefrange@table@format@last}{}%
    \@ifundefined{Crefrange@subtable@format@last}{%
      \let\Crefrange@subtable@format@last%
      \Crefrange@table@format@last}{}%
%    \end{macrocode}
% Ditto for enums.
%    \begin{macrocode}
    \@ifundefined{cref@enumii@format}{%
      \let\cref@enumii@format%
      \cref@enumi@format}{}%
    \@ifundefined{Cref@enumii@format}{%
      \let\Cref@enumii@format%
      \Cref@enumi@format}{}%
    \@ifundefined{crefrange@enumii@format}{%
      \let\crefrange@enumii@format%
      \crefrange@enumi@format}{}%
    \@ifundefined{Crefrange@enumii@format}{%
      \let\Crefrange@enumii@format%
      \Crefrange@enumi@format}{}%
    \@ifundefined{cref@enumii@format@first}{%
      \let\cref@enumii@format@first%
      \cref@enumi@format@first}{}%
    \@ifundefined{Cref@enumii@format@first}{%
      \let\Cref@enumii@format@first%
      \Cref@enumi@format@first}{}%
    \@ifundefined{cref@enumii@format@second}{%
      \let\cref@enumii@format@second%
      \cref@enumi@format@second}{}%
    \@ifundefined{Cref@enumii@format@second}{%
      \let\Cref@enumii@format@second%
      \Cref@enumi@format@second}{}%
    \@ifundefined{cref@enumii@format@middle}{%
      \let\cref@enumii@format@middle%
      \cref@enumi@format@middle}{}%
    \@ifundefined{Cref@enumii@format@middle}{%
      \let\Cref@enumii@format@middle%
      \Cref@enumi@format@middle}{}%
    \@ifundefined{cref@enumii@format@last}{%
      \let\cref@enumii@format@last%
      \cref@enumi@format@last}{}%
    \@ifundefined{Cref@enumii@format@last}{%
      \let\Cref@enumii@format@last%
      \Cref@enumi@format@last}{}%
    \@ifundefined{crefrange@enumii@format@first}{%
      \let\crefrange@enumii@format@first%
      \crefrange@enumi@format@first}{}%
    \@ifundefined{Crefrange@enumii@format@first}{%
      \let\Crefrange@enumii@format@first%
      \Crefrange@enumi@format@first}{}%
    \@ifundefined{crefrange@enumii@format@second}{%
      \let\crefrange@enumii@format@second%
      \crefrange@enumi@format@second}{}%
    \@ifundefined{Crefrange@enumii@format@second}{%
      \let\Crefrange@enumii@format@second%
      \Crefrange@enumi@format@second}{}%
    \@ifundefined{crefrange@enumii@format@middle}{%
      \let\crefrange@enumii@format@middle%
      \crefrange@enumi@format@middle}{}%
    \@ifundefined{Crefrange@enumii@format@middle}{%
      \let\Crefrange@enumii@format@middle%
      \Crefrange@enumi@format@middle}{}%
    \@ifundefined{crefrange@enumii@format@last}{%
      \let\crefrange@enumii@format@last%
      \crefrange@enumi@format@last}{}%
    \@ifundefined{Crefrange@enumii@format@last}{%
      \let\Crefrange@enumii@format@last%
      \Crefrange@enumi@format@last}{}%
%
    \@ifundefined{cref@enumiii@format}{%
      \let\cref@enumiii@format%
      \cref@enumii@format}{}%
    \@ifundefined{Cref@enumiii@format}{%
      \let\Cref@enumiii@format%
      \Cref@enumii@format}{}%
    \@ifundefined{crefrange@enumiii@format}{%
      \let\crefrange@enumiii@format%
      \crefrange@enumii@format}{}%
    \@ifundefined{Crefrange@enumiii@format}{%
      \let\Crefrange@enumiii@format%
      \Crefrange@enumii@format}{}%
    \@ifundefined{cref@enumiii@format@first}{%
      \let\cref@enumiii@format@first%
      \cref@enumii@format@first}{}%
    \@ifundefined{Cref@enumiii@format@first}{%
      \let\Cref@enumiii@format@first%
      \Cref@enumii@format@first}{}%
    \@ifundefined{cref@enumiii@format@second}{%
      \let\cref@enumiii@format@second%
      \cref@enumii@format@second}{}%
    \@ifundefined{Cref@enumiii@format@second}{%
      \let\Cref@enumiii@format@second%
      \Cref@enumii@format@second}{}%
    \@ifundefined{cref@enumiii@format@middle}{%
      \let\cref@enumiii@format@middle%
      \cref@enumii@format@middle}{}%
    \@ifundefined{Cref@enumiii@format@middle}{%
      \let\Cref@enumiii@format@middle%
      \Cref@enumii@format@middle}{}%
    \@ifundefined{cref@enumiii@format@last}{%
      \let\cref@enumiii@format@last%
      \cref@enumii@format@last}{}%
    \@ifundefined{Cref@enumiii@format@last}{%
      \let\Cref@enumiii@format@last%
      \Cref@enumii@format@last}{}%
    \@ifundefined{crefrange@enumiii@format@first}{%
      \let\crefrange@enumiii@format@first%
      \crefrange@enumii@format@first}{}%
    \@ifundefined{Crefrange@enumiii@format@first}{%
      \let\Crefrange@enumiii@format@first%
      \Crefrange@enumii@format@first}{}%
    \@ifundefined{crefrange@enumiii@format@second}{%
      \let\crefrange@enumiii@format@second%
      \crefrange@enumii@format@second}{}%
    \@ifundefined{Crefrange@enumiii@format@second}{%
      \let\Crefrange@enumiii@format@second%
      \Crefrange@enumii@format@second}{}%
    \@ifundefined{crefrange@enumiii@format@middle}{%
      \let\crefrange@enumiii@format@middle%
      \crefrange@enumii@format@middle}{}%
    \@ifundefined{Crefrange@enumiii@format@middle}{%
      \let\Crefrange@enumiii@format@middle%
      \Crefrange@enumii@format@middle}{}%
    \@ifundefined{crefrange@enumiii@format@last}{%
      \let\crefrange@enumiii@format@last%
      \crefrange@enumii@format@last}{}%
    \@ifundefined{Crefrange@enumiii@format@last}{%
      \let\Crefrange@enumiii@format@last%
      \Crefrange@enumii@format@last}{}%
%
    \@ifundefined{cref@enumiv@format}{%
      \let\cref@enumiv@format%
      \cref@enumiii@format}{}%
    \@ifundefined{Cref@enumiv@format}{%
      \let\Cref@enumiv@format%
      \Cref@enumiii@format}{}%
    \@ifundefined{crefrange@enumiv@format}{%
      \let\crefrange@enumiv@format%
      \crefrange@enumiii@format}{}%
    \@ifundefined{Crefrange@enumiv@format}{%
      \let\Crefrange@enumiv@format%
      \Crefrange@enumiii@format}{}%
    \@ifundefined{cref@enumiv@format@first}{%
      \let\cref@enumiv@format@first%
      \cref@enumiii@format@first}{}%
    \@ifundefined{Cref@enumiv@format@first}{%
      \let\Cref@enumiv@format@first%
      \Cref@enumiii@format@first}{}%
    \@ifundefined{cref@enumiv@format@second}{%
      \let\cref@enumiv@format@second%
      \cref@enumiii@format@second}{}%
    \@ifundefined{Cref@enumiv@format@second}{%
      \let\Cref@enumiv@format@second%
      \Cref@enumiii@format@second}{}%
    \@ifundefined{cref@enumiv@format@middle}{%
      \let\cref@enumiv@format@middle%
      \cref@enumiii@format@middle}{}%
    \@ifundefined{Cref@enumiv@format@middle}{%
      \let\Cref@enumiv@format@middle%
      \Cref@enumiii@format@middle}{}%
    \@ifundefined{cref@enumiv@format@last}{%
      \let\cref@enumiv@format@last%
      \cref@enumiii@format@last}{}%
    \@ifundefined{Cref@enumiv@format@last}{%
      \let\Cref@enumiv@format@last%
      \Cref@enumiii@format@last}{}%
    \@ifundefined{crefrange@enumiv@format@first}{%
      \let\crefrange@enumiv@format@first%
      \crefrange@enumiii@format@first}{}%
    \@ifundefined{Crefrange@enumiv@format@first}{%
      \let\Crefrange@enumiv@format@first%
      \Crefrange@enumiii@format@first}{}%
    \@ifundefined{crefrange@enumiv@format@second}{%
      \let\crefrange@enumiv@format@second%
      \crefrange@enumiii@format@second}{}%
    \@ifundefined{Crefrange@enumiv@format@second}{%
      \let\Crefrange@enumiv@format@second%
      \Crefrange@enumiii@format@second}{}%
    \@ifundefined{crefrange@enumiv@format@middle}{%
      \let\crefrange@enumiv@format@middle%
      \crefrange@enumiii@format@middle}{}%
    \@ifundefined{Crefrange@enumiv@format@middle}{%
      \let\Crefrange@enumiv@format@middle%
      \Crefrange@enumiii@format@middle}{}%
    \@ifundefined{crefrange@enumiv@format@last}{%
      \let\crefrange@enumiv@format@last%
      \crefrange@enumiii@format@last}{}%
    \@ifundefined{Crefrange@enumiv@format@last}{%
      \let\Crefrange@enumiv@format@last%
      \Crefrange@enumiii@format@last}{}%
%
    \@ifundefined{cref@enumv@format}{%
      \let\cref@enumv@format%
      \cref@enumiv@format}{}%
    \@ifundefined{Cref@enumv@format}{%
      \let\Cref@enumv@format%
      \Cref@enumiv@format}{}%
    \@ifundefined{crefrange@enumv@format}{%
      \let\crefrange@enumv@format%
      \crefrange@enumiv@format}{}%
    \@ifundefined{Crefrange@enumv@format}{%
      \let\Crefrange@enumv@format%
      \Crefrange@enumiv@format}{}%
    \@ifundefined{cref@enumv@format@first}{%
      \let\cref@enumv@format@first%
      \cref@enumiv@format@first}{}%
    \@ifundefined{Cref@enumv@format@first}{%
      \let\Cref@enumv@format@first%
      \Cref@enumiv@format@first}{}%
    \@ifundefined{cref@enumv@format@second}{%
      \let\cref@enumv@format@second%
      \cref@enumiv@format@second}{}%
    \@ifundefined{Cref@enumv@format@second}{%
      \let\Cref@enumv@format@second%
      \Cref@enumiv@format@second}{}%
    \@ifundefined{cref@enumv@format@middle}{%
      \let\cref@enumv@format@middle%
      \cref@enumiv@format@middle}{}%
    \@ifundefined{Cref@enumv@format@middle}{%
      \let\Cref@enumv@format@middle%
      \Cref@enumiv@format@middle}{}%
    \@ifundefined{cref@enumv@format@last}{%
      \let\cref@enumv@format@last%
      \cref@enumiv@format@last}{}%
    \@ifundefined{Cref@enumv@format@last}{%
      \let\Cref@enumv@format@last%
      \Cref@enumiv@format@last}{}%
    \@ifundefined{crefrange@enumv@format@first}{%
      \let\crefrange@enumv@format@first%
      \crefrange@enumiv@format@first}{}%
    \@ifundefined{Crefrange@enumv@format@first}{%
      \let\Crefrange@enumv@format@first%
      \Crefrange@enumiv@format@first}{}%
    \@ifundefined{crefrange@enumv@format@second}{%
      \let\crefrange@enumv@format@second%
      \crefrange@enumiv@format@second}{}%
    \@ifundefined{Crefrange@enumv@format@second}{%
      \let\Crefrange@enumv@format@second%
      \Crefrange@enumiv@format@second}{}%
    \@ifundefined{crefrange@enumv@format@middle}{%
      \let\crefrange@enumv@format@middle%
      \crefrange@enumiv@format@middle}{}%
    \@ifundefined{Crefrange@enumv@format@middle}{%
      \let\Crefrange@enumv@format@middle%
      \Crefrange@enumiv@format@middle}{}%
    \@ifundefined{crefrange@enumv@format@last}{%
      \let\crefrange@enumv@format@last%
      \crefrange@enumiv@format@last}{}%
    \@ifundefined{Crefrange@enumv@format@last}{%
      \let\Crefrange@enumv@format@last%
      \Crefrange@enumiv@format@last}{}%
%
  \let\cref@language\relax%
}%  end of \AtBeginDocument
%    \end{macrocode}
%
%
% \Finale
\endinput
%%
%% End of file `cleveref.dtx'.

%%% Local Variables:
%%% mode: doctex
%%% TeX-command-default: "Make"
%%% fill-column: 73
%%% TeX-master: t
%%% End:
