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 |
---|