1:
2eval 'exec perl -S $0 ${1+"$@"}'
3                      if $running_under_some_shell;
4
5# Copyright (c) 1995, Geometry Center, University of Minnesota
6# Script by Stuart Levy, Geometry Center.
7# Uses Hershey fonts as encoded for Ghostscript.
8# This program may be freely used and redistributed so long as
9# this notice remains.
10
11# Configurable value: if you have Ghostscript Hershey fonts installed on your
12# system, you might want to set $gsfontdir to the directory where they live.
13# "-hershey" will seek files there if not found relative to ".".
14# This could be a colon-separated list of directories.
15
16$gsfontpath = $ENV{"GS_FONTPATH"} || "/usr/local/lib/ghostscript/fonts";
17
18
19if (@ARGV == 0) {
20	print STDERR
21"Usage: $0  [-w totallength] [-s textheight] [-plane xy|xz|yz] [-at X Y Z]
22	[-hershey fontfile.gsf] [-align n|s|e|w|ne|nw|se|sw|c] [--] text string
23
24Generate geomview/OOGL vector-text object, of given height or total length
25(default -s .25), aligning the given corner of the text
26(default -align c (centered)) at given point (default -at 0 0 0).
27Accepts Ghostscript Hershey fonts; built-in default is Hershey-Plain-Simplex.
28";
29	exit(1);
30}
31
32@at = (0,0,0);
33
34$ujust = -.5, $vjust = -.5;
35$uaxis = 0, $vaxis = 1;
36%ax = ('x',0, 'y',1, 'z',2,
37       0,'x', 1,'y', 2,'z');
38
39($cmdline = join(" ", $0, @ARGV)) =~ s/[\000-\031\177-\377]/sprintf("\\%03o",unpack("C",$1))/eg;
40
41while(@ARGV) {
42    if($ARGV[0] =~ /^-w/) {
43	shift, $totallen = shift;
44    } elsif($ARGV[0] =~ /^-s/) {
45	shift, $height = shift;
46    } elsif($ARGV[0] =~ /^-pl?a?n?e?/) {
47	shift, $plane = shift;
48	$plane =~ tr/XYZ/xyz/;
49	$uaxis = $ax{substr($plane,0,1)};
50	$vaxis = $ax{substr($plane,1,1)};
51	unless ($uaxis != $vaxis && defined($uaxis) && defined($vaxis)) {
52	    print STDERR
53	      "$0: -plane: Expected \"xy\" or \"yz\" or \"xz\", not $plane.\n";
54	    exit(0);
55	}
56    } elsif($ARGV[0] =~ /^-ali?g?n?/) {
57	shift, $align = shift;
58	$ujust = $vjust = -.5;
59	$ujust = -1 if $align =~ /e/i;
60	$ujust = 0 if $align =~ /w/i;
61	$vjust = -1 if $align =~ /n/i;
62	$vjust = 0 if $align =~ /s/i;
63	unless($align =~ /^[nsewc]+$/i) {
64	    print STDERR
65	      "$0: -align: Expected some combination of letters n s e w c\n";
66	    exit(1);
67	}
68    } elsif($ARGV[0] =~ /^-at/) {
69	shift, @at = (shift,shift,shift);
70    } elsif($ARGV[0] =~ /^-her?s?h?e?y?/) {
71	shift, $gsfont = shift;
72	unless (-f $gsfont) {
73	   foreach $_ (split(":", $gsfontpath)) {
74		($gsfont = $_), last if -f ($_ .= "/" . $gsfont);
75	   }
76	}
77    } elsif($ARGV[0] =~ /^--/) {
78	shift, last;
79    } else {
80	last;
81    }
82}
83
84$chars{"space"} = " ";
85while(<DATA>) {
86    if(/CHARS/ .. /ENDCHARS/) {
87	($name, $char) = split;
88	$chars{$name} = $char if length($char) == 1;
89    }
90    last if /^%END/;
91}
92
93if($gsfont) {
94   local($_, $any);
95   $any = open(INF, $gsfont);
96   while(<INF>) {
97	last if /%END/;
98   }
99   if(/%END/) {
100	$INF = 'INF';
101   } else {
102	print STDERR $any
103	  ? "$gsfont isn't a Ghostscript Hershey font -- no %END tag found.\n"
104	  : "Can't open Ghostscript Hershey font file $gsfont, using default.\n";
105	$INF = 'DATA';
106   }
107} else {
108   $INF = 'DATA';
109}
110
111
112$aspect = .67;	# Width/height of typical character
113$fontscale = 1/33.;	# Hershey magic scale factor
114while(<$INF>) {
115    ($char, $xmin, $width, $codes) = (m'^/(\S+)\s*\[(\S+) (\S+) \(([^)]*)');
116    $char = $chars{$char} if length($char) > 1;
117    next unless defined($char);
118    $code{$char} = "$xmin,$width,$codes";
119}
120
121$string = join(" ", @ARGV);
122
123(print STDERR "$0: No string given?\n"), exit(1)
124    unless $string ne "";
125
126%escapes = ("n", "\n", "b", "\b", "r", "\r", "e", "\e");
127
128$string =~ s/\\([^0-7])/defined($escapes{$1}) ? $escapes{$1} : $1/eg;
129$string =~ s/\\([0-7][0-7]?[0-7]?)/pack("C",oct($1))/eg;
130
131$stringwidth = 0;
132
133foreach $char (split("", $string)) {
134   ($xmin,$xmax) = ($code{$char} =~ /([^,]+),([^,]+)/);
135   $stringwidth += $xmax - $xmin;
136}
137$stringwidth = 1 unless $stringwidth;
138
139if($totallen) {
140   $strscale = $totallen / $stringwidth;
141   $height = $strscale * $aspect / $fontscale;
142} else {
143   $height = 0.25 unless($height>0);
144   $strscale = $fontscale * $height / $aspect;
145   $totallen = $strscale * $stringwidth;
146}
147
148
149@path = ();
150@counts = ();
151
152# Interpret chars in string.
153
154# Apply justification offset
155$at[$uaxis] += $ujust * $totallen;
156$at[$vaxis] += $vjust * $height;
157
158foreach $ch (split("", $string)) {
159    ($xmin, $xmax, $paths) = split(",", $code{$ch});
160    $paths =~ s/\\([()\\])/$1/g;
161    foreach $arc (split(' ', $paths)) {
162	$u0 = -82-$xmin;
163	$v0 = -91;
164	@sites = unpack("C*",$arc);
165	printf STDERR "$0: internal error: tossing odd stroke for %s: '%s'\n", $ch, pop(@sites)
166		if(@sites & 1);
167	push(@counts, ($#sites+1)/2);
168	while($u = shift(@sites)) {
169	    $v = shift(@sites);
170	    @here = @at;
171	    $here[$uaxis] += $strscale*($u+$u0);
172	    $here[$vaxis] -= $strscale*($v+$v0);
173	    push(@path, sprintf("%.7g %.7g %.7g", @here));
174	}
175    }
176    $at[$uaxis] += $strscale*($xmax-$xmin);
177}
178
179($safestring = $string) =~
180	s/[\000-\031\177-\377]/sprintf("\\%03o",unpack("C",$1))/eg;
181
182printf "# Continue with: -align sw -plane %s%s -s %.6g -at %.6g %.6g %.6g\n",
183	$ax{$uaxis}, $ax{$vaxis}, $height, @at;
184
185if(@counts > 0) {
186    print "VECT  # $safestring\n";
187    printf "%d %d 0 # %s\n", $#counts+1, ($#path+1), $cmdline;
188    print join(" ",@counts),"\n";
189    print "0 " x ($#counts+1), "\n\n";
190
191    while(@path) {
192	print shift(@path), "\n";
193    }
194} else {
195    print "{ # $safestring\n";
196    print "} # $cmdline\n";
197}
198
199
200__END__
201
202CHARS
203exclam !
204quotedbl "
205numbersign #
206dollar $
207percent %
208ampersand &
209quotesingle '
210parenleft (
211parenright )
212asterisk *
213plus +
214comma ,
215hyphen -
216period .
217slash /
218zero 0
219one 1
220two 2
221three 3
222four 4
223five 5
224six 6
225seven 7
226eight 8
227nine 9
228colon :
229semicolon ;
230less <
231equal =
232greater >
233question ?
234bracketleft [
235backslash \
236bracketright ]
237asciicircum ^
238underscore _
239quoteleft `
240braceleft {
241bar |
242braceright }
243asciitilde ~
244tilde ~
245universal "
246existential $
247suchthat '
248asteriskmath *
249congruent @
250Alpha A
251Beta B
252Chi C
253Delta D
254Epsilon E
255Phi F
256Gamma G
257Eta H
258Iota I
259theta1 J
260Kappa K
261Lambda L
262Mu M
263Nu N
264Omicron O
265Pi P
266Theta Q
267Rho R
268Sigma S
269Tau T
270Upsilon U
271sigma1 V
272Omega W
273Xi X
274Psi Y
275Zeta Z
276therefore \
277perpendicular ^
278radicalex `
279alpha a
280beta b
281chi c
282delta d
283epsilon e
284phi f
285gamma g
286eta h
287iota i
288phi1 j
289kappa k
290lambda l
291mu m
292nu n
293omicron o
294pi p
295theta q
296rho r
297sigma s
298tau t
299upsilon u
300omega1 v
301omega w
302xi x
303psi y
304zeta z
305similar ~
306Upsilon1 �
307minute �
308lessequal �
309fraction �
310infinity �
311florin �
312club �
313diamond �
314heart �
315spade �
316arrowboth �
317arrowleft �
318arrowup �
319arrowright �
320arrowdown �
321degree �
322plusminus �
323second �
324greaterequal �
325multiply �
326proportional �
327partialdiff �
328bullet �
329divide �
330notequal �
331equivalence �
332approxequal �
333ellipsis �
334arrowvertex �
335arrowhorizex �
336carriagereturn �
337aleph �
338Ifraktur �
339Rfraktur �
340weierstrass �
341circlemultiply �
342circleplus �
343emptyset �
344intersection �
345union �
346propersuperset �
347reflexsuperset �
348notsubset �
349propersubset �
350reflexsubset �
351element �
352notelement �
353angle �
354gradient �
355registerserif �
356copyrightserif �
357trademarkserif �
358product �
359radical �
360dotmath �
361logicalnot �
362logicaland �
363logicalor �
364arrowdblboth �
365arrowdblleft �
366arrowdblup �
367arrowdblright �
368arrowdbldown �
369lozenge �
370angleleft �
371registersans �
372copyrightsans �
373trademarksans �
374summation �
375parenlefttp �
376parenleftex �
377parenleftbt �
378bracketlefttp �
379bracketleftex �
380bracketleftbt �
381bracelefttp �
382braceleftmid �
383braceleftbt �
384braceex �
385angleright �
386integral �
387integraltp �
388integralex �
389integralbt �
390parenrighttp �
391parenrightex �
392parenrightbt �
393bracketrighttp �
394bracketrightex �
395bracketrightbt �
396bracerighttp �
397bracerightmid �
398bracerightbt �
399ENDCHARS
400
401# Now for our default font.
402# Boilerplate header from Ghostscript font hrpl_s.gsf omitted.
403%END
404
405150 dict dup begin
406/A [-8 9 (RFJ[ RFZ[ MTWT)] def
407/B [-10 10 (KFK[ KFTFWGXHYJYLXNWOTP KPTPWQXRYTYWXYWZT[K[)] def
408/C [-9 11 (ZKYIWGUFQFOGMILKKNKSLVMXOZQ[U[WZYXZV)] def
409/D [-10 10 (KFK[ KFRFUGWIXKYNYSXVWXUZR[K[)] def
410/E [-9 9 (LFL[ LFYF LPTP L[Y[)] def
411/F [-9 8 (LFL[ LFYF LPTP)] def
412/G [-9 11 (ZKYIWGUFQFOGMILKKNKSLVMXOZQ[U[WZYXZVZS USZS)] def
413/H [-10 11 (KFK[ YFY[ KPYP)] def
414/I [-3 4 (RFR[)] def
415/J [-7 8 (VFVVUYTZR[P[NZMYLVLT)] def
416/K [-10 10 (KFK[ YFKT POY[)] def
417/L [-9 7 (LFL[ L[X[)] def
418/M [-11 12 (JFJ[ JFR[ ZFR[ ZFZ[)] def
419/N [-10 11 (KFK[ KFY[ YFY[)] def
420/O [-10 11 (PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF)] def
421/P [-10 10 (KFK[ KFTFWGXHYJYMXOWPTQKQ)] def
422/Q [-10 11 (PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF SWY])] def
423/R [-10 10 (KFK[ KFTFWGXHYJYLXNWOTPKP RPY[)] def
424/S [-9 10 (YIWGTFPFMGKIKKLMMNOOUQWRXSYUYXWZT[P[MZKX)] def
425/T [-8 8 (RFR[ KFYF)] def
426/U [-11 11 (KFKULXNZQ[S[VZXXYUYF)] def
427/V [-9 10 (JFR[ ZFR[)] def
428/W [-13 12 (HFM[ RFM[ RFW[ \\FW[)] def
429/X [-10 10 (KFY[ YFK[)] def
430/Y [-9 9 (JFRPR[ ZFRP)] def
431/Z [-10 10 (YFK[ KFYF K[Y[)] def
432/a [-8 10 (XMX[ XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def
433/b [-9 9 (LFL[ LPNNPMSMUNWPXSXUWXUZS[P[NZLX)] def
434/c [-8 9 (XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def
435/d [-8 10 (XFX[ XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def
436/e [-8 9 (LSXSXQWOVNTMQMONMPLSLUMXOZQ[T[VZXX)] def
437/f [-4 7 (WFUFSGRJR[ OMVM)] def
438/g [-8 10 (XMX]W`VaTbQbOa XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def
439/h [-8 10 (MFM[ MQPNRMUMWNXQX[)] def
440/i [-3 4 (QFRGSFREQF RMR[)] def
441/j [-4 5 (RFSGTFSERF SMS^RaPbNb)] def
442/k [-8 8 (MFM[ WMMW QSX[)] def
443/l [-3 4 (RFR[)] def
444/m [-14 15 (GMG[ GQJNLMOMQNRQR[ RQUNWMZM\\N]Q][)] def
445/n [-8 10 (MMM[ MQPNRMUMWNXQX[)] def
446/o [-8 10 (QMONMPLSLUMXOZQ[T[VZXXYUYSXPVNTMQM)] def
447/p [-9 9 (LMLb LPNNPMSMUNWPXSXUWXUZS[P[NZLX)] def
448/q [-8 10 (XMXb XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def
449/r [-6 7 (OMO[ OSPPRNTMWM)] def
450/s [-7 9 (XPWNTMQMNNMPNRPSUTWUXWXXWZT[Q[NZMX)] def
451/t [-5 7 (RFRWSZU[W[ OMVM)] def
452/u [-8 10 (MMMWNZP[S[UZXW XMX[)] def
453/v [-7 8 (LMR[ XMR[)] def
454/w [-11 11 (JMN[ RMN[ RMV[ ZMV[)] def
455/x [-7 9 (MMX[ XMM[)] def
456/y [-7 8 (LMR[ XMR[P_NaLbKb)] def
457/z [-7 9 (XMM[ MMXM M[X[)] def
458/zero [-10 10 (QFNGLJKOKRLWNZQ[S[VZXWYRYOXJVGSFQF)] def
459/one [-10 10 (NJPISFS[)] def
460/two [-10 10 (LKLJMHNGPFTFVGWHXJXLWNUQK[Y[)] def
461/three [-10 10 (MFXFRNUNWOXPYSYUXXVZS[P[MZLYKW)] def
462/four [-10 10 (UFKTZT UFU[)] def
463/five [-10 10 (WFMFLOMNPMSMVNXPYSYUXXVZS[P[MZLYKW)] def
464/six [-10 10 (XIWGTFRFOGMJLOLTMXOZR[S[VZXXYUYTXQVOSNRNOOMQLT)] def
465/seven [-10 10 (YFO[ KFYF)] def
466/eight [-10 10 (PFMGLILKMMONSOVPXRYTYWXYWZT[P[MZLYKWKTLRNPQOUNWMXKXIWGTFPF)] def
467/nine [-10 10 (XMWPURRSQSNRLPKMKLLINGQFRFUGWIXMXRWWUZR[P[MZLX)] def
468/period [-5 5 (RYQZR[SZRY)] def
469/comma [-5 5 (SZR[QZRYSZS\\R^Q_)] def
470/colon [-5 5 (RMQNROSNRM RYQZR[SZRY)] def
471/semicolon [-5 5 (RMQNROSNRM SZR[QZRYSZS\\R^Q_)] def
472/exclam [-7 7 (RFRT RYQZR[SZRY)] def
473/question [-9 9 (LKLJMHNGPFTFVGWHXJXLWNVORQRT RYQZR[SZRY)] def
474/quotedbl [-8 8 (NFNM VFVM)] def
475/ring [-7 7 (QFOGNINKOMQNSNUMVKVIUGSFQF)] def
476/dollar [-10 10 (PBP_ TBT_ YIWGTFPFMGKIKKLMMNOOUQWRXSYUYXWZT[P[MZKX)] def
477/fraction [-11 11 ([BIb)] def
478/parenleft [-7 5 (VBTDRGPKOPOTPYR]T`Vb)] def
479/parenright [-5 7 (NBPDRGTKUPUTTYR]P`Nb)] def
480/bar [-4 4 (RBRb)] def
481/hyphen [-13 13 (IR[R)] def
482/plus [-13 13 (RIR[ IR[R)] def
483/equal [-13 13 (IO[O IU[U)] def
484/periodcentered [-5 5 (RQQRRSSRRQ)] def
485/quoteleft [-5 5 (SFRGQIQKRLSKRJ)] def
486/quoteright [-5 5 (RHQGRFSGSIRKQL)] def
487/numbersign [-10 11 (SBLb YBRb LOZO KUYU)] def
488/ampersand [-13 13 (\\O\\N[MZMYNXPVUTXRZP[L[JZIYHWHUISJRQNRMSKSIRGPFNGMIMKNNPQUXWZY[[[\\Z\\Y)] def
489/bullet [-2 2 (QPPQPSQTSTTSTQSPQP RQQRRSSRRQ)] def
490/slash [-7 7 (K^YF)] def
491/backslash [-7 7 (KFY^)] def
492/underscore [-8 8 (J]Z])] def
493/tilde [-8 8 (LTLRMPOPUSWSXR LRMQOQUTWTXRXP)] def
494/bracketleft [-7 7 (OBOb PBPb OBVB ObVb)] def
495/bracketright [-7 7 (TBTb UBUb NBUB NbUb)] def
496/braceleft [-7 7 (TBRCQDPFPHQJRKSMSOQQ RCQEQGRISJTLTNSPORSTTVTXSZR[Q]Q_Ra QSSUSWRYQZP\\P^Q`RaTb)] def
497/braceright [-7 7 (PBRCSDTFTHSJRKQMQOSQ RCSESGRIQJPLPNQPURQTPVPXQZR[S]S_Ra SSQUQWRYSZT\\T^S`RaPb)] def
498/asterisk [-8 8 (RFRR MIWO WIMO)] def
499/less [-12 12 (ZIJRZ[)] def
500/greater [-12 12 (JIZRJ[)] def
501/asciitilde [-12 12 (IUISJPLONOPPTSVTXTZS[Q ISJQLPNPPQTTVUXUZT[Q[O)] def
502/asciicircum [-11 11 (JTROZT JTRPZT)] def
503/breve [-10 10 (KFLHNJQKSKVJXHYF KFLINKQLSLVKXIYF)] def
504/percent [-12 12 ([FI[ NFPHPJOLMMKMIKIIJGLFNFPGSHVHYG[F WTUUTWTYV[X[ZZ[X[VYTWT)] def
505/at [-13 14 (WNVLTKQKOLNMMPMSNUPVSVUUVS QKOMNPNSOUPV WKVSVUXVZV\\T]Q]O\\L[JYHWGTFQFNGLHJJILHOHRIUJWLYNZQ[T[WZYYZX XKWSWUXV)] def
506/section [-8 8 (UITJUKVJVIUGSFQFOGNINKOMQOVR OMTPVRWTWVVXTZ PNNPMRMTNVPXU[ NVSYU[V]V_UaSbQbOaN_N^O]P^O_)] def
507/dagger [-8 8 (RFQHRJSHRF RFRb RQQTRbSTRQ LMNNPMNLLM LMXM TMVNXMVLTM)] def
508/daggerdbl [-8 8 (RFQHRJSHRF RFRT RPQRSVRXQVSRRP RTRb R^Q`RbS`R^ LMNNPMNLLM LMXM TMVNXMVLTM L[N\\P[NZL[ L[X[ T[V\\X[VZT[)] def
509/space [-4 4 ()] def
510/quotesingle [-4 5 (SFRGRM SGRM SFTGRM)] def
511/.notdef [ 0 0 () ] def		% not defined
512end
513/Hershey-Plain-Simplex 4294100 0.8 0 MakeHersheyFont
514