diff options
author | Karl Berry <karl@freefriends.org> | 2007-11-03 23:59:08 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2007-11-03 23:59:08 +0000 |
commit | 971d67d195a21a89798b1204d3fc7b8553a631d9 (patch) | |
tree | e796443ba276081cef7eb6d8c1684885441eb51c /Master/texmf-dist/source/latex/cleveref | |
parent | a335315e96e045d8d7fb154d641a61284234cbd7 (diff) |
cleveref update (1nov07)
git-svn-id: svn://tug.org/texlive/trunk@5329 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/cleveref')
-rw-r--r-- | Master/texmf-dist/source/latex/cleveref/cleveref.dtx | 2263 |
1 files changed, 1552 insertions, 711 deletions
diff --git a/Master/texmf-dist/source/latex/cleveref/cleveref.dtx b/Master/texmf-dist/source/latex/cleveref/cleveref.dtx index 0c5ddd3fa12..cbaec876b2e 100644 --- a/Master/texmf-dist/source/latex/cleveref/cleveref.dtx +++ b/Master/texmf-dist/source/latex/cleveref/cleveref.dtx @@ -21,18 +21,18 @@ % \iffalse %<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01] %<package>\ProvidesPackage{cleveref} -%<package> [2007/10/07 v0.8 Automatic cross-reference formatting] +%<package> [2007/30/10 v0.10 Automatic cross-reference formatting] % %<*driver> \documentclass{ltxdoc} %\documentclass[draft]{ltxdoc} \usepackage{url} +\usepackage{hyperref} \usepackage{cleveref} \EnableCrossrefs \CodelineIndex \RecordChanges -%%\newcomman{\package}[1]{\texttt{#1.sty}} -%\newcommand{\package}[1]{\texttt{#1}} +%%\newcommand{\package}[1]{\texttt{#1.sty}} \newcommand{\package}[1]{\texttt{#1}} \newcommand{\file}{\texttt} \newcommand{\option}{\texttt} @@ -60,7 +60,7 @@ %</driver> % \fi % -% \CheckSum{2163} +% \CheckSum{3165} %% \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 @@ -89,14 +89,25 @@ % starred versions of referencing commands for hyperref, allowed % multiple consecutive empty references in list to prevent range % collapsing, and fixed bugs. Phew!} +% \changes{v0.8.1}{2007/08/08}{Bug fixes.} +% \changes{v0.9}{2007/29/10}% +% {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/30/10}% +% {Allow optional argument to \\label to override reference +% type. Removed hyperref and ntheorem options; support for these and +% amsmath is enabled automatically if those packages are loaded.} % % % \GetFileInfo{cleveref.sty} % -% \def\fileversion{0.8} -% \def\filedate{10/07/2007} +% \def\fileversion{0.10} +% \def\filedate{30/10/2007} % -% \title{The \textsf{cleveref} package\thanks{This document +% \title{The \package{cleveref} package\thanks{This document % corresponds to \textsf{cleveref}~\fileversion, dated % \filedate.}} % \author{Toby Cubitt \\ \texttt{toby-cleveref@dr-qubit.org}} @@ -108,30 +119,27 @@ % The \package{cleveref} package enhances \LaTeX{}'s % cross-referencing features, allowing the format of references to % be determined automatically according to the type of reference -% (equation, section, etc.). The formatting for each reference type -% can be fully customised in the preamble of your document. In -% addition, \package{cleveref} can typeset references to lists of -% multiple labels, automatically formatting them according to their -% type, and collapsing sequences of numerically consecutive labels -% to a reference range. Again, the multiple-reference formatting is -% fully customisable. +% (equation, section, etc.) and the context in which the reference +% is used. The formatting for each reference type can be fully +% customised in the preamble of your document. In addition, +% \package{cleveref} can typeset references to lists of multiple +% labels, automatically formatting them according to their type, and +% collapsing sequences of numerically consecutive labels to a +% reference range. Again, the multiple-reference formatting is fully +% customisable. % \end{abstract} % % % % \section{Introduction} -% % When ``clever'' is used in the name of a computer program, it -% usually signifies that the programmer is overly smug! Or, to take a -% more charitable attitude, that the programmer is pleased with the -% sophisticated processing that he has managed to encapsulate in code, -% relieving the user of some complicated by tedious task. On the other -% hand, at the heart of the \LaTeX{} philosophy is the idea that it is -% clever to delegate as much of the typesetting as possible to the -% computer, in order to achieve a beautiful, but above all consistent, -% visual appearance. +% usually signifies that the programmer is overly smug about his +% achievements! On the other hand, at the heart of the \LaTeX{} +% philosophy is the idea that it is clever to delegate as much of the +% typesetting as possible to the computer, in order to achieve a +% beautiful, but above all consistent, visual appearance. % -% Both these points of view are valid with respect to the +% Both these points of view are probably valid when it comes to the % \package{cleveref} package. It's goals are two-fold: to use the % information that \LaTeX{} inherently has about labels as % intelligently as possible in order to type-set references to them @@ -140,24 +148,27 @@ % the minimum of effort (you'd be clever to use it!). % % The \package{cleveref} package enhances \LaTeX{}'s cross-referencing -% facility by allowing references to be formatted automatically +% facilities by allowing references to be formatted automatically % according to the type of object they refer to (chapter, section, -% equation, theorem, etc.). It can also automatically format -% references to multiple labels. +% equation, theorem, etc.) and the context in which the reference is +% used. It can also automatically format references to multiple +% labels, automatically collapsing references to consecutive labels +% into a reference range, and all kinds of other clever wizardry. % % In standard \LaTeX{}, you have almost certainly found yourself -% writing things like |Eq.~(\ref{eq1})| and |Theorem~\ref{thm1}| over -% and over again. This isn't just tedious. What happens if you later -% decide you want equation references to be typeset as -% |Equation~\ref{eq1}| instead? What happens if you decide to change -% the theorem labelled |thm1| into a lemma? You have to search through -% the entire \LaTeX{} source of your document, modifying all -% references to equations, or changing all references to |thm1|. -% -% \package{cleveref} allows you to define the format for references -% once-and-for-all in the preamble of your document. If you later -% decide to change the typesetting of equation references, you only -% have to change one preamble definition. If you later decide to +% writing things like |Eq.~(\ref{eq1})| and +% |Theorems~\ref{thm1} to~\ref{thm2}| 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? What happens if you decide to change the theorem labelled +% |thm1| into a lemma? You have to search through the entire \LaTeX{} +% source of your document, modifying all references to equations, or +% changing all references to |thm1|. +% +% The \package{cleveref} package allows you to define the format for +% references once-and-for-all in the preamble of your document. If you +% later decide to change the typesetting of equation references, you +% only have to change one preamble definition. If you later decide to % change a theorem into a lemma, you don't need to change any % references at all, because \package{cleveref} will automatically % typeset references to it using the appropriate formatting. This @@ -165,8 +176,8 @@ % whole document, as well as saving repetitively typing the same text % for each and every reference. % -% A number of other packages provide similar features, most notably -% \package{varioref}, \package{fancyref}, \package{hyperref}'s +% There are a number of other packages with similar goals, most +% notably \package{varioref}, \package{fancyref}, \package{hyperref}'s % |\autoref| command, and (for theorem-like environments) % \package{ntheorem} (with the \option{thref} option). (There are many % others, but these come closest to providing similar features to @@ -193,36 +204,35 @@ % significantly, it makes it impossible to typeset multiple references % automatically; you are back typesetting % |Eqs.~(\ref{eq1}) and~(\ref{eq2})| or -% |Eqs.~(\ref{eq1})--(\ref{eq3})| by hand. (Not to mention automatic -% collapsing of consecutive references, \package{ntheorem} support, or -% any of the other additional \package{cleveref} features.) -% -% The \package{hyperref} package's |\autoref| command typesets a -% (customisable) name before a reference, based on the reference -% type. This is less flexible than \package{cleveref}'s fully -% customisable reference formatting, but when combined with -% \package{varioref}, the two packages working together come -% close. However, even with \package{hyperref}, it is impossible to -% customise precisely which part of the reference is made into a -% hyper-link in PDF documents; this is very easy with -% \package{cleveref}. And it still remains impossible to typeset -% multiple references, have consecutive references collapsed, etc. +% |Eqs.~(\ref{eq1})--(\ref{eq3})| by hand. Not to mention missing out +% on automatic collapsing of consecutive references, +% \package{ntheorem} support, etc. +% +% The \package{hyperref} package's |\autoref| command typesets a name +% before a reference, determined by the reference type. This is less +% flexible than \package{cleveref}'s fully customisable reference +% formatting, but when combined with \package{varioref}, the two +% packages working together come close. However, even with +% \package{hyperref}, it is impossible to customise precisely which +% part of the reference is made into a hyper-link in PDF documents; +% this is very easy with \package{cleveref}. And it still remains +% impossible to typeset multiple references, have consecutive +% references collapsed, etc. % % The \package{ntheorem} package (with the \option{thref} option) does % things right\ldots except that it only works for theorem-like % environments. It is possible to use it for other environments, but % only in a bastardized form, by manually supplying an optional -% argument to |\label| commands telling it the label +% argument to |\label| commands that specifies the label % type. \package{cleveref} works equally well when referencing any -% type of object, as well as fully supporting -% \package{ntheorem}. \package{cleveref} also provides a number extra -% features too, such as multiple references, automatic collapsing of -% reference ranges, control over the placement of hyper-links, etc. +% type of object, as well as fully supporting \package{ntheorem}. And +% \package{cleveref} provides a number additional features, such as +% multiple references, automatic collapsing of reference ranges, +% control over the placement of hyper-links, etc. % % % % \section{Usage} -% % The \package{cleveref} package is loaded in the usual way, by % putting the line % \begin{quote} @@ -230,45 +240,50 @@ % \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}). -% -% -% -% \subsection{Typesetting References} -% +% \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, then here's what you need to do. Wherever you would +% previously have used |\ref|, use |\cref| instead. (Except that at +% the beginning of a sentence, 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 |\crefrange|: +% |\crefrange{eq1}{eq5}|. Finally, if you want to refer to multiple +% things at once, you can now combine them all into one reference and +% leave \package{cleveref} to sort it out: e.g.\ +% |\cref{eq1,eq2,eq4,thm2,def1}|. +% +% +% \section{Typesetting References} % \DescribeMacro\cref -% To automatically typeset a reference according to the type of object -% referred to, simply refer to it using |\cref{|\meta{label}|}|. -% \package{cleveref} imposes just one restriction on the names of -% labels: they are no longer allowed to contain commas ``,''. These -% can instead be used to typeset multiple references (see below). +% To automatically typeset a cross-reference according to the type of +% object referred to, simply refer to it using +% |\cref{|\meta{label}|}|. \package{cleveref} imposes just one extra +% restriction on the names of labels: they are no longer allowed to +% contain commas ``,''. These are instead used to typeset multiple +% references (see below). % % \DescribeMacro\Cref -% As it is very difficult for \LaTeX{} to determine whether a -% reference appears at the beginning of a sentence or not, a -% capitalised version exists: |\Cref{|\meta{label}|}|. By default, -% this typesets the reference with the first letter capitalised, -% though the formatting of the |\cref| and |\Cref| forms can be -% customised independently (see \cref{sec:customising}). +% 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 capitalised version exists: +% |\Cref{|\meta{label}|}|. By default, this typesets the reference +% with the first letter capitalised. (Though the formatting of the +% |\cref| and |\Cref| forms can be fully and independently customised, +% see \cref{sec:customising}.) % % \DescribeMacro\ref % \package{cleveref} does \emph{not} modify the standard |\ref| % command\footnote{This is not quite true. The original \cmd{\ref} % command no longer works when \package{cleveref} is loaded, so -% \package{cleveref} redefines it to recover the correct +% \package{cleveref} redefines it to recover the original % behaviour.}, so you can still use it to typeset the formatted -% label counter alone, without any additional text or formatting. If -% you would like to use \package{cleveref}'s enhanced features, but -% want to continue to use |\ref| for referencing, simply redefine the -% |\ref| command in your document's preamble, thus: -% \begin{quote} -% |\renewcommand{\ref}{\cref}| -% \end{quote} -% Similarly, if you decide you would like all references capitalised, -% you can redefine the |\cref| command: -% \begin{quote} -% |\renewcommand{\cref}{\Cref}| -% \end{quote} +% label counter alone, without any additional text or formatting. % % \DescribeMacro\crefrange % \DescribeMacro\Crefrange @@ -300,7 +315,7 @@ % \end{quote} % will be typeset as % \begin{quote} -% Eqs.~(1)--(3), and Theorems~1 and~2 +% eqs.~(1)--(3), and Theorems~1 and~2 % \end{quote} % whereas % \begin{quote} @@ -308,19 +323,20 @@ % \end{quote} % will be typeset as % \begin{quote} -% Eqs.~(1) and~(2), Theorems~1 and~2, and Eq.~(3) +% eqs.~(1) and~(2), Theorems~1 and~2, and Eq.~(3) % \end{quote} +% (assuming you haven't customised the reference formats). % % To prevent a sequence of consecutive references from being collapsed % to a reference range, you can separate the references in the list by -% one or more empty references, at the point where you want to prevent -% collapsing. For example, +% one or more empty references, at the point at which you want to +% prevent collapsing. For example, % \begin{quote} % |\cref{eq1,eq2,eq3,,eq4}| % \end{quote} % will be typeset as % \begin{quote} -% Eqs.~(1)--(3), and (4) +% eqs.~(1)--(3) and (4) % \end{quote} % or % \begin{quote} @@ -328,10 +344,10 @@ % \end{quote} % will be typeset as % \begin{quote} -% Eqs.~(1), (2), (3)--(5), and (6)--(7) +% eqs.~(1), (2), (3)--(5) and (6)--(7) % \end{quote} -% You can safely put an empty references between references that would -% never be collapsed anyway; they will simply be ignored. +% You can safely put an empty reference between references that would +% never be collapsed anyway; it will simply be ignored. % % \DescribeMacro{\cref*} % \DescribeMacro{\Cref*} @@ -345,17 +361,22 @@ % but without creating hyper-links. % % -% \subsection{Customising the Reference Formats} +% \section{Customising the Reference Format} % \label{sec:customising} -% -% \subsubsection{Single References} -% \label{sec:ref_format} % The \package{cleveref} package allows you to take full control of % the typesetting of references. Defaults appropriate for English -% documents are provided for the standard reference types. But if you -% don't like them, or are writing in a different language, or you are -% using an environment for which no default format is defined, you -% will need to define your own. +% documents are provided for the standard reference 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 used 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''.}. But if you don't like them, or are writing in a +% different language, or you need to cross-reference something for +% which no default format is defined, then you can take charge and +% define your own formats. % % If \package{cleveref} encounters a reference to a type it does not % know, it will produce a ``reference type undefined'' warning, and @@ -364,54 +385,234 @@ % {\bf ??}~|\ref{|\meta{label}|}| % \end{quote} % i.e.\ it will typeset the reference as the label counter preceded by -% a double question mark. References to undefined labels still produce -% a ``reference undefined'' warning and are typeset as a double -% question mark, as usual. +% a double question mark. The error message indicates the name of the +% unknown reference type, which you will then probably want to +% define. (References to undefined labels still produce a ``reference +% undefined'' warning and are typeset as a double question mark, as +% usual.) +% +% The reference formats are usually constructed out of components: the +% reference name (different for each type of reference), the label +% formats, and the conjunctions used in reference ranges and lists of +% multiple references. There are three levels of customisation: you +% can customise the components globally, individually for each +% reference type, or you can take full control and ignore the +% components entirely. +% +% +% \subsection{Global Customisation} +% \label{sec:global_customisation} +% \DescribeMacro\crefdefaultlabelformat +% The label format can be customised globally using +% \begin{quote} +% |\crefdefaultlabelformat{|\meta{format}|}| +% \end{quote} +% The \meta{format} argument can be any valid \LaTeX{} code, though +% you will need to |\protect| fragile commands. It can (and almost +% certainly should!) contain three arguments, |#1|, |#2| and |#3|. The +% first argument is the formatted version of the label counter (e.g.\ +% |\theequation|). The other two are used to mark the beginning and +% end of the part of the reference that should form the hyper-link +% when the \package{hyperref} package is used (see +% \cref{sec:other_packages}). The hyper-link arguments |#2| and |#3| +% \emph{must} appear in that order. (Leaving them out completely will +% not cause an error, but in that case no hyper-link will be created +% when \package{hyperref} is used, and there are better ways to +% achieve this. See \cref{sec:other_packages}.) +% +% \DescribeMacro\crefrangeconjunction +% The conjunction used in a reference range can be customised by +% redefining |\crefrangeconjunction|: +% \begin{quote} +% |\renewcommand{\crefrangeconjunction}{|\meta{conjunction}|}| +% \end{quote} +% It does not have to be an actual conjunction in the linguistic +% sense, e.g.\ it is perfectly reasonable to define it to be an emdash +% ``|--|''. |\crefrangeconjunction| is used directly between the start +% and end references in a reference range, without any additional +% space surrounding it, e.g.\ |\crefrange{eq1}{eq2}| is typeset as +% \begin{quote} +% |eqs.~\ref{eq1}\crefrangeconjunction\ref{eq2}| +% \end{quote} +% (assuming the default equation name hasn't been customised). So you +% may or may not want to include surrounding space, depending on the +% formatting you desire. For example, +% \begin{quote} +% |\renewcommand{\crefrangeconjunction}{ and~}| +% \end{quote} +% does require surrounding space, whereas +% \begin{quote} +% |\renewcommand{\crefrangeconjunction}{--}| +% \end{quote} +% does not. +% +% \DescribeMacro\crefpairconjunction +% \DescribeMacro\crefmiddleconjunction +% \DescribeMacro\creflastconjunction +% The conjunctions used in lists of references can be customised by +% redefining |\crefpairconjunction|, |\crefmiddleconjunction| and +% |\creflastconjunction|: +% \begin{quote} +% |\renewcommand{\crefpairconjunction}{|\meta{conjunction}|}|\\ +% |\renewcommand{\crefmiddleconjunction}{|\meta{conjunction}|}|\\ +% |\renewcommand{\creflastconjunction}{|\meta{conjunction}|}| +% \end{quote} +% |\crefpairconjunction| is used when there are only two references in +% the list, |\creflastconjunction| is used between the penultimate and +% final 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 +% comments about surrounding space apply as in the case of +% |\crefrangeconjunction|. For example, the default definition of +% |\crefmiddleconjunction| is: +% \begin{quote} +% |\renewcommand{\crefmiddleconjunction}{, }| +% \end{quote} +% +% \DescribeMacro\crefpairgroupconjunction +% \DescribeMacro\crefmiddlegroupconjunction +% \DescribeMacro\creflastgroupconjunction +% By default, the conjunctions used to separate sub-lists of different +% reference types in a multi-reference are identical to those used to +% separate references of the same type\footnote{More accurately, +% redefining $\backslash$crefpairconjunction etc.\ automatically +% redefines $\backslash$crefpairgroupconjunction etc.\ so that they +% match. If you don't redefine anything, the default definition of +% $\backslash$creflastgroupconjunction has an additional comma +% lacking in $\backslash$creflastconjunction.}. You can override +% this by redefining |\crefpairgroupconjunction|, +% |\crefmiddlegroupconjunction| and |\creflastgroupconjunction|. % +% For example, if |eq*|, |thm*| and |fig*| are respectively equation, +% theorem and figure labels, +% \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} +% +% +% \subsection{Customising Individual Reference Types} +% \DescribeMacro\creflabelformat +% \DescribeMacro\crefname +% \DescribeMacro\Crefname +% The reference name for a given reference type is customised using +% the |\crefname| and |\Crefname| commands: +% \begin{quote} +% |\crefname{|\meta{type}|}{|\meta{singular}|}{|\meta{plural}|}|\\ +% |\Crefname{|\meta{type}|}{|\meta{singular}|}{|\meta{plural}|}| +% \end{quote} +% used by the |\cref| and |\Cref| commands, respectively. You must +% supply both \meta{singular} and \meta{plural} forms of the name. If +% the corresponding |\Crefname| is undefined when |\crefname| is +% called, it will define |\Crefname| to be a capitalised version of +% |\crefname|, using |\MakeUppercase|. Conversely, if the +% corresponding |\crefname| is undefined when |\Crefname| is called, +% it will 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 reference \meta{type} is usually the name of the counter for the +% environment (equation, chapter, section, etc.). Currently, the only +% exception is theorem-like environments when the \package{ntheorem} +% package is loaded, for which \meta{type} should instead be the +% environment name (lemma, corollary, definition, +% etc.). \package{ntheorem} provides extra information about the +% environment when different theorem-like environments use a common +% counter, which \package{cleveref} makes use of to distinguish +% between them automatically. +% +% You may want the label format for a particular reference type to +% differ from the global format set by |\crefdefaultlabelformat| (see +% \ref{sec:global_customisation}. You can do this using +% \begin{quote} +% |\creflabelformat{|\meta{type}|}{|\meta{format}|}| +% \end{quote} +% The \meta{type} argument is the reference type to customise, and the +% \meta{format} argument defines the label format for references of +% that type. As in the case of\linebreak[4] |\crefdefaultlabelformat|, +% the latter should contain the three arguments |#1|, |#2| and |#3|, +% the first being the formatted version of the label counter, the +% others determining the beginning and end of the portion that becomes +% a hyper-link when the \package{hyperref} package is loaded (see +% \cref{sec:other_packages}). |#2| and |#3| must appear in that order. +% +% \DescribeMacro\crefrangelabelformat +% Normally, the start and end references in a reference range are +% typeset using 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 reference type using +% \begin{quote} +% |\crefrangelabelformat{|\meta{type}|}{|\meta{format}|}| +% \end{quote} +% The \meta{format} argument should contain six arguments: |#1|, |#2|, +% |#3|, |#4|, |#5|, |#6|. The first two (|#1| and |#2|) are the +% formatted versions of the start and end label counters. The next two +% (|#3| and |#4|) denote the beginning and end of the hyper-link for +% the first reference, the final two (|#5| and |#6|) the hyper-link +% for the second reference. The hyper-link arguments must appear in +% order. For example, the default format for equations is defined as: +% \begin{quote} +% |\crefrangelabelformat{equation}{(#3#1#4)--(#5#2#6)}| +% \end{quote} +% +% +% +% \subsection{Taking Full Control} +% If you need more precise control over the 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 +% 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. +% +% \subsubsection{Single References} +% \label{sec:ref_format} % \DescribeMacro\crefformat % \DescribeMacro\Crefformat % Reference formats for \emph{single} 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 reference type, and the formatting code: +% redefined using the\linebreak[4] |\crefformat| and |\Crefformat| +% commands, which are used by the |\cref| and |\Cref| commands +% respectively. These take two arguments: the reference type, and the +% formatting code: % \begin{quote} % |\crefformat{|\meta{type}|}{|\meta{format}|}|\\ % |\Crefformat{|\meta{type}|}{|\meta{format}|}| % \end{quote} +% The \meta{type} is usually the name of the counter, except for +% theorem-like environments when \package{ntheorem} is loaded, in +% which case it is the environment name. % -% If the corresponding |\Crefformat| is undefined when |\crefformat| -% is called, it will define the |\Crefformat| to produce a capitalised +% As in the case of the |\crefname| and |\Crefname| commands, if the +% corresponding |\Crefformat| is undefined when |\crefformat| is +% called, it will define the |\Crefformat| to produce a capitalised % version of |\crefformat|, using |\MakeUppercase|. Conversely, if the % corresponding |\crefformat| is undefined whe |\Crefformat| is % called, if will define the |\Crefformat| to produce a lower-case -% version of |\Crefformat|, using |\MakeLowercase|. Obviously, this -% will only work properly if the formats have a letter at the -% start. If the first letter is a special construct, such as an -% accented character, you will need to surround everything whose case -% should be changed by braces. If the first thing in the format is not -% a letter (e.g.\ if it is a \LaTeX{} command, or a hyper-link -% argument, see below), you will get strange and fatal errors when -% processing the document. -% -% The reference \meta{type} is usually the name of the counter for the -% environment (equation, chapter, section, etc.). Currently, the only -% exception is theorem-like environments when the \package{ntheorem} -% package is loaded, for which \meta{type} should instead be the -% environment name (lemma, corollary, definition, etc.). This is -% because \package{ntheorem} allows different theorem-like -% environments to use a common counter. +% version of |\Crefformat|, using |\MakeLowercase|. This will only +% work if the format starts with a letter, and the same comments apply +% as in the case of |\crefname| (see \cref{sec:global_customisation}). % % 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 reference that should form the hyper-link -% when the \package{hyperref} package is used (see -% \cref{sec:other_packages}). The hyper-link arguments |#2| and |#3| -% \emph{must} appear in that order. Leaving them out completely will -% not cause an error, but will mean that no hyper-link will be created -% when \package{hyperref} is used. +% 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 +% reference that forms the hyper-link when the \package{hyperref} +% package is used, and must appear in that order (see +% \cref{sec:other_packages}). % % As an example, % \begin{quote} @@ -421,11 +622,15 @@ % \begin{quote} % Eq.~(\meta{counter}) % \end{quote} -% with the counter (excluding the brackets) forming the hyper-links. -% Note that the hyper-link arguments are \emph{not} letters, so if you -% want to make the ``Eq.'' part of the hyper-link by putting |#2| at -% the start of the formatting code, you will have to define both -% capitalisation variants independently: +% with the counter (excluding the brackets) forming the hyper-link. +% +% Note that the hyper-link arguments are \emph{not} letters, so if +% |#2| appears at the beginning of \meta{format}, \package{cleveref} +% will not be able to automatically define the other capitalisation +% variant automatically using |\MakeUppercase| or |\MakeLowercase|. In +% this case, you will have to define both variants separately. For +% example, if you wanted to the ``Eq.'' to be part of the hyper-link, +% you would have to define: % \begin{quote} % |\crefformat{equation}{#2eq.~(#1)#3}|\\ % |\Crefformat{equation}{#2Eq.~(#1)#3}| @@ -437,22 +642,18 @@ % \DescribeMacro\crefrangeformat % \DescribeMacro\Crefrangeformat % The format for reference ranges is defined by |\crefrangeformat| -% and\linebreak[4] |\Crefrangeformat|. You do not have to define it if -% you don't plan to use any reference ranges, i.e. you never use the -% |\crefrange| and |\Crefrange| commands, and you never use multiple -% references (see \cref{sec:multiple_ref_format}). However, you will -% get ``reference format undefined'' errors if you later change your -% mind and forget to define the format. Like |\creformat| and +% and\linebreak[4] |\Crefrangeformat|. Like |\creformat| and % |\Crefformat|, the commands take two arguments: the reference type, % and the formatting code. % \begin{quote} % |\crefrangeformat{|\meta{type}|}{|\meta{format}|}|\\ % |\Crefrangeformat{|\meta{type}|}{|\meta{format}|}| % \end{quote} -% The same comments apply: the \meta{type} is usually the name of the -% counter, except for theorem-like environments, and if the -% corresponding other-capitalisation variant is not already defined, -% it will be defined automatically. +% The same comments apply as in the case of single references: the +% \meta{type} is usually the name of the counter, except for +% theorem-like environments when \package{ntheorem} is loaded, and 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 @@ -465,11 +666,11 @@ % % As an example, % \begin{quote} -% |\crefrangeformat{equation}{Eqs.~(#3#1#4)--(#5#2#6)}| +% |\crefrangeformat{equation}{eqs.~(#3#1#4)--(#5#2#6)}| % \end{quote} % will typeset equation reference ranges as % \begin{quote} -% Eqs.~(\meta{counter1})--(\meta{counter2}) +% eqs.~(\meta{counter1})--(\meta{counter2}) % \end{quote} % with the counters (excluding the brackets) forming the hyper-links. % @@ -483,78 +684,109 @@ % The format for multiple references is defined by |\crefmultiformat| % and\linebreak[4] |\Crefmultiformat|, and that of reference ranges % within multiple references by |\crefrangemultiformat| and -% |\Crefrangemultiformat|. If you don't use any multiple references -% for a particular reference type, you are not obliged to define the -% multi-formats. However, you will get ``reference format undefined'' -% errors if you later decide to use a multiple reference without -% ensuring the multi-formats are defined. You will also need to define -% \emph{all} the other reference formats (see -% \cref{sec:ref_format,sec:ref_range_format}), including the reference -% range formats, even if you never use the |\crefrange| and +% |\Crefrangemultiformat|. Multi-references also require \emph{all} +% the other 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 four arguments: the reference type, the format -% for the first reference in a list, the format for the middle -% references in a list, and the format for the last reference in a -% list. +% The commands all take five arguments: the reference type, the format +% for the first reference in a list, the format for the second +% reference in a list of two, the format for the middle references in +% a list of more than two, and the format for the last reference in a +% list of more than two. % \begin{quote} -% |\crefmultiformat{|\meta{type}|}{|\meta{first}|}{|\meta{middle}|}{|\meta{last}|}|\\ -% |\Crefmultiformat{|\meta{type}|}{|\meta{first}|}{|\meta{middle}|}{|\meta{last}|}|\\ -% |\crefrangemultiformat{|\meta{type}|}{|\meta{first}|}{|\meta{middle}|}{|\meta{last}|}|\\ -% |\Crefrangemultiformat{|\meta{type}|}{|\meta{first}|}{|\meta{middle}|}{|\meta{last}|}| +% |\crefmultiformat{|\meta{type}|}{|\meta{first}|}{|\meta{second}|}{|\meta{middle}|}{|\meta{last}|}|\\ +% |\Crefmultiformat{|\meta{type}|}{|\meta{first}|}{|\meta{second}|}{|\meta{middle}|}{|\meta{last}|}|\\ +% |\crefrangemultiformat{|\meta{type}|}{|\meta{first}|}{|\meta{second}|}{|\meta{middle}|}{|\meta{last}|}|\\ +% |\Crefrangemultiformat{|\meta{type}|}{|\meta{first}|}{|\meta{second}|}{|\meta{middle}|}{|\meta{last}|}| % \end{quote} % -% The same considerations apply to the \meta{type} and formatting -% arguments \meta{first}, \meta{middle} and \meta{last} as for the -% \meta{format} argument of |\crefformat| and |\Crefformat| or -% |\crefrangeformat| and |\Crefrangeformat|, including the meaning of -% the arguments that should appear in the formatting code. 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 \meta{type} is, as ever, the counter name, or environment name +% in the case of \package{ntheorem} theorem-like environments. 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}, \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, with the -% default format +% 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)}{, (#2#1#3)}{ and~(#2#1#3)}|\\ +% |{eqs.~(#2#1#3)}{ and~(#2#1#3)}{, (#2#1#3)}{ and~(#2#1#3)}| % \end{quote} -% the \meta{middle} arguments should \emph{not} have a space at the -% beginning, whereas the \meta{last} arguments \emph{should} have a -% space. -% -% \DescribeMacro{\crefmiddleconjunction} -% \DescribeMacro{\creflastconjunction} -% The |\crefmiddleconjunction| and |\creflastconjunction| commands are -% used in between sub-lists of different types of references that -% occur in a multiple reference. If there are two or more reference -% types in the list, |\creflastconjunction| is used between the -% penultimate and final group of references, whereas -% |\crefmiddleconjunction| is used between all others. You can -% redefine them with |\renewcommand| in the usual way: +% 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. +% +% +% +% \section{Overriding the Reference Type} +% As described previously, a label's reference type is usually +% determined by its counter, or in the case of \package{ntheorem} +% theorem-like environments by the environment name. Occasionally, you +% may want to override the reference type for a particular label. You +% can do this by supplying the desired type as an optional argument to +% the |\label| command: % \begin{quote} -% |\renewcommand{\crefmiddleconjunction}{|\meta{conjunction}|}|\\ -% |\renewcommand{\creflastconjunction}{|\meta{conjunction}|}| +% |\label[|\meta{type}|]{|\meta{label}|}| % \end{quote} -% For example, if |eq*|, |thm*| and |fig*| are respectively equation, -% theorem and figure labels, +% +% One circumstance in which is useful is when you want to define a +% special reference format for certain labels of a given type. By +% specifying a type that doesn't already exist in the |\label|'s +% optional argument, you can then define the reference format for that +% new type in whatever way you like, without affecting other +% 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} -% |\cref{eq1,eq2,eq3,thm1,thm2,fig1,thm3}| +% |\crefname{pluralequation}{eqs.}{eqs.}|\\ +% \dots\\ +% |\label[pluralequation]{eq1}| % \end{quote} -% is typeset (assuming the default |\crefformat|s) as +% 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 reference type from +% the counter name, the two counter aliases can have different +% reference formats whilst really being the same counter. You have to +% somehow arrange for the correct counter alias to be used depending +% on which 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 reference formats for +% different theorem-like environments, \emph{without} using the +% \package{ntheorem} package\footnote{Thanks to Anand Deopurkar for +% suggesting this neat trick.}. For example, % \begin{quote} -% Eqs.~(1)--(3)|\crefmiddleconjunction| Theorems~1\\ -% and~2|\crefmiddleconjunction| Fig.~1|\creflastconjunction| -% Theorem~3 +% |\usepackage{aliascnt}|\\ +% |\usepackage{cleveref}|\\ +% |\newaliascnt{lemma}{theorem}|\\ +% |\newtheorem{lemma}[lemma]{Lemma}|\\ +% |\aliascntresetthe{lemma}|\\ +% |\crefname{lemma}{lemma}{lemmas}| % \end{quote} % % -% \subsection{Poor Man's \package{cleveref}} +% +% \section{Poor Man's \package{cleveref}} % Sometimes you may need to send your \LaTeX{} source to someone who % can't install the \package{cleveref} package themselves. For % example, many academic journals accept papers in \LaTeX{} format, but @@ -574,15 +806,17 @@ % manually. Instead, you can use all the features of % \package{cleveref}, and once you've created a version of your % document that you want to send elsewere, you can process it through -% the script to remove the \package{cleveref} dependency. -% -% The script is written to the same directory as the \LaTeX{} source -% file, and given the same name as the 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: +% the script to completely remove the \package{cleveref} +% dependency. The recipient won't even realise you used +% \package{cleveref}! +% +% The {\tt sed} script is written to the same directory as the +% \LaTeX{} source file, and given the same name as the 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} > \meta{newname}\file{.tex} +% \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 @@ -598,41 +832,34 @@ % % \section{Interaction with Other Packages} % \label{sec:other_packages} -% Since \package{cleveref} redefines many internal commands involved -% in \LaTeX{}'s referencing system, it can interact badly with other -% packages that do the same. In general, \package{cleveref} should be -% loaded \emph{last}, and the appropriate options must be supplied if -% the \package{hyperref} and/or \package{ntheorem} packages are also -% used. E.g. +% The \package{cleveref} package \emph{must} be loaded \emph{after} +% all other packages that don't specifically support it\footnote{At +% the time of writing, I'm not aware of any that do.}, i.e.\ the % \begin{quote} -% |\usepackage{hyperref}|\\ -% |\usepackage[hyperref]{cleveref}| -% \end{quote} -% or -% \begin{quote} -% |\usepackage{ntheorem}|\\ -% |\usepackage[ntheorem]{cleveref}| -% \end{quote} -% or -% \begin{quote} -% |\usepackage{hyperref}|\\ -% |\usepackage[hyperref]{ntheorem}|\\ -% |\usepackage[hyperref,ntheorem]{cleveref}| +% |\usepackage{cleveref}| % \end{quote} +% line should always be the last |\usepackage| command in your +% document's preamble. % -% \package{varioref}'s enhanced referencing features (which you make -% use of by via the |\labelformat| command), the \package{fancyref} -% package, and \package{ntheorem}'s \option{thref} option are -% incompatible with \package{cleveref}. However, since -% \package{cleveref} implements an enhanced version of these features, -% this is not really a problem. For example, if you have a -% pre-existing document that uses \package{ntheorem}'s |\thref| -% command, you can simply redefine it to call |\cref| instead: +% Since \package{cleveref} redefines many internal commands involved +% in \LaTeX{}'s referencing system, it can interact badly with other +% packages that do the same. \package{varioref}'s enhanced referencing +% features (the ones you make use of by via the |\labelformat| +% command), the \package{fancyref} package, and \package{ntheorem}'s +% \option{thref} option are incompatible with +% \package{cleveref}. However, since \package{cleveref} implements an +% enhanced version of these packages' features, this is not really a +% problem. For example, if you have a pre-existing document that uses +% \package{ntheorem}'s |\thref| command, you can simply redefine it to +% call |\cref| instead: % \begin{quote} % |\renewcommand{\thref}{\cref}| % \end{quote} -% Note that you can still use the other features of \package{varioref} -% and \package{ntheorem} whilst using \package{cleveref}. +% In fact, \package{cleveref} does this for you automatically if +% \package{ntheorem} was loaded with the \option{thref} option. Note +% that you can still use the other features of \package{varioref} and +% \package{ntheorem} whilst using \package{cleveref}, as long as +% \package{cleveref} is loaded \emph{last}. % % Other packages which alter the \LaTeX{} referencing system are % unlikely to work properly with \package{cleveref}. @@ -640,6 +867,7 @@ % % % \section{Known Bugs} +% In no particular order. % \begin{itemize} % \item \package{cleveref} will not work properly with the standard % \LaTeX{} |eqnarray| environment. The |eqnarray| environment is @@ -649,6 +877,12 @@ % |align|, |multine| and |split|, which \emph{do} work properly with % \package{cleveref}. (See % \url{http://www.tug.org/pracjourn/2006-4/madsen/}). +% \item The \option{poorman} sed script always uses |\ref| rather than +% |\ref*|, even if the command it's replacing is a starred variant +% |\cref*|, |\crefrange*| etc. (This should be fixed in a future +% version.) +% \item \package{cleveref} provides no \package{babel} support. (This +% should be fixed in a future version.) % \item \package{cleveref} breaks \package{hyperref}'s % \option{backref} option, and probably also the \package{backref} % package when used by itself. (This should be fixed in a future @@ -657,15 +891,28 @@ % by the standard sectioning commands (chapter, section, etc.). If % this is not the case, the automatic collapsing of consecutive % references into a reference range may be incorrect. -% \item \package{cleveref} provides no \package{babel} support. +% \item The \option{poorman} sed script uses |\ref| when replacing +% \package{cleveref} cross-references, but this loses any custom +% \package{cleveref} hyper-link formatting you might have +% defined. The philosophy behind the \option{poorman} option +% is to replace \package{cleveref}'s enhanced cross-referencing with +% standard \LaTeX{} cross-reference commands that are guaranteed to +% work with any \LaTeX{} installation. Although it would be simple +% to fix this bug, it's not obvious how best to do it without +% compromising on the underlying philosophy. % \end{itemize} % % % -% \section{Future Improvements} +% \section{Possible Future Improvements} +% In no particular order. % \begin{itemize} % \item Allow reference-range collapsing to be disabled entirely via a % package option +% \item Add an option to automatically sort references in a +% multi-reference before typesetting them. +% \item Enhance the \option{poorman} option to allow a choice of +% script language rather than just sed. (E.g.\ awk, perl, \dots?). % \end{itemize} % % @@ -675,26 +922,26 @@ % % % \section{Implementation} -% % Essentially, the core of the implementation consists of causing an % extra piece of information -- the label ``type'' -- to be written to -% the aux file, and defining an \cmd{\cref} command which uses this -% extra information to typeset the reference. +% the aux file, and defining \cmd{\cref} commands which use this extra +% information to typeset the reference. % % The least invasive implementation 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 cotains the typeset version of the -% counter, now contains the additional information (in fact, we write -% three extra pieces of information: the type, the counter value +% counter, now contains the additional type information. (In fact, we +% write three extra pieces of information: the type, the counter value % itself, and the formatted version of the counter that causes the % label's counter to be reset, which we call the ``prefix'' from now -% on). \cmd{\@currentlabel} eventually gets written to the aux file as +% on.) \cmd{\@currentlabel} eventually gets written to the aux file as % an argument to \cmd{\newlabel} by the usual \LaTeX{} % mechanisms. This involves less hacking to get everything else % working again, since very few macros other than \cmd{\ref} use this % particular \cmd{\newlabel} argument (nor are other packages likely -% to, given that \package{varioref} is a required package). +% to, given that \package{varioref} is a \texttt{required} \LaTeX{} +% package). % % % \subsection{Redefinitions of \LaTeX{} kernel macros} @@ -723,6 +970,52 @@ \protected@edef\@currentlabel{% [#1][\arabic{#2}][\@result]\@currentlabel}} % \end{macrocode} +% +% We redefine the \cmd{\label} command to allow it to take an optional +% argument that overrides the default reference type in +% \cmd{\@currentlabel}. We have to postpone this redefinition till the +% beginning of the document because other packages do, and we need to +% override their redefinitions. +% \begin{macrocode} +\AtBeginDocument{% + \let\old@label\label + \def\label{\@ifnextchar[\label@optarg\old@label}%] + \def\override@label@type[#1][#2][#3]#4\@nil#5{[#5][#2][#3]#4} + \def\label@optarg[#1]{% + \protected@edef\@currentlabel{% + \expandafter\override@label@type\@currentlabel\@nil{#1}}% + \old@label}% +% \end{macrocode} +% +% 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 in 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 \{\}. These are stripped +% away again by \cmd{\ltx@label} before calling the \cmd{\label} macro +% we defined above (save in \cmd{\cref@label}. +% \begin{macrocode} + \@ifpackageloaded{amsmath}{% + \let\cref@label\label% + \let\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{\old@label@in@display{{#1}}} + \def\label@in@display@optarg[#1]#2{\old@label@in@display{[#1]{#2}}} + \def\ltx@label#1{\cref@label#1}% + }{}% +} +% \end{macrocode} % % The standard \cmd{\ref} macro spits out whatever was in % \cmd{\@currentlabel} when the label was written to the aux file, but @@ -734,7 +1027,7 @@ % loaded. For some reason, \cmd{\DeclareRobustCommand} doesn't work % here, so we make it robust manually. % \begin{macrocode} -\def\cref@label#1#2{\@result} +\def\cref@reflabel#1#2{\@result} \AtBeginDocument{% \expandafter\def\csname ref \endcsname#1{% \expandafter\ifx\csname r@#1\endcsname\relax% @@ -742,25 +1035,25 @@ \else% \cref@getlabel{#1}{\@result}% \fi% - \expandafter\@setref\csname r@#1\endcsname{\cref@label}{#1}}% - \def\ref{\expandafter\protect\csname ref \endcsname} + \expandafter\@setref\csname r@#1\endcsname{\cref@reflabel}{#1}}% + \def\ref{\expandafter\protect\csname ref \endcsname}% } % \end{macrocode} % % \subsection{Utility Macros} % Define some utility macros for extracting label, type, and counter % information from the contents of \cmd{\@currentlabel}, as written to -% the aux file and stored in \cmd{\r@\meta{label}} when this is re-read -% on the next pass. Some other packages commandeer the referencing -% system to write label information to the aux file for other -% purposes, and probably use \cmd{\ref} to recover it later. We still -% want them to work, so our utility macros must cope with the type -% information being absent. However, since we need them to be fully -% expandable in various places, and \cmd{\@ifnextchar} is definitely -% \emph{not} fully expandable, we use the work-around of having the -% macros store their result in another macro, whose name is passed as -% the second argument. This macro \emph{will} then be fully -% expandable, and can be used e.g.\ inside an \cmd{\edef} or +% the aux file and stored in \cmd{\r@\meta{label}} when this is +% re-read on the next pass. Some other packages commandeer the +% referencing system to write label information to the aux file for +% other purposes, and probably use \cmd{\ref} to recover it later. We +% still want them to work, so our utility macros must cope with the +% type information being absent. However, since we need them to be +% fully expandable in various places, and \cmd{\@ifnextchar} is +% definitely \emph{not} fully expandable, we use the work-around of +% having the macros store their result in another macro, whose name is +% passed as the second argument. This other macro \emph{will} then be +% fully expandable, and can be used e.g.\ inside an \cmd{\edef} or % \cmd{\csname}\ldots\cmd{\endcsname}. % \begin{macrocode} \def\cref@getlabel#1#2{% @@ -793,7 +1086,14 @@ \def\@@cref@getprefix[#1][#2][#3]#4\@nil#5{\def#5{#3}} % \end{macrocode} % -% We treate multiple references, supplied as a comma-separated list to +% A basic utility macro for appending tokens to a token register. +% \begin{macrocode} +\def\append@toks#1#2{\toks0={#2}% + \edef\act{\noexpand#1={\the#1\the\toks0}}% + \act}% +% \end{macrocode} +% +% We treat multiple references, supplied as a comma-separated list to % \cmd{\cref} or \cmd{\Cref}, as a stack structure. So we define some % utility macros for manipulating stacks (\cmd{\@nil} is used as an % end-of-stack delimeter). @@ -812,8 +1112,7 @@ \def\isstackempty#1{% \def\@tmpa{\@nil}% \ifx#1\@tmpa\stackemptytrue% - \else\stackemptyfalse\fi -} + \else\stackemptyfalse\fi} \def\isstackfull#1{% \def\@tmpa{\@nil}% \ifx#1\@tmpa\stackfullfalse% @@ -919,9 +1218,12 @@ \countdef\count@consecutive=0% \def\@empty{}% \newif\if@firstgroup% + \newif\if@secondgroup% + \newif\if@secondref% \stack@init{\@refstack}% \stack@push{#2}{\@refstack}% \@firstgrouptrue% + \@secondgroupfalse% \isstackfull{\@refstack}% % \end{macrocode} % Loop until the reference stack is empty. @@ -964,15 +1266,21 @@ % Typeset appropriate conjunction between groups of reference types. % \begin{macrocode} \if@firstgroup% + \@firstgroupfalse% + \@secondgrouptrue% \else% \isstackfull{\@refstack}% \ifstackfull% - \@setcref@middleconjunction% + \@setcref@middlegroupconjunction% \else% - \@setcref@lastconjunction% + \if@secondgroup% + \@setcref@pairgroupconjunction% + \else% + \@setcref@lastgroupconjunction% + \fi% \fi% + \@secondgroupfalse% \fi% - \@firstgroupfalse% % \end{macrocode} % % Process first group of consecutive references from substack. @@ -1019,7 +1327,7 @@ % \end{macrocode} % Otherwise, test whether next reference is consecutive or not. % \begin{macrocode} - \else + \else% \expandafter\ifx\csname r@\@nextref\endcsname\relax% \refconsecutivefalse% \else% @@ -1057,7 +1365,7 @@ % \end{macrocode} % otherwise, test whether next reference is consecutive or not. % \begin{macrocode} - \else + \else% \expandafter\ifx\csname r@\@nextref\endcsname\relax% \refconsecutivefalse% \else% @@ -1083,7 +1391,7 @@ % \end{macrocode} % otherwise, typeset a reference range. % \begin{macrocode} - \else + \else% \edef\@tmpa{{\@beginref}{\@endref}}% \ifstackempty% \expandafter\@setcrefrange\@tmpa{#1}{}% @@ -1097,6 +1405,7 @@ % Process further groups of consecutive references, until substack % is empty. % \begin{macrocode} + \@secondreftrue% \isstackfull{\@refsubstack}% \@whilesw\ifstackfull\fi{% \edef\@beginref{\stack@top{\@refsubstack}}% @@ -1107,7 +1416,11 @@ % \begin{macrocode} \isstackempty{\@refsubstack}% \ifstackempty% - \expandafter\@setcref\expandafter{\@beginref}{#1}{@last}% + \if@secondref% + \expandafter\@setcref\expandafter{\@beginref}{#1}{@second}% + \else% + \expandafter\@setcref\expandafter{\@beginref}{#1}{@last}% + \fi% % \end{macrocode} % otherwise, find end of consecutive references. % \begin{macrocode} @@ -1134,7 +1447,7 @@ % \end{macrocode} % otherwise, test whether next reference is consecutive or not. % \begin{macrocode} - \else + \else% \expandafter\ifx\csname r@\@nextref\endcsname\relax% \refconsecutivefalse% \else% @@ -1171,7 +1484,7 @@ % \end{macrocode} % otherwise, test whether next reference is consecutive or not. % \begin{macrocode} - \else + \else% \expandafter\ifx\csname r@\@nextref\endcsname\relax% \refconsecutivefalse% \else% @@ -1187,7 +1500,11 @@ % \begin{macrocode} \isstackempty{\@refsubstack}% \ifstackempty% - \def\@pos{@last}% + \if@secondref% + \def\@pos{@second}% + \else% + \def\@pos{@last}% + \fi% \else% \def\@pos{@middle}% \fi% @@ -1211,12 +1528,13 @@ % \end{macrocode} % otherwise, typeset a reference range. % \begin{macrocode} - \else + \else% \edef\@tmpa{{\@beginref}{\@endref}{#1}{\@pos}}% \expandafter\@setcrefrange\@tmpa% \fi% \fi% \fi% + \@secondreffalse% \isstackfull{\@refsubstack}% }% end loop over reference substack \fi% @@ -1287,7 +1605,7 @@ % \end{macrocode} % % The internal \cmd{\@setcrefrange} macro deals with typesetting -% reference ranges, just as \cmd{\setcref} does for normal +% 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 @@ -1332,7 +1650,7 @@ \expandafter\ifx\@formata\relax% \protect\G@refundefinedtrue% \nfss@text{\reset@font\bfseries ??}~\@labela--\@labelb% - \@latex@warning{#3 \space reference format for label + \@latex@warning{#3\space reference range format for label type `\@typea' undefined}% \else% % \end{macrocode} @@ -1369,18 +1687,370 @@ % The typesetting of conjunctions is also separated out into separate % macros, for the same reason. % \begin{macrocode} -\def\@setcref@middleconjunction{\crefmiddleconjunction} -\def\@setcref@lastconjunction{\creflastconjunction} +\def\@setcref@pairgroupconjunction{\crefpairgroupconjunction} +\def\@setcref@middlegroupconjunction{\crefmiddlegroupconjunction} +\def\@setcref@lastgroupconjunction{\creflastgroupconjunction} % \end{macrocode} % % % % \subsection{Reference Format Customisation Commands} -% \cmd{\crefformat} et al.\ are user-level commands used to define the -% format of different reference types. They simply use the supplied -% argument(s) to define appropriately named formatting macro(s), which -% are called by \cmd{\@setcref}. The only moderately interesting part -% is that if the corresponding \cmd{\Crefformat} or \cmd{\crefformat} +% +% \subsubsection{Format Component Commands} +% The reference formats are usually constructed out of components +% defined by the user-level \cmd{\crefname}, \cmd{\Crefname}, +% \cmd{\creflabel} and \cmd{\crefrangelabel} commands. They 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. +% \cmd{\@crefdefineallformats} is then called to define all the +% formats from the new components. +% \begin{macrocode} +\newcommand{\crefdefaultlabelformat}[1]{% + \def\cref@default@label##1##2##3{#1}} +\newcommand{\crefname}[3]{% + \@crefname{cref}{#1}{#2}{#3}% + \@crefdefineallformats{#1}} +\newcommand{\Crefname}[3]{% + \@crefname{Cref}{#1}{#2}{#3}% + \@crefdefineallformats{#1}} +\newcommand{\creflabelformat}[2]{% + \@creflabelformat{#1}{#2}% + \@crefdefineallformats{#1}} +\newcommand{\crefrangelabelformat}[2]{% + \@crefrangelabelformat{#1}{#2}% + \@crefdefineallformats{#1}} +\def\@creflabelformat#1#2{% + \expandafter\def\csname cref@#1@label\endcsname##1##2##3{#2}} +\def\@crefrangelabelformat#1#2{% + \expandafter\def\csname cref@#1@rangelabel\endcsname% + ##1##2##3##4##5##6{#2}} +% \end{macrocode} +% +% 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 first argument (``cref'' of +% ``Cref'') to determine how to define the corresponding command with +% the other capitalisation. +% \begin{macrocode} +\def\@crefname#1#2#3#4{% + \expandafter\def\csname #1@#2@name\endcsname{#3}% + \expandafter\def\csname #1@#2@name@plural\endcsname{#4}% +% \end{macrocode} +% The following \cmd{\@tmpa} macro makes use of the fact that the +% first character of \#1 is ``c'' for lower-case and ``C'' for +% upper-case, in order to wrap the capitalisation-dependent parts in +% macros so that the rest of the code can be capitalisation-variant +% agnostic. +% \begin{macrocode} + \def\@tmpa##1##2\@nil{% + \if##1c% + \def\@other{C##2}% + \def\@changecase{\MakeUppercase}% + \else% + \def\@other{c##2}% + \def\@changecase{\MakeLowercase}% + \fi}% + \@tmpa#1\@nil% +% \end{macrocode} +% If the other capitalisation variant is not already defined... +% \begin{macrocode} + \@ifundefined{\@other @#2@name}{% +% \end{macrocode} +% Define \cmd{\@tmpa} and \cmd{@tmpb} to be partial expansions +% (expanded just once) of the macros for the capitalisation variant +% we've just defined above. The \cmd{\@toska} token register just +% makes the code less verbose. +% \begin{macrocode} + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpa% + \expandafter\expandafter\expandafter{% + \csname#1@#2@name\endcsname}% + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpb% + \expandafter\expandafter\expandafter{% + \csname#1@#2@name@plural\endcsname}% +% \end{macrocode} +% Add the \cmd{\@changecase} command to the front of the definitions of +% \cmd{\@tmpa} and \cmd{\}tmpb}. +% \begin{macrocode} + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpa% + \expandafter\expandafter\expandafter{% + \expandafter\@changecase\@tmpa}% + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpb% + \expandafter\expandafter\expandafter{% + \expandafter\@changecase\@tmpb}% +% \end{macrocode} +% Define the other capitalisation variants to be the partial expansions +% (expanded just once) of \cmd{\@tmpa} and \cmd{\@tmpb}. +% \begin{macrocode} + \newtoks\@toksa% + \@toksa={% + \expandafter\def\csname\@other @#2@name\endcsname}% + \expandafter\the\expandafter\@toksa\expandafter{\@tmpa}% + \@toksa={% + \expandafter\def\csname\@other @#2@name@plural\endcsname}% + \expandafter\the\expandafter\@toksa\expandafter{\@tmpb}% + }{}% +} +% \end{macrocode} +% +% +% \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 enough are left when they come to be used +% later (pairs ``\#\#'' are collapsed to a single ``\#'' each time the +% code is expanded). +% \begin{macrocode} +\def\@crefconstructcomponents#1{% + \@ifundefined{cref@#1@label}{% + \let\@tmplabel\cref@default@label% + }{% + \expandafter\let\expandafter\@tmplabel% + \csname cref@#1@label\endcsname% + }% + \@ifundefined{cref@#1@rangelabel}{% + \expandafter\def\expandafter\@tmpa\expandafter{% + \@tmplabel{####1}{####3}{####4}}% + \expandafter\def\expandafter\@tmpb\expandafter{% + \@tmplabel{####2}{####5}{####6}}% + \@toksa={\def\@tmprangelabel##1##2##3##4##5##6}% + \expandafter\expandafter\expandafter\expandafter% + \expandafter\expandafter\expandafter\the% + \expandafter\expandafter\expandafter\expandafter% + \expandafter\expandafter\expandafter\@toksa% + \expandafter\expandafter\expandafter\expandafter% + \expandafter\expandafter\expandafter{% + \expandafter\expandafter\expandafter\@tmpa% + \expandafter\crefrangeconjunction\@tmpb}% + }{% + \expandafter\let\expandafter\@tmprangelabel% + \csname cref@#1@rangelabel\endcsname% + }% + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpname% + \expandafter\expandafter\expandafter{% + \csname cref@#1@name\endcsname}% + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpName% + \expandafter\expandafter\expandafter{% + \csname Cref@#1@name\endcsname}% + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpnameplural% + \expandafter\expandafter\expandafter{% + \csname cref@#1@name@plural\endcsname}% + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpNameplural% + \expandafter\expandafter\expandafter{% + \csname Cref@#1@name@plural\endcsname}% + \expandafter\def\expandafter\@tmplabel\expandafter{% + \@tmplabel{########1}{########2}{########3}}% + \expandafter\def\expandafter\@tmprangelabel\expandafter{% + \@tmprangelabel{########1}{########2}{########3}% + {########4}{########5}{########6}}% +} +% \end{macrocode} +% +% The \cmd{\@crefdefineformat} et al.\ macros construct calls to +% \cmd{\crefformat} et al.\ for the supplied reference type that +% define the corresponding formats in terms of the format +% components. This is mostly just an arduous exercise in controlling +% macro expansion order. +% \begin{macrocode} +\def\@crefdefineformat#1{% + \newtoks\@toksa% + \@crefconstructcomponents{#1}% puts format components into tmp macros +% \end{macrocode} +% Assemble the arguments for \cmd{\crefformat} and \cmd{\Crefformat} +% from the components. +% \begin{macrocode} + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpfirst% + \expandafter\expandafter\expandafter{% + \expandafter\@tmpname\expandafter~\@tmplabel}% + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpFirst% + \expandafter\expandafter\expandafter{% + \expandafter\@tmpName\expandafter~\@tmplabel}% +% \end{macrocode} +% Define \cmd{\crefformat} and \cmd{\Crefformat}. +% \begin{macrocode} + \@toksa={\crefformat{#1}}% + \expandafter\the\expandafter\@toksa\expandafter{\@tmpfirst}% + \@toksa={\Crefformat{#1}}% + \expandafter\the\expandafter\@toksa\expandafter{\@tmpFirst}% +} +% +\def\@crefrangedefineformat#1{% + \newtoks\@toksa% + \newtoks\@toksb% + \@crefconstructcomponents{#1}% puts format components into tmp macros +% \end{macrocode} +% Assemble the arguments for \cmd{\crefrangeformat} and +% \cmd{\Crefrangeformat} from the components. +% \begin{macrocode} + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpfirst% + \expandafter\expandafter\expandafter{% + \expandafter\@tmpnameplural\expandafter~\@tmprangelabel}% + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpFirst% + \expandafter\expandafter\expandafter{% + \expandafter\@tmpNameplural\expandafter~\@tmprangelabel}% +% \end{macrocode} +% Define \cmd{\crefrangeformat} and \cmd{\Crefrangeformat}. +% \begin{macrocode} + \@toksa={\crefrangeformat{#1}}% + \expandafter\the\expandafter\@toksa\expandafter{\@tmpfirst}% + \@toksa={\Crefrangeformat{#1}}% + \expandafter\the\expandafter\@toksa\expandafter{\@tmpFirst}% +} +% +\def\@crefdefinemultiformat#1{% + \newtoks\@toksa% + \newtoks\@toksb% + \@crefconstructcomponents{#1}% puts format components into tmp macros +% \end{macrocode} +% Assemble the arguments for \cmd{\crefmultiformat} and +% \cmd{\Crefmultiformat} from the components. +% \begin{macrocode} + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpfirst% + \expandafter\expandafter\expandafter{% + \expandafter\@tmpnameplural\expandafter~\@tmplabel}% + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpFirst% + \expandafter\expandafter\expandafter{% + \expandafter\@tmpNameplural\expandafter~\@tmplabel}% + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpsecond% + \expandafter\expandafter\expandafter{% + \expandafter\crefpairconjunction\@tmplabel}% + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpmiddle% + \expandafter\expandafter\expandafter{% + \expandafter\crefmiddleconjunction\@tmplabel}% + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmplast% + \expandafter\expandafter\expandafter{% + \expandafter\creflastconjunction\@tmplabel}% +% \end{macrocode} +% Bundle all four arguments for \cmd{\crefmultiformat} in token +% register \cmd{\@toksb}, then call it. +% \begin{macrocode} + \@toksb={}% + \expandafter\append@toks\expandafter\@toksb\expandafter{% + \expandafter{\@tmpfirst}}% + \expandafter\append@toks\expandafter\@toksb\expandafter{% + \expandafter{\@tmpsecond}}% + \expandafter\append@toks\expandafter\@toksb\expandafter{% + \expandafter{\@tmpmiddle}}% + \expandafter\append@toks\expandafter\@toksb\expandafter{% + \expandafter{\@tmplast}}% + \@toksa={\crefmultiformat{#1}}% + \expandafter\the\expandafter\@toksa\the\@toksb% +% \end{macrocode} +% Bundle all four arguments for \cmd{\Crefmultiformat} in token +% register \cmd{\@toksb}, then call it. +% \begin{macrocode} + \@toksb={}% + \expandafter\append@toks\expandafter\@toksb\expandafter{% + \expandafter{\@tmpFirst}}% + \expandafter\append@toks\expandafter\@toksb\expandafter{% + \expandafter{\@tmpsecond}}% + \expandafter\append@toks\expandafter\@toksb\expandafter{% + \expandafter{\@tmpmiddle}}% + \expandafter\append@toks\expandafter\@toksb\expandafter{% + \expandafter{\@tmplast}}% + \@toksa={\Crefmultiformat{#1}}% + \expandafter\the\expandafter\@toksa\the\@toksb% +} +% +\def\@crefrangedefinemultiformat#1{% + \newtoks\@toksa% + \newtoks\@toksb% + \@crefconstructcomponents{#1}% puts format components into tmp macros +% \end{macrocode} +% Assemble the arguments that need to be passed to +% \cmd{\crefrangemultiformat} and \cmd{\Crefrangemultiformat} from the +% reference components. +% \begin{macrocode} + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpfirst% + \expandafter\expandafter\expandafter{% + \expandafter\@tmpnameplural\expandafter~\@tmprangelabel}% + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpFirst% + \expandafter\expandafter\expandafter{% + \expandafter\@tmpNameplural\expandafter~\@tmprangelabel}% + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpsecond% + \expandafter\expandafter\expandafter{% + \expandafter\crefpairconjunction\@tmprangelabel}% + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmpmiddle% + \expandafter\expandafter\expandafter{% + \expandafter\crefmiddleconjunction\@tmprangelabel}% + \expandafter\expandafter\expandafter\def% + \expandafter\expandafter\expandafter\@tmplast% + \expandafter\expandafter\expandafter{% + \expandafter\creflastconjunction\@tmprangelabel}% +% \end{macrocode} +% Bundle all four arguments for \cmd{\crefrangemultiformat} in token +% register \cmd{\@toksb}, then call it. +% \begin{macrocode} + \@toksb={}% + \expandafter\append@toks\expandafter\@toksb\expandafter{% + \expandafter{\@tmpfirst}}% + \expandafter\append@toks\expandafter\@toksb\expandafter{% + \expandafter{\@tmpsecond}}% + \expandafter\append@toks\expandafter\@toksb\expandafter{% + \expandafter{\@tmpmiddle}}% + \expandafter\append@toks\expandafter\@toksb\expandafter{% + \expandafter{\@tmplast}}% + \@toksa={\crefrangemultiformat{#1}}% + \expandafter\the\expandafter\@toksa\the\@toksb% +% \end{macrocode} +% Bundle all four arguments for \cmd{\Crefrangemultiformat} in token +% register \cmd{\@toksb}, then call it. +% \begin{macrocode} + \@toksb={}% + \expandafter\append@toks\expandafter\@toksb\expandafter{% + \expandafter{\@tmpFirst}}% + \expandafter\append@toks\expandafter\@toksb\expandafter{% + \expandafter{\@tmpsecond}}% + \expandafter\append@toks\expandafter\@toksb\expandafter{% + \expandafter{\@tmpmiddle}}% + \expandafter\append@toks\expandafter\@toksb\expandafter{% + \expandafter{\@tmplast}}% + \@toksa={\Crefrangemultiformat{#1}}% + \expandafter\the\expandafter\@toksa\the\@toksb% +} +% \end{macrocode} +% +% \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} +% +% +% \subsubsection{Format Definition Commands}\label{sec:crefformat} +% \cmd{\crefformat} et al.\ are lower-level user 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}. The only moderately interesting part is +% that 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} @@ -1388,44 +2058,66 @@ \newcommand{\Crefformat}[2]{\@crefformat{Cref}{#1}{#2}} \newcommand{\crefrangeformat}[2]{\@crefrangeformat{crefrange}{#1}{#2}} \newcommand{\Crefrangeformat}[2]{\@crefrangeformat{Crefrange}{#1}{#2}} -\newcommand{\crefmultiformat}[4]{% - \@crefmultiformat{cref}{#1}{#2}{#3}{#4}} -\newcommand{\Crefmultiformat}[4]{% - \@crefmultiformat{Cref}{#1}{#2}{#3}{#4}} -\newcommand{\crefrangemultiformat}[4]{% - \@crefrangemultiformat{crefrange}{#1}{#2}{#3}{#4}} -\newcommand{\Crefrangemultiformat}[4]{% - \@crefrangemultiformat{Crefrange}{#1}{#2}{#3}{#4}} +\newcommand{\crefmultiformat}[5]{% + \@crefmultiformat{cref}{#1}{#2}{#3}{#4}{#5}} +\newcommand{\Crefmultiformat}[5]{% + \@crefmultiformat{Cref}{#1}{#2}{#3}{#4}{#5}} +\newcommand{\crefrangemultiformat}[5]{% + \@crefrangemultiformat{crefrange}{#1}{#2}{#3}{#4}{#5}} +\newcommand{\Crefrangemultiformat}[5]{% + \@crefrangemultiformat{Crefrange}{#1}{#2}{#3}{#4}{#5}} % \end{macrocode} +% % The utility macros do the real work, by using the first argument -% (``cref'', ``Cref'', ``crefrange'' or ``Crefrange'') to determine -% how to define the corresponding command with the other +% (``cref'' or ``Cref'', and ``crefrange'' or ``Crefrange'') to +% determine how to define the corresponding command with the other % capitalisation. % \begin{macrocode} \def\@crefformat#1#2#3{% \expandafter\def\csname #1@#2@format\endcsname##1##2##3{#3}% % \end{macrocode} -% Note that these \cmd{\@tmpa} macros makes use of the fact that the -% first character of \#1 is ``c'' for lower-case, ``C'' for -% upper-case. +% The following \cmd{\@tmpa} macro makes use of the fact that the +% first character of \#1 is ``c'' for lower-case and ``C'' for +% upper-case, in order to wrap the capitalisation-dependent parts in +% macros so that the rest of the code can be capitalisation-variant +% agnostic. % \begin{macrocode} \def\@tmpa##1##2\@nil{% - \if##1c \def\@other{C##2}% - \else\def\@other{c##2}\fi}% + \if##1c% + \def\@other{C##2}% + \def\@changecase{\MakeUppercase}% + \else% + \def\@other{c##2}% + \def\@changecase{\MakeLowercase}% + \fi}% \@tmpa#1\@nil% +% \end{macrocode} +% If the other capitalisation variant is not already defined... +% \begin{macrocode} \@ifundefined{\@other @#2@format}{% - \def\@tmpa##1##2\@nil{% - \if##1c\def\@changecase{\MakeUppercase}% - \else\def\@changecase{\Makelowercase}\fi}% - \@tmpa#1\@nil% +% \end{macrocode} +% Define \cmd{\@tmpa} to be a partial expansion (expanded just once) +% of the capitalisation variant we've just defined above. The +% \cmd{\@toska} token register just makes the code less verbose. +% \begin{macrocode} \newtoks\@toksa% \@toksa={\def\@tmpa##1##2##3}% \expandafter\expandafter\expandafter\the% \expandafter\expandafter\expandafter\@toksa% \expandafter\expandafter\expandafter{% \csname#1@#2@format\endcsname{##1}{##2}{##3}}% - \expandafter\the\expandafter\@toksa\expandafter{% - \expandafter\MakeUppercase\@tmpa{##1}{##2}{##3}}% +% \end{macrocode} +% Add the \cmd{\@changecase} command to the front of the definition of +% \cmd{\@tmpa}. +% \begin{macrocode} + \expandafter\expandafter\expandafter\the% + \expandafter\expandafter\expandafter\@toksa% + \expandafter\expandafter\expandafter{% + \expandafter\@changecase\@tmpa{##1}{##2}{##3}}% +% \end{macrocode} +% Define the other capitalisation variant to be the partial expansion +% (expanded just once) of \cmd{\@tmpa}. +% \begin{macrocode} \@toksa={% \expandafter\def\csname\@other @#2@format\endcsname##1##2##3}% \expandafter\the\expandafter\@toksa\expandafter{% @@ -1437,27 +2129,48 @@ \expandafter\def\csname #1@#2@format\endcsname% ##1##2##3##4##5##6{#3}% % \end{macrocode} -% Note that these \cmd{\@tmpa} macros make use of the fact that the -% first character of \#1 is ``c'' for lower-case, ``C'' for -% upper-case. +% The following \cmd{\@tmpa} macro makes use of the fact that the +% first character of \#1 is ``c'' for lower-case and ``C'' for +% upper-case, in order to wrap the capitalisation-dependent parts in +% macros so that the rest of the code can be capitalisation-variant +% agnostic. % \begin{macrocode} \def\@tmpa##1##2\@nil{% - \if##1c \def\@other{C##2}% - \else\def\@other{c##2}\fi}% + \if##1c% + \def\@other{C##2}% + \def\@changecase{\MakeUppercase}% + \else% + \def\@other{c##2}% + \def\@changecase{\MakeLowercase}% + \fi}% \@tmpa#1\@nil% +% \end{macrocode} +% If the other capitalisation variant is not already defined... +% \begin{macrocode} \@ifundefined{\@other @#2@format}{% - \def\@tmpa##1##2\@nil{% - \if##1c\def\@changecase{\MakeUppercase}% - \else\def\@changecase{\Makelowercase}\fi}% - \@tmpa#1\@nil% +% \end{macrocode} +% Define \cmd{\@tmpa} to be a partial expansion (expanded just once) +% of the capitalisation variant we've just defined above. The +% \cmd{\@toska} token register just makes the code less verbose. +% \begin{macrocode} \newtoks\@toksa% \@toksa={\def\@tmpa##1##2##3##4##5##6}% \expandafter\expandafter\expandafter\the% \expandafter\expandafter\expandafter\@toksa% \expandafter\expandafter\expandafter{% \csname#1@#2@format\endcsname{##1}{##2}{##3}{##4}{##5}{##6}}% - \expandafter\the\expandafter\@toksa\expandafter{% - \expandafter\MakeUppercase\@tmpa{##1}{##2}{##3}{##4}{##5}{##6}} +% \end{macrocode} +% Add the \cmd{\@changecase} command to the front of the definition of +% \cmd{\@tmpa}. +% \begin{macrocode} + \expandafter\expandafter\expandafter\the% + \expandafter\expandafter\expandafter\@toksa% + \expandafter\expandafter\expandafter{% + \expandafter\@changecase\@tmpa{##1}{##2}{##3}{##4}{##5}{##6}}% +% \end{macrocode} +% Define the other capitalisation variant to be the partial expansion +% (expanded just once) of \cmd{\@tmpa}. +% \begin{macrocode} \@toksa={\expandafter\def% \csname\@other @#2@format\endcsname##1##2##3##4##5##6}% \expandafter\the\expandafter\@toksa\expandafter{% @@ -1465,38 +2178,70 @@ }{}% } % -\def\@crefmultiformat#1#2#3#4#5{% +\def\@crefmultiformat#1#2#3#4#5#6{% \expandafter\def\csname #1@#2@format@first\endcsname##1##2##3{#3}% - \expandafter\def\csname #1@#2@format@middle\endcsname##1##2##3{#4}% - \expandafter\def\csname #1@#2@format@last\endcsname##1##2##3{#5}% + \expandafter\def\csname #1@#2@format@second\endcsname##1##2##3{#4}% + \expandafter\def\csname #1@#2@format@middle\endcsname##1##2##3{#5}% + \expandafter\def\csname #1@#2@format@last\endcsname##1##2##3{#6}% % \end{macrocode} -% Note that these \cmd{\@tmpa} macros make use of the fact that the -% first character of \#1 is ``c'' for lower-case, ``C'' for -% upper-case. +% The following \cmd{\@tmpa} macro makes use of the fact that the +% first character of \#1 is ``c'' for lower-case and ``C'' for +% upper-case, in order to wrap the capitalisation-dependent parts in +% macros so that the rest of the code can be capitalisation-variant +% agnostic. % \begin{macrocode} - \newtoks\@toksa% \def\@tmpa##1##2\@nil{% - \if##1c \def\@other{C##2}% - \else\def\@other{c##2}\fi}% + \if##1c% + \def\@other{C##2}% + \def\@changecase{\MakeUppercase}% + \else% + \def\@other{c##2}% + \def\@changecase{\MakeLowercase}% + \fi}% \@tmpa#1\@nil% +% \end{macrocode} +% If the other capitalisation variant of the first part of the +% multi-format definition is not already defined... +% \begin{macrocode} \@ifundefined{\@other @#2@format@first}{% - \def\@tmpa##1##2\@nil{% - \if##1c\def\@changecase{\MakeUppercase}% - \else\def\@changecase{\Makelowercase}\fi}% - \@tmpa#1\@nil% +% \end{macrocode} +% Define \cmd{\@tmpa} to be a partial expansion (expanded just once) +% of the capitalisation variant we've just defined above. The +% \cmd{\@toska} token register just makes the code less verbose. +% \begin{macrocode} \@toksa={\def\@tmpa##1##2##3}% \expandafter\expandafter\expandafter\the% \expandafter\expandafter\expandafter\@toksa% \expandafter\expandafter\expandafter{% \csname#1@#2@format@first\endcsname{##1}{##2}{##3}}% - \expandafter\the\expandafter\@toksa\expandafter{% - \expandafter\MakeUppercase\@tmpa{##1}{##2}{##3}}% +% \end{macrocode} +% Add the \cmd{\@changecase} command to the front of the definition of +% \cmd{\@tmpa}. +% \begin{macrocode} + \expandafter\expandafter\expandafter\the% + \expandafter\expandafter\expandafter\@toksa% + \expandafter\expandafter\expandafter{% + \expandafter\@changecase\@tmpa{##1}{##2}{##3}}% +% \end{macrocode} +% Define the other capitalisation variant to be the partial expansion +% (expanded just once) of \cmd{\@tmpa}. +% \begin{macrocode} \@toksa={% \expandafter\def\csname\@other @#2@format@first\endcsname% ##1##2##3}% \expandafter\the\expandafter\@toksa\expandafter{% \@tmpa{##1}{##2}{##3}}% - }{} + }{}% +% \end{macrocode} +% The other parts of the multi-format definition are defined to be +% identical for both capitalisation variants. +% \begin{macrocode} + \@ifundefined{\@other @#2@format@second}{% + \@toksa={% + \expandafter\let\csname\@other @#2@format@second\endcsname}% + \expandafter\the\expandafter\@toksa% + \csname #1@#2@format@second\endcsname% + }{}% \@ifundefined{\@other @#2@format@middle}{% \@toksa={% \expandafter\let\csname\@other @#2@format@middle\endcsname}% @@ -1511,41 +2256,75 @@ }{}% } % -\def\@crefrangemultiformat#1#2#3#4#5{% +\def\@crefrangemultiformat#1#2#3#4#5#6{% \expandafter\def\csname #1@#2@format@first\endcsname% ##1##2##3##4##5##6{#3}% - \expandafter\def\csname #1@#2@format@middle\endcsname% + \expandafter\def\csname #1@#2@format@second\endcsname% ##1##2##3##4##5##6{#4}% - \expandafter\def\csname #1@#2@format@last\endcsname% + \expandafter\def\csname #1@#2@format@middle\endcsname% ##1##2##3##4##5##6{#5}% + \expandafter\def\csname #1@#2@format@last\endcsname% + ##1##2##3##4##5##6{#6}% % \end{macrocode} -% Note that these \cmd{\@tmpa} macros make use of the fact that the -% first character of \#1 is ``c'' for lower-case, ``C'' for -% upper-case. +% The following \cmd{\@tmpa} macro makes use of the fact that the +% first character of \#1 is ``c'' for lower-case and ``C'' for +% upper-case, in order to wrap the capitalisation-dependent parts in +% macros so that the rest of the code can be capitalisation-variant +% agnostic. % \begin{macrocode} \def\@tmpa##1##2\@nil{% - \if##1c \def\@other{C##2}% - \else\def\@other{c##2}\fi}% + \if##1c% + \def\@other{C##2}% + \def\@changecase{\MakeUppercase}% + \else% + \def\@other{c##2}% + \def\@changecase{\MakeLowercase}% + \fi}% \@tmpa#1\@nil% +% \end{macrocode} +% If the other capitalisation variant of the first part of the +% multi-format definition is not already defined... +% \begin{macrocode} \@ifundefined{\@other @#2@format@first}{% - \def\@tmpa##1##2\@nil{% - \if##1c\def\@changecase{\MakeUppercase}% - \else\def\@changecase{\MakeLowercase}\fi}% - \@tmpa#1\@nil% +% \end{macrocode} +% Define \cmd{\@tmpa} to be a partial expansion (expanded just once) +% of the capitalisation variant we've just defined above. The +% \cmd{\@toska} token register just makes the code less verbose. +% \begin{macrocode} \@toksa={\def\@tmpa##1##2##3##4##5##6}% \expandafter\expandafter\expandafter\the% \expandafter\expandafter\expandafter\@toksa% \expandafter\expandafter\expandafter{% \csname#1@#2@format@first\endcsname% {##1}{##2}{##3}{##4}{##5}{##6}}% - \expandafter\the\expandafter\@toksa\expandafter{% - \expandafter\MakeUppercase\@tmpa{##1}{##2}{##3}{##4}{##5}{##6}}% +% \end{macrocode} +% Add the \cmd{\@changecase} command to the front of the definition of +% \cmd{\@tmpa}. +% \begin{macrocode} + \expandafter\expandafter\expandafter\the% + \expandafter\expandafter\expandafter\@toksa% + \expandafter\expandafter\expandafter{% + \expandafter\@changecase\@tmpa{##1}{##2}{##3}{##4}{##5}{##6}}% +% \end{macrocode} +% Define the other capitalisation variant to be the partial expansion +% (expanded just once) of \cmd{\@tmpa}. +% \begin{macrocode} \@toksa={% \expandafter\def\csname\@other @#2@format@first\endcsname% ##1##2##3##4##5##6}% \expandafter\the\expandafter\@toksa\expandafter{% \@tmpa{##1}{##2}{##3}{##4}{##5}{##6}}% }{}% +% \end{macrocode} +% The other parts of the multi-format definition are defined to be +% identical for both capitalisation variants. +% \begin{macrocode} + \@ifundefined{\@other @#2@format@second}{% + \@toksa={% + \expandafter\let\csname\@other @#2@format@second\endcsname}% + \expandafter\the\expandafter\@toksa% + \csname #1@#2@format@second\endcsname% + }{}% \@ifundefined{\@other @#2@format@middle}{% \@toksa={% \expandafter\let\csname\@other @#2@format@middle\endcsname}% @@ -1563,229 +2342,237 @@ % % % \subsection{Default Reference Formats} -% Define the default reference formats, appropriate for \LaTeX{} -% documents written in English. We define the lowercase and -% capitalised versions separately, rather than relying on the -% automatic definitions, because the code produced by the poor man's -% sed script is then slightly tidier.\\ -% To-Do: add babel support -% \begin{macrocode} -\crefformat{equation}{eq.~\textup{(#2#1#3)}} -\Crefformat{equation}{Equation~\textup{(#2#1#3)}} -\crefformat{chapter}{chapter~#2#1#3} -\Crefformat{chapter}{Chapter~#2#1#3} -\crefformat{section}{section~#2#1#3} -\Crefformat{section}{Section~#2#1#3} -\crefformat{subsection}{section~#2#1#3} -\Crefformat{subsection}{Section~#2#1#3} -\crefformat{subsubsection}{section~#2#1#3} -\Crefformat{subsubsection}{Section~#2#1#3} -\crefformat{subsubsubsection}{section~#2#1#3} -\Crefformat{subsubsubsection}{Section~#2#1#3} -\crefformat{figure}{fig.~#2#1#3} -\Crefformat{figure}{Figure~#2#1#3} -\crefformat{theorem}{theorem~#2#1#3} -\Crefformat{theorem}{Theorem~#2#1#3} -\crefformat{enumi}{item~#2#1#3} -\Crefformat{enumi}{Item~#2#1#3} -\crefformat{enumii}{item~#2#1#3} -\Crefformat{enumii}{Item~#2#1#3} -\crefformat{enumiii}{item~#2#1#3} -\Crefformat{enumiii}{Item~#2#1#3} -\crefformat{enumiv}{item~#2#1#3} -\Crefformat{enumiv}{Item~#2#1#3} -% -\crefmultiformat{equation}% - {eqs.~\textup{(#2#1#3)}}% - {, \textup{(#2#1#3)}}% - { and~\textup{(#2#1#3)}} -\Crefmultiformat{equation}% - {Equations~\textup{(#2#1#3)}}% - {, \textup{(#2#1#3)}}% - { and~\textup{(#2#1#3)}} -\crefmultiformat{chapter}% - {chapters~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\Crefmultiformat{chapter}% - {Chapters~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\crefmultiformat{section}% - {sections~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\Crefmultiformat{section}% - {Sections~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\crefmultiformat{subsection}% - {sections~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\Crefmultiformat{subsection}% - {Sections~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\crefmultiformat{subsubsection}% - {sections~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\Crefmultiformat{subsubsection}% - {Sections~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\crefmultiformat{subsubsubsection}% - {sections~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\Crefmultiformat{subsubsubsection}% - {Sections~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\crefmultiformat{figure}% - {figs.~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\Crefmultiformat{figure}% - {Figures~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\crefmultiformat{theorem}% - {theorems~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\Crefmultiformat{theorem}% - {Theorems~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\crefmultiformat{enumi}% - {items~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\Crefmultiformat{enumi}% - {Items~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\crefmultiformat{enumii}% - {items~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\Crefmultiformat{enumii}% - {Items~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\crefmultiformat{enumiii}% - {items~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\Crefmultiformat{enumiii}% - {Items~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\crefmultiformat{enumiv}% - {items~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\Crefmultiformat{enumiv}% - {Items~#2#1#3}{, #2#1#3}{ and~#2#1#3} -% -\crefrangeformat{equation}{% - eqs.~\textup{(#3#1#4)}--\textup{(#5#2#6)}} -\Crefrangeformat{equation}{% - Equations~\textup{(#3#1#4)}--\textup{(#5#2#6)}} -\crefrangeformat{chapter}{chapters~#3#1#4--#5#2#6} -\Crefrangeformat{chapter}{Chapters~#3#1#4--#5#2#6} -\crefrangeformat{section}{sections~#3#1#4--#5#2#6} -\Crefrangeformat{section}{Sections~#3#1#4--#5#2#6} -\crefrangeformat{subsection}{sections~#3#1#4--#5#2#6} -\Crefrangeformat{subsection}{Sections~#3#1#4--#5#2#6} -\crefrangeformat{subsubsection}{sections~#3#1#4--#5#2#6} -\Crefrangeformat{subsubsection}{Sections~#3#1#4--#5#2#6} -\crefrangeformat{subsubsubsection}{sections~#3#1#4--#5#2#6} -\Crefrangeformat{subsubsubsection}{Sections~#3#1#4--#5#2#6} -\crefrangeformat{figure}{figs.~#3#1#4--#5#2#6} -\Crefrangeformat{figure}{Figures~#3#1#4--#5#2#6} -\crefrangeformat{theorem}{theorems~#3#1#4--#5#2#6} -\Crefrangeformat{theorem}{Theorems~#3#1#4--#5#2#6} -\crefrangeformat{enumi}{items~#3#1#4--#5#2#6} -\Crefrangeformat{enumi}{Items~#3#1#4--#5#2#6} -\crefrangeformat{enumii}{items~#3#1#4--#5#2#6} -\Crefrangeformat{enumii}{Items~#3#1#4--#5#2#6} -\crefrangeformat{enumiii}{items~#3#1#4--#5#2#6} -\Crefrangeformat{enumiii}{Items~#3#1#4--#5#2#6} -\crefrangeformat{enumiv}{items~#3#1#4--#5#2#6} -\Crefrangeformat{enumiv}{Items~#3#1#4--#5#2#6} -% -\crefrangemultiformat{equation}% - {eqs.~\textup{(#3#1#4)}--\textup{(#5#2#6)}}% - {, \textup{(#3#1#4)}--\textup{(#5#2#6)}}% - { and~\textup{(#3#1#4)}--\textup{(#5#2#6)}} -\Crefrangemultiformat{equation}% - {Equations~\textup{(#3#1#4)}--\textup{(#5#2#6)}}% - {, \textup{(#3#1#4)}--\textup{(#5#2#6)}}% - { and~\textup{(#3#1#4)}--\textup{(#5#2#6)}} -\crefrangemultiformat{chapter}% - {chapters~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\Crefrangemultiformat{chapter}% - {Chapters~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\crefrangemultiformat{section}% - {sections~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\Crefrangemultiformat{section}% - {Sections~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\crefrangemultiformat{subsection}% - {sections~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\Crefrangemultiformat{subsection}% - {Sections~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\crefrangemultiformat{subsubsection}% - {sections~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\Crefrangemultiformat{subsubsection}% - {Sections~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\crefrangemultiformat{subsubsubsection}% - {sections~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\Crefrangemultiformat{subsubsubsection}% - {Sections~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\crefrangemultiformat{figure}% - {figs.~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\Crefrangemultiformat{figure}% - {Figures~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\crefrangemultiformat{theorem}% - {theorems~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\Crefrangemultiformat{theorem}% - {Theorems~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\crefrangemultiformat{enumi}% - {items~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\Crefrangemultiformat{enumi}% - {Items~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\crefrangemultiformat{enumii}% - {items~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\Crefrangemultiformat{enumii}% - {Items~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\crefrangemultiformat{enumiii}% - {items~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\Crefrangemultiformat{enumiii}% - {Items~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\crefrangemultiformat{enumiv}% - {items~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\Crefrangemultiformat{enumiv}% - {Items~#3#1#4--#5#2#6}% - {, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -% -\def\crefmiddleconjunction{, } -\def\creflastconjunction{, and } +% We define default reference format components appropriate for +% \LaTeX{} documents written in English.\\ +% FIXME: add babel support +% +% The following must be defined before the user has the chance to +% customise anything, otherwise the component commands will not work. +% \begin{macrocode} +\newcommand{\crefrangeconjunction}{ to~} +\newcommand{\crefpairconjunction}{ and~} +\newcommand{\crefmiddleconjunction}{, } +\newcommand{\creflastconjunction}{ and~} +\crefdefaultlabelformat{#2#1#3} +% \end{macrocode} +% +% Define default format components. We want don't want these to be +% defined during the document preamble in case the user defines them +% themselves (automatic definition of the other capitalisation variant +% would fail). Therefore, we postpone actual definition of the formats +% until the beginning of the document, and only define those +% that haven't already been defined.\\ +% FIXME: add babel support +% \begin{macrocode} +\AtBeginDocument{% +% \end{macrocode} +% If the group conjunctions haven't been defined, define them to be +% identical to the reference conjunctions. +% \begin{macrocode} + \@ifundefined{crefpairgroupconjunction}{% + \let\crefpairgroupconjunction\crefpairconjunction}{}% + \@ifundefined{crefmiddlegroupconjunction}{% + \let\crefmiddlegroupconjunction\crefmiddleconjunction}{}% +% \end{macrocode} +% If the last reference conjunction hasn't been modified from its +% default, define the last group conjunction to include an extra +% comma. However, if the user has modified the last reference +% conjunction but hasn't defined the last group conjunction, they will +% expect the last group conjunction to be identical to their last +% reference conjunction definition, so do that. +% \begin{macrocode} + \@ifundefined{creflastgroupconjunction}{% + \def\@tmpa{ and~}% + \ifx\creflastconjunction\@tmpa% + \def\creflastgroupconjunction{, and~}% + \else% + \let\creflastgroupconjunction\creflastconjunction% + \fi}{}% +% \end{macrocode} +% Define default names (and in the case of equations, also the label +% format). We define the lowercase and capitalised versions +% separately, rather than relying on the automatic definitions, +% because the code produced by the poor man's sed script is then +% slightly tidier. +% \begin{macrocode} + \@ifundefined{cref@equation@name}{% + \@crefname{cref}{equation}{eq.}{eqs.}% + \@crefname{Cref}{equation}{Equation}{Equations}}{}% + \@ifundefined{cref@equation@label}{% + \@creflabelformat{equation}{\textup{(#2#1#3)}}% + \@ifundefined{cref@equation@rangelabel}{% + \@crefrangelabelformat{equation}{% + \textup{(#3#1#4)}--\textup{(#5#2#6)}}}{}}{}% + \@ifundefined{cref@chapter@name}{% + \@crefname{cref}{chapter}{chapter}{chapters}% + \@crefname{Cref}{chapter}{Chapter}{Chapters}}{}% + \@ifundefined{cref@section@name}{% + \@crefname{cref}{section}{section}{sections}% + \@crefname{Cref}{section}{Section}{Sections}}{}% + \@ifundefined{cref@subsection@name}{% + \@crefname{cref}{subsection}{section}{sections}% + \@crefname{Cref}{subsection}{Section}{Sections}}{}% + \@ifundefined{cref@subsubsection@name}{% + \@crefname{cref}{subsubsection}{section}{sections}% + \@crefname{Cref}{subsubsection}{Section}{Sections}}{}% + \@ifundefined{cref@subsubsubsection@name}{% + \@crefname{cref}{subsubsubsection}{section}{sections}% + \@crefname{Cref}{subsubsubsection}{Section}{Sections}}{}% + \@ifundefined{cref@figure@name}{% + \@crefname{cref}{figure}{fig.}{figs.}% + \@crefname{Cref}{figure}{Figure}{Figures}}{}% + \@ifundefined{cref@figure@rangelabel}{% + \@crefrangelabelformat{figure}{#3#1#4--#5#2#6}}{}% + \@ifundefined{cref@table@name}{% + \@crefname{cref}{table}{table}{tables}% + \@crefname{Cref}{table}{Table}{Tables}}{}% + \@ifundefined{cref@theorem@name}{% + \@crefname{cref}{theorem}{theorem}{theorems}% + \@crefname{Cref}{theorem}{Theorem}{Theorems}}{}% + \@ifundefined{cref@enumi@name}{% + \@crefname{cref}{enumi}{item}{items}% + \@crefname{Cref}{enumi}{Item}{Items}}{}% + \@ifundefined{cref@enumii@name}{% + \@crefname{cref}{enumii}{item}{items}% + \@crefname{Cref}{enumii}{Item}{Items}}{}% + \@ifundefined{cref@enumiii@name}{% + \@crefname{cref}{enumiii}{item}{items}% + \@crefname{Cref}{enumiii}{Item}{Items}}{}% + \@ifundefined{cref@enumiv@name}{% + \@crefname{cref}{enumiv}{item}{items}% + \@crefname{Cref}{enumiv}{Item}{Items}}{}% + \@ifundefined{cref@enumv@name}{% + \@crefname{cref}{enumv}{item}{items}% + \@crefname{Cref}{enumv}{Item}{Items}}{}% +% \end{macrocode} +% Define any undefined formats using the components. +% \begin{macrocode} + \@ifundefined{cref@equation@format}{% + \@crefdefineformat{equation}}{}% + \@ifundefined{crefrange@equation@format}{% + \@crefrangedefineformat{equation}}{}% + \@ifundefined{cref@equation@format@first}{% + \@crefdefinemultiformat{equation}}{}% + \@ifundefined{crefrange@equation@format@first}{% + \@crefrangedefinemultiformat{equation}}{}% + \@ifundefined{cref@chapter@format}{% + \@crefdefineformat{chapter}}{}% + \@ifundefined{crefrange@chapter@format}{% + \@crefrangedefineformat{chapter}}{}% + \@ifundefined{cref@chapter@format@first}{% + \@crefdefinemultiformat{chapter}}{}% + \@ifundefined{crefrange@chapter@format@first}{% + \@crefrangedefinemultiformat{chapter}}{}% + \@ifundefined{cref@section@format}{% + \@crefdefineformat{section}}{}% + \@ifundefined{crefrange@section@format}{% + \@crefrangedefineformat{section}}{}% + \@ifundefined{cref@section@format@first}{% + \@crefdefinemultiformat{section}}{}% + \@ifundefined{crefrange@section@format@first}{% + \@crefrangedefinemultiformat{section}}{}% + \@ifundefined{cref@subsection@format}{% + \@crefdefineformat{subsection}}{}% + \@ifundefined{crefrange@subsection@format}{% + \@crefrangedefineformat{subsection}}{}% + \@ifundefined{cref@subsection@format@first}{% + \@crefdefinemultiformat{subsection}}{}% + \@ifundefined{crefrange@subsection@format@first}{% + \@crefrangedefinemultiformat{subsection}}{}% + \@ifundefined{cref@subsubsection@format}{% + \@crefdefineformat{subsubsection}}{}% + \@ifundefined{crefrange@subsubsection@format}{% + \@crefrangedefineformat{subsubsection}}{}% + \@ifundefined{cref@subsubsection@format@first}{% + \@crefdefinemultiformat{subsubsection}}{}% + \@ifundefined{crefrange@subsubsection@format@first}{% + \@crefrangedefinemultiformat{subsubsection}}{}% + \@ifundefined{cref@subsubsubsection@format}{% + \@crefdefineformat{subsubsubsection}}{}% + \@ifundefined{crefrange@subsubsubsection@format}{% + \@crefrangedefineformat{subsubsubsection}}{}% + \@ifundefined{cref@subsubsubsection@format@first}{% + \@crefdefinemultiformat{subsubsubsection}}{}% + \@ifundefined{crefrange@subsubsubsection@format@first}{% + \@crefrangedefinemultiformat{subsubsubsection}}{}% + \@ifundefined{cref@figure@format}{% + \@crefdefineformat{figure}}{}% + \@ifundefined{crefrange@figure@format}{% + \@crefrangedefineformat{figure}}{}% + \@ifundefined{cref@figure@format@first}{% + \@crefdefinemultiformat{figure}}{}% + \@ifundefined{crefrange@figure@format@first}{% + \@crefrangedefinemultiformat{figure}}{}% + \@ifundefined{cref@theorem@format}{% + \@crefdefineformat{theorem}}{}% + \@ifundefined{crefrange@theorem@format}{% + \@crefrangedefineformat{theorem}}{}% + \@ifundefined{cref@theorem@format@first}{% + \@crefdefinemultiformat{theorem}}{}% + \@ifundefined{crefrange@theorem@format@first}{% + \@crefrangedefinemultiformat{theorem}}{}% + \@ifundefined{cref@enumi@format}{% + \@crefdefineformat{enumi}}{}% + \@ifundefined{crefrange@enumi@format}{% + \@crefrangedefineformat{enumi}}{}% + \@ifundefined{cref@enumi@format@first}{% + \@crefdefinemultiformat{enumi}}{}% + \@ifundefined{crefrange@enumi@format@first}{% + \@crefrangedefinemultiformat{enumi}}{}% + \@ifundefined{cref@enumii@format}{% + \@crefdefineformat{enumii}}{}% + \@ifundefined{crefrange@enumii@format}{% + \@crefrangedefineformat{enumii}}{}% + \@ifundefined{cref@enumii@format@first}{% + \@crefdefinemultiformat{enumii}}{}% + \@ifundefined{crefrange@enumii@format@first}{% + \@crefrangedefinemultiformat{enumii}}{}% + \@ifundefined{cref@enumiii@format}{% + \@crefdefineformat{enumiii}}{}% + \@ifundefined{crefrange@enumiii@format}{% + \@crefrangedefineformat{enumiii}}{}% + \@ifundefined{cref@enumiii@format@first}{% + \@crefdefinemultiformat{enumiii}}{}% + \@ifundefined{crefrange@enumiii@format@first}{% + \@crefrangedefinemultiformat{enumiii}}{}% + \@ifundefined{cref@enumiv@format}{% + \@crefdefineformat{enumiv}}{}% + \@ifundefined{crefrange@enumiv@format}{% + \@crefrangedefineformat{enumiv}}{}% + \@ifundefined{cref@enumiv@format@first}{% + \@crefdefinemultiformat{enumiv}}{}% + \@ifundefined{crefrange@enumiv@format@first}{% + \@crefrangedefinemultiformat{enumiv}}{}% + \@ifundefined{cref@enumiv@format}{% + \@crefdefineformat{enumiv}}{}% + \@ifundefined{crefrange@enumiv@format}{% + \@crefrangedefineformat{enumiv}}{}% + \@ifundefined{cref@enumiv@format@first}{% + \@crefdefinemultiformat{enumiv}}{}% + \@ifundefined{crefrange@enumiv@format@first}{% + \@crefrangedefinemultiformat{enumiv}}{}% +} % \end{macrocode} % % % \subsection{\package{hyperref} Support} -% \begin{macrocode} -\DeclareOption{hyperref}{% -\PackageInfo{cleveref}{option `hyperref' loaded} +% If the \package{hyperref} package is loaded, we add hyper-link +% support to \package{cleveref}. Since \package{hyperref} messes +% around with some of the same \LaTeX{} internals as +% \package{cleveref}, we also have to override some of its +% redefinitions so that they work with \package{cleveref}. +% \begin{macrocode} +\@ifpackageloaded{hyperref}{% +\PackageInfo{cleveref}{`hyperref' support loaded} +\@ifpackagewith{hyperref}{backref}{% + \PackageError{cleveref}{`cleveref' is currently incompatible with + `hyperref's `backref' option}{Remove the `backref' option from + `hyperref' if you want to use `cleveref'}}{} % \end{macrocode} % We redefine the utility macros to cope with the extra arguments % supplied by hyperref (via the aux file). % \begin{macrocode} -\def\cref@label#1#2#3#4#5{\@result} +\def\cref@reflabel#1#2#3#4#5{\@result} \def\cref@hyperref#1{\expandafter\expandafter\expandafter% \@fourthoffive\csname r@#1\endcsname} \def\cref@getlabel#1#2{% @@ -1793,15 +2580,15 @@ \edef\@tempa{\expandafter\@firstoffive\@tempa}% \expandafter\@cref@getlabel\@tempa\@nil#2} \def\cref@gettype#1#2{% - \expandafter\let\expandafter\@tempa\csname r@#1\endcsname + \expandafter\let\expandafter\@tempa\csname r@#1\endcsname% \edef\@tempa{\expandafter\@firstoffive\@tempa}% \expandafter\@cref@gettype\@tempa\@nil#2} \def\cref@getcounter#1#2{% - \expandafter\let\expandafter\@tempa\csname r@#1\endcsname + \expandafter\let\expandafter\@tempa\csname r@#1\endcsname% \edef\@tempa{\expandafter\@firstoffive\@tempa}% \expandafter\@cref@getcounter\@tempa\@nil#2} \def\cref@getprefix#1#2{% - \expandafter\let\expandafter\@tempa\csname r@#1\endcsname + \expandafter\let\expandafter\@tempa\csname r@#1\endcsname% \edef\@tempa{\expandafter\@firstoffive\@tempa}% \expandafter\@cref@getprefix\@tempa\@nil#2} % \end{macrocode} @@ -1853,15 +2640,17 @@ \DeclareRobustCommand{\Crefrange}{% \@ifstar{\@crefrangestar{Cref}}{\@crefrangenostar{Cref}}} \def\@crefnostar#1#2{\@cref{#1}{#2}} -\def\@crefstar#1#2{\@crefstarredtrue\@cref{#1}{#2}\@crefstarredfalse} +\def\@crefstar#1#2{% + \@crefstarredtrue\@crefnostar{#1}{#2}\@crefstarredfalse} \def\@crefrangenostar#1#2#3{\@setcrefrange{#2}{#3}{#1}{}} \def\@crefrangestar#1#2#3{% - \@crefstarredtrue\@setcrefrange{#2}{#3}{#1}{}\@crefstarredfalse} + \@crefstarredtrue\@crefrangenostar{#1}{#2}{#3}\@crefstarredfalse} % \end{macrocode} % -% Redefine \@@setcref and \@@setrangeref to create hyper-links (unless -% the starred flag is set), using the extra arguments supplied in -% \cmd{\r@\meta{label}} (via the aux file) by \package{hyperref}. +% Redefine \cmd{\@@setcref} and \cmd{\@@setrangeref} to create +% hyper-links (unless the starred flag is set), using the extra +% arguments supplied in \cmd{\r@\meta{label}} (via the aux file) by +% \package{hyperref}. % \begin{macrocode} \def\@@setcref#1#2{% \cref@getlabel{#2}{\@templabel}% @@ -1883,14 +2672,28 @@ {\hyper@linkstart{link}{\@linka}}{\hyper@linkend}% {\hyper@linkstart{link}{\@linkb}}{\hyper@linkend}% \fi} -} % end of hyperref option +}{} % \end{macrocode} % % % \subsection{\package{ntheorem} Support} +% If \package{ntheorem} is loaded, we need to modify its theorem +% referencing features so that they work with \package{cleveref}. % \begin{macrocode} -\DeclareOption{ntheorem}{% -\PackageInfo{cleveref}{option `ntheorem' loaded} +\@ifpackageloaded{ntheorem}{% +\PackageInfo{cleveref}{`ntheorem' support loaded} +\@ifpackagewith{ntheorem}{thref}{% + \PackageWarning{cleveref}{`cleveref' supersedes `ntheorem's `thref' + option}% + \renewcommand{\thref}{\cref}}{} +% \end{macrocode} +% +% Newer versions of \package{ntheorem} require a call to +% \cmd{\theorem@prework} when typesetting theorems. If an older +% version of \package{ntheorem} if 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} % % We modify \package{ntheorem}'s version of the \cmd{\@thm} macro very @@ -1898,100 +2701,83 @@ % argument containing the theorem type. % \begin{macrocode} \gdef\@thm#1#2#3{% - \if@thmmarks + \if@thmmarks% \stepcounter{end\InTheoType ctr}% - \fi + \fi% \renewcommand{\InTheoType}{#1}% - \if@thmmarks + \if@thmmarks% \stepcounter{curr#1ctr}% \setcounter{end#1ctr}{0}% - \fi + \fi% \refstepcounter[#1]{#2}% <<<<< - \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 + \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{macrocode} % % Default formats for new theorem-like environments defined by ntheorem. % \begin{macrocode} -\crefformat{lemma}{lemma~#2#1#3} -\Crefformat{lemma}{Lemma~#2#1#3} -\crefformat{corrollary}{corrollary~#2#1#3} -\Crefformat{corrollary}{Corrollary~#2#1#3} -\crefformat{proposition}{proposition~#2#1#3} -\Crefformat{proposition}{Proposition~#2#1#3} -\crefformat{definition}{definition~#2#1#3} -\Crefformat{definition}{Definition~#2#1#3} -\crefformat{result}{result~#2#1#3} -\Crefformat{result}{Result~#2#1#3} -\crefrangeformat{lemma}{lemma~#3#1#4--#5#2#6} -\Crefrangeformat{lemma}{Lemma~#3#1#4--#5#2#6} -\crefrangeformat{corrollary}{corrollary~#3#1#4--#5#2#6} -\Crefrangeformat{corrollary}{Corrollary~#3#1#4--#5#2#6} -\crefrangeformat{proposition}{proposition~#3#1#4--#5#2#6} -\Crefrangeformat{proposition}{Proposition~#3#1#4--#5#2#6} -\crefrangeformat{definition}{definition~#3#1#4--#5#2#6} -\Crefrangeformat{definition}{Definition~#3#1#4--#5#2#6} -\crefrangeformat{result}{result~#3#1#4--#5#2#6} -\Crefrangeformat{result}{Result~#3#1#4--#5#2#6} -\crefmultiformat{lemma}% - {lemmas~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\Crefmultiformat{lemma}% - {Lemmas~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\crefmultiformat{corrollary}% - {corrollaries~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\Crefmultiformat{corrollary}% - {Corrollaries~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\crefmultiformat{proposition}% - {propositions~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\Crefmultiformat{proposition}% - {Propositions~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\crefmultiformat{definition}% - {definitions~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\Crefmultiformat{definition}% - {Definitions~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\crefmultiformat{result}% - {results~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\Crefmultiformat{result}% - {Results~#2#1#3}{, #2#1#3}{ and~#2#1#3} -\crefrangemultiformat{lemma}% - {lemmas~#3#1#4--#5#2#6}{, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6}% -\Crefrangemultiformat{lemma}% - {Lemmas~#3#1#4--#5#2#6}{, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\crefrangemultiformat{corrollary}% - {corrollaries~#3#1#4--#5#2#6}{, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\Crefrangemultiformat{corrollary}% - {Corrollaries~#3#1#4--#5#2#6}{, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\crefrangemultiformat{proposition}% - {propositions~#3#1#4--#5#2#6}{, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\Crefrangemultiformat{proposition}% - {Propositions~#3#1#4--#5#2#6}{, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\crefrangemultiformat{definition}% - {definitions~#3#1#4--#5#2#6}{, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\Crefrangemultiformat{definition}% - {Definitions~#3#1#4--#5#2#6}{, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\crefrangemultiformat{result}% - {results~#3#1#4--#5#2#6}{, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -\Crefrangemultiformat{result}% - {Results~#3#1#4--#5#2#6}{, #3#1#4--#5#2#6}% - { and~#3#1#4--#5#2#6} -} % end of ntheorem option +\AtBeginDocument{% + \@ifundefined{cref@lemma@name}{% + \@crefname{cref}{lemma}{lemma}{lemmas}% + \@crefname{Cref}{lemma}{Lemma}{Lemmas}}{}% + \@ifundefined{cref@corollary@name}{% + \@crefname{cref}{corollary}{corollary}{corollaries}% + \@crefname{Cref}{corollary}{Corollary}{Corollaries}}{}% + \@ifundefined{cref@proposition@name}{% + \@crefname{cref}{proposition}{proposition}{propositions}% + \@crefname{Cref}{proposition}{Proposition}{Proposition}}{}% + \@ifundefined{cref@definition@name}{% + \@crefname{cref}{definition}{definition}{definitions}% + \@crefname{Cref}{definition}{Definition}{Definitions}}{}% + \@ifundefined{cref@result@name}{% + \@crefname{cref}{result}{result}{results}% + \@crefname{cref}{result}{Result}{Results}}{}% +% \end{macrocode} +% Define any undefined formats using the components. +% \begin{macrocode} + \@ifundefined{cref@lemma@format}{% + \@crefdefineformat{lemma}}{}% + \@ifundefined{crefrange@lemma@format}{% + \@crefrangedefineformat{lemma}}{}% + \@ifundefined{cref@lemma@format@first}{% + \@crefdefinemultiformat{lemma}}{}% + \@ifundefined{crefrange@lemma@format@first}{% + \@crefrangedefinemultiformat{lemma}}{}% + \@ifundefined{cref@corollary@format}{% + \@crefdefineformat{corollary}}{}% + \@ifundefined{crefrange@corollary@format}{% + \@crefrangedefineformat{corollary}}{}% + \@ifundefined{cref@corollary@format@first}{% + \@crefdefinemultiformat{corollary}}{}% + \@ifundefined{crefrange@corollary@format@first}{% + \@crefrangedefinemultiformat{corollary}}{}% + \@ifundefined{cref@definition@format}{% + \@crefdefineformat{definition}}{}% + \@ifundefined{crefrange@definition@format}{% + \@crefrangedefineformat{definition}}{}% + \@ifundefined{cref@definition@format@first}{% + \@crefdefinemultiformat{definition}}{}% + \@ifundefined{crefrange@definition@format@first}{% + \@crefrangedefinemultiformat{definition}}{}% + \@ifundefined{cref@result@format}{% + \@crefdefineformat{result}}{}% + \@ifundefined{crefrange@result@format}{% + \@crefrangedefineformat{result}}{}% + \@ifundefined{cref@result@format@first}{% + \@crefdefinemultiformat{result}}{}% + \@ifundefined{crefrange@result@format@first}{% + \@crefrangedefinemultiformat{result}}{}% +}% +}{} % \end{macrocode} % % @@ -2024,7 +2810,7 @@ % 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 appearning here +% (easy) way to change the catcodes of the characters appearing here % before they are tokenised. In one way this is convenient: the % catcode changes we make don't ``take'' until evaluated, so we can % continue to use the standard \TeX characters ($\backslash$, \{, \} @@ -2072,21 +2858,21 @@ % \begin{macrocode} \def\cref@text{}% \immediate\read\@crefscript to \@tmpa% - \edef\@tmpa{\@tmpa}% \ifx\@tmpa\@eof% \@not@eoffalse% \else% \@not@eoftrue% + \edef\@tmpa{\@tmpa}% \fi% \@whilesw\if@not@eof\fi{% \expandafter\g@addto@macro\expandafter\cref@text\expandafter{% \@tmpa^^J}% \immediate\read\@crefscript to \@tmpa% - \edef\@tmpa{\@tmpa}% \ifx\@tmpa\@eof% \@not@eoffalse% \else% \@not@eoftrue% + \edef\@tmpa{\@tmpa}% \fi}% \endgroup% \immediate\closein\@crefscript% @@ -2100,27 +2886,63 @@ \lccode`|=92 \lccode`<=123 \lccode`>=125 \lccode`C=67 \lowercase{\edef\@tmpa{s/||usepackage|(|[.*|]|)|?<cleveref>//g}}% \expandafter\g@addto@macro\expandafter\cref@text\expandafter{% - \@tmpa^^J} + \@tmpa^^J}% \lowercase{\edef\@tmpa{s/||[cC]refformat<.*><.*>//g}}% \expandafter\g@addto@macro\expandafter\cref@text\expandafter{% - \@tmpa^^J} + \@tmpa^^J}% \lowercase{\edef\@tmpa{s/||[cC]refrangeformat<.*><.*>//g}}% \expandafter\g@addto@macro\expandafter\cref@text\expandafter{% - \@tmpa^^J} + \@tmpa^^J}% \lowercase{\edef\@tmpa{s/||[cC]refmultiformat<.*><.*><.*><.*>//g}}% \expandafter\g@addto@macro\expandafter\cref@text\expandafter{% - \@tmpa^^J} + \@tmpa^^J}% \lowercase{\edef\@tmpa{% s/||[cC]refrangemultiformat<.*><.*><.*><.*>//g}}% \expandafter\g@addto@macro\expandafter\cref@text\expandafter{% - \@tmpa^^J} + \@tmpa^^J}% + \lowercase{\edef\@tmpa{s/||[cC]refname<.*><.*>//g}}% + \expandafter\g@addto@macro\expandafter\cref@text\expandafter{% + \@tmpa^^J}% + \lowercase{\edef\@tmpa{s/||[cC]reflabelformat<.*><.*>//g}}% + \expandafter\g@addto@macro\expandafter\cref@text\expandafter{% + \@tmpa^^J}% + \lowercase{\edef\@tmpa{s/||[cC]refrangelabelformat<.*><.*>//g}}% + \expandafter\g@addto@macro\expandafter\cref@text\expandafter{% + \@tmpa^^J}% + \lowercase{\edef\@tmpa{s/||[cC]refdefaultlabelformat<.*>//g}}% + \expandafter\g@addto@macro\expandafter\cref@text\expandafter{% + \@tmpa^^J}% + \lowercase{\edef\@tmpa{% + s/||renewcommand<||crefpairconjunction><.*>//g}}% + \expandafter\g@addto@macro\expandafter\cref@text\expandafter{% + \@tmpa^^J}% + \lowercase{\edef\@tmpa{% + s/||renewcommand<||crefpairgroupconjunction><.*>//g}}% + \expandafter\g@addto@macro\expandafter\cref@text\expandafter{% + \@tmpa^^J}% + \lowercase{\edef\@tmpa{% + s/||renewcommand<||crefmiddleconjunction><.*>//g}}% + \expandafter\g@addto@macro\expandafter\cref@text\expandafter{% + \@tmpa^^J}% + \lowercase{\edef\@tmpa{% + s/||renewcommand<||crefmiddlegroupconjunction><.*>//g}}% + \expandafter\g@addto@macro\expandafter\cref@text\expandafter{% + \@tmpa^^J}% + \lowercase{\edef\@tmpa{% + s/||renewcommand<||creflastconjunction><.*>//g}}% + \expandafter\g@addto@macro\expandafter\cref@text\expandafter{% + \@tmpa^^J}% + \lowercase{\edef\@tmpa{% + s/||renewcommand<||creflastgroupconjunction><.*>//g}}% + \expandafter\g@addto@macro\expandafter\cref@text\expandafter{% + \@tmpa^^J}% \lowercase{\edef\@tmpa{s/||renewcommand<||[cC]ref><.*>//g}}% \expandafter\g@addto@macro\expandafter\cref@text\expandafter{% - \@tmpa^^J} + \@tmpa^^J}% \lowercase{\edef\@tmpa{s/||renewcommand<||[cC]refrange><.*>//g}}% - \expandafter\g@addto@macro\expandafter\cref@text\% - expandafter{\@tmpa} - \endgroup + \expandafter\g@addto@macro\expandafter\cref@text\expandafter{% + \@tmpa^^J}% + \endgroup% % \end{macrocode} % Overwrite the script file with the new, escaped regexp rules. % \begin{macrocode} @@ -2128,7 +2950,7 @@ \immediate\openout\@crefscript=\jobname.sed% \immediate\write\@crefscript{\cref@text}% \immediate\closeout\@crefscript% -}% +} % \end{macrocode} % % @@ -2136,24 +2958,38 @@ % substitution rule for the reference to the script, as well as % typesetting the reference itself. % \begin{macrocode} -\renewcommand{\cref}[1]{% - \edef\cref@text{}% - \@cref{cref}{#1}% - \cref@writescript{\string\cref\string{#1\string}}} -\renewcommand{\Cref}[1]{% - \edef\cref@text{}% - \@cref{Cref}{#1}% - \cref@writescript{\string\Cref\string{#1\string}}} -\renewcommand{\crefrange}[2]{% - \edef\cref@text{}% - \@setcrefrange{#1}{#2}{cref}{}% - \cref@writescript{% - \string\crefrange\string{#1\string}\string{#2\string}}} -\renewcommand{\Crefrange}[2]{% - \edef\cref@text{}% - \@setcrefrange{#1}{#2}{Cref}{}% - \cref@writescript{% - \string\Crefrange\string{#1\string}\string{#2\string}}} +\@ifpackageloaded{hyperref}{% + \def\@crefnostar#1#2{% + \edef\cref@text{}% + \@cref{#1}{#2}% + \cref@writescript{% + \expandafter\string\csname#1\endcsname\string{#2\string}}} + \def\@crefrangenostar#1#2#3{% + \edef\cref@text{}% + \@setcrefrange{#2}{#3}{#1}{}% + \cref@writescript{% + \expandafter\string\csname#1range\endcsname% + \string{#2\string}\string{#3\string}}}% +}{% + \DeclareRobustCommand{\cref}[1]{% + \edef\cref@text{}% + \@cref{cref}{#1}% + \cref@writescript{\string\cref\string{#1\string}}} + \DeclareRobustCommand{\Cref}[1]{% + \edef\cref@text{}% + \@cref{Cref}{#1}% + \cref@writescript{\string\Cref\string{#1\string}}} + \DeclareRobustCommand{\crefrange}[2]{% + \edef\cref@text{}% + \@setcrefrange{#1}{#2}{cref}{}% + \cref@writescript{% + \string\crefrange\string{#1\string}\string{#2\string}}} + \DeclareRobustCommand{\Crefrange}[2]{% + \edef\cref@text{}% + \@setcrefrange{#1}{#2}{Cref}{}% + \cref@writescript{% + \string\Crefrange\string{#1\string}\string{#2\string}}}% +} % \end{macrocode} % % @@ -2162,15 +2998,15 @@ % \begin{macrocode} \def\cref@writescript#1{% \edef\@tmpa{\cref@getmeaning{\cref@text}}% - \immediate\write\@crefscript{s/#1/\@tmpa/g}% -} + \immediate\write\@crefscript{s/#1/\@tmpa/g}} % \end{macrocode} % % -% Redefine \cmd{\@@setcref}, \cmd{\@@setrangeref}, -% \cmd{\@setcref@middleconjunction} and -% \cmd{\@setcref@lastconjunction} to append the text they typeset to -% \cmd{\cref@text}, as well as actually typesetting it. +% Redefine \cmd{\@@setcref} and \cmd{\@@setrangeref}, as well as the +% conjunction macros \cmd{\@setcref@middlegroupconjunction}, +% \cmd{\@setcref@lastgroupconjunction} and +% \cmd{\@setcref@pairgroupconjunction}, to append text they typeset to +% \cmd{\cref@text}, as well as actually doing the typesetting. % \begin{macrocode} \let\old@@setcref\@@setcref \let\old@@setcrefrange\@@setcrefrange @@ -2183,19 +3019,24 @@ #1{\ref{#2}}{}{}}} \def\@@setcrefrange#1#2#3{% \old@@setcrefrange{#1}{#2}{#3}% - \expandafter\g@addto@macro + \expandafter\g@addto@macro% \expandafter{\expandafter\cref@text\expandafter}% \expandafter{#1{\ref{#2}}{\ref{#3}}{}{}{}{}}} -\def\@setcref@middleconjunction{% - \crefmiddleconjunction% - \expandafter\g@addto@macro +\def\@setcref@pairgroupconjunction{% + \crefpairgroupconjunction% + \expandafter\g@addto@macro% + \expandafter{\expandafter\cref@text\expandafter}% + \expandafter{\crefpairgroupconjunction}} +\def\@setcref@middlegroupconjunction{% + \crefmiddlegroupconjunction% + \expandafter\g@addto@macro% \expandafter{\expandafter\cref@text\expandafter}% - \expandafter{\crefmiddleconjunction}} -\def\@setcref@lastconjunction{% - \creflastconjunction% - \expandafter\g@addto@macro + \expandafter{\crefmiddlegroupconjunction}} +\def\@setcref@lastgroupconjunction{% + \creflastgroupconjunction% + \expandafter\g@addto@macro% \expandafter{\expandafter\cref@text\expandafter}% - \expandafter{\creflastconjunction}} + \expandafter{\creflastgroupconjunction}} } % end of poorman option % \end{macrocode} % |