Mercurial > emacs
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)) |