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