source: trunk/admin/smartref.sty@ 810

Last change on this file since 810 was 641, checked in by phi196, 20 years ago

Latex style file needed

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.4 KB
Line 
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
24reference 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
Note: See TracBrowser for help on using the repository browser.