summaryrefslogtreecommitdiff
path: root/macros/generic/labtex/labtex.tex
blob: 099e477b000262ba0f1c57b7cb69c5ad4b9ec272 (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
% This is labtex, v 0.9.

% written by:	Alan Hoenig, summer 1991-summer 1992.
%		Bitnet: ajhjj@cunyvm
%		Mail: 17 Bay Avenue, Huntington, NY 11743, USA
%

% You need the file LABTEX.MF in addition to this one.  

% If you've got this far, you have created a special figure font.  Let's 
% pretend it's called figfont.  At the start of your TeX document, 
% include the lines
% 	\input labtex
% 	\font\labtex=figfont
% and wherever you wnat to include a figure enter
% 	\fig$
% 	<label list>
% 	\endfig
% where $ represents the numeric position in the font occupied by your 
% figure.  Each item in the list is one of the pointing commands defined 
% below coupled with the text of the label (eg. \blpoint{$(x,y)$}).
% It's that simple.
% 

\newif\ifdebug
\debugfalse
\newcount\labels 
{\catcode`.=12 \catcode`p=12 \catcode`t=12
 \gdef\\#1.#2pt{\global\labels=#1 
 }}\let\glpf=\\

\def\getx#1{\setbox2=\hbox{\labtex\char0 \char#1}%
 \setbox0=\hbox{\labtex\char0{}\char#1}%
 \dimen0=\wd2 \advance\dimen0 by-\wd0
}
\def\gety#1{\setbox2=\hbox{\labtex\char1 \char#1}%
 \setbox0=\hbox{\labtex\char1{}\char#1}%
 \dimen0=\wd2 \advance\dimen0 by-\wd0
}
\def\getlpf#1{\setbox2=\hbox{\labtex\char2 \char#1}%
 \setbox0=\hbox{\labtex\char2{}\char#1}%
 \dimen0=\wd2 \advance\dimen0 by-\wd0
}

\newbox\figbox % to hold figure for printing
\newcount\coordcount \newcount\figcount
\newdimen\x \newdimen\y 
\newdimen\figwd \newdimen\fight \newdimen\figdp
\def\fig#1{% usage: \fig2, where 2 is the figure number
 \figcount=#1%
 \setbox\figbox=\hbox{\labtex \char\figcount }%
 \global\figwd=\wd\figbox \global\fight=\ht\figbox
 \global\figdp=\dp\figbox \zerobox\figbox%
 \setXYpointers{#1}% ensures \coordcount's value is the char whose kern
  % is \x; same for \y
 \hbox\bgroup\box\figbox % now add \point'ing commands and labels
 \vrule width0pt height\fight depth\figdp
}
\def\endfig{\kern\figwd\egroup}

\def\zerobox#1{\wd#1=0pt \ht#1=0pt \dp#1=0pt}

\newcount\scratch \newcount\totallabs
\def\setXYpointers#1{\scratch=0 \totallabs=0%
 \coordcount=0 % start with fresh slate
 \loop\ifnum\scratch<#1%
  \getlpf\scratch \expandafter\glpf\the\dimen0 
  \advance\totallabs by\labels
  \advance\scratch by 1 \repeat
 \coordcount=\totallabs 
}

\newdimen\extradx \newdimen\extrady \newtoks\everylabel
\newbox\labelbox \newdimen\totalht
\newdimen\labelht \newdimen\labelwd \newdimen\labeldp
\newdimen\vertadjust \newdimen\horadjust% vertical adjustment of labels
\def\getparameters#1{% #1 is text of label
 \global\vertadjust=0pt \global\horadjust=0pt 
 \setbox\labelbox=\hbox{\the\everylabel #1}%
 \labelht=\ht\labelbox \labeldp=\dp\labelbox 
 \advance\labelht by\extrady \advance\labeldp by\extrady
 \totalht=\labelht \advance\totalht by\labeldp
 \setbox\labelbox=\hbox{\the\everylabel 
  \vrule width0pt height\labelht depth\labeldp
  \hskip\extradx #1\hskip\extradx}\labelwd=\wd\labelbox %
 \ifdebug \showthe\coordcount \fi 
 \getx\coordcount \x=\dimen0 \advance\x by\horadjust
 \ifdebug \showthe\dimen0 \fi % \x before \horadjust
 \gety\coordcount \y=\dimen0 \advance\y by\vertadjust
 \ifdebug \showthe\dimen0 \fi % \y before \vertadjust
 \ifdebug \showthe\x \showthe\y \fi % after adjustments
 \advance\coordcount by1 
}
\def\down{\global\vertadjust= -}
\def\up{\global\vertadjust= }
\def\left{\global\horadjust= -}
\def\right{\global\horadjust= }

\def\reset{% puts ref pt of \labelbox at lower left, not at baseline
 \advance\y by \labeldp}

\def\point#1{\getparameters{#1}% point to left end of Baseline
 \rlap{\kern\x \raise\y \box\labelbox}} 
\let\Bpoint=\point \let\Blpoint=\point \let\lBpoint=\point % synonyms

\def\Brpoint#1{\getparameters{#1}%
\advance\x by-\labelwd
 \rlap{\kern\x \raise\y \box\labelbox}}
\let\rBpoint=\Brpoint 

\def\cpoint#1{\getparameters{#1}% OK
 \reset \advance\y by-.5\totalht \advance\x by-.5\labelwd
 \rlap{\kern\x \raise\y \box\labelbox}}

\def\lpoint#1{\getparameters{#1}% OK
 \reset \advance\y by-.5\totalht 
 \rlap{\kern\x \raise\y \box\labelbox}}

\def\lbpoint#1{\getparameters{#1}%
 \reset \rlap{\kern\x \raise\y \box\labelbox}}
\let\blpoint=\lbpoint

\def\bpoint#1{\getparameters{#1}%
 \reset \advance\x by-.5\labelwd 
 \rlap{\kern\x \raise\y \box\labelbox}}

\def\rbpoint#1{\getparameters{#1}%
 \reset \advance\x by-\labelwd 
 \rlap{\kern\x \raise\y \box\labelbox}}
\let\brpoint=\rbpoint

\def\rpoint#1{\getparameters{#1}%
 \reset \advance\y by-.5\totalht \advance\x by-\labelwd
 \rlap{\kern\x \raise\y \box\labelbox}}

\def\trpoint#1{\getparameters{#1}%
 \reset \advance\y by-\totalht \advance\x by-\labelwd
 \rlap{\kern\x \raise\y \box\labelbox}}
\let\rtpoint=\trpoint

\def\tpoint#1{\getparameters{#1}%
 \reset \advance\y by-\totalht 
 \advance\x by-.5\labelwd
 \rlap{\kern\x \raise\y \box\labelbox}}

\def\tlpoint#1{\getparameters{#1}%
 \reset \advance\y by-\totalht 
 \rlap{\kern\x \raise\y \box\labelbox}}
\let\ltpoint=\tlpoint

\endinput