home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume8 / psfig-tex / part02 < prev    next >
Text File  |  1987-03-02  |  57KB  |  1,864 lines

  1. Subject:  v08i097:  Including PostScript/Macintosh figures in TeX documents, Part02/03
  2. Newsgroups: mod.sources
  3. Approved: mirror!rs
  4.  
  5. Submitted by: trevor@grasp.cis.upenn.edu (Trevor Darrell)
  6. Mod.sources: Volume 8, Issue 97
  7. Archive-name: psfig-tex/Part02
  8.  
  9. #! /bin/sh
  10. # This is a shell archive.  Remove anything before this line,
  11. # then unpack it by saving it in a file and typing "sh file".
  12. # If all goes well, you will see the message "End of archive 2 (of 3)."
  13. # Contents:  doc/figs/mac.pro doc/figs/pathtext.ps doc/figs/piechart.ps
  14. #   doc/figs/trianglev.ps doc/figs/zip.ps man/psfigtex.l
  15. #   man/psfigtex.out src/README src/figtex.pro
  16. PATH=/bin:/usr/bin:/usr/ucb; export PATH
  17. echo shar: extracting "'doc/figs/mac.pro'" '(25623 characters)'
  18. if test -f 'doc/figs/mac.pro' ; then 
  19.   echo shar: will not over-write existing file "'doc/figs/mac.pro'"
  20. else
  21. sed 's/^X//' >doc/figs/mac.pro <<'@//E*O*F doc/figs/mac.pro//'
  22. X%!
  23. X% Modified slightly by Ned Batchelder, University of Pennsylvania [Ned].
  24. X%
  25. X% Modified slightly for Textset.  Changes are marked with "jjs".
  26. X%    Jim Sterken
  27. X%    September 20, 1985
  28. X%
  29. X% ------------
  30. X%
  31. X%         Macintosh LaserWriter header file.
  32. X%
  33. X% This is a file of PostScript definitions that can be affixed to the
  34. X% front of the PostScript files generated by Macintosh applications in order
  35. X% that they can be printed on a LaserWriter that has not been initialized
  36. X% with the "LaserPrep" package. This situation will arise if you are
  37. X% trying to share a LaserWriter between Macintosh users and non-Macintosh
  38. X% users.
  39. X%
  40. X% Macintosh applications do not normally generate straight PostScript.
  41. X% They generate a file in PostScript format, but the contents of the file
  42. X% is a series of calls on functions that are not part of the PostScript
  43. X% language. This file defines those functions.
  44. X%
  45. X% This is not the official Apple header file. It is neither endorsed nor
  46. X% condemned by Apple. I suspect that it probably started out its life
  47. X% as a bootleg copy of a version of the Apple header file. It has been
  48. X% slightly modified by me and perhaps heavily modified by various other
  49. X% people. I have substantially augmented the comments so that they explain
  50. X% what I think the code is doing.
  51. X%
  52. X%    Brian Reid    Reid@SU-Glacier.ARPA
  53. X%    Stanford    {decwrl,hplabs,bellcore}!glacier!reid
  54. X%
  55. X% WARNING: There is no guarantee that Apple will stick to this particular
  56. X% set of definitions. This header file works with the application software
  57. X% that came with my LaserWriter; I make no promises that it will work with
  58. X% the software on anybody else's LaserWriter.
  59. X%
  60. X% To convert this file back into a downloaded file instead of a header
  61. X% file, uncomment all of the lines beginning with %-%
  62. X%-%0000000            % Server loop exit password
  63. X%-%serverdict begin exitserver
  64. X%-%  systemdict /statusdict known
  65. X%-%  {statusdict begin 9 0 3 setsccinteractive /waittimeout 300 def end}
  66. X%-% if
  67. X/md 200 dict def        % define a working dictionary
  68. Xmd begin            % start using it
  69. X/av 13 def            % define apple version
  70. X/mtx matrix currentmatrix def    % save current transformation
  71. X/s30 30 string def
  72. X/s1 ( ) def
  73. X/pys 1 def
  74. X/pxs 1 def
  75. X/pyt 760 def
  76. X/pxt 29.52 def
  77. X/por true def
  78. X/xl {translate} def
  79. X/fp {pnsh 0 ne pnsv 0 ne and} def
  80. X% Define QuickDraw operators as an array of procedures.
  81. X% They are {frame, paint, erase, invert, fill}
  82. X% For some reason "invert" is a no-op.
  83. X/vrb [
  84. X{fp
  85. X {gsave 1 setlinewidth pnsh pnsv scale stroke grestore}
  86. X if newpath}
  87. X{eofill}
  88. X{eofill}
  89. X{newpath}
  90. X{eofill}
  91. X{initclip eoclip newpath}
  92. X{newpath}    % [Ned] Some figures were painting an all black page.
  93. X{}
  94. X{}
  95. X{}
  96. X] def
  97. X% convenience function for backwards def
  98. X/xdf {exch def} def
  99. X% get current halftone screen parameters
  100. Xcurrentscreen
  101. X    /spf xdf        % spot function
  102. X    /rot xdf        % rotation
  103. X    /freq xdf        % spatial frequency
  104. X% "apply" function to execute appropriate numbered operator from /vrb.
  105. X/doop {vrb exch get exec} def
  106. X% compute page position from portrait/landscape flag, translation, scale,
  107. X%    and resolution.
  108. X%  call: P/L-flag xtransl ytransl scale*100 xbits/inch ybits/inch psu
  109. X% typical call: F 580 760 100 72 72 psu for life-size screen-resolution
  110. X% image.
  111. X%
  112. X/psu
  113. X  {2 index .72 mul exch div /pys xdf    % pixel y scale
  114. X  div .72 mul /pxs xdf            % pixel x scale
  115. X /pyt xdf                % pixel y translation
  116. X /pxt xdf                % pixel x translation
  117. X /por xdf                % portrait flag (T=portrait)
  118. X} def
  119. X% argument is page y size; use this to determine legal, letter, or note
  120. X% and to set up appropriate scale factors and translation/reflection
  121. X% for portrait or landscape.
  122. X/txpose{
  123. X    dup 1680 eq
  124. X    %
  125. X    % I've disabled this because it was blanking the page (jjs)
  126. X    %
  127. X    % userdict /note known
  128. X    %   {{legal}{note}ifelse}
  129. X    %   {pop}
  130. X    % ifelse
  131. X    dup 1212 eq {54 32.4 xl} if
  132. X    1321 eq {8.64 -.6 xl} if
  133. X    pxs pys scale pxt pyt xl 
  134. X    por not {270 rotate} if
  135. X    1 -1 scale
  136. X} def
  137. X% Compute oblique shear value for font if flag true
  138. X/obl {{0.212557 mul}{pop 0} ifelse} def
  139. X%  set font from dictionary: make a font, set it to current, leave on stack
  140. X%  call: "found-font size oblique-flag dictionary sfd"
  141. X/sfd {
  142. X   [ps 0 ps 6 -1 roll obl ps neg 0 0] makefont
  143. X   dup setfont
  144. X} def
  145. X/fnt {findfont sfd} def
  146. X% bit test-- "number mask-word bt" returns boolean and unchanged number
  147. X% thus, "4095 512 bt" returns "true 4095" -- the argument is a mask
  148. X% and not a bit number.
  149. X/bt {1 index and 0 ne exch} def
  150. X% load style array with unpacked true/false flags from style word
  151. X% flags are Bold, Italic, Underline, Outline, Shadow (I don't know
  152. X% what the 6th one is supposed to be).
  153. X/sa 6 array def
  154. X/fs {
  155. X    1 bt     2 bt    4 bt    8 bt   16 bt
  156. X   sa astore pop
  157. X} def
  158. X/matrix1 matrix def
  159. X/matrix2 matrix def
  160. X/gf{
  161. X  currentfont
  162. X} def
  163. X% set translation center from 2 double-precision integers giving x,y
  164. X/tc{
  165. X   32768 div add        % compute y location
  166. X   3 1 roll
  167. X   32768 div add        % compute x location
  168. X   2t astore pop        % save 'em
  169. X} def
  170. X/3a [0 0 0] def
  171. X/2t 2 array def
  172. X% store transformation params: "justify flip rotation tp"
  173. X% (left/center/right/full, none/yflip,xflip, degrees)
  174. X/tp{
  175. X   3a astore pop
  176. X} def
  177. X/ee {} def
  178. X% move PostScript current position to QuickDraw current position,
  179. X% and get scaling and rotation right (this is in preparation for
  180. X% outputting text
  181. X/tt {
  182. X   gsave
  183. X     currentpoint 2 copy
  184. X     2t aload pop qa 2 copy xl
  185. X     3a aload pop exch dup 0 eq
  186. X     {pop}
  187. X     {1 eq {-1 1}
  188. X       {1 -1}ifelse scale}
  189. X     ifelse
  190. X     rotate
  191. X     pop neg exch neg exch xl
  192. X     moveto
  193. X} def
  194. X/te {                % text-end: undo effects of prior "tt"
  195. X   currentpoint currentfont
  196. X   grestore setfont moveto    % but leave font and currentpoint set
  197. X} def
  198. X/tb {
  199. X   /tg currentgray def
  200. X   3 -1 roll 3 eq
  201. X   {1 setgray} if
  202. X   /ml 0 def /al 0 def
  203. X} def
  204. X/am {
  205. X   ml add /ml xdf
  206. X} def
  207. X/aa {
  208. X   [currentgray /setgray cvx] cvx
  209. X   exch dup wi pop dup al add /al xdf exch
  210. X} def
  211. X% scale by rational value (quotient) in x and y. Set "scaleflag" to
  212. X% record that we have done this.
  213. X/th {
  214. X   3 -1 roll div
  215. X   3 1 roll exch div
  216. X% not sure of "transform" in next line (BKR)
  217. X   2 copy matrix1 transform scale
  218. X   pop scale
  219. X   /scaleflag true def
  220. X} def
  221. X% undo a "th" scaling and return to default coordinate system
  222. X/tu {
  223. X   1 1 matrix1 itransform scale
  224. X   /scaleflag false def
  225. X} def
  226. X/ts {
  227. X   1 1 matrix1 transform scale
  228. X   /scaleflag true def
  229. X} def
  230. X% record point size (of fonts)
  231. X/fz{/ps xdf} def
  232. X% execute a procedure but leave it on the stack
  233. X/fx{dup exec} def
  234. X/st{show pop pop} def
  235. X% text munger. This does the dirty work for the edit string procedure
  236. X% (following) by iterating over a polymorphic array and doing the right
  237. X% thing with what it finds there.
  238. X/tm {
  239. X      {dup type dup /integertype eq exch /realtype eq or
  240. X     {dup ml mul}
  241. X     {dup type /stringtype eq
  242. X        {rs}
  243. X        {dup type /dicttype eq
  244. X           {setfont}
  245. X           {dup type /arraytype eq
  246. X          {exec}
  247. X          {pop}
  248. X          ifelse
  249. X           } ifelse
  250. X        } ifelse
  251. X     } ifelse
  252. X      } forall
  253. X   } def
  254. X% edit string. Takes a font, a text mode, a justification mode, and an
  255. X% array of text and font changes for that text, and does it.
  256. X/es {
  257. X   3 -1 roll dup sa 5 get dup type /nulltype eq
  258. X   {pop4 pop}
  259. X   {sa 1 get
  260. X      {/ml ml .2 ps mul sub def} if
  261. X      ne {fs}
  262. X     {pop}
  263. X      ifelse exch
  264. X      dup 1 eq            % justification mode 1 is left-justify
  265. X      {pop
  266. X     al ml gt
  267. X     {/tv {ll} /ml ml al dup 0 ne
  268. X        {div}{pop} ifelse
  269. X     def}
  270. X     {/tv {st} /ml 1 def}
  271. X     ifelse def tm
  272. X      }
  273. X      {dup 3 eq         % justification mode 3 is right-justify
  274. X      {pop
  275. X      al ml gt
  276. X      {/tv {ll} /ml ml al dup 0 ne
  277. X    {div}{pop} ifelse
  278. X    def}
  279. X      {ml al sub 0 rmoveto
  280. X    /tv {st} /ml 1 def}
  281. X      ifelse def
  282. X     tm}
  283. X      {2 eq            % justification mode 3 is centered
  284. X      {al ml gt
  285. X     { /tv {ll} /ml ml al dup
  286. X       0 ne
  287. X       {div}{pop}
  288. X       ifelse def}
  289. X     {ml al sub 2 div 0 rmoveto
  290. X       /tv {st} /ml 1 def}
  291. X       ifelse def
  292. X     tm}
  293. X      {             % otherwise it is just "justified"
  294. X    /tv {ll} def
  295. X    /ml ml al dup 0 ne
  296. X      {div}{pop}
  297. X      ifelse def
  298. X     tm}
  299. X       ifelse}
  300. X     ifelse}
  301. X   ifelse}
  302. X   ifelse
  303. X   tg setgray
  304. X}def
  305. X/pop4 {pop pop pop pop} def
  306. X% --------------------------------------------------------------------
  307. X%             QuickDraw Procedures
  308. X%
  309. X% moveto. If a scale factor is in effect, then honor it.
  310. X/gm {
  311. X  scaleflag {matrix1 itransform} if
  312. X  moveto
  313. X} def
  314. X%local y move
  315. X% call: "x y localy ly"
  316. X/ly {
  317. X   exch pop
  318. X   currentpoint exch pop
  319. X   sub 0 exch rmoveto
  320. X} def
  321. X% print n copies of page  (ensures full speed for multiple copies)
  322. X/page {
  323. X   1 add /#copies xdf showpage
  324. X} def
  325. X/sk {
  326. X   systemdict /statusdict known
  327. X} def
  328. X% set job name
  329. X/jn {
  330. X   sk {statusdict /jobname 3 -1 roll put}
  331. X      {pop}
  332. X   ifelse
  333. X} def
  334. X% set pen size: h v pen
  335. X/pen {
  336. X   /pnsv xdf
  337. X   /pnsh xdf
  338. X   pnsh setlinewidth
  339. X} def
  340. X% draw line
  341. X% (uses current pen location, pen size and graylevel)
  342. X% This emulates the ugly QuickDraw pen on the LaserWriter but
  343. X% preserves the same endpoint and linewidth anomalies that some applications
  344. X% rely on. (Bletch).
  345. X/dlin {
  346. X   currentpoint newpath moveto
  347. X   lineto currentpoint stroke
  348. X   grestore moveto
  349. X} def
  350. X/lin {
  351. X   currentpoint /pnlv xdf /pnlh xdf
  352. X   gsave newpath /@y xdf /@x xdf fp
  353. X   {pnlh @x lt
  354. X      {pnlv @y ge
  355. X     {pnlh pnlv moveto @x @y lineto
  356. X      pnsh 0 rlineto
  357. X      0 pnsv rlineto
  358. X      pnlh pnsh add pnlv pnsv add lineto
  359. X      pnsh neg 0 rlineto}
  360. X     {pnlh pnlv moveto
  361. X      pnsh 0 rlineto
  362. X      @x pnsh add @y lineto
  363. X      0 pnsv rlineto
  364. X      pnsh neg 0 rlineto
  365. X      pnlh pnlv pnsv add lineto}
  366. X     ifelse}
  367. X      {pnlv @y gt
  368. X     {@x @y moveto pnsh 0 rlineto
  369. X      pnlh pnsh add pnlv lineto
  370. X      0 pnsv rlineto
  371. X      pnsh neg 0 rlineto
  372. X      @x @y pnsv add lineto}
  373. X     {pnlh pnlv moveto pnsh 0 rlineto
  374. X      0 pnsv rlineto
  375. X      @x pnsh add @y pnsv add lineto
  376. X      pnsh neg 0 rlineto
  377. X      0 pnsv neg rlineto}
  378. X     ifelse}
  379. X      ifelse
  380. X      closepath fill}
  381. X   if @x @y grestore moveto
  382. X} def
  383. X/dl {
  384. X   gsave
  385. X   0 setlinewidth 0 setgray
  386. X} def
  387. X% Arc: top left bottom right startangle stopangle verb flag
  388. X% flag true means to exclude the center of curvature in the arc
  389. X/barc {
  390. X   /@f xdf   /@op xdf    /@e xdf   /@s xdf
  391. X   /@r xdf   /@b xdf    /@l xdf   /@t xdf
  392. X   gsave
  393. X   @r @l add 2 div @b @t add 2 div xl 0 0 moveto
  394. X   @r @l sub @b @t sub mtx currentmatrix pop scale
  395. X   @f {newpath} if
  396. X   0 0 0.5 @s @e arc
  397. X   mtx setmatrix @op doop
  398. X   grestore
  399. X} def
  400. X/doarc {dup 0 eq barc} def
  401. X% oval:  top left bottom right verb
  402. X/doval {0 exch 360 exch true barc} def
  403. X% rectangle:  top left bottom right verb
  404. X/dorect {
  405. X   /@op xdf currentpoint 6 2 roll
  406. X   newpath 4 copy
  407. X   4 2 roll exch moveto
  408. X   6 -1 roll lineto
  409. X   lineto lineto closepath
  410. X   @op doop moveto
  411. X} def
  412. X/mup {dup pnsh 2 div le exch pnsv 2 div le or} def
  413. X% roundrect:  top left bottom right ovalwidth ovalheight operation
  414. X% Warning: ovalwidth is assumed equal to ovalheight.
  415. X/dorrect {
  416. X   /@op xdf    2. div /@h xdf       2. div /@w xdf
  417. X   /@r xdf    /@b xdf        /@l xdf /@t xdf
  418. X   @t @b eq @l @r eq @w mup or or
  419. X   {@t @l @b @r @op dorect}
  420. X   {@r @l sub 2. div dup @w lt
  421. X      {/@w xdf}{pop}
  422. X      ifelse
  423. X      @b @t sub 2. div dup @w lt
  424. X      {/@w xdf}{pop}
  425. X      ifelse
  426. X      @op 0 eq
  427. X      {/@w @w pnsh 2 div sub def}
  428. X      if           %this helps solve overlap gap for wide line widths
  429. X      currentpoint
  430. X      newpath
  431. X      @r @l add 2. div @t moveto
  432. X      @r @t @r @b @w arcto pop4
  433. X      @r @b @l @b @w arcto pop4
  434. X      @l @b @l @t @w arcto pop4
  435. X      @l @t @r @t @w arcto pop4
  436. X      closepath @op doop
  437. X      moveto
  438. X   }ifelse
  439. X} def
  440. X% Polygon utility procedures
  441. X/pr {
  442. X   gsave newpath /pl
  443. X      {moveto
  444. X       /pl {lineto} def
  445. X      }def
  446. X} def
  447. X/pl {lineto} def
  448. X/ep {
  449. X   dup 0 eq
  450. X    {
  451. X     {moveto}{lin}{}{}
  452. X     pathforall %nothing but movetos and linetos should be called
  453. X     pop grestore
  454. X    }
  455. X    {
  456. X     doop grestore
  457. X    }
  458. X    ifelse
  459. X} def
  460. X/bs 8 string def
  461. X/bd {/bs xdf} def
  462. X% These following procedures are used in defining QuickDraw patterns.
  463. X% (Pattern definition goes into halftone screen of PostScript)
  464. X% procedure to find black bits in QuickDraw pattern (pattern in hex string bs)
  465. X/bit {bs exch get exch 7 sub bitshift 1 and} def
  466. X/bix {1 add 4 mul cvi} def
  467. X/pp{exch bix exch bix bit}def
  468. X/grlevel {64. div setgray} def
  469. X% procedure to set a pattern: ratio hexstring
  470. X% ratio is the total number of white bits in the QuickDraw pattern represented in hexstring
  471. X/setpat {
  472. X   /bs xdf
  473. X   9.375 0 {pp} setscreen
  474. X   grlevel
  475. X} def
  476. X/setgry {
  477. X   freq rot {spf} setscreen
  478. X   grlevel
  479. X} def
  480. X% standard copybits routine:
  481. X% arguments: xscale yscale xloc yloc rowbytes xwidth ywidth fsmooth bitmode
  482. X% This procedure is the basis for all QuickDraw bit operations.
  483. X% xscale and yscale tell how much to scale the bit image in 72nds of an inch
  484. X% xloc and yloc are the location of the top left corner of the bitmap
  485. X% rowbytes is the total number of bytes in each scanline of hex data in the
  486. X% image.
  487. X%    Note that rowbytes must be even.
  488. X% xwidth and ywidth are the actual number of bits in the x and y coordinates
  489. X% of the image. fsmooth is a flag to tell whether or not to use bit
  490. X% smoothing.  Bit smoothing is a
  491. X% proprietary algorithm that provides smoothing of the data around a 5 by 5
  492. X% local area of each data pixel.
  493. X% bitmode can be any of the QuickDraw source transfer modes excluding srcXor
  494. X% and notSrcXor.
  495. X%    Note that this is the only QuickDraw procedure that can implement
  496. X% more than the simple srcCopy transfer mode.
  497. X/x4 {2 bitshift} def
  498. X/d4 {-2 bitshift} def
  499. X/xf {.96 mul exch 2 sub .96 mul exch} def
  500. X/dobits
  501. X{
  502. X   /bmode xdf
  503. X   save 9 1 roll
  504. X% 2 sub fixes dxsrc offset number required for bitsmoothing, but applies
  505. X% to both
  506. X%Bit Smooth mode
  507. X   {
  508. X   x4 /@dy xdf 2 sub x4 /@dx xdf /@idx xdf
  509. X   .96 mul exch 3 index 2 sub @dx div 7.68 mul dup 6 1 roll sub exch xl 0 0 moveto xf
  510. X   0 4 -1 roll 2 index 4 index 1.759 add 10 dorect clip newpath 0 0 moveto scale
  511. X   bmode 0 eq bmode 4 eq or{1 setgray 1 @dy div 1 @dx div 1 1 2 dorect}if
  512. X   bmode 3 eq bmode 7 eq or{1}{0}ifelse setgray
  513. X   @idx 5 bitshift @dy bmode 0 eq bmode 1 eq bmode 3 eq or or [@dx 0 0 @dy 0 0]
  514. X     {(%stdin)(r) file @dy d4 4 add @idx mul string readhexstring pop
  515. X     dup length @idx x4 sub 4 bitshift string
  516. X     dup 3 1 roll @dx 8 add d4 smooth} imagemask
  517. X   }
  518. X%Non Bit Smooth mode
  519. X   {
  520. X   /@dy xdf 2 sub /@dx xdf /@idx xdf
  521. X   /@xs @idx string def
  522. X   /@f (%stdin)(r) file def
  523. X   /@p{@f @xs readhexstring pop}def
  524. X   .96 mul xl 0 0 moveto xf scale
  525. X   0 0 1 1 10 dorect clip newpath 0 0 moveto
  526. X   bmode 0 eq bmode 4 eq or{1 setgray .25 @dy div .25 @dx div 1 1 2 dorect}if
  527. X   bmode 3 eq bmode 7 eq or{1}{0}ifelse setgray
  528. X   @p @p
  529. X   @idx 3 bitshift @dy bmode 0 eq bmode 1 eq bmode 3 eq or or [@dx 0 0 @dy 0 0]
  530. X   {@p} imagemask
  531. X   @p @p pop4
  532. X   }ifelse
  533. Xrestore
  534. X} def
  535. X% Making Mac compatible Fonts
  536. X/mfont 14 dict def
  537. X/wd 14 dict def
  538. X/mdef {mfont wcheck not{/mfont 14 dict def}if mfont begin xdf end} def
  539. X/dc {transform round .5 sub exch round .5 sub exch itransform} def
  540. X% Copy a font dictionary: fontdictionary
  541. X% copies a font dictionary into tmp so it may be used to define a new font
  542. X% tmp must be set before cf is called
  543. X/cf{{1 index /FID ne {tmp 3 1 roll put}{pop pop}ifelse}forall}def
  544. X% Procedures used in defining a bit map font
  545. X/mv{tmp /Encoding macvec put}def
  546. X/bf{
  547. Xmfont begin
  548. X/FontType 3 def
  549. X/FontMatrix [1 0 0 1 0 0] def
  550. X/FontBBox [0 0 1 1] def
  551. X/Encoding macvec def
  552. X/BuildChar
  553. X  {
  554. X  wd begin
  555. X    /cr xdf
  556. X    /fd xdf
  557. X    fd /low get cr get 2 get -1 ne
  558. X    {
  559. X    fd begin
  560. X      low cr get aload pop
  561. X      sd
  562. X      low cr 1 add get 0 get
  563. X      sh
  564. X      sw
  565. X    end
  566. X    /sw xdf
  567. X    /sh xdf
  568. X    sw div /clocn xdf
  569. X    dup 0 ne {0 exch sh div neg dc xl}{pop}ifelse
  570. X    exch sw div /coff xdf
  571. X    exch sw div /cloc xdf
  572. X    /bitw clocn cloc sub def
  573. X    sw sh div 1 scale
  574. X    sw div 0 coff 0 bitw coff add 1 setcachedevice
  575. X    coff cloc sub 0 dc xl
  576. X    cloc .5 sw div add 0 dc newpath moveto
  577. X    bitw 0 ne
  578. X      {0 1 rlineto bitw .5 sw div sub 0 rlineto 0 -1 rlineto
  579. X    closepath clip
  580. X      sw sh false [sw 0 0 sh neg 0 sh]{fd /hm get}imagemask}if
  581. X    } if
  582. X  end
  583. X  } def
  584. Xend
  585. Xmfont definefont pop
  586. X} def
  587. X% stringwidth procedure which does not allow a show to occur: (string)
  588. X/wi{save exch /show{pop}def
  589. Xstringwidth 3 -1 roll restore}def
  590. X/aps {0 get 124 eq}def
  591. X/apn {s30 cvs aps} def
  592. X%set style in a PostScript name: AppleFontName
  593. X% e.g.
  594. X% /|----name sos /|---Oname
  595. X% /|----name sis /|-I--name
  596. X/xc{s30 cvs dup}def
  597. X/xp{put cvn}def
  598. X/scs{xc 3 67 put dup 0 95 xp}def
  599. X/sos{xc 3 79 xp}def
  600. X/sbs{xc 1 66 xp}def
  601. X/sis{xc 2 73 xp}def
  602. X/sob{xc 2 79 xp}def
  603. X/sss{xc 4 83 xp}def
  604. X/dd{exch 1 index add 3 1 roll add exch} def
  605. X/smc{moveto dup show} def
  606. X/kwn{dup FontDirectory exch known{findfont exch pop}}def
  607. X/fb{/ps ps 1 add def}def
  608. X/mb
  609. X{dup sbs kwn
  610. X   {
  611. X   exch{pop}{bbc}{} mm
  612. X   }ifelse
  613. Xsfd
  614. X}def
  615. X/mo
  616. X{dup sos kwn
  617. X   {
  618. X   exch{pop}{boc}{} mm
  619. X   }ifelse
  620. Xsfd
  621. X}def
  622. X/ms
  623. X{dup sss kwn
  624. X   {
  625. X   exch{pop}{bsc}{} mm
  626. X   }ifelse
  627. Xsfd
  628. X}def
  629. X/ao
  630. X{dup sos kwn
  631. X   {
  632. X   exch dup ac pop
  633. X   {scs findfont /df2 xdf}{aoc}{} mm
  634. X   }ifelse
  635. Xsfd
  636. X}def
  637. X/as
  638. X{dup sss kwn
  639. X   {
  640. X   exch dup ac pop
  641. X   {scs findfont /df2 xdf}{asc}{} mm
  642. X   }ifelse
  643. Xsfd
  644. X}def
  645. X/ac
  646. X   {
  647. X   dup scs kwn
  648. X      {exch /ofd exch findfont def
  649. X      /tmp ofd maxlength 1 add dict def
  650. X      ofd cf mv
  651. X      tmp /PaintType 1 put
  652. X      tmp definefont}ifelse
  653. X   }def
  654. X/mm{
  655. X/mfont 10 dict def
  656. Xmfont begin
  657. X/FontMatrix [1 0 0 1 0 0] def
  658. X/FontType 3 def
  659. X/Encoding macvec def
  660. X/df 4 index findfont def
  661. X/FontBBox [0 0 1 1] def
  662. X/xda xdf
  663. X/mbc xdf
  664. X/BuildChar { wd begin
  665. X  /cr xdf
  666. X  /fd xdf
  667. X  /cs s1 dup 0 cr put def
  668. X  fd /mbc get exec
  669. X  end
  670. X} def
  671. Xexec
  672. Xend
  673. Xmfont definefont} def
  674. X/bbc
  675. X{
  676. X  /da .03 def
  677. X  fd /df get setfont
  678. X  gsave
  679. X    cs wi exch da add exch %%%% (used to be "exchd", a bug)
  680. X  grestore
  681. X  setcharwidth
  682. X  cs 0 0 smc
  683. X    da 0 smc
  684. X    da da smc
  685. X     0 da moveto show
  686. X} def
  687. X/boc
  688. X{
  689. X  /da 1 ps div def
  690. X  fd /df get setfont
  691. X  gsave
  692. X    cs wi
  693. X    exch da add exch
  694. X  grestore
  695. X  setcharwidth
  696. X  cs 0 0 smc
  697. X    da 0 smc
  698. X    da da smc
  699. X     0 da smc
  700. X  1 setgray
  701. X     da 2. div dup moveto show
  702. X} def
  703. X/bsc
  704. X{
  705. X  /da 1 ps div def
  706. X  /ds .05 def %da dup .03 lt {pop .03}if def
  707. X  /da2 da 2. div def
  708. X  fd /df get setfont
  709. X  gsave
  710. X    cs wi
  711. X    exch ds add da2 add exch
  712. X  grestore
  713. X  setcharwidth
  714. X  cs ds da2 add .01 add 0 smc
  715. X      0 ds da2 sub xl
  716. X      0  0 smc
  717. X     da  0 smc
  718. X     da da smc
  719. X      0 da smc
  720. X  1 setgray
  721. X      da 2. div dup moveto show
  722. X} def
  723. X/aoc
  724. X{
  725. X  fd /df get setfont
  726. X  gsave
  727. X    cs wi
  728. X  grestore
  729. X  setcharwidth
  730. X  1 setgray
  731. X  cs 0 0 smc
  732. X  fd /df2 get setfont
  733. X  0 setgray
  734. X  0 0 moveto show
  735. X}def
  736. X/asc
  737. X{
  738. X  /da .05 def
  739. X  fd /df get setfont
  740. X  gsave
  741. X    cs wi
  742. X    exch da add exch
  743. X  grestore
  744. X  setcharwidth
  745. X  cs da .01 add 0 smc
  746. X      0 da xl
  747. X  1 setgray
  748. X      0 0 smc
  749. X  0 setgray
  750. X  fd /df2 get setfont
  751. X      0 0 moveto show
  752. X}def
  753. X/T true def
  754. X/F false def
  755. X% More Polygon stuff used in polygon comment
  756. X/6a 6 array def
  757. X/2a 2 array def
  758. X/5a 5 array def
  759. X%subtract points, first from second (reverse order):  pt0 pt1 qs newpt
  760. X/qs{3 -1 roll sub exch 3 -1 roll sub exch}def
  761. X/qa{3 -1 roll add exch 3 -1 roll add exch}def
  762. X%multiply point: pt factor qm newpt
  763. X/qm{3 -1 roll 1 index mul 3 1 roll mul}def
  764. X/qn{6a exch get mul}def
  765. X/qA .166667 def /qB .833333 def /qC .5 def
  766. X/qx{
  767. X   6a astore pop
  768. X   qA 0 qn qB 2 qn add    qA 1 qn qB 3 qn add
  769. X   qB 2 qn qA 4 qn add    qB 3 qn qA 5 qn add
  770. X   qC 2 qn qC 4 qn add    qC 3 qn qC 5 qn add
  771. X}def
  772. X/qp{6 copy 12 -2 roll pop pop}def
  773. X/qc{qp qx curveto}def
  774. X/qi{{4 copy 2a astore aload pop qa .5 qm newpath moveto}{2 copy 6 -2 roll 2 qm qs 4 2 roll}ifelse}def
  775. X/qq{{qc 2a aload pop qx curveto}{4 copy qs qa qx curveto}ifelse}def
  776. X%start polygon comment
  777. X/pt{gsave currentpoint newpath moveto}def
  778. X%fill smoothed poly
  779. X/qf{gsave eofill grestore}def
  780. X/tr{currentgray currentscreen bs 5a astore pop /fillflag 1 def}def
  781. X/bc{/fillflag 0 def}def
  782. X%polyverb ec
  783. X/ec{currentpoint 3 -1 roll
  784. X   1 and 0 ne
  785. X   {currentgray currentscreen bs 5a aload pop bd setscreen setgray 0 doop bd setscreen setgray}
  786. X   {newpath}ifelse
  787. X   moveto
  788. X}def
  789. X/bp {
  790. X   currentpoint newpath 2 copy moveto
  791. X   currentgray currentscreen bs 5a astore pop
  792. X} def
  793. X/eu{
  794. X   fillflag 0 ne
  795. X   {
  796. X   gsave currentgray currentscreen bs
  797. X   5a aload pop bd setscreen setgray
  798. X   4 ep
  799. X   bd setscreen setgray
  800. X   }if
  801. X   fp{0 ep}{grestore newpath}ifelse
  802. X}def
  803. X% Line Layout stuff used by string merging algorithm
  804. X% counts spaces in string:   (...) sm (...) n
  805. X% returns string and number of spaces in string
  806. X/sm
  807. X{
  808. Xdup 0 exch
  809. X{32 eq{1 add}if}forall
  810. X}
  811. Xdef
  812. X% layout a string to length specified by desiredlength:  printerlength desiredlength (...) ll
  813. X% printerlength is length of string in printer space
  814. X/ll
  815. X{
  816. X3 1 roll exch dup .0001 lt 1 index -.0001 gt and
  817. X{pop pop pop}
  818. X{sub dup 0 eq
  819. X   {
  820. X   pop show
  821. X   }
  822. X   {
  823. X   1 index sm dup 0 eq 3 index 0 le or
  824. X      {
  825. X      pop length div
  826. X      0 3 -1 roll ashow
  827. X      }
  828. X      {
  829. X% This piece does 10 percent stretching in characters and 90 percent in spaces
  830. X      10 mul exch length add div
  831. X      dup 10 mul 0 32 4 -1 roll 0 6 -1 roll awidthshow
  832. X% This piece does straight stretching in spaces only
  833. X%      exch pop div
  834. X%      0 32 4 -1 roll widthshow
  835. X      }ifelse
  836. X   }ifelse
  837. X}ifelse
  838. X}def
  839. X%set font to symbol and show the string: (...) ss
  840. X/ss
  841. X{  /pft currentfont def sa aload pop pop /|----2Symbol 4 1 roll
  842. X   {pop{as}}
  843. X   {{{ao}}{{fnt}}ifelse}ifelse
  844. X   exch pop exec exch pop
  845. X}def
  846. X/pf{pft dup setfont}def
  847. X% regular show does underline if ulf is true:
  848. X% arguments: printerlength desiredlength string rs
  849. X/rs
  850. X{
  851. X   sa 2 get
  852. X   {
  853. X   gsave
  854. X   1 index 0
  855. X   currentfont
  856. X   dup /FontInfo known
  857. X      {
  858. X      /FontInfo get
  859. X      dup /UnderlinePosition known
  860. X     {
  861. X     dup /UnderlinePosition get 1000 div ps mul
  862. X     }
  863. X     {
  864. X     ps 10 div neg    %15 makes line closer to text
  865. X     }ifelse
  866. X      exch
  867. X      dup /UnderlineThickness known
  868. X     {
  869. X     /UnderlineThickness get 1000 div ps mul
  870. X     }
  871. X     {
  872. X     pop
  873. X     ps 15 div  %20 makes slightly narrower line
  874. X     }ifelse
  875. X      }
  876. X      {
  877. X      pop
  878. X      ps 10 div neg   %15 makes line closer to text
  879. X      ps 15 div       %20 makes slightly narrower line
  880. X      }ifelse
  881. X   setlinewidth
  882. X   0 setgray
  883. X   currentpoint 3 -1 roll sub moveto
  884. X   sa 4 get{gsave currentlinewidth 2. div dup rmoveto currentpoint xl 2 copy rlineto
  885. X   stroke grestore}if
  886. X   sa 3 get sa 4 get or 3 1 roll 2 index{gsave 1 setgray 2 copy rlineto stroke grestore}if
  887. X   rlineto{strokepath 0 setlinewidth}if stroke
  888. X   grestore
  889. X   }if
  890. X   tv
  891. X}
  892. Xdef
  893. X%  More Font building stuff, specifically the Apple Encoding Vector
  894. X% Font encoding vector for PostScript fonts to match Mac
  895. X/macvec 256 array def
  896. Xmacvec 0
  897. X/Times-Roman findfont /Encoding get
  898. X0 128 getinterval putinterval macvec 39 /quotesingle put
  899. X /dotlessi /grave /circumflex /tilde /cedilla /registerserif
  900. X /copyrightserif /trademarkserif
  901. Xmacvec 0 8 getinterval astore pop
  902. X /Adieresis /Aring /Ccedilla /Eacute /Ntilde /Odieresis /Udieresis /aacute
  903. X /agrave /acircumflex /adieresis /atilde /aring /ccedilla /eacute /egrave
  904. X /ecircumflex /edieresis /iacute /igrave /icircumflex /idieresis /ntilde
  905. X /oacute  /ograve /ocircumflex /odieresis /otilde /uacute /ugrave
  906. X /ucircumflex /udieresis
  907. X /dagger /ring /cent /sterling /section /bullet /paragraph /germandbls
  908. X /registersans /copyrightsans /trademarksans /acute /dieresis /notequal
  909. X /AE /Oslash
  910. X /infinity /plusminus /lessequal /greaterequal /yen /mu /partialdiff
  911. X /summation
  912. X /product /pi /integral /ordfeminine /ordmasculine /Omega /ae /oslash
  913. X /questiondown /exclamdown /logicalnot /radical /florin /approxequal /Delta
  914. X /guillemotleft  /guillemotright /ellipsis /space /Agrave /Atilde /Otilde
  915. X /OE /oe /endash /emdash /quotedblleft /quotedblright /quoteleft
  916. X /quoteright /divide /lozenge /ydieresis /Ydieresis /fraction /currency
  917. X /guilsinglleft /guilsinglright /fi /fl /daggerdbl /periodcentered
  918. X /quotesinglbase /quotedblbase /perthousand /Acircumflex /Ecircumflex /Aacute
  919. X /Edieresis /Egrave /Iacute /Icircumflex /Idieresis /Igrave /Oacute
  920. X /Ocircumflex /apple /Ograve /Uacute /Ucircumflex /Ugrave /dotlessi
  921. X /asciicircum /asciitilde /macron /breve /dotaccent /ring /cedilla
  922. X /hungarumlaut /ogonek /caron
  923. Xmacvec 128 128 getinterval astore pop
  924. X% now redefine all fonts using the MAC Encoding (except in Symbol) to make
  925. X% them be Apple compatible.
  926. XFontDirectory
  927. X{exch dup s30 cvs /@s xdf @s aps
  928. X   {pop pop}
  929. X   {exch dup length dict /tmp xdf
  930. X      cf
  931. X      /Symbol ne {mv} if
  932. X      /@i false def /@o false def /@b false def
  933. X      mark @s (Italic) search {/@i true def} if (Oblique) search {/@o true def} if
  934. X      (Bold) search {/@b true def} if (Roman) search pop (-) search pop /@s xdf cleartomark
  935. X      @s cvn dup /Symbol eq{pop 50}{/Courier eq{51}{49}ifelse}ifelse
  936. X      s30 0 @s length 6 add getinterval dup 6 @s putinterval dup 0 (|-----) putinterval
  937. X      @b {dup 1 66 put} if @i @o or {dup 2 73 put} if % @o {dup 2 79 put} if
  938. X      dup 5 4 -1 roll put
  939. X      cvn tmp definefont pop
  940. X   }ifelse
  941. X}forall
  942. X%Make any other special fonts here, i.e. Seattle
  943. X/_--C-2Symbol /Symbol findfont /tmp 1 index maxlength 1 add dict def cf tmp /PaintType 1 put tmp definefont
  944. X/|----4Seattle /Helvetica findfont dup length 1 add dict /tmp xdf cf mv
  945. X/mxv [/zero /one /two /three /four /five /six /seven /eight /nine /comma /period /dollar /numbersign
  946. X/percent /plus /hyphen /E /parenleft /parenright /space] def
  947. Xtmp /Metrics 21 dict dup begin mxv{600 def}forall end put
  948. Xtmp begin /FontBBox FontBBox [0 0 0 0] astore def end
  949. Xtmp definefont pop
  950. X% open document, open page and close page procedures
  951. X% close document doesn't do anything currently
  952. X% txpose takes the vertical page size as a parameter
  953. X/od{txpose 10 fz 0 fs F /|----3Courier fnt pop}def
  954. X/op{/scaleflag false def /pm save def}def
  955. X/cp{pm restore}def
  956. Xend
  957. X%
  958. X% Add a pop to clean up the stack.  A dictionary is left behind... (jjs)
  959. X%
  960. Xpop
  961. X
  962. @//E*O*F doc/figs/mac.pro//
  963. if test 25623 -ne "`wc -c <'doc/figs/mac.pro'`"; then
  964.     echo shar: error transmitting "'doc/figs/mac.pro'" '(should have been 25623 characters)'
  965. fi
  966. chmod +x 'doc/figs/mac.pro'
  967. fi # end of overwriting check
  968. echo shar: extracting "'doc/figs/pathtext.ps'" '(8455 characters)'
  969. if test -f 'doc/figs/pathtext.ps' ; then 
  970.   echo shar: will not over-write existing file "'doc/figs/pathtext.ps'"
  971. else
  972. sed 's/^X//' >doc/figs/pathtext.ps <<'@//E*O*F doc/figs/pathtext.ps//'
  973. X%!
  974. X%%BoundingBox: 146 359 356 554
  975. X% Cookbook Example Program from First Printing, Revised 7 Jan 1985
  976. X% Program: Placing Text Along an Arbitrary Path     Number: 17
  977. X%-----------------------------------------------------------------------------
  978. X%
  979. X/pathtextdict 26 dict def                   % Local storage for the procedure
  980. X                        % ``pathtext.''
  981. X                               
  982. X/pathtext                                   % ``pathtext'' will place a string
  983. X  { pathtextdict begin                      % of text along any path. It takes
  984. X    /offset exch def                        % a string and starting offset
  985. X    /str exch def                           % distance from the beginning of
  986. X                        % the path as its arguments. Note
  987. X                        % that ``pathtext'' assumes that a
  988. X                        % path has already been defined
  989. X                        % and after it places the text
  990. X                        % along the path, it clears the
  991. X                        % current path like the ``stroke''
  992. X                        % and ``fill'' operators; it also
  993. X                        % assumes that a font has been
  994. X                        % set. ``pathtext'' begins placing
  995. X                        % the characters along the current
  996. X                        % path, starting at the offset
  997. X                        % distance and continuing until
  998. X                        % either the path length is
  999. X                        % exhausted or the entire string
  1000. X                        % has been printed, whichever
  1001. X                        % occurs first. The results will
  1002. X                        % be more effective when a small
  1003. X                        % point size font is used with
  1004. X                        % sharp curves in the path.
  1005. X                                       
  1006. X    /pathdist 0 def                         % Initialize the distance we have
  1007. X                        % travelled along the path.
  1008. X    /setdist offset def                     % Initialize the distance we have
  1009. X                        % covered by setting characters.
  1010. X    /charcount 0 def                        % Initialize the character count.
  1011. X    gsave
  1012. X      flattenpath                           % Reduce the path to a series of
  1013. X                        % straight line segments. The
  1014. X                        % characters will be placed along
  1015. X                        % the line segments in the
  1016. X                        % ``linetoproc.''
  1017. X      {movetoproc} {linetoproc}             % The basic strategy is to process
  1018. X    {curvetoproc} {closepathproc}       % the segments of the path,
  1019. X    pathforall                          % keeping a running total of the
  1020. X                        % distance we have travelled so
  1021. X                        % far (pathdist). We also keep
  1022. X                        % track of the distance taken up
  1023. X                        % by the characters that have been
  1024. X                        % set so far (setdist). When the
  1025. X                        % distance we have travelled along
  1026. X                        % the path is greater than the
  1027. X                        % distance taken up by the set
  1028. X                        % characters, we are ready to set
  1029. X                        % the next character (if there are
  1030. X                        % any left to be set). This
  1031. X                        % process continues until we have
  1032. X                        % exhausted the full length of the
  1033. X                        % path.
  1034. X    grestore
  1035. X    newpath                                 % Clear the current path.
  1036. X    end
  1037. X  } def
  1038. X       
  1039. Xpathtextdict begin
  1040. X/movetoproc                                 % ``movetoproc'' is executed when
  1041. X  { /newy exch def /newx exch def           % a moveto component has been
  1042. X                        % encountered in the pathforall
  1043. X                        % operation.
  1044. X    /firstx newx def /firsty newy def       % Remember the ``first point'' in
  1045. X                        % the path so that when we get a
  1046. X                        % ``closepath'' component we can
  1047. X                        % properly handle the text.
  1048. X    /ovr 0 def
  1049. X    newx newy transform
  1050. X    /cpy exch def /cpx exch def             % Explicitly keep track of the
  1051. X                        % current position in device
  1052. X                        % space.
  1053. X  } def
  1054. X       
  1055. X/linetoproc                                 % ``linetoproc'' is executed when
  1056. X                        % a lineto component has been
  1057. X                        % encountered in the pathforall
  1058. X                        % operation.
  1059. X  { /oldx newx def /oldy newy def           % Update the old point.
  1060. X    /newy exch def /newx exch def           % Get the new point.
  1061. X    /dx newx oldx sub def
  1062. X    /dy newy oldy sub def
  1063. X    /dist dx dup mul dy dup mul add         % Calculate the distance between
  1064. X                        % the old and the new point.
  1065. X      sqrt def
  1066. X    /dsx dx dist div ovr mul def            % dsx and dsy are used to update
  1067. X    /dsy dy dist div ovr mul def            % the current position to be just
  1068. X                        % beyond the width of the previous
  1069. X                        % character.
  1070. X    oldx dsx add oldy dsy add transform
  1071. X    /cpy exch def /cpx exch def             % Update the current position.
  1072. X    /pathdist pathdist dist add def         % Increment the distance we have
  1073. X                        % travelled along the path.
  1074. X    { setdist pathdist le                   % Keep setting characters along
  1075. X                        % this path segment until we have
  1076. X                        % exhausted its length.
  1077. X    { charcount str length lt           % As long as there are still
  1078. X        {setchar} {exit} ifelse }       % characters left in the string,
  1079. X                        % set them.
  1080. X    { /ovr setdist pathdist sub def     % Keep track of how much we have
  1081. X      exit }                            % overshot the path segment by
  1082. X    ifelse                              % setting the previous character.
  1083. X                        % This enables us to position the
  1084. X                        % origin of the following
  1085. X                        % characters properly on the path.
  1086. X    } loop
  1087. X  } def
  1088. X       
  1089. X/curvetoproc                                % ``curvetoproc'' is executed when
  1090. X  { (ERROR: No curveto's after flattenpath!)% a curveto component has been
  1091. X    print                                   % encountered in the pathforall
  1092. X  } def                                     % operation. It prints an error
  1093. X                        % message since there shouldn't be
  1094. X                        % any curveto's in a path after
  1095. X                        % the flattenpath operator has
  1096. X                        % been executed.
  1097. X                                
  1098. X/closepathproc                              % ``closepathproc'' is executed
  1099. X  { firstx firsty linetoproc                % when a closepath component has
  1100. X    firstx firsty movetoproc                % been encountered in the
  1101. X  } def                                     % pathforall operation. It
  1102. X                        % simulates the action of the
  1103. X                        % operator ``closepath'' by
  1104. X                        % executing ``linetoproc'' with
  1105. X                        % the coordinates of the most
  1106. X                        % recent ``moveto'' and then
  1107. X                        % executing ``movetoproc'' to the
  1108. X                        % same point.
  1109. X                             
  1110. X/setchar                                    % ``setchar'' sets the next
  1111. X  { /char str charcount 1 getinterval def   % character in the string along
  1112. X                        % the path and then updates the
  1113. X                        % amount of path we have
  1114. X                        % exhausted.
  1115. X    /charcount charcount 1 add def          % Increment the character count.
  1116. X    /charwidth char stringwidth pop def     % Find the width of the character.
  1117. X    gsave
  1118. X      cpx cpy itransform translate          % Translate to the current
  1119. X                        % position in user space.
  1120. X      dy dx atan rotate                     % Rotate the x-axis to coincide
  1121. X                        % with the current segment.
  1122. X      0 0 moveto char show
  1123. X      currentpoint transform
  1124. X      /cpy exch def /cpx exch def           % Update the current position
  1125. X    grestore                                % before we restore ourselves to
  1126. X                        % the untransformed state.
  1127. X    /setdist setdist charwidth add def      % Increment the distance we have
  1128. X  } def                                     % covered by setting characters.
  1129. Xend
  1130. X
  1131. X
  1132. X   
  1133. X/Helvetica findfont 11.5 scalefont setfont  % Set up the font we wish to use.
  1134. X                                         
  1135. Xnewpath                                     % Define the path along which we
  1136. X                        % wish to place the text.
  1137. X  200 500 50 0 270 arc
  1138. X  200 80 add 500 50 270 180 arc
  1139. X                   
  1140. X(If my film makes one more person feel\
  1141. X miserable I'll feel I've done my job.\
  1142. X -- WOODY ALLEN) 40 pathtext                % Print the string along the path
  1143. X                        % at an offset of 40 points.
  1144. X                                    
  1145. Xnewpath                                     % Draw an outline shape suggestive
  1146. X                        % of a movie camera.
  1147. X  165 360 moveto 315 360 lineto             % Draw the box part.
  1148. X  315 430 lineto 165 430 lineto
  1149. X  closepath
  1150. X  315 390 moveto 355 375 lineto             % Draw the lens part.
  1151. X  355 415 lineto 315 400 lineto
  1152. X1.5 setlinewidth stroke
  1153. X               
  1154. X                        % A PROBLEM FOR THE READER: This
  1155. X                        % algorithm places characters
  1156. X                        % along the path according to the
  1157. X                        % origin of each character.
  1158. X                        % Rewrite the algorithm so that
  1159. X                        % the characters are placed
  1160. X                        % according to the center of their
  1161. X                        % width. This will yield better
  1162. X                        % results around sharp curves and
  1163. X                        % when larger point sizes are
  1164. X                        % used.
  1165. Xshowpage
  1166. @//E*O*F doc/figs/pathtext.ps//
  1167. if test 8455 -ne "`wc -c <'doc/figs/pathtext.ps'`"; then
  1168.     echo shar: error transmitting "'doc/figs/pathtext.ps'" '(should have been 8455 characters)'
  1169. fi
  1170. fi # end of overwriting check
  1171. echo shar: extracting "'doc/figs/piechart.ps'" '(7247 characters)'
  1172. if test -f 'doc/figs/piechart.ps' ; then 
  1173.   echo shar: will not over-write existing file "'doc/figs/piechart.ps'"
  1174. else
  1175. sed 's/^X//' >doc/figs/piechart.ps <<'@//E*O*F doc/figs/piechart.ps//'
  1176. X%!
  1177. X%%BoundingBox: 126 246 486 546
  1178. X% Cookbook Example Program from First Printing, Revised 7 Jan 1985
  1179. X% Program: Drawing a Pie Chart     Number: 18
  1180. X%-----------------------------------------------------------------------------
  1181. X%
  1182. X/PieDict 24 dict def                        % Local storage for
  1183. X                        % ``DrawPieChart'' and its related
  1184. X                        % procedures.
  1185. XPieDict begin
  1186. X  /DrawSlice                                % DrawSlice draws an outlined and
  1187. X    { /grayshade exch def                   % filled-in pie slice. It takes
  1188. X      /endangle exch def                    % four operands: the label for
  1189. X      /startangle exch def                  % this particular pie slice, the
  1190. X      /thelabel exch def                    % starting angle for the slice,
  1191. X                        % the ending angle for the slice
  1192. X                        % and the shade of gray the slice
  1193. X                        % should be.
  1194. X                            
  1195. X      newpath                               % Create a path which will draw a
  1196. X                        % pie slice.
  1197. X    0 0 moveto
  1198. X    0 0 radius startangle endangle arc
  1199. X      closepath
  1200. X           
  1201. X      1.415 setmiterlimit                   % This guarantees that when we
  1202. X                        % outline the pie slices with a
  1203. X                        % stroke that we will not get a
  1204. X                        % spike on the interior angles.
  1205. X      gsave grayshade setgray fill grestore % Fill the pie slice path with the
  1206. X      stroke                                % appropriate gray color. By using
  1207. X                        % gsave and grestore we don't lose
  1208. X                        % the current path. Since
  1209. X                        % PostScript paints color onto the
  1210. X                        % page, it is very important that
  1211. X                        % we fill the pie slice first and
  1212. X                        % then outline it with a stroke.
  1213. X      gsave                                 % Draw the tick mark and place the
  1214. X                        % label:
  1215. X    startangle endangle add 2 div       % Find the center of the pie slice
  1216. X      rotate                            % and rotate so that the x-axis
  1217. X                        % coincides with this center.
  1218. X    radius 0 translate                  % Translate the origin out to the
  1219. X                        % circumference.
  1220. X    newpath
  1221. X      0 0 moveto labelps .8 mul 0 lineto% Draw the tick-mark.
  1222. X    stroke
  1223. X    labelps 0 translate                 % Move the origin out a little
  1224. X                        % beyond the circumference.
  1225. X    0 0 transform                       % Next we wish to place the label
  1226. X      grestore                              % at the current origin. If we
  1227. X      itransform                            % simply draw the text on the page
  1228. X      /y exch def /x exch def               % now, it would come out rotated.
  1229. X      x y moveto                            % Since this is not desired we
  1230. X                        % avoid it by returning to the
  1231. X                        % previous unrotated coordinate
  1232. X                        % system. Before returning,
  1233. X                        % though, we would like to
  1234. X      x 0 lt                                % remember the position of the
  1235. X    { thelabel stringwidth pop neg      % current origin on the printed
  1236. X        0 rmoveto                       % page. We will accomplish this by
  1237. X    } if                                % using the transform and
  1238. X                        % itransform operators. Performing
  1239. X                        % a transform on the origin pushes
  1240. X                        % the coordinates of the origin in
  1241. X                        % device space onto the operand
  1242. X                        % stack. Performing a grestore
  1243. X                        % returns us to the previous
  1244. X                        % unrotated coordinate system.
  1245. X                        % Next we perform an itransform on
  1246. X                        % the two device coordinates left
  1247. X                        % on the stack to determine where
  1248. X                        % we are in the current coordinate
  1249. X                        % system.
  1250. X      y 0 lt { 0 labelps neg rmoveto } if   % Make some adjustments so that
  1251. X      thelabel show                         % the label text won't collide
  1252. X    } def                                   % with the pie slice.
  1253. X  /findgray                                 % Procedure findgray calculates
  1254. X    { /i exch def /n exch def               % the gray value for a slice. It
  1255. X      i 2 mod 0 eq                          % takes two arguments: the total
  1256. X    { i 2 div n 2 div round add n div } % number of slices and the current
  1257. X    { i 1 add 2 div n div }             % slice number (Given that there
  1258. X    ifelse                              % are n pie slices, the slices are
  1259. X    } def                                   % ``numbered'' from 1 to n). The
  1260. Xend                                         % gray values for the pie slices
  1261. X                        % range evenly from white to black
  1262. X                        % (i.e. - the values provided to
  1263. X                        % setgray range from (n/n, n-1/n,
  1264. X                        % ..., 1/n)). Since we don't want
  1265. X                        % similar values of gray next to
  1266. X                        % each other, findgray
  1267. X                        % ``shuffles'' the possible
  1268. X                        % combinations of gray.
  1269. X                                   
  1270. X/DrawPieChart                               % DrawPieChart takes seven
  1271. X  { PieDict begin                           % arguments: the title of the pie
  1272. X      /radius exch def                      % chart, the point size to print
  1273. X      /ycenter exch def /xcenter exch def   % the title in, the point size to
  1274. X      /PieArray exch def                    % print the labels for each slice
  1275. X      /labelps exch def /titleps exch def   % in, a special array (described
  1276. X      /title exch def                       % below where DrawPieChart is
  1277. X                        % called), the (x,y) center of the
  1278. X                        % pie chart and the radius of the
  1279. X                        % pie chart.
  1280. X                            
  1281. X      gsave
  1282. X    xcenter ycenter translate           % Translate the coordinate system
  1283. X                        % origin to center of pie chart.
  1284. X    /Helvetica findfont titleps         % Print the title of the pie chart
  1285. X      scalefont setfont                 % in Helvetica.
  1286. X    title stringwidth pop 2 div neg     % Center the title below the pie
  1287. X                        % chart.
  1288. X      radius neg titleps 3 mul sub
  1289. X      moveto title show
  1290. X    /Helvetica findfont labelps         % Print the individual pie slice
  1291. X      scalefont setfont                 % labels in Helvetica
  1292. X    /numslices PieArray length def
  1293. X    /slicecnt 0 def
  1294. X    /curangle 0 def                     % A ``loop'' variable that keeps
  1295. X                        % track of the angle of arc to
  1296. X                        % begin each pie slice at.
  1297. X    PieArray                            % Repeat the following for each
  1298. X                        % element in the PieArray.
  1299. X      { /slicearray exch def
  1300. X        slicearray aload pop            % Push the label and percentage
  1301. X                        % onto the stack.
  1302. X        /percent exch def
  1303. X        /label exch def
  1304. X        /perangle percent 360 mul def   % Convert the percentage into
  1305. X                        % degrees of angle.
  1306. X        /slicecnt slicecnt 1 add def
  1307. X        label curangle
  1308. X          curangle perangle add
  1309. X          numslices slicecnt findgray
  1310. X          DrawSlice
  1311. X        /curangle curangle perangle add % Update the current starting
  1312. X                        % angle.
  1313. X          def
  1314. X      } forall
  1315. X      grestore
  1316. X    end
  1317. X  } def
  1318. X       
  1319. X() 18 9
  1320. X  [ [(Blueberry) .12 ]                      % The pie array is an array of
  1321. X    [(Cherry) .30 ]                         % arrays. Each array in the pie
  1322. X    [(Apple) .26 ]                          % array contains a string denoting
  1323. X    [(Boston Cream) .16 ]                   % the label to be printed next to
  1324. X    [(Other) .04 ]                          % the pie slice followed by a real
  1325. X    [(Vanilla Cream) .12 ]                  % number indicating the percentage
  1326. X  ] 306 396 100 DrawPieChart                % of the pie represented by this
  1327. X                        % particular slice.
  1328. Xshowpage
  1329. X
  1330. @//E*O*F doc/figs/piechart.ps//
  1331. if test 7247 -ne "`wc -c <'doc/figs/piechart.ps'`"; then
  1332.     echo shar: error transmitting "'doc/figs/piechart.ps'" '(should have been 7247 characters)'
  1333. fi
  1334. fi # end of overwriting check
  1335. echo shar: extracting "'doc/figs/trianglev.ps'" '(262 characters)'
  1336. if test -f 'doc/figs/trianglev.ps' ; then 
  1337.   echo shar: will not over-write existing file "'doc/figs/trianglev.ps'"
  1338. else
  1339. sed 's/^X//' >doc/figs/trianglev.ps <<'@//E*O*F doc/figs/trianglev.ps//'
  1340. X%!
  1341. X%%BoundingBox: 20 20 160 160
  1342. Xnewpath
  1343. X50 50 moveto
  1344. X150 50 lineto
  1345. X100 150 lineto
  1346. Xclosepath stroke
  1347. X/Times-Roman findfont 10 scalefont setfont
  1348. X45 55 moveto (a) show 
  1349. X155 55 moveto (b) show 
  1350. X95 155 moveto (c) show 
  1351. X60 35 moveto 
  1352. X(The Triangle ABC) show 
  1353. Xshowpage
  1354. X
  1355. @//E*O*F doc/figs/trianglev.ps//
  1356. if test 262 -ne "`wc -c <'doc/figs/trianglev.ps'`"; then
  1357.     echo shar: error transmitting "'doc/figs/trianglev.ps'" '(should have been 262 characters)'
  1358. fi
  1359. fi # end of overwriting check
  1360. echo shar: extracting "'doc/figs/zip.ps'" '(239 characters)'
  1361. if test -f 'doc/figs/zip.ps' ; then 
  1362.   echo shar: will not over-write existing file "'doc/figs/zip.ps'"
  1363. else
  1364. sed 's/^X//' >doc/figs/zip.ps <<'@//E*O*F doc/figs/zip.ps//'
  1365. X%!
  1366. X%%BoundingBox: 301.0 392.44 360.02 437.4
  1367. X/Times-Italic findfont 30 scalefont setfont
  1368. X
  1369. X/printZip {
  1370. X    0 0 moveto
  1371. X    (Zip) show
  1372. X} def
  1373. X320 400 translate 
  1374. X
  1375. X.95 -.05 0 {
  1376. X    setgray
  1377. X    printZip
  1378. X    -1 .5 translate 
  1379. X} for
  1380. X
  1381. X1 setgray printZip
  1382. X
  1383. X
  1384. Xshowpage
  1385. X
  1386. @//E*O*F doc/figs/zip.ps//
  1387. if test 239 -ne "`wc -c <'doc/figs/zip.ps'`"; then
  1388.     echo shar: error transmitting "'doc/figs/zip.ps'" '(should have been 239 characters)'
  1389. fi
  1390. fi # end of overwriting check
  1391. echo shar: extracting "'man/psfigtex.l'" '(2767 characters)'
  1392. if test -f 'man/psfigtex.l' ; then 
  1393.   echo shar: will not over-write existing file "'man/psfigtex.l'"
  1394. else
  1395. sed 's/^X//' >man/psfigtex.l <<'@//E*O*F man/psfigtex.l//'
  1396. X.TH PSFIGTEX LOCAL
  1397. X.SH NAME
  1398. XpsfigTeX \- PostScript figures in TeX
  1399. X.SH SYNTAX
  1400. X\\input
  1401. X.B psfig
  1402. X.SH DESCRIPTION
  1403. X.I psfigTeX
  1404. Xis a package that allows easy inclusion of arbitrary PostScript code
  1405. Xinto a TeX document.
  1406. XFigures are automatically scaled and translated, and the correct amount
  1407. Xof space is reserved so nothing conflicts with other text on the page.
  1408. XThe 
  1409. X.I dvips
  1410. Xpostprocessor must be used to create the final PostScript output.
  1411. X.PP
  1412. X.SH USAGE
  1413. XTo include a postscript file, invoke the psfig macro ``\\psfig{figure=fig.ps}'',
  1414. Xwhere ``fig.ps'' is the name of a PostScript file. 
  1415. XOptions may be specified in the form ``\\psfig{figure=fig.ps,opt=val,opt=val...}'';
  1416. Xrecognized options include height, width, prolog, and postlog. If a 
  1417. Xheight but not a width is given or vice-versa, the figure will
  1418. Xbe scaled equally in both dimensions; if niether is given, the figure's
  1419. X``natural'' size will be used.
  1420. X.PP
  1421. XFor 
  1422. X.I psfig
  1423. Xto properly scale and move a figure, it must be able to tell what 
  1424. Xit's natural size and position on the page are. This is usually specified by
  1425. Xthe bounding box comment in the PostScript file. Unfortunately, some 
  1426. Xapplications (including MacDraw) do not provide this information. 
  1427. XIf your figure doesn't have a bounding box comment (a line starting with
  1428. X%%BoundingBox:), it cannot be used by psfigtex. The bbfig utility can
  1429. Xcalculate the bounding box of a file (so can a ruler). See the bbfig(l)
  1430. Xmanual page for information on the correct format of the comment. Usually
  1431. Xthe bounding box comment is the second line of the file.
  1432. X.SH "MACINTOSH FIGURES"
  1433. XMacintosh figures require a prolog file to be downloaded containing 
  1434. XPostScript procedure definitions. Use the option
  1435. X``prolog=/usr/lib/ps/mac.pro'' to achieve this. See the psfigtex paper for
  1436. Xmore detailed information, especially if there are many mac figures.
  1437. X.SH "DRAFT MODE"
  1438. X.PP
  1439. XIf a figure is very expensive to print (say a 100K image) it can be set in
  1440. Xdraft mode, printing just the name of the file. The macro \\psdraft switches
  1441. Xinto draft mode and \\psfull returns to full mode. Use of draft mode is
  1442. Xhighly encouraged.
  1443. X.SH "BUGS"
  1444. X.LP
  1445. XThe ``\\psfig{...}'' command must be entirely on one input line, and no
  1446. Xextra spaces may appear in the option list.
  1447. X.LP
  1448. XWhen a ``\\psfig'' command is used alone in a centering enviornment, it must
  1449. Xbe preceded by a hard space ``\\\ ''. This may be a LaTeX bug.
  1450. X.LP
  1451. XOn very large documents, the laserwriter has been known to run out of memory
  1452. Xand only print a portion of the document. Use the printer memorysize command
  1453. Xto dvips to limit the amount of memory dvips thinks it can use.
  1454. X.SH AUTHOR
  1455. XTrevor Darrell
  1456. X.SH "SEE ALSO"
  1457. XTeX(1), dvips(1), LaTeX(1)
  1458. X.br
  1459. XDVILASER user's manual
  1460. X.br
  1461. XT. Darrell,
  1462. X.ul
  1463. XIncorporating PostScript and Macintosh figures in TeX
  1464. X.br
  1465. X
  1466. @//E*O*F man/psfigtex.l//
  1467. if test 2767 -ne "`wc -c <'man/psfigtex.l'`"; then
  1468.     echo shar: error transmitting "'man/psfigtex.l'" '(should have been 2767 characters)'
  1469. fi
  1470. fi # end of overwriting check
  1471. echo shar: extracting "'man/psfigtex.out'" '(3240 characters)'
  1472. if test -f 'man/psfigtex.out' ; then 
  1473.   echo shar: will not over-write existing file "'man/psfigtex.out'"
  1474. else
  1475. sed 's/^X//' >man/psfigtex.out <<'@//E*O*F man/psfigtex.out//'
  1476. X
  1477. X
  1478. X
  1479. X                                                  psfigtex(local)
  1480. X
  1481. X
  1482. X
  1483. XNAME
  1484. X     psfigTeX - PostScript figures in TeX
  1485. X
  1486. XSYNTAX
  1487. X     \input psfig
  1488. X
  1489. XDESCRIPTION
  1490. X     _p_s_f_i_g_T_e_X is a package that allows easy inclusion of arbi-
  1491. X     trary PostScript code into a TeX document.  Figures are
  1492. X     automatically scaled and translated, and the correct amount
  1493. X     of space is reserved so nothing conflicts with other text on
  1494. X     the page.  The _d_v_i_p_s postprocessor must be used to create
  1495. X     the final PostScript output.
  1496. X
  1497. XUSAGE
  1498. X     To include a postscript file, invoke the psfig macro
  1499. X     ``\psfig{figure=fig.ps}'', where ``fig.ps'' is the name of a
  1500. X     PostScript file. Options may be specified in the form
  1501. X     ``\psfig{figure=fig.ps,opt=val,opt=val...}''; recognized
  1502. X     options include height, width, prolog, and postlog. If a
  1503. X     height but not a width is given or vice-versa, the figure
  1504. X     will be scaled equally in both dimensions; if niether is
  1505. X     given, the figure's ``natural'' size will be used.
  1506. X
  1507. X     For _p_s_f_i_g to properly scale and move a figure, it must be
  1508. X     able to tell what it's natural size and position on the page
  1509. X     are. This is usually specified by the bounding box comment
  1510. X     in the PostScript file. Unfortunately, some applications
  1511. X     (including MacDraw) do not provide this information. If your
  1512. X     figure doesn't have a bounding box comment (a line starting
  1513. X     with %%BoundingBox:), it cannot be used by psfigtex. The
  1514. X     bbfig utility can calculate the bounding box of a file (so
  1515. X     can a ruler). See the bbfig(l) manual page for information
  1516. X     on the correct format of the comment. Usually the bounding
  1517. X     box comment is the second line of the file.
  1518. X
  1519. XMACINTOSH FIGURES
  1520. X     Macintosh figures require a prolog file to be downloaded
  1521. X     containing PostScript procedure definitions. Use the option
  1522. X     ``prolog=/usr/lib/ps/mac.pro'' to achieve this. See the
  1523. X     psfigtex paper for more detailed information, especially if
  1524. X     there are many mac figures.
  1525. X
  1526. XDRAFT MODE
  1527. X     If a figure is very expensive to print (say a 100K image) it
  1528. X     can be set in draft mode, printing just the name of the
  1529. X     file. The macro \psdraft switches into draft mode and
  1530. X     \psfull returns to full mode. Use of draft mode is highly
  1531. X     encouraged.
  1532. X
  1533. XBUGS
  1534. X
  1535. X
  1536. X
  1537. X
  1538. X                                                                1
  1539. X
  1540. X
  1541. X
  1542. X
  1543. X
  1544. X
  1545. Xpsfigtex(local)
  1546. X
  1547. X
  1548. X
  1549. X     The ``\psfig{...}'' command must be entirely on one input
  1550. X     line, and no extra spaces may appear in the option list.
  1551. X
  1552. X     When a ``\psfig'' command is used alone in a centering
  1553. X     enviornment, it must be preceded by a hard space ``\ ''.
  1554. X     This may be a LaTeX bug.
  1555. X
  1556. X     On very large documents, the laserwriter has been known to
  1557. X     run out of memory and only print a portion of the document.
  1558. X     Use the printer memorysize command to dvips to limit the
  1559. X     amount of memory dvips thinks it can use.
  1560. X
  1561. XAUTHOR
  1562. X     Trevor Darrell
  1563. X
  1564. XSEE ALSO
  1565. X     TeX(1), dvips(1), LaTeX(1)
  1566. X     DVILASER user's manual
  1567. X     T. Darrell, _I_n_c_o_r_p_o_r_a_t_i_n_g _P_o_s_t_S_c_r_i_p_t _a_n_d _M_a_c_i_n_t_o_s_h _f_i_g_u_r_e_s
  1568. X     _i_n _T_e_X
  1569. X
  1570. X
  1571. X
  1572. X
  1573. X
  1574. X
  1575. X
  1576. X
  1577. X
  1578. X
  1579. X
  1580. X
  1581. X
  1582. X
  1583. X
  1584. X
  1585. X
  1586. X
  1587. X
  1588. X
  1589. X
  1590. X
  1591. X
  1592. X
  1593. X
  1594. X
  1595. X
  1596. X
  1597. X
  1598. X
  1599. X
  1600. X
  1601. X
  1602. X
  1603. X
  1604. X2
  1605. X
  1606. X
  1607. X
  1608. @//E*O*F man/psfigtex.out//
  1609. echo shar: 65 control characters may be missing from "'man/psfigtex.out'"
  1610. if test 3240 -ne "`wc -c <'man/psfigtex.out'`"; then
  1611.     echo shar: error transmitting "'man/psfigtex.out'" '(should have been 3240 characters)'
  1612. fi
  1613. fi # end of overwriting check
  1614. echo shar: extracting "'src/README'" '(459 characters)'
  1615. if test -f 'src/README' ; then 
  1616.   echo shar: will not over-write existing file "'src/README'"
  1617. else
  1618. sed 's/^X//' >src/README <<'@//E*O*F src/README//'
  1619. Xpsfig.tex :
  1620. X    the tex macros that are the backbone of psfig/tex.
  1621. X    they should be included at the beginning of any
  1622. X    document that intends to use psfig/tex
  1623. X
  1624. Xfigtex.pro :
  1625. X    the postscript support for psfig.tex. Here at upenn,
  1626. X    we have inserted this into the dvips prolog, so it
  1627. X    need not be included explicitly. If it is not included
  1628. X    in the dvips prolog, it must be included with a 
  1629. X    \psfiginit after \input{psfig}, and page-reversing
  1630. X    will cause complications.
  1631. X
  1632. @//E*O*F src/README//
  1633. if test 459 -ne "`wc -c <'src/README'`"; then
  1634.     echo shar: error transmitting "'src/README'" '(should have been 459 characters)'
  1635. fi
  1636. fi # end of overwriting check
  1637. echo shar: extracting "'src/figtex.pro'" '(1743 characters)'
  1638. if test -f 'src/figtex.pro' ; then 
  1639.   echo shar: will not over-write existing file "'src/figtex.pro'"
  1640. else
  1641. sed 's/^X//' >src/figtex.pro <<'@//E*O*F src/figtex.pro//'
  1642. X%!
  1643. X% All software, documentation, and related files in this distribution of
  1644. X% psfig/tex are Copyright (c) 1987 Trevor J. Darrell
  1645. X%
  1646. X% Permission is granted for use and non-profit distribution of psfig/tex 
  1647. X% providing that this notice be clearly maintained, but the right to
  1648. X% distribute any portion of psfig/tex for profit or as part of any commercial
  1649. X% product is specifically reserved for the author.
  1650. X%
  1651. X%
  1652. X% psfigTeX PostScript Prolog
  1653. X% $Header: figtex.pro,v 1.3 87/01/19 00:56:36 trevor Exp $
  1654. X%
  1655. X/TeXscale { 65536 div } def
  1656. X
  1657. X/startTexFig {
  1658. X% usage :  x y bb-llx bb-lly bb-urx bb-ury startFig
  1659. X    /SavedState save def
  1660. X    userdict maxlength dict begin
  1661. X    currentpoint transform
  1662. X    initgraphics
  1663. X    itransform moveto
  1664. X
  1665. X    /ury exch TeXscale def
  1666. X    /urx exch TeXscale def
  1667. X    /lly exch TeXscale def
  1668. X    /llx exch TeXscale def
  1669. X    /y exch TeXscale def
  1670. X    /x exch TeXscale def
  1671. X    
  1672. X    currentpoint /cy exch def /cx exch def
  1673. X
  1674. X    /sx x urx llx sub div def     % scaling for x
  1675. X    /sy y ury lly sub div def    % scaling for y
  1676. X
  1677. X    sx sy scale            % scale by (sx,sy)
  1678. X
  1679. X    cx sx div llx sub
  1680. X    cy sy div ury sub translate
  1681. X    
  1682. X    /DefFigCTM matrix currentmatrix def
  1683. X    /initmatrix {
  1684. X        DefFigCTM setmatrix
  1685. X    } def
  1686. X    /defaultmatrix {
  1687. X        DefFigCTM exch copy
  1688. X    } def
  1689. X    /exval {
  1690. X        load dup
  1691. X        dup xcheck exch
  1692. X        type /arraytype eq and {
  1693. X            aload pop
  1694. X        } if
  1695. X    } def
  1696. X    /initgraphics [
  1697. X        /initgraphics exval
  1698. X        DefFigCTM /setmatrix exval
  1699. X    ] cvx def
  1700. X
  1701. X    /showpage {
  1702. X        initgraphics
  1703. X    } def
  1704. X
  1705. X} def
  1706. X% Args are llx lly urx ury (in figure coordinates)
  1707. X/clipFig {
  1708. X    currentpoint 6 2 roll
  1709. X    newpath 4 copy
  1710. X    4 2 roll moveto
  1711. X    6 -1 roll exch lineto
  1712. X    exch lineto
  1713. X    exch lineto
  1714. X    closepath clip
  1715. X    moveto
  1716. X} def
  1717. X% doclip, if called, will always be just after a `startfig'
  1718. X/doclip { llx lly urx ury clipFig } def
  1719. X/endTexFig {
  1720. X    end SavedState restore
  1721. X} def
  1722. @//E*O*F src/figtex.pro//
  1723. if test 1743 -ne "`wc -c <'src/figtex.pro'`"; then
  1724.     echo shar: error transmitting "'src/figtex.pro'" '(should have been 1743 characters)'
  1725. fi
  1726. fi # end of overwriting check
  1727. echo shar: "End of archive 2 (of 3)."
  1728. cp /dev/null ark2isdone
  1729. DONE=true
  1730. for I in 1 2 3; do
  1731.     if test -! f ark${I}isdone; then
  1732.         echo "You still need to run archive ${I}."
  1733.         DONE=false
  1734.     fi
  1735. done
  1736. case $DONE in
  1737.     true)
  1738.         echo "You have run all 3 archives."
  1739.         echo 'See the README'
  1740.         ;;
  1741. esac
  1742. ##  End of shell archive.
  1743. exit 0
  1744.