comparison lisp/ps-print.el @ 33143:94d9ccbb780e

Extension for even/odd printing. Doc Fix. (ps-print-version): New version number (6.3.1). (ps-even-or-odd-pages): Customization fix. (ps-print-page-p, ps-begin-file, ps-begin-job, ps-page-number) (ps-header-sheet, ps-header-page, ps-end-job): Code fix. (ps-page-count): Var replaced by `ps-page-column'. (ps-page-column, ps-page-sheet, ps-page-printed): New vars. (ps-print-sheet-p): New fun.
author Gerd Moellmann <gerd@gnu.org>
date Thu, 02 Nov 2000 12:04:28 +0000
parents a48e4118492d
children 75b72848ba05
comparison
equal deleted inserted replaced
33142:c0c930204045 33143:94d9ccbb780e
7 ;; Author: Vinicius Jose Latorre <vinicius@cpqd.com.br> 7 ;; Author: Vinicius Jose Latorre <vinicius@cpqd.com.br>
8 ;; Author: Kenichi Handa <handa@etl.go.jp> (multi-byte characters) 8 ;; Author: Kenichi Handa <handa@etl.go.jp> (multi-byte characters)
9 ;; Maintainer: Kenichi Handa <handa@etl.go.jp> (multi-byte characters) 9 ;; Maintainer: Kenichi Handa <handa@etl.go.jp> (multi-byte characters)
10 ;; Maintainer: Vinicius Jose Latorre <vinicius@cpqd.com.br> 10 ;; Maintainer: Vinicius Jose Latorre <vinicius@cpqd.com.br>
11 ;; Keywords: wp, print, PostScript 11 ;; Keywords: wp, print, PostScript
12 ;; Time-stamp: <2000/10/28 23:38:44 Vinicius> 12 ;; Time-stamp: <2000/11/01 14:39:00 vinicius>
13 ;; Version: 6.3 13 ;; Version: 6.3.1
14 ;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/ 14 ;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/
15 15
16 (defconst ps-print-version "6.3" 16 (defconst ps-print-version "6.3.1"
17 "ps-print.el, v 6.3 <2000/10/28 vinicius> 17 "ps-print.el, v 6.3.1 <2000/10/30 vinicius>
18 18
19 Vinicius's last change version -- this file may have been edited as part of 19 Vinicius's last change version -- this file may have been edited as part of
20 Emacs without changes to the version number. When reporting bugs, please also 20 Emacs without changes to the version number. When reporting bugs, please also
21 report the version of Emacs, if any, that ps-print was distributed with. 21 report the version of Emacs, if any, that ps-print was distributed with.
22 22
273 ;; 273 ;;
274 ;; Valid values are: 274 ;; Valid values are:
275 ;; 275 ;;
276 ;; nil print all pages. 276 ;; nil print all pages.
277 ;; 277 ;;
278 ;; even print only even pages. 278 ;; even-page print only even pages.
279 ;; 279 ;;
280 ;; odd print only odd pages. 280 ;; odd-page print only odd pages.
281 ;;
282 ;; even-sheet print only even sheets.
283 ;;
284 ;; odd-sheet print only odd sheets.
281 ;; 285 ;;
282 ;; Any other value is treated as nil. The default value is nil. 286 ;; Any other value is treated as nil. The default value is nil.
287 ;;
288 ;; See `ps-even-or-odd-pages' for more detailed documentation.
283 ;; 289 ;;
284 ;; 290 ;;
285 ;; Horizontal layout 291 ;; Horizontal layout
286 ;; ----------------- 292 ;; -----------------
287 ;; 293 ;;
1741 1747
1742 Valid values are: 1748 Valid values are:
1743 1749
1744 nil print all pages. 1750 nil print all pages.
1745 1751
1746 `even' print only even pages. 1752 `even-page' print only even pages.
1747 1753
1748 `odd' print only odd pages. 1754 `odd-page' print only odd pages.
1755
1756 `even-sheet' print only even sheets.
1757 That is, if `ps-n-up-printing' is 1, it behaves as `even'; but
1758 for values greater than 1, it'll print only the even sheet of
1759 paper.
1760
1761 `odd-sheet' print only odd sheets.
1762 That is, if `ps-n-up-printing' is 1, it behaves as `odd'; but
1763 for values greater than 1, it'll print only the odd sheet of
1764 paper.
1749 1765
1750 Any other value is treated as nil. 1766 Any other value is treated as nil.
1751 1767
1752 If you set `ps-selected-pages' (see it for documentation), first the pages are 1768 If you set `ps-selected-pages' (see it for documentation), first the pages are
1753 filtered by `ps-selected-pages' and then by `ps-even-or-odd-pages'. For 1769 filtered by `ps-selected-pages' and then by `ps-even-or-odd-pages'. For
1754 example, if we have: 1770 example, if we have:
1755 1771
1756 (setq ps-selected-pages '(1 4 (6 . 10) 12)) 1772 (setq ps-selected-pages '(1 4 (6 . 10) (12 . 16) 20))
1757 1773
1758 We have the following results: 1774 Combining with `ps-even-or-odd-pages' and `ps-n-up-printing', we have:
1759 1775
1776 `ps-n-up-printing' = 1:
1760 `ps-even-or-odd-pages' PAGES PRINTED 1777 `ps-even-or-odd-pages' PAGES PRINTED
1761 nil 1, 4, 6, 7, 8, 9, 10, 12 1778 nil 1, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 20
1762 even 4, 6, 8, 10, 12 1779 even-page 4, 6, 8, 10, 12, 14, 16, 20
1763 odd 1, 7, 9" 1780 odd-page 1, 7, 9, 13, 15
1781 even-sheet 4, 6, 8, 10, 12, 14, 16, 20
1782 odd-sheet 1, 7, 9, 13, 15
1783
1784 `ps-n-up-printing' = 2:
1785 `ps-even-or-odd-pages' PAGES PRINTED
1786 nil 1/4, 6/7, 8/9, 10/12, 13/14, 15/16, 20
1787 even-page 4/6, 8/10, 12/14, 16/20
1788 odd-page 1/7, 9/13, 15
1789 even-sheet 6/7, 10/12, 15/16
1790 odd-sheet 1/4, 8/9, 13/14, 20
1791
1792 So even-page/odd-page are about page parity and even-sheet/odd-sheet are about
1793 sheet parity."
1764 :type '(choice :menu-tag "Print Even/Odd Pages" 1794 :type '(choice :menu-tag "Print Even/Odd Pages"
1765 :tag "Print Even/Odd Pages" 1795 :tag "Print Even/Odd Pages"
1766 (const :tag "All Pages" nil) 1796 (const :tag "All Pages" nil)
1767 (const :tag "Only Even Pages" even) 1797 (const :tag "Only Even Pages" even-page)
1768 (const :tag "Only Odd Pages" odd)) 1798 (const :tag "Only Odd Pages" odd-page)
1799 (const :tag "Only Even Sheets" even-sheet)
1800 (const :tag "Only Odd Sheets" odd-sheet))
1769 :group 'ps-print-page) 1801 :group 'ps-print-page)
1770 1802
1771 (defcustom ps-print-control-characters 'control-8-bit 1803 (defcustom ps-print-control-characters 'control-8-bit
1772 "*Specify the printable form for control and 8-bit characters. 1804 "*Specify the printable form for control and 8-bit characters.
1773 That is, instead of sending, for example, a ^D (\\004) to printer, 1805 That is, instead of sending, for example, a ^D (\\004) to printer,
3078 (defvar ps-spool-buffer nil) 3110 (defvar ps-spool-buffer nil)
3079 3111
3080 (defvar ps-output-head nil) 3112 (defvar ps-output-head nil)
3081 (defvar ps-output-tail nil) 3113 (defvar ps-output-tail nil)
3082 3114
3083 (defvar ps-page-postscript 0) 3115 (defvar ps-page-postscript 0) ; page number
3084 (defvar ps-page-order 0) 3116 (defvar ps-page-order 0) ; PostScript page counter
3085 (defvar ps-page-count 0) 3117 (defvar ps-page-sheet 0) ; sheet counter
3086 (defvar ps-page-n-up 0) 3118 (defvar ps-page-column 0) ; column counter
3119 (defvar ps-page-printed 0) ; total pages printed
3120 (defvar ps-page-n-up 0) ; n-up counter
3087 (defvar ps-showline-count 1) 3121 (defvar ps-showline-count 1)
3088 (defvar ps-first-page nil) 3122 (defvar ps-first-page nil)
3089 (defvar ps-last-page nil) 3123 (defvar ps-last-page nil)
3090 (defvar ps-print-page-p t) 3124 (defvar ps-print-page-p t)
3091 3125
3731 (ps-selected-pages) 3765 (ps-selected-pages)
3732 (and (<= ps-first-page ps-page-postscript) 3766 (and (<= ps-first-page ps-page-postscript)
3733 (<= ps-page-postscript ps-last-page))) 3767 (<= ps-page-postscript ps-last-page)))
3734 (t 3768 (t
3735 nil)) 3769 nil))
3736 (cond ((eq ps-even-or-odd-pages 'even) 3770 (cond ((eq ps-even-or-odd-pages 'even-page)
3737 (= (logand ps-page-postscript 1) 0)) 3771 (= (logand ps-page-postscript 1) 0))
3738 ((eq ps-even-or-odd-pages 'odd) 3772 ((eq ps-even-or-odd-pages 'odd-page)
3739 (= (logand ps-page-postscript 1) 1)) 3773 (= (logand ps-page-postscript 1) 1))
3740 (t) 3774 (t)
3741 )))) 3775 ))))
3776
3777
3778 (defun ps-print-sheet-p ()
3779 (setq ps-print-page-p
3780 (cond ((eq ps-even-or-odd-pages 'even-sheet)
3781 (= (logand ps-page-sheet 1) 0))
3782 ((eq ps-even-or-odd-pages 'odd-sheet)
3783 (= (logand ps-page-sheet 1) 1))
3784 (t)
3785 )))
3742 3786
3743 3787
3744 (defun ps-output (&rest args) 3788 (defun ps-output (&rest args)
3745 (when ps-print-page-p 3789 (when ps-print-page-p
3746 (setcdr ps-output-tail args) 3790 (setcdr ps-output-tail args)
4418 4462
4419 (defun ps-begin-file () 4463 (defun ps-begin-file ()
4420 (ps-get-page-dimensions) 4464 (ps-get-page-dimensions)
4421 (setq ps-page-postscript 0 4465 (setq ps-page-postscript 0
4422 ps-page-order 0 4466 ps-page-order 0
4467 ps-page-sheet 0
4423 ps-page-n-up 0 4468 ps-page-n-up 0
4469 ps-page-printed 0
4424 ps-print-page-p t 4470 ps-print-page-p t
4425 ps-background-text-count 0 4471 ps-background-text-count 0
4426 ps-background-image-count 0 4472 ps-background-image-count 0
4427 ps-background-pages nil 4473 ps-background-pages nil
4428 ps-background-all-pages nil) 4474 ps-background-all-pages nil)
4732 (goto-char (point-max)) 4778 (goto-char (point-max))
4733 (and (re-search-backward "^%%Trailer$" nil t) 4779 (and (re-search-backward "^%%Trailer$" nil t)
4734 (delete-region (match-beginning 0) (point-max)))) 4780 (delete-region (match-beginning 0) (point-max))))
4735 ;; miscellaneous 4781 ;; miscellaneous
4736 (setq ps-showline-count (car ps-printing-region) 4782 (setq ps-showline-count (car ps-printing-region)
4737 ps-page-count 0 4783 ps-page-column 0
4738 ps-font-size-internal (ps-get-font-size 'ps-font-size) 4784 ps-font-size-internal (ps-get-font-size 'ps-font-size)
4739 ps-header-font-size-internal (ps-get-font-size 'ps-header-font-size) 4785 ps-header-font-size-internal (ps-get-font-size 'ps-header-font-size)
4740 ps-header-title-font-size-internal 4786 ps-header-title-font-size-internal
4741 (ps-get-font-size 'ps-header-title-font-size) 4787 (ps-get-font-size 'ps-header-title-font-size)
4742 ps-control-or-escape-regexp 4788 ps-control-or-escape-regexp
4767 )) 4813 ))
4768 4814
4769 4815
4770 (defun ps-page-number () 4816 (defun ps-page-number ()
4771 (if ps-print-only-one-header 4817 (if ps-print-only-one-header
4772 (1+ (/ (1- ps-page-count) ps-number-of-columns)) 4818 (1+ (/ (1- ps-page-column) ps-number-of-columns))
4773 ps-page-count)) 4819 ps-page-column))
4774 4820
4775 4821
4776 (defun ps-next-page () 4822 (defun ps-next-page ()
4777 (ps-end-page) 4823 (ps-end-page)
4778 (ps-flush-output) 4824 (ps-flush-output)
4779 (ps-begin-page)) 4825 (ps-begin-page))
4780 4826
4781 4827
4782 (defun ps-header-sheet () 4828 (defun ps-header-sheet ()
4783 ;; Print only when a new sheet begins. 4829 ;; Print only when a new sheet begins.
4784 (setq ps-page-order (1+ ps-page-order)) 4830 (and ps-print-page-p (> ps-page-sheet 0)
4785 (and (> ps-page-order 1)
4786 (ps-output "EndSheet\n")) 4831 (ps-output "EndSheet\n"))
4787 (ps-output (if ps-n-up-on 4832 (setq ps-page-sheet (1+ ps-page-sheet))
4788 (format "\n%%%%Page: (%d \\(%d\\)) %d\n" 4833 (when (ps-print-sheet-p)
4789 ps-page-order ps-page-postscript ps-page-order) 4834 (setq ps-page-order (1+ ps-page-order))
4790 (format "\n%%%%Page: %d %d\n" 4835 (ps-output (if ps-n-up-on
4791 ps-page-postscript ps-page-order)) 4836 (format "\n%%%%Page: (%d \\(%d\\)) %d\n"
4792 (format "%d BeginSheet\nBeginDSCPage\n" 4837 ps-page-order ps-page-postscript ps-page-order)
4793 ps-n-up-printing))) 4838 (format "\n%%%%Page: %d %d\n"
4839 ps-page-postscript ps-page-order))
4840 (format "%d BeginSheet\nBeginDSCPage\n"
4841 ps-n-up-printing))))
4794 4842
4795 4843
4796 (defun ps-header-page () 4844 (defun ps-header-page ()
4797 ;; set total line and page number when printing has finished 4845 ;; set total line and page number when printing has finished
4798 ;; (see `ps-generate') 4846 ;; (see `ps-generate')
4799 (if (zerop (mod ps-page-count ps-number-of-columns)) 4847 (if (zerop (mod ps-page-column ps-number-of-columns))
4800 (progn 4848 (progn
4801 (setq ps-page-postscript (1+ ps-page-postscript)) 4849 (setq ps-page-postscript (1+ ps-page-postscript))
4802 (when (ps-print-page-p) 4850 (when (ps-print-page-p)
4851 (ps-print-sheet-p)
4803 (if (zerop (mod ps-page-n-up ps-n-up-printing)) 4852 (if (zerop (mod ps-page-n-up ps-n-up-printing))
4804 ;; Print only when a new sheet begins. 4853 ;; Print only when a new sheet begins.
4805 (progn 4854 (progn
4806 (ps-header-sheet) 4855 (ps-header-sheet)
4807 (run-hooks 'ps-print-begin-sheet-hook)) 4856 (run-hooks 'ps-print-begin-sheet-hook))
4808 ;; Print only when a new page begins. 4857 ;; Print only when a new page begins.
4809 (ps-output "BeginDSCPage\n") 4858 (ps-output "BeginDSCPage\n")
4810 (run-hooks 'ps-print-begin-page-hook)) 4859 (run-hooks 'ps-print-begin-page-hook))
4811 (ps-background ps-page-postscript) 4860 (ps-background ps-page-postscript)
4812 (setq ps-page-n-up (1+ ps-page-n-up)))) 4861 (setq ps-page-n-up (1+ ps-page-n-up))
4862 (and ps-print-page-p
4863 (setq ps-page-printed (1+ ps-page-printed)))))
4813 ;; Print only when a new column begins. 4864 ;; Print only when a new column begins.
4814 (ps-output "BeginDSCPage\n") 4865 (ps-output "BeginDSCPage\n")
4815 (run-hooks 'ps-print-begin-column-hook)) 4866 (run-hooks 'ps-print-begin-column-hook))
4816 (setq ps-page-count (1+ ps-page-count))) 4867 (setq ps-page-column (1+ ps-page-column)))
4817 4868
4818 (defun ps-begin-page () 4869 (defun ps-begin-page ()
4819 (ps-get-page-dimensions) 4870 (ps-get-page-dimensions)
4820 (setq ps-width-remaining ps-print-width 4871 (setq ps-width-remaining ps-print-width
4821 ps-height-remaining ps-print-height) 4872 ps-height-remaining ps-print-height)
5393 5444
5394 (and ps-razzle-dazzle (message "Formatting...done")))))) 5445 (and ps-razzle-dazzle (message "Formatting...done"))))))
5395 5446
5396 5447
5397 (defun ps-end-job (needs-begin-file) 5448 (defun ps-end-job (needs-begin-file)
5398 (let ((ps-print-page-p t)) 5449 (let ((previous-print ps-print-page-p)
5450 (ps-print-page-p t))
5399 (ps-flush-output) 5451 (ps-flush-output)
5400 (save-excursion 5452 (save-excursion
5401 (let ((pages-per-sheet (mod ps-page-n-up ps-n-up-printing)) 5453 (let ((pages-per-sheet (mod ps-page-printed ps-n-up-printing))
5402 (total-lines (cdr ps-printing-region)) 5454 (total-lines (cdr ps-printing-region))
5403 (total-pages (ps-page-number)) 5455 (total-pages (ps-page-number))
5404 case-fold-search) 5456 case-fold-search)
5405 (set-buffer ps-spool-buffer) 5457 (set-buffer ps-spool-buffer)
5406 ;; Back to the PS output buffer to set the last page n-up printing 5458 ;; Back to the PS output buffer to set the last page n-up printing
5419 (ps-header-sheet) 5471 (ps-header-sheet)
5420 (ps-output "/PrintHeader false def\n/ColumnIndex 0 def\n" 5472 (ps-output "/PrintHeader false def\n/ColumnIndex 0 def\n"
5421 "/PrintLineNumber false def\nBeginPage\n") 5473 "/PrintLineNumber false def\nBeginPage\n")
5422 (ps-end-page))) 5474 (ps-end-page)))
5423 ;; Set end of PostScript file 5475 ;; Set end of PostScript file
5424 (ps-output "EndSheet\n\n%%Trailer\n%%Pages: " 5476 (and previous-print
5477 (ps-output "EndSheet\n"))
5478 (ps-output "\n%%Trailer\n%%Pages: "
5425 (number-to-string 5479 (number-to-string
5426 (if (and needs-begin-file 5480 (if (and needs-begin-file
5427 ps-banner-page-when-duplexing) 5481 ps-banner-page-when-duplexing)
5428 (1+ ps-page-order) 5482 (1+ ps-page-order)
5429 ps-page-order)) 5483 ps-page-order))