stuart@ADS.COM (Stuart Crawford) (09/16/89)
I have everything in GoodNeWS1.2 working just fine except that when I print the PostScript code generated by the GoodNeWS dvi2ps program, the LaserWriter seems to ignore the vertical and horizontal offsets and scales indicated in the LaTeX \special command. Of course, the printed documents end up looking awful. The printer is a LaserWriter II NTX. Suggestions are greatly appreciated. Thanks, Stuart Crawford stuart@ads.com (415) 960-7545
scp@SFI.SANTAFE.EDU ("Stephen C. Pope") (09/20/89)
on Sat, 16 Sep 89 02:56:27 -0400, stuart@ads.com (Stuart Crawford) said: Stuart> I have everything in GoodNeWS1.2 working just fine except that when I print the Stuart> PostScript code generated by the GoodNeWS dvi2ps program, the LaserWriter seems Stuart> to ignore the vertical and horizontal offsets and scales indicated in the LaTeX Stuart> \special command. Of course, the printed documents end up looking awful. The Stuart> printer is a LaserWriter II NTX. Suggestions are greatly appreciated. Thanks, The tex.ps file supplied with GoodNeWS1.2, which appears to come directly from commontex (though I'm no historian on this matters) has several problems that manifest themselves when dvi2ps code is being output to a LaserWriter that's had LaserPrep downloaded to it (as happens if you've an AppleTalk-based printer using papif, etc). This is due to name collisions between the tex.ps namespace and the LaserPrep namespace, and some apparently incorrect assumptions about what LaserPrep would do for you (I'm also not very versed in LaserPrep; I simply note that the code didn't work, and a few changes causing LaserPred to be ignored fixed it). In any case, below is tex.ps with a few changes made, which now produces dvi2ps output that prints *exactly* as dvinews displays a document which includes output from the GoodNeWS drawing tool via the \special command. Stephen Pope Santa Fe Insitute scp@sfi.santafe.edu tex.ps ======================================================== %! for use by dvi2ps Version 2.00 % a start (Ha!) at a TeX mode for PostScript. % The following defines procedures assumed and used by program "dvi2ps" % and must be downloaded or sent as a header file for all TeX jobs. % By: Neal Holtz, Carleton University, Ottawa, Canada % <holtz@cascade.carleton.cdn> % <holtz%cascade.carleton.cdn@ubc.csnet> % June, 1985 % Last Modified: Aug 25/85 % oystr 12-Feb-1986 % Changed @dc macro to check for a badly formed bits in character % definitions. Can get a <> bit map if a character is not actually % in the font file. This is absolutely guaranteed to drive the % printer nuts - it will appear that you can no longer define a % new font, although the built-ins will still be there. % To convert this file into a downloaded file instead of a header % file, uncomment all of the lines beginning with %-% %-%0000000 % Server loop exit password %-%serverdict begin exitserver %-% systemdict /statusdict known %-% {statusdict begin 9 0 3 setsccinteractive /waittimeout 300 def end} %-% if /TeXDict 200 dict def % define a working dictionary TeXDict begin % start using it. % units are in "dots" (300/inch) /Resolution 300 def /Inch {Resolution mul} def % converts inches to internal units /Mtrx 6 array def %%%%%%%%%%%%%%%%%%%%% Page setup (user) options %%%%%%%%%%%%%%%%%%%%%%%% % dvi2ps will output coordinates in the TeX system ([0,0] 1" down and in % from top left, with y +ive downward). The default PostScript system % is [0,0] at bottom left, y +ive up. The Many Matrix Machinations in % the following code are an attempt to reconcile that. The intent is to % specify the scaling as 1 and have only translations in the matrix to % properly position the text. Caution: the default device matrices are % *not* the same in all PostScript devices; that should not matter in most % of the code below (except for lanscape mode -- in that, rotations of % -90 degrees resulted in the the rotation matrix [ e 1 ] % [ 1 e ] % where the "e"s were almost exactly but not quite unlike zeros. /@letter { letter initmatrix 72 Resolution div dup neg scale % set scaling to 1. 310 -3005 translate % move origin to top (these are not exactly 1" Mtrx currentmatrix pop % and -10" because margins aren't set exactly right) } def % note mode is like letter, except it uses less VM /@note { note initmatrix 72 Resolution div dup neg scale % set scaling to 1. 310 -3005 translate % move origin to top Mtrx currentmatrix pop } def /@landscape { letter initmatrix 72 Resolution div dup neg scale % set scaling to 1. % -90 rotate % it would be nice to be able to do this Mtrx currentmatrix 0 0.0 put % but instead we have to do things like this because what Mtrx 1 -1.0 put % should be zero terms aren't (and text comes out wobbly) Mtrx 2 1.0 put % Fie! This likely will not work on QMS printers Mtrx 3 0.0 put % (nor on others where the device matrix is not like Mtrx setmatrix % like it is on the LaserWriter). 300 310 translate % move origin to top Mtrx currentmatrix pop } def /@legal { legal initmatrix 72 Resolution div dup neg scale % set scaling to 1. 295 -3880 translate % move origin to top Mtrx currentmatrix pop } def /@manualfeed { statusdict /manualfeed true put } def % n @copies - set number of copies /@copies { /#copies exch def } def %%%%%%%%%%%%%%%%%%%% Procedure Defintions %%%%%%%%%%%%%%%%%%%%%%%%%% /@newfont % id @newfont - -- initialize a new font dictionary { /newname exch def pop newname 7 dict def % allocate new font dictionary newname load begin /FontType 3 def /FontMatrix [1 0 0 -1 0 0] def /FontBBox [0 0 1 1] def /BitMaps 128 array def /BuildChar {CharBuilder} def /Encoding 128 array def 0 1 127 {Encoding exch /.undef put} for end newname newname load definefont pop } def % the following is the only character builder we need. it looks up the % char data in the BitMaps array, and paints the character if possible. % char data -- a bitmap descriptor -- is an array of length 6, of % which the various slots are: /ch-image {ch-data 0 get} def % the hex string image /ch-width {ch-data 1 get} def % the number of pixels across /ch-height {ch-data 2 get} def % the number of pixels tall /ch-xoff {ch-data 3 get} def % number of pixels below origin /ch-yoff {ch-data 4 get} def % number of pixels to left of origin /ch-tfmw {ch-data 5 get} def % spacing to next character /CharBuilder % fontdict ch Charbuilder - -- image one character { /ch-code exch def % save the char code /font-dict exch def % and the font dict. /ch-data font-dict /BitMaps get ch-code get def % get the bitmap descriptor for char ch-data null eq not { ch-tfmw 0 ch-xoff neg ch-yoff neg ch-width ch-xoff sub ch-height ch-yoff sub setcachedevice ch-width ch-height true [1 0 0 1 ch-xoff ch-yoff] {ch-image} imagemask } if } def /@sf % fontdict @sf - -- make that the current font { setfont() pop } def % in the following, the font-cacheing mechanism requires that % a name unique in the particular font be generated /@dc % char-data ch @dc - -- define a new character bitmap in current font { /ch-code exch def % ++oystr 12-Feb-86++ dup 0 get length 2 lt { pop [ <00> 1 1 0 0 8.00 ] } % replace <> with null if % --oystr 12-Feb-86-- /ch-data exch def currentfont /BitMaps get ch-code ch-data put currentfont /Encoding get ch-code dup ( ) cvs cvn % generate a unique name simply from the character code put } def /@bop0 % n @bop0 - -- begin the char def section of a new page { } def /@bop1 % n @bop1 - -- begin a brand new page { pop erasepage initgraphics Mtrx setmatrix /SaveImage save def() pop } def /@eop % - @eop - -- end a page { showpage SaveImage restore() pop } def /@start % - @start - -- start everything { @letter % (there is not much to do) } def /@end % - @end - -- done the whole shebang { end } def /p % x y p - -- move to position { moveto } def /r % x r - -- move right { 0 rmoveto } def /s % string s - -- show the string { show } def /c % ch c - -- show the character (code given) { c-string exch 0 exch put c-string show } def /c-string ( ) def /ru % dx dy ru - -- set a rule (rectangle) { /dy exch neg def % because dy is height up from bottom /dx exch def /x currentpoint /y exch def def % remember current point newpath x y moveto dx 0 rlineto 0 dy rlineto dx neg 0 rlineto closepath fill x y moveto } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% the \special command junk %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % The structure of the PostScript produced by dvi2ps for \special is: % @beginspecial % - any number of @hsize, @hoffset, @hscale, etc., commands % @setspecial % - the users file of PostScript commands % @endspecial % The @beginspecial command recognizes whether the Macintosh Laserprep % has been loaded or not, and redfines some Mac commands if so. % The @setspecial handles the users shifting, scaling, clipping commands % The following are user settable options from the \special command. /@SpecialDefaults { /hs 8.5 Inch def /vs 11 Inch def /hoff 0 def /voff 0 def /hsc 1 def /vsc 1 def /CLIP false def } def % d @hsize - specify a horizontal clipping dimension % these 2 are executed before the MacDraw initializations /@hsize {/hs exch def /CLIP true def} def /@vsize {/vs exch def /CLIP true def} def % d @hoffset - specify a shift for the drwgs /@hoffset {/hoff exch def} def % changed excl to exch --> BUG (arthur van Hoff) /@voffset {/voff exch def} def % s @hscale - set scale factor /@hscale {/hsc exch def} def /@vscale {/vsc exch def} def /@setclipper { hsc vsc scale CLIP { newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip } if } def % this will be invoked as the result of a \special command (for the % inclusion of PostScript graphics). The basic idea is to change all % scaling and graphics back to defaults, but to shift the origin % to the current position on the page. Due to TeXnical difficulties, % we only set the y-origin. The x-origin is set at the left edge of % the page. /@beginspecial % - @beginspecial - -- enter special mode { gsave /SpecialSave save def % the following magic incantation establishes the current point as % the users origin, and reverts back to default scalings, rotations currentpoint transform initgraphics itransform translate @SpecialDefaults % setup default offsets, scales, sizes @MacSetUp % fix up Mac stuff } def /@setspecial % to setup user specified offsets, scales, sizes (for clipping) { MacDrwgs {md begin /pxt hoff def /pyt voff neg def end} {hoff voff translate @setclipper} ifelse } def /@endspecial % - @endspecial - -- leave special mode { SpecialSave restore grestore } def /MacDrwgs false def % will get set if we think the Mac LaserPrep file has been loaded % - @MacSetUp - turn-off/fix-up all the MacDraw stuff that might hurt us % we depend on 'psu' being the first procedure executed % by a Mac document. We redefine 'psu' to adjust page % translations, and to do all other the fixups required. % This stuff will not harm other included PS files /@MacSetUp { userdict /md known % if md is defined { userdict /md get type /dicttype eq % and if it is a dictionary { /MacDrwgs true def md begin % then redefine some stuff /psu % redfine psu to set origins, etc. /psu load % this procedure contains almost all the fixup code { /letter {} def % it is bad manners to execute the real /note {} def % versions of these (clears page image, etc.) /legal {} def statusdict /waittimeout 300 put /page {pop} def % no printing of pages /pyt voff neg def % x & y pixel translations /pxt hoff def } concatprocs def /od % redefine od to set clipping region /od load { @setclipper } concatprocs def end } if } if } def % p1 p2 concatprocs p - concatenate procedures /concatprocs { /p2 exch cvlit def /p1 exch cvlit def /p p1 length p2 length add array def p 0 p1 putinterval p p1 length p2 putinterval p cvx } def end % revert to previous dictionary
stuart@ADS.COM (Stuart Crawford) (09/20/89)
Stephen... Thanks for responding to my query re: tex.ps in GoodNeWS. I already read your 22 Jul 89 posting to mail.news-makers.. "While trying to get output from the GoodNeWS drawing tool to my printer using dvi2ps, I discovered a little problem in the tex.ps file." so the tex.ps file you sent me by email is *identical* to the one I have been using. If I try to print *without* your voff, hoff fixes, I get no printout whatsover (what symptoms did you get?) In any event, I am still having problems, even with your fixes. The printer seems to ignore the offset and scaling instructions. Even if I go in and manually edit the PostScript code generated from dvi2ps, the size and location of the figures imported by \special remain unchanged in the printed output. Any suggestions would be appreciated! -Stuart