diff options
author | Karl Berry <karl@freefriends.org> | 2006-01-11 23:54:03 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-01-11 23:54:03 +0000 |
commit | 6dc1c9960a84a72228cacdea73160739d0d7243a (patch) | |
tree | 78de0243faedc6a10a36731ca9bf341c94e391e6 /Master/texmf-dist/source/latex/hyperref/nameref.dtx | |
parent | e71364f18cbfb00305b86b52f2d0bb5f0d338f7e (diff) |
trunk/Master/texmf-dist/source/latex/hyperref
git-svn-id: svn://tug.org/texlive/trunk@327 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/hyperref/nameref.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/hyperref/nameref.dtx | 426 |
1 files changed, 426 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/hyperref/nameref.dtx b/Master/texmf-dist/source/latex/hyperref/nameref.dtx new file mode 100644 index 00000000000..e2c7445b00f --- /dev/null +++ b/Master/texmf-dist/source/latex/hyperref/nameref.dtx @@ -0,0 +1,426 @@ +\def\filedate{2003/12/03} +\def\fileversion{2.21} +% +% \iffalse +% File: nameref.dtx +% Copyright (C) 1995-9 Sebastian Rahtz +% 2000-3 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} +%</driver> +% \fi +% \CheckSum{463} +% \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} +% +% Compatibility for package titlesec. +% \begin{macrocode} +\AtBeginDocument{% + \@ifpackageloaded{titlesec}{% + \let\NRorg@ttl@sect@i\ttl@sect@i + \def\ttl@sect@i#1#2[#3]#4{% + \def\@currentlabelname{#4}% + \NRorg@ttl@sect@i{#1}{#2}[{#3}]{#4}% + }% + }{}% +} +% \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 +% \end{macrocode} +% Package |hyperref| uses its own definitions of |\ref| and +% |\pageref| because it extends the syntax by the star form. +% |\DeclareRobustCommand| is used by hyperref. +% Package |nameref| can be loaded before, after hyperref or after +% hyperref's definitions in |\AtBeginDocument|. +% \begin{macrocode} +\@ifpackageloaded{hyperref}{% +}{% + \DeclareRobustCommand{\ref}{\T@ref}% + \DeclareRobustCommand{\pageref}{\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 +%</package> +% \end{macrocode} +% +% \Finale +\endinput |