\def\packagedate{2012/03/07} \def\packageversion{0.18.5} % \iffalse meta-comment % % Package 'cleveref' to use with LaTeX2e % Copyright 2007--2011 by Toby Cubitt % % Written and maintained by Toby Cubitt % %% This file may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.2 %% of this license or (at your option) any later version. %% The latest version of this license is in: %% %% http://www.latex-project.org/lppl.txt %% %% and version 1.2 or later is part of all distributions of LaTeX %% version 1999/12/01 or later. % % Please send bug reports and suggestions to toby-cleveref@dr-qubit.org % \fi % % \iffalse %\NeedsTeXFormat{LaTeX2e}[1999/12/01] %\ProvidesPackage{cleveref} % [\packagedate{} v\packageversion{} Intelligent cross-referencing] % %<*driver> \documentclass{ltxdoc} %\documentclass[draft]{ltxdoc} \usepackage{url} \usepackage{pifont} % FIXME: find nicer line-continuation symbol than \ding{229} \usepackage[colorlinks=true,linktocpage=true]{hyperref} \usepackage[capitalise]{cleveref} \DisableCrossrefs \CodelineIndex \RecordChanges \setcounter{IndexColumns}{2} %%\newcommand{\package}[1]{\texttt{#1.sty}} \newcommand{\package}{\texttt} \newcommand{\file}{\texttt} \newcommand{\option}{\texttt} \makeatletter %% 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} % % \fi % % \CheckSum{18436} %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} % % \changes{v0.01}{2006/06/29}{Initial version} % \changes{v0.02}{2007/04/18}{Complete rewrite} % \changes{v0.03}{2007/04/26}{Added reference ranges} % \changes{v0.04}{2007/05/26}{Renamed "cleveref" -- first public release} % \changes{v0.05}{2007/05/31}{Added \option{poorman} option} % \changes{v0.06}{2007/06/11}{\option{poorman} no longer writes extra % .tmp file} % \changes{v0.07}{2007/06/21}{Allow prevention of reference range % collapsing} % \changes{v0.08}{2007/07/10}% % {Made referencing commands robust, improved default formats, made % starred versions of referencing commands for hyperref, allowed % multiple consecutive empty references in list to prevent range % collapsing, and fixed bugs. Phew.} % \changes{v0.08.1}{2007/08/08}{Bug fixes.} % \changes{v0.09}{2007/10/29}% % {Added an extra conjunction and format component, used when a list % only contains a single pair of references or reference % sub-lists. Formats are now constructed from customisable % components, unless overridden using the old format definition % commands.} % \changes{v0.10}{2007/10/30}% % {Allow optional argument to \textbackslash{}label to override % reference type. Removed \option{hyperref} and \option{ntheorem} % options; support for these and \package{amsmath} is enabled % automatically if those packages are loaded.} % \changes{v0.11}{2007/11/21}{Made referencing aware of appendices.} % \changes{v0.11.1}{2007/11/29}{Bug fixes.} % \changes{v0.12}{2009/02/11}{Restore working \textbackslash{}ref* when % hyperref is loaded -- first release mirrored on www.dr-qubit.org} % \changes{v0.13}{2009/04/17}{Finally implemented \option{sort} and % \option{compress} package options. Support \package{amsmath} % \textbackslash{}tag command. Added \package{babel} support for % English, German and French. Added \package{varioref} support.} % \changes{v0.13.1}{2009/07/01}{Bug fix to \textbackslash{}cref@get* % commands to allow fragile and non-expandable commands in label tags.} % \changes{v0.13.2}{2009/07/26}{Added\newline % \textbackslash{}crefrangepreconjunction and % \textbackslash{}crefrangepostconjunction commands, needed by some % languages (such as Italian). Added \package{babel} support for % Spanish and Italian. Added notes about \package{memoir} % (in)compatibility.} % \changes{v0.14}{2009/08/07}{Fixed bug that caused labels containing % components with values of 10 or higher to be sorted % incorrectly. Fixed \textbackslash{}Cref to no longer capitalise all % cross-reference names in a multi-reference, just the first one. Added % \option{capitalise} option to force capitalisation everywhere.} % \changes{v0.14.1}{2009/08/18}{Added support for \package{amsmath}'s % subequations environment} % \changes{v0.14.2}{2009/09/22}{Fixed subequations sorting bug. Fixed bug % in \option{poorman} when used without babel. \option{capitalise} % option no longer uses \textbackslash{}Cref variant everywhere; it now % redefines the \textbackslash{}cref variants instead.} % \changes{v0.14.3}{2009/10/17}{Bug-fix in \textbackslash{}appendix % code.} % \changes{v0.15}{2009/11/26}{Added \package{amsthm} support, contributed % by Michael Ummels. Added \textbackslash{}leavevmode before % \textbackslash{}begingroup in \textbackslash{}@cref to avoid subtle % bug that caused page count to be reset if the output routine was % triggered within \textbackslash{}@cref.} % \changes{v0.15.1}{2009/12/02}{Fixed regression introduced in v0.13 in % non-\package{hyperref} \option{poorman} code. Fixed bug in % \package{varioref} support that caused \textbackslash{}vref to print % \textbackslash{}reftextcurrent string for references on the current % page, breaking \package{varioref} backwards-compatibility. Added % \package{babel} support for Dutch.} % \changes{v0.15.2}{2009/12/07}{Fixed bug in \textbackslash{}appendix % that produced badly formed prefix data for labels that aren't reset % by other counters (e.g.\ tables and figures in most document % classes). Fixed bug in \package{hyperref} \option{poorman} code that % caused all label names to be lower-cased in the sed script. Fixed % spacing bugs in the \package{cleveref} versions of the % \package{varioref} commands.} % \changes{v0.15.3}{2009/12/11}{Fixed bug in \package{varioref} support. % Changed \option{poorman} \textbackslash{}usepackage sed substitution % rule to use POSIX regexp syntax.} % \changes{v0.16}{2010/04/19}{Major changes to the low-level % implementation! \package{cleveref} now stores the extra information % it requires in its own \textbackslash{}cref@currentlabel and its own % parallel series of labels in the aux file, staying out of the way of % the standard cross-reference mechanism and \textbackslash{}ref % command. Also added \textbackslash{}namecref and % \textbackslash{}nameCref commands, fixed a serious bug in the % \package{amsmath} support affecting spacing of multi-line equation % environments, added support for footnotes, and made % \textbackslash{}newtheorem automatically define the singular form of % the cross-reference name for new theorem-like environments.} % \changes{v0.16.1}{2010/04/30}{Fixed bugs in \package{amsmath} spacing % fix and \package{amsthm} support.} % \changes{v0.16.2}{2010/05/12}{Fixed bugs in \textbackslash{}appendix % version used with \package{hyperref}, and in \textbackslash{}footnote % support.} % \changes{v0.16.3}{2010/05/25}{Added missing \textbackslash{}namecrefs % and \textbackslash{}nameCrefs commands. Fixed bug in % \textbackslash{}AtBeginDocument code used to define % \textbackslash{}crefgroupconjunction macros. Added missing % \textbackslash{}crefname definitions for subsection, subsubsection % etc. in terms of those for section, so that \textbackslash{}namecref % works for those (and also switching language in the middle of a % document). Added \package{babel} support for Russian and Ukrainian. % Fixed bug in \textbackslash{}refstepcounter@optarg.} % \changes{v0.17}{2010/06/07}{Fixed bug in non-\package{hyperref} % version of \textbackslash{}refstepcounter. Added % \textbackslash{}crefalias command for aliasing a counter to a % different cross-reference type. Added support for \package{algorithm} % package. Improved support for \package{subfig} package. Added support % for \package{listings} package. Fixed bugs in \package{amsmath} % \textbackslash{}tag command when used with \option{sort} option, and % in the \package{amsmath} multline environment's support for the % optional argument to \textbackslash{}label.} % \changes{v0.17.1}{2010/06/24}{Modified \textbackslash{}@crefname macro % so that it no longer makes global definitions, to fix support for % \package{babel}'s \textbackslash{}otherlanguage and % \textbackslash{}foreignlanguage commands. Fixed typos in % \option{poorman} \textbackslash{}foreignlanguage code. Fixed bug in % the \package{amsmath} multline environment's support for the optional % argument to \textbackslash{}label\dots{} again. Added % \textbackslash{}labelcref command.} % \changes{v0.17.2}{2010/07/24}{Removed unneeded argument from % \textbackslash{}@footnotetext redefinition, to improve compatibility % with other packages that redefine footnotes.} % \changes{v0.17.3}{2010/08/30}{Added missing default format definitions % for ``part''. Fixed bad active character interaction between % \package{cleveref} and some \package{babel} languages (in particular % Spanish). Fixed \package{hyperref} support code so % that it is only enabled if \package{hyperref} was loaded with the % \option{implicit} option set to \option{true} (the default).} % \changes{v0.17.4}{2010/09/04}{Added automatic support for % \package{aliascnt} counters whose parent counter gets reset. Fixed % serious bug in the test for \package{hyperref}'s \option{implicit} % options.} % \changes{v0.17.5}{2010/09/15}{Fixed bug that broke compilation of % documents that didn't use \package{hyperref}, because % \textbackslash{}if@cref@hyperrefloaded was not defined.} % \changes{v0.17.6}{2011/01/05}{Added \package{babel} support for % Norwegian. Replaced ``appendice'' with ``annexe'' in French default % cross-reference names, to match \package{babel} names. Replaced % ``Linie'' with ``Zeile'' in the German default cross-reference names. % Added \textbackslash{}lcnamecref and \textbackslash{}lcnamecrefs % commands to force lowercase reference names, useful with the % \option{capitalise} option.} % \changes{v0.17.7}{2011/01/10}{Fixed \textbackslash{}crefname to work % with empty reference names.} % \changes{v0.17.8}{2011/01/19}{Fixed automatic % \textbackslash{}newtheorem name definitions to work with empty % names.} % \changes{v0.17.9}{2011/03/22}{Added support for \package{algorithm2e} % package. Added missing \textbackslash{}crefname definitions for % `listing'. Changed case used in plural forms in Norwegian. Fixed bug % in redefinition of \package{amsmath} \textbackslash{}tag command. % Added \package{babel} support for Danish. Renamed internal % \textbackslash{}@result macro to \textbackslash{}cref@result to avoid % conflict with \package{tikz-qtree} package. Also renamed internal % \textbackslash{}@temp macros to \textbackslash{}@temp, which % seems to be more standard for temporary macros, to mitigate against % similar (though less likely) conflicts, and also save a minuscule % amount of \TeX{} memory.} % \changes{v0.17.10}{2011/04/16}{Fixed bug in % \textbackslash{}@cref@stack@insert caused by a temporary macro name % clash.} % \changes{v0.18}{2011/10/24}{Implemented clever page referencing via % \textbackslash{}cpageref et al.\ commands, which supports % multi-references, including sorting and page range collapsing. % Improved \package{varioref} support, combining \package{varioref} and % (new) \package{cleveref} page-referencing features. Removed % \option{legacyvarioref} option. Fixed bug in % \textbackslash{}newtheorem support. Documented \package{mathtools} % \option{showonlyrefs} incompatibility. Fixed some of the Spanish and % German translations. Implemented \option{nameinlink} option, to % include cross-reference names in hyperlinks when using % \package{hyperref}. Implemented \option{noabbrev} option to disable % all use of abbreviations in default cross-reference names. Added % support for a \file{cleveref.cfg} file, which is loaded after the % rest of \package{cleveref} has loaded. Made cross-references to % sections work correctly when using the \package{revtex4} or % \package{revtex4-1} docclasses. Fixed \package{subfig} and % \package{caption} compatibility with optional argument to % \textbackslash{}label.} % \changes{v0.18.1}{2011/12/24}{Fixed compatibility with newer versions % of \package{caption} package.} % \changes{v0.18.2}{2012/01/17}{Don't try to redefine % \textbackslash{}appendix if it's not defined in current document % class. Fixed bug in \textbackslash{}@setnamecref. Refactored common % code in format-definition macros into separate % \textbackslash{}cref@othervariant macro. Added % \package{IEEEtrantools} support.} % \changes{v0.18.3}{2012/01/18}{Fixed bugs with multiple equations and % subequations in an \textbackslash{}IEEEeqnarray.} % \changes{v0.18.4}{2012/01/23}{Set \textbackslash{}cref@currentlabel % locally instead of globally, to match how % \textbackslash{}@currentlabel is set. Fix \package{xr} compatibility % by adding a ``cref'' suffix to \package{cleveref}'s internal label % names, instead of a prefix.} % \changes{v0.18.5}{2012/03/05}{Fix \package{listings} and % \package{algorithm} package support, broken by change to local rather % than global \textbackslash{}cref@currentlabel definitions. Fixed % compatibility with \package{memoir}'s internal \package{subfig} % re-implementation.} % % \GetFileInfo{cleveref.sty} % % % \title{The \package{cleveref} package\thanks{This document % corresponds to \textsf{cleveref}~\packageversion, dated % \packagedate.}} % \author{Toby Cubitt \\ % \href{mailto:toby-cleveref@dr-qubit.org}{toby-cleveref@dr-qubit.org}} % \date{\packagedate} % % \maketitle % % \begin{abstract} % The \package{cleveref} package enhances \LaTeX{}'s cross-referencing % features,\linebreak[4] allowing the format of cross-references to be % determined automatically according to the ``type'' of cross-reference % (equation, section, etc.) and the context in which the % cross-reference is used. The formatting for each cross-reference type % can be fully customised in the preamble of your document. In % addition, \package{cleveref} can typeset cross-references to lists % of multiple labels, automatically formatting them according to their % types, sorting them, and compressing sequences of numerically % consecutive labels. Again, the multiple-reference formatting is fully % customisable. % % Normally, the latest version of the \package{cleveref} package is % available via CTAN.\ Occasionally, slightly newer ``pre-release'' % versions are available at \url{www.dr-qubit.org/latex.php#cleveref} a % little before they make their way onto CTAN. % \end{abstract} % % \clearpage % \tableofcontents % \clearpage % % % \section{Introduction} % When ``clever'' is used in the name of a computer program, it usually % indicates that the programmer is overly smug about his own % achievements! But at the heart of the \LaTeX{} philosophy also lies 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 of these probably apply to the \package{cleveref} package. Its % goals are two-fold: to exploit all the information that \LaTeX{} % inherently already has 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 consecutive % labels into a reference range, and all kinds of other clever wizardry. % It also does similar things with page references. % % 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 typeset % as |Equation~\ref{eq1}| instead (i.e.\ without the abbreviation and % without the parentheses)? 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|, meaning that references to % the sequence of theorems 1 through 3 should now 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}|? Any such change requires you to % search through the entire \LaTeX{} source of your document, modifying % all references to equations, updating all references to |thm1|, % re-ordering all references to |thm1| and |thm3|, and changing all the % formatting of references to multiple theorems. % % The \package{cleveref} package allows you to define the format for the % different types of cross-references once-and-for-all in the preamble of % your document. (Of course, sane default formats are provided, so you % only have to redefine the format if you don't like the default for a % particular cross-reference type.) 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 use the appropriate name when typesetting any % cross-references to it. This makes it far easier to typeset % cross-references uniformly across your whole document, as well as % avoiding repetitively typing similar text for each and every % cross-reference. % % % % \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}| produces % |eqs.~(1) to~(5)|. If you want to refer to multiple things at once, you % can simply throw 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),| |theorem~5, and definition~1|. Finally, if % you want a page reference, use |\cpageref| (and don't write ``page'' in % front), if you want a page range, use |\cpagerefrange|, and if you want % to refer to multiple pages, simply throw them all into a single % |\cpageref|, just as with |\cref| (above), and \package{cleveref} will % sort it all out. % % \package{Cleveref} supports a number of languages other than English, % and also supports the \package{babel} package for those languages. % Either pass the desired language as an option to \package{cleveref}, or % pass it as a global option to |\documentclass|. Note that if you're % writing in a language in which nouns decline, the |\cref| and % |\cpageref| commands may be less useful, as they always produce the % cross-reference name in the nominative case.\footnote{Providing % separate variants of the \package{cleveref} commands for each noun case % quickly becomes more cumbersome than just typing the cross-reference % name by hand. Trying to determine the appropriate case automatically % would be tantamount to solving the full natural-language processing % problem in \package{cleveref}. Check back in a century or so for this % feature.} In such languages, you may instead prefer to use the % |\labelcref| and |\labelcpageref| commands. Unlike |\cref| and % |\cpageref|, these don't produce the name in front of the % cross-reference, so you must supply it (in the appropriate case) % yourself. But they do still cope with multi-references, so you still % gain some benefit from using \package{cleveref}. % % % % \section{Comparison with Other Packages} % Given how useful automated cross-reference typesetting is, there are % naturally a number of other \LaTeX{} packages with similar goals to % \package{cleveref}, 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 occasionally 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 with \package{varioref}, you will % at times be back to searching and replacing through the entire % document. Not to mention missing out on all the other % \package{cleveref} features, such as automatic sorting and compressing % of consecutive references, \package{ntheorem} and \package{amsthm} % support, precise control over hyperlinks, etc. % % 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}. E.g.\ % you may want to use the abbreviation ``eq.'', but revert to % ``Equation'' at the beginning of sentences (words at the start of % sentences shouldn't be abbreviated in English). This is not possible % with \package{varioref}. Perhaps even more significantly, % \package{varioref}'s |\labelformat| implementation makes it impossible % to typeset multiple references automatically; if you want to refer to % equations |eq1| through |eq3|, with \package{varioref} you are back to % typing |Eqs.~(\ref{eq1}) to~(\ref{eq3})| by hand. Not to mention % missing out on all the other \package{cleveref} features. In fact, % \package{cleveref} fully supports \package{varioref}, taking over % responsibility for typesetting cross-references, whilst retaining (and % even enhancing) all the \package{varioref} page-referencing magic. % % The \package{hyperref} package's |\autoref| command typesets 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 pretty close. But surprisingly, % even with \package{hyperref}, it is impossible to customise precisely % which part of the cross-reference is made into a hyperlink in PDF % documents; this is simple with \package{cleveref}. And it still remains % impossible to typeset multiple references, have consecutive references % sorted and compressed automatically, etc. % % The \package{ntheorem} package (with the \option{thref} option) does % things right with regards to 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 every |\label| command, % specifying 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} provides a number of % additional features over \package{ntheorem}, such as multi-references, % automatic sorting and compressing of consecutive cross-references, % control over the placement of hyperlinks, etc. % % % % \section{Typesetting Cross-References} % \label{sec:typesetting} % \DescribeMacro\cref % To automatically typeset a cross-reference according to the type of % thing referred to, simply refer to it using |\cref|\marg{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 typeset 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|\marg{label}. By default, this typesets the cross-reference with % the first letter capitalised, and without using an abbreviation in % those cases where the standard variant does use one. (However, the % formatting of the |\cref| and |\Cref| forms can be fully and % independently customised, see \cref{sec:customising}.) % % \DescribeMacro\crefrange % \DescribeMacro\Crefrange % To typeset 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|\marg{label1}\marg{label2} % \end{quote} % % \DescribeMacro\cref % \DescribeMacro\Cref % To typeset multiple cross-references, simply list the labels inside % the |\cref| or |\Cref| command, separated by commas (recall that you % are not allowed to use commas in label names when using % \package{cleveref}): % \begin{quote} % |\cref{|\meta{label1}|,|\meta{label2}|,|\meta{label3}|,|\dots|}| % \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 % hyperlinks; the starred variants prevent this, producing the same % typeset text but without creating hyperlinks. % % \DescribeMacro\cpageref % \DescribeMacro\Cpageref % To typeset a page reference, use |\cpageref|\marg{label}, which is % typeset e.g.\ as ``page~3''. At the beginning of a sentence, use % |\Cpageref| instead. Since page references are always references to, % well\dots pages, this doesn't gain you so much over |\pageref|. Where % |\cpageref| comes into its own is in referring to multiple pages: % \begin{quote} % |\cpageref{|\meta{label1}|,|\meta{label2}|,|\meta{label3}|,|\dots|}| % \end{quote} % \DescribeMacro\cpagerefrange % \DescribeMacro\Cpagerefrange % Predictably enough, |\cpagerefrange| and |\Cpagerefrange| are used to % typeset references to page ranges: % \begin{quote} % |\cpagerefrange|\marg{label1}\marg{label2} % \end{quote} % % \DescribeMacro\ref % \DescribeMacro\pageref % \package{cleveref} does \emph{not} modify the standard |\ref| or % |\pageref| commands, so you can still use them to typeset the % formatted label counter or page number alone, without any additional % text or formatting. % % \DescribeMacro{\namecref} % \DescribeMacro{\nameCref} % \DescribeMacro{\lcnamecref} % \DescribeMacro{\namecrefs} % \DescribeMacro{\nameCrefs} % \DescribeMacro{\lcnamecrefs} % Occasionally, it's useful to produce just the name of a reference, % without the label itself. For example, if you want to refer to ``this % section'', but you're not sure whether you might later change the % section into a chapter, it might be useful to produce just the name % ``section'' associated with the section's label. If you later change % the section into a chapter, the text will then automatically change to % ``this chapter''. The |\namecref| and |\nameCref| do exactly this: % \begin{quote} % |\namecref{sec1}| % \end{quote} % is typeset as ``section'' (assuming |sec1| labels a section). The % |\namecrefs| and |\nameCrefs| commands produce the plural forms. The % |\lcnamecref| and |\lcnamecrefs| commands force the reference name to % lowercase, for use when the \option{capitalise} option is enabled (see % \cref{sec:capitalise}). (When that option is set, |\namecref| produces % an uppercase reference name.) % % There is a slight pitfall that you should be aware of when using the % |\namecref| commands. They get the reference name from the names % defined for the label's reference type using |\crefname| or |\Crefname| % (see \cref{sec:individual_customisation}). The default reference % formats provide these definitions. However, it is possible to customise % reference formats using lower-level commands that do not create % |\crefname| definitions (see \cref{sec:low-level_customisation}). If % the |\crefname| definitions are missing for a particular reference % type, |\namecref| and |\nameCref| will produce errors for labels of % that type. You can fix the error by adding explicit |\crefname| % definitions for these types. % % \DescribeMacro{\labelcref} % Conversely, it is occasionally convenient to produce just the label % part of a reference, without the cross-reference name. For example, % this can be useful when writing in a language in which nouns decline. % The |\labelcref| command does exactly this, and can also cope with % multi-references, processing them just as |\cref| does. However, since % it typesets a multi-reference without any name, \emph{all} labels in a % |\labelcref| multi-reference \emph{must} be of the same type. % % The |\labelcref| command will typeset cross-reference labels using the % default label format if no type-specific format is defined using % |\creflabelformat| (see % \cref{sec:global_customisation,sec:individual_customisation}). Note % that, if you customise reference formats using the low-level commands, % you may want to also explicitly define the |\labelcref| formats to % match, using the |\labelcrefformat| etc.\ commands (see % \cref{sec:low-level_customisation}). % % \DescribeMacro{\labelcpageref} % Similarly, |\labelcpageref| typesets the page numbers alone, without % inserting ``page'' in front. Like |\cpageref|, it also handles % multi-references. Like |\labelcref|, by default |\labelcpageref| % typesets the page numbers using the default label format, customised % using |\crefdefaultlabelformat|. If you want to define a separate % format for |\labelcpageref|, use |\creflabelformat| to customise the % label format for the ``page'' cross-reference type. (see % \cref{sec:low-level_customisation}). % % % % \section{Sorting and Compressing} % \label{sec:sort&compress} % When \package{cleveref} typesets lists of multiple cross-references or % page-references, the default behaviour is to automatically sort the % list and compress sequences of consecutive cross-references or page % numbers 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 typeset 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 typeset 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, typeset cross-reference: % \begin{quote} % |\cref{eq3,,eq2,eq1,eq6,eq4,eq5}| % \end{quote} % will be typeset as % \begin{quote} % eqs.~(1) to~(3) and (4) to~(6) % \end{quote} % % % % \section{Options that Modify the Cross-Reference Format} % % \subsection{Capitalising All Cross-Reference Names} % \label{sec:capitalise} % \DescribeMacro{capitalise} % Many authors prefer to always capitalise cross-reference names, % regardless of where they appear in the sentence, writing Theorem~1 and % Equation~3 (as opposed to theorem~1 and equation~3). If you count % yourself among this group, you can pass the \option{capitalise} option % to the \package{cleveref} package (\option{capitalize} also works). % % All the default cross-reference formats will then have the first letter % capitalised, as will the automatically generated |\cref| variants (see % \cref{sec:individual_customisation,sec:low-level_customisation}). % (However, if you explicitly define a |\cref| variant to \emph{not} be % capitalised, \package{cleveref} will still honour your definition. In % other words, you're responsible for defining the capitalisation % correctly in your own format definitions.) % % You should \emph{still} use the |\Cref| variants at the beginning of % sentences, for one thing, because abbreviations should not be used at % the beginning of a sentence,\footnote{At least in English; I'm not sure % about other languages.} and for another, in case you later change your % mind and remove the \option{capitalise} option. % % % \subsection{Including Names in Hyperlink Targets} % \label{sec:nameinlink} % \DescribeMacro{nameinlink} % When using the \package{hyperref} package, \package{cleveref} % automatically makes all cross-references into hyperlinks to the % corresponding reference. By default, only the label itself forms part % of the hyperlink target (i.e.\ the text you can click on to navigate to % the cross-reference). The cross-reference name is not part of the % hyperlink. By contrast, \package{hyperref}'s |\autoref| command % \emph{does} includes the name as part of the hyperlink. If you prefer % to include the names in the hyperlinks when using \package{cleveref}, % you can pass the \option{nameinlink} option to the \package{cleveref} % package. (For even more control over the placement of the hyperlink % target, use the commands for customising the cross-reference format. % See \cref{sec:customising}.) % % However, use of this option is discouraged on stylistic grounds. % Firstly, when producing PDF output \package{hyperref} by default % surrounds hyperlinks with red boxes, which looks particularly ugly when % the entire cross-reference name is surrounded by a red box (though this % unfortunate default can be changed using \package{hyperref} package % options; see the \package{hyperref} documentation for details). % Secondly, and more significantly, when using multi-references only the % first reference in a group can include the cross-reference name as part % of its hyperlink target, for obvious reasons. The hyperlink targets for % the other references in the group will necessarily be just the labels. % This makes for somewhat non-uniform typesetting of hyperlinks, with the % first cross-reference in a multi-reference having a much larger % hyperlink target than the others. % % % \subsection{Avoiding Abbreviations in Cross-Reference Names} % \label{sec:noabbrev} % \DescribeMacro{noabbrev} % The default cross-reference names for some languages use common % abbreviations for some of the names (e.g.\ in the default English % format, |\cref{eq1}| will be typeset as |eq.~(1)|). Some authors may % prefer to always use the full name, rather than an abbreviation % (|equation~(1)| instead of |eq.~(1)|). To disable all use of % abbreviations in the default cross-reference names, pass the % \option{noabbrev} option to the \package{cleveref} package. % % % % % \section{Customising the Cross-Reference Formats} % \label{sec:customising} % The \package{cleveref} package allows you to take full control of the % typesetting 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'' for the plural of ``lemma''.} and support for a number of % languages is provided via package options (see % \cref{sec:language_babel}). But if you don't like the defaults, or are % writing in a language that is not supported yet,\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 % typeset the cross-reference as % \begin{quote} % {\bf ??}~|\ref|\marg{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. % % \package{cleveref} treats page references, as produced e.g.\ by % |\cpageref|, as cross-references with the type ``page''. Therefore, all % of the mechanisms for customising cross-references apply equally well % to page references, simply by using ``page'' as the cross-reference % type. % % % \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|\marg{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 hyperlink when % the \package{hyperref} package is used (see % \cref{sec:other_packages}). For example, if you wanted to surround all % labels with square brackets, without the square brackets themselves % being part of the hyperlink, you would need: % \begin{quote} % |\crefdefaultlabelformat{[#2#1#3]}| % \end{quote} % The hyperlink arguments |#2| and |#3| \emph{must} appear in that % order. (Leaving them out completely will not cause an error, but in % that case no hyperlink will be created when \package{hyperref} is % used, and there are better ways to achieve this. See % \cref{sec:typesetting,sec:other_packages}.) % % Note that the default format for equation cross-references already % overrides |\crefdefaultlabelformat| in order to surround the label with % parentheses, 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}|\marg{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 endash % ``|--|''. |\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 typeset 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 formatting 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 typeset 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}|\marg{conjunction}\\ % |\newcommand{\crefmiddleconjunction}|\marg{conjunction}\\ % |\newcommand{\creflastconjunction}|\marg{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 typeset 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|\marg{type}\marg{singular}\marg{plural}\\ % |\Crefname|\marg{type}\marg{singular}\marg{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} of % \package{amsthm} packages are 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} and \package{amsthm} provide extra % information about the environment when different theorem-like % environments share a common counter, which \package{cleveref} makes use % of to distinguish between them automatically.) In the case of % appendices, the \meta{type} is ``appendix'' for the top-level % sectioning command (|\chapter| or |\section|, depending on the document % class), ``subappendix'' for the sectioning command one level below % (|\section| or |\subsection|), ``subsubappendix'' for the next level of % sectioning command, etc. % % For convenience, if they have not been otherwise customised by the end % of the preamble, the cross-reference name (and label format) for % |subsection| is by default inherited from that of |section|, and that % of |subsubsection| is inherited from |subsection| (which might itself % have been inherited from |section|). Similarly for |subappendix|, % |subsubappendix| and |subsubsubappendix|, and also for |enumii|, % |enumiii|, |enumiv| and |enumv|, which inherit from |enumi|. Finally, % |subfigure| and |subtable| inherit from |figure| and |table|, % respectively. % % \DescribeMacro\creflabelformat % You may want the label format for a particular cross-reference type to % differ from the global format set by |\crefdefaultlabelformat| (see % \cref{sec:global_customisation}). You can do this using % \begin{quote} % |\creflabelformat|\marg{type}\marg{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 hyperlink 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 % typeset 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|\marg{type}\marg{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 hyperlink % for the first reference, the final two (|#5| and |#6|) the hyperlink % for the second reference. The hyperlink arguments \emph{must} appear % in order. For example, % \begin{quote} % |\crefrangelabelformat{equation}{(#3#1#4) to~(#5#2#6)}| % \end{quote} % % % \subsubsection{Automatic \textbackslash\texttt{newtheorem} Definitions} % \DescribeMacro\newtheorem % The standard \LaTeX{} |\newtheorem| command for defining new % theorem-like environments provides enough information to deduce a % reasonable cross-reference name for the new environment. So % \package{cleveref} automatically defines an appropriate cross-reference % name for new theorem-like environments. This automatic definition is % only used if no default definition is provided by \package{cleveref} % itself, and if no |\crefname| or |\Crefname| definition is given % explicitly (see \cref{sec:individual_customisation}). % % The caveat with this automatic definition is that, although % |\newtheorem| essentially provides the singular form of the % cross-reference name, it doesn't provide the plural form. And there is % no reliable way of constructing the plural form from the % singular.\footnote{If you're a native English-speaker, you might think % that just adding an `s' would work, though a moment's thought will % provide examples of words where this will fail. If you're a non-English % speaker, it probably won't even occur to you to claim that plurals can % reliably be constructed automatically!} Therefore, if the plural form % is ever required, \package{cleveref} will produce a ``reference type % undefined'' warning, and typeset the cross-reference where the plural % form is required as: % \begin{quote} % {\bf ??}~|\ref|\marg{label} \dots % \end{quote} % In this case, you will have to provide an explicit |\crefname| or % |\Crefname| definition yourself, to define the plural form as well as % the singular form. % % % % \subsection{Low-Level Customisation: Taking Full Control} % \label{sec:low-level_customisation} % If you need more precise control over the cross-reference format than % is possible by customising the individual components, then you can take % full control of the format for any given type, overriding the % component-derived format entirely. The formats for single % cross-references, reference ranges and multi-references are customised % separately. If you only customise some of these, the other formats will % be constructed from components, as usual. % % Note that when deciding which cross-references should be grouped % together for sorting and/or compressing, \package{cleveref} does % something slightly more complicated than simply checking whether the % reference types match. In fact, it checks whether the reference % \emph{formats} match.\footnote{To be precise, \package{cleveref} checks % whether the $\backslash$|crefformat| definitions match.} This will % always be the case for cross-references of the same type. But it could % also be the case for cross-references that have different types, if the % cross-reference formats happen to be identical. % % The reason for doing this is to allow cross-references to e.g.\ % sections and subsections to be grouped together if they have identical % formats. The default formats for the sectioning commands, figures and % subfigures, tables and subtables, and enumerated lists are set up in % this way. If you change any of them using the low-level customisation % commands, but still want them to be grouped together, then you must % ensure that the formats are \emph{identical}. (It is \emph{not} % sufficient for the formats to produce identical typeset text; the % format definitions must contain identical \LaTeX{} code.) % % Note that if you use the low-level customisation commands, you might % still want to provide |\crefname| and |\Crefname| definitions too, so % that the |\namecref| commands will work (see \cref{sec:typesetting}). % % % \subsubsection{Single Cross-References} % \label{sec:ref_format} % \DescribeMacro\crefformat % \DescribeMacro\Crefformat % Cross-reference formats for \emph{single} cross-references are defined % or redefined using the |\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|\marg{type}\marg{format}\\ % |\Crefformat|\marg{type}\marg{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} or \package{amsthm} % are loaded, in which case it is the environment name, and appendices. % For the latter, the \meta{type} is ``appendix'' for the top-level % sectioning command (|\chapter| or |\section|, depending on the document % class), ``subappendix'' for the sectioning command one level below % (|\section| or |subsection|), ``subsubappendix'' for the next level of % sectioning command, etc. % % As in the case of the |\crefname| and |\Crefname| commands, if the % corresponding |\Crefformat| is undefined when |\crefformat| is called, % it will define the |\Crefformat| to produce a capitalised version of % |\crefformat|, using |\MakeUppercase|. Conversely, if the corresponding % |\crefformat| is undefined when |\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 hyperlink 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 typeset equation references as % \begin{quote} % Eq.~(\meta{counter}) % \end{quote} % with the counter (excluding the parentheses) forming the hyperlink. % % Note that the hyperlink 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 the ``Eq.''\ to be part of the hyperlink, you would have to % explicitly 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|\marg{type}\marg{format}\\ % |\Crefrangeformat|\marg{type}\marg{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} or \package{amsthm} are 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 hyperlink for the first % cross-reference, and the final two (|#5| and |#6|) mark the beginning % and end of the second cross-reference's hyperlink. % % As an example, % \begin{quote} % |\crefrangeformat{equation}{eqs.~(#3#1#4) to~(#5#2#6)}| % \end{quote} % would typeset equation reference ranges as % \begin{quote} % eqs.~(\meta{counter1}) to~(\meta{counter2}) % \end{quote} % with the counters (excluding the parentheses) forming the hyperlinks. % % % \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|\marg{type}\marg{first}\marg{second}\marg{middle}\marg{last}\\ % |\Crefmultiformat|\marg{type}\marg{first}\marg{second}\marg{middle}\marg{last}\\ % |\crefrangemultiformat|\marg{type}\marg{first}\marg{second}\marg{middle}\marg{last}\\ % |\Crefrangemultiformat|\marg{type}\marg{first}\marg{second}\marg{middle}\marg{last} % \end{quote} % % The \meta{type} is, as ever, the counter name, except for appendices, % explicitly overridden label types, and theorem-like environments when % the \package{ntheorem} or \package{amsthm} packages are loaded. The % same considerations apply to the formatting arguments \meta{first}, % \meta{second}, \meta{middle} and \meta{last} as for the \meta{format} % argument of |\crefformat| or |\crefrangeformat|, including the meaning % of the arguments that should appear in the formatting code (|#1|, |#2| % and |#3| for |\crefmultiformat| and |\Crefmultiformat|, |#1|--|#6| for % |\crefmultiformat| and |\Crefmultiformat|). However, when the % corresponding other-capitalisation variant is automatically defined, % only the first letter of the \meta{first} argument is upper- or % lower-cased; the other arguments are defined to be identical for both % variants. % % Be careful to get the spaces at the beginning and end of the formatting % code correct: the \meta{first} and \meta{second}, or \meta{first}, % \meta{middle} and \meta{last}, \LaTeX{} code is typeset one after % another in a multi-reference, with no space separating them. You may or % may not want spaces at the beginning and end of the formatting code, % depending on the formatting you desire. For example, in the default % equation format: % \begin{quote} % |\crefmultiformat{equation}{eqs.~(#2#1#3)}%|\\ % | { and~(#2#1#3)}{, (#2#1#3)}{ and~(#2#1#3)}| % \end{quote} % the \meta{middle} argument should \emph{not} have a space at the % beginning, whereas the \meta{second} and \meta{last} arguments % \emph{should} have a space. % % % \subsubsection{Label Cross-References} % If you define the format for a particular cross-reference type using % the low-level customisation commands, and still want to use the % |\labelcref| command to produce just the label part of the % cross-reference, then you must also define the appropriate |\labelcref| % formats for that type. This is done using the |\labelcrefformat|, % |\labelcrefrangeformat|, |\labelcrefmultiformat| and % |\labelcrefrangemultiformat| commands. Their syntax is identical to % that of the corresponding |\crefformat|, |\crefrangmeformat|, % |\crefmultiformat| or |\crefrangemultiformat| command. Typically, the % |\labelcref| formats should be defined identically to the standard % |\cref| formats, except for the \meta{first} part, which should leave % off the cross-reference name. This is not enforced, however. % % % % \subsection{Language and \package{babel} support} % \label{sec:language_babel} % \package{cleveref} supports different languages via package options, in % the usual way, though not all languages are supported % yet.\footnote{Contributions of translations for missing languages are % very welcome! See \cref{sec:code:babel} for information on how to % contribute translations.} The \package{babel} package is also supported % when it is loaded, allowing you to change the language used in % cross-references using the \package{babel} language switching commands, % such as |\selectlanguage| and |\foreignlanguage|. % % Note that, even when using \package{babel}, you still need to tell % \package{cleveref} which language it should use for the default % cross-reference formats. It is \emph{not} sufficient to pass the % language option to \package{babel} alone. You \emph{must} also % \emph{either} pass the desired language option to the % \package{cleveref} package directly when loading it: % \begin{quote} % |\usepackage|\oarg{language}|{cleveref}| % \end{quote} % \emph{or} specify the desired language globally as a document class % option: % \begin{quote} % |\documentclass|\oarg{language}\marg{class}\\ % |\usepackage{babel}|\\ % |\usepackage{cleveref}|\\ % \end{quote} % The latter method is strongly recommended. \LaTeX{} automatically % passes document class options to \emph{every} loaded package. So % specifying the language as a global option causes the appropriate % language support to be enabled automatically in every package that % supports it. % % When writing multi-language documents, you may need to specify multiple % language options in order to load \package{babel} support for all of % them. In this case, \package{babel} sets the initial document language % to the \emph{last} language option. (See the \package{babel} % documentation for more details.) \package{Cleveref} does the same: the % last language in the option list determines the language for the % initial cross-reference format definitions; all other language options % are ignored by \package{cleveref}. % % The \package{babel} support works by redefining the cross-reference % names and conjunctions for the default cross-reference types. Any % customisations you make to the default cross-reference names and % conjunctions \emph{in the preamble} apply to the main language (i.e.\ % the last language listed in the options). A |\selectlanguage| % \package{babel} command (or similar) in the document body will override % these customisations, replacing them with the defaults for the newly % selected language. If you later use |\selectlanguage| to switch back to % the main language, any customisations from the preamble will be % restored. If you want to customise cross-reference names or % conjunctions for any language other than the main one, you either have % to explicitly redefine them after every language switching command, or % hook the redefinitions into \package{babel}'s language switching % mechanism. (See \cref{sec:code:babel} and the \package{babel} package % documentation.) % % If you have defined formats for new cross-reference types for which no % defaults are provided, then you're on your own. \package{Cleveref} will % not know how to redefine them for other languages, and again you will % have to take care of it yourself, either by explicitly redefining them % in your document after each language switch, or by hooking the % redefinitions into \package{babel}'s language switching mechanism. % % On the other hand, since the language switching commands only modify % the cross-reference components, if you use the low-level customisation % commands to take full control of the format for a particular % cross-reference type, then (unless you're careful) you take it out of % the control of \package{babel} entirely. If you want to use the % low-level customisation commands, but \emph{do} still want the language % switching commands to work, then you have to use the component macros % in your customised formats. The cross-reference names are stored in % macros called |\cref@|\meta{type}|@name|, |\Cref@|\meta{type}|@name|, % |\cref@|\meta{type}|@name@plural|, and % |\Cref@|\meta{type}|@name@plural|.\linebreak[4] (Note that since these % macro names contain the ``@'' character, you must use |\makeatletter| % and |\makeatother| to access them.) % % For example, if you wanted to redefine the equation format so that the % cross-reference name (``equation'') was also part of the hyperlink, % but you still want to be able to switch language using \package{babel}, % you would need something like: % \begin{quote} % |\makeatletter|\\ % |\crefformat{equation}{#2\cref@equation@name~(#1)#3}|\\ % \dots\\ % |\makeatother| % \end{quote} % and similarly for |\crefrangeformat|, |\crefmultiformat|, % |\Crefformat|, etc. % % Note that if you define an empty cross-reference name for some type % using an empty |\crefname|, e.g.\ for equations % \begin{quote} % |\crefname{equation}{}{}| % \end{quote} % then the empty cross-reference name will be retained when switching % languages. This is probably what you want anyway. % % % \section{Overriding the Cross-Reference Type} % \label{sec:label_type} % \DescribeMacro\label % As described previously, a label's ``type'' is usually determined by % its counter, or in the case of \package{ntheorem} or \package{amsthm} % theorem-like environments by the environment name. However, sometimes % it is useful to override the type. \package{Cleveref} provides two % different mechanisms for accomplishing this. % % You can alias a counter to a different cross-reference type using the % |\crefalias| command: % \begin{quote} % |\crefalias|\marg{counter}\marg{type} % \end{quote} % \meta{counter} will then use the cross-reference formatting of % \meta{type}. This can be useful if you want multiple counters to use % the same cross-reference format. % % Occasionally, you may want to override the cross-reference type for one % particular label, one-off. You can do this by supplying the desired % type as an optional argument to the |\label| command: % \begin{quote} % |\label|\oarg{type}\marg{label} % \end{quote} % % One circumstance in which is useful is when you want to define a % special cross-reference format for certain labels of a given type. By % supplying a type that doesn't already exist as the optional argument to % |\label|, you can then define the cross-reference format for that new % type in whatever way you like, without affecting other cross-references % of the same type. For example, if a particular equation contains % multiple expressions and you want it to always be referred to in the % plural, you could use: % \begin{quote} % |\crefname{pluralequation}{eqs.}{eqs.}|\\ % \dots\\ % |\label[pluralequation]{eq1}| % \end{quote} % You can of course reuse this format for other plural equations, too. % % If you need to do this frequently, it can become tedious specifying the % label explicitly each time. An alternative is to use the % \package{aliascnt} package. This lets you define one counter to be an % alias for another, so that effectively the same counter has two names. % Since \package{cleveref} determines the label type from the counter % name, the two counter aliases can have different cross-reference % formats whilst really being the same counter. You have to somehow % arrange for the correct counter alias to be used depending on which % cross-reference format you want (probably by defining two variants of % the environment in question). But the effort involved might be worth % the convenience of not having to remember to pass an explicit optional % argument to a large number of labels. % % You can use this trick to get different cross-reference formats for % different theorem-like environments,\footnote{This trick seems to % belong to \LaTeX{} mythology, and certainly isn't my own idea! But I % haven't been able to definitively track down who originally came up % with it.} \emph{without} using the \package{amsthm} or % \package{ntheorem} package (although using one of those packages is a % better solution if available). For example, % \begin{quote} % |\usepackage{aliascnt}|\\ % |\usepackage{cleveref}|\\ % |\newaliascnt{lemma}{theorem}|\\ % |\newtheorem{lemma}[lemma]{Lemma}|\\ % |\aliascntresetthe{lemma}|\\ % |\crefname{lemma}{lemma}{lemmas}| % \end{quote} % Note that \package{aliascnt} must be loaded before \package{cleveref}, % and any \cmd{\newaliascnt} commands \emph{must} come \emph{after} % \package{cleveref} has been loaded. % % % % \section{The \file{cleveref.cfg} File} % If \package{cleveref} finds a \file{cleveref.cfg} file somewhere in the % \LaTeX{} search path, it automatically loads any definitions found in % that file. (For details of which directories \LaTeX{} searches, consult % the documentation for your site's \TeX{} installation.) The main use of % \file{cleveref.cfg} is to store any cross-reference format % customisations that you want to use in every document you write, so % that you don't have to include them explicitly in every document's % preamble. % % % % \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 \package{cleveref} % commands with the \LaTeX{} code that they would produce, and using the % standard |\ref| command to produce the cross-references themselves. % I.e.\ the script rewrites your document as you would have done if you % had had to do it manually! % % The advantage, of course, is that you \emph{don't} have to do it % manually. Instead, you can use all the features of \package{cleveref}, % and once you've created a version of your document that you want to % send elsewhere, 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 % typesetting 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, if you're using the % \package{hyperref} package (see \cref{sec:other_packages}) to turn % cross-references into hyperlinks, any customisation of hyperlinks will % be lost. And if you're using the \package{varioref} package (see % \cref{sec:other_packages}), you may need to manually tweak the spacing % in front of some of the \package{varioref} commands in the document % produced by the |sed| script. % % % % \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, the only package I'm aware of that should be loaded after % \package{cleveref} is the \package{hypdvips} package.} i.e.\ the % \begin{quote} % |\usepackage{cleveref}| % \end{quote} % line should usually be the last |\usepackage| command in your % document's preamble. % % \package{cleveref} tries as far as possible to minimise its impact on % the standard \LaTeX{} cross-referencing machinery, allowing it to work % alongside many of the other packages that also enhance \LaTeX{}'s % cross-referencing features, though it can occasionally interact badly % with packages that redefine the same core \LaTeX{} commands. Beyond % peacefully co-existing with many packages, \package{cleveref} includes % specific support for a number other packages, allowing it to integrate % its clever cross-referencing features with the features provided by % these packages: \package{babel}, \package{hyperref}, % \package{varioref}, \package{ntheorem}, \package{amsthm}, % \package{aliascnt}, \package{subfig}, \package{algorithm}, % \package{algorithm2e}, \package{listings}. % % \package{cleveref} implements a significantly enhanced version of the % features found in the \package{fancyref} package, \package{ntheorem}'s % \option{thref} option, and \package{varioref}'s |\labelformat| command. % Although these features may (or may not) work correctly alongside % \package{cleveref}, there is no good reason to use them when using % \package{cleveref}, and their use is unsupported. (Note that % \package{varioref} \emph{is} fully supported by \package{cleveref}, % just that \package{cleveref}'s features supersede \package{varioref}'s % |\labelformat| feature. Similarly, \package{ntheorem} is fully supported % and even recommended, only the \option{thref} option is superseded by % \package{cleveref}.) % % \DescribeMacro{\thref} % \DescribeMacro{\vref} % \DescribeMacro{\Vref} % \DescribeMacro{\vrefrange} % \DescribeMacro{\Vrefrange} % \DescribeMacro{\fullref} % \DescribeMacro{\Fullref} % In fact, if \package{ntheorem} is loaded with the \option{thref} % option, \package{cleveref} redefines \package{ntheorem}'s |\thref| % command for you, to be an alias for |\cref|. Similarly, if % \package{varioref} is loaded, \package{cleveref} redefines the |\vref|, % |\vrefrange|, |\fullref| commands and variants to instead use the % \package{cleveref} features for cross-reference formatting, whilst % retaining all the \package{varioref} page-referencing magic. You can % continue to use the other \package{varioref} and \package{ntheorem} % commands (other than |\labelformat| and the \option{thref} option) % whilst using \package{cleveref}, as long as \package{cleveref} is % loaded \emph{last}. % % \DescribeMacro{\vref*} % \DescribeMacro{\Vref*} % \DescribeMacro{\vrefrange*} % \DescribeMacro{\Vrefrange*} % \DescribeMacro{\fullref*} % \DescribeMacro{\Fullref*} % Note that, whilst in the business of redefining the \package{varioref} % commands, \package{cleveref} seizes the opportunity to get rid of the % irritating spacing behaviour of the |\vref| and |\Vref| commands, % instead making it consistent with the other \package{cleveref} % cross-referencing commands. This also frees up the starred variants of % the \package{varioref} commands to be used for suppressing hyperlinks % 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 sometimes be hyperlinks, even when using % the starred variants. Go bug the \package{varioref} maintainer about % this if you don't like it.) % % % % \section{Known Bugs, Non-Bugs, and Possible Future Enhancements} % \label{sec:known_bugs} % % \subsection{Non-Bugs} % The following are \emph{not} bugs. They are either intentional % behaviour, or are caused by \LaTeX{} misunderstandings: % \begin{itemize} % \item If you are using both \package{varioref} and \package{hyperref}, % \emph{make sure you are loading them in the correct order}, otherwise % cross-references will reference completely the wrong thing % \emph{without any warning in the \LaTeX{} output or log!} The % packages \emph{must} be loaded in the following order: % \package{varioref}, \package{hyperref}, \package{cleveref}. % \item If you are using \package{babel}, you \emph{must still} pass the % appropriate language option to \package{cleveref}, as well as to % \package{babel}. Passing it to \package{babel} alone is \emph{not} % sufficient (you will get the default English cross-reference % formats). The best way to set the document language is as a global % option in the |\documentclass| line. (This is standard \LaTeX{} and % \package{babel} practice -- read up on \LaTeX{}'s option handling for % more detail.) % \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}, and it's broken % any way. You're \emph{far} better off using the \package{amsmath} % replacements, 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} 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 the \package{babel} documentation to discover which % active characters are defined in your language.) % \item The \option{poorman} |sed| script loses any custom % \package{cleveref} hyperlink formatting you might have defined, and % does not always reproduce the original spacing around the % \package{varioref} commands when \package{varioref} is used. 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 e.g.\ % academic journals, thereby defeating the whole purpose of the % \option{poorman} option. % \end{itemize} % % % \subsection{Known Bugs and Work-Arounds} % In rough order of significance: % \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 When using \package{varioref} and \package{hyperref} with % \package{cleveref}, the \package{cleveref}\linebreak[4] % \option{nameinlink} option will not cause the word ``page'' in the % page-reference part of a |\vref| (or other \package{varioref}) % command to be included in the hyperlink, nor will the ``on the % previous page'' (or similar) text produced by |\vref| be hyperlinked. % This is not strictly speaking a \package{cleveref} issue. It is the % normal behaviour of the \package{hyperref}-enhanced version of % \package{varioref}'s |\vpageref| command, which \package{cleveref} % uses to produce the page references in its enhanced |\vref| command. % (This \emph{might} be improved in a future version by partially % overriding \package{hyperref}.) % \item Due to the way \TeX{} parses arguments, you have to be a little % careful when using |\label| inside an optional argument to another % command. |\label|\marg{label} will work, but trying to pass an % optional argument |\label|\oarg{type}\marg{label} will fail. If you % want to pass an optional argument to |\label| whilst already within % an optional argument to some other command, you must surround the % entire label command with braces: % |{\label|\oarg{type}\marg{label}|}|. This crops up e.g.\ when adding % labels to subfigure subcaptions in the \package{memoir} document % class. A simpler solution in this particular case is to define the % label in the subfigure body, instead of in the subcaption. % \item \package{cleveref} doesn't know about the \package{subfloat} % package, so you have to revert to using |\ref| for cross-references % to sub-figures. (To be fixed in a future version.) % \item The \package{beamer} document class redefines the |\label| % command in a particularly devious way that breaks % \package{cleveref}'s optional argument to that command. (To be fixed % in a future version.) % \item \package{cleveref} is incompatible with the \option{showonlyrefs} % option of the \package{mathtools} package, though it should be % compatible with the rest of \package{mathtools}. (To be fixed in a % future version.) % \item \package{cleveref} doesn't include support for all languages yet. % Please contribute translations for missing languages!\footnote{See % \cref{sec:code:babel} for information on how to contribute % translations.} % \item \package{cleveref} 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. % \end{itemize} % % % \subsection{Possible New Features and Improvements} % In no particular order: % \begin{itemize} % \item The \option{poorman} option could be enhanced to allow a choice % of scripting language rather than just |sed| (e.g.\ |awk|, |perl|, % \dots?), but these are unlikely to be much better for those apt to % complain about the use of |sed|. The portable option would be to % output a \TeX{} ``script'', but this would be \emph{much} more % work\footnote{\LaTeX{} \emph{really} isn't suited to that kind of % pattern matching task -- just take a look at the code for escaping % regexp special characters in this package!} than I'm prepared to % invest. % \end{itemize} % % % % \section{Thanks} % A number of people have helped improve \package{cleveref} by % contributing code and translations. Thanks to Michael Ummels for % contributing the \package{amsthm} support code, and to Stefan Pinnow, % Gonzalo Medina, Massimo Redaelli, Philip H\"olzenspies, Aleksander % Gorohovski, Benjamin H{\o}yer and Johannes Mueller for contributing % translations. Thanks also to Susanna Goldschmidt for additional help % with the translations. Many people have suggested improvements or % reported bugs, indeed many have put significant effort into helping % investigate and fix them. So thanks (in alphabetical order) to: Alan % Munn, Aleksander Gorohovski, Anand Deopurkar, Andreas Haselbacher, Arne % Meier, Bas Ploeger, Dan Luecking, David Gleich, Denis Bitouz\'e, % Domenic Denicola, Donald Ars\-en\-eau, Hendrik Maryns, Iain Cunningham, % James Sharam, Jens Mueller, Joel C. Salomon, Joris Pinkse, Kristian % Debrabant, Leo Shidai Liu, Lev Bishop, Mak Trifkovic, Matej Batic, Matt % Gately, Matthew Skala, Michael Barber, Michael Gorven, Michal Kaut, % Mico Loretan, Olivier Roy, Patrick H\"acker, Paul Gomme, Ricardo de % Aldama S\'anchez, Robert Fischer, Stefan Pinnow, Steve Dower, Ted % Pavlic, Thomas Arildsen, and Uwe L\"uck for their help. (If I missed % you out, please let me know!) % % % \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 \file{aux} file, and defining \cmd{\cref} commands which use this % extra information to typeset the cross-reference. % % The least invasive previous 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 typeset version of the counter, % now contains the additional type information. % % However, even less invasive than \package{varioref}'s implementation is % to leave \cmd{\@currentlabel} alone, and define a new % \cmd{\cref@currentlabel} macro to hold the extra information. (In fact, % we store three extra pieces of information: the type, the counter value % itself, and the value of the counter that causes the label's counter to % be reset, which we call the ``prefix'' from now on.) The standard % \cmd{\@currentlabel} contents eventually get written to the \file{aux} % file as an argument to \cmd{\newlabel} by the usual \LaTeX{} label % mechanisms. In order to also get the information in % \cmd{\cref@currentlabel} into the \file{aux} file, we have to redefine % the \cmd{\label} macro so that it writes \emph{two} \cmd{\newlabel} % lines to the \file{aux} file for \emph{each} label: the standard one, % plus an additional one which contains the extra information in % \cmd{\cref@currentlabel}. The additional \cmd{\newlabel} line has the % suffix |@cref| added to the label name. Thus the extra information in % \cmd{\cref@currentlabel} will end up in \cmd{\r@\meta{label}@cref} when % the \file{aux} file is re-read on the next pass. % % Doing things this way involves less hacking to get everything else % working again, since the standard cross-reference mechanism and % \cmd{\ref} command are left entirely intact. \package{Cleveref} can % then do what it likes with its own parallel set of labels, without % getting in the way of other packages that play around with the % cross-reference mechanism. The only downside is the additional memory % resources this uses, but on modern \TeX{} implementations this is % unlikely to be a problem. % % % \subsection{Redefinitions of \LaTeX{} Kernel Macros} % \begin{macro}{\refstepcounter} % \begin{macro}{\cref@currentlabel} % \begin{macro}{\cref@old@refstepcounter} % We store the original \cmd{\refstepcounter} in % \cmd{\cref@old@refstepcounter}, then redefine \cmd{\refstepcounter} % so that it first calls the old version to define the standard % \cmd{\@currentlabel} macro, before defining \package{cleveref}'s % \cmd{\cref@currentlabel}, which contains the extra information. The % cross-reference ``type'' stored in \cmd{\cref@currentlabel} is usually % inferred from the counter. This can be overridden by aliasing the % counter name to a different type using \cmd{\crefalias}. The new % \cmd{\refstepcounter} can also take an optional argument, which % always overrides the type. % \begin{macrocode} \def\cref@currentlabel{} \let\cref@old@refstepcounter\refstepcounter \def\refstepcounter{% \@ifnextchar[{\refstepcounter@optarg}{\refstepcounter@noarg}%] } \def\refstepcounter@noarg#1{% \cref@old@refstepcounter{#1}% \cref@constructprefix{#1}{\cref@result}% \@ifundefined{cref@#1@alias}% {\def\@tempa{#1}}% {\def\@tempa{\csname cref@#1@alias\endcsname}}% \protected@edef\cref@currentlabel{% [\@tempa][\arabic{#1}][\cref@result]% \csname p@#1\endcsname\csname the#1\endcsname}} \def\refstepcounter@optarg[#1]#2{% \cref@old@refstepcounter{#2}% \cref@constructprefix{#2}{\cref@result}% \protected@edef\cref@currentlabel{% [#1][\arabic{#2}][\cref@result]% \csname p@#2\endcsname\csname the#2\endcsname}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % % \begin{macro}{\label} % \begin{macro}{\cref@label} % \begin{macro}{\label@optarg} % \begin{macro}{\label@noarg} % We redefine the \cmd{\label} command to make it define \emph{two} % labels each time it's called: the standard one, and an additional % \package{cleveref}-specific one with the suffix |@cref| added to the % label name, which contains the extra information from % \cmd{\cref@currentlabel}. We call the original \cmd{\label} command, % stored in \cmd{\cref@old@label}, to write the standard label to the % \file{aux} file. However, to avoid other packages messing around with % the content of the parallel set of \package{cleveref}-specific % labels, we write those directly to the \file{aux} file ourselves. We % also allow \cmd{\label} to take an optional argument which overrides % the default reference type in \cmd{\cref@currentlabel}. % % The redefinition of \cmd{\label} has to be postponed until the % beginning of the document because some other packages postpone their % own \cmd{\label} redefinitions too, and we need to override their % redefinitions. % \begin{macrocode} \AtBeginDocument{% \let\cref@old@label\label \def\label{\@ifnextchar[\label@optarg\label@noarg}%] \let\cref@label\label \def\label@noarg#1{% \@bsphack% \cref@old@label{#1}% \protected@write\@auxout{}% {\string\newlabel{#1@cref}{{\cref@currentlabel}{\thepage}}}% \@esphack}% \def\label@optarg[#1]#2{% \@bsphack% \cref@old@label{#2}% \protected@edef\cref@currentlabel{% \expandafter\cref@override@label@type% \cref@currentlabel\@nil{#1}}% \protected@write\@auxout{}% {\string\newlabel{#2@cref}{{\cref@currentlabel}{\thepage}}}% \@esphack} }% end of AtBeginDocument % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % % \begin{macro}{\@makefntext} % Footnotes don't use the \cmd{\refstepcounter} mechanism, but instead % set\linebreak[4] \cmd{\@currentlabel} directly inside the footnote % insertion item. Thus we need to explicitly set % \cmd{\cref@currentlabel} in footnotes. To avoid the definition % spilling out of the footnote, we need to set it inside % \cmd{\insert}'s implicit insertion item grouping level. To this end, % we add the explicit \cmd{\cref@currentlabel} redefinition to % \cmd{\@makefntext}, which gets called from within \cmd{\insert} by % both \cmd{\@footnotetext} and \cmd{\@mpfootnotentext}. % \begin{macrocode} \let\cref@old@makefntext\@makefntext \long\def\@makefntext#1{% \cref@constructprefix{footnote}{\cref@result}% \protected@edef\cref@currentlabel{% [footnote][\arabic{footnote}][\cref@result]% \p@footnote\@thefnmark}% \cref@old@makefntext{#1}} % \end{macrocode} % \end{macro} % % % \begin{macro}{\newtheorem} % A \cmd{\newtheorem} command provides sufficient information to % automatically define a reasonable cross-reference name for % theorem-like environments (\package{ntheorem}'s \option{thref} does % essentially this). So we modify \cmd{\newtheorem} (actually, the % lower-level \cmd{\@othm}, \cmd{\@xnthm} and \cmd{\@ynthm} macros) so % that it does so. We do this in such a way that default definitions or % explicit \cmd{\crefname} definitions for theorem-like environments % override those produced automatically by our modified % \cmd{\newtheorem}. % % The catch is that, although the \cmd{\newtheorem} command provides % the singular form, there's no way of reliably deducing the plural % form from this. Rather than implement some half-baked attempt at this % which will be wrong more often than it's right (especially in % languages other than English) and generally cause more trouble than % it's worth, we simply define the singular form but leave the plural % form undefined. If the latter is ever needed, it will produce a % ``undefined cross-reference type'' warning, prompting the author to % provide an appropriate \cmd{\crefname} definition themselves. % % \begin{macro}{\@othm} % \begin{macro}{\@xnthm} % \begin{macro}{\@ynthm} % After sorting out its arguments, \cmd{\newtheorem} calls one of % \cmd{\@othm}, \cmd{\@xthm} or \cmd{\@ythm}. We add automatic % definitions of \cmd{\cref@\meta{type}@name} and\linebreak[4] % \cmd{\Cref@\meta{type}@name} to all three of these, and add the % theorem-like environment to the list of cross-reference types that % need to be defined from components at |\||begin{document}|. Since we % want explicit \cmd{\crefname}'s to override these automatic % definitions, we store the definitions in % \cmd{\cref@\meta{type}@name@preamble}, which are processed at % |\||begin{document}|) if they haven't been overridden. The default % definitions also get stored in \cmd{\cref@\meta{type}@name@preamble} % later on, so they too will override these automatic definitions, % which is what we want. % % All this means that these automatic \cmd{\newtheorem} definitions % will only work when \cmd{\newtheorem} is used in the preamble. % However, this is also true of (new) cross-reference types defined % using \cmd{\crefname}, so it doesn't seem worth the significant % effort of getting the automatic definitions to work within the % document body. % \begin{macrocode} \let\cref@old@othm\@othm \def\@othm#1[#2]#3{% \edef\@tempa{\expandafter\noexpand% \csname cref@#1@name@preamble\endcsname}% \edef\@tempb{\expandafter\noexpand% \csname Cref@#1@name@preamble\endcsname}% \def\@tempc{#3}% \ifx\@tempc\@empty\relax% \expandafter\gdef\@tempa{}% \expandafter\gdef\@tempb{}% \else% \if@cref@capitalise% \expandafter\expandafter\expandafter\gdef\expandafter% \@tempa\expandafter{\MakeUppercase #3}% \else% \expandafter\expandafter\expandafter\gdef\expandafter% \@tempa\expandafter{\MakeLowercase #3}% \fi% \expandafter\expandafter\expandafter\gdef\expandafter% \@tempb\expandafter{\MakeUppercase #3}% \fi% \cref@stack@add{#1}{\cref@label@types}% \cref@old@othm{#1}[#2]{#3}} \let\cref@old@xnthm\@xnthm \def\@xnthm#1#2[#3]{% \edef\@tempa{\expandafter\noexpand% \csname cref@#1@name@preamble\endcsname}% \edef\@tempb{\expandafter\noexpand% \csname Cref@#1@name@preamble\endcsname}% \def\@tempc{#2}% \ifx\@tempc\@empty\relax% \expandafter\gdef\@tempa{}% \expandafter\gdef\@tempb{}% \else% \if@cref@capitalise% \expandafter\expandafter\expandafter\gdef\expandafter% \@tempa\expandafter{\MakeUppercase #2}% \else% \expandafter\expandafter\expandafter\gdef\expandafter% \@tempa\expandafter{\MakeLowercase #2}% \fi% \expandafter\expandafter\expandafter\gdef\expandafter% \@tempb\expandafter{\MakeUppercase #2}% \fi% \cref@stack@add{#1}{\cref@label@types}% \cref@old@xnthm{#1}{#2}[#3]} \let\cref@old@ynthm\@ynthm \def\@ynthm#1#2{% \edef\@tempa{\expandafter\noexpand% \csname cref@#1@name@preamble\endcsname}% \edef\@tempb{\expandafter\noexpand% \csname Cref@#1@name@preamble\endcsname}% \def\@tempc{#2}% \ifx\@tempc\@empty\relax% \expandafter\gdef\@tempa{}% \expandafter\gdef\@tempb{}% \else% \if@cref@capitalise% \expandafter\expandafter\expandafter\gdef\expandafter% \@tempa\expandafter{\MakeUppercase #2}% \else% \expandafter\expandafter\expandafter\gdef\expandafter% \@tempa\expandafter{\MakeLowercase #2}% \fi% \expandafter\expandafter\expandafter\gdef\expandafter% \@tempb\expandafter{\MakeUppercase #2}% \fi% \cref@stack@add{#1}{\cref@label@types}% \cref@old@ynthm{#1}{#2}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % % \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} \@ifundefined{appendix}{}{% \let\cref@old@appendix\appendix \renewcommand\appendix{% \cref@old@appendix% \@ifundefined{chapter}{% \gdef\refstepcounter@noarg##1{% \cref@old@refstepcounter{##1}% \cref@constructprefix{##1}{\cref@result}% % \end{macrocode} % We add a large value to the front of the counter data, to force % references to anything in appendices to be sorted after everything % else. % \begin{macrocode} \ifx\cref@result\@empty% \def\cref@result{2147483647}% \else% \edef\cref@result{2147483647,\cref@result}% \fi% % \end{macrocode} % Override the cross-reference type of sectioning commands. % \begin{macrocode} \def\@tempa{##1}% \def\@tempb{section}% \ifx\@tempa\@tempb% \protected@edef\cref@currentlabel{% [appendix][\arabic{##1}][\cref@result]% \csname p@##1\endcsname\csname the##1\endcsname}% \else% \def\@tempa{##1}% \def\@tempb{subsection}% \ifx\@tempa\@tempb% \protected@edef\cref@currentlabel{% [subappendix][\arabic{##1}][\cref@result]% \csname p@##1\endcsname\csname the##1\endcsname}% \else% \def\@tempa{##1}% \def\@tempb{subsubsection}% \ifx\@tempa\@tempb% \protected@edef\cref@currentlabel{% [subsubappendix][\arabic{##1}][\cref@result]% \csname p@##1\endcsname\csname the##1\endcsname}% \else% \@ifundefined{cref@##1@alias}% {\def\@tempa{##1}}% {\def\@tempa{\csname cref@##1@alias\endcsname}}% \protected@edef\cref@currentlabel{% [\@tempa][\arabic{##1}][\cref@result]% \csname p@##1\endcsname\csname the##1\endcsname} \fi% \fi% \fi}% }{% \def\refstepcounter@noarg##1{% \cref@old@refstepcounter{##1}% \cref@constructprefix{##1}{\cref@result}% % \end{macrocode} % Again, the large value added to the front of the counter data forces % references to appendix items to be sorted last. % \begin{macrocode} \ifx\cref@result\@empty% \def\cref@result{2147483647}% \else% \edef\cref@result{2147483647,\cref@result}% \fi% % \end{macrocode} % Override the cross-reference type of sectioning commands. % \begin{macrocode} \def\@tempa{##1}% \def\@tempb{chapter}% \ifx\@tempa\@tempb% \protected@edef\cref@currentlabel{% [appendix][\arabic{##1}][\cref@result]% \csname p@##1\endcsname\csname the##1\endcsname}% \else% \def\@tempa{##1}% \def\@tempb{section}% \ifx\@tempa\@tempb% \protected@edef\cref@currentlabel{% [subappendix][\arabic{##1}][\cref@result]% \csname p@##1\endcsname\csname the##1\endcsname}% \else% \def\@tempa{##1}% \def\@tempb{subsection}% \ifx\@tempa\@tempb% \protected@edef\cref@currentlabel{% [subsubappendix][\arabic{##1}][\cref@result]% \csname p@##1\endcsname\csname the##1\endcsname}% \else% \def\@tempa{##1}% \def\@tempb{subsubsection}% \ifx\@tempa\@tempb% \protected@edef\cref@currentlabel{% [subsubsubappendix][\arabic{##1}][\cref@result]% \csname p@##1\endcsname\csname the##1\endcsname}% \else% \@ifundefined{cref@##1@alias}% {\def\@tempa{##1}}% {\def\@tempa{\csname cref@##1@alias\endcsname}}% \protected@edef\cref@currentlabel{% [\@tempa][\arabic{##1}][\cref@result]% \csname p@##1\endcsname\csname the##1\endcsname} \fi% \fi% \fi% \fi}% }% }% }% end of \@ifundefined{appendix} % \end{macrocode} % \end{macro} % \end{macro} % % % % \subsection{Utility Macros} % % \subsubsection{miscellaneous} % \begin{macro}{\@gobble@optarg} % A basic macro that gobbles one argument plus, if present, one % optional argument. % \begin{macrocode} \def\@gobble@optarg{\@ifnextchar[\@@gobble@optarg\@gobble@orig}%] \def\@gobble@orig#1{} \def\@@gobble@optarg[#1]#2{} % \end{macrocode} % \end{macro} % % \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{\file{aux} file information} % \begin{macro}{\cref@getlabel} % \begin{macro}{\cref@gettype} % \begin{macro}{\cref@getcounter} % \begin{macro}{\cref@getprefix} % Define some utility macros for extracting label, type, and counter % information from the contents of \cmd{\cref@currentlabel}, as written % to the \file{aux} file and stored in \cmd{\r@\meta{label}@cref} when % this is re-read on the next pass. Some other packages commandeer the % referencing system to write label information to the \file{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@getref#1#2{% \expandafter\let\expandafter#2\csname r@#1@cref\endcsname% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter#2% \expandafter\expandafter\expandafter{% \expandafter\@firstoftwo#2}} \def\cref@getpageref#1#2{% \expandafter\let\expandafter#2\csname r@#1@cref\endcsname% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter#2% \expandafter\expandafter\expandafter{% \expandafter\@secondoftwo#2}} \def\cref@getlabel#1#2{% \cref@getref{#1}{\@tempa}% \expandafter\@cref@getlabel\@tempa\@nil#2}% \def\@cref@getlabel{\@ifnextchar[%] \@@cref@getlabel{\@@cref@getlabel[][][]}} \def\@@cref@getlabel[#1][#2][#3]#4\@nil#5{\def#5{#4}} \def\cref@gettype#1#2{% \cref@getref{#1}{\@tempa}% \expandafter\@cref@gettype\@tempa\@nil#2}% \def\@cref@gettype{\@ifnextchar[%] \@@cref@gettype{\@@cref@gettype[][][]}} \def\@@cref@gettype[#1][#2][#3]#4\@nil#5{\def#5{#1}} \def\cref@getcounter#1#2{% \cref@getref{#1}{\@tempa}% \expandafter\@cref@getcounter\@tempa\@nil#2} \def\@cref@getcounter{\@ifnextchar[%] \@@cref@getcounter{\@@cref@getcounter[][][]}} \def\@@cref@getcounter[#1][#2][#3]#4\@nil#5{\def#5{#2}} \def\cref@getprefix#1#2{% \cref@getref{#1}{\@tempa}% \expandafter\@cref@getprefix\@tempa\@nil#2} \def\@cref@getprefix{\@ifnextchar[%] \@@cref@getprefix{\@@cref@getprefix[][][]}} \def\@@cref@getprefix[#1][#2][#3]#4\@nil#5{\def#5{#3}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \cmd{\cref@override@label@type} is a convenience macro for overriding % the label type stored in \cmd{\cref@currentlabel}. % \begin{macro}{\cref@override@label@type} % \begin{macrocode} \def\cref@override@label@type[#1][#2][#3]#4\@nil#5{[#5][#2][#3]#4} % \end{macrocode} % \end{macro} % % \begin{macro}{\cref@constructprefix} % The \cmd{\cref@constructprefix} macro constructs the prefix % information stored in \cmd{\cref@currentlabel} (retrieved using % \cmd{\cref@getprefix}). This information consists of the numerical % value of each counter that's involved in resetting the label's % counter, i.e.\ it contains the numerical values of the chapter, % section, subsection\dots{} numbers that (ought to) make up the % formatted label produced by \cmd{\the\meta{counter}}. E.g.\ if % \cmd{\theequation} produces ``B.1.3'', this utility macro will return % ``2,1'' (the ``3'' corresponds to the equation number itself, which % is stored separately in \cmd{\cref@currentlabel}). The first argument % is the counter in question; the return value is stored in the second % argument, which should be a macro name. % % The real work is done by the recursive \cmd{\@cref@constructprefix} % macro, which works its way upwards through the counters' reset lists % until it reaches a counter that isn't reset by any other. % \begin{macrocode} \def\cref@constructprefix#1#2{% \cref@stack@init{\@tempstack}% % \end{macrocode} % We fully expand the first argument (the counter name) because sometimes % a counter name containing a macro gets passed to us. % \begin{macrocode} \edef\@tempa{\noexpand{#1\noexpand}}% \expandafter\def\expandafter\@tempa\expandafter{\@tempa{#2}}% \expandafter\@cref@constructprefix\@tempa% \cref@stack@to@list{\@tempstack}{\@tempa}% \expandafter\def\expandafter#2\expandafter{\@tempa}} \def\@cref@constructprefix#1#2{% \cref@resetby{#1}{#2}% \ifx#2\relax% \else% \edef\@tempa{\the\csname c@#2\endcsname}% \expandafter\cref@stack@push\expandafter{\@tempa}{\@tempstack}% \edef\@tempa{{#2}}% \expandafter\expandafter\expandafter\@cref@constructprefix% \expandafter\@tempa\expandafter{\expandafter#2\expandafter}% \fi} % \end{macrocode} % \end{macro} % % % \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 delimiter). % \begin{macrocode} \def\cref@stack@init#1{\def#1{\@nil}} \def\cref@stack@top#1{\expandafter\@cref@stack@top#1} \def\@cref@stack@top#1,#2\@nil{#1} \def\cref@stack@pop#1{\expandafter\@cref@stack@pop#1#1} \def\@cref@stack@pop#1,#2\@nil#3{\def#3{#2\@nil}} \def\cref@stack@push#1#2{% \expandafter\@cref@stack@push\expandafter{#2}{#1}{#2}} \def\@cref@stack@push#1#2#3{\def#3{#2,#1}} \def\cref@stack@pull#1#2{\expandafter\@cref@stack@pull#2{#1}{#2}} \def\@cref@stack@pull#1\@nil#2#3{\def#3{#1#2,\@nil}} \def\cref@stack@to@list#1#2{% \cref@isstackfull{#1}% \if@cref@stackfull% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter#2% \expandafter\expandafter\expandafter{% \expandafter\@cref@stack@to@list#1}% \else% \def#2{}% \fi} \def\@cref@stack@to@list#1,\@nil{#1} \def\cref@stack@topandbottom#1#2#3{% \def#2{}% \def#3{}% \cref@isstackfull{#1}% \if@cref@stackfull% \edef#2{\cref@stack@top{#1}}% \cref@stack@pop{#1}% \cref@isstackfull{#1}% \@whilesw\if@cref@stackfull\fi{% \edef#3{\cref@stack@top{#1}}% \cref@stack@pop{#1}% \cref@isstackfull{#1}}% \fi} \def\cref@stack@add#1#2{% \begingroup% \def\@arg1{#1}% \let\@tempstack#2% \newif\if@notthere% \@nottheretrue% \cref@isstackfull{\@tempstack}% \@whilesw\if@cref@stackfull\fi{% \edef\@tempb{\cref@stack@top{\@tempstack}}% \def\@tempa{#1}% \ifx\@tempa\@tempb% \@cref@stackfullfalse% \@nottherefalse% \else% \cref@stack@pop{\@tempstack}% \cref@isstackfull{\@tempstack}% \fi}% \expandafter\endgroup% \if@notthere\cref@stack@push{#1}{#2}\fi} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\if@cref@stackempty} % \begin{macro}{\if@cref@stackfull} % \begin{macro}{\cref@isstackempty} % \begin{macro}{\cref@isstackfull} % The \cmd{\cref@isstackempty} and \cmd{\cref@isstackfull} macros test % whether a stack is empty or full, respectively, and set the % corresponding conditionals\linebreak[4] |\if@cref@stackempty| and % |\if@cref@stackfull|. % \begin{macrocode} \newif\if@cref@stackempty \newif\if@cref@stackfull \def\cref@isstackempty#1{% \def\@tempa{\@nil}% \ifx#1\@tempa\@cref@stackemptytrue% \else\@cref@stackemptyfalse\fi} \def\cref@isstackfull#1{% \def\@tempa{\@nil}% \ifx#1\@tempa\@cref@stackfullfalse% \else\@cref@stackfulltrue\fi} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\cref@stack@sort} % The \cmd{\cref@stack@sort} macro sorts a stack, using the comparison % macro passed in the second argument, which we use later to sort lists % of references. We use insertion sort despite its $O(n^2)$ scaling % because it's simpler to code, and because we're very unlikely to % encounter lists of more than ten or so references, so in practice a % more complicated $O(n\log n)$ sorting algorithm will very likely be % slower anyway in practice. % \begin{macrocode} \def\cref@stack@sort#1#2{% \begingroup% \cref@stack@init{\@sortstack}% % \end{macrocode} % Push first element into sorted stack. % \begin{macrocode} \edef\@element{\cref@stack@top{#1}}% \expandafter\cref@stack@push\expandafter{\@element}{\@sortstack}% \cref@stack@pop{#1}% % \end{macrocode} % If empty elements follow first one, need to add them after it in sorted % stack. % \begin{macrocode} \cref@isstackfull{#1}% \if@cref@stackfull% \edef\@tempa{\cref@stack@top{#1}}% \@whilesw\ifx\@tempa\@empty\fi{% \cref@stack@pull{}{\@sortstack}% \cref@stack@pop{#1}% \cref@isstackempty{#1}% \if@cref@stackempty% \let\@tempa\relax% \else% \edef\@tempa{\cref@stack@top{#1}}% \fi}% \fi% % \end{macrocode} % Process elements from stack. % \begin{macrocode} \cref@isstackfull{#1}% \@whilesw\if@cref@stackfull\fi{% \edef\@element{\cref@stack@top{#1}}% \cref@stack@pop{#1}% % \end{macrocode} % If empty elements follow current one, need to add them to sorted stack, % right after element we're currently dealing with. % \begin{macrocode} \def\@empties{}% \cref@isstackfull{#1}% \if@cref@stackfull% \edef\@tempa{\cref@stack@top{#1}}% \@whilesw\ifx\@tempa\@empty\fi{% \edef\@empties{\@empties,}% \cref@stack@pop{#1}% \cref@isstackempty{#1}% \if@cref@stackempty% \let\@tempa\relax% \else% \edef\@tempa{\cref@stack@top{#1}}% \fi}% \fi% % \end{macrocode} % Insert current element into sorted stack, appending any following empty % elements. % \begin{macrocode} \edef\@tempa{{\expandafter\noexpand\@element}% {\expandafter\noexpand\@empties}% {\noexpand\@sortstack}{\noexpand#2}}% \expandafter\cref@stack@insert\@tempa% \cref@isstackfull{#1}}% \expandafter\endgroup\expandafter% \def\expandafter#1\expandafter{\@sortstack}} % \end{macrocode} % \end{macro} % % \begin{macro}{\cref@stack@insert} % \cmd{\cref@stack@insert}|{#1}{#2}{#3}{#4}| inserts |#1| into the % appropriate location in the sorted stack |#3| (appending |#2| onto % the end of |#1| when it's inserted), using the comparison macro |#4|. % \begin{macrocode} \def\cref@stack@insert#1#2#3#4{% \let\@cmp#4% \@cref@stack@insert{}{#1}{#2}{#3}% \cref@stack@pop{#3}} % \end{macrocode} % \end{macro} % \begin{macro}{\@cref@stack@insert} % \cmd{\@cref@stack@insert}|{#1}{#2}{#3}{#4}| prepends |#1| to the % stack resulting from inserting |#2| (with |#3| appended to it) into % the sorted stack |#4|. % \begin{macrocode} \def\@cref@stack@insert#1#2#3#4{% \let\cref@iterate\relax% \cref@isstackempty{#4}% \if@cref@stackempty% \cref@stack@push{#1,#2#3}{#4}% \else% \edef\cref@elem{\cref@stack@top{#4}}% \expandafter\@cmp\expandafter{\cref@elem}{#2}{\cref@result}% \ifnum\cref@result=2\relax% \cref@stack@push{#1,#2#3}{#4}% \else% \cref@stack@pop{#4}% \edef\cref@elem{{\noexpand#1,\cref@elem}{\noexpand#2}% {\noexpand#3}{\noexpand#4}}% \expandafter\def\expandafter\cref@iterate\expandafter% {\expandafter\@cref@stack@insert\cref@elem}% \fi% \fi% \cref@iterate} % \end{macrocode} % \end{macro} % % % \subsubsection{Sorting and comparison of counters} % \begin{macro}{\cref@countercmp} % The \cmd{\cref@countercmp} macro compares two references according to % their respective sets of counter data, as returned by % \cmd{\cref@getcounter}. It \cmd{\chardef}'s its third argument to 0 % if they're equal, 1 if the first comes earlier than the second, or 2 % if the first comes later than the second. This is used later for % sorting references. % \begin{macrocode} \def\cref@counter@first#1#2\@nil{#1} \def\cref@counter@rest#1#2\@nil{#2} \def\cref@countercmp#1#2#3{% \begingroup% \def\@tempa{#1}% % \end{macrocode} % In order to ensure empty references end up in the right place when % sorting lists of multiple references, we make the comparison macro % sort them before a non-empty reference. % \begin{macrocode} \ifx\@tempa\@empty% \def\cref@result{1}% \else% \def\@tempa{#2}% \ifx\@tempa\@empty% \def\cref@result{2}% \else% % \end{macrocode} % Conversely, undefined references come after everything else. % \begin{macrocode} \expandafter\ifx\csname r@#1@cref\endcsname\relax% \def\cref@result{2}% \else% \expandafter\ifx\csname r@#2@cref\endcsname\relax% \def\cref@result{1}% \else% % \end{macrocode} % The real work of comparing two references is done by % \cmd{\@cref@countercmp}. % \begin{macrocode} \cref@getcounter{#1}{\@countera}% \cref@getprefix{#1}{\@prefixa}% \cref@getcounter{#2}{\@counterb}% \cref@getprefix{#2}{\@prefixb}% \cref@stack@init{\@countstacka}% \expandafter\cref@stack@push\expandafter% {\@countera}{\@countstacka}% \ifx\@prefixa\@empty\else% \expandafter\cref@stack@push\expandafter% {\@prefixa}{\@countstacka}% \fi% \cref@stack@init{\@countstackb}% \expandafter\cref@stack@push\expandafter% {\@counterb}{\@countstackb}% \ifx\@prefixb\@empty\else% \expandafter\cref@stack@push\expandafter% {\@prefixb}{\@countstackb}% \fi% \@cref@countercmp% \fi% \fi% \fi% \fi% \expandafter\endgroup\expandafter% \chardef\expandafter#3\expandafter=\cref@result\relax} % \end{macrocode} % \end{macro} % \begin{macro}{\@cref@countercmp} % The \cmd{\@cref@countercmp} macro recursively compares counter % components until it runs out of components for one of the references, % or finds two corresponding components that are unequal. % \begin{macrocode} \def\@cref@countercmp{% \let\@iterate\relax% \cref@isstackempty{\@countstacka}% \if@cref@stackempty% \cref@isstackempty{\@countstackb}% \if@cref@stackempty% \def\cref@result{0}% \else% \def\cref@result{1}% \fi% \else% \cref@isstackempty{\@countstackb}% \if@cref@stackempty% \def\cref@result{2}% \else% \edef\@tempa{\cref@stack@top{\@countstacka}}% \cref@stack@pop{\@countstacka}% \edef\@tempb{\cref@stack@top{\@countstackb}}% \cref@stack@pop{\@countstackb}% \ifnum\@tempa<\@tempb\relax% \def\cref@result{1}% \else% \ifnum\@tempa>\@tempb\relax% \def\cref@result{2}% \else% \def\@iterate{\@cref@countercmp}% \fi% \fi% \fi% \fi% \@iterate} % \end{macrocode} % \end{macro} % % \begin{macro}{\cref@pagecmp} % The \cmd{\cref@pagecmp} macro compares two references according to % their page numbers, as returned by \cmd{\cref@getpage}. It % \cmd{\chardef}'s its third argument to 0 if they're equal, 1 if the % first comes earlier than the second, or 2 if the first comes later % than the second. This is used later for sorting page references. % \begin{macrocode} \def\cref@pagecmp#1#2#3{% \begingroup% \def\@tempa{#1}% % \end{macrocode} % In order to ensure empty references end up in the right place when % sorting lists of multiple references, we make the comparison macro % sort them before a non-empty reference. % \begin{macrocode} \ifx\@tempa\@empty% \def\cref@result{1}% \else% \def\@tempa{#2}% \ifx\@tempa\@empty% \def\cref@result{2}% \else% % \end{macrocode} % Conversely, undefined references come after everything else. % \begin{macrocode} \expandafter\ifx\csname r@#1@cref\endcsname\relax% \def\cref@result{2}% \else% \expandafter\ifx\csname r@#2@cref\endcsname\relax% \def\cref@result{1}% \else% % \end{macrocode} % If both references are non-empty and are defined, we compare their page % numbers. % \begin{macrocode} \cref@getpageref{#1}{\@tempa}% \cref@getpageref{#2}{\@tempb}% \ifnum\@tempa<\@tempb\relax% \def\cref@result{1}\relax% \else% \ifnum\@tempa>\@tempb\relax% \def\cref@result{2}\relax% \else% \def\cref@result{0}\relax% \fi% \fi% \fi% \fi% \fi% \fi% \expandafter\endgroup\expandafter% \chardef\expandafter#3\expandafter=\cref@result\relax} % \end{macrocode} % \end{macro} % % \begin{macro}{\if@cref@inresetlist} % \begin{macro}{\cref@isinresetlist} % \begin{macro}{\cref@resetby} % We need to be able to determine which counter is used to reset a % given counter. Usually, resets are done by sectioning counters, and % we assume that to be the case here. \cmd{\cref@isinresetlist} % searches through one counter's reset list, stored in % \cmd{\cl@\meta{counter}}, to determine whether another counter % appears there, and sets the new conditional % appropriately. \cmd{\cref@reset@by} searches through all the % sectioning counters' reset lists, from lowest-level (subsubsection) % to highest (part), checking whether the given counter is in the list, % and returns the first sectioning counter in whose list it appears. % (The value is returned by defining its second argument, which should % be a macro name.) % \begin{macrocode} \newif\if@cref@inresetlist \def\cref@isinresetlist#1#2{% \begingroup% \def\@counter{#1}% % \end{macrocode} % We locally redefine \cmd{\@elt}, which appears at the head of the % expansion of |\cl@|\meta{counter}, so that entries in the reset list % end up separated by commas, thus can be treated as a stack. % \begin{macrocode} \def\@elt##1{##1,}% \expandafter\ifx\csname cl@#2\endcsname\relax% \def\cref@resetstack{,\@nil}% \else% \edef\cref@resetstack{\csname cl@#2\endcsname\noexpand\@nil}% \fi% \let\@nextcounter\relax% \cref@isstackfull{\cref@resetstack}% \@whilesw\if@cref@stackfull\fi{% \edef\@nextcounter{\cref@stack@top{\cref@resetstack}}% \ifx\@nextcounter\@counter% \@cref@stackfullfalse% \else% \let\@nextcounter\relax% \cref@stack@pop{\cref@resetstack}% \cref@isstackfull{\cref@resetstack}% \fi}% \ifx\@nextcounter\relax% \def\@next{\@cref@inresetlistfalse}% \else% \def\@next{\@cref@inresetlisttrue}% \fi% \expandafter% \endgroup% \@next} % \end{macrocode} % % FIXME: We could easily remove the hard-coded search order in % \cmd{\cref@resetby} and, say, replace it with a customisable list of % counters to search in order. But, so far, I've yet to encounter a need % for anything other than the hard-coded default. % \begin{macrocode} \def\cref@resetby#1#2{% \let#2\relax% % \end{macrocode} % If counter in question is |subfigure| or |subtable|, check if it's % reset by |figure| or |table|, respectively. % \begin{macrocode} \def\@tempa{#1}% \def\@tempb{subfigure}% \ifx\@tempa\@tempb% \cref@isinresetlist{#1}{figure}% \if@cref@inresetlist% \def#2{figure}% \fi% \fi% \def\@tempa{#1}% \def\@tempb{subtable}% \ifx\@tempa\@tempb% \cref@isinresetlist{#1}{table}% \if@cref@inresetlist% \def#2{table}% \fi% \fi% % \end{macrocode} % If counter in question is |equation|, and the counter |parentequation| % is defined, check if it's reset by that. The |parentequation| counter % is used by \package{amsmath}'s |subequations| environment. Although % \package{amsmath} doesn't implement |subequations| using counter reset % lists, \package{cleveref}'s \package{amsmath} support (above) tweaks % the reset lists inside |subequations| environments to hook into this % mechanism. We should really only check this when \package{amsmath} is % loaded, but checking it anyway might catch other packages that % independently implement amsmath's |subequations| environment (are there % any?). % \begin{macrocode} \@ifundefined{cl@parentequation}{}{% \def\@tempa{#1}% \def\@tempb{equation}% \ifx\@tempa\@tempb% \cref@isinresetlist{#1}{parentequation}% \if@cref@inresetlist% \expandafter\ifnum\c@parentequation=0\else% \def#2{parentequation}% \fi% \fi% \fi}% % \end{macrocode} % If counter in question is |enum|\meta{x}, check if it's reset by a % higher-level |enum|\meta{x}. % \begin{macrocode} \def\@tempa{#1}% \def\@tempb{enumii}% \ifx\@tempa\@tempb% \def#2{enum}% \fi% \def\@tempb{enumiii}% \ifx\@tempa\@tempb% \def#2{enum}% \fi% \def\@tempb{enumiv}% \ifx\@tempa\@tempb% \def#2{enum}% \fi% \def\@tempb{enumv}% \ifx\@tempa\@tempb% \def#2{enum}% \fi% \def\@tempb{enum}% \ifx#2\@tempb% \cref@isinresetlist{#1}{enumiv}% \if@cref@inresetlist% \def#2{enumiv}% \else% \cref@isinresetlist{#1}{enumiii}% \if@cref@inresetlist% \def#2{enumiii}% \else% \cref@isinresetlist{#1}{enumii}% \if@cref@inresetlist% \def#2{enumii}% \else% \cref@isinresetlist{#1}{enumi}% \if@cref@inresetlist% \def#2{enumi}% \else% \cref@isinresetlist{#1}{part}% \if@cref@inresetlist% \def#2{part}% \else% \let#2\relax% \fi% \fi% \fi% \fi% \fi% \fi% % \end{macrocode} % If we haven't found anything so far, check if it's reset by a % sectioning command. % \begin{macrocode} \ifx#2\relax% \cref@isinresetlist{#1}{table}% \if@cref@inresetlist% \def#2{table}% \else% \cref@isinresetlist{#1}{subsubsection}% \if@cref@inresetlist% \def#2{subsubsection}% \else% \cref@isinresetlist{#1}{subsection}% \if@cref@inresetlist% \def#2{subsection}% \else% \cref@isinresetlist{#1}{section}% \if@cref@inresetlist% \def#2{section}% \else% \cref@isinresetlist{#1}{chapter}% \if@cref@inresetlist% \def#2{chapter}% \else% \cref@isinresetlist{#1}{part}% \if@cref@inresetlist% \def#2{part}% \else% \let#2\relax% \fi% \fi% \fi% \fi% \fi% \fi% \fi} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\if@cref@refconsecutive} % \begin{macro}{\cref@isrefconsecutive} % Define a new conditional to test whether two references are % consecutive (needed when typesetting reference ranges). This uses % the counter and prefix (i.e.\ formatted version of the counter that % resets the label's counter) information provided by % \cmd{\r@\meta{label}@cref} (via the \file{aux} file) to check if the % prefixes are identical (i.e.\ the references come from the same % chapter, section or whatever), and that the label counters differ % by~0 or~1. % \begin{macrocode} \newif\if@cref@refconsecutive% \def\cref@isrefconsecutive#1#2{% \begingroup% \countdef\refa@counter=0% \countdef\refb@counter=1% \cref@getcounter{#1}{\cref@result}% \refa@counter=\cref@result% \cref@getcounter{#2}{\cref@result}% \refb@counter=\cref@result% \cref@getprefix{#1}{\refa@prefix}% \cref@getprefix{#2}{\refb@prefix}% \def\@after{\@cref@refconsecutivefalse}% \ifx\refa@prefix\refb@prefix% \ifnum\refa@counter=\refb@counter\relax% \def\@after{\@cref@refconsecutivetrue}% \else% \advance\refa@counter 1\relax% \ifnum\refa@counter=\refb@counter\relax% \def\@after{\@cref@refconsecutivetrue}% \fi% \fi% \fi% \expandafter\endgroup\@after} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\cref@ispagerefconsecutive} % Similarly, define a test for whether two page references are % consecutive (needed when typesetting page ranges). We use the same % |\if@cref@refconsecutive| conditional as above. % \begin{macrocode} \def\cref@ispagerefconsecutive#1#2{% \begingroup% \countdef\refa@counter=0% \countdef\refb@counter=1% \cref@getpageref{#1}{\cref@result}% \refa@counter=\cref@result% \cref@getpageref{#2}{\cref@result}% \refb@counter=\cref@result% \def\@after{\@cref@refconsecutivefalse}% \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% \expandafter\endgroup\@after} % \end{macrocode} % \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 @cref\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 @cref\endcsname\relax% \def\@nexttype{\@undefined}% \def\@nextformat{\@undefined}% \else% \expandafter\cref@gettype\expandafter% {\@nextref}{\@nexttype}% \def\@tempa{\@undefined}% \ifx\@nexttype\@tempa% \def\@nextformat{\@undefined}% \else% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@nextformat% \expandafter\expandafter\expandafter{% \csname cref@\@nexttype @format\endcsname% {\@dummya}{\@dummyb}{\@dummyc}}% \fi% \fi% \fi% \fi}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\cref@processgroupall} % \cmd{\cref@processgroupall} processes the first group of references % from the stack passed in argument |#1|, by moving all references with % the same type as the first one into the stack passed in argument % |#2|. % \begin{macrocode} \def\cref@processgroupall#1#2{% \cref@stack@init{\@tempstack}% \edef\@nextref{\cref@stack@top{#1}}% \expandafter\ifx\csname r@\@nextref @cref\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 @cref\endcsname\relax% \def\@nexttype{\@undefined}% \def\@nextformat{\@undefined}% \else% \expandafter\cref@gettype\expandafter% {\@nextref}{\@nexttype}% \def\@tempa{\@undefined}% \ifx\@nexttype\@tempa% \def\@nextformat{\@undefined}% \else% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@nextformat% \expandafter\expandafter\expandafter{% \csname cref@\@nexttype @format\endcsname% {\@dummya}{\@dummyb}{\@dummyc}}% \fi% \fi% \fi% % \ifx\@nextformat\@groupformat% \expandafter\cref@stack@pull\expandafter{\@nextref}{#2}% \else% \expandafter\cref@stack@pull\expandafter{\@nextref}{\@tempstack}% \fi% \cref@stack@pop{#1}% \let\@lasttype\@nexttype% \let\@lastformat\@nextformat% \cref@isstackfull{#1}}% \let#1\@tempstack} % \end{macrocode} % \end{macro} % % \begin{macro}{\cref@processconsecutive} % \cmd{\cref@processconsecutive} processes the first sequence of % consecutive references from the stack passed in |#1|, sets the macro % passed as |#2| to the first reference in the sequence, sets |#3| to % the last reference, and sets the counter passed in |#4| to the number % of consecutive references in the sequence. % \begin{macrocode} \def\cref@processconsecutive#1#2#3#4#5{% #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@cref\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 @cref\endcsname\relax% \@cref@refconsecutivefalse% \else% \edef\@tempa{{#2}{\@nextref}}% \expandafter#5\@tempa% \fi% \fi% \fi% % \end{macrocode} % Remove references from the stack until we find end of consecutive % sequence. % \begin{macrocode} \@whilesw\if@cref@refconsecutive\fi{% \advance#4 1% \let#3\@nextref% \cref@stack@pop{#1}% \cref@isstackempty{#1}% \if@cref@stackempty% \@cref@refconsecutivefalse% \else% \edef\@nextref{\cref@stack@top{#1}}% % \end{macrocode} % If next reference is empty, remove any consecutive empty % references and we're done. % \begin{macrocode} \ifx\@nextref\@empty% \@cref@refconsecutivefalse% \@whilesw\ifx\@nextref\@empty\fi{% \cref@stack@pop{#1}% \cref@isstackempty{#1}% \if@cref@stackempty% \let\@nextref\relax% \else% \edef\@nextref{\cref@stack@top{#1}}% \fi}% % \end{macrocode} % Otherwise, test whether next reference is consecutive or not. % \begin{macrocode} \else% \expandafter\ifx\csname r@\@nextref @cref\endcsname\relax% \@cref@refconsecutivefalse% \else% \edef\@tempa{{#3}{\@nextref}}% \expandafter#5\@tempa% \fi% \fi% \fi}% \fi} % \end{macrocode} % \end{macro} % % % % \subsection{Cross-Referencing Commands} % \begin{macro}{\cref} % \begin{macro}{\Cref} % \begin{macro}{\crefrange} % \begin{macro}{\Crefrange} % Define the main referencing command \cmd{\cref} and the % start-of-sentence variant \cmd{\Cref}, along with the reference range % commands \cmd{\crefrange} and \cmd{\Crefrange}. % \begin{macrocode} \DeclareRobustCommand{\cref}[1]{\@cref{cref}{#1}} \DeclareRobustCommand{\Cref}[1]{\@cref{Cref}{#1}} \DeclareRobustCommand{\crefrange}[2]{\@setcrefrange{#1}{#2}{cref}{}} \DeclareRobustCommand{\Crefrange}[2]{\@setcrefrange{#1}{#2}{Cref}{}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\if@crefstarred} % The |\if@crefstarred| flag is set within starred variants of % \package{cleveref} commands. Starred variants are only defined if % either the \package{hyperref} or \package{varioref} package is % loaded, so we only define it in those cases. We need to |\let| % |\if@crefstarred| to something even when not using it, otherwise % \TeX{} gets confused when parsing code that contains % |\if@crefstarred| inside a nested if. % \begin{macrocode} \@ifpackageloaded{hyperref}{\newif\if@crefstarred}{% \@ifpackageloaded{varioref}{\newif\if@crefstarred}{}} \let\if@crefstarred\iffalse% % \end{macrocode} % \end{macro} % % \begin{macro}{\@cref} % To save duplicating code, the referencing macros pass an argument % determining the variant to an auxiliary 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, typesetting 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 \emph{expand to} label names, rather % than label names per se. % \begin{macrocode} \countdef\count@consecutive=0% \countdef\count@group=1% \count@group=1% \def\cref@variant{#1}% \newif\if@secondref% \cref@stack@init{\@refstack}% \edef\@tempa{#2}% \expandafter\cref@stack@push\expandafter{\@tempa}{\@refstack}% \cref@isstackfull{\@refstack}% % \end{macrocode} % Loop until the reference stack is empty. % \begin{macrocode} \@whilesw\if@cref@stackfull\fi{% % \end{macrocode} % Move next group of references with same type into \cmd{\@refsubstack}. % \begin{macrocode} \cref@stack@init{\@refsubstack}% \if@cref@sort% \cref@processgroupall{\@refstack}{\@refsubstack}% \cref@stack@sort{\@refsubstack}{\cref@countercmp}% \else% \cref@processgroup{\@refstack}{\@refsubstack}% \fi% % \end{macrocode} % % typeset 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}% {\cref@isrefconsecutive}% \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, typeset 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, typeset the first one % and return the second to the substack (we add an empty reference % after it just to make sure there's no further compression); % \begin{macrocode} \else% \ifnum\count@consecutive=2\relax% \expandafter\@setcref% \expandafter{\@beginref}{\cref@variant}{@first}% \expandafter\cref@stack@push\expandafter% {\@endref,}{\@refsubstack}% % \end{macrocode} % otherwise, typeset a reference range. % \begin{macrocode} \else% \edef\@tempa{{\@beginref}{\@endref}}% \if@cref@stackempty% \expandafter\@setcrefrange\@tempa{\cref@variant}{}% \else% \expandafter\@setcrefrange\@tempa{\cref@variant}{@first}% \fi% \fi% \fi% % \end{macrocode} % % Process further groups of consecutive references, until substack is % empty. % \begin{macrocode} \@secondreftrue% \cref@isstackfull{\@refsubstack}% \@whilesw\if@cref@stackfull\fi{% \if@cref@compress% \cref@processconsecutive% {\@refsubstack}{\@beginref}{\@endref}{\count@consecutive}% {\cref@isrefconsecutive}% \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 typeset an ``end'' % reference, otherwise we will need to typeset 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 typeset the next % reference; % \begin{macrocode} \ifnum\count@consecutive=1\relax% \edef\@tempa{{\@beginref}{cref}{\@pos}}% \expandafter\@setcref\@tempa% \else% % \end{macrocode} % if there were only two consecutive references, typeset 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, typeset a reference range. % \begin{macrocode} \else% \edef\@tempa{{\@beginref}{\@endref}{cref}{\@pos}}% \expandafter\@setcrefrange\@tempa% \fi% \fi% \@secondreffalse% \cref@isstackfull{\@refsubstack}% }% end loop over reference substack \cref@isstackfull{\@refstack}% % \end{macrocode} % If we're typesetting a \cmd{\labelcref} reference and references in % stack have different types, throw a warning and stop processing. % \begin{macrocode} \if@cref@stackfull% \def\@tempa{#1}\def\@tempb{labelcref}% \ifx\@tempa\@tempb\relax% \protect\G@refundefinedtrue% \nfss@text{\reset@font\bfseries\space ??}% \@latex@warning{References in label reference on page \thepage \space have different types}% \@cref@stackfullfalse% \fi% \fi% }% end loop over main reference stack \endgroup} % \end{macrocode} % \end{macro} % % % \begin{macro}{\@setcref} % The internal \cmd{\@setcref} macro deals with actually typesetting % the reference, by calling the appropriate type-dependent formatting % macro defined by \cmd{\crefformat} etc. |#1| contains the reference % itself, |#2| is either ``cref'' or ``Cref'' and determines the % capitalisation variant, and |#3| is either empty or one of % ``@second'', ``@middle'' or ``@last'', determining the type of % reference group to typeset. % \begin{macrocode} \def\@setcref#1#2#3{% \expandafter\ifx\csname r@#1@cref\endcsname\relax% \protect\G@refundefinedtrue% \nfss@text{\reset@font\bfseries ??}% \@latex@warning{Reference `#1' on page \thepage \space undefined}% \else% \cref@gettype{#1}{\@temptype}% puts label type in \@temptype \cref@getlabel{#1}{\@templabel}% puts label in \@templabel \expandafter\ifx\csname #2@\@temptype @format#3\endcsname\relax% % \end{macrocode} % If reference format is undefined, but we're typesetting a % \cmd{\labelcref}, fall back to default \cmd{\labelcref} format. % \begin{macrocode} \edef\@tempa{#2}\def\@tempb{labelcref}% \ifx\@tempa\@tempb\relax% \expandafter\@@setcref\expandafter% {\csname #2@default@format#3\endcsname}{#1}% \else% \protect\G@refundefinedtrue% \nfss@text{\reset@font\bfseries ??}~\@templabel% \@latex@warning{#2 \space reference format for label type `\@temptype' undefined}% \fi% \else% \expandafter\@@setcref\expandafter% {\csname #2@\@temptype @format#3\endcsname}{#1}% \fi% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\@@setcref} % We separate out the very final typesetting step into a separate % macro, in order to make it easier to redefine things later to make % them work with the \package{hyperref} package. % \begin{macrocode} \def\@@setcref#1#2{\cref@getlabel{#2}{\@templabel}#1{\@templabel}{}{}} % \end{macrocode} % \end{macro} % % \begin{macro}{\@setcrefrange} % The internal \cmd{\@setcrefrange} macro deals with typesetting % reference ranges, just as \cmd{\@setcref} does for normal % references. The actual typesetting is no more complicated in the % range case; it's the error checking that makes the code so much % 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@cref\endcsname\relax% \protect\G@refundefinedtrue% \@latex@warning{Reference `#1' on page \thepage \space% undefined}% \expandafter\ifx\csname r@#2@cref\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@cref\endcsname\relax% \protect\G@refundefinedtrue% \cref@getlabel{#1}{\@labela}% \@labela--\nfss@text{\reset@font\bfseries ??}% \@latex@warning{Reference `#2' on page \thepage % \space undefined}% % \end{macrocode} % If both references are defined, check that the reference format is % defined. % \begin{macrocode} \else% \cref@gettype{#1}{\@typea}% \cref@gettype{#2}{\@typeb}% \cref@getlabel{#1}{\@labela}% \cref@getlabel{#2}{\@labelb}% \edef\@formata{\expandafter\noexpand% \csname #3range@\@typea @format#4\endcsname}% \edef\@formatb{\expandafter\noexpand% \csname #3range@\@typeb @format#4\endcsname}% \expandafter\ifx\@formata\relax% % \end{macrocode} % If reference format is undefined, but we're typesetting a % \cmd{\labelcref}, fall back to default \cmd{\labelcref} % formats. % \begin{macrocode} \edef\@tempa{#3}\def\@tempb{labelcref}% \ifx\@tempa\@tempb\relax% \expandafter\@@setcrefrange\expandafter% {\csname #3range@default@format#4\endcsname}{#1}{#2}% \else% \protect\G@refundefinedtrue% \nfss@text{\reset@font\bfseries ??}~\@labela--\@labelb% \@latex@warning{#3\space reference range format for label type `\@typea' undefined}% \fi% \else% % \end{macrocode} % If reference types are identical, typeset reference range, % otherwise display warning.\\ % (Note: there's no need to check if reference format for second type % is defined, since if it isn't it will be caught here as a % non-identical type.) % \begin{macrocode} \ifx\@formata\@formatb% \expandafter\@@setcrefrange\expandafter{\@formata}{#1}{#2}% \else% \protect\G@refundefinedtrue% \nfss@text{\reset@font\bfseries ??}~\@labela--\@labelb% \@latex@warning{References `#1' and `#2' in reference range on page \thepage have different types}% \fi% \fi% \fi% \fi% \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\@@setcrefrange} % We again separate out the very final typesetting step into a % separate macro, in order to make it easier to redefine things later % to make them work with the \package{hyperref} package. % \begin{macrocode} \def\@@setcrefrange#1#2#3{% \cref@getlabel{#2}{\@labela}% \cref@getlabel{#3}{\@labelb}% #1{\@labela}{\@labelb}{}{}{}{}} % \end{macrocode} % \end{macro} % % % The typesetting of conjunctions is also separated out into separate % macros, for the same reason. % \begin{macrocode} \def\@setcref@pairgroupconjunction{\crefpairgroupconjunction} \def\@setcref@middlegroupconjunction{\crefmiddlegroupconjunction} \def\@setcref@lastgroupconjunction{\creflastgroupconjunction} % \end{macrocode} % % \begin{macro}{\labelcref} % \begin{macro}{\namecref} % \begin{macro}{\nameCref} % \begin{macro}{\lcnamecref} % \begin{macro}{\namecrefs} % \begin{macro}{\nameCrefs} % \begin{macro}{\lcnamecrefs} % Finally, we define a \cmd{\labelcref} command that returns just the % typeset label part of a (multi-)reference, without the reference % name, and conversely \cmd{\namecref}, \cmd{\nameCref}, % \cmd{\namecrefs} and \cmd{\nameCrefs} commands that return just the % typeset name of a reference, without the reference label. The latter % four retrieve the reference name from the corresponding % \cmd{\crefname} or \cmd{\Crefname} definition, so they only work when % this has been defined. We also define \cmd{\lcnamecref} and % \cmd{\lcnamecrefs} commands which force the reference name to % lowercase, for use when the \option{capitalise} option is enabled. % \begin{macrocode} \DeclareRobustCommand{\labelcref}[1]{\@cref{labelcref}{#1}} \DeclareRobustCommand{\namecref}[1]{% \@setnamecref{cref}{#1}{}{}} \DeclareRobustCommand{\nameCref}[1]{% \@setnamecref{Cref}{#1}{}{}} \DeclareRobustCommand{\lcnamecref}[1]{% \@setnamecref{Cref}{#1}{}{\MakeLowercase}} \DeclareRobustCommand{\namecrefs}[1]{% \@setnamecref{cref}{#1}{@plural}{}} \DeclareRobustCommand{\nameCrefs}[1]{% \@setnamecref{Cref}{#1}{@plural}{}} \DeclareRobustCommand{\lcnamecrefs}[1]{% \@setnamecref{Cref}{#1}{@plural}{\MakeLowercase}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\@setnamecref} % \cmd{\@setnamecref} is the real macro underlying all the % \cmd{\namecref} commands. % \begin{macrocode} \def\@setnamecref#1#2#3#4{% \expandafter\ifx\csname r@#2@cref\endcsname\relax% \protect\G@refundefinedtrue% \nfss@text{\reset@font\bfseries ??}% \@latex@warning{Reference `#1' on page \thepage \space undefined}% \else% \cref@gettype{#2}{\@tempa}% \@ifundefined{#1@\@tempa @name#3}{% \protect\G@refundefinedtrue%`` \nfss@text{\reset@font\bfseries ??}% \@latex@warning{Reference name for label type `\@tempa' undefined}% }{% \edef\@tempa{% \expandafter\noexpand\csname #1@\@tempa @name#3\endcsname}% \expandafter\@@setnamecref\expandafter{\@tempa}{#4}% }% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\@@setnamecref} % We again separate out the final typesetting step of the % \cmd{\namecref} commands. % \begin{macrocode} \def\@@setnamecref#1#2{% \expandafter\def\expandafter\@tempa\expandafter{#1}% \expandafter#2\@tempa} % \end{macrocode} % \end{macro} % % % % \subsection{Page-Referencing Commands} % \begin{macro}{\cpageref} % \begin{macro}{\Cpageref} % \begin{macro}{\cpagerefrange} % \begin{macro}{\Cpagerefrange} % Define the main page referencing command \cmd{\cpageref} and the % start-of-sentence variant \cmd{\Cpageref}, along with the % \cmd{\cpagerefrange} and \cmd{\Cpagerefrange} page range referencing % commands, and \cmd{\labelcpageref} (the counterpart to % \cmd{\labelcref}). % \begin{macrocode} \DeclareRobustCommand{\cpageref}[1]{% \@cpageref{cref}{#1}{\@setcpageref}{\@setcpagerefrange}} \DeclareRobustCommand{\Cpageref}[1]{% \@cpageref{Cref}{#1}{\@setcpageref}{\@setcpagerefrange}} \DeclareRobustCommand{\cpagerefrange}[2]{% \@setcpagerefrange{#1}{#2}{cref}{}} \DeclareRobustCommand{\Cpagerefrange}[2]{% \@setcpagerefrange{#1}{#2}{Cref}{}} \DeclareRobustCommand{\labelcpageref}[1]{% \@cpageref{labelcref}{#1}{\@setcpageref}{\@setcpagerefrange}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\@cpageref} % The \cmd{\@cpageref} macro is the work-horse of the clever page % referencing features (analogous to the role of \cmd{\@cref} for % cross-references, though slightly simpler as it does not have to deal % with grouping references by type, all page references being % references to pages!). It deals with typesetting the conjunctions % between groups of page references, and any sorting and compressing of % the page references. |#1| contains the list of references, |#2| is % ``cref'' or ``Cref'' and determines the capitalisation variant, |#3| % and |#4| are the macros to use for typesetting page references and % page range references, respectively. (The \cmd{\cpageref} and % \cmd{\Cpageref} commands always set these to \cmd{\@setcpageref} and % \cmd{\@setcpagerangeref}; the \package{varioref} package support uses % these arguments to integrate the \package{cleveref} and % \package{varioref} page referencing features.) % \begin{macrocode} \def\@cpageref#1#2#3#4{% \leavevmode% \begingroup% % \end{macrocode} % Initialise some things, and put all the references into a stack called % \cmd{\@refstack}. Note that we fully expand the second argument, in % case it contains commands that \emph{expand to} label names, rather % than label names per se. % \begin{macrocode} \countdef\count@consecutive=0% \countdef\count@group=1% \countdef\@counta=2% \countdef\@countb=3% \count@group=0% \cref@stack@init{\@refstack}% \edef\@tempa{#2}% \expandafter\cref@stack@push\expandafter{\@tempa}{\@refstack}% \if@cref@sort% \cref@stack@sort{\@refstack}{\cref@pagecmp}% \fi% % \end{macrocode} % Loop until the reference stack is empty. % \begin{macrocode} \cref@isstackfull{\@refstack}% \@whilesw\if@cref@stackfull\fi{% \if@cref@compress% \cref@processconsecutive% {\@refstack}{\@beginref}{\@endref}{\count@consecutive}% {\cref@ispagerefconsecutive}% \else% \edef\@beginref{\cref@stack@top{\@refstack}}% \cref@stack@pop{\@refstack}% % \end{macrocode} % Empty references serve no purpose when we're not compressing % consecutive references, so we simply remove them. % \begin{macrocode} \@whilesw\ifx\@beginref\@empty\fi{% \cref@stack@pop{\@refstack}% \cref@isstackempty{\@refstack}% \if@cref@stackempty% \let\@beginref\relax% \else% \edef\@beginref{\cref@stack@top{\@refstack}}% \fi}% \let\@endref\relax% \count@consecutive=1\relax% \fi% % \end{macrocode} % If the start and end pages of a reference range are the same, treat it as % a single page reference instead of a page range. If start and end pages % of a reference range differ by 1, treat it as a pair of page references % instead of a range. % \begin{macrocode} \ifx\@endref\relax\else% \expandafter\ifx\csname r@\@beginref @cref\endcsname\relax\else% \expandafter\ifx\csname r@\@endref @cref\endcsname\relax\else% \cref@getpageref{\@beginref}{\@tempa}% \cref@getpageref{\@endref}{\@tempb}% \ifx\@tempa\@tempb\relax% \count@consecutive=1% \let\@endref\relax% \else% \@counta=\@tempa\relax% \@countb=\@tempb\relax% \advance\@counta 1\relax% \ifnum\@counta=\@countb\relax% \count@consecutive=2% \fi% \fi% \fi% \fi% \fi% % \end{macrocode} % Determine whereabouts the current group of page references comes in the % overall list of page references. % \begin{macrocode} \cref@isstackempty{\@refstack}% \if@cref@stackempty% \ifcase\count@group\relax% \ifnum\count@consecutive=2\relax% \def\@pos{@first}% \else% \def\@pos{}% \fi% \or% \ifnum\count@consecutive=2\relax% \def\@pos{@middle}% \else% \def\@pos{@second}% \fi% \else% \def\@pos{@last}% \fi% \else% \ifnum\count@group=0\relax% \def\@pos{@first}% \else% \def\@pos{@middle}% \fi% \fi% % \end{macrocode} % If there were no consecutive references, just typeset the next % reference; % \begin{macrocode} \ifnum\count@consecutive=1\relax% \def\@tempa{#3}% \edef\@tempb{{\@beginref}{#1}{\@pos}}% \expandafter\@tempa\@tempb% \else% % \end{macrocode} % if there were only two consecutive references, typeset the first one % and return the second to the substack (we add an empty reference % after it just to make sure there's no further compression); % \begin{macrocode} \ifnum\count@consecutive=2\relax% \def\@tempa{#3}% \edef\@tempb{{\@beginref}{#1}{\@pos}}% \expandafter\@tempa\@tempb% \expandafter\cref@stack@push\expandafter% {\@endref,}{\@refstack}% % \end{macrocode} % otherwise, typeset a reference range. % \begin{macrocode} \else% \def\@tempa{#4}% \edef\@tempb{{\@beginref}{\@endref}{#1}{\@pos}}% \expandafter\@tempa\@tempb% \fi% \fi% \advance\count@group 1% \cref@isstackfull{\@refstack}% }% end loop over reference stack \endgroup} % \end{macrocode} % \end{macro} % % % \begin{macro}{\@setcpageref} % The internal \cmd{\@setcpageref} macro deals with actually typesetting % the page reference, by calling the appropriate type-dependent % formatting macro defined by \cmd{\crefformat} etc. |#1| contains the % reference itself, |#2| is either ``cref'' or ``Cref'' and determines % the capitalisation variant, and |#3| is either empty or one of % ``@second'', ``@middle'' or ``@last'', determining the type of % reference group to typeset. % \begin{macrocode} \def\@setcpageref#1#2#3{% \expandafter\ifx\csname r@#1@cref\endcsname\relax% \protect\G@refundefinedtrue% \nfss@text{\reset@font\bfseries ??}% \@latex@warning{Reference `#1' on page \thepage \space undefined}% \else% \cref@getpageref{#1}{\@temppage}% \expandafter\ifx\csname #2@page@format#3\endcsname\relax% % \end{macrocode} % If reference format is undefined, but we're typesetting a % \cmd{\labelcpageref}, fall back to default \cmd{\labelcref} format. % \begin{macrocode} \edef\@tempa{#2}\def\@tempb{labelcref}% \ifx\@tempa\@tempb\relax% \expandafter\@@setcpageref\expandafter% {\csname #2@default@format#3\endcsname}{#1}% \else% \protect\G@refundefinedtrue% \nfss@text{\reset@font\bfseries ??}~\@temppage% \@latex@warning{#2 \space reference format for page references undefined}% \fi% \else% \expandafter\@@setcpageref\expandafter% {\csname #2@page@format#3\endcsname}{#1}% \fi% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\@@setcpageref} % We separate out the very final typesetting step into a separate % macro, in order to make it easier to redefine things later to make % them work with the \package{hyperref} package. % \begin{macrocode} \def\@@setcpageref#1#2{% \cref@getpageref{#2}{\@temppage}#1{\@temppage}{}{}} % \end{macrocode} % \end{macro} % % \begin{macro}{\@setcpagerefrange} % The internal \cmd{\@setcpagerefrange} macro deals with typesetting % page range references, just as \cmd{\@setcpageref} does for normal % page references. % \begin{macrocode} \def\@setcpagerefrange#1#2#3#4{% \begingroup% % \end{macrocode} % Check if both references are defined. % \begin{macrocode} \expandafter\ifx\csname r@#1@cref\endcsname\relax% \protect\G@refundefinedtrue% \@latex@warning{Reference `#1' on page \thepage \space% undefined}% \expandafter\ifx\csname r@#2@cref\endcsname\relax% \nfss@text{\reset@font\bfseries ??}--% \nfss@text{\reset@font\bfseries ??}% \@latex@warning{Reference `#2' on page \thepage \space% undefined}% \else% \cref@getpageref{#2}{\@pageb}% \nfss@text{\reset@font\bfseries ??}--\@pageb% \fi% \else% \expandafter\ifx\csname r@#2@cref\endcsname\relax% \protect\G@refundefinedtrue% \cref@getpageref{#1}{\@pagea}% \@pagea--\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@getpageref{#1}{\@pagea}% \cref@getpageref{#2}{\@pageb}% \edef\@format{\expandafter\noexpand% \csname #3range@page@format#4\endcsname}% \expandafter\ifx\@format\relax% % \end{macrocode} % If page reference format is undefined, but we're typesetting a % \cmd{\labelcpageref}, fall back to default \cmd{\labelcref} % formats. % \begin{macrocode} \edef\@tempa{#3}\def\@tempb{labelcref}% \ifx\@tempa\@tempb\relax% \expandafter\@@setcpagerefrange\expandafter% {\csname #3range@default@format#4\endcsname}{#1}{#2}% \else% \protect\G@refundefinedtrue% \nfss@text{\reset@font\bfseries ??}~\@pagea--\@pageb% \@latex@warning{#3\space reference range format for page references undefined}% \fi% \else% % \end{macrocode} % typeset page reference range, % \begin{macrocode} \expandafter\@@setcpagerefrange\expandafter{\@format}{#1}{#2}% \fi% \fi% \fi% \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\@@setcpagerefrange} % We again separate out the very final typesetting step into a % separate macro, in order to make it easier to redefine things later % to make them work with the \package{hyperref} package. % \begin{macrocode} \def\@@setcpagerefrange#1#2#3{% \cref@getpageref{#2}{\@pagea}% \cref@getpageref{#3}{\@pageb}% #1{\@pagea}{\@pageb}{}{}{}{}} % \end{macrocode} % \end{macro} % % % % \subsection{Reference Format Customisation Commands} % % \subsubsection{Format component commands} % \begin{macro}{\cref@label@types} % The reference formats are usually constructed out of components % defined by the user-level \cmd{\crefname}, \cmd{\Crefname}, % \cmd{\creflabel} and \cmd{\crefrangelabel} commands. % \cmd{\cref@label@types} keeps track of label types for which % components have been defined, and therefore need constructing at % \cmd{\begindocument} (see below). % % FIXME: We don't check if the label type is already in the list, so % some formats may needlessly be redefined identically, multiple times. % % \begin{macrocode} \cref@stack@init{\cref@label@types} % \end{macrocode} % \end{macro} % % \begin{macro}{\crefdefaultlabelformat} % \begin{macro}{\crefname} % \begin{macro}{\Crefname} % \begin{macro}{\creflabelformat} % \begin{macro}{\crefrangelabelformat} % The component customisation commands simply use the supplied % arguments to define appropriately named macros containing the % formatting components. If the corresponding \cmd{\Crefname} or % \cmd{\crefname} variant is not already defined, \cmd{\crefname} and % \cmd{\Crefname} define it to be a version with the first letter % capitalised or lower-cased, respectively. % \begin{macrocode} \newcommand{\crefdefaultlabelformat}[1]{% \def\cref@default@label##1##2##3{#1}} \newcommand{\crefname}[3]{% \@crefname{cref}{#1}{#2}{#3}{}} \newcommand{\Crefname}[3]{% \@crefname{Cref}{#1}{#2}{#3}{}} \newcommand{\creflabelformat}[2]{% \expandafter\def\csname cref@#1@label\endcsname##1##2##3{#2}% \cref@stack@add{#1}{\cref@label@types}} \newcommand{\crefrangelabelformat}[2]{% \expandafter\def\csname cref@#1@rangelabel\endcsname% ##1##2##3##4##5##6{#2}% \cref@stack@add{#1}{\cref@label@types}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\crefalias} % The \cmd{\crefalias} command aliases a counter name to another % cross-reference type, so can be used to make the same cross-reference % format apply to multiple different counters. %\begin{macrocode} \newcommand{\crefalias}[2]{% \expandafter\def\csname cref@#1@alias\endcsname{#2}} % \end{macrocode} % \end{macro} % % \begin{macro}{\crefname@preamble} % \begin{macro}{\Crefname@preamble} % The \cmd{\crefname@preamble} and \cmd{\Crefname@preamble} commands % are very like the \cmd{\crefname} and \cmd{\Crefname} commands, but % they tag ``|@preamble|'' onto the end of the generated macro names. % They are used when defining the default formats for different % languages (see \cref{sec:code:babel}). %\begin{macrocode} \newcommand{\crefname@preamble}[3]{% \@crefname{cref}{#1}{#2}{#3}{@preamble}} \newcommand{\Crefname@preamble}[3]{% \@crefname{Cref}{#1}{#2}{#3}{@preamble}} % \end{macrocode} % \end{macro} % \end{macro} % % % \begin{macro}{cref@othervariant} % The following utility macro sets up the appropriate definitions for % the other capitalisation variant. It defines the macro passed in |#2| % to be the other variant (``cref'' or ``Cref'') to the one specified % in |#1|, and defines |#3| to be the appropriate % capitalisation-changing command. It makes use of the fact that the % first character of \#1 is ``c'' for the lower-case variant and ``C'' % for the upper-case one. % \begin{macrocode} \def\cref@othervariant#1#2#3{\cref@@othervariant#1\@nil#2#3} \def\cref@@othervariant#1#2\@nil#3#4{% \if#1c% \def#3{C#2}% \def#4{\MakeUppercase}% \else% \def#3{c#2}% \if@cref@capitalise% \def#4{}% \else% \def#4{\MakeLowercase}% \fi% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\@crefname} % The \cmd{\@crefname} utility macro does the real work of defining % format names, by defining an appropriately named command to contain % the format component, and using the additional first argument % (``cref'' or ``Cref'') to determine how to define the corresponding % command with the other capitalisation. The extra fifth argument gets % tagged onto the end of the generated macro names. Note that % \cmd{\@crefname} \emph{must not} create global definitions, or else % it will break \package{babel}'s \cmd{\otherlanguage}, % \cmd{\otherlanguage*} and \cmd{\foreignlanguage} commands. % \begin{macrocode} \def\@crefname#1#2#3#4#5{% \expandafter\def\csname #1@#2@name#5\endcsname{#3}% \expandafter\def\csname #1@#2@name@plural#5\endcsname{#4}% % \end{macrocode} % If the other capitalisation variant is not already defined\dots % \begin{macrocode} \cref@othervariant{#1}{\@tempc}{\@tempd}% \@ifundefined{\@tempc @#2@name#5}{% % \end{macrocode} % Define \cmd{\@tempa} and \cmd{\@tempb} to be partial expansions (expanded % just once) of the macros for the capitalisation variant we've just % defined above. % \begin{macrocode} \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempa% \expandafter\expandafter\expandafter{% \csname#1@#2@name\endcsname}% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempb% \expandafter\expandafter\expandafter{% \csname#1@#2@name@plural\endcsname}% % \end{macrocode} % Add the case-change command stored in \cmd{\@tempd} to the front of the % definitions of \cmd{\@tempa} and \cmd{\@tempb}. % \begin{macrocode} \expandafter\ifx\@tempa\@empty\else% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempa% \expandafter\expandafter\expandafter{% \expandafter\@tempd\@tempa}% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempb% \expandafter\expandafter\expandafter{% \expandafter\@tempd\@tempb}% \fi% % \end{macrocode} % Define the other capitalisation variants to be the partial expansions % (expanded just once) of \cmd{\@tempa} and \cmd{\@tempb}. The % \cmd{\@toksa} token register just makes the code less verbose. % \begin{macrocode} \toksdef\@toksa=0% \@toksa={% \expandafter\def\csname\@tempc @#2@name#5\endcsname}% \expandafter\the\expandafter\@toksa\expandafter{\@tempa}% \@toksa={% \expandafter\def\csname\@tempc @#2@name@plural#5\endcsname}% \expandafter\the\expandafter\@toksa\expandafter{\@tempb}% }{}% % \end{macrocode} % Add label type to list of types that need defining from components. % \begin{macrocode} \cref@stack@add{#2}{\cref@label@types}} % \end{macrocode} % \end{macro} % % % \begin{macro}{\@crefconstructcomponents} % The \cmd{\@crefconstructcomponents} utility macro puts the reference % format components for the specified reference type into temporary % macros, for use by later macros. The ridiculous number of ``\#'' % characters ensure that the correct number remain when they come to be % used later (recall that pairs ``\#\#'' are collapsed to a single % ``\#'' each time the code is expanded). % \begin{macrocode} \def\@crefconstructcomponents#1{% % \end{macrocode} % Single cross-reference label format. % \begin{macrocode} \@ifundefined{cref@#1@label}{% \let\@templabel\cref@default@label% }{% \expandafter\let\expandafter\@templabel% \csname cref@#1@label\endcsname% }% % \end{macrocode} % Reference range label format. % \begin{macrocode} \@ifundefined{cref@#1@rangelabel}{% \expandafter\def\expandafter\@tempa\expandafter{% \@templabel{####1}{####3}{####4}}% \expandafter\def\expandafter\@tempb\expandafter{% \@templabel{####2}{####5}{####6}}% \toksdef\@toksa=0% \@toksa={\def\@temprangelabel##1##2##3##4##5##6}% \expandafter\expandafter\expandafter\the% \expandafter\expandafter\expandafter\@toksa% \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter\crefrangepreconjunction% \expandafter\@tempa\expandafter\crefrangeconjunction\@tempb% \crefrangepostconjunction}% }{% \expandafter\let\expandafter\@temprangelabel% \csname cref@#1@rangelabel\endcsname% }% % \end{macrocode} % If we're including names in hyperlinks, define variants of temporary % label macros which lack the hyperlink start argument (it will instead % be included in the temporary name macros). % \begin{macrocode} \if@cref@nameinlink% \expandafter\def\expandafter\@templabel@first\expandafter{% \@templabel{########1}{}{########3}}% \expandafter\def\expandafter\@temprangelabel@first\expandafter{% \@temprangelabel{########1}{########2}% {}{########4}{########5}{########6}}% \fi% % \end{macrocode} % Get the correct number of ``\#'''s into the label format definitions. % \begin{macrocode} \expandafter\def\expandafter\@templabel\expandafter{% \@templabel{########1}{########2}{########3}}% \expandafter\def\expandafter\@temprangelabel\expandafter{% \@temprangelabel{########1}{########2}{########3}% {########4}{########5}{########6}}% % \end{macrocode} % If we're not including names in hyperlinks, define all variants to be % the same as standard temporary name macros. % \begin{macrocode} \if@cref@nameinlink\else% \let\@templabel@first\@templabel% \let\@temprangelabel@first\@temprangelabel% \fi% % \end{macrocode} % % If including names in hyperlinks, define temporary name macros to % include hyperlink start argument. % \begin{macrocode} \if@cref@nameinlink% \def\@tempa##1##2{##2##1}% % \end{macrocode} % Lower-case singular cross-reference name. % \begin{macrocode} \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempname% \expandafter\expandafter\expandafter{% \expandafter\@tempa\expandafter% {\csname cref@#1@name\endcsname}{########2}}% % \end{macrocode} % Upper-case singular cross-reference name. % \begin{macrocode} \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempName% \expandafter\expandafter\expandafter{% \expandafter\@tempa\expandafter% {\csname Cref@#1@name\endcsname}{########2}}% % \end{macrocode} % Lower-case plural cross-reference name. % \begin{macrocode} \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempnameplural% \expandafter\expandafter\expandafter{% \expandafter\@tempa\expandafter% {\csname cref@#1@name@plural\endcsname}{########2}}% % \end{macrocode} % Upper-case plural cross-reference name. % \begin{macrocode} \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempNameplural% \expandafter\expandafter\expandafter{% \expandafter\@tempa\expandafter% {\csname Cref@#1@name@plural\endcsname}{########2}}% % \end{macrocode} % For cross-reference ranges, the hyperlink start argument is \#3 instead % of \#2, so we need a different variant of the temporary plural name % macros. % \begin{macrocode} \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempnameplural@range% \expandafter\expandafter\expandafter{% \expandafter\@tempa\expandafter% {\csname cref@#1@name@plural\endcsname}{########3}}% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempNameplural@range% \expandafter\expandafter\expandafter{% \expandafter\@tempa\expandafter% {\csname Cref@#1@name@plural\endcsname}{########3}}% % \end{macrocode} % % If we're not including names in hyperlinks, temporary name macros don't % include the hyperlink start argument. % \begin{macrocode} \else% % \end{macrocode} % Lower-case singular cross-reference name. % \begin{macrocode} \expandafter\def\expandafter\@tempname\expandafter{% \csname cref@#1@name\endcsname}% % \end{macrocode} % Upper-case singular cross-reference name. % \begin{macrocode} \expandafter\def\expandafter\@tempName\expandafter{% \csname Cref@#1@name\endcsname}% % \end{macrocode} % Lower-case plural cross-reference name. % \begin{macrocode} \expandafter\def\expandafter\@tempnameplural\expandafter{% \csname cref@#1@name@plural\endcsname}% % \end{macrocode} % Upper-case plural cross-reference name. % \begin{macrocode} \expandafter\def\expandafter\@tempNameplural\expandafter{% \csname Cref@#1@name@plural\endcsname}% % \end{macrocode} % Define reference range variants to be identical to normal variants. % \begin{macrocode} \let\@tempnameplural@range\@tempnameplural% \let\@tempNameplural@range\@tempNameplural% \fi% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@crefdefineformat} % The \cmd{\@crefdefineformat} et al.\ macros construct calls to % \cmd{\crefformat} et al.\ for the supplied reference type, which % define the corresponding formats in terms of the format components. % This is mostly just an arduous exercise in controlling macro % expansion order. % \begin{macrocode} \def\@crefdefineformat#1{% \begingroup% % \end{macrocode} % Put format components into tmp macros. % \begin{macrocode} \@crefconstructcomponents{#1}% % \end{macrocode} % Assemble the arguments for \cmd{\crefformat}, \cmd{\Crefformat} and % \cmd{\labelcrefformat} from the components. % \begin{macrocode} \ifx\@tempname\@empty\relax% \expandafter\def\expandafter\@tempfirst\expandafter{\@templabel}% \else% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempfirst% \expandafter\expandafter\expandafter{% \expandafter\@tempname\expandafter\nobreakspace\@templabel@first}% \fi% \ifx\@tempName\@empty\relax% \expandafter\def\expandafter\@tempFirst\expandafter{\@templabel}% \else% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempFirst% \expandafter\expandafter\expandafter{% \expandafter\@tempName\expandafter\nobreakspace\@templabel@first}% \fi% \expandafter\def\expandafter\@templabel\expandafter{\@templabel}% % \end{macrocode} % Define \cmd{\crefformat} and \cmd{\Crefformat}. % \begin{macrocode} \toksdef\@toksa=0% \@toksa={\crefformat{#1}}% \expandafter\the\expandafter\@toksa\expandafter{\@tempfirst}% \@toksa={\Crefformat{#1}}% \expandafter\the\expandafter\@toksa\expandafter{\@tempFirst}% % \end{macrocode} % Define \cmd{\labelcrefformat} if type has custom label format. % \begin{macrocode} \@ifundefined{cref@#1@label}{}{% \@toksa={\labelcrefformat{#1}}% \expandafter\the\expandafter\@toksa\expandafter{\@templabel}}% \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\@crefrangedefineformat} % Construct call to \cmd{\crefrangeformat}. % \begin{macrocode} \def\@crefrangedefineformat#1{% \begingroup% % \end{macrocode} % Put format components into tmp macros. % \begin{macrocode} \@crefconstructcomponents{#1}% % \end{macrocode} % Assemble the arguments for \cmd{\crefrangeformat}, % \cmd{\Crefrangeformat} and\linebreak[4] \cmd{\labelcrefrangeformat} % from the components. % \begin{macrocode} \ifx\@tempname\@empty\relax% \expandafter\def\expandafter\@tempfirst% \expandafter{\@temprangelabel}% \else% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempfirst% \expandafter\expandafter\expandafter{% \expandafter\@tempnameplural@range% \expandafter\nobreakspace\@temprangelabel@first}% \fi% \ifx\@tempName\@empty\relax% \expandafter\def\expandafter\@tempFirst% \expandafter{\@temprangelabel}% \else% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempFirst% \expandafter\expandafter\expandafter{% \expandafter\@tempNameplural@range% \expandafter\nobreakspace\@temprangelabel@first}% \fi% \expandafter\def\expandafter\@temprangelabel% \expandafter{\@temprangelabel}% % \end{macrocode} % Define \cmd{\crefrangeformat} and \cmd{\Crefrangeformat}. % \begin{macrocode} \toksdef\@toksa=0% \@toksa={\crefrangeformat{#1}}% \expandafter\the\expandafter\@toksa\expandafter{\@tempfirst}% \@toksa={\Crefrangeformat{#1}}% \expandafter\the\expandafter\@toksa\expandafter{\@tempFirst}% % \end{macrocode} % Define \cmd{\labelcrefrangeformat} if type has custom label format. % \begin{macrocode} \@ifundefined{cref@#1@rangelabel}{% \@ifundefined{cref@#1@label}{\let\@tempa\relax}{\def\@tempa{}}}% {\def\@tempa{}}% \ifx\@tempa\@empty\relax% \@toksa={\labelcrefrangeformat{#1}}% \expandafter\the\expandafter\@toksa\expandafter{% \@temprangelabel}% \fi% \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\@crefdefinemultiformat} % Construct call to \cmd{\crefmultiformat}. % \begin{macrocode} \def\@crefdefinemultiformat#1{% \begingroup% % \end{macrocode} % Put format components into tmp macros. % \begin{macrocode} \@crefconstructcomponents{#1}% % \end{macrocode} % Assemble the arguments for \cmd{\crefmultiformat}, % \cmd{\Crefmultiformat} and\linebreak[4] \cmd{\labelcrefmultiformat} % from the components. % \begin{macrocode} \ifx\@tempnameplural\@empty\relax% \expandafter\def\expandafter\@tempfirst% \expandafter{\@templabel}% \else% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempfirst% \expandafter\expandafter\expandafter{% \expandafter\@tempnameplural% \expandafter\nobreakspace\@templabel@first}% \fi% \ifx\@tempNameplural\@empty\relax% \expandafter\def\expandafter\@tempFirst% \expandafter{\@templabel}% \else% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempFirst% \expandafter\expandafter\expandafter{% \expandafter\@tempNameplural% \expandafter\nobreakspace\@templabel@first}% \fi% \expandafter\def\expandafter\@tempsecond\expandafter{% \expandafter\crefpairconjunction\@templabel}% \expandafter\def\expandafter\@tempmiddle\expandafter{% \expandafter\crefmiddleconjunction\@templabel}% \expandafter\def\expandafter\@templast\expandafter{% \expandafter\creflastconjunction\@templabel}% \expandafter\def\expandafter\@templabel\expandafter{\@templabel}% % \end{macrocode} % Bundle all four arguments for \cmd{\crefmultiformat} in token register % \cmd{\@toksb}, then call it. % \begin{macrocode} \toksdef\@toksa=0% \toksdef\@toksb=1% \@toksb={}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@tempfirst}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@tempsecond}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@tempmiddle}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@templast}}% \@toksa={\crefmultiformat{#1}}% \expandafter\the\expandafter\@toksa\the\@toksb% % \end{macrocode} % Bundle all four arguments for \cmd{\Crefmultiformat} in token register % \cmd{\@toksb}, then call it. % \begin{macrocode} \@toksb={}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@tempFirst}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@tempsecond}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@tempmiddle}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@templast}}% \@toksa={\Crefmultiformat{#1}}% \expandafter\the\expandafter\@toksa\the\@toksb% % \end{macrocode} % If type has custom label format, bundle all four arguments % for\linebreak[4] \cmd{\labelcrefmultiformat} in token register % \cmd{\@toksb}, then call it. % \begin{macrocode} \@ifundefined{cref@#1@label}{}{% \@toksb={}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@templabel}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@tempsecond}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@tempmiddle}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@templast}}% \@toksa={\labelcrefmultiformat{#1}}% \expandafter\the\expandafter\@toksa\the\@toksb}% \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\@crefrangedefinemultiformat} % Construct call to \cmd{\crefrangemultiformat}. % \begin{macrocode} \def\@crefrangedefinemultiformat#1{% \begingroup% % \end{macrocode} % Put format components into tmp macros. % \begin{macrocode} \@crefconstructcomponents{#1}% % \end{macrocode} % Assemble the arguments that need to be passed to % \cmd{\crefrangemultiformat}, \cmd{\Crefrangemultiformat} and % \cmd{\labelcrefrangemultiformat} from the reference components. % \begin{macrocode} \ifx\@tempnameplural\@empty\relax% \expandafter\def\expandafter\@tempfirst% \expandafter{\@temprangelabel}% \else% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempfirst% \expandafter\expandafter\expandafter{% \expandafter\@tempnameplural@range% \expandafter\nobreakspace\@temprangelabel@first}% \fi% \ifx\@tempNameplural\@empty\relax% \expandafter\def\expandafter\@tempFirst% \expandafter{\@temprangelabel}% \else% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempFirst% \expandafter\expandafter\expandafter{% \expandafter\@tempNameplural@range% \expandafter\nobreakspace\@temprangelabel@first}% \fi% \expandafter\def\expandafter\@tempsecond\expandafter{% \expandafter\crefpairconjunction\@temprangelabel}% \expandafter\def\expandafter\@tempmiddle\expandafter{% \expandafter\crefmiddleconjunction\@temprangelabel}% \expandafter\def\expandafter\@templast\expandafter{% \expandafter\creflastconjunction\@temprangelabel}% \expandafter\def\expandafter\@temprangelabel% \expandafter{\@temprangelabel}% % \end{macrocode} % Bundle all four arguments for \cmd{\crefrangemultiformat} in token % register \cmd{\@toksb}, then call it. % \begin{macrocode} \toksdef\@toksa=0% \toksdef\@toksb=1% \@toksb={}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@tempfirst}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@tempsecond}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@tempmiddle}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@templast}}% \@toksa={\crefrangemultiformat{#1}}% \expandafter\the\expandafter\@toksa\the\@toksb% % \end{macrocode} % Bundle all four arguments for \cmd{\Crefrangemultiformat} in token % register \cmd{\@toksb}, then call it. % \begin{macrocode} \@toksb={}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@tempFirst}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@tempsecond}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@tempmiddle}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@templast}}% \@toksa={\Crefrangemultiformat{#1}}% \expandafter\the\expandafter\@toksa\the\@toksb% % \end{macrocode} % If type has custom label format, bundle all four arguments % for\linebreak[4] \cmd{\labelcrefrangemultiformat} in token register % \cmd{\@toksb}, then call it. % \begin{macrocode} \@ifundefined{cref@#1@rangelabel}{% \@ifundefined{cref@#1@label}{\let\@tempa\relax}{\def\@tempa{}}}% {\def\@tempa{}}% \ifx\@tempa\@empty\relax% \@toksb={}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@temprangelabel}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@tempsecond}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@tempmiddle}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@templast}}% \@toksa={\labelcrefrangemultiformat{#1}}% \expandafter\the\expandafter\@toksa\the\@toksb% \fi% \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\@labelcrefdefinedefaultformats} % \cmd{\@labelcrefdefinedefaultformats} defines the default formats for % the\linebreak[4] \cmd{\labelcref} command, which are used when no % type-specific formats are defined. % \begin{macrocode} \def\@labelcrefdefinedefaultformats{% \begingroup% \toksdef\@toksa=0% \toksdef\@toksb=1% % \end{macrocode} % Assemble the arguments that need to be passed to % \cmd{\labelcrefformat},\linebreak[4] \cmd{\labelcrefrangeformat}, % \cmd{\labelcrefmultiformat} and\linebreak[4] % \cmd{\labelcrefrangemultiformat}. % \begin{macrocode} \let\@templabel\cref@default@label% \expandafter\def\expandafter\@tempa\expandafter{% \@templabel{####1}{####3}{####4}}% \expandafter\def\expandafter\@tempb\expandafter{% \@templabel{####2}{####5}{####6}}% \@toksa={\def\@temprangelabel##1##2##3##4##5##6}% \expandafter\expandafter\expandafter\the% \expandafter\expandafter\expandafter\@toksa% \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter\crefrangepreconjunction% \expandafter\@tempa\expandafter\crefrangeconjunction\@tempb% \crefrangepostconjunction}% \expandafter\def\expandafter\@templabel\expandafter{% \@templabel{########1}{########2}{########3}}% \expandafter\def\expandafter\@temprangelabel\expandafter{% \@temprangelabel{########1}{########2}{########3}% {########4}{########5}{########6}}% \expandafter\def\expandafter\@tempsecond\expandafter{% \expandafter\crefpairconjunction\@templabel}% \expandafter\def\expandafter\@tempmiddle\expandafter{% \expandafter\crefmiddleconjunction\@templabel}% \expandafter\def\expandafter\@templast\expandafter{% \expandafter\creflastconjunction\@templabel}% \expandafter\def\expandafter\@temprangesecond\expandafter{% \expandafter\crefpairconjunction\@temprangelabel}% \expandafter\def\expandafter\@temprangemiddle\expandafter{% \expandafter\crefmiddleconjunction\@temprangelabel}% \expandafter\def\expandafter\@temprangelast\expandafter{% \expandafter\creflastconjunction\@temprangelabel}% \expandafter\def\expandafter\@templabel\expandafter{\@templabel}% \expandafter\def\expandafter\@temprangelabel% \expandafter{\@temprangelabel}% % \end{macrocode} % Define default \cmd{\labelcrefformat}. % \begin{macrocode} \@toksa={\labelcrefformat{default}}% \expandafter\the\expandafter\@toksa\expandafter{\@templabel}% % \end{macrocode} % Define default \cmd{\labelcrefrangeformat}. % \begin{macrocode} \@toksa={\labelcrefrangeformat{default}}% \expandafter\the\expandafter\@toksa\expandafter{\@temprangelabel}% % \end{macrocode} % Bundle all four arguments for \cmd{\labelcrefmultiformat} in token % register \cmd{\@toksb}, then call it to define default formats. % \begin{macrocode} \@toksb={}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@templabel}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@tempsecond}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@tempmiddle}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@templast}}% \@toksa={\labelcrefmultiformat{default}}% \expandafter\the\expandafter\@toksa\the\@toksb% % \end{macrocode} % Bundle all four arguments for \cmd{\labelcrefrangemultiformat} in token % register \cmd{\@toksb}, then call it to define default formats. % \begin{macrocode} \@toksb={}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@temprangelabel}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@temprangesecond}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@temprangemiddle}}% \expandafter\cref@append@toks\expandafter\@toksb\expandafter{% \expandafter{\@temprangelast}}% \@toksa={\labelcrefrangemultiformat{default}}% \expandafter\the\expandafter\@toksa\the\@toksb% \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\@crefdefineallformats} % \cmd{\@crefdefineallformats} calls each of the above, to define all % formats for the given type from the corresponding components. % \begin{macrocode} \def\@crefdefineallformats#1{% \@crefdefineformat{#1}% \@crefrangedefineformat{#1}% \@crefdefinemultiformat{#1}% \@crefrangedefinemultiformat{#1}} % \end{macrocode} % \end{macro} % % % \subsubsection{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} etc. If the corresponding \cmd{\Crefformat} or % \cmd{\crefformat} variant is not already defined, they define it to % be a version with the first letter capitalised or lower-cased. % \begin{macrocode} \newcommand{\crefformat}[2]{\@crefformat{cref}{#1}{#2}} \newcommand{\Crefformat}[2]{\@crefformat{Cref}{#1}{#2}} \newcommand{\crefrangeformat}[2]{\@crefrangeformat{crefrange}{#1}{#2}} \newcommand{\Crefrangeformat}[2]{\@crefrangeformat{Crefrange}{#1}{#2}} \newcommand{\crefmultiformat}[5]{% \@crefmultiformat{cref}{#1}{#2}{#3}{#4}{#5}} \newcommand{\Crefmultiformat}[5]{% \@crefmultiformat{Cref}{#1}{#2}{#3}{#4}{#5}} \newcommand{\crefrangemultiformat}[5]{% \@crefrangemultiformat{crefrange}{#1}{#2}{#3}{#4}{#5}} \newcommand{\Crefrangemultiformat}[5]{% \@crefrangemultiformat{Crefrange}{#1}{#2}{#3}{#4}{#5}} \newcommand{\labelcrefformat}[2]{% \expandafter\gdef\csname labelcref@#1@format\endcsname##1##2##3{#2}} \newcommand{\labelcrefrangeformat}[2]{% \expandafter\gdef\csname labelcrefrange@#1@format\endcsname% ##1##2##3##4##5##6{#2}} \newcommand{\labelcrefmultiformat}[5]{% \expandafter\gdef\csname labelcref@#1@format@first\endcsname% ##1##2##3{#2}% \expandafter\gdef\csname labelcref@#1@format@second\endcsname% ##1##2##3{#3}% \expandafter\gdef\csname labelcref@#1@format@middle\endcsname% ##1##2##3{#4}% \expandafter\gdef\csname labelcref@#1@format@last\endcsname% ##1##2##3{#5}} \newcommand{\labelcrefrangemultiformat}[5]{% \expandafter\gdef\csname labelcrefrange@#1@format@first\endcsname% ##1##2##3##4##5##6{#2}% \expandafter\gdef\csname labelcrefrange@#1@format@second\endcsname% ##1##2##3##4##5##6{#3}% \expandafter\gdef\csname labelcrefrange@#1@format@middle\endcsname% ##1##2##3##4##5##6{#4}% \expandafter\gdef\csname labelcrefrange@#1@format@last\endcsname% ##1##2##3##4##5##6{#5}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % The utility macros do the real work, by using the first argument % (``cref'' or ``Cref'', and ``crefrange'' or ``Crefrange'') to determine % how to define the corresponding command with the other capitalisation. % \begin{macro}{\@crefformat} % \cmd{\@crefformat} defines the macros for single references. % \begin{macrocode} \def\@crefformat#1#2#3{% \begingroup% \expandafter\gdef\csname #1@#2@format\endcsname##1##2##3{#3}% % \end{macrocode} % If the other capitalisation variant is not already defined\dots % \begin{macrocode} \cref@othervariant{#1}{\@other}{\@changecase}% \@ifundefined{\@other @#2@format}{% % \end{macrocode} % Define \cmd{\@tempa} to be a partial expansion (expanded just once) of % the capitalisation variant we've just defined above. The \cmd{\@toska} % token register just makes the code less verbose. % \begin{macrocode} \toksdef\@toksa=0% \@toksa={\def\@tempa##1##2##3}% \expandafter\expandafter\expandafter\the% \expandafter\expandafter\expandafter\@toksa% \expandafter\expandafter\expandafter{% \csname#1@#2@format\endcsname{##1}{##2}{##3}}% % \end{macrocode} % Add the \cmd{\@changecase} command to the front of the definition of % \cmd{\@tempa}. % \begin{macrocode} \expandafter\expandafter\expandafter\the% \expandafter\expandafter\expandafter\@toksa% \expandafter\expandafter\expandafter{% \expandafter\@changecase\@tempa{##1}{##2}{##3}}% % \end{macrocode} % Define the other capitalisation variant to be the partial expansion % (expanded just once) of \cmd{\@tempa}. % \begin{macrocode} \@toksa={% \expandafter\gdef\csname\@other @#2@format\endcsname##1##2##3}% \expandafter\the\expandafter\@toksa\expandafter{% \@tempa{##1}{##2}{##3}}% }{}% \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\@crefrangeformat} % \cmd{\@crefrangeformat} defines the macros for single reference % ranges. % \begin{macrocode} \def\@crefrangeformat#1#2#3{% \begingroup% \expandafter\gdef\csname #1@#2@format\endcsname% ##1##2##3##4##5##6{#3}% % \end{macrocode} % If the other capitalisation variant is not already defined\dots % \begin{macrocode} \cref@othervariant{#1}{\@other}{\@changecase}% \@ifundefined{\@other @#2@format}{% % \end{macrocode} % Define \cmd{\@tempa} to be a partial expansion (expanded just once) of % the capitalisation variant we've just defined above. The \cmd{\@toska} % token register just makes the code less verbose. % \begin{macrocode} \toksdef\@toksa=0% \@toksa={\def\@tempa##1##2##3##4##5##6}% \expandafter\expandafter\expandafter\the% \expandafter\expandafter\expandafter\@toksa% \expandafter\expandafter\expandafter{% \csname#1@#2@format\endcsname{##1}{##2}{##3}{##4}{##5}{##6}}% % \end{macrocode} % Add the \cmd{\@changecase} command to the front of the definition of % \cmd{\@tempa}. % \begin{macrocode} \expandafter\expandafter\expandafter\the% \expandafter\expandafter\expandafter\@toksa% \expandafter\expandafter\expandafter{% \expandafter\@changecase\@tempa{##1}{##2}{##3}{##4}{##5}{##6}}% % \end{macrocode} % Define the other capitalisation variant to be the partial expansion % (expanded just once) of \cmd{\@tempa}. % \begin{macrocode} \@toksa={\expandafter\gdef% \csname\@other @#2@format\endcsname##1##2##3##4##5##6}% \expandafter\the\expandafter\@toksa\expandafter{% \@tempa{##1}{##2}{##3}{##4}{##5}{##6}}% }{}% \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\@crefmultiformat} % \cmd{\@crefmultiformat} defines the macros for multiple references. % \begin{macrocode} \def\@crefmultiformat#1#2#3#4#5#6{% \begingroup% \expandafter\gdef\csname #1@#2@format@first\endcsname##1##2##3{#3}% \expandafter\gdef\csname #1@#2@format@second\endcsname##1##2##3{#4}% \expandafter\gdef\csname #1@#2@format@middle\endcsname##1##2##3{#5}% \expandafter\gdef\csname #1@#2@format@last\endcsname##1##2##3{#6}% % \end{macrocode} % If the other capitalisation variant of the first part of the % multi-format definition is not already defined\dots % \begin{macrocode} \cref@othervariant{#1}{\@other}{\@changecase}% \@ifundefined{\@other @#2@format@first}{% % \end{macrocode} % Define \cmd{\@tempa} to be a partial expansion (expanded just once) of % the capitalisation variant we've just defined above. The \cmd{\@toska} % token register just makes the code less verbose. % \begin{macrocode} \toksdef\@toksa=0% \@toksa={\def\@tempa##1##2##3}% \expandafter\expandafter\expandafter\the% \expandafter\expandafter\expandafter\@toksa% \expandafter\expandafter\expandafter{% \csname#1@#2@format@first\endcsname{##1}{##2}{##3}}% % \end{macrocode} % Add the \cmd{\@changecase} command to the front of the definition of % \cmd{\@tempa}. % \begin{macrocode} \expandafter\expandafter\expandafter\the% \expandafter\expandafter\expandafter\@toksa% \expandafter\expandafter\expandafter{% \expandafter\@changecase\@tempa{##1}{##2}{##3}}% % \end{macrocode} % Define the other capitalisation variant to be the partial expansion % (expanded just once) of \cmd{\@tempa}. % \begin{macrocode} \@toksa={% \expandafter\gdef\csname\@other @#2@format@first\endcsname% ##1##2##3}% \expandafter\the\expandafter\@toksa\expandafter{% \@tempa{##1}{##2}{##3}}% }{}% % \end{macrocode} % The other parts of the multi-format definition are defined to be % identical for both capitalisation variants. % \begin{macrocode} \@ifundefined{\@other @#2@format@second}{% \@toksa={% \expandafter\global\expandafter\let% \csname\@other @#2@format@second\endcsname}% \expandafter\the\expandafter\@toksa% \csname #1@#2@format@second\endcsname% }{}% \@ifundefined{\@other @#2@format@middle}{% \@toksa={% \expandafter\global\expandafter\let% \csname\@other @#2@format@middle\endcsname}% \expandafter\the\expandafter\@toksa% \csname #1@#2@format@middle\endcsname% }{}% \@ifundefined{\@other @#2@format@last}{% \@toksa={% \expandafter\global\expandafter\let% \csname\@other @#2@format@last\endcsname}% \expandafter\the\expandafter\@toksa% \csname #1@#2@format@last\endcsname% }{}% \endgroup} % \end{macrocode} %\end{macro} % % \begin{macro}{\@crefrangemultiformat} % \cmd{\@crefmultiformat} defines the macros for reference ranges % within multiple references. % \begin{macrocode} \def\@crefrangemultiformat#1#2#3#4#5#6{% \begingroup% \expandafter\gdef\csname #1@#2@format@first\endcsname% ##1##2##3##4##5##6{#3}% \expandafter\gdef\csname #1@#2@format@second\endcsname% ##1##2##3##4##5##6{#4}% \expandafter\gdef\csname #1@#2@format@middle\endcsname% ##1##2##3##4##5##6{#5}% \expandafter\gdef\csname #1@#2@format@last\endcsname% ##1##2##3##4##5##6{#6}% % \end{macrocode} % If the other capitalisation variant of the first part of the % multi-format definition is not already defined\dots % \begin{macrocode} \cref@othervariant{#1}{\@other}{\@changecase}% \@ifundefined{\@other @#2@format@first}{% % \end{macrocode} % Define \cmd{\@tempa} to be a partial expansion (expanded just once) of % the capitalisation variant we've just defined above. The \cmd{\@toska} % token register just makes the code less verbose. % \begin{macrocode} \toksdef\@toksa=0% \@toksa={\def\@tempa##1##2##3##4##5##6}% \expandafter\expandafter\expandafter\the% \expandafter\expandafter\expandafter\@toksa% \expandafter\expandafter\expandafter{% \csname#1@#2@format@first\endcsname% {##1}{##2}{##3}{##4}{##5}{##6}}% % \end{macrocode} % Add the \cmd{\@changecase} command to the front of the definition of % \cmd{\@tempa}. % \begin{macrocode} \expandafter\expandafter\expandafter\the% \expandafter\expandafter\expandafter\@toksa% \expandafter\expandafter\expandafter{% \expandafter\@changecase\@tempa{##1}{##2}{##3}{##4}{##5}{##6}}% % \end{macrocode} % Define the other capitalisation variant to be the partial expansion % (expanded just once) of \cmd{\@tempa}. % \begin{macrocode} \@toksa={% \expandafter\gdef\csname\@other @#2@format@first\endcsname% ##1##2##3##4##5##6}% \expandafter\the\expandafter\@toksa\expandafter{% \@tempa{##1}{##2}{##3}{##4}{##5}{##6}}% }{}% % \end{macrocode} % The other parts of the multi-format definition are defined to be % identical for both capitalisation variants. % \begin{macrocode} \@ifundefined{\@other @#2@format@second}{% \@toksa={% \expandafter\global\expandafter\let% \csname\@other @#2@format@second\endcsname}% \expandafter\the\expandafter\@toksa% \csname #1@#2@format@second\endcsname% }{}% \@ifundefined{\@other @#2@format@middle}{% \@toksa={% \expandafter\global\expandafter\let% \csname\@other @#2@format@middle\endcsname}% \expandafter\the\expandafter\@toksa% \csname #1@#2@format@middle\endcsname% }{}% \@ifundefined{\@other @#2@format@last}{% \@toksa={% \expandafter\global\expandafter\let% \csname\@other @#2@format@last\endcsname}% \expandafter\the\expandafter\@toksa% \csname #1@#2@format@last\endcsname% }{}% \endgroup} % \end{macrocode} % \end{macro} % % % % \subsection{Support for Other Packages} % % \subsubsection{\package{hyperref} support} % \begin{macro}{hyperref} % If the \package{hyperref} package is loaded, we add hyperlink % support to \package{cleveref}. Since \package{hyperref} messes around % with some of the same \LaTeX{} internals as we do, we also have to % override some of its redefinitions so that they work with % \package{cleveref}. % \begin{macrocode} \let\if@cref@hyperrefloaded\iffalse \@ifpackageloaded{hyperref}{% \@ifpackagewith{hyperref}{implicit=false}{}{% \let\if@cref@hyperrefloaded\iftrue% \PackageInfo{cleveref}{`hyperref' support loaded} % \end{macrocode} % \begin{macro}{\cref@hyperref} % We define a utility macro to extract the hyperlink supplied by % \package{hyperref} (via the \file{aux} file). Note that % \package{hyperref} adds the hyperlink information to the standard % \cmd{\newlabel} line in the \file{aux} file, so we have to retrieve % it from the standard \cmd{\r@\meta{label}}, \emph{not} the one % suffixed with |@cref| that we've created ourselves. % \begin{macrocode} \def\cref@hyperref#1{\expandafter\expandafter\expandafter% \@fourthoffive\csname r@#1\endcsname} % \end{macrocode} % \end{macro} % % \begin{macro}{\H@refstepcounter} % The \package{hyperref} package stores the original % \cmd{\refstepcounter} definition as\linebreak[4] % \cmd{\H@refstepcounter}. Unfortunately, it plasters % \cmd{\H@refstepcounter} all over the place, sometimes bypassing % \cmd{\refstepcounter} entirely. So we're forced to modify % \cmd{\H@refstepcounter} itself, in order to ensure that the extra % information we need is stored in \cmd{\cref@currentlabel}. % \begin{macrocode} \let\cref@old@H@refstepcounter\H@refstepcounter \def\H@refstepcounter#1{% \cref@old@H@refstepcounter{#1}% \cref@constructprefix{#1}{\cref@result}% \@ifundefined{cref@#1@alias}% {\def\@tempa{#1}}% {\def\@tempa{\csname cref@#1@alias\endcsname}}% \protected@edef\cref@currentlabel{% [\@tempa][\arabic{#1}][\cref@result]% \csname p@#1\endcsname\csname the#1\endcsname}} % \end{macrocode} % \end{macro} % % \begin{macro}{\refstepcounter@noarg} % \begin{macro}{\refstepcounter@optarg} % \package{hyperref}'s \cmd{\refstepcounter}, which ends up stored in % our\linebreak[4] \cmd{\cref@old@refstepcounter}, already calls % \cmd{\H@refstepcounter}, and we just redefined the latter to store % the extra information. So we only need to change % \cmd{\cref@currentlabel} in \emph{our} \cmd{\refstepcounter} if an % optional argument was supplied. Note that, in this case, the % mechanism for setting \cmd{\cref@currentlabel} is slightly different % than it is without \package{hyperref}: \cmd{\cref@currentlabel} first % gets set by our modified \cmd{\H@refstepcounter}, which gets called % via \package{hyperref}'s original version, as stored in % \cmd{\cref@old@refstepcounter}. The version of % \cmd{\cref@refstepcounter@optarg} defined below then overrides the % label type. % \begin{macrocode} \let\refstepcounter@noarg\cref@old@refstepcounter% \def\refstepcounter@optarg[#1]#2{% \cref@old@refstepcounter{#2}% \protected@edef\cref@currentlabel{% \expandafter\cref@override@label@type% \cref@currentlabel\@nil{#1}}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\appendix} % We again make \cmd{\appendix} redefine things so that the label type % for chapters or sections is exceptionally overridden and set to % ``appendix'' instead. But this time, it is \cmd{\H@refstepcounter} % that needs to be redefined. % \begin{macrocode} \@ifundefined{appendix}{}{% \renewcommand\appendix{% \cref@old@appendix% \@ifundefined{chapter}{% \def\H@refstepcounter##1{% \cref@old@H@refstepcounter{##1}% \cref@constructprefix{##1}{\cref@result}% % \end{macrocode} % We add a large value to the front of the counter data, to force % references to anything in appendices to be sorted after % everything else. % \begin{macrocode} \ifx\cref@result\@empty% \def\cref@result{2147483647}% \else% \edef\cref@result{2147483647,\cref@result}% \fi% % \end{macrocode} % Override the cross-reference type of sectioning commands. % \begin{macrocode} \def\@tempa{##1}% \def\@tempb{section}% \ifx\@tempa\@tempb% \protected@edef\cref@currentlabel{% [appendix][\arabic{##1}][\cref@result]% \csname p@##1\endcsname\csname the##1\endcsname}% \else% \def\@tempa{##1}% \def\@tempb{subsection}% \ifx\@tempa\@tempb% \protected@edef\cref@currentlabel{% [subappendix][\arabic{##1}][\cref@result]% \csname p@##1\endcsname\csname the##1\endcsname}% \else% \def\@tempa{##1}% \def\@tempb{subsubsection}% \ifx\@tempa\@tempb% \protected@edef\cref@currentlabel{% [subsubappendix][\arabic{##1}][\cref@result]% \csname p@##1\endcsname\csname the##1\endcsname}% \else% \@ifundefined{cref@##1@alias}% {\def\@tempa{##1}}% {\def\@tempa{\csname cref@##1@alias\endcsname}}% \protected@edef\cref@currentlabel{% [\@tempa][\arabic{##1}][\cref@result]% \csname p@##1\endcsname\csname the##1\endcsname} \fi% \fi% \fi}% }{% \def\H@refstepcounter##1{% \cref@old@H@refstepcounter{##1}% \cref@constructprefix{##1}{\cref@result}% % \end{macrocode} % Again, the large value added to the front of the counter data % forces references to appendix items to be sorted last. % \begin{macrocode} \ifx\cref@result\@empty% \def\cref@result{2147483647}% \else% \edef\cref@result{2147483647,\cref@result}% \fi% % \end{macrocode} % Override the cross-reference type of sectioning commands. % \begin{macrocode} \def\@tempa{##1}% \def\@tempb{chapter}% \ifx\@tempa\@tempb% \protected@edef\cref@currentlabel{% [appendix][\arabic{##1}][\cref@result]% \csname p@##1\endcsname\csname the##1\endcsname}% \else% \def\@tempa{##1}% \def\@tempb{section}% \ifx\@tempa\@tempb% \protected@edef\cref@currentlabel{% [subappendix][\arabic{##1}][\cref@result]% \csname p@##1\endcsname\csname the##1\endcsname}% \else% \def\@tempa{##1}% \def\@tempb{subsection}% \ifx\@tempa\@tempb% \protected@edef\cref@currentlabel{% [subsubappendix][\arabic{##1}][\cref@result]% \csname p@##1\endcsname\csname the##1\endcsname}% \else% \def\@tempa{##1}% \def\@tempb{subsubsection}% \ifx\@tempa\@tempb% \protected@edef\cref@currentlabel{% [subsubsubappendix][\arabic{##1}][\cref@result]% \csname p@##1\endcsname\csname the##1\endcsname}% \else% \@ifundefined{cref@##1@alias}% {\def\@tempa{##1}}% {\def\@tempa{\csname cref@##1@alias\endcsname}}% \protected@edef\cref@currentlabel{% [\@tempa][\arabic{##1}][\cref@result]% \csname p@##1\endcsname\csname the##1\endcsname} \fi% \fi% \fi% \fi}% }% }% }% end of \@ifundefined{appendix} % \end{macrocode} % \end{macro} % % \begin{macro}{\cref*} % \begin{macro}{\Cref*} % \begin{macro}{\crefrange*} % \begin{macro}{\Crefrange*} % \begin{macro}{\cpageref*} % \begin{macro}{\Cpageref*} % \begin{macro}{\cpagerefrange*} % \begin{macro}{\Cpagerefrange*} % \begin{macro}{\labelcref*} % \begin{macro}{\labelcpageref*} % \begin{macro}{\@crefstar} % \begin{macro}{\@crefnostar} % \begin{macro}{\@crefrangestar} % \begin{macro}{\@crefrangenostar} % \begin{macro}{\@cpagerefstar} % \begin{macro}{\@cpagerefnostar} % \begin{macro}{\@cpagerefrangestar} % \begin{macro}{\@cpagerefrangenostar} % \begin{macro}{\@labelcrefstar} % \begin{macro}{\@labelcrefnostar} % \begin{macro}{\@labelcpagerefstar} % \begin{macro}{\@labelcpagerefnostar} % Redefine \cmd{\cref} and all the others to allow starred variants, % which don't create hyperlinks. The starred variants simply set a % flag, which is tested in the very final stage of reference % typesetting in \cmd{\@@setcref}, \cmd{\@@setcrefrange}, % \cmd{\@@setcpageref} and \cmd{\@@setcpagerefrange} (below). % \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} \DeclareRobustCommand{\cpageref}{% \@ifstar{\@cpagerefstar{cref}}{\@cpagerefnostar{cref}}} \DeclareRobustCommand{\Cpageref}{% \@ifstar{\@cpagerefstar{Cref}}{\@cpagerefnostar{Cref}}} \def\@cpagerefnostar#1#2{% \@cpageref{#1}{#2}{\@setcpageref}{\@setcpagerefrange}} \def\@cpagerefstar#1#2{% \@crefstarredtrue% \@cpageref{#1}{#2}{\@setcpageref}{\@setcpagerefrange}% \@crefstarredfalse} \DeclareRobustCommand{\cpagerefrange}{% \@ifstar{\@cpagerefrangestar{cref}}{\@cpagerefrangenostar{cref}}} \DeclareRobustCommand{\Cpagerefrange}{% \@ifstar{\@cpagerefrangestar{Cref}}{\@cpagerefrangenostar{Cref}}} \def\@cpagerefrangenostar#1#2#3{\@setcpagerefrange{#2}{#3}{#1}{}} \def\@cpagerefrangestar#1#2#3{% \@crefstarredtrue% \@setcpagerefrange{#2}{#3}{#1}{}% \@crefstarredfalse} \DeclareRobustCommand{\labelcref}{% \@ifstar{\@labelcrefstar}{\@labelcrefnostar}} \def\@labelcrefnostar#1{\@cref{labelcref}{#1}} \def\@labelcrefstar#1{% \@crefstarredtrue% \@cref{labelcref}{#1}% \@crefstarredfalse} \DeclareRobustCommand{\labelcpageref}{% \@ifstar{\@labelcpagerefstar}{\@labelcpagerefnostar}} \def\@labelcpagerefnostar#1{% \@cpageref{labelcref}{#1}{\@setcpageref}{\@setcpagerefrange}} \def\@labelcpagerefstar#1{% \@crefstarredtrue% \@cpageref{labelcref}{#1}{\@setcpageref}{\@setcpagerefrange}% \@crefstarredfalse} % \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} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\@@setcref} % \begin{macro}{\@@setcrefrange} % \begin{macro}{\@@setcpageref} % \begin{macro}{\@@setcpagerefrange} % Redefine the final reference typesetting macros to create hyperlinks % (unless the starred flag is set), using the extra arguments supplied % in \cmd{\r@\meta{label}} (via the \file{aux} file) by % \package{hyperref}. % \begin{macrocode} \def\@@setcref#1#2{% \cref@getlabel{#2}{\@templabel}% \if@crefstarred% #1{\@templabel}{}{}% \else% \edef\@templink{\cref@hyperref{#2}}% #1{\@templabel}{\hyper@linkstart{link}{\@templink}}% {\hyper@linkend}% \fi} \def\@@setcrefrange#1#2#3{% \cref@getlabel{#2}{\@labela}% \cref@getlabel{#3}{\@labelb}% \if@crefstarred% #1{\@labela}{\@labelb}{}{}{}{}% \else% \edef\@linka{\cref@hyperref{#2}}% \edef\@linkb{\cref@hyperref{#3}}% #1{\@labela}{\@labelb}% {\hyper@linkstart{link}{\@linka}}{\hyper@linkend}% {\hyper@linkstart{link}{\@linkb}}{\hyper@linkend}% \fi}% \def\@@setcpageref#1#2{% \cref@getpageref{#2}{\@temppage}% \if@crefstarred% #1{\@temppage}{}{}% \else% \edef\@templink{\cref@hyperref{#2}}% #1{\@temppage}{\hyper@linkstart{link}{\@templink}}% {\hyper@linkend}% \fi} \def\@@setcpagerefrange#1#2#3{% \cref@getpageref{#2}{\@pagea}% \cref@getpageref{#3}{\@pageb}% \if@crefstarred% #1{\@pagea}{\@pageb}{}{}{}{}% \else% \edef\@linka{\cref@hyperref{#2}}% \edef\@linkb{\cref@hyperref{#3}}% #1{\@pagea}{\@pageb}% {\hyper@linkstart{link}{\@linka}}{\hyper@linkend}% {\hyper@linkstart{link}{\@linkb}}{\hyper@linkend}% \fi}% }% end of false case of \@ifpackagewith{hyperref}{implicit=false} % \end{macrocode} % % The \package{revtex4} and \package{revtex4-1} document classes use % |\H@refstepcounter| to increment section counters, even when % \package{hyperref} isn't explicitly loaded. Therefore, for these % docclasses we need to redefine |\H@refstepcounter| even when % \package{hyperref} is not loaded. % \begin{macrocode} }{% false case of \@ifpackageloaded{hyperref} \@ifclassloaded{revtex4}{\let\if@cref@hyperrefloaded\iftrue}{}% \@ifclassloaded{revtex4-1}{\let\if@cref@hyperrefloaded\iftrue}{}% \if@cref@hyperrefloaded\relax% \let\cref@old@H@refstepcounter\H@refstepcounter% \def\H@refstepcounter#1{% \cref@old@H@refstepcounter{#1}% \cref@constructprefix{#1}{\cref@result}% \@ifundefined{cref@#1@alias}% {\def\@tempa{#1}}% {\def\@tempa{\csname cref@#1@alias\endcsname}}% \protected@edef\cref@currentlabel{% [\@tempa][\arabic{#1}][\cref@result]% \csname p@#1\endcsname\csname the#1\endcsname}}% \fi% \let\if@cref@hyperrefloaded\iffalse% }% end of \@ifpackageloaded{hyperref} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \end{macro} % % % % \subsubsection{\package{amsmath} support} % \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 \package{cleveref} \cmd{\label} % command we defined previously (saved in \cmd{\cref@label}). As % before, we must postpone the redefinition of \cmd{\label} until the % beginning of the document, since other packages do so. % \begin{macrocode} \@ifpackageloaded{amsmath}{% \AtBeginDocument{ \let\cref@old@label@in@display\label@in@display \def\label@in@display{% \@ifnextchar[\label@in@display@optarg\label@in@display@noarg}%] \def\label@in@display@noarg#1{\cref@old@label@in@display{{#1}}} \def\label@in@display@optarg[#1]#2{% \cref@old@label@in@display{[#1]{#2}}} \def\ltx@label#1{\cref@label#1} }% end of AtBeginDocument % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\measure@} % \begin{macro}{\gmeasure@} % The \package{amsmath} multi-line equation environments scan their % bodies twice: once to measure, once to typeset. In the measure phase, % the \cmd{\label} command is disabled by letting it to \cmd{\@gobble}. % But this isn't sufficient to gobble all the arguments any more if an % optional argument is supplied to our new \cmd{\label}, so we have to % modify the \package{amsmath} measuring commands so that they let % \cmd{\label} to \cmd{\@gobble@optarg} instead. % % Unfortunately, \package{amsmath} wasn't designed with redefinitions % of \cmd{\label} in mind, so there appears to be no safe way of doing % this other than copying the \package{amsmath} definitions and making % the modification directly in the macro's code. This is a recipe for % future chaos if these commands are ever modified in a new version of % \package{amsmath}, but it seems we have no choice. Luckily, % \package{amsmath} isn't updated too often! % \begin{macrocode} \def\measure@#1{% \begingroup \measuring@true \global\eqnshift@\z@ \global\alignsep@\z@ \global\let\tag@lengths\@empty \global\let\field@lengths\@empty \savecounters@ \global\setbox0\vbox{% \let\math@cr@@@\math@cr@@@align@measure \everycr{\noalign{\global\tag@false \global\let\raise@tag\@empty \global\column@\z@}}% \let\label\@gobble@optarg% <<< cleveref modification \global\row@\z@ \tabskip\z@ \halign{\span\align@preamble\crcr #1% \math@cr@@@ \global\column@\z@ \add@amps\maxfields@\cr }% }% \restorecounters@ \ifodd\maxfields@ \global\advance\maxfields@\@ne \fi \ifnum\xatlevel@=\tw@ \ifnum\maxfields@<\thr@@ \let\xatlevel@\z@ \fi \fi \setbox\z@\vbox{% \unvbox\z@ \unpenalty \global\setbox\@ne\lastbox }% \global\totwidth@\wd\@ne \if@fleqn \global\advance\totwidth@\@mathmargin \fi \global\let\maxcolumn@widths\@empty \begingroup \let\or\relax \loop \global\setbox\@ne\hbox{% \unhbox\@ne \unskip \global\setbox\thr@@\lastbox }% \ifhbox\thr@@ \xdef\maxcolumn@widths{ \or \the\wd\thr@@ \maxcolumn@widths}% \repeat \endgroup \dimen@\displaywidth \advance\dimen@-\totwidth@ \ifcase\xatlevel@ \global\alignsep@\z@ \let\minalignsep\z@ \@tempcntb\z@ \if@fleqn \@tempcnta\@ne \global\eqnshift@\@mathmargin \else \@tempcnta\tw@ \global\eqnshift@\dimen@ \global\divide\eqnshift@\@tempcnta \fi \or \@tempcntb\maxfields@ \divide\@tempcntb\tw@ \@tempcnta\@tempcntb \advance\@tempcntb\m@ne \if@fleqn \global\eqnshift@\@mathmargin \global\alignsep@\dimen@ \global\divide\alignsep@\@tempcnta \else \global\advance\@tempcnta\@ne \global\eqnshift@\dimen@ \global\divide\eqnshift@\@tempcnta \global\alignsep@\eqnshift@ \fi \or \@tempcntb\maxfields@ \divide\@tempcntb\tw@ \global\advance\@tempcntb\m@ne \global\@tempcnta\@tempcntb \global\eqnshift@\z@ \global\alignsep@\dimen@ \if@fleqn \global\advance\alignsep@\@mathmargin\relax \fi \global\divide\alignsep@\@tempcntb \fi \ifdim\alignsep@<\minalignsep\relax \global\alignsep@\minalignsep\relax \ifdim\eqnshift@>\z@ \if@fleqn\else \global\eqnshift@\displaywidth \global\advance\eqnshift@-\totwidth@ \global\advance\eqnshift@-\@tempcntb\alignsep@ \global\divide\eqnshift@\tw@ \fi \fi \fi \ifdim\eqnshift@<\z@ \global\eqnshift@\z@ \fi \calc@shift@align \global\tagshift@\totwidth@ \global\advance\tagshift@\@tempcntb\alignsep@ \if@fleqn \ifnum\xatlevel@=\tw@ \global\advance\tagshift@-\@mathmargin\relax \fi \else \global\advance\tagshift@\eqnshift@ \fi \iftagsleft@ \else \global\advance\tagshift@-\displaywidth \fi \dimen@\minalignsep\relax \global\advance\totwidth@\@tempcntb\dimen@ \ifdim\totwidth@>\displaywidth \global\let\displaywidth@\totwidth@ \else \global\let\displaywidth@\displaywidth \fi \endgroup } \def\gmeasure@#1{% \begingroup \measuring@true \totwidth@\z@ \global\let\tag@lengths\@empty \savecounters@ \setbox\@ne\vbox{% \everycr{\noalign{\global\tag@false \global\let\raise@tag\@empty \global\column@\z@}}% \let\label\@gobble% <<< cleveref modification \halign{% \setboxz@h{$\m@th\displaystyle{##}$}% \ifdim\wdz@>\totwidth@ \global\totwidth@\wdz@ \fi &\setboxz@h{\strut@{##}}% \savetaglength@ \crcr #1% \math@cr@@@ }% }% \restorecounters@ \if@fleqn \global\advance\totwidth@\@mathmargin \fi \iftagsleft@ \ifdim\totwidth@>\displaywidth \global\let\gdisplaywidth@\totwidth@ \else \global\let\gdisplaywidth@\displaywidth \fi \fi \endgroup } % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\multline@} % \begin{macro}{\mmeasure@} % \begin{macro}{\label@mmeasure@noarg} % \begin{macro}{\label@mmeasure@optarg} % The |multline| environment works a bit differently to the other % \package{amsmath} environments, in that \cmd{\label} is % \emph{disabled} during the typesetting phase, and \emph{enabled} % during the measuring phase. To cope with \package{cleveref}'s % optional argument, we have to define separate versions of % \cmd{\label@in@display} specifically for \cmd{\mmeasure@}. % \begin{macrocode} \def\multline@#1{% \Let@ \@display@init{\global\advance\row@\@ne \global\dspbrk@lvl\m@ne}% \chardef\dspbrk@context\z@ \restore@math@cr \let\tag\tag@in@align \global\tag@false \global\let\raise@tag\@empty \mmeasure@{#1}% \let\tag\gobble@tag \let\label\@gobble@optarg% <<< cleveref modification \tabskip \if@fleqn \@mathmargin \else \z@skip \fi \totwidth@\displaywidth \if@fleqn \advance\totwidth@-\@mathmargin \fi \halign\bgroup \hbox to\totwidth@{% \if@fleqn \hskip \@centering \relax \else \hfil \fi \strut@ $\m@th\displaystyle{}##\endmultline@math \hfil }% $ \crcr \if@fleqn \hskip-\@mathmargin \def\multline@indent{\hskip\@mathmargin}% \else \hfilneg \def\multline@indent{\hskip\multlinegap}% \fi \iftagsleft@ \iftag@ \begingroup \ifshifttag@ \rlap{\vbox{% \normalbaselines \hbox{% \strut@ \make@display@tag }% \vbox to\lineht@{}% \raise@tag }}% \multline@indent \else \setbox\z@\hbox{\make@display@tag}% \dimen@\@mathmargin \advance\dimen@-\wd\z@ \ifdim\dimen@<\multlinetaggap \dimen@\multlinetaggap \fi \box\z@ \hskip\dimen@\relax \fi \endgroup \else \multline@indent \fi \else \multline@indent \fi #1% } \def\mmeasure@#1{% \begingroup \measuring@true \def\label{% <<< cleveref modification \@ifnextchar[\label@in@mmeasure@optarg%] \label@in@mmeasure@noarg}% \def\math@cr@@@{\cr}% \let\shoveleft\@iden \let\shoveright\@iden \savecounters@ \global\row@\z@ \setbox\@ne\vbox{% \global\let\df@tag\@empty \halign{% \setboxz@h{\@lign$\m@th\displaystyle{}##$}% \iftagsleft@ \ifnum\row@=\@ne \global\totwidth@\wdz@ \global\lineht@\ht\z@ \fi \else \global\totwidth@\wdz@ \global\lineht@\dp\z@ \fi \crcr #1% \crcr }% }% \ifx\df@tag\@empty\else\global\tag@true\fi \if@eqnsw\global\tag@true\fi \iftag@ \setboxz@h{% \if@eqnsw \stepcounter{equation}% \tagform@\theequation \else \df@tag \fi }% \global\tagwidth@\wdz@ \dimen@\totwidth@ \advance\dimen@\tagwidth@ \advance\dimen@\multlinetaggap \iftagsleft@\else \if@fleqn \advance\dimen@\@mathmargin \fi \fi \ifdim\dimen@>\displaywidth \global\shifttag@true \else \global\shifttag@false \fi \fi \restorecounters@ \endgroup } \def\label@in@mmeasure@noarg#1{% \begingroup% \measuring@false% \cref@old@label@in@display{{#1}}% \endgroup} \def\label@in@mmeasure@optarg[#1]#2{% \begingroup% \measuring@false% \cref@old@label@in@display{[#1]{#2}}% \endgroup} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{subequations} % In order for |subequations| to be sorted properly, \package{cleveref} % needs to know that the |equation| counter is effectively reset by the % |parentequation| counter within the |subequations| environment. This % isn't how |amsmath| implements subequations (for obvious reasons!), % but we harmlessly add the |equation| counter to the |parentequation| % counter's reset list \emph{within} |subequations| environments, so % that \package{cleveref}'s sorting mechanism can figure things out. We % also harmlessly make sure |parentequation| is reset by the same % counter as |equation|. % \begin{macrocode} \let\cref@old@subequations\subequations% \let\cref@old@endsubequations\endsubequations% \cref@resetby{equation}{\cref@result}% \ifx\cref@result\relax\else% \@addtoreset{parentequation}{\cref@result}% \fi% \renewenvironment{subequations}{% \@addtoreset{equation}{parentequation}% \cref@old@subequations% }{% \gdef\cl@parentequation{}% \cref@old@endsubequations% \setcounter{parentequation}{0}% }% % \end{macrocode} % \end{macro} % % \begin{macro}{\make@df@tag@@} % \begin{macro}{\make@df@tag@@@} % We override the internals of the \package{amsmath} \cmd{\tag} command % to add the additional information to the label definition. Since % labels produced by \cmd{\tag} have no logical ordering when sorting a % list of references, we give them a large numerical value so that they % get pushed to the end of sorted cross-reference lists. % \begin{macrocode} \def\make@df@tag@@#1{% \gdef\df@tag{\maketag@@@{#1}\def\@currentlabel{#1}% \def\cref@currentlabel{[equation][2147483647][]#1}}} \def\make@df@tag@@@#1{% \gdef\df@tag{\tagform@{#1}% \toks@\@xp{\p@equation{#1}}% \edef\@currentlabel{\the\toks@}% \edef\cref@currentlabel{[equation][2147483647][]\the\toks@}}} }{}% end of \@ifpackageloaded{amsmath} % \end{macrocode} % \end{macro} % \end{macro} % % % % \subsubsection{\package{IEEEtrantools} support} % \begin{macro}{IEEEtrantools} % The |IEEEeqnarray| environment and \cmd{\IEEEeqnarraccr} command call % \cmd{\stepcounter} instead of \cmd{\refstepcounter} to increment the % equation counters, so they fail to set the cross-reference type for % \package{cleveref}. We patch in calls to \cmd{\refstepcounter} to fix % this. % \begin{macrocode} \@ifpackageloaded{IEEEtrantools}{% \PackageInfo{cleveref}{`IEEEtrantools' support loaded} % \end{macrocode} % % \begin{macro}{\@@IEEEeqnarray} % Rather than copying the whole of \cmd{\@@IEEEeqnarray} just to patch % the \cmd{\stepcounter} line (which would be fragile and liable to % breakage), we insert an extra step which calls \cmd{\refstepcounter} % to set the cross-reference type, then decrements the |equation| % counter by one, before calling the original \cmd{\@@IEEEeqnarray}. % \begin{macrocode} \let\cref@orig@@IEEEeqnarray\@@IEEEeqnarray \def\@@IEEEeqnarray[#1]#2{% \refstepcounter{equation}% \addtocounter{equation}{-1}% \cref@orig@@IEEEeqnarray[#1]{#2}} % \end{macrocode} % \end{macro} % % We do the same thing with \cmd{\@IEEEeqnarrayXCR}, the last in the % chain of macros that gets invoked by |\\| (let to % \cmd{\IEEEeqnarraycr}) within |IEEEeqnarray| environments. % \begin{macro}{\@IEEEeqnarrayXCR} % \begin{macrocode} \let\cref@orig@IEEEeqnarrayXCR\@IEEEeqnarrayXCR \def\@IEEEeqnarrayXCR[#1]{% \if@eqnsw% \if@IEEEissubequation% %\addtocounter{equation}{1}% \refstepcounter{IEEEsubequation}% \addtocounter{IEEEsubequation}{-1}% \else% \refstepcounter{equation}% \addtocounter{equation}{-1}% \fi% \fi% \cref@orig@IEEEeqnarrayXCR[#1]} % \end{macrocode} % \end{macro} % % \begin{macro}{\IEEEyessubnumber} % And again for \cmd{\IEEEyessubnumber} (used to turn an equation into a % subequation). % \begin{macrocode} \let\cref@orig@IEEEyessubnumber\IEEEyessubnumber \def\IEEEyessubnumber{% \if@IEEEeqnarrayISinner% \if@IEEElastlinewassubequation\else% \setcounter{IEEEsubequation}{0}% \refstepcounter{IEEEsubequation}% \fi% \fi% \cref@orig@IEEEyessubnumber} % \end{macrocode} % \end{macro} % % \begin{macro}{IEEEsubequation} % To get the subequation formatting right, we harmlessly add the % |IEEEsubequation| counter to the |equation| counter reset list so % that \package{cleveref} can figure out the subnumbering relationship, % and define |IEEEsubequation| to be an alias of the |equation| format. % \begin{macrocode} \@addtoreset{IEEEsubequation}{equation}% \crefalias{IEEEsubequation}{equation}% % \end{macrocode} % \end{macro} % % \begin{macrocode} }{}% end of \@ifpackageloaded{IEEEtrantools} % \end{macrocode} % \end{macro} % % % % \subsubsection{\package{amsthm} support} % \begin{macro}{amsthm} % If \package{amsthm} is loaded, we need to modify its theorem % referencing features so that they work with \package{cleveref}. % \begin{macrocode} \@ifpackageloaded{amsthm}{% \PackageInfo{cleveref}{`amsthm' support loaded} % \end{macrocode} % % \begin{macro}{\@thm} % We modify \package{amsthm}'s version of the \cmd{\@thm} macro, to % have it call \cmd{\refstepcounter} with an optional argument % containing the theorem type. % \begin{macrocode} \let\cref@thmnoarg\@thm \def\@thm{\@ifnextchar[{\cref@thmoptarg}{\cref@thmnoarg}}%] \def\cref@thmoptarg[#1]#2#3#4{% \ifhmode\unskip\unskip\par\fi% \normalfont% \trivlist% \let\thmheadnl\relax% \let\thm@swap\@gobble% \thm@notefont{\fontseries\mddefault\upshape}% \thm@headpunct{.}% add period after heading \thm@headsep 5\p@ plus\p@ minus\p@\relax% \thm@space@setup% #2% style overrides \@topsep \thm@preskip % used by thm head \@topsepadd \thm@postskip % used by \@endparenv \def\@tempa{#3}\ifx\@empty\@tempa% \def\@tempa{\@oparg{\@begintheorem{#4}{}}[]}% \else% \refstepcounter[#1]{#3}% <<< cleveref modification \def\@tempa{\@oparg{\@begintheorem{#4}{\csname the#3\endcsname}}[]}% \fi% \@tempa} % \end{macrocode} % \end{macro} % % \begin{macro}{\@ynthm} % We also have to modify \package{amsthm}'s \cmd{\@ynthm} command so % that it passes the optional argument to \cmd{\@thm}. Since % \package{amsmath}'s \cmd{\@ynthm} takes a different parameter list to % the standard \LaTeX{} \cmd{\@ynthm} macro, we deliberately override % our previous redefinition, and add the code for the automatic % \cmd{\crefname} definitions directly to this version. % \begin{macrocode} \def\@ynthm#1[#2]#3{% % \end{macrocode} % Here's the automatic \cmd{\crefname} definition. % \begin{macrocode} \edef\@tempa{\expandafter\noexpand% \csname cref@#1@name@preamble\endcsname}% \edef\@tempb{\expandafter\noexpand% \csname Cref@#1@name@preamble\endcsname}% \def\@tempc{#3}% \ifx\@tempc\@empty\relax% \expandafter\gdef\@tempa{}% \expandafter\gdef\@tempb{}% \else% \expandafter\expandafter\expandafter\gdef\expandafter% \@tempa\expandafter{\MakeLowercase #3}% \expandafter\expandafter\expandafter\gdef\expandafter% \@tempa\expandafter{\MakeUppercase #3}% \fi% \cref@stack@add{#1}{\cref@label@types}% % \end{macrocode} % Here's the original \package{amsthm} \cmd{\@ynthm} definition, with % the \package{cleveref} modification. % \begin{macrocode} \ifx\relax#2\relax% \def\@tempa{\@oparg{\@xthm{#1}{#3}}[]}% \else% \@ifundefined{c@#2}{% \def\@tempa{\@nocounterr{#2}}% }{% \@xp\xdef\csname the#1\endcsname{\@xp\@nx\csname the#2\endcsname}% \toks@{#3}% \@xp\xdef\csname#1\endcsname{% \@nx\@thm[#1]{% <<< new optional argument for theorem name \let\@nx\thm@swap% \if S\thm@swap\@nx\@firstoftwo\else\@nx\@gobble\fi% \@xp\@nx\csname th@\the\thm@style\endcsname}% {#2}{\the\toks@}}% \let\@tempa\relax% }% \fi% \@tempa} % \end{macrocode} % \end{macro} % % \begin{macro}{\@xnthm} % Finally, we have to restore the \package{amsthm} version of % \cmd{\@xnthm}, which we stored earlier in \cmd{\cref@old@xnthm} and % redefined. With \package{amsthm}, \cmd{\@xnthm} calls \cmd{\@ynthm}, % so the automatic \cmd{\crefname} definition is already taken care of. % \begin{macrocode} \let\@xnthm\cref@old@xnthm }{}% end of \@ifpackageloaded{amsthm} % \end{macrocode} % \end{macro} % \end{macro} % % % % \subsubsection{\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 typesetting theorems. If an older % version of \package{ntheorem} is being used, we just \cmd{\let} it to % \cmd{\relax} to make sure it's defined. % \begin{macrocode} \@ifundefined{theorem@prework}{\let\theorem@prework\relax}{} % \end{macrocode} % \end{macro} % % \begin{macro}{\@thm} % We modify \package{ntheorem}'s version of the \cmd{\@thm} macro very % slightly, to have it call \cmd{\refstepcounter} with an optional % argument containing the theorem type. % \begin{macrocode} \gdef\@thm#1#2#3{% \if@thmmarks% \stepcounter{end\InTheoType ctr}% \fi% \renewcommand{\InTheoType}{#1}% \if@thmmarks% \stepcounter{curr#1ctr}% \setcounter{end#1ctr}{0}% \fi% \refstepcounter[#1]{#2}% <<< cleveref modification \theorem@prework% \thm@topsepadd \theorempostskipamount% \ifvmode \advance\thm@topsepadd\partopsep\fi% \trivlist% \@topsep \theorempreskipamount% \@topsepadd \thm@topsepadd% \advance\linewidth -\theorem@indent% \advance\@totalleftmargin \theorem@indent% \parshape \@ne \@totalleftmargin \linewidth% \@ifnextchar[{\@ythm{#1}{#2}{#3}}{\@xthm{#1}{#2}{#3}}%] } }{}% end of \@ifpackageloaded{ntheorem} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % % % \subsubsection{\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.\ to use \cmd{\cpageref} % instead, assisted by \cmd{\@setvpageref} and \cmd{\@vpagerefrange} % (which typeset page references using \package{varioref} commands). % The former takes care of multi-references, the latter take care of % the \package{varioref} page referencing magic. % \end{macro} % % \begin{macrocode} \@ifpackageloaded{varioref}{% \PackageInfo{cleveref}{`varioref' support loaded} \PackageInfo{cleveref}{`cleveref' supersedes `varioref's % \string\labelformat command} % \end{macrocode} % % % \begin{macro}{\cref@@vpageref} % We first enhance the core \package{varioref} |\vpageref| macro to % allow it to cope with lists of page references. This is done by % defining our version in terms of \package{cleveref}'s \cmd{\cpageref} % command, which handles multi-references, but telling \cmd{\cpageref} % to typeset the actual page references themselves using % \package{varioref}'s own page-referencing commands. (The alternative % version of \cmd{\vpagerefrange} is there to facilitate later % redefinitions.) % \begin{macrocode} \def\cref@@vpageref#1[#2]#3{% \@cpageref{cref}{#3}% {\@setvpageref[#1][\vref@space]}{\@setvpagerefrange[#1]}} % \end{macrocode} % \end{macro} % % \begin{macro}{\cref@vref} % \begin{macro}{\cref@vrefrange} % \begin{macro}{\cref@fullref} % Now we define \package{cleveref}-enhanced versions of the other % \package{varioref} cross-\linebreak[4]referencing commands, which use % \cmd{\cref} et al.\ to type set the cross-references, and the % \package{cleveref}-enhanced \cmd{\vpageref} et al.\ to typeset page % references. % \begin{macrocode} \def\cref@vref#1#2{% \leavevmode% \@cref{#1}{#2}\@setcref@space% \cref@@vpageref{\reftextcurrent}[]{#2}} \def\cref@vrefrange#1#2#3{% \@setcrefrange{#2}{#3}{#1}{}\@setcref@space\vpagerefrange{#2}{#3}} \def\cref@fullref#1#2{% \@cref{#1}{#2}\@setcref@space% \@cpageref{cref}{#2}{\@setfullpageref}{\@setfullpagerefrange}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\cref@vpagerefconjunction} % When typesetting multi-references, we need to add appropriate % conjunctions to the page references produced by the % \package{varioref} macros. Since we need this in various different % commands, we separate it out into a self-contained macro. % \begin{macrocode} \def\cref@vpagerefconjunction#1{% \def\@tempa{#1}% \def\@tempb{@second}% \ifx\@tempa\@tempb\relax% \@setcref@pairconjunction% \else% \def\@tempb{@middle}% \ifx\@tempa\@tempb\relax% \@setcref@middleconjunction% \else% \def\@tempb{@last}% \ifx\@tempa\@tempb\relax% \@setcref@lastconjunction% \fi% \fi% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\@setcref@space} % We separate out the typesetting of the space between the % cross-reference and page-reference into a separate macro, to make it % easier to implement the \option{poorman} option. % \begin{macrocode} \def\@setcref@space{ } % \end{macrocode} % \end{macro} % % % \begin{macro}{\@setvpageref} % The \cmd{\@setvpageref} and \cmd{\@setvpagerefrange} macros typeset % page references using \package{varioref} commands, tweaked to work % with the enhanced \package{cleveref} page-referencing features. They % are passed to \cmd{\@cpageref} by the \package{cleveref}-enhanced % \cmd{\vpageref} command, thereby combining the \package{cleveref} and % \package{varioref} page-referencing features. % % |#1| and |#2| are \package{varioref} arguments that get passed % straight through to the (original) \package{varioref} |\@@vpageref| % macro. |#3| is the reference label itself. |#4| is either |cref| or % |Cref|, identifying the capitalisation variant, and |#5| is either % empty if we're typesetting a single page reference, or one of % |@first|, |@second|, |@middle| or |@end|, identifying where the page % reference comes in a multi-reference. The arguments in square % brackets are passed all the way through from the % \package{cleveref}-enhanced \package{varioref} commands. The others % are added by |\@cpageref| when it calls |\@setvpageref|. % \begin{macrocode} \def\@setvpageref[#1][#2]#3#4#5{% % \end{macrocode} % Add the appropriate conjunction before the page reference. % \begin{macrocode} \cref@vpagerefconjunction{#5}% % \end{macrocode} % Undefining |\vref@space| prevents the original \package{varioref} % |\@@vpageref| macro from |\unskip|ing any preceding space and % inserting its own. We definitely don't want it to do that here when % we're typesetting anything other than the first group of page % references, as any preceding space then is part of the preceding % conjunction, and should be strictly respected. But, since we're % modifying the \package{varioref} commands anyway, we take this % opportunity to get rid of the irritating \package{varioref} spacing % behaviour even for the first group of page references. % \begin{macrocode} \def\vref@space{}% % \end{macrocode} % Modify the \package{varioref} |\reftext|\meta{x} commands as % appropriate for the page reference we're currently typesetting, then % typeset the page reference. % \begin{macrocode} \begingroup% \cref@patchreftexts{#5}% \@@setvpageref{#1}[#2]{#3}% \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\@@setvpageref} % We separate out the final type setting step, as always, to make it % easier to redefine things later. % \begin{macrocode} \def\@@setvpageref#1[#2]#3{\cref@old@@vpageref{#1}[#2]{#3}} % \end{macrocode} % \end{macro} % % % \begin{macro}{\@setvpagerefrange} % |\@setvpagerefrange| is similar to |\@setvpageref|, but typesets page % ranges. |#1| is a \package{varioref} spacing argument that get passed % straight through to the \package{varioref} |\vpagerefrange| macro. % |#2| and |#3| are the labels themselves. |#4| is either |cref| or % |Cref|, identifying the capitalisation variant, and |#5| is either % empty if we're typesetting a single page range, or one of |@first|, % |@second|, |@middle| or |@end|, identifying where the page reference % comes in a multi-reference. The arguments in square brackets are % passed all the way through from the \package{cleveref}-enhanced % \package{varioref} commands. The others are added by |\@cpageref| % when it calls |\@setvpagerefrange|. % \begin{macrocode} \def\@setvpagerefrange[#1]#2#3#4#5{% % \end{macrocode} % Add the appropriate conjunction before the page range reference. % \begin{macrocode} \cref@vpagerefconjunction{#5}% % \end{macrocode} % Unlike |\vpageref|, \package{varioref}'s |\vpagerefrange| command % \emph{doesn't} go in for quite the same space-mangling behaviour. We % still undefine \cmd{\vref@space}, though. % \begin{macrocode} \let\vref@space\relax% % \end{macrocode} % Modify the \package{varioref} |\reftext|\meta{x} commands as % appropriate for the page range we're currently typesetting, then % typeset the page range. % \begin{macrocode} \begingroup% \cref@patchreftexts{#5}% \@@setvpagerefrange[#1]{#2}{#3}% \endgroup} % \end{macrocode} % % Again, we separate out the final typesetting step, to aid later % redefinition. % \begin{macrocode} \def\@@setvpagerefrange[#1]#2#3{\vpagerefrange[#1]{#2}{#3}} % \end{macrocode} % \end{macro} % % % \begin{macro}{\@setfullpageref} % \begin{macrocode} \def\@setfullpageref#1#2#3{% % \end{macrocode} % Add the appropriate conjunction before the page reference. % \begin{macrocode} \cref@vpagerefconjunction{#3}% % \end{macrocode} % Modify the \package{varioref} |\reftext|\meta{x} commands as % appropriate for the page reference we're currently typesetting, then % typeset the page reference. % \begin{macrocode} \begingroup% \cref@patchreftexts{#3}% \@@setfullpageref{#1}% \endgroup} % \end{macrocode} % % Separate out the final typesetting step, as usual. % \begin{macrocode} \def\@@setfullpageref#1{\reftextfaraway{#1}} % \end{macrocode} % \end{macro} % % % \begin{macro}{\@setfullpagerefrange} % \begin{macrocode} \def\@setfullpagerefrange#1#2#3#4{% % \end{macrocode} % Add the appropriate conjunction before the page reference. % \begin{macrocode} \cref@vpagerefconjunction{#4}% % \end{macrocode} % Modify the \package{varioref} |\reftext|\meta{x} commands as % appropriate for the page reference we're currently typesetting, then % typeset the page reference. % \begin{macrocode} \begingroup% \cref@patchreftexts{#4}% \@@setfullpagerefrange{#1}{#2}% \endgroup} % \end{macrocode} % % Separate out the final typesetting step, as usual. % \begin{macrocode} \def\@@setfullpagerefrange#1#2{\reftextpagerange{#1}{#2}} % \end{macrocode} % \end{macro} % % % \begin{macro}{\cref@old@@vpageref} % Unfortunately, \package{varioref}'s |\@@vpageref| macro calls a % |\vref@label| \emph{before} it typesets the page reference. The % |\protected@write| within |\vref@label| seems to prevent an |\unskip| % command coming after the |\vref@label| from removing any space that % was inserted before the |\vref@label|. This means that setting a % |\reftext|\meta{x} command to |\unskip| won't work; it won't properly % remove any preceding space in the event that the an empty page % reference is typeset. % % This didn't matter in the original \package{varioref} implementation, % because it \emph{always} removed any preceding space, then inserted % its own space \emph{after} the |\vref@label|, which the |\unskip| % could then gobble. But we want to get rid of this irritating % always-space-gobbling behaviour here. So we have to redefine % |\@@vpageref| (here renamed |\cref@old@@vpageref|) in order to move % the |\vref@label| to the end of the macro, after the page reference % has been typeset. We also remove the |\unskip| from the start of % |\@@vpageref|. % \begin{macrocode} \def\cref@old@@vpageref#1[#2]#3{% \leavevmode%\unskip <<< \global\advance\c@vrcnt\@ne \vref@pagenum\@tempa{\the\c@vrcnt @vr}% \vref@pagenum\@tempb{\the\c@vrcnt @xvr}% %\vref@label{\the\c@vrcnt @xvr}% <<< \ifx\@tempa\@tempb\else \vref@err{\noexpand\vref or \noexpand\vpageref at page boundary \@tempb-\@tempa\space (may loop)% }% \fi \vrefpagenum\thevpagerefnum{#3}% \vref@space \ifx\@tempa\thevpagerefnum \def\@tempc{#1}% \ifx\@tempc\@empty \unskip \else #1% \fi \else #2% \is@pos@number\thevpagerefnum {% \is@pos@number\@tempa {\@tempcnta\@tempa \advance\@tempcnta\@ne }% {\@tempcnta\maxdimen}% \ifnum \thevpagerefnum =\@tempcnta \ifodd\@tempcnta \if@twoside \reftextfaceafter \else \reftextafter \fi \else \reftextafter \fi \else \advance\@tempcnta-2 \ifnum \thevpagerefnum =\@tempcnta \ifodd\@tempcnta \reftextbefore \else \if@twoside \reftextfacebefore \else \reftextbefore \fi \fi \else \reftextfaraway{#3}% \fi \fi }% {\reftextfaraway{#3}}% \fi \vref@label{\the\c@vrcnt @xvr}% <<< \vref@label{\the\c@vrcnt @vr}% } % \end{macrocode} % \end{macro} % % % We save the default \package{varioref} |\reftext|\meta{x} commands as % |\creftext|\meta{x}, before the user's had any chance to redefine them. % These are used if a |\reftext|\meta{x} is redefined to produce an empty % reference, to force a non-empty reference within multi-references. % \begin{macrocode} \let\creftextcurrent\reftextcurrent \let\creftextfaceafter\reftextfaceafter \let\creftextfacebefore\reftextfacebefore \let\creftextafter\reftextafter \let\creftextbefore\reftextbefore \let\creftextfaraway\reftextfaraway \let\creftextpagerange\reftextpagerange % \end{macrocode} % % \begin{macro}{\cref@patchreftexts} % \begin{macro}{\cref@restorereftexts} % The |\cref@patchreftexts| command modifies \package{varioref} % |\reftext|\meta{x} commands, for use within |\@setvpageref| and % |\@setvpagerefrange|. % \begin{macrocode} \def\cref@patchreftexts#1{% \cref@patchreftext{reftextcurrent}{#1}% \cref@patchreftext{reftextfaceafter}{#1}% \cref@patchreftext{reftextfacebefore}{#1}% \cref@patchreftext{reftextafter}{#1}% \cref@patchreftext{reftextbefore}{#1}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\cref@patchreftext} % |\cref@patchreftext| does the hard work of modifying the % |\reftext|\meta{x} command given in |#1| as appropriate for the % |\@setvpageref| or |\@setvpagerefrange| command that it's called % from. (It can only be called from within one of those commands.) |#2| % is empty if we're typesetting a single page reference, or one of % |@first|, |@second|, |@middle| or |@end| when typesetting a % multi-reference. % \begin{macrocode} \def\cref@patchreftext#1#2{% \def\@tempa{#2}% % \end{macrocode} % If we're typesetting a single page reference\dots % \begin{macrocode} \ifx\@tempa\@empty% % \end{macrocode} % if the reftext command produces an empty reference, redefine it to % be |\unskip|. % \begin{macrocode} \def\@tempc{}% \expandafter\ifx\csname #1\endcsname\@tempc\relax% \expandafter\def\csname #1\endcsname{\unskip}% %{\advance\count@group -1\reftextcurrent@orig}% \else% \long\def\@tempc{}% \expandafter\ifx\csname #1\endcsname\@tempc\relax% \expandafter\def\csname #1\endcsname{\unskip}% %{\advance\count@group -1\reftextcurrent@orig}% \fi% \fi% % \end{macrocode} % % If we're typesetting a multi-reference\dots % \begin{macrocode} \else% % \end{macrocode} % if the reftext command produces an empty page reference, patch it % to instead use |\creftext|\meta{x}, which always produces a % non-empty reference. % \begin{macrocode} \long\def\@tempc{\unskip}% \expandafter\ifx\csname #1\endcsname\@tempc\relax% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\csname #1\endcsname\expandafter{% \csname c#1\endcsname}% \else% \long\def\@tempc{}% \expandafter\ifx\csname #1\endcsname\@tempc\relax% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\csname #1\endcsname\expandafter{% \csname c#1\endcsname}% \else% \def\@tempc{\unskip}% \expandafter\ifx\csname #1\endcsname\@tempc\relax% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\csname #1\endcsname\expandafter{% \csname c#1\endcsname}% \else% \def\@tempc{}% \expandafter\ifx\csname #1\endcsname\@tempc\relax% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\csname #1\endcsname\expandafter{% \csname c#1\endcsname}% \fi% \fi% \fi% \fi% \fi} % \end{macrocode} % \end{macro} % % % \begin{macro}{\@setcref@pairconjunction} % \begin{macro}{\@setcref@middleconjunction} % \begin{macro}{\@setcref@lastconjunction} % We also add an extra macro layer for typesetting the conjunctions, % for the same reason. (Note that we only needed to do this for the % group conjunctions previously, as the other conjunctions are never % used directly in the normal \package{cleveref} commands. But % |\@setvpageref| and |\@setvpagerefrange| \emph{do} use them directly, % so now we do need macros to separate out the final type setting of % the rest of the conjunctions.) % \begin{macrocode} \def\@setcref@pairconjunction{\crefpairconjunction} \def\@setcref@middleconjunction{\crefmiddleconjunction} \def\@setcref@lastconjunction{\creflastconjunction} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % % We now redefine the original \package{varioref} commands to use the % \package{cleveref}-enhanced versions. The redefinition of % \cmd{\@@vpageref} has to be postponed until the beginning of the % document, to make sure it overrides \package{hyperref}'s redefinition % (if loaded). % \begin{macrocode} \AtBeginDocument{% \def\@@vpageref#1[#2]#3{\cref@@vpageref{#1}[#2]{#3}} } % \end{macrocode} % % \begin{macro}{\vpageref} % \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*} % Since we're defining the spacing behaviour of \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} % \end{macro} % \begin{macrocode} \if@cref@hyperrefloaded\relax% hyperref loaded \DeclareRobustCommand{\vref}{% \@ifstar{\cref@vrefstar{cref}}{\cref@vref{cref}}} \DeclareRobustCommand{\Vref}{% \@ifstar{\cref@vrefstar{Cref}}{\cref@vref{Cref}}} \DeclareRobustCommand{\vrefrange}{% \@ifstar{\cref@vrefrangestar{cref}}{\cref@vrefrange{cref}}} \DeclareRobustCommand{\Vrefrange}{% \@ifstar{\cref@vrefrangestar{Cref}}{\cref@vrefrange{Cref}}} \DeclareRobustCommand{\fullref}{% \@ifstar{\cref@fullrefstar{cref}}{\cref@fullref{cref}}} \DeclareRobustCommand{\Fullref}{% \@ifstar{\cref@fullrefstar{Cref}}{\cref@fullref{Cref}}} \def\cref@vrefstar#1#2{% \@crefstarredtrue% \cref@vref{#1}{#2}% \@crefstarredfalse} \def\cref@vrefrangestar#1#2#3{% \@crefstarredtrue% \cref@vrefrange{#1}{#2}{#3}% \@crefstarredfalse} \def\cref@fullrefstar#1#2{% \@crefstarredtrue% \cref@fullref{#1}{#2}% \@crefstarredfalse} \else% \DeclareRobustCommand{\vref}{\cref@vref{cref}} \DeclareRobustCommand{\Vref}{\cref@vref{Cref}} \DeclareRobustCommand{\vrefrange}{\cref@vrefrange{cref}} \DeclareRobustCommand{\Vrefrange}{\cref@vrefrange{Cref}} \DeclareRobustCommand{\fullref}{\cref@fullref{cref}} \DeclareRobustCommand{\Fullref}{\cref@fullref{Cref}} \fi% end of test for hyperref }{}% end of \@ifpackageloaded{varioref} % \end{macrocode} % % % % \subsubsection{\package{algorithm} support} % \begin{macro}{algorithm} % If \package{algorithm} is loaded, we modify its line numbering % mechanism so that labels referring to line numbers in algorithms work % with \package{cleveref}. % \end{macro} % \begin{macrocode} \@ifpackageloaded{algorithm}{% \PackageInfo{cleveref}{`algorithm' support loaded} % \end{macrocode} % % \begin{macro}{\ALG@step} % We modify \package{algorithm}'s \cmd{\ALG@step} macro, which % increments the line number, so that it stores the necessary % information in \cmd{\cref@currentlabel}. \cmd{\ALG@step} already % increments the line number counter \cmd{\ALG@line} using % \cmd{\addtocounter}, but to get \package{cleveref} support working, % it's cleaner to hook into the \cmd{\refstepcounter} mechanism, so we % first decrement the counter and then re-increment it using % \cmd{\refstepcounter}. % \begin{macrocode} \let\cref@old@ALG@step\ALG@step \def\ALG@step{% \cref@old@ALG@step% \addtocounter{ALG@line}{-1}% \refstepcounter{ALG@line}% \expandafter\@cref@getprefix\cref@currentlabel\@nil\cref@currentprefix% \xdef\cref@currentprefix{\cref@currentprefix}} % \end{macrocode} % \end{macro} % % \begin{macro}{\ALG@beginalgorithmic} % However, this is not yet sufficient. The \cmd{\refstepcounter} above % is called within a group, so the resulting \cmd{\cref@currentlabel} % definition will not persist beyond the end of the group. To transfer % the information to the ``outside'', we follow \package{algorithm}'s % own method for getting the label information into % \cmd{\@currentlabel}: we define \cmd{\cref@currentlabel} within % |algorithm| environments to refer specifically to macros that store % the line number information. % \begin{macrocode} \g@addto@macro\ALG@beginalgorithmic{% \def\cref@currentlabel{% [line][\arabic{ALG@line}][\cref@currentprefix]\theALG@line}} }{}% end of \@ifpackageloaded{algorithm} % \end{macrocode} % \end{macro} % % % % \subsubsection{\package{listings} support} % \begin{macro}{listings} % To support cross-references to listings produced by the % \package{listings} package, all we need to do is alias the counter it % uses, \cmd{\lstnumber}, to the ``listing'' cross-reference type. % \begin{macrocode} \@ifpackageloaded{listings}{% \PackageInfo{cleveref}{`listings' support loaded} \crefalias{lstlisting}{listing}% \crefalias{lstnumber}{line}% % \end{macrocode} % % However, supporting cross-references to the line numbers is % unfortunately a little more complicated than simply aliasing the % ``lstnumber'' counter to the ``line'' cross-reference type (above). % \package{listings} calls \cmd{\refstepcounter} from its % \cmd{\lsthk@EveryPar} hook. But the hook macro is expanded inside a % group. So that \cmd{\refstepcounter} call is completely useless: % neither the \cmd{\@currentlabel} nor the \cmd{\cref@currentlabel} % definitions make it out of the group, so they have no effect on % \cmd{\label} definitions! % % To make line labels work, \package{listings} sets \cmd{\@currentlabel} % to \cmd{\thelstnumber} at the beginning of a listing, via the % \cmd{\lsthk@Init} hook, and it is \emph{this} (and not % \cmd{\refstepcounter}) which causes the current line number to be % picked up by \cmd{\label}s. To get line numbers working with % \package{cleveref} too, we need to replicate this for % \cmd{\cref@currentlabel}, which is what the following hook code does. % % \begin{macro}{\lsthk@Init} % \begin{macro}{\lsthk@EveryPar} % \begin{macrocode} \lst@AddToHook{Init}{% \def\cref@currentlabel{% [line][\arabic{lstnumber}][\cref@currentprefix]\thelstnumber}} \lst@AddToHook{EveryPar}{% \expandafter\@cref@getprefix\cref@currentlabel\@nil\cref@currentprefix% \xdef\cref@currentprefix{\cref@currentprefix}} }{}% end of \@ifpackageloaded{listings} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % % % \subsubsection{\package{algorithm2e} support} % \begin{macro}{algorithm2e} % All we need to do to support the \package{algorithm2e} package is to % alias \emph{its} counters, \cmd{\algocf} and \cmd{\algocfline}, to % the ``algorithm'' and ``line'' cross-reference types. % \begin{macrocode} \@ifpackageloaded{algorithm2e}{% \PackageInfo{cleveref}{`algorithm2e' support loaded} \crefalias{algocf}{algorithm}% \crefalias{algocfline}{line}% }{}% end of \@ifpackageloaded{listings} % \end{macrocode} % \end{macro} % % % % \subsubsection{\package{subfig} support} % \begin{macro}{subfig} % The \package{subfig} package modifies \cmd{\refstepcounter} within % floats. Most of the time, this isn't a problem for % \package{cleveref}, as \package{subfig}'s modified % \cmd{\refstepcounter} calls \package{cleveref}'s version after it's % done its stuff. However, this breaks support the % \cmd{\refstepcounter} optional argument, so we fix that here. % % \package{Subfig} also redefines \cmd{\label} within subfloats, % breaking \package{cleveref}'s optional argument. We also fix that. % \begin{macrocode} \@ifpackageloaded{subfig}{% \PackageInfo{cleveref}{`subfig' support loaded} % \end{macrocode} % % \begin{macro}{\refsteponlycounter} % \package{subfig} replaces \cmd{\refstepcounter} with % \cmd{\refsteponlycounter} within floats, which calls the saved % \package{cleveref} \cmd{\refstepcounter} after doing some extra % \package{subfig}-related processing. We redefine % \cmd{\refsteponlycounter} so that passing it an optional argument % bypasses \package{subfig}'s code entirely and just calls the % \package{cleveref} code directly. Since only % \package{cleveref}-specific commands will ever pass an optional % argument to \cmd{\refstepcounter}, this won't affect % \package{subfig}'s use of \cmd{\refstepcounter}. We have to postpone % this redefinition until the beginning of the document because % \package{subfig} does. % \begin{macrocode} \AtBeginDocument{ \let\cref@old@refsteponlycounter\refsteponlycounter \def\refsteponlycounter{% \@ifnextchar[{\refstepcounter@optarg}% {\cref@old@refsteponlycounter}%] }} % \end{macrocode} % \end{macro} % % \begin{macro}{\sf@sub@label} % \begin{macro}{\sf@old@label} % \begin{macro}{\cref@old@label} % Inside a subfloat, \package{subfig} captures the current \cmd{\label} % definition in \cmd{\sf@oldlabel}, then replaces \cmd{\label} with % \cmd{\subfloat@label}, which does additional argument and % subfloat-related processing before calling \cmd{\sf@oldlabel}. This % breaks \package{cleveref}'s \cmd{\label} optional argument. % % We need to insert an extra layer of processing into the chain of % redefined \cmd{\label} macro calls, to process \package{cleveref}'s % optional argument. We do this by redefining \package{subfig}'s % \cmd{\sf@sub@label} command to process \package{subfig}'s optional % argument (which uses parentheses rather than square brackets) as usual, % but then have it call \cmd{\cref@label} which stores % \package{cleveref}'s \cmd{\label} command (recall that we're inside a % subfloat here, where \package{subfig} has overridden the \cmd{\label} % macro itself), to process \package{cleveref}'s own \cmd{\label} % optional argument. % % \cmd{\cref@label} would normally call the original \cmd{\label} % definition stored in \cmd{\cref@old@label}, whereas here we want it % to instead call \cmd{\sf@@sub@label}, the next layer of the % \package{subfig} \cmd{\label} macro stack, otherwise we bypass the % rest of the \package{subfig} processing and break it. So we % temporarily let \cmd{\cref@old@label} to \cmd{\sf@@sub@label}, so % that \cmd{\cref@label} hands back to \package{subfig}'s \cmd{\label} % processing when done. (We're inside a group, so \cmd{\cref@old@label} % gets restored at the end of the subfloat.) % % The final issue is that \package{subfig} captures the original % \cmd{\label} definition in \cmd{\sf@oldlabel} at the beginning of the % subfloat. But this captures \package{cleveref}'s % definition,\footnote{Actually, because \package{subfig} always loads % the \package{caption} package, it captures \package{cleveref}'s % \package{caption}-related redefinition of \cmd{\label}.} instead of % the original \cmd{\label} definition that needs to be called after % \package{subfig} has finished its stuff. So, we let \cmd{\sf@oldlabel} % to \cmd{\cref@old@label} before redefining the latter, so that the % \package{subfig} \cmd{\label} stack calls the right thing once it's % done its own processing. Oof! % \begin{macrocode} \def\sf@sub@label(#1){% \ifhyperrefloaded \protected@edef\@currentlabelname{% \expandafter\strip@period #1\relax.\relax\@@@}% \fi% \let\sf@oldlabel\cref@old@label% \let\cref@old@label\sf@@sub@label% \cref@label}% % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macrocode} }{}% end of \@ifpackageloaded{subfig} % \end{macrocode} % \end{macro} % % % % \subsubsection{\package{memoir} subfig support} % \begin{macro}{memoir} % We try to stay out of \package{memoir}'s way as much as possible, by % using a separate set of parallel label definitions for % \package{cleveref}, and leaving the standard labels alone for % \package{memoir} and other packages to use as normal. The one % remaining point of contention is the \cmd{\label} command itself. % % \begin{macro}{\sf@memsub@label} % \begin{macro}{\@memoldlabel} % \begin{macro}{\cref@old@label} % \package{memoir} contains its own internal re-implementation of % \package{subfig}, which redefines \cmd{\label} in a very similar way. % We therefore have to replicate the \package{subfig} support for % \package{memoir}'s internal re-implementation. (We have to postpone % the redefinitions until the beginning of the document because % \package{memoir} does, too.) % \begin{macrocode} \@ifclassloaded{memoir}{% \AtBeginDocument{ \def\sf@memsub@label(#1){% \protected@edef\mem@currentlabelname{#1}% \let\@memoldlabel\cref@old@label% \let\cref@old@label\sf@@memsub@label% \cref@label}} }{} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % % % \subsubsection{\package{caption} support} % \begin{macro}{caption} % The \package{caption} package redefines \cmd{\label} within floats. % Since version 3.2c, it is careful to redefine \cmd{\label} in a way % that doesn't break any optional arguments introduced by other % packages (such as \package{cleveref}'s), so we no longer need to add % any compatibility hacks. % % Earlier versions of \package{caption} do break \package{cleveref}'s % optional argument, however, so we have to fix things here for those % versions. % \begin{macrocode} \@ifpackageloaded{caption}{% \@ifpackagelater{caption}{2011/08/19}{}{% \PackageInfo{cleveref}{`caption' support loaded} % \end{macrocode} % % \begin{macro}{\cref@old@caption@xlabel} % \begin{macro}{\cref@old@label} % \begin{macro}{\cref@ORI@label} % \begin{macro}{\caption@ORI@label} % We fix the \cmd{\label} argument parsing by redefining % \cmd{\caption@xlabel}, the macro which \cmd{\label} is let to inside % floats, to juggle around the various \package{cleveref} and % \package{caption} \cmd{\label}-processing macros so that everything % ultimately gets processed correctly. % % \cmd{\cref@label} stores \package{cleveref}'s \cmd{\label} % redefinition (recall that we're inside a float here, where % \cmd{\label} itself has been redefined by \package{caption}). % \cmd{\cref@label} processes \package{cleveref}'s optional % \cmd{\label} argument, if any. It then calls \cmd{\cref@old@label}. % But we've let that to \cmd{\cref@old@caption@xlabel}, which stores % the original \cmd{\caption@xlabel}. So the net effect is to insert an % extra layer of optional argument processing between \cmd{\label} and % \cmd{\caption@xlabel}, which can then proceed as before. % % The final issue is that \package{caption} captures the original % \cmd{\label} definition in \cmd{\caption@ORI@label}, but this picks % up the \package{cleveref} redefinition, which is not what we want. So % we let \cmd{\caption@ORI@label} to the original \cmd{\label} % definition as captured by \package{cleveref}. Usually, that's stored % in \cmd{\cref@old@label}, but we've temporarily redefined that. So we % need to save what was originally preserved in \cmd{\cref@old@label} % in \cmd{\cref@ORI@old@label}, and make \cmd{\caption@ORI@label} call % that. Oof! % \begin{macrocode} \let\cref@old@caption@xlabel\caption@xlabel \def\caption@xlabel{% \let\cref@ORI@label\cref@old@label% \let\cref@old@label\cref@old@caption@xlabel% \let\caption@ORI@label\cref@ORI@label% \cref@label}% % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macrocode} }% end of \@ifpackagelater }{}% end of \@ifpackageloaded{caption} % \end{macrocode} % \end{macro} % % % % \subsubsection{\package{aliascnt} support} % \begin{macro}{aliascnt} % For the \package{aliascnt} trick described in \cref{sec:label_type} % of the documentation to work, we have to inform \package{cleveref} % about how aliased counters get reset. \package{aliascnt}'s % \cmd{\newaliascnt} command doesn't add the aliased counter to any % reset list, but if the counter it's aliased to gets reset, the % aliased counter will get reset too. In order for \package{cleveref} % to correctly sort cross-references to the aliased counter, we have to % add that counter to the appropriate reset list, even though that % isn't necessary to actually reset the counter itself. We add this to % the \cmd{\newaliascnt} command. % \end{macro} % \begin{macro}{\newaliascnt} % \begin{macrocode} \@ifpackageloaded{aliascnt}{% \PackageInfo{cleveref}{`aliascnt' support loaded} \let\cref@old@newaliascnt\newaliascnt \renewcommand*{\newaliascnt}[2]{% \cref@old@newaliascnt{#1}{#2}% \cref@resetby{#2}{\cref@result}% \ifx\cref@result\relax\else% \@addtoreset{#1}{\cref@result}% \fi} }{}% end of \@ifpackageloaded{aliascnt} % \end{macrocode} % \end{macro} % % % % \subsection{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, % typesetting all the reference formatting explicitly, and using the % standard \cmd{\ref} and \cmd{\pageref} commands to produce the % references themselves. % \end{macro} % \begin{macrocode} \DeclareOption{poorman}{% \PackageInfo{cleveref}{option `poorman' loaded} % \end{macrocode} % % % \begin{macro}{\cref@poorman@text} % Define global macro \cmd{\cref@poorman@text} to store the text % produced by the \cmd{\cref} commands, and open an output stream for % writing the script before starting to process the document body. % \begin{macrocode} \gdef\cref@poorman@text{} \AtBeginDocument{% \newwrite\@crefscript% \immediate\openout\@crefscript=\jobname.sed} % \end{macrocode} % \end{macro} % % % \begin{macro}{select@language} % \begin{macro}{foreign@language} % If \package{babel} is loaded, we add to the \cmd{\select@language} % and \cmd{\foreign@language} commands to make them write substitution % rules to the script that replace the cross-reference name and % conjunction component macros with the appropriate language-dependent % names. We use |sed| line-number addresses in the rules to ensure they % are only applied to the regions in which that particular language was % in use. % % Note that we write substitution rules for the \emph{previous} % language block when the language is changed, because we need the % rules to appear in the script \emph{after} all the cross-reference % substitution rules for that language block. \cmd{\cref@inputlineno} % stores the input-file line-number of the start of the previous % language block. % % We postpone the redefinitions until the beginning of the document not % only to ensure that they don't get clobbered by other package's % redefinitions, but also because we don't want the redefinitions to % take effect until after \package{babel} has called % \cmd{\selectlanguage} for the main language (remember, the % substitution rules for this first language block will get written at % the next language change). % % Note that, since we're writing to the script file within % \cmd{\AtBeginDocument} and \cmd{\AtEndDocument}, this code has to % come \emph{after} the above \cmd{\AtBeginDocument} code which opens % the script file for writing, and \emph{before} the later % \cmd{\AtEndDocument} code (below) which closes it. % % The |\if@cref@switched@language| flag is set when a \package{babel} % language switching command is called. It is checked by % \cmd{\cref@writelanguagerules} when writing substitution rules. % \begin{macrocode} \newif\if@cref@switched@language \@ifpackageloaded{babel}{% \AtBeginDocument{% \let\cref@old@select@language\select@language \def\select@language{% \@cref@switched@languagetrue% \cref@writelanguagerules% \cref@old@select@language} \let\cref@old@foreign@language\foreign@language \def\foreign@language{% \@cref@switched@languagetrue% \cref@writelanguagerules% \cref@old@foreign@language} \edef\cref@inputlineno{\the\inputlineno}}% }{} % \end{macrocode} % \end{macro} % \end{macro} % % The final set of substitution rules gets written at the end of the % document. This is the only set of rules that gets written if % \package{babel} is not loaded. % \begin{macrocode} \AtEndDocument{% \let\select@language\cref@old@select@language% \let\foreign@language\cref@old@foreign@language% \cref@writelanguagerules} % \end{macrocode} % % \begin{macro}{\cref@writelanguagerules} % \cmd{\cref@writelanguagerules} does the grunt work of writing out the % necessary substitution rules. % \begin{macrocode} \def\cref@writelanguagerules{% \begingroup% % \end{macrocode} % If |\if@cref@switched@language| hasn't been set, then we must be % writing the final set of substitution rules at the end of a document % in which no language switching command was ever used. In which case, % the substitution rules don't specify a line-number address. % \begin{macrocode} \if@cref@switched@language% \edef\@address{\cref@inputlineno,\the\inputlineno}% \else% \def\@address{}% \fi% \expandafter\def\expandafter\cref@poorman@text\expandafter{% \crefrangeconjunction}% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter{\@address}{\string\crefrangeconjunction}}% \expandafter\cref@writescript\@tempa% \expandafter\def\expandafter\cref@poorman@text\expandafter{% \crefrangepreconjunction}% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter{\@address}{\string\crefrangepreconjunction}}% \expandafter\cref@writescript\@tempa% \expandafter\def\expandafter\cref@poorman@text\expandafter{% \crefrangepostconjunction}% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter{\@address}{\string\crefrangepostconjunction}}% \expandafter\cref@writescript\@tempa% \expandafter\def\expandafter\cref@poorman@text\expandafter{% \crefpairconjunction}% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter{\@address}{\string\crefpairconjunction}}% \expandafter\cref@writescript\@tempa% \expandafter\def\expandafter\cref@poorman@text\expandafter{% \crefmiddleconjunction}% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter{\@address}{\string\crefmiddleconjunction}}% \expandafter\cref@writescript\@tempa% \expandafter\def\expandafter\cref@poorman@text\expandafter{% \creflastconjunction}% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter{\@address}{\string\creflastconjunction}}% \expandafter\cref@writescript\@tempa% \expandafter\def\expandafter\cref@poorman@text\expandafter{% \crefpairgroupconjunction}% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter{\@address}{\string\crefpairgroupconjunction}}% \expandafter\cref@writescript\@tempa% \expandafter\def\expandafter\cref@poorman@text\expandafter{% \crefmiddlegroupconjunction}% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter{\@address}{\string\crefmiddlegroupconjunction}}% \expandafter\cref@writescript\@tempa% \expandafter\def\expandafter\cref@poorman@text\expandafter{% \creflastgroupconjunction}% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter{\@address}{\string\creflastgroupconjunction}}% \expandafter\cref@writescript\@tempa% % \end{macrocode} % We write substitution rules for all component-derived cross-reference % formats, as listed in \cmd{\cref@label@types}. % \begin{macrocode} \let\@tempstack\cref@label@types% \cref@isstackfull{\@tempstack}% \@whilesw\if@cref@stackfull\fi{% % \end{macrocode} % \cmd{\cref@\meta{type}@name} substitution rules. % \begin{macrocode} \edef\@tempa{\cref@stack@top{\@tempstack}}% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\cref@poorman@text% \expandafter\expandafter\expandafter{% \csname cref@\@tempa @name\endcsname}% \edef\@tempa{% \string\cref@\expandafter\noexpand\@tempa @name\space}% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempa% \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter{% \expandafter\@address\expandafter}% \expandafter{\@tempa}}% \expandafter\cref@writescript\@tempa% % \end{macrocode} % \cmd{\cref@\meta{type}@name@plural} substitution rules. % \begin{macrocode} \edef\@tempa{\cref@stack@top{\@tempstack}}% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\cref@poorman@text% \expandafter\expandafter\expandafter{% \csname cref@\@tempa @name@plural\endcsname}% \edef\@tempa{% \string\cref@\expandafter\noexpand\@tempa% @name@plural\space}% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempa% \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter{% \expandafter\@address\expandafter}% \expandafter{\@tempa}}% \expandafter\cref@writescript\@tempa% % \end{macrocode} % \cmd{\Cref@\meta{type}@name} substitution rules. % \begin{macrocode} \edef\@tempa{\cref@stack@top{\@tempstack}}% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\cref@poorman@text% \expandafter\expandafter\expandafter{% \csname Cref@\@tempa @name\endcsname}% \edef\@tempa{% \string\Cref@\expandafter\noexpand\@tempa @name\space}% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempa% \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter% {\expandafter\@address\expandafter}% \expandafter{\@tempa}}% \expandafter\cref@writescript\@tempa% % \end{macrocode} % \cmd{\Cref@\meta{type}@name@plural} substitution rules. % \begin{macrocode} \edef\@tempa{\cref@stack@top{\@tempstack}}% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\cref@poorman@text% \expandafter\expandafter\expandafter{% \csname Cref@\@tempa @name@plural\endcsname}% \edef\@tempa{% \string\Cref@\expandafter\noexpand\@tempa% @name@plural\space}% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\@tempa% \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter% {\expandafter\@address\expandafter}% \expandafter{\@tempa}}% \expandafter\cref@writescript\@tempa% % \end{macrocode} % After the loop over cross-reference types, we set % \cmd{\cref@inputlineno} to the current input-file line, in preparation % for the next language block. % \begin{macrocode} \cref@stack@pop{\@tempstack}% \cref@isstackfull{\@tempstack}}% \endgroup% \edef\cref@inputlineno{\the\inputlineno}}% % \end{macrocode} % \end{macro} % % % After processing the document body, we re-read in the temporary script % file, and write it out again to the final |sed| script file, escaping % regexp special characters in the process. The escaping is carried out % by turning the regexp special characters into active characters, and % defining them to expand to their escaped form. This involves a lot of % juggling of catcodes and lccodes! % % Both \cmd{\DeclareOption} and \cmd{\AtEndDocument} store their % arguments in token lists, so all the following \TeX code is already % tokenised long before it is expanded and evaluated. Thus there is no % (easy) way to change the catcodes of the characters appearing here % before they are tokenised. In one way this is convenient: the catcode % changes we make don't ``take'' until evaluated, so we can continue to % use the standard \TeX characters (\textbackslash, \{, \} etc.) even % after the lines containing the catcode commands. But in another, more % significant, way, it is very inconvenient: it makes it difficult to % define the regexp special characters as active characters, since it's % impossible to directly create tokens with the correct char- and % catcodes. % % We get around this by creating the unusual charcode/catcode % combinations using the \cmd{\lowercase} trick (\cmd{\lowercase} changes % the charcodes of all characters in its argument to their lccodes, but % \emph{leaves their catcodes alone}). That way, the argument of % \cmd{\AtEndDocument} is tokenised correctly, and when it comes to be % expanded and evaluated, the \cmd{\lowercase} commands create tokens % with the correct char- and catcodes. % \begin{macrocode} \AtEndDocument{% \immediate\closeout\@crefscript% \newread\@crefscript% \immediate\openin\@crefscript=\jobname.sed% \begingroup% \newif\if@not@eof% \def\@eof{\par }% % \end{macrocode} % Change catcodes of regexp special characters to make them active % characters and define them to expand to their escaped forms. Change % those of \TeX{} special characters to make them normal letters. % \begin{macrocode} \catcode`.=13 \catcode`*=13 \catcode`[=13 \catcode`]=13 \catcode`^=13 \catcode`$=13 %$ \catcode`\=0 \catcode`<=1 \catcode`>=2 \catcode`\\=13 \catcode`\{=12 \catcode`\}=12 \catcode`_=12 \lccode`/=92 \lccode`~=92\lowercase{\def~{\string/\string/}}% \lccode`~=42\lowercase{\def~{\string/\string*}}% \lccode`~=46\lowercase{\def~{\string/\string.}}% \lccode`~=91\lowercase{\def~{\string/\string[}}% \lccode`~=93\lowercase{\def~{\string/\string]}}% \lccode`~=94\lowercase{\def~{\string/\string^}}% \lccode`~=36\lowercase{\def~{\string/\string$}}% $ \lccode`~=0 \lccode`/=0 \catcode`~=12 % \end{macrocode} % Read lines from the temporary script file, expand them to escape regexp % special characters, and store them in \cmd{\cref@poorman@text}. % \begin{macrocode} \def\cref@poorman@text{}% \immediate\read\@crefscript to \@tempa% \ifx\@tempa\@eof% \@not@eoffalse% \else% \@not@eoftrue% \edef\@tempa{\@tempa}% \fi% \@whilesw\if@not@eof\fi{% \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \immediate\read\@crefscript to \@tempa% \ifx\@tempa\@eof% \@not@eoffalse% \else% \@not@eoftrue% \edef\@tempa{\@tempa}% \fi}% \endgroup% \immediate\closein\@crefscript% % \end{macrocode} % Add some rules to remove other \package{cleveref} commands. We use the % \cmd{\lowercase} trick again for writing the \textbackslash, \{ and \} % characters. (This could be done in other ways, but since we're in % \cmd{\lowercase} mood, why not stick with it.) % \begin{macrocode} \begingroup% \lccode`|=92 \lccode`<=123 \lccode`>=125 \lccode`C=67 \lowercase{\def\@tempa{%[ s/||label|[[^]]*|]/||label/g}} \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \lowercase{\edef\@tempa{s/||usepackage|(|[.*|]|)|<0,1|>//g}}% \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \lowercase{\edef\@tempa{s/||[cC]refformat<.*><.*>//g}}% \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \lowercase{\edef\@tempa{s/||[cC]refrangeformat<.*><.*>//g}}% \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \lowercase{\edef\@tempa{s/||[cC]refmultiformat<.*><.*><.*><.*>//g}}% \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \lowercase{\edef\@tempa{% s/||[cC]refrangemultiformat<.*><.*><.*><.*>//g}}% \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \lowercase{\edef\@tempa{s/||[cC]refname<.*><.*>//g}}% \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \lowercase{\edef\@tempa{s/||[cC]reflabelformat<.*><.*>//g}}% \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \lowercase{\edef\@tempa{s/||[cC]refrangelabelformat<.*><.*>//g}}% \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \lowercase{\edef\@tempa{s/||[cC]refdefaultlabelformat<.*>//g}}% \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \lowercase{\edef\@tempa{% s/||renewcommand<||crefpairconjunction><.*>//g}}% \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \lowercase{\edef\@tempa{% s/||renewcommand<||crefpairgroupconjunction><.*>//g}}% \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \lowercase{\edef\@tempa{% s/||renewcommand<||crefmiddleconjunction><.*>//g}}% \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \lowercase{\edef\@tempa{% s/||renewcommand<||crefmiddlegroupconjunction><.*>//g}}% \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \lowercase{\edef\@tempa{% s/||renewcommand<||creflastconjunction><.*>//g}}% \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \lowercase{\edef\@tempa{% s/||renewcommand<||creflastgroupconjunction><.*>//g}}% \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \lowercase{\edef\@tempa{s/||renewcommand<||[cC]ref><.*>//g}}% \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \lowercase{\edef\@tempa{s/||renewcommand<||[cC]refrange><.*>//g}}% \expandafter\g@addto@macro\expandafter% \cref@poorman@text\expandafter{\@tempa^^J}% \endgroup% % \end{macrocode} % Overwrite the script file with the new, escaped regexp rules. % \begin{macrocode} \newwrite\@crefscript% \immediate\openout\@crefscript=\jobname.sed% \immediate\write\@crefscript{\cref@poorman@text}% \immediate\closeout\@crefscript% }% end of \AtEndDocument % \end{macrocode} % % % \begin{macro}{\cref@writescript} % The \cmd{\cref@writescript} utility macro does the actual writing of % the substitution rule to the script. The first argument is the % ``address'', the second argument is the regexp pattern to match, % whilst the substitution text is whatever is currently stored in % \cmd{\cref@poorman@text}. % \begin{macrocode} \def\cref@getmeaning#1{\expandafter\@cref@getmeaning\meaning#1\@nil} \def\@cref@getmeaning#1->#2\@nil{#2} \def\cref@writescript#1#2{% \edef\@tempa{\cref@getmeaning{\cref@poorman@text}}% \immediate\write\@crefscript{#1 s/#2/\@tempa/g}} % \end{macrocode} % \end{macro} % % % \begin{macro}{\cref} % \begin{macro}{\Cref} % \begin{macro}{\crefrange} % \begin{macro}{\Crefrange} % \begin{macro}{\@crefstar} % \begin{macro}{\@crefnostar} % \begin{macro}{\@crefrangestar} % \begin{macro}{\@crefrangenostar} % To make use of all the \option{poorman} infrastructure defined above, % we must redefine the \package{cleveref} referencing commands % themselves. There are two parts to this: at the very top layer of the % cross-referencing macro stack, we redefine the user-level commands to % first initialise |\cref@poorman@text| to the empty string, then % typeset the reference as usual, and finally write a substitution % rule to the |sed| script containing whatever has been accumulated in % |\cref@poorman@text|. At the very lowest layer of the macro stack, we % redefine the macros that actually typeset the various parts of the % references to additionally add a copy of whatever they typeset to % |\cref@poorman@test|. % % We first redefine the user-level referencing commands so that they % write a substitution rule for the reference to the script, as well as % typesetting the reference itself. Most of the redefinitions differ % slightly depending on whether \package{hyperref} is loaded. % \begin{macrocode} \if@cref@hyperrefloaded\relax% hyperref loaded \def\@crefnostar#1#2{% \gdef\cref@poorman@text{}% \@cref{#1}{#2}% % \end{macrocode} % We use a temporary \cmd{\@tempa} macro here, which makes use of the % fact that the first character of \#1 is ``c'' for lower-case and ``C'' % for upper-case in these commands, in order to write out the correct % capitalisation in the substitution. % % FIXME: We only resort to this because |\string\#1| doesn't work. But % there \emph{must} be a better way to get a backslash character into the % token stream, obviating the need for the ugly \cmd{\@tempa} macro. % \begin{macrocode} \def\@tempa##1##2\@nil{% \if##1c% \cref@writescript{}{\string\cref\string{#2\string}}% \else% \cref@writescript{}{\string\Cref\string{#2\string}}% \fi}% \@tempa#1\@nil} \def\@crefstar#1#2{% \gdef\cref@poorman@text{}% \@crefstarredtrue\@cref{#1}{#2}\@crefstarredfalse% \def\@tempa##1##2\@nil{% \if##1c% \cref@writescript{}{\string\cref*\string{#2\string}}% \else% \cref@writescript{}{\string\Cref*\string{#2\string}}% \fi}% \@tempa#1\@nil} \def\@crefrangenostar#1#2#3{% \gdef\cref@poorman@text{}% \@setcrefrange{#2}{#3}{#1}{}% \def\@tempa##1##2\@nil{% \if##1c% \cref@writescript{}{% \string\crefrange\string{#2\string}\string{#3\string}}% \else% \cref@writescript{}{% \string\Crefrange\string{#2\string}\string{#3\string}}% \fi}% \@tempa#1\@nil} \def\@crefrangestar#1#2#3{% \gdef\cref@poorman@text{}% \@crefstarredtrue\@setcrefrange{#2}{#3}{#1}{}\@crefstarredfalse% \def\@tempa##1##2\@nil{% \if##1c% \cref@writescript{}{% \string\crefrange*\string{#2\string}\string{#3\string}}% \else% \cref@writescript{}{% \string\Crefrange*\string{#2\string}\string{#3\string}}% \fi}% \@tempa#1\@nil} \def\@cpagerefnostar#1#2{% \gdef\cref@poorman@text{}% \@cpageref{#1}{#2}{\@setcpageref}{\@setcpagerefrange}% \def\@tempa##1##2\@nil{% \if##1c% \cref@writescript{}{\string\cpageref\string{#2\string}}% \else% \cref@writescript{}{\string\Cpageref\string{#2\string}}% \fi}% \@tempa#1\@nil} \def\@cpagerefstar#1#2{% \gdef\cref@poorman@text{}% \@crefstarredtrue% \@cpageref{#1}{#2}{\@setcpageref}{\@setcpagerefrange}% \@crefstarredfalse% \def\@tempa##1##2\@nil{% \if##1c% \cref@writescript{}{\string\cpageref*\string{#2\string}}% \else% \cref@writescript{}{\string\Cpageref*\string{#2\string}}% \fi}% \@tempa#1\@nil} \def\@cpagerefrangenostar#1#2#3{% \gdef\cref@poorman@text{}% \@setcpagerefrange{#2}{#3}{#1}{}% \def\@tempa##1##2\@nil{% \if##1c% \cref@writescript{}{% \string\cpagerefrange\string{#2\string}\string{#3\string}}% \else% \cref@writescript{}{% \string\Cpagerefrange\string{#2\string}\string{#3\string}}% \fi}% \@tempa#1\@nil} \def\@cpagerefrangestar#1#2#3{% \gdef\cref@poorman@text{}% \@crefstarredtrue% \@setcpagerefrange{#2}{#3}{#1}{}% \@crefstarredfalse% \def\@tempa##1##2\@nil{% \if##1c% \cref@writescript{}{% \string\cpagerefrange*\string{#2\string}\string{#3\string}}% \else% \cref@writescript{}{% \string\Cpagerefrange*\string{#2\string}\string{#3\string}}% \fi}% \@tempa#1\@nil} \def\@labelcrefnostar#1{% \gdef\cref@poorman@text{}% \@cref{labelcref}{#1}% \cref@writescript{}{\string\labelcref\string{#1\string}}} \def\@labelcrefstar#1{% \gdef\cref@poorman@text{}% \@crefstarredtrue% \@cref{labelcref}{#1}% \@crefstarredfalse% \cref@writescript{}{\string\labelcref*\string{#1\string}}} \def\@labelcpagerefnostar#1{% \gdef\cref@poorman@text{}% \@cpageref{labelcref}{#1}{\@setcpageref}{\@setcpagerefrange}% \cref@writescript{}{\string\labelcpageref\string{#1\string}}} \def\@labelcpagerefstar#1{% \gdef\cref@poorman@text{}% \@crefstarredtrue% \@cpageref{labelcref}{#1}{\@setcpageref}{\@setcpagerefrange}% \@crefstarredfalse% \cref@writescript{}{\string\labelcpageref*\string{#1\string}}} % \else% hyperref not loaded \DeclareRobustCommand{\cref}[1]{% \gdef\cref@poorman@text{}% \@cref{cref}{#1}% \cref@writescript{}{\string\cref\string{#1\string}}} \DeclareRobustCommand{\Cref}[1]{% \gdef\cref@poorman@text{}% \@cref{Cref}{#1}% \cref@writescript{}{\string\Cref\string{#1\string}}} \DeclareRobustCommand{\crefrange}[2]{% \gdef\cref@poorman@text{}% \@setcrefrange{#1}{#2}{cref}{}% \cref@writescript{}{% \string\crefrange\string{#1\string}\string{#2\string}}} \DeclareRobustCommand{\Crefrange}[2]{% \gdef\cref@poorman@text{}% \@setcrefrange{#1}{#2}{Cref}{}% \cref@writescript{}{% \string\Crefrange\string{#1\string}\string{#2\string}}} \DeclareRobustCommand{\cpageref}[1]{% \gdef\cref@poorman@text{}% \@cpageref{cref}{#1}{\@setcpageref}{\@setcpagerefrange}% \cref@writescript{}{\string\cpageref\string{#1\string}}} \DeclareRobustCommand{\Cpageref}[1]{% \gdef\cref@poorman@text{}% \@cpageref{Cref}{#1}{\@setcpageref}{\@setcpagerefrange}% \cref@writescript{}{\string\Cpageref\string{#1\string}}} \DeclareRobustCommand{\cpagerefrange}[2]{% \gdef\cref@poorman@text{}% \@setcpagerefrange{#1}{#2}{cref}{}% \cref@writescript{}{% \string\cpagerefrange\string{#1\string}\string{#2\string}}} \DeclareRobustCommand{\Cpagerefrange}[2]{% \gdef\cref@poorman@text{}% \@setcpagerefrange{#1}{#2}{Cref}{}% \cref@writescript{}{% \string\Cpagerefrange\string{#1\string}\string{#2\string}}} \DeclareRobustCommand{\labelcref}[1]{% \gdef\cref@poorman@text{}% \@cref{labelcref}{#1}% \cref@writescript{}{\string\labelcref\string{#1\string}}} \DeclareRobustCommand{\labelcpageref}[1]{% \gdef\cref@poorman@text{}% \@cpageref{labelcref}{#1}{\@setcpageref}{\@setcpagerefrange}% \cref@writescript{}{\string\labelcpageref\string{#1\string}}} \fi% end of test for hyperref % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \begin{macro}{\namecref} % \begin{macro}{\nameCref} % \begin{macro}{\lcnamecref} % \begin{macro}{\namecrefs} % \begin{macro}{\nameCrefs} % \begin{macro}{\lcnamecrefs} % The \cmd{\namecref} et al.\ commands don't do anything different when % \package{hyperref} is loaded, so we don't need to test for % \package{hyperref} when redefining them. % \begin{macrocode} \DeclareRobustCommand{\namecref}[1]{% \gdef\cref@poorman@text{}% \@setnamecref{cref}{#1}{}{}% \cref@writescript{}{\string\namecref\string{#1\string}}} \DeclareRobustCommand{\nameCref}[1]{% \gdef\cref@poorman@text{}% \@setnamecref{Cref}{#1}{}{}% \cref@writescript{}{\string\nameCref\string{#1\string}}} \DeclareRobustCommand{\lcnamecref}[1]{% \gdef\cref@poorman@text{}% \@setnamecref{Cref}{#1}{}{\MakeLowercase}% \cref@writescript{}{\string\lcnamecref\string{#1\string}}} \DeclareRobustCommand{\namecrefs}[1]{% \gdef\cref@poorman@text{}% \@setnamecref{cref}{#1}{@plural}{}% \cref@writescript{}{\string\namecrefs\string{#1\string}}} \DeclareRobustCommand{\nameCrefs}[1]{% \gdef\cref@poorman@text{}% \@setnamecref{Cref}{#1}{@plural}{}% \cref@writescript{}{\string\nameCrefs\string{#1\string}}} \DeclareRobustCommand{\lcnamecrefs}[1]{% \gdef\cref@poorman@text{}% \@setnamecref{Cref}{#1}{@plural}{\MakeLowercase}% \cref@writescript{}{\string\lcnamecrefs\string{#1\string}}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % % \begin{macro}{\@setcref@pairgroupconjunction} % \begin{macro}{\@setcref@middlegroupconjunction} % \begin{macro}{\@setcref@lastgroupconjunction} % Redefine \cmd{\@@setcref}, \cmd{\@@setcrefrange}, % \cmd{\@@setcpageref} and\linebreak[4] \cmd{\@@setcpagerefrange}, as % well as the conjunction macros\linebreak[4] % \cmd{\@setcref@middlegroupconjunction}, % \cmd{\@setcref@lastgroupconjunction} and % \cmd{\@setcref@pairgroupconjunction}, to append text they typeset % to\linebreak[4] the \cmd{\cref@poorman@text} macro, as well as % actually doing the typesetting. % \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}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \begin{macro}{\@@setcref} % \begin{macro}{\@@setcrefrange} % \begin{macro}{\@@setcpageref} % \begin{macro}{\@@setcpagerefrange} % The necessary redefinitions of most of the cross-referencing commands % differ slightly depending on whether \package{hyperref} is loaded or % not. % \begin{macrocode} \let\old@@setcref\@@setcref \let\old@@setcrefrange\@@setcrefrange \let\old@@setcpageref\@@setcpageref \let\old@@setcpagerefrange\@@setcpagerefrange \if@cref@hyperrefloaded\relax% hyperref loaded \def\@@setcref#1#2{% \old@@setcref{#1}{#2}% \if@crefstarred% \expandafter\g@addto@macro\expandafter\cref@poorman@text% \expandafter{#1{\ref*{#2}}{}{}}% \else% \expandafter\g@addto@macro\expandafter\cref@poorman@text% \expandafter{#1{\ref{#2}}{}{}}% \fi} \def\@@setcrefrange#1#2#3{% \old@@setcrefrange{#1}{#2}{#3}% \if@crefstarred% \expandafter\g@addto@macro\expandafter\cref@poorman@text% \expandafter{#1{\ref*{#2}}{\ref*{#3}}{}{}{}{}}% \else% \expandafter\g@addto@macro\expandafter\cref@poorman@text% \expandafter{#1{\ref{#2}}{\ref{#3}}{}{}{}{}}% \fi} \def\@@setcpageref#1#2{% \old@@setcpageref{#1}{#2}% \if@crefstarred% \expandafter\g@addto@macro\expandafter\cref@poorman@text% \expandafter{#1{\pageref*{#2}}{}{}}% \else% \expandafter\g@addto@macro\expandafter\cref@poorman@text% \expandafter{#1{\pageref{#2}}{}{}}% \fi} \def\@@setcpagerefrange#1#2#3{% \old@@setcpagerefrange{#1}{#2}{#3}% \if@crefstarred% \expandafter\g@addto@macro\expandafter\cref@poorman@text% \expandafter{#1{\pageref*{#2}}{\pageref*{#3}}{}{}{}{}}% \else% \expandafter\g@addto@macro\expandafter\cref@poorman@text% \expandafter{#1{\pageref{#2}}{\pageref{#3}}{}{}{}{}}% \fi} % \else% hyperref not loaded \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}}{}{}{}{}}} \def\@@setcpageref#1#2{% \old@@setcpageref{#1}{#2}% \expandafter\g@addto@macro\expandafter{% \expandafter\cref@poorman@text\expandafter}% \expandafter{#1{\pageref{#2}}{}{}}} \def\@@setcpagerefrange#1#2#3{% \old@@setcpagerefrange{#1}{#2}{#3}% \expandafter\g@addto@macro% \expandafter{\expandafter\cref@poorman@text\expandafter}% \expandafter{#1{\pageref{#2}}{\pageref{#3}}{}{}{}{}}} \fi% end of hyperref test % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \begin{macro}{\@@setnamecref} % The \cmd{\namecref} et al.\ commands don't do anything different when % \package{hyperref} is loaded, so we don't need to test for % \package{hyperref} when redefining \cmd{\@@setnamecref}. % \begin{macrocode} \let\old@@setnamecref\@@setnamecref \def\@@setnamecref#1#2{% \old@@setnamecref{#1}{#2}% \expandafter\def\expandafter\@tempa\expandafter{#1}% \def\@tempb{#2}% \expandafter\expandafter\expandafter\g@addto@macro% \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter\cref@poorman@text% \expandafter\expandafter\expandafter}% \expandafter\expandafter\expandafter{\expandafter\@tempb\@tempa}} % \end{macrocode} % \end{macro} % % % \begin{macro}{varioref} % If \package{varioref} is loaded, do the same for the % \package{varioref} commands. % \begin{macrocode} \@ifpackageloaded{varioref}{% \AtBeginDocument{% % \end{macrocode} % % \begin{macro}{\@@vpageref} % We redefine \cmd{\@@vpageref} to make it write a substitution rule to % the script, as well as typesetting the page reference. % \begin{macrocode} \def\@@vpageref#1[#2]#3{% \gdef\cref@poorman@text{}% \cref@@vpageref{#1}[#2]{#3}% \cref@writescript{}{\string\vpageref\string{#3\string}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\cref@vref} % \cmd{\cref@vref} is similarly redefined to write a substitution rule. % \begin{macrocode} \let\old@cref@vref\cref@vref \def\cref@vref#1#2{% \gdef\cref@poorman@text{}% \old@cref@vref{#1}{#2}% \def\@tempa##1##2\@nil{% \if##1c% \if@crefstarred% \cref@writescript{}{\string\vref*\string{#2\string}}% \else% \cref@writescript{}{\string\vref\string{#2\string}}% \fi% \else% \if@crefstarred% \cref@writescript{}{\string\Vref*\string{#2\string}}% \else% \cref@writescript{}{\string\Vref\string{#2\string}}% \fi% \fi}% \@tempa#1\@nil} % \end{macrocode} % \end{macro} % % \begin{macro}{\cref@fullref} % \begin{macro}{\cref@vrefrange} % \cmd{\cref@fullref} and \cmd{\cref@vrefrange} are also redefined so % that they write substitution rules. Strictly speaking, the starred % variants of \cmd{\fullref} and \cmd{\vrefrange} are not defined when % \package{hyperref} isn't loaded, so we could avoid checking for them % in that case. However, the redundant check does no harm, and avoids % some code duplication. % \begin{macrocode} \let\old@cref@fullref\cref@fullref \def\cref@fullref#1#2{% \gdef\cref@poorman@text{}% \old@cref@fullref{#1}{#2}% \def\@tempa##1##2\@nil{% \if##1c% \if@crefstarred% \cref@writescript{}{\string\fullref*\string{#2\string}}% \else% \cref@writescript{}{\string\fullref\string{#2\string}}% \fi% \else% \if@crefstarred% \cref@writescript{}{\string\Fullref*\string{#2\string}}% \else% \cref@writescript{}{\string\Fullref\string{#2\string}}% \fi% \fi}% \@tempa#1\@nil} % \let\old@cref@vrefrange\cref@vrefrange \def\cref@vrefrange#1#2#3{% \gdef\cref@poorman@text{}% \old@cref@vrefrange{#1}{#2}{#3}% \def\@tempa##1##2\@nil{% \if##1c% \if@crefstarred% \cref@writescript{}{% \string\vrefrange*\string{#2\string}\string{#3\string}}% \else% \cref@writescript{}{% \string\vrefrange\string{#2\string}\string{#3\string}}% \fi% \else% \if@crefstarred% \cref@writescript{}{% \string\Vrefrange*\string{#2\string}\string{#3\string}}% \else% \cref@writescript{}{% \string\Vrefrange\string{#2\string}\string{#3\string}}% \fi% \fi}% \@tempa#1\@nil} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\@@setvpageref} % \begin{macro}{\@@setvpagerefrange} % In order to get the appropriate substitution for \package{varioref} % commands appended to \cmd{\cref@poorman@text}, we have to redefine % \cmd{\@@setvpageref} and\linebreak[4] \cmd{\@@setvpagerefrange}, % which perform the final typesetting of \package{varioref} page % references, so that they append an appropriate substitution for the % page reference they're typesetting. % \begin{macrocode} \def\@@setvpageref#1[#2]#3{% \cref@old@@vpageref{#1}[#2]{#3}% \g@addto@macro\cref@poorman@text{\vpageref{#3}}} \def\@@setvpagerefrange[#1]#2#3{% \vpagerefrange[#1]{#2}{#3}% \g@addto@macro\cref@poorman@text{\vpagerefrange{#2}{#3}}} \def\@@setfullpageref#1{% \reftextfaraway{#1}% \g@addto@macro\cref@poorman@text{\reftextfaraway{#1}}} \def\@@setfullpagerefrange#1#2{% \reftextpagerange{#1}{#2}% \g@addto@macro\cref@poorman@text{\reftextpagerange{#1}{#2}}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\@setcref@space} % \begin{macro}{\@setcref@pairconjunction} % \begin{macro}{\@setcref@middleconjunction} % \begin{macro}{\@setcref@lastconjunction} % Finally, we make sure the conjunctions also get appended to % the\linebreak[4] \cmd{\cref@poorman@text} substitution. % \begin{macrocode} \def\@setcref@space{ % space here is deliberate \g@addto@macro\cref@poorman@text{ }} \def\@setcref@pairconjunction{% \crefpairconjunction% \expandafter\g@addto@macro\expandafter\cref@poorman@text% \expandafter{\crefpairconjunction}} \def\@setcref@middleconjunction{% \crefmiddleconjunction% \expandafter\g@addto@macro\expandafter\cref@poorman@text% \expandafter{\crefmiddleconjunction}} \def\@setcref@lastconjunction{% \creflastconjunction% \expandafter\g@addto@macro\expandafter\cref@poorman@text% \expandafter{\creflastconjunction}} }% end of \AtBeginDocument }{}% end of \@ifpackageloaded{varioref} }% end of poorman option % \end{macrocode} % \end{macro} % \end{macro} % \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 typesetting 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{Nameinlink Option} % \begin{macro}{nameinlink} % \begin{macro}{\if@cref@nameinlink} % The \option{nameinlink} option causes \package{cleveref} to include % the cross-reference name as part of the hyperlink target when the % \package{hyperref} package is used. % \begin{macrocode} \newif\if@cref@nameinlink % \end{macrocode} % Disabled by default. % \begin{macrocode} \@cref@nameinlinkfalse % \end{macrocode} % Option overrides default. % \begin{macrocode} \DeclareOption{nameinlink}{% \PackageInfo{cleveref}{include cross-reference names in hyperlinks} \@cref@nameinlinktrue} % \end{macrocode} % \end{macro} % \end{macro} % % % % \subsection{Noabbrev Option} % \begin{macro}{noabbrev} % \begin{macro}{\if@cref@abbrev} % The \option{noabbrev} option causes \package{cleveref} to always use % the full cross-reference names, instead of abbreviating some of the % more common names in the middle of sentences. % \begin{macrocode} \newif\if@cref@abbrev % \end{macrocode} % Enabled by default. % \begin{macrocode} \@cref@abbrevtrue % \end{macrocode} % Option overrides default. % \begin{macrocode} \DeclareOption{noabbrev}{% \PackageInfo{cleveref}{no abbreviation of names} \@cref@abbrevfalse} % \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}{\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 % language. 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 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} et 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. % % % \subsubsection{English} % \begin{macro}{english} % English definitions (these are used by default). % \end{macro} % \begin{macrocode} \DeclareOption{english}{% \PackageInfo{cleveref}{loaded `english' language definitions} % \end{macrocode} % First, we set up the definitions used at the beginning of the document % to define the formats created by the document preamble. % \begin{macrocode} \AtBeginDocument{% \def\crefrangeconjunction@preamble{ to\nobreakspace}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ and\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ and\nobreakspace}% % \end{macrocode} % We have to define the group conjunctions explicitly here, rather than % relying on fall-back definitions in terms of the above conjunctions % (see \cref{sec:code:default_formats}), in case any other language % option defines them explicitly and we need to override those. % \begin{macrocode} \def\crefpairgroupconjunction@preamble{ and\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble{, and\nobreakspace}% % \Crefname@preamble{equation}{Equation}{Equations}% \Crefname@preamble{figure}{Figure}{Figures}% \Crefname@preamble{table}{Table}{Tables}% \Crefname@preamble{page}{Page}{Pages}% \Crefname@preamble{part}{Part}{Parts}% \Crefname@preamble{chapter}{Chapter}{Chapters}% \Crefname@preamble{section}{Section}{Sections}% \Crefname@preamble{appendix}{Appendix}{Appendices}% \Crefname@preamble{enumi}{Item}{Items}% \Crefname@preamble{footnote}{Footnote}{Footnotes}% \Crefname@preamble{theorem}{Theorem}{Theorems}% \Crefname@preamble{lemma}{Lemma}{Lemmas}% \Crefname@preamble{corollary}{Corollary}{Corollaries}% \Crefname@preamble{proposition}{Proposition}{Propositions}% \Crefname@preamble{definition}{Definition}{Definitions}% \Crefname@preamble{result}{Result}{Results}% \Crefname@preamble{example}{Example}{Examples}% \Crefname@preamble{remark}{Remark}{Remarks}% \Crefname@preamble{note}{Note}{Notes}% \Crefname@preamble{algorithm}{Algorithm}{Algorithms}% \Crefname@preamble{listing}{Listing}{Listings}% \Crefname@preamble{line}{Line}{Lines}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% \crefname@preamble{equation}{Eq.}{Eqs.}% \crefname@preamble{figure}{Fig.}{Figs.}% \else% \crefname@preamble{equation}{Equation}{Equations}% \crefname@preamble{figure}{Figure}{Figures}% \fi% \crefname@preamble{page}{Page}{Pages}% \crefname@preamble{table}{Table}{Tables}% \crefname@preamble{part}{Part}{Parts}% \crefname@preamble{chapter}{Chapter}{Chapters}% \crefname@preamble{section}{Section}{Sections}% \crefname@preamble{appendix}{Appendix}{Appendices}% \crefname@preamble{enumi}{Item}{Items}% \crefname@preamble{footnote}{Footnote}{Footnotes}% \crefname@preamble{theorem}{Theorem}{Theorems}% \crefname@preamble{lemma}{Lemma}{Lemmas}% \crefname@preamble{corollary}{Corollary}{Corollaries}% \crefname@preamble{proposition}{Proposition}{Propositions}% \crefname@preamble{definition}{Definition}{Definitions}% \crefname@preamble{result}{Result}{Results}% \crefname@preamble{example}{Example}{Examples}% \crefname@preamble{remark}{Remark}{Remarks}% \crefname@preamble{note}{Note}{Notes}% \crefname@preamble{algorithm}{Algorithm}{Algorithms}% \crefname@preamble{listing}{Listing}{Listings}% \crefname@preamble{line}{Line}{Lines}% % \else% capitalise unset \if@cref@abbrev% \crefname@preamble{equation}{eq.}{eqs.}% \crefname@preamble{figure}{fig.}{figs.}% \else% \crefname@preamble{equation}{equation}{equations}% \crefname@preamble{figure}{figure}{figures}% \fi% \crefname@preamble{page}{page}{pages}% \crefname@preamble{table}{table}{tables}% \crefname@preamble{part}{part}{parts}% \crefname@preamble{chapter}{chapter}{chapters}% \crefname@preamble{section}{section}{sections}% \crefname@preamble{appendix}{appendix}{appendices}% \crefname@preamble{enumi}{item}{items}% \crefname@preamble{footnote}{footnote}{footnotes}% \crefname@preamble{theorem}{theorem}{theorems}% \crefname@preamble{lemma}{lemma}{lemmas}% \crefname@preamble{corollary}{corollary}{corollaries}% \crefname@preamble{proposition}{proposition}{propositions}% \crefname@preamble{definition}{definition}{definitions}% \crefname@preamble{result}{result}{results}% \crefname@preamble{example}{example}{examples}% \crefname@preamble{remark}{remark}{remarks}% \crefname@preamble{note}{note}{notes}% \crefname@preamble{algorithm}{algorithm}{algorithms}% \crefname@preamble{listing}{listing}{listings}% \crefname@preamble{line}{line}{lines}% \fi% \def\cref@language{english}% % \end{macrocode} % % Next, we add the definitions to \cmd{\extras}\dots{} so that % \package{babel}'s \cmd{\selectlanguage} command will change the format % appropriately. % \begin{macrocode} \cref@addto\extrasenglish{% \renewcommand{\crefrangeconjunction}{ to\nobreakspace}% \renewcommand\crefrangepreconjunction{}% \renewcommand\crefrangepostconjunction{}% \renewcommand{\crefpairconjunction}{ and\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ and\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ and\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}{, and\nobreakspace}% % \Crefname{equation}{Equation}{Equations}% \Crefname{figure}{Figure}{Figures}% \Crefname{subfigure}{Figure}{Figures}% \Crefname{table}{Table}{Tables}% \Crefname{subtable}{Table}{Tables}% \Crefname{page}{Page}{Pages}% \Crefname{part}{Part}{Parts}% \Crefname{chapter}{Chapter}{Chapters}% \Crefname{section}{Section}{Sections}% \Crefname{subsection}{Section}{Sections}% \Crefname{subsubsection}{Section}{Sections}% \Crefname{appendix}{Appendix}{Appendices}% \Crefname{subappendix}{Appendix}{Appendices}% \Crefname{subsubappendix}{Appendix}{Appendices}% \Crefname{subsubsubappendix}{Appendix}{Appendices}% \Crefname{enumi}{Item}{Items}% \Crefname{enumii}{Item}{Items}% \Crefname{enumiii}{Item}{Items}% \Crefname{enumiv}{Item}{Items}% \Crefname{enumv}{Item}{Items}% \Crefname{footnote}{Footnote}{Footnotes}% \Crefname{theorem}{Theorem}{Theorems}% \Crefname{lemma}{Lemma}{Lemmas}% \Crefname{corollary}{Corollary}{Corollaries}% \Crefname{proposition}{Proposition}{Propositions}% \Crefname{definition}{Definition}{Definitions}% \Crefname{result}{Result}{Results}% \Crefname{example}{Example}{Examples}% \Crefname{remark}{Remark}{Remarks}% \Crefname{note}{Note}{Notes}% \Crefname{algorithm}{Algorithm}{Algorithms}% \Crefname{listing}{Listing}{Listings}% \Crefname{line}{Line}{Lines}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% \crefname{equation}{Eq.}{Eqs.}% \crefname{figure}{Fig.}{Figs.}% \crefname{subfigure}{Fig.}{Figs.}% \else% \crefname{equation}{Equation}{Equations}% \crefname{figure}{Figure}{Figures}% \crefname{subfigure}{Figure}{Figures}% \fi% \crefname{page}{Page}{Pages}% \crefname{table}{Table}{Tables}% \crefname{subtable}{Table}{Tables}% \crefname{part}{Part}{Parts}% \crefname{chapter}{Chapter}{Chapters}% \crefname{section}{Section}{Sections}% \crefname{subsection}{Section}{Sections}% \crefname{subsubsection}{Section}{Sections}% \crefname{appendix}{Appendix}{Appendices}% \crefname{subappendix}{Appendix}{Appendices}% \crefname{subsubappendix}{Appendix}{Appendices}% \crefname{subsubsubappendix}{Appendix}{Appendices}% \crefname{enumi}{Item}{Items}% \crefname{enumii}{Item}{Items}% \crefname{enumiii}{Item}{Items}% \crefname{enumiv}{Item}{Items}% \crefname{enumv}{Item}{Items}% \crefname{footnote}{Footnote}{Footnotes}% \crefname{theorem}{Theorem}{Theorems}% \crefname{lemma}{Lemma}{Lemmas}% \crefname{corollary}{Corollary}{Corollaries}% \crefname{proposition}{Proposition}{Propositions}% \crefname{definition}{Definition}{Definitions}% \crefname{result}{Result}{Results}% \crefname{example}{Example}{Examples}% \crefname{remark}{Remark}{Remarks}% \crefname{note}{Note}{Notes}% \crefname{algorithm}{Algorithm}{Algorithms}% \crefname{listing}{Listing}{Listings}% \crefname{line}{Line}{Lines}% % \else% capitalise unset \if@cref@abbrev% \crefname{equation}{eq.}{eqs.}% \crefname{figure}{fig.}{figs.}% \crefname{subfigure}{fig.}{figs.}% \else% \crefname{equation}{equation}{equations}% \crefname{figure}{figure}{figures}% \crefname{subfigure}{figure}{figures}% \fi% \crefname{table}{table}{tables}% \crefname{subtable}{table}{tables}% \crefname{page}{page}{pages}% \crefname{part}{part}{parts}% \crefname{chapter}{chapter}{chapters}% \crefname{section}{section}{sections}% \crefname{subsection}{section}{sections}% \crefname{subsubsection}{section}{sections}% \crefname{appendix}{appendix}{appendices}% \crefname{subappendix}{appendix}{appendices}% \crefname{subsubappendix}{appendix}{appendices}% \crefname{subsubsubappendix}{appendix}{appendices}% \crefname{enumi}{item}{items}% \crefname{enumii}{item}{items}% \crefname{enumiii}{item}{items}% \crefname{enumiv}{item}{items}% \crefname{enumv}{item}{items}% \crefname{footnote}{footnote}{footnotes}% \crefname{theorem}{theorem}{theorems}% \crefname{lemma}{lemma}{lemmas}% \crefname{corollary}{corollary}{corollaries}% \crefname{proposition}{proposition}{propositions}% \crefname{definition}{definition}{definitions}% \crefname{result}{result}{results}% \crefname{example}{example}{examples}% \crefname{remark}{remark}{remarks}% \crefname{note}{note}{notes}% \crefname{algorithm}{algorithm}{algorithms}% \crefname{listing}{listing}{listings}% \crefname{line}{line}{lines}% \fi% }}} % \end{macrocode} % % % \subsubsection{German} % \begin{macro}{german} % German translations kindly provided by Stefan Pinnow, with a few % additions by the package author (so you know to blame the latter for % any errors!). % \end{macro} % \begin{macrocode} \DeclareOption{german}{% \PackageInfo{cleveref}{loaded `german' language definitions} % \end{macrocode} % First, we set up the definitions used at the beginning of the document % to define the formats created by the document preamble. % \begin{macrocode} \AtBeginDocument{% \def\crefrangeconjunction@preamble{ bis\nobreakspace}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ und\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ und\nobreakspace}% % \end{macrocode} % We don't want the extra comma before ``und'' that would be added by the % default fall-back definitions in terms of the above conjunctions, so we % define \cmd{\crefpairgroupconjunction} explicitly. In fact, we have to % define the other group conjunctions explicitly too here, in case any % other language option defines them explicitly and we need to override % them. % \begin{macrocode} \def\crefpairgroupconjunction@preamble{ und\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble{ und\nobreakspace}% % \Crefname@preamble{equation}{Gleichung}{Gleichungen}% \Crefname@preamble{figure}{Abbildung}{Abbildungen}% \Crefname@preamble{table}{Tabelle}{Tabellen}% \Crefname@preamble{page}{Seite}{Seiten}% \Crefname@preamble{part}{Teil}{Teile}% \Crefname@preamble{chapter}{Kapitel}{Kapitel}% \Crefname@preamble{section}{Abschnitt}{Abschnitte}% \Crefname@preamble{appendix}{Anhang}{Anh\"ange}% \Crefname@preamble{enumi}{Punkt}{Punkte}% \Crefname@preamble{footnote}{Fu\ss note}{Fu\ss noten}% \Crefname@preamble{theorem}{Theorem}{Theoreme}% \Crefname@preamble{lemma}{Lemma}{Lemmata}% \Crefname@preamble{corollary}{Korollar}{Korollare}% \Crefname@preamble{proposition}{Satz}{S\"atze}% \Crefname@preamble{definition}{Definition}{Definitionen}% \Crefname@preamble{result}{Ergebnis}{Ergebnisse}% \Crefname@preamble{example}{Beispiel}{Beispiele}% \Crefname@preamble{remark}{Bemerkung}{Bemerkungen}% \Crefname@preamble{note}{Anmerkung}{Anmerkungen}% \Crefname@preamble{algorithm}{Algorithmus}{Algorithmen}% \Crefname@preamble{listing}{Listing}{Listings}% \Crefname@preamble{line}{Zeile}{Zeilen}% % \crefname@preamble{equation}{Gleichung}{Gleichungen}% \crefname@preamble{figure}{Abbildung}{Abbildungen}% \crefname@preamble{table}{Tabelle}{Tabellen}% \crefname@preamble{page}{Seite}{Seiten}% \crefname@preamble{part}{Teil}{Teile}% \crefname@preamble{chapter}{Kapitel}{Kapitel}% \crefname@preamble{section}{Abschnitt}{Abschnitte}% \crefname@preamble{appendix}{Anhang}{Anh\"ange}% \crefname@preamble{enumi}{Punkt}{Punkte}% \crefname@preamble{footnote}{Fu\ss note}{Fu\ss noten}% \crefname@preamble{theorem}{Theorem}{Theoreme}% \crefname@preamble{lemma}{Lemma}{Lemmata}% \crefname@preamble{corollary}{Korollar}{Korollare}% \crefname@preamble{proposition}{Satz}{S\"atze}% \crefname@preamble{definition}{Definition}{Definitionen}% \crefname@preamble{result}{Ergebnis}{Ergebnisse}% \crefname@preamble{example}{Beispiel}{Beispiele}% \crefname@preamble{remark}{Bemerkung}{Bemerkungen}% \crefname@preamble{note}{Anmerkung}{Anmerkungen}% \crefname@preamble{algorithm}{Algorithmus}{Algorithmen}% \crefname@preamble{listing}{Listing}{Listings}% \crefname@preamble{line}{Zeile}{Zeilen}% \def\cref@language{german}% % \end{macrocode} % % Next, we add the definitions to \cmd{\extras}\dots{} so that % \package{babel}'s \cmd{\selectlanguage} command will change the format % appropriately. % \begin{macrocode} \cref@addto\extrasgerman{% \renewcommand{\crefrangeconjunction}{ bis\nobreakspace}% \renewcommand\crefrangepreconjunction{}% \renewcommand\crefrangepostconjunction{}% \renewcommand{\crefpairconjunction}{ und\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ und\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ und\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}{ und\nobreakspace}% % \Crefname{equation}{Gleichung}{Gleichungen}% \Crefname{figure}{Abbildung}{Abbildungen}% \Crefname{subfigure}{Abbildung}{Abbildungen}% \Crefname{table}{Tabelle}{Tabellen}% \Crefname{subtable}{Tabelle}{Tabellen}% \Crefname{page}{Seite}{Seiten}% \Crefname{part}{Teil}{Teile}% \Crefname{chapter}{Kapitel}{Kapitel}% \Crefname{section}{Abschnitt}{Abschnitte}% \Crefname{subsection}{Abschnitt}{Abschnitte}% \Crefname{subsubsection}{Abschnitt}{Abschnitte}% \Crefname{appendix}{Anhang}{Anh\"ange}% \Crefname{subappendix}{Anhang}{Anh\"ange}% \Crefname{subsubappendix}{Anhang}{Anh\"ange}% \Crefname{subsubsubappendix}{Anhang}{Anh\"ange}% \Crefname{enumi}{Punkt}{Punkte}% \Crefname{enumii}{Punkt}{Punkte}% \Crefname{enumiii}{Punkt}{Punkte}% \Crefname{enumiv}{Punkt}{Punkte}% \Crefname{enumv}{Punkt}{Punkte}% \Crefname{footnote}{Fu\ss note}{Fu\ss noten}% \Crefname{theorem}{Theorem}{Theoreme}% \Crefname{lemma}{Lemma}{Lemmata}% \Crefname{corollary}{Korollar}{Korollare}% \Crefname{proposition}{Satz}{S\"atze}% \Crefname{definition}{Definition}{Definitionen}% \Crefname{result}{Ergebnis}{Ergebnisse}% \Crefname{example}{Beispiel}{Beispiele}% \Crefname{remark}{Bemerkung}{Bemerkungen}% \Crefname{note}{Anmerkung}{Anmerkungen}% \Crefname{algorithm}{Algorithmus}{Algorithmen}% \Crefname{listing}{Listing}{Listings}% \Crefname{line}{Zeile}{Zeilen}% % \crefname{equation}{Gleichung}{Gleichungen}% \crefname{figure}{Abbildung}{Abbildungen}% \crefname{subfigure}{Abbildung}{Abbildungen}% \crefname{table}{Tabelle}{Tabellen}% \crefname{subtable}{Tabelle}{Tabellen}% \crefname{page}{Seite}{Seiten}% \crefname{part}{Teil}{Teile}% \crefname{chapter}{Kapitel}{Kapitel}% \crefname{section}{Abschnitt}{Abschnitte}% \crefname{subsection}{Abschnitt}{Abschnitte}% \crefname{subsubsection}{Abschnitt}{Abschnitte}% \crefname{appendix}{Anhang}{Anh\"ange}% \crefname{subappendix}{Anhang}{Anh\"ange}% \crefname{subsubappendix}{Anhang}{Anh\"ange}% \crefname{subsubsubappendix}{Anhang}{Anh\"ange}% \crefname{enumi}{Punkt}{Punkte}% \crefname{enumii}{Punkt}{Punkte}% \crefname{enumiii}{Punkt}{Punkte}% \crefname{enumiv}{Punkt}{Punkte}% \crefname{enumv}{Punkt}{Punkte}% \crefname{footnote}{Fu\ss note}{Fu\ss noten}% \crefname{theorem}{Theorem}{Theoreme}% \crefname{lemma}{Lemma}{Lemmata}% \crefname{corollary}{Korollar}{Korollare}% \crefname{proposition}{Satz}{S\"atze}% \crefname{definition}{Definition}{Definitionen}% \crefname{result}{Ergebnis}{Ergebnisse}% \crefname{example}{Beispiel}{Beispiele}% \crefname{remark}{Bemerkung}{Bemerkungen}% \crefname{note}{Anmerkung}{Anmerkungen}% \crefname{algorithm}{Algorithmus}{Algorithmen}% \crefname{listing}{Listing}{Listings}% \crefname{line}{Zeile}{Zeilen}% }}} % \end{macrocode} % % % \begin{macro}{ngerman} % It so happens that none of the cross-reference names differ in the % ``Neuerechtschreibung'', so we make \option{ngerman} execute % \option{german}. However, we still need to add the definitions to % \cmd{\extrasngerman} (note the ``n'') so that \cmd{\selectlanguage} % etc.\ will work. % \end{macro} % \begin{macrocode} \DeclareOption{ngerman}{% \PackageInfo{cleveref}{loaded `ngerman' language definitions} \ExecuteOptions{german} \def\cref@language{ngerman} \AtBeginDocument{% \cref@addto\extrasngerman{% \renewcommand{\crefrangeconjunction}{ bis\nobreakspace}% \renewcommand\crefrangepreconjunction{}% \renewcommand\crefrangepostconjunction{}% \renewcommand{\crefpairconjunction}{ und\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ und\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ und\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}{ und\nobreakspace}% % \Crefname{equation}{Gleichung}{Gleichungen}% \Crefname{figure}{Abbildung}{Abbildungen}% \Crefname{subfigure}{Abbildung}{Abbildungen}% \Crefname{table}{Tabelle}{Tabellen}% \Crefname{subtable}{Tabelle}{Tabellen}% \Crefname{page}{Seite}{Seiten}% \Crefname{part}{Teil}{Teile}% \Crefname{chapter}{Kapitel}{Kapitel}% \Crefname{section}{Abschnitt}{Abschnitte}% \Crefname{subsection}{Abschnitt}{Abschnitte}% \Crefname{subsubsection}{Abschnitt}{Abschnitte}% \Crefname{appendix}{Anhang}{Anh\"ange}% \Crefname{subappendix}{Anhang}{Anh\"ange}% \Crefname{subsubappendix}{Anhang}{Anh\"ange}% \Crefname{subsubsubappendix}{Anhang}{Anh\"ange}% \Crefname{enumi}{Punkt}{Punkte}% \Crefname{enumii}{Punkt}{Punkte}% \Crefname{enumiii}{Punkt}{Punkte}% \Crefname{enumiv}{Punkt}{Punkte}% \Crefname{enumv}{Punkt}{Punkte}% \Crefname{footnote}{Fu\ss note}{Fu\ss noten}% \Crefname{theorem}{Theorem}{Theoreme}% \Crefname{lemma}{Lemma}{Lemmata}% \Crefname{corollary}{Korollar}{Korollare}% \Crefname{proposition}{Satz}{S\"atze}% \Crefname{definition}{Definition}{Definitionen}% \Crefname{result}{Ergebnis}{Ergebnisse}% \Crefname{example}{Beispiel}{Beispiele}% \Crefname{remark}{Bemerkung}{Bemerkungen}% \Crefname{note}{Anmerkung}{Anmerkungen}% \Crefname{algorithm}{Algorithmus}{Algorithmen}% \Crefname{listing}{Listing}{Listings}% \Crefname{line}{Zeile}{Zeilen}% % \crefname{equation}{Gleichung}{Gleichungen}% \crefname{figure}{Abbildung}{Abbildungen}% \crefname{subfigure}{Abbildung}{Abbildungen}% \crefname{table}{Tabelle}{Tabellen}% \crefname{subtable}{Tabelle}{Tabellen}% \crefname{page}{Seite}{Seiten}% \crefname{part}{Teil}{Teile}% \crefname{chapter}{Kapitel}{Kapitel}% \crefname{section}{Abschnitt}{Abschnitte}% \crefname{subsection}{Abschnitt}{Abschnitte}% \crefname{subsubsection}{Abschnitt}{Abschnitte}% \crefname{appendix}{Anhang}{Anh\"ange}% \crefname{subappendix}{Anhang}{Anh\"ange}% \crefname{subsubappendix}{Anhang}{Anh\"ange}% \crefname{subsubsubappendix}{Anhang}{Anh\"ange}% \crefname{enumi}{Punkt}{Punkte}% \crefname{enumii}{Punkt}{Punkte}% \crefname{enumiii}{Punkt}{Punkte}% \crefname{enumiv}{Punkt}{Punkte}% \crefname{enumv}{Punkt}{Punkte}% \crefname{footnote}{Fu\ss note}{Fu\ss noten}% \crefname{theorem}{Theorem}{Theoreme}% \crefname{lemma}{Lemma}{Lemmata}% \crefname{corollary}{Korollar}{Korollare}% \crefname{proposition}{Satz}{S\"atze}% \crefname{definition}{Definition}{Definitionen}% \crefname{result}{Ergebnis}{Ergebnisse}% \crefname{example}{Beispiel}{Beispiele}% \crefname{remark}{Bemerkung}{Bemerkungen}% \crefname{note}{Anmerkung}{Anmerkungen}% \crefname{algorithm}{Algorithmus}{Algorithmen}% \crefname{listing}{Listing}{Listings}% \crefname{line}{Zeile}{Zeilen}% }}} % \end{macrocode} % % % \subsubsection{Dutch} % \begin{macro}{dutch} % Dutch translations kindly contributed by Philip H\"olzenspies. % \end{macro} % \begin{macrocode} \DeclareOption{dutch}{% \PackageInfo{cleveref}{loaded `dutch' language definitions} % \end{macrocode} % First, we set up the definitions used at the beginning of the document % to define the formats created by the document preamble. % \begin{macrocode} \AtBeginDocument{% \def\crefrangeconjunction@preamble{ tot\nobreakspace}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ en\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ en\nobreakspace}% % \end{macrocode} % As in German, we don't want the extra comma before ``en'' that would be % added by the default fall-back definitions in terms of the above % conjunctions, so we define \cmd{\crefpairgroupconjunction} explicitly. % In fact, we have to define the other group conjunctions explicitly too % here, in case any other language option defines them explicitly and we % need to override them. % \begin{macrocode} \def\crefpairgroupconjunction@preamble{ en\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble{ en\nobreakspace}% % \Crefname@preamble{equation}{Vergel\ij{}king}{Vergel\ij{}kingen}% \Crefname@preamble{figure}{Figuur}{Figuren}% \Crefname@preamble{table}{Tabel}{Tabellen}% \Crefname@preamble{page}{Pagina}{Pagina's}% \Crefname@preamble{part}{Deel}{Delen}% \Crefname@preamble{chapter}{Hoofdstuk}{Hoofdstuken}% \Crefname@preamble{section}{Paragraaf}{Paragrafen}% \Crefname@preamble{appendix}{Appendix}{Appendices}% \Crefname@preamble{enumi}{Punt}{Punten}% \Crefname@preamble{footnote}{Voetnote}{Voetnoten}% \Crefname@preamble{lemma}{Lemma}{Lemma's}% \Crefname@preamble{corollary}{Corollarium}{Corollaria}% \Crefname@preamble{proposition}{Bewering}{Beweringen}% \Crefname@preamble{definition}{Definitie}{Definities}% \Crefname@preamble{result}{Resultaat}{Resultaten}% \Crefname@preamble{example}{Voorbeeld}{Voorbeelden}% \Crefname@preamble{remark}{Opmerking}{Opmerkingen}% \Crefname@preamble{note}{Aantekening}{Aantekeningen}% \Crefname@preamble{algorithm}{Algoritme}{Algoritmen}% \Crefname@preamble{listing}{Listing}{Listings}% \Crefname@preamble{line}{Lijn}{Lijnen}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% \crefname@preamble{equation}{Verg.}{Verg's.}% \crefname@preamble{figure}{Fig.}{Fig's.}% \else% \crefname@preamble{equation}{Vergel\ij{}king}{Vergel\ij{}kingen}% \crefname@preamble{figure}{Figuur}{Figuren}% \fi% \crefname@preamble{page}{Pagina}{Pagina's}% \crefname@preamble{table}{Tabel}{Tabellen}% \crefname@preamble{part}{Deel}{Delen}% \crefname@preamble{chapter}{Hoofdstuk}{Hoofdstukken}% \crefname@preamble{section}{Paragraaf}{Paragrafen}% \crefname@preamble{appendix}{Appendix}{Appendices}% \crefname@preamble{enumi}{Punt}{Punten}% \crefname@preamble{footnote}{Voetnote}{Voetnoten}% \crefname@preamble{theorem}{Theorema}{Theorema's}% \crefname@preamble{lemma}{Lemma}{Lemma's}% \crefname@preamble{corollary}{Corollarium}{Corollaria}% \crefname@preamble{proposition}{Bewering}{Beweringen}% \crefname@preamble{definition}{Definitie}{Definities}% \crefname@preamble{result}{Resultaat}{Resultaten}% \crefname@preamble{example}{Voorbeeld}{Voorbeelden}% \crefname@preamble{remark}{Opmerking}{Opmerkingen}% \crefname@preamble{note}{Aantekening}{Aantekeningen}% \crefname@preamble{algorithm}{Algoritme}{Algoritmen}% \crefname@preamble{listing}{Listing}{Listings}% \crefname@preamble{line}{Lijn}{Lijnen}% % \else% capitalise unset \if@cref@abbrev% \crefname@preamble{equation}{verg.}{verg's.}% \crefname@preamble{figure}{fig.}{fig's.}% \else% \crefname@preamble{equation}{vergel\ij{}king}{vergel\ij{}kingen}% \crefname@preamble{figure}{figuur}{figuren}% \fi% \crefname@preamble{page}{pagina}{pagina's}% \crefname@preamble{table}{tabel}{tabellen}% \crefname@preamble{part}{deel}{delen}% \crefname@preamble{chapter}{hoofdstuk}{hoofdstukken}% \crefname@preamble{section}{paragraaf}{paragrafen}% \crefname@preamble{appendix}{appendix}{appendices}% \crefname@preamble{enumi}{punt}{punten}% \crefname@preamble{footnote}{voetnote}{voetnoten}% \crefname@preamble{theorem}{theorema}{theorema's}% \crefname@preamble{lemma}{lemma}{lemma's}% \crefname@preamble{corollary}{corollarium}{corollaria}% \crefname@preamble{proposition}{bewering}{beweringen}% \crefname@preamble{definition}{definitie}{definities}% \crefname@preamble{result}{resultaat}{resultaten}% \crefname@preamble{example}{voorbeeld}{voorbeelden}% \crefname@preamble{remark}{opmerking}{opmerkingen}% \crefname@preamble{note}{aantekening}{aantekeningen}% \crefname@preamble{algorithm}{algoritme}{algoritmen}% \crefname@preamble{listing}{listing}{listings}% \crefname@preamble{line}{lijn}{lijnen}% \fi% \def\cref@language{dutch}% % \end{macrocode} % % Next, we add the definitions to \cmd{\extras}\dots{} so that % \package{babel}'s \cmd{\selectlanguage} command will change the format % appropriately. % \begin{macrocode} \cref@addto\extrasdutch{% \renewcommand{\crefrangeconjunction}{ tot\nobreakspace}% \renewcommand\crefrangepreconjunction{}% \renewcommand\crefrangepostconjunction{}% \renewcommand{\crefpairconjunction}{ en\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ en\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ en\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}{ en\nobreakspace}% % \Crefname{equation}{Vergel\ij{}king}{Vergel\ij{}kingen}% \Crefname{figure}{Figuur}{Figuren}% \Crefname{subfigure}{Figuur}{Figuren}% \Crefname{table}{Tabel}{Tabellen}% \Crefname{subtable}{Tabel}{Tabellen}% \Crefname{page}{Pagina}{Pagina's}% \Crefname{part}{Deel}{Delen}% \Crefname{chapter}{Hoofdstuk}{Hoofdstuken}% \Crefname{section}{Paragraaf}{Paragrafen}% \Crefname{subsection}{Paragraaf}{Paragrafen}% \Crefname{subsubsection}{Paragraaf}{Paragrafen}% \Crefname{appendix}{Appendix}{Appendices}% \Crefname{subappendix}{Appendix}{Appendices}% \Crefname{subsubappendix}{Appendix}{Appendices}% \Crefname{subsubsubappendix}{Appendix}{Appendices}% \Crefname{enumi}{Punt}{Punten}% \Crefname{enumii}{Punt}{Punten}% \Crefname{enumiii}{Punt}{Punten}% \Crefname{enumiv}{Punt}{Punten}% \Crefname{enumv}{Punt}{Punten}% \Crefname{footnote}{Voetnote}{Voetnoten}% \Crefname{theorem}{Theorema}{Theorema's}% \Crefname{lemma}{Lemma}{Lemma's}% \Crefname{corollary}{Corollarium}{Corollaria}% \Crefname{proposition}{Bewering}{Beweringen}% \Crefname{definition}{Definitie}{Definities}% \Crefname{result}{Resultaat}{Resultaten}% \Crefname{example}{Voorbeeld}{Voorbeelden}% \Crefname{remark}{Opmerking}{Opmerkingen}% \Crefname{note}{Aantekening}{Aantekeningen}% \Crefname{algorithm}{Algoritme}{Algoritmen}% \Crefname{listing}{Listing}{Listings}% \Crefname{line}{Lijn}{Lijnen}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% \crefname{equation}{Verg.}{Verg's.}% \crefname{figure}{Fig.}{Fig's.}% \crefname{subfigure}{Fig.}{Fig's.}% \else% \crefname{equation}{Vergel\ij{}king}{Vergel\ij{}kingen}% \crefname{figure}{Figuur}{Figuren}% \crefname{subfigure}{Figuur}{Figuren}% \fi% \crefname{table}{Tabel}{Tabellen}% \crefname{subtable}{Tabel}{Tabellen}% \crefname{page}{Pagina}{Pagina's}% \crefname{part}{Deel}{Delen}% \crefname{chapter}{Hoofdstuk}{Hoofdstukken}% \crefname{section}{Paragraaf}{Paragrafen}% \crefname{appendix}{Appendix}{Appendices}% \crefname{enumi}{Punt}{Punten}% \crefname{footnote}{Voetnote}{Voetnoten}% \crefname{theorem}{Theorema}{Theorema's}% \crefname{lemma}{Lemma}{Lemma's}% \crefname{corollary}{Corollarium}{Corollaria}% \crefname{proposition}{Bewering}{Beweringen}% \crefname{definition}{Definitie}{Definities}% \crefname{result}{Resultaat}{Resultaten}% \crefname{example}{Voorbeeld}{Voorbeelden}% \crefname{remark}{Opmerking}{Opmerkingen}% \crefname{note}{Aantekening}{Aantekeningen}% \crefname{algorithm}{Algoritme}{Algoritmen}% \crefname{listing}{Listing}{Listings}% \crefname{line}{Lijn}{Lijnen}% % \else% capitalise unset \if@cref@abbrev% \crefname{equation}{verg.}{verg's.}% \crefname{figure}{fig.}{fig's.}% \crefname{subfigure}{fig.}{fig's.}% \else% \crefname{equation}{vergel\ij{}king}{vergel\ij{}kingen}% \crefname{figure}{figuur}{figuren}% \crefname{subfigure}{figuur}{figuren}% \fi% \crefname{table}{tabel}{tabellen}% \crefname{subtable}{tabel}{tabellen}% \crefname{page}{pagina}{pagina's}% \crefname{part}{deel}{delen}% \crefname{chapter}{hoofdstuk}{hoofdstukken}% \crefname{section}{paragraaf}{paragrafen}% \crefname{appendix}{appendix}{appendices}% \crefname{enumi}{punt}{punten}% \crefname{footnote}{voetnote}{voetnoten}% \crefname{theorem}{theorema}{theorema's}% \crefname{lemma}{lemma}{lemma's}% \crefname{corollary}{corollarium}{corollaria}% \crefname{proposition}{bewering}{beweringen}% \crefname{definition}{definitie}{definities}% \crefname{result}{resultaat}{resultaten}% \crefname{example}{voorbeeld}{voorbeelden}% \crefname{remark}{opmerking}{opmerkingen}% \crefname{note}{aantekening}{aantekeningen}% \crefname{algorithm}{algoritme}{algoritmen}% \crefname{listing}{listing}{listings}% \crefname{line}{lijn}{lijnen}% \fi% }}} % \end{macrocode} % % % \subsubsection{French} % \begin{macro}{french} % French translations attempted by the package author (please report % any corrections that might be needed!). % \end{macro} % \begin{macrocode} \DeclareOption{french}{% \PackageInfo{cleveref}{loaded `french' language definitions} % \end{macrocode} % First, we set up the definitions used at the beginning of the document to % define the formats created by the document preamble. % \begin{macrocode} \AtBeginDocument{% \def\crefrangeconjunction@preamble{ \`a\nobreakspace}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ et\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ et\nobreakspace}% % \end{macrocode} % Erring on the side of caution, I've left off the extra comma before % ``et'' between groups, pending more knowledgeable input on punctuation % rules from a native French speaker. % \begin{macrocode} \def\crefpairgroupconjunction@preamble{ et\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble{, et\nobreakspace}% % \Crefname@preamble{equation}{{\'E}quation}{{\'E}quations}% \Crefname@preamble{figure}{Figure}{Figures}% \Crefname@preamble{table}{Tableau}{Tableaux}% \Crefname@preamble{page}{Page}{Pages}% \Crefname@preamble{part}{Partie}{Parties}% \Crefname@preamble{chapter}{Chapitre}{Chapitres}% \Crefname@preamble{section}{Section}{Sections}% \Crefname@preamble{appendix}{Annexe}{Annexes}% \Crefname@preamble{enumi}{Point}{Points}% \Crefname@preamble{footnote}{Note}{Notes}% \Crefname@preamble{theorem}{Th\'eor\`eme}{Th\'eor\`emes}% \Crefname@preamble{lemma}{Lemme}{Lemmes}% \Crefname@preamble{corollary}{Corollaire}{Corollaires}% \Crefname@preamble{proposition}{Proposition}{Propositions}% \Crefname@preamble{definition}{D\'efinition}{D\'efinitions}% \Crefname@preamble{result}{R\'esultat}{R\'esultats}% \Crefname@preamble{example}{Exemple}{Exemples}% \Crefname@preamble{remark}{Remarque}{Remarques}% \Crefname@preamble{algorithm}{Algorithme}{Algorithmes}% \Crefname@preamble{listing}{Liste}{Listes}% \Crefname@preamble{line}{Ligne}{Lignes}% % \if@cref@capitalise% capitalise set \crefname@preamble{equation}{{\'E}quation}{{\'E}quations}% \crefname@preamble{figure}{Figure}{Figures}% \crefname@preamble{table}{Tableau}{Tableaux}% \crefname@preamble{page}{Page}{Pages}% \crefname@preamble{part}{Partie}{Parties}% \crefname@preamble{chapter}{Chapitre}{Chapitres}% \crefname@preamble{section}{Section}{Sections}% \crefname@preamble{appendix}{Annexe}{Annexes}% \crefname@preamble{enumi}{Point}{Points}% \crefname@preamble{footnote}{Note}{Notes}% \crefname@preamble{theorem}{Th\'eor\`eme}{Th\'eor\`emes}% \crefname@preamble{lemma}{Lemme}{Lemmes}% \crefname@preamble{corollary}{Corollaire}{Corollaires}% \crefname@preamble{proposition}{Proposition}{Propositions}% \crefname@preamble{definition}{D\'efinition}{D\'efinitions}% \crefname@preamble{result}{R\'esultat}{R\'esultats}% \crefname@preamble{example}{Exemple}{Exemples}% \crefname@preamble{remark}{Remarque}{Remarques}% \crefname@preamble{note}{Commentaire}{Commentaires}% \crefname@preamble{algorithm}{Algorithme}{Algorithmes}% \crefname@preamble{listing}{Liste}{Listes}% \crefname@preamble{line}{Ligne}{Lignes}% % \else% capitalise unset \crefname@preamble{equation}{{\'e}quation}{{\'e}quations}% \crefname@preamble{figure}{figure}{figures}% \crefname@preamble{table}{tableau}{tableaux}% \crefname@preamble{page}{page}{pages}% \crefname@preamble{part}{partie}{parties}% \crefname@preamble{chapter}{chapitre}{chapitres}% \crefname@preamble{section}{section}{sections}% \crefname@preamble{appendix}{annexe}{annexes}% \crefname@preamble{enumi}{point}{points}% \crefname@preamble{footnote}{note}{notes}% \crefname@preamble{theorem}{th\'eor\`eme}{th\'eor\`emes}% \crefname@preamble{lemma}{lemme}{lemmes}% \crefname@preamble{corollary}{corollaire}{corollaires}% \crefname@preamble{proposition}{proposition}{propositions}% \crefname@preamble{definition}{d\'efinition}{d\'efinitions}% \crefname@preamble{result}{r\'esultat}{r\'esultats}% \crefname@preamble{example}{exemple}{exemples}% \crefname@preamble{remark}{remarque}{remarques}% \crefname@preamble{note}{commentaire}{commentaires}% \crefname@preamble{algorithm}{algorithme}{algorithmes}% \crefname@preamble{listing}{liste}{listes}% \crefname@preamble{line}{ligne}{lignes}% \fi% \def\cref@language{french}% % \end{macrocode} % % Next, we add the definitions to \cmd{\extras}\dots{} so that % \package{babel}'s \cmd{\selectlanguage} command will change the format % appropriately. % \begin{macrocode} \cref@addto\extrasfrench{% \renewcommand{\crefrangeconjunction}{ \`a\nobreakspace}% \renewcommand\crefrangepreconjunction{}% \renewcommand\crefrangepostconjunction{}% \renewcommand{\crefpairconjunction}{ et\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ et\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ et\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}{ et\nobreakspace}% % \Crefname{equation}{{\'E}quation}{{\'E}quations}% \Crefname{figure}{Figure}{Figures}% \Crefname{subfigure}{Figure}{Figures}% \Crefname{table}{Tableau}{Tableaux}% \Crefname{subtable}{Tableau}{Tableaux}% \Crefname{page}{Page}{Pages}% \Crefname{part}{Partie}{Parties}% \Crefname{chapter}{Chapitre}{Chapitres}% \Crefname{section}{Section}{Sections}% \Crefname{subsection}{Section}{Sections}% \Crefname{subsubsection}{Section}{Sections}% \Crefname{appendix}{Annexe}{Annexes}% \Crefname{subappendix}{Annexe}{Annexes}% \Crefname{subsubappendix}{Annexe}{Annexes}% \Crefname{subsubsubappendix}{Annexe}{Annexes}% \Crefname{enumi}{Point}{Points}% \Crefname{enumii}{Point}{Points}% \Crefname{enumiii}{Point}{Points}% \Crefname{enumiv}{Point}{Points}% \Crefname{enumv}{Point}{Points}% \Crefname{footnote}{Note}{Notes}% \Crefname{theorem}{Th\'eor\`eme}{Th\'eor\`emes}% \Crefname{lemma}{Lemme}{Lemmes}% \Crefname{corollary}{Corollaire}{Corollaires}% \Crefname{proposition}{Proposition}{Propositions}% \Crefname{definition}{D\'efinition}{D\'efinitions}% \Crefname{result}{R\'esultat}{R\'esultats}% \Crefname{example}{Exemple}{Exemples}% \Crefname{remark}{Remarque}{Remarques}% \Crefname{note}{Commentaire}{Commentaires}% \Crefname{algorithm}{Algorithme}{Algorithmes}% \Crefname{listing}{Liste}{Listes}% \Crefname{line}{Ligne}{Lignes}% % \if@cref@capitalise% capitalise set \crefname{equation}{{\'E}quation}{{\'E}quations}% \crefname{figure}{Figure}{Figures}% \crefname{subfigure}{Figure}{Figures}% \crefname{table}{Tableau}{Tableaux}% \crefname{subtable}{Tableau}{Tableaux}% \crefname{page}{Page}{Pages}% \crefname{part}{Partie}{Parties}% \crefname{chapter}{Chapitre}{Chapitres}% \crefname{section}{Section}{Sections}% \crefname{subsection}{Section}{Sections}% \crefname{subsubsection}{Section}{Sections}% \crefname{appendix}{Annexe}{Annexes}% \crefname{subappendix}{Annexe}{Annexes}% \crefname{subsubappendix}{Annexe}{Annexes}% \crefname{subsubsubappendix}{Annexe}{Annexes}% \crefname{enumi}{Point}{Points}% \crefname{enumii}{Point}{Points}% \crefname{enumiii}{Point}{Points}% \crefname{enumiv}{Point}{Points}% \crefname{enumv}{Point}{Points}% \crefname{footnote}{Note}{Notes}% \crefname{theorem}{Th\'eor\`eme}{Th\'eor\`emes}% \crefname{lemma}{Lemme}{Lemmes}% \crefname{corollary}{Corollaire}{Corollaires}% \crefname{proposition}{Proposition}{Propositions}% \crefname{definition}{D\'efinition}{D\'efinitions}% \crefname{result}{R\'esultat}{R\'esultats}% \crefname{example}{Exemple}{Exemples}% \crefname{remark}{Remarque}{Remarques}% \crefname{note}{Commentaire}{Commentaires}% \crefname{algorithm}{Algorithme}{Algorithmes}% \crefname{listing}{Liste}{Listes}% \crefname{line}{Ligne}{Lignes}% % \else% capitalise unset \crefname{equation}{{\'e}quation}{{\'e}quations}% \crefname{figure}{figure}{figures}% \crefname{subfigure}{figure}{figures}% \crefname{table}{tableau}{tableaux}% \crefname{subtable}{tableau}{tableaux}% \crefname{page}{page}{pages}% \crefname{part}{partie}{parties}% \crefname{chapter}{chapitre}{chapitres}% \crefname{section}{section}{sections}% \crefname{subsection}{section}{sections}% \crefname{subsubsection}{section}{sections}% \crefname{appendix}{annexe}{annexes}% \crefname{subappendix}{annexe}{annexes}% \crefname{subsubappendix}{annexe}{annexes}% \crefname{subsubsubappendix}{annexe}{annexes}% \crefname{enumi}{point}{points}% \crefname{enumii}{point}{points}% \crefname{enumiii}{point}{points}% \crefname{enumiv}{point}{points}% \crefname{enumv}{point}{points}% \crefname{footnote}{note}{notes}% \crefname{theorem}{th\'eor\`eme}{th\'eor\`emes}% \crefname{lemma}{lemme}{lemmes}% \crefname{corollary}{corollaire}{corollaires}% \crefname{proposition}{proposition}{propositions}% \crefname{definition}{d\'efinition}{d\'efinitions}% \crefname{result}{r\'esultat}{r\'esultats}% \crefname{example}{exemple}{exemples}% \crefname{remark}{remarque}{remarques}% \crefname{note}{commentaire}{commentaires}% \crefname{algorithm}{algorithme}{algorithmes}% \crefname{listing}{liste}{listes}% \crefname{line}{ligne}{lignes}% \fi% }}} % \end{macrocode} % % % \subsubsection{Spanish} % \begin{macro}{spanish} % Spanish translations generously contributed by Gonzalo Medina. % \end{macro} % \begin{macrocode} \DeclareOption{spanish}{% \PackageInfo{cleveref}{loaded `spanish' language definitions} % \end{macrocode} % First, we set up the definitions used at the beginning of the document to % define the formats created by the document preamble. % \begin{macrocode} \AtBeginDocument{% \def\crefrangeconjunction@preamble{ a\nobreakspace}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ y\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ y\nobreakspace}% \def\crefpairgroupconjunction@preamble{ y\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble{ y\nobreakspace}% % \Crefname@preamble{equation}{Ecuaci\'on}{Ecuaciones}% \Crefname@preamble{figure}{Figura}{Figuras}% \Crefname@preamble{table}{Cuadro}{Cuadros}% \Crefname@preamble{page}{P\'agina}{P\'aginas}% \Crefname@preamble{part}{Parte}{Partes}% \Crefname@preamble{chapter}{Cap\'itulo}{Cap\'itulos}% \Crefname@preamble{section}{Apartado}{Apartados}% \Crefname@preamble{appendix}{Ap\'endice}{Ap\'endices}% \Crefname@preamble{enumi}{Punto}{Puntos}% \Crefname@preamble{footnote}{Nota}{Notas}% \Crefname@preamble{theorem}{Teorema}{Teoremas}% \Crefname@preamble{lemma}{Lema}{Lemas}% \Crefname@preamble{corollary}{Corolario}{Corolarios}% \Crefname@preamble{proposition}{Proposici\'on}{Proposiciones}% \Crefname@preamble{definition}{Definici\'on}{Definiciones}% \Crefname@preamble{result}{Resultado}{Resultados}% \Crefname@preamble{example}{Ejemplo}{Ejemplos}% \Crefname@preamble{remark}{Observaci\'on}{Observaciones}% \Crefname@preamble{note}{Nota}{Notas}% \Crefname@preamble{algorithm}{Algoritmo}{Algoritmos}% \Crefname@preamble{listing}{Listado}{Listados}% \Crefname@preamble{line}{L\'inea}{L\'ineas}% % \if@cref@capitalise% capitalise set \crefname@preamble{equation}{Ecuaci\'on}{Ecuaciones}% \crefname@preamble{figure}{Figura}{Figuras}% \crefname@preamble{table}{Cuadro}{Cuadros}% \crefname@preamble{page}{P\'agina}{P\'aginas}% \crefname@preamble{part}{Parte}{Partes}% \crefname@preamble{chapter}{Cap\'itulo}{Cap\'itulos}% \crefname@preamble{section}{Apartado}{Apartados}% \crefname@preamble{appendix}{Ap\'endice}{Ap\'endices}% \crefname@preamble{enumi}{Punto}{Puntos}% \crefname@preamble{footnote}{Nota}{Notas}% \crefname@preamble{theorem}{Teorema}{Teoremas}% \crefname@preamble{lemma}{Lema}{Lemas}% \crefname@preamble{corollary}{Corolario}{Corolarios}% \crefname@preamble{proposition}{Proposici\'on}{Proposiciones}% \crefname@preamble{definition}{Definici\'on}{Definiciones}% \crefname@preamble{result}{Resultado}{Resultados}% \crefname@preamble{example}{Ejemplo}{Ejemplos}% \crefname@preamble{remark}{Observaci\'on}{Observaciones}% \crefname@preamble{note}{Nota}{Notas}% \crefname@preamble{algorithm}{Algoritmo}{Algoritmos}% \crefname@preamble{listing}{Listado}{Listados}% \crefname@preamble{line}{L\'inea}{L\'ineas}% % \else% capitalise unset \crefname@preamble{equation}{ecuaci\'on}{ecuaciones}% \crefname@preamble{figure}{figura}{figuras}% \crefname@preamble{table}{cuadro}{cuadros}% \crefname@preamble{page}{p\'agina}{p\'aginas}% \crefname@preamble{part}{parte}{partes}% \crefname@preamble{chapter}{cap\'itulo}{cap\'itulos}% \crefname@preamble{section}{apartado}{apartados}% \crefname@preamble{appendix}{ap\'endice}{ap\'endices}% \crefname@preamble{enumi}{punto}{puntos}% \crefname@preamble{footnote}{nota}{notas}% \crefname@preamble{theorem}{teorema}{teoremas}% \crefname@preamble{lemma}{lema}{lemas}% \crefname@preamble{corollary}{corolario}{corolarios}% \crefname@preamble{proposition}{proposici\'on}{proposiciones}% \crefname@preamble{definition}{definici\'on}{definiciones}% \crefname@preamble{result}{resultado}{resultados}% \crefname@preamble{example}{ejemplo}{ejemplos}% \crefname@preamble{remark}{observaci\'on}{observaciones}% \crefname@preamble{note}{nota}{notas}% \crefname@preamble{algorithm}{algoritmo}{algoritmos}% \crefname@preamble{listing}{listado}{listados}% \crefname@preamble{line}{l\'inea}{l\'ineas}% \fi% \def\cref@language{spanish}% % \end{macrocode} % % Next, we add the definitions to \cmd{\extras}\dots{} so that % \package{babel}'s \cmd{\selectlanguage} command will change the format % appropriately. % \begin{macrocode} \cref@addto\extrasspanish{% \renewcommand{\crefrangeconjunction}{ a\nobreakspace}% \renewcommand{\crefrangepreconjunction}{}% \renewcommand{\crefrangepostconjunction}{}% \renewcommand{\crefpairconjunction}{ y\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ y\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ y\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}{ y\nobreakspace}% % \Crefname{equation}{Ecuaci\'on}{Ecuaciones}% \Crefname{figure}{Figura}{Figuras}% \Crefname{subfigure}{Figura}{Figuras}% \Crefname{table}{Cuadro}{Cuadros}% \Crefname{subtable}{Cuadro}{Cuadros}% \Crefname{page}{P\'agina}{P\'aginas}% \Crefname{part}{Parte}{Partes}% \Crefname{chapter}{Cap\'itulo}{Cap\'itulos}% \Crefname{section}{Apartado}{Apartados}% \Crefname{subsection}{Apartado}{Apartados}% \Crefname{subsubsection}{Apartado}{Apartados}% \Crefname{appendix}{Ap\'endice}{Ap\'endices}% \Crefname{subappendix}{Ap\'endice}{Ap\'endices}% \Crefname{subsubappendix}{Ap\'endice}{Ap\'endices}% \Crefname{subsubsubappendix}{Ap\'endice}{Ap\'endices}% \Crefname{enumi}{Punto}{Puntos}% \Crefname{enumii}{Punto}{Puntos}% \Crefname{enumiii}{Punto}{Puntos}% \Crefname{enumiv}{Punto}{Puntos}% \Crefname{enumv}{Punto}{Puntos}% \Crefname{footnote}{Nota}{Notas}% \Crefname{theorem}{Teorema}{Teoremas}% \Crefname{lemma}{Lema}{Lemas}% \Crefname{corollary}{Corolario}{Corolarios}% \Crefname{proposition}{Proposici\'on}{Proposiciones}% \Crefname{definition}{Definici\'on}{Definiciones}% \Crefname{result}{Resultado}{Resultados}% \Crefname{example}{Ejemplo}{Ejemplos}% \Crefname{remark}{Observaci\'on}{Observaci\'on}% \Crefname{note}{Nota}{Notas}% \Crefname{algorithm}{Algoritmo}{Algoritmos}% \Crefname{listing}{Listado}{Listados}% \Crefname{line}{L\'inea}{L\'ineas}% % \if@cref@capitalise% capitalise set \crefname{equation}{Ecuaci\'on}{Ecuaciones}% \crefname{figure}{Figura}{Figuras}% \crefname{subfigure}{Figura}{Figuras}% \crefname{table}{Cuadro}{Cuadros}% \crefname{subtable}{Cuadro}{Cuadros}% \crefname{page}{P\'agina}{P\'aginas}% \crefname{part}{Parte}{Partes}% \crefname{chapter}{Cap\'itulo}{Cap\'itulos}% \crefname{section}{Apartado}{Apartados}% \crefname{subsection}{Apartado}{Apartados}% \crefname{subsubsection}{Apartado}{Apartados}% \crefname{appendix}{Ap\'endice}{Ap\'endices}% \crefname{subappendix}{Ap\'endice}{Ap\'endices}% \crefname{subsubappendix}{Ap\'endice}{Ap\'endices}% \crefname{subsubsubappendix}{Ap\'endice}{Ap\'endices}% \crefname{enumi}{Punto}{Puntos}% \crefname{enumii}{Punto}{Puntos}% \crefname{enumiii}{Punto}{Puntos}% \crefname{enumiv}{Punto}{Puntos}% \crefname{enumv}{Punto}{Puntos}% \crefname{footnote}{Nota}{Notas}% \crefname{theorem}{Teorema}{Teoremas}% \crefname{lemma}{Lema}{Lemas}% \crefname{corollary}{Corolario}{Corolarios}% \crefname{proposition}{Proposici\'on}{Proposiciones}% \crefname{definition}{Definici\'on}{Definiciones}% \crefname{result}{Resultado}{Resultados}% \crefname{example}{Ejemplo}{Ejemplos}% \crefname{remark}{Observaci\'on}{Observaci\'ones}% \crefname{note}{Nota}{Notas}% \crefname{algorithm}{Algoritmo}{Algoritmos}% \crefname{listing}{Listado}{Listados}% \crefname{line}{L\'inea}{L\'ineas}% % \else% capitalise unset \crefname{equation}{ecuaci\'on}{ecuaciones}% \crefname{figure}{figura}{figuras}% \crefname{subfigure}{figura}{figuras}% \crefname{table}{cuadro}{cuadros}% \crefname{subtable}{cuadro}{cuadros}% \crefname{page}{p\'agina}{p\'aginas}% \crefname{part}{parte}{partes}% \crefname{chapter}{cap\'itulo}{cap\'itulos}% \crefname{section}{apartado}{apartados}% \crefname{subsection}{apartado}{apartados}% \crefname{subsubsection}{apartado}{apartados}% \crefname{appendix}{ap\'endice}{ap\'endices}% \crefname{subappendix}{ap\'endice}{ap\'endices}% \crefname{subsubappendix}{ap\'endice}{ap\'endices}% \crefname{subsubsubappendix}{ap\'endice}{ap\'endices}% \crefname{enumi}{punto}{puntos}% \crefname{enumii}{punto}{puntos}% \crefname{enumiii}{punto}{puntos}% \crefname{enumiv}{punto}{puntos}% \crefname{enumv}{punto}{puntos}% \crefname{footnote}{nota}{notas}% \crefname{theorem}{teorema}{teoremas}% \crefname{lemma}{lema}{lemas}% \crefname{corollary}{corolario}{corolarios}% \crefname{proposition}{proposici\'on}{proposiciones}% \crefname{definition}{definici\'on}{definiciones}% \crefname{result}{resultado}{resultados}% \crefname{example}{ejemplo}{ejemplos}% \crefname{remark}{observaci\'on}{observaci\'ones}% \crefname{note}{nota}{notas}% \crefname{algorithm}{algoritmo}{algoritmos}% \crefname{listing}{listado}{listados}% \crefname{line}{l\'inea}{l\'ineas}% \fi% }}} % \end{macrocode} % % % \subsubsection{Italian} % \begin{macro}{italian} % Italian translations kindly contributed by Massimo Redaelli. % \end{macro} % \begin{macrocode} \DeclareOption{italian}{% \PackageInfo{cleveref}{loaded `italian' language definitions} % \end{macrocode} % First, we set up the definitions used at the beginning of the document to % define the formats created by the document preamble. (Note that Italian % makes use of |\crefrangepreconjunction|.) % \begin{macrocode} \AtBeginDocument{% \def\crefrangeconjunction@preamble{ a\nobreakspace}% \def\crefrangepreconjunction@preamble{da\nobreakspace}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ e\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ e\nobreakspace}% % \end{macrocode} % We have to define the group conjunctions explicitly here, rather than % relying on fall-back definitions in terms of the above conjunctions % (see \cref{sec:code:default_formats}), in case any other language % option defines them explicitly and we need to override those. % \begin{macrocode} \def\crefpairgroupconjunction@preamble{ e\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble{ e\nobreakspace}% % \Crefname@preamble{equation}{Equazione}{Equazioni}% \Crefname@preamble{figure}{Figura}{Figure}% \Crefname@preamble{table}{Tabella}{Tabelle}% \Crefname@preamble{page}{Pagina}{Pagine}% \Crefname@preamble{part}{Parte}{Parti}% \Crefname@preamble{chapter}{Capitolo}{Capitoli}% \Crefname@preamble{section}{Sezione}{Sezioni}% \Crefname@preamble{appendix}{Appendice}{Appendici}% \Crefname@preamble{enumi}{Voce}{Voci}% \Crefname@preamble{footnote}{Nota}{Note}% \Crefname@preamble{theorem}{Teorema}{Teoremi}% \Crefname@preamble{lemma}{Lemma}{Lemmi}% \Crefname@preamble{corollary}{Corollario}{Corollari}% \Crefname@preamble{proposition}{Proposizione}{Proposizioni}% \Crefname@preamble{definition}{Definizioni}{Definizioni}% \Crefname@preamble{result}{Risultato}{Risultati}% \Crefname@preamble{example}{esempio}{esempi}% \Crefname@preamble{remark}{Osservazione}{Osservazioni}% \Crefname@preamble{note}{Nota}{Note}% \Crefname@preamble{algorithm}{Algoritmo}{Algoritmi}% \Crefname@preamble{listing}{Elenco}{Elenchi}% \Crefname@preamble{line}{Linea}{Linee}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% \crefname@preamble{equation}{Eq.}{Eq.}% \crefname@preamble{figure}{Fig.}{Fig.}% \else% \crefname@preamble{equation}{Equazione}{Equazioni}% \crefname@preamble{figure}{Figura}{Figure}% \fi% \crefname@preamble{table}{Tabella}{Tabelle}% \crefname@preamble{page}{Pagina}{Pagine}% \crefname@preamble{part}{Parte}{Parti}% \crefname@preamble{chapter}{Capitolo}{Capitoli}% \crefname@preamble{section}{Sezione}{Sezioni}% \crefname@preamble{appendix}{Appendice}{Appendici}% \crefname@preamble{enumi}{Voce}{Voci}% \crefname@preamble{footnote}{Nota}{Note}% \crefname@preamble{theorem}{Teorema}{Teoremi}% \crefname@preamble{lemma}{Lemma}{Lemmi}% \crefname@preamble{corollary}{Corollario}{Corollari}% \crefname@preamble{proposition}{Proposizione}{Proposizioni}% \crefname@preamble{definition}{Definizione}{Definizioni}% \crefname@preamble{result}{Risultato}{Risultati}% \crefname@preamble{example}{Esempio}{Esempi}% \crefname@preamble{remark}{Osservazione}{Osservazioni}% \crefname@preamble{note}{Nota}{Note}% \crefname@preamble{algorithm}{Algoritmo}{Algoritmi}% \crefname@preamble{listing}{Elenco}{Elenchi}% \crefname@preamble{line}{Linea}{Linee}% % \else% capitalise unset \if@cref@abbrev% \crefname@preamble{equation}{eq.}{eq.}% \crefname@preamble{figure}{fig.}{fig.}% \else% \crefname@preamble{equation}{equazione}{equazioni}% \crefname@preamble{figure}{figura}{figure}% \fi% \crefname@preamble{table}{tabella}{tabelle}% \crefname@preamble{page}{pagina}{pagine}% \crefname@preamble{part}{parte}{parti}% \crefname@preamble{chapter}{capitolo}{capitoli}% \crefname@preamble{section}{sezione}{sezioni}% \crefname@preamble{appendix}{appendice}{appendici}% \crefname@preamble{enumi}{voce}{voci}% \crefname@preamble{footnote}{nota}{note}% \crefname@preamble{theorem}{teorema}{teoremi}% \crefname@preamble{lemma}{lemma}{lemmi}% \crefname@preamble{corollary}{corollario}{corollari}% \crefname@preamble{proposition}{proposizione}{proposizioni}% \crefname@preamble{definition}{definizione}{definizioni}% \crefname@preamble{result}{risultato}{risultati}% \crefname@preamble{example}{esempio}{esempi}% \crefname@preamble{remark}{osservazione}{osservazioni}% \crefname@preamble{note}{nota}{note}% \crefname@preamble{algorithm}{algoritmo}{algoritmi}% \crefname@preamble{listing}{elenco}{elenchi}% \crefname@preamble{line}{linea}{linee}% \fi% \def\cref@language{italian}% % \end{macrocode} % % Next, we add the definitions to \cmd{\extras}\dots{} so that % \package{babel}'s \cmd{\selectlanguage} command will change the format % appropriately. % \begin{macrocode} \cref@addto\extrasitalian{% \renewcommand{\crefrangeconjunction}{ a\nobreakspace}% \renewcommand\crefrangepreconjunction{da\nobreakspace}% \renewcommand\crefrangepostconjunction{}% \renewcommand{\crefpairconjunction}{ e\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ e\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ e\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}{ e\nobreakspace}% % \Crefname{equation}{Equazione}{Equazioni}% \Crefname{figure}{Figura}{Figure}% \Crefname{subfigure}{Figura}{Figure}% \Crefname{table}{Tabella}{Tabelle}% \Crefname{subtable}{Tabella}{Tabelle}% \Crefname{page}{Pagina}{Pagine}% \Crefname{part}{Parte}{Parti}% \Crefname{chapter}{Capitolo}{Capitoli}% \Crefname{section}{Sezione}{Sezioni}% \Crefname{subsection}{Sezione}{Sezioni}% \Crefname{subsubsection}{Sezione}{Sezioni}% \Crefname{appendix}{Appendice}{Appendici}% \Crefname{subappendix}{Appendice}{Appendici}% \Crefname{subsubappendix}{Appendice}{Appendici}% \Crefname{subsubsubappendix}{Appendice}{Appendici}% \Crefname{enumi}{Voce}{Voci}% \Crefname{enumii}{Voce}{Voci}% \Crefname{enumiii}{Voce}{Voci}% \Crefname{enumiv}{Voce}{Voci}% \Crefname{enumv}{Voce}{Voci}% \Crefname{footnote}{Nota}{Note}% \Crefname{theorem}{Teorema}{Teoremi}% \Crefname{lemma}{Lemma}{Lemmi}% \Crefname{corollary}{Corollario}{Corollari}% \Crefname{proposition}{Proposizione}{Proposizioni}% \Crefname{definition}{Definizione}{Definizione}% \Crefname{result}{Risultato}{Risultati}% \Crefname{example}{esempio}{esempi}% \Crefname{remark}{Osservazione}{Osservazioni}% \Crefname{note}{Nota}{Note}% \Crefname{algorithm}{Algoritmo}{Algoritmi}% \Crefname{listing}{Elenco}{Elenchi}% \Crefname{line}{Linea}{Linee}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% \crefname{equation}{Eq.}{Eq.}% \crefname{figure}{Fig.}{Fig.}% \crefname{subfigure}{Fig.}{Fig.}% \else% \crefname{equation}{Equazione}{Equazioni}% \crefname{figure}{Figura}{Figure}% \crefname{figure}{Figura}{Figure}% \fi% \crefname{table}{Tabella}{Tabelle}% \crefname{page}{Pagina}{Pagine}% \crefname{subtable}{Tabella}{Tabelle}% \crefname{part}{Parte}{Parti}% \crefname{chapter}{Capitolo}{Capitoli}% \crefname{section}{Sezione}{Sezioni}% \crefname{subsection}{Sezione}{Sezioni}% \crefname{subsubsection}{Sezione}{Sezioni}% \crefname{appendix}{Appendice}{Appendici}% \crefname{subappendix}{Appendice}{Appendici}% \crefname{subsubappendix}{Appendice}{Appendici}% \crefname{subsubsubappendix}{Appendice}{Appendici}% \crefname{enumi}{Voce}{Voci}% \crefname{enumii}{Voce}{Voci}% \crefname{enumiii}{Voce}{Voci}% \crefname{enumiv}{Voce}{Voci}% \crefname{enumv}{Voce}{Voci}% \crefname{footnote}{Nota}{Note}% \crefname{theorem}{Teorema}{Teoremi}% \crefname{lemma}{Lemma}{Lemmi}% \crefname{corollary}{Corollario}{Corollari}% \crefname{proposition}{Proposizione}{Proposizioni}% \crefname{definition}{Definizione}{Definizione}% \crefname{result}{Risultato}{Risultati}% \crefname{example}{Esempio}{Esempi}% \crefname{remark}{Osservazione}{Osservazioni}% \crefname{note}{Nota}{Note}% \crefname{algorithm}{Algoritmo}{Algoritmi}% \crefname{listing}{Elenco}{Elenchi}% \crefname{line}{Linea}{Linee}% % \else% capitalise unset \if@cref@abbrev% \crefname{equation}{eq.}{eq.}% \crefname{figure}{fig.}{fig.}% \crefname{subfigure}{fig.}{fig.}% \else% \crefname{equation}{equazione}{equazioni}% \crefname{figure}{figura}{figure}% \crefname{figure}{figura}{figure}% \fi% \crefname{table}{tabella}{tabelle}% \crefname{page}{pagina}{pagine}% \crefname{subtable}{tabella}{tabelle}% \crefname{part}{parte}{parti}% \crefname{chapter}{capitolo}{capitoli}% \crefname{section}{sezione}{sezioni}% \crefname{subsection}{sezione}{sezioni}% \crefname{subsubsection}{sezione}{sezioni}% \crefname{appendix}{appendice}{appendici}% \crefname{subappendix}{appendice}{appendici}% \crefname{subsubappendix}{appendice}{appendici}% \crefname{subsubsubappendix}{appendice}{appendici}% \crefname{enumi}{voce}{voci}% \crefname{enumii}{voce}{voci}% \crefname{enumiii}{voce}{voci}% \crefname{enumiv}{voce}{voci}% \crefname{enumv}{voce}{voci}% \crefname{footnote}{nota}{note}% \crefname{theorem}{teorema}{teoremi}% \crefname{lemma}{lemma}{lemmi}% \crefname{corollary}{corollario}{corollari}% \crefname{proposition}{proposizione}{proposizioni}% \crefname{definition}{definizione}{definizione}% \crefname{result}{risultato}{risultati}% \crefname{example}{esempio}{esempi}% \crefname{remark}{osservazione}{osservazioni}% \crefname{note}{nota}{note}% \crefname{algorithm}{algoritmo}{algoritmi}% \crefname{listing}{elenco}{elenchi}% \crefname{line}{linea}{linee}% \fi% }}} % \end{macrocode} % % % \subsubsection{Russian} % \begin{macro}{russian} % Russian translations generously contributed by Aleksander Gorohovski. % \end{macro} % \begin{macrocode} \DeclareOption{russian}{% \PackageInfo{cleveref}{loaded `russian' language definitions} % \end{macrocode} % First, we set up the definitions used at the beginning of the document % to define the formats created by the document preamble. % \begin{macrocode} \AtBeginDocument{% \def\crefrangeconjunction@preamble{--}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ \cyri\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ \cyri\nobreakspace}% % \end{macrocode} % We have to define the group conjunctions explicitly here, rather than % relying on fall-back definitions in terms of the above conjunctions % (see \cref{sec:code:default_formats}), in case any other language % option defines them explicitly and we need to override those. % \begin{macrocode} \def\crefpairgroupconjunction@preamble{ \cyri\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble% {, \cyra\ \cyrt\cyra\cyrk\cyrzh\cyre\nobreakspace}% % \Crefname@preamble{equation}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyrery}% \Crefname@preamble{figure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \Crefname@preamble{table}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyra}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrery}% \Crefname@preamble{enumi}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \Crefname@preamble{chapter}% {\CYRG\cyrl\cyra\cyrv\cyra}% {\CYRG\cyrl\cyra\cyrv\cyrery}% \Crefname@preamble{section}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \Crefname@preamble{appendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \Crefname@preamble{footnote}% {\CYRS\cyrn\cyro\cyrs\cyrk\cyra}% {\CYRS\cyrn\cyro\cyrs\cyrk\cyri}% \Crefname@preamble{theorem}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyrery}% \Crefname@preamble{lemma}% {\CYRL\cyre\cyrm\cyrm\cyra}% {\CYRL\cyre\cyrm\cyrm\cyrery}% \Crefname@preamble{corollary}% {\CYRV\cyrery\cyrv\cyro\cyrd}% {\CYRV\cyrery\cyrv\cyro\cyrd\cyrery}% \Crefname@preamble{proposition}% {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyre}% {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyrya}% \Crefname@preamble{definition}% {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyre}% {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyrya}% \Crefname@preamble{result}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyrery}% \Crefname@preamble{example}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrr}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrr\cyrery}% \Crefname@preamble{remark}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyrya}% \Crefname@preamble{note}% {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyra}% {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyri}% \Crefname@preamble{algorithm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyrery}% \Crefname@preamble{listing}% {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg}% {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \Crefname@preamble{line}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}% \Crefname@preamble{page}% {\CYRS\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}% {\CYRS\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyrery}% \Crefname@preamble{part}% {\CYRCH\cyra\cyrs\cyrt\cyrsftsn}% {\CYRCH\cyra\cyrs\cyrt\cyri}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% abbrev set \crefname@preamble{equation}% {\CYRF-\cyrl.}% {\CYRF-\cyrl.}% \crefname@preamble{figure}% {\CYRR\cyri\cyrs.}% {\CYRR\cyri\cyrs.}% \crefname@preamble{table}% {\CYRT\cyra\cyrb\cyrl.}% {\CYRT\cyra\cyrb\cyrl.}% \crefname@preamble{enumi}% {\CYRP.}% {\CYRP.\cyrp.}% \else% \crefname@preamble{equation}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyrery}% \crefname@preamble{figure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname@preamble{table}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyra}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrery}% \crefname@preamble{enumi}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \fi% \crefname@preamble{chapter}% {\CYRG\cyrl\cyra\cyrv\cyra}% {\CYRG\cyrl\cyra\cyrv\cyrery}% \crefname@preamble{section}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \crefname@preamble{appendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname@preamble{footnote}% {\CYRS\cyrn\cyro\cyrs\cyrk\cyra}% {\CYRS\cyrn\cyro\cyrs\cyrk\cyri}% \crefname@preamble{theorem}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyrery}% \crefname@preamble{lemma}% {\CYRL\cyre\cyrm\cyrm\cyra}% {\CYRL\cyre\cyrm\cyrm\cyrery}% \crefname@preamble{corollary}% {\CYRV\cyrery\cyrv\cyro\cyrd}% {\CYRV\cyrery\cyrv\cyro\cyrd\cyrery}% \crefname@preamble{proposition}% {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyre}% {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyrya}% \crefname@preamble{definition}% {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyre}% {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyrya}% \crefname@preamble{result}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyrery}% \crefname@preamble{example}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrr}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrr\cyrery}% \crefname@preamble{remark}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyrya}% \crefname@preamble{note}% {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyra}% {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyri}% \crefname@preamble{algorithm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyrery}% \crefname@preamble{listing}% {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg}% {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \crefname@preamble{line}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}% \crefname@preamble{page}% {\CYRS\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}% {\CYRS\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyrery}% \crefname@preamble{part}% {\CYRCH\cyra\cyrs\cyrt\cyrsftsn}% {\CYRCH\cyra\cyrs\cyrt\cyri}% % \else% capitalise unset \if@cref@abbrev% abbrev set \crefname@preamble{equation}% {\cyrf-\cyrl.}% {\cyrf-\cyrl.}% \crefname@preamble{figure}% {\cyrr\cyri\cyrs.}% {\cyrr\cyri\cyrs.}% \crefname@preamble{table}% {\cyrt\cyra\cyrb\cyrl.}% {\cyrt\cyra\cyrb\cyrl.}% \crefname@preamble{enumi}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname@preamble{chapter}% {\cyrg\cyrl\cyra\cyrv.}% {\cyrg\cyrl\cyra\cyrv.}% \crefname@preamble{section}% {\cyrr\cyra\cyrz\cyrd.}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl.}% \crefname@preamble{appendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% \crefname@preamble{footnote}% {\cyrs\cyrn\cyro\cyrs\cyrk.}% {\cyrs\cyrn\cyro\cyrs\cyrk.}% \crefname@preamble{theorem}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}% \crefname@preamble{lemma}% {\cyrl\cyre\cyrm\cyrm.}% {\cyrl\cyre\cyrm\cyrm.}% \crefname@preamble{corollary}% {\cyrv\cyrery\cyrv\cyro\cyrd}% {\cyrv\cyrery\cyrv\cyro\cyrd.}% \crefname@preamble{proposition}% {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd.}% {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd.}% \crefname@preamble{definition}% {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn.}% {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn.}% \crefname@preamble{result}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt.}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt.}% \crefname@preamble{example}% {\cyrp\cyrr\cyri\cyrm.}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrr.}% \crefname@preamble{remark}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrch.}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrch.}% \crefname@preamble{note}% {\cyrz\cyra\cyrm\cyre\cyrt\cyrk.}% {\cyrz\cyra\cyrm\cyre\cyrt\cyrk.}% \crefname@preamble{algorithm}% {\cyra\cyrl\cyrg.}% {\cyra\cyrl\cyrg.}% \crefname@preamble{listing}% {\cyrl\cyri\cyrs\cyrt\cyri\cyrn.}% {\cyrl\cyri\cyrs\cyrt\cyri\cyrn\cyrg.}% \crefname@preamble{line}% {\cyrs\cyrt\cyrr\cyrk.}% {\cyrs\cyrt\cyrr\cyrk.}% \else% abbrev unset \crefname@preamble{equation}% {\cyrf\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\cyrf\cyro\cyrr\cyrm\cyru\cyrl\cyrery}% \crefname@preamble{figure}% {\cyrr\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\cyrr\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname@preamble{table}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyra}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrery}% \crefname@preamble{enumi}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname@preamble{chapter}% {\cyrg\cyrl\cyra\cyrv\cyra}% {\cyrg\cyrl\cyra\cyrv\cyrery}% \crefname@preamble{section}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \crefname@preamble{appendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname@preamble{footnote}% {\cyrs\cyrn\cyro\cyrs\cyrk\cyra}% {\cyrs\cyrn\cyro\cyrs\cyrk\cyri}% \crefname@preamble{theorem}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm\cyrery}% \crefname@preamble{lemma}% {\cyrl\cyre\cyrm\cyrm\cyra}% {\cyrl\cyre\cyrm\cyrm\cyrery}% \crefname@preamble{corollary}% {\cyrv\cyrery\cyrv\cyro\cyrd}% {\cyrv\cyrery\cyrv\cyro\cyrd\cyrery}% \crefname@preamble{proposition}% {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyre}% {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyrya}% \crefname@preamble{definition}% {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyre}% {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyrya}% \crefname@preamble{result}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyrery}% \crefname@preamble{example}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrr}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrr\cyrery}% \crefname@preamble{remark}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyre}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyrya}% \crefname@preamble{note}% {\cyrz\cyra\cyrm\cyre\cyrt\cyrk\cyra}% {\cyrz\cyra\cyrm\cyre\cyrt\cyrk\cyri}% \crefname@preamble{algorithm}% {\cyra\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\cyra\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyrery}% \crefname@preamble{listing}% {\cyrl\cyri\cyrs\cyrt\cyri\cyrn\cyrg}% {\cyrl\cyri\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \crefname@preamble{line}% {\cyrs\cyrt\cyrr\cyro\cyrk\cyra}% {\cyrs\cyrt\cyrr\cyro\cyrk\cyri}% \fi% \crefname@preamble{page}% {\cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyre}% {\cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra\cyrh}% \crefname@preamble{part}% {\cyrch\cyra\cyrs\cyrt\cyrsftsn}% {\cyrch\cyra\cyrs\cyrt\cyri}% \fi% \def\cref@language{russian}% % \end{macrocode} % % Next, we add the definitions to \cmd{\extras}\dots{} so that % \package{babel}'s \cmd{\selectlanguage} command will change the format % appropriately. % \begin{macrocode} \cref@addto\extrasrussian{% \renewcommand{\crefrangeconjunction}{--}% \renewcommand\crefrangepreconjunction{}% \renewcommand\crefrangepostconjunction{}% \renewcommand{\crefpairconjunction}{ \cyri\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ \cyri\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ \cyri\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}% {, \cyra\ \cyrt\cyra\cyrk\cyrzh\cyre\nobreakspace}% % \Crefname{page}% {\CYRS\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}% {\CYRS\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyrery}% \Crefname{equation}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyrery}% \Crefname{figure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \Crefname{subfigure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \Crefname{table}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyra}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrery}% \Crefname{subtable}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyra}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrery}% \Crefname{part}% {\CYRCH\cyra\cyrs\cyrt\cyrsftsn}% {\CYRCH\cyra\cyrs\cyrt\cyri}% \Crefname{chapter}% {\CYRG\cyrl\cyra\cyrv\cyra}% {\CYRG\cyrl\cyra\cyrv\cyrery}% \Crefname{section}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \Crefname{subsection}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \Crefname{subsubsection}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \Crefname{appendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \Crefname{subappendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya} \Crefname{subsubappendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya} \Crefname{subsubsubappendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya} \Crefname{enumi}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \Crefname{enumii}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \Crefname{enumiii}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \Crefname{enumiv}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \Crefname{enumv}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \Crefname{footnote}% {\CYRS\cyrn\cyro\cyrs\cyrk\cyra}% {\CYRS\cyrn\cyro\cyrs\cyrk\cyri}% \Crefname{theorem}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyrery}% \Crefname{lemma}% {\CYRL\cyre\cyrm\cyrm\cyra}% {\CYRL\cyre\cyrm\cyrm\cyrery}% \Crefname{corollary}% {\CYRV\cyrery\cyrv\cyro\cyrd}% {\CYRV\cyrery\cyrv\cyro\cyrd\cyrery}% \Crefname{proposition}% {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyre}% {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyrya}% \Crefname{definition}% {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyre}% {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyrya}% \Crefname{result}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyrery}% \Crefname{example}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrr}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrr\cyrery}% \Crefname{remark}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyrya}% \Crefname{note}% {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyra}% {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyri}% \Crefname{algorithm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyrery}% \Crefname{listing}% {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg}% {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \Crefname{line}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% abbrev set \crefname{equation}% {\CYRF-\cyrl.}% {\CYRF-\cyrl.}% \crefname{figure}% {\CYRR\cyri\cyrs.}% {\CYRR\cyri\cyrs.}% \crefname{subfigure}% {\CYRR\cyri\cyrs.}% {\CYRR\cyri\cyrs.}% \crefname{table}% {\CYRT\cyra\cyrb\cyrl.}% {\CYRT\cyra\cyrb\cyrl.}% \crefname{subtable}% {\CYRT\cyra\cyrb\cyrl.}% {\CYRT\cyra\cyrb\cyrl.}% \crefname{enumi}% {\CYRP.}% {\CYRP.\cyrp.}% \crefname{enumii}% {\CYRP.}% {\CYRP.\cyrp.}% \crefname{enumiii}% {\CYRP.}% {\CYRP.\cyrp.}% \crefname{enumiv}% {\CYRP.}% {\CYRP.\cyrp.}% \crefname{enumv}% {\CYRP.}% {\CYRP.\cyrp.}% \else% abbrev unset \crefname{equation}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyrery}% \crefname{figure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname{subfigure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname{table}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyra}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrery}% \crefname{subtable}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyra}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrery}% \crefname{enumi}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname{enumii}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname{enumiii}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname{enumiv}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname{enumv}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \fi% \crefname{page}% {\CYRS\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}% {\CYRS\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyrery}% \crefname{part}% {\CYRCH\cyra\cyrs\cyrt\cyrsftsn}% {\CYRCH\cyra\cyrs\cyrt\cyri}% \crefname{chapter}% {\CYRG\cyrl\cyra\cyrv\cyra}% {\CYRG\cyrl\cyra\cyrv\cyrery}% \crefname{section}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \crefname{subsection}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \crefname{subsubsection}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \crefname{appendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname{subappendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname{subsubappendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname{subsubsubappendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname{footnote}% {\CYRS\cyrn\cyro\cyrs\cyrk\cyra}% {\CYRS\cyrn\cyro\cyrs\cyrk\cyri}% \crefname{theorem}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyrery}% \crefname{lemma}% {\CYRL\cyre\cyrm\cyrm\cyra}% {\CYRL\cyre\cyrm\cyrm\cyrery}% \crefname{corollary}% {\CYRV\cyrery\cyrv\cyro\cyrd}% {\CYRV\cyrery\cyrv\cyro\cyrd\cyrery}% \crefname{proposition}% {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyre}% {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyrya}% \crefname{definition}% {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyre}% {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyrya}% \crefname{result}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyrery}% \crefname{example}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrr}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrr\cyrery}% \crefname{remark}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyrya}% \crefname{note}% {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyra}% {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyri}% \crefname{algorithm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyrery}% \crefname{listing}% {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg}% {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \crefname{line}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}% % \else% capitalise unset \if@cref@abbrev% abbrev set \crefname{equation}% {\cyrf-\cyrl.}% {\cyrf-\cyrl.}% \crefname{chapter}% {\cyrg\cyrl\cyra\cyrv.}% {\cyrg\cyrl\cyra\cyrv.}% \crefname{section}% {\cyrr\cyra\cyrz\cyrd.}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl.}% \crefname{subsection}% {\cyrr\cyra\cyrz\cyrd.}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl.}% \crefname{subsubsection}% {\cyrr\cyra\cyrz\cyrd.}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl.}% \crefname{appendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% \crefname{subappendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% \crefname{subsubappendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% \crefname{subsubsubappendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% \crefname{enumi}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{enumii}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{enumiii}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{enumiv}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{enumv}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{footnote}% {\cyrs\cyrn\cyro\cyrs\cyrk.}% {\cyrs\cyrn\cyro\cyrs\cyrk.}% \crefname{figure}% {\cyrr\cyri\cyrs.}% {\cyrr\cyri\cyrs.}% \crefname{subfigure}% {\cyrr\cyri\cyrs.}% {\cyrr\cyri\cyrs.}% \crefname{table}% {\cyrt\cyra\cyrb\cyrl.}% {\cyrt\cyra\cyrb\cyrl.}% \crefname{subtable}% {\cyrt\cyra\cyrb\cyrl.}% {\cyrt\cyra\cyrb\cyrl.}% \crefname{theorem}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}% \crefname{lemma}% {\cyrl\cyre\cyrm\cyrm.}% {\cyrl\cyre\cyrm\cyrm.}% \crefname{corollary}% {\cyrv\cyrery\cyrv\cyro\cyrd}% {\cyrv\cyrery\cyrv\cyro\cyrd.}% \crefname{proposition}% {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd.}% {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd.}% \crefname{definition}% {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn.}% {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn.}% \crefname{result}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt.}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt.}% \crefname{example}% {\cyrp\cyrr\cyri\cyrm.}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrr.}% \crefname{remark}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrch.}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrch.}% \crefname{note}% {\cyrz\cyra\cyrm\cyre\cyrt\cyrk.}% {\cyrz\cyra\cyrm\cyre\cyrt\cyrk.}% \crefname{algorithm}% {\cyra\cyrl\cyrg.}% {\cyra\cyrl\cyrg.}% \crefname{listing}% {\cyrl\cyri\cyrs\cyrt\cyri\cyrn.}% {\cyrl\cyri\cyrs\cyrt\cyri\cyrn\cyrg.}% \crefname{line}% {\cyrs\cyrt\cyrr\cyrk.}% {\cyrs\cyrt\cyrr\cyrk.}% \else% abbrev unset \crefname{equation}% {\cyrf\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\cyrf\cyro\cyrr\cyrm\cyru\cyrl\cyrery}% \crefname{figure}% {\cyrr\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\cyrr\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname{subfigure}% {\cyrr\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\cyrr\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname{table}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyra}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrery}% \crefname{subtable}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyra}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrery}% \crefname{enumi}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname{enumii}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname{enumiii}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname{enumiv}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname{enumv}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname{chapter}% {\cyrg\cyrl\cyra\cyrv\cyra}% {\cyrg\cyrl\cyra\cyrv\cyrery}% \crefname{section}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \crefname{subsection}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \crefname{subsubsection}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \crefname{appendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname{subappendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname{subsubappendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname{subsubsubappendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname{footnote}% {\cyrs\cyrn\cyro\cyrs\cyrk\cyra}% {\cyrs\cyrn\cyro\cyrs\cyrk\cyri}% \crefname{theorem}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm\cyrery}% \crefname{lemma}% {\cyrl\cyre\cyrm\cyrm\cyra}% {\cyrl\cyre\cyrm\cyrm\cyrery}% \crefname{corollary}% {\cyrv\cyrery\cyrv\cyro\cyrd}% {\cyrv\cyrery\cyrv\cyro\cyrd\cyrery}% \crefname{proposition}% {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyre}% {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyrya}% \crefname{definition}% {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyre}% {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyrya}% \crefname{result}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyrery}% \crefname{example}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrr}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrr\cyrery}% \crefname{remark}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyre}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyrya}% \crefname{note}% {\cyrz\cyra\cyrm\cyre\cyrt\cyrk\cyra}% {\cyrz\cyra\cyrm\cyre\cyrt\cyrk\cyri}% \crefname{algorithm}% {\cyra\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\cyra\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyrery}% \crefname{listing}% {\cyrl\cyri\cyrs\cyrt\cyri\cyrn\cyrg}% {\cyrl\cyri\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \crefname{line}% {\cyrs\cyrt\cyrr\cyro\cyrk\cyra}% {\cyrs\cyrt\cyrr\cyro\cyrk\cyri}% \fi% \crefname{page}% {\cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyre}% {\cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra\cyrh}% \crefname{part}% {\cyrch\cyra\cyrs\cyrt\cyrsftsn}% {\cyrch\cyra\cyrs\cyrt\cyri}% \fi% }}} % \end{macrocode} % % % \subsubsection{Ukrainian} % \begin{macro}{ukrainian} % Ukrainian translations courtesy of Aleksander Gorohovski. % \end{macro} % \begin{macrocode} \DeclareOption{ukrainian}{% \PackageInfo{cleveref}{loaded `ukrainian' language definitions} % \end{macrocode} % First, we set up the definitions used at the beginning of the document % to define the formats created by the document preamble. % \begin{macrocode} \AtBeginDocument{% \def\crefrangeconjunction@preamble{--}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ \cyrii\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ \cyrii\nobreakspace}% % \end{macrocode} % We have to define the group conjunctions explicitly here, rather than % relying on fall-back definitions in terms of the above conjunctions % (see \cref{sec:code:default_formats}), in case any other language % option defines them explicitly and we need to override those. % \begin{macrocode} \def\crefpairgroupconjunction@preamble{ \cyrt\cyra\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble% {, \cyra\ \cyrt\cyra\cyrk\cyro\cyrzh\nobreakspace}% % \Crefname@preamble{equation}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyri}% \Crefname@preamble{figure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \Crefname@preamble{table}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrya}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrii}% \Crefname@preamble{enumi}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \Crefname@preamble{chapter}% {\CYRG\cyrl\cyra\cyrv\cyra}% {\CYRG\cyrl\cyra\cyrv\cyri}% \Crefname@preamble{section}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \Crefname@preamble{appendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \Crefname@preamble{footnote}% {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyra}% {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyri}% \Crefname@preamble{theorem}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyri}% \Crefname@preamble{lemma}% {\CYRL\cyre\cyrm\cyrm\cyra}% {\CYRL\cyre\cyrm\cyrm\cyri}% \Crefname@preamble{corollary}% {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyro\cyrk}% {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyrk\cyri}% \Crefname@preamble{proposition}% {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% \Crefname@preamble{definition}% {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% \Crefname@preamble{result}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyri}% \Crefname@preamble{example}% {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd}% {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd\cyri}% \Crefname@preamble{remark}% {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyra}% {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyri}% \Crefname@preamble{note}% {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyra}% {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyri}% \Crefname@preamble{algorithm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyri}% \Crefname@preamble{listing}% {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg}% {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \Crefname@preamble{line}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}% \Crefname@preamble{page}% {\CYRS\cyrt\cyro\cyrr\cyri\cyrn\cyrk\cyra}% {\CYRS\cyrt\cyro\cyrr\cyrii\cyrn\cyrk\cyri}% \Crefname@preamble{part}% {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyra}% {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyri}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% abbrev set \crefname@preamble{equation}% {\CYRF-\cyrl.}% {\CYRF-\cyrl.}% \crefname@preamble{figure}% {\CYRR\cyri\cyrs.}% {\CYRR\cyri\cyrs.}% \crefname@preamble{table}% {\CYRT\cyra\cyrb\cyrl.}% {\CYRT\cyra\cyrb\cyrl.}% \crefname@preamble{enumi}% {\CYRP.}% {\CYRP.\cyrp.}% \else% \crefname@preamble{equation}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyri}% \crefname@preamble{figure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname@preamble{table}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrya}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrii}% \crefname@preamble{enumi}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \fi% \crefname@preamble{chapter}% {\CYRG\cyrl\cyra\cyrv\cyra}% {\CYRG\cyrl\cyra\cyrv\cyri}% \crefname@preamble{section}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \crefname@preamble{appendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname@preamble{footnote}% {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyra}% {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyri}% \crefname@preamble{theorem}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyri}% \crefname@preamble{lemma}% {\CYRL\cyre\cyrm\cyrm\cyra}% {\CYRL\cyre\cyrm\cyrm\cyri}% \crefname@preamble{corollary}% {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyro\cyrk}% {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyrk\cyri}% \crefname@preamble{proposition}% {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% \crefname@preamble{definition}% {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% \crefname@preamble{result}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyri}% \crefname@preamble{example}% {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd}% {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd\cyri}% \crefname@preamble{remark}% {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyra}% {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyri}% \crefname@preamble{note}% {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyra}% {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyri}% \crefname@preamble{algorithm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyri}% \crefname@preamble{listing}% {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg}% {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \crefname@preamble{line}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}% \crefname@preamble{page}% {\CYRS\cyrt\cyro\cyrr\cyri\cyrn\cyrk\cyra}% {\CYRS\cyrt\cyro\cyrr\cyrii\cyrn\cyrk\cyri}% \crefname@preamble{part}% {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyra}% {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyri}% % \else% capitalise unset \if@cref@abbrev% abbrev set \crefname@preamble{equation}% {\cyrf-\cyrl.}% {\cyrf-\cyrl.}% \crefname@preamble{figure}% {\cyrr\cyri\cyrs.}% {\cyrr\cyri\cyrs.}% \crefname@preamble{table}% {\cyrt\cyra\cyrb\cyrl.}% {\cyrt\cyra\cyrb\cyrl.}% \crefname@preamble{enumi}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname@preamble{chapter}% {\cyrg\cyrl\cyra\cyrv.}% {\cyrg\cyrl\cyra\cyrv.}% \crefname@preamble{section}% {\cyrr\cyro\cyrz\cyrd.}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl.}% \crefname@preamble{appendix}% {\cyrd\cyro\cyrd\cyra\cyrt.}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk.}% \crefname@preamble{footnote}% {\cyrv\cyri\cyrn\cyro\cyrs\cyrk.}% {\cyrv\cyri\cyrn\cyro\cyrs\cyrk.}% \crefname@preamble{theorem}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}% \crefname@preamble{lemma}% {\cyrl\cyre\cyrm\cyrm.}% {\cyrl\cyre\cyrm\cyrm.}% \crefname@preamble{corollary}% {\cyrv\cyri\cyrs\cyrn\cyro\cyrv.}% {\cyrv\cyri\cyrs\cyrn\cyro\cyrv\cyrk.}% \crefname@preamble{proposition}% {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn.}% {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn.}% \crefname@preamble{definition}% {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn.}% {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn.}% \crefname@preamble{result}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt.}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt.}% \crefname@preamble{example}% {\cyrp\cyrr\cyri\cyrk\cyrl.}% {\cyrp\cyrr\cyri\cyrk\cyrl\cyra\cyrd.}% \crefname@preamble{remark}% {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt.}% {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt.}% \crefname@preamble{note}% {\cyrz\cyra\cyrm\cyrii\cyrt.}% {\cyrz\cyra\cyrm\cyrii\cyrt.}% \crefname@preamble{algorithm}% {\cyra\cyrl\cyrg.}% {\cyra\cyrl\cyrg.}% \crefname@preamble{listing}% {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn.}% {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn\cyrg.}% \crefname@preamble{line}% {\cyrs\cyrt\cyrr\cyrk.}% {\cyrs\cyrt\cyrr\cyrk.}% \else% abbrev unset \crefname@preamble{equation}% {\cyrf\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\cyrf\cyro\cyrr\cyrm\cyru\cyrl\cyri}% \crefname@preamble{figure}% {\cyrr\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\cyrr\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname@preamble{table}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrya}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrii}% \crefname@preamble{enumi}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyri}% \crefname@preamble{chapter}% {\cyrg\cyrl\cyra\cyrv\cyra}% {\cyrg\cyrl\cyra\cyrv\cyri}% \crefname@preamble{section}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \crefname@preamble{appendix}% {\cyrd\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname@preamble{footnote}% {\cyrv\cyri\cyrn\cyro\cyrs\cyrk\cyra}% {\cyrv\cyri\cyrn\cyro\cyrs\cyrk\cyri}% \crefname@preamble{theorem}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm\cyri}% \crefname@preamble{lemma}% {\cyrl\cyre\cyrm\cyrm\cyra}% {\cyrl\cyre\cyrm\cyrm\cyri}% \crefname@preamble{corollary}% {\cyrv\cyri\cyrs\cyrn\cyro\cyrv\cyro\cyrk}% {\cyrv\cyri\cyrs\cyrn\cyro\cyrv\cyrk\cyri}% \crefname@preamble{proposition}% {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% \crefname@preamble{definition}% {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% \crefname@preamble{result}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyri}% \crefname@preamble{example}% {\cyrp\cyrr\cyri\cyrk\cyrl\cyra\cyrd}% {\cyrp\cyrr\cyri\cyrk\cyrl\cyra\cyrd\cyri}% \crefname@preamble{remark}% {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyra}% {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyri}% \crefname@preamble{note}% {\cyrz\cyra\cyrm\cyrii\cyrt\cyrk\cyra}% {\cyrz\cyra\cyrm\cyrii\cyrt\cyrk\cyri}% \crefname@preamble{algorithm}% {\cyra\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\cyra\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyri}% \crefname@preamble{listing}% {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn\cyrg}% {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \crefname@preamble{line}% {\cyrs\cyrt\cyrr\cyro\cyrk\cyra}% {\cyrs\cyrt\cyrr\cyro\cyrk\cyri}% \fi% \crefname@preamble{page}% {\cyrs\cyrt\cyro\cyrr\cyri\cyrn\cyrc\cyrii}% {\cyrs\cyrt\cyro\cyrr\cyrii\cyrn\cyrk\cyra\cyrh}% \crefname@preamble{part}% {\cyrch\cyra\cyrs\cyrt\cyri\cyrn\cyra}% {\cyrch\cyra\cyrs\cyrt\cyri\cyrn\cyri}% \fi% \def\cref@language{ukrainian}% % \end{macrocode} % % Next, we add the definitions to \cmd{\extras}\dots{} so that % \package{babel}'s \cmd{\selectlanguage} command will change the format % appropriately. % \begin{macrocode} \cref@addto\extrasukrainian{% \renewcommand{\crefrangeconjunction}{--}% \renewcommand\crefrangepreconjunction{}% \renewcommand\crefrangepostconjunction{}% \renewcommand{\crefpairconjunction}{ \cyrii\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ \cyrii\nobreakspace}% \renewcommand{\crefpairgroupconjunction}% { \cyrt\cyra\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}% {, \cyra\ \cyrt\cyra\cyrk\cyro\cyrzh\nobreakspace}% % \Crefname{equation}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyri}% \Crefname{figure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \Crefname{subfigure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \Crefname{table}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrya}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrii}% \Crefname{subtable}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrya}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrii}% \Crefname{enumi}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \Crefname{enumii}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \Crefname{enumiii}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \Crefname{enumiv}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \Crefname{enumv}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \Crefname{chapter}% {\CYRG\cyrl\cyra\cyrv\cyra}% {\CYRG\cyrl\cyra\cyrv\cyri}% \Crefname{section}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \Crefname{subsection}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \Crefname{subsubsection}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \Crefname{appendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \Crefname{subappendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \Crefname{subsubappendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \Crefname{subsubsubappendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \Crefname{footnote}% {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyra}% {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyri}% \Crefname{theorem}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyri}% \Crefname{lemma}% {\CYRL\cyre\cyrm\cyrm\cyra}% {\CYRL\cyre\cyrm\cyrm\cyri}% \Crefname{corollary}% {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyro\cyrk}% {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyrk\cyri}% \Crefname{proposition}% {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% \Crefname{definition}% {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% \Crefname{result}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyri}% \Crefname{example}% {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd}% {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd\cyri}% \Crefname{remark}% {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyra}% {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyri}% \Crefname{note}% {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyra}% {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyri}% \Crefname{algorithm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyri}% \Crefname{listing}% {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg}% {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \Crefname{line}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}% \Crefname{page}% {\CYRS\cyrt\cyro\cyrr\cyri\cyrn\cyrk\cyra}% {\CYRS\cyrt\cyro\cyrr\cyrii\cyrn\cyrk\cyri}% \Crefname{part}% {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyra}% {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyri}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% abbrev set \crefname{equation}% {\CYRF-\cyrl.}% {\CYRF-\cyrl.}% \crefname{figure}% {\CYRR\cyri\cyrs.}% {\CYRR\cyri\cyrs.}% \crefname{subfigure}% {\CYRR\cyri\cyrs.}% {\CYRR\cyri\cyrs.}% \crefname{table}% {\CYRT\cyra\cyrb\cyrl.}% {\CYRT\cyra\cyrb\cyrl.}% \crefname{subtable}% {\CYRT\cyra\cyrb\cyrl.}% {\CYRT\cyra\cyrb\cyrl.}% \crefname{enumi}% {\CYRP.}% {\CYRP.\cyrp.}% \crefname{enumii}% {\CYRP.}% {\CYRP.\cyrp.}% \crefname{enumiii}% {\CYRP.}% {\CYRP.\cyrp.}% \crefname{enumiv}% {\CYRP.}% {\CYRP.\cyrp.}% \crefname{enumv}% {\CYRP.}% {\CYRP.\cyrp.}% \else% abbrev unset \crefname{equation}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyri}% \crefname{figure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname{subfigure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname{table}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrya}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrii}% \crefname{subtable}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrya}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrii}% \crefname{enumi}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \crefname{enumii}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \crefname{enumiii}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \crefname{enumiv}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \crefname{enumv}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \fi% \crefname{chapter}% {\CYRG\cyrl\cyra\cyrv\cyra}% {\CYRG\cyrl\cyra\cyrv\cyri}% \crefname{section}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \crefname{subsection}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \crefname{subsubsection}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \crefname{appendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname{subappendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname{subsubappendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname{subsubsubappendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname{footnote}% {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyra}% {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyri}% \crefname{theorem}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyri}% \crefname{lemma}% {\CYRL\cyre\cyrm\cyrm\cyra}% {\CYRL\cyre\cyrm\cyrm\cyri}% \crefname{corollary}% {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyro\cyrk}% {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyrk\cyri}% \crefname{proposition}% {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% \crefname{definition}% {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% \crefname{result}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyri}% \crefname{example}% {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd}% {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd\cyri}% \crefname{remark}% {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyra}% {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyri}% \crefname{note}% {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyra}% {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyri}% \crefname{algorithm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyri}% \crefname{listing}% {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg}% {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \crefname{line}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}% \crefname{page}% {\CYRS\cyrt\cyro\cyrr\cyri\cyrn\cyrk\cyra}% {\CYRS\cyrt\cyro\cyrr\cyrii\cyrn\cyrk\cyri}% \crefname{part}% {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyra}% {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyri}% % \else% capitalise unset \if@cref@abbrev% abbrev set \crefname{equation}% {\cyrf-\cyrl.}% {\cyrf-\cyrl.}% \crefname{chapter}% {\cyrg\cyrl\cyra\cyrv.}% {\cyrg\cyrl\cyra\cyrv.}% \crefname{section}% {\cyrr\cyro\cyrz\cyrd.}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl.}% \crefname{subsection}% {\cyrr\cyro\cyrz\cyrd.}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl.}% \crefname{subsubsection}% {\cyrr\cyro\cyrz\cyrd.}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl.}% \crefname{appendix}% {\cyrd\cyro\cyrd\cyra\cyrt.}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk.}% \crefname{subappendix}% {\cyrd\cyro\cyrd\cyra\cyrt.}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk.}% \crefname{subsubappendix}% {\cyrd\cyro\cyrd\cyra\cyrt.}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk.}% \crefname{subsubsubappendix}% {\cyrd\cyro\cyrd\cyra\cyrt.}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk.}% \crefname{enumi}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{enumii}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{enumiii}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{enumiv}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{enumv}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{footnote}% {\cyrv\cyri\cyrn\cyro\cyrs\cyrk.}% {\cyrv\cyri\cyrn\cyro\cyrs\cyrk.}% \crefname{figure}% {\cyrr\cyri\cyrs.}% {\cyrr\cyri\cyrs.}% \crefname{subfigure}% {\cyrr\cyri\cyrs.}% {\cyrr\cyri\cyrs.}% \crefname{table}% {\cyrt\cyra\cyrb\cyrl.}% {\cyrt\cyra\cyrb\cyrl.}% \crefname{subtable}% {\cyrt\cyra\cyrb\cyrl.}% {\cyrt\cyra\cyrb\cyrl.}% \crefname{theorem}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}% \crefname{lemma}% {\cyrl\cyre\cyrm\cyrm.}% {\cyrl\cyre\cyrm\cyrm.}% \crefname{corollary}% {\cyrv\cyri\cyrs\cyrn\cyro\cyrv.}% {\cyrv\cyri\cyrs\cyrn\cyro\cyrv\cyrk.}% \crefname{proposition}% {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn.}% {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn.}% \crefname{definition}% {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn.}% {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn.}% \crefname{result}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt.}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt.}% \crefname{example}% {\cyrp\cyrr\cyri\cyrk\cyrl.}% {\cyrp\cyrr\cyri\cyrk\cyrl\cyra\cyrd.}% \crefname{remark}% {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt.}% {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt.}% \crefname{note}% {\cyrz\cyra\cyrm\cyrii\cyrt.}% {\cyrz\cyra\cyrm\cyrii\cyrt.}% \crefname{algorithm}% {\cyra\cyrl\cyrg.}% {\cyra\cyrl\cyrg.}% \crefname{listing}% {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn.}% {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn\cyrg.}% \crefname{line}% {\cyrs\cyrt\cyrr\cyrk.}% {\cyrs\cyrt\cyrr\cyrk.}% \else% abbrev unset \crefname{equation}% {\cyrf\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\cyrf\cyro\cyrr\cyrm\cyru\cyrl\cyri}% \crefname{figure}% {\cyrr\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\cyrr\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname{subfigure}% {\cyrr\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\cyrr\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname{table}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrya}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrii}% \crefname{subtable}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrya}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrii}% \crefname{enumi}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyri}% \crefname{enumii}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyri}% \crefname{enumiii}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyri}% \crefname{enumiv}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyri}% \crefname{enumv}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyri}% \crefname{chapter}% {\cyrg\cyrl\cyra\cyrv\cyra}% {\cyrg\cyrl\cyra\cyrv\cyri}% \crefname{section}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \crefname{subsection}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \crefname{subsubsection}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \crefname{appendix}% {\cyrd\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname{subappendix}% {\cyrd\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname{subsubappendix}% {\cyrd\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname{subsubsubappendix}% {\cyrd\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname{footnote}% {\cyrv\cyri\cyrn\cyro\cyrs\cyrk\cyra}% {\cyrv\cyri\cyrn\cyro\cyrs\cyrk\cyri}% \crefname{theorem}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm\cyri}% \crefname{lemma}% {\cyrl\cyre\cyrm\cyrm\cyra}% {\cyrl\cyre\cyrm\cyrm\cyri}% \crefname{corollary}% {\cyrv\cyri\cyrs\cyrn\cyro\cyrv\cyro\cyrk}% {\cyrv\cyri\cyrs\cyrn\cyro\cyrv\cyrk\cyri}% \crefname{proposition}% {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% \crefname{definition}% {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% \crefname{result}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyri}% \crefname{example}% {\cyrp\cyrr\cyri\cyrk\cyrl\cyra\cyrd}% {\cyrp\cyrr\cyri\cyrk\cyrl\cyra\cyrd\cyri}% \crefname{remark}% {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyra}% {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyri}% \crefname{note}% {\cyrz\cyra\cyrm\cyrii\cyrt\cyrk\cyra}% {\cyrz\cyra\cyrm\cyrii\cyrt\cyrk\cyri}% \crefname{algorithm}% {\cyra\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\cyra\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyri}% \crefname{listing}% {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn\cyrg}% {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \crefname{line}% {\cyrs\cyrt\cyrr\cyro\cyrk\cyra}% {\cyrs\cyrt\cyrr\cyro\cyrk\cyri}% \fi% \crefname{page}% {\cyrs\cyrt\cyro\cyrr\cyri\cyrn\cyrc\cyrii}% {\cyrs\cyrt\cyro\cyrr\cyrii\cyrn\cyrk\cyra\cyrh}% \crefname{part}% {\cyrch\cyra\cyrs\cyrt\cyri\cyrn\cyra}% {\cyrch\cyra\cyrs\cyrt\cyri\cyrn\cyri}% \fi% }}} % \end{macrocode} % % % \subsubsection{Norsk} % \begin{macro}{norsk} % Norwegian translations kindly donated by Sveinung Heggen. % \end{macro} % \begin{macrocode} \DeclareOption{norsk}{% \PackageInfo{cleveref}{loaded norsk language definitions} % \end{macrocode} % First, we set up the definitions used at the beginning of the document to % define the formats created by the document preamble. % \begin{macrocode} \AtBeginDocument{% \def\crefrangeconjunction@preamble{ til\nobreakspace}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ og\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ og\nobreakspace}% % \end{macrocode} % We have to define the group conjunctions explicitly here, rather than % relying on fall-back definitions in terms of the above conjunctions % (see \cref{sec:code:default_formats}), in case any other language % option defines them explicitly and we need to override those. % \begin{macrocode} \def\crefpairgroupconjunction@preamble{ og\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble{ og\nobreakspace}% % \Crefname@preamble{equation}{Likning}{Likningene}% \Crefname@preamble{figure}{Figur}{Figurene}% \Crefname@preamble{table}{Tabell}{Tabellene}% \Crefname@preamble{page}{Side}{Siden}% \Crefname@preamble{part}{Del}{Delene}% \Crefname@preamble{chapter}{Kapittel}{Kapitlene}% \Crefname@preamble{section}{Avsnitt}{Avsnittene}% \Crefname@preamble{appendix}{Tillegg}{Tilleggene}% \Crefname@preamble{enumi}{Punkt}{Punktene}% \Crefname@preamble{footnote}{Fotnote}{Fotnotene}% \Crefname@preamble{theorem}{Teorem}{Teoremene}% \Crefname@preamble{lemma}{Lemma}{Lemma}% \Crefname@preamble{corollary}{Korollar}{Korollarene}% \Crefname@preamble{proposition}{P\aa stand}{P\aa standene}% \Crefname@preamble{definition}{Definisjon}{Definisjonene}% \Crefname@preamble{result}{Resultat}{Resultatene}% \Crefname@preamble{example}{Eksempel}{Eksemplene}% \Crefname@preamble{remark}{Bemerkning}{Bemerkningene}% \Crefname@preamble{note}{Note}{Notene}% \Crefname@preamble{algorithm}{Algoritme}{Algoritmene}% \Crefname@preamble{listing}{Opplisting}{Opplistingene}% \Crefname@preamble{line}{Linje}{Linjene}% % \if@cref@capitalise% \crefname@preamble{page}{Side}{Siden}% \crefname@preamble{equation}{Likning}{Likningene}% \crefname@preamble{figure}{Figur}{Figurene}% \crefname@preamble{table}{Tabell}{Tabellene}% \crefname@preamble{part}{Del}{Delene}% \crefname@preamble{chapter}{Kapittel}{Kapitlene}% \crefname@preamble{section}{Avsnitt}{Avsnittene}% \crefname@preamble{appendix}{Tillegg}{Tilleggene}% \crefname@preamble{enumi}{Punkt}{Punktene}% \crefname@preamble{footnote}{Fotnote}{Fotnotene}% \crefname@preamble{theorem}{Teorem}{Teoremene}% \crefname@preamble{lemma}{Lemma}{Lemma}% \crefname@preamble{corollary}{Korollar}{Korollarene}% \crefname@preamble{proposition}{P\aa stand}{P\aa standene}% \crefname@preamble{definition}{Definisjon}{Definisjonene}% \crefname@preamble{result}{Resultat}{Resultatene}% \crefname@preamble{example}{Eksempel}{Eksemplene}% \crefname@preamble{remark}{Bemerkning}{Bemerkningene}% \crefname@preamble{note}{Note}{Notene}% \crefname@preamble{algorithm}{Algoritme}{Algoritmene}% \crefname@preamble{listing}{Opplisting}{Opplistingene}% \crefname@preamble{line}{Linje}{Linjene}% % \else% \crefname@preamble{equation}{likning}{likningene}% \crefname@preamble{figure}{figur}{figurene}% \crefname@preamble{table}{tabell}{tabeller}% \crefname@preamble{page}{side}{siden}% \crefname@preamble{part}{del}{delene}% \crefname@preamble{chapter}{kapittel}{kapitlene}% \crefname@preamble{section}{avsnitt}{avsnittene}% \crefname@preamble{appendix}{tillegg}{tilleggene}% \crefname@preamble{enumi}{punkt}{punktene}% \crefname@preamble{footnote}{fotnote}{fotnotene}% \crefname@preamble{theorem}{teorem}{teoremene}% \crefname@preamble{lemma}{lemma}{lemma}% \crefname@preamble{corollary}{korollar}{korollarene}% \crefname@preamble{proposition}{p\aa stand}{p\aa standene}% \crefname@preamble{definition}{definisjon}{definisjonene}% \crefname@preamble{result}{resultat}{resultatene}% \crefname@preamble{example}{eksempel}{eksemplene}% \crefname@preamble{remark}{bemerkning}{bemerkningene}% \crefname@preamble{note}{note}{notene}% \crefname@preamble{algorithm}{algoritme}{algoritmene}% \crefname@preamble{listing}{opplisting}{opplistingene}% \crefname@preamble{line}{linje}{linjene}% \fi% \def\cref@language{norsk}% % \end{macrocode} % % Next, we add the definitions to \cmd{\extras}\dots{} so that % \package{babel}'s \cmd{\selectlanguage} command will change the format % appropriately. % \begin{macrocode} \cref@addto\extrasnorsk{% \renewcommand{\crefrangeconjunction}{ til\nobreakspace}% \renewcommand\crefrangepreconjunction{}% \renewcommand\crefrangepostconjunction{}% \renewcommand{\crefpairconjunction}{ og\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ og\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ og\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}{ og\nobreakspace}% % \Crefname{equation}{Likning}{Likningene}% \Crefname{figure}{Figur}{Figurene}% \Crefname{subfigure}{Figur}{Figurene}% \Crefname{table}{Tabell}{Tabellene}% \Crefname{subtable}{Tabell}{Tabellene}% \Crefname{page}{Side}{Siden}% \Crefname{part}{Del}{Delene}% \Crefname{chapter}{Kapittel}{Kapitlene}% \Crefname{section}{Avsnitt}{Avsnittene}% \Crefname{subsection}{Avsnitt}{Avsnittene}% \Crefname{subsubsection}{Avsnitt}{Avsnittene}% \Crefname{appendix}{Tillegg}{Tilleggene}% \Crefname{subappendix}{Tillegg}{Tilleggene}% \Crefname{subsubappendix}{Tillegg}{Tilleggene}% \Crefname{subsubsubappendix}{Tillegg}{Tilleggene}% \Crefname{enumi}{Punkt}{Punktene}% \Crefname{enumii}{Punkt}{Punktene}% \Crefname{enumiii}{Punkt}{Punktene}% \Crefname{enumiv}{Punkt}{Punktene}% \Crefname{enumv}{Punkt}{Punktene}% \Crefname{footnote}{Fotnote}{Fotnotene}% \Crefname{theorem}{Teorem}{Teoremene}% \Crefname{lemma}{Lemma}{Lemma}% \Crefname{corollary}{Korollar}{Korollarene}% \Crefname{proposition}{P\aa stand}{P\aa standene}% \Crefname{definition}{Definisjon}{Definisjonene}% \Crefname{result}{Resultat}{Resultatene}% \Crefname{example}{Eksempel}{Eksemplene}% \Crefname{remark}{Bemerkning}{Bemerkningene}% \Crefname{note}{Note}{Notene}% \Crefname{algorithm}{Algoritme}{Algoritmene}% \Crefname{listing}{Opplisting}{Opplistingene}% \Crefname{line}{Linje}{Linjene}% % \if@cref@capitalise% \crefname{equation}{Likning}{Likningene}% \crefname{figure}{Figur}{Figurene}% \crefname{subfigure}{Figur}{Figurene}% \crefname{table}{Tabell}{Tabellene}% \crefname{subtable}{Tabell}{Tabellene}% \crefname{page}{Side}{Siden}% \crefname{part}{Del}{Delene}% \crefname{chapter}{Kapittel}{Kapitlene}% \crefname{section}{Avsnitt}{Avsnittene}% \crefname{subsection}{Avsnitt}{Avsnittene}% \crefname{subsubsection}{Avsnitt}{Avsnittene}% \crefname{appendix}{Tillegg}{Tilleggene}% \crefname{subappendix}{Tillegg}{Tilleggene}% \crefname{subsubappendix}{Tillegg}{Tilleggene}% \crefname{subsubsubappendix}{Tillegg}{Tilleggene}% \crefname{enumi}{Punkt}{Punktene}% \crefname{enumii}{Punkt}{Punktene}% \crefname{enumiii}{Punkt}{Punktene}% \crefname{enumiv}{Punkt}{Punktene}% \crefname{enumv}{Punkt}{Punktene}% \crefname{footnote}{Fotnote}{Fotnotene}% \crefname{theorem}{Teorem}{Teoremene}% \crefname{lemma}{Lemma}{Lemma}% \crefname{corollary}{Korollar}{Korollarene}% \crefname{proposition}{P\aa stand}{P\aa standene}% \crefname{definition}{Definisjon}{Definisjonene}% \crefname{result}{Resultat}{Resultatene}% \crefname{example}{Eksempel}{Eksemplene}% \crefname{remark}{Bemerkning}{Bemerkningene}% \crefname{note}{Note}{Notene}% \crefname{algorithm}{Algoritme}{Algoritmene}% \crefname{listing}{Opplisting}{Opplistingene}% \crefname{line}{Linje}{Linjene}% % \else% \crefname{equation}{likning}{likningene}% \crefname{figure}{figur}{figurene}% \crefname{subfigure}{figur}{figurene}% \crefname{table}{tabell}{tabellene}% \crefname{subtable}{tabell}{tabellene}% \crefname{page}{side}{siden}% \crefname{part}{del}{delene}% \crefname{chapter}{kapittel}{kapitlene}% \crefname{section}{avsnitt}{avsnittene}% \crefname{subsection}{avsnitt}{avsnittene}% \crefname{subsubsection}{avsnitt}{avsnittene}% \crefname{appendix}{tillegg}{tilleggene}% \crefname{subappendix}{tillegg}{tilleggene}% \crefname{subsubappendix}{tillegg}{tilleggene}% \crefname{subsubsubappendix}{tillegg}{tilleggene}% \crefname{enumi}{punkt}{punktene}% \crefname{enumii}{punkt}{punktene}% \crefname{enumiii}{punkt}{punktene}% \crefname{enumiv}{punkt}{punktene}% \crefname{enumv}{punkt}{punktene}% \crefname{footnote}{fotnote}{fotnotene}% \crefname{theorem}{teorem}{teoremene}% \crefname{lemma}{lemma}{lemma}% \crefname{corollary}{korollar}{korollarene}% \crefname{proposition}{p\aa stand}{p\aa standene}% \crefname{definition}{definisjon}{definisjonene}% \crefname{result}{resultat}{resultatene}% \crefname{example}{eksempel}{eksemplene}% \crefname{remark}{bemerkning}{bemerkningene}% \crefname{note}{note}{notene}% \crefname{algorithm}{algoritme}{algoritmene}% \crefname{listing}{opplisting}{opplistingene}% \crefname{line}{linje}{linjene}% \fi% }}} % \end{macrocode} % % % \subsubsection{Danish} % \begin{macro}{danish} % Danish translations courtesy of Benjamin H{\o}yer. % \end{macro} % \begin{macrocode} \DeclareOption{danish}{% \PackageInfo{cleveref}{loaded danish language definitions} % \end{macrocode} % First, we set up the definitions used at the beginning of the document to % define the formats created by the document preamble. % \begin{macrocode} \AtBeginDocument{% \def\crefrangeconjunction@preamble{ til\nobreakspace}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ og\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ og\nobreakspace}% % \end{macrocode} % We have to define the group conjunctions explicitly here, rather than % relying on fall-back definitions in terms of the above conjunctions % (see \cref{sec:code:default_formats}), in case any other language % option defines them explicitly and we need to override those. % \begin{macrocode} \def\crefpairgroupconjunction@preamble{ og\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble{ og\nobreakspace}% % \Crefname@preamble{equation}{Ligning}{Ligninger}% \Crefname@preamble{figure}{Figur}{Figurer}% \Crefname@preamble{table}{Tabel}{Tabeller}% \Crefname@preamble{page}{Side}{Sider}% \Crefname@preamble{part}{Del}{Dele}% \Crefname@preamble{chapter}{Kapitel}{Kapitler}% \Crefname@preamble{section}{Afsnit}{Afsnit}% \Crefname@preamble{appendix}{Appendiks}{Appendiks}% \Crefname@preamble{enumi}{Punkt}{Punkter}% \Crefname@preamble{footnote}{Fodnote}{Fodnoter}% \Crefname@preamble{theorem}{Teorem}{Teoremer}% \Crefname@preamble{lemma}{Lemma}{Lemma}% \Crefname@preamble{corollary}{F\o lgeslutning}{F\o lgeslutninger}% \Crefname@preamble{proposition}{Udsagn}{Udsagn}% \Crefname@preamble{definition}{Definition}{Definitioner}% \Crefname@preamble{result}{Resultat}{Resultater}% \Crefname@preamble{example}{Eksempel}{Eksempler}% \Crefname@preamble{remark}{Bem\ae rkning}{Bem\ae rkninger}% \Crefname@preamble{note}{Note}{Noter}% \Crefname@preamble{algorithm}{Algoritme}{Algoritmer}% \Crefname@preamble{line}{Linje}{Linjer}% % \if@cref@capitalise% \crefname@preamble{equation}{Ligning}{Ligninger}% \crefname@preamble{figure}{Figur}{Figurer}% \crefname@preamble{table}{Tabel}{Tabeller}% \crefname@preamble{page}{Side}{Sider}% \crefname@preamble{part}{Del}{Dele}% \crefname@preamble{chapter}{Kapitel}{Kapitler}% \crefname@preamble{section}{Afsnit}{Afsnit}% \crefname@preamble{appendix}{Appendiks}{Appendiks}% \crefname@preamble{enumi}{Punkt}{Punkter}% \crefname@preamble{footnote}{Fodnote}{Fodnoter}% \crefname@preamble{theorem}{Teorem}{Teoremer}% \crefname@preamble{lemma}{Lemma}{Lemma}% \crefname@preamble{corollary}{F\o lgeslutning}{F\o lgeslutninger}% \crefname@preamble{proposition}{Udsagn}{Udsagn}% \crefname@preamble{definition}{Definition}{Definitioner}% \crefname@preamble{result}{Resultat}{Resultater}% \crefname@preamble{example}{Eksempel}{Eksempler}% \crefname@preamble{remark}{Bem\ae rkning}{Bem\ae rkninger}% \crefname@preamble{note}{Note}{Noter}% \crefname@preamble{algorithm}{Algoritme}{Algoritmer}% \crefname@preamble{line}{Linje}{Linjer}% % \else% \crefname@preamble{equation}{ligning}{ligninger}% \crefname@preamble{figure}{figur}{figurer}% \crefname@preamble{table}{tabel}{tabeller}% \crefname@preamble{page}{side}{sider}% \crefname@preamble{part}{del}{dele}% \crefname@preamble{chapter}{kapitel}{kapitler}% \crefname@preamble{section}{afsnit}{afsnit}% \crefname@preamble{appendix}{appendiks}{appendiks}% \crefname@preamble{enumi}{punkt}{punkter}% \crefname@preamble{footnote}{fodnote}{fodnoter}% \crefname@preamble{theorem}{teorem}{teoremer}% \crefname@preamble{lemma}{lemma}{lemma}% \crefname@preamble{corollary}{f\o lgeslutning}{f\o lgeslutninger}% \crefname@preamble{proposition}{udsagn}{udsagn}% \crefname@preamble{definition}{definition}{definitioner}% \crefname@preamble{result}{resultat}{resultater}% \crefname@preamble{example}{eksempel}{eksempler}% \crefname@preamble{remark}{bem\ae rkning}{bem\ae rkninger}% \crefname@preamble{note}{note}{noter}% \crefname@preamble{algorithm}{algoritme}{algoritmer}% \crefname@preamble{line}{linje}{linjer}% \fi% \def\cref@language{danish}% % \end{macrocode} % % Next, we add the definitions to \cmd{\extras}\dots{} so that % \package{babel}'s \cmd{\selectlanguage} command will change the format % appropriately. % \begin{macrocode} \cref@addto\extrasdanish{% \renewcommand{\crefrangeconjunction@preamble}{ til\nobreakspace}% \renewcommand\crefrangepreconjunction@preamble{}% \renewcommand\crefrangepostconjunction@preamble{}% \renewcommand{\crefpairconjunction@preamble}{ og\nobreakspace}% \renewcommand{\crefmiddleconjunction@preamble}{, }% \renewcommand{\creflastconjunction@preamble}{ og\nobreakspace}% \renewcommand{\crefpairgroupconjunction@preamble}{ og\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction@preamble}{, }% \renewcommand{\creflastgroupconjunction@preamble}{ og\nobreakspace}% % \Crefname{equation}{Ligning}{Ligninger}% \Crefname{figure}{Figur}{Figurer}% \Crefname{subfigure}{Figur}{Figurer}% \Crefname{table}{Tabel}{Tabeller}% \Crefname{subtable}{Tabel}{Tabeller}% \Crefname{page}{Side}{Sider}% \Crefname{part}{Del}{Dele}% \Crefname{chapter}{Kapitel}{Kapitler}% \Crefname{section}{Afsnit}{Afsnit}% \Crefname{subsection}{Afsnit}{Afsnit}% \Crefname{subsubsection}{Afsnit}{Afsnit}% \Crefname{appendix}{Appendiks}{Appendiks}% \Crefname{subappendix}{Appendiks}{Appendiks}% \Crefname{subsubappendix}{Appendiks}{Appendiks}% \Crefname{subsubsubappendix}{Appendiks}{Appendiks}% \Crefname{enumi}{Punkt}{Punkter}% \Crefname{enumii}{Punkt}{Punkter}% \Crefname{enumiii}{Punkt}{Punkter}% \Crefname{enumiv}{Punkt}{Punkter}% \Crefname{enumv}{Punkt}{Punkter}% \Crefname{footnote}{Fodnote}{Fodnoter}% \Crefname{theorem}{Teorem}{Teoremer}% \Crefname{lemma}{Lemma}{Lemma}% \Crefname{corollary}{F\o lgeslutning}{F\o lgeslutninger}% \Crefname{proposition}{Udsagn}{Udsagn}% \Crefname{definition}{Definition}{Definitioner}% \Crefname{result}{Resultat}{Resultater}% \Crefname{example}{Eksempel}{Eksempler}% \Crefname{remark}{Bem\ae rkning}{Bem\ae rkninger}% \Crefname{note}{Note}{Noter}% \Crefname{algorithm}{Algoritme}{Algoritmer}% \Crefname{line}{Linje}{Linjer}% % \if@cref@capitalise% \crefname{equation}{Ligning}{Ligninger}% \crefname{figure}{Figur}{Figurer}% \crefname{subfigure}{Figur}{Figurer}% \crefname{table}{Tabel}{Tabeller}% \crefname{subtable}{Tabel}{Tabeller}% \crefname{page}{Side}{Sider}% \crefname{part}{Del}{Dele}% \crefname{chapter}{Kapitel}{Kapitler}% \crefname{section}{Afsnit}{Afsnit}% \crefname{subsection}{Afsnit}{Afsnit}% \crefname{subsubsection}{Afsnit}{Afsnit}% \crefname{appendix}{Appendiks}{Appendiks}% \crefname{subappendix}{Appendiks}{Appendiks}% \crefname{subsubappendix}{Appendiks}{Appendiks}% \crefname{subsubsubappendix}{Appendiks}{Appendiks}% \crefname{enumi}{Punkt}{Punkter}% \crefname{enumii}{Punkt}{Punkter}% \crefname{enumiii}{Punkt}{Punkter}% \crefname{enumiv}{Punkt}{Punkter}% \crefname{enumv}{Punkt}{Punkter}% \crefname{footnote}{Fodnote}{Fodnoter}% \crefname{theorem}{Teorem}{Teoremer}% \crefname{lemma}{Lemma}{Lemma}% \crefname{corollary}{F\o lgeslutning}{F\o lgeslutninger}% \crefname{proposition}{Udsagn}{Udsagn}% \crefname{definition}{Definition}{Definitioner}% \crefname{result}{Resultat}{Resultater}% \crefname{example}{Eksempel}{Eksempler}% \crefname{remark}{Bem\ae rkning}{Bem\ae rkninger}% \crefname{note}{Note}{Noter}% \crefname{algorithm}{Algoritme}{Algoritmer}% \crefname{line}{Linje}{Linjer}% % \else% \crefname{equation}{ligning}{ligninger}% \crefname{figure}{figur}{figurer}% \crefname{subfigure}{figur}{figurer}% \crefname{table}{tabel}{tabeller}% \crefname{subtable}{tabel}{tabeller}% \crefname{page}{side}{sider}% \crefname{part}{del}{dele}% \crefname{chapter}{kapitel}{kapitler}% \crefname{section}{afsnit}{afsnit}% \crefname{subsection}{afsnit}{afsnit}% \crefname{subsubsection}{afsnit}{afsnit}% \crefname{appendix}{appendiks}{appendiks}% \crefname{subappendix}{appendiks}{appendiks}% \crefname{subsubappendix}{appendiks}{appendiks}% \crefname{subsubsubappendix}{appendiks}{appendiks}% \crefname{enumi}{punkt}{punkter}% \crefname{enumii}{punkt}{punkter}% \crefname{enumiii}{punkt}{punkter}% \crefname{enumiv}{punkt}{punkter}% \crefname{enumv}{punkt}{punkter}% \crefname{footnote}{fodnote}{fodnoter}% \crefname{theorem}{teorem}{teoremer}% \crefname{lemma}{lemma}{lemma}% \crefname{corollary}{f\o lgeslutning}{f\o lgeslutninger}% \crefname{proposition}{udsagn}{udsagn}% \crefname{definition}{definition}{definitioner}% \crefname{result}{resultat}{resultater}% \crefname{example}{eksempel}{eksempler}% \crefname{remark}{bem\ae rkning}{bem\ae rkninger}% \crefname{note}{note}{noter}% \crefname{algorithm}{algoritme}{algoritmer}% \crefname{line}{linje}{linjer}% \fi% }}} % \end{macrocode} % % % \subsubsection{Esperanto} % \begin{macro}{esperanto} % Esperanto translations courtesy of Johannes Mueller. % \end{macro} % \begin{macrocode} \DeclareOption{esperanto}{% \PackageInfo{cleveref}{loaded `esperanto' language definitions} \AtBeginDocument{% \def\crefrangeconjunction@preamble{ \^gis\nobreakspace}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ kaj\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ kaj\nobreakspace}% \def\crefpairgroupconjunction@preamble{ kaj\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble{ kaj\nobreakspace}% % \Crefname@preamble{equation}{Ekvacio}{Ekvacioj}% \Crefname@preamble{part}{Parto}{Partoj}% \Crefname@preamble{chapter}{\^Capitro}{\^Capitroj}% \Crefname@preamble{section}{Sekcio}{Sekcioj}% \Crefname@preamble{appendix}{Aldono}{Aldonoj}% \Crefname@preamble{enumi}{Punkto}{Punktoj}% \Crefname@preamble{footnote}{Piednoto}{Piednotoj}% \Crefname@preamble{figure}{Figuro}{Figuroj}% \Crefname@preamble{table}{Tabelo}{Tabeloj}% \Crefname@preamble{theorem}{Teoremo}{Teoremoj}% \Crefname@preamble{lemma}{Lemo}{Lemoj}% \Crefname@preamble{corollary}{Korolario}{Korolarioj}% \Crefname@preamble{proposition}{Propozicio}{Propozicioj}% \Crefname@preamble{definition}{Defino}{Definoj}% \Crefname@preamble{result}{Rezulto}{Rezultoj}% \Crefname@preamble{example}{Ekzemplo}{Ekzemploj}% \Crefname@preamble{remark}{Rimarko}{Rimarkoj}% \Crefname@preamble{note}{Noto}{Notoj}% \Crefname@preamble{algorithm}{Algoritmo}{Algoritmoj}% \Crefname@preamble{listing}{Listado}{Listadoj}% \Crefname@preamble{line}{Linio}{Linioj}% % \if@cref@capitalise% \crefname@preamble{equation}{Ekvacio}{Ekvacioj}% \crefname@preamble{part}{Parto}{Partoj}% \crefname@preamble{chapter}{\^Capitro}{\^Capitroj}% \crefname@preamble{section}{Sekcio}{Sekcioj}% \crefname@preamble{appendix}{Aldono}{Aldonoj}% \crefname@preamble{enumi}{Punkto}{Punktoj}% \crefname@preamble{footnote}{Piednoto}{Piednotoj}% \crefname@preamble{figure}{Figuro}{Figuroj}% \crefname@preamble{table}{Tabelo}{Tabeloj}% \crefname@preamble{theorem}{Teoremo}{Teoremoj}% \crefname@preamble{lemma}{Lemo}{Lemoj}% \crefname@preamble{corollary}{Korolario}{Korolarioj}% \crefname@preamble{proposition}{Propozicio}{Propozicioj}% \crefname@preamble{definition}{Defino}{Definoj}% \crefname@preamble{result}{Rezulto}{Rezultoj}% \crefname@preamble{example}{Ekzemplo}{Ekzemploj}% \crefname@preamble{remark}{Rimarko}{Rimarkoj}% \crefname@preamble{note}{Noto}{Notoj}% \crefname@preamble{algorithm}{Algoritmo}{Algoritmoj}% \crefname@preamble{listing}{Listado}{Listadoj}% \crefname@preamble{line}{Linio}{Linioj}% % \else% \crefname@preamble{equation}{ekvacio}{ekvacioj}% \crefname@preamble{part}{parto}{partoj}% \crefname@preamble{chapter}{\^capitro}{\^capitroj}% \crefname@preamble{section}{sekcio}{sekcioj}% \crefname@preamble{appendix}{aldono}{aldonoj}% \crefname@preamble{enumi}{punkto}{punktoj}% \crefname@preamble{footnote}{piednoto}{piednotoj}% \crefname@preamble{figure}{figuro}{figuroj}% \crefname@preamble{table}{tabelo}{tabeloj}% \crefname@preamble{theorem}{teoremo}{teoremoj}% \crefname@preamble{lemma}{lemo}{lemoj}% \crefname@preamble{corollary}{korolario}{korolarioj}% \crefname@preamble{proposition}{propozicio}{propozicioj}% \crefname@preamble{definition}{defino}{definoj}% \crefname@preamble{result}{rezulto}{rezultoj}% \crefname@preamble{example}{ekzemplo}{ekzemploj}% \crefname@preamble{remark}{rimarko}{rimarkoj}% \crefname@preamble{note}{noto}{notoj}% \crefname@preamble{algorithm}{algoritmo}{algoritmoj}% \crefname@preamble{listing}{listado}{listadoj}% \crefname@preamble{line}{linio}{linioj}% \fi% \def\cref@language{esperanto}% % \cref@addto\extrasesperanto{% \renewcommand{\crefrangeconjunction}{ \^gis\nobreakspace}% \renewcommand{\crefrangepreconjunction}{}% \renewcommand{\crefrangepostconjunction}{}% \renewcommand{\crefpairconjunction}{ kaj\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ kaj\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ kaj\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}{ kaj\nobreakspace}% % \Crefname{equation}{Ekvacio}{Ekvacioj}% \Crefname{part}{Parto}{Partoj}% \Crefname{chapter}{\^Capitro}{\^Capitroj}% \Crefname{section}{Sekcio}{Sekcioj}% \Crefname{appendix}{Aldono}{Aldonoj}% \Crefname{enumi}{Punkto}{Punktoj}% \Crefname{footnote}{Piednoto}{Piednotoj}% \Crefname{figure}{Figuro}{Figuroj}% \Crefname{table}{Tabelo}{Tabeloj}% \Crefname{theorem}{Teoremo}{Teoremoj}% \Crefname{lemma}{Lemo}{Lemoj}% \Crefname{corollary}{Korolario}{Korolarioj}% \Crefname{proposition}{Propozicio}{Propozicioj}% \Crefname{definition}{Defino}{Definoj}% \Crefname{result}{Rezulto}{Rezultoj}% \Crefname{example}{Ekzemplo}{Ekzemploj}% \Crefname{remark}{Rimarko}{Rimarkoj}% \Crefname{note}{Noto}{Notoj}% \Crefname{algorithm}{Algoritmo}{Algoritmoj}% \Crefname{listing}{Listado}{Listadoj}% \Crefname{line}{Linio}{Linioj}% % \if@cref@capitalise% \crefname{equation}{Ekvacio}{Ekvacioj}% \crefname{part}{Parto}{Partoj}% \crefname{chapter}{\^Capitro}{\^Capitroj}% \crefname{section}{Sekcio}{Sekcioj}% \crefname{appendix}{Aldono}{Aldonoj}% \crefname{enumi}{Punkto}{Punktoj}% \crefname{footnote}{Piednoto}{Piednotoj}% \crefname{figure}{Figuro}{Figuroj}% \crefname{table}{Tabelo}{Tabeloj}% \crefname{theorem}{Teoremo}{Teoremoj}% \crefname{lemma}{Lemo}{Lemoj}% \crefname{corollary}{Korolario}{Korolarioj}% \crefname{proposition}{Propozicio}{Propozicioj}% \crefname{definition}{Defino}{Definoj}% \crefname{result}{Rezulto}{Rezultoj}% \crefname{example}{Ekzemplo}{Ekzemploj}% \crefname{remark}{Rimarko}{Rimarkoj}% \crefname{note}{Noto}{Notoj}% \crefname{algorithm}{Algoritmo}{Algoritmoj}% \crefname{listing}{Listado}{Listadoj}% \crefname{line}{Linio}{Linioj}% % \else% \crefname{equation}{ekvacio}{ekvacioj}% \crefname{part}{parto}{partoj}% \crefname{chapter}{\^capitro}{\^capitroj}% \crefname{section}{sekcio}{sekcioj}% \crefname{appendix}{aldono}{aldonoj}% \crefname{enumi}{punkto}{punktoj}% \crefname{footnote}{piednoto}{piednotoj}% \crefname{figure}{figuro}{figuroj}% \crefname{table}{tabelo}{tabeloj}% \crefname{theorem}{teoremo}{teoremoj}% \crefname{lemma}{lemo}{lemoj}% \crefname{corollary}{korolario}{korolarioj}% \crefname{proposition}{propozicio}{propozicioj}% \crefname{definition}{defino}{definoj}% \crefname{result}{rezulto}{rezultoj}% \crefname{example}{ekzemplo}{ekzemploj}% \crefname{remark}{rimarko}{rimarkoj}% \crefname{note}{noto}{notoj}% \crefname{algorithm}{algoritmo}{algoritmoj}% \crefname{listing}{listado}{listadoj}% \crefname{line}{linio}{linioj}% \fi% }}} % \end{macrocode} % % % % \subsection{Default Cross-Reference Formats} % \label{sec:code:default_formats} % The \option{capitalise} and \option{nameinlink} options must be % processed before we process any language options and define the default % formats, so that they take effect in the default format definitions. % Therefore, we have to manually check whether they're present, and force % processing of those 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% \@expandtwoargs\in@{,nameinlink,}{% ,\@classoptionslist,\@curroptions,}% \ifin@% \ExecuteOptions{nameinlink}% \fi% % \end{macrocode} % % % \begin{macro}{\crefdefaultlabelformat} % \begin{macro}{\creflabelformat} % 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 parentheses. % However, if the \option{nameinlink} option is enabled, the end of the % hyperlink must come outside the group or it will cause \LaTeX{} % grouping errors, so we must define it differently in that case. % \begin{macrocode} \crefdefaultlabelformat{#2#1#3} \if@cref@nameinlink% \creflabelformat{equation}{#2\textup{(#1)}#3}% \else% \creflabelformat{equation}{\textup{(#2#1#3)}}% \fi \@labelcrefdefinedefaultformats % \end{macrocode} % \end{macro} % \end{macro} % % % Set up the default English format definitions, then process options in % the order they were supplied. % \begin{macrocode} \ExecuteOptions{english} \ProcessOptions*\relax % \end{macrocode} % % % Define the component-derived formats. % \begin{macrocode} \AtBeginDocument{% % \end{macrocode} % Use whatever's in the \dots|@preamble| definitions at the beginning of % the document to set up the default cross-reference names, unless % overridden by explicit definitions. % \begin{macrocode} \edef\@tempa{% \expandafter\noexpand\csname extras\cref@language\endcsname}% \@ifundefined{crefrangeconjunction}{% \let\crefrangeconjunction\crefrangeconjunction@preamble% }{% \expandafter\def\expandafter\@tempb\expandafter{% \expandafter\renewcommand\expandafter% {\expandafter\crefrangeconjunction\expandafter}% \expandafter{\crefrangeconjunction}}% \expandafter\expandafter\expandafter\cref@addto% \expandafter\@tempa\expandafter{\@tempb}% }% \@ifundefined{crefrangepreconjunction}{% \let\crefrangepreconjunction\crefrangepreconjunction@preamble% }{% \expandafter\def\expandafter\@tempb\expandafter{% \expandafter\renewcommand\expandafter% {\expandafter\crefrangepreconjunction\expandafter}% \expandafter{\crefrangepreconjunction}}% \expandafter\expandafter\expandafter\cref@addto% \expandafter\@tempa\expandafter{\@tempb}% }% \@ifundefined{crefrangepostconjunction}{% \let\crefrangepostconjunction\crefrangepostconjunction@preamble% }{% \expandafter\def\expandafter\@tempb\expandafter{% \expandafter\renewcommand\expandafter% {\expandafter\crefrangepostconjunction\expandafter}% \expandafter{\crefrangepostconjunction}}% \expandafter\expandafter\expandafter\cref@addto% \expandafter\@tempa\expandafter{\@tempb}% }% % \end{macrocode} % If the group conjunctions haven't been defined, but explicit % definitions \emph{have} been given for the reference list conjunctions, % define the group conjunctions to be identical to the reference % conjunctions. % \begin{macrocode} \@ifundefined{crefpairconjunction}{% \let\crefpairconjunction\crefpairconjunction@preamble% }{% \expandafter\def\expandafter\@tempb\expandafter{% \expandafter\renewcommand\expandafter% {\expandafter\crefpairconjunction\expandafter}% \expandafter{\crefpairconjunction}}% \expandafter\expandafter\expandafter\cref@addto% \expandafter\@tempa\expandafter{\@tempb}% \@ifundefined{crefpairgroupconjunction}{% \let\crefpairgroupconjunction\crefpairconjunction}{}% }% \@ifundefined{crefmiddleconjunction}{% \let\crefmiddleconjunction\crefmiddleconjunction@preamble% }{% \expandafter\def\expandafter\@tempb\expandafter{% \expandafter\renewcommand\expandafter% {\expandafter\crefmiddleconjunction\expandafter}% \expandafter{\crefmiddleconjunction}}% \expandafter\expandafter\expandafter\cref@addto% \expandafter\@tempa\expandafter{\@tempb}% \@ifundefined{crefmiddlegroupconjunction}{% \let\crefmiddlegroupconjunction\crefmiddleconjunction}{}% }% \@ifundefined{creflastconjunction}{% \let\creflastconjunction\creflastconjunction@preamble% }{% \expandafter\def\expandafter\@tempb\expandafter{% \expandafter\renewcommand\expandafter% {\expandafter\creflastconjunction\expandafter}% \expandafter{\creflastconjunction}}% \expandafter\expandafter\expandafter\cref@addto% \expandafter\@tempa\expandafter{\@tempb}% % \end{macrocode} % Define the last group conjunction to include an extra comma. % \begin{macrocode} \@ifundefined{creflastgroupconjunction}{% \edef\creflastgroupconjunction{, \creflastconjunction}}{}% }% \@ifundefined{crefpairgroupconjunction}{% \let\crefpairgroupconjunction% \crefpairgroupconjunction@preamble% }{% \expandafter\def\expandafter\@tempb\expandafter{% \expandafter\renewcommand\expandafter% {\expandafter\crefpairgroupconjunction\expandafter}% \expandafter{\crefpairgroupconjunction}}% \expandafter\expandafter\expandafter\cref@addto% \expandafter\@tempa\expandafter{\@tempb}% }% \@ifundefined{crefmiddlegroupconjunction}{% \let\crefmiddlegroupconjunction% \crefmiddlegroupconjunction@preamble% }{% \expandafter\def\expandafter\@tempb\expandafter{% \expandafter\renewcommand\expandafter% {\expandafter\crefmiddlegroupconjunction\expandafter}% \expandafter{\crefmiddlegroupconjunction}}% \expandafter\expandafter\expandafter\cref@addto% \expandafter\@tempa\expandafter{\@tempb}% }% \@ifundefined{creflastgroupconjunction}{% \let\creflastgroupconjunction% \creflastgroupconjunction@preamble% }{% \expandafter\def\expandafter\@tempb\expandafter{% \expandafter\renewcommand\expandafter% {\expandafter\creflastgroupconjunction\expandafter}% \expandafter{\creflastgroupconjunction}}% \expandafter\expandafter\expandafter\cref@addto% \expandafter\@tempa\expandafter{\@tempb}% }% % \end{macrocode} % % Define any undefined formats listed in \cmd{\cref@label@types} using % the components. % \begin{macrocode} \let\@tempstack\cref@label@types% \cref@isstackfull{\@tempstack}% \@whilesw\if@cref@stackfull\fi{% \edef\@tempa{\cref@stack@top{\@tempstack}}% \@ifundefined{cref@\@tempa @name}{% \expandafter\def\expandafter\@tempb\expandafter{% \csname cref@\@tempa @name\endcsname}% \expandafter\def\expandafter\@tempc\expandafter{% \csname cref@\@tempa @name@preamble\endcsname}% \expandafter\expandafter\expandafter% \let\expandafter\@tempb\@tempc% \expandafter\def\expandafter\@tempb\expandafter{% \csname cref@\@tempa @name@plural\endcsname}% \expandafter\def\expandafter\@tempc\expandafter{% \csname cref@\@tempa @name@plural@preamble\endcsname}% \expandafter\expandafter\expandafter% \let\expandafter\@tempb\@tempc% }{% \edef\@tempb{% \expandafter\noexpand\csname extras\cref@language\endcsname}% \expandafter\def\expandafter\@tempc\expandafter{% \expandafter\crefname\expandafter{\@tempa}}% \expandafter\expandafter\expandafter\cref@addto% \expandafter\expandafter\expandafter\@tempc% \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter{% \csname cref@\@tempa @name\endcsname}}% \expandafter\expandafter\expandafter\cref@addto% \expandafter\expandafter\expandafter\@tempc% \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter{% \csname cref@\@tempa @name@plural\endcsname}}% \expandafter\expandafter\expandafter\cref@addto% \expandafter\@tempb\expandafter{\@tempc}% }% \@ifundefined{Cref@\@tempa @name}{% \expandafter\def\expandafter\@tempb\expandafter{% \csname Cref@\@tempa @name\endcsname}% \expandafter\def\expandafter\@tempc\expandafter{% \csname Cref@\@tempa @name@preamble\endcsname}% \expandafter\expandafter\expandafter% \let\expandafter\@tempb\@tempc% \expandafter\def\expandafter\@tempb\expandafter{% \csname Cref@\@tempa @name@plural\endcsname}% \expandafter\def\expandafter\@tempc\expandafter{% \csname Cref@\@tempa @name@plural@preamble\endcsname}% \expandafter\expandafter\expandafter% \let\expandafter\@tempb\@tempc% }{% \edef\@tempb{% \expandafter\noexpand\csname extras\cref@language\endcsname}% \expandafter\def\expandafter\@tempc\expandafter{% \expandafter\Crefname\expandafter{\@tempa}}% \expandafter\expandafter\expandafter\cref@addto% \expandafter\expandafter\expandafter\@tempc% \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter{% \csname Cref@\@tempa @name\endcsname}}% \expandafter\expandafter\expandafter\cref@addto% \expandafter\expandafter\expandafter\@tempc% \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter{% \csname Cref@\@tempa @name@plural\endcsname}}% \expandafter\expandafter\expandafter\cref@addto% \expandafter\@tempb\expandafter{\@tempc}% }% % \end{macrocode} % We only define the reference-range and multi-reference formats if the % plural form of the name is defined in the corresponding % \cmd{\cref\meta{type}@name@plural}. Though \cmd{\crefname} and % \cmd{\Crefname} always define both the singular and plural forms % together, cross-reference names can also be defined automatically by % \cmd{\newtheorem}, which can only define the singular form. In this % case, the singular form might be defined whilst the plural form is % undefined. For symmetry, we apply the same logic to the normal % cross-reference format definition (only defining it if % \cmd{\cref\meta{type}@name} is defined), though currently this should % always be the case. % \begin{macrocode} \@ifundefined{cref@\@tempa @format}{% \@ifundefined{cref@\@tempa @name}{}{% \expandafter\@crefdefineformat\expandafter{\@tempa}}}{}% \@ifundefined{crefrange@\@tempa @format}{% \@ifundefined{cref@\@tempa @name@plural}{}{% \expandafter\@crefrangedefineformat\expandafter{\@tempa}}}{}% \@ifundefined{cref@\@tempa @format@first}{% \@ifundefined{cref@\@tempa @name@plural}{}{% \expandafter\@crefdefinemultiformat\expandafter{\@tempa}}}{}% \@ifundefined{crefrange@\@tempa @format@first}{% \@ifundefined{cref@\@tempa @name@plural}{}{% \expandafter\@crefrangedefinemultiformat% \expandafter{\@tempa}}}{}% \cref@stack@pop{\@tempstack}% \cref@isstackfull{\@tempstack}}% % \end{macrocode} % % If formats for subsections are undefined, define them to be identical % to the formats for sections. % \begin{macrocode} \@ifundefined{cref@subsection@name}{% \let\cref@subsection@name\cref@section@name% \let\cref@subsection@name@plural\cref@section@name@plural}{}% \@ifundefined{Cref@subsection@name}{% \let\Cref@subsection@name\Cref@section@name% \let\Cref@subsection@name@plural\Cref@section@name@plural}{}% \@ifundefined{cref@subsection@format}{% \let\cref@subsection@format\cref@section@format}{}% \@ifundefined{Cref@subsection@format}{% \let\Cref@subsection@format\Cref@section@format}{}% \@ifundefined{crefrange@subsection@format}{% \let\crefrange@subsection@format% \crefrange@section@format}{}% \@ifundefined{Crefrange@subsection@format}{% \let\Crefrange@subsection@format% \Crefrange@section@format}{}% \@ifundefined{cref@subsection@format@first}{% \let\cref@subsection@format@first% \cref@section@format@first}{}% \@ifundefined{Cref@subsection@format@first}{% \let\Cref@subsection@format@first% \Cref@section@format@first}{}% \@ifundefined{cref@subsection@format@second}{% \let\cref@subsection@format@second% \cref@section@format@second}{}% \@ifundefined{Cref@subsection@format@second}{% \let\Cref@subsection@format@second% \Cref@section@format@second}{}% \@ifundefined{cref@subsection@format@middle}{% \let\cref@subsection@format@middle% \cref@section@format@middle}{}% \@ifundefined{Cref@subsection@format@middle}{% \let\Cref@subsection@format@middle% \Cref@section@format@middle}{}% \@ifundefined{cref@subsection@format@last}{% \let\cref@subsection@format@last% \cref@section@format@last}{}% \@ifundefined{Cref@subsection@format@last}{% \let\Cref@subsection@format@last% \Cref@section@format@last}{}% \@ifundefined{crefrange@subsection@format@first}{% \let\crefrange@subsection@format@first% \crefrange@section@format@first}{}% \@ifundefined{Crefrange@subsection@format@first}{% \let\Crefrange@subsection@format@first% \Crefrange@section@format@first}{}% \@ifundefined{crefrange@subsection@format@second}{% \let\crefrange@subsection@format@second% \crefrange@section@format@second}{}% \@ifundefined{Crefrange@subsection@format@second}{% \let\Crefrange@subsection@format@second% \Crefrange@section@format@second}{}% \@ifundefined{crefrange@subsection@format@middle}{% \let\crefrange@subsection@format@middle% \crefrange@section@format@middle}{}% \@ifundefined{Crefrange@subsection@format@middle}{% \let\Crefrange@subsection@format@middle% \Crefrange@section@format@middle}{}% \@ifundefined{crefrange@subsection@format@last}{% \let\crefrange@subsection@format@last% \crefrange@section@format@last}{}% \@ifundefined{Crefrange@subsection@format@last}{% \let\Crefrange@subsection@format@last% \Crefrange@section@format@last}{}% % \@ifundefined{cref@subsubsection@name}{% \let\cref@subsubsection@name\cref@section@name% \let\cref@subsubsection@name@plural\cref@section@name@plural}{}% \@ifundefined{Cref@subsection@name}{% \let\Cref@subsection@name\Cref@section@name% \let\Cref@subsection@name@plural\Cref@section@name@plural}{}% \@ifundefined{cref@subsubsection@format}{% \let\cref@subsubsection@format% \cref@subsection@format}{}% \@ifundefined{Cref@subsubsection@format}{% \let\Cref@subsubsection@format% \Cref@subsection@format}{}% \@ifundefined{crefrange@subsubsection@format}{% \let\crefrange@subsubsection@format% \crefrange@subsection@format}{}% \@ifundefined{Crefrange@subsubsection@format}{% \let\Crefrange@subsubsection@format% \Crefrange@subsection@format}{}% \@ifundefined{cref@subsubsection@format@first}{% \let\cref@subsubsection@format@first% \cref@subsection@format@first}{}% \@ifundefined{Cref@subsubsection@format@first}{% \let\Cref@subsubsection@format@first% \Cref@subsection@format@first}{}% \@ifundefined{cref@subsubsection@format@second}{% \let\cref@subsubsection@format@second% \cref@subsection@format@second}{}% \@ifundefined{Cref@subsubsection@format@second}{% \let\Cref@subsubsection@format@second% \Cref@subsection@format@second}{}% \@ifundefined{cref@subsubsection@format@middle}{% \let\cref@subsubsection@format@middle% \cref@subsection@format@middle}{}% \@ifundefined{Cref@subsubsection@format@middle}{% \let\Cref@subsubsection@format@middle% \Cref@subsection@format@middle}{}% \@ifundefined{cref@subsubsection@format@last}{% \let\cref@subsubsection@format@last% \cref@subsection@format@last}{}% \@ifundefined{Cref@subsubsection@format@last}{% \let\Cref@subsubsection@format@last% \Cref@subsection@format@last}{}% \@ifundefined{crefrange@subsubsection@format@first}{% \let\crefrange@subsubsection@format@first% \crefrange@subsection@format@first}{}% \@ifundefined{Crefrange@subsubsection@format@first}{% \let\Crefrange@subsubsection@format@first% \Crefrange@subsection@format@first}{}% \@ifundefined{crefrange@subsubsection@format@second}{% \let\crefrange@subsubsection@format@second% \crefrange@subsection@format@second}{}% \@ifundefined{Crefrange@subsubsection@format@second}{% \let\Crefrange@subsubsection@format@second% \Crefrange@subsection@format@second}{}% \@ifundefined{crefrange@subsubsection@format@middle}{% \let\crefrange@subsubsection@format@middle% \crefrange@subsection@format@middle}{}% \@ifundefined{Crefrange@subsubsection@format@middle}{% \let\Crefrange@subsubsection@format@middle% \Crefrange@subsection@format@middle}{}% \@ifundefined{crefrange@subsubsection@format@last}{% \let\crefrange@subsubsection@format@last% \crefrange@subsection@format@last}{}% \@ifundefined{Crefrange@subsubsection@format@last}{% \let\Crefrange@subsubsection@format@last% \Crefrange@subsection@format@last}{}% % \end{macrocode} % Similarly for subsections within appendices. % \begin{macrocode} \@ifundefined{cref@subappendix@name}{% \let\cref@subappendix@name\cref@appendix@name% \let\cref@subappendix@name@plural% \cref@appendix@name@plural}{}% \@ifundefined{Cref@subappendix@name}{% \let\Cref@subappendix@name\Cref@section@name% \let\Cref@subappendixsection@name@plural% \Cref@appendix@name@plural}{}% \@ifundefined{cref@subappendix@format}{% \let\cref@subappendix@format\cref@appendix@format}{}% \@ifundefined{Cref@subappendix@format}{% \let\Cref@subappendix@format\Cref@appendix@format}{}% \@ifundefined{crefrange@subappendix@format}{% \let\crefrange@subappendix@format% \crefrange@appendix@format}{}% \@ifundefined{Crefrange@subappendix@format}{% \let\Crefrange@subappendix@format% \Crefrange@appendix@format}{}% \@ifundefined{cref@subappendix@format@first}{% \let\cref@subappendix@format@first% \cref@appendix@format@first}{}% \@ifundefined{Cref@subappendix@format@first}{% \let\Cref@subappendix@format@first% \Cref@appendix@format@first}{}% \@ifundefined{cref@subappendix@format@second}{% \let\cref@subappendix@format@second% \cref@appendix@format@second}{}% \@ifundefined{Cref@subappendix@format@second}{% \let\Cref@subappendix@format@second% \Cref@appendix@format@second}{}% \@ifundefined{cref@subappendix@format@middle}{% \let\cref@subappendix@format@middle% \cref@appendix@format@middle}{}% \@ifundefined{Cref@subappendix@format@middle}{% \let\Cref@subappendix@format@middle% \Cref@appendix@format@middle}{}% \@ifundefined{cref@subappendix@format@last}{% \let\cref@subappendix@format@last% \cref@appendix@format@last}{}% \@ifundefined{Cref@subappendix@format@last}{% \let\Cref@subappendix@format@last% \Cref@appendix@format@last}{}% \@ifundefined{crefrange@subappendix@format@first}{% \let\crefrange@subappendix@format@first% \crefrange@appendix@format@first}{}% \@ifundefined{Crefrange@subappendix@format@first}{% \let\Crefrange@subappendix@format@first% \Crefrange@appendix@format@first}{}% \@ifundefined{crefrange@subappendix@format@second}{% \let\crefrange@subappendix@format@second% \crefrange@appendix@format@second}{}% \@ifundefined{Crefrange@subappendix@format@second}{% \let\Crefrange@subappendix@format@second% \Crefrange@appendix@format@second}{}% \@ifundefined{crefrange@subappendix@format@middle}{% \let\crefrange@subappendix@format@middle% \crefrange@appendix@format@middle}{}% \@ifundefined{Crefrange@subappendix@format@middle}{% \let\Crefrange@subappendix@format@middle% \Crefrange@appendix@format@middle}{}% \@ifundefined{crefrange@subappendix@format@last}{% \let\crefrange@subappendix@format@last% \crefrange@appendix@format@last}{}% \@ifundefined{Crefrange@subappendix@format@last}{% \let\Crefrange@subappendix@format@last% \Crefrange@appendix@format@last}{}% % \@ifundefined{cref@subsubappendix@name}{% \let\cref@subsubappendix@name\cref@appendix@name% \let\cref@subsubappendix@name@plural% \cref@appendix@name@plural}{}% \@ifundefined{Cref@subsubappendix@name}{% \let\Cref@subsubappendix@name\Cref@section@name% \let\Cref@subsubappendixsection@name@plural% \Cref@appendix@name@plural}{}% \@ifundefined{cref@subsubappendix@format}{% \let\cref@subsubappendix@format% \cref@subappendix@format}{}% \@ifundefined{Cref@subsubappendix@format}{% \let\Cref@subsubappendix@format% \Cref@subappendix@format}{}% \@ifundefined{crefrange@subsubappendix@format}{% \let\crefrange@subsubappendix@format% \crefrange@subappendix@format}{}% \@ifundefined{Crefrange@subsubappendix@format}{% \let\Crefrange@subsubappendix@format% \Crefrange@subappendix@format}{}% \@ifundefined{cref@subsubappendix@format@first}{% \let\cref@subsubappendix@format@first% \cref@subappendix@format@first}{}% \@ifundefined{Cref@subsubappendix@format@first}{% \let\Cref@subsubappendix@format@first% \Cref@subappendix@format@first}{}% \@ifundefined{cref@subsubappendix@format@second}{% \let\cref@subsubappendix@format@second% \cref@subappendix@format@second}{}% \@ifundefined{Cref@subsubappendix@format@second}{% \let\Cref@subsubappendix@format@second% \Cref@subappendix@format@second}{}% \@ifundefined{cref@subsubappendix@format@middle}{% \let\cref@subsubappendix@format@middle% \cref@subappendix@format@middle}{}% \@ifundefined{Cref@subsubappendix@format@middle}{% \let\Cref@subsubappendix@format@middle% \Cref@subappendix@format@middle}{}% \@ifundefined{cref@subsubappendix@format@last}{% \let\cref@subsubappendix@format@last% \cref@subappendix@format@last}{}% \@ifundefined{Cref@subsubappendix@format@last}{% \let\Cref@subsubappendix@format@last% \Cref@subappendix@format@last}{}% \@ifundefined{crefrange@subsubappendix@format@first}{% \let\crefrange@subsubappendix@format@first% \crefrange@subappendix@format@first}{}% \@ifundefined{Crefrange@subsubappendix@format@first}{% \let\Crefrange@subsubappendix@format@first% \Crefrange@subappendix@format@first}{}% \@ifundefined{crefrange@subsubappendix@format@second}{% \let\crefrange@subsubappendix@format@second% \crefrange@subappendix@format@second}{}% \@ifundefined{Crefrange@subsubappendix@format@second}{% \let\Crefrange@subsubappendix@format@second% \Crefrange@subappendix@format@second}{}% \@ifundefined{crefrange@subsubappendix@format@middle}{% \let\crefrange@subsubappendix@format@middle% \crefrange@subappendix@format@middle}{}% \@ifundefined{Crefrange@subsubappendix@format@middle}{% \let\Crefrange@subsubappendix@format@middle% \Crefrange@subappendix@format@middle}{}% \@ifundefined{crefrange@subsubappendix@format@last}{% \let\crefrange@subsubappendix@format@last% \crefrange@subappendix@format@last}{}% \@ifundefined{Crefrange@subsubappendix@format@last}{% \let\Crefrange@subsubappendix@format@last% \Crefrange@subappendix@format@last}{}% % \@ifundefined{cref@subsubsubappendix@format}{% \let\cref@subsubsubappendix@format% \cref@subsubappendix@format}{}% \@ifundefined{Cref@subsubsubappendix@format}{% \let\Cref@subsubsubappendix@format% \Cref@subsubappendix@format}{}% \@ifundefined{crefrange@subsubsubappendix@format}{% \let\crefrange@subsubsubappendix@format% \crefrange@subsubappendix@format}{}% \@ifundefined{Crefrange@subsubsubappendix@format}{% \let\Crefrange@subsubsubappendix@format% \Crefrange@subsubappendix@format}{}% \@ifundefined{cref@subsubsubappendix@format@first}{% \let\cref@subsubsubappendix@format@first% \cref@subsubappendix@format@first}{}% \@ifundefined{Cref@subsubsubappendix@format@first}{% \let\Cref@subsubsubappendix@format@first% \Cref@subsubappendix@format@first}{}% \@ifundefined{cref@subsubsubappendix@format@second}{% \let\cref@subsubsubappendix@format@second% \cref@subsubappendix@format@second}{}% \@ifundefined{Cref@subsubsubappendix@format@second}{% \let\Cref@subsubsubappendix@format@second% \Cref@subsubappendix@format@second}{}% \@ifundefined{cref@subsubsubappendix@format@middle}{% \let\cref@subsubsubappendix@format@middle% \cref@subsubappendix@format@middle}{}% \@ifundefined{Cref@subsubsubappendix@format@middle}{% \let\Cref@subsubsubappendix@format@middle% \Cref@subsubappendix@format@middle}{}% \@ifundefined{cref@subsubsubappendix@format@last}{% \let\cref@subsubsubappendix@format@last% \cref@subsubappendix@format@last}{}% \@ifundefined{Cref@subsubsubappendix@format@last}{% \let\Cref@subsubsubappendix@format@last% \Cref@subsubappendix@format@last}{}% \@ifundefined{crefrange@subsubsubappendix@format@first}{% \let\crefrange@subsubsubappendix@format@first% \crefrange@subsubappendix@format@first}{}% \@ifundefined{Crefrange@subsubsubappendix@format@first}{% \let\Crefrange@subsubsubappendix@format@first% \Crefrange@subsubappendix@format@first}{}% \@ifundefined{crefrange@subsubsubappendix@format@second}{% \let\crefrange@subsubsubappendix@format@second% \crefrange@subsubappendix@format@second}{}% \@ifundefined{Crefrange@subsubsubappendix@format@second}{% \let\Crefrange@subsubsubappendix@format@second% \Crefrange@subsubappendix@format@second}{}% \@ifundefined{crefrange@subsubsubappendix@format@middle}{% \let\crefrange@subsubsubappendix@format@middle% \crefrange@subsubappendix@format@middle}{}% \@ifundefined{Crefrange@subsubsubappendix@format@middle}{% \let\Crefrange@subsubsubappendix@format@middle% \Crefrange@subsubappendix@format@middle}{}% \@ifundefined{crefrange@subsubsubappendix@format@last}{% \let\crefrange@subsubsubappendix@format@last% \crefrange@subsubappendix@format@last}{}% \@ifundefined{Crefrange@subsubsubappendix@format@last}{% \let\Crefrange@subsubsubappendix@format@last% \Crefrange@subsubappendix@format@last}{}% % \end{macrocode} % Ditto for subfigures and subtables. % \begin{macrocode} \@ifundefined{cref@subfigure@format}{% \let\cref@subfigure@format% \cref@figure@format}{}% \@ifundefined{Cref@subfigure@format}{% \let\Cref@subfigure@format% \Cref@figure@format}{}% \@ifundefined{crefrange@subfigure@format}{% \let\crefrange@subfigure@format% \crefrange@figure@format}{}% \@ifundefined{Crefrange@subfigure@format}{% \let\Crefrange@subfigure@format% \Crefrange@figure@format}{}% \@ifundefined{cref@subfigure@format@first}{% \let\cref@subfigure@format@first% \cref@figure@format@first}{}% \@ifundefined{Cref@subfigure@format@first}{% \let\Cref@subfigure@format@first% \Cref@figure@format@first}{}% \@ifundefined{cref@subfigure@format@second}{% \let\cref@subfigure@format@second% \cref@figure@format@second}{}% \@ifundefined{Cref@subfigure@format@second}{% \let\Cref@subfigure@format@second% \Cref@figure@format@second}{}% \@ifundefined{cref@subfigure@format@middle}{% \let\cref@subfigure@format@middle% \cref@figure@format@middle}{}% \@ifundefined{Cref@subfigure@format@middle}{% \let\Cref@subfigure@format@middle% \Cref@figure@format@middle}{}% \@ifundefined{cref@subfigure@format@last}{% \let\cref@subfigure@format@last% \cref@figure@format@last}{}% \@ifundefined{Cref@subfigure@format@last}{% \let\Cref@subfigure@format@last% \Cref@figure@format@last}{}% \@ifundefined{crefrange@subfigure@format@first}{% \let\crefrange@subfigure@format@first% \crefrange@figure@format@first}{}% \@ifundefined{Crefrange@subfigure@format@first}{% \let\Crefrange@subfigure@format@first% \Crefrange@figure@format@first}{}% \@ifundefined{crefrange@subfigure@format@second}{% \let\crefrange@subfigure@format@second% \crefrange@figure@format@second}{}% \@ifundefined{Crefrange@subfigure@format@second}{% \let\Crefrange@subfigure@format@second% \Crefrange@figure@format@second}{}% \@ifundefined{crefrange@subfigure@format@middle}{% \let\crefrange@subfigure@format@middle% \crefrange@figure@format@middle}{}% \@ifundefined{Crefrange@subfigure@format@middle}{% \let\Crefrange@subfigure@format@middle% \Crefrange@figure@format@middle}{}% \@ifundefined{crefrange@subfigure@format@last}{% \let\crefrange@subfigure@format@last% \crefrange@figure@format@last}{}% \@ifundefined{Crefrange@subfigure@format@last}{% \let\Crefrange@subfigure@format@last% \Crefrange@figure@format@last}{}% % \@ifundefined{cref@subtable@format}{% \let\cref@subtable@format% \cref@table@format}{}% \@ifundefined{Cref@subtable@format}{% \let\Cref@subtable@format% \Cref@table@format}{}% \@ifundefined{crefrange@subtable@format}{% \let\crefrange@subtable@format% \crefrange@table@format}{}% \@ifundefined{Crefrange@subtable@format}{% \let\Crefrange@subtable@format% \Crefrange@table@format}{}% \@ifundefined{cref@subtable@format@first}{% \let\cref@subtable@format@first% \cref@table@format@first}{}% \@ifundefined{Cref@subtable@format@first}{% \let\Cref@subtable@format@first% \Cref@table@format@first}{}% \@ifundefined{cref@subtable@format@second}{% \let\cref@subtable@format@second% \cref@table@format@second}{}% \@ifundefined{Cref@subtable@format@second}{% \let\Cref@subtable@format@second% \Cref@table@format@second}{}% \@ifundefined{cref@subtable@format@middle}{% \let\cref@subtable@format@middle% \cref@table@format@middle}{}% \@ifundefined{Cref@subtable@format@middle}{% \let\Cref@subtable@format@middle% \Cref@table@format@middle}{}% \@ifundefined{cref@subtable@format@last}{% \let\cref@subtable@format@last% \cref@table@format@last}{}% \@ifundefined{Cref@subtable@format@last}{% \let\Cref@subtable@format@last% \Cref@table@format@last}{}% \@ifundefined{crefrange@subtable@format@first}{% \let\crefrange@subtable@format@first% \crefrange@table@format@first}{}% \@ifundefined{Crefrange@subtable@format@first}{% \let\Crefrange@subtable@format@first% \Crefrange@table@format@first}{}% \@ifundefined{crefrange@subtable@format@second}{% \let\crefrange@subtable@format@second% \crefrange@table@format@second}{}% \@ifundefined{Crefrange@subtable@format@second}{% \let\Crefrange@subtable@format@second% \Crefrange@table@format@second}{}% \@ifundefined{crefrange@subtable@format@middle}{% \let\crefrange@subtable@format@middle% \crefrange@table@format@middle}{}% \@ifundefined{Crefrange@subtable@format@middle}{% \let\Crefrange@subtable@format@middle% \Crefrange@table@format@middle}{}% \@ifundefined{crefrange@subtable@format@last}{% \let\crefrange@subtable@format@last% \crefrange@table@format@last}{}% \@ifundefined{Crefrange@subtable@format@last}{% \let\Crefrange@subtable@format@last% \Crefrange@table@format@last}{}% % \end{macrocode} % Ditto for enums. % \begin{macrocode} \@ifundefined{cref@enumii@format}{% \let\cref@enumii@format% \cref@enumi@format}{}% \@ifundefined{Cref@enumii@format}{% \let\Cref@enumii@format% \Cref@enumi@format}{}% \@ifundefined{crefrange@enumii@format}{% \let\crefrange@enumii@format% \crefrange@enumi@format}{}% \@ifundefined{Crefrange@enumii@format}{% \let\Crefrange@enumii@format% \Crefrange@enumi@format}{}% \@ifundefined{cref@enumii@format@first}{% \let\cref@enumii@format@first% \cref@enumi@format@first}{}% \@ifundefined{Cref@enumii@format@first}{% \let\Cref@enumii@format@first% \Cref@enumi@format@first}{}% \@ifundefined{cref@enumii@format@second}{% \let\cref@enumii@format@second% \cref@enumi@format@second}{}% \@ifundefined{Cref@enumii@format@second}{% \let\Cref@enumii@format@second% \Cref@enumi@format@second}{}% \@ifundefined{cref@enumii@format@middle}{% \let\cref@enumii@format@middle% \cref@enumi@format@middle}{}% \@ifundefined{Cref@enumii@format@middle}{% \let\Cref@enumii@format@middle% \Cref@enumi@format@middle}{}% \@ifundefined{cref@enumii@format@last}{% \let\cref@enumii@format@last% \cref@enumi@format@last}{}% \@ifundefined{Cref@enumii@format@last}{% \let\Cref@enumii@format@last% \Cref@enumi@format@last}{}% \@ifundefined{crefrange@enumii@format@first}{% \let\crefrange@enumii@format@first% \crefrange@enumi@format@first}{}% \@ifundefined{Crefrange@enumii@format@first}{% \let\Crefrange@enumii@format@first% \Crefrange@enumi@format@first}{}% \@ifundefined{crefrange@enumii@format@second}{% \let\crefrange@enumii@format@second% \crefrange@enumi@format@second}{}% \@ifundefined{Crefrange@enumii@format@second}{% \let\Crefrange@enumii@format@second% \Crefrange@enumi@format@second}{}% \@ifundefined{crefrange@enumii@format@middle}{% \let\crefrange@enumii@format@middle% \crefrange@enumi@format@middle}{}% \@ifundefined{Crefrange@enumii@format@middle}{% \let\Crefrange@enumii@format@middle% \Crefrange@enumi@format@middle}{}% \@ifundefined{crefrange@enumii@format@last}{% \let\crefrange@enumii@format@last% \crefrange@enumi@format@last}{}% \@ifundefined{Crefrange@enumii@format@last}{% \let\Crefrange@enumii@format@last% \Crefrange@enumi@format@last}{}% % \@ifundefined{cref@enumiii@format}{% \let\cref@enumiii@format% \cref@enumii@format}{}% \@ifundefined{Cref@enumiii@format}{% \let\Cref@enumiii@format% \Cref@enumii@format}{}% \@ifundefined{crefrange@enumiii@format}{% \let\crefrange@enumiii@format% \crefrange@enumii@format}{}% \@ifundefined{Crefrange@enumiii@format}{% \let\Crefrange@enumiii@format% \Crefrange@enumii@format}{}% \@ifundefined{cref@enumiii@format@first}{% \let\cref@enumiii@format@first% \cref@enumii@format@first}{}% \@ifundefined{Cref@enumiii@format@first}{% \let\Cref@enumiii@format@first% \Cref@enumii@format@first}{}% \@ifundefined{cref@enumiii@format@second}{% \let\cref@enumiii@format@second% \cref@enumii@format@second}{}% \@ifundefined{Cref@enumiii@format@second}{% \let\Cref@enumiii@format@second% \Cref@enumii@format@second}{}% \@ifundefined{cref@enumiii@format@middle}{% \let\cref@enumiii@format@middle% \cref@enumii@format@middle}{}% \@ifundefined{Cref@enumiii@format@middle}{% \let\Cref@enumiii@format@middle% \Cref@enumii@format@middle}{}% \@ifundefined{cref@enumiii@format@last}{% \let\cref@enumiii@format@last% \cref@enumii@format@last}{}% \@ifundefined{Cref@enumiii@format@last}{% \let\Cref@enumiii@format@last% \Cref@enumii@format@last}{}% \@ifundefined{crefrange@enumiii@format@first}{% \let\crefrange@enumiii@format@first% \crefrange@enumii@format@first}{}% \@ifundefined{Crefrange@enumiii@format@first}{% \let\Crefrange@enumiii@format@first% \Crefrange@enumii@format@first}{}% \@ifundefined{crefrange@enumiii@format@second}{% \let\crefrange@enumiii@format@second% \crefrange@enumii@format@second}{}% \@ifundefined{Crefrange@enumiii@format@second}{% \let\Crefrange@enumiii@format@second% \Crefrange@enumii@format@second}{}% \@ifundefined{crefrange@enumiii@format@middle}{% \let\crefrange@enumiii@format@middle% \crefrange@enumii@format@middle}{}% \@ifundefined{Crefrange@enumiii@format@middle}{% \let\Crefrange@enumiii@format@middle% \Crefrange@enumii@format@middle}{}% \@ifundefined{crefrange@enumiii@format@last}{% \let\crefrange@enumiii@format@last% \crefrange@enumii@format@last}{}% \@ifundefined{Crefrange@enumiii@format@last}{% \let\Crefrange@enumiii@format@last% \Crefrange@enumii@format@last}{}% % \@ifundefined{cref@enumiv@format}{% \let\cref@enumiv@format% \cref@enumiii@format}{}% \@ifundefined{Cref@enumiv@format}{% \let\Cref@enumiv@format% \Cref@enumiii@format}{}% \@ifundefined{crefrange@enumiv@format}{% \let\crefrange@enumiv@format% \crefrange@enumiii@format}{}% \@ifundefined{Crefrange@enumiv@format}{% \let\Crefrange@enumiv@format% \Crefrange@enumiii@format}{}% \@ifundefined{cref@enumiv@format@first}{% \let\cref@enumiv@format@first% \cref@enumiii@format@first}{}% \@ifundefined{Cref@enumiv@format@first}{% \let\Cref@enumiv@format@first% \Cref@enumiii@format@first}{}% \@ifundefined{cref@enumiv@format@second}{% \let\cref@enumiv@format@second% \cref@enumiii@format@second}{}% \@ifundefined{Cref@enumiv@format@second}{% \let\Cref@enumiv@format@second% \Cref@enumiii@format@second}{}% \@ifundefined{cref@enumiv@format@middle}{% \let\cref@enumiv@format@middle% \cref@enumiii@format@middle}{}% \@ifundefined{Cref@enumiv@format@middle}{% \let\Cref@enumiv@format@middle% \Cref@enumiii@format@middle}{}% \@ifundefined{cref@enumiv@format@last}{% \let\cref@enumiv@format@last% \cref@enumiii@format@last}{}% \@ifundefined{Cref@enumiv@format@last}{% \let\Cref@enumiv@format@last% \Cref@enumiii@format@last}{}% \@ifundefined{crefrange@enumiv@format@first}{% \let\crefrange@enumiv@format@first% \crefrange@enumiii@format@first}{}% \@ifundefined{Crefrange@enumiv@format@first}{% \let\Crefrange@enumiv@format@first% \Crefrange@enumiii@format@first}{}% \@ifundefined{crefrange@enumiv@format@second}{% \let\crefrange@enumiv@format@second% \crefrange@enumiii@format@second}{}% \@ifundefined{Crefrange@enumiv@format@second}{% \let\Crefrange@enumiv@format@second% \Crefrange@enumiii@format@second}{}% \@ifundefined{crefrange@enumiv@format@middle}{% \let\crefrange@enumiv@format@middle% \crefrange@enumiii@format@middle}{}% \@ifundefined{Crefrange@enumiv@format@middle}{% \let\Crefrange@enumiv@format@middle% \Crefrange@enumiii@format@middle}{}% \@ifundefined{crefrange@enumiv@format@last}{% \let\crefrange@enumiv@format@last% \crefrange@enumiii@format@last}{}% \@ifundefined{Crefrange@enumiv@format@last}{% \let\Crefrange@enumiv@format@last% \Crefrange@enumiii@format@last}{}% % \@ifundefined{cref@enumv@format}{% \let\cref@enumv@format% \cref@enumiv@format}{}% \@ifundefined{Cref@enumv@format}{% \let\Cref@enumv@format% \Cref@enumiv@format}{}% \@ifundefined{crefrange@enumv@format}{% \let\crefrange@enumv@format% \crefrange@enumiv@format}{}% \@ifundefined{Crefrange@enumv@format}{% \let\Crefrange@enumv@format% \Crefrange@enumiv@format}{}% \@ifundefined{cref@enumv@format@first}{% \let\cref@enumv@format@first% \cref@enumiv@format@first}{}% \@ifundefined{Cref@enumv@format@first}{% \let\Cref@enumv@format@first% \Cref@enumiv@format@first}{}% \@ifundefined{cref@enumv@format@second}{% \let\cref@enumv@format@second% \cref@enumiv@format@second}{}% \@ifundefined{Cref@enumv@format@second}{% \let\Cref@enumv@format@second% \Cref@enumiv@format@second}{}% \@ifundefined{cref@enumv@format@middle}{% \let\cref@enumv@format@middle% \cref@enumiv@format@middle}{}% \@ifundefined{Cref@enumv@format@middle}{% \let\Cref@enumv@format@middle% \Cref@enumiv@format@middle}{}% \@ifundefined{cref@enumv@format@last}{% \let\cref@enumv@format@last% \cref@enumiv@format@last}{}% \@ifundefined{Cref@enumv@format@last}{% \let\Cref@enumv@format@last% \Cref@enumiv@format@last}{}% \@ifundefined{crefrange@enumv@format@first}{% \let\crefrange@enumv@format@first% \crefrange@enumiv@format@first}{}% \@ifundefined{Crefrange@enumv@format@first}{% \let\Crefrange@enumv@format@first% \Crefrange@enumiv@format@first}{}% \@ifundefined{crefrange@enumv@format@second}{% \let\crefrange@enumv@format@second% \crefrange@enumiv@format@second}{}% \@ifundefined{Crefrange@enumv@format@second}{% \let\Crefrange@enumv@format@second% \Crefrange@enumiv@format@second}{}% \@ifundefined{crefrange@enumv@format@middle}{% \let\crefrange@enumv@format@middle% \crefrange@enumiv@format@middle}{}% \@ifundefined{Crefrange@enumv@format@middle}{% \let\Crefrange@enumv@format@middle% \Crefrange@enumiv@format@middle}{}% \@ifundefined{crefrange@enumv@format@last}{% \let\crefrange@enumv@format@last% \crefrange@enumiv@format@last}{}% \@ifundefined{Crefrange@enumv@format@last}{% \let\Crefrange@enumv@format@last% \Crefrange@enumiv@format@last}{}% % \let\cref@language\relax% }% end of \AtBeginDocument % \end{macrocode} % % % % \subsection{\file{cleveref.cfg} Config File} % \begin{macro}{cleveref.cfg} % If \LaTeX{} can find a \file{cleveref.cfg} file in its search path, % then we read in whatever's in it. The intended use of % \file{cleveref.cfg} is to make it easy for authors to customise the % cross-reference formats for all their documents, without having to % manually include the definitions in every document preamble. In order % for these customisations to override the default formats, we input % \file{cleveref.cfg} right at the end, after the rest of % \package{cleveref} has loaded. % \begin{macrocode} \InputIfFileExists{cleveref.cfg}% {\PackageInfo{cleveref}{reading definitions from cleveref.cfg}}{} % \end{macrocode} % \end{macro} % % % % \Finale \endinput %% %% End of file `cleveref.dtx'. %%% Local Variables: %%% mode: doctex %%% TeX-command-default: "Make" %%% fill-column: 73 %%% TeX-master: t %%% End: