summaryrefslogtreecommitdiff
path: root/macros/plain/contrib/samples/referencer.tex
blob: 75ff793769369ed783516ada61ee8578bb69de27 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
%                       Version 2.1
%                         6/27/86
% Written by: B.A. Leland (XHEMIA:BAL)
%             Calif Inst of Technology
% Recognizes only ascending sequential footnote numbers, prints
%           everything else as read in the list
% Required defs:
%       dash : defined as $^{-}$
%       checkref#1 : to determine if the reference has yet been
%                    cited --- calls quickcnt
%       note#1 : initializes flags, counters, calls refext
%       refext#1 : does all the work, calls checkref, then prints
%                  the footnote numbers.  If newref=true write the
%                  reference to the output file with its footnote
%                  number, and redefine the def of the reference to
%                  equal the current footnote number.  If the
%                  references are anything but ascending sequential
%                  numbers, print the numbers separated by commas.
%       quickcnt#1 : based on Knuth's length macro (TeXbook, p.219)
%                    counts the no. of non-blank characters in the
%                    reference.  If > or = 4, set the newref flag to
%                    true.
% Required misc:
%       counters
%               ftnum: previous footnote number of a newly cited ref
%               prev: previous PRINTED footnote number
%       flags
%               dsh : true = enable dash printing for no. ranges
%               newref : true = a reference that has not been cited
%
%\immediate\openout1=reflist % open the ouput file 'reflist.tex'
%\newcount\ftnum   % footnote number counter
%\newcount\prev    % previous footnote number
%\newif\ifdsh      % dsh=true: enable "dash" printing for ranges of #s
%\def\dash{$^{-}$} % a dash for ranges of numbers
%---------------------------------------------------------------------
%\def\note#1{{
%\dshtrue  % toggle dsh flag to enable range printing
%\prev=0   % initialize prev counter
%\count0=0 % initialize cycle counter
%\refext#1\end}}  % call refext with list of references as argument
%---------------------------------------------------------------------
%\def\refext#1{
%\ifx#1\end   % \end is appended at end of reference list
%    \ifdsh   % dsh=true do nothing
%    \else $^{\number\prev}$\fi\let\next=\relax  % finish the range, quit
%\else\checkref#1      % see if the reference has been cited previously
%    \ifnewref\global\advance\ftnum by1 % new reference,
%                                       % inc ftnum counter
%        \immediate\write1{\noexpand\item{$^{\the\ftnum}$}#1}
%        \xdef#1{\the\ftnum} % write the reference to the output file,
%                            % and redefine the reference to be
%                            % the current footnote number
%    \fi
%    \ifnum\count0=0 $^{#1}$ % first cycle, print the first no.
%    \else \ifnum\prev=#1    % duplicate reference, ignore
%          \else\advance\prev by1 % increment the prev counter
%               \ifnum\prev=#1  % if true, sequence is sequential
%                  \ifdsh          % if dsh enabled,
%                      \dash       % print a dash for the range
%                      \dshfalse   % and disable the dsh flag
%                  \fi
%               \else\ifdsh $^{,\,#1}$  % if dsh enabled, print ", #"
%                    \else  % a dash was printed previously
%                        \advance\prev by-1 % restore prev counter
%                        $^{\number\prev ,\,#1}$ % finish the range, and
%                                    % print the new (non-sequential) no.
%                        \dshtrue  % toggle the dsh flag
%                    \fi
%               \fi
%          \fi
%    \fi
%    \prev=#1 % save current footnote number in prev counter
%    \advance\count0 by1  % increment cycle counter
%    \let\next=\refext    % recursive call
%\fi
%\next}
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%\newcount\qckcntr
%\newif\ifnewref   % newref=true: 1st occurance of a given reference
%---------------------------------------------------------------------
%\def\checkref#1{{
%\global\newreffalse % toggle the newref flag
%\qckcntr=0          % initialize cycle "register"
%\expandafter\quickcnt#1\end % expand the passed reference appending \end
%\relax}}
%---------------------------------------------------------------------
%\def\quickcnt#1{
%\ifx#1\end \let\next=\relax % relax and quit
%\else\advance\qckcntr by1   % increment cycle register
%     \ifnum\qckcntr<4       % <4 cycles means nothing, so do nothing
%     \else\global\newreftrue % >= 4 means the reference has not been
%                             % previously cited, toggle the newref flag
%     \fi
%     \let\next=\quickcnt % recursive call
%\fi
%\next}
%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
%________________________BEGIN__DEFS__________________________________
%
\immediate\openout1=reflist % open the ouput file 'reflist.tex'
\newcount\ftnum   % footnote number counter
\newcount\prev    % previous footnote number
\newif\ifdsh      % dsh=true: enable dash printing
\def\dash{$^{-}$}
\def\note#1{{\dshtrue \prev=0 \count0=0 \refext#1\end}}
\def\refext#1{\ifx#1\end
\ifdsh\else $^{\number\prev}$\fi\let\next=\relax
\else\checkref#1\ifnewref\global\advance\ftnum by1 \immediate
\write1{\noexpand\item{$^{\the\ftnum}$}#1}\xdef#1{\the\ftnum}\fi
\ifnum\count0=0 $^{#1}$\else \ifnum\prev=#1 \else
\advance\prev by1 \ifnum\prev=#1 \ifdsh \dash\dshfalse\fi\else
\ifdsh $^{,\,#1}$\else
\advance\prev by-1 $^{\number\prev ,\,#1}$\dshtrue \fi\fi\fi\fi
\prev=#1 \advance\count0 by1 \let\next=\refext\fi \next}
%
\newcount\qckcntr
\newif\ifnewref   % newref=true: 1st occurance of a given reference
\def\checkref#1{{\global\newreffalse\qckcntr=0
\expandafter\quickcnt#1\end \relax}}
\def\quickcnt#1{\ifx#1\end \let\next=\relax
\else\advance\qckcntr by1 \ifnum\qckcntr<4 \else\global\newreftrue\fi
\let\next=\quickcnt\fi \next}
%
%__________________________END__DEFS__________________________________
%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
%
%           S   A   M   P   L   E        U   S   A   G   E
%
% \def\a{this is reference a}
% \def\aaa{aaaaa}
% \def\b{this is reference b which has \reff }
% \def\c{this is reference c which has \reff }
% \def\d{this is reference d which has \reff }
% \def\e{this is reference e which has \reff }
% \def\g{this is reference e which has \reff }
% \def\reff{reference f}
%
% {\rm
% \ftnum=9
% This is the example\note{\a} of
% a\note{\b} paragraph
% which contains footnotes that will ultimately end up on
% a reference page.
% This is the
% second\note{\a} which
% is supposed to be the same as the first reference.
% If we continue, we\note{\c\b} should get another
% one\note{\d} and\note{\a} so\note{\e} on.
% If one needs to recall a couple of references\note{\aaa} one
% uses a the same macro\note{\a\b\c\d\e} as before.
% It is supposed to handle\note{\a\b\d\e} most any situation
% up to and almost including\note{\e\d\c\b\a} except
% this\note{\b\a\d\e} or this.\note{\a\b\c\d\d}  One
% must be cautioned that this has not been fully tested as yet..........
% \vskip0.5truein
% \immediate\closeout1
% \vfill\eject
% \baselineskip=14pt
% \parindent=0pt
% \parskip=0.1truein
% \input reflist.tex
% }
% \vfill\end
%