\def\filedate{2001/01/27} \def\fileversion{2.19} % % \iffalse % File: nameref.dtx % Copyright (C) 1995-9 Sebastian Rahtz % 2000-1 Sebastian Rahtz, Heiko Oberdiek % %% This file is part of the `Hyperref Bundle'. %% ------------------------------------------- %% %% It may be distributed under the conditions of the LaTeX Project Public %% License, either version 1.2 of this license or (at your option) any %% later version. The latest version of this license is in %% http://www.latex-project.org/lppl.txt %% and version 1.2 or later is part of all distributions of LaTeX %% version 1999/12/01 or later. %% %% The list of all files belonging to the `Hyperref Bundle' is %% given in the file `manifest.txt'. %<*driver> \documentclass{ltxdoc} \begin{document} \title{% Section name references in \LaTeX \thanks{% This file has version number \fileversion, last revised \filedate.% }% } \author{Sebastian Rahtz} \date{\filedate} \maketitle \tableofcontents \DocInput{nameref.dtx} \end{document} % % \fi % \CheckSum{454} % \StopEventually{} % \section{Introduction} % Cross-referencing to include the \emph{name} of the section, rather than % just the number or page. This works by redefining some of the inside % \LaTeX\ macros, so it is vulnerable to future changes. % \section{History} % Sebastian Rahtz, for Lou Burnard, March 15th 1994; % SPQR CERN July 1994; % Last mod. Sept. 3th MG; % Sept. 19th SPQR; % April 11th 1995 SPQR (added section formatting hook); % April 14th 1995 SPQR (compatibility with hyperref); % June 22 1995 SPQR (removed typeout from Sectionformat); % September 22 1997 added varioref hacks by Corey Minyard; % September 28th changes by David Carlisle. % \begin{macrocode} %<*package> \ProvidesPackage{nameref}[\filedate\space v\fileversion \space Cross-referencing by name of section] % \end{macrocode} % % We redefine |\label| so that it also writes the name of the % current section to the .aux file; if the name ends in a dot, % we zap it. To allow for the hyperref package, also write % fourth and fifth fields (empty by default; % used for cross-ref name, and file). % \begin{macrocode} \def\strip@period#1.\relax#2\@@@{#1} % \end{macrocode} % % Here is tested, whether package showkeys is loaded. % But if option final is used, the macros of showkeys % are not defined, so we have to check an additional % test. % \begin{macrocode} \newif\ifNR@showkeys \NR@showkeysfalse \@ifpackageloaded{showkeys}{% \begingroup \@ifundefined{SK@@label}{% }{% \global\NR@showkeystrue }% \endgroup }{} % \end{macrocode} % \begin{macrocode} \def\label#1{% \@bsphack \begingroup \let\label\@gobble \def\ref{\protect\ref}% \edef\@currentlabstr{% \expandafter\strip@prefix\meaning\@currentlabelname }% \protected@write\@auxout{}{% \string\newlabel{#1}{% {\@currentlabel}% {\thepage}% {\expandafter\strip@period\@currentlabstr\relax.\relax\@@@}% {\@currentHref}{}% }% }% \endgroup \@esphack }% \ifNR@showkeys \def\label#1{% \@bsphack \SK@\SK@@label{#1}% \begingroup \let\label\@gobble \def\ref{\protect\ref}% \edef\@currentlabstr{% \expandafter\strip@prefix\meaning\@currentlabelname }% \protected@write\@auxout{}{% \string\newlabel{#1}{% {\@currentlabel}% {\thepage}% {\expandafter\strip@period\@currentlabstr\relax.\relax\@@@}% {\@currentHref}{}% }% }% \endgroup \@esphack }% \fi % \end{macrocode} % \begin{macrocode} \let\ltx@label\label % \end{macrocode} % Needed for the \emph{subeqnarray} package. % \begin{macrocode} \@ifundefined{slabel}{}{% \def\slabel#1{% \@bsphack \if@filesw {% \let\label\@gobble \def\ref{\protect\ref}% \edef\@currentlabstr{% \expandafter\strip@prefix\meaning\@currentlabelname }% \let\thepage\relax \def\protect{\noexpand\noexpand\noexpand}% \edef\@tempa{% \write\@auxout{% \string\newlabel{#1}{% {\thesubequation}% {\thepage}% {\expandafter\strip@period \@currentlabstr\relax.\relax\@@@}% {\@currentHref}{}% }% }% }% \expandafter }% \@tempa \if@nobreak\ifvmode\nobreak\fi\fi \fi \@esphack }% } % \end{macrocode} % Overload an AMS \LaTeX\ command, which uses |\newlabel|. Sigh! % \begin{macrocode} \def\@writetocindents@{% \begingroup \@for\@tempa:=-1,0,1,2,3\do{% \immediate\write\@auxout{% \string\newlabel{tocindent\@tempa}{% \csname r@tocindent\@tempa\endcsname{}{}{}{}% }% }% }% \endgroup} % \end{macrocode} % Add to the underlying section heading macros so that they % note the section name for use by label. % % If a section heading or the like has a |\label| in it, % we need to extract it, or subsequent processing breaks. % This is done by the label-writing routine. % % First the numbered sections. While we are about it, put in % a useful section formatting macro. % \begin{macrocode} \let\NR@sect\@sect \newcounter{section@level} \def\@sect#1#2#3#4#5#6[#7]#8{% \setcounter{section@level}{#2}% \def\@currentlabelname{#7}% \NR@sect{#1}{#2}{#3}{#4}{#5}{#6}[{#7}]{\Sectionformat{#8}{#2}}% } % \end{macrocode} % and now the unnumbered ones % \begin{macrocode} \let\NR@ssect\@ssect \def\@ssect#1#2#3#4#5{% \def\@currentlabelname{#5}% \NR@ssect{#1}{#2}{#3}{#4}{\Sectionformat{#5}{#1}}% } % \end{macrocode} % % Parts and chapters are treated differently. sigh. % % \begin{macrocode} \let\NR@part\@part \def\@part[#1]#2{% \def\@currentlabelname{#1}% \NR@part[{#1}]{#2}% } \let\NR@chapter\@chapter \def\@chapter[#1]#2{% \def\@currentlabelname{#1}% \NR@chapter[{#1}]{#2}% } \let\NR@schapter\@schapter \def\@schapter#1{% \def\@currentlabelname{#1}% \NR@schapter{#1}% } % \end{macrocode} % We default the label and hypertext reference to be empty. % \begin{macrocode} \def\@currentlabelname{} \def\@currentHref{} % \end{macrocode} % Since the second part of the preserved reference now has five parts % (number, page, name, hypertext reference and file), we need extra utility % macros: % \begin{macrocode} \long\def\@firstoffive#1#2#3#4#5{#1} \long\def\@secondoffive#1#2#3#4#5{#2} \long\def\@thirdoffive#1#2#3#4#5{#3} \long\def\@fourthoffive#1#2#3#4#5{#4} \long\def\@fifthoffive#1#2#3#4#5{#5} % \end{macrocode} % We have to redefine |\ref| and |\pageref| to know about extra % reference elements. Make them robust, and compatible with Babel. % The Babel switch is mimicked if not already defined. % Some support for package |showkeys| is implemented. If % option |notref| of that package is set, |\SK@ref| has the % meaning of |\@empty|. % \begin{macrocode} \providecommand*\@safe@activestrue{}% \providecommand*\@safe@activesfalse{}% \def\T@ref#1{% \@safe@activestrue \expandafter\@setref\csname r@#1\endcsname\@firstoffive{#1}% \@safe@activesfalse }% \def\T@pageref#1{% \@safe@activestrue \expandafter\@setref\csname r@#1\endcsname\@secondoffive{#1}% \@safe@activesfalse }% \ifNR@showkeys \ifx\SK@ref\@empty \else \def\T@ref#1{% \@safe@activestrue \SK@\SK@@ref{#1}% \expandafter\@setref\csname r@#1\endcsname\@firstoffive{#1}% \@safe@activesfalse }% \def\T@pageref#1{% \@safe@activestrue \SK@\SK@@ref{#1}% \expandafter\@setref\csname r@#1\endcsname\@secondoffive{#1}% \@safe@activesfalse }% \fi \fi \providecommand\ref{\protect\T@ref} \providecommand\pageref{\protect\T@pageref} % \end{macrocode} % \section{Usage and frontend} % Access the (third) name part with |\nameref|; % \begin{macrocode} \def\T@nameref#1{% \@safe@activestrue \expandafter\@setref\csname r@#1\endcsname\@thirdoffive{#1}% \@safe@activesfalse }% \ifNR@showkeys \ifx\SK@ref\@empty \else \def\T@nameref#1{% \@safe@activestrue \SK@\SK@@ref{#1}% \expandafter\@setref\csname r@#1\endcsname\@thirdoffive{#1}% \@safe@activesfalse }% \fi \fi \def\nameref{\protect\T@nameref} % \end{macrocode} % An extended form which gives title and page number. % \begin{macrocode} \def\Nameref#1{`\nameref{#1}' on page~\pageref{#1}} % \end{macrocode} % % The default for |\Sectionformat| % \begin{macrocode} \providecommand\Sectionformat[2]{#1} % \end{macrocode} % \subsection{Compatibility with varioref} % [This section was derived by Corey Minyard \texttt{minyard@acm.org} % from the varioref package] % \begin{macrocode} \ifx\csname @@vpageref\endcsname\relax \else \def\@@vpageref#1[#2]#3{% \leavevmode\unskip \global\advance\c@vrcnt\@ne \@ifundefined{r@\the\c@vrcnt @vr}% {\@namedef{r@\the\c@vrcnt @vr}{{??}{??}{??}{??}{??}}}{}% \edef\@tempa{% \expandafter\expandafter\expandafter \@secondoffive\csname r@\the\c@vrcnt @vr\endcsname }% \@ifundefined{r@\the\c@vrcnt @xvr}% {\@namedef{r@\the\c@vrcnt @xvr}{{??}{??}{??}{??}{??}}}{}% \edef\@tempb{% \expandafter\expandafter\expandafter \@secondoffive\csname r@\the\c@vrcnt @xvr\endcsname }% {% \let\@currentlabel\@empty \expandafter\label\expandafter{\the\c@vrcnt @xvr}% }% \ifx\@tempa\@tempb \else \vref@err{% \noexpand\vref at page boundary \@tempb-\@tempa\space (may loop)% }% \fi \@ifundefined{r@#3}{\@namedef{r@#3}{{??}{??}{??}{??}{??}}}{}% \edef\@tempb{% \expandafter\expandafter\expandafter \@secondoffive\csname r@#3\endcsname }% \space \ifx\@tempa\@tempb #1% \else #2% \is@pos@number\@tempb{% \is@pos@number\@tempa{% \@tempcnta\@tempa \advance\@tempcnta\@ne }{% \@tempcnta\maxdimen }% \ifnum \@tempb =\@tempcnta \ifodd\@tempcnta \if@twoside \reftextfaceafter \else \reftextafter \fi \else \reftextafter \fi \else \advance\@tempcnta-2 \ifnum \@tempb =\@tempcnta \ifodd\@tempcnta \reftextbefore \else \if@twoside \reftextfacebefore \else \reftextbefore \fi \fi \else \reftextfaraway{#3}% \fi \fi }{% \reftextfaraway{#3}% }% \fi {% \let\@currentlabel\@empty \expandafter\label\expandafter{\the\c@vrcnt @vr}% }% }% \DeclareRobustCommand\vnameref[1]{% \unskip~\nameref{#1}% \@vpageref[\unskip]{#1}% } \fi % % \end{macrocode} % % \Finale \endinput