home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / printer / deskjet_.lha / A4print4.rexx next >
OS/2 REXX Batch file  |  1992-10-03  |  12KB  |  325 lines

  1. /*
  2. 4print.rexx version 2
  3.  
  4. + Skript modified for papersize DIN A4 (ATN: Alley enlarged - upto 3 additional chars per line !)
  5. + automatic handling of twosided printjobs
  6. + partial translation of umlauts to the deskjet default charset PC8 
  7. + handling of backspaces (double strike typewriter mode :-))
  8.  
  9. Customization:
  10. -> for other paper formats, adjust localpagesize, psize,
  11.    change the settings for the various layout styles (width, oddleftborder)
  12.    and set the command sequence isoA4='' for default (should be US Letter)
  13.  
  14. Peter Jakobi, Munich, Oct. 2, 1992
  15. jakobi@informatik.tu-muenchen.de
  16. lazarus@salyko.doit.cubenet.org
  17.  
  18.  
  19. let me first quote from Georg Hessmann's MakeBatch.rexx (from MetaFont): */
  20. IF ~show('Libraries', 'rexxsupport.library') THEN DO
  21.         IF ~addlib('rexxsupport.library', 0, -30) THEN DO
  22.                 say "No RexxSupport ... no printing"
  23.                 EXIT 10
  24.         END
  25. END
  26. /*
  27. Original Posting:
  28.  
  29. Path: informatik.tu-muenchen.de!math.fu-berlin.de!Sirius.dfn.de!chx400!ira.uka.de!yale.edu!jvnc.net!darwin.sura.net!haven.umd.edu!uunet!olivea!tardis!jms
  30. From: jms@tardis.Tymnet.COM (Joe Smith)
  31. Newsgroups: alt.sources.amiga
  32. Subject: Program to print 4 pages on 1 piece of paper
  33. Summary: For HP DeskJet printer, written in AREXX
  34. Message-ID: <3111@tardis.Tymnet.COM>
  35. Date: 2 Sep 92 07:55:40 GMT
  36. Organization: BT Tymnet, San Jose, CA
  37. Lines: 140
  38. */
  39. /* Prints 4 pages of text on a single sheet of paper on a DeskJet 500 printer */
  40. /* Usage: print4 filename [width]                      */
  41. /*  where 'width' is optional, one of 89 (default), 60, 40 */
  42.  
  43. /* SOME REQUIREMENTS: SETUP MUST BE 'NO BORDERS', 'CHARSET PC8' */
  44.  
  45. parse upper arg option options 
  46.  
  47. if option='?' then do
  48.   say ''
  49.   say '4Print.rexx [<option>*] filename'
  50.   say 'where option is one of:'
  51.   say '   -2           Two sided printjob'
  52.   say '                (no manual sorting required)'
  53.   say '   -w<number>   line width of minipage'
  54.   say '   -D           quick draft mode instead of letter quality'
  55.   say ''
  56.   say 'On one sheet of paper4Print can print e.g.:'
  57.   say '   +  8 pages à 89 chars / 66 lines'
  58.   say '   + 16 pages à 41 chars / 66 lines'
  59.   say ''
  60.   say 'HP DESKJET ONLY!'
  61.   exit 1
  62. end
  63.  
  64. twopage=0                    /* Print on both sides ? off */
  65. basename = 't:4print~.'
  66. paper    = 0                    /* Outputfile and page */
  67.  
  68. /*          ' ä ü ö ß Ä Ü Ö £ ± § ­ ÷'  */
  69. inputtable ='E4FCF6DFC4DCD6A3B1A7ADF7'x        /* Ecma94latin1 - german subset */    
  70. outputtable='848194E18E9A999CF115C4F6'x        /* Hp pc8 - _THE_DEFAULT_ for all fonts */    
  71.  
  72. HT = d2c(09); LF = d2c(10); FF = d2c(12); CR = d2c(13); ESC = d2c(27)
  73.  
  74. /* localpagesize, *borders: changed for DIN A4: */
  75. /* US should be 60, 0, 0 */
  76.  
  77. localpagesize    = 66                /* Default pagesize of the minipages */
  78. evenleftborder   = 0
  79.  
  80. draft=ESC'&k0W'ESC'*r2Q'            /* (default) uni direktional, LetterQuality */    
  81. cheap=ESC'&k1W'ESC'*r1Q'            /* bidirektional, 'draft' - might sometimes
  82.                                                    even be slower than uni ! */    
  83.  
  84. isoA4=ESC'&l26A'                /* A4 */
  85. psize=66*2+3+2+2
  86. psize=ESC'&l'psize'P'
  87.  
  88. do while left(option,1)='-'            /* Option parsing */
  89.   select
  90.     when option='-2' then twopage=1
  91.     when option='-D' then draft=cheap        /* quick and dirty printout */
  92.     when left(option,2)='-W'             /* Set width of minipage */
  93.       then do
  94.         width=substr(option,3)            /* Request twosided print */
  95.         if datatype(width)~='NUM' 
  96.           then do
  97.             say 'WARNING: Illegal width 'width
  98.             width=''
  99.             end
  100.         end
  101.     otherwise leave
  102.     end
  103.   parse var options option options
  104.   end
  105.  
  106. infile = option                    /* input file name */
  107.  
  108. if width = '' then width = 1000            /* For numeric comparisons below */
  109. if open('in',infile,'R') 
  110.   then if twopage then call open('out',basename||paper,'W')
  111.                   else call open('out','par:4.tmp','W')
  112.   else do; say "Can't open input file" infile; exit 10; end
  113. say 'infile='infile 'width='width
  114.  
  115. select
  116. /* 8'' PRINTABLE AREA + 1/8'' PER BORDER (HW!) -> 8.5'' DIN A4 WIDTH */ 
  117. /* 24 CPI -> 192 CHARS (182 and 10.2 border) */
  118. /* 20 CPI -> 160 CHARS (         8.4 border) */
  119. /* Separators = º (double pipe) ù (a small circle) */
  120.  
  121. /* For US Letter, you should remove .5 inch from the width, and
  122.    ca. 3/4 inch from the height (6 lines per minipage) */
  123.  
  124.   when width <= 44 then do    /* 24cpi 44+2+44+2+44+2+44 = 176 + 6 */
  125.     title = 'Letter Gothic, 4 columns of 41 chars, 6 char alley.'
  126.     font  = ESC'(s0p24h6v0s6T'
  127.     sep   = 'º '        
  128.     cross = 'ù-'
  129.     width = 44; columns = 4
  130. oddleftborder    = 10                /* Default oddside left margin */        
  131.     end
  132.   when width <= 60 then do    /* 24cpi 60+2+60+2+60 = 184 */
  133.     title = 'Letter Gothic, 3 columns of 60 chars, 3 char alley.'
  134.     font  = ESC'(s0p24h6v0s6T'
  135.     sep   = 'º '        
  136.     cross = 'ù-'
  137.     width = 60; columns = 3
  138. oddleftborder    = 8                /* Default oddside left margin */        
  139.     end
  140.   when width <= 79 then do    /* 20cpi 79+2+79 = 160 */
  141.     title = 'Courier, 2 columns of 79 chars, 2 char alley.'
  142.     font  = ESC'(s0p20h6v0s3T'
  143.     sep   = 'º '        
  144.     cross = 'ù-'
  145.     width = 79; columns = 2
  146. oddleftborder    = 0                /* Default oddside left margin */        
  147.     end
  148.   when width = 80 then do    /* 20cpi 80+0+80 = 160 */
  149.     title = 'Courier, 2 columns of 80 chars, 0 char space! ----> VIEL ZU ENG !!!'
  150.     font  = ESC'(s0p20h6v0s3T'
  151.     sep   = ''
  152.     cross = ''
  153.     width = 80; columns = 2
  154. oddleftborder    = 0                /* Default oddside left margin - out of space ... */        
  155.     end
  156.   otherwise do            /* 24cpi 89+4+89 = 182 */
  157.     title = 'Letter Gothic, 2 columns of 89 chars, 3 char alley.'
  158.     font  = ESC'(s0p24h6v0s6T'
  159.     sep   = ' º  '        
  160.     cross = '-ù--'
  161.     width = 89; columns = 2
  162. oddleftborder    = 10                /* Default oddside left margin */        
  163.     end
  164.   end
  165. say title                    /* Let user know what has been selected */
  166.  
  167. sep1 = ''; sep2 = ''                /* Build the horizontal dividing line */
  168. do column = 1 to columns-1
  169.   sep1 = sep1 || copies(' ',width) || sep
  170.   sep2 = sep2 || copies('-',width) || cross    /* Dashes and plus signs */
  171.   end
  172. sep2 = sep2 || copies('-',width)'XYZABCDEF'
  173.  
  174. call writech('out',isoA4||ESC'&k2G'ESC'&s1C'ESC'&k6W'draft)    /* LF=CR+LF, no linewrap, textscale mode, draft ? */
  175. call writech('out',ESC'&l12d126p0L'font||ESC'&l0F'psize)    /* 12 LPI, no perforation skip, bottom 1 inch */
  176. if twopage then call close('out')
  177.  
  178. /* Process the single input file */
  179.  
  180. leftborder = copies(' ',oddleftborder)
  181. prevline = ''
  182. do until eof('in')
  183.   paper = paper + 1                /* the sheet of paper to print */
  184.   if twopage then do
  185.     if paper//2 then leftborder = copies(' ',oddleftborder)
  186.     else leftborder = copies(' ',evenleftborder)
  187.     call open('out',basename||paper,'W')
  188.     end
  189.   LINES. = copies(' ',width)        /* Fill array with blanks */
  190.   title = infile', page' paper', printed' date('weekday')',' ,
  191.     date('normal') time('normal')
  192.   say title                /* Show progress on the console */
  193.   do page = 0 to (columns*2)-1        /* Top row, bottom row, N columns */
  194.     do pageline = 1 to localpagesize
  195.       line = (page*localpagesize)+pageline
  196.       if length(prevline) > 0
  197.         then temp = prevline        /* If previous char was a formfeed */
  198.     else temp = translate(readln('in'),outputtable,inputtable)    /* Else read line from input file */
  199.       prevline = ''
  200.       i = index(temp,FF)        /* Look for formfeeds */
  201.       select
  202.     when i = 0 then nop        /* Nothing special if no formfeed */
  203.     when i = 1 & pageline = 1 then ,
  204.       temp = substr(temp,2)        /* Ignore FF if at top of page */
  205.     when i = 1 & length(temp) = 1 then ,
  206.       leave pageline        /* FF+LF = end of current page */
  207.     when i = 1 then do        /* FF+TEXT+LF */
  208.       prevline = substr(temp,2)    /* The TEXT goes on next page */
  209.       leave pageline        /* Finished with current page */
  210.       end
  211.     otherwise do            /* TEXT+FF+LF or TEXT+FF+TEXT+LF */
  212.       prevline = substr(temp,i)    /* Remember FF and possible text */
  213.       temp = left(temp,i-1)        /* Process text that's before the FF */
  214.       end
  215.     end
  216.       i = index(temp,HT)        /* Look for tabs */
  217.       do while i > 0
  218.         blanks = 8 - ( (i-1) // 8)    /* Replace tab with this many blanks */
  219.         if i = 1 then              temp = copies(' ',blanks)||substr(temp,i+1)
  220.       else temp = substr(temp,1,i-1)||copies(' ',blanks)||substr(temp,i+1)
  221.         i = index(temp,HT)        /* Check multiple tabs on a line */
  222.         end
  223.       temp=strip(temp,'T')        /* Remove trailing blanks */        
  224.  
  225.       bswidth=0                /* add 2 chars for each backspace */
  226.       bsindex=0
  227.       do forever
  228.         bsindex=index(temp,'08'x,bsindex+1)
  229.         if bsindex=0 then leave        /* Done */
  230.         if bsindex>width+bswidth then leave    /* BS not in current line */
  231.         bswidth=bswidth+2
  232.       end
  233.  
  234.       LINES.line = left(temp,width+bswidth,' ')    /* Truncate, or pad with blanks */
  235.       if substr(temp,width+1+bswidth)=='' then prevline=''
  236.       else prevline='-->> 'substr(temp,width+1+bswidth)    /* The rest of the processed line or empty */
  237.       end
  238.     end
  239.  
  240.   /* Now that a paperful of data has been read, print it out. */
  241.  
  242.   call writeln('out',leftborder||center(title,width*columns+(columns-1)*length(sep)))
  243.   call writeln('out','')
  244.   do row = 0 to 1            /* Top half of page, then bottom half */
  245.     do pageline = 1 to localpagesize
  246.       temp = ''
  247.       do column = 1 to columns
  248.         line = (row*localpagesize*columns) + (column-1)*localpagesize + pageline
  249.         temp = temp||LINES.line
  250.     if column < columns then temp = temp||sep
  251.     end
  252.       if pageline = localpagesize & row = 1
  253.       then call writech('out',leftborder||temp||CR||FF)    /* Formfeed at end of page */
  254.       else call writech('out',leftborder||temp||LF)    /* Linefeed for all others */
  255.       end    /* next pageline */
  256.     if row = 0 then call writech('out',leftborder||sep1||LF||leftborder||sep2||LF||leftborder||sep1||LF) /* Dashes */
  257.     end        /* next row (now do bottom half of page) */
  258.   if twopage then call close('out')
  259.   end        /* until EOF */
  260.  
  261. call close('in')
  262.  
  263. if twopage then do
  264.                         /* Now copy the pages to the printer */
  265.   numerror=0
  266.   evenskip=paper//2
  267.   call open('out','par:4.prt','W')
  268.   call copyfile(0)                /* Copy the printer prologue */
  269.  
  270.                         /* print p1 p3 p5 (reinsert) FF p4 p2 */
  271.   do i = 1 to paper by 2            /* Print odd pages first */
  272.     call copyfile(i)
  273.     end    
  274.  
  275.   if paper=1 then signal done1page        /* No need to print the next line :-) */
  276.  
  277.   say 'Please reinsert the output - page 1 on bottom blank side down'
  278.   pull temp
  279.  
  280.   if evenskip then call writech('out',FF)    /* Skip the empty last evenside page ? */
  281.   do i = paper-evenskip to 2 by -2        /* Print the even pages reversed */
  282.     call copyfile(i)
  283.     end    
  284. done1page:
  285.   if numerror=0 then do i=0 to paper        /* If there were no errors - erase temp files */
  286.     call delete(basename||page)
  287.     end
  288.   else say 'There were errors: the pages are 'basename'<count> [0 is the printer init]'
  289.   end
  290.  
  291. call close('out')                /* One-sided: we already printed, so skip the above */ 
  292.  
  293. 'initprinter'                    /* Reinitialize the printer */
  294. exit 0
  295.  
  296.  
  297. /********************************************/  /* Subroutines */
  298.  
  299. copyfile: procedure expose basename numerror    /* Print a page */
  300.   arg page
  301.   if ~open('in',basename||page,'R') 
  302.     then do 
  303.       call writech('out',FF)            /* Skip the page */
  304.       say 'ERROR: Could not print page 'i' - skipping'
  305.       numerror = 1    
  306.       end
  307.     else do
  308.       do forever                /* Copy the page */
  309.         temp=readch('in',20000)
  310.         call writech('out',temp)
  311.         if temp=='' then leave
  312.         end
  313.       call close('in')
  314.       end
  315. return
  316.  
  317. /* End of s:print4 */
  318. /*
  319. -- 
  320. Joe Smith (408)922-6220     BTNA GNS Major Programs, TYMNET Global Network
  321. <jms@tardis.tymnet.com>     P.O. Box 49019, MS-C51, San Jose, CA 95161-9019
  322. CA license plate: "POPJ P,"    Married to the LB, Quantum Leap's #1 net.fan
  323. PDP-10, 36-bits forever!    Humorous disclaimer: "My Amiga 3000 speaks for me."
  324. */
  325.