% \iffalse % % fancyref.dtx % Docstrip archive, run through LaTeX. % % Copyright (C) 1999 Axel Reichert % See the files README and COPYING. % % \fi % % \CheckSum{754} % %% \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 \~} % % \newcommand*{\ac}[1]{{\small #1}} % \newcommand*{\booktitle}[1]{\emph{#1}} % \newcommand*{\delimitor}[1]{\texttt{#1}} % \newcommand*{\env}[1]{\texttt{#1}} % \newcommand*{\error}[1]{\texttt{#1}} % \newcommand*{\file}[1]{\texttt{#1}} % \newcommand*{\format}[1]{\texttt{#1}} % \newcommand*{\frowney}{\texttt{)-:}} % \newcommand*{\labelname}[1]{\texttt{#1}} % \newcommand*{\mantitle}[1]{\emph{#1}} % \newcommand*{\option}[1]{\texttt{#1}} % \newcommand*{\package}[1]{\texttt{#1}} % \newcommand*{\person}[1]{\textsc{#1}} % \newcommand*{\prefix}[1]{\texttt{#1}} % \newcommand*{\sampleoutput}[1]{``#1''} % \newcommand*{\smiley}{\texttt{(-:}} % \newcommand*{\socalled}[1]{``#1''} % \newcommand*{\source}[1]{\texttt{#1}} % \newcommand*{\stringdef}[1]{``#1''} % \newcommand*{\winkey}{\texttt{(-;}} % % \changes{v0.9b}{1999-02-02}{First release} % \changes{v0.9c}{1999-02-03}{% % Bug fixed in \fancyrefaddcaptions (\person{Felix Neubauer}% % } % % \title{Fancy Cross-referencing} % \author{Axel Reichert} % \date{1999-02-03} % \maketitle % \begin{abstract} % \noindent % \file{fancyref.sty} is a package for fancy % cross-referencing. See the files \file{README} and % \file{COPYING} for additional information. % \end{abstract} % \tableofcontents % % % \section{Introduction} % % Besides the notorious FAQ problem ``I get a section number when % refering to a figure!''\footnote{Just put \cmd{\label} % \emph{after} \cmd{\caption}.}, cross-referencing with \LaTeX{} is % simple: You set a \cmd{\label} and refer to it with \cmd{\ref} % and \cmd{\pageref}. These commands just work. % % Some lazy people soon had the idea to write a \cmd{\fullref} % command to save some keystrokes: %\begin{verbatim} % \newcommand*{\fullref}[1]{\ref{#1} on page~\pageref{#1}} %\end{verbatim} % After that, people sometimes got page references to the current % page which cluttered the text with redundant information. % % Perhaps one of these people was \person{Frank Mittelbach}, who % was so annoyed that he wrote the \package{varioref} package % \cite{Mittelbach:1998}. It provides a \cmd{\vref} command which % generates output dependent on the difference between the page % number of the label and the page number of the cross-reference, % e.\,g.\ like \sampleoutput{on the next page} or \sampleoutput{on % page~27}. No output will be generated if label and % cross-reference fall onto the same page. This is really great, % especially as the package supports lots of \emph{languages}. % % If you write larger documents with lots of sections and figures, % you probably will find out that it is important to keep track of % your labels. If you have a section labeled \labelname{britain} % and a figure labeled \labelname{england}, it is only a question % of time until you mix them up. To avoid this, most people % \emph{prefix} the label with an abbreviation for the type of the % referenced object, e.\,g.\ \prefix{fig} is widely used for figure % labels. Also it is common practice to separate this classifying % prefix from the label by a \emph{delimitor} character, normally % \delimitor{:} is used by convention % \cite[p.\,41]{Goossens:1994}. If your labels look like % \labelname{sec:britain} or \labelname{fig:england} a mix-up will % belong to the past. % % In almost all cases when you are referencing to a figure, you % will add a descriptive \emph{string} like \sampleoutput{Figure}, % because the counter only is not very helpful to the % reader. Hence, some people write macros for this purpose: %\begin{verbatim} % \newcommand*{\figref}[1]{\figurename~\ref{#1}} %\end{verbatim} % \cmd{\figurename} is much better than hard-coding % \sampleoutput{Figure} into the macro, because in this way the % command not only works in other languages, but also if you % redefine the string: %\begin{verbatim} % \renewcommand*{\figurename}{Picture} %\end{verbatim} % Both captions of figures and cross-references will now happily % use the new string. % % In many journals cross-references to figures are emphasized by % usage of bold face or (much worse) underlining. This enables the % reader (who is normally quickly browsing through an article) to % find the description of an interesting figure. Of course you can % add a \cmd{\textbf} to the definition above, however, you will % run into trouble, if you want to use the \package{varioref} % package. Neither %\begin{verbatim} % \newcommand*{\figref}[1]{\textbf{\figurename~\vref{#1}}} %\end{verbatim} % nor %\begin{verbatim} % \newcommand*{\figref}[1]{\textbf{\figurename}~\vref{#1}} %\end{verbatim} % will produce the desired output: You will get % \sampleoutput{\textbf{\figurename~1 on page~2}} or % \sampleoutput{\textbf{\figurename}~1 on page~2} instead of % \sampleoutput{\textbf{\figurename~1} on page~2}. What you can do % in this case is to hack the strings used by \file{varioref.sty}, % e.\,g.\ like: %\begin{verbatim} % \renewcommand*{\reftextfaraway}[1]{% % \normalfont on page~\pageref{#1}% % } %\end{verbatim} % But this is dependent on the language and does not work within % italic text. % % Also, you will not want bold face for every cross-reference to a % figure, only for the \socalled{main} cross-reference. And you % will not want the page number to appear in every cross-reference % when explaining a picture consisting of subfigures: % \sampleoutput{The left part of Figure~1 on the following page % shows England. The right part of Figure~1 on the next page shows % Great Britain.} So your set of macros will grow further by % \cmd{\mainfigref} and \cmd{\shortfigref}. And of course the same % applies to tables as well. Slowly, cross-referencing starts to % get messy~\ldots % % Ok, you got the idea. I felt the need for a more general % solution. The \package{fancyref} package supports different % \emph{languages} (at the moment only english and german) and % allows customization of the classifying \emph{prefixes}, the % \emph{delimitor} character and the \emph{strings} used in % cross-references. Most important, it provides user-definable % \emph{formats}. Enough advocacy, here we go! % % % \section{Loading\label{sec:loading}} % % You will need: % \begin{enumerate} % \item \LaTeXe{} (at least the 1995/06/01 release) % \item The \package{varioref} package (part of the standard % \LaTeX{} tools, normally included in every distribution) % \item The \package{german} or \package{babel} package % \cite{Raichle:1996, Braams:1997} (if you want to write not only % in english) % \end{enumerate} % % The loading is simple: %\begin{verbatim} % \usepackage{fancyref} %\end{verbatim} % English is used as the default language. % % % \subsection{Language Options} % % At the moment only english and german are supported languages, % others might follow. % % If you write a german text: % \DescribeMacro{german} %\begin{verbatim} % \usepackage{german} % \usepackage[german]{babel} % \usepackage[german]{fancyref} %\end{verbatim} % \DescribeMacro{english} % If you write a mixed english/german text: %\begin{verbatim} % \usepackage{german} % \usepackage[english,german]{babel} % \usepackage[english,german]{fancyref} %\end{verbatim} % As with \file{babel.sty} the last language given in the optional % argument is the current language. For \file{german.sty} you will % have to use the \cmd{\selectlanguage} command % \cite[p.\,7]{Raichle:1996} for english as current language. % % Do \emph{not} pass the language as a global option to the % document class! Due to a feature of the \LaTeX{} option handler %\begin{verbatim} % \documentclass[english,danish]{article} % \usepackage{babel,fancyref} %\end{verbatim} % will result in danish headings (\sampleoutput{Figur}) and english % strings for the cross-references (\sampleoutput{Figure}), % without a warning or an error \cite[p.\,20]{LaTeX:1998}. The % correct usage %\begin{verbatim} % \documentclass{article} % \usepackage[english,danish]{babel,fancyref} %\end{verbatim} % gives a package error, as expected, because danish is not (yet) % supported (see \fref{sec:names}). % % % \subsection{Spacing Options} % % The spacing between the string and the counter can be adjusted, % see also \fref{sec:spacing}. % % \DescribeMacro{loose} % Loose spacing, like in \sampleoutput{Figure~1}, which is the % default, can be turned on explicitly by: %\begin{verbatim} % \usepackage[loose]{fancyref} %\end{verbatim} % \DescribeMacro{tight} % Tight spacing, like in \sampleoutput{Figure\,1} will be obtained % with: %\begin{verbatim} % \usepackage[tight]{fancyref} %\end{verbatim} % % Most textbooks on typography recommend loose spacing (i.\,e.\ a % normal word space) in this context, but tight spacing (half a % word space) is recommended in abbreviated formats like % \sampleoutput{Fig.\,1} \cite[p.\,220]{Willberg:1997}. % % % \subsection{Format Options} % % The usage of page numbers for the cross-references can be % controlled by using different \package{fancyref} formats, see % \fref{sec:formats}. The two most common variants are provided % also as package options. % % \DescribeMacro{plain} % Output without a page number, like \sampleoutput{Figure~1}, is % used if the \option{plain} option is specified: %\begin{verbatim} % \usepackage[plain]{fancyref} %\end{verbatim} % \DescribeMacro{vario} % Output like from the \package{varioref} package % (\sampleoutput{Figure~1 on the following page}) is used by % default, but you could give the \option{vario} option % explicitely: %\begin{verbatim} % \usepackage[vario]{fancyref} %\end{verbatim} % % % \subsection{Hook Options} % % The appearance of a cross-reference can not only be controlled by % individual formats % \marginpar{\raggedleft\footnotesize$\rightarrow$ % Sec.\,\ref{sec:formats}, p.\,\pageref{sec:formats}} which depend % on the type of the referenced object, but also by a \emph{hook} % which is executed for \emph{every} cross-reference, see % \fref{sec:hooks}. Two variants of this hook can be activated by % package options (but only one at a time). % % \DescribeMacro{margin} % You can place all cross-references into the margin, like % above. This is achieved by: %\begin{verbatim} % \usepackage[margin]{fancyref} %\end{verbatim} % If you want to do this, you should be aware of the limited space % in the margin and use abbreviated formats. In my opinion marginal % cross-references are sensible only for floats, for which I % already defined the \option{margin} formats % (see~\fref{sec:formats}), so this option should better be % considered as an example of a hook. The above example was indeed % done manually. \winkey % % \DescribeMacro{paren} % You can put all cross-references into parentheses, like this: % (\fref{sec:usage}). This is achieved by: %\begin{verbatim} % \usepackage[paren]{fancyref} %\end{verbatim} % Neither use this option in combination with the \option{margin} % option nor with the \format{margin} formats! % % % \section{Usage\label{sec:usage}} % % The cross-referencing is done by two almost identical macros. % % \DescribeMacro{\fref} % \cmd{\fref} is used within a sentence and gives lower-case % output, like \sampleoutput{figure~1}. % % \DescribeMacro{\Fref} % \cmd{\Fref} is used at the beginning of a sentence and gives % output with normal capitalization, like % \sampleoutput{Figure~1}. For german users the macros make no % difference, \sampleoutput{Abbildung~1} remains % \sampleoutput{Abbildung~1} even within a sentence. How sensible! % \winkey % % There seems to be no reliable heuristic to determine the start of % a sentence, so you either have to cope with two macros or accept % \sampleoutput{Figure~1} even within a sentence. % % Both macros take one optional argument, the format of the % cross-reference, and one mandatory argument, consisting of the % classifying prefix, the delimitor character and the label itself: % \begin{tabbing} % \small % | \fref[|\meta{format}|]{|\meta{prefix}\meta{delim}\meta{label}|}| \\ % \small % | \Fref[|\meta{format}|]{|\meta{prefix}\meta{delim}\meta{label}|}| % \end{tabbing} % A typical cross-reference will thus look like this, %\begin{verbatim} % \fref{fig:england} %\end{verbatim} % with \prefix{fig} as the prefix, \delimitor{:} as the delimitor % and \labelname{britain} as the label, using the default % format. The formats, the prefixes and the delimitor character are % described in detail in the following section. % % % \section{Customization} % % % \subsection{Prefixes\label{sec:prefixes}} % % \DescribeMacro{\...labelprefix} % The following table shows the defaults of the various prefixes I % already defined for you. % \begin{center} % \begin{tabular}{@{}lll@{}} % \hline % Object & % Macro & % Prefix \\ % \hline % Chapter & \cmd{\fancyrefchaplabelprefix} & % \prefix{\fancyrefchaplabelprefix} \\ % Section & \cmd{\fancyrefseclabelprefix} & % \prefix{\fancyrefseclabelprefix} \\ % Equation & \cmd{\fancyrefeqlabelprefix} & % \prefix{\fancyrefeqlabelprefix} \\ % Figure & \cmd{\fancyreffiglabelprefix} & % \prefix{\fancyreffiglabelprefix} \\ % Table & \cmd{\fancyreftablabelprefix} & % \prefix{\fancyreftablabelprefix} \\ % Enumeration & \cmd{\fancyrefenumlabelprefix} & % \prefix{\fancyrefenumlabelprefix} \\ % Footnote & \cmd{\fancyreffnlabelprefix} & % \prefix{\fancyreffnlabelprefix} \\ % \hline % \end{tabular} % \end{center} % % If you need to add a prefix, use the following syntax: % \begin{tabbing} % \small % | \newcommand*{|\meta{macro}|}{|\meta{prefix}|}| % \end{tabbing} % For example, if you need theorems in your document, you could % use: %\begin{verbatim} % \newcommand*{\fancyrefthmlabelprefix}{thm} %\end{verbatim} % Note that the name of the macro does not matter, but names % fitting into the scheme are highly recommended. Be consistent. % After that, you will need to define your own \package{fancyref} % formats for the new prefixes. Read \fref{sec:formats}. And let me % know of objects for which I should supply prefixes. % % \DescribeMacro{\...changeprefix} % If you need to change a prefix (either one I already provided or % one you added later), use the following syntax: % \begin{tabbing} % \small % | \fancyrefchangeprefix{|\meta{macro}|}{|\meta{prefix}|}| % \end{tabbing} % For example, if you are labeling your equations with \prefix{eqn} % instead of \prefix{eq} (I guess this will be the most common % change): %\begin{verbatim} % \fancyrefchangeprefix{\fancyrefeqlabelprefix}{eqn} %\end{verbatim} % % % \subsection{Delimitors\label{sec:delimitors}} % % \DescribeMacro{\fancyrefargdelim} % The default delimitor character is the colon (\delimitor{:}). If % you need to change it, for example to \delimitor{-}, use the % following syntax: %\begin{verbatim} % \renewcommand*{\fancyrefargdelim}{-} %\end{verbatim} % There is no restriction to one character, you could also use % \delimitor{too-long}, but you definitely should use a delimitor % that never, ever occurs within the real label. A single % \emph{letter} would be a very bad idea. % % % \subsection{Spacing\label{sec:spacing}} % % \DescribeMacro{\...spacing} % Quite unlikely that someone is not happy with at least one of the % package options for this purpose, but one never knows~\ldots % % The following table shows the definition of the spacing macros. % \begin{center} % \begin{tabular}{@{}lll@{}} % \hline % Macro & Definition & Example \\ % \hline % \cmd{\fancyrefloosespacing} & |~| & % \Freffigname\fancyrefloosespacing 1 \\ % \cmd{\fancyreftightspacing} & \cmd{\,} & % \Freffigname\fancyreftightspacing 1 \\ % \cmd{\fancyrefdefaultspacing} & % \cmd{\fancyrefloosespacing} & % \Freffigname\fancyrefdefaultspacing 1 \\ % \hline % \end{tabular} % \end{center} % % You could switch from loose to tight spacing and vice versa even % after the package is loaded: %\begin{verbatim} % \renewcommand*{\fancyrefdefaultspacing}{% % \fancyreftightspacing % } %\end{verbatim} % % You could loosen the tight spacing or tighten the loose spacing % by using for example %\begin{verbatim} % \renewcommand*{\fancyrefloosespacing}{\kern.25em} %\end{verbatim} % but you should not change \cmd{\fancyrefdefaultspacing} in this % way, because you would lose flexibility: Almost all % \package{fancyref} formats (except the \format{margin} formats) % use \cmd{\fancyrefdefaultspacing}, so it is clever to adjust % \cmd{\fancyreftightspacing} and \cmd{\fancyrefloosespacing} and % then to switch between the two variants. But I doubt that this % will ever be necessary. % % % \subsection{Names\label{sec:names}} % % \DescribeMacro{\...name} % The following table shows some strings that are already provided % by many document classes. If they do not exist, I will define % them, otherwise I will not touch their values (in case you have % changed them already). % \begin{center} % \begin{tabular}{@{}lll@{}} % \hline % Macro & % English string & % German string \\ % \hline % \cmd{\chaptername} & \chaptername & Kapitel \\ % \cmd{\figurename} & \figurename & Abbildung \\ % \cmd{\pagename} & \pagename & Seite \\ % \cmd{\tablename} & \tablename & Tabelle \\ % \hline % \end{tabular} % \end{center} % % \DescribeMacro{\Fref...name} % The next table shows the strings used for cross-references at the % beginning of a sentence. % \begin{center} % \begin{tabular}{@{}lll@{}} % \hline % Macro & % English string & % German string \\ % \hline % \cmd{\Frefchapname} & \cmd{\chaptername} & \cmd{\chaptername} \\ % \cmd{\Frefenumname} & \Frefenumname & Punkt \\ % \cmd{\Frefeqname} & \Frefeqname & Gleichung \\ % \cmd{\Freffigname} & \cmd{\figurename} & \cmd{\figurename} \\ % \cmd{\Freffnname} & \Freffnname & Fu\ss note \\ % \cmd{\Frefonname} & \Frefonname & Auf \\ % \cmd{\Frefpgname} & \cmd{\pagename} & \cmd{\pagename} \\ % \cmd{\Frefsecname} & \Frefsecname & Abschnitt \\ % \cmd{\Frefseename} & \Frefseename & Siehe \\ % \cmd{\Freftabname} & \cmd{\tablename} & \cmd{\tablename} \\ % \hline % \end{tabular} % \end{center} % % The \package{fancyref} package uss own macros to achieve maximum % flexibility: If you redefine \cmd{\figurename} to % \stringdef{Picture}, both the caption and the cross-references % will use this string. If brevity is more important to you than % consistency, you could also use \stringdef{Picture} within the % caption and \stringdef{Pic.} for the cross-references. The % necessary code is: %\begin{verbatim} % \renewcommand*{\figurename}{Picture} % \renewcommand*{\Freffigname}{Pic.} %\end{verbatim} % % \DescribeMacro{\fref...name} % Within a sentence you should use \stringdef{picture} instead of % \stringdef{Picture}. The \package{fancyref} package takes care of % this for you and defines the corresponding macros % (\cmd{\fref...name}) with automatically generated lower-case % strings. % % \DescribeMacro{\Frefonname} % \cmd{\Frefonname} and \cmd{\Frefseename} are not used by any % \package{fancyref} formats, but you could use them for your % additional formats. % \DescribeMacro{\Frefseename} % An interesting idea would be to use an arrow ($\mathsurround % 0pt\rightarrow$) for \cmd{\Frefseename}: %\begin{verbatim} % \renewcommand*{\Frefseename}{% % \ensuremath{\mathsurround 0pt\rightarrow}% % } %\end{verbatim} % If do this, there will be no need to redefine \cmd{\frefseename} % manually, because the \cmd{\MakeLowercase} command % \cite[p.\,26]{LaTeX:1998} used internally to generate the % lower-case strings can cope even with such strange % things. \smiley % % \DescribeMacro{\Fref...shortname} % The table shows some abbreviated strings used for % cross-references with the \format{margin} formats. I do not like % abbreviations very much,\footnote{I am stubborn, \person{Dirk}, % am I not? \winkey} because they need to be introduced carefully % (written out at the first occurrence) and even then make a % document less readable. Also, at the beginning of a sentence, % abbreviations should be written out, so you run into % inconsistencies (also known as trouble). In my opinion they are % reasonable for the \format{margin} formats, so only the strings % necessary for these formats are defined. If you are a big fan of % \ac{PCMCIA}\footnote{People Cannot Memorize Computer Industry's % Acronyms.} or abbreviations or simply do not bear my propaganda, % you are on your own. % \begin{center} % \begin{tabular}{@{}lll@{}} % \hline % Macro & % English string & % German string \\ % \hline % \cmd{\Freffigshortname} & \Freffigshortname & Abb. \\ % \cmd{\Frefpgshortname} & \Frefpgshortname & S. \\ % \cmd{\Freftabshortname} & \Freftabshortname & Tab. \\ % \hline % \end{tabular} % \end{center} % Lower-case versions of these strings (\cmd{\fref...shortname}) % are generated automatically again. % % \DescribeMacro{\...addcaptions} % If you add new prefixes (\fref{sec:prefixes}), you will probably % also need further strings, e.\,g.\ \cmd{\frefthmname}. If you % write a multilingual document, they should automatically be % changed with the active language. For this case the % \package{fancyref} package offers the following command, % \begin{tabbing} % \small % | \fancyrefaddcaptions{|\meta{language}|}{|\meta{stringdefs}|}| % \end{tabbing} % which can be used only in the preamble of the document. In the % above example you would use: %\begin{verbatim} % \fancyrefaddcaptions{english}{% % \newcommand*{\Frefthmname}{Theorem}% % \newcommand*{\frefthmname}{% % \MakeLowercase{\Frefthmname}% % }% % } % \fancyrefaddcaptions{german}{% % \newcommand*{\Frefthmname}{Satz}% % \newcommand*{\frefthmname}{\Frefthmname}% % } %\end{verbatim} % If you can supply such additional strings or further languages, % please do and send me a mail. % % % \subsection{Formats\label{sec:formats}} % % The output of the \cmd{\fref} and \cmd{\Fref} commands depends on % the used \package{fancyref} format. For all the different objects % that can be cross-referenced, two \package{fancyref} formats, % \format{plain} and \format{vario}, are already defined. In % addition, for the floating objects (\env{figure} or \env{table} % environments) two other \package{fancyref} format called % \format{margin} and \format{main} are available. The following % table shows sample output of these \package{fancyref} formats. % \begin{center} % \begin{tabular}{@{}lll@{}} % \hline % Object & % Format & % Output \\ % \hline % Chapter & \prefix{vario} & % \frefchapname\fancyrefdefaultspacing 1 on the following page \\ % & \prefix{plain} & \Frefchapname\fancyrefdefaultspacing 1 \\ % Equation & \prefix{vario} & % \Frefeqname\fancyrefdefaultspacing (1) on the previous page \\ % & \prefix{plain} & \frefeqname\fancyrefdefaultspacing (1) \\ % Figure & \prefix{margin} & \footnotesize$\rightarrow$~% % \Freffigshortname\fancyreftightspacing 1, % p.\fancyreftightspacing 1 \\ % & \prefix{main} & % \textbf{\freffigname\fancyrefdefaultspacing 1} on the % facing page \\ % & \prefix{vario} & \Freffigname\fancyrefdefaultspacing 1 on % the page before \\ % & \prefix{plain} & \freffigname\fancyrefdefaultspacing 1 \\ % \hline % \end{tabular} % \end{center} % The \package{fancyref} formats for sections, enumerations and % footnotes give output similar to those for chapters, whereas the % formats for tables correspond to the \package{fancyref} formats % for figures. % % \DescribeMacro{\...defaultformat} % If no optional argument is specified for the \cmd{\fref} or % \cmd{\Fref} command, the \format{vario} format will be used. You % can change this default \package{fancyref} format to % \format{plain}: %\begin{verbatim} % \renewcommand{\fancyrefdefaultformat}{plain} %\end{verbatim} % % If you do not like some of these \package{fancyref} formats or % you need some more, e.\,g.\ for theorems, algorithms etc., you % will have to define them yourself. If you define some nice % formats, please let me know, perhaps I will add them in a future % version of this package. % % \DescribeMacro{\frefformat} % The definition is done by means of two almost identical % macros. \cmd{\frefformat} declares (or changes) the formats used % within a % \DescribeMacro{\Frefformat} % sentence, whereas \cmd{\Frefformat} does the same for the formats % used at the beginning of a sentence. Unfortunately this means % that you need to do the work twice. \frowney % % Both macros take three mandatory arguments, the name of the % \package{fancyref} format, the prefix macro and the description % of the format itself: % \begin{tabbing} % \small % | \frefformat{|\meta{format}|}{|\meta{prefix macro}\meta{output}|}| \\ % \small % | \Frefformat{|\meta{format}|}{|\meta{prefix macro}\meta{output}|}| % \end{tabbing} % Within the third argument |#1| will be replaced by the counter of % the referenced object (i.\,e.\ the output of a \cmd{\ref} % command), |#2| will be replaced by the page number (i.\,e.\ the % output of a \cmd{\pageref} command) and |#3| will be replaced by % the output of a \cmd{\vpageref} command (\sampleoutput{on the % facing page}, \sampleoutput{on page~1}). % % As an example, I will modify the output foss-references to % figures done with the \format{main} format: %\begin{verbatim} % \frefformat{main}{\fancyreffiglabelprefix}{% % \MakeUppercase{\freffigname}\fancyrefdefaultspacing#1#2% % }% % \Frefformat{main}{\fancyreffiglabelprefix}{% % \MakeUppercase{\Freffigname}\fancyrefdefaultspacing#1#2% % }% %\end{verbatim} % These redefinitions will make |\fref[main]{fig:foo}| come out as % \sampleoutput{FIGURE~1 on page~1}. The page number will always be % printed explicitly, not like \file{varioref.sty} output. By use % of the \cmd{\freffigname}, \cmd{\Freffigname} and % \cmd{\fancyrefdefaultspacing} commands it is ensured that further % modifications of the string as well as the spacing and language % options of the package will work. A quick and dirty hack would % have been: %\begin{verbatim} % \frefformat{main}{\fancyreffiglabelprefix}{FIGURE~#1#2} % \Frefformat{main}{\fancyreffiglabelprefix}{FIGURE~#1#2} %\end{verbatim} % % The usage of the defined macros for spacing and naming like in % the first example is of course highly recommended. Do not blame % me, if your lazyness leads to inconsistencies. \winkey % % Note that in either case you \emph{must} use the prefix % \emph{macro}, not the string itself! % % % \subsection{Hooks\label{sec:hooks}} % % \DescribeMacro{\fancyrefhook} % After all the work of the \package{fancyref} formats has been % done, the result is passed as an argument to a hook command % called \cmd{\fancyrefhook}. Normally, this hook does nothing but % simply passing on the output. If you want to change this hook, % use the following syntax: % \begin{tabbing} % \small % | \renewcommand{\fancyrefhook}[1]{|\meta{definition}|}| % \end{tabbing} % Within \meta{definition}, |#1| will be replaced by the output of % the \package{fancyref} format. % % You can use this hook for all kinds of weird stuff, e.\,g.\ if % you want to have huge cross-references, use the following code: %\begin{verbatim} % \renewcommand*{\fancyrefhook}[1]{{\huge #1}} %\end{verbatim} % In this simple example the |*|-form of \cmd{\renewcommand} may be % used, because the hook does not contain whole paragraphs % \cite[p.\,14]{LaTeX:1997}. This makes debugging of your code % easier. % % A more complex (and totally brain-dead) example does not work % with the |*|-form: %\begin{verbatim} % \renewcommand{\fancyrefhook}[1]{% % \begin{itemize}% % \item #1% % \end{itemize}% % } %\end{verbatim} % If you define really \emph{useful} and \socalled{typographically % correct} hooks, please send me a mail, so I can include your work % in future versions of this package. \winkey % % % \section{Examples} % % See the example file \file{freftest.tex} and its output, % \file{freftest.dvi}. % % % \section{Bugs} % % None, as my beta testers, \person{Dirk Kuypers} and % \person{Robin~S.~Socha}, told me. \winkey % % If you encounter problems after having changed all your % cross-references to the macros provided by \file{fancyref.sty}, % please go through the following checklist: % \begin{enumerate} % \item Make sure that you either use \delimitor{:} as a delimitor % or that have changed it as described in \fref{sec:delimitors}. % \item Make sure that you either use the default prefixes or that % you have changed them as described in % \fref{sec:prefixes}. Especially do \emph{not} try to modify the % prefixes with the \cmd{\renewcommand} command. % \item Make sure that you have defined all necessary formats in % addition to those provided by me. The definition of % \package{fancyref} formats is described in \fref{sec:formats}. % \item Make sure that you have eliminated all old superfluous % strings like \source{Figure} or \cmd{\figurename} in your source % code. Just replacing all \cmd{\ref} commands with \cmd{\fref} % will \emph{not} be sufficient. % \end{enumerate} % % As far as I know, there is only one \emph{real} problem: If you % are working on a multi-author document where each author is used % to a different set of prefixes and prefers a different delimitor, % be \emph{extremely cautious} when redefining the prefixes and the % delimitor. You will get really funny errors, if the current % delimitor is \delimitor{-}, the prefix for equations is % \prefix{eqn} and you try to make a cross-reference to an equation % in a part written by another author who used \delimitor{:} and % \prefix{eq} in his \cmd{\label} commands. % % With the current implementation the only solution is to % temporarily redefine the prefix and the deliminator, do the % cross-reference and switch back to the original definitions % again. This is annoying, of course. \frowney % % As a consequence, I would recommend either to drop this % cross-reference or to try to convince your co-authors that your % prefixes and delimitor are the best. Sorry. % % % \section{Implementation} % % % \subsection{Documentation Driver} % % \begin{macrocode} %<*driver> \documentclass[12pt,a4paper]{ltxdoc} \usepackage{fancyref} \begin{document} \DocInput{fancyref.dtx} \end{document} % % \end{macrocode} % \StopEventually{ % \font\logosl=logosl10 scaled\magstep1 % \begin{thebibliography}{1} % \bibitem{AMS:1996} % American Mathematical Society. % \newblock \mantitle{$\cal{AMS}$-\LaTeX{} Version~1.2 User's % Guide}, Nov.~1996. % \newblock Version~1.02. % \bibitem{Braams:1997} % \person{Braams,~J.}: \mantitle{Babel, a multilingual package for % use with \LaTeX's standard document classes}. % \newblock Zoetermeer, Jan.~1997. % \bibitem{Franz:1998} % \person{Franz,~M.}: \mantitle{The \package{soul} package}, Dec.~1998. % \newblock Version~1.1a. % \bibitem{Goossens:1994} % \person{Goossens,~M.; Mittelbach,~F.; Samarin,~A.}: \booktitle{Der % \LaTeX-Begleiter}. % \newblock Addison-Wesley, Bonn, 1st~edn., 1994. % \bibitem{LaTeX:1997} % \LaTeX3 Project Team. % \newblock \mantitle{\LaTeXe{} for authors}, Jun.~1997. % \bibitem{LaTeX:1998} % \LaTeX3 Project Team. % \newblock \mantitle{\LaTeXe{} for class and package writers}, % Jun.~1998. % \bibitem{Mittelbach:1998} % \person{Mittelbach,~F.}: \mantitle{The \package{varioref} package}. % \newblock Mainz, May~1998. % \newblock Version~1.1g. % \bibitem{Raichle:1996} % \person{Raichle,~B.}: % \mantitle{Kurzbeschreibung~--~\file{german.sty} (Version~2.5)}. % \newblock Deutschsprachige Anwendervereinigung \TeX{}~e.\,V., % May~1996. % \newblock Version~2.5c. % \bibitem{Willberg:1997} % \person{Willberg,~H.\,P.; Forssman,~F.}: % \booktitle{Lesetypographie}. % \newblock Hermann Schmidt, Mainz, 1997. % \end{thebibliography} % } % % % \subsection{\file{fancyref.sty}} % % \begin{macrocode} %<*package> % \end{macrocode} % % % \subsubsection{Identification} % % As this package uses the \cmd{\MakeLowercase} command, it does % not work with older \LaTeXe{} versions. % \begin{macrocode} \NeedsTeXFormat{LaTeX2e}[1995/06/01]% % \end{macrocode} % The package identifies itself with its release date, a version % number and a short description. % \begin{macrocode} \ProvidesPackage{fancyref}[% 1999/02/03 v0.9c Fancy cross-referencing% ]% % \end{macrocode} % % % \subsubsection{Initialization} % % \begin{macro}{\@fancyref@add@to} % This macro is adapted from \file{babel.def}. If a command (the % first argument) is undefined, it will be defined by the content % of the second argument. If the command is defined already, the % content of the second argument will be appended to the old % definition of the command. The macro will be used to add further % definitions to the \cmd{\captions...} commands provided by the % \package{babel}~package or \file{german.sty}. % \begin{macrocode} \newcommand*{\@fancyref@add@to}[2]{% \ifx#1\@undefined \newcommand*{#1}{#2}% \else \ifx#1\relax \newcommand*{#1}{#2}% \else \bgroup \toks@\expandafter{#1#2}% \xdef#1{\the\toks@}% \egroup \fi \fi }% % \end{macrocode} % \end{macro} % \begin{macro}{\...addcaptions} % This macro adds strings (the second argument) to the % \cmd{\captions...} commands\footnote{Credits go to \person{Bernd % Raichle} who told me how to do this in a politically correct % way.} provided by the \package{babel} package or % \file{german.sty}, or it simply defines these new strings. The % name of the language is given in the first argument. % % To make the new strings become effective, the current language is % saved\footnote{Credits go to \person{Felix Neubauer}, who pointed % out that this should be done in a temporary command rather than % a token register to avoid an error in combination with % \file{babel.sty} or \file{german.sty} and automatically % generated lists like the \file{toc}, \file{lof} or \file{lot} % files.} at the beginning of the document, the code defining the % strings is executed and the language for the captions is % switched back again. % \begin{macrocode} \newcommand*{\@fancyref@temp}{\@empty}% \newcommand*{\fancyrefaddcaptions}[2]{% \@ifundefined{captions#1}{% #2% }{% \expandafter \@fancyref@add@to\csname captions#1\endcsname{#2}% \AtBeginDocument{% \let\@fancyref@temp=\languagename \csname captions#1\endcsname \csname captions\@fancyref@temp\endcsname \let\@fancyref@temp=\@empty }% }% }% % \end{macrocode} % \end{macro} % \begin{macro}{\fancyrefhook} % \label{sec:fancyrefhook} % It may be clever to define a hook that is executed for every % \cmd{\fref} or \cmd{\Fref} command. For the moment the hook does % nothing but simply inserting its argument. I will do something % more useful with it later in this file. \emph{You} can use it % also for the way of cross-referencing the world is waiting for. % \winkey % % Send me a mail, if you think you have defined a really nifty % hook, so I can include it in future versions of this package. % \begin{macrocode} \newcommand*{\fancyrefhook}[1]{#1}% % \end{macrocode} % \end{macro} % \begin{macro}{\...spacing} % These two macros are used to define the spacing between the type % of the referenced object and the counter of the object, for % example between \sampleoutput{Figure} and \sampleoutput{1} in % \sampleoutput{Figure~1}. Normally there is no need to change % these definitions. % \begin{macrocode} \newcommand*{\fancyrefloosespacing}{~}% \newcommand*{\fancyreftightspacing}{\,}% % \end{macrocode} % \end{macro} % \begin{macro}{\...defaultformat} % Now the default \package{fancyref} format is initialized. The % real value will be set later depending on the package options. % \begin{macrocode} \newcommand*{\fancyrefdefaultformat}{\@empty}% % \end{macrocode} % \end{macro} % Now some strings are initialized. The real values will be % declared later depending on the package options. % \begin{macrocode} \newcommand*{\Frefchapname}{\@empty}% \newcommand*{\Frefenumname}{\@empty}% \newcommand*{\Frefeqname}{\@empty}% \newcommand*{\Freffigname}{\@empty}% \newcommand*{\Freffnname}{\@empty}% \newcommand*{\Frefonname}{\@empty}% \newcommand*{\Frefpgname}{\@empty}% \newcommand*{\Frefsecname}{\@empty}% \newcommand*{\Frefseename}{\@empty}% \newcommand*{\Freftabname}{\@empty}% \newcommand*{\Freffigshortname}{\@empty}% \newcommand*{\Frefpgshortname}{\@empty}% \newcommand*{\Freftabshortname}{\@empty}% \newcommand*{\frefchapname}{\@empty}% \newcommand*{\frefenumname}{\@empty}% \newcommand*{\frefeqname}{\@empty}% \newcommand*{\freffigname}{\@empty}% \newcommand*{\freffnname}{\@empty}% \newcommand*{\frefonname}{\@empty}% \newcommand*{\frefpgname}{\@empty}% \newcommand*{\frefsecname}{\@empty}% \newcommand*{\frefseename}{\@empty}% \newcommand*{\freftabname}{\@empty}% \newcommand*{\freffigshortname}{\@empty}% \newcommand*{\frefpgshortname}{\@empty}% \newcommand*{\freftabshortname}{\@empty}% % \end{macrocode} % % % \subsubsection{Option Declaration} % % \DescribeMacro{english} % Now the package options are declared. Send me a mail, if you % define options for other languages than english or german. % \begin{macrocode} \DeclareOption{english}{% % \end{macrocode} % Some strings for cross-referencing in english are added (if the % command \cmd{\captionsenglish} is existing) or simply defined. % \begin{macrocode} \fancyrefaddcaptions{english}{% % \end{macrocode} % I better do not touch these strings, because they are used in % many document classes and may be already changed by the user. % Therefore they will be defined only if they did not exist before % \cite{LaTeX:1997}. % \begin{macrocode} \providecommand*{\chaptername}{Chapter}% \providecommand*{\figurename}{Figure}% \providecommand*{\pagename}{Page}% \providecommand*{\tablename}{Table}% % \end{macrocode} % \begin{macro}{\Fref...name} % The \package{fancyref} package uses its own strings for % cross-referencing purposes. In this way you can use % \stringdef{Chapter} for chapter headings but \stringdef{Chap.} % for cross-referencing. % % However, I do not recommend abbreviations for cross-references, % because they look ugly at the beginning of a sentence and should % be avoided in these places according to most typographers. Also, % the scientific publisher Springer does not allow abbreviation of % the words \sampleoutput{table} or \sampleoutput{Tabelle} (I % suppose because of ambuigity with \sampleoutput{tabbing} or % \sampleoutput{Tabulator}). % % The macros \cmd{\Frefonname} and \cmd{\Frefseename} may be useful % in new, user-defined \package{fancyref} formats % (\frefseename~\frefpgname~\pageref{sec:fancyrefformats}). % % All macro names start with a capital \source{S}, because they % will be used for cross-references at the beginning of a sentence, % where usually capital letters are used. % \begin{macrocode} \renewcommand*{\Frefchapname}{\chaptername}% \renewcommand*{\Frefenumname}{Item}% \renewcommand*{\Frefeqname}{Equation}% \renewcommand*{\Freffigname}{\figurename}% \renewcommand*{\Freffnname}{Footnote}% \renewcommand*{\Frefonname}{On}% \renewcommand*{\Frefpgname}{\pagename}% \renewcommand*{\Frefsecname}{Section}% \renewcommand*{\Frefseename}{See}% \renewcommand*{\Freftabname}{\tablename}% % \end{macrocode} % \end{macro} % \begin{macro}{\Fref...shortname} % These macros are used for cross-references placed in the margin. % In marginal notes compact information is crucial due to the % limited space, so abbreviated versions of the strings are used. % For my general opinion about abbreviations see above. % \begin{macrocode} \renewcommand*{\Freffigshortname}{Fig.}% \renewcommand*{\Frefpgshortname}{P.}% \renewcommand*{\Freftabshortname}{Tab.}% % \end{macrocode} % \end{macro} % \begin{macro}{\fref...name} % Now the lower-case versions of the language dependent strings % (starting with a lower-case \source{s}) are declared. As these % macros are generated automatically by use of the % \cmd{\MakeLowercase} command, there is no need to customize them, % except you want to use for example \stringdef{Table} at the start % of a sentence and \stringdef{tabular} within a sentence. % Inconsistencies like this should of course be avoided. % \begin{macrocode} \renewcommand*{\frefchapname}{% \MakeLowercase{\Frefchapname}% }% \renewcommand*{\frefenumname}{% \MakeLowercase{\Frefenumname}% }% \renewcommand*{\frefeqname}{% \MakeLowercase{\Frefeqname}% }% \renewcommand*{\freffigname}{% \MakeLowercase{\Freffigname}% }% \renewcommand*{\freffnname}{% \MakeLowercase{\Freffnname}% }% \renewcommand*{\frefonname}{% \MakeLowercase{\Frefonname}% }% \renewcommand*{\frefpgname}{% \MakeLowercase{\Frefpgname}% }% \renewcommand*{\frefsecname}{% \MakeLowercase{\Frefsecname}% }% \renewcommand*{\frefseename}{% \MakeLowercase{\Frefseename}% }% \renewcommand*{\freftabname}{% \MakeLowercase{\Freftabname}% }% \renewcommand*{\freffigshortname}{% \MakeLowercase{\Freffigshortname}% }% \renewcommand*{\frefpgshortname}{% \MakeLowercase{\Frefpgshortname}% }% \renewcommand*{\freftabshortname}{% \MakeLowercase{\Freftabshortname}% }% % \end{macrocode} % \end{macro} % The closing brace of the second argument of \cmd{\fancyrefaddto}: % \begin{macrocode} }% % \end{macrocode} % If \cmd{\captionsenglish} is defined (\file{babel.sty} or % \file{german.sty} are used), the language is switched to % \option{english}. In either case the \package{varioref} package % will be called with the option \option{english} to provide % english strings like \sampleoutput{on the following page}, see % \file{varioref.dvi}. % \begin{macrocode} \@ifundefined{captionsenglish}{% }{% \selectlanguage{english}% }% \PassOptionsToPackage{\CurrentOption}{varioref}% % \end{macrocode} % The closing brace of the \option{english} option: % \begin{macrocode} }% % \end{macrocode} % \DescribeMacro{german} % The definition of the german strings is more simple. Except for % \cmd{\Frefonname} and \cmd{\Frefseename} the lower-case versions % of the macros are identical with the upper-case version. Damn, % my mother tongue seems to be a rather simple language. \winkey % % A check for the existence of \cmd{\captionsgerman} should not be % necessary as in almost all cases german \LaTeX nicians use either % \file{babel.sty} or \file{german.sty}, but one never % knows~\ldots{} The language is switched and the % \package{varioref} package is prepared accordingly. % \begin{macrocode} \DeclareOption{german}{% \fancyrefaddcaptions{german}{% \providecommand*{\chaptername}{Kapitel}% \providecommand*{\figurename}{Abbildung}% \providecommand*{\pagename}{Seite}% \providecommand*{\tablename}{Tabelle}% \renewcommand*{\Frefchapname}{\chaptername}% \renewcommand*{\Frefenumname}{Punkt}% \renewcommand*{\Frefeqname}{Gleichung}% \renewcommand*{\Freffigname}{\figurename}% \renewcommand*{\Freffigshortname}{Abb.}% \renewcommand*{\Freffnname}{Fu\ss note}% \renewcommand*{\Frefonname}{Auf}% \renewcommand*{\Frefpgname}{\pagename}% \renewcommand*{\Frefpgshortname}{S.}% \renewcommand*{\Frefsecname}{Abschnitt}% \renewcommand*{\Frefseename}{Siehe}% \renewcommand*{\Freftabname}{\tablename}% \renewcommand*{\Freftabshortname}{Tab.}% \renewcommand*{\frefchapname}{\Frefchapname}% \renewcommand*{\frefenumname}{\Frefenumname}% \renewcommand*{\frefeqname}{\Frefeqname}% \renewcommand*{\freffigname}{\Freffigname}% \renewcommand*{\freffigshortname}{\Freffigshortname}% \renewcommand*{\freffnname}{\Freffnname}% \renewcommand*{\frefonname}{% \MakeLowercase{\Frefonname}% }% \renewcommand*{\frefpgname}{\Frefpgname}% \renewcommand*{\frefpgshortname}{\Frefpgshortname}% \renewcommand*{\frefsecname}{\Frefsecname}% \renewcommand*{\frefseename}{% \MakeLowercase{\Frefseename}% }% \renewcommand*{\freftabname}{\Freftabname}% \renewcommand*{\freftabshortname}{\Freftabshortname}% }% \@ifundefined{captionsgerman}{% }{% \selectlanguage{german}% }% \PassOptionsToPackage{\CurrentOption}{varioref}% }% % \end{macrocode} % \DescribeMacro{loose} % This option sets up loose spacing between string and counter like % \sampleoutput{Figure~1}. This spacing is recommended, because % \file{varioref.sty} is using it also (on a hard-coded base), and % so inconsistencies can be avoided. Do not take things too % seriously, the inter-word spacing varies quite a bit from line to % line. Even a trained eye will not always be able to distinguish % between \socalled{tight} and \socalled{loose} spacing. Compared % with favourite \ac{WYTYSYDG}\footnote{What You Thought You Saw % You Didn't Get.} word processors the spacing will be tight in % either case. \winkey % \begin{macrocode} \DeclareOption{loose}{% \newcommand*{\fancyrefdefaultspacing}{% \fancyrefloosespacing }% }% % \end{macrocode} % \DescribeMacro{margin} % This option is an example for a application of % \cmd{\fancyrefhook}. It places all cross-references into the % margin, typesetting them in \cmd{\footnotesize} and % \cmd{\raggedright}. For details see the definition of the % \format{margin} format \vpageref{sec:margin}. % % Do \emph{not} use the \option{margin} option in combination with % those \format{margin} formats. As this would need nested % \cmd{\marginpar} commands, you will get \error{Float(s) lost.} % error messages. % % Also, you should use abbreviated formats in combination with the % \option{margin} option, because there is not enough space for a % message like \sampleoutput{Figure~1 on the following page} out % there. % % I would recommend the usage of marginal cross-references only for % floats. The according formats are already defined, so take this % options as an example for what is possible. % \begin{macrocode} \DeclareOption{margin}{% \renewcommand{\fancyrefhook}[1]{% \mbox{}% \marginpar{% \raggedright\hspace{0pt}\footnotesize \ensuremath{\m@th\rightarrow}~#1% }% }% }% % \end{macrocode} % \DescribeMacro{paren} % Another example for an application of \cmd{\fancyrefhook}. It % simply puts parentheses around every cross-reference. This does % not make much sense, if you intend to use marginal notes for % cross-referencing purposes: If you combine this option with the % |margin| option, the last specified option \socalled{wins}. If % you use the \format{margin} formats defined later, you will get % parentheses around marginal notes, which is ugly. % \begin{macrocode} \DeclareOption{paren}{% \renewcommand*{\fancyrefhook}[1]{(#1)}% }% % \end{macrocode} % \DescribeMacro{plain} % If this package option is given, only the plain counter of the % referenced object will be used, no page number will be printed at % all. % \begin{macrocode} \DeclareOption{plain}{% \renewcommand*{\fancyrefdefaultformat}{plain}% }% % \end{macrocode} % \DescribeMacro{tight} % This option may be useful, if you prefer tight spacing between % string and counter. According to most textbooks on typography % this is the recommended spacing between parts of abbreviations % like \sampleoutput{i.\,e.} or \sampleoutput{Fig.\,1}. % \begin{macrocode} \DeclareOption{tight}{% \newcommand*{\fancyrefdefaultspacing}{% \fancyreftightspacing }% }% % \end{macrocode} % \DescribeMacro{vario} % If this package option is given, all cross-referencing commands % will use the \format{vario} format with variable output of the % page number, like with \file{varioref.sty}. This is the default. % \begin{macrocode} \DeclareOption{vario}{% \renewcommand*{\fancyrefdefaultformat}{vario}% }% % \end{macrocode} % Other local options will be passed to the \package{varioref} % package after causing an error message. If you use e.\,g.\ % \option{danish} as a \emph{global} option (see % \file{clsguide.dvi}), you will get \emph{english} % \package{fancyref} strings without a warning or an error, hence % be careful. This is \emph{not} the fault of the % \package{fancyref} package, but a feature of the \LaTeXe{} option % handler. You \emph{really} should load the package according to % \fref{sec:loading}. % \begin{macrocode} \DeclareOption*{% \PackageError{fancyref}{% Unknown option ``\CurrentOption''% }{% The option ``\CurrentOption'' was not declared in package ``fancyref'',\MessageBreak perhaps you have only misspelled its name.\MessageBreak Currently only the languages ``english'' and ``german'' are defined.\MessageBreak Try typing to proceed. Most likely your output will be wrong,\MessageBreak e. g. ``Figure'' instead of ``Abbildung''.% }% \PassOptionsToPackage{\CurrentOption}{varioref}% }% % \end{macrocode} % % % \subsubsection{Option Processing} % % If no options are specified, english strings for % cross-referencing, loose spacing between string and counter, and % variable output of the page numbers will be used by default. % Otherwise the options are processed in the order given by the % calling command. % \begin{macrocode} \ExecuteOptions{english,loose,vario}% \ProcessOptions*% % \end{macrocode} % % % \subsubsection{Loading Files} % % This package uses a nice feature of the \package{varioref} % package to generate variable output depending on the difference % between the page number on which the cross-reference occurs and % the page number of the referenced object. \file{varioref.sty} is % therefore required. % \begin{macrocode} \RequirePackage{varioref}% % \end{macrocode} % % % \subsubsection{Defining Commands} % % \begin{macro}{\...labelprefix} % Most users distinguish between labels for figures and tables to % avoid a mix-up. This is usually done by prefixing the labels % with \prefix{fig} or \prefix{tab}. These definitions declare the % defaults for this classifying part. % \begin{macrocode} \newcommand*{\fancyrefchaplabelprefix}{chap}% \newcommand*{\fancyrefenumlabelprefix}{enum}% \newcommand*{\fancyrefeqlabelprefix}{eq}% \newcommand*{\fancyreffiglabelprefix}{fig}% \newcommand*{\fancyreffnlabelprefix}{fn}% \newcommand*{\fancyrefseclabelprefix}{sec}% \newcommand*{\fancyreftablabelprefix}{tab}% % \end{macrocode} % \end{macro} % To enable user changes of these prefixes it is necessary to do % some list processing.\footnote{Credits go to \person{Carsten % Heinz} and \person{Heiko Oberdiek} for providing and optimizing % this code. I did not understand a single token in the beginning. % \winkey} There is one command list for each prefix. It contains % a number of macros that will rename the formatting commands % defined for this prefix. Initially, the package defines the % \cmd{\@fancyref@ren} command as empty, by means of % \cmd{\newcommand*}. In this way, even with the \cmd{\def} command % other macros cannot be overwritten by accident.\footnote{Credits % go to \person{Bernd Raichle} for this nice little trick, which is % used throughout this package.} % \begin{macro}{\@...append@ren} % The first argument of the following command is one of those % command lists, the second argument is a \package{fancyref} % format. A macro renaming the corresponding formatting command % will be appended to the command list. % \begin{macrocode} \newcommand*{\@fancyref@ren}{\@empty}% \newcommand*{\@fancyref@append@ren}[2]{% \ifx\relax#1% \def#1{\@fancyref@ren{#2}}% \else \expandafter\def\expandafter#1% \expandafter{#1\@fancyref@ren{#2}}% \fi }% % \end{macrocode} % \end{macro} % \begin{macro}{\@...check@prefix} % This command does most of the work, when a prefix is to be % renamed. First, the old, saved prefix for the corresponding % object type is recalled. % \begin{macrocode} \newcommand*{\@fancyref@check@prefix}[1]{% \expandafter\let\expandafter\@fancyref@old@prefix \csname @fancyref@saved@prefix\string#1\endcsname % \end{macrocode} % The old prefix is compared with the prefix given by the % argument. % \begin{macrocode} \ifx\@fancyref@old@prefix#1% % \end{macrocode} % If the prefixes are different, the renaming macros are set up. % Their only argument will be a \package{fancyref} format. % \begin{macrocode} \else \def\@fancyref@ren##1{% % \end{macrocode} % The prefixing part of the name will be changed, if the renaming % macros are called with the corresponding argument. % % More precisely, the definition of the old formatting command is % copied to a new command including the new prefix in its name. % \begin{macrocode} \expandafter \let\csname fr@##1@#1\expandafter\endcsname \csname fr@##1@\@fancyref@old@prefix\endcsname % \end{macrocode} % Then the old command is deleted. % \begin{macrocode} \expandafter \let\csname fr@##1@\@fancyref@old@prefix\endcsname \@undefined }% % \end{macrocode} % Now the command list containing the renaming macros for the given % prefix is executed. % \begin{macrocode} \csname @fr@ren@list\string#1\endcsname % \end{macrocode} % The procedure is repeated for the upper-case formatting % commands. % \begin{macrocode} \def\@fancyref@ren##1{% \expandafter \let\csname Fr@##1@#1\expandafter\endcsname \csname Fr@##1@\@fancyref@old@prefix\endcsname \expandafter \let\csname Fr@##1@\@fancyref@old@prefix\endcsname \@undefined }% \csname @Fr@ren@list\string#1\endcsname % \end{macrocode} % Finally the new prefix for the corresponding object type is % saved. % \begin{macrocode} \expandafter\let \csname @fancyref@saved@prefix\string#1\endcsname#1% \fi }% % \end{macrocode} % \end{macro} % \begin{macro}{\...changeprefix} % This user command changes the default prefix for an object type % (the first argument) to a new string (the second argument). Then % the renaming of the formatting commands is done. % \begin{macrocode} \newcommand*{\fancyrefchangeprefix}[2]{% \renewcommand*{#1}{#2}% \@fancyref@check@prefix{#1}% }% % \end{macrocode} % \end{macro} % \begin{macro}{\frefformat} % This macro is used to define new formats for the typesetting of % cross-references. It takes three arguments, the first is the % name of the declared format, the second is the prefix macro used % for this format (e.\,g.\ \cmd{\fancyreffiglabelprefix} for % cross-references to figures) and the third describes the output % generated by the cross-reference. % % Within the third argument |#1| will be replaced by the counter of % the referenced object (i.\,e.\ the output of a \cmd{\ref} % command), |#2| will be replaced by the page number (i.\,e.\ the % output of a \cmd{\pageref} command) and |#3| will be replaced by % the output of a \cmd{\vpageref} command. % \begin{macrocode} \newcommand{\frefformat}[2]{% % \end{macrocode} % It is checked if the prefix has changed and the already existing % formatting commands are renamed. % \begin{macrocode} \@fancyref@check@prefix{#2}% % \end{macrocode} % Then the \package{fancyref} format given in the first argument is % appended to the command list for the prefix given in the second % argument. % \begin{macrocode} \expandafter\@fancyref@append@ren \csname @fr@ren@list\string#2\endcsname{#1}% % \end{macrocode} % Finally the formatting command is defined. % \begin{macrocode} \@namedef{fr@#1@#2}##1##2##3% }% % \end{macrocode} % \end{macro} % \begin{macro}{\Frefformat} % The definition of the command for declaring \package{fancyref} % formats used at the beginning of a sentence is almost the same, % the only difference is that upper-case commands like % \cmd{\Fr@sample@ex} are used internally. This enables usage of % \stringdef{figure} within a sentence and \stringdef{Figure} at % the beginning of a sentence. % \begin{macrocode} \newcommand{\Frefformat}[2]{% \@fancyref@check@prefix{#2}% \expandafter\@fancyref@append@ren \csname @Fr@ren@list\string#2\endcsname{#1}% \@namedef{Fr@#1@#2}##1##2##3% }% % \end{macrocode} % \end{macro} % % % \paragraph{Format Definition.\label{sec:fancyrefformats}} % % Now it is time for the definition of the \package{fancyref} % formats. Generally the \format{vario} formats use the features % of the \package{varioref} package, whereas the \format{plain} % formats provide the name of the referenced object and its % counter, but no page number. % % Of course the various macros for spacing, classifying prefixes % and names of the referenced object are used. This will ensure % that the default formats also work after redefining e.\,g.\ % \cmd{\chaptername} to \stringdef{Fool} and % \cmd{\fancyrefchaplabelprefix} to \stringdef{moron}. % Cross-references generated by |\fref{moron:bar}| will then come % out correctly as \sampleoutput{fool~1}. % \begin{macrocode} \frefformat{vario}{\fancyrefchaplabelprefix}{% \frefchapname\fancyrefdefaultspacing#1#3% }% \frefformat{plain}{\fancyrefchaplabelprefix}{% \frefchapname\fancyrefdefaultspacing#1% }% \frefformat{vario}{\fancyrefenumlabelprefix}{% \frefenumname\fancyrefdefaultspacing#1#3% }% \frefformat{plain}{\fancyrefenumlabelprefix}{% \frefenumname\fancyrefdefaultspacing#1% }% % \end{macrocode} % The formats for the cross-refernces to equations are more % complex, because I wanted to support the \cmd{\tagform@} command % of the \package{amsmath} package \cite{AMS:1996}: %\begin{verbatim} % \makeatletter % \renewcommand{\tagform@}[1]{\textup{[#1]}} % \makeatother %\end{verbatim} % will make both the equation numbers and the cross-references % generated e.\,g.\ by |\fref{eq:bar}| come out as % \sampleoutput{[1]}. Even within a formula a cross-referenced % equation number will \emph{not} be typeset in italics. % \begin{macrocode} \@ifundefined{tagform@}{% \frefformat{vario}{\fancyrefeqlabelprefix}{% \frefeqname\fancyrefdefaultspacing\textup{(#1)}#3% }% \frefformat{plain}{\fancyrefeqlabelprefix}{% \frefeqname\fancyrefdefaultspacing\textup{(#1)}% }% }{% \frefformat{vario}{\fancyrefeqlabelprefix}{% \frefeqname\fancyrefdefaultspacing \textup{\tagform@{#1}}#3% }% \frefformat{plain}{\fancyrefeqlabelprefix}{% \frefeqname\fancyrefdefaultspacing \textup{\tagform@{#1}}% }% }% % \end{macrocode} % % \label{sec:margin} % For figures and tables an additional \package{fancyref} format % called \format{margin} is provided to put cross-references into % the margin. % % |\mbox{}| will fix an alignment problem, if the \cmd{\marginpar} % command occurs prior to the first word of a paragraph, see % \cite[p.~75]{Goossens:1994}. |\hspace{0pt}| enables hyphenation % of the very first word of the \cmd{\marginpar} command. % % Marginal notes are typeset in a smaller font and % \cmd{\raggedright}. The \cmd{\rightarrow} is typeset in math % mode without the horizontal space usually added by % \cmd{\mathsurround}. % % In marginal notes tight spacing is appropriate, because due to % the limited space in the margins abbreviated strings are used. % \begin{macrocode} \frefformat{margin}{\fancyreffiglabelprefix}{% \mbox{}\marginpar{% \raggedright\hspace{0pt}\footnotesize \ensuremath{\m@th\rightarrow}~% \Freffigshortname\fancyreftightspacing#1, \frefpgshortname\fancyreftightspacing#2% }% }% % \end{macrocode} % The \format{main} format should be used for that cross-reference % which explains the referenced object in detail. Scientific % papers usually are browsed very quickly, perhaps the reader stops % at a figure or a table and begins to search for the explanation % of this float. Hence it is very helpful to typeset this main % cross-reference in bold face and to provide the full information % including the page number (with support of the \package{varioref} % package). These \format{main} formats are defined only for % floats, i.\,e.\ figures or tables, because for other, % non-floating objects the \socalled{main} cross-reference usually % can be found very near to the object. % \begin{macrocode} \frefformat{main}{\fancyreffiglabelprefix}{% \textbf{\freffigname\fancyrefdefaultspacing#1}#3% }% % \end{macrocode} % The rest of the format definitions should now be straight % forward. % \begin{macrocode} \frefformat{vario}{\fancyreffiglabelprefix}{% \freffigname\fancyrefdefaultspacing#1#3% }% \frefformat{plain}{\fancyreffiglabelprefix}{% \freffigname\fancyrefdefaultspacing#1% }% \frefformat{vario}{\fancyreffnlabelprefix}{% \freffnname\fancyrefdefaultspacing#1#3% }% \frefformat{plain}{\fancyreffnlabelprefix}{% \freffnname\fancyrefdefaultspacing#1% }% \frefformat{vario}{\fancyrefseclabelprefix}{% \frefsecname\fancyrefdefaultspacing#1#3% }% \frefformat{plain}{\fancyrefseclabelprefix}{% \frefsecname\fancyrefdefaultspacing#1% }% \frefformat{margin}{\fancyreftablabelprefix}{% \mbox{}\marginpar{% \raggedright\hspace{0pt}\footnotesize \ensuremath{\m@th\rightarrow}~% \Freftabshortname\fancyreftightspacing#1, \frefpgshortname\fancyreftightspacing#2% }% }% \frefformat{main}{\fancyreftablabelprefix}{% \textbf{\freftabname\fancyrefdefaultspacing#1}#3% }% \frefformat{vario}{\fancyreftablabelprefix}{% \freftabname\fancyrefdefaultspacing#1#3% }% \frefformat{plain}{\fancyreftablabelprefix}{% \freftabname\fancyrefdefaultspacing#1% }% % \end{macrocode} % Now it is time for the upper-case versions of the format % definitions. % \begin{macrocode} \Frefformat{vario}{\fancyrefchaplabelprefix}{% \Frefchapname\fancyrefdefaultspacing#1#3% }% \Frefformat{plain}{\fancyrefchaplabelprefix}{% \Frefchapname\fancyrefdefaultspacing#1% }% \Frefformat{vario}{\fancyrefenumlabelprefix}{% \Frefenumname\fancyrefdefaultspacing#1#3% }% \Frefformat{plain}{\fancyrefenumlabelprefix}{% \Frefenumname\fancyrefdefaultspacing#1% }% \@ifundefined{tagform@}{% \Frefformat{vario}{\fancyrefeqlabelprefix}{% \Frefeqname\fancyrefdefaultspacing\textup{(#1)}#3% }% \Frefformat{plain}{\fancyrefeqlabelprefix}{% \Frefeqname\fancyrefdefaultspacing\textup{(#1)}% }% }{% \Frefformat{vario}{\fancyrefeqlabelprefix}{% \Frefeqname\fancyrefdefaultspacing \textup{\tagform@{#1}}#3% }% \Frefformat{plain}{\fancyrefeqlabelprefix}{% \Frefeqname\fancyrefdefaultspacing \textup{\tagform@{#1}}% }% }% \Frefformat{margin}{\fancyreffiglabelprefix}{% \mbox{}\marginpar{% \raggedright\hspace{0pt}\footnotesize \ensuremath{\m@th\rightarrow}~% \Freffigshortname\fancyreftightspacing#1, \frefpgshortname\fancyreftightspacing#2% }% }% \Frefformat{main}{\fancyreffiglabelprefix}{% \textbf{\Freffigname\fancyrefdefaultspacing#1}#3% }% \Frefformat{vario}{\fancyreffiglabelprefix}{% \Freffigname\fancyrefdefaultspacing#1#3% }% \Frefformat{plain}{\fancyreffiglabelprefix}{% \Freffigname\fancyrefdefaultspacing#1% }% \Frefformat{vario}{\fancyreffnlabelprefix}{% \Freffnname\fancyrefdefaultspacing#1#3% }% \Frefformat{plain}{\fancyreffnlabelprefix}{% \Freffnname\fancyrefdefaultspacing#1% }% \Frefformat{vario}{\fancyrefseclabelprefix}{% \Frefsecname\fancyrefdefaultspacing#1#3% }% \Frefformat{plain}{\fancyrefseclabelprefix}{% \Frefsecname\fancyrefdefaultspacing#1% }% \Frefformat{margin}{\fancyreftablabelprefix}{% \mbox{}\marginpar{% \raggedright\hspace{0pt}\footnotesize \ensuremath{\m@th\rightarrow}~% \Freftabshortname\fancyreftightspacing#1, \frefpgshortname\fancyreftightspacing#2% }% }% \Frefformat{main}{\fancyreftablabelprefix}{% \textbf{\Freftabname\fancyrefdefaultspacing#1}#3% }% \Frefformat{vario}{\fancyreftablabelprefix}{% \Freftabname\fancyrefdefaultspacing#1#3% }% \Frefformat{plain}{\fancyreftablabelprefix}{% \Freftabname\fancyrefdefaultspacing#1% }% % \end{macrocode} % \ldots~much tedious work! % \begin{macro}{\fancyrefargdelim} % \label{sec:delim} % The following definition sets up the default for the delimiting % character between the \socalled{classifying} part and the % \socalled{labeling} part of a label, e.\,g.\ in % \labelname{fig:foo} the colon is used as a delimitor. This can % be customized, but most users will stick to the conventional % \delimitor{:}. % \begin{macrocode} \newcommand*{\fancyrefargdelim}{:}% % \end{macrocode} % \end{macro} % The following code saves the backslash char in a token register, % so it can be used in \cmd{\PackageError} % messages.\footnote{Credits go to \person{Bernd Raichle} for this % dirty trick.} Sorry, I do not understand the code due to its % \cmd{\catcode} and grouping hacking. Still much to learn~\ldots % \begin{macrocode} \begingroup \catcode`\|=0 |catcode`|\=12 |toks0={|endgroup |def|backslashchar{\}} |the|toks0 \relax % \end{macrocode} % \begin{macro}{\@...page@ref} % This macro is a hacked version of the \cmd{\vpageref} command % from the \package{varioref} package, which removes a space that % is superfluous for my purpose. % \begin{macrocode} \newcommand*{\@fancyref@page@ref}{\@ifnextchar[%] \@vpageref{\@vpageref[\unskip]}% }% % \end{macrocode} % \end{macro} % \begin{macro}{\@f@ref} % This macro now does the real work. It tests if the specified % format for the given classifying prefix exists. If it does, the % formatting command is called with three arguments: The counter of % the referenced object (\cmd{\ref}), the page number of the % referenced object (\cmd{\pageref}) and the page number resulting % from a \cmd{\vpageref}. The output of the formatting command % will be passed as an argument to the \cmd{\fancyrefhook} command % (\frefseename~\frefpgname~\pageref{sec:fancyrefhook}). If the % formatting command does not exist, a package error occurs. % \begin{macrocode} \newcommand*{\@f@ref}[4]{% \@ifundefined{#1r@#2@#3}{% \PackageError{fancyref}{% \backslashchar#1ref\space format ``#2'' undefined\MessageBreak for label type ``#3''% }{% The format ``#2'' was not defined for the label type ``#3''\MessageBreak and the \backslashchar#1ref\space command. Perhaps you have only misspelled its name.\MessageBreak Otherwise you will have to define it with \protect\new#1refformat\MessageBreak prior to using it.% }% }{% \fancyrefhook{% \@nameuse{#1r@#2@#3}% {\ref{#3\fancyrefargdelim#4}}% {\pageref{#3\fancyrefargdelim#4}}% {\@fancyref@page@ref{#3\fancyrefargdelim#4}}% }% }% }% % \end{macrocode} % \end{macro} % \begin{macro}{\fref} % This macro is the front-end for the user. Its first, optional % argument is the format of the cross-reference, the second, % mandatory argument is the label of the cross-referenced object. % If no optional argument is provided, \cmd{\fancyrefdefaultformat} % will be used as a format. % % The second argument is then split at the delimiting character % (\cmd{\fancyrefargdelim}, % \frefseename~\frefpgname~\pageref{sec:delim}) into a classifying % prefix and the labeling part. I am sorry that I do not % understand the \cmd{\@fref} command completely. But it works % really well,\footnote{Credits go to \person{David Carlisle} who % once again send me the cut-and-paste solution for my problems.} % and passes four arguments to the \cmd{\@f@ref} command: % Lower-case flag, format, classifying prefix and labeling part. % \begin{macrocode} \newcommand*{\@fref}{\@empty}% \newcommand*{\fref}[2][\fancyrefdefaultformat]{% \edef\@fref{% \def\noexpand\@fref ####1\fancyrefargdelim####2\noexpand\@fref{% \noexpand\@f@ref{f}{#1}{####1}{####2}% }% }% \@fref \@fref#2\@fref }% % \end{macrocode} % \end{macro} % \begin{macro}{\Fref} % This macro works exactly the same way as \cmd{\Fref}. It should % be used at the beginning of a sentence and hence passes an % upper-case \source{S} to the \cmd{\@f@ref} command. % \person{Stefan Ulrich}\footnote{He will easily notice that his % name was typeset without his additions to the \package{soul} % package \cite{Franz:1998}. \winkey} told me kindly that it is % very difficult to implement a reliable heuristic to check for the % start of a sentence. So I decided to leave this as an exercise % for the reader. \winkey % \begin{macrocode} \newcommand*{\@Fref}{\@empty}% \newcommand*{\Fref}[2][\fancyrefdefaultformat]{% \edef\@Fref{% \def\noexpand\@Fref ####1\fancyrefargdelim####2\noexpand\@Fref{% \noexpand\@f@ref{F}{#1}{####1}{####2}% }% }% \@Fref \@Fref#2\@Fref }% % % \end{macrocode} % \end{macro} % \Finale % \iffalse %<*testfile> \documentclass[12pt,a4paper]{ltxdoc} % \usepackage{fancyref} \fancyrefaddcaptions{english}{% \newcommand*{\Frefthmname}{Theorem}% \newcommand*{\frefthmname}{\MakeLowercase{\Frefthmname}}% }% % \newcommand*{\booktitle}[1]{``#1''} \newcommand*{\format}[1]{\texttt{#1}} \newcommand*{\labelname}[1]{\texttt{#1}} \newcommand*{\option}[1]{\texttt{#1}} \newcommand*{\package}[1]{\texttt{#1}} \newcommand*{\person}[1]{\textsc{#1}} \newcommand*{\prefix}[1]{\texttt{#1}} \newcommand*{\stringdef}[1]{``#1''} % \newtheorem{theorem}{Theorem} % \begin{document} % Let us start with a famous equation: \begin{equation} \label{eq:pythagoras} a^2 + b^2 = c^2 \end{equation} \Fref{eq:pythagoras} has been proven by \person{Pythagoras}. And this cross-reference was made with |\Fref{eq:pythagoras}|. Note that I really wrote: \begin{verbatim} \Fref{eq:pythagoras} has ... \end{verbatim} I did not use: \begin{verbatim} Equation~(\Fref{eq:pythagoras}) has ... \end{verbatim} See the next page for further features of the \package{fancyref} package, I need this page break for demonstration purposes. \clearpage The cross-reference works also in the middle of a sentence: \person{Pythagoras} has proven \fref{eq:pythagoras}. And this cross-reference was made with |\fref{eq:pythagoras}|. You can see the fancy output from the \package{varioref} package. Oh, you do not like this package and want normal \cmd{\ref} output instead? No problem, just redefine the default format: \renewcommand*{\fancyrefdefaultformat}{plain} \begin{verbatim} \renewcommand*{\fancyrefdefaultformat}{plain} \end{verbatim} Now the cross-reference looks like this: \Fref{eq:pythagoras}. There is also a package option called \option{plain} for this purpose. Oh, you do not like \stringdef{Equation} and want \stringdef{Eq.} instead? No problem, just redefine the string: \renewcommand*{\Frefeqname}{Eq.} \begin{verbatim} \renewcommand*{\Frefeqname}{Eq.} \end{verbatim} \Fref{eq:pythagoras} and \fref{eq:pythagoras} will be the result, respectively. Note that there is no need to redefine \cmd{\frefeqname} to \stringdef{eq.}. The \package{fancyref} package will do this automatically for you. But of course you can use \stringdef{eqn.} instead, if you really want to. Oh, you are not using the colon as a delimitor but rather the dash? No problem, just redefine the character: \renewcommand*{\fancyrefargdelim}{-} \begin{verbatim} \renewcommand*{\fancyrefargdelim}{-} \end{verbatim} The new test equation with label \labelname{eq-trivial} will be: \begin{equation} \label{eq-trivial} a = a \end{equation} The cross-reference |\fref{eq-trivial}| will give \fref{eq-trivial} as output, as expected. All that stuff may be nice, but you are using \prefix{eqn} instead of \prefix{eq}? No problem, just redefine the prefix: \fancyrefchangeprefix{\fancyrefeqlabelprefix}{eqn} \begin{verbatim} \fancyrefchangeprefix{\fancyrefeqlabelprefix}{eqn} \end{verbatim} We need a new, fantastic test equation with label \labelname{eqn-fantastic}: \begin{equation} \label{eqn-fantastic} b = b \end{equation} The cross-reference |\fref{eqn-fantastic}| will give \fref{eqn-fantastic} as output, as expected. Maybe the spacing between \stringdef{eq.} and ``3'' is too generous, let us tighten things a bit, with \renewcommand*{\fancyrefdefaultspacing}{\fancyreftightspacing} \begin{verbatim} \renewcommand*{\fancyrefdefaultspacing}{% \fancyreftightspacing } \end{verbatim} the spacing looks like \fref{eqn-fantastic}. If you think this is better, just use the \option{tight} option of this package. \fancyrefchangeprefix{\fancyrefeqlabelprefix}{eq} Perhaps you want parentheses around the cross-reference? No problem, just redefine the appropriate hook: \renewcommand*{\fancyrefhook}[1]{(#1)} \begin{verbatim} \renewcommand*{\fancyrefhook}[1]{(#1)} \end{verbatim} The result from |\fref{eq-trivial}| is \fref{eq-trivial}. In fact this could have been obtained easier, as I provided an package option just for this purpose: \begin{verbatim} \usepackage[paren]{fancyref} \end{verbatim} Now let us try something really cool. What about introducing a new type of objects, e.\,g.\ theorems, with \prefix{thm} prefixed, new strings like \stringdef{Theorem} added and the cross-reference in huge italics? Also, as you have read in that bargain textbook on typography (\booktitle{cAN U rEaD It} by \person{John Badmountain}), cross-references to theorems should be typeset as footnotes. No problem: First, we need a new prefix: \newcommand*{\fancyrefthmlabelprefix}{thm} \begin{verbatim} \newcommand*{\fancyrefthmlabelprefix}{thm} \end{verbatim} Then we declare a new \package{fancyref} format called \format{foot}: \frefformat{foot}{\fancyrefthmlabelprefix}{% \unskip\footnote{% \huge\itshape\Frefthmname\fancyrefdefaultspacing#1#3% }% } \Frefformat{foot}{\fancyrefthmlabelprefix}{% \unskip\footnote{% \huge\itshape\Frefthmname\fancyrefdefaultspacing#1#3% }% } \begin{verbatim} \frefformat{foot}{\fancyrefthmlabelprefix}{% \unskip\footnote{% \huge\itshape\Frefthmname\fancyrefdefaultspacing#1#3% }% } \Frefformat{foot}{\fancyrefthmlabelprefix}{% \unskip\footnote{% \huge\itshape\Frefthmname\fancyrefdefaultspacing#1#3% }% } \end{verbatim} The strings have to be setup in the preamble of the document, I did this already, because I knew it would be necessary. The code I used was: \begin{verbatim} \fancyrefaddcaptions{english}{% \newcommand*{\Frefthmname}{Theorem}% \newcommand*{\frefthmname}{% \MakeLowercase{\Frefthmname}% }% }% \end{verbatim} And finally this is the test theorem: \begin{theorem}[Murphy] \label{thm-murphy} If something \emph{can} go wrong, it \emph{will} go wrong. \end{theorem} Now let us try it. |\Fref[foot]{thm-murphy}| comes out as \Fref[foot]{thm-murphy}. Oops, the hook is still at work, I will just reset it to its default value: \renewcommand*{\fancyrefhook}[1]{#1}% \begin{verbatim} \renewcommand*{\fancyrefhook}[1]{#1} \end{verbatim} And now? \Fref[foot]{thm-murphy} Gotcha! % \end{document} % % \fi \endinput