home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume1 / 8708 / pshalf.bug < prev    next >
Encoding:
Text File  |  1987-08-28  |  5.8 KB  |  178 lines

  1. Article 221 of comp.sources.bugs:
  2. Relay-Version: version B 2.10.3 alpha 5/22/85; site osu-eddie.UUCP
  3. Path: osu-eddie!cbosgd!ihnp4!ptsfa!ames!aurora!labrea!rutgers!seismo!mcvax!ukc!its63b!hwcs!chris
  4. From: chris@cs.hw.ac.uk (Chris Miller)
  5. Newsgroups: comp.sources.bugs
  6. Subject: Re: pshalf - print PostScript pages two to a page
  7. Message-ID: <1443@brahma.cs.hw.ac.uk>
  8. Date: 26 Aug 87 09:31:18 GMT
  9. Date-Received: 27 Aug 87 17:08:57 GMT
  10. References: <4226@ncoast.UUCP>
  11. Reply-To: chris@cs.hw.ac.uk (Chris Miller)
  12. Organization: Computer Science, Heriot-Watt U., Scotland
  13. Lines: 161
  14.  
  15.  
  16. Thanks to Denise Draper for posting this useful program.  We had a few
  17. problems making it work with the tpscript ditroff->postscript converter
  18. posted to the net a while back; unfortunately, we don't have the
  19. original tpscript sources, having hacked at it extensively ourselves, but
  20. I indicate the necessary changes below.
  21.  
  22. Our version of "awk" (4.2 bsd) couldn't handle the script correctly
  23. (probably a tokeniser bug, but I couldn't be bothered to chase it);
  24. parenthesising the "++outpages" as shown below fixes the problem and
  25. won't break anyone else's awk (I sincerely hope!).
  26.  
  27. Also, the rotation+translate+scale operation given in Denise's pshalf.ps
  28. is wrong - having translated the page corner to the correct place, she then
  29. moves it by the following scale operation!  After trying to work out the
  30. correct sequence of operations for a while, I gave up and just worked out
  31. the PostScript matrix for the linear transformation.
  32.  
  33. Finally, a "save" is needed at the end of the pshalf prolog, otherwise the
  34. first restore following will lose the contents of the HfDict dictionary,
  35. undoing all the good work.  This leaves an extra save object on the stack,
  36. and hence chews up some memory, but I don't feel like writing the code
  37. to do a pop if and only if the stack is non-empty and has a save object
  38. at the top.
  39.  
  40. Changes to pshalf distribution (context diff format):
  41. ----
  42. diff -rc ./pshalf.proto /usr/src/local/pshalf/pshalf.proto
  43. *** ./pshalf.proto    Wed Aug 26 10:14:31 1987
  44. --- /usr/src/local/pshalf/pshalf.proto    Tue Aug 25 14:20:23 1987
  45. ***************
  46. *** 21,27
  47.   /^%%Page:/        { if( firsthalf ) {
  48.                   if( outpages != 0 )
  49.                       print "HfDict begin ep end"
  50. !                 print "%%Page: ? " ++outpages
  51.                   print "HfDict begin bp end"
  52.                 } else {
  53.                   print "HfDict begin hp end"
  54.  
  55. --- 21,27 -----
  56.   /^%%Page:/        { if( firsthalf ) {
  57.                   if( outpages != 0 )
  58.                       print "HfDict begin ep end"
  59. !                 print "%%Page: ? " (++outpages)
  60.                   print "HfDict begin bp end"
  61.                 } else {
  62.                   print "HfDict begin hp end"
  63. diff -rc ./pshalf.ps /usr/src/local/pshalf/pshalf.ps
  64. *** ./pshalf.ps    Wed Aug 26 10:14:41 1987
  65. --- /usr/src/local/pshalf/pshalf.ps    Wed Aug 26 10:25:09 1987
  66. ***************
  67. *** 57,67
  68.   /Y y2 y1 sub def
  69.                       % Now modify D to create OD
  70.   90 rotate                 % (draw pictures to understand)
  71. !     % I think this is the correct translate, but it doesn't work right
  72. ! % y1 x1 sub x2 y1 add neg translate    % (y1-x1), -(x2+y1)
  73. !     % this one works
  74. ! y1 x1 sub   x2 neg translate
  75. ! X Y div     Y X 2 mul div scale        % X/Y, (Y/2)/X  -- maybe should be square?
  76.   matrix currentmatrix /O1D exch def     % matrix for 1st halfpage
  77.   
  78.   X 0 translate                 % (move over by (already scaled) page width)
  79.  
  80. --- 57,73 -----
  81.   /Y y2 y1 sub def
  82.                       % Now modify D to create OD
  83.   90 rotate                 % (draw pictures to understand)
  84. ! % Need to translate the page and scale it; the naive translation gets
  85. ! % messed up by a subsequent scaling, so after hacking around with
  86. ! % diagrams and linear equations, we derive the transformation:
  87. ! %    x' = (Y/2X)*x +     0*y + (y1 - x1*(Y/2X))
  88. ! %    y' =      0*x + (X/Y)*y + (-x2 - y1*(X/Y))
  89. ! /XY X Y div def
  90. ! /Y2X Y X 2 mul div def
  91. ! /Tx y1 x1 Y2X mul sub def
  92. ! /Ty x2 y1 XY mul add neg def 
  93. ! [ Y2X 0 0 XY Tx Ty ] concat
  94.   matrix currentmatrix /O1D exch def     % matrix for 1st halfpage
  95.   
  96.   X 0 translate                 % (move over by (already scaled) page width)
  97. ***************
  98. *** 84,90
  99.   /hp {                     % HalfPage: go to 2nd halfpage
  100.     grestore gsave            %
  101.     O2D setmatrix nclip             %
  102. !   T concat } def            %
  103.   
  104.   /ep {                     % EndPage: print the real, composite page
  105.     showpage grestore             %
  106.  
  107. --- 90,97 -----
  108.   /hp {                     % HalfPage: go to 2nd halfpage
  109.     grestore gsave            %
  110.     O2D setmatrix nclip             %
  111. !   T concat
  112. ! } def                    %
  113.   
  114.   /ep {                     % EndPage: print the real, composite page
  115.     showpage grestore             %
  116. ***************
  117. *** 97,99
  118.   end                    % HfDict
  119.   /showpage /newpath load def
  120.   
  121.  
  122. --- 104,107 -----
  123.   end                    % HfDict
  124.   /showpage /newpath load def
  125.   
  126. + save
  127.  
  128. ---
  129.  
  130. Changes to tpscript (src/tpscript subdirectory of net distribution) --
  131. sorry, no originals available for context diff, but there are only two
  132. places to change:
  133.  
  134. pcom.c:
  135. Change declarations of "page" and "home" postscript routines in array
  136. pcom1tab near line 90 to:
  137. ----
  138.     "/page { showpage } def",
  139.     /* routine to initialise a path */
  140.     "/home { restore save newpath 0 pgtop moveto } def",
  141. ----
  142. This ensures that (i) "showpage" is used to display pages, not "copypage"
  143. (pshalf assumes this, and the PostScript manual deprecates use of
  144. "copypage") and (ii) the end-of-page and start-of-page processing are
  145. properly separated so that each page is a separate, stand-alone, entity.
  146.  
  147. tpscript.c:
  148. Routine page(), at or near line 950, should read
  149. ----
  150.  
  151. page(n)
  152. register int    n;
  153. {
  154.     hpos = 0; vpos = 0;
  155.     /* for each page except the first, print the previous one */
  156.     if(!firstpage)
  157.         fprintf(postr, "\npage");
  158.     if(n >= 0)        /* beginning of a new page */
  159.         fprintf(postr, "\n%%%%Page: %d %d\nhome\n", n, ++npages);
  160.     if (firstpage)
  161.         firstpage = FALSE;
  162.     else
  163.     {
  164.         setfont(TRUE);
  165.         resetspcl();        /* it forgets definitions on next page */
  166.     }
  167. }
  168. ----
  169. Again, this ensures that the %%Page: comment correctly separates the document
  170. into stand-alone pages.
  171. -- 
  172.     Chris Miller, Heriot-Watt University, Edinburgh
  173.     chris@cs.hw.ac.uk    <EUROPE>!ukc!hwcs!chris   chris@hwcs.uucp
  174.     chris@uk.ac.hw.cs
  175.  
  176.  
  177.