source: trunk/admin/smartref.sty

Last change on this file was 641, checked in by phi196, 19 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.