summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/oberdiek/refcount.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/oberdiek/refcount.dtx')
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/refcount.dtx963
1 files changed, 873 insertions, 90 deletions
diff --git a/Master/texmf-dist/source/latex/oberdiek/refcount.dtx b/Master/texmf-dist/source/latex/oberdiek/refcount.dtx
index 2240771f766..fe35c6b0df0 100644
--- a/Master/texmf-dist/source/latex/oberdiek/refcount.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/refcount.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1998, 2000, 2006, 2008 by
+% Copyright (C) 1998, 2000, 2006, 2008, 2010 by
% Heiko Oberdiek <heiko.oberdiek at googlemail.com>
%
% This work may be distributed and/or modified under the
@@ -19,7 +19,9 @@
%
% This work consists of the main source file refcount.dtx
% and the derived files
-% refcount.sty, refcount.pdf, refcount.ins, refcount.drv.
+% refcount.sty, refcount.pdf, refcount.ins, refcount.drv,
+% refcount-test1.tex, refcount-test2.tex, refcount-test3.tex,
+% refcount-test4.tex.
%
% Distribution:
% CTAN:macros/latex/contrib/oberdiek/refcount.dtx
@@ -54,6 +56,10 @@
% Installation:
% TDS:tex/latex/oberdiek/refcount.sty
% TDS:doc/latex/oberdiek/refcount.pdf
+% TDS:doc/latex/oberdiek/test/refcount-test1.tex
+% TDS:doc/latex/oberdiek/test/refcount-test2.tex
+% TDS:doc/latex/oberdiek/test/refcount-test3.tex
+% TDS:doc/latex/oberdiek/test/refcount-test4.tex
% TDS:source/latex/oberdiek/refcount.dtx
%
%<*ignore>
@@ -71,7 +77,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: refcount 2008/08/11 v3.1 Data extraction from references (HO)}
+\Msg{* Package: refcount 2010/12/01 v3.2 Data extraction from references (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -82,7 +88,7 @@
This is a generated file.
-Copyright (C) 1998, 2000, 2006, 2008 by
+Copyright (C) 1998, 2000, 2006, 2008, 2010 by
Heiko Oberdiek <heiko.oberdiek at googlemail.com>
This work may be distributed and/or modified under the
@@ -101,7 +107,9 @@ This Current Maintainer of this work is Heiko Oberdiek.
This work consists of the main source file refcount.dtx
and the derived files
- refcount.sty, refcount.pdf, refcount.ins, refcount.drv.
+ refcount.sty, refcount.pdf, refcount.ins, refcount.drv,
+ refcount-test1.tex, refcount-test2.tex, refcount-test3.tex,
+ refcount-test4.tex.
\endpreamble
\let\MetaPrefix\DoubleperCent
@@ -111,6 +119,11 @@ and the derived files
\file{refcount.drv}{\from{refcount.dtx}{driver}}%
\usedir{tex/latex/oberdiek}%
\file{refcount.sty}{\from{refcount.dtx}{package}}%
+ \usedir{doc/latex/oberdiek/test}%
+ \file{refcount-test1.tex}{\from{refcount.dtx}{test1}}%
+ \file{refcount-test2.tex}{\from{refcount.dtx}{test2}}%
+ \file{refcount-test3.tex}{\from{refcount.dtx}{test3}}%
+ \file{refcount-test4.tex}{\from{refcount.dtx}{test3,test4}}%
}
\catcode32=13\relax% active space
@@ -141,7 +154,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{refcount.drv}%
- [2008/08/11 v3.1 Data extraction from references (HO)]%
+ [2010/12/01 v3.2 Data extraction from references (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}[2008/08/11]
\begin{document}
@@ -150,7 +163,7 @@ and the derived files
%</driver>
% \fi
%
-% \CheckSum{198}
+% \CheckSum{1072}
%
% \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
@@ -171,7 +184,7 @@ and the derived files
% \GetFileInfo{refcount.drv}
%
% \title{The \xpackage{refcount} package}
-% \date{2008/08/11 v3.1}
+% \date{2010/12/01 v3.2}
% \author{Heiko Oberdiek\\\xemail{heiko.oberdiek at googlemail.com}}
%
% \maketitle
@@ -258,6 +271,10 @@ and the derived files
% \end{tabular}
% \end{quote}
%
+% Since version 3.2 the expandable macros described before
+% in this section
+% are expandable in exact two expansion steps.
+%
% \subsection{Undefined references}
%
% Because warnings and assignments cannot be used in
@@ -285,6 +302,20 @@ and the derived files
% \end{quote}
% outside the expanding context. Example, see above.
%
+% \subsubsection{Check for undefined references}
+%
+% In version 3.2 macros were added, that test, whether references
+% are defined.
+% \begin{declcs}{IfRefUndefinedExpandable} \M{refname} \M{then} \M{else}\\
+% \cs{IfRefUndefinedBabel} \M{refname} \M{then} \M{else}
+% \end{declcs}
+% If the reference is not available and therefore undefined, then
+% argument \meta{then} is executed, otherwise argument \meta{else}
+% is called. Macro \cs{IfRefUndefinedExpandable} is expandable,
+% but \meta{refname} must not contain babel shorthand characters.
+% Macro \cs{IfRefUndefinedBabel} supports shorthand characters of
+% babel, but it is not expandable.
+%
% \subsection{Notes}
%
% \begin{itemize}
@@ -308,41 +339,291 @@ and the derived files
%
% \begin{macrocode}
%<*package>
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{refcount}
- [2008/08/11 v3.1 Data extraction from references (HO)]%
-
-\def\setrefcountdefault#1{%
+% \end{macrocode}
+% Reload check, especially if the package is not used with \LaTeX.
+% \begin{macrocode}
+\begingroup\catcode61\catcode48\catcode32=10\relax%
+ \catcode13=5 % ^^M
+ \endlinechar=13 %
+ \catcode35=6 % #
+ \catcode39=12 % '
+ \catcode44=12 % ,
+ \catcode45=12 % -
+ \catcode46=12 % .
+ \catcode58=12 % :
+ \catcode64=11 % @
+ \catcode123=1 % {
+ \catcode125=2 % }
+ \expandafter\let\expandafter\x\csname ver@refcount.sty\endcsname
+ \ifx\x\relax % plain-TeX, first loading
+ \else
+ \def\empty{}%
+ \ifx\x\empty % LaTeX, first loading,
+ % variable is initialized, but \ProvidesPackage not yet seen
+ \else
+ \expandafter\ifx\csname PackageInfo\endcsname\relax
+ \def\x#1#2{%
+ \immediate\write-1{Package #1 Info: #2.}%
+ }%
+ \else
+ \def\x#1#2{\PackageInfo{#1}{#2, stopped}}%
+ \fi
+ \x{refcount}{The package is already loaded}%
+ \aftergroup\endinput
+ \fi
+ \fi
+\endgroup%
+% \end{macrocode}
+% Package identification:
+% \begin{macrocode}
+\begingroup\catcode61\catcode48\catcode32=10\relax%
+ \catcode13=5 % ^^M
+ \endlinechar=13 %
+ \catcode35=6 % #
+ \catcode39=12 % '
+ \catcode40=12 % (
+ \catcode41=12 % )
+ \catcode44=12 % ,
+ \catcode45=12 % -
+ \catcode46=12 % .
+ \catcode47=12 % /
+ \catcode58=12 % :
+ \catcode64=11 % @
+ \catcode91=12 % [
+ \catcode93=12 % ]
+ \catcode123=1 % {
+ \catcode125=2 % }
+ \expandafter\ifx\csname ProvidesPackage\endcsname\relax
+ \def\x#1#2#3[#4]{\endgroup
+ \immediate\write-1{Package: #3 #4}%
+ \xdef#1{#4}%
+ }%
+ \else
+ \def\x#1#2[#3]{\endgroup
+ #2[{#3}]%
+ \ifx#1\@undefined
+ \xdef#1{#3}%
+ \fi
+ \ifx#1\relax
+ \xdef#1{#3}%
+ \fi
+ }%
+ \fi
+\expandafter\x\csname ver@refcount.sty\endcsname
+\ProvidesPackage{refcount}%
+ [2010/12/01 v3.2 Data extraction from references (HO)]%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\begingroup\catcode61\catcode48\catcode32=10\relax%
+ \catcode13=5 % ^^M
+ \endlinechar=13 %
+ \catcode123=1 % {
+ \catcode125=2 % }
+ \catcode64=11 % @
+ \def\x{\endgroup
+ \expandafter\edef\csname rc@AtEnd\endcsname{%
+ \endlinechar=\the\endlinechar\relax
+ \catcode13=\the\catcode13\relax
+ \catcode32=\the\catcode32\relax
+ \catcode35=\the\catcode35\relax
+ \catcode61=\the\catcode61\relax
+ \catcode64=\the\catcode64\relax
+ \catcode123=\the\catcode123\relax
+ \catcode125=\the\catcode125\relax
+ }%
+ }%
+\x\catcode61\catcode48\catcode32=10\relax%
+\catcode13=5 % ^^M
+\endlinechar=13 %
+\catcode35=6 % #
+\catcode64=11 % @
+\catcode123=1 % {
+\catcode125=2 % }
+\def\TMP@EnsureCode#1#2{%
+ \edef\rc@AtEnd{%
+ \rc@AtEnd
+ \catcode#1=\the\catcode#1\relax
+ }%
+ \catcode#1=#2\relax
+}
+\TMP@EnsureCode{33}{12}% !
+\TMP@EnsureCode{39}{12}% '
+\TMP@EnsureCode{42}{12}% *
+\TMP@EnsureCode{45}{12}% -
+\TMP@EnsureCode{46}{12}% .
+\TMP@EnsureCode{47}{12}% /
+\TMP@EnsureCode{91}{12}% [
+\TMP@EnsureCode{93}{12}% ]
+\TMP@EnsureCode{96}{12}% `
+\edef\rc@AtEnd{\rc@AtEnd\noexpand\endinput}
+% \end{macrocode}
+%
+% \subsection{Loading packages}
+%
+% \begin{macrocode}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname RequirePackage\endcsname\relax
+ \input ltxcmds.sty\relax
+ \input infwarerr.sty\relax
+\else
+ \RequirePackage{ltxcmds}[2010/04/08]%
+ \RequirePackage{infwarerr}[2010/04/08]%
+\fi
+% \end{macrocode}
+%
+% \subsection{Defining commands}
+%
+% \begin{macro}{\rc@IfDefinable}
+% \begin{macrocode}
+\ltx@IfUndefined{@ifdefinable}{%
+ \def\rc@IfDefinable#1{%
+ \ifx#1\ltx@undefined
+ \expandafter\ltx@firstofone
+ \else
+ \ifx#1\relax
+ \expandafter\expandafter\expandafter\ltx@firstofone
+ \else
+ \@PackageError{refcount}{%
+ Command \string#1 is already defined.\MessageBreak
+ It will not redefined by this package%
+ }\@ehc
+ \expandafter\expandafter\expandafter\ltx@gobble
+ \fi
+ \fi
+ }%
+}{%
+ \let\rc@IfDefinable\@ifdefinable
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rc@RobustDefOne}
+% \begin{macrocode}
+\ltx@IfUndefined{protected}{%
+ \ltx@IfUndefined{DeclareRobustCommand}{%
+ \def\rc@RobustDefOne#1#2#3#4{%
+ \rc@IfDefinable#3{%
+ #1\def#3##1{#4}%
+ }%
+ }%
+ }{%
+ \def\rc@RobustDefOne#1#2#3#4{%
+ \rc@IfDefinable#3{%
+ \DeclareRobustCommand#2#3[1]{#4}%
+ }%
+ }%
+ }%
+}{%
+ \def\rc@RobustDefOne#1#2#3#4{%
+ \rc@IfDefinable#3{%
+ \protected#1\def#3##1{#4}%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rc@newcommand}
+% \begin{macrocode}
+\ltx@IfUndefined{newcommand}{%
+ \def\rc@newcommand*#1[#2]#3{% hash-ok
+ \rc@IfDefinable#1{%
+ \ifcase#2 %
+ \def#1{#3}%
+ \or
+ \def#1##1{#3}%
+ \or
+ \def#1##1##2{#3}%
+ \else
+ \rc@InternalError
+ \fi
+ }%
+ }%
+}{%
+ \let\rc@newcommand\newcommand
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{\cs{setrefcountdefault}}
+%
+% \begin{macro}{\setrefcountdefault}
+% \begin{macrocode}
+\rc@RobustDefOne\long{}\setrefcountdefault{%
\def\rc@default{#1}%
}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
\setrefcountdefault{0}
-
-% \def\@car#1#2\@nil{#1} % defined in LaTeX kernel
-\def\rc@cartwo#1#2#3\@nil{#2}
-
-% generic check without babel support
-\long\def\rc@refused#1{%
- \expandafter\ifx\csname r@#1\endcsname\relax
- \protect\G@refundefinedtrue
+% \end{macrocode}
+%
+% \subsection{\cs{refused}}
+%
+% \begin{macro}{\refused}
+% \begin{macrocode}
+\ltx@IfUndefined{G@refundefinedtrue}{%
+ \rc@RobustDefOne{}{*}\refused{%
+ \begingroup
+ \csname @safe@activestrue\endcsname
+ \ltx@IfUndefined{r@#1}{%
+ \protect\G@refundefinedtrue
+ \rc@WarningUndefined{#1}%
+ }{}%
+ \endgroup
+ }%
+}{%
+ \rc@RobustDefOne{}{*}\refused{%
+ \begingroup
+ \csname @safe@activestrue\endcsname
+ \ltx@IfUndefined{r@#1}{%
+ \csname protect\expandafter\endcsname
+ \csname G@refundefinedtrue\endcsname
+ \rc@WarningUndefined{#1}%
+ }{}%
+ \endgroup
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\rc@WarningUndefined}
+% \begin{macrocode}
+\ltx@IfUndefined{@latex@warning}{%
+ \def\rc@WarningUndefined#1{%
+ \ltx@ifundefined{thepage}{%
+ \def\thepage{\number\count0 }%
+ }{}%
+ \@PackageWarning{refcount}{%
+ Reference `#1' on page \thepage\space undefined%
+ }%
+ }%
+}{%
+ \def\rc@WarningUndefined#1{%
\@latex@warning{%
Reference `#1' on page \thepage\space undefined%
}%
- \fi
+ }%
}
-
-% user command, add babel support
-\newcommand*{\refused}[1]{%
- \begingroup
- \csname @safe@activestrue\endcsname
- \rc@refused{#1}{}%
- \endgroup
-}
-
-% Generic command for "\{set,addto}counter{page,}ref":
-% #1: \setcounter, \addtocounter
-% #2: \@car (for \ref), \@cartwo (for \pageref)
-% #3: LaTeX counter
-% #4: reference
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Setting counters by reference data}
+%
+% \subsubsection{Generic setting}
+%
+% \begin{macro}{\rc@set}
+% Generic command for
+% |\|$\{$|set|$,$|addto|$\}$|counter|$\{$|page|$,\}$|ref|:
+%\begin{quote}
+%\begin{tabular}[t]{@{}l@{: }l@{}}
+% |#1|& \cs{setcounter}, \cs{addtocounter}\\
+% |#2|& \cs{ltx@car} (for \cs{ref}), \cs{ltx@cartwo} (for \cs{pageref})\\
+% |#3|& \hologo{LaTeX} counter\\
+% |#4|& reference\\
+%\end{tabular}
+%\end{quote}
+% \begin{macrocode}
\def\rc@set#1#2#3#4{%
\begingroup
\csname @safe@activestrue\endcsname
@@ -350,10 +631,18 @@ and the derived files
\expandafter\rc@@set\csname r@#4\endcsname{#1}{#2}{#3}%
\endgroup
}
-% #1: \r@<...>
-% #2: \setcounter, \addtocounter
-% #3: \@car (for \ref), \@cartwo (for \pageref)
-% #4: LaTeX counter
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\rc@@set}
+%\begin{quote}
+%\begin{tabular}[t]{@{}l@{: }l@{}}
+% |#1|& \cs{r@<...>}\\
+% |#2|& \cs{setcounter}, \cs{addtocounter}\\
+% |#3|& \cs{ltx@car} (for \cs{ref}), \cs{ltx@cartwo} (for \cs{pageref})\\
+% |#4|& \hologo{LaTeX} counter\\
+%\end{tabular}
+%\end{quote}
+% \begin{macrocode}
\def\rc@@set#1#2#3#4{%
\ifx#1\relax
#2{#4}{\rc@default}%
@@ -363,81 +652,560 @@ and the derived files
}%
\fi
}
-
-% user commands:
-
-\newcommand*{\setcounterref}{\rc@set\setcounter\@car}
-\newcommand*{\addtocounterref}{\rc@set\addtocounter\@car}
-\newcommand*{\setcounterpageref}{\rc@set\setcounter\rc@cartwo}
-\newcommand*{\addtocounterpageref}{\rc@set\addtocounter\rc@cartwo}
-
-\newcommand*{\getrefnumber}[1]{%
- \expandafter\ifx\csname r@#1\endcsname\relax
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{User commands}
+%
+% \begin{macro}{\setcounterref}
+% \begin{macrocode}
+\rc@newcommand*{\setcounterref}[0]{%
+ \rc@set\setcounter\ltx@car
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\addtocounterref}
+% \begin{macrocode}
+\rc@newcommand*{\addtocounterref}[0]{%
+ \rc@set\addtocounter\ltx@car
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\setcounterpageref}
+% \begin{macrocode}
+\rc@newcommand*{\setcounterpageref}[0]{%
+ \rc@set\setcounter\ltx@cartwo
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\addtocounterpageref}
+% \begin{macrocode}
+\rc@newcommand*{\addtocounterpageref}[0]{%
+ \rc@set\addtocounter\ltx@cartwo
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Extracting references}
+%
+% \begin{macro}{\getrefnumber}
+% \begin{macrocode}
+\rc@newcommand*{\getrefnumber}[1]{%
+ \romannumeral
+ \ltx@ifundefined{r@#1}{%
+ \expandafter\ltx@zero
\rc@default
- \else
- \expandafter\expandafter\expandafter\@car
- \csname r@#1\endcsname\@nil
- \fi
+ }{%
+ \expandafter\expandafter\expandafter\rc@extract@
+ \expandafter\expandafter\expandafter!%
+ \csname r@#1\expandafter\endcsname
+ \expandafter{\rc@default}\@nil
+ }%
}
-\newcommand*{\getpagerefnumber}[1]{%
- \expandafter\ifx\csname r@#1\endcsname\relax
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\getpagerefnumber}
+% \begin{macrocode}
+\rc@newcommand*{\getpagerefnumber}[1]{%
+ \romannumeral
+ \ltx@ifundefined{r@#1}{%
+ \expandafter\ltx@zero
\rc@default
- \else
- \expandafter\expandafter\expandafter\rc@cartwo
- \csname r@#1\endcsname\rc@default\rc@default\@nil
- \fi
+ }{%
+ \expandafter\expandafter\expandafter\rc@extract@page
+ \expandafter\expandafter\expandafter!%
+ \csname r@#1\expandafter\expandafter\expandafter\endcsname
+ \expandafter\expandafter\expandafter{%
+ \expandafter\rc@default
+ \expandafter}\expandafter{\rc@default}\@nil
+ }%
}
-\newcommand*{\getrefbykeydefault}[2]{%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\getrefbykeydefault}
+% \begin{macrocode}
+\rc@newcommand*{\getrefbykeydefault}[2]{%
+ \romannumeral
\expandafter\rc@getrefbykeydefault
\csname r@#1\expandafter\endcsname
\csname rc@extract@#2\endcsname
}
-% #1: \r@<...>
-% #2: \rc@extract@<...>
-% #3: default
-\def\rc@getrefbykeydefault#1#2#3{%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\rc@getrefbykeydefault}
+%\begin{quote}
+%\begin{tabular}[t]{@{}l@{: }l@{}}
+% |#1|& \cs{r@<...>}\\
+% |#2|& \cs{rc@extract@<...>}\\
+% |#3|& default\\
+%\end{tabular}
+%\end{quote}
+% \begin{macrocode}
+\long\def\rc@getrefbykeydefault#1#2#3{%
\ifx#1\relax
% reference is undefined
- #3%
- \else
- \ifx#2\relax
- % extract method is missing
+ \ltx@ReturnAfterElseFi{%
+ \ltx@zero
#3%
- \else
- \expandafter\rc@generic#1{#3}{#3}{#3}{#3}{#3}\@nil#2{#3}%
- \fi
+ }%
+ \else
+ \ltx@ReturnAfterFi{%
+ \ifx#2\relax
+ % extract method is missing
+ \ltx@ReturnAfterElseFi{%
+ \ltx@zero
+ #3%
+ }%
+ \else
+ \ltx@ReturnAfterFi{%
+ \expandafter
+ \rc@generic#1{#3}{#3}{#3}{#3}{#3}\@nil#2{#3}%
+ }%
+ \fi
+ }%
\fi
}
-% #1: first item in \r@<...>
-% #2: remaining items in \r@<...>
-% #3: \rc@extract@<...>
-% #4: default
-\def\rc@generic#1#2\@nil#3#4{%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\rc@generic}
+%\begin{quote}
+%\begin{tabular}[t]{@{}l@{: }l@{}}
+% |#1|& first item in \cs{r@<...>}\\
+% |#2|& remaining items in \cs{r@<...>}\\
+% |#3|& \cs{rc@extract@<...>}\\
+% |#4|& default\\
+%\end{tabular}
+%\end{quote}
+% \begin{macrocode}
+\long\def\rc@generic#1#2\@nil#3#4{%
#3{#1\TR@TitleReference\@empty{#4}\@nil}{#1}#2\@nil
}
-\def\rc@extract@{%
- \expandafter\@car\@gobble
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\rc@extract@}
+% \begin{macrocode}
+\long\def\rc@extract@#1#2#3\@nil{%
+ \ltx@zero
+ #2%
}
-\def\rc@extract@page{%
- \expandafter\@car\@gobbletwo
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\rc@extract@page}
+% \begin{macrocode}
+\long\def\rc@extract@page#1#2#3#4\@nil{%
+ \ltx@zero
+ #3%
}
-\def\rc@extract@name{%
- \expandafter\@car\@gobblefour\@empty
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\rc@extract@name}
+% \begin{macrocode}
+\long\def\rc@extract@name#1#2#3#4#5\@nil{%
+ \ltx@zero
+ #4%
}
-\def\rc@extract@anchor{%
- \expandafter\@car\@gobblefour
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\rc@extract@anchor}
+% \begin{macrocode}
+\long\def\rc@extract@anchor#1#2#3#4#5#6\@nil{%
+ \ltx@zero
+ #5%
}
-\def\rc@extract@url{%
- \expandafter\expandafter\expandafter\@car\expandafter
- \@gobble\@gobblefour
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\rc@extract@url}
+% \begin{macrocode}
+\long\def\rc@extract@url#1#2#3#4#5#6#7\@nil{%
+ \ltx@zero
+ #6%
}
-\def\rc@extract@title#1#2\@nil{%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\rc@extract@title}
+% \begin{macrocode}
+\long\def\rc@extract@title#1#2\@nil{%
\rc@@extract@title#1%
}
-\def\rc@@extract@title#1\TR@TitleReference#2#3#4\@nil{#3}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\rc@@extract@title}
+% \begin{macrocode}
+\long\def\rc@@extract@title#1\TR@TitleReference#2#3#4\@nil{%
+ \ltx@zero
+ #3%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Macros for checking undefined references}
+%
+% \begin{macro}{\IfRefUndefinedExpandable}
+% \begin{macrocode}
+\rc@newcommand*{\IfRefUndefinedExpandable}[1]{%
+ \ltx@ifundefined{r@#1}\ltx@firstoftwo\ltx@secondoftwo
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IfRefUndefinedBabel}
+% \begin{macrocode}
+\rc@RobustDefOne{}*\IfRefUndefinedBabel{%
+ \begingroup
+ \csname safe@actives@true\endcsname
+ \expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname r@#1\endcsname\relax
+ \expandafter\ltx@firstoftwo
+ \else
+ \expandafter\ltx@secondoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\rc@AtEnd%
%</package>
% \end{macrocode}
%
+% \section{Test}
+%
+% \subsection{Catcode checks for loading}
+%
+% \begin{macrocode}
+%<*test1>
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\{=1 %
+\catcode`\}=2 %
+\catcode`\#=6 %
+\catcode`\@=11 %
+\expandafter\ifx\csname count@\endcsname\relax
+ \countdef\count@=255 %
+\fi
+\expandafter\ifx\csname @gobble\endcsname\relax
+ \long\def\@gobble#1{}%
+\fi
+\expandafter\ifx\csname @firstofone\endcsname\relax
+ \long\def\@firstofone#1{#1}%
+\fi
+\expandafter\ifx\csname loop\endcsname\relax
+ \expandafter\@firstofone
+\else
+ \expandafter\@gobble
+\fi
+{%
+ \def\loop#1\repeat{%
+ \def\body{#1}%
+ \iterate
+ }%
+ \def\iterate{%
+ \body
+ \let\next\iterate
+ \else
+ \let\next\relax
+ \fi
+ \next
+ }%
+ \let\repeat=\fi
+}%
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@ 1 %
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@ 1 %
+ \repeat
+}
+\def\RangeCatcodeCheck#1#2#3{%
+ \count@=#1\relax
+ \loop
+ \ifnum#3=\catcode\count@
+ \else
+ \errmessage{%
+ Character \the\count@\space
+ with wrong catcode \the\catcode\count@\space
+ instead of \number#3%
+ }%
+ \fi
+ \ifnum\count@<#2\relax
+ \advance\count@ 1 %
+ \repeat
+}
+\def\space{ }
+\expandafter\ifx\csname LoadCommand\endcsname\relax
+ \def\LoadCommand{\input refcount.sty\relax}%
+\fi
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\%=14 %
+ \LoadCommand
+ \RangeCatcodeCheck{0}{36}{15}%
+ \RangeCatcodeCheck{37}{37}{14}%
+ \RangeCatcodeCheck{38}{47}{15}%
+ \RangeCatcodeCheck{48}{57}{12}%
+ \RangeCatcodeCheck{58}{63}{15}%
+ \RangeCatcodeCheck{64}{64}{12}%
+ \RangeCatcodeCheck{65}{90}{11}%
+ \RangeCatcodeCheck{91}{91}{15}%
+ \RangeCatcodeCheck{92}{92}{0}%
+ \RangeCatcodeCheck{93}{96}{15}%
+ \RangeCatcodeCheck{97}{122}{11}%
+ \RangeCatcodeCheck{123}{255}{15}%
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
+% \end{macrocode}
+%
+% \subsection{Macro tests}
+%
+% \begin{macrocode}
+%<*test2>
+\errorcontextlines=10000 %
+\showboxbreadth=10000 %
+\showboxdepth=10000 %
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname RequirePackage\endcsname\relax
+ \input refcount.sty\relax
+\else
+ \RequirePackage{refcount}[2010/12/01]%
+\fi
+\catcode`\@=11 %
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname @onelevel@sanitize\endcsname\relax
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname detokenize\endcsname\relax
+ \def\strip@prefix#1->{}%
+ \def\@onelevel@sanitize#1{%
+ \edef#1{%
+ \expandafter\strip@prefix\meaning#1%
+ }%
+ }%
+ \else
+ \def\@onelevel@sanitize#1{%
+ \edef#1{%
+ \detokenize\expandafter{#1}%
+ }%
+ }%
+ \fi
+\fi
+\def\msg#{\immediate\write16}
+\def\empty{}
+\def\space{ }
+% \end{macrocode}
+% \begin{macrocode}
+\def\r@foo{{\empty 1}{\empty 2}}
+\long\def\test#1#2{%
+ \begingroup
+ \setbox0=\hbox{%
+ \def\TestTask{#1}%
+ \@onelevel@sanitize\TestTask
+ \msg{* \TestTask}%
+ \expandafter\expandafter\expandafter\def
+ \expandafter\expandafter\expandafter\TestResult
+ \expandafter\expandafter\expandafter{%
+ #1%
+ }%
+ \def\TestExpected{#2}%
+ \ifx\TestResult\TestExpected
+ \msg{ \space ok.}%
+ \else
+ \@onelevel@sanitize\TestResult
+ \@onelevel@sanitize\TestExpected
+ \msg{ \space Result: \space\space[\TestResult]}%
+ \msg{ \space Expected: [\TestExpected]}%
+ \errmessage{Test failed!}%
+ \fi
+ }%
+ \ifdim\wd0=0pt %
+ \else
+ \showbox0 %
+ \fi
+ \endgroup
+}
+\test{\getrefnumber{foo}}{\empty 1}
+\test{\getpagerefnumber{foo}}{\empty 2}
+\test{\getrefbykeydefault{foo}{}{\empty default}}{\empty 1}
+\test{\getrefbykeydefault{foo}{page}{\empty default}}{\empty 2}
+\test{\getrefbykeydefault{foo}{name}{\empty default}}{\empty default}
+\test{\getrefbykeydefault{foo}{anchor}{\empty default}}{\empty default}
+\test{\getrefbykeydefault{foo}{url}{\empty default}}{\empty default}
+\test{\getrefbykeydefault{foo}{title}{\empty default}}{\empty default}
+\msg{}
+\def\r@foo{{}{}{}{}{}{}{}{}{}{}}
+\def\Test#1#2\\{%
+ \test{#1{foo}#2}{}%
+}
+\def\TestGroup{%
+ \Test\getrefnumber\\%
+ \Test\getpagerefnumber\\%
+ \Test\getrefbykeydefault{}{}\\%
+ \Test\getrefbykeydefault{page}{}\\%
+ \Test\getrefbykeydefault{anchor}{}\\%
+ \Test\getrefbykeydefault{name}{}\\%
+ \Test\getrefbykeydefault{url}{}\\%
+}
+\TestGroup
+\Test\getrefbykeydefault{title}{}\\%
+\msg{}
+\def\r@foo{\par\par\par\par\par\par\par\par}
+\long\def\Test#1#2\\{%
+ \test{#1{foo}#2}{\par}%
+}
+\TestGroup
+\test{\getrefbykeydefault{title}{}{}}{}
+\msg{}
+\def\r@foo{{ }{ }{ }{ }{ }}
+\def\Test#1#2\\{%
+ \test{#1{foo}#2}{ }%
+}
+\TestGroup
+\msg{}
+\long\def\TestDefault#1{%
+ \begingroup
+ \setrefcountdefault{#1}%
+ \test{\getrefnumber{foo}}{#1}%
+ \test{\getpagerefnumber{foo}}{#1}%
+ \endgroup
+}
+\def\TestDefaultX{%
+ \TestDefault{}%
+ \TestDefault{\par}%
+ \TestDefault{ }%
+ \TestDefault{\space}%
+}
+\let\r@foo\@undefined
+\TestDefaultX
+\let\r@foo\relax
+\TestDefaultX
+\def\r@foo{}
+\TestDefaultX
+% \end{macrocode}
+% \begin{macrocode}
+\msg{}
+\long\def\Test#1#2#3#4{%
+ \begingroup
+ \def\TestTask{#1}%
+ \@onelevel@sanitize\TestTask
+ \msg{* [\TestTask]}%
+ \edef\TestResultA{\IfRefUndefinedExpandable{#1}{#2}{#3}}%
+ \IfRefUndefinedBabel{#1}{%
+ \def\TestResultB{#2}%
+ }{%
+ \def\TestResultB{#3}%
+ }%
+ \def\TestExpected{#4}%
+ \ifx\TestResultA\TestExpected
+ \msg{ \space ok.}%
+ \else
+ \begingroup
+ \@onelevel@sanitize\TestResultA
+ \@onelevel@sanitize\TestExpected
+ \msg{ \space Result: \space\space[\TestResultA]}%
+ \msg{ \space Expected: [\TestExpected]}%
+ \errmessage{Test failed!}%
+ \endgroup
+ \fi
+ \ifx\TestResultB\TestExpected
+ \msg{ \space ok.}%
+ \else
+ \begingroup
+ \@onelevel@sanitize\TestResultB
+ \@onelevel@sanitize\TestExpected
+ \msg{ \space Result: \space\space[\TestResultB]}%
+ \msg{ \space Expected: [\TestExpected]}%
+ \errmessage{Test failed!}%
+ \endgroup
+ \fi
+ \endgroup
+}
+\begingroup
+ \def\r@foo{{}{}}%
+ \let\r@bar\@undefined
+ \let\r@xyz\relax
+ \Test{foo}{true}{false}{false}%
+ \Test{bar}{true}{false}{true}%
+ \Test{xyz}{true}{false}{true}%
+\endgroup
+% \end{macrocode}
+% \begin{macrocode}
+\csname @@end\endcsname\end
+%</test2>
+% \end{macrocode}
+% \subsection{Test with package \xpackage{titleref}}
+%
+% \begin{macrocode}
+%<*test3>
+\NeedsTeXFormat{LaTeX2e}
+\documentclass{article}
+\usepackage{refcount}[2010/12/01]
+%<test4>\usepackage{nameref}
+\usepackage{titleref}
+\begin{document}
+\section{Hello World}
+\label{sec:hello}
+\section{\hbox{xy}}
+\label{sec:foo}
+%
+\makeatletter
+\@ifundefined{r@sec:hello}{%
+ \typeout{==> Compile twice!}%
+}{%
+ \def\test#1#2{%
+ \begingroup
+ \def\TestTask{#1}%
+ \@onelevel@sanitize\TestTask
+ \typeout{* \TestTask}%
+ \expandafter\expandafter\expandafter\def
+ \expandafter\expandafter\expandafter\TestResult
+ \expandafter\expandafter\expandafter{%
+ #1%
+ }%
+ \def\TestExpected{#2}%
+ \ifx\TestResult\TestExpected
+ \typeout{ \space ok.}%
+ \else
+ \@onelevel@sanitize\TestResult
+ \@onelevel@sanitize\TestExpected
+ \typeout{ \space Result: \space\space[\TestResult]}%
+ \typeout{ \space Expected: [\TestExpected]}%
+ \errmessage{Test failed!}%
+ \fi
+ \endgroup
+ }%
+ \test{\getrefbykeydefault{sec:hello}{title}{}}{Hello World}%
+ \test{\getrefbykeydefault{sec:foo}{title}{}}{\hbox{xy}}%
+ \begingroup
+ \def\hbox#1{[#1]}% hash-ok
+ \test{\getrefbykeydefault{sec:foo}{title}{}}{\hbox{xy}}%
+ \endgroup
+}
+\makeatother
+% \end{macrocode}
+% \begin{macrocode}
+\end{document}
+%</test3>
+% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
@@ -499,6 +1267,10 @@ and the derived files
% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
% refcount.sty & tex/latex/oberdiek/refcount.sty\\
% refcount.pdf & doc/latex/oberdiek/refcount.pdf\\
+% test/refcount-test1.tex & doc/latex/oberdiek/test/refcount-test1.tex\\
+% test/refcount-test2.tex & doc/latex/oberdiek/test/refcount-test2.tex\\
+% test/refcount-test3.tex & doc/latex/oberdiek/test/refcount-test3.tex\\
+% test/refcount-test4.tex & doc/latex/oberdiek/test/refcount-test4.tex\\
% refcount.dtx & source/latex/oberdiek/refcount.dtx\\
% \end{tabular}^^A
% }^^A
@@ -649,6 +1421,17 @@ and the derived files
% \item
% URLs updated.
% \end{Version}
+% \begin{Version}{2010/12/01 v3.2}
+% \item
+% \cs{IfRefUndefinedExpandable} and \cs{IfRefUndefinedBabel} added.
+% \item
+% \cs{getrefnumber}, \cs{getpagerefnumber}, \cs{getrefbykeydefault}
+% are expandable in exact two expansion steps.
+% \item
+% Non-expandable macros are made robust.
+% \item
+% Test files added.
+% \end{Version}
% \end{History}
%
% \PrintIndex