123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- %
- % Redefiniton of the PostScript file output operators so results go to paper.
- % Complicated and slow, but the implementation doesn't place many demands on
- % included PostScript. About all that's required is gentle treatment of the
- % graphics state between write calls.
- %
- /#copies 1 store
- /aspectratio 1 def
- /font /Courier def
- /formsperpage 1 def
- /landscape false def
- /magnification 1 def
- /orientation 0 def
- /pointsize 10 def
- /rotation 1 def
- /xoffset .1 def
- /yoffset .1 def
- /roundpage true def
- /useclippath true def
- /pagebbox [0 0 612 792] def
- /inch {72 mul} def
- /min {2 copy gt {exch} if pop} def
- /HardcopySetup {
- landscape {/orientation 90 orientation add def} if
- font findfont 1 1.1 div scalefont setfont
- pagedimensions
- xcenter ycenter translate
- orientation rotation mul rotate
- width 2 div neg height 2 div translate
- xoffset inch yoffset inch neg translate
- pointsize 1.1 mul dup scale
- magnification dup aspectratio mul scale
- height width div 1 min dup scale
- 0 -1 translate
- 0 0 moveto
- } def
- /pagedimensions {
- useclippath {
- /pagebbox [clippath pathbbox newpath] def
- roundpage currentdict /roundpagebbox known and {roundpagebbox} if
- } if
- pagebbox aload pop
- 4 -1 roll exch 4 1 roll 4 copy
- landscape {4 2 roll} if
- sub /width exch def
- sub /height exch def
- add 2 div /xcenter exch def
- add 2 div /ycenter exch def
- } def
- %
- % Unbind the operators in an executable array or packedarray. Leaves the
- % unbound array or the original object on the stack.
- %
- /Unbind {
- 0 index xcheck
- 1 index type /arraytype eq
- 2 index type /packedarraytype eq or and {
- dup length array copy cvx
- dup 0 exch {
- dup type /operatortype eq {
- ( ) cvs cvn cvx
- } if
- dup type /dicttype eq {
- dup maxlength dict exch {
- Unbind
- 3 copy put pop pop
- } forall
- } if
- 0 index xcheck
- 1 index type /arraytype eq
- 2 index type /packedarraytype eq or and {
- Unbind
- } if
- 3 copy put pop
- 1 add
- } forall
- pop
- } if
- } def
- %
- % New write operator - don't bind the definition! Expands tabs and backspaces,
- % wraps long lines, and starts a new page whenever necessary. The code that
- % handles newlines assumes lines are separated by one vertical unit.
- %
- /write {
- true exch
- %%case '\b':
- dup 8#10 eq {
- ( ) stringwidth pop neg 0 rmoveto
- currentpoint pop 0 lt {
- currentpoint exch pop 0 exch moveto
- } if
- exch pop false exch
- } if
- %%case '\t':
- dup 8#11 eq {
- currentpoint pop ( ) stringwidth pop div round cvi
- 8 mod 8 exch sub {
- 2 index 8#40 write
- } repeat
- exch pop false exch
- } if
- %%case '\n':
- dup 8#12 eq {
- currentpoint 0 exch 1 sub moveto pop
- gsave clippath pathbbox pop pop exch pop grestore
- currentpoint exch pop 1 sub ge {
- 2 index 8#14 write
- } if
- exch pop false exch
- } if
- %%case '\f':
- dup 8#14 eq {
- gsave showpage grestore
- 0 0 moveto
- exch pop false exch
- } if
- %%case '\r':
- dup 8#15 eq {
- currentpoint 0 exch moveto pop
- exch pop false exch
- } if
- %%case EOF:
- dup -1 eq {
- currentpoint 0 ne exch 0 ne or {
- 2 index 8#14 write
- } if
- exch pop false exch
- } if
- %%default:
- exch {
- dup
- gsave clippath pathbbox pop 3 1 roll pop pop grestore
- ( ) stringwidth pop currentpoint pop add le {
- 2 index 8#12 write
- } if
- ( ) dup 0 4 -1 roll put show
- } if
- pop % the character
- pop % and file object
- } def
- %
- % All the other file output operators call our redefined write operator.
- %
- /print {
- (%stdout) (w) file exch {1 index exch write} forall
- pop
- } def
- /writestring {
- {1 index exch write} forall
- pop
- } def
- /writehexstring {
- (0123456789ABCDEF) 3 1 roll {
- dup
- 3 index exch -4 bitshift 16#F and get 2 index exch write
- 2 index exch 16#F and get 1 index exch write
- } forall
- pop pop
- } def
- %
- % Unbind and redefine the remaining file output procedures.
- %
- /= dup load Unbind def
- /== dup load Unbind def
- /stack dup load Unbind def
- /pstack dup load Unbind def
|