1 | \def\fileversion{v1.9}
|
---|
2 | \def\filedate{2002/02/28}
|
---|
3 | % smartref.sty
|
---|
4 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
---|
5 | %
|
---|
6 | % Giuseppe Bilotta
|
---|
7 | %
|
---|
8 | % Phone +39 095 338103
|
---|
9 | %
|
---|
10 | % Email: bourbaki@bigfoot.com
|
---|
11 | %
|
---|
12 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
---|
13 | %
|
---|
14 | % This package is distributed under the terms
|
---|
15 | % of the LaTeX Project Public License
|
---|
16 | %
|
---|
17 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
---|
18 | %
|
---|
19 | % Please read the readme.txt file for details
|
---|
20 | %
|
---|
21 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
---|
22 | \NeedsTeXFormat{LaTeX2e}
|
---|
23 | \ProvidesPackage{smartref}[\filedate\space\fileversion\space Increase
|
---|
24 | reference capability (deep reference)]
|
---|
25 | %
|
---|
26 | \newcounter{@smartlistlen}
|
---|
27 | \newcounter{less@smartlist}
|
---|
28 | \setcounter{less@smartlist}{-2}
|
---|
29 | \newcommand*{\@increasesmartlist}{%
|
---|
30 | \addtocounter{@smartlistlen}{1}%
|
---|
31 | \addtocounter{less@smartlist}{1}}
|
---|
32 | \def\sm@rtreflist{{\@currentlabel}}
|
---|
33 | \@increasesmartlist
|
---|
34 | %
|
---|
35 | \newcommand*{\@getsmartreflist}[3]{%
|
---|
36 | \ifx#1%
|
---|
37 | \relax\protect\G@refundefinedtrue%
|
---|
38 | \@latex@warning {SmartReference `#2' on page %
|
---|
39 | \thepage \space undefined}%
|
---|
40 | \nfss@text{\reset@font \bfseries ??}%
|
---|
41 | \else%
|
---|
42 | \expandafter #2#1%
|
---|
43 | \fi}
|
---|
44 | \newcounter{@currsmartlistplace}
|
---|
45 | \newcommand*{\@getsmartref}[3]{%Paramaters are: #1: Where #2: Label, #3: place in list
|
---|
46 | \edef\@smartlistplace{#3}%
|
---|
47 | \setcounter{@currsmartlistplace}{0}%
|
---|
48 | \edef\@originalsmartlist{%
|
---|
49 | \expandafter\@getsmartreflist\csname sr@#2\endcsname{}{}}%
|
---|
50 | \edef\@currsmartlist{\@originalsmartlist}%
|
---|
51 | \loop%
|
---|
52 | \edef\@currsmartvalue{\expandafter\@car\@currsmartlist\@nil}%
|
---|
53 | \ifnum\the@currsmartlistplace=\theless@smartlist
|
---|
54 | \edef\@currsmartlist{\noexpand{\expandafter\@cdr\@currsmartlist\@nil\noexpand}}%
|
---|
55 | \else
|
---|
56 | \edef\@currsmartlist{\expandafter\@cdr\@currsmartlist\@nil}%
|
---|
57 | \fi
|
---|
58 | \ifnum\the@currsmartlistplace<\@smartlistplace%
|
---|
59 | \addtocounter{@currsmartlistplace}{1}%
|
---|
60 | \repeat
|
---|
61 | \edef#1{\@currsmartvalue}%
|
---|
62 | % \typeout{Got Smart Reference (place #3, value \@currsmartvalue)}%
|
---|
63 | }
|
---|
64 | % Hack label: also write the SmartRef data ...
|
---|
65 | \def\newsmartlabel{\@newl@bel {sr}}
|
---|
66 | %save previous \label
|
---|
67 | \AtBeginDocument{%
|
---|
68 | \let\sr@ldlabel=\label
|
---|
69 | \renewcommand*{\label}[1]{%
|
---|
70 | \sr@ldlabel{#1}%
|
---|
71 | \@bsphack%
|
---|
72 | \protected@write\@auxout{}%
|
---|
73 | {\string\newsmartlabel{#1}{\sm@rtreflist}}%
|
---|
74 | \@esphack}%
|
---|
75 | % This one is needed for those who use AMS-LaTeX, to ensure that
|
---|
76 | % smartref labelling system is used wih equations too (AMS-LaTeX
|
---|
77 | % uses its own labeling system for equations
|
---|
78 | \let\ltx@label=\label}
|
---|
79 | % Command to add new items to reflist:
|
---|
80 | %
|
---|
81 | \newtoks\sm@rtintern@ltok
|
---|
82 | \newcommand*{\addtoreflist}[1]{% Add item ...
|
---|
83 | \@ifundefined{c@#1}% Check if real counter;
|
---|
84 | {\@nocounterr{#1}}% If not, give error
|
---|
85 | {\@ifundefined{#1posinlist}{% If yes, check if already defined:
|
---|
86 | \sm@rtintern@ltok=\expandafter{\sm@rtreflist}% If not, define everything ...
|
---|
87 | \expandafter\edef\csname sm@rtreflist\endcsname{%
|
---|
88 | \the\sm@rtintern@ltok{\noexpand\csname the#1\endcsname}}% Add it ...
|
---|
89 | % Set position of counter in list:
|
---|
90 | \expandafter\edef\csname #1posinlist\endcsname{\the@smartlistlen}%
|
---|
91 | \@increasesmartlist%
|
---|
92 | % Define SmartCommands:
|
---|
93 | % Define command to get number of <name> for <label>; parameters:
|
---|
94 | % #1 is where the value goes, #2 is label name.
|
---|
95 | \typeout{Defining \csname sget#1val\endcsname ...}
|
---|
96 | % `smart get <name> value'
|
---|
97 | % Usage \sgetchapternum{\holder}{labelname}
|
---|
98 | \expandafter\def\csname sget#1val\endcsname##1##2{%
|
---|
99 | \@ifundefined{sr@##2}{%
|
---|
100 | \G@refundefinedtrue%
|
---|
101 | \@latex@warning{SmartReference `##2' on page \thepage \space undefined}%
|
---|
102 | \def##1{0}}%
|
---|
103 | {\expandafter\@getsmartref{##1}{##2}{\csname #1posinlist\endcsname}}%
|
---|
104 | }%
|
---|
105 | % Define command to check if number of <name> for <label> is different from current
|
---|
106 | % <name> value; parameters:
|
---|
107 | % #1 is label name.
|
---|
108 | \typeout{Defining \csname s#1ref\endcsname ...}
|
---|
109 | % `smart <name> \ref'
|
---|
110 | % Usage \schapterref{labelname}
|
---|
111 | % TODOs:
|
---|
112 | % - check for counters that get reset.
|
---|
113 | \expandafter\newif\csname if#1changed\endcsname % define if consctruct
|
---|
114 | \expandafter\def\csname is#1changed\endcsname##1{% checker for change
|
---|
115 | \csname sget#1val\endcsname{\sm@rtrefvalue}{##1}%
|
---|
116 | \edef\@currentrefvalue{\csname the#1\endcsname}%
|
---|
117 | \ifx\sm@rtrefvalue\@currentrefvalue%
|
---|
118 | \csname #1changedfalse\endcsname%
|
---|
119 | \else%
|
---|
120 | \csname #1changedtrue\endcsname%
|
---|
121 | \fi}%
|
---|
122 | \expandafter\def\csname s#1ref\endcsname##1{%
|
---|
123 | \csname is#1changed\endcsname{##1}%
|
---|
124 | \csname if#1changed\endcsname%
|
---|
125 | , \csname short#1name\endcsname~\csname #1ref\endcsname{##1}%
|
---|
126 | % , \csname short#1name\endcsname~\sm@rtrefvalue%
|
---|
127 | \else%
|
---|
128 | \relax%
|
---|
129 | \fi%
|
---|
130 | }%
|
---|
131 | % Define shorthand for \ref{labelname}\s<name>ref{labelname}; parameters:
|
---|
132 | % #1 is label name.
|
---|
133 | \typeout{Defining \csname sref#1ref\endcsname ...}
|
---|
134 | % Usage \srefchapterref{labelname}
|
---|
135 | % If HyperRef is used, let it use no-link refs
|
---|
136 | % TODO: define starred and unstarred version; maybe the same for the next.
|
---|
137 | \@ifpackageloaded{hyperref}{%
|
---|
138 | \expandafter\def\csname sref#1ref\endcsname##1{%
|
---|
139 | \@refstar{##1}\csname s#1ref\endcsname{##1}%
|
---|
140 | }
|
---|
141 | }{
|
---|
142 | \expandafter\def\csname sref#1ref\endcsname##1{%
|
---|
143 | \ref{##1}\csname s#1ref\endcsname{##1}%
|
---|
144 | }%
|
---|
145 | }%
|
---|
146 | % Define equivalent of \pageref; parameters:
|
---|
147 | % #1 is label name.
|
---|
148 | \typeout{Defining \csname #1ref\endcsname ...}
|
---|
149 | % Usage \chapterref{labelname}
|
---|
150 | \expandafter\def\csname #1ref\endcsname##1{%
|
---|
151 | \csname sget#1val\endcsname{\sm@rtrefv@lue}{##1}%
|
---|
152 | \sm@rtrefv@lue%
|
---|
153 | }%
|
---|
154 | }{}%
|
---|
155 | }%
|
---|
156 | }
|
---|
157 | %
|
---|
158 | \DeclareOption{page}{%
|
---|
159 | \AtBeginDocument{%
|
---|
160 | \addtoreflist{page}%
|
---|
161 | \providecommand*\shortpagename{pag.}%
|
---|
162 | }}
|
---|
163 | \DeclareOption{chapter}{%
|
---|
164 | \AtBeginDocument{%
|
---|
165 | \addtoreflist{chapter}%
|
---|
166 | \@ifundefined{smartref}{%
|
---|
167 | \newcommand*{\smartref}[1]{%
|
---|
168 | \srefchapterref{#1}%
|
---|
169 | }%
|
---|
170 | }{%
|
---|
171 | \let\nochapter@smartref=\smartref%
|
---|
172 | \renewcommand*{\smartref}[1]{%
|
---|
173 | \nochapter@smartref{#1}\schapterref{#1}}%
|
---|
174 | }
|
---|
175 | %\DeclareRobustCommand{\smartref}%
|
---|
176 | \@ifpackagewith{babel}{italian}{%
|
---|
177 | \providecommand*\shortchaptername{Cap.}}{%
|
---|
178 | \providecommand*\shortchaptername{Chap.}}
|
---|
179 | \typeout{Short chapter name defined: \shortchaptername}%
|
---|
180 | }}
|
---|
181 | \DeclareOption{part}{%
|
---|
182 | \AtBeginDocument{%
|
---|
183 | \addtoreflist{part}%
|
---|
184 | \@ifundefined{smartref}{%
|
---|
185 | \newcommand*{\smartref}[1]{%
|
---|
186 | \srefpartref{#1}%
|
---|
187 | }%
|
---|
188 | }{%
|
---|
189 | \let\nopart@smartref=\smartref%
|
---|
190 | \renewcommand*{\smartref}[1]{%
|
---|
191 | \nopart@smartref{#1}\spartref{#1}}%
|
---|
192 | }
|
---|
193 | %\DeclareRobustCommand{\smartref}%
|
---|
194 | \@ifpackagewith{babel}{italian}{%
|
---|
195 | \providecommand*\shortpartname{Parte}}{%
|
---|
196 | \providecommand*\shortpartname{Part}}%
|
---|
197 | \typeout{Short part name defined: \shortpartname}%
|
---|
198 | }}
|
---|
199 | \DeclareOption*{%
|
---|
200 | \PackageWarning{smartref}%
|
---|
201 | {Option `\CurrentOption' unknown!\MessageBreak%
|
---|
202 | Adding `\CurrentOption' as a reflevel}%
|
---|
203 | \expandafter\addtoreflist\expandafter{\CurrentOption}
|
---|
204 | }
|
---|
205 | \DeclareOption{byname}{\AtEndOfPackage{\usepackage{byname}}}
|
---|
206 | \ProcessOptions\relax
|
---|
207 | \endinput
|
---|