% \iffalse meta-comment %% ============================================================================================= % % Copyright 2009 J. Niel de Beaudrap. % % This file may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3c % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3c or later is part of all distributions of LaTeX % version 2005/12/01 or later. % % This file has the LPPL maintenance status "maintained". % % The list of all files belonging to the LaTeX base distribution is % given in the file `manifest.txt'. See also `legal.txt' for additional % information. % % The list of derived (unpacked) files belonging to the distribution % and covered by LPPL is defined by the unpacking scripts (with % extension .ins) which are part of the distribution. % % \fi % ^^A -*-LaTeX-*- % % ^^A These shouldn't come out in .ist files, hence the module % ^^A comments, or in the printed version, hence temporary comment % ^^A category for `<' %\catcode`\<=14 %<+package>\def\basename{modref} %<+package>\def\fullname{restyle: cross-referencing hacks for LaTeX} %<+package>\def\revisiondate{2009/02/02} %<+package>\def\revision{0.9} %<+package>\def\writtenby{J. Niel de Beaudrap} %\catcode`\<=12 % % \CheckSum{0} %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} %% %\iffalse This is a METACOMMENT % Everything up to the next `\ fi' (without a blank) will % be ignored. This is necessary because `%' may no longer % be a comment mark when this file is read in. % %% Package `modref' to use with LaTeX 2e %% Copyright (C) 2007 J. Niel de Beaudrap, all rights reserved. % % % Version: Date: Changes: % % 1.0 First revision. % % \changes{v1.0}{2007/12/16}{First revision.} %\fi % % \setcounter{StandardModuleDepth}{1} % % {\catcode`\p=12 \catcode`\t=12 ^^A hack used later on to print % \gdef\dimenvalue#1pt{$#1$pt}} ^^A a register value with a - sign % % \newcommand\ModRef{\texttt{modref}} % % \GetFileInfo{modref.sty} % % \iffalse % ============================================================================================= % \fi %\catcode`\<=14 %<+package>\typeout{-------} %<+package>\typeout{\fullname \space v\revision \space(\basename)} %<+package>\typeout{\writtenby, \revisiondate} %<+package>\typeout{-------} %<+package>\ProvidesPackage{modref}[\revisiondate {} {v\revision} {\writtenby}] %<+package>\RequirePackage{kvoptions} %<+package> %<+package>\DeclareOption*{\PackageWarning{Unknown option `\CurrentOption'.}} %<+package>\makeatletter %\catcode`\<=12 % \iffalse % ============================================================================================= % \fi %\iffalse %<*driver> \documentclass[draft]{ltxdoc} \usepackage[left=4.5cm,right=3cm,top=3cm,bottom=3cm]{geometry} \usepackage{amsmath,amsthm} \usepackage{modref} % \EnableCrossrefs % \DisableCrossrefs % Say \DisableCrossrefs if index is ready % \CodelineIndex % \RecordChanges % Gather update information % \OnlyDescription % comment out for implementation details % \OldMakeindex % use if your MakeIndex is pre-v2.9 \setlength\hfuzz{15pt} % dont make so many \hbadness=7000 % over and under full box warnings \refstyle{itemNo}{[Item~\##1]} \refstyle{numero}{\texttt{\itshape numero~#1}} \refstyle{def}{Definition~#1} \refstyle{lemma}{Lemma~#1} \refstyle{thm}{Theorem~#1} \refstyle{fig}{Figure~#1} \refstyle{eqn}{Eqn.~#1} \eqrefstyle{\textbf{(#1)}} \displaytagstyle{{\Large$\bigcirc\mspace{-12mu}$}#1} \stepcounter{equation} \makeatletter \newenvironment{headerlist}{% \setlength\topsep{\baselineskip}% \setlength\parsep{1.3em}% \setlength\parskip{1.3em}% \setlength\listparindent{0ex}% \def\next@item[##1]{% \def\item{\egroup\next@item} \@inmatherr\item \bgroup \addtolength\leftskip{2.5em}% \par\noindent\hspace{-2.5em}\mbox{\headerliststyle{##1}}~\\[1ex]% \setlength\parindent{0ex}% \setlength\parskip{1ex}% \ignorespaces} \let\item\next@item }{% \par\egroup\leavevmode\noindent\ignorespaces } \newcommand\headerliststyle[1]{\texttt{\mdseries\upshape #1}} \makeatother \newcommand\ie{\textit{i.e.}} \newcommand\eg{\textit{e.g.}} \newcommand\etc{\textit{etc.}} \begin{document} \DocInput{modref.dtx} \end{document} % % \fi % % \DeleteShortVerb\| % \MakeShortVerb\" % % \makeatletter % \newenvironment{codeexample}[1][rm] % {\[ \mspace{10mu}\begin{minipage}{0.95\textwidth} \def\@tempa{#1} \begin{\@tempa}} % {\end{\@tempa} \end{minipage} \\[-1em] \]} % % \def\lt{<} % \catcode`\<=13 % \def\@less@char{<} % \expandafter\def\@less@char#1>{$\left\langle \textrm{\mdseries\itshape #1} \right\rangle$} % \makeatother % \newcommand\descr[1]{<\textit{#1}>} % \newcommand\op[1]{\mathrm{#1}} ^^A %\mathop{\operator@font #1}} % % \newcommand\DescribeOption[1]{\DescribeMacro{option:\;#1}} % \newenvironment{option}[1]{\begin{environment}{option:\;#1}}{\end{environment}} % % % \iffalse % ============================================================================================= % \fi % % \title{The \ModRef\ Package\thanks % {This file has version number \fileversion{} dated \filedate{}.}} % \author{Niel de Beaudrap} % % \maketitle % % \begin{abstract} % This package defines some hacks to allow authors to define customized output % for cross-references of different types, based on the reference label. % \end{abstract} % % \section{The purpose and overview of \ModRef} % % Usually, when labelling equations, definitions, figures, \etc\ in a document, experienced authors will give their % labels intelligent names indicating the kind of reference, such as "eqn:quadratic", "def-integral", "fig.instrument-layout", % or similar labels. % In the course of using cross-references, the author will then proceed to repeatedly write same text to accompany each instance % of these labels throughout their document, as in the following examples: % \begin{verbatim} % Theorem~\ref{thm:fundmental-calculus} % Theorem~\ref{thm:intermediate-value} % Theorem~\ref{thm:four-colour} % % Definition~\ref{def:hilbert-space} % Definition~\ref{def:delta-dirac} % % Figure~\ref{fig:instrument-layout} % Figure~\ref{fig:experimental-data} % Figure~\ref{fig:nine-hundred-billion} % Figure~\ref{fig:newton} % \end{verbatim} % \vspace{-\baselineskip} % and so on. % Given that the references are retrieved from the values of counters written to the auxiliary file, one solution might be to % redefine the relevant counters, \eg\ as in % \begin{verbatim} % \renewcommand\thetheorem{Theorem~\arabic{theorem}} % \end{verbatim} % \vspace{-\baselineskip} % but it is occasionally still desirable to retrieve the reference without the title, as when referring to multiple similar references, % such as % \begin{verbatim} % Theorems~\ref{thm:foo} and~\ref{thm:bar} % \end{verbatim} % \vspace{-\baselineskip} % so that a simple strategy of redefining "\thetheorem" is inadequate. % More sophisticated approaches involving redefining how counters are written to the auxiliary file will also produce problems, \eg % when one counter ``counts within'' another: for instance, if theorem numbers are of the format "\thechapter-\arabic{theorem}", the % theorem label would also inherit the labelling of the chapter reference (which is unproductive). % % However, if the document author names reference labels in a literate manner, it is possible to automate the production % of the accompanying text by scanning those reference labels, in a way totally independent of how the counter is defined, and % in a way which does not affect how the reference is recorded in the auxiliary file. % It is only necessary to allow the formatting to vary somehow depending on the label. % However, as not everyone uses the same labelling scheme for their cross-references, the way in which reference-labels map % to reference-formatting should be fairly flexible. % % The \ModRef\ package provides the functionality to easily define customized output for the \cmd\ref\ command by % identifying what sort of cross-reference is being made, based on an initial string of characters in the reference label. % This functionality is provided in a transparent manner, in that only changes the output of \cmd\ref\ for those cases % defined by the user, and the way in which those references are formatted is also specified by the user. % It also provides a way for authors to perform more powerful tasks, such as having every reference produce a margin note % in a completely customizable fashion, and easy customization of the appearance of displayed equation numbers in "amsmath" % environments. % % \subsection{Comparison with \texttt{fancyref}} % % Similar functionality to what \ModRef\ provides has been available since 1999 in the "fancyref" package.\footnote{^^A % The core functionality of \ModRef\ was developped independently of "fancyref": my sense of whether someone would have done % the same task before failed me in this instance, and I discovered the package after having implemented the commands % \cmd\refstyle, \cmd\setrefdelimiter, and an earlier version of \cmd\eqrefstyle\ (not to mention most of this document). % However, much of the functionality of this package as it exists currently was prompted by ideas derived from "fancyref".} % The functionality provided by \ModRef\ differs from that of "fancyref" in the following ways: % \begin{itemize} % \item % The syntax for defining new reference styles is simpler: \ModRef\ does not require the author provide a macro in which % to store each new reference style. % % \item % Authors can also use \ModRef\ to define top-level reference customization which is applied to all well-formed % references in a \emph{general} way, using the customized cross-references and the page-number of the reference as arguments, % using similar syntax to defining any other macro. % (The "fancyref" package enables putting all references in parentheses, putting references in margin-notes, and including % page-numbers \emph{\`a la} "varioref" in all references; the documentation also advertises customizable hooks.) % % \item % The behaviour of \cmd\ref\ is changed to use the customized reference behaviour. % (Purists who find this distasteful but who still with to use \ModRef\ --- or any user who just wishes to access the % original functionality of \cmd\ref\ --- can find the original behaviour retained in the macro \cmd\Ref.) % % \item % The \ModRef\ package also enables the customization of displayed equation tags, and of the output of the command \cmd\eqref, % as defined by the "amsmath" package. % \end{itemize} % However, the main distinction between \ModRef\ and "fancyref" is in the design philosophy: % \begin{itemize} % \item[---] % "fancyref" appears to have been written in an attempt to anticipate anything that an author might wish to do: therefore, it % has a great many redundant pre-defined macros, which one may change to achieve varying degrees of change from the default % configuration; % % \item[---] % \ModRef\ was written to have a simple interface for customizing references, without many assumptions about how an author % might wish to customize their references (except that it be not too tedious): any changes defined by an author are relative to % the default behaviour of \LaTeX. % \end{itemize} % It is my hope that, as a result of the above differences, \ModRef\ will prove to be a convenient choice for authors who wish to % customize how cross-references appear in their documents. % % \subsection{Functionality provided by \ModRef} % % The \ModRef\ package introduces the following concepts, and access to control how these concepts are applied to % cross-references in documents. % \begin{headerlist} % \renewcommand\headerliststyle[1]{\textrm{\mdseries\itshape #1}} % % \item[Special reference styles] % A ``special'' reference style is a command which is performed on references of a certain type. % What command is performed depends on the type of the reference; and the type of any reference is determined from its label. % % The author defines one or more styles by specifying a ``prefix'' or ``style name'' for each style --- such as ``"dfn"'' for % definitions, ``"eq"'' for equations, \etc\ --- and describes the formatting to be applied for that reference type. % For each reference, \ModRef\ then attempts to determine the type of the reference by matching the label against known % style names. % The name is delimited by default using a colon (``":"'') character (but the delimiter may be chosen by the author, and % even changed mid-document): thus, an equation reference might have a label such as ``"eq:quadratic"'', a definition might have % a label ``"dfn:vectorSpace"'', and so on. % % The result of applying a reference style to a particular type of reference is a \emph{customized reference}. % Any reference whose label does not contain a defined reference type has no special style applied to it. % % The command to use to define special reference styles is \cmd\refstyle; the command to change the delimiter mid-document is % \cmd\setrefdelimiter. % (There is also a package option "delimiter" which allows the delimiter to be set at the beginning of the document.) % % \item[Global reference styles] % A ``global'' reference style is a command which is performed at \emph{every} reference. % Only two global reference styles may be defined for a given document: a default one and a ``variant'' one. % The inputs to a global reference style are the customized reference (if the reference is of a particular type) and the page number; % authors are free to use these arguments however they wish to define the behaviour of the \cmd\ref\ function. % Initially, the behaviour is just to pass on the (possibly customized) reference unchanged, omitting the page number. % % The commands to define the global reference styles are \cmd\GlobalRefStyle\ and \cmd\GlobalVarRefStyle; the commands % which apply the two different reference styles are \cmd\ref\ and \cmd\varref. % % \item[Equation references and displayed equation tags] % There is exactly one exception to the above description of how references are customized: if the author uses the "amsmath" % package, the output of the command \cmd\eqref\ remains \emph{totally unmodified} --- unless, of course, they wish to modify it; % then \ModRef\ facilitates doing this. % % Because the output of \cmd\eqref\ is by design intended to be different from that of \cmd\ref, global reference styles % are never applied to any application of \cmd\eqref. % As well, \cmd\eqref\ is never defined to attempt to infer the type of a reference from its label (presumably, it's an equation). % However, \ModRef\ does allow different reference styles to be defined for \cmd\eqref. % % While we're customizing cross-references to equations, why not allow how the equations themselves are labelled to be customized? % This allows the author to fine-tune the appearance of equation tags. % However, these customizations do not affect the output of \cmd\eqref, or vice-versa. % % The command to redefine the behaviour of \cmd\eqref\ is \cmd\eqrefstyle; the command to redefine how equation numbers % appear in displayed equations is \cmd\displaytagstyle. % %^^A \item[Cross-references without styles] %^^A It is possible to access the original functionality of \cmd\ref\ in the macro \cmd\Ref. % \end{headerlist} % \hspace{-2\baselineskip} No special reference styles are pre-defined by \ModRef, and no global styles are defined (except % for the ``trivial'' styles described above); only the reference-styles which the document author defines will be applied. % % \subsection{Package options} % % This version of \ModRef\ has the following option: % % \begin{headerlist} % \item[delimiter=] % This option controls the string which delimits the prefix defining the type of a particular reference. % If omitted, the default value is a single colon character (``":"''). % This string may be set to any value, except \textbf{(a)}~the empty string, \textbf{(b)}~any string containing a comma, % or \textbf{(c)}~any string containing characters not allowed in package options by \LaTeX\ (\eg\ ``"{"'', ``"}"'', \etc) % \end{headerlist} % \vspace{-2\baselineskip} % % \subsection{Package dependencies/conflicts} % % The package \ModRef\ depends on the "kvoptions" package, which should be included in modern \LaTeXe\ distributions. % It is currently incompatible with the "hyperref" package: compatibility is planned for the next version. % % \subsection{Bugs} % % There are no known bugs in \ModRef. % % \iffalse % ============================================================================================= % \fi % % \section{How to use \ModRef} % % The \ModRef\ package is very simple. % The user interface essentially consists of two commands: the invocation "\usepackage{modref}" itself (which currently % accepts three options), and the command \cmd\refstyle; a few other macros are provided to perform auxiliary functions. % We will describe these in the opposite order. % % \subsection{Defining reference styles} % \label{numero:definingModRefs} % % \subsubsection*{Special reference styles} % %^^A The \ModRef\ package functions by redefining the command \cmd\ref\ in such a way as to interpret the cross-reference labels %^^A provided to it. %^^A Depending on an initial prefix --- which we will variously call a ``label prefix'' or ``style name'' --- it will then apply %^^A an author-defined style if one has been defined for the particular type of reference. % % \DescribeMacro{\refstyle} % Special reference styles can be defined for different label-prefixes using the \cmd\refstyle\ macro, which has the syntax: % \begin{center} % "\refstyle{"\textit{style-name}"}{"\textit{style-format}"}" % \end{center} % which defines a style with the given style-name. % (The reason for the mixed- % The style-format is a macro definition is a similar to what is used for \cmd\def\ and \cmd\newcommand, using at most a single % argument. % The value of that single argument should be interpreted as the \emph{usual} output of the \cmd\ref\ command: \ie\ % style-formats are descriptions of transformations to perform on ``ordinary'' cross-references. % % The \cmd\refstyle\ command can be used multiple times for a single reference-style in order to override previous definitions % of the style-formats for that style; however, it is recommended only to use it in the pre-amble to avoid confusion. % % \paragraph{Use cases.} % The effects of using \cmd\refstyle\ can be demonstrated as follows. % \begin{enumerate} % \item % \label{firstitem} % Style-names are identified from cross-reference labels by looking for a label-prefix, separated from the rest of the label % by a delimiter such as a colon (":") character. % For any cross-reference label which does not have such a delimiter, such as "genericlabel", the usual behaviour of \cmd\ref\ % applies. % % \textbf{Example.} % This list item is labelled with the command "\label{firstitem}". % This label doesn't contain an identifiable label-prefix, so "\ref{firstitem}" produces the output \ref{firstitem}, as usual. % As well, this document doesn't have a cross-references labelled "undef-reference"; therefore, "\ref{undef-reference}" % produces the output \ref{undef-reference}, as usual. % % \item % \label{item:second} % If a cross-reference label has an identifiable prefix, but this prefix does not correspond to a defined style-format, the % usual behaviour of \cmd\ref\ applies as well. % % \textbf{Example.} % This second list item is labelled with the command "\label{item:second}". % However, this document didn't define any style-name called ``"item"''; therefore, "\ref{item:second}" produces the output % \ref{item:second}. % % \item % \label{itemNo:third} % If a cross-reference label has an identifiable prefix which does correspond to a style-format, the style-format is applied % to the cross-reference. % % \textbf{Example.} % In the header of this document, the following reference style was defined: % \begin{verbatim} % \refstyle{itemNo}{[Item~\##1]} % \end{verbatim} % The label for this list item was defined using "\label{itemNo:third}". % Because the usual meaning of "\ref{itemNo:third}" would be \Ref{itemNo:third}, the resulting output of "\ref{itemNo:third}" % is \ref{itemNo:third}. % % \item % \label{numero:fourth} % The style-formats do not correspond in any way to individual counters, but only to the labels given to the references. % Thus, references which use the same counter may be given different styles, if this is a meaningful thing to do, simply by % making the label prefixes different; and references with different counters may be given the same reference style. % % \textbf{Example.} % In the header of this document, the following reference style was defined: % \begin{verbatim} % \refstyle{numero}{\texttt{\itshape numero~#1}} % \end{verbatim} % The label for this list item was defined using "\label{numero:fourth}": this gives rise to a different format of reference % than the reference style ``"itemNo"'' --- in particular, "\ref{numero:fourth}" produces \ref{numero:fourth}. % At the same time, the cross-reference label for this section is defined by "\label{numero:definingModRefs}"\,: thus, % "\ref{numero:definingModRefs}" produces \ref{numero:definingModRefs}. % % \item % The new implementation for \cmd\ref\ applies styles only to well-defined cross-references: that is, it acts as though the % customized output is the entire cross-reference. % % \textbf{Example.} % This document doesn't have any cross-reference "itemNo:undef-reference"; therefore, despite the fact that this % label contains the style-prefix ``"itemNo"'', the reference "\ref{itemNo:undef-reference}" produces the output % \ref{itemNo:undef-reference}, as with any ill-defined reference. % \end{enumerate} % A more coherent illustration of how to use \cmd\refstyle, and how it affects cross-references, is illustrated in \ref{fig:example}. % % \DescribeMacro{\eqrefstyle} % The syntax of \cmd\eqrefstyle\ is similar: it takes a single argument, specifying the style for any cross-reference using \cmd\eqref. % Global reference styles are not applied to uses of \cmd\eqref; and as with \cmd\ref, \cmd\eqref\ produces the output % \eqref{undefined-reference} when applied to undefined references. % % % \begin{figure}[t] % \begin{center} % \begin{minipage}{0.4\textwidth} % \begin{verbatim} % \refstyle{def}{Definition~#1} % \refstyle{lemma}{Lemma~#1} % \refstyle{thm}{Theorem~#1} % \refstyle{eqn}{Eqn.~#1} % % \eqrefstyle{\textbf{#1]}} % \displaytagstyle{{\Large% % $\bigcirc\mspace{-12mu}$}#1} % % % Main text: % % \begin{definition} % \label{def:lorentz} ... % \end{definition} % % \begin{lemma} % \label{lemma:simultaneity} ... % \end{lemma} % % \begin{theorem} % \label{thm:einstein} ... % \begin{gather} % \label{eqn:einstein} % E = mc^2 % \end{gather} % ... % \end{theorem} % % \ref{thm:einstein} ... % \eqref{eqn:einstein} ... % % \ref{def:lorentz} and % \ref{lemma:simultaneity} ... % \ref{eqn:einstein} ... % \end{verbatim} % \end{minipage} % ~\vrule~~ % \begin{minipage}{0.44\textwidth} % \newtheorem{lemma}{Lemma} \setcounter{lemma}{10} % \newtheorem{theorem}{Theorem} \setcounter{theorem}{3} % % \theoremstyle{definition} % \newtheorem{definition}{Definition} % \setcounter{definition}{4} \renewcommand\thedefinition{\Roman{definition}} % % \begin{definition} % \label{def:lorentz} % A theory of physics is \emph{Lorentz invariant} if [\ldots] % \end{definition}~\\[-1ex] % % \begin{lemma} % \label{lemma:simultaneity} % For two distinct events $A$ and $B$, there exists a reference frame in which they are simultaneous if \textup{[\ldots]} % \end{lemma}~\\[-1ex] % % \begin{theorem} % \label{thm:einstein} % The equivalent mass $m$ which is associated with some amount of energy $E$ is determined by the equation % \begin{gather} % \label{eqn:einstein} E = mc^2 % \end{gather} % where $c$ is the speed of light. % \end{theorem}~\\[-1ex] % % \ref{thm:einstein} is actually a corollary of a more general theorem, which generalizes \eqref{eqn:einstein} by % adding a dependency on momentum.\\ % % \ref{def:lorentz} and \ref{lemma:simultaneity} are also important ideas forming part of the Special % Theory of Relativity; but \ref{eqn:einstein} is its most famous formula. % \end{minipage} % \end{center} % \caption{\label{fig:example}% % Illustration of (some of) the functionality of \ModRef\ package.} % \end{figure} % % \subsubsection*{Global reference styles} % % Two different global reference styles can be defined using the \cmd\GlobalRefStyle\ and \cmd\GlobalVarRefStyle\ macros, % which have the syntax: % \begin{center} % \begin{minipage}{16em}\raggedright % "\GlobalRefStyle{"\textit{style-format}"}" \\ % "\GlobalVarRefStyle{"\textit{style-format}"}" % \end{minipage} % \end{center} % Again, the style-format is a macro definition, in this case using at most \emph{two} arguments. % The operands of these two arguments are the (customized) cross-reference, and the page number of that reference: thus, % the effect of a global reference style on a cross-reference might look something like % \begin{center} % \itshape"\GlobalStyleMacro"\upshape"{Definition~V}{13}" % \end{center} % for a definition on page thirteen, if definitions have been given a special reference style which inserts ``\,"Definition~"\,'' % at the beginning of every reference.\footnote{^^A % No macro specifically named \textit{\cmd\GlobalStyleMacro} is defined by \ModRef; this example is only intended for % illustrative purposes.} % % \DescribeMacro{\varref} % The global style defined by \cmd\GlobalRefStyle\ is applied to every cross-reference made with \cmd\ref; the variant global % style is applied for cross-references made with \cmd\varref. % (This is the only difference between \cmd\ref\ and \cmd\varref: the functionality will be otherwise identical.) % % Initially, both of the global reference styles do nothing except discard the page number, similarly to how \cmd\ref\ usually works. % In a typical application, it would be quite reasonable to leave the ``main'' global reference style unchanged, only to customize % the ``variant'' style. % For instance, one might sensibly choose to declare % \begin{verbatim} % \GlobalVarRefStyle{#1 (on page #2)} % \end{verbatim}\vspace{-\baselineskip} % to facilitate combining cross-referencing with page numbers, or % \begin{verbatim} % \GlobalVarRefStyle{(#1)} % \end{verbatim}\vspace{-\baselineskip} % to make it easy to turn a cross-reference into a parenthetical remark, in both cases by using \cmd\varref\ to perform the % cross-reference. % % To avoid too much non-uniformity in the appearance of cross-references, neither \cmd\GlobalRefStyle\ nor \cmd\GlobalVarRefStyle\ % are allowed outside of the document pre-amble. % % \subsection{Other features} % % \subsubsection*{Customizing the delimiter for reference types} % % \DescribeMacro{\setrefdelimiter} % In the examples above, the style-name was determined from cross-reference labels by scanning for the shortest substring at % the beginning of the label which did not contain a ``\:\!":"\:\!'' character. % However, authors can change this delimiter to any (non-empty) sequence of characters. % This can be done at the beginning of the document by invoking the package as % \begin{center} % "\usepackage[delimiter=""]{modref}" % \end{center} % or mid-document by using the command "\setrefdelimiter{"\textit{string}"}"; all subsequent uses of \cmd\ref\ or \cmd\varref\ % will attempt to discover reference types using the new delimiter.\footnote{^^A % An immediate consequence of this is that references which previously had a defined ``reference type'' using the old delimiter % may not have a defined type using the new delimiter. % This will then have the effect of temporarily rescinding all special reference styles for those references using the old delimiter; % the styles can be restored by restoring that delimiter.} % % \subsubsection*{Customizing tags in \texttt{amsmath}-style displayed equations} % % \DescribeMacro{\displaytagstyle} % The style in which equation numbers are shown in the displayed-math environments defined by the "amsmath" package can be customized % using the \cmd\displaytagstyle\ command, which again has similar syntax to \cmd\refstyle\ and \cmd\eqref: % \begin{center} % "\displaytagstyle{"\textit{style-format}"}" % \end{center} % This also has the more general effect of defining the style for the \cmd\tag\ command, which can be used to insert % \emph{ad-hoc} equation tags in displayed math environments; the effect of the "\tag*" macro, however, is unaffected. % % \subsubsection*{Accessing the original functionality of \cmd\ref} % % \DescribeMacro{\Ref} % Sometimes it is useful to access a cross-reference without any special formatting. % To do this, one may use the \cmd\Ref\ command: this preserves the standard \LaTeXe\ functionality of \cmd\ref. % %^^A \paragraph{Example.} %^^A Although both items~\Ref{itemNo:third} and~\Ref{numero:fourth} in Section~\Ref{numero:definingModRefs} --- and the %^^A label for Section~\Ref{numero:definingModRefs} itself --- specify styles in their cross-reference labels (``"itemNo:third"'', %^^A ``"numero:fourth"'', and ``"numero:definingModRefs"'' respectively), we can refer to them without the special reference styles %^^A (as we did just above) by using the syntax "\Ref{itemNo:third}", "\Ref{numero:fourth}", and "\Ref{numero:definingModRefs}". % % % \iffalse % ========================================================================================== % \fi % % \section{Implementation} % % \subsection{Preliminary definitions} % % \begin{macro}{\modref@error} % First, we define a generic command "\modref@error" for producing errors. % \begin{macrocode} \newcommand\modref@error{\PackageError{modref}} % \end{macrocode} % \end{macro} % % \begin{macro}{\Ref} % As most of the subsequent definitions revolve around redefining aspects of the \cmd\ref\ command and friends, % we define the command \cmd\Ref\ which preserves the original behaviour for reference. % (If the macro \cmd\Ref\ is already defined, we produce an error.) % \begin{macrocode} \edef\reserved@a{Ref}% \@ifundefined\reserved@a{% \let\Ref\ref }{% \modref@error{% Command \string\Ref\ defined already; refer to the help message.% }{% The "modref" package defines the command \string\Ref\ to allow you (and the package) to use the original functionality of \string\ref. However, in this instance, \string\Ref\ already had a meaning when "modref" started running. Please determine what is defining \string\Ref, and whether you need it.}} % \end{macrocode} % \end{macro} % % \begin{macro}{\@ifempty} % \begin{macro}{\@xifempty} % We also crib the code for "\@ifempty" from "amsgen.sty" for simplicity. % \begin{macrocode} \def\@ifempty#1{\@xifempty#1@@..\@nil} \long\def\@xifempty#1#2@#3#4#5\@nil{ % \ifx#3#4\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi} % \end{macrocode} % \end{macro} % \end{macro} % % \subsection{Declaration and processing of the package options} % % Using the "kvoptions" package, we define the options for \ModRef, and the default value for the "fixtagsize" option. % \begin{macrocode} \DeclareStringOption[:]{delimiter} \ProcessKeyvalOptions* % \end{macrocode} % % \subsection{The core functionality, and customization of label delimiters} % % \begin{macro}{\setrefselimiter} % The macro \cmd\setrefdelimiter\ is a meta-macro which takes a single argument: this argument will be used as a delimiter % in further macros which define the infrastructure of \ModRef. % \begin{macrocode} \newcommand\setrefdelimiter[1]{% % \end{macrocode} % Throughout the following, "#1" denotes the delimiter to be used for identifying the style prefix in a cross-reference label. % \begin{macro}{\ref} % \begin{macro}{\varref} % The replacement for \cmd\ref\ will pass its argument onto another macro \makeatletter\cmd\modref@ref\makeatother, which will % attempt to parse the argument for a delimiter; we define \cmd\varref\ similarly. % They each pass a macro (\makeatletter\cmd\modref@basestyle\makeatother\ and \makeatletter\cmd\modref@varbasestyle % \makeatother, respectively) as a final argument, to define the ``global'' formatting which is to be used for the reference % regardless of which particular reference style (if any) is to be used. % We employ the standard strategy of appending a delimiter to the end of the argument, together with an unlikely terminal command % sequence. % \begin{macrocode} \def\ref##1{\modref@ref##1#1\egroup\modref@basestyle}% \def\varref##1{\modref@ref##1#1\egroup\modref@varbasestyle}% % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\modref@ref} % The command \makeatletter\cmd\modref@ref\makeatother\ attempts to split the argument into a prefix, delimiter, and suffix. % If the suffix is empty, the original argument to \cmd\ref\ had no delimiter (and thus indicates no style): in that case, % \makeatletter\cmd\modref@ref\makeatother\ invokes \makeatletter\cmd\@setref\makeatother\ on the reference, using the global % format specified in "##3" and the identity function as the ``style format''. % Otherwise, it passes it on to a second macro \makeatletter\cmd\modref@@ref\makeatother\ for further processing. % \begin{macrocode} \def\modref@ref##1#1##2\egroup##3{% \@ifempty{##2}{% \expandafter\@setref\csname r@##1\endcsname{##3\expandafter\@iden}{##1}% }{% \modref@@ref##1#1##2\egroup##3}}% % \end{macrocode} % \end{macro} % \begin{macro}{\modref@@ref} % Having been given an alleged style prefix, and a suffix making up the remainder of the reference label, the command % \makeatletter\cmd\modref@@ref\makeatother\ attempts to determine whether or not the prefix corresponds to a defined style. % We do this by testing for the existence of the command sequence "\modref@", which will be the macro which is % applied for that style. % If that macro does not exist, we invoke \makeatletter\cmd\@setref\makeatother\ on the reference, using the global % format specified in "##3" and the identity function as the ``style format''. % Otherwise, we obtain the command sequence for the reference's style-format, and invoke \makeatletter\cmd\@setref\makeatother\ % using the global format in "##3" and that style-format. % \begin{macrocode} \def\modref@@ref##1#1##2#1\egroup##3{% \@ifundefined{@modref@##1}{% \expandafter\@setref\csname r@##1#1##2\endcsname{% ##3\expandafter\@iden}{##1#1##2}% }{% \expandafter\def\expandafter\@tempa\expandafter{% \csname @modref@##1\endcsname}% \expandafter\@setref\csname r@##1#1##2\endcsname{% ##3\expandafter\@tempa}{##1#1##2}% }}% % \end{macrocode} % \end{macro} % % This completes the definition of \cmd\setrefdelimiter: it only remains to execute it for the delimiter which has been chosen. % This causes \cmd\ref\ to be redefined using the code above, using whatever string is contained in \makeatletter\cmd\modref@delimiter % \makeatother\ in the syntax of the definitions. % However, if the "delimiter" option was used, and set to the empty string for some reason, we produce an error. % \begin{macrocode} }% \ifx\modref@delimiter\@empty \modref@error{Option "delimiter" must be set to a non-empty value}{% The option "delimiter" was used, but seems to have been set to the empty string. I require a character, or a multi-character string, to delimit reference style names within cross-reference labels. If in doubt, just remove the "delimiter" option, and this should fix things.}% \else \expandafter\setrefdelimiter\expandafter{\modref@delimiter}% \fi % \end{macrocode} % \end{macro} % % \subsection{Defining global reference formats and special reference styles} % % \begin{macro}{\GlobalRefStyle} % \begin{macro}{\GlobalVarRefStyle} % We provide two commands for modifying the global format for \cmd\ref\ and \cmd\varref, each of which accept an argument describing % a two-argument macro. % They each create such a macro: these will be used to redefine \makeatletter\cmd\modref@basestyle\makeatother\ or % \makeatletter\cmd\modref@varbasestyle\makeatother. % \begin{macrocode} \newcommand\GlobalRefStyle[1]{\def\modref@@basestyle##1##2{#1}} \newcommand\GlobalVarRefStyle[1]{\def\modref@@varbasestyle##1##2{#1}} \@onlypreamble\GlobalRefStyle \@onlypreamble\GlobalVarRefStyle % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\modref@basestyle} % \begin{macro}{\modref@varbasestyle} % We have already met \makeatletter\cmd\modref@basestyle\makeatother\ and \makeatletter\cmd\modref@varbasestyle\makeatother, % which were used by \cmd\ref\ and \cmd\varref\ respectively; these commands are used to store the user-customizable ``global style'' % that gets applied to all references, whether or not they have a defined style type. % They both take three arguments: a macro to apply as a style type, and two more corresponding to the cross-reference value % and the page number of the reference. % They are designed in such a way that using the argument % \begin{center} % "{\modref@basestyle\expandafter\@modref@""}" % \end{center} % in place of \makeatletter\cmd\@firstoftwo\makeatother\ in a call to \makeatletter\cmd\@setref\makeatother, as in the original % definition of \cmd\ref\ in "latex.ltx", will have the effect of applying \makeatletter\cmd\modref@basestyle\makeatother\ to % precisely the specified style-format, and the cross-reference and page number. % It is easy to verify that this is exactly what is done in \makeatletter\cmd\modref@@ref\makeatother\ when called by the new % implementation of \cmd\ref; similar statements hold for \cmd\varref. % % We set \makeatletter\cmd\modref@basestyle\makeatother\ to apply the any format defined by \cmd\GlobalRefStyle, with the % styled reference as the first argument, and the page number as the second; and similarly for \makeatletter\cmd % \modref@varbasestyle\makeatother. % We then define the global reference format in each case to the identity function. % In the case where the style-format is replaced by the \makeatletter\cmd\@iden\makeatother\ macro, the effect of the % reference formatting then reduces the usage above to the traditional meaning of \cmd\ref, defined in terms of passing % the macro \makeatletter\cmd\@firstoftwo\makeatother\ to \makeatletter\cmd\@setref\makeatother. % \begin{macrocode} \def\modref@basestyle#1#2#3{\modref@@basestyle{#1{#2}}{#3}}% \def\modref@varbasestyle#1#2#3{\modref@@varbasestyle{#1{#2}}{#3}}% \GlobalRefStyle{#1}% \GlobalVarRefStyle{#1}% % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\refstyle} % The \cmd\refstyle\ macro for defining particular reference styles takes a style-name as its first argument, and % the formatting of the style as the second argument; the latter may use at most one argument, for the reference label. % The command \cmd\refstyle\ defines a command sequence \makeatletter\cmd\@modref@\makeatother which takes one argument % and applies the required formatting. % In order to allow easy overriding of reference styles (\eg\ in order to redefine the formatting of \cmd\eqref\ when using the % "eqref" option), we do not require that reference style names be unique. % We require \cmd\refstyle\ to only be used in the document pre-amble; and if \cmd\refstyle\ is already defined, we produce an error. % \begin{macrocode} \edef\reserved@a{refstyle}% \@ifundefined\reserved@a{% \newcommand\refstyle[2]{% \expandafter\def\csname @modref@#1\endcsname##1{#2}}% }{% \modref@error{% Command \string\refstyle\ defined already; refer to the help message. }{% The "modref" package defines the command \string\refstyle; however, in this instance, \string\refstyle\ already had a meaning when "modref" started running. Please determine what is defining \string\refstyle, and whether you need it.}} % \end{macrocode} % \end{macro} % % \subsection{Customizing \cmd\eqref\ and displayed equation tags} % % \begin{macro}{\eqrefstyle} % \begin{macro}{\modref@trivbasestyle} % Changes to the style of \cmd\eqref\ can be made, independently of changes to the displayed equation tags, by redefining % \cmd\eqref\ to call the macro \makeatletter\cmd\modref@eqref\makeatother, and redefining that macro accordingly. % The way in which \cmd\eqref\ invokes \makeatletter\cmd\modref@eqref\makeatother\ is to use it as part of an argument to % \makeatletter\cmd\@setref\makeatother\ in such a way as to apply the style before resolving the reference (so that undefined % references will result in the output ``\ref{undef-reference}'' rather than a transformation of it). % However, we only redefine \cmd\eqref\ if \cmd\eqrefstyle\ is called, so that it retains the meaning given to it by "amsmath" % unless it is explicitly redefined. % We also define a ``trivial'' base style, \emph{\`a la} \makeatletter\cmd\modref@basestyle\makeatother, to facilitate this. % \begin{macrocode} \newcommand\eqrefstyle[1]{% \def\eqref##1{% \maketag@@@{% \expandafter\@setref\csname r@##1\endcsname{% \modref@trivbasestyle\expandafter\modref@eqref}{##1}}}% \def\modref@eqref##1{#1}}% \def\modref@trivbasestyle#1#2#3{#1{#2}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\displaytagstyle} % To set the style of tags in displayed equations, we redefine the internal macro \makeatletter\cmd\tagform@\makeatother\ from % "amsmath.sty" to apply the style that we want, which will be defined by a macro \makeatletter\cmd\modref@tagstyle\makeatother. % \begin{macrocode} \newcommand\displaytagstyle[1]{% \def\modref@tagstyle##1{#1}% \def\tagform@##1{\maketag@@@{\modref@tagstyle{##1}}}% % \end{macrocode} % Because \cmd\eqref\ also uses the command \makeatletter\cmd\tagform@\makeatother\ for its implementation, a call to % \cmd\displayTagStyle\ also re-implements \cmd\eqref\ using \cmd\eqrefstyle\ --- but only if \cmd\eqref\ hasn't already % been re-implemented. % Whether or not it has is determined by testing if \makeatletter\cmd\modref@eqref\makeatother\ is well-defined. % The style that it sets is the original meaning of \cmd\eqref\ as defined in "amsmath.sty", except for expanding the macros % \makeatletter\cmd\tagform@\makeatother\ and \cmd\ref, and removing the macro \makeatletter\cmd\maketag@@@\makeatother\ % (which is already part of the new definition of \cmd\eqref). % \begin{macrocode} \@ifundefined{modref@eqref}{% \eqrefstyle{\textup{(\ignorespaces#1\unskip\@@italiccorr)}}% }\relax }% % \end{macrocode} % \end{macro} % % \Finale % % \section{Feedback} % % I would appreciate any feedback on this package that anyone may have, including error reports, % suggestions for modest extensions, and criticism (whether about the purpose or about the implementation % of the package). Please send your feedback to "jdebeaud@math.uwaterloo.ca", with the phrase % ``\ModRef\ package'' (or something very similar) in the subject line. Thanks! \makeatother \endinput