summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/hyperref/nameref.dtx
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-11 23:54:03 +0000
committerKarl Berry <karl@freefriends.org>2006-01-11 23:54:03 +0000
commit6dc1c9960a84a72228cacdea73160739d0d7243a (patch)
tree78de0243faedc6a10a36731ca9bf341c94e391e6 /Master/texmf-dist/source/latex/hyperref/nameref.dtx
parente71364f18cbfb00305b86b52f2d0bb5f0d338f7e (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.dtx426
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