% \iffalse meta-comment
%
% Package 'cleveref' to use with LaTeX2e
% Copyright 2007--2009 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 bugreports and suggestions to toby-cleveref@dr-qubit.org
% \fi
%
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{cleveref}
%<package> [2009/12/11 v0.15.3 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{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{8133}
%% \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.}
%
%
% \GetFileInfo{cleveref.sty}
%
% \def\fileversion{0.15.3}
% \def\filedate{11/12/2009}
%
% \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, 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.
% \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 typesetting 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 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 both 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 the formatting of all
% 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\ref
% \package{cleveref} does \emph{not} modify the standard |\ref|
% command\footnote{This is not quite true. The original \cmd{\ref}
%   command no longer works when \package{cleveref} is loaded, so
%   \package{cleveref} redefines it to recover the original behaviour.},
% so you can still use it to type-set the formatted label counter alone,
% without any additional text or formatting.
%
% \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.
%
%
%
% \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:full-control_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.
%
%
%
% \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 German,
% French, Spanish and Italian 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 \cmd{\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 (\cmd{\chapter} or \cmd{\section}, depending on the
% document class), ``subappendix'' for the sectioning command one level
% below (\cmd{\section} or \cmd{\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|. 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}
%
%
% \subsection{Low-Level Customisation: Taking Full Control}
% \label{sec:full-control_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|'s 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.)
%
%
% \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
% (\cmd{\chapter} or \cmd{\section}, depending on the document class),
% ``subappendix'' for the sectioning command one level below
% (\cmd{\section} or \cmd{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} package is 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.
%
%
%
% \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{Currently, only \option{english}, \option{german},
%   \option{ngerman}, \option{french}, \option{spanish} and
%   \option{italian} are supported. 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
% \cmd{\selectlanguage} and \cmd{\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 \cmd{\selectlanguage}
% command or similar will override these customisations, replacing them
% with the defaults for the new language. If you later use
% \cmd{\selectlanguage} to switch back to the main language, your
% customisations 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} 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
% \cmd{\makeatletter} and \cmd{\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 \cmd{\crefrangeformat}, \cmd{\crefmultiformat},
% \cmd{\Crefformat}, etc.
%
%
%
% \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} theorem-like
% environments by the environment name. Occasionally, you may want to
% override the cross-reference type for a particular label. 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, \emph{without} using the
% \package{ntheorem} package\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.}. For example,
% \begin{quote}
%   |\usepackage{aliascnt}|\\
%   |\usepackage{cleveref}|\\
%   |\newaliascnt{lemma}{theorem}|\\
%   |\newtheorem{lemma}[lemma]{Lemma}|\\
%   |\aliascntresetthe{lemma}|\\
%   |\crefname{lemma}{lemma}{lemmas}|
% \end{quote}
%
%
%
% \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 \cmd{\cref} commands
% with the \LaTeX{} code that they would produce, and using the standard
% \cmd{\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 \cmd{\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. The \package{fancyref} package,
% \package{ntheorem}'s \option{thref} option, and \package{varioref}'s
% |\labelformat| command, are incompatible with \package{cleveref}. (Note
% that \package{varioref} \emph{is} fully supported by
% \package{cleveref}, just that \package{cleveref}'s features supersede
% \package{varioref}'s |\labelformat| feature.) However, since
% \package{cleveref} implements a significantly enhanced version of these
% packages' features, this is not really a problem.
%
% \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 \cmd{\vref} and \cmd{\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.
%
% Other packages which alter the \LaTeX{} referencing system are unlikely
% to work properly with \package{cleveref}. (For example, although
% \package{cleveref} fully supports the \package{hyperref} package's
% hyper-link features, the \option{backref} option is not currently
% supported. Similarly, \package{cleveref} is currently incompatible with
% the \package{memoir} class, though some versions are reported to
% partially work.) 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} currently only provides language support for
%   English, German, French, Spanish and Italian. 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} breaks \package{hyperref}'s \option{backref}
%   option, and probably also the \package{backref} package when used as
%   a stand-alone package. (This should be fixed in a future version.)
% \item \package{cleveref} is almost certainly incompatible with
%   \package{titleref}, \package{byname}, \package{nameref} and the
%   like. This shouldn't be difficult to fix, and if you want this
%   feature, then\dots patches are always welcome! (Note that
%   \package{cleveref} \emph{is} compatible with \package{hyperref},
%   despite that fact that this loads \package{nameref}
%   automatically. It's just that the \package{nameref} features won't
%   work.)
% \item Given all the above, it's not surprising that \package{cleveref}
%   is incompatible with the \package{memoir} class, which incorporates
%   many of the above packages. There are some reports of some versions
%   of \package{cleveref} partially working with \package{memoir}, but
%   this should not be considered reliable. Compatibility with
%   \package{memoir} will become a realistic possibility once
%   compatibility with the other packages (listed above) is added.
% \item \package{cleveref} doesn't know about the \package{subfloat}
%   package, so you have to revert to using \cmd{\ref} for
%   cross-references to sub-figures. (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 \cmd{\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 and Philip H\"olzenspies for
% contributing translations. Many people have suggested improvements or
% reported bugs, indeed many have spent significant effort in helping to
% investigate and fix them. So thanks (in alphabetical order) to: Anand
% Deopurkar, Bas Ploeger, Dan Luecking, David Gleich, Donald Arsenau,
% Hendrik Maryns, James Sharam, Jens Mueller, Joel C. Salomon, Joris
% Pinkse, Leo Shidai Liu, Lev Bishop, Matej Batic, 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 someone, 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. (In fact, we write 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{} mechanisms. This involves less
% hacking to get everything else working again, since very few macros
% other than \cmd{\ref} rely on this particular \cmd{\newlabel} argument
% (nor are other packages likely to, given that \package{varioref} plays
% around with it and is a \texttt{required} \LaTeX{} package).
%
%
% \subsection{Redefinitions of \LaTeX{} kernel macros}
% \begin{macro}{\refstepcounter}
% \begin{macro}{\@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 before adding the extra
%   information to \cmd{\@currentlabel}. The new \cmd{\@refstepcounter}
%   can take an optional argument, which overrides the default ``type''
%   inferred from the counter.
%    \begin{macrocode}
\let\cref@old@refstepcounter\refstepcounter
\def\refstepcounter{%
  \@ifnextchar[{\refstepcounter@optarg}{\refstepcounter@noarg}%]
}
\def\refstepcounter@noarg#1{%
  \cref@old@refstepcounter{#1}%
  \cref@constructprefix{#1}{\@result}%
  \protected@edef\@currentlabel{%
    [#1][\arabic{#1}][\@result]%
    \csname p@#1\endcsname\csname the#1\endcsname}}
\def\refstepcounter@optarg[#1]#2{%
  \cref@old@refstepcounter{#2}%
  \cref@constructprefix{#2}{\@result}%
  \protected@edef\@currentlabel{%
    [#1][\arabic{#2}][\@result]\@currentlabel}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\label}
% \begin{macro}{\cref@override@label@type}
%   We redefine the \cmd{\label} command to allow it to take an optional
%   argument that overrides the default reference type in
%   \cmd{\@currentlabel}. We have to postpone this redefinition of
%   \cmd{\label} until the beginning of the document because some other
%   packages do too, and we need to override their
%   redefinitions. \cmd{\cref@override@label@type} is a convenience macro
%   for overriding the label type stored in \cmd{\@currentlabel}.
%    \begin{macrocode}
\def\cref@override@label@type[#1][#2][#3]#4\@nil#5{[#5][#2][#3]#4}
\AtBeginDocument{%
  \let\cref@old@label\label
  \def\label{\@ifnextchar[\label@optarg\cref@old@label}%]
  \def\label@optarg[#1]{%
    \protected@edef\@currentlabel{%
      \expandafter\cref@override@label@type\@currentlabel\@nil{#1}}%
    \cref@old@label}%
%    \end{macrocode}
% \end{macro}
% \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}
    \let\cref@old@make@df@tag@@\make@df@tag@@
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% 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{macro}{subequations}
%    \begin{macrocode}
  \let\cref@old@subequations\subequations%
  \let\cref@old@endsubequations\endsubequations%
  \cref@resetby{equation}{\@result}%
  \ifx\@result\relax\else%
    \@addtoreset{parentequation}{\@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.
%    \begin{macrocode}
    \def\make@df@tag@@#1{%
      \gdef\df@tag{\maketag@@@{#1}%
        \def\@currentlabel{[equation][][]#1}}}
    \def\make@df@tag@@@#1{%
      \gdef\df@tag{\tagform@{#1}%
        \toks@\@xp{\p@equation{#1}}%
          \edef\@currentlabel{[equation][][]\the\toks@}}}
  }{}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\ref}
%   The standard \cmd{\ref} macro spits out whatever was in
%   \cmd{\@currentlabel} when the label was written to the aux file, but
%   this now contains additional information which we don't
%   want. Therefore, we redefine \cmd{\ref} to recover the original
%   behaviour. We have to defer redefinition of \cmd{\ref} till the
%   beginning of the document, in case other packages (such as
%   \package{ntheorem}) modify it after \package{cleveref} is loaded. The
%   apparently pointless \cmd{\cref@reflabel} adds a leyer of indirection
%   to make it easier in case we need to redefine it for
%   \package{hyperref} later.
%    \begin{macrocode}
\def\cref@reflabel#1#2{\@result}
\AtBeginDocument{%
  \DeclareRobustCommand{\ref}{\cref@ref}
  \def\cref@ref#1{%
    \expandafter\ifx\csname r@#1\endcsname\relax%
      \let\@result\relax%
    \else%
      \cref@getlabel{#1}{\@result}%
    \fi%
    \expandafter\@setref\csname r@#1\endcsname{\cref@reflabel}{#1}}%
}
%    \end{macrocode}
% \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}{\@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\@result\@empty%
        \def\@result{2147483647}%
      \else%
        \edef\@result{2147483647,\@result}%
      \fi%
%    \end{macrocode}
%       Override the cross-reference type of sectioning commands.
%    \begin{macrocode}
      \def\@tmpa{##1}%
      \def\@tmpb{section}%
      \ifx\@tmpa\@tmpb%
        \protected@edef\@currentlabel{%
          [appendix][\arabic{##1}][\@result]\@currentlabel}%
      \else%
        \def\@tmpa{##1}%
        \def\@tmpb{subsection}%
        \ifx\@tmpa\@tmpb%
          \protected@edef\@currentlabel{%
            [subappendix][\arabic{##1}][\@result]\@currentlabel}%
        \else%
          \def\@tmpa{##1}%
          \def\@tmpb{subsubsection}%
          \ifx\@tmpa\@tmpb%
            \protected@edef\@currentlabel{%
              [subsubappendix][\arabic{##1}][\@result]%
              \@currentlabel}%
          \else%
            \protected@edef\@currentlabel{%
              [##1][\arabic{##1}][\@result]\@currentlabel}%
          \fi%
        \fi%
      \fi}%
  }{%
    \def\refstepcounter@noarg##1{%
      \cref@old@refstepcounter{##1}%
      \cref@constructprefix{##1}{\@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\@result\@empty%
        \def\@result{2147483647}%
      \else%
        \edef\@result{2147483647,\@result}%
      \fi%
%    \end{macrocode}
%       Override the cross-reference type of sectioning commands.
%    \begin{macrocode}
      \def\@tmpa{##1}%
      \def\@tmpb{chapter}%
      \ifx\@tmpa\@tmpb%
        \protected@edef\@currentlabel{%
          [appendix][\arabic{##1}][\@result]\@currentlabel}%
      \else%
        \def\@tmpa{##1}%
        \def\@tmpb{section}%
        \ifx\@tmpa\@tmpb%
          \protected@edef\@currentlabel{%
            [subappendix][\arabic{##1}][\@result]\@currentlabel}%
        \else%
          \def\@tmpa{##1}%
          \def\@tmpb{subsection}%
          \ifx\@tmpa\@tmpb%
            \protected@edef\@currentlabel{%
              [subsubappendix][\arabic{##1}][\@result]%
              \@currentlabel}%
          \else%
            \def\@tmpa{##1}%
            \def\@tmpb{subsubsection}%
            \ifx\@tmpa\@tmpb%
              \protected@edef\@currentlabel{%
                [subsubsubappendix][\arabic{##1}]%
                [\@result]\@currentlabel}%
            \else%
              \protected@edef\@currentlabel{%
                [##1][\arabic{##1}][\@result]\@currentlabel}%
            \fi%
          \fi%
        \fi%
      \fi}%
  }%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%
% \subsection{Utility Macros}
%
% \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{\@currentlabel}, as written to
%   the aux file and stored in \cmd{\r@\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\@tmpa\csname r@#1\endcsname%
  \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\@tmpa%
    \expandafter\expandafter\expandafter{%
      \expandafter\@firstoftwo\@tmpa}%
  \expandafter\@cref@getlabel\@tmpa\@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\@tmpa\csname r@#1\endcsname%
  \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\@tmpa%
    \expandafter\expandafter\expandafter{%
      \expandafter\@firstoftwo\@tmpa}%
  \expandafter\@cref@gettype\@tmpa\@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\@tmpa\csname r@#1\endcsname%
  \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\@tmpa%
    \expandafter\expandafter\expandafter{%
      \expandafter\@firstoftwo\@tmpa}%
  \expandafter\@cref@getcounter\@tmpa\@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\@tmpa\csname r@#1\endcsname%
  \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\@tmpa%
    \expandafter\expandafter\expandafter{%
      \expandafter\@firstoftwo\@tmpa}%
  \expandafter\@cref@getprefix\@tmpa\@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}
%
% \begin{macro}{\cref@constructprefix}
%   The \cmd{\cref@constructprefix} macro constructs the prefix
%   information stored in \cmd{\@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{\@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{\@tmpstack}%
%    \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\@tmpa{\noexpand{#1\noexpand}}%
  \expandafter\def\expandafter\@tmpa\expandafter{\@tmpa{#2}}%
  \expandafter\@cref@constructprefix\@tmpa%
  \cref@stack@to@list{\@tmpstack}{\@tmpa}%
  \expandafter\def\expandafter#2\expandafter{\@tmpa}}
\def\@cref@constructprefix#1#2{%
  \cref@resetby{#1}{#2}%
  \ifx#2\relax%
  \else%
    \edef\@tmpa{\the\csname c@#2\endcsname}%
    \expandafter\cref@stack@push\expandafter{\@tmpa}{\@tmpstack}%
    \edef\@tmpa{{#2}}%
    \expandafter\expandafter\expandafter\@cref@constructprefix%
      \expandafter\@tmpa\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\@tmpstack#2%
    \newif\if@notthere%
    \@nottheretrue%
    \cref@isstackfull{\@tmpstack}%
    \@whilesw\if@cref@stackfull\fi{%
      \edef\@tmpb{\cref@stack@top{\@tmpstack}}%
      \def\@tmpa{#1}%
      \ifx\@tmpa\@tmpb%
        \@cref@stackfullfalse%
        \@nottherefalse%
      \else%
        \cref@stack@pop{\@tmpstack}%
        \cref@isstackfull{\@tmpstack}%
      \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\@tmpa{\@nil}%
  \ifx#1\@tmpa\@cref@stackemptytrue%
  \else\@cref@stackemptyfalse\fi}
\def\cref@isstackfull#1{%
  \def\@tmpa{\@nil}%
  \ifx#1\@tmpa\@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.
%    \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\@tmpa{\cref@stack@top{#1}}%
    \@whilesw\ifx\@tmpa\@empty\fi{%
      \cref@stack@pull{}{\@sortstack}%
      \cref@stack@pop{#1}%
      \cref@isstackempty{#1}%
      \if@cref@stackempty%
        \let\@tmpa\relax%
      \else%
        \edef\@tmpa{\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\@tmpa{\cref@stack@top{#1}}%
      \@whilesw\ifx\@tmpa\@empty\fi{%
        \edef\@empties{\@empties,}%
        \cref@stack@pop{#1}%
        \cref@isstackempty{#1}%
        \if@cref@stackempty%
          \let\@tmpa\relax%
        \else%
          \edef\@tmpa{\cref@stack@top{#1}}%
        \fi}%
    \fi%
%    \end{macrocode}
% Insert current element into sorted stack, appending any following empty
% elements.
%    \begin{macrocode}
    \edef\@tmpa{{\expandafter\noexpand\@element}%
      {\expandafter\noexpand\@empties}%
      {\noexpand\@sortstack}{\noexpand#2}}%
    \expandafter\cref@stack@insert\@tmpa%
    \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\@tmpa{\cref@stack@top{#4}}%
    \expandafter\@cmp\expandafter{\@tmpa}{#2}{\@result}%
    \ifnum\@result=2\relax%
      \cref@stack@push{#1,#2#3}{#4}%
    \else%
      \cref@stack@pop{#4}%
      \edef\@tmpa{{\noexpand#1,\@tmpa}{\noexpand#2}%
        {\noexpand#3}{\noexpand#4}}%
      \expandafter\def\expandafter\@iterate\expandafter%
        {\expandafter\@cref@stack@insert\@tmpa}%
    \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\@tmpa{#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
% sorts them before a non-empty reference.
%    \begin{macrocode}
  \ifx\@tmpa\@empty%
    \def\@result{1}%
  \else%
    \def\@tmpa{#2}%
    \ifx\@tmpa\@empty%
      \def\@result{2}%
    \else%
%    \end{macrocode}
% Conversely, undefined references come after everything else.
%    \begin{macrocode}
      \expandafter\ifx\csname r@#1\endcsname\relax%
        \def\@result{2}%
      \else%
        \expandafter\ifx\csname r@#2\endcsname\relax%
          \def\@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=\@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\@result{0}%
    \else%
      \def\@result{1}%
    \fi%
  \else%
    \cref@isstackempty{\@countstackb}%
    \if@cref@stackempty%
      \def\@result{2}%
    \else%
      \edef\@tmpa{\cref@stack@top{\@countstacka}}%
      \cref@stack@pop{\@countstacka}%
      \edef\@tmpb{\cref@stack@top{\@countstackb}}%
      \cref@stack@pop{\@countstackb}%
      \ifnum\@tmpa<\@tmpb\relax%
        \def\@result{1}%
      \else%
        \ifnum\@tmpa>\@tmpb\relax%
          \def\@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\@tmpa{#1}%
  \def\@tmpb{subfigure}%
  \ifx\@tmpa\@tmpb%
    \cref@isinresetlist{#1}{figure}%
    \if@cref@inresetlist%
      \def#2{figure}%
    \fi%
  \fi%
  \def\@tmpa{#1}%
  \def\@tmpb{subtable}%
  \ifx\@tmpa\@tmpb%
    \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\@tmpa{#1}%
    \def\@tmpb{equation}%
    \ifx\@tmpa\@tmpb%
      \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\@tmpa{#1}%
  \def\@tmpb{enumii}%
  \ifx\@tmpa\@tmpb%
    \def#2{enum}%
  \fi%
  \def\@tmpb{enumiii}%
  \ifx\@tmpa\@tmpb%
    \def#2{enum}%
  \fi%
  \def\@tmpb{enumiv}%
  \ifx\@tmpa\@tmpb%
    \def#2{enum}%
  \fi%
  \def\@tmpb{enumv}%
  \ifx\@tmpa\@tmpb%
    \def#2{enum}%
  \fi%
  \def\@tmpb{enum}%
  \ifx#2\@tmpb%
    \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@\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}{\@result}%
    \refa@counter=\@result%
    \cref@getcounter{#2}{\@result}%
    \refb@counter=\@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@\@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@\@nextref\endcsname\relax%
          \def\@nexttype{\@undefined}%
          \def\@nextformat{\@undefined}%
        \else%
          \expandafter\cref@gettype\expandafter%
            {\@nextref}{\@nexttype}%
          \def\@tmpa{\@undefined}%
          \ifx\@nexttype\@tmpa%
            \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{\@tmpstack}%
  \edef\@nextref{\cref@stack@top{#1}}%
  \expandafter\ifx\csname r@\@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@\@nextref\endcsname\relax%
        \def\@nexttype{\@undefined}%
        \def\@nextformat{\@undefined}%
      \else%
        \expandafter\cref@gettype\expandafter%
          {\@nextref}{\@nexttype}%
        \def\@tmpa{\@undefined}%
        \ifx\@nexttype\@tmpa%
          \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}{\@tmpstack}%
    \fi%
    \cref@stack@pop{#1}%
    \let\@lasttype\@nexttype%
    \let\@lastformat\@nextformat%
    \cref@isstackfull{#1}}%
  \let#1\@tmpstack}
%    \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@#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@\@nextref\endcsname\relax%
          \@cref@refconsecutivefalse%
        \else%
          \edef\@tmpa{{#2}{\@nextref}}%
          \expandafter\cref@isrefconsecutive\@tmpa%
        \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@\@nextref\endcsname\relax%
            \@cref@refconsecutivefalse%
          \else%
            \edef\@tmpa{{#3}{\@nextref}}%
            \expandafter\cref@isrefconsecutive\@tmpa%
          \fi%
        \fi%
      \fi}%
  \fi}
%    \end{macrocode}
% \end{macro}
%
%
%
% \subsection{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, avoid 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\@tmpa{#2}%
  \expandafter\cref@stack@push\expandafter{\@tmpa}{\@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\@tmpa{{\@beginref}{\@endref}}%
        \if@cref@stackempty%
          \expandafter\@setcrefrange\@tmpa{\cref@variant}{}%
        \else%
          \expandafter\@setcrefrange\@tmpa{\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\@tmpa{{\@beginref}{cref}{\@pos}}%
        \expandafter\@setcref\@tmpa%
      \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\@tmpa{{\@beginref}{\@endref}{cref}{\@pos}}%
          \expandafter\@setcrefrange\@tmpa%
        \fi%
      \fi%
      \@secondreffalse%
      \cref@isstackfull{\@refsubstack}%
    }% end loop over reference substack
    \cref@isstackfull{\@refstack}%
  }% 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@#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%
      \protect\G@refundefinedtrue%
      \nfss@text{\reset@font\bfseries ??}~\@templabel%
      \@latex@warning{\string\Cref \space reference format for label
        type `\@temptype' undefined}%
    \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@#1\endcsname\relax%
      \protect\G@refundefinedtrue%
      \@latex@warning{Reference `#1' on page \thepage \space%
        undefined}%
      \expandafter\ifx\csname r@#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@#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%
          \protect\G@refundefinedtrue%
          \nfss@text{\reset@font\bfseries ??}~\@labela--\@labelb%
          \@latex@warning{#3\space reference range format for label
            type `\@typea' undefined}%
        \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{Types inconsistent in reference range for
              references `#1' and `#2' on page \thepage}%
          \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}
%
%
%
% \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}{\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 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
%   tagged onto the end of the generated macro names.
%    \begin{macrocode}
\def\@crefname#1#2#3#4#5{%
  \begingroup%
    \expandafter\gdef\csname #1@#2@name#5\endcsname{#3}%
    \expandafter\gdef\csname #1@#2@name@plural#5\endcsname{#4}%
%    \end{macrocode}
% The following \cmd{\@tmpa} 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\@tmpa##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}%
    \@tmpa#1\@nil%
%    \end{macrocode}
% If the other capitalisation variant is not already defined...
%    \begin{macrocode}
    \@ifundefined{\@other @#2@name#5}{%
%    \end{macrocode}
% Define \cmd{\@tmpa} and \cmd{@tmpb} to be partial expansions (expanded
% just once) of the macros for the capitalisation variant we've just
% defined above. The \cmd{\@toska} token register just makes the code
% less verbose.
%    \begin{macrocode}
      \expandafter\expandafter\expandafter\def%
      \expandafter\expandafter\expandafter\@tmpa%
      \expandafter\expandafter\expandafter{%
        \csname#1@#2@name\endcsname}%
      \expandafter\expandafter\expandafter\def%
      \expandafter\expandafter\expandafter\@tmpb%
      \expandafter\expandafter\expandafter{%
        \csname#1@#2@name@plural\endcsname}%
%    \end{macrocode}
% Add the \cmd{\@changecase} command to the front of the definitions of
% \cmd{\@tmpa} and \cmd{\@tmpb}.
%    \begin{macrocode}
      \expandafter\expandafter\expandafter\def%
      \expandafter\expandafter\expandafter\@tmpa%
      \expandafter\expandafter\expandafter{%
        \expandafter\@changecase\@tmpa}%
      \expandafter\expandafter\expandafter\def%
      \expandafter\expandafter\expandafter\@tmpb%
      \expandafter\expandafter\expandafter{%
        \expandafter\@changecase\@tmpb}%
%    \end{macrocode}
% Define the other capitalisation variants to be the partial expansions
% (expanded just once) of \cmd{\@tmpa} and \cmd{\@tmpb}.
%    \begin{macrocode}
      \toksdef\@toksa=0%
      \@toksa={%
        \expandafter\gdef\csname\@other @#2@name#5\endcsname}%
      \expandafter\the\expandafter\@toksa\expandafter{\@tmpa}%
      \@toksa={%
        \expandafter\gdef\csname\@other @#2@name@plural#5\endcsname}%
      \expandafter\the\expandafter\@toksa\expandafter{\@tmpb}%
    }{}%
  \endgroup%
%    \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 (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\@tmplabel\cref@default@label%
  }{%
    \expandafter\let\expandafter\@tmplabel%
    \csname cref@#1@label\endcsname%
  }%
%    \end{macrocode}
% Reference range label format.
%    \begin{macrocode}
  \@ifundefined{cref@#1@rangelabel}{%
    \expandafter\def\expandafter\@tmpa\expandafter{%
      \@tmplabel{####1}{####3}{####4}}%
    \expandafter\def\expandafter\@tmpb\expandafter{%
      \@tmplabel{####2}{####5}{####6}}%
    \toksdef\@toksa=0%
    \@toksa={\def\@tmprangelabel##1##2##3##4##5##6}%
    \expandafter\expandafter\expandafter\the%
    \expandafter\expandafter\expandafter\@toksa%
    \expandafter\expandafter\expandafter{%
      \expandafter\expandafter\expandafter\crefrangepreconjunction%
      \expandafter\@tmpa\expandafter\crefrangeconjunction\@tmpb%
      \crefrangepostconjunction}%
  }{%
    \expandafter\let\expandafter\@tmprangelabel%
    \csname cref@#1@rangelabel\endcsname%
  }%
%    \end{macrocode}
% Get the correct number of ``\#'''s into the label format definitions.
%    \begin{macrocode}
  \expandafter\def\expandafter\@tmplabel\expandafter{%
    \@tmplabel{########1}{########2}{########3}}%
  \expandafter\def\expandafter\@tmprangelabel\expandafter{%
    \@tmprangelabel{########1}{########2}{########3}%
    {########4}{########5}{########6}}%
%    \end{macrocode}
% Lower-case singular cross-reference name.
%    \begin{macrocode}
  % \expandafter\expandafter\expandafter\def%
  % \expandafter\expandafter\expandafter\@tmpname%
  % \expandafter\expandafter\expandafter{%
  %   \csname cref@#1@name\endcsname}%
  \expandafter\def\expandafter\@tmpname\expandafter{%
    \csname cref@#1@name\endcsname}%
%    \end{macrocode}
% Upper-case singular cross-reference name.
%    \begin{macrocode}
  % \expandafter\expandafter\expandafter\def%
  % \expandafter\expandafter\expandafter\@tmpName%
  % \expandafter\expandafter\expandafter{%
  %   \csname Cref@#1@name\endcsname}%
  \expandafter\def\expandafter\@tmpName\expandafter{%
    \csname Cref@#1@name\endcsname}%
%    \end{macrocode}
% Lower-case plural cross-reference name.
%    \begin{macrocode}
  \expandafter\def\expandafter\@tmpnameplural\expandafter{%
    \csname cref@#1@name@plural\endcsname}%
%    \end{macrocode}
% Upper-case plural cross-reference name.
%    \begin{macrocode}
  \expandafter\def\expandafter\@tmpNameplural\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} and \cmd{\Crefformat} from
% the components.
%    \begin{macrocode}
    \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\@tmpfirst%
    \expandafter\expandafter\expandafter{%
      \expandafter\@tmpname\expandafter~\@tmplabel}%
    \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\@tmpFirst%
    \expandafter\expandafter\expandafter{%
      \expandafter\@tmpName\expandafter~\@tmplabel}%
%    \end{macrocode}
% Define \cmd{\crefformat} and \cmd{\Crefformat}.
%    \begin{macrocode}
    \toksdef\@toksa=0%
    \@toksa={\crefformat{#1}}%
    \expandafter\the\expandafter\@toksa\expandafter{\@tmpfirst}%
    \@toksa={\Crefformat{#1}}%
    \expandafter\the\expandafter\@toksa\expandafter{\@tmpFirst}%
  \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} and
% \cmd{\Crefrangeformat} from the components.
%    \begin{macrocode}
    \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\@tmpfirst%
    \expandafter\expandafter\expandafter{%
      \expandafter\@tmpnameplural\expandafter~\@tmprangelabel}%
    \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\@tmpFirst%
    \expandafter\expandafter\expandafter{%
      \expandafter\@tmpNameplural\expandafter~\@tmprangelabel}%
%    \end{macrocode}
% Define \cmd{\crefrangeformat} and \cmd{\Crefrangeformat}.
%    \begin{macrocode}
    \toksdef\@toksa=0%
    \@toksa={\crefrangeformat{#1}}%
    \expandafter\the\expandafter\@toksa\expandafter{\@tmpfirst}%
    \@toksa={\Crefrangeformat{#1}}%
    \expandafter\the\expandafter\@toksa\expandafter{\@tmpFirst}%
  \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} and
% \cmd{\Crefmultiformat} from the components.
%    \begin{macrocode}
    \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\@tmpfirst%
    \expandafter\expandafter\expandafter{%
      \expandafter\@tmpnameplural\expandafter~\@tmplabel}%
    \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\@tmpFirst%
    \expandafter\expandafter\expandafter{%
      \expandafter\@tmpNameplural\expandafter~\@tmplabel}%
    % \expandafter\expandafter\expandafter\def%
    % \expandafter\expandafter\expandafter\@tmpsecond%
    % \expandafter\expandafter\expandafter{%
    %   \expandafter\crefpairconjunction\@tmplabel}%
    \expandafter\def\expandafter\@tmpsecond\expandafter{%
      \expandafter\crefpairconjunction\@tmplabel}%
    % \expandafter\expandafter\expandafter\def%
    % \expandafter\expandafter\expandafter\@tmpmiddle%
    % \expandafter\expandafter\expandafter{%
    %   \expandafter\crefmiddleconjunction\@tmplabel}%
    \expandafter\def\expandafter\@tmpmiddle\expandafter{%
      \expandafter\crefmiddleconjunction\@tmplabel}%
    % \expandafter\expandafter\expandafter\def%
    % \expandafter\expandafter\expandafter\@tmplast%
    % \expandafter\expandafter\expandafter{%
    %   \expandafter\creflastconjunction\@tmplabel}%
    \expandafter\def\expandafter\@tmplast\expandafter{%
      \expandafter\creflastconjunction\@tmplabel}%
%    \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{\@tmpfirst}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tmpsecond}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tmpmiddle}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tmplast}}%
    \@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{\@tmpFirst}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tmpsecond}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tmpmiddle}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tmplast}}%
    \@toksa={\Crefmultiformat{#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} and \cmd{\Crefrangemultiformat} from the
% reference components.
%    \begin{macrocode}
    \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\@tmpfirst%
    \expandafter\expandafter\expandafter{%
      \expandafter\@tmpnameplural\expandafter~\@tmprangelabel}%
    \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\@tmpFirst%
    \expandafter\expandafter\expandafter{%
      \expandafter\@tmpNameplural\expandafter~\@tmprangelabel}%
    % \expandafter\expandafter\expandafter\def%
    % \expandafter\expandafter\expandafter\@tmpsecond%
    % \expandafter\expandafter\expandafter{%
    %   \expandafter\crefpairconjunction\@tmprangelabel}%
    \expandafter\def\expandafter\@tmpsecond\expandafter{%
      \expandafter\crefpairconjunction\@tmprangelabel}%
    % \expandafter\expandafter\expandafter\def%
    % \expandafter\expandafter\expandafter\@tmpmiddle%
    % \expandafter\expandafter\expandafter{%
    %   \expandafter\crefmiddleconjunction\@tmprangelabel}%
    \expandafter\def\expandafter\@tmpmiddle\expandafter{%
      \expandafter\crefmiddleconjunction\@tmprangelabel}%
    % \expandafter\expandafter\expandafter\def%
    % \expandafter\expandafter\expandafter\@tmplast%
    % \expandafter\expandafter\expandafter{%
    %   \expandafter\creflastconjunction\@tmprangelabel}%
    \expandafter\def\expandafter\@tmplast\expandafter{%
      \expandafter\creflastconjunction\@tmprangelabel}%
%    \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{\@tmpfirst}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tmpsecond}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tmpmiddle}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tmplast}}%
    \@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{\@tmpFirst}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tmpsecond}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tmpmiddle}}%
    \expandafter\cref@append@toks\expandafter\@toksb\expandafter{%
      \expandafter{\@tmplast}}%
    \@toksa={\Crefrangemultiformat{#1}}%
    \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{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}}
%    \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{\@tmpa} 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\@tmpa##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}%
    \@tmpa#1\@nil%
%    \end{macrocode}
% If the other capitalisation variant is not already defined...
%    \begin{macrocode}
    \@ifundefined{\@other @#2@format}{%
%    \end{macrocode}
% Define \cmd{\@tmpa} 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\@tmpa##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{\@tmpa}.
%    \begin{macrocode}
      \expandafter\expandafter\expandafter\the%
      \expandafter\expandafter\expandafter\@toksa%
      \expandafter\expandafter\expandafter{%
        \expandafter\@changecase\@tmpa{##1}{##2}{##3}}%
%    \end{macrocode}
% Define the other capitalisation variant to be the partial expansion
% (expanded just once) of \cmd{\@tmpa}.
%    \begin{macrocode}
      \@toksa={%
        \expandafter\gdef\csname\@other @#2@format\endcsname##1##2##3}%
      \expandafter\the\expandafter\@toksa\expandafter{%
        \@tmpa{##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{\@tmpa} 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\@tmpa##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}%
    \@tmpa#1\@nil%
%    \end{macrocode}
% If the other capitalisation variant is not already defined...
%    \begin{macrocode}
    \@ifundefined{\@other @#2@format}{%
%    \end{macrocode}
% Define \cmd{\@tmpa} 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\@tmpa##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{\@tmpa}.
%    \begin{macrocode}
      \expandafter\expandafter\expandafter\the%
      \expandafter\expandafter\expandafter\@toksa%
      \expandafter\expandafter\expandafter{%
        \expandafter\@changecase\@tmpa{##1}{##2}{##3}{##4}{##5}{##6}}%
%    \end{macrocode}
% Define the other capitalisation variant to be the partial expansion
% (expanded just once) of \cmd{\@tmpa}.
%    \begin{macrocode}
      \@toksa={\expandafter\gdef%
        \csname\@other @#2@format\endcsname##1##2##3##4##5##6}%
      \expandafter\the\expandafter\@toksa\expandafter{%
        \@tmpa{##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{\@tmpa} 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\@tmpa##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}%
    \@tmpa#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{\@tmpa} 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\@tmpa##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{\@tmpa}.
%    \begin{macrocode}
      \expandafter\expandafter\expandafter\the%
      \expandafter\expandafter\expandafter\@toksa%
      \expandafter\expandafter\expandafter{%
        \expandafter\@changecase\@tmpa{##1}{##2}{##3}}%
%    \end{macrocode}
% Define the other capitalisation variant to be the partial expansion
% (expanded just once) of \cmd{\@tmpa}.
%    \begin{macrocode}
      \@toksa={%
        \expandafter\gdef\csname\@other @#2@format@first\endcsname%
          ##1##2##3}%
      \expandafter\the\expandafter\@toksa\expandafter{%
        \@tmpa{##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{\@tmpa} 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\@tmpa##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}%
    \@tmpa#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{\@tmpa} 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\@tmpa##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{\@tmpa}.
%    \begin{macrocode}
      \expandafter\expandafter\expandafter\the%
      \expandafter\expandafter\expandafter\@toksa%
      \expandafter\expandafter\expandafter{%
        \expandafter\@changecase\@tmpa{##1}{##2}{##3}{##4}{##5}{##6}}%
%    \end{macrocode}
% Define the other capitalisation variant to be the partial expansion
% (expanded just once) of \cmd{\@tmpa}.
%    \begin{macrocode}
      \@toksa={%
        \expandafter\gdef\csname\@other @#2@format@first\endcsname%
          ##1##2##3##4##5##6}%
      \expandafter\the\expandafter\@toksa\expandafter{%
        \@tmpa{##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}
% \begin{macro}{backref}
%   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}
\@ifpackageloaded{hyperref}{%
  \PackageInfo{cleveref}{`hyperref' support loaded}
  \@ifpackagewith{hyperref}{backref}{%
    \PackageError{cleveref}{`cleveref' is currently incompatible with
      `hyperref's `backref' option}{Remove the `backref' option from
      `hyperref' if you want to use `cleveref'}}{}
%    \end{macrocode}
% \begin{macro}{\cref@reflabel}
% \begin{macro}{\cref@getlabel}
% \begin{macro}{\cref@gettype}
% \begin{macro}{\cref@getcounter}
% \begin{macro}{\cref@getprefix}
%   We redefine the utility macros to cope with the extra arguments
%   supplied by hyperref (via the aux file).
%    \begin{macrocode}
  \def\cref@reflabel#1#2#3#4#5{\@result}
  \def\cref@hyperref#1{\expandafter\expandafter\expandafter%
    \@fourthoffive\csname r@#1\endcsname}
  \def\cref@getlabel#1#2{%
    \expandafter\let\expandafter\@tmpa\csname r@#1\endcsname%
    \expandafter\expandafter\expandafter\def%
      \expandafter\expandafter\expandafter\@tmpa%
      \expandafter\expandafter\expandafter{%
        \expandafter\@firstoffive\@tmpa}%
    \expandafter\@cref@getlabel\@tmpa\@nil#2}
  \def\cref@gettype#1#2{%
    \expandafter\let\expandafter\@tmpa\csname r@#1\endcsname%
    \expandafter\expandafter\expandafter\def%
      \expandafter\expandafter\expandafter\@tmpa%
      \expandafter\expandafter\expandafter{%
        \expandafter\@firstoffive\@tmpa}%
    \expandafter\@cref@gettype\@tmpa\@nil#2}
  \def\cref@getcounter#1#2{%
    \expandafter\let\expandafter\@tmpa\csname r@#1\endcsname%
    \expandafter\expandafter\expandafter\def%
      \expandafter\expandafter\expandafter\@tmpa%
      \expandafter\expandafter\expandafter{%
        \expandafter\@firstoffive\@tmpa}%
    \expandafter\@cref@getcounter\@tmpa\@nil#2}
  \def\cref@getprefix#1#2{%
    \expandafter\let\expandafter\@tmpa\csname r@#1\endcsname%
    \expandafter\expandafter\expandafter\def%
      \expandafter\expandafter\expandafter\@tmpa%
      \expandafter\expandafter\expandafter{%
        \expandafter\@firstoffive\@tmpa}%
    \expandafter\@cref@getprefix\@tmpa\@nil#2}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\H@refstepcounter}
%   The \package{hyperref} package stores the original
%   \cmd{\refstepcounter} definition as\linebreak[4]
%   \cmd{\H@refstepcounter}, which we therefore need to modify so that it
%   adds the extra information to \cmd{\@currentlabel}.
%    \begin{macrocode}
  \def\H@refstepcounter#1{%
    \stepcounter{#1}%
    \cref@constructprefix{#1}{\@result}%
    \protected@edef\@currentlabel{%
      [#1][\arabic{#1}][\@result]%
      \csname p@#1\endcsname\csname the#1\endcsname}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\refstepcounter@noarg}
% \begin{macro}{\refstepcounter@optarg}
%   The original \cmd{\refstepcounter}, as stored earlier in\linebreak[4]
%   \cmd{\cref@old@refstepcounter}, already calls \cmd{\H@refstepcounter}
%   if \package{hyperref} is loaded, and we just redefined the latter to
%   store the type information. So we only need to change
%   \cmd{\@currentlabel} in our \cmd{\refstepcounter} if an optional
%   argument was supplied.
%    \begin{macrocode}
  \def\refstepcounter@noarg#1{\cref@old@refstepcounter{#1}}
  \def\refstepcounter@optarg[#1]#2{%
    \cref@old@refstepcounter{#2}%
    \expandafter\@cref@getlabel\@currentlabel\@nil{\@tmplabel}%
    \cref@constructprefix{#2}{\@tmpreset}%
    \protected@edef\@currentlabel{%
      [#1][\arabic{#2}][\@tmpreset]\@tmplabel}}
%    \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{%
        \stepcounter{##1}%
        \cref@constructprefix{##1}{\@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\@result\@empty%
          \def\@result{2147483647}%
        \else%
          \edef\@result{2147483647,\@result}%
        \fi%
%    \end{macrocode}
%       Override the cross-reference type of sectioning commands.
%    \begin{macrocode}
        \def\@tmpa{##1}%
        \def\@tmpb{section}%
        \ifx\@tmpa\@tmpb%
          \protected@edef\@currentlabel{%
            [appendix][\arabic{##1}][\@result]%
            \csname p@##1\endcsname\csname the##1\endcsname}%
        \else%
          \def\@tmpa{##1}%
          \def\@tmpb{subsection}%
          \ifx\@tmpa\@tmpb%
            \protected@edef\@currentlabel{%
              [subappendix][\arabic{##1}][\@result]%
              \csname p@##1\endcsname\csname the##1\endcsname}%
          \else%
            \def\@tmpa{##1}%
            \def\@tmpb{subsubsection}%
            \ifx\@tmpa\@tmpb%
              \protected@edef\@currentlabel{%
                [subsubappendix][\arabic{##1}][\@result]%
                \csname p@##1\endcsname\csname the##1\endcsname}%
            \else%
              \protected@edef\@currentlabel{%
                [##1][\arabic{##1}][\@result]%
                \csname p@##1\endcsname\csname the##1\endcsname}%
            \fi%
          \fi%
        \fi}%
    }{%
      \def\H@refstepcounter##1{%
        \stepcounter{##1}%
        \cref@constructprefix{##1}{\@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\@result\@empty%
          \def\@result{2147483647}%
        \else%
          \edef\@result{2147483647,\@result}%
        \fi%
%    \end{macrocode}
%       Override the cross-reference type of sectioning commands.
%    \begin{macrocode}
        \def\@tmpa{##1}%
        \def\@tmpb{chapter}%
        \ifx\@tmpa\@tmpb%
          \protected@edef\@currentlabel{%
            [appendix][\arabic{##1}][\@result]%
            \csname p@##1\endcsname\csname the##1\endcsname}%
        \else%
          \def\@tmpa{##1}%
          \def\@tmpb{section}%
          \ifx\@tmpa\@tmpb%
            \protected@edef\@currentlabel{%
              [subappendix][\arabic{##1}][\@result]%
              \csname p@##1\endcsname\csname the##1\endcsname}%
          \else%
            \def\@tmpa{##1}%
            \def\@tmpb{subsection}%
            \ifx\@tmpa\@tmpb%
              \protected@edef\@currentlabel{%
                [subsubappendix][\arabic{##1}][\@result]%
                \csname p@##1\endcsname\csname the##1\endcsname}%
            \else%
              \def\@tmpa{##1}%
              \def\@tmpb{subsubsection}%
              \ifx\@tmpa\@tmpb%
                \protected@edef\@currentlabel{%
                  [subsubsubappendix][\arabic{##1}][\@result]%
                  \csname p@##1\endcsname\csname the##1\endcsname}%
              \else%
                \protected@edef\@currentlabel{%
                  [##1][\arabic{##1}][\@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@\meta{label}} (via the aux file) by
%   \package{hyperref}.
%    \begin{macrocode}
  \def\@@setcref#1#2{%
    \cref@getlabel{#2}{\@tmplabel}%
    \if@crefstarred%
      #1{\@tmplabel}{}{}%
    \else%
      \edef\@tmplink{\cref@hyperref{#2}}%
      #1{\@tmplabel}{\hyper@linkstart{link}{\@tmplink}}{\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{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\ref*}
%   Redefine \cmd{\ref} command to provide a starred variant with the
%   same behaviour as \package{hyperref}'s \cmd{\ref*}. As before, we
%   defer the redefinition until the beginning of the document, to ensure
%   it `takes'. (\package{hyperref} stores the original \cmd{\@setref} in
%   \cmd{\real@setref}.)
%  \begin{macrocode}
  \AtBeginDocument{%
   \DeclareRobustCommand{\ref}{\@ifstar\cref@refstar\cref@ref}
   \def\cref@refstar#1{%
     \expandafter\ifx\csname r@#1\endcsname\relax%
       \let\@result\relax%
     \else%
       \cref@getlabel{#1}{\@result}%
     \fi%
     \expandafter\real@setref\csname r@#1\endcsname{%
       \cref@reflabel}{#1}}%
 }
}{}%  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}%  <<<<<
    \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
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
% \subsection{\package{amsthm} Support}
% \begin{macro}{amsthm}
% \begin{macro}{\@thm}
%   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}
%   We modify \package{amsthm}'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}
\let\@thmnoarg\@thm
\def\@thm{\@ifnextchar[{\@thmoptarg}{\@thmnoarg}}%]
\def\@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}%
    \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}.
%    \begin{macrocode}
\def\@ynthm#1[#2]#3{%
  \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 of \@ifpackageloaded
%    \end{macrocode}
% \end{macro}
% \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 %
      $\backslash$labelformat command, which will not work}
  \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\@tmpstack{#2,\@nil}%
        \cref@stack@topandbottom{\@tmpstack}{\@firstref}{\@lastref}%
        \ifx\@lastref\@empty%
          \vpageref[\unskip]{#2}%
        \else%
          \edef\@tmpa{{\@firstref}{\@lastref}}%
          \expandafter\def\expandafter\@tmpa\expandafter{%
            \expandafter[\expandafter\unskip\expandafter]%
            \@tmpa}%
          \expandafter\vpagerefrange\@tmpa%
        \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\@tmpstack{#2,\@nil}%
        \cref@stack@topandbottom{\@tmpstack}{\@firstref}{\@lastref}%
        \ifx\@lastref\@empty%
          \reftextfaraway{#2}%
        \else%
          \expandafter\vrefpagenum\expandafter%
            \@tmpa\expandafter{\@firstref}%
          \expandafter\vrefpagenum\expandafter%
            \@tmpb\expandafter{\@lastref}%
          \ifx\@tmpa\@tmpb%
            \expandafter\reftextfaraway\expandafter{\@firstref}%
          \else%
            \edef\@tmpa{{\@firstref}{\@lastref}}%
            \expandafter\reftextpagerange\@tmpa%
          \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%
      \@ifpackageloaded{hyperref}{%
        \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}
      }{%
        \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 \AtBeginDocument
 }{}%  end of \@ifpackageloaded
%   \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}{forreign@language}
%   If \package{babel} is loaded, we add to the \cmd{\select@language}
%   and \cmd{\forreign@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@forreign@language\forreign@language
      \def\forreign@language{%
        \@cref@switched@languagetrue%
        \cref@writelanguagerules%
        \cref@old@forreign@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\forreign@language\cref@old@forreign@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\@tmpa\expandafter{%
        \expandafter{\@address}{\string\crefrangeconjunction}}%
      \expandafter\cref@writescript\@tmpa%
      \expandafter\def\expandafter\cref@poorman@text\expandafter{%
        \crefrangepreconjunction}%
      \expandafter\def\expandafter\@tmpa\expandafter{%
        \expandafter{\@address}{\string\crefrangepreconjunction}}%
      \expandafter\cref@writescript\@tmpa%
      \expandafter\def\expandafter\cref@poorman@text\expandafter{%
        \crefrangepostconjunction}%
      \expandafter\def\expandafter\@tmpa\expandafter{%
        \expandafter{\@address}{\string\crefrangepostconjunction}}%
      \expandafter\cref@writescript\@tmpa%
      \expandafter\def\expandafter\cref@poorman@text\expandafter{%
        \crefpairconjunction}%
      \expandafter\def\expandafter\@tmpa\expandafter{%
        \expandafter{\@address}{\string\crefpairconjunction}}%
      \expandafter\cref@writescript\@tmpa%
      \expandafter\def\expandafter\cref@poorman@text\expandafter{%
        \crefmiddleconjunction}%
      \expandafter\def\expandafter\@tmpa\expandafter{%
        \expandafter{\@address}{\string\crefmiddleconjunction}}%
      \expandafter\cref@writescript\@tmpa%
      \expandafter\def\expandafter\cref@poorman@text\expandafter{%
        \creflastconjunction}%
      \expandafter\def\expandafter\@tmpa\expandafter{%
        \expandafter{\@address}{\string\creflastconjunction}}%
      \expandafter\cref@writescript\@tmpa%
      \expandafter\def\expandafter\cref@poorman@text\expandafter{%
        \crefpairgroupconjunction}%
      \expandafter\def\expandafter\@tmpa\expandafter{%
        \expandafter{\@address}{\string\crefpairgroupconjunction}}%
      \expandafter\cref@writescript\@tmpa%
      \expandafter\def\expandafter\cref@poorman@text\expandafter{%
        \crefmiddlegroupconjunction}%
      \expandafter\def\expandafter\@tmpa\expandafter{%
        \expandafter{\@address}{\string\crefmiddlegroupconjunction}}%
      \expandafter\cref@writescript\@tmpa%
      \expandafter\def\expandafter\cref@poorman@text\expandafter{%
        \creflastgroupconjunction}%
      \expandafter\def\expandafter\@tmpa\expandafter{%
        \expandafter{\@address}{\string\creflastgroupconjunction}}%
      \expandafter\cref@writescript\@tmpa%
%    \end{macrocode}
% We write substitution rules for all component-derived cross-reference
% formats, as listed in \cmd{\cref@label@types}.
%    \begin{macrocode}
      \let\@tmpstack\cref@label@types%
      \cref@isstackfull{\@tmpstack}%
      \@whilesw\if@cref@stackfull\fi{%
%    \end{macrocode}
% \cmd{\cref@}\meta{type}|@name| substitution rules.
%    \begin{macrocode}
        \edef\@tmpa{\cref@stack@top{\@tmpstack}}%
        \expandafter\expandafter\expandafter\def%
        \expandafter\expandafter\expandafter\cref@poorman@text%
        \expandafter\expandafter\expandafter{%
          \csname cref@\@tmpa @name\endcsname}%
        \edef\@tmpa{%
          \string\cref@\expandafter\noexpand\@tmpa @name\space}%
        \expandafter\expandafter\expandafter\def%
        \expandafter\expandafter\expandafter\@tmpa%
        \expandafter\expandafter\expandafter{%
          \expandafter\expandafter\expandafter{%
            \expandafter\@address\expandafter}%
          \expandafter{\@tmpa}}%
        \expandafter\cref@writescript\@tmpa%
%    \end{macrocode}
% \cmd{\cref@}\meta{type}|@name@plural| substitution rules.
%    \begin{macrocode}
        \edef\@tmpa{\cref@stack@top{\@tmpstack}}%
        \expandafter\expandafter\expandafter\def%
        \expandafter\expandafter\expandafter\cref@poorman@text%
        \expandafter\expandafter\expandafter{%
          \csname cref@\@tmpa @name@plural\endcsname}%
        \edef\@tmpa{%
          \string\cref@\expandafter\noexpand\@tmpa%
          @name@plural\space}%
        \expandafter\expandafter\expandafter\def%
        \expandafter\expandafter\expandafter\@tmpa%
        \expandafter\expandafter\expandafter{%
          \expandafter\expandafter\expandafter{%
            \expandafter\@address\expandafter}%
          \expandafter{\@tmpa}}%
        \expandafter\cref@writescript\@tmpa%
%    \end{macrocode}
% \cmd{\Cref@}\meta{type}|@name| substitution rules.
%    \begin{macrocode}
        \edef\@tmpa{\cref@stack@top{\@tmpstack}}%
        \expandafter\expandafter\expandafter\def%
        \expandafter\expandafter\expandafter\cref@poorman@text%
        \expandafter\expandafter\expandafter{%
          \csname Cref@\@tmpa @name\endcsname}%
        \edef\@tmpa{%
          \string\Cref@\expandafter\noexpand\@tmpa @name\space}%
        \expandafter\expandafter\expandafter\def%
        \expandafter\expandafter\expandafter\@tmpa%
        \expandafter\expandafter\expandafter{%
          \expandafter\expandafter\expandafter%
          {\expandafter\@address\expandafter}%
          \expandafter{\@tmpa}}%
        \expandafter\cref@writescript\@tmpa%
%    \end{macrocode}
% \cmd{\Cref@}\meta{type}|@name@plural| substitution rules.
%    \begin{macrocode}
        \edef\@tmpa{\cref@stack@top{\@tmpstack}}%
        \expandafter\expandafter\expandafter\def%
        \expandafter\expandafter\expandafter\cref@poorman@text%
        \expandafter\expandafter\expandafter{%
          \csname Cref@\@tmpa @name@plural\endcsname}%
        \edef\@tmpa{%
          \string\Cref@\expandafter\noexpand\@tmpa%
          @name@plural\space}%
        \expandafter\expandafter\expandafter\def%
        \expandafter\expandafter\expandafter\@tmpa%
        \expandafter\expandafter\expandafter{%
          \expandafter\expandafter\expandafter%
          {\expandafter\@address\expandafter}%
          \expandafter{\@tmpa}}%
        \expandafter\cref@writescript\@tmpa%
%    \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{\@tmpstack}%
        \cref@isstackfull{\@tmpstack}}%
    \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 \@tmpa%
      \ifx\@tmpa\@eof%
        \@not@eoffalse%
      \else%
        \@not@eoftrue%
        \edef\@tmpa{\@tmpa}%
      \fi%
      \@whilesw\if@not@eof\fi{%
        \expandafter\g@addto@macro\expandafter%
          \cref@poorman@text\expandafter{\@tmpa^^J}%
        \immediate\read\@crefscript to \@tmpa%
        \ifx\@tmpa\@eof%
          \@not@eoffalse%
        \else%
          \@not@eoftrue%
          \edef\@tmpa{\@tmpa}%
        \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\@tmpa{%[
          s/||label|[[^]]*|]/||label/g}}
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tmpa^^J}%
      \lowercase{\edef\@tmpa{s/||usepackage|(|[.*|]|)|<0,1|><cleveref>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tmpa^^J}%
      \lowercase{\edef\@tmpa{s/||[cC]refformat<.*><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tmpa^^J}%
      \lowercase{\edef\@tmpa{s/||[cC]refrangeformat<.*><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tmpa^^J}%
      \lowercase{\edef\@tmpa{s/||[cC]refmultiformat<.*><.*><.*><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tmpa^^J}%
      \lowercase{\edef\@tmpa{%
          s/||[cC]refrangemultiformat<.*><.*><.*><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tmpa^^J}%
      \lowercase{\edef\@tmpa{s/||[cC]refname<.*><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tmpa^^J}%
      \lowercase{\edef\@tmpa{s/||[cC]reflabelformat<.*><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tmpa^^J}%
      \lowercase{\edef\@tmpa{s/||[cC]refrangelabelformat<.*><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tmpa^^J}%
      \lowercase{\edef\@tmpa{s/||[cC]refdefaultlabelformat<.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tmpa^^J}%
      \lowercase{\edef\@tmpa{%
          s/||renewcommand<||crefpairconjunction><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tmpa^^J}%
      \lowercase{\edef\@tmpa{%
          s/||renewcommand<||crefpairgroupconjunction><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tmpa^^J}%
      \lowercase{\edef\@tmpa{%
          s/||renewcommand<||crefmiddleconjunction><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tmpa^^J}%
      \lowercase{\edef\@tmpa{%
          s/||renewcommand<||crefmiddlegroupconjunction><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tmpa^^J}%
      \lowercase{\edef\@tmpa{%
          s/||renewcommand<||creflastconjunction><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tmpa^^J}%
      \lowercase{\edef\@tmpa{%
          s/||renewcommand<||creflastgroupconjunction><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tmpa^^J}%
      \lowercase{\edef\@tmpa{s/||renewcommand<||[cC]ref><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tmpa^^J}%
      \lowercase{\edef\@tmpa{s/||renewcommand<||[cC]refrange><.*>//g}}%
      \expandafter\g@addto@macro\expandafter%
        \cref@poorman@text\expandafter{\@tmpa^^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\@tmpa{\cref@getmeaning{\cref@poorman@text}}%
    \immediate\write\@crefscript{#1 s/#2/\@tmpa/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{\@tmpa} 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{\@tmpa} macro.
%    \begin{macrocode}
  \@ifpackageloaded{hyperref}{%
    \def\@crefnostar#1#2{%
      \gdef\cref@poorman@text{}%
      \@cref{#1}{#2}%
      \def\@tmpa##1##2\@nil{%
        \if##1c%
          \cref@writescript{}{\string\cref\string{#2\string}}%
        \else%
          \cref@writescript{}{\string\Cref\string{#2\string}}%
        \fi}%
      \@tmpa#1\@nil}
    \def\@crefstar#1#2{%
      \gdef\cref@poorman@text{}%
      \@crefstarredtrue\@cref{#1}{#2}\@crefstarredfalse%
      \def\@tmpa##1##2\@nil{%
        \if##1c%
          \cref@writescript{}{\string\cref*\string{#2\string}}%
        \else%
          \cref@writescript{}{\string\Cref*\string{#2\string}}%
        \fi}%
      \@tmpa#1\@nil}
    \def\@crefrangenostar#1#2#3{%
      \gdef\cref@poorman@text{}%
      \@setcrefrange{#2}{#3}{#1}{}%
      \def\@tmpa##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}%
      \@tmpa#1\@nil}
    \def\@crefrangestar#1#2#3{%
      \gdef\cref@poorman@text{}%
      \@crefstarredtrue\@setcrefrange{#2}{#3}{#1}{}\@crefstarredfalse%
      \def\@tmpa##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}%
      \@tmpa#1\@nil}
%
  }{%
    \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}}}
  }
%    \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\@tmpstack{#2,\@nil}%
          \cref@stack@topandbottom{\@tmpstack}{\@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\@tmpa{{\@firstref}{\@lastref}}%
            \expandafter\def\expandafter\@tmpa\expandafter{%
              \expandafter[\expandafter\unskip\expandafter]%
              \@tmpa}%
            \expandafter\vpagerefrange\@tmpa%
            \expandafter\g@addto@macro\expandafter\cref@poorman@text%
              \expandafter{\expandafter\vpagerefrange\@tmpa}%
          \fi%
          \def\@tmpa##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}%
          \@tmpa#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\@tmpa##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}%
        \@tmpa#1\@nil}
%
      \def\cref@fullref#1#2{%
        \gdef\cref@poorman@text{}%
        \begingroup%
          \@cref{#1}{#2} % space here is deliberate
          \def\@tmpstack{#2,\@nil}%
          \cref@stack@topandbottom{\@tmpstack}{\@firstref}{\@lastref}%
          \ifx\@lastref\@empty%
            \reftextfaraway{#2}%
            \def\@pageref{\reftextfaraway{#1}}%
          \else%
            \expandafter\vrefpagenum\expandafter%
              \@tmpa\expandafter{\@firstref}%
            \expandafter\vrefpagenum\expandafter%
              \@tmpb\expandafter{\@lastref}%
            \ifx\@tmpa\@tmpb%
              \expandafter\reftextfaraway\expandafter{\@firstref}%
              \expandafter\def\expandafter\@pageref\expandafter{%
                \expandafter\reftextfaraway\expandafter{\@firstref}}%
            \else%
              \edef\@tmpa{{\@firstref}{\@lastref}}%
              \expandafter\reftextpagerange\@tmpa%
              \expandafter\def\expandafter\@pageref\expandafter{%
                \expandafter\reftextpagerange\@tmpa}%
            \fi%
          \fi%
          \g@addto@macro\cref@poorman@text{ }%
          \expandafter\g@addto@macro\expandafter\cref@poorman@text%
            \expandafter{\@pageref}%
          \def\@tmpa##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}%
          \@tmpa#1\@nil%
        \endgroup}
    }% end of \AtBeginDocument
  }{}% end of \@ifpackageloaded
%    \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}}
  \@ifpackageloaded{hyperref}{%
    \def\@@setcref#1#2{%
      \cref@getlabel{#2}{\@tmplabel}%
      \if@crefstarred%
        #1{\@tmplabel}{}{}%
        \expandafter\g@addto@macro\expandafter\cref@poorman@text%
          \expandafter{#1{\ref*{#2}}{}{}}%
      \else%
        \edef\@tmplink{\cref@hyperref{#2}}%
        #1{\@tmplabel}{\hyper@linkstart{link}{\@tmplink}}%
          {\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}
  }{%
    \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}}{}{}{}{}}}
  }
}%  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)}}
%    \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~}%
    \def\crefrangepreconjunction@preamble{}%
    \def\crefrangepostconjunction@preamble{}%
    \def\crefpairconjunction@preamble{ and~}%
    \def\crefmiddleconjunction@preamble{, }%
    \def\creflastconjunction@preamble{ and~}%
%    \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~}%
    \def\crefmiddlegroupconjunction@preamble{, }%
    \def\creflastgroupconjunction@preamble{, and~}%
    \Crefname@preamble{equation}{Equation}{Equations}%
    \Crefname@preamble{chapter}{Chapter}{Chapters}%
    \Crefname@preamble{section}{Section}{Sections}%
    \Crefname@preamble{appendix}{Appendix}{Appendices}%
    \Crefname@preamble{figure}{Figure}{Figures}%
    \Crefname@preamble{table}{Table}{Tables}%
    \Crefname@preamble{theorem}{Theorem}{Theorems}%
    \Crefname@preamble{enumi}{Item}{Items}%
    \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}%
    \if@cref@capitalise%
      \crefname@preamble{equation}{Eq.}{Eqs.}%
      \crefname@preamble{chapter}{Chapter}{Chapters}%
      \crefname@preamble{section}{Section}{Sections}%
      \crefname@preamble{appendix}{Appendix}{Appendices}%
      \crefname@preamble{figure}{Fig.}{Figs.}%
      \crefname@preamble{table}{Table}{Tables}%
      \crefname@preamble{theorem}{Theorem}{Theorems}%
      \crefname@preamble{enumi}{Item}{Items}%
      \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}%
    \else%
      \crefname@preamble{equation}{eq.}{eqs.}%
      \crefname@preamble{chapter}{chapter}{chapters}%
      \crefname@preamble{section}{section}{sections}%
      \crefname@preamble{appendix}{appendix}{appendices}%
      \crefname@preamble{figure}{fig.}{figs.}%
      \crefname@preamble{table}{table}{tables}%
      \crefname@preamble{theorem}{theorem}{theorems}%
      \crefname@preamble{enumi}{item}{items}%
      \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}%
    \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~}%
      \renewcommand\crefrangepreconjunction{}%
      \renewcommand\crefrangepostconjunction{}%
      \renewcommand{\crefpairconjunction}{ and~}%
      \renewcommand{\crefmiddleconjunction}{, }%
      \renewcommand{\creflastconjunction}{ and~}%
      \renewcommand{\crefpairgroupconjunction}{ and~}%
      \renewcommand{\crefmiddlegroupconjunction}{, }%
      \renewcommand{\creflastgroupconjunction}{, and~}%
      \Crefname{equation}{Equation}{Equations}%
      \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{figure}{Figure}{Figures}%
      \Crefname{subfigure}{Figure}{Figures}%
      \Crefname{table}{Table}{Tables}%
      \Crefname{subtable}{Table}{Tables}%
      \Crefname{theorem}{Theorem}{Theorems}%
      \Crefname{enumi}{Item}{Items}%
      \Crefname{enumii}{Item}{Items}%
      \Crefname{enumiii}{Item}{Items}%
      \Crefname{enumiv}{Item}{Items}%
      \Crefname{enumv}{Item}{Items}%
      \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}%
      \if@cref@capitalise%
        \crefname{equation}{Eq.}{Eqs.}%
        \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{figure}{Fig.}{Figs.}%
        \crefname{subfigure}{Fig.}{Figs.}%
        \crefname{table}{Table}{Tables}%
        \crefname{subtable}{Table}{Tables}%
        \crefname{theorem}{Theorem}{Theorems}%
        \crefname{enumi}{Item}{Items}%
        \crefname{enumii}{Item}{Items}%
        \crefname{enumiii}{Item}{Items}%
        \crefname{enumiv}{Item}{Items}%
        \crefname{enumv}{Item}{Items}%
        \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}%
      \else%
        \crefname{equation}{eq.}{eqs.}%
        \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{figure}{fig.}{figs.}%
        \crefname{subfigure}{fig.}{figs.}%
        \crefname{table}{table}{tables}%
        \crefname{subtable}{table}{tables}%
        \crefname{theorem}{theorem}{theorems}%
        \crefname{enumi}{item}{items}%
        \crefname{enumii}{item}{items}%
        \crefname{enumiii}{item}{items}%
        \crefname{enumiv}{item}{items}%
        \crefname{enumv}{item}{items}%
        \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}%
      \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~}%
    \def\crefrangepreconjunction@preamble{}%
    \def\crefrangepostconjunction@preamble{}%
    \def\crefpairconjunction@preamble{ und~}%
    \def\crefmiddleconjunction@preamble{, }%
    \def\creflastconjunction@preamble{ und~}%
%    \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~}%
    \def\crefmiddlegroupconjunction@preamble{, }%
    \def\creflastgroupconjunction@preamble{ und~}%
    \Crefname@preamble{equation}{Gleichung}{Gleichungen}%
    \Crefname@preamble{chapter}{Kapitel}{Kapitel}%
    \Crefname@preamble{section}{Abschnitt}{Abschnitte}%
    \Crefname@preamble{appendix}{Anhang}{Anh\"ange}%
    \Crefname@preamble{figure}{Abbildung}{Abbildungen}%
    \Crefname@preamble{table}{Tabelle}{Tabellen}%
    \Crefname@preamble{theorem}{Theorem}{Theoremen}%
    \Crefname@preamble{enumi}{Punkt}{Punkte}%
    \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}%
    \if@cref@capitalise%
      \crefname@preamble{equation}{Gleichung}{Gleichungen}%
      \crefname@preamble{chapter}{Kapitel}{Kapitel}%
      \crefname@preamble{section}{Abschnitt}{Abschnitte}%
      \crefname@preamble{appendix}{Anhang}{Anh\"ange}%
      \crefname@preamble{figure}{Abbildung}{Abbildungen}%
      \crefname@preamble{table}{Tabelle}{Tabellen}%
      \crefname@preamble{theorem}{Theorem}{Theoremen}%
      \crefname@preamble{enumi}{Punkt}{Punkte}%
      \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}%
    \else%
      \crefname@preamble{equation}{Gleichung}{Gleichungen}%
      \crefname@preamble{chapter}{Kapitel}{Kapitel}%
      \crefname@preamble{section}{Abschnitt}{Abschnitte}%
      \crefname@preamble{appendix}{Anhang}{Anh\"ange}%
      \crefname@preamble{figure}{Abbildung}{Abbildungen}%
      \crefname@preamble{table}{Tabelle}{Tabellen}%
      \crefname@preamble{theorem}{Theorem}{Theoremen}%
      \crefname@preamble{enumi}{Punkt}{Punkte}%
      \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}%
    \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~}%
      \renewcommand\crefrangepreconjunction{}%
      \renewcommand\crefrangepostconjunction{}%
      \renewcommand{\crefpairconjunction}{ und~}%
      \renewcommand{\crefmiddleconjunction}{, }%
      \renewcommand{\creflastconjunction}{ und~}%
      \renewcommand{\crefpairgroupconjunction}{ und~}%
      \renewcommand{\crefmiddlegroupconjunction}{, }%
      \renewcommand{\creflastgroupconjunction}{ und~}%
      \Crefname{equation}{Gleichung}{Gleichungen}%
      \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{figure}{Abbildung}{Abbildungen}%
      \Crefname{subfigure}{Abbildung}{Abbildungen}%
      \Crefname{table}{Tabelle}{Tabellen}%
      \Crefname{subtable}{Tabelle}{Tabellen}%
      \Crefname{theorem}{Theorem}{Theoremen}%
      \Crefname{enumi}{Punkt}{Punkte}%
      \Crefname{enumii}{Punkt}{Punkte}%
      \Crefname{enumiii}{Punkt}{Punkte}%
      \Crefname{enumiv}{Punkt}{Punkte}%
      \Crefname{enumv}{Punkt}{Punkte}%
      \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}%
      \if@cref@capitalise%
        \crefname{equation}{Gleichung}{Gleichungen}%
        \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{figure}{Abbildung}{Abbildungen}%
        \crefname{subfigure}{Abbildung}{Abbildungen}%
        \crefname{table}{Tabelle}{Tabellen}%
        \crefname{subtable}{Tabelle}{Tabellen}%
        \crefname{theorem}{Theorem}{Theoremen}%
        \crefname{enumi}{Punkt}{Punkte}%
        \crefname{enumii}{Punkt}{Punkte}%
        \crefname{enumiii}{Punkt}{Punkte}%
        \crefname{enumiv}{Punkt}{Punkte}%
        \crefname{enumv}{Punkt}{Punkte}%
        \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}%
      \else%
        \crefname{equation}{Gleichung}{Gleichungen}%
        \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{figure}{Abbildung}{Abbildungen}%
        \crefname{subfigure}{Abbildung}{Abbildungen}%
        \crefname{table}{Tabelle}{Tabellen}%
        \crefname{subtable}{Tabelle}{Tabellen}%
        \crefname{theorem}{Theorem}{Theoremen}%
        \crefname{enumi}{Punkt}{Punkte}%
        \crefname{enumii}{Punkt}{Punkte}%
        \crefname{enumiii}{Punkt}{Punkte}%
        \crefname{enumiv}{Punkt}{Punkte}%
        \crefname{enumv}{Punkt}{Punkte}%
        \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}%
      \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~}%
      \renewcommand\crefrangepreconjunction{}%
      \renewcommand\crefrangepostconjunction{}%
      \renewcommand{\crefpairconjunction}{ und~}%
      \renewcommand{\crefmiddleconjunction}{, }%
      \renewcommand{\creflastconjunction}{ und~}%
      \renewcommand{\crefpairgroupconjunction}{ und~}%
      \renewcommand{\crefmiddlegroupconjunction}{, }%
      \renewcommand{\creflastgroupconjunction}{ und~}%
      \Crefname{equation}{Gleichung}{Gleichungen}%
      \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{figure}{Abbildung}{Abbildungen}%
      \Crefname{subfigure}{Abbildung}{Abbildungen}%
      \Crefname{table}{Tabelle}{Tabellen}%
      \Crefname{subtable}{Tabelle}{Tabellen}%
      \Crefname{theorem}{Theorem}{Theoremen}%
      \Crefname{enumi}{Punkt}{Punkte}%
      \Crefname{enumii}{Punkt}{Punkte}%
      \Crefname{enumiii}{Punkt}{Punkte}%
      \Crefname{enumiv}{Punkt}{Punkte}%
      \Crefname{enumv}{Punkt}{Punkte}%
      \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}%
      \if@cref@capitalise%
        \crefname{equation}{Gleichung}{Gleichungen}%
        \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{figure}{Abbildung}{Abbildungen}%
        \crefname{subfigure}{Abbildung}{Abbildungen}%
        \crefname{table}{Tabelle}{Tabellen}%
        \crefname{subtable}{Tabelle}{Tabellen}%
        \crefname{theorem}{Theorem}{Theoremen}%
        \crefname{enumi}{Punkt}{Punkte}%
        \crefname{enumii}{Punkt}{Punkte}%
        \crefname{enumiii}{Punkt}{Punkte}%
        \crefname{enumiv}{Punkt}{Punkte}%
        \crefname{enumv}{Punkt}{Punkte}%
        \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}%
      \else%
        \crefname{equation}{Gleichung}{Gleichungen}%
        \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{figure}{Abbildung}{Abbildungen}%
        \crefname{subfigure}{Abbildung}{Abbildungen}%
        \crefname{table}{Tabelle}{Tabellen}%
        \crefname{subtable}{Tabelle}{Tabellen}%
        \crefname{theorem}{Theorem}{Theoremen}%
        \crefname{enumi}{Punkt}{Punkte}%
        \crefname{enumii}{Punkt}{Punkte}%
        \crefname{enumiii}{Punkt}{Punkte}%
        \crefname{enumiv}{Punkt}{Punkte}%
        \crefname{enumv}{Punkt}{Punkte}%
        \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}%
      \fi%
    }}}
%    \end{macrocode}
%
% \begin{macro}{german}
%   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~}%
    \def\crefrangepreconjunction@preamble{}%
    \def\crefrangepostconjunction@preamble{}%
    \def\crefpairconjunction@preamble{ en~}%
    \def\crefmiddleconjunction@preamble{, }%
    \def\creflastconjunction@preamble{ en~}%
%    \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~}%
    \def\crefmiddlegroupconjunction@preamble{, }%
    \def\creflastgroupconjunction@preamble{ en~}%
    \Crefname@preamble{equation}%
      {Ver\-ge\-l\ij{}k\-ing}{Ver\-ge\-l\ij{}k\-ing\-en}%
    \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{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}%
    \if@cref@capitalise%
      \crefname@preamble{equation}{Verg.}{Verg's.}%
      \crefname@preamble{chapter}{Hoofdstuk}{Hoofdstukken}%
      \crefname@preamble{section}{Paragraaf}{Paragrafen}%
      \crefname@preamble{appendix}{Appendix}{Appendices}%
      \crefname@preamble{figure}{Fig.}{Fig's.}%
      \crefname@preamble{table}{Tabel}{Tabellen}%
      \crefname@preamble{theorem}{Theorema}{Theorema's}%
      \crefname@preamble{enumi}{Punt}{Punten}%
      \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}%
    \else%
      \crefname@preamble{equation}{verg.}{verg's.}%
      \crefname@preamble{chapter}{hoofdstuk}{hoofdstukken}%
      \crefname@preamble{section}{paragraaf}{paragrafen}%
      \crefname@preamble{appendix}{appendix}{appendices}%
      \crefname@preamble{figure}{fig.}{fig's.}%
      \crefname@preamble{table}{tabel}{tabellen}%
      \crefname@preamble{theorem}{theorema}{theorema's}%
      \crefname@preamble{enumi}{punt}{punten}%
      \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}%
    \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~}%
      \renewcommand\crefrangepreconjunction{}%
      \renewcommand\crefrangepostconjunction{}%
      \renewcommand{\crefpairconjunction}{ en~}%
      \renewcommand{\crefmiddleconjunction}{, }%
      \renewcommand{\creflastconjunction}{ en~}%
      \renewcommand{\crefpairgroupconjunction}{ en~}%
      \renewcommand{\crefmiddlegroupconjunction}{, }%
      \renewcommand{\creflastgroupconjunction}{ en~}%
      \Crefname{equation}{Ver\-ge\-l\ij{}k\-ing}{Ver\-ge\-l\ij{}k\-ing\-en}%
      \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{figure}{Figuur}{Figuren}%
      \Crefname{subfigure}{Figuur}{Figuren}%
      \Crefname{table}{Tabel}{Tabellen}%
      \Crefname{subtable}{Tabel}{Tabellen}%
      \Crefname{theorem}{Theorema}{Theorema's}%
      \Crefname{enumi}{Punt}{Punten}%
      \Crefname{enumii}{Punt}{Punten}%
      \Crefname{enumiii}{Punt}{Punten}%
      \Crefname{enumiv}{Punt}{Punten}%
      \Crefname{enumv}{Punt}{Punten}%
      \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}%
      \if@cref@capitalise%
        \crefname{equation}{Verg.}{Verg's.}%
        \crefname{chapter}{Hoofdstuk}{Hoofdstukken}%
        \crefname{section}{Paragraaf}{Paragrafen}%
        \crefname{appendix}{Appendix}{Appendices}%
        \crefname{figure}{Fig.}{Fig's.}%
        \crefname{table}{Tabel}{Tabellen}%
        \crefname{theorem}{Theorema}{Theorema's}%
        \crefname{enumi}{Punt}{Punten}%
        \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}%
      \else%
        \crefname{equation}{verg.}{verg's.}%
        \crefname{chapter}{hoofdstuk}{hoofdstukken}%
        \crefname{section}{paragraaf}{paragrafen}%
        \crefname{appendix}{appendix}{appendices}%
        \crefname{figure}{fig.}{fig's.}%
        \crefname{table}{tabel}{tabellen}%
        \crefname{theorem}{theorema}{theorema's}%
        \crefname{enumi}{punt}{punten}%
        \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}%
      \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~}%
    \def\crefrangepreconjunction@preamble{}%
    \def\crefrangepostconjunction@preamble{}%
    \def\crefpairconjunction@preamble{ et~}%
    \def\crefmiddleconjunction@preamble{, }%
    \def\creflastconjunction@preamble{ et~}%
%    \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 Franch speaker.
%    \begin{macrocode}
    \def\crefpairgroupconjunction@preamble{ et~}%
    \def\crefmiddlegroupconjunction@preamble{, }%
    \def\creflastgroupconjunction@preamble{, et~}%
    \Crefname@preamble{equation}{{\'E}quation}{{\'E}quations}%
    \Crefname@preamble{chapter}{Chapitre}{Chapitres}%
    \Crefname@preamble{section}{Section}{Sections}%
    \Crefname@preamble{appendix}{Appendice}{Appendices}%
    \Crefname@preamble{figure}{Figure}{Figures}%
    \Crefname@preamble{table}{Tableau}{Tableaux}%
    \Crefname@preamble{theorem}{Th\'eor\`eme}{Th\'eor\`emes}%
    \Crefname@preamble{enumi}{Point}{Points}%
    \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}%
    \if@cref@capitalise%
      \crefname@preamble{equation}{{\'E}quation}{{\'E}quations}%
      \crefname@preamble{chapter}{Chapitre}{Chapitres}%
      \crefname@preamble{section}{Section}{Sections}%
      \crefname@preamble{appendix}{Appendice}{Appendices}%
      \crefname@preamble{figure}{Figure}{Figures}%
      \crefname@preamble{table}{Tableau}{Tableaux}%
      \crefname@preamble{theorem}{Th\'eor\`eme}{Th\'eor\`emes}%
      \crefname@preamble{enumi}{Point}{Points}%
      \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}%
    \else%
      \crefname@preamble{equation}{{\'e}quation}{{\'e}quations}%
      \crefname@preamble{chapter}{chapitre}{chapitres}%
      \crefname@preamble{section}{section}{sections}%
      \crefname@preamble{appendix}{appendice}{appendices}%
      \crefname@preamble{figure}{figure}{figures}%
      \crefname@preamble{table}{tableau}{tableaux}%
      \crefname@preamble{theorem}{th\'eor\`eme}{th\'eor\`emes}%
      \crefname@preamble{enumi}{point}{points}%
      \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}%
    \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~}%
      \renewcommand\crefrangepreconjunction{}%
      \renewcommand\crefrangepostconjunction{}%
      \renewcommand{\crefpairconjunction}{ et~}%
      \renewcommand{\crefmiddleconjunction}{, }%
      \renewcommand{\creflastconjunction}{ et~}%
      \renewcommand{\crefpairgroupconjunction}{ et~}%
      \renewcommand{\crefmiddlegroupconjunction}{, }%
      \renewcommand{\creflastgroupconjunction}{ et~}%
      \Crefname{equation}{{\'E}quation}{{\'E}quations}%
      \Crefname{chapter}{Chapitre}{Chapitres}%
      \Crefname{section}{Section}{Sections}%
      \Crefname{subsection}{Section}{Sections}%
      \Crefname{subsubsection}{Section}{Sections}%
      \Crefname{appendix}{Appendice}{Appendices}%
      \Crefname{subappendix}{Appendice}{Appendices}%
      \Crefname{subsubappendix}{Appendice}{Appendices}%
      \Crefname{subsubsubappendix}{Appendice}{Appendices}%
      \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{enumi}{Point}{Points}%
      \Crefname{enumii}{Point}{Points}%
      \Crefname{enumiii}{Point}{Points}%
      \Crefname{enumiv}{Point}{Points}%
      \Crefname{enumv}{Point}{Points}%
      \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}%
      \if@cref@capitalise%
        \crefname{equation}{{\'E}quation}{{\'E}quations}%
        \crefname{chapter}{Chapitre}{Chapitres}%
        \crefname{section}{Section}{Sections}%
        \crefname{subsection}{Section}{Sections}%
        \crefname{subsubsection}{Section}{Sections}%
        \crefname{appendix}{Appendice}{Appendices}%
        \crefname{subappendix}{Appendice}{Appendices}%
        \crefname{subsubappendix}{Appendice}{Appendices}%
        \crefname{subsubsubappendix}{Appendice}{Appendices}%
        \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{enumi}{Point}{Points}%
        \crefname{enumii}{Point}{Points}%
        \crefname{enumiii}{Point}{Points}%
        \crefname{enumiv}{Point}{Points}%
        \crefname{enumv}{Point}{Points}%
        \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}%
      \else%
        \crefname{equation}{{\'e}quation}{{\'e}quations}%
        \crefname{chapter}{chapitre}{chapitres}%
        \crefname{section}{section}{sections}%
        \crefname{subsection}{section}{sections}%
        \crefname{subsubsection}{section}{sections}%
        \crefname{appendix}{appendice}{appendices}%
        \crefname{subappendix}{appendice}{appendices}%
        \crefname{subsubappendix}{appendice}{appendices}%
        \crefname{subsubsubappendix}{appendice}{appendices}%
        \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{enumi}{point}{points}%
        \crefname{enumii}{point}{points}%
        \crefname{enumiii}{point}{points}%
        \crefname{enumiv}{point}{points}%
        \crefname{enumv}{point}{points}%
        \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}%
      \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~}%
    \def\crefrangepreconjunction@preamble{}%
    \def\crefrangepostconjunction@preamble{}%
    \def\crefpairconjunction@preamble{ y~}%
    \def\crefmiddleconjunction@preamble{, }%
    \def\creflastconjunction@preamble{ y~}%
    \def\crefpairgroupconjunction@preamble{ y~}%
    \def\crefmiddlegroupconjunction@preamble{, }%
    \def\creflastgroupconjunction@preamble{ y~}%
    \Crefname@preamble{equation}{Ecuaci\'on}{Ecuaciones}%
    \Crefname@preamble{chapter}{Cap\'itulo}{Cap\'itulos}%
    \Crefname@preamble{section}{Secci\'on}{Secciones}%
    \Crefname@preamble{appendix}{Ap\'endice}{Ap\'endices}%
    \Crefname@preamble{figure}{Figura}{Figuras}%
    \Crefname@preamble{table}{Cuadro}{Cuadros}%
    \Crefname@preamble{theorem}{Teorema}{Teoremas}%
    \Crefname@preamble{enumi}{Punto}{Puntos}%
    \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}%
    \if@cref@capitalise%
      \crefname@preamble{equation}{Ecuaci\'on}{ecuaciones}%
      \crefname@preamble{chapter}{Cap\'itulo}{cap\'itulos}%
      \crefname@preamble{section}{Secci\'on}{secciones}%
      \crefname@preamble{appendix}{Ap\'endice}{ap\'endices}%
      \crefname@preamble{figure}{Figura}{figuras}%
      \crefname@preamble{table}{Cuadro}{cuadros}%
      \crefname@preamble{theorem}{Teorema}{teoremas}%
      \crefname@preamble{enumi}{Punto}{puntos}%
      \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}%
    \else%
      \crefname@preamble{equation}{ecuaci\'on}{ecuaciones}%
      \crefname@preamble{chapter}{cap\'itulo}{cap\'itulos}%
      \crefname@preamble{section}{secci\'on}{secciones}%
      \crefname@preamble{appendix}{ap\'endice}{ap\'endices}%
      \crefname@preamble{figure}{figura}{figuras}%
      \crefname@preamble{table}{cuadro}{cuadros}%
      \crefname@preamble{theorem}{teorema}{teoremas}%
      \crefname@preamble{enumi}{punto}{puntos}%
      \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}%
    \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~}%
      \renewcommand{\crefrangepreconjunction}{}%
      \renewcommand{\crefrangepostconjunction}{}%
      \renewcommand{\crefpairconjunction}{ y~}%
      \renewcommand{\crefmiddleconjunction}{, }%
      \renewcommand{\creflastconjunction}{ y~}%
      \renewcommand{\crefpairgroupconjunction}{ y~}%
      \renewcommand{\crefmiddlegroupconjunction}{, }%
      \renewcommand{\creflastgroupconjunction}{ y~}%
      \Crefname{equation}{Ecuaci\'on}{Ecuaciones}%
      \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{figure}{Figura}{Figuras}%
      \Crefname{subfigure}{Figura}{Figuras}%
      \Crefname{table}{Cuadro}{Cuadros}%
      \Crefname{subtable}{Cuadro}{Cuadros}%
      \Crefname{theorem}{Teorema}{Teoremas}%
      \Crefname{enumi}{Punto}{Puntos}%
      \Crefname{enumii}{Punto}{Puntos}%
      \Crefname{enumiii}{Punto}{Puntos}%
      \Crefname{enumiv}{Punto}{Puntos}%
      \Crefname{enumv}{Punto}{Puntos}%
      \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}%
      \if@cref@capitalise%
        \crefname{equation}{Ecuaci\'on}{Ecuaciones}%
        \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{figure}{Figura}{Figuras}%
        \crefname{subfigure}{Figura}{Figuras}%
        \crefname{table}{Cuadro}{Cuadros}%
        \crefname{subtable}{Cuadro}{Cuadros}%
        \crefname{theorem}{Teorema}{Teoremas}%
        \crefname{enumi}{Punto}{Puntos}%
        \crefname{enumii}{Punto}{Puntos}%
        \crefname{enumiii}{Punto}{Puntos}%
        \crefname{enumiv}{Punto}{Puntos}%
        \crefname{enumv}{Punto}{Puntos}%
        \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}%
      \else%
        \crefname{equation}{ecuaci\'on}{ecuaciones}%
        \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{figure}{figura}{figuras}%
        \crefname{subfigure}{figura}{figuras}%
        \crefname{table}{cuadro}{cuadros}%
        \crefname{subtable}{cuadro}{cuadros}%
        \crefname{theorem}{teorema}{teoremas}%
        \crefname{enumi}{punto}{puntos}%
        \crefname{enumii}{punto}{puntos}%
        \crefname{enumiii}{punto}{puntos}%
        \crefname{enumiv}{punto}{puntos}%
        \crefname{enumv}{punto}{puntos}%
        \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}%
      \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~}%
    \def\crefrangepreconjunction@preamble{da~}%
    \def\crefrangepostconjunction@preamble{}%
    \def\crefpairconjunction@preamble{ e~}%
    \def\crefmiddleconjunction@preamble{, }%
    \def\creflastconjunction@preamble{ e~}%
%    \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~}%
    \def\crefmiddlegroupconjunction@preamble{, }%
    \def\creflastgroupconjunction@preamble{ e~}%
    \Crefname@preamble{equation}{Equazione}{Equazioni}%
    \Crefname@preamble{chapter}{Capitolo}{Capitoli}%
    \Crefname@preamble{section}{Sezione}{Sezioni}%
    \Crefname@preamble{appendix}{Appendice}{Appendici}%
    \Crefname@preamble{figure}{Figura}{Figure}%
    \Crefname@preamble{table}{Tabella}{Tabelle}%
    \Crefname@preamble{theorem}{Teorema}{Teoremi}%
    \Crefname@preamble{enumi}{Voce}{Voci}%
    \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}%
    \if@cref@capitalise%
      \crefname@preamble{equation}{Eq.}{Eq.}%
      \crefname@preamble{chapter}{Capitolo}{Capitoli}%
      \crefname@preamble{section}{Sezione}{Sezioni}%
      \crefname@preamble{appendix}{Appendice}{Appendici}%
      \crefname@preamble{figure}{Fig.}{Fig.}%
      \crefname@preamble{table}{Tabella}{Tabelle}%
      \crefname@preamble{theorem}{Teorema}{Teoremi}%
      \crefname@preamble{enumi}{Voce}{Voci}%
      \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}%
    \else%
      \crefname@preamble{equation}{eq.}{eq.}%
      \crefname@preamble{chapter}{capitolo}{capitoli}%
      \crefname@preamble{section}{sezione}{sezioni}%
      \crefname@preamble{appendix}{appendice}{appendici}%
      \crefname@preamble{figure}{fig.}{fig.}%
      \crefname@preamble{table}{tabella}{tabelle}%
      \crefname@preamble{theorem}{teorema}{teoremi}%
      \crefname@preamble{enumi}{voce}{voci}%
      \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}%
    \fi%
    \def\cref@language{italiano}%
%    \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}{ a~}%
      \renewcommand\crefrangepreconjunction{da~}%
      \renewcommand\crefrangepostconjunction{}%
      \renewcommand{\crefpairconjunction}{ e~}%
      \renewcommand{\crefmiddleconjunction}{, }%
      \renewcommand{\creflastconjunction}{ e~}%
      \renewcommand{\crefpairgroupconjunction}{ e~}%
      \renewcommand{\crefmiddlegroupconjunction}{, }%
      \renewcommand{\creflastgroupconjunction}{ e~}%
      \Crefname{equation}{Equazione}{Equazioni}%
      \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{figure}{Figura}{Figure}%
      \Crefname{subfigure}{Figura}{Figure}%
      \Crefname{table}{Tabella}{Tabelle}%
      \Crefname{subtable}{Tabella}{Tabelle}%
      \Crefname{theorem}{Teorema}{Teoremi}%
      \Crefname{enumi}{Voce}{Voci}%
      \Crefname{enumii}{Voce}{Voci}%
      \Crefname{enumiii}{Voce}{Voci}%
      \Crefname{enumiv}{Voce}{Voci}%
      \Crefname{enumv}{Voce}{Voci}%
      \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}%
      \if@cref@capitalise%
        \crefname{equation}{Eq.}{Eq.}%
        \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{figure}{Fig.}{Fig.}%
        \crefname{subfigure}{Fig.}{Fig.}%
        \crefname{table}{Tabella}{Tabelle}%
        \crefname{subtable}{Tabella}{Tabelle}%
        \crefname{theorem}{Teorema}{Teoremi}%
        \crefname{enumi}{Voce}{Voci}%
        \crefname{enumii}{Voce}{Voci}%
        \crefname{enumiii}{Voce}{Voci}%
        \crefname{enumiv}{Voce}{Voci}%
        \crefname{enumv}{Voce}{Voci}%
        \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}%
      \else%
        \crefname{equation}{eq.}{eq.}%
        \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{figure}{fig.}{fig.}%
        \crefname{subfigure}{fig.}{fig.}%
        \crefname{table}{tabella}{tabelle}%
        \crefname{subtable}{tabella}{tabelle}%
        \crefname{theorem}{teorema}{teoremi}%
        \crefname{enumi}{voce}{voci}%
        \crefname{enumii}{voce}{voci}%
        \crefname{enumiii}{voce}{voci}%
        \crefname{enumiv}{voce}{voci}%
        \crefname{enumv}{voce}{voci}%
        \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}%
      \fi%
    }}}
%    \end{macrocode}
%
%
%
% \subsubsection{Default Cross-Reference Formats}
% \label{sec:code:default_formats}
% Setup default English 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.
%    \begin{macrocode}
  \edef\@tmpa{%
    \expandafter\noexpand\csname extras\cref@language\endcsname}%
  \@ifundefined{crefrangeconjunction}{%
    \let\crefrangeconjunction\crefrangeconjunction@preamble%
  }{%
    \expandafter\def\expandafter\@tmpb\expandafter{%
      \expandafter\renewcommand\expandafter%
      {\expandafter\crefrangeconjunction\expandafter}%
      \expandafter{\crefrangeconjunction}}%
    \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\@tmpa\expandafter{\@tmpb}%
  }%
  \@ifundefined{crefrangepreconjunction}{%
    \let\crefrangepreconjunction\crefrangepreconjunction@preamble%
  }{%
    \expandafter\def\expandafter\@tmpb\expandafter{%
      \expandafter\renewcommand\expandafter%
      {\expandafter\crefrangepreconjunction\expandafter}%
      \expandafter{\crefrangepreconjunction}}%
    \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\@tmpa\expandafter{\@tmpb}%
  }%
  \@ifundefined{crefrangepostconjunction}{%
    \let\crefrangepostconjunction\crefrangepostconjunction@preamble%
  }{%
    \expandafter\def\expandafter\@tmpb\expandafter{%
      \expandafter\renewcommand\expandafter%
      {\expandafter\crefrangepostconjunction\expandafter}%
      \expandafter{\crefrangepostconjunction}}%
    \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\@tmpa\expandafter{\@tmpb}%
  }%
  \@ifundefined{crefpairconjunction}{%
    \let\crefpairconjunction\crefpairconjunction@preamble%
  }{%
    \expandafter\def\expandafter\@tmpb\expandafter{%
      \expandafter\renewcommand\expandafter%
      {\expandafter\crefpairconjunction\expandafter}%
      \expandafter{\crefpairconjunction}}%
    \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\@tmpa\expandafter{\@tmpb}%
  }%
  \@ifundefined{crefmiddleconjunction}{%
    \let\crefmiddleconjunction\crefmiddleconjunction@preamble%
  }{%
    \expandafter\def\expandafter\@tmpb\expandafter{%
      \expandafter\renewcommand\expandafter%
      {\expandafter\crefmiddleconjunction\expandafter}%
      \expandafter{\crefmiddleconjunction}}%
    \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\@tmpa\expandafter{\@tmpb}%
  }%
  \@ifundefined{creflastconjunction}{%
    \let\creflastconjunction\creflastconjunction@preamble%
  }{%
    \expandafter\def\expandafter\@tmpb\expandafter{%
      \expandafter\renewcommand\expandafter%
      {\expandafter\creflastconjunction\expandafter}%
      \expandafter{\creflastconjunction}}%
    \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\@tmpa\expandafter{\@tmpb}%
  }%
  \@ifundefined{crefpairgroupconjunction}{%
    \let\crefpairgroupconjunction%
      \crefpairgroupconjunction@preamble%
  }{%
    \expandafter\def\expandafter\@tmpb\expandafter{%
      \expandafter\renewcommand\expandafter%
      {\expandafter\crefpairgroupconjunction\expandafter}%
      \expandafter{\crefpairgroupconjunction}}%
    \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\@tmpa\expandafter{\@tmpb}%
  }%
  \@ifundefined{crefmiddlegroupconjunction}{%
    \let\crefmiddlegroupconjunction%
      \crefmiddlegroupconjunction@preamble%
  }{%
    \expandafter\def\expandafter\@tmpb\expandafter{%
      \expandafter\renewcommand\expandafter%
      {\expandafter\crefpairmiddleconjunction\expandafter}%
      \expandafter{\crefpairmiddleconjunction}}%
    \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\@tmpa\expandafter{\@tmpb}%
  }%
  \@ifundefined{creflastgroupconjunction}{%
    \let\creflastgroupconjunction%
      \creflastgroupconjunction@preamble%
  }{%
    \expandafter\def\expandafter\@tmpb\expandafter{%
      \expandafter\renewcommand\expandafter%
      {\expandafter\crefpairlastconjunction\expandafter}%
      \expandafter{\crefpairlastconjunction}}%
    \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\@tmpa\expandafter{\@tmpb}%
  }%
% \end{macrocode}
% If the group conjunctions haven't been defined, define them to be
% identical to the reference conjunctions.
%    \begin{macrocode}
  \@ifundefined{crefpairgroupconjunction}{%
    \let\crefpairgroupconjunction\crefpairconjunction}{}%
  \@ifundefined{crefmiddlegroupconjunction}{%
    \let\crefmiddlegroupconjunction\crefmiddleconjunction}{}%
%    \end{macrocode}
% Define the last group conjunction to include an extra comma.
%    \begin{macrocode}
  \@ifundefined{creflastgroupconjunction}{%
    \edef\creflastgroupconjunction{, \creflastconjunction}}{}%
%    \end{macrocode}
%
% Define any undefined formats listed in \cmd{\cref@label@types} using
% the components.
%    \begin{macrocode}
  \let\@tmpstack\cref@label@types%
  \cref@isstackfull{\@tmpstack}%
  \@whilesw\if@cref@stackfull\fi{%
    \edef\@tmpa{\cref@stack@top{\@tmpstack}}%
    \@ifundefined{cref@\@tmpa @name}{%
      \expandafter\def\expandafter\@tmpb\expandafter{%
        \csname cref@\@tmpa @name\endcsname}%
      \expandafter\def\expandafter\@tmpc\expandafter{%
        \csname cref@\@tmpa @name@preamble\endcsname}%
      \expandafter\expandafter\expandafter\let\expandafter\@tmpb\@tmpc%
      \expandafter\def\expandafter\@tmpb\expandafter{%
        \csname cref@\@tmpa @name@plural\endcsname}%
      \expandafter\def\expandafter\@tmpc\expandafter{%
        \csname cref@\@tmpa @name@plural@preamble\endcsname}%
      \expandafter\expandafter\expandafter\let\expandafter\@tmpb\@tmpc%
    }{%
      \edef\@tmpb{%
        \expandafter\noexpand\csname extras\cref@language\endcsname}%
      \expandafter\def\expandafter\@tmpc\expandafter{%
        \expandafter\crefname\expandafter{\@tmpa}}%
      \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\expandafter\expandafter\@tmpc%
      \expandafter\expandafter\expandafter{%
        \expandafter\expandafter\expandafter{%
          \csname cref@\@tmpa @name\endcsname}}%
      \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\expandafter\expandafter\@tmpc%
      \expandafter\expandafter\expandafter{%
        \expandafter\expandafter\expandafter{%
          \csname cref@\@tmpa @name@plural\endcsname}}%
      \expandafter\expandafter\expandafter\cref@addto%
        \expandafter\@tmpb\expandafter{\@tmpc}%
    }%
    \@ifundefined{Cref@\@tmpa @name}{%
      \expandafter\def\expandafter\@tmpb\expandafter{%
        \csname Cref@\@tmpa @name\endcsname}%
      \expandafter\def\expandafter\@tmpc\expandafter{%
        \csname Cref@\@tmpa @name@preamble\endcsname}%
      \expandafter\expandafter\expandafter\let\expandafter\@tmpb\@tmpc%
      \expandafter\def\expandafter\@tmpb\expandafter{%
        \csname Cref@\@tmpa @name@plural\endcsname}%
      \expandafter\def\expandafter\@tmpc\expandafter{%
        \csname Cref@\@tmpa @name@plural@preamble\endcsname}%
      \expandafter\expandafter\expandafter\let\expandafter\@tmpb\@tmpc%
    }{%
      \edef\@tmpb{%
        \expandafter\noexpand\csname extras\cref@language\endcsname}%
      \expandafter\def\expandafter\@tmpc\expandafter{%
        \expandafter\Crefname\expandafter{\@tmpa}}%
      \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\expandafter\expandafter\@tmpc%
      \expandafter\expandafter\expandafter{%
        \expandafter\expandafter\expandafter{%
          \csname Cref@\@tmpa @name\endcsname}}%
      \expandafter\expandafter\expandafter\cref@addto%
      \expandafter\expandafter\expandafter\@tmpc%
      \expandafter\expandafter\expandafter{%
        \expandafter\expandafter\expandafter{%
          \csname Cref@\@tmpa @name@plural\endcsname}}%
      \expandafter\expandafter\expandafter\cref@addto%
        \expandafter\@tmpb\expandafter{\@tmpc}%
    }%
    \@ifundefined{cref@\@tmpa @format}{%
      \expandafter\@crefdefineformat\expandafter{\@tmpa}}{}%
    \@ifundefined{crefrange@\@tmpa @format}{%
      \expandafter\@crefrangedefineformat\expandafter{\@tmpa}}{}%
    \@ifundefined{cref@\@tmpa @format@first}{%
      \expandafter\@crefdefinemultiformat\expandafter{\@tmpa}}{}%
    \@ifundefined{crefrange@\@tmpa @format@first}{%
      \expandafter\@crefrangedefinemultiformat\expandafter{\@tmpa}}{}%
    \cref@stack@pop{\@tmpstack}%
    \cref@isstackfull{\@tmpstack}}%
%    \end{macrocode}
%
% If formats for subsections are undefined, define them to be identical
% to the formats for sections.
%    \begin{macrocode}
    \@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@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}
%    \begin{macrocode}
    \@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@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}{}%
%
%    \begin{macrocode}
    \@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}
%    \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}{}%
%
%    \begin{macrocode}
    \@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{macrocode}
%
%
% \Finale
\endinput
%%
%% End of file `cleveref.dtx'.

%%% Local Variables:
%%% mode: doctex
%%% TeX-master: t
%%% End: