% VAX-11 Librarian V04-00@ _Q̖.r/  (  BITIMAGE_HEXDMM-NUP HEADERS_STR!@ IMAGE_HEX NUMBER_UP+ PAINT_HEX1TPARSER4@PATCH9PSSIDESSTARTENDTEK4014:*TRAILER>ZETA l:%%% bitimage - puts an uncompressed hex bitmap on the page% % R. Watson % 05-Feb-1987%=% inputs: /param1 /ncopies /nc - number of copies (default 1)=% /param2 /scale - scale factor to multiply by (default 1.0)2% /param3 /xsize - x size in pixels (default 512)2% /param4 /ysize - y size in pixels (default 512)8% /param5 /pxlwid - number of bits in a pixel (1,2,4,8)%%% main program%/main{0 /iscale 1 scale div def % compute scale factor%G% get the image, fill black if run out of data. Note that readhexstringE% returns false if we don't fill the string, so the input data shouldB% be a multiple of sizeof(tmp) bytes long. Assume that it is more J% efficient to read more than 1 byte at a time. Note that line boundaries% do not matter.%4 xsize ysize pxlwid [iscale 0.0 0.0 iscale 0.0 0.0]; { currentfile tmp readhexstring not {pop <00>} if } image showpage, currentfile flushfile % avoid laser_log's} def%% executable initialization%/table [8 [/#copies 1 (.nc .ncopies .param1)] % number of copies2 [/scale 1.0 (.sf .scale .param2)] % scale factor) [/xsize 512 (.xsize .param3)] % x size) [/ysize 512 (.ysize .param4)] % y size. [/pxlwid 1 (.pxlwid .param5)] % pixel width] deftable { % apply defaults /ta exch def % save array ta 0 get % key ta 1 get % default value def % define default value} forall7currentdict /parser known {parser} if % if user inputs 0/identity matrix def % make an identity matrix/tmp 8 string def01 72 mul 10 72 mul moveto currentpoint translate<currentpoint transform % see where we are in device coords:identity setmatrix % turn off transformation - switch to % device coordinate system0translate % move origin to transformed currptmainww7%% headers_str - print text with headers on LaserWriter%% R. Watson 25-Sep-1986%A% 10/03/86 RW Remove "_DUA0:[]" from filename (for s nm@/%Note: Append this file to the beginning of any /% PostScript file to print selected pages.2% This takes advantage of a bug in PostScript3% that may (or may not be) fixed anytime soon.1=% Please send improvements to shtodd@vassar.edu. Thanks.,7%1 2 %Uncomment to print selected (startpage, endpage)dC/selbool false def count 2 eq{/endpage exch def /startpage exch defo/selbool true def}if5/origshowpage /showpage load def /pagenum (00000) defe /showp HEADERS_STR$Gp MRL HEADERS_STR$z8v MRL HEADERS_STR$z MRL HEADERS_STR$< MRL HEADERS_STR$#L MRL HEADERS_STR$i MRL HEADERS_STR$wn MRL HEADERS_STR$\% MRL HEADERS_STR$A[ MRL HEADERS_STR$r MRL HEADERS_STR$̻_ MRL HEADERS_STRlb MRL SIDES9c M$] ˖7%% headers_str - print text with headers on LaserWritera%2% R. Watson 25-Sep-1986i%g/EOF{/: linecount 0 ne column 0 ne or { % if we've printed a line' /column ncolumns def % force page out newpagei } ift} def  /XCR X{ $ /xpos xmargin def %%%was leftmargin} def  e/XLF {newline} def a/XFF{a3 topmargin lineh sub ypos ne { % if not top of page newpagei } ifR} def  c%% XSTR%.&% prints a line of text from the stack%d/XSTR{n /line exch def % get textb o& line length 1 ge { % show the line xpos ypos moveto wrap { 0 1 line length 1 sub {$ line 2 -1 roll 1 getinterval dup( stringwidth pop currentpoint pop add squish add xlimit gt {/wrapping true def newline xpos ypos moveto /wrapping false def} if  squish 0 3 -1 roll ashow } for }a {l squish 0 line ashow } ifelse6 /xpos currentpoint pop def % save current x position } if} defn a - agel" {userdict begin /x 0 def /y 0 def. /pagenumadd pagenum cvi 1 add =string cvs def /i pagenum cvi 1 add deftK pagenumadd length 5 exch sub{pagenum x (0) 0 get put /x x 1 add def}repeataP pagenumadd length{pagenum x pagenumadd y get put /x x 1 add def /y y 1 add def} repeatn( selbool{i startpage ge i endpage le and/ {origshowpage i endpage eq {(stop) = stop} if})' {erasepage}ifelse}{origshowpage}ifelsel end}def%%Endnwww xdf/xpose xdf/lps-ppNxdf lps-pp 1 eq{/realshowpage/Ό3kc%!PS-Adobe-2.0 ExitServer %%Title: dmm-nup.ps%%Creator: DMM%%CreationDate: 04/25/92 13:28)%%DocumentSuppliedProcSets: "dmm-nup" 3 0 %T>% Written by Donald Markuson, Prime Computer, Inc., 1990-1992.@% Placed into the public domain by the author September 1, 1991.>% Comments and suggestions are welcome and may be addressed to% dmm@tiger1.prime.com. %NOuserdict/dcheckload 2 copy known{pop pop}{{{pop exec}{save 3 dict begin/rb 6050_Bstring def exch/es exch def{curren%% newline - move down 1 line.%n /newline {4 /linecount linecount 1 add def % advance line count4 ypos lineh sub /ypos exch def % debit y pos on page ypos bottommargin lt 1 linecount linelimit gt or { % if bottom of pageu newpageg newlined } ifm} defe a n'%% newpage - initialize for a new page.c%m /newpage {& /linecount 0 def % reset line count4 /ypos topmargin lineh sub def % reset line on page + /column column 1 add def % advance columnn, column ncolumns lt { RL SIDES 釮 MRL TEK4014 2 MRL TEK4014$R  MRL HEADERS_STR$$ ˖ MRL HEADERS_STR$ R̖ MRL HEADERS_STRtfile rb readline not{stop}if esJeq{exit}if}loop end restore pop}ifelse}bind put}ifelse{}( %enddmmnupdict) Bvmstatus pop pop 0 gt userdict/DMM-nup-pre known not or dcheckload=systemdict/setpacking known{currentpacking true setpacking}ifiMuserdict/DMM-nup-pre{systemdict begin userdict begin/DMM-nup-dict 60 dict defoGDMM-nup-dict begin/T true def/F false def/xdf{exch def}bind def/endpagerNxdf/startpage xdf/pbgray xdf/noclip xdf/flipit xdf/lscape xdf/xpose xdf/lps-ppNxdf lps-pp 1 eq{/realshowpage/2% TEK2PS prolog fileF% Font definitions (make 3/4 functions to avoid scaling if not needed)(/FntH /Courier findfont 80 scalefont def9/DFntL { /FntL /Courier findfont 73.4 scalefont def } def.9/DFntM { /FntM /Courier findfont 50.2 scalefont def } def 7/DFntS { /FntS /Courier findfont 44 scalefont def } defe% tektronix line styles )/NV { [] 0 setdash } def % normal vectorsl*/DV { [8] 0 setdash } def % dotted vectors4/DDV { [8 8 32 8] 0 setdash } def % dot-dash vectors2 /SDV { [32 8] 0 setdash } def % short-dash vectors1/LDV { [64 8] 0 setdash } def % long-dash vectorsp%/PR % char x y -> - prints characterl{ moveto show } def @% The following values create a page with the following margins:4% right 10.62 left .38 top .35 bottom 8.15 (inches).B% These were selected to conform with QMS printers, which selectedD% the values to emulate a true TEK4014. My QMS printers don't printA% in portrait mode, so those values were selected to conform withp% DEC'S own CPS software. MRL /mx 586 defr /my 27 deft /rot 90 defs /sc .18 deft*currentdict /lw known not {/lw 1.5 def} if% thin and thick lines/DZ { lw setlinewidth } def0#/FZ { lw 2.0 mul setlinewidth } defm /portraitl{l /mx 20 def /my 333 def /rot 0 def/sc .13876 def} def}/NP % - -> - new page{4% change default scale and orentation to match tek's{ 1 setlinecap 1 setlinejoin! mx my translate % leave a borderi rot rotate{ sc sc scale lw setlinewidth 0 0 movetot % if not last column4 /xmargin columnwidth column mul leftmargin add def /xpos xmargin deft$ /xlimit xlimit columnwidth add def } { /column 0 def % reset column o title { % if title leftmargin 4 topmargin titlemargin add moveto % setup header$ currentfont % save current font0 /Helvetica-Bold findfont 12 scalefont setfont filename show pagewidth 1.5 inch sub 3 topmargin titlemargin add moveto % page number  (page ) showg page 10 5 string cvrs show  setfont % restore font } if  showpage landscapee g wrapping not { page % save this saveobj restore % flush vme /saveobj save def" /page exch def % restore this } if  alternate page 1 and 1 eq andn {/temp leftmargin def6 /leftmargin rightmargin def4 /rightmargin temp def} if. /page page 1 add def % advance page number- /xmargin leftmargin def % reset left side% /xpos xmargin defa( /xlimit leftmargin columnwidth add def } ifelsen} def  o a!%% landscape - set landscape mode)% /landscape { wide {p 8.5 inch 0 translate 90 rotate } iff} defe %% inch .a%2% convert to inches%./inch { 72. mul} def s e%% point .% % convert to points%s/point { } def m %% executable initialization.i% initgraphics l8currentdict /formname known not {/formname (2UP) def} if aformname (2UP) eq { /table [ 9 [/#copies 1 (.nc .ncopies .param1)] % number of copies[1 [/fsizetmp 0 (.fsize .fs .param2)] % font sizen3 [/wide true (.wide .w .param3)] % landscape mode0+ [/title false (.title .param4)] % title.8 [/ncolumns 2 (.ncolumns .param5)] % number of columns? [/linelimit 66 (.linelimit .nlines .param6)] % lines per page8 [/hdr () (.hdr .header. param7)] % page header4 [/font (Courier) (.font .param8)] % font> [/topmargin -1 (."ct the new font landscape/saveobj save defww`Է8%%% image - puts a raster image file on the laserwriter.%.% 02/26/87 R. Watson Derived from paint_hex.ps%%% deCompress .%(% returns a bitimage string on the stack% /deCompress{" /count readbyte def % get count) count 16#80 and 0 eq { % if bit stream /count count 1 add def9 outstring 0 count getinterval % get right size string% inp exch readhexstring % get bytes$ pop % t#oss readhexstring status } { % else repeated string* /byte readbyte def % get byte to repeat> 16#100 count sub 1 add /count exch def% get abs val of count 0 % preset index count { dup outstring exch byte put 1 add % advance index } repeat pop % index/ outstring 0 count getinterval % return string } ifelse} def %% getByte%!% returns /byte = next input byte-% = 0 if no more bytes on input stream%/getByte{+ inp instring read$hexstring { % if got one' 0 get /byte exch def % store in byte } { % else 0 pop /byte 0 def } ifelse} def8%% decodeheader - decodes the info in the header record.% /decodeheader{+ /bytesinhead 512 def % default 512 bytes { % 512 bytes default1 getlong 10 10string cvrs cvlit % key to lit dup where& { pop load exec } % if defined func9 { pop getlong pop } ifelse % if no func (key, fix file)= /bytesinhead bytesinhead 8 sub def % debi%t header length, bytesinhead 8 lt { % if end of header) bytesinhead { % flush remaining bytes readbyte pop } repeat exit % exit loop } if } loop} def!/0 {getlong pop} def % 0 - nop*/1 {/xsize getlong def} def % 1 - x size*/2 {/ysize getlong def} def % 2 - y size0/3 {/pxlwid getlong def} def % 3 - pixel width0/4 {/scale getlong def} def % 4 - scale factor6/5 {/invert getlong def} def % 5 - invert if nonzero+/8 {getlong 512 sub % 8 - he&ader lengthI bytesinhead add /bytesinhead exch def} def % apply correction factor:/9 {/compressed getlong def} def % 9 - true if compressed%% getlong %5% converts 4 hex bytes from currentfile to an integer>% longwords from the vax are transmitted low order byte first.%/getlong{# /acc 0 def % preset accumulator 0 1 3 {3 readbyte exch 8 mul bitshift acc or /acc exch def } for acc} def%% readbyte %?% reads a hex byte from currentfile and re'turns it on the stack+% executes "readbyteeof" if EOF encountered% /readbyte{C currentfile 1string readhexstring {}{pop readbyteeof} ifelse 0 get} def%% main program%/main{) decodeheader % apply user user header7 currentdict /parser known {parser} if % if user inputs invert 0 ne {+ {1.0 exch sub} settransfer % invert image } if( /sTime usertime def % save start timeH vmstatus 10 20 string cvrs dbg exch writestring dbg ( ) writestringH ( 10 20 string cvrs dbg exch writestring dbg ( ) writestringJ 10 20 string cvrs dbg exch writestring dbg ( \n) writestring flush1 /iscale 1 scale div def % compute scale factor ! compressed 1 eq { % if encoded4 xsize ysize pxlwid [iscale 0.0 0.0 iscale 0.0 0.0] { deCompress } image } {5 xsize ysize pxlwid [iscale 0.0 0.0 iscale 0.0 0.0]? { currentfile tmp readhexstring not {pop <00>} if } image } ifelse. usertime sTime sub 1000 div 1)0 20 string cvrs& dbg exch writestring dbg ( seconds ) writestringG vmstatus 10 20 string cvrs dbg exch writestring dbg ( ) writestringF 10 20 string cvrs dbg exch writestring dbg ( ) writestringJ 10 20 string cvrs dbg exch writestring dbg ( \n) writestring flush showpage+ currentfile flushfile % avoid laser_log's} def%% executable initialization%+/inp (%stdin) (r) file def % define files/dbg (%stdout) (w) file def 0/1string 1 s *tring def % scratch 1 byte string3/10string 10 string def % scratch 10 byte string1/identity matrix def % make an identity matrix7/outstring 128 string def % storage for output string(/instring 1 string def % input buffer./tmp 8 string def % for uncompressed images/table [8 [/#copies 1 (.nc .ncopies .param1)] % number of copies2 [/scale 1.0 (.sf .scale .param2)] % scale factor) [/xsize 512 (.xsize .param3)] % x size) [/ysize 512 (.ysize .param4)] % y size. [/p+xlwid 1 (.pxlwid .param5)] % pixel width4 [/invert 0 (.invert .param6)] % invert image if 1? [/compressed 1 (.compressed .param7)] % default to compressed] deftable { % apply defaults /ta exch def % save array ta 0 get % key ta 1 get % default value def % define default value} forall01 72 mul 10 72 mul moveto currentpoint translate<currentpoint transform % see where we are in device coords:identity setmatrix % turn off transformation - switch to , % device coordinate system0translate % move origin to transformed currpt/doit {: {main} stopped { (error stack:\n) = pstack flush quit} if} def%doitmainwwH%%% paint - puts a MacPaint compressed raster file on the laser printer.%%=% inputs: /nc /ncopies /params - number of copies (default 1)2% /sf /scale /param2 - scale factor (default 4.0)%6% 02/18/87 R. Watson Added parser stuff. Speedup mods.%%% deCompress .%(% returns -a bitimage string on the stack% /deCompress{& /count getByte byte def % get count /ind 0 def % preset index) count 16#80 and 0 eq { % if bit stream /count count 1 add def9 outstring 0 count getinterval % get right size string% inp exch readhexstring % get bytes$ pop % toss readhexstring status } { % else repeated string! getByte % get byte to repeat> 16#100 count sub 1 add /count exch def% get abs val of count count { outstring ind byte pu.t& /ind ind 1 add def % advance index } repeat/ outstring 0 count getinterval % return string } ifelse} def %% getByte%!% returns /byte = next input byte-% = 0 if no more bytes on input stream%/getByte{+ inp instring readhexstring { % if got one' 0 get /byte exch def % store in byte } { % else 0 pop /byte 0 def } ifelse} def%% main program%/main{( /sTime usertime def % save start timeK%%% vmstatus 10 20 strin /g cvrs dbg exch writestring dbg ( ) writestringK%%% 10 20 string cvrs dbg exch writestring dbg ( ) writestringM%%% 10 20 string cvrs dbg exch writestring dbg ( \n) writestring%%% flush1 /iscale 1 scale div def % compute scale factor+ 512 { getByte} repeat % eat paint header@% 576 720 1 [iscale 0.0 0.0 iscale 0.0 0.0] { deCompress } imageD 576 720 true [iscale 0.0 0.0 iscale 0.0 0.0] {deCompress} imagemask1%%% usertime sTime sub 1000 div 10 20 string cvr0s)%%% dbg exch writestring dbg ( seconds )%%% writestringJ%%% vmstatus 10 20 string cvrs dbg exch writestring dbg ( ) writestringI%%% 10 20 string cvrs dbg exch writestring dbg ( ) writestringM%%% 10 20 string cvrs dbg exch writestring dbg ( \n) writestring%%% flush showpage, currentfile flushfile % avoid laser_log's} def%% executable initialization%*/inp (%stdin) (r) file def % define files/dbg (%stdout) (w) file def/table [8 [1/#copies 1 (.nc .ncopies .param1)] % number of copies2 [/scale 4.0 (.sf .scale .param2)] % scale factor] deftable { % apply defaults /ta exch def % save array ta 0 get % key ta 1 get % default value def % define default value} forall7currentdict /parser known {parser} if % if user inputs0/identity matrix def % make an identity matrix6/outstring 128 string def % storage for output string'/instring 1 string def % input buffer01 72 mul 10 72 mul m2oveto currentpoint translate<currentpoint transform % see where we are in device coords:identity setmatrix % turn off transformation - switch to % device coordinate system0translate % move origin to transformed currpt/doit {: {main} stopped { (error stack:\n) = pstack flush quit} if} def%doitmainww %% Parser takes 2 arguments as input:>% /params is an array of pairs of keyword strings and values:9% [ (param1) value1 (param2) value2 ... (paramn3) valuen]?% /table is an array of key/default value/keyword list arrays:(% [ [/key1 default1 (.key1 .whatever1)](% [/key2 default2 (.key2 .whatever2)] % ... ]B% Parser first defines /key1 to default1, /key2 to default2, etc.B% Then, for each param keyword in /params, it searches the arraysA% in /table for a matching keyword. If found, it sets /key? to % the value from /params. /parser {5% process each keyword value pair in the params array! /pindex 0 def % prese4t index params length 2 idiv {5 params pindex get length 1 add % build keyword str string /ks exch def3 ks 1 params pindex get putinterval % (.) ks 0 46 put /ok false def % preset flag table { % for each array! /ta exch def % get the array ta 2 get % get token string% ks search { % search for keyword% pop pop pop % flush search stuff ta 0 get % get key, params pindex 1 add get % get new value def % set new value& 5 /ok true def % flag keyword found exit % -forall } { pop % flush failed search } ifelse } forall % try next array$ ok not { % if keyword not found) ks = (is not a known parameter) = quit } if2 /pindex pindex 2 add def % advance to next pair } repeat} defww`*G% The program below may be downloaded to a LaserWriter to correct three.% bugs in the LaserWriter's serial I/O driver:%-% - occasional failure to send a needed XON66% - erroneously reading past end-of-file (control-D)7% - dropped characters during large volumes of output%%!90000000000 % the exitserver passwordversion (23.0) neE {(Patch not installed -- wrong printer type or version) = stop} if!statusdict /Patch1Installed known? {(Patch already installed -- not installed again) = stop} ifserverdict begin exitserver$statusdict /Patch1Installed true putcurrentfile eexec@ce1b9f428ac69e75cc47a554265ae625851e01 754ac649ad44c1c34e4c60a0493@a80212a3bd61248f8859cb1252a7320775a6d4ec524bcbf5771aceb8f61ea2fb@48fcb3df8da0f105be40f697239ef0976f92c1d41e915a7389200a3e896cd955@d197ff27f22a617c85bce7ed59ef1a6062d01d0fdee5b4e7d298997638497cc6@a2d56a0eacc195795949f515bbbda9cfe899e43ad257da93f3144797b00dbb81@8a41b4fa56a0295c25e693864084cbb5d63834f1d94a46816d4a2cbe005cc57c@38491a6a34cfbdef303ed8731dbbe84dc6f8e1e790f3d89360d063639c8411fd@89ad7c53d1b9732bd0942bc36257208d24792ea7c66790b6104c3a2b794a1460@c476ffdb5552f4288f457b47319cccb0c9980036402eaca80c0b5e0ccb5f579df@09cc6f382b536aa64da7152356c377a5b708a378e855a7ec3eccd848d5508dbf@5c7bd28c2899e9cfd7f4ff3d7ddc08006cce42b2d8c59ef64af8ec74a2f9d23f@e8d4d03ba1e2686138fffc2af9c662c994ec8065a32144ba9ac5002623b39012@521eb49cd829c3506af2895bf275367eb4d31908b14f3b1e0abfaca2f98eb9d8@8d84ac8271ef44def53d8207ce9653d598fe8046120f223bfca0b5c74a54f70b@eb5a0bc09d8e79742048b875864a3b489eb91c09b701f506e994271a6640f78a@d131f1eef3c96e546f7273fb3533799a6470be2ed3b8f2e211bf9f9f209e 9dbd2@36c19d4b0b3f28ab16c39faa17070699543c212c76081961c949ebd32ada3c93@ccdc56c2c940a2061bc11794a0159cc37255aa8c8e7e08d78f204161f1eccb7d@ad3313b737e921b7df1fe794e9a7fc2226702ee555ceb8e803a20ebeaa440a40@9e1f1a72412586e3071292b10e938e7f386b8e6516758633bab57223e071b1de@8c4b73cafababc0af7bc902e8763a2817861591d7ee98f85bc28ad0ea4d13660@d3256aa293df1959b7b57b13edee653cfdda2fafe0698898dc5e371ca4c5b72b@b92750d0eea5e74955712b06958663f424a46cf75a797590f0d2a36842fe07e3@db459215dab6e461a4c3fbb40ee2499af3fe4b :13790de87e11afde6aadd12e77@d84d8076146d797269c9188d8fb725898aee284e62c472e0e7b585ef3fed434c@000b0bb70ad6806e840cfe872ec3f28782dd08b70d29c2da2187e2dc0f13dfc0@89f75344e3dad78a1c9b909fc72bdd92421afdc8b80850ff0d43605edfd9be56@d81cb17250ce7208354548f6ccc62366e8196d4adeb2d24fd5ce47bb6295fa72@c361197cafacbd51efd36dfa59c6f8e6cab8915a8043d609eb64726de86080d2@4118cc69e01eab0f4ef1f364c815f306d5f43420cf7c9316e5ee69c7183dd8d2*805a9dfe6abb33c46d3a212d5c6b6fd68418eef971ww`<,% this is so t;hat spooling to _ps will work.ww`N%!PS-Adobe-1.0/inch {72 mul} def /setuppage { initgraphics 0 11 inch translate -90 rotate /x 1 inch def /y 7 inch def= .5 inch .5 inch moveto 10 inch 0 rlineto 0 7.5 inch rlineto% -10 inch 0 rlineto closepath stroke} def /h-user {. /Helvetica findfont .4 inch scalefont setfont x y moveto (User: ) show show /y y .75 inch sub def} def/h-job {. /Helvetica findfont .4 inch scalefont setfont x< y movetoB statusdict /printername known { % if we know about printer namesD 50 string statusdict /printername get exec /p-printername exch def7 statusdict /product known { % if we know our product3 statusdict /product get exec /p-product exch def p-product showA p-printername p-product ne { % if not same name as by default (: ) show p-printername show } if } { p-printername show } ifelse } { (LASER) show } ifelse /y y .75 inch sub def= x y moveto (Job: ) show show /y y .75 inch sub def} def /h-file {. /Helvetica findfont .4 inch scalefont setfont x y moveto (File: ) show= dup stringwidth pop 8 inch exch div % get space/length9 dup 1 lt { .4 inch mul % if less space than length@ /Helvetica findfont exch scalefont setfont } % resize the font( { pop } ifelse % else leave font alone show /y y .75 inch sub def} def /h-time {. /Helvetica findfont .4 inch scalefont setfo>nt x y moveto (Date: ) show show /y y .75 inch sub def} def /h-error {. /Helvetica findfont .4 inch scalefont setfont x y moveto (Error: ) show7 dup stringwidth pop 8 inch exch div % get space/length3 dup 1 lt { .4 inch mul % if less space than length@ /Helvetica findfont exch scalefont setfont } % resize the font( { pop } ifelse % else leave font alone show /y y .75 inch sub def} def /h-pages {. /Helvetica findfont .4 inch scalefont setfont x y moveto? (Pages: ) showE cvi statusdict /pagecount get exec exch sub 1 add 10 string cvs show /y y .75 inch sub def} def /h-logline {) /Helvetica findfont 12 scalefont setfont x y moveto show /y y 12 sub def} defww'j%!.%%% PostScript program to plot Zeta plot files%% R. Watson 31-Jan-85%<% inputs: /param1 or /#copies - number of copies (default 1)3% /param2 or /scalefact - scale factor (default 1)3% /param3 or /zFont - use Zeta font (default true@)=% /param4 or /penscale - scaling to apply to pen (default 1)8% /param5 or /usepens - use pen color if nz (default 0)%% Not supported yet:%% 1. Shaded characters% 2. Aspect characters%(% 09/13/85 add pre-processed definitions% zFont defaults to true% scalefact defaults to 1<% 05/30/86 Ignore level one "6" commands (whatever they are)2% 06/20/86 J.Knox Fix problems with circle command*% 02/15/87 R.Watson add default parametersB% 02/20/87 R.Watson add default table, remAove debug print, remove % input timeout avoidance.>% 03/06/87 M. Kaczmarczik/J. Taylor add scaling factor for pen6% 04/01/87 R. Watson Opcode 6 is alternate pen select.9% Added parameter usepens to select pen color/shading. "% Default changed to no shading.%-/lTime usertime def % save load start time%% initialization.%/init{:%%% dbg 1 string dup 0 7 put writestring flush % ring bell newpath* /aspect 256 def % preset default aspect0 0 0 moveto % preset startBing location on page! /pen false def % preset pen up' /sTime usertime def % save start time} def% read a zeta byte /getz {  {% inp read not {eofError} if % if EOF; dup 32 gt {exit} {pop} ifelse % exit loop if not <= space } loop( dup /zn exch def % define zeta number/ zb 0 3 -1 roll put % put char code in string} def%% check for 9 more Z's% /checkZeta {+ 9 { getz zb (Z) ne {notZerror} if } repeat} def%% main program%/main{C { gsave init waitBytes % wait for a job/ not {grestore exit} if % if waitBytes false checkZeta levelOne grestore } loop} def3%% waitBytes - waits until there is a "Z" on stdin.%&% return true if Z found, false if EOF /waitBytes{ {E%%% % uncomment these lines to wait forever for plots with no timeout%%% inp bytesavailable 0 ne {+ inp read not { false exit } if % if EOF# 16#5A eq {true exit} if % if Z %%% } if } loop} defD&% levelOne - process level 1 commands /levelOne{ { getz %get a byte zb (Z) eq { % Z stroke8%%% debug usertime sTime sub 1000 div 10 20 string cvrs1%%% debug dbg exch writestring dbg ( seconds\n)%%% debug writestring flush,%%% debug lTime 1000 div 10 20 string cvrs 3%%% debug dbg exch writestring dbg ( load time\n)%%% debug writestring flush showpage exit } if {  zb (0) eq { % 0 - nop exit } if zb (1) eq {E % 1 - pen up /pen false def exit } if zb (2) eq { % 2 - pen down /pen true def exit } if' zb (3) eq { % 3 - character vector cVector exit } if' zb (4) eq { % 4 - center char vect ccVector exit } if% zb (5) eq { % 5 - numeric vector nVector exit } if! zb (6) eq { % 6 - pen select 1 crb % get pen' usepens 0 ne{ % if shading enabled pencolor exch get setgray )F} { pop } ifelse exit } if zb (7) eq { % 7 - level 2 levelTwo exit } if vector exit } loop } loop %do this one forever } def% level two commands /levelTwo{ getz % get level 2 type { zb (1) eq { % 1 - pen 1 /pen false def emit pencolor 0 get setgray exit } if zb (2) eq { % 2 - pen 2 /pen false def emit pencolor 1 get setgray exit } if zb (3) eq !G{ % 3 - pen 3 /pen false def emit pencolor 2 get setgray exit } if zb (4) eq { % 4 - pen 4 /pen false def emit pencolor 3 get setgray exit } if# zb (7) eq { % 7 - enter level 3 levelThree exit } if zb (B) eq { % B - enter dash emit& dashes 0. setdash % enter dash mode exit } if zb (C) eq { % C - exit dash emit [] 0. setdash exit } if! zb (D) eq { % D - define dash emiHt % close current path$ getz getxy % get dash definition- /d1 ix def /d2 iy def % save first 2 parts getz getxy0 /dashes [d1 d2 ix d2] def % define dash array& dashes 0. setdash % enter dash mode exit } if" zb (E) eq { % E - define slant getz getxy % eat slant exit } if# zb (F) eq { % F - define aspect getz getxy % eat aspect /aspect ix def exit } if zb (G) eq { % G - circle/arc doCircle exit } if" zb (H)%I eq { % H - terminal msg termMsg exit } if zb (I) eq { % I - shade getz getxy exit } if% process rest of level 2 exit } loop} def% process line vector/vector{ getxy % get crb x y? pen {ix iy rlineto} {ix iy rmoveto emit} ifelse %do the vector} def% process character vector/cVector{ getz % get vector control getxy % decode vector 2 crb % get length) dup string /cstr exch def % build strinJg /cind 0 def % preset index { 2 crb ) dup 0 lt {pop 0} if % DEBUG if negative* dup 127 gt {pop 0} if % DEBUG if too big. zFont {sym exch get} % map zeta to zeta code3 {zta exch get} ifelse % get ascii char code+ cstr cind 3 -1 roll put % put into string+ cind 1 add /cind exch def % advance index } repeat % length times- /sn cstr length def % get string char count6 ix dup mul iy dup mul add sqrt /iz exch def % calc iz iz sn dofont % scale font( cstr striKngwidth % get string lengths /sy exch def /sx exch def) iy ix atan rotate % rotate co-ordinatesC iz sx sub sn div 0 cstr ashow % do string rel to new co-ord (dy=0) emit% iy ix atan neg rotate % rotate back /pen false def % pick up pen} def$% process centered character vector /ccVector{ getz % get vector control getxy % decode vector+ /cstr 1 string def % define 1 char string 1 crb abs. zFont {sym exch get} % map zeta to zeta code3 {zta exch L get} ifelse % get ascii char code5 cstr 0 3 -1 roll put % insert character into string- /sn cstr length def % get string char count6 ix dup mul iy dup mul add sqrt /iz exch def % calc iz iz sn dofont % scale font( cstr stringwidth % get string lengths /sy exch def /sx exch def$ currentpoint % save current point) iy ix atan rotate % rotate co-ordinatesA cw -6 mul 22 div ch -6 mul 22 div rmoveto % backup 1/2 char size1 cstr show % do string rel to new co-ord (dy=0) emiMt% iy ix atan neg rotate % rotate back" moveto % restore current point /pen false def % pick up pen} def3% dofont -- set up font/dofont{2 /nc exch def % define number of chars in string* /zc exch def % define length of string & zFont {/ZetaFont findfont} % get font# {/Helvetica findfont} ifelse) /cw zc nc div def % get character width; cw 256. mul aspect div /ch exch def % get character height& [cw 0 0 ch 0 0] makefont % scNale font setfont % set font} def% process numeric vector/nVector{ getz % get vector control getxy % decode vector 1 crb % get length) dup string /cstr exch def % build string /cind 0 def % preset index {8 zFont {1 crb ztf exch get} % convert to zeta font code9 {1 crb ztn exch get} ifelse % get ascii char code+ cstr cind 3 -1 roll put % put into string+ cind 1 add /cind exch def % advance index } repeat % length times- /sn cstr leOngth def % get string char count6 ix dup mul iy dup mul add sqrt /iz exch def % calc iz iz sn dofont % scale font( cstr stringwidth % get string lengths /sy exch def /sx exch def) iy ix atan rotate % rotate co-ordinatesC iz sx sub sn div 0 cstr ashow % do string rel to new co-ord (dy=0) emit% iy ix atan neg rotate % rotate back /pen false def % pick up pen} def % doCircle /doCircle{! getz % get circle/arc control {" zb (0) eq zb (I) eq or {% if arc!P zb (0) eq % save arc direction getz % get vector control getxy % get vector 1 /x1 ix def /y1 iy def getz % get vector 2 getxy /x2 ix def /y2 iy def3 currentpoint /y exch def /x exch def %get cur pt2% x1 y1 rmoveto % start arc at end of 1st vector. x1 dup mul % r = sqrt((x1-x)**2+(y1-y)**2) y1 dup mul add sqrt /r exch def* y1 x1 atan /theta1 exch def %get angles y2 x2 atan /theta2 exch def% x x1 sub y y1 sub r theta1 theta2 ;Q 6 -1 roll { arc } { arcn } ifelse % use saved arc state: x x1 sub x2 add y y1 sub y2 add moveto % return to base exit } if % else we have a circle getxy % get vector3 currentpoint /y exch def /x exch def % get cur pt0 ix iy rmoveto % start circle at end of vector% ix dup mul % r = sqrt(ix**2+iy**2) iy dup mul add sqrt /r exch def! x y r 0. 360. arc % draw circle x y moveto % return to base exit } loop} def3% crb R - get crb number/crb{ /sum 0 def*% repeat sum = (sum shift 5) + zn5 dup { sum 5 bitshift getzv add /sum exch def} repeat1% check for negative - if so then or in -1's maskE 5 mul 1 sub -1 exch bitshift dup sum and 0 ne {sum or /sum exch def} {pop} ifelse sum % return sum} def;% getzv - convert NEXT zb to zeta binary number/getzv{ getz7 zn 16#41 lt {zn 16#30 sub} {zn 16#41 sub 8 add} ifelse} def#% getxy - ix,iy set tSo crb value/getxy{3 zn 16#41 sub 1 add dup /ny exch def %ny = zn-'A'+1) 5 div cvi dup /nx exch def %nx = ny / 53 5 mul ny exch sub cvi /ny exch def %ny = ny - 5*nx% get x and y displacement$ nx crb /ix exch def %ix = crb(nx)$ ny crb /iy exch def %iy = crb(ny)} def% emit - draw the current path/emit{$ currentpoint % save where we are stroke % draw current path& moveto % position to where we are} def&% debugi - write debug integTer/debugi{B 16 10 string cvrs dbg exch writestring dbg (\n) writestring flush} def)% debugs - write debug string/debugs{/ dbg exch writestring dbg ( ) writestring flush} def% executable initialization5(%stdin) (r) file /inp exch def % define input file5(%stdout) (w) file /dbg exch def % define debug file&/zb 1 string def % zeta byte string@/pencolor [0. .35 .50 .70 0. .35 .50 .7] def % pen color shading/16#3f 16#3f 16#3f 16#2b 16#3f U16#3f 16#3f 16#3f/16#5a 16#3f 16#3f 16#2a 16#3f 16#3f 16#3f 16#3f/16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f /16#20 16#41 16#42 16#43 16#44 16#45 16#46 16#47/16#48 16#49 16#3f 16#2e 16#3c 16#28 16#2b 16#7c/16#26 16#4a 16#4b 16#4c 16#4d 16#4e V16#4f 16#50/16#51 16#52 16#21 16#24 16#2a 16#29 16#3b 16#3f/16#2d 16#2f 16#53 16#54 16#55 16#56 16#57 16#58/16#59 16#5a 16#3f 16#2c 16#25 16#5f 16#3e 16#3f/16#30 16#31 16#32 16#33 16#34 16#35 16#36 16#37/16#38 16#39 16#3a 16#23 16#40 16#27 16#3d 16#22/16#61 16#62 16#63 16#64 16#65 16#66 16#67 16#68/16#69 16#6a 16#6b 16#6c 16#1d 16#6e 16#6f 16#70/17#71 16#72 16#73 16#74 16#75 16#76 16#77 16#78/16#79 16#7a 16#3f 16#3f 16#1f 16#3f 16#3f 16#3f016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f W16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f XN16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 256 array astore /zta exch def/16#30 16#31 16#32 16#33 16#34 16#35 16#36 16#37516#38 16#39 16#2d 16#2e 12 array astore /ztn exch defL/ztf [44 45 46 47 48 49 50 51 52 53 55 64] def % zeta numeric vector to font'[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15=16 17 73 114 120 17 113 84 110 16 109 87 117 125 118 119 127 4126 91 92 93 94 95 96 97 98 99 100 101 102 16 16 88 883 115 116 89 66 67 79 103 85 105 106 121 82 122 123 62 118 19 20 21 22 2 Y3 24 25 26 108 64 75 58 54 86 72 127 28 29 30 31 32 33 34 35 71 60 56 59 80 111 55 157 36 37 38 39 40 41 42 43 107 63 74 16 76 78 44 145 46 47 48 49 50 51 52 53 68 70 77 69 61 65 128 @129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 ?145 146 147 148 149 150 151 152 153 154 90 104 155 156 157 158 ?159 81 124 160 161 162 163 164 165 166 167 112 168 169 170 171 @172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 @188 189 190 191 192 193 194 195 196 197 198 199 20Z0 201 202 203 7204 205 206 207 208 209 210 211 212 213 ] /sym exch def/ZetaFontDict 8 dict def/$workingdict 100 dict defZetaFontDict begin /FontType 3 def( /FontMatrix [.04545 0 0 .04545 0 0] def /FontBBox [0 0 22 22] def /Encoding 256 array defE 3 string 0 1 255 {dup 10 3 index cvrs cvn Encoding 3 1 roll put} for pop /CharArrays 214 dict dup beginD/0 [ 16#10606 16#2060C 16#20C0C 16#20C00 16#20000 16#2000C 16#2060C  16#20606 ] defD/1 [ 16#10606 16#2060C 16#2030C 16 [#20009 16#20003 16#20300 16#20900 7 16#20C03 16#20C09 16#2090C 16#2060C 16#20606 ] def7/2 [ 16#1060C 16#20002 16#20C02 16#2060C 16#20606 ] defD/3 [ 16#10006 16#20606 16#2060C 16#20606 16#20C06 16#20606 16#20600  16#20606 ] def@/4 [ 16#1000C 16#20C00 16#20606 16#20C0C 16#20000 16#20606 ] defI/5 [ 16#10606 16#2060C 16#20006 16#20600 16#20C06 16#2060C 16#20606 ] defI/6 [ 16#10600 16#2060C 16#20006 16#20C06 16#2060C 16#20606 16#20606 ] def7/7 [ 16#10C00 16#2000C 16#20C0C 16#20000 16# \20606 ] defI/8 [ 16#1000C 16#20C0C 16#20000 16#20C00 16#10906 16#20306 16#20606 ] def@/9 [ 16#10600 16#20606 16#2000C 16#20606 16#20C0C 16#20606 ] defE/10 [ 16#10909 16#20903 16#20C00 16#20903 16#20303 16#20000 16#20303 A 16#20309 16#2000C 16#20309 16#20909 16#20C0C 16#20606 ] defE/11 [ 16#10006 16#20C06 16#20606 16#2060C 16#20600 16#20606 16#2000C 8 16#20C00 16#20606 16#20C0C 16#20000 16#20606 ] defA/12 [ 16#10606 16#2000C 16#20C0C 16#20000 16#20C00 16#20606 ] def&/13 [ 16#106 ]00 16#2060C 16#20606 ] defE/14 [ 16#1060C 16#20003 16#20C03 16#2060C 16#20609 16#20009 16#20600 & 16#20C09 16#20609 16#20606 ] def&/15 [ 16#1070A 16#20F0A 16#11500 ] def&/16 [ 16#10400 16#20408 16#11500 ] def/17 [ 16#11500 ] defE/18 [ 16#10000 16#20010 16#20415 16#20B15 16#20F10 16#20F00 16#10008  16#20F08 16#11500 ] defE/19 [ 16#10000 16#20015 16#20B15 16#20F12 16#20F0E 16#20B0B 16#2000B A 16#10B0B 16#20F08 16#20F03 16#20B00 16#20000 16#11500 ] defE/20 [ 16#10F03 16#20 ^B00 16#20400 16#20003 16#20012 16#20415 16#20B15  16#20F12 16#11500 ] defJ/21 [ 16#20015 16#20C15 16#20F12 16#20F03 16#20C00 16#20000 16#11500 ] defE/22 [ 16#10F15 16#20015 16#2000B 16#20A0B 16#2000B 16#20000 16#20F00  16#11500 ] defJ/23 [ 16#10F15 16#20015 16#2000B 16#20B0B 16#2000B 16#20000 16#11500 ] defE/24 [ 16#10F0F 16#20F12 16#20C15 16#20315 16#20012 16#20003 16#20300 A 16#20C00 16#20F03 16#20F09 16#20C09 16#21109 16#11500 ] defA/25 [ 16#20015 16#2000B 16#20F0B 16# _20F15 16#20F00 16#11500 ] defE/26 [ 16#10400 16#20700 16#20715 16#20415 16#20A15 16#20715 16#20700  16#20A00 16#11500 ] defJ/27 [ 16#10006 16#20003 16#20300 16#20C00 16#20F03 16#20F15 16#11500 ] defA/28 [ 16#20015 16#20008 16#20F15 16#2070E 16#20F00 16#11500 ] def//29 [ 16#10015 16#20000 16#20F00 16#11500 ] def8/30 [ 16#20015 16#2070B 16#20E15 16#20E00 16#11500 ] def//31 [ 16#20015 16#20F00 16#20F15 16#11500 ] defE/32 [ 16#10300 16#20003 16#20012 16#20315 16#20C15 16#20F12 16#20C0F ` 8 16#20F12 16#20F03 16#20C00 16#20300 16#11500 ] defJ/33 [ 16#20015 16#20C15 16#20F12 16#20F0E 16#20C0B 16#2000B 16#11500 ] defE/34 [ 16#10808 16#20E02 16#20C00 16#20300 16#20003 16#20012 16#20315 A 16#20C15 16#20F12 16#20F03 16#20E02 16#20F00 16#11500 ] defE/35 [ 16#20015 16#20C15 16#20F12 16#20F0E 16#20C0B 16#2000B 16#2080B  16#20F00 16#11500 ] defE/36 [ 16#10006 16#20003 16#20300 16#20C00 16#20F03 16#20F08 16#20C0B J 16#2030B 16#2000E 16#20012 16#20315 16#20C15 1 a6#20F12 16#11500 ] def8/37 [ 16#10700 16#20715 16#20015 16#20E15 16#11500 ] defJ/38 [ 16#10015 16#20003 16#20300 16#20C00 16#20F03 16#20F15 16#11500 ] def//39 [ 16#10015 16#20700 16#20E15 16#11500 ] defA/40 [ 16#10015 16#20000 16#2070A 16#20E00 16#20E15 16#11500 ] def//41 [ 16#20F15 16#10015 16#20F00 16#11500 ] defJ/42 [ 16#10700 16#2070B 16#20015 16#2070B 16#20E15 16#2070B 16#11500 ] defE/43 [ 16#10015 16#20F15 16#2070A 16#2040A 16#20A0A 16#2070A 16#20000  16#20F00 16#11500 ] defE b/44 [ 16#10F03 16#20B00 16#20400 16#20003 16#20012 16#20415 16#20B15 & 16#20F12 16#20F03 16#11500 ] defJ/45 [ 16#10800 16#20815 16#20512 16#10500 16#20B00 16#20800 16#11500 ] defE/46 [ 16#10F00 16#20000 16#20003 16#20F10 16#20F12 16#20C15 16#20315 & 16#20012 16#20010 16#11500 ] defE/47 [ 16#10012 16#20315 16#20C15 16#20F12 16#20F0E 16#20C0B 16#2030B J 16#20C0B 16#20F08 16#20F03 16#20C00 16#20300 16#20003 16#11500 ] def8/48 [ 16#10C00 16#20C15 16#20006 16#20F06 16#11500 ] defEc/49 [ 16#10005 16#20003 16#20300 16#20C00 16#20F03 16#20F08 16#20C0B / 16#2000B 16#20015 16#20F15 16#11500 ] defE/50 [ 16#10008 16#2030B 16#20C0B 16#20F08 16#20F03 16#20C00 16#20300 A 16#20003 16#20012 16#20315 16#20C15 16#20F12 16#11500 ] defA/51 [ 16#10012 16#20015 16#20F15 16#20F12 16#20700 16#11500 ] defE/52 [ 16#10C00 16#20300 16#20003 16#20008 16#2030B 16#20C0B 16#20F0E E 16#20F12 16#20C15 16#20315 16#20012 16#2000E 16#2030B 16#20C0B / 16#20F08 16#20F03 16#20C00 d 16#11500 ] defE/53 [ 16#10003 16#20300 16#20C00 16#20F03 16#20F12 16#20C15 16#20315 A 16#20012 16#2000D 16#2030A 16#20C0A 16#20F0D 16#11500 ] defA/54 [ 16#10700 16#2070E 16#20707 16#20007 16#20E07 16#11500 ] def&/55 [ 16#10007 16#20E07 16#11500 ] defE/56 [ 16#20E0E 16#20707 16#2070E 16#20700 16#20707 16#2000E 16#20E00 / 16#20707 16#20007 16#20E07 16#11500 ] def/57 [ 16#20F15 16#11500 ] def8/58 [ 16#10800 16#20504 16#20511 16#20815 16#11500 ] def8/59 [ 16#10700 16#20A04 16#2 e0A11 16#20715 16#11500 ] defE/60 [ 16#10005 16#20302 16#20C02 16#20F05 16#20F09 16#20C0C 16#2030C J 16#2000F 16#20313 16#20C13 16#20F0F 16#10815 16#20800 16#11500 ] def8/61 [ 16#10003 16#20F03 16#10F0A 16#2000A 16#11500 ] def/62 [ 16#11500 ] defJ/63 [ 16#10700 16#20903 16#20905 16#20705 16#20703 16#20903 16#11500 ] defA/64 [ 16#10700 16#20702 16#20902 16#20900 16#20700 16#11500 ] defE/65 [ 16#10310 16#20015 16#20315 16#20310 16#10910 16#20615 16#20915  16#20910 16#11500 ] def8 f/66 [ 16#10B00 16#20400 16#20415 16#20B15 16#11500 ] def8/67 [ 16#10400 16#20B00 16#20B15 16#20415 16#11500 ] defE/68 [ 16#10703 16#20705 16#20905 16#20903 16#20703 16#1070A 16#2070C / 16#2090C 16#2090A 16#2070A 16#11500 ] def8/69 [ 16#10910 16#20615 16#20915 16#20910 16#11500 ] defE/70 [ 16#10300 16#2030F 16#2030C 16#2000C 16#20F0C 16#20C0C 16#20C0F 8 16#20C00 16#20C03 16#20F03 16#20003 16#11500 ] defJ/71 [ 16#10803 16#20600 16#20A00 16#20803 16#10806 16#20815 16#11500 ] defE/72 g[ 16#10F06 16#20703 16#20403 16#20006 16#20009 16#20A12 16#20615 & 16#20312 16#20F00 16#11500 ] def&/73 [ 16#2070F 16#20E00 16#11500 ] defE/74 [ 16#10012 16#20014 16#20214 16#20212 16#20012 16#10F15 16#20000 A 16#10D00 16#20D02 16#20F02 16#20F00 16#20D00 16#11500 ] def//75 [ 16#10F0E 16#20007 16#20F00 16#11500 ] def&/76 [ 16#20F07 16#2000E 16#11500 ] defE/77 [ 16#10F0C 16#20C0F 16#2080F 16#2050C 16#20508 16#20805 16#20C05 e 16#20F08 16#20F12 16#20C15 16#20315 16#20012 16#20 h003 16#20300 16#20C00 16#20F03 16#11500 ] defE/78 [ 16#1000F 16#20012 16#20315 16#20C15 16#20F12 16#20F0E 16#20C0B J 16#2070B 16#20706 16#10703 16#20900 16#20500 16#20703 16#11500 ] def&/79 [ 16#10015 16#20F00 16#11500 ] defE/80 [ 16#10700 16#20903 16#20905 16#20705 16#20703 16#20903 16#1090A 8 16#2090C 16#2070C 16#2070A 16#2090A 16#11500 ] def8/81 [ 16#1000F 16#20600 16#20C0F 16#2000F 16#11500 ] def//82 [ 16#20F0F 16#1000F 16#20F00 16#11500 ] defE/83 [ 16#1070D 16#2070F 16#2090F i 16#2090D 16#2070D 16#1000A 16#20F0A A 16#10905 16#20705 16#20707 16#20907 16#20905 16#11500 ] defE/84 [ 16#10002 16#20E02 16#10E0B 16#2000B 16#2070B 16#20712 16#20704  16#11500 ] defA/85 [ 16#10003 16#20406 16#20800 16#20815 16#20F15 16#11500 ] def&/86 [ 16#10600 16#20612 16#11500 ] defE/87 [ 16#10003 16#20200 16#20500 16#20703 16#20712 16#20915 16#20C15  16#20E12 16#11500 ] defA/88 [ 16#10F15 16#20015 16#2070B 16#20000 16#20F00 16#11500 ] def//89 [ 16#2050C 16#20A00 j16#20000 16#11500 ] defE/90 [ 16#10300 16#20603 16#2060C 16#2090F 16#20C0F 16#20F0C 16#20F09 / 16#20C06 16#20906 16#20609 16#11500 ] defE/91 [ 16#2030F 16#20306 16#20603 16#20903 16#20C06 16#20C0F 16#20C06  16#20F03 16#11500 ] defJ/92 [ 16#10400 16#2040F 16#2000F 16#20F0F 16#20C0F 16#20C00 16#11500 ] defE/93 [ 16#10700 16#20702 16#20302 16#20005 16#2000A 16#2030D 16#20B0D A 16#20E0A 16#20E05 16#20B02 16#20702 16#2070F 16#11500 ] defE/94 [ 16#10007 16#20207 16#2020B 16#20 k50E 16#20A0E 16#20D0B 16#20D03 A 16#20A00 16#20500 16#20203 16#20207 16#20F07 16#11500 ] defE/95 [ 16#10011 16#20311 16#20307 16#20704 16#20B07 16#20B11 16#20E11 & 16#10715 16#20700 16#11500 ] defJ/96 [ 16#10303 16#20F0C 16#1030C 16#2060C 16#20C03 16#20F03 16#11500 ] defE/97 [ 16#1030C 16#20303 16#20600 16#20903 16#2090C 16#10903 16#20C00 & 16#20F03 16#20F0C 16#11500 ] defJ/98 [ 16#1000F 16#2030D 16#20707 16#20000 16#20707 16#20F03 16#11500 ] defE/99 [ 16#10F0F 16#20C0F 16#2 l090C 16#2070F 16#2020F 16#2000C 16#20007 S 16#20204 16#20704 16#20907 16#2090C 16#20907 16#20C04 16#20F04 16#11500 ] defF/100 [ 16#10C0F 16#2070F 16#2040C 16#20709 16#20C09 16#20F07 16#20F02 B 16#20C00 16#20700 16#20402 16#20407 16#20709 16#11500 ] defF/101 [ 16#10309 16#20F09 16#10F0F 16#2090F 16#2060C 16#20606 16#20903  16#20F03 16#11500 ] defF/102 [ 16#10309 16#2060F 16#2090C 16#20606 16#1090C 16#20C0F 16#20F0C  16#20C00 16#11500 ] defF/103 [ 16#10700 16#20712 16# m20315 16#20012 16#20315 16#20712 16#20B15 0 16#20E12 16#20B15 16#20712 16#11500 ] defF/104 [ 16#10906 16#20C06 16#20F09 16#20F0C 16#20C0F 16#2090F 16#2060C ' 16#20609 16#20906 16#11500 ] defK/105 [ 16#10615 16#20600 16#10312 16#20912 16#10306 16#20906 16#11500 ] defF/106 [ 16#10615 16#20600 16#10312 16#20912 16#1030C 16#2090C 16#10306  16#20906 16#11500 ] defF/107 [ 16#10303 16#20603 16#20906 16#20C03 16#20F03 16#21206 16#21209 F 16#20F0C 16#20C0C 16#20909 16#2060C 1 n6#2030C 16#20009 16#20006 0 16#20303 16#10909 16#20906 16#11500 ] defF/108 [ 16#10612 16#20600 16#10C0C 16#2090F 16#2030F 16#2000C 16#20006 0 16#20303 16#20903 16#20C06 16#11500 ] def'/109 [ 16#10015 16#21215 16#11500 ] def'/110 [ 16#10009 16#20F09 16#11500 ] def0/111 [ 16#10009 16#20C09 16#20C03 16#11500 ] defB/112 [ 16#10309 16#20900 16#20F09 16#20912 16#20309 16#11500 ] defK/113 [ 16#10303 16#2090F 16#1000C 16#20C0C 16#10006 16#20C06 16#11500 ] defK/114 [ 16#10003 16#20F03 1o6#10F08 16#20008 16#1000D 16#20F0D 16#11500 ] defB/115 [ 16#10001 16#20F01 16#10F05 16#2000A 16#20F0F 16#11500 ] defB/116 [ 16#1000F 16#20F0A 16#20005 16#10001 16#20F01 16#11500 ] defK/117 [ 16#10003 16#20B03 16#20E07 16#20E0B 16#20B0F 16#2000F 16#11500 ] defK/118 [ 16#10006 16#20209 16#20509 16#20A03 16#20D03 16#20F06 16#11500 ] defF/119 [ 16#10006 16#20209 16#20509 16#20A03 16#20D03 16#20F06 16#1000A B 16#2020D 16#2050D 16#20A07 16#20D07 16#20F0A 16#11500 ] defB/120 [ 16#10008 16#20F p08 16#20B0C 16#20B04 16#20F08 16#11500 ] defB/121 [ 16#10008 16#2040C 16#20404 16#20008 16#20F08 16#11500 ] defB/122 [ 16#10800 16#20815 16#20411 16#20C11 16#20815 16#11500 ] defB/123 [ 16#10800 16#20404 16#20C04 16#20800 16#20815 16#11500 ] def/124 [ 16#11500 ] def0/125 [ 16#1000F 16#20700 16#20E0F 16#11500 ] defF/126 [ 16#10F00 16#20C00 16#20903 16#20907 16#2060A 16#2090D 16#20912 ' 16#20C15 16#20F15 16#11500 ] defF/127 [ 16#20300 16#20603 16#20607 16#2090A 16#2060D 16#20612 16#2031 q5  16#20015 16#11500 ] defF/128 [ 16#10309 16#20609 16#20906 16#20903 16#20600 16#20000 16#20003 0 16#20306 16#20906 16#20900 16#11500 ] defF/129 [ 16#10015 16#20003 16#20300 16#20600 16#20903 16#20906 16#20609 0 16#20309 16#20006 16#20000 16#11500 ] defF/130 [ 16#10906 16#20609 16#20309 16#20006 16#20003 16#20300 16#20600  16#20903 16#11500 ] defF/131 [ 16#10915 16#20903 16#20600 16#20300 16#20003 16#20006 16#20309 0 16#20609 16#20906 16#20900 16#11500 ] defF r/132 [ 16#10006 16#20906 16#20609 16#20309 16#20006 16#20003 16#20300 ' 16#20600 16#20903 16#11500 ] defK/133 [ 16#10009 16#20609 16#10300 16#2030F 16#20612 16#2090F 16#11500 ] defF/134 [ 16#10303 16#20003 16#20300 16#20900 16#2090C 16#2060F 16#2030F 0 16#2000C 16#20306 16#20906 16#11500 ] defF/135 [ 16#10015 16#20000 16#20006 16#20309 16#20609 16#20906 16#20900  16#11500 ] def9/136 [ 16#1060F 16#2060C 16#10609 16#20600 16#11500 ] defK/137 [ 16#10612 16#2060F 16#1060C 16 s#20603 16#20300 16#20003 16#11500 ] defF/138 [ 16#10015 16#20006 16#20306 16#20609 16#10000 16#20006 16#20306  16#20600 16#11500 ] def'/139 [ 16#10615 16#20600 16#11500 ] defK/140 [ 16#10000 16#20009 16#20303 16#20603 16#20909 16#20900 16#11500 ] defF/141 [ 16#10009 16#20000 16#20006 16#20309 16#20609 16#20906 16#20900  16#11500 ] defF/142 [ 16#10006 16#20309 16#20609 16#20906 16#20903 16#20600 16#20300 ' 16#20003 16#20006 16#11500 ] defF/143 [ 16#10000 16#20009 16#20 t30C 16#2060C 16#20909 16#20606 16#20306 ' 16#20009 16#2000C 16#11500 ] defF/144 [ 16#10900 16#20909 16#2060C 16#2030C 16#20009 16#20306 16#20606 ' 16#20909 16#2090C 16#11500 ] defK/145 [ 16#10009 16#20000 16#20006 16#20309 16#20609 16#20906 16#11500 ] defK/146 [ 16#10303 16#20600 16#20903 16#20306 16#20609 16#20906 16#11500 ] def9/147 [ 16#10615 16#20600 16#10309 16#20909 16#11500 ] defF/148 [ 16#10009 16#20003 16#20300 16#20600 16#20903 16#20909 16#20900  16#11500 ] de uf9/149 [ 16#10009 16#20300 16#20600 16#20909 16#11500 ] defK/150 [ 16#10009 16#20000 16#20306 16#20606 16#20900 16#20909 16#11500 ] def9/151 [ 16#10009 16#20900 16#10000 16#20909 16#11500 ] defF/152 [ 16#1000C 16#20009 16#20306 16#20606 16#20909 16#2090C 16#20903 0 16#20600 16#20300 16#20003 16#11500 ] def9/153 [ 16#10009 16#20909 16#20000 16#20900 16#11500 ] defK/154 [ 16#1030F 16#2060F 16#2090C 16#20906 16#20C03 16#20F03 16#11500 ] def9/155 [ 16#10606 16#20615 16#10015 16#20C15 1 v6#11500 ] def9/156 [ 16#10006 16#20309 16#20906 16#20C09 16#11500 ] defF/157 [ 16#10012 16#20312 16#20315 16#20015 16#20012 16#10912 16#20C12 0 16#20C15 16#20915 16#20912 16#11500 ] def9/158 [ 16#10306 16#2030C 16#10309 16#20F09 16#11500 ] def9/159 [ 16#10309 16#20F09 16#10F06 16#20F0C 16#11500 ] defF/160 [ 16#10303 16#20903 16#20C06 16#20C0C 16#2090F 16#2030F 16#2000C ' 16#20006 16#20303 16#11500 ] def9/161 [ 16#10000 16#20C00 16#10600 16#20615 16#11500 ] def0/162 [ 16#1001 w5 16#20000 16#20900 16#11500 ] def0/163 [ 16#10000 16#20015 16#20915 16#11500 ] defK/164 [ 16#10F0F 16#2060F 16#2030C 16#20309 16#20606 16#20F06 16#11500 ] defK/165 [ 16#10600 16#2060C 16#2090F 16#20C0F 16#20F0C 16#20F00 16#11500 ] defK/166 [ 16#1060F 16#20603 16#20900 16#20C00 16#20F03 16#20F0F 16#11500 ] defB/167 [ 16#10000 16#20F00 16#20F15 16#20015 16#20000 16#11500 ] def'/168 [ 16#10000 16#20C00 16#11500 ] defF/169 [ 16#10300 16#20C00 16#10312 16#20C12 16#10612 16#20600 16#10900  x 16#20912 16#11500 ] def'/170 [ 16#10015 16#20915 16#11500 ] def'/171 [ 16#1030C 16#2090C 16#11500 ] def'/172 [ 16#1000F 16#20C03 16#11500 ] defF/173 [ 16#10303 16#20903 16#20C06 16#20C0C 16#2090F 16#2030F 16#2000C K 16#20006 16#20303 16#10603 16#2060F 16#10009 16#20C09 16#11500 ] defF/174 [ 16#10003 16#2060F 16#20C03 16#10006 16#20309 16#20906 16#20C09  16#11500 ] defF/175 [ 16#1000F 16#20603 16#20C0F 16#10006 16#20309 16#20906 16#20C09  16#11500 ] defF/176 [ 16# y10600 16#20612 16#10003 16#20C03 16#20C03 16#2060F 16#20003  16#11500 ] defK/177 [ 16#10600 16#20612 16#1000F 16#20C0F 16#20603 16#2000F 16#11500 ] defK/178 [ 16#10000 16#20C00 16#10003 16#20C03 16#2060F 16#20003 16#11500 ] defF/179 [ 16#1000F 16#20603 16#20C0F 16#2000F 16#10006 16#20309 16#20906  16#20C09 16#11500 ] defF/180 [ 16#10003 16#10003 16#20010 16#20415 16#20B15 16#20F10 16#20F03 B 16#10009 16#20F09 16#11503 16#10000 16#20F00 16#11500 ] defF/181 [ 16#10003 16#1 z0003 16#20015 16#20B15 16#20F12 16#20F0F 16#20B0C F 16#2000C 16#10B0C 16#20F09 16#20F05 16#20B03 16#20003 16#11503 ' 16#10000 16#20F00 16#11500 ] defF/182 [ 16#10003 16#10F05 16#20B03 16#20403 16#20005 16#20012 16#20415 B 16#20B15 16#20F12 16#11503 16#10000 16#20F00 16#11500 ] defF/183 [ 16#10003 16#20015 16#20C15 16#20F12 16#20F05 16#20C03 16#20003 0 16#11503 16#10000 16#20F00 16#11500 ] defF/184 [ 16#10003 16#10F15 16#20015 16#2000C 16#20A0C 16#2000C 16#20003 9 { 16#20F03 16#11503 16#10000 16#20F00 16#11500 ] defF/185 [ 16#10003 16#10F15 16#20015 16#2000C 16#20B0C 16#2000C 16#20003 0 16#11503 16#10000 16#20F00 16#11500 ] defF/186 [ 16#10003 16#10F0F 16#20F12 16#20C15 16#20315 16#20012 16#20005 f 16#20303 16#20C03 16#20F05 16#20F0A 16#20C0A 16#2110A 16#11503 16#10000 16#20F00 16#11500 ] defF/187 [ 16#10003 16#20015 16#2000C 16#20F0C 16#20F15 16#20F03 16#11503 ' 16#10000 16#20F00 16#11500 ] defF/188 [ 16#10003 16#10403 16#20703 16#207 |15 16#20415 16#20A15 16#20715 B 16#20703 16#20A03 16#11503 16#10000 16#20F00 16#11500 ] defF/189 [ 16#10003 16#10008 16#20005 16#20303 16#20C03 16#20F05 16#20F15 0 16#11503 16#10000 16#20F00 16#11500 ] defF/190 [ 16#10003 16#20015 16#20009 16#20F15 16#2070F 16#20F03 16#11503 ' 16#10000 16#20F00 16#11500 ] defF/191 [ 16#10003 16#10015 16#20003 16#20F03 16#11503 16#10000 16#20F00  16#11500 ] defF/192 [ 16#10003 16#20015 16#2070C 16#20E15 16#20E03 16#11503 16#10000  } 16#20F00 16#11500 ] defF/193 [ 16#10003 16#20015 16#20F03 16#20F15 16#11503 16#10000 16#20F00  16#11500 ] defF/194 [ 16#10003 16#10303 16#20005 16#20012 16#20315 16#20C15 16#20F12 ] 16#20C0F 16#20F12 16#20F05 16#20C03 16#20303 16#11503 16#10000 16#20F00 16#11500 ] defF/195 [ 16#10003 16#20015 16#20C15 16#20F12 16#20F0F 16#20C0C 16#2000C 0 16#11503 16#10000 16#20F00 16#11500 ] defF/196 [ 16#10003 16#10809 16#20E04 16#20C03 16#20303 16#20005 16#20012 f 16#20315 16~#20C15 16#20F12 16#20F05 16#20E04 16#20F03 16#11503 16#10000 16#20F00 16#11500 ] defF/197 [ 16#10003 16#20015 16#20C15 16#20F12 16#20F0F 16#20C0C 16#2000C B 16#2080C 16#20F03 16#11503 16#10000 16#20F00 16#11500 ] defF/198 [ 16#10003 16#10008 16#20005 16#20303 16#20C03 16#20F05 16#20F09 o 16#20C0C 16#2030C 16#2000F 16#20012 16#20315 16#20C15 16#20F12 16#11503 16#10000 16#20F00 16#11500 ] defF/199 [ 16#10003 16#10703 16#20715 16#20015 16#20E15 16#11503 16#10000  16#20F00 16#115 00 ] defF/200 [ 16#10003 16#10015 16#20005 16#20303 16#20C03 16#20F05 16#20F15 0 16#11503 16#10000 16#20F00 16#11500 ] defF/201 [ 16#10003 16#10015 16#20703 16#20E15 16#11503 16#10000 16#20F00  16#11500 ] defF/202 [ 16#10003 16#10015 16#20003 16#2070B 16#20E03 16#20E15 16#11503 ' 16#10000 16#20F00 16#11500 ] defF/203 [ 16#10003 16#20F15 16#10015 16#20F03 16#11503 16#10000 16#20F00  16#11500 ] defF/204 [ 16#10003 16#10703 16#2070C 16#20015 16#2070C 16#20E15 16#2070 C 0 16#11503 16#10000 16#20F00 16#11500 ] defF/205 [ 16#10003 16#10015 16#20F15 16#2070B 16#2040B 16#20A0B 16#2070B B 16#20003 16#20F03 16#11503 16#10000 16#20F00 16#11500 ] defF/206 [ 16#10000 16#20F00 16#20F15 16#20015 16#20000 16#10615 16#2060F ' 16#2090F 16#20915 16#11500 ] defF/207 [ 16#10600 16#20609 16#2060C 16#2090F 16#20C0F 16#20F0C 16#20F09 B 16#20C06 16#20906 16#20609 16#10F09 16#20F00 16#11500 ] defF/208 [ 16#10000 16#20F00 16#20F15 16#20015 16#20000 16#10009 16#20F09 o 16#1090C 16#2090F 16#2060F 16#2060C 16#2090C 16#10903 16#20906 16#20606 16#20603 16#20903 16#11500 ] defF/209 [ 16#10000 16#20C00 16#10600 16#20615 16#1030F 16#2090F 16#20C0C K 16#20C06 16#20903 16#20303 16#20006 16#2000C 16#2030F 16#11500 ] defF/210 [ 16#10015 16#20C15 16#10615 16#20600 16#1030F 16#2090F 16#20C0C K 16#20C06 16#20903 16#20303 16#20006 16#2000C 16#2030F 16#11500 ] def9/211 [ 16#1030C 16#2090C 16#10000 16#20C15 16#11500 ] def9/212 [ 16#1030C 16#2090C 16#10015 16#20C00 16#11500 ] defF/213 [ 16#10303 16#20903 16#20C06 16#20C0C 16#2090F 16#2030F 16#2000C 9 16#20006 16#20303 16#1000F 16#20C03 16#11500 ] def end def /BuildChar { $workingdict begin /charcode exch def /fontdict exch def fontdict /CharArrays get fontdict /Encoding get) charcode get get % get the CharArray gsave 0 setgray newpath 44 0 % width vector 0 0 % lower left% 22 22 setcachedevice % upper right 0 0 moveto { % process CharArray" dup -16 bitshift % extract move+ 1 index -8 bitshift 16#ff and %extract x! 2 index 16#ff and % extract y( 2 index 1 eq {moveto} {lineto} ifelse pop pop % compressed, move } forall stroke grestore end } defend%/ZetaFont ZetaFontDict definefont pop/table [8 [/#copies 1 (.nc .ncopies .param1)] % number of copies6 [/scalefact 1.0 (.sf .scale .param2)] % scale factor- [/zFont true (.zfont .param3)] % zeta font3 [/penscale 1.0 (.penscale .param4)] % pen scaling2 [/usepens 0 (.usepens .param5)] % use pen colors] deftable { % apply defaults /ta exch def % save array ta 0 get % key ta 1 get % default value def % define default value} forall7currentdict /parser known {parser} if % if user inputsG72. 400. div scalefact mul dup scale % set 400 points/inch scale factor@currentlinewidth penscale mul setlinewidth % re-scale line width2/lTime usertime lTime sub def % save ztp load time%main/doit {> {main} stopped { (error stack:\n) print pstack flush quit} if} defdoitww HEADERS_STR$}4ҩ MRL HEADERS_STR$Dҩ MRL HEADERS_STR$2ө MRL HEADERS_STR$ruө MRL HEADERS_STR$ө MRL HEADERS_STR$^bԩ MRL HEADERS_STR$][ԩ MRL HEADERS_STR$$nթ MRL HEADERS_STRRmwթ MRL LOGINrֵթ MRL LOGIN$(֩ MRL HEADERS_STR$U֩ MRL HEADERS_STR$֩ MRL ½c%e % SIDES.PS%t6/setdevice{dup where{pop cvx exec}{cvx exec}ifelse}defBstatusdict begin /setduplexmode setdevice /settumble setdevice endwwve current x position } ifl} deff f e%% newline - move down 1 line.%e /newline {4 /linecount linecount 1 add def % advance line count4 ypos lineh sub /ypos exch def % debit y pos on page ypos bottommargin lt 1 linecount linelimit gt or { % if bottom of page% newpageS newliner } ifl} deft  m'%% newpage - Q̖7%% headers_str - print text with headers on LaserWritern%o% R. Watson 25-Sep-1986t%e/EOF{t: linecount 0 ne column 0 ne or { % if we've printed a line' /column ncolumns def % force page outn newpage/ } if } deft ./XCR f{ $ /xpos xmargin def %%%was leftmargin} def4 c/XLF {newline} def /XFF{ 3 topmargin lineh sub ypos ne { % if not top of pager newpage8 } ifd} defe  t%% XSTR% &% prints a line of text from the stack%/XSTR[{8 /line exch def % get textv o& line length 1 ge { % show the line xpos ypos moveto wrap { 0 1 line length 1 sub {$ line 2 -1 roll 1 getinterval dup( stringwidth pop currentpoint pop add squish add xlimit gt {/wrapping true def newline xpos ypos moveto /wrapping false def} if  squish 0 3 -1 roll ashow } for }a {l squish 0 line ashow } ifelse6 /xpos currentpoint pop def % save current x position } if} defn a -%% newline - move down 1 line.%n /newline {4 /linecount linecount 1 add def % advance line count4 ypos lineh sub /ypos exch def % debit y pos on page ypos bottommargin lt 1 linecount linelimit gt or { % if bottom of pageu newpageg newlined } ifm} defe a n'%% newpage - initialize for a new page.c%m /newpage {& /linecount 0 def % reset line count4 /ypos topmargin lineh sub def % reset line on page + /column column 1 add def % advance columnn, column ncolumns lt { } defa /DP % tsizey -> - erase and home{ clippath 1 setgray fillo 0 setgray 0 exch moveto} defm/m {moveto} def//l {rlineto} def/r {rmoveto} def/s {stroke} defm/n {newpath} def//v {newpath moveto {rlineto} repeat stroke} def FntH setfontiww .param3)] % landscape mode+ [/title false (.title .param4)] % title8 [/ncolumns 2 (.ncolumns .param5)] % number of columns? [/linelimit 66 (.linelimit .nlines .param6)] % lines per page8 [/hdr () (.hdr .header. % if not last column4 /xmargin columnwidth column mul leftmargin add def /xpos xmargin deft$ /xlimit xlimit columnwidth add def } { /column 0 def % reset column o title { % if title leftmargin 4 topmargin titlemargin add moveto % setup header$ currentfont % save current font0 /Helvetica-Bold findfont 12 scalefont setfont filename show pagewidth 1.5 inch sub 3 topmargin titlemargin add moveto % page number  (page ) showg page 10 5 string cvrs show  setfont % restore font } if  showpage landscapee g wrapping not { page % save this saveobj restore % flush vme /saveobj save def" /page exch def % restore this } if % alternate page 1 and 1 eq andn {/temp leftmargin def6 /leftmargin rightmargin def4 /rightmargin temp def} if. /page page 1 add def % advance page number- /xmargin leftmargin def % reset left side% /xpos #xmargin defa( /xlimit leftmargin columnwidth add def } ifelsen} def  o a!%% landscape - set landscape mode)% /landscape { wide {p 8.5 inch 0 translate 90 rotate } iff} defo %% inch .a%2% convert to inches%./inch { 72. mul} def s e%% point .% % convert to points%s/point { } def m %% executable initialization.i% initgraphics l8currentdict /formname known not {/formname (2UP) def} if afo rmname (2UP) eq { /table [ 9 [/#copies 1 (.nc .ncopies .param1)] % number of copies[1 [/fsizetmp 0 (.fsize .fs .param2)] % font sizen3 [/wide true (.wide .w .param3)] % landscape mode0+ [/title false (.title .param4)] % title.8 [/ncolumns 2 (.ncolumns .param5)] % number of columns? [/linelimit 66 (.linelimit .nlines .param6)] % lines per page8 [/hdr () (.hdr .header. param7)] % page header4 [/font (Courier) (.font .param8)] % font> [/topmargin -1 (. topmargin .top .param9)] % topmarginC [/leftmargin -1 (.leftmargin .left .param10)] % leftmargin0G [/rightmargin -1 (.rightmargin .right .param11)] % rightmargin K [/bottommargin -1 (.bottommargin .bottom .param12)] % bottommargin1= [/alternate false (.alternate .param13)] % alternatel3 [/swedish false (.swedish)] % set swedish mode + [/wrap false (.wrap)] % set wrap moded ] def} if nformname (LETTER) eq { /table [o9 [/#copies 1 (.nc .ncopies .param1)] % number of copiesp1 [/fsizetmp 0 (.fsize .fs .param2)] % font size 4 [/wide false (.wide .w .param3)] % landscape mode+ [/title false (.title .param4)] % title8 [/ncolumns 1 (.ncolumns .param5)] % number of columns? [/linelimit 77 (.linelimit .nlines .param6)] % lines per page18 [/hdr () (.hdr .header. param7)] % page header4 [/font (Courier) (.font .param8)] % font> [/topmargin -1 (.topmargin .top .param9)] % topmarginC [/leftmargin -1 (.leftmargin .left .param10)] % leftmarginiG [/rightmargin -1 (.rightmargin .right .param11)] % rightmarginpK [/bottommargin -1 (.bottommargin .bottom .param12)] % bottommargin= [/alternate false (.alternate .param13)] % alternate 2 [/swedish false (.swedish)] % set swedish mode+ [/wrap false (.wrap)] % set wrap modea ] def} if formname (LANDSCAPE) eq {m /table [.9 [/#copies 1 (.nc .ncopies .param1)] % number of copies 1 [/fsizetmp 0 (.fsize .fs .param2)] % font sizeg3 [/wide true (.wide .w .param3)] % landscape mode+ [/title false (.title .param4)] % titlet8 [/ncolumns 1 (.ncolumns .param5)] % number of columns? [/linelimit 66 (.linelimit .nlines .param6)] % lines per page)8 [/hdr () (.hdr .header. param7)] % page header4 [/font (Courier) (.font .param8)] % font> [/topmargin -1 (.topmargin .top .param9)] % topmarginC [/leftmargin -1 (.leftmargin .left .param10)] % leftmarginG [ /rightmargin -1 (.rightmargin .right .param11)] % rightmarginrK [/bottommargin -1 (.bottommargin .bottom .param12)] % bottommarginl= [/alternate false (.alternate .param13)] % alternateg2 [/swedish false (.swedish)] % set swedish mode+ [/wrap false (.wrap)] % set wrap modei ] def} if %formname (HEADERS) eq {f /table [(9 [/#copies 1 (.nc .ncopies .param1)] % number of copiest1 [/fsizetmp 0 (.fsize .fs .param2)] % font sizer4 [/wide false (.wide .w .param3)] % landscape mode* [/title true (.title .param4)] % title8 [/ncolumns 1 (.ncolumns .param5)] % number of columns? [/linelimit 77 (.linelimit .nlines .param6)] % lines per pagem8 [/hdr () (.hdr .header. param7)] % page header4 [/font (Courier) (.font .param8)] % font> [/topmargin -1 (.topmargin .top .param9)] % topmarginC [/leftmargin -1 (.leftmargin .left .param10)] % leftmarginG [/rightmargin -1 (.rightmargin .right .param11)] % rightmargin6topmargin .top .param9)] % topmarginC [/leftmargin -1 (.leftmargin .left .param10)] % leftmargin(G [/rightmargin -1 (.rightmargin .right .param11)] % rightmargin K [/bottommargin -1 (.bottommargin .bottom .param12)] % bottommargini= [/alternate false (.alternate .param13)] % alternate 3 [/swedish false (.swedish)] % set swedish mode + [/wrap false (.wrap)] % set wrap modeo ] def} if pformname (LETTER) eq { /table []9 [/#copies 1 (.nc .ncopies .param1)] % number of copiesp1 [/fsizetmp 0 (.fsize .fs .param2)] % font size.4 [/wide false (.wide .w .param3)] % landscape mode+ [/title false (.title .param4)] % titler8 [/ncolumns 1 (.ncolumns .param5)] % number of columns? [/linelimit 77 (.linelimit .nlines .param6)] % lines per pageP8 [/hdr () (.hdr .header. param7)] % page header4 [/font (Courier) (.font .param8)] % font> [/topmargin -1 (.topmargin .top .param9)] % topmarginC [/leftmargin -1 (.leftmargin .left .param10)] % leftmarginsG [/rightmargin -1 (.rightmargin .right .param11)] % rightmargintK [/bottommargin -1 (.bottommargin .bottom .param12)] % bottommargin)= [/alternate false (.alternate .param13)] % alternate 2 [/swedish false (.swedish)] % set swedish mode+ [/wrap false (.wrap)] % set wrap mode( ] def} if formname (LANDSCAPE) eq { /table [g9 [/#copies 1 (.nc .ncopies .param1)] % number of copies1 [/fsizetmp 0 (.fsize .fs .param2)] % font sizep3 [/wide true (.wide .w .param3)] % landscape mode(+ [/title false (.title .param4)] % title 8 [/ncolumns 1 (.ncolumns .param5)] % number of columns? [/linelimit 66 (.linelimit .nlines .param6)] % lines per pagef8 [/hdr () (.hdr .header. param7)] % page header4 [/font (Courier) (.font .param8)] % font> [/topmargin -1 (.topmargin .top .param9)] % topmarginC [/leftmargin -1 (.leftmargin .left .param10)] % leftmarginpG [/rightmargin -1 (.rightmargin .right .param11)] % rightmargin K [/bottommargin -1 (.bottommargin .bottom .param12)] % bottommarginm= [/alternate false (.alternate .param13)] % alternatef2 [/swedish false (.swedish)] % set swedish mode+ [/wrap false (.wrap)] % set wrap mode  ] def} if formname (HEADERS) eq {( /table [i9 [/#copies 1 (.nc .ncopies .param1)] % number of copiesf1 [/fsizetmp 0 (.fsize .fs .param2)] % font size 4 [/wide false (.wide .w .param3)] % landscape mode* [/title true (.title .param4)] % title8 [/ncolumns 1 (.ncolumns .param5)] % number of columns? [/linelimit 77 (.linelimit .nlines .param6)] % lines per page/8 [/hdr () (.hdr .header. param7)] % page header4 [/font (Courier) (.font .param8)] % font> [/topmargin -1 (.topmargin .top .param9)] % topmarginC [/leftmargin -1 (.leftmargin .left .param10)] % leftmarginrG [/rightmargin -1 (.rightmargin .right .param11)] % rightmarginaK [/bottommargin -1 (.bottommargin .bottom .param12)] % bottommarginl= [/alternate false (.alternate .param13)] % alternatea2 [/swedish false (.swedish)] % set swedish mode+ [/wrap false (.wrap)] % set wrap modei ] def} if rformname (BANNER) eq { /table [ 9 [/#copies 1 (.nc .ncopies .param1)] % number of copiest3 [/fsizetmp 194 (.fsize .fs .param2)] % font size3 [/wide true (.wide .w .param3)] % landscape model+ [/title false (.title .param4)] % titlen8 [/ncolumns 1 (.ncolumns .param5)] % number of columns> [/linelimit 1 (.linelimit .nlines .param6)] % lines per page8 [/hdr () (.hdr .header. param7)] % page header8 [/font (Helvetica-Bold) (.font .param8)] % font> [/topmargin -1 (.topmargin .top .param9)] % topmarginC [/leftmargin -1 (.leftmargin .left .param10)] % leftmarginlG [/rightmargin -1 (.rightmargin .right .param11)] % rightmargin K [/bottommargin -1 (.bottommargin .bottom .param12)] % bottommarginm= [/alternate false (.alternate .param13)] % alternate 2 [/swedish false (.swedish)] % set swedish mode* [/wrap true (.wrap)] % set wrap mode ] def} if fformname (SWEDISH) eq {i /table [ 9 [/#copies 1 (.nc .ncopies .param1)] % number of copies1 [/fsizetmp 0 (.fsize .fs .param2)] % font sizet4 [/wide false (.wide .w .param3)] % landscape mode+ [/title false (.title .param4)] % titlet8 [/ncolumns 1 (.ncolumns .param5)] % number of columns K [/bottommargin -1 (.bottommargin .bottom .param12)] % bottommargina= [/alternate false (.alternate .param13)] % alternate.2 [/swedish false (.swedish)] % set swedish mode+ [/wrap false (.wrap)] % set wrap modef ] def} if mformname (BANNER) eq { /table [l9 [/#copies 1 (.nc .ncopies .param1)] % number of copies 3 [/fsizetmp 194 (.fsize .fs .param2)] % font sizer3 [/wide true (.wide .w .param3)] % landscape modet+ [/title false (.title .param4)] % titl et8 [/ncolumns 1 (.ncolumns .param5)] % number of columns> [/linelimit 1 (.linelimit .nlines .param6)] % lines per page8 [/hdr () (.hdr .header. param7)] % page header8 [/font (Helvetica-Bold) (.font .param8)] % font> [/topmargin -1 (.topmargin .top .param9)] % topmarginC [/leftmargin -1 (.leftmargin .left .param10)] % leftmargineG [/rightmargin -1 (.rightmargin .right .param11)] % rightmarginpK [/bottommargin -1 (.bottommargin .bottom .param? [/linelimit 66 (.linelimit .nlines .param6)] % lines per pagew8 [/hdr () (.hdr .header. param7)] % page header4 [/font (Courier) (.font .param8)] % font> [/topmargin -1 (.topmargin .top .param9)] % topmarginC [/leftmargin -1 (.leftmargin .left .param10)] % leftmargincG [/rightmargin -1 (.rightmargin .right .param11)] % rightmarginmK [/bottommargin -1 (.bottommargin .bottom .param12)] % bottommarginb= [/alternate false (.alternate .param13)] % alternater1 [/swedish true (.swedish)] % set swedish mode + [/wrap false (.wrap)] % set wrap modea ] def} if Tcurrentdict /table known not { /table [t9 [/#copies 1 (.nc .ncopies .param1)] % number of copiesl1 [/fsizetmp 0 (.fsize .fs .param2)] % font sizei4 [/wide false (.wide .w .param3)] % landscape mode* [/title true (.title .param4)] % title8 [/ncolumns 1 (.ncolumns .param5)] % number of columns? [/linelimit 66 (.linelimit .nlines .param6)] % linesN%!PS-Adobe-2.0 ExitServer%%Title: dmm-nup.ps%%Creator: DMM%%CreationDate: 04/25/92 13:28)%%DocumentSuppliedProcSets: "dmm-nup" 3 0%>% Written by Donald Markuson, Prime Computer, Inc., 1990-1992.@% Placed into the public domain by the author September 1, 1991.>% Comments and suggestions are welcome and may be addressed to% dmm@tiger1.prime.com.% % History:%K% 02-May-92 DMM - Updated /fixnasties to better support older TeX DVI-to-PSK% filters, and moved /fixnasties call to within /lshowpage.N% 25-Apr-92 DMM - Reworked Mac support to avoid updating /gc clippath nasty byL% replacing /nc routine which is sole user of /gc. PreviousM% method consumed add'l VM for array to update gc every page.O% 22-Apr-92 DMM - Fixed Mac support bug that caused "lnop undefined) PostScriptK% error if N-up was invoked prior to MacDict being defined.O% 11-Mar-92 DMM - Now exec most "external" customiza tion variables (e.g. dfont,M% draft, hfont, nohead, nulljobname, pagetext, and pbgray) soG% so user can specify an executable procedure that willM% evaluate into the proper data type (exec'ing data is a noopN% as far as PostScript is concerned, so this works well and is.% entirely upward compatible).K% - Proper erasepage replacement is now defined (and restored% upon finish).M%  - Ghostscript 2.2 implements save/restore almost correctly soL% added hack to make it really work correctly until properlyG% fixed. Also, gs2.2 fixed errordict bug that formerlyK% prevented error handlers from being replaced, as initclipN% does. Workaround code now used if new /errordictbug boolean8% is true, instead of /ghost being true.L% - pageborders routine renamed emitppage and now incorporatesK% common code that was in all invocations; also fixed minorN% bug in which a gsave wasn't grestored when page borders were% disabled.H% - Added support for papersize and papertray changes mid-M% document by spitting out page-in-progress and starting anewL% (if new page size is actually different from current one).I% As a consequence, reworked how papersize routines (e.g.N% letter, legal, etc. are all redefined such that all the onesL% that the printer actually supports are covered (previouslyK% many were commented out and had to be included manually).L% Also required special hack added to setpaper to handle use2% of setpapertray within document.J% - Moved fixups for known non-conforming PS generators likeI% Macintosh and older dvi2ps into new routine fixnasties.L% - Extended papersize/papertray support to Level 2 PostScriptI% printers which use setpagedevice and currentpagedevice.7% Replacements for both were necessary.J% - Force existence of an empty statusdict if device doesn'tO% normally support one--it's easier than checking all the time.N% If device does support statusdict, it should be writeable so%% we no longer check.N% - Added code to avoid executing the dictionary if unnecessary,N% where unnecessary means outside the server loop in which the@% dictionary has already been previously loaded.D% 13-Dec-91 DMM - Completely reorganized and rewrote major portions:I% . Eliminated hard-coded letter-sized paper constraints.L% Now accommodate arbitrary paper sizes, both physical andI% logical, and provides emulators for printer-dependentL% paper-size-setting routines. (Thus your choice of paperL% size in Mac's Page Setup dialog becomes the logical pageN% size.) Automatically detect physical paper size and scaleL% appropriately for layout of chosen logical pages to fit.J% . Draft notices also track logical page size but are nowK% strictly on page diagonal; before they were rotated 60.L%  . No longer have to specify a non-0-length draft string inL% DMM-nup-pre invocation to use draft strings later within% document.M% . Draft font now changeable within document via simple def:B% DMM-nup-dict /dfont /Font-of-Your-Choice putA% No longer need to invoke outlinefont routine.N% . Added 1-up scaled with borders, and by-3 organizations, soN% now support: 1/1(scaled/bordered)/2/3/4/6/8/9/12/15/16-up.I% . Hardcoded strings for null job name and "Page" can beL% changed in document via def (e.g. internationalization):K% DMM-nup-dict /nulljobname (String-of-Your-Choice) putK% DMM-nup-dict /pagetext (String-of-Your-Choice) putN% . Can now suppress per-page headline but keep borders within!% document via:3% DMM-nup-dict /nohead true putL% or change its font which defaults to same as draft font:B% DMM-nup-dict /hfont /Font-of-Your-Choice putL% . Cleaned up dictionary usage (userdict clutter) by movingJ% most definitions into DMM-nup-dict, and separating newL% DMM-nup-state dictionary for running logical page state.K% . Corrected minor problem with landscape logical pages onL% landscape physical pages coming out "upside down". ThisI% isn't a problem on real printers (just turn the paperB% over!) but is for previewers like Ghostscript.J% 12-Dec-91 DMM - When doing 1-up, no longer void Mac dictionary /bigs andK% /smalls page setup ops, and flipit is now applied only toH% draft notice, not actual document (and can accommodateN% actual, not just letter, paper size). Now 1-up should truly:%  be compatible with original application.N% 06-Dec-91 DMM - Added support to work around limitations of Ghostscript whenD% document uses save/restore wrappers for each page.O% 19-Nov-91 DMM - All defined procedures are now bound using the bind operator.N% This fixes a problem with documents that redefine PostScript=% operators used within, perhaps unknowingly.K% 04-Nov-91 DMM - Now allow odd logical pages/page values which round up toN% nearest 1/2/4/8/16 configuration (but only put the indicatedG% number of logical pages on the chosen configuration).I% 22-Oct-91 DMM - Simplified DMM-lporig calculations slightly; don't bind+% /cp redefinition anymore.L% 11-Sep-91 DMM - Adjusted to handle dummy Mac Dictionary version 71 used byK% the Macintosh System 7 LaserWriter 7.0 driver. Now checkJ% that /cp is known before changing it; and use "bind def"H% rather than "bdf" shortcut which might not be defined.D% 15-May-91 DMM - Worked around Ghostscript bug with error handling.I% - Eliminated monotonically increasing VM consumption withC% every page by preallocating matrices and strings.G% 12-Mar-91 DMM - Added hack of specifying 0 for DMM-lps-pp argument toM% dmm-nup-pre to indicate optional arguments directly settingL% the four internal parameters DMM-portpp (portrait physicalI% page), DMM-lp-row (# rows), DMM-lp-col (# columns), andM% DMM-lp-scl (physical-to-logical scaling factor). Thus, youI% can now establish custom page layouts not restricted to@% powers of two logical pages per physical page.% %%EndComments %%EndProlog%%BeginExitServer: 0% serverdict begin 0 exitserver%%EndExitServer%%BeginProcSet: "dmm-nup" 3 0%1% Avoid re-downloading dictionary if unnecessary.%.userdict/dcheckload 2 copy known{pop pop} %DMMI {{{pop exec}{save 3 dict begin/rb 6050 string def exch /es exch def %DMMN {currentfile rb readline not{stop}if es eq{exit}if}loop end restore pop} %DMM ifelse}bind put}ifelse %DMM{} ( %enddmmnupdict) %DMM=vmstatus pop pop 0 gt userdict /DMM-nup-pre known not or %DMM dcheckloadBsystemdict /setpacking known { currentpacking true setpacking } if%F% DMM-nup-pre: N-up prescript (insert before actual PostScript file).I% Works with either conforming or non-conforming PostScript@% page conventions (optimized for non-conforming).>% Handles the following document page structure:-% Conforming-> ..pageimage.. showpage6% Conforming-> gsave ..pageimage.. grestore showpage6% gsave ..pageimage.. showpage grestoreD% Conforming-> save ..pageimage.. restore gsave showpage grestoreD% save ..pageimage.. gsave showpage grestore restore5% Conforming-> save ..pageimage.. showpage restore5% save ..pageimage.. restore showpage:% Usage: * % [Int] Rows in layout*=% * % [Int] Columns in layout*K% ----------------- % * Above are only used when lps-pp is 0.K% % [Int] Logical pages per physical sheetN% % [Bool] Transpose logical page layout orderN% % [Bool] Landscape logical page layout orderO% % [Bool] Set for 270-degree rotated landscapeM% % [Bool] Don't enforce clip to logical pageP% % [Int] Boundary gray level: black 0..1,-1=noN% % [Str] "DRAFT" string notice for each pageC% % [Lit] "DRAFT" string font name% DMM-nup-pre -)% Dictstack: ... [4 nested begin/end]%userdict /DMM-nup-pre{ %I % Establish proper dictstack environment to avoid potential conflicts % with any user definitions. % systemdict begin userdict begin /DMM-nup-dict 60 dict def DMM-nup-dict begin % % Useful definitions % /T true def /F false def /xdf { exch def } bind def /dfont xdf /draft xdf /pbgray xdf /noclip xdf /flipit xdf /lscape xdf /xpose xdf /lps-pp xdfN % Optionals are left on stack to be picked up within setlayout invocation. %< % Define functions and fonts needed to do draft strings. %G % outlinefont generates an outline version of a font given the baseE % font name, the new font name, and the stroke weight" % for the outline.K % Usage: outlinefont -8 % DictStack context: ... [1 nested begin/end] % /outlinefont { 5 dict begin /strokeweight exch def /newfontname exch def /basefontname exch def/ /basefontdict basefontname findfont def: /outfontdict basefontdict maxlength 2 add dict def basefontdict { exch dup /FID ne- { exch outfontdict 3 1 roll put }{ pop pop } ifelse } forallO outfontdict /BaseFontName basefontname put % draftbar checks this- outf ontdict /FontName newfontname put$ outfontdict /PaintType 2 put1 outfontdict /StrokeWidth strokeweight put. newfontname outfontdict definefont pop end %5 dict } bind defO userdict /DMM-outlinefont /outlinefont load put % For upward compatibilityO /draft-span-pct 60 def % Percent of page diagonal consumed by draft notice %H % draftbar images the outlined DRAFT diagonally across the (logical)H % page. This should be the last thing done on the page; ifI % it's the first, white graphic objects may overlay, erasingI % the DRAFT outline. It assumes the graphics state has beenB % set up accordingly for imaging on the logical page.G % Note that dfont should really exist, and be outlineable.I % If it doesn't exist, Courier will typically be substitutedE % by findfont; Courier for many PostScript printers is a5 % stroked font unsuit able for outlining. % Usage: - draftbar -N % DictStack context: ... DMM-nup-dict [1 nested begin/end if dfont def] % /draftbarM { % First make sure /DMM-DraftFont exists and is based on correct font.M % If not, then make it so. This allows document to change it easily.* FontDirectory /DMM-DraftFont known> { /DMM-DraftFont findfont /BaseFontName 2 copy known! { get dfont exec ne }{ T } ifelse  }{ T } ifelse5 { dfont exec /DMM-DraftFont 0.2 outlinefont } ifO userdict /DMM-draft known % For upward compatibility. { /draft userdict /DMM-draft get def } if gsave+ /DMM-DraftFont findfont dup setfont3 draft-span-pct 100 div dup 1 exch sub 2 div: lp-wid dup mul lp-hgt dup mul add sqrt % diag span! lp-hgt lp-wid atan rotate" dup 3 -1 roll mul 0 movetoI mul dr aft exec stringwidth pop div dup 3 1 roll scalefont setfontF % Adjust to put text's x-height more-or-less on diagonal span.O -.35 mul 0 exch rmoveto % Guess x-height ~ 35% of design size? draft exec show grestore } bind def%F% If we're doing 1-up, then things are real simple: we mimic standard)% PostScript except for the DRAFT notice.K% If we're doing N-up with N <> 1, then set up the routines, parameters andI% showpage replacement to properly translate and scale each logical page, % and image the page boundaries.% lps-pp 1 eq{ %E % Save the real McCoy's which we replace below with an interlude. %$ /realshowpage /showpage load def %B % showpage REPLACEMENT for 1-up that handles the DRAFT notice. % Usage: - showpage -F % DictStack context: ... [1 nested begin/end (2 if dfont def)] % userdict /showpage { DMM-nup-dict begin gsave draft exec length 0 gt { initgraphicsH % Calculate actual paper size here for draft string (assumesD % imageable area of page is centered on physical paper).- newpath clippath pathbbox newpath* 3 -1 roll add /lp-hgt exch def add /lp-wid exch defL % Since we don't really flip pages in 1-up mode, must flip DRAFT5 % notice to track the "upside-down" page! flipit' { lp-wid lp-hgt translate  180 rotate } if draftbar } if grestore realshowpage end %DMM-nup-dict } bind put %K % finish ensures an incomplete physical page is produced at end of job. % Usage: - finish -? % DictStack context: ... DMM-nup-dict [1 nested begin/end] % /finishO { % Put original defs back the way they were (perhaps in wrong dict tho!) userdict begin( /showpage /realshowpage load def end %userdict } bind def end %DMM-nup-dict}{ % % N-up for N <> 1. %1 userdict /DMM-nup-state 10 dict dup begin put /pp-num 0 def /lp-num 0 def /Pstate matrix def /Lstate matrix def /oldLstate matrix def /Cstate matrix def /Tstate matrix def /ppstr 15 string defO /did-showpage F def % Initially no showpage pending end %DMM-nup-state %J % Make sure a statusdict exists, even if we have to build an empty oneO % ourselves. According to PS Level 2 reference, not all products have one! % /statusdict where { pop' }{ userdict /statusdict 1 dict put } ifelse %O % Note when we're running under Ghostscript, which has a few bugs/anomalies, % of its own that we try to work around. % statusdict /product known: { statusdict /product get (Ghostscript) anchorsearch$ exch pop dup { exch pop } if }{ F } ifelse /ghost xdf /errordictbug F def %M % Ghostscript versions earlier than 2.2 don't implement save/restore. WeI % end up faking this by manually saving/restoring the necessary stateN % ourselves. Versions 2.2 & 2.3 have a faulty save/restore implementationK % with matrices, the workaround is to push a save level. While versionL % 2.4 seems to have fixed the matrix problem, it's save/restore is stillO % faulty with simple objects unless the same 2 .2/2.3 workaround is applied.J % Versions earlier than 2.2 also had an errordict bug which prevents aC % replacement error handler from working (see /initclip below). % ghostD { systemdict /version get exec token { exch pop } { 0 } ifelseO dup 2.2 lt % Provide "save/restore" for gs < 2.2 { pop /errordictbug T def$ /gs-copydict 20 dict def gs-copydict begin= /arraytype {dup length array copy} bind def# /booleantype {} def? /dicttype {dup maxlength dict copy} bind def# /filetype {} def# /fonttype {} def# /integertype {} def# /marktype {} def# /nametype {} def# /nulltype {} def# /operatortype {} defC /packedarraytype {dup length packedarray copy} bind def# /realtype {} def # /savetype {} def> /stringtype {dup length string copy} bind def end %gs-copydict userdict /save$ { /DMM-nup-state where@ % { /DMM-nup-state get dup maxlength dict copy }@ { dup /DMM-nup-dict get /gs-copydict get begin> /DMM-nup-state get dup maxlength dict exch= { 2 index 3 1 roll % newdict key value) dup type exec put } forall$ end %gs-copydict }{ null } ifelse) systemdict /save get exec 2 array astore } bind put userdict /restore& { dup type /arraytype ne0 { systemdict /restore get exec }{ aload. 0 null put % invalidate it0 systemdict /restore get exec dup null ne,  { /DMM-nup-state where8 { /DMM-nup-state 3 -1 roll put } if }{ pop } ifelse } ifelse } bind put }{ popO save pop % Work around save/restore bug in gs2.2 thru at least 2.4 } ifelse } if %C % Save the real McCoy's which we replace below with interludes. % {, /realinitclip /initclip load def, /realinitmatrix /initmatrix load def, /realinitgraphics /initgraphics load def, /realshowpage /showpage load def, /realrestore /restore load def, /realgrestore /grestore load def, /realgsave /gsave load def, /realerasepage /erasepage load def) statusdict /setpapertray 2 copy known& { get /realsetpapertray exch def }{ pop pop } ifelse /setpagedevice dup where' { exch get /realsetpagedevice xdf }{ pop } ifelse /currentpagedevice dup where+ { exch get /realcurrentpagedevice xdf }{ pop } ifelse } exec %F % initclip REPLACEMENT for 2/4/8/16-up that clips to logical page. % Usage: - initclip -5 % DictStack context: ... [0 nested begin/end] % userdict /initclip { DMM-nup-dict dup /realinitclip get exec /noclip get notL { % Current path is destroyed, but few issue initclip with a path.* DMM-nup-dict /errordictbug get3 { { currentpoint } stopped { 0 0 } if- }{ errordict /nocurrentpoint get9 errordict /nocurrentpoint { pop 0 0 } put currentpoint7 errordict /nocurrentpoint 5 -1 roll put } ifelse currentlinewidth3 DMM-nup-state /Tstate get currentmatrix/ DMM-nup-state /Pstate get setmatrix9 0.3 setlinewidth % Stay away from borderlines/ DMM-nup-state /Lstate get setmatrix newpath$ DMM-nup-dict /lp-wid get$ DMM-nup-dict /lp-hgt get 0 exch moveto dup 0 rlineto 0 lineto 0 0 lineto closepath clip newpath setmatrix setlinewidth moveto } if } bind put %I % initmatrix REPLACEMENT for 2/4/8/16-up that inits logical page CTM. % Usage: - initmatrix -7 % DictStack context: ... [0 nested begin/end] % userdict /initmatrix+ { DMM-nup-state /Lstate get setmatrix } bind put %F % initgraphics REPLACEMENT for 2/4/8/16-up that inits logical page" % graphics state.# % Usage: - initgraphics -9 % DictStack context: ... [0 nested begin/end] % userdict /initgraphics/ { DMM-nup-dict /realinitgraphics get exec  initmatrix initclip } bind put %E % erasepage REPLACEMENT for 2/4/8/16-up that clears logical page. % Usage: - erasepage -6 % DictStack context: ... [0 nested begin/end] % userdict /erasepage( { DMM-nup-dict /realgsave get exec initclip 1 setgray newpath clippath fill+ DMM-nup-dict /realgrestore get exec } bind put %I % showpage REPLACEMENT for 2/4/8/16-up that tags end-of-logical page. % Usage: - showpage -5 % DictStack context: ... [2 nested begin/end] % userdict /showpage { DMM-nup-dict begin T lshowpage end %DMM-nup-dict } bind put %H % restore REPLACEMENT for 2/4/8/16-up that handles the DRAFT notice.# % Usage: restore -4 % DictStack context: ... [2 nested begin/end] % userdict /restoreJ { % Preserve physical & logical pagecounts across restore, and checkH % against restored values: if different, then showpage occurredI % WITHIN save/restore pair so must regenerate logical page matrixF % just undone by restore op (which also restored the necessary- % Lstate value for the regeneration).& DMM-nup-state /pp-num get exch& DMM-nup-state /lp-num get exch* DMM-nup-dict /realrestore get execE DMM-nup-state /lp-num 2 copy get 4 1 roll 2 index put eq exchH DMM-nup-state /pp-num 2 copy get 4 1 roll 2 index put eq and not { DMM-nup-dict begin F lshowpage end %DMM-nup-dict } if } bind put %M % grestore REPLACEMENT for 2/4/8/16-up that catches PostScript files thatL % use "gsave showpage grestore". Strictly speaking, such filesM % are non-conforming, but pragmatically speaking, if they set upL % any graphics state in the document setup section prior to theM % first %%Page, this is the only way they can preserve it acrossI % a showpage unless they violate another rule by putting the9 % showpage within the per-page save/restore.H % N.B. This assumes each page doesn't alter transformation2 % matrix graphics state itself. % Usage: - grestore -5 % DictStack context: ... [2 nested begin/end] % userdict /grestore+ { DMM-nup-dict /realgrestore get exec' DMM-nup-state /did-showpage get { DMM-nup-state begin% oldLstate Lstate copy pop end %DMM-nup-state DMM-nup-dict begin F lshowpage end %DMM-nup-dict } if } bind put %K % gsave REPLACEMENT for 2/4/8/16-up that catches PostScript files thatM % use "gsave showpage grestore" *without* using save/restore also. % Usage: - gsave -3 % DictStack context: ... [0 nested begin/end] % userdict /gsave- { DMM-nup-state /did-showpage false put( DMM-nup-dict /realgsave get exec } bind put { %C % setpagedevice REPLACEMENT that traps paper size/tray changes.4 % Usage: setpagedevice -: % DictStack context: ... [2 nested begin/end] % /setpagedevice whereO { pop % Might be systemdict which isn't writable userdict /setpagedevice { DMM-nup-state begin'  pp-num 0 eq lp-num 0 eq and end %DMM-nup-state DMM-nup-dict begin! { realsetpagedeviceO realinitgraphics % In case new tray == old & printer is smart setpaper* ppdict begin pp-w pp-h end true' }{ dup /PageSize known dup: { exch /PageSize get aload pop 3 -1 roll } if } ifelse% { setpage }{ pop } ifelse  end %DMM-nup-dict } bind put } if %C % currentpagedevice REPLACEMENT that traps paper size requests.< % Usage: - currentpagedevice > % DictStack context: ... [1 nested begin/end] % /currentpagedevice whereO { pop % Might be systemdict which isn't writable# userdict /currentpagedevice { DMM-nup-dict begin! realcurrentpagedevice dup /PageSize knownO { dup length dict copy % PS Level 2 copy needed for writeable copy2 dup /PageSize [ lp-wid lp-hgt ] put readonly } if end %DMM-nup-dict } bind put } if } exec %K % finish ensures an incomplete physical page is produced at end of job. % Usage: - finish -? % DictStack context: ... DMM-nup-dict [1 nested begin/end] % /finish { DMM-nup-state begin$ lp-n um 0 gt { emitppage } if end %DMM-nup-stateO % Put original defs back the way they were (perhaps in wrong dict tho!) userdict begin0 /initclip /realinitclip load def0 /initmatrix /realinitmatrix load def0 /initgraphics /realinitgraphics load def0 /showpage /realshowpage load def0 /restore /realrestore load def0 /grestore /realgrestore load def0 /gsave /realgsave load def0 /erasepage /realerasepage load def- statusdict /setpapertray 2 copy known& { /realsetpapertray load put }{ pop pop } ifelse, userdict /setpagedevice 2 copy known' { /realsetpagedevice load put }{ pop pop } ifelse0 userdict /currentpagedevice 2 copy known+ { /realcurrentpagedevice load put }{ pop pop } ifelse end %userdict } bind def %D % lsho wpage handles emitting a logical page on the physical pageA % by adjusting the coordinate system from under the# % application's eyes.6 % Usage: lshowpage -O % DictStack context: ... DMM-nup-dict [1 nested begin/end (2 if dfont)] % /lshowpage { DMM-nup-state beginJ % Extract the matrix transformations that the application performsF % on its own by "undoing" our Lstate (logical page) transform.I % We must reapply the application's transformations to the Lstate % of a new logical page.O Tstate currentmatrix Lstate Cstate invertmatrix Cstate concatmatrix pop dup /did-showpage xdf dup% { Lstate oldLstate copy pop" draft exec length 0 gt { initgraphics draftbar } if$ /lp-num lp-num 1 add defO lp-num lps-pp eq { emitppage } if % End this page!  Pstate setmatrixO lporig % Position for new logical pageO initgraphics % Must mimic what showpage really does realgsave }{ Pstate setmatrixO lporig % Position for new logical pageO initclip % Don't initgraphics here--application did a (g)restore! } ifelseO Cstate concat % Reintegrate application's transform end %DMM-nup-state fixnasties { realgrestore } if } bind defO /nulljobname (\(From out of the blue\274\)) def % Default if no job name! /pagetext (Page ) def %@ % emitppage draws the page boundaries & emits physical page. % Usage: - emitppage -P % DictStack context: ... DMM-nup-dict DMM-nup-state [0 nested begin/end] % /emitppage { /lp-num 0 def /pp-num pp-num 1 add def. pbgray exec dup 0.0 ge exch 1.0 le and { realgsave Pstate setmatrix realinitclip. {} settransfer pbgray exec setgray newpath 0.3 setlinewidth 0 1 lp-row3 { lp-hgt lp-scl mul mul 0 exch moveto6 lp-col lp-wid lp-scl mul mul 0 rlineto } for 0 1 lp-col. { lp-wid lp-scl mul mul 0 moveto6 0 lp-row lp-hgt lp-scl mul mul rlineto } fo r strokeM % Now emit job name and page number just outside of top boundary.N DMM-nup-dict /hfont known not { DMM-nup-dict /hfont dfont put } if> % User can instruct us not to do this with nohead.G DMM-nup-dict /nohead known { nohead exec } { F } ifelse notC { lscape { 90 rotate 0 } { lp-row lp-hgt mul } ifelse. lp-scl mul 3 add 0 exch moveto7 hfont exec findfont 8 scalefont setfont  realgsave nulljobname exec) statusdict /jobname knownO { statusdict /jobname get dup type /stringtype eq { exch } if pop } if show realgrestore lscape! { lp-row lp-hgt! }{ lp-col lp-wid } ifelse( lp-scl mul mul 0 rmoveto pp-numC ppstr cvs dup stringwidth neg exch neg exch rmoveto2 currentpoint 3 -1 roll show movetoL pagetext exec dup stringwidth neg exch neg exch rmoveto show } if realgrestore } if realshowpage } bind def %C % lporig sets up the logical page's translation and scaling for3 % proper placement on the physical page. % Usage: - lporig -M % DictStack context: ... DMM-nup-dict DMM-nup-state [0 nested begin/end] %  /lporig { %H % Normally, logical pages are laid out col-major on the physical1 % page; transpose lays 'em out row-major. % lp-scl dup scale xpose lscape xor( { lp-num lp-col mod lp-wid mul lp-num lp-col idiv) }{ lp-num lp-row idiv lp-wid mul lp-num lp-row mod } ifelse+ lscape { lp-row 1 sub exch sub } if1 1 add neg lp-row add lp-hgt mul translateO Lstate currentma trix pop % New logical page transform } bind def %M % fixnasties updates certain state within known non-conforming PostScriptD % generating software so it properly works with N-up. % Usage: - fixnasties -C % DictStack context: ... DMM-nup-dict [0 nested begin/end] % /fixnastiesK { % TeX DVI-to-PS translators (most including older dvi2ps versions):I % Update Mtrx which TeXDict (no version data) naughtily maintainsG % across pages! From /usr/local/tex/postscript/dvi3ps.ps (and,9 % presumably, /usr/local/tex/DVIware/dvi2ps.pro).M % Only do this if TeXDict is known dictionary (use various guesses atM % spelling since some are different than others) and Mtrx is known inA % TeXDict. We likely do NOT support dvi?ps two-up modes.8 [ /TeXDict /TeXdict /TexDict /Texdict /texdict ] { dup where { exch get> dup /Mtr x known { /Mtrx get currentmatrix } if } if pop } forall } bind def %N % setlayout establishes the logical page layout for N-up, and is generallyJ % used when N <> 1. Establish default row/col page orderingJ % assuming portrait logical pages on a portrait or landscapeK % physical page (whichever is more natural). We support 1-16I % logical pages (with 1-4, 6, 8-9, 12, and 15-16 completelyI % filling the page; intermediate values get the next higherN % configuration but won't fill all the page slots). The specialI % value of 0 allows optional parameters to DMM-nup-pre thatJ % directly specify row and col orientation. Any other valueN % defaults to 1, however note that 1-up here is *different* thanO % the 1-up from above where lps-pp was originally specified as 1.M % Here 1-up will have page borders and be scaled appropriately!= % Usage: setlayout -B % DictStack context: ... DMM-nup-dict [1 nested begin/end] % /setlayout { dup 16 gt exch 0 lt or { /lps-pp 1 def } ifO [ {} 1 1 1 2 2 2 2 2 3 3 3 3 3 3 3 4 ] lps-pp get exec % rowsO [ {} 1 2 3 2 3 3 4 4 3 4 4 4 5 5 5 4 ] lps-pp get exec % cols ppdict begin /lp-col-orig xdf /lp-row-orig xdf lps-pp 0 eq@ { DMM-nup-dict /lps-pp lp-row-orig lp-col-orig mul put } if end %ppdict } bind def %M % setpaper picks up the current physical paper parameters of the printer.M % This is what we use for our physical page layout. Then buildsK % an imageable area within the device's imageable area for ourJ % logical layout including page borders and headlines. If anI % N-up document is to be embedded, the surrounding code mustF % establish an appropriate paper imageable area clippath. % Usage: - setpaper -A % DictStack context: ... DMM-nup-dict [1 nested begin/end] % /setpaper { ppdict begin. newpath clippath pathbbox newpath pippI % Force physical page into portrait orientation if its landscape. pp-w pp-h gt { 0 pp-h translate -90 rotate, pi-lly pi-llx pi-ury pi-urx pipp } ifO pp-matrix currentmatrix pop % Physical page transformK % Now for logical imagearea. It's the physical imagearea with 12ptL % margins (0pt if no borders) all around yet also guarantees a 0.5in8 % (0.5in if no borders) paper margin all around.. pbgray exec dup 0.0 ge exch 1.0 le and { /pi-mar 12 def /pp-mar 36 def }{ /pi-mar 0 def /pp-mar 36 def } ifelse% /li-llx pi-llx pi-mar add def2 li-llx pp-mar lt { /li-llx pp-mar def } if% /li-lly pi-lly pi-mar add def2 li-lly pp-mar lt { /li-lly pp-mar def } if% /li-urx pi-urx pi-mar sub defD li-urx pp-w pp-mar sub gt { /li-urx pp-w pp-mar sub def } if% /li-ury pi-ury pi-mar sub defD li-ury pp-h pp-mar sub gt { /li-ury pp-h pp-mar sub def } if# /li-w li-urx li-llx sub def# /li-h li-ury li-lly sub defN % Probably should assert (li-h > 0) and (li-w > 0) and (li-h >= li-w)! end %ppdictK % Nullify logical page width and height to force recalc in setpage. /lp-wid -1 def /lp-hgt -1 def } bind def %G % setpage establishes the logical imagearea for logical page layoutA % based on the actual papersize requested by the job.B % Usage: setpage -@ % DictStack context: ... DMM-nup-dict [1 nested begin/end] % /setpage  { ppdict beginO /lp-h xdf /lp-w xdf % Parameters: logical page width, heightK % Special handling of case where logical page width & height == -1.J % This is a setpapertray operation; stack still contains papertrayK % to use. We briefly switch to this papertray to capture its paperO % dimensions for our logical layout, then switch back to using the sameK % tray as we started. A CROCK thankfully unnecessary in PS Level 2!! lp-h -1 eq lp-w -1 eq and { save exch realinitgraphics/ statusdict /papertray get exec exch realsetpapertray% newpath clippath pathbbox& 6 -2 roll realsetpapertray realrestore1 3 -1 roll add /lp-h xdf add /lp-w xdf } ifM % Only need to (re)calc layout if it's changed from what we're using;M % allow a 5pt tolerance just like PS Level 2 does with paper changes.@ lp-w lp- wid sub abs 5.0 gt lp-h lp-hgt sub abs 5.0 gt or end %ppdictM { % Start new layout on new sheet if we've already put something on % the current sheet. DMM-nup-state begin( lp-num 0 gt { emitppage } if end %DMM-nup-stateN % If landscape, toggle our thinking about rows and cols, otherwise. % set our thinking straight again. ppdict begin# lp-row-orig lp-col-orig lp-w lp- h gtO end %ppdict % Put values to actually use within DMM-nup-dict( { /lp-row xdf /lp-col xdf( }{ /lp-col xdf /lp-row xdf } ifelse ppdict beginG DMM-nup-dict /portpp lp-w lp-col mul lp-h lp-row mul le put* /ll-w /ll-h portpp { exch } if# lp-w lp-col mul def# lp-h lp-row mul defH % Determine proper scaling factor to fit logical layout intoM % logical imagearea, keeping logical page's aspect ratio correct. DMM-nup-dict /lp-sclI li-h ll-h div li-w ll-w div 2 copy gt { exch } if pop putG % Center logical layout within logical imagearea by moving 7 % coordinate system origin to proper palce.O pp-matrix setmatrix % Essentially start an "initgraphics"N % Doing landscape logical on landscape physical causes paper to beK % fed "upside down"--not appealing in viewers like ghostscript.! portpp not lscape and# { pp-w pp-h translate 180 rotate } if5 li-w ll-w lp-scl mul sub 2 div li-llx add5 li-h ll-h lp-scl mul sub 2 div li-lly add translate portpp not+ { ll-w lp-scl mul 0 translate 90 rotate } ifB % Update logical page width and height used elsewhere.N DMM-nup-dict /lp -wid lp-w put % Logical page widthO DMM-nup-dict /lp-hgt lp-h put % Logical page height end %ppdictM % Okay, now (re)init N-up state within DMM-nup-state accordingly. DMM-nup-state beginO Pstate currentmatrix pop % Physical page transform lporig initclip %M % If flipping pages, move origin to opposite corner of paper. WeK % DON'T do this in lporig so draft notices come out okay (we'reM % assuming the job images its pages upside down, which can happenN % with 270-degree rotated landscape). This origin change *should*K % be picked up as part of Cstate matrix; job is expected not to % do anything nasty. % flipit& { lp-wid lp-hgt translate 180 rotate } if# % Finish "initgraphics" end %DMM-nup-state } ifO% % Show new logical page size in upper-left corner of this logical page..% pbgray exec dup 0.0 ge exch 1.0 le andG% DMM-nup-dict /nohead known { nohead exec } { F } ifelse not and% { save% initgraphics>% /Helvetica findfont 6 lp-scl div scalefont setfont<% 2 lp-hgt 2 sub moveto 0 6 lp-scl div neg rmoveto0% ([ ) show lp-wid 20 string cvs show0% ( x ) show lp-hgt 20 string cvs show% ( ]) show% realrestore % } if } bind def { /ppdict 30 dict def ppdict begin /pp-matrix matrix def1 % pipp -- Physical Imagearea on Physical Page /pippO { /pi-ury xdf /pi-urx xdf /pi-lly xdf /pi-llx xdf % Physical imagearea bbN /pp-w pi-urx pi-llx add def % Physical paper widthO /pp-h pi-ury pi-lly add def % Physical paper height } bind def end %ppdict % % FINALLY set up everything! % lps-pp setlayout setpaperK % Assume for now that logical pages are same as physical; this might beN % changed if any of the below paper setup ops are executed within the job.& ppdict begin pp-w pp-h end setpage } exec end %DMM-nup-dict' % userdict now on top of dict stack %N % Redefine supported papersizes in printer to establish logical page size.J % We put redefinitions in userdict even th ough originals *might* be inI % systemdict. At the moment, these changes are not undone by finish. % 8 dict begin {O /in { 72 mul } bind def % inch conversion to pointsO /mm { 72 25.4 div mul } bind def % millimeter conversion to points /str 40 string def /fixuptray; { % Deal with possible tray equivalent in statusdict.K % Tray replacement routine will actually effect a paper tray changeG % if we're a t the beginning of the job (pp-num is 0); otherwiseD % we simply note that the job requested a new paper size andF % adjust only the logical page layout accordingly (no physical6 % paper change occurs in the middle of a job).; exch str cvs length dup str exch (tray) putinterval- 4 add str exch 0 exch getinterval cvn statusdict 1 index known { statusdict exch( [ { DMM-nup-state begin0 pp-num 0 eq lp-num 0 eq and' end %DMM-nup-state' DMM-nup-dict begin } /exec load [ /-realtray- { execO realinitgraphics % In case new tray == old setpaper2 ppdict begin pp-w pp-h end } /exec load ] cvx [ /-w- /-h- ] cvx { ifelse  setpage% end %DMM-nup-dict } /exec load ]D dup 2 get 0 4 index 4 index get put % Plop in -realtray-A dup 3 get 0 6 -1 roll putinterval % Plop in -w- -h- cvx put }{ pop pop } ifelse } bind def /putalways { 2 copy userdict 3 1 rollN [ {DMM-nup-dict begin} /exec load /-w- /-h- {setpage end} /exec load ]5 dup 2 4 -1 roll putinterval % Plop in -w- -h- cvx put fixuptray } bind def /putneeded: { 1 index where { pop putalways } { pop pop } ifelse } bind def } exec {O /setpaper [ -1 -1 ] fixuptray % Replace /setpapertray6 /letter [ 8.5 in 11 in ] putalways6 /legal [ 8.5 in 14 in ] putalways6 /executivepaper [ 7.25 in 10.5 in ] putneeded6 /11x17 [ 11 in 17 in ] putalways6 /ledger [ 11 in 17 in ] putneeded } exec {6 /a0 [ 841 mm 1189 mm ] putneeded6 /a1 [ 594 mm 841 mm ] putneeded6 /a2 [ 420 mm 594 mm ] putneeded6 /a3 [ 297 mm 420 mm ] putalways6 /a4 [ 210 mm 297 mm ] putalways6 /a5 [ 148 mm 210 mm ] putneeded6 /a6 [ 105 mm 148 mm ] putneeded6 /a7 [ 74 mm 105 mm ] putne eded6 /a8 [ 52 mm 74 mm ] putneeded6 /a9 [ 37 mm 52 mm ] putneeded6 /a10 [ 26 mm 37 mm ] putneeded } exec {6 /b0 [ 1000 mm 1414 mm ] putneeded6 /b1 [ 707 mm 1000 mm ] putneeded6 /b2 [ 500 mm 707 mm ] putneeded6 /b3 [ 353 mm 500 mm ] putneeded6 /b4 [ 250 mm 353 mm ] putneeded6 /b5 [ 176 mm  250 mm ] putalways6 /b6 [ 125 mm 176 mm ] putneeded6 /b7 [ 88 mm 125 mm ] putneeded6 /b8 [ 62 mm 88 mm ] putneeded6 /b9 [ 44 mm 62 mm ] putneeded6 /b10 [ 31 mm 44 mm ] putneeded } exec {6 /c0 [ 914.4 mm 1300.5 mm ] putneeded6 /c1 [ 650.2 mm 914.4 mm ] putneeded6 /c2 [ 457.2 mm 650.2 mm ] putneeded6 /c3  [ 325.1 mm 457.2 mm ] putneeded6 /c4 [ 228.6 mm 325.1 mm ] putneeded6 /c5 [ 162.6 mm 228.6 mm ] putneeded6 /c6 [ 114.3 mm 162.6 mm ] putneeded6 /c7 [ 81.3 mm 114.3 mm ] putneeded } exec end % 8 dict {& /lettersmall /letter load def& /note /letter load def& /a4small /a4 load def statusdict /setpage known { statusdict /setpage: { pop DMM-nup-dict begin setpage end } bind put } if# statusdict /setpageparams known! { statusdict /setpageparams> { pop pop DMM-nup-dict begin setpage end } bind put } if } exec %C % Rebind critical operators in already-downloaded dictionaries. %) /md where { /md get type /dicttype eqM { % Rebind /cp using redefined restore, avoid setting /#copies to 0 for5 % nopage, ignore manual feed timing hack. md /cp knownJ  { md /cp { pop { copypage } { showpage } ifelse pm restore } put } ifI % Avoid use of /gc clippath which will be invalid for N-up pages. md /nc known? { md /nc { currentpoint initclip newpath moveto } put } if6 % Have page setup ops pick up new definitions.* md /bigs known md /smalls known or { [ lnop /letter load /legal load /a4 load /b5 load lnop lnop lnop /11x17 load /a3 load ] dup$ md exch /bigs exch put$ md exch /smalls exch put } if } if } if} ifelse end %userdictend %systemdict} put%G% DMM-nup-post: N-up postscript (insert after actual PostScript file).!% Usage: - DMM-nup-post -*% Dictstack: ... [2 nested begin/end]%userdict /DMM-nup-post{ DMM-nup- dict begin finish end %DMM-nup-dict } bind put.systemdict /setpacking known { setpacking } if %enddmmnupdict %%EndProcSet%%EOFwwshowpage load def userdict/showpage{DMM-nup-dict>begin gsave grestore realshowpage end}bind put/finish{userdictMbegin/showpage/realshowpage load def end}bind def end}{userdict/DMM-nup-statetM10 dict dup begin put/pp-num 0 def/lp-num 0 def/pagecount 0 def/Pstate matrixcJdef/Lstate matrix def/oldLstate matrix def/Cstate matrix def/Tstate matrixCdef/ppstr 15 string def/did-showpage F def end/statusdict where{poprG}{userdict/statusdict 1 dict put}ifelse{/realinitclip/initclip load def{J/realinitmatrix/initmatrix load def/realinitgraphics/initgraphics load defI/realshowpage/showpage load def/realrestore/restore load def/realgrestorepL/grestore load def/realgsave/gsave load def/realerasepage/erasepage load defLstatusdict/setpapertray 2 copy known{get/realsetpapertray exch def}{pop pop}Cifelse/setpagedevice dup where{exch get/realsetpagedevice xdf}{pop}sKifelse/currentpagedevice dup where{exch get/realcurrentpagedevice xdf}{pop} Oifelse}exec userdict/initclip{DMM-nup-dict dup/realinitclip ge t exec/noclip getaEnot{errordict/nocurrentpoint get errordict/nocurrentpoint{pop 0 0}putaDcurrentpoint errordict/nocurrentpoint 5 -1 roll put currentlinewidthMDMM-nup-state/Tstate get currentmatrix DMM-nup-state/Pstate get setmatrix 0.3aOsetlinewidth DMM-nup-state/Lstate get setmatrix newpath DMM-nup-dict/lp-wid getwGDMM-nup-dict/lp-hgt get 0 exch moveto dup 0 rlineto 0 lineto 0 0 linetow@closepath clip newpath setmatrix setlinewidth moveto}if}bind put?userdict/initmatrix{DMM-nup-state/Lstate g et setmatrix}bind putoGuserdict/initgraphics{DMM-nup-dict/realinitgraphics get exec initmatrixrOinitclip}bind put userdict/erasepage{DMM-nup-dict/realgsave get exec initclip 1sIsetgray newpath clippath fill DMM-nup-dict/realgrestore get exec}bind puth=userdict/showpage{DMM-nup-dict begin T lshowpage end}bind put Luserdict/restore{DMM-nup-state/pp-num get exch DMM-nup-state/lp-num get exch!DMM-nup-state /pagecount get exchs"DMM-nup-dict /realrestore get exec&DMM-nup-state /pagecount 3 -1 roll p ut*DMM-nup-state/lp-num 2 copy get 4 1 roll 2Mindex put eq exch DMM-nup-state/pp-num 2 copy get 4 1 roll 2 index put eq andeDnot{DMM-nup-dict begin F lshowpage end}if}bind put userdict/grestoreB{DMM-nup-dict/realgrestore get exec DMM-nup-state/did-showpage getG{DMM-nup-state begin oldLstate Lstate copy pop end DMM-nup-dict begin FDMlshowpage end}if}bind put userdict/gsave{DMM-nup-state/did-showpage false putsADMM-nup-dict/realgsave get exec}bind put{/setpagedevice where{pop Juserdict/setpagede vice{DMM-nup-state begin pp-num 0 eq lp-num 0 eq and endKDMM-nup-dict begin{realsetpagedevice realinitgraphics setpaper ppdict begin/Kpp-w pp-h end true}{dup/PageSize known dup{exch/PageSize get aload pop 3 -1dNroll}if}ifelse{setpage}{pop}ifelse end}bind put}if/currentpagedevice where{popCuserdict/currentpagedevice{DMM-nup-dict begin realcurrentpagedeviceaHdup/PageSize known{dup length dict copy dup/PageSize [lp-wid lp-hgt] putGreadonly}if end}bind put}if}exec/finish{DMM-nup-state begin lp-num 0  gts;{emitppage}if end userdict begin/initclip/realinitclip load-Idef/initmatrix/realinitmatrix load def/initgraphics/realinitgraphics loadi;def/showpage/realshowpage load def/restore/realrestore loade7def/grestore/realgrestore load def/gsave/realgsave load Idef/erasepage/realerasepage load def statusdict/setpapertray 2 copy knowneI{/realsetpapertray load put}{pop pop}ifelse userdict/setpagedevice 2 copy Nknown{/realsetpagedevice load put}{pop pop}ifelse userdict/currentpagedevice 2Gcopy known {/realcurrentpagedevice load put}{pop pop}ifelse end}bind defaO/lshowpage{DMM-nup-state begin dup{pagecount 1 add startpage lt{erasepage}if}ifa/Tstate currentmatrix Lstate Cstate invertmatrixs1Cstate concatmatrix pop dup/did-showpage xdf dup{yOLstate oldLstate copy pop /pagecount pagecount 1 add def pagecount startpage gee/{pagecount endpage eq {emitppage (stop) = stop}p.{pagecount endpage lt{/lp-num lp-num 1 add def+lp-num lps-pp eq {emitppage}if}if}ifelse}iff/Pstate setmatrix lporig initgraphics realgsave}n/{Pstate setmatrix lporig initclip}ifelse Cstatef/concat end fixnasties{realgrestore}if}bind def 0L/emitppage{/lp-num 0 def/pp-num pp-num 1 add def pbgray exec dup 0.0 ge exchK1.0 le and{realgsave Pstate setmatrix realinitclip{}settransfer pbgray execgOsetgray newpath 0.3 setlinewidth 0 1 lp-row{lp-hgt lp-scl mul mul 0 exch moveto Mlp-col lp-wid lp-scl mul mul 0 rlineto}for 0 1 lp-col{lp-wid lp-scl mul mul 0aHmoveto 0 lp-row lp-hgt lp-scl mul mul rlineto}for stroke realgrestore}ifLrealshowpage}bind def/lporig{lp-scl dup scale xpose lscape xor{lp-num lp-colNmod lp-wid mul lp-num lp-col idiv}{lp-num lp-row idiv lp-wid mul lp-num lp-rowJmod}ifelse lscape{lp-row 1 sub exch sub}if 1 add neg lp-row add lp-hgt mul6translate Lstate currentmatrix pop}bind def/fixnastiesM{[/TeXDict/TeXdict/TexDict/Texdict/texdict]{dup where{exch get dup/Mtrx knownlM{/Mtrx get currentmatrix}if}if pop}forall}bind def/setlayout{dup 16 gt exch 0lOlt or{/lps-pp 1 def}if [{}1 1 1 2 2 2 2 2 3 3 3 3 3 3 3 4] lps-pp get exec [{}1}G2 3 2 3 3 4 4 3 4 4 4 5 5 5 4] lps-pp get exec ppdict begin/lp-col-origsOxdf/lp-row-orig xdf lps-pp 0 eq{DMM-nup-dict/lps-pp lp-row-orig lp-col-orig mulpKput}if end}bind def/setpaper{ppdict begin newpath clippath pathbbox newpathxIpipp pp-w pp-h gt{0 pp-h translate -90 rotate pi-lly pi-llx pi-ury pi-urxsFpipp}if pp-matrix currentmatrix pop pbgray exec dup 0.0 ge exch 1.0 leKand{/pi-mar 12 def/pp-mar 36 def}{/pi-mar 0 def/pp-mar 36 def}ifelse/li-llxeJpi-llx pi-mar add def li-llx pp-mar lt{/li-llx pp-mar def}if/li-lly pi-llyNpi-mar add def li-lly pp-mar lt{/li-lly pp-mar def}if/li-urx pi-urx pi-mar subJdef li-urx pp-w pp-mar sub gt{/li-urx pp-w pp-mar sub def}if/li-ury pi-uryLpi-mar sub def li-ury pp-h pp-mar sub gt{/li-ury pp-h pp-mar sub def}if/li-wLli-urx li-llx sub def/li-h li-ury li-lly sub def end/lp-wid -1 def/lp-hgt -1Idef}bind def/setpage{ppdict begin/lp-h xdf/lp-w xdf lp-h -1 eq lp-w -1 eqlAand{save exch realinitgraphics statusdict/papertray get exec exch-Erealsetpapertray newpath clippath pathbbox 6 -2 roll realsetpapertraygMrealrestore 3 -1 roll add/lp-h xdf add/lp-w xdf}if lp-w lp-wid sub abs 5.0 gtaNlp-h lp-hgt sub abs 5.0 gt or end{DMM-nup-state begin lp-num 0 gt{emitppage}ifLend ppdict begin lp-row-orig lp-col-orig lp-w lp-h gt end{/lp-row xdf/lp-colOxdf}{/lp-col xdf/lp-row xdf}ifelse ppdict begin DMM-nup-dict/portpp lp-w lp-colcLmul lp-h lp-row mul le put/ll-w/ll-h portpp{exch}if lp-w lp-col mul def lp-hElp-row mul def DMM-nup-dict/lp-scl li-h ll-h div li-w ll-w div 2 copyfFgt{exch}if pop put pp-matrix setmatrix portpp not lscape and{pp-w pp-hKtranslate 180 rotate}if li-w ll-w lp-scl mul sub 2 div li-llx add li-h ll-hgFlp-scl mul sub 2 div li-lly add translate portpp not{ll-w lp-scl mul 0Ltranslate 90 rotate}if DMM-nup-dict/lp-wid lp-w put DMM-nup-dict/lp-hgt lp-hEput end DMM-nup-state begin Pstate currentmatrix pop lporig initclipdLflipit{lp-wid lp-hgt translate 180 rotate}if end}if}bind def{/ppdict 30 dictHdef ppdict begin/pp-matrix matrix def/pipp{/pi-ury xdf/pi-urx xdf/pi-llyMxdf/pi-llx xdf/pp-w pi-urx pi-llx add def/pp-h pi-ury pi-lly add def}bind defrKend lps-pp setlayout setpaper ppdict begin pp-w pp-h end setpage}exec end 8wLdict begin{/in{72 mul}bind def/mm{72 25.4 div mul}bind def/str 40 string defO/fixuptray{exch str cvs length dup str exch (tray) putinterval 4 add str exch 0iMexch getinterval cvn statusdict 1 index known{statusdict exch [{DMM-nup-statexCbegin pp-num 0 eq lp-num 0 eq and end DMM-nup-dict begin}/exec loadpL[/-realtray-{exec realinitgraphics setpaper ppdict begin pp-w pp-h end}/execNload] cvx [/-w-/-h-] cvx{ifelse setpage end}/exec load ] dup 2 get 0 4 index 4Lindex get put dup 3 get 0 6 -1 roll putinterval cvx put}{pop pop}ifelse}bindJdef/putalways{2 copy userdict 3 1 roll [{DMM-nup-dict begin}/exec load/-w-O/-h-{setpage end}/exec load] dup 2 4 -1 roll putinterval cvx put fixuptray}bindu>def/putneeded{1 index where{pop putalways}{pop pop}ifelse}bindJdef}exec{/setpaper [-1 -1] fixuptray/letter [8.5 in 11 in] putalways/legalM[8.5 in 14 in] putalways/executivepaper [7.25 in 10.5 in] putneeded/11x17 [11 Lin 17 in] putalways/ledger [11 in 17 in] putneeded}exec{/a0 [841 mm 1189 mm]Nputneeded/a1 [594 mm 841 mm] putneeded/a2 [420 mm 594 mm] putneeded/a3 [297 mmO420 mm ] putalways/a4 [210 mm 297 mm] putalways/a5 [148 mm 210 mm] putneeded/a6yF[105 mm 148 mm] putneeded/a7 [74 mm 105 mm] putneeded/a8 [52 mm 74 mm]Iputneeded/a9 [37 mm 52 mm] putneeded/a10 [26 mm 37 mm] putneeded}exec{/b0nL[1000 mm 1414 mm] putneeded/b1 [707 mm 1000 mm] putneeded/b2 [500 mm 707 mm]Nputneeded/b3 [353 mm 500 mm] putneeded/b4 [250 mm 353 mm] putneeded/b5 [176 mmM250 mm] putalways/b6 [125 mm 176 mm] putneeded/b7 [88 mm 125 mm] putneeded/b8/D[62 mm 88 mm] putneeded/b9 [44 mm 62 mm] putneeded/b10 [31 mm 44 mm]Hputneeded}exec{/c0 [914.4 mm 1300.5 mm] putneeded/c1 [650.2 mm 914.4 mm]Nputneeded/c2 [457.2 mm 650.2 mm] putneeded/c3 [325.1 mm 457.2 mm] putneeded/c4K[228.6 mm 325.1 mm] putneeded/c5 [162.6 mm 228.6 mm] putneeded/c6 [114.3 mm 8162.6 mm] putneeded/c7 [81.3 mm 114.3 mm] putneeded}execIend{/lettersmall/letter load def/note/letter load def/a4small/a4 load defuJstatusdict/setpage known{statusdict/setpage{pop DMM-nup-dict begin setpageKend}bind put}if statusdict/setpageparams known{statusdict/setpageparams{pop0Fpop DMM-nup-dict begin setpage end}bind put}if}exec}ifelse end end}put<userdict/DMM-nup-post{DMM-nup-dict begin finish end}bind put)systemdict/setpacking known{setpac per pagee8 [/hdr () (.hdr .header. param7)] % page header4 [/font (Courier) (.font .param8)] % font> [/topmargin -1 (.topmargin .top .param9)] % topmarginC [/leftmargin -1 (.leftmargin .left .param10)] % leftmargin%G [/rightmargin -1 (.rightmargin .right .param11)] % rightmarginiK [/bottommargin -1 (.bottommargin .bottom .param12)] % bottommarginr= [/alternate false (.alternate .param13)] % alternateg2 [/swedish false (.swedish)] king}ifnww}execIend{/lettersmall/letter load def/note/letter load def/a4small/a4 load deflJstatusdict/setpage known{statusdict/setpage{pop DMM-nup-dict begin setpageKend}bind put}if statusdict/setpageparams known{statusdict/setpageparams{poprFpop DMM-nup-dict begin setpage end}bind put}if}exec}ifelse end end}put<userdict/DMM-nup-post{DMM-nup-dict begin finish end}bind put)systemdict/setpacking known{setpacking}ifcwwifiwww$% set swedish mode+ [/wrap false (.wrap)] % set wrap modee ] def} if xtable { % apply defaultse /ta exch def % save array  ta 0 get % key ta 1 get % default value def % define default value} forall o7currentdict /parser known {parser} if % if user inputs L% if the user specified a string for /hdr then use it, also imply title true6hdr length 0 ne {/filename hdr def /title true def} if5currentdict /filename known not {/filename () def} ifP%filen12)] % bottommarginn= [/alternate false (.alternate .param13)] % alternate 2 [/swedish false (.swedish)] % set swedish mode* [/wrap true (.wrap)] % set wrap mode ] def} if formname (SWEDISH) eq {i /table [r9 [/#copies 1 (.nc .ncopies .param1)] % number of copies(1 [/fsizetmp 0 (.fsize .fs .param2)] % font size 4 [/wide false (.wide .w .param3)] % landscape mode+ [/title false (.title .param4)] % title 8 [/ncolumns 1 (.ncolumns .param5)] % number of columns? [/linelimit 66 (.linelimit .nlines .param6)] % lines per pagee8 [/hdr () (.hdr .header. param7)] % page header4 [/font (Courier) (.font .param8)] % font> [/topmargin -1 (.topmargin .top .param9)] % topmarginC [/leftmargin -1 (.leftmargin .left .param10)] % leftmargin/G [/rightmargin -1 (.rightmargin .right .param11)] % rightmarginiK [/bottommargin -1 (.bottommargin .bottom .param12)] % bottommarginc= [/alternate false (.alternate .param13)] % alternate 1 [/swedish true (.swedish)] % set swedish modes+ [/wrap false (.wrap)] % set wrap mode4 ] def} if tcurrentdict /table known not { /table [9 [/#copies 1 (.nc .ncopies .param1)] % number of copiesm1 [/fsizetmp 0 (.fsize .fs .param2)] % font sizet4 [/wide false (.wide .w .param3)] % landscape mode* [/title true (.title .param4)] % title8 [/ncolumns 1 (.ncolumns .param5)] % number of columns? [/linelimit 66 (.linelimit .nlines .param6)] % lines  per page 8 [/hdr () (.hdr .header. param7)] % page header4 [/font (Courier) (.font .param8)] % font> [/topmargin -1 (.topmargin .top .param9)] % topmarginC [/leftmargin -1 (.leftmargin .left .param10)] % leftmargin}G [/rightmargin -1 (.rightmargin .right .param11)] % rightmargin K [/bottommargin -1 (.bottommargin .bottom .param12)] % bottommargin= [/alternate false (.alternate .param13)] % alternate 2 [/swedish false (.swedish)] !% set swedish mode+ [/wrap false (.wrap)] % set wrap modeh ] def} if itable { % apply defaults /ta exch def % save arrayb ta 0 get % key ta 1 get % default value def % define default value} forall r7currentdict /parser known {parser} if % if user inputsm sL% if the user specified a string for /hdr then use it, also imply title true6hdr length 0 ne {/filename hdr def /title true def} if5currentdict /filename known not {/filename () def} ifsP%filen "ame (_DUA0:[]) anchorsearch {pop /filename exch def} {pop} ifelse %cleanup?filename ([]) search {pop pop /filename exch def} {pop} ifelse o &/inp currentfile def % define files wide {* leftmargin 0 lt {/leftmargin .4 inch def}, {/leftmargin leftmargin inch def} ifelse+ topmargin 0 lt {/topmargin 8.1 inch def} 1 {/topmargin 8.5 topmargin sub inch def} ifelseu. bottommargin 0 lt {/bottommargin .3 inch def}0 {/bottommargin bottommargin inch def} ifelse- rightmargin 0 lt {/ri#ghtmargin .25 inch def}I. {/rightmargin rightmargin inch def} ifelse6 currentdict /fsize known not {/fsize 10 point def} if' fsizetmp 0 ne {/fsize fsizetmp def} if  /pagewidth 11 inch deft /squish -0.3 defe /titlemargin 0 def} { * leftmargin 0 lt {/leftmargin 1. inch def}, {/leftmargin leftmargin inch def} ifelse+ topmargin 0 lt {/topmargin 10.39 inch def}a0 {/topmargin 11 topmargin sub inch def} ifelse- rightmargin 0 lt {/rightmargin .25 inch def}r. {/rightmargin rightmar+gin inch def} ifelse. bottommargin 0 lt {/bottommargin .5 inch def}0 {/bottommargin bottommargin inch def} ifelse6 currentdict /fsize known not {/fsize 10 point def} if' fsizetmp 0 ne {/fsize fsizetmp def} ifg /pagewidth 8.5 inch def /squish -0.3 defo /titlemargin .185 inch def } ifelse&/lineh fsize point def % line height/lineh lineh 1.2 sub def/linecount 0 def /column 0 deffF/columnwidth pagewidth leftmargin sub rightmargin sub ncolumns div def%/ibuf 200 string def % input%ame (_DUA0:[]) anchorsearch {pop /filename exch def} {pop} ifelse %cleanup?filename ([]) search {pop pop /filename exch def} {pop} ifelse  &/inp currentfile def % define files wide {* leftmargin 0 lt {/leftmargin .4 inch def}, {/leftmargin leftmargin inch def} ifelse+ topmargin 0 lt {/topmargin 8.1 inch def} 1 {/topmargin 8.5 topmargin sub inch def} ifelse. bottommargin 0 lt {/bottommargin .3 inch def}0 {/bottommargin bottommargin inch def} ifelse- rightmargin 0 lt {/ri&ghtmargin .25 inch def}. {/rightmargin rightmargin inch def} ifelse6 currentdict /fsize known not {/fsize 10 point def} if' fsizetmp 0 ne {/fsize fsizetmp def} if /pagewidth 11 inch def /squish -0.3 def /titlemargin 0 def} { * leftmargin 0 lt {/leftmargin 1. inch def}, {/leftmargin leftmargin inch def} ifelse+ topmargin 0 lt {/topmargin 10.39 inch def}0 {/topmargin 11 topmargin sub inch def} ifelse- rightmargin 0 lt {/rightmargin .25 inch def}. {/rightmargin rightmar'gin inch def} ifelse. bottommargin 0 lt {/bottommargin .5 inch def}0 {/bottommargin bottommargin inch def} ifelse6 currentdict /fsize known not {/fsize 10 point def} if' fsizetmp 0 ne {/fsize fsizetmp def} if /pagewidth 8.5 inch def /squish -0.3 def /titlemargin .185 inch def} ifelse&/lineh fsize point def % line height/lineh lineh 1.2 sub def/linecount 0 def /column 0 defF/columnwidth pagewidth leftmargin sub rightmargin sub ncolumns div def%/ibuf 200 string def % input( buffer/page 1 def % page number/xpos leftmargin def/xmargin leftmargin def/ypos topmargin lineh sub def&/xlimit leftmargin columnwidth add def/wrapping false defB% The following section of code makes a new font with a backspace>% character defined. The width of the backspace character is8% the negative of the width of an underscore character./selectfont { dupfindfont % select the font8%lineh scalefont setfont % find width of an underscore/% (_) stringwid)th pop 100 mul /uwid exch def%>% find the width of a character in the font coordinate system.@% add back in the scaled amount that squish will offset us so we-% end up in the right place after a backspace%1000 scalefont setfontE (_) stringwidth pop 2000 squish mul fsize div add /uwid exch def  findfont % copy the fontKdup length 1 add dict /newdict exch def % leaving room for a Metrics entry{$ exch dup /FID ne { % if not /FID3 dup /Encoding eq { % if /Encoding* copy the entry exch dup length array copy  newdict 3 1 roll put } {7 exch newdict 3 1 roll put % else just use the object } ifelse } { pop pop % dump /FID } ifelse} forall ,1 dict begin % create Metrics dictionary3 /backspace uwid neg def % define backspace width! newdict /Metrics currentdict putend .newdict begin % set encoding for backspace Encoding 8 /backspace put swedish { Encoding 16#7b /aring put % {# Encoding 16#7d /adieresis put % }# Encoding 16#7c /odieresis put % | Encoding 16#5b /Aring put % [# Encoding 16#5d /Adieresis put % ]# Encoding 16#5c /Odieresis put % \ } ifend5/xfont newdict definefont pop % define the new font =/xfont findfont fsize scalefont setfont % select the new font} deffont selectfont landscape/saveobj save defww, buffer/page 1 def % page number/xpos leftmargin def/xmargin leftmargin def/ypos topmargin lineh sub def&/xlimit leftmargin columnwidth add def/wrapping false defB% The following section of code makes a new font with a backspace>% character defined. The width of the backspace character is8% the negative of the width of an underscore character./selectfont { dupfindfont % select the font8%lineh scalefont setfont % find width of an underscore/% (_) stringwid-th pop 100 mul /uwid exch def%>% find the width of a character in the font coordinate system.@% add back in the scaled amount that squish will offset us so we-% end up in the right place after a backspace%1000 scalefont setfontE (_) stringwidth pop 2000 squish mul fsize div add /uwid exch def  findfont % copy the fontKdup length 1 add dict /newdict exch def % leaving room for a Metrics entry{$ exch dup /FID ne { % if not /FID3 dup /Encoding eq { % if /Encoding. copy the entry exch dup length array copy  newdict 3 1 roll put } {7 exch newdict 3 1 roll put % else just use the object } ifelse } { pop pop % dump /FID } ifelse} forall ,1 dict begin % create Metrics dictionary3 /backspace uwid neg def % define backspace width! newdict /Metrics currentdict putend .newdict begin % set encoding for backspace Encoding 8 /backspace put swedish { Encoding 16#7b /aring put % {# Encoding 16#7d /adieresis put % }# Encoding 16#7c /odieresis put % | Encoding 16#5b /Aring put % [# Encoding 16#5d /Adieresis put % ]# Encoding 16#5c /Odieresis put % \ } ifend5/xfont newdict definefont pop % define the new font =/xfont findfont fsize scalefont setfont % select the new font} deffont selectfont landscape/saveobj save defww