%% 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
%
% 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