home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / pctchnqs / 1991 / number5 / gonzo13a.ptl < prev    next >
Text File  |  1991-09-27  |  44KB  |  1,057 lines

  1.  
  2.         
  3. % ************************************************************************
  4. % ************************************************************************
  5.  
  6. % GONZO 13 JUSTIFICATION POWER TOOL
  7.  
  8. % ************************************************************************
  9. %
  10. % SUMMARY: Exceptionally high quality, fully device independent, and ultra
  11. %          fast (but non-WYSIWYG) Don Lancaster text justification routines.
  12. %
  13. %          Includes auto drop caps, hanging punctuation, global kerning,
  14. %          supertabs, callout modes, overstrikes, menu justify, scads more.
  15. %
  16. %          A Distillery-compatible compiling option is included for 
  17. %          unbelievably fast makeready times. Gonzo can also dump
  18. %          plain old ASCII text and can custom emulate nearly anything.
  19. %
  20. %          Gonzo 13 is fully open, unlocked, documented, and reprogrammable.
  21. %
  22. %          Reprinted from Don Lancaster's POSTSCRIPT BEGINNER STUFF.
  23. %
  24. %          Copyright c 1991 by Don Lancaster. All rights fully reserved.
  25. %          Free help line and additional info: (602) 428-4073.
  26. %
  27. % ************************************************************************
  28.       
  29. % Name of textfile: GONZO13A.PTL
  30. % Source:           SYNERGETICS
  31. % Author:           Don Lancaster
  32. % Desc:             Superb quality text justification
  33. % Date:             October 15, 1990
  34. % Release:          13.5.16 (GEnie alpha "A" release)
  35. % Approx length:    46K
  36. % Status:           Copyright 1990 by Don Lancaster and Synergetics.
  37. %                   3860 West First Street, Thatcher, AZ. (602) 428-4073.
  38. %                   All commercial rights reserved. Personal use permitted
  39. %                   so long as this status message stays present and intact.
  40. %                   Gonzo POSTSCRIPT BEGINNER STUFF package $39.50 VISA/MC.
  41. %
  42. % Keywords:         PostScript, gonzo, justification, compile, text
  43.  
  44. % Approximate NTX run time:   2.50 seconds per 1000 chars (uncompiled)
  45. %                             0.33 seconds per 1000 chars (compiled)
  46.  
  47. %     X E     Activate XON/XOFF if necessary.
  48. %     Z       Values are shown for Apple Super Serial Card
  49.  
  50.  
  51. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  52.  
  53. % WARNING: This is the GEnie "alpha" release. The compile, supertab,
  54. %          and menu justify features are not yet all there.
  55. %
  56. %          KEEP A WRITTEN USER LOG AND EXPECT PROBLEMS.
  57. %
  58. %          Report problems, corrections, questions, etc, to PSRT.
  59. %
  60. %          For further documentation, see PSRT #220 GONZO13A.TXT.
  61.  
  62. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  63.  
  64. % GONZOJST.PTL is a series of utilities that allow ultra high quality
  65. % text justification from within a word processor or editor environment.
  66. % The routines are fast, fully programmable, use minimum length files, and
  67. % use little VM. They are purposely not WYSIWYG for maximum flexibility,
  68. % speed, and total device independence. Advanced features include auto drop
  69. % caps, hanging punctuation, individual kerning, lastline stretch, simple
  70. % textdumper, callout modes, macros, overstrike, and much more. The routines 
  71. % be used WITHOUT control characters. They can emulate nearly anything.
  72. % An internal compiler is included for extremely fast rerun times.
  73.  
  74. % Full use instructions appear in the companion file GONZO13A.TXT.
  75. % Also see the internal notes and comments below.
  76.  
  77. % Status:           Copyright 1990 by Don Lancaster and Synergetics.
  78. %                   3860 West First Street, Thatcher, AZ. (602) 428-4073.
  79. %                   All commercial rights reserved. Personal use permitted
  80. %                   so long as this status message stays present and intact.
  81. %                   Gonzo POSTSCRIPT BEGINNER STUFF package $39.50 VISA/MC.
  82.  
  83. % Decide if you want to be persistent or not ...
  84.  
  85.  
  86. /persist true def
  87. persist {serverdict begin 0 exitserver} if
  88.  
  89. % create a working dictionary that remains closed until needed ...
  90.  
  91. 1000 dict /gonzo exch def gonzo begin
  92.  
  93. % USER ALTERABLE COMMANDS - all must remain here as defaults
  94. % =======================
  95.  
  96. /altescapechar 124 def     % alternate "escape" key for commands (|)
  97. /cstretch  0.2 def         % minimum character kerning
  98. /colcheck { } def          % link to page or column maker
  99. /dropcount 3 def           % lines indented for drop cap
  100. /dropindent 40 def         % width reserved for drop cap
  101. /escapechar 27 def         % "escape" key for commands - can be printable
  102. /gonzocompile false def    % compile to host or disk flag
  103. /gonzojust true def        % allow gonzo commands? (false for text dumper)
  104. /hangflag true def         % hang center, right, or fill punctuation?  
  105. /hangfract 0.6 def         % amount that hung punctuation hangs
  106. /hostcompdelay 80 def      % optional compiling character report delay
  107. /justifylastline false def % fill justify last paragraph line?
  108. /justx (justL) def         % running justification mode
  109. /kern 1 def                % default individual kern amount
  110. /lastlinestretch 0.12 def  % stretch on last line of fill just paragraph
  111. /oktoadvance true def      % don't advance to next line if false
  112. /oktoprint true def        % print suppression flag 
  113. /overstrikechar (\320) def % overstrike character
  114. /overstrikeht 5.5 def      % vertical shift of overstrike character
  115. /pm 10 def                 % normal paragraph indent
  116. /rslashchar 92 def         % "reverse slash" key -alterable-
  117. /rslashok true def         % allow reverse slash processing?
  118. /stringmode false def      % string or currentfile source?
  119. /spacecharratio 6 def      % fill justify ratio of space to char stretch
  120. /sstretch -0.3 def         % minimum space kerning - may be negative
  121. /tabs [50 100 150 200] def % default tab list
  122. /txtwide 350 def           % width of column
  123. /txtwideadj {} def         % custom proc for keystoning, etc.
  124. /xpos 70 def               % horizontal start of text
  125. /yinc 11 def               % line spacing
  126. /ypara 0 def               % additional v space at paragraph end 
  127. /ypos 400 def              % vertical start of text
  128. /ytop 720 def              % default top reference for template
  129. /ybot -9999 def            % default bottom reference for template
  130.  
  131. % GONZOFONT BUILDER
  132. % =================
  133.  
  134. % gonzo fontnames MUST be of form /fontx, where x is any printable ASCII 
  135. % character that has also been "qualified" to be a font in the command list.
  136. % A later gonzofont command rapidly sets the font and defines the space width.
  137.  
  138. % gonzofont accepts either 
  139. %   /font1 /Helvetica 12 gonzofont         -- or else -- 
  140. %   /font1 /Helvetica [wide climb slant high xshift yshift] gonzofont  
  141.  
  142. /gonzofont {dup type cvlit /arraytype eq {exch findfont exch makefont}
  143. {exch findfont exch scalefont} ifelse setfont mark /spacewidth ( ) 
  144. stringwidth pop /cstretch cvx /add cvx /sstretch cvx /add cvx /def
  145. cvx currentfont dup backcdict exch (F?) dup  1 14 index (xxxxx) cvs
  146. 4 get put put /setfont cvx ] cvx def} def
  147.  
  148. 50 dict /backcdict exch def  % used "backwards" during compiling to get
  149.                              % fontname given the "made" font dictionary
  150.  
  151. % USER FONTS - all should remain here as defaults ...
  152. % ==========
  153.  
  154. /font0 /Helvetica-Bold [36 0 0 40 0 0] gonzofont     % for drop caps
  155.  
  156. /font1 /Helvetica 9 gonzofont                        % regular text
  157. /font2 /Helvetica-BoldOblique 9 gonzofont            % reg italic
  158. /font3 /Helvetica-Bold 9 gonzofont                   % reg bold
  159.  
  160. /font4 /Helvetica 8 gonzofont                        % reg all caps or #s 
  161. /font5 /Helvetica-BoldOblique 8 gonzofont            % italic all caps or #s
  162. /font6 /Helvetica-Bold 8 gonzofont                   % bold all caps or #s
  163.  
  164. /font7 /Helvetica-Bold [6 0 0 6 0 -2] gonzofont      % subscript
  165. /font8 /Helvetica-Bold [6 0 0 6 0 4] gonzofont       % superscript 
  166.  
  167. /font9 /Helvetica-Bold [9 0 0 9 0 4] gonzofont       % lowered bold title 
  168.  
  169. /font- /ZapfDingbats 9 gonzofont                     % Dingbats 
  170. /font= /Symbol 9 gonzofont                           % Greek & Math
  171.  
  172. /font: /Courier 9 gonzofont                          % Spare
  173. /font; /Courier 10 gonzofont                         % Spare
  174. /font+ /Courier 11 gonzofont                         % Spare
  175.  
  176.  
  177. font1  % set default
  178.  
  179. % SYSTEM CONSTANTS - not normally altered
  180. % ================
  181.  
  182. /maxcharsbeforecr 6000 def  % maximum number of characters before a cr
  183. /linestring1 maxcharsbeforecr string def % main for normal use
  184. /linestring2 maxcharsbeforecr string def % aux to allow headers
  185. /linestring linestring1 def              % default
  186. /templatestartup {} def                  % default
  187.  
  188. /maxprocsperline 200 def    % maximum number of procs per print line
  189. /printlist maxprocsperline array def
  190.  
  191. /dropflag false def         % dropcap flag
  192.  
  193. %    /exitcheck {} def           % default exit (overwritten by dump template)
  194.  
  195.       
  196.  
  197. /firstchar 0 def            % first character pointer
  198. /numspaces 0 def            % initial number of spaces in line  
  199. /pmrun 0 def                % running paragraph margin
  200. /templatestartup {} def     % link to template initializer
  201.  
  202. % stack conventions during gonzojustify: all procs must restore
  203. % top stack value = next available position in linestring
  204. % next stack value = next available position in printlist
  205.  
  206. % COMMAND LIST:
  207. % ============
  208.  
  209. % This command list determines the action of each [esc] selection.
  210. % First, create the list . . .
  211.  
  212. /commands 256 array def 0 1 255 {commands exch {} put} for
  213.  
  214. % You can have as many fonts as you like, trading off room for other
  215. % commands. Note that font1 is ASCII 49 and so on.
  216. % Here are the current font character definitions. . .
  217.  
  218. commands (0) 0 get {font0} put
  219. commands (1) 0 get {font1} put
  220. commands (2) 0 get {font2} put
  221. commands (3) 0 get {font3} put
  222. commands (4) 0 get {font4} put
  223. commands (5) 0 get {font5} put
  224. commands (6) 0 get {font6} put
  225. commands (7) 0 get {font7} put
  226. commands (8) 0 get {font8} put
  227. commands (9) 0 get {font9} put
  228. commands (:) 0 get {font:} put
  229. commands (;) 0 get {font;} put
  230. commands (=) 0 get {font=} put
  231. commands (-) 0 get {font-} put
  232. commands (+) 0 get {font+} put
  233.  
  234. % justification modes for command list
  235.  
  236. commands (C) 0 get {justx 4 (C) 0 get put} put  % center justify
  237. commands (F) 0 get {justx 4 (F) 0 get put} put  % fill justify
  238. commands (L) 0 get {justx 4 (L) 0 get put} put  % left justify
  239. commands (R) 0 get {justx 4 (R) 0 get put} put  % right justify 
  240. commands (P) 0 get {justx 4 (P) 0 get put} put  % programmable just #1
  241. commands (Q) 0 get {justx 4 (Q) 0 get put} put  % programmable just #2
  242.  
  243. % macros for command list 
  244.  
  245. commands (a) 0 get {amacro} put
  246. commands (b) 0 get {bmacro} put
  247. commands (c) 0 get {cmacro} put
  248. commands (d) 0 get {dmacro} put
  249. commands (e) 0 get {emacro} put
  250. commands (f) 0 get {fmacro} put
  251. commands (U) 0 get {Umacro} put
  252. commands (V) 0 get {Vmacro} put
  253. commands (W) 0 get {Wmacro} put
  254. commands (X) 0 get {Xmacro} put
  255. commands (Y) 0 get {Ymacro} put
  256. commands (Z) 0 get {Zmacro} put
  257.  
  258. % service routines for command list
  259.  
  260. commands (h) 0 get {halflinefeedup} put   % half linefeed up 
  261. commands (i) 0 get {initialcap} put       % initial dropcap   
  262. commands (j) 0 get {kern+} put            % positive kerning
  263. commands (k) 0 get {kern-} put            % negative kerning
  264. commands (l) 0 get {linefeeddown} put     % linefeed down
  265. commands (n) 0 get {nobreak} put          % conditional ff
  266. commands (o) 0 get {overstrike} put       % overstrike char 
  267. commands (p) 0 get {/pmrun pm def} put    % normal para indent
  268. commands (s) 0 get {/ypos -10000 def} put % showpage formfeed template link
  269. commands (t) 0 get {plainoldtab} put      % simple tabbing
  270. commands (x) 0 get {exitproc} put         % exit to PostScript 
  271. commands (y) 0 get {fulllinefeedup} put   % negative linefeed
  272. commands (z) 0 get {/pmrun 0 def} put     % zero para indent
  273.  
  274.  
  275. % EXPANDED SERVICE ROUTINE DEFINITIONS
  276. % ====================================
  277.  
  278. /halflinefeedup {/ypos ypos yinc 2 div add def} def
  279.  
  280. /fulllinefeedup {/ypos ypos yinc add def} def
  281.  
  282. /linefeeddown {/ypos ypos yinc sub def} def
  283.  
  284. /nobreak {ypos yinc 6 mul sub ybot lt {/ypos ybot def} if} def
  285.  
  286. /initialcap {/ypos ypos yinc add ypara add def /pmrun 0
  287. def /indentcount dropcount def /dropflag true def} def
  288.  
  289. % a simple tab routine for lj only. Tabs relative to xpos
  290.  
  291. /plainoldtab 
  292.  
  293. {tabs tabcount get 
  294.  
  295. dup /roomleft exch txtwide exch sub def
  296. mark exch xpos add ypos /moveto cvx] cvx
  297. printlist exch 3 index exch put
  298. exch 1 add exch
  299. tabcount tabs length 1 sub lt  {/tabcount tabcount 1 add def} if
  300. } def
  301.  
  302. /kern- {mark kern neg 0 /rmoveto cvx ] cvx printlist exch 3 index
  303. exch put /roomleft roomleft kern add def exch 1 add exch} bind def
  304.  
  305. /kern+ {mark kern 0 /rmoveto cvx ] cvx printlist exch 3 index
  306. exch put /roomleft roomleft kern sub def exch 1 add exch} bind def
  307.  
  308. /overstrike {printlist 2 index 1 sub get aload pop pop pop add 1 sub
  309. linestring exch 1 getinterval stringwidth pop dup overstrikechar 
  310. stringwidth pop sub 2 div sub mark exch /gsave cvx exch /cfix
  311. cvx /add cvx /neg cvx overstrikeht /rmoveto cvx overstrikechar /rshowchars
  312. cvx /grestore cvx] cvx printlist exch 3 index exch put exch 1 add exch} def
  313.  
  314. % stringmacro lets you do a series of gonzolink commands with a single
  315. % macro keystroke. For instance, /amacro {(z3c) stringmacro} def picks
  316. % a centered font3 with no paragraph for an embedded [esc]-a.
  317.  
  318. /stringmacro { {commands exch get exec} forall} def
  319.  
  320. % This lets you use [esc]-g instead of startgonzo
  321.  
  322. (\033g) cvn {startgonzo} def
  323. (|g) cvn {startgonzo} def
  324.  
  325. % CHARACTER COMMAND ARRAY (fake CASE)
  326. % =======================
  327.  
  328. % create an executable array based on character to decide who does what
  329.  
  330. /chararray 256 array def   % decides action of each key
  331.  
  332. 0 1 255 { /posn exch def chararray posn
  333. [posn /chartolinestring cvx ] cvx put} for       % default 1:1 mapping
  334.  
  335. chararray 
  336. dup 10 {newlineproc} put                         % lf newline
  337. dup 13 {newlineproc} put                         % cr as newline
  338. dup 32 {spaceproc} put                           % spaceproc
  339.  
  340. dup escapechar {gonzojust {escproc}{exitcheck} ifelse} put    % escape key
  341. dup altescapechar {gonzojust {escproc}{exitcheck} ifelse} put % altesc key
  342. dup rslashchar {rslashok {rslashproc}
  343. {rslashchar chartolinestring} ifelse} put       % rslash key - can alter
  344. pop    
  345.  
  346. % Charproc simply piles up characters into linestring.
  347. % Other commands decide how these characters are to be used.
  348.  
  349. /chartolinestring {linestring exch 2 index exch put 1 add } bind def
  350.  
  351.  
  352. % exitproc responds to [esc]-x and gets you out of gonzo after printing.
  353.  
  354. /exitproc {exit} def
  355.  
  356. % rslashproc takes care of the reverse slashes which are not active when
  357. % not reading strings.
  358.  
  359. % create an action array 
  360.  
  361. /slashlist 256 array def 0 1 255 {slashlist exch {} put} for
  362.  
  363. slashlist 
  364. dup 48 {0 octalnum} put % process as octal number
  365. dup 49 {1 octalnum} put
  366. dup 50 {2 octalnum} put
  367. dup 51 {3 octalnum} put
  368. dup 40 {40 chartolinestring} put % left paren
  369. dup 41 {41 chartolinestring} put % right paren
  370. dup 92 {92 chartolinestring} put % reverse slash 
  371.  
  372. dup 114 {chararray 13 get exec} put      % carriage return 
  373. dup 108 {chararray 10 get exec} put      % linefeed
  374. dup 116 {slashtab} put                   % tab someday
  375. dup 98 {slashbs} put                     % backspace someday
  376. dup 102 {slashformfeed} put              % formfeed someday
  377. pop
  378.  
  379. /slashtab {nogot} def  
  380. /slashbs {nogot} def
  381. /slashformfeed {nogot} def
  382. /nogot {reverse_slash _feature_not_yet_defined} def
  383.  
  384. /rslashproc { 
  385.  
  386. % currentfile read 
  387.  
  388.  
  389. stringmode {getstringchar}{currentfile read} ifelse
  390.  
  391. {slashlist exch get exec}{exit} ifelse}
  392. bind def
  393.  
  394. % octalnum handles all reverse slashes followed by three octal nuambers.
  395.  
  396. /octalproc {
  397.  
  398. stringmode {getstringchar}{currentfile read} ifelse
  399. { 48 sub dup dup 0 lt exch 7 gt or 
  400. {pop 0} if} {exit} ifelse} def
  401.  
  402. /octalnum {8 mul octalproc add 8 mul octalproc add chararray exch get
  403. exec} bind def
  404.  
  405. % TXTWIDE FITTING SERVICE UTILITIES
  406. % ================================= 
  407.  
  408. % longstringadj currently lets an all print string longer than
  409. % txtwide invade the margin, rather than forcing a break or error
  410.  
  411. /longstringadj {dup txtwide ge {pop txtwide 10 div} if} bind def
  412.  
  413. % doeswordfit attempts to add the length of the current trial word to
  414. % the present line. It returns a positive value if room remains and
  415. % a negative one if not.
  416.  
  417. /doeswordfit {linestring wordstart dup 3 index exch sub
  418. getinterval dup dup length 0 gt 
  419.  {stringwidth pop exch length cstretch mul add /wordroom exch def} 
  420.  {pop pop /wordroom 0 def} ifelse
  421. roomleft wordroom longstringadj sub dup 0 gt} bind def
  422.  
  423. % tryspacefit attempts to add a space to the end of the existing word.
  424. % if it fits, word is accepted. If not, line ends.
  425.  
  426. /tryspacefit {roomleft spacewidth sub dup 0 ge
  427. {/roomleft exch def dup 1 add dup /oktohere exch def /wordstart
  428. exch def 1 add /numspaces numspaces 1 add def} 
  429.       
  430. {pop /wordroom 0 def /oktohere oktohere 1 add def
  431. substart dup oktohere sub neg wordtoplist exch /plistlength exch def
  432. 0 exch endtheline /wordstart oktohere def startnextline} ifelse } bind def
  433.  
  434. % wordtoplist adds word to printlist if positive length. Start out with
  435. % -plistpoint- -charpoint- -startchar- -length- on stack. End with 
  436. % new word grouip in print array and -newplist- -charpoint-.
  437.  
  438. /wordtoplist {dup 0 gt {mark 3 1 roll dup numchars add /numchars exch def
  439. currentfont /showchars cvx ] cvx printlist exch 3 index exch put exch 1
  440. add exch } {pop pop} ifelse } bind def
  441.  
  442. % *** ESCPROC ***
  443.  
  444. % On an escape (or substitute escape) command character ...
  445.  
  446. %           yes ------ previous word fit? -------- no
  447. %      word to printlist                       closeline
  448. %      do escape command                word to next line always
  449. %                                         word to new printlist
  450. %                                           do escape command
  451.  
  452. /escproc { doeswordfit
  453. {/roomleft exch def dup dup /oktohere exch def /wordstart exch def
  454. substart dup oktohere sub neg wordtoplist}
  455. {pop substart dup oktohere sub neg wordtoplist exch /plistlength exch
  456. def 0 exch endtheline startnextline dup dup /oktohere exch def /wordstart
  457. exch def substart dup oktohere sub neg wordtoplist /firstchar -1 def 
  458. } ifelse /substart
  459. oktohere def commands 
  460.  
  461. stringmode {getstringchar}{currentfile read} ifelse {get exec}{exit} ifelse
  462.  
  463. } bind def
  464.  
  465. % *** NEWLINEPROC ***
  466.  
  467. % On as carriage return or newline character ...
  468.  
  469. %           yes ------ previous word fit? -------- no
  470. %      update word                              closeline
  471. %         closeline                       word to next line always
  472. %                                               closeline
  473.  
  474. /newlineproc {doeswordfit 
  475.  
  476. {/roomleft exch def dup dup /oktohere exch def /wordstart exch
  477. def substart dup oktohere sub neg wordtoplist /lastparline true
  478. def exch /plistlength exch def 0 exch endtheline /wordroom 0
  479. def /firstparline true def startnextline}  % word did fit on line
  480.  
  481. {pop substart dup oktohere sub neg wordtoplist exch /plistlength
  482. exch def 0 exch endtheline startnextline dup dup /oktohere exch
  483. def /wordstart exch def substart dup oktohere sub neg
  484. wordtoplist /lastparline true def exch /plistlength exch def 0
  485. exch endtheline /firstparline true def /wordroom 0 def
  486. startnextline  % word did not fit on line
  487. } ifelse 
  488.  
  489. pop 0 /substart 0 def /wordstart 0 def /oktohere 0 
  490. def /firstchar -1 def} bind def
  491.  
  492. % *** SPACE PROC ***
  493.  
  494. % Leading spaces are ignored in an ongoing paragraph with the firstchar test.
  495. % For speed, "words" may include internal spaces if there is enough room.
  496. %
  497. %              yes ------ previous word fit? -------- no
  498. %         update word                            closeline
  499. %   yes --- word+space fit? -- no          word to next line always
  500. %  update word             closeline     yes -- word+space fit? --- no
  501. %                                      update word               closeline    
  502.  
  503. /spaceproc { dup firstchar ne {linestring 1 index 32 put doeswordfit
  504. {/roomleft exch def dup 1 sub /oktohere exch def tryspacefit} 
  505. {pop substart dup oktohere sub neg wordtoplist exch /plistlength
  506. exch def 0 exch endtheline startnextline tryspacefit} ifelse} if} bind def
  507.  
  508. % *** SWALLOW AND HANG ***
  509.  
  510. % swallowandhang is a dual purpose proc that swallows any trailing spaces
  511. % and optionally hangs punctuation for center, right, and fill justification.
  512.  
  513. % The swallowlist decides which characters get acted on for hanging.
  514. % The "1" before the hung character lets you individually customize overhang.
  515. % hangfract lets you adjust the overhang of all characters together.
  516.  
  517. /swallowlist 256 array def
  518.  
  519. 0 1 255 {swallowlist exch {exit} put} for
  520.  
  521. swallowlist 
  522. dup ( ) 0 get {swallow} put
  523. dup (-) 0 get {1 (-) hangpunct} put
  524. dup (.) 0 get {1 (.) hangpunct} put
  525. dup (,) 0 get {1 (,) hangpunct} put
  526. dup (;) 0 get {1 (;) hangpunct} put
  527. dup (:) 0 get {1 (:) hangpunct} put
  528. dup (") 0 get {1 (") hangpunct} put
  529. dup (') 0 get {1 (') hangpunct} put
  530. dup (}) 0 get {1 (}) hangpunct} put
  531.  
  532. dup 41 {1 (\051) hangpunct} put  % closing parenthesis  
  533. dup 177 {1 (\261) hangpunct} put  % em dash
  534. dup 208 {1 (\320) hangpunct} put  % en dash
  535. dup 186 {1 (\272) hangpunct} put  % closing double quote
  536. pop
  537.  
  538. % hangpunct shortens roomleft if hanging is wanted.
  539.  
  540. /hangpunct { hangflag { stringwidth pop mul hangfract mul roomleft exch
  541. add /roomleft exch def} {pop pop} ifelse exit } bind def
  542.  
  543. % swallow removes one leading space
  544.  
  545. /swallow {/lopspaces lopspaces 1 add def} bind def
  546.  
  547. % swallowandhang first tests for a normal showchars ending. It then runs
  548. % sandh to do the actual swallowing or punctuation hanging.
  549.  
  550. /swallowandhang {
  551.  
  552. printlist plistlength 1 sub get 
  553. dup dup length 4 eq
  554.  
  555.  
  556. {3 get cvlit /showchars eq {sandh}{pop pop} ifelse}
  557.  
  558. {pop pop}
  559.  ifelse
  560.  
  561. } bind def
  562.  
  563. % sandh grabs the last string of characters and works backwards through
  564. % them, providing a count of total trailing spaces, and hanging selected
  565. % punctuation. The roomleft is then adjusted accordingly.
  566.  
  567. /sandh {/lopspaces 0 def dup 0 get exch 1 get  linestring 3 1 roll
  568. getinterval /laststring exch def laststring length 1 sub -1 0
  569. {laststring exch get swallowlist exch get exec} for /roomleft lopspaces
  570. spacewidth mul roomleft add def /numchars numchars lopspaces sub
  571. def /numspaces numspaces lopspaces sub def} bind def
  572.  
  573. % *** LINE CONTROLS ******
  574.  
  575. % startnextline resets pointers, handles indents, sets up first move.
  576.  
  577. /startnextline {
  578.  
  579. oktoadvance {/ypos ypos yinc
  580.  
  581.    lastparline {ypara add} if sub def
  582.  
  583.                             } if  % move to next line
  584.  
  585. colcheck  % link to page template
  586.  
  587.  
  588.   /lastparline false def    % can't be the last line
  589.   /substart wordstart def   % point to start of current word
  590.   /numspaces 0 def          % character+space line count 
  591.   /numchars 0 def           % space line count
  592.   /tabcount 0 def           % tab count 
  593.  
  594. 0 firstparline {pmrun add /firstparline false def} if % pm indent?
  595.  
  596. dropflag {dropcount 0 ge {dropindent add /dropcount dropcount 1 sub def 
  597. dropcount 0 eq {/dropflag false def} if} if} if % indent dropcap?
  598.  
  599. dup wordroom add neg txtwide add txtwideadj /roomleft exch def
  600. printlist 0 [ 3 index /xymove cvx ] cvx put pop exch pop 1 exch
  601. dup /firstchar exch def} bind def
  602.  
  603. % endtheline executes a justify proc to set xfix, yfix, cfix and sfix
  604. % and then conditionally prints the printlist ...
  605.  
  606. /endtheline { justx cvx exec oktoprint {printline} if} bind def
  607.          
  608. % *** JUSTIFY PROCS ********
  609.  
  610. % The justify procs take the character count, the space count, and roomleft
  611. % and convert these into xfix and yfix entire line offsets and 
  612. % cfix and sfix character and space kerning.
  613.  
  614. /justC {swallowandhang /sfix sstretch def /cfix cstretch def /xfix roomleft
  615. 2 div def /yfix 0 def} bind def
  616.  
  617. /justF {lastparline {justifylastline {reallyjustF} {justL adjustlastline}
  618. ifelse }{reallyjustF} ifelse} bind def
  619.  
  620. /justL {/sfix sstretch def /cfix cstretch def /xfix 0 def /yfix 0 def} bind def
  621.  
  622. /justR {swallowandhang /sfix sstretch def /cfix cstretch def /xfix roomleft
  623. def /yfix 0 def} bind def
  624.  
  625. /reallyjustF {swallowandhang roomleft numchars 1 sub numspaces
  626. spacecharratio mul add dup 0 eq {pop 0.001} if div dup  cstretch
  627. add /cfix exch def spacecharratio mul sstretch add /sfix exch
  628. def /xfix 0 def /yfix 0 def} bind def % unconditional justF
  629.  
  630. % optional additional final line stretch is used only if it uses up less
  631. % than 80 percent of the remaining room. Otherwise might look cramped
  632.  
  633. /adjustlastline { 
  634. numchars 1 sub numspaces spacecharratio mul add lastlinestretch
  635. mul roomleft 0.8 mul lt {/cfix cfix lastlinestretch add 
  636. def /sfix sfix lastlinestretch spacecharratio mul add def} if} def 
  637.  
  638.  
  639.  
  640. % *** PRINT MODULE ********
  641.  
  642. % printline accepts a series of procs from the printlist and executes them
  643. % It expects a printlist of form [{proc1}{proc2}{proc3}...{procn] and
  644. % these variables predefined ...
  645.  
  646. %    plistlength    % length of printlist
  647. %    sfix           % total space kerning for line
  648. %    cfix           % total character kerning for line
  649. %    xfix           % total x-shift for line (for centering, rj, etc.)
  650. %    yfix           % total y-shift for line (normally zero) 
  651. %    indent         % first line or drop cap indent 
  652.  
  653. /sfix 0 def /cfix 0 def /xfix 0 def /yfix 0 def % defaults
  654.  
  655. /printline {gsave 0 1 plistlength 1 sub {printlist exch get exec} for
  656. grestore} bind def
  657.  
  658. % some often-used print-time macros . . .
  659.  
  660. % -stringstart- -stringlength- -madefontdict- showchars --> images string at
  661. % the currentpoint.
  662.  
  663. /showchars { setfont linestring 3 1 roll getinterval sfix 0 32 cfix
  664. 0 6 -1 roll awidthshow1} bind def
  665.  
  666. /rshowchars {show1} def    % overstrike to compile link
  667.  
  668. % -indent- xymove ---> does absolute move to xpos + indent, ypos
  669.  
  670. /xymove {xpos add xfix add ypos yfix add moveto} bind def
  671.  
  672.  
  673. % these two links have to stay unbound for Distillery or self-compiling
  674.  
  675. /show1 {show} def
  676. /awidthshow1 {awidthshow} def
  677.  
  678. % %%% MAIN GONZO JUSTIFY ROUTINE %%%
  679.  
  680. % startgonzo reads the currentfile, either piling up printable characters
  681. % into linestring, or acting out escape or space commands.
  682.  
  683. % and here's gonzo ...
  684.  
  685. /initgonzostuff {
  686.   /wordroom 0 def
  687.   /firstparline true def
  688.   /lastparline false def
  689.   /wordstart 0 def
  690.   /substart  0 def
  691.   /roomleft txtwide def
  692.   /oksofar 0 def 
  693.   /numchars 0 def
  694.   /lopcount 0 def
  695.   /firstchar -1 def
  696.   /tabcount 0 def
  697.   /gotcr false def
  698.    } bind def
  699.  
  700. /startgonzo {initgonzostuff 0 0  printlist 2 index
  701. [0 /xymove cvx] cvx put exch 1 add exch
  702. {currentfile read {chararray exch get exec}{exit} ifelse} loop
  703. pop pop % remove pointers from stack
  704. } bind def
  705.  
  706. % stringgonzo is similar to startgonzo, except that it accepts an
  707. % input string instead of the currentfile. This is handy for deferred
  708. % or predefined uses. stringgonzo is significantly (25%) slower than
  709. % startgonzo. An extra carriage return is always added to the string end.
  710. % to make sure the last line prints.
  711.  
  712. % Current bugs: can't embed printable \ with \\ or \134 and an extra
  713. % carriage return or double space MUST follow stringgonzo to stay error free.
  714.  
  715. /stringgonzo {initgonzostuff dup length 1 add dup /gslen exch def string 
  716. dup /gonzostring exch def exch 0 exch putinterval gonzostring gslen 1
  717. sub 13 put /gsptr 0 def /stringmode true def 0 0 printlist 2 index
  718. [0 /xymove cvx] cvx put exch 1 add exch {getstringchar {chararray exch
  719. get exec}{exit} ifelse} loop pop pop /stringmode false def } bind def
  720.  
  721. /getstringchar {gsptr gslen ge{ false } {gonzostring gsptr get true}
  722. ifelse /gsptr gsptr 1 add def} bind def
  723.  
  724. % CALLOUT JUSTIFY MODES
  725.  
  726. % cl accepts an input of form xpos ypos (message) cl and shows it
  727. % at xpos left and within xpos + textwide right.
  728.  
  729. /cl {save /snapcl exch def /linestring linestring2 def /justx (justL)
  730. def 3 1 roll /ypos exch def /xpos exch def stringgonzo snapcl restore} def 
  731.  
  732. % cf accepts an input of form xpos ypos (message) cf and shows it
  733. % flush left at xpos and flush right at xpos + textwide.
  734.  
  735. /cf {save /snapcf exch def /linestring linestring2 def /justx (justF)
  736. def 3 1 roll /ypos exch def /xpos exch def stringgonzo snapcf restore} def 
  737.  
  738. % cc accepts an input of form xpos ypos (message) cc and centers it
  739. % on xpos. txtwide IS IGNORED, AND ANY WIDTH WILL GET CENTERED.
  740.  
  741. /cc {save /snapcc exch def /linestring linestring2 def /txtwide 5000
  742. def /justx (justC) def /pmrun 0 def 3 1 roll /ypos exch def 2500
  743. sub /xpos exch def stringgonzo snapcc restore} def 
  744.  
  745. % cr accepts an input of form xpos ypos (message) cr and sets it
  746. % flush right against xpos. txtwide IS IGNORED, AND ANY WIDTH
  747. % WILL SET FLUSH RIGHT.
  748.  
  749. /cr {save /snapcm exch def /linestring linestring2 def /txtwide 5000
  750. def /justx (justR) def /pmrun 0 def 3 1 roll /ypos exch def 5000
  751. sub /xpos exch def stringgonzo snapcm restore} def 
  752.  
  753.  
  754. % COMPILING ROUTINES
  755.  
  756. % Compiling can be done either to the host (using a two way comm 
  757. % channel or to hard disk. The compiled files are Adobe Distillery
  758. % compatible but slightly shorter and faster. They can be further
  759. % sped up and shortened with an add-on utility.
  760.  
  761. % To compile, issue a compiletohost or a compiletodisk after beginning
  762. % gonzo.
  763.  
  764. /compiletohost {/hostcompflag true def sendcompileheader} def
  765.  
  766. /compiletohost {/diskcompflag true def sendcompileheader} def
  767.  
  768. /send { dup hostcompflag { print flush hostcompdelay {37 sin pop}
  769.         repeat}{pop} ifelse
  770.        
  771.         dup diskcompflag { writehere }{pop} ifelse
  772.  
  773.          pop } def
  774.  
  775.  
  776. % TEMPLATE LOADER
  777.  
  778. % starttemplate opens a template whose name is on the top of the stack and
  779. % executes an internally defined template command templatestartup
  780.  
  781. /starttemplate {begin templatestartup} def
  782.  
  783. %%%%%%%%%
  784.  
  785. % SIMPLE TEXT DUMPER
  786.  
  787. % This default text dumper template is useful for "just dump the text"
  788. % applications. The | and \ characters are handled as ordinary text in
  789. % this example. The only gonzo commands used are for the carriage return
  790. % and the linefeed. A "double escape" | | exits you.
  791.  
  792. % This template is also useful to list your gonzo programs while PRINTING
  793. % (rather than executing) all internal gonzo commands. (!!!)
  794.  
  795. % Note that any template MUST have an internal proc named templatestartup
  796. % and that your template MUST NOT call gonzofont before run time.
  797.  
  798. 300 dict /dumpasciitext exch def 
  799.  
  800. dumpasciitext begin
  801.  
  802. /templatefonts{
  803. /font1 /Helvetica 8 gonzofont       % regular text (defer till run time)
  804. /font2 /Helvetica-Bold 7 gonzofont  % header font (defer till run time)  
  805. } def
  806.  
  807. /txtwide 230 def                    % width of column
  808. /pm 0 def                           % no paragraph indents
  809.  
  810. /lmpos 60 def                       % horizontal left margin
  811. /yinc 9.5 def                       % vertical line spacing
  812. /ytop 720 def                       % top column reference
  813. /ybot 50  def                       % bottom column reference
  814.  
  815. /pagenum 1 def                      % initial pagenumber
  816.  
  817. /numcolumns 2 def                   % number of columns
  818. /colspace 260 def                   % spacing between columns  
  819.  
  820. % colcheck does all the work in a pagemaker. It is automatically called
  821. % at the start of each new printable line. It can make room for figures, etc.
  822.  
  823. /colcheck {ypos ybot lt {column# numcolumns ge {showpage /ypos ytop
  824. def /xpos lmpos def /column# 1 def header footer}{/ypos ytop def /xpos
  825. xpos colspace add def /column# column# 1 add def} ifelse} if} def 
  826.  
  827. % This particular header puts the pagenumber into a message string and
  828. % shows it at the right margin of the rightmost column. You can do
  829. % left-right and otherwise get as fancy as you care to here ...
  830.  
  831. /header {gsave spacewidth font2 rpagenum (xxxxxx) cvs dup length 5 add
  832. string dup 0 (page ) putinterval dup 5 3 index putinterval exch pop
  833. lmpos numcolumns 1 sub colspace mul add txtwide add exch ytop yinc 2.5
  834. mul add exch cr grestore /rpagenum rpagenum 1 add def /spacewidth exch def
  835. } def
  836.  
  837. /footer {} def       % none today
  838.  
  839. /templatestartup { templatefonts font1 /column# 1 def /xpos lmpos
  840. def /ypos ytop def/gonzojust false def /rslashok false def 
  841. /rpagenum pagenum def header footer} def
  842.  
  843. % exitcheck lets you decide how to exit your ASCII text dumper, and can get
  844. % VERY sticky. This example uses a double | | as a "double escape". This
  845. % trick lets you use this template to print a gonzo LISTING that has all 
  846. % of the gonzo commands in it (!), but acts improperly on none of them.
  847.  
  848. /asciiexitchar (|) def  % exit character reserved if preceeded by altescchar
  849.  
  850. /exitcheck {currentfile read {dup asciiexitchar 0 get eq {pop exitproc} 
  851. {/chold1 exch def altescapechar chartolinestring chold1 chartolinestring} ifelse}{exitproc} ifelse} def
  852.  
  853. end  % dumpasciitext template
  854.  
  855. % Here is a PostScript "textonly" convenience operator that speeds up
  856. % text dumping...
  857.  
  858. /textonly {dumpasciitext starttemplate startgonzo} def 
  859.  
  860.  
  861. %%%%%%%%%
  862.  
  863. % SIMPLE PAGE MAKING TEMPLATE
  864.  
  865. % This default gonzo page making template is a useful starting point for
  866. % creating your own custom templates. It handles multiple columns and
  867. % left-right page numabered headers. All gonzo commands are supported.
  868.  
  869. % Note that there is NO difference between a pagemaker and an emulator.
  870. % Everything is programmable, so just rearrange things to suit yourself.
  871. % Full document control (for figures etc) is done by extending colcheck.
  872.  
  873. % Note that any template MUST have an internal proc named templatestartup
  874. % and that your template MUST NOT call gonzofont before run time.
  875.  
  876. 300 dict /simplepages exch def 
  877.  
  878. simplepages begin
  879.  
  880. /templatefonts {    % Remember: all fonts MUST defer till run time!
  881.  
  882. /font0 /Times-Bold  [54 0 0 54.2 0 -32] gonzofont  % drop cap
  883. /font1 /Times-Roman  9.75 gonzofont                % main text
  884. /font2 /Times-Italic 9.75 gonzofont                % main italic
  885. /font3 /Times-Bold   9.75 gonzofont                % main bold
  886. /font4 /Times-Roman  9 gonzofont                   % capnum text
  887. /font5 /Times-Italic 9 gonzofont                   % capnum italic
  888. /font6 /Times-Bold   9 gonzofont                   % capnum bold 
  889. /font7 /Times-Bold  [9.75 0 0 9.5 0 -6] gonzofont  % lowered subheader
  890. /font= /Symbol 9.75 gonzofont                      % its greek to me
  891. /font- /ZapfDingbats  [9 0 0 9 0 4] gonzofont      % dingbats
  892.  
  893. } def
  894.  
  895. % values used by gonzo justify ...
  896.  
  897. /colspace 175 def                 % spacing between columns
  898. /cstretch  0.2 def                % minimum character kerning
  899. /dropcount 4 def                  % number of lines drop cap drops
  900. /lastlinestretch 0.06 def         % open last paragraph line slightly
  901. /pm 10 def                        % use paragraph indents             
  902. /sstretch -0.3 def                % minimum space kerning
  903. /txtwide 155 def                  % width of column
  904. /ybot 50  def                     % bottom column reference
  905. /yinc 10.5 def                    % vertical line spacing
  906. /ytop 715 def                     % BASE of top column reference
  907. /yinc 10.5 def                    % vertical line spacing
  908.  
  909. % additional values used by this template
  910.  
  911. /firstpagespecial false def       % special treatment for first page?
  912. /lmpos 60 def                     % horizontal left margin
  913. /numcolumns 3 def                 % number of columns
  914. /oddpageright true def            % are odd numbered pages on the right?
  915. /rightpage false def              % start with righthand page?
  916. /pagenum 1 def                    % running pagenumber
  917.  
  918. % These macros handle an initial drop cap and low center subheads ...
  919.  
  920. /amacro {(zy0)  stringmacro /ypos
  921.  ypos ypara add def} def             % start drop cap
  922. /bmacro {(iFy1) stringmacro /ypos
  923.  ypos ypara add def} def             % finish drop cap
  924. /cmacro {(znyC7) stringmacro /ypos
  925.  ypos ypara 2 mul add def} def             % centered title
  926. /dmacro {(pF1)  stringmacro /ypos
  927.  ypos ypara 2 mul add def} def             % normal text after centered title
  928.  
  929. % colcheck does all the work in a pagemaker. It is automatically called
  930. % at the start of each new printable line. It can make room for figures, etc.
  931.  
  932. /colcheck {ypos ybot lt {column# numcolumns ge {showpage /ypos ytop
  933. def /xpos lmpos def /column# 1 def header footer}{/ypos ytop def /xpos
  934. xpos colspace add def /column# column# 1 add def} ifelse} if} def 
  935.  
  936. % This particular header picks different formats for left and right pages
  937.  
  938. /header {pagenum cvi 2 mod 0 eq rightpage {not} if {leftheader}
  939. {rightheader} ifelse /pagenum pagenum 1 add def} def
  940.  
  941. /headerstripe {gsave xpos ytop 19 add moveto colspace numcolumns 1 sub mul
  942. txtwide add 0 rlineto 0.5 setlinewidth stroke} def
  943.  
  944. /leftheader {gsave spacewidth font2 pagenum (xxxxxx) cvs dup length 5 add
  945. string dup 0 (page ) putinterval dup 5 3 index putinterval exch pop
  946. lmpos exch ytop yinc 2.5 mul add exch cl grestore headerstripe /spacewidth
  947. exch def} def
  948.  
  949. /rightheader {gsave spacewidth font2 pagenum (xxxxxx) cvs dup length 5 add
  950. string dup 0 (page ) putinterval dup 5 3 index putinterval exch pop
  951. lmpos numcolumns 1 sub colspace mul add txtwide add exch ytop 25 add
  952. exch cr grestore headerstripe /spacewidth exch def} def
  953.  
  954. /firstpageheader {} def          % nothing special today
  955.  
  956. /footer {gsave xpos ybot 6 sub moveto colspace numcolumns 1 sub mul
  957. txtwide add 0 rlineto 1.5 setlinewidth stroke} def
  958.  
  959. /templatestartup { templatefonts font1 /column# 1 def /xpos lmpos
  960. def /ypos ytop def /gonzojust true def /rslashok true def header
  961. footer} def
  962.  
  963. end  % simplepages template
  964.  
  965. %%%%%%%%%%%%%%%%
  966.  
  967. end  % entire gonzo dictionary
  968.  
  969. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  970. %
  971. % END OF GURU'S GONZO JUSTIFY UTILITIES AND TEMPLATES 
  972. %
  973. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  974.  
  975.  
  976. %  //// demo - remove or alter before reuse
  977.  
  978. gonzo begin
  979. simplepages starttemplate
  980.  
  981. % These are custom to this particular file ...
  982.  
  983. /dropindent 38 def      % indent for drop cap - changes with letter
  984.  
  985.  
  986. /ypara {yinc 2 div} def
  987.  
  988. /font+ /ZapfDingbats [9.5 0 0 9.5 0 0] gonzofont
  989.  
  990. /Umacro {/overstrikechar (~) def /overstrikeht 3.5 def (o) stringmacro} def
  991.  
  992. /Vmacro {gsave (h) stringmacro xpos ypos 2 add moveto txtwide 0 rlineto 0.3 setlinewidth stroke (h) stringmacro grestore} def
  993.  
  994. /Wmacro {figone} def
  995.  
  996. % This simulates a "real" figure
  997.  
  998. /figone { /figheight yinc 13.5 mul def save /figsnap exch def /ybot -9999 def
  999. xpos ypos figheight sub translate 0 0 moveto 0 figheight 3 add 2 copy 
  1000. rlineto txtwide 0 rlineto neg rlineto closepath 0.5 setlinewidth
  1001. stroke /font1 /Helvetica-Oblique 9 gonzofont /font2 /Symbol 160 gonzofont      txtwide 2 div 9 (|1Fig. 1 - Join the Gonzo Club) cc 19 38 (|2\247) cl
  1002. figsnap restore /ypos ypos figheight sub def} def
  1003.  
  1004.  
  1005. startgonzo
  1006. |a
  1007. T
  1008. |b
  1009. his is a rather short demo of some of the more powerful features of Don Lancaster's Gonzo justification routines. Its outstanding abilities go far beyond most power applications packages.|p
  1010. |c
  1011. Gonzo  13  Features
  1012. |d
  1013. My Gonzo |413|1 features an ultra-high quality text justification that includes automatic drop caps, hanging pun- ctuation, and a global kerning. It is purposely |2not|1 |4WYSIWYG|1 for fastest speed, and total device independence.
  1014. You could, of course, pick up full |4WYSIWYG|1 on any system which can support |2Display PostScript|1. Sigh.
  1015. Naturally, everything here is fully programmable, totally unlocked, and completely documented. If you don't like what you see, just rearrange the scenery to suit yourself. You can also emulate |2anything|1 using Gonzo |413|1.
  1016. While quite fast by itself, a built-in compiler can give you an even more impressive speedup while generating files which are |2Adobe Distillery|1 com- patible. Your compiling can be either to host recorder or hard disk file.
  1017. For most pages, the apparent page makeup time will approach |2zero|1 after compiling. This becomes extremely important with any book-on-demand publishing or outputting to a glacial PostScript typesetter.
  1018. There are several gonzo modes available, ranging from a "just dump the text" emulator, raw gonzo layouts, layout using templates, layout with a full document control, string modes, and callout justification.
  1019. In its "just dump the text" mode, you could also list all of your gonzo code |2while printing and preserving all gonzo commands!|1
  1020. Among the bunches of features of interest, such neat tricks as electronic |4R|oS|oT|o|1 complements, or simply heading on down the can|Uon, are easily done from any |2unmodified|1 font|1.
  1021. So is a selective |4(A|kW|kARD)|1 kerning on the fly, even while in fill justify. A supertabbing ability lets you mix and match justification modes on a single line. A munu justify feature provides for dotted listings.
  1022. Your entire command set is fully programmable. You can redefine any character or any action at any time for any reason. An ultrafast technique known as |2action tables|1 can greatly simplify your custom programming.
  1023. If you were to add more text to this demo, it would do multiple three col- umn pages with automatic left-right headers and sequential numbering.
  1024. By going to a somewhat fancier template, a total document control including multiple figure and picture insertions is easily handled. We will see lots of examples of these in future |2GEnie|1 |4PSRT|1 uploads.
  1025. |W
  1026. Please note that, while personal use is permitted so long as all headers and credits are retained, all commercial rights to this |2Synergetics|1 copyrighted code are fully reserved, as is posting on any electronic media.
  1027. The complete Gonzo code is now available on |2GEnie|1 |4PSRT|1 library as |4GONZO13A.PTL|1 or higher, while the thorough and detailed documentation is provided as |4GONZO13A.TXT|1. Your |2GEnie|1 voice phone number is |4(800) 638-9635|1.
  1028. A complete package of detailed Gonzo use examples is available as Don Lancaster's revised |3PostScript Beginning Stuff|1 book+disk package. |4$39.50. VISA/MC|1.
  1029. |V
  1030. |2Microcomputer pioneer and guru Don Lancaster is the author of 26 books and countless articles. Don maintains a no-charge technical helpline found at (602) 428-4073, besides offering all his own books, \
  1031. reprints, and his technical services. He also has a free brochure of his insider desktop publishing secrets waiting for you. Your best calling times are often |58-5|2 on weekdays, Mountain Standard Time. \
  1032. Or you can reach Don by way of |1Synergetics|2, at Box |5809|2, Thatcher, |5AZ 85552|1. |+F|1
  1033. |x
  1034.  
  1035. showpage quit
  1036.  
  1037.  
  1038. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1039.  
  1040. % Related GEnie PSRT Downloads: 
  1041.  
  1042. %            #220 - GONZO13A.TXT   Gonzo Justify Documentation 
  1043. %            #109 - RAWPS.TXT      Working with raw PostScript
  1044.  
  1045. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1046.  
  1047. % Reprinted from Don Lancaster's POSTSCRIPT BEGINNER STUFF.
  1048. % Now available via GEnie email from SYNERGETICS.
  1049.  
  1050. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
  1051.  
  1052. % FREE VOICE HELPLINE AND ADDITIONAL INFO: (602) 428-4073
  1053.  
  1054. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1055. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1056.  
  1057.