X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/877cf6b438c82e43ca401278f277ed344d05b0bf..88e15d0eca7546c5f42e9d06771b391d5f05f28a:/lisp/ps-print.el diff --git a/lisp/ps-print.el b/lisp/ps-print.el index 834ad7d285..a7b32e8b26 100644 --- a/lisp/ps-print.el +++ b/lisp/ps-print.el @@ -1,45 +1,44 @@ -;;; ps-print.el --- Print text from the buffer as PostScript +;;; ps-print.el --- print text from the buffer as PostScript -;; Copyright (C) 1993-2000 Free Software Foundation, Inc. +;; Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +;; 2003, 2004 Free Software Foundation, Inc. -;; Author: Jim Thompson (was ) -;; Author: Jacques Duthen (was ) -;; Author: Vinicius Jose Latorre -;; Author: Kenichi Handa (multi-byte characters) -;; Maintainer: Kenichi Handa (multi-byte characters) -;; Maintainer: Vinicius Jose Latorre -;; Keywords: wp, print, PostScript -;; Time-stamp: <2000/10/18 18:31:37 vinicius> -;; Version: 6.2 -;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/ +;; Author: Jim Thompson (was ) +;; Jacques Duthen (was ) +;; Vinicius Jose Latorre +;; Kenichi Handa (multi-byte characters) +;; Maintainer: Kenichi Handa (multi-byte characters) +;; Vinicius Jose Latorre +;; Keywords: wp, print, PostScript +;; Time-stamp: <2004/03/10 18:57:00 vinicius> +;; Version: 6.6.4 +;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/ -(defconst ps-print-version "6.2" - "ps-print.el, v 6.2 <2000/10/18 vinicius> +(defconst ps-print-version "6.6.4" + "ps-print.el, v 6.6.4 <2004/03/10 vinicius> Vinicius's last change version -- this file may have been edited as part of Emacs without changes to the version number. When reporting bugs, please also report the version of Emacs, if any, that ps-print was distributed with. Please send all bug fixes and enhancements to - Vinicius Jose Latorre . -") + Vinicius Jose Latorre .") ;; This file is part of GNU Emacs. -;; GNU Emacs is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. +;; GNU Emacs is free software; you can redistribute it and/or modify it under +;; the terms of the GNU General Public License as published by the Free +;; Software Foundation; either version 2, or (at your option) any later +;; version. -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. +;; GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY +;; WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +;; FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +;; details. -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; You should have received a copy of the GNU General Public License along with +;; GNU Emacs; see the file COPYING. If not, write to the Free Software +;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ;;; Commentary: @@ -48,14 +47,14 @@ Please send all bug fixes and enhancements to ;; About ps-print ;; -------------- ;; -;; This package provides printing of Emacs buffers on PostScript printers; -;; the buffer's bold and italic text attributes are preserved in the printer -;; output. ps-print is intended for use with Emacs or Lucid Emacs, together -;; with a fontifying package such as font-lock or hilit. +;; This package provides printing of Emacs buffers on PostScript printers; the +;; buffer's bold and italic text attributes are preserved in the printer +;; output. ps-print is intended for use with Emacs or XEmacs, together with a +;; fontifying package such as font-lock or hilit. ;; -;; ps-print uses the same face attributes defined through font-lock or hilit -;; to print a PostScript file, but some faces are better seeing on the screen -;; than on paper, specially when you have a black/white PostScript printer. +;; ps-print uses the same face attributes defined through font-lock or hilit to +;; print a PostScript file, but some faces are better seeing on the screen than +;; on paper, specially when you have a black/white PostScript printer. ;; ;; ps-print allows a remap of face to another one that it is better to print, ;; for example, the face font-lock-comment-face (if you are using font-lock) @@ -66,8 +65,8 @@ Please send all bug fixes and enhancements to ;; Using ps-print ;; -------------- ;; -;; ps-print provides eight commands for generating PostScript images -;; of Emacs buffers: +;; ps-print provides eight commands for generating PostScript images of Emacs +;; buffers: ;; ;; ps-print-buffer ;; ps-print-buffer-with-faces @@ -78,62 +77,58 @@ Please send all bug fixes and enhancements to ;; ps-spool-region ;; ps-spool-region-with-faces ;; -;; These commands all perform essentially the same function: they -;; generate PostScript images suitable for printing on a PostScript -;; printer or displaying with GhostScript. These commands are -;; collectively referred to as "ps-print- commands". +;; These commands all perform essentially the same function: they generate +;; PostScript images suitable for printing on a PostScript printer or +;; displaying with GhostScript. These commands are collectively referred to as +;; "ps-print- commands". ;; ;; The word "print" or "spool" in the command name determines when the ;; PostScript image is sent to the printer: ;; -;; print - The PostScript image is immediately sent to the -;; printer; +;; print - The PostScript image is immediately sent to the printer; ;; -;; spool - The PostScript image is saved temporarily in an -;; Emacs buffer. Many images may be spooled locally -;; before printing them. To send the spooled images -;; to the printer, use the command `ps-despool'. +;; spool - The PostScript image is saved temporarily in an Emacs +;; buffer. Many images may be spooled locally before +;; printing them. To send the spooled images to the +;; printer, use the command `ps-despool'. ;; -;; The spooling mechanism was designed for printing lots of small -;; files (mail messages or netnews articles) to save paper that would -;; otherwise be wasted on banner pages, and to make it easier to find -;; your output at the printer (it's easier to pick up one 50-page -;; printout than to find 50 single-page printouts). +;; The spooling mechanism was designed for printing lots of small files (mail +;; messages or netnews articles) to save paper that would otherwise be wasted +;; on banner pages, and to make it easier to find your output at the printer +;; (it's easier to pick up one 50-page printout than to find 50 single-page +;; printouts). ;; -;; ps-print has a hook in the `kill-emacs-hook' so that you won't -;; accidentally quit from Emacs while you have unprinted PostScript -;; waiting in the spool buffer. If you do attempt to exit with -;; spooled PostScript, you'll be asked if you want to print it, and if -;; you decline, you'll be asked to confirm the exit; this is modeled -;; on the confirmation that Emacs uses for modified buffers. +;; ps-print has a hook in the `kill-emacs-hook' so that you won't accidentally +;; quit from Emacs while you have unprinted PostScript waiting in the spool +;; buffer. If you do attempt to exit with spooled PostScript, you'll be asked +;; if you want to print it, and if you decline, you'll be asked to confirm the +;; exit; this is modeled on the confirmation that Emacs uses for modified +;; buffers. ;; -;; The word "buffer" or "region" in the command name determines how -;; much of the buffer is printed: +;; The word "buffer" or "region" in the command name determines how much of the +;; buffer is printed: ;; ;; buffer - Print the entire buffer. ;; ;; region - Print just the current region. ;; -;; The -with-faces suffix on the command name means that the command -;; will include font, color, and underline information in the -;; PostScript image, so the printed image can look as pretty as the -;; buffer. The ps-print- commands without the -with-faces suffix -;; don't include font, color, or underline information; images printed -;; with these commands aren't as pretty, but are faster to generate. +;; The -with-faces suffix on the command name means that the command will +;; include font, color, and underline information in the PostScript image, so +;; the printed image can look as pretty as the buffer. The ps-print- commands +;; without the -with-faces suffix don't include font, color, or underline +;; information; images printed with these commands aren't as pretty, but are +;; faster to generate. ;; ;; Two ps-print- command examples: ;; -;; ps-print-buffer - print the entire buffer, -;; without font, color, or -;; underline information, and -;; send it immediately to the -;; printer. +;; ps-print-buffer - print the entire buffer, without font, +;; color, or underline information, and +;; send it immediately to the printer. ;; -;; ps-spool-region-with-faces - print just the current region; -;; include font, color, and -;; underline information, and -;; spool the image in Emacs to -;; send to the printer later. +;; ps-spool-region-with-faces - print just the current region; include +;; font, color, and underline information, +;; and spool the image in Emacs to send to +;; the printer later. ;; ;; ;; Invoking Ps-Print @@ -143,26 +138,26 @@ Please send all bug fixes and enhancements to ;; ;; M-x ps-print-buffer ;; -;; or substitute one of the other seven ps-print- commands. The -;; command will generate the PostScript image and print or spool it as -;; specified. By giving the command a prefix argument +;; or substitute one of the other seven ps-print- commands. The command will +;; generate the PostScript image and print or spool it as specified. By giving +;; the command a prefix argument ;; ;; C-u M-x ps-print-buffer ;; -;; it will save the PostScript image to a file instead of sending it -;; to the printer; you will be prompted for the name of the file to -;; save the image to. The prefix argument is ignored by the commands -;; that spool their images, but you may save the spooled images to a -;; file by giving a prefix argument to `ps-despool': +;; it will save the PostScript image to a file instead of sending it to the +;; printer; you will be prompted for the name of the file to save the image to. +;; The prefix argument is ignored by the commands that spool their images, but +;; you may save the spooled images to a file by giving a prefix argument to +;; `ps-despool': ;; ;; C-u M-x ps-despool ;; -;; When invoked this way, `ps-despool' will prompt you for the name of -;; the file to save to. +;; When invoked this way, `ps-despool' will prompt you for the name of the file +;; to save to. ;; -;; Any of the `ps-print-' commands can be bound to keys; I recommend -;; binding `ps-spool-buffer-with-faces', `ps-spool-region-with-faces', -;; and `ps-despool'. Here are the bindings I use on my Sun 4 keyboard: +;; Any of the `ps-print-' commands can be bound to keys; I recommend binding +;; `ps-spool-buffer-with-faces', `ps-spool-region-with-faces', and +;; `ps-despool'. Here are the bindings I use on my Sun 4 keyboard: ;; ;; (global-set-key 'f22 'ps-spool-buffer-with-faces) ;f22 is prsc ;; (global-set-key '(shift f22) 'ps-spool-region-with-faces) @@ -172,10 +167,9 @@ Please send all bug fixes and enhancements to ;; The Printer Interface ;; --------------------- ;; -;; The variables `ps-lpr-command' and `ps-lpr-switches' determine what -;; command is used to send the PostScript images to the printer, and -;; what arguments to give the command. These are analogous to -;; `lpr-command' and `lpr-switches'. +;; The variables `ps-lpr-command' and `ps-lpr-switches' determine what command +;; is used to send the PostScript images to the printer, and what arguments to +;; give the command. These are analogous to `lpr-command' and `lpr-switches'. ;; ;; Make sure that they contain appropriate values for your system; ;; see the usage notes below and the documentation of these variables. @@ -188,11 +182,11 @@ Please send all bug fixes and enhancements to ;; `ps-printer-name' is a non-empty string. If you're using lpr utility to ;; print, for example, `ps-printer-name-option' should be set to "-P". ;; -;; NOTE: `ps-lpr-command' and `ps-lpr-switches' take their initial values -;; from the variables `lpr-command' and `lpr-switches'. If you have -;; `lpr-command' set to invoke a pretty-printer such as `enscript', -;; then ps-print won't work properly. `ps-lpr-command' must name -;; a program that does not format the files it prints. +;; NOTE: `ps-lpr-command' and `ps-lpr-switches' take their initial values from +;; the variables `lpr-command' and `lpr-switches'. If you have +;; `lpr-command' set to invoke a pretty-printer such as `enscript', then +;; ps-print won't work properly. `ps-lpr-command' must name a program +;; that does not format the files it prints. ;; `ps-printer-name' takes its initial value from the variable ;; `printer-name'. `ps-printer-name-option' tries to guess which system ;; Emacs is running and takes its initial value in accordance with this @@ -207,6 +201,10 @@ Please send all bug fixes and enhancements to ;; paper. If it's nil, automatic feeding takes place. If it's non-nil, manual ;; feeding takes place. The default is nil (automatic feeding). ;; +;; The variable `ps-end-with-control-d' specifies whether C-d (\x04) should be +;; inserted at end of PostScript generated. Non-nil means do so. The default +;; is nil (don't insert). +;; ;; If you're using Emacs for Windows 95/98/NT or MS-DOS, don't forget to ;; customize the following variables: `ps-printer-name', ;; `ps-printer-name-option', `ps-lpr-command', `ps-lpr-switches' and @@ -238,10 +236,10 @@ Please send all bug fixes and enhancements to ;; on the page: nil means `portrait' mode, non-nil means `landscape' mode. ;; There is no oblique mode yet, though this is easy to do in ps. ;; -;; In landscape mode, the text is NOT scaled: you may print 70 lines in portrait -;; mode and only 50 lines in landscape mode. The margins represent margins in -;; the printed paper: the top margin is the margin between the top of the page -;; and the printed header, whatever the orientation is. +;; In landscape mode, the text is NOT scaled: you may print 70 lines in +;; portrait mode and only 50 lines in landscape mode. The margins represent +;; margins in the printed paper: the top margin is the margin between the top +;; of the page and the printed header, whatever the orientation is. ;; ;; The variable `ps-number-of-columns' determines the number of columns both in ;; landscape and portrait mode. @@ -252,9 +250,10 @@ Please send all bug fixes and enhancements to ;; - one column landscape mode for files with very long lines. ;; - multi-column portrait or landscape mode. ;; -;; The variable `ps-print-upside-down' determines other orientation for printing -;; page: nil means `normal' printing, non-nil means `upside-down' printing. The -;; default value is nil (`normal' printing). +;; The variable `ps-print-upside-down' determines other orientation for +;; printing page: nil means `normal' printing, non-nil means `upside-down' +;; printing (that is, the page is rotated by 180 grades). The default value is +;; nil (`normal' printing). ;; ;; The `upside-down' orientation can be used in portrait or landscape mode. ;; @@ -275,12 +274,18 @@ Please send all bug fixes and enhancements to ;; ;; nil print all pages. ;; -;; even print only even pages. +;; even-page print only even pages. +;; +;; odd-page print only odd pages. ;; -;; odd print only odd pages. +;; even-sheet print only even sheets. +;; +;; odd-sheet print only odd sheets. ;; ;; Any other value is treated as nil. The default value is nil. ;; +;; See `ps-even-or-odd-pages' for more detailed documentation. +;; ;; ;; Horizontal layout ;; ----------------- @@ -304,51 +309,86 @@ Please send all bug fixes and enhancements to ;; --------------- ;; ;; The vertical layout is determined by the variables -;; `ps-bottom-margin' `ps-top-margin' `ps-header-offset' +;; `ps-bottom-margin' `ps-top-margin' `ps-header-offset' `ps-footer-offset' ;; as follows: ;; -;; |--------| |--------| -;; | tm | | tm | -;; |--------| |--------| -;; | header | | | -;; |--------| | | -;; | ho | | | -;; |--------| or | text | -;; | | | | -;; | text | | | -;; | | | | -;; |--------| |--------| -;; | bm | | bm | -;; |--------| |--------| +;; |--------| |--------| |--------| |--------| +;; | tm | | tm | | tm | | tm | +;; |--------| |--------| |--------| |--------| +;; | header | | | | header | | | +;; |--------| | | |--------| | | +;; | ho | | | | ho | | | +;; |--------| | | |--------| | | +;; | | | | | | | | +;; | text | or | text | or | text | or | text | +;; | | | | | | | | +;; | | |--------| |--------| | | +;; | | | fo | | fo | | | +;; | | |--------| |--------| | | +;; | | | footer | | footer | | | +;; |--------| |--------| |--------| |--------| +;; | bm | | bm | | bm | | bm | +;; |--------| |--------| |--------| |--------| ;; ;; If `ps-print-header' is nil, `ps-header-offset' is not relevant. +;; If `ps-print-footer' is nil, `ps-footer-offset' is not relevant. ;; The margins represent margins in the printed paper: -;; the top margin is the margin between the top of the page -;; and the printed header, whatever the orientation is. +;; the top margin is the margin between the top of the page and the printed +;; header, whatever the orientation is; +;; the bottom margin is the margin between the bottom of the page and the +;; printed footer, whatever the orientation is. ;; ;; -;; Headers -;; ------- +;; Headers & Footers +;; ----------------- ;; -;; ps-print can print headers at the top of each column or at the top -;; of each page; the default headers contain the following four items: -;; on the left, the name of the buffer and, if the buffer is visiting -;; a file, the file's directory; on the right, the page number and -;; date of printing. The default headers look something like this: +;; ps-print can print headers at the top of each column or at the top of each +;; page; the default headers contain the following four items: on the left, the +;; name of the buffer and, if the buffer is visiting a file, the file's +;; directory; on the right, the page number and date of printing. The default +;; headers look something like this: ;; ;; ps-print.el 1/21 ;; /home/jct/emacs-lisp/ps/new 94/12/31 ;; -;; When printing on duplex printers, left and right are reversed so -;; that the page numbers are toward the outside (cf. `ps-spool-duplex'). +;; When printing on duplex printers, left and right are reversed so that the +;; page numbers are toward the outside (cf. `ps-spool-duplex'). ;; ;; Headers are configurable: ;; To turn them off completely, set `ps-print-header' to nil. ;; To turn off the header's gaudy framing box, ;; set `ps-print-header-frame' to nil. ;; -;; To print only one header at the top of each page, -;; set `ps-print-only-one-header' to t. +;; The variable `ps-header-frame-alist' specifies header frame properties +;; alist. Valid frame properties are: +;; +;; fore-color Specify the foreground frame color. +;; It should be a float number between 0.0 (black color) +;; and 1.0 (white color), a string which is a color name, +;; or a list of 3 float numbers which corresponds to the +;; Red Green Blue color scale, each float number between +;; 0.0 (dark color) and 1.0 (bright color). +;; The default is 0 ("black"). +;; +;; back-color Specify the background frame color (similar to +;; fore-color). The default is 0.9 ("gray90"). +;; +;; shadow-color Specify the shadow color (similar to fore-color). +;; The default is 0 ("black"). +;; +;; border-color Specify the border color (similar to fore-color). +;; The default is 0 ("black"). +;; +;; border-width Specify the border width. +;; The default is 0.4. +;; +;; Any other property is ignored. +;; +;; Don't change this alist directly, instead use customization, or `ps-value', +;; `ps-get', `ps-put' and `ps-del' functions (see them for documentation). +;; +;; To print only one header at the top of each page, set +;; `ps-print-only-one-header' to t. ;; ;; To switch headers, set `ps-switch-header' to: ;; @@ -361,39 +401,36 @@ Please send all bug fixes and enhancements to ;; ;; Any other value is treated as t. The default value is `duplex'. ;; -;; The font family and size of text in the header are determined -;; by the variables `ps-header-font-family', `ps-header-font-size' and +;; The font family and size of text in the header are determined by the +;; variables `ps-header-font-family', `ps-header-font-size' and ;; `ps-header-title-font-size' (see below). ;; -;; The variable `ps-header-line-pad' determines the portion of a header -;; title line height to insert between the header frame and the text -;; it contains, both in the vertical and horizontal directions: -;; .5 means half a line. -;; -;; Page numbers are printed in `n/m' format, indicating page n of m pages; -;; to omit the total page count and just print the page number, -;; set `ps-show-n-of-n' to nil. -;; -;; The amount of information in the header can be changed by changing -;; the number of lines. To show less, set `ps-header-lines' to 1, and -;; the header will show only the buffer name and page number. To show -;; more, set `ps-header-lines' to 3, and the header will show the time of -;; printing below the date. -;; -;; To change the content of the headers, change the variables -;; `ps-left-header' and `ps-right-header'. -;; These variables are lists, specifying top-to-bottom the text -;; to display on the left or right side of the header. -;; Each element of the list should be a string or a symbol. -;; Strings are inserted directly into the PostScript arrays, -;; and should contain the PostScript string delimiters '(' and ')'. -;; -;; Symbols in the header format lists can either represent functions -;; or variables. Functions are called, and should return a string to -;; show in the header. Variables should contain strings to display in -;; the header. In either case, function or variable, the PostScript -;; string delimiters are added by ps-print, and should not be part of -;; the returned value. +;; The variable `ps-header-line-pad' determines the portion of a header title +;; line height to insert between the header frame and the text it contains, +;; both in the vertical and horizontal directions: .5 means half a line. +;; +;; Page numbers are printed in `n/m' format, indicating page n of m pages; to +;; omit the total page count and just print the page number, set +;; `ps-show-n-of-n' to nil. +;; +;; The amount of information in the header can be changed by changing the +;; number of lines. To show less, set `ps-header-lines' to 1, and the header +;; will show only the buffer name and page number. To show more, set +;; `ps-header-lines' to 3, and the header will show the time of printing below +;; the date. +;; +;; To change the content of the headers, change the variables `ps-left-header' +;; and `ps-right-header'. +;; These variables are lists, specifying top-to-bottom the text to display on +;; the left or right side of the header. Each element of the list should be a +;; string or a symbol. Strings are inserted directly into the PostScript +;; arrays, and should contain the PostScript string delimiters '(' and ')'. +;; +;; Symbols in the header format lists can either represent functions or +;; variables. Functions are called, and should return a string to show in the +;; header. Variables should contain strings to display in the header. In +;; either case, function or variable, the PostScript string delimiters are +;; added by ps-print, and should not be part of the returned value. ;; ;; Here's an example: say we want the left header to display the text ;; @@ -410,22 +447,42 @@ Please send all bug fixes and enhancements to ;; ;; (setq larry-var "Larry") ;; -;; and a literal for "Curly". Here's how `ps-left-header' should be -;; set: +;; and a literal for "Curly". Here's how `ps-left-header' should be set: ;; ;; (setq ps-left-header (list 'moe-func 'larry-var "(Curly)")) ;; -;; Note that Curly has the PostScript string delimiters inside his -;; quotes -- those aren't misplaced lisp delimiters! +;; Note that Curly has the PostScript string delimiters inside his quotes -- +;; those aren't misplaced lisp delimiters! ;; -;; Without them, PostScript would attempt to call the undefined -;; function Curly, which would result in a PostScript error. +;; Without them, PostScript would attempt to call the undefined function Curly, +;; which would result in a PostScript error. ;; -;; Since most printers don't report PostScript errors except by -;; aborting the print job, this kind of error can be hard to track down. +;; Since most printers don't report PostScript errors except by aborting the +;; print job, this kind of error can be hard to track down. ;; ;; Consider yourself warned! ;; +;; ps-print also print footers. The footer variables are: `ps-print-footer', +;; `ps-footer-offset', `ps-print-footer-frame', `ps-footer-font-family', +;; `ps-footer-font-size', `ps-footer-line-pad', `ps-footer-lines', +;; `ps-left-footer', `ps-right-footer' and `ps-footer-frame-alist'. These +;; variables are similar to those one that control headers. +;; +;; The variables `ps-print-only-one-header' and `ps-switch-header' also control +;; the footer (The same way that control header). +;; +;; As a footer example, if you want to have a centered page number in the +;; footer but without headers, set: +;; +;; (setq ps-print-header nil +;; ps-print-footer t +;; ps-print-footer-frame nil +;; ps-footer-lines 1 +;; ps-right-footer nil +;; ps-left-footer +;; (list (concat "{pagenumberstring dup stringwidth pop" +;; " 2 div PrintWidth 2 div exch sub 0 rmoveto}"))) +;; ;; ;; PostScript Prologue Header ;; -------------------------- @@ -433,22 +490,23 @@ Please send all bug fixes and enhancements to ;; It is possible to add PostScript prologue header comments besides that ;; ps-print generates by setting the variable `ps-print-prologue-header'. ;; -;; `ps-print-prologue-header' may be a string or a symbol function which returns -;; a string. Note that this string is inserted on PostScript prologue header -;; section which is used to define some document characteristic through +;; `ps-print-prologue-header' may be a string or a symbol function which +;; returns a string. Note that this string is inserted on PostScript prologue +;; header section which is used to define some document characteristic through ;; PostScript special comments, like "%%Requirements: jog\n". ;; ;; By default `ps-print-prologue-header' is nil. ;; -;; ps-print always inserts the %%Requirements: comment, so if you need to insert -;; more requirements put them first in `ps-print-prologue-header' using the -;; "%%+" comment. For example, if you need to set numcopies to 3 and jog on -;; requirements and set %%LanguageLevel: to 2, do: +;; ps-print always inserts the %%Requirements: comment, so if you need to +;; insert more requirements put them first in `ps-print-prologue-header' using +;; the "%%+" comment. For example, if you need to set numcopies to 3 and jog +;; on requirements and set %%LanguageLevel: to 2, do: ;; ;; (setq ps-print-prologue-header ;; "%%+ numcopies(3) jog\n%%LanguageLevel: 2\n") ;; -;; The duplex requirement is inserted by ps-print (see section Duplex Printers). +;; The duplex requirement is inserted by ps-print (see section Duplex +;; Printers). ;; ;; Do not forget to terminate the string with "\n". ;; @@ -461,17 +519,17 @@ Please send all bug fixes and enhancements to ;; all generated prologue code by setting the variable ;; `ps-user-defined-prologue'. ;; -;; `ps-user-defined-prologue' may be a string or a symbol function which returns -;; a string. Note that this string is inserted after `ps-adobe-tag' and -;; PostScript prologue comments, and before ps-print PostScript prologue code -;; section. That is, this string is inserted after error handler initialization -;; and before ps-print settings. +;; `ps-user-defined-prologue' may be a string or a symbol function which +;; returns a string. Note that this string is inserted after `ps-adobe-tag' +;; and PostScript prologue comments, and before ps-print PostScript prologue +;; code section. That is, this string is inserted after error handler +;; initialization and before ps-print settings. ;; ;; By default `ps-user-defined-prologue' is nil. ;; ;; It's strongly recommended only insert PostScript code and/or comments -;; specific for your printing system particularities. For example, some special -;; initialization that only your printing system needs. +;; specific for your printing system particularities. For example, some +;; special initialization that only your printing system needs. ;; ;; Do not insert code for duplex printing, n-up printing or error handler, ;; ps-print handles this in a suitable way. @@ -504,10 +562,10 @@ Please send all bug fixes and enhancements to ;; This is the default value. ;; ;; system catch the error and send back the error message to -;; printing system. This is useful only if printing system -;; send back an email reporting the error, or if there is -;; some other alternative way to report back the error from -;; the system to you. +;; printing system. This is useful only if printing +;; system send back an email reporting the error, or if +;; there is some other alternative way to report back the +;; error from the system to you. ;; ;; paper-and-system catch the error, print on paper the error message and ;; send back the error message to printing system. @@ -523,8 +581,8 @@ Please send all bug fixes and enhancements to ;; ps-print will insert blank pages to make sure each buffer starts on the ;; correct side of the paper. ;; -;; The variable `ps-spool-config' specifies who is the responsable for setting -;; duplex and page size switches. Valid values are: +;; The variable `ps-spool-config' specifies who is the responsible for setting +;; duplex and page size. Valid values are: ;; ;; lpr-switches duplex and page size are configured by `ps-lpr-switches'. ;; Don't forget to set `ps-lpr-switches' to select duplex @@ -540,9 +598,9 @@ Please send all bug fixes and enhancements to ;; ;; The default value is `lpr-switches'. ;; -;; WARNING: The setpagedevice PostScript operator affects ghostview utility when -;; viewing file generated using landscape. Also on some printers, -;; setpagedevice affects zebra stripes; on other printers, +;; WARNING: The setpagedevice PostScript operator affects ghostview utility +;; when viewing file generated using landscape. Also on some +;; printers, setpagedevice affects zebra stripes; on other printers, ;; setpagedevice affects the left margin. ;; Besides all that, if your printer does not have the paper size ;; specified by setpagedevice, your printing will be aborted. @@ -552,21 +610,21 @@ Please send all bug fixes and enhancements to ;; ;; The variable `ps-spool-tumble' specifies how the page images on opposite ;; sides of a sheet are oriented with respect to each other. If -;; `ps-spool-tumble' is nil, produces output suitable for binding on the left or -;; right. If `ps-spool-tumble' is non-nil, produces output suitable for binding -;; at the top or bottom. It has effect only when `ps-spool-duplex' is non-nil. -;; The default value is nil. +;; `ps-spool-tumble' is nil, produces output suitable for binding on the left +;; or right. If `ps-spool-tumble' is non-nil, produces output suitable for +;; binding at the top or bottom. It has effect only when `ps-spool-duplex' is +;; non-nil. The default value is nil. ;; -;; Some printer system prints a header page and forces the first page be printed -;; on header page back, when using duplex. If your printer system has this -;; behavior, set variable `ps-banner-page-when-duplexing' to t. +;; Some printer system prints a header page and forces the first page be +;; printed on header page back, when using duplex. If your printer system has +;; this behavior, set variable `ps-banner-page-when-duplexing' to t. ;; -;; When `ps-banner-page-when-duplexing' is non-nil means the very first page is -;; skipped. It's like the very first character of buffer (or region) is ^L -;; (\014). +;; When `ps-banner-page-when-duplexing' is non-nil, it prints a blank page as +;; the very first printed page. So, it behaves as the very first character of +;; buffer (or region) is ^L (\014). ;; -;; The default for `ps-banner-page-when-duplexing' is nil (*don't* skip the very -;; first page). +;; The default for `ps-banner-page-when-duplexing' is nil (*don't* skip the +;; very first page). ;; ;; ;; N-up Printing @@ -575,15 +633,15 @@ Please send all bug fixes and enhancements to ;; The variable `ps-n-up-printing' specifies the number of pages per sheet of ;; paper. The value specified must be between 1 and 100. The default is 1. ;; -;; NOTE: some PostScript printer may crash printing if `ps-n-up-printing' is set -;; to a high value (for example, 23). If this happens, set a lower value. +;; NOTE: some PostScript printer may crash printing if `ps-n-up-printing' is +;; set to a high value (for example, 23). If this happens, set a lower value. ;; ;; The variable `ps-n-up-margin' specifies the margin in points between the ;; sheet border and the n-up printing. The default is 1 cm (or 0.3937 inches, ;; or 28.35 points). ;; -;; If variable `ps-n-up-border-p' is non-nil a border is drawn around each page. -;; The default is t. +;; If variable `ps-n-up-border-p' is non-nil a border is drawn around each +;; page. The default is t. ;; ;; The variable `ps-n-up-filling' specifies how page matrix is filled on each ;; sheet of paper. Following are the valid values for `ps-n-up-filling' with a @@ -605,7 +663,7 @@ Please send all bug fixes and enhancements to ;; 11 8 5 2 11 8 5 2 ;; 12 9 6 3 10 7 4 1 ;; -;; Any other value is treated as left-top. +;; Any other value is treated as `left-top'. ;; ;; The default value is left-top. ;; @@ -655,8 +713,18 @@ Please send all bug fixes and enhancements to ;; The variable `ps-line-number' specifies whether to number each line; ;; non-nil means do so. The default is nil (don't number each line). ;; -;; The variable `ps-line-number-step' specifies the interval that line number is -;; printed. For example, if `ps-line-number-step' is set to 2, the printing +;; The variable `ps-line-number-color' specifies the color for line number. +;; See `ps-zebra-color' for documentation. The default is "black" (or 0.0, or +;; '(0.0 0.0 0.0)). +;; +;; The variable `ps-line-number-font' specifies the font for line number. +;; The default is "Times-Italic". +;; +;; The variable `ps-line-number-font-size' specifies the font size in points +;; for line number. See `ps-font-size' for documentation. The default is 6. +;; +;; The variable `ps-line-number-step' specifies the interval that line number +;; is printed. For example, if `ps-line-number-step' is set to 2, the printing ;; will look like: ;; ;; 1 one line @@ -673,16 +741,16 @@ Please send all bug fixes and enhancements to ;; printed. If it's lesser than or equal to zero, it's used the ;; value 1. ;; -;; `zebra' specifies that only the line number of the first line in a zebra -;; stripe is to be printed. +;; `zebra' specifies that only the line number of the first line in a +;; zebra stripe is to be printed. ;; ;; Any other value is treated as `zebra'. ;; The default value is 1, so each line number is printed. ;; ;; The variable `ps-line-number-start' specifies the starting point in the ;; interval given by `ps-line-number-step'. For example, if -;; `ps-line-number-step' is set to 3 and `ps-line-number-start' is set to 3, the -;; printing will look like: +;; `ps-line-number-step' is set to 3 and `ps-line-number-start' is set to 3, +;; the printing will look like: ;; ;; one line ;; one line @@ -704,15 +772,15 @@ Please send all bug fixes and enhancements to ;; * If `ps-line-number-step' is set to `zebra', must be between 1 and the ;; value of `ps-zebra-stripe-height' inclusive. ;; -;; The default value is 1, so the line number of the first line of each interval -;; is printed. +;; The default value is 1, so the line number of the first line of each +;; interval is printed. ;; ;; ;; Zebra Stripes ;; ------------- ;; -;; Zebra stripes are a kind of background that appear "underneath" the text -;; and can make the text easier to read. They look like this: +;; Zebra stripes are a kind of background that appear "underneath" the text and +;; can make the text easier to read. They look like this: ;; ;; XXXXXXXXXXXXXXXXXXXXXXXX ;; XXXXXXXXXXXXXXXXXXXXXXXX @@ -727,9 +795,9 @@ Please send all bug fixes and enhancements to ;; The blocks of X's represent rectangles filled with a light gray color. ;; Each rectangle extends all the way across the page. ;; -;; The height, in lines, of each rectangle is controlled by -;; the variable `ps-zebra-stripe-height', which is 3 by default. -;; The distance between stripes equals the height of a stripe. +;; The height, in lines, of each rectangle is controlled by the variable +;; `ps-zebra-stripe-height', which is 3 by default. The distance between +;; stripes equals the height of a stripe. ;; ;; The variable `ps-zebra-stripes' controls whether to print zebra stripes. ;; Non-nil means yes, nil means no. The default is nil. @@ -740,33 +808,39 @@ Please send all bug fixes and enhancements to ;; corresponds to the Red Green Blue color scale. ;; The default is 0.95 (or "gray95", or '(0.95 0.95 0.95)). ;; -;; The variable `ps-zebra-stripe-follow' specifies if zebra stripe should -;; continue on next page or restart on each page. If `ps-zebra-stripe-follow' -;; is nil, zebra stripe is restarted on each page. If `ps-zebra-stripe-follow' -;; is non-nil, zebra stripe continues on next page. Visually, we have: -;; -;; `ps-zebra-stripe-follow' `ps-zebra-stripe-follow' -;; is nil is non-nil -;; Current Page ------------------------ ------------------------ -;; 1 XXXXXXXXXXXXXXXXXXXXX 1 XXXXXXXXXXXXXXXXXXXXX -;; 2 XXXXXXXXXXXXXXXXXXXXX 2 XXXXXXXXXXXXXXXXXXXXX -;; 3 XXXXXXXXXXXXXXXXXXXXX 3 XXXXXXXXXXXXXXXXXXXXX -;; 4 4 -;; 5 5 -;; 6 6 -;; 7 XXXXXXXXXXXXXXXXXXXXX 7 XXXXXXXXXXXXXXXXXXXXX -;; 8 XXXXXXXXXXXXXXXXXXXXX 8 XXXXXXXXXXXXXXXXXXXXX -;; ------------------------ ------------------------ -;; Next Page ------------------------ ------------------------ -;; 9 XXXXXXXXXXXXXXXXXXXXX 9 XXXXXXXXXXXXXXXXXXXXX -;; 10 XXXXXXXXXXXXXXXXXXXXX 10 -;; 11 XXXXXXXXXXXXXXXXXXXXX 11 -;; 12 12 -;; 13 13 XXXXXXXXXXXXXXXXXXXXX -;; 14 14 XXXXXXXXXXXXXXXXXXXXX -;; 15 XXXXXXXXXXXXXXXXXXXXX 15 XXXXXXXXXXXXXXXXXXXXX -;; 16 XXXXXXXXXXXXXXXXXXXXX 16 -;; ------------------------ ------------------------ +;; The variable `ps-zebra-stripe-follow' specifies how zebra stripes continue +;; on next page. Visually, valid values are (the character `+' at right of +;; each column indicates that a line is printed): +;; +;; `nil' `follow' `full' `full-follow' +;; Current Page -------- ----------- --------- ---------------- +;; 1 XXXXX + 1 XXXXXXXX + 1 XXXXXX + 1 XXXXXXXXXXXXX + +;; 2 XXXXX + 2 XXXXXXXX + 2 XXXXXX + 2 XXXXXXXXXXXXX + +;; 3 XXXXX + 3 XXXXXXXX + 3 XXXXXX + 3 XXXXXXXXXXXXX + +;; 4 + 4 + 4 + 4 + +;; 5 + 5 + 5 + 5 + +;; 6 + 6 + 6 + 6 + +;; 7 XXXXX + 7 XXXXXXXX + 7 XXXXXX + 7 XXXXXXXXXXXXX + +;; 8 XXXXX + 8 XXXXXXXX + 8 XXXXXX + 8 XXXXXXXXXXXXX + +;; 9 XXXXX + 9 XXXXXXXX + 9 XXXXXX + 9 XXXXXXXXXXXXX + +;; 10 + 10 + +;; 11 + 11 + +;; -------- ----------- --------- ---------------- +;; Next Page -------- ----------- --------- ---------------- +;; 12 XXXXX + 12 + 10 XXXXXX + 10 + +;; 13 XXXXX + 13 XXXXXXXX + 11 XXXXXX + 11 + +;; 14 XXXXX + 14 XXXXXXXX + 12 XXXXXX + 12 + +;; 15 + 15 XXXXXXXX + 13 + 13 XXXXXXXXXXXXX + +;; 16 + 16 + 14 + 14 XXXXXXXXXXXXX + +;; 17 + 17 + 15 + 15 XXXXXXXXXXXXX + +;; 18 XXXXX + 18 + 16 XXXXXX + 16 + +;; 19 XXXXX + 19 XXXXXXXX + 17 XXXXXX + 17 + +;; 20 XXXXX + 20 XXXXXXXX + 18 XXXXXX + 18 + +;; 21 + 21 XXXXXXXX + +;; 22 + 22 + +;; -------- ----------- --------- ---------------- +;; +;; Any other value is treated as nil. ;; ;; See also section How Ps-Print Has A Text And/Or Image On Background. ;; @@ -787,12 +861,12 @@ Please send all bug fixes and enhancements to ;; evaluated. ;; ;; `ps-print-begin-page-hook' -;; It is evaluated on each beginning of page, except in the beginning -;; of page that `ps-print-begin-sheet-hook' is evaluated. +;; It is evaluated on each beginning of page, except in the beginning of +;; page that `ps-print-begin-sheet-hook' is evaluated. ;; ;; `ps-print-begin-column-hook' -;; It is evaluated on each beginning of column, except in the beginning -;; of column that `ps-print-begin-page-hook' is evaluated or that +;; It is evaluated on each beginning of column, except in the beginning of +;; column that `ps-print-begin-page-hook' is evaluated or that ;; `ps-print-begin-sheet-hook' is evaluated. ;; ;; @@ -801,10 +875,11 @@ Please send all bug fixes and enhancements to ;; ;; ps-print now knows rather precisely some fonts: the variable ;; `ps-font-info-database' contains information for a list of font families -;; (currently mainly `Courier' `Helvetica' `Times' `Palatino' `Helvetica-Narrow' -;; `NewCenturySchlbk'). Each font family contains the font names for standard, -;; bold, italic and bold-italic characters, a reference size (usually 10) and -;; the corresponding line height, width of a space and average character width. +;; (currently mainly `Courier' `Helvetica' `Times' `Palatino' +;; `Helvetica-Narrow' `NewCenturySchlbk'). Each font family contains the font +;; names for standard, bold, italic and bold-italic characters, a reference +;; size (usually 10) and the corresponding line height, width of a space and +;; average character width. ;; ;; The variable `ps-font-family' determines which font family is to be used for ;; ordinary text. If its value does not correspond to a known font family, an @@ -812,8 +887,8 @@ Please send all bug fixes and enhancements to ;; currently available font families. ;; ;; The variable `ps-font-size' determines the size (in points) of the font for -;; ordinary text, when generating PostScript. Its value is a float or a cons of -;; floats which has the following form: +;; ordinary text, when generating PostScript. Its value is a float or a cons +;; of floats which has the following form: ;; ;; (LANDSCAPE-SIZE . PORTRAIT-SIZE) ;; @@ -823,27 +898,56 @@ Please send all bug fixes and enhancements to ;; The variable `ps-header-font-size' determines the font size, in points, for ;; text in the header (similar to `ps-font-size'). ;; -;; The variable `ps-header-title-font-size' determines the font size, in points, -;; for the top line of text in the header (similar to `ps-font-size'). +;; The variable `ps-header-title-font-size' determines the font size, in +;; points, for the top line of text in the header (similar to `ps-font-size'). +;; +;; The variable `ps-line-spacing' determines the line spacing, in points, for +;; ordinary text, when generating PostScript (similar to `ps-font-size'). The +;; default value is 0 (zero = no line spacing). +;; +;; The variable `ps-paragraph-spacing' determines the paragraph spacing, in +;; points, for ordinary text, when generating PostScript (similar to +;; `ps-font-size'). The default value is 0 (zero = no paragraph spacing). +;; +;; To get all lines with some spacing set both `ps-line-spacing' and +;; `ps-paragraph-spacing' variables. +;; +;; The variable `ps-paragraph-regexp' specifies the paragraph delimiter. It +;; should be a regexp or nil. The default value is "[ \t]*$", that is, an +;; empty line or a line containing only spaces and tabs. +;; +;; The variable `ps-begin-cut-regexp' and `ps-end-cut-regexp' specify the start +;; and end of a region to cut out when printing. +;; +;; As an example, variables `ps-begin-cut-regexp' and `ps-end-cut-regexp' may +;; be set to "^Local Variables:" and "^End:", respectively, in order to leave +;; out some special printing instructions from the actual print. Special +;; printing instructions may be appended to the end of the file just like any +;; other buffer-local variables. See section "Local Variables in Files" on +;; Emacs manual for more information. +;; +;; Variables `ps-begin-cut-regexp' and `ps-end-cut-regexp' control together +;; what actually gets printed. Both variables may be set to nil in which case +;; no cutting occurs. By default, both variables are set to nil. ;; ;; ;; Adding a New Font Family ;; ------------------------ ;; -;; To use a new font family, you MUST first teach ps-print -;; this font, i.e., add its information to `ps-font-info-database', -;; otherwise ps-print cannot correctly place line and page breaks. +;; To use a new font family, you MUST first teach ps-print this font, i.e., add +;; its information to `ps-font-info-database', otherwise ps-print cannot +;; correctly place line and page breaks. ;; -;; For example, assuming `Helvetica' is unknown, -;; you first need to do the following ONLY ONCE: +;; For example, assuming `Helvetica' is unknown, you first need to do the +;; following ONLY ONCE: ;; ;; - create a new buffer ;; - generate the PostScript image to a file (C-u M-x ps-print-buffer) ;; - open this file and find the line: ;; `% 3 cm 20 cm moveto 10/Courier ReportFontInfo showpage' ;; - delete the leading `%' (which is the PostScript comment character) -;; - replace in this line `Courier' by the new font (say `Helvetica') -;; to get the line: +;; - replace in this line `Courier' by the new font (say `Helvetica') to get +;; the line: ;; `3 cm 20 cm moveto 10/Helvetica ReportFontInfo showpage' ;; - send this file to the printer (or to ghostscript). ;; You should read the following on the output page: @@ -866,8 +970,8 @@ Please send all bug fixes and enhancements to ;; ps-font-info-database)) ;; - Now you can use this font family with any size: ;; (setq ps-font-family 'Helvetica) -;; - if you want to use this family in another emacs session, you must -;; put into your `~/.emacs': +;; - if you want to use this family in another emacs session, you must put into +;; your `~/.emacs': ;; (require 'ps-print) ;; (setq ps-font-info-database (append ...))) ;; if you don't want to load ps-print, you have to copy the whole value: @@ -893,11 +997,11 @@ Please send all bug fixes and enhancements to ;; Now you can use your new font family with any size: ;; (setq ps-font-family 'my-mixed-family) ;; -;; Note that on above example the `w3-table-hack-x-face' entry refers to -;; a face symbol, so when printing this face it'll be used the font -;; `LineDrawNormal'. If the face `w3-table-hack-x-face' is remapped to -;; use bold and/or italic attribute, the corresponding entry (bold, italic -;; or bold-italic) will be used instead of `w3-table-hack-x-face' entry. +;; Note that on above example the `w3-table-hack-x-face' entry refers to a face +;; symbol, so when printing this face it'll be used the font `LineDrawNormal'. +;; If the face `w3-table-hack-x-face' is remapped to use bold and/or italic +;; attribute, the corresponding entry (bold, italic or bold-italic) will be +;; used instead of `w3-table-hack-x-face' entry. ;; ;; Note also that the font family entry order is irrelevant, so the above ;; example could also be written: @@ -920,8 +1024,8 @@ Please send all bug fixes and enhancements to ;; % 3 cm 20 cm moveto ReportAllFontInfo showpage ;; ;; The PostScript file should be sent to YOUR PostScript printer. -;; If you send it to ghostscript or to another PostScript printer, -;; you may get slightly different results. +;; If you send it to ghostscript or to another PostScript printer, you may get +;; slightly different results. ;; Anyway, as ghostscript fonts are autoload, you won't get much font info. ;; ;; Note also that ps-print DOESN'T download any font to your printer, instead @@ -931,14 +1035,14 @@ Please send all bug fixes and enhancements to ;; How Ps-Print Deals With Faces ;; ----------------------------- ;; -;; The ps-print-*-with-faces commands attempt to determine which faces -;; should be printed in bold or italic, but their guesses aren't -;; always right. For example, you might want to map colors into faces -;; so that blue faces print in bold, and red faces in italic. +;; The ps-print-*-with-faces commands attempt to determine which faces should +;; be printed in bold or italic, but their guesses aren't always right. For +;; example, you might want to map colors into faces so that blue faces print in +;; bold, and red faces in italic. ;; -;; It is possible to force ps-print to consider specific faces bold, -;; italic or underline, no matter what font they are displayed in, by setting -;; the variables `ps-bold-faces', `ps-italic-faces' and `ps-underlined-faces'. +;; It is possible to force ps-print to consider specific faces bold, italic or +;; underline, no matter what font they are displayed in, by setting the +;; variables `ps-bold-faces', `ps-italic-faces' and `ps-underlined-faces'. ;; These variables contain lists of faces that ps-print should consider bold, ;; italic or underline; to set them, put code like the following into your ;; .emacs file: @@ -947,20 +1051,19 @@ Please send all bug fixes and enhancements to ;; (setq ps-italic-faces '(my-red-face)) ;; (setq ps-underlined-faces '(my-green-face)) ;; -;; Faces like bold-italic that are both bold and italic should go in -;; *both* lists. +;; Faces like bold-italic that are both bold and italic should go in *both* +;; lists. ;; -;; ps-print keeps internal lists of which fonts are bold and which are -;; italic; these lists are built the first time you invoke ps-print. -;; For the sake of efficiency, the lists are built only once; the same -;; lists are referred in later invocations of ps-print. +;; ps-print keeps internal lists of which fonts are bold and which are italic; +;; these lists are built the first time you invoke ps-print. +;; For the sake of efficiency, the lists are built only once; the same lists +;; are referred in later invocations of ps-print. ;; -;; Because these lists are built only once, it's possible for them to -;; get out of sync, if a face changes, or if new faces are added. To -;; get the lists back in sync, you can set the variable -;; `ps-build-face-reference' to t, and the lists will be rebuilt the -;; next time ps-print is invoked. If you need that the lists always be -;; rebuilt when ps-print is invoked, set the variable +;; Because these lists are built only once, it's possible for them to get out +;; of sync, if a face changes, or if new faces are added. To get the lists +;; back in sync, you can set the variable `ps-build-face-reference' to t, and +;; the lists will be rebuilt the next time ps-print is invoked. If you need +;; that the lists always be rebuilt when ps-print is invoked, set the variable ;; `ps-always-build-face-reference' to t. ;; ;; If you need to print without worrying about face background color, set the @@ -972,26 +1075,28 @@ Please send all bug fixes and enhancements to ;; (face...) list of faces whose background color will be used. ;; ;; Any other value will be treated as t. -;; The default value is t. +;; The default value is nil. ;; ;; ;; How Ps-Print Deals With Color ;; ----------------------------- ;; -;; ps-print detects faces with foreground and background colors -;; defined and embeds color information in the PostScript image. -;; The default foreground and background colors are defined by the -;; variables `ps-default-fg' and `ps-default-bg'. -;; On black-and-white printers, colors are displayed in gray scale. +;; ps-print detects faces with foreground and background colors defined and +;; embeds color information in the PostScript image. +;; The default foreground and background colors are defined by the variables +;; `ps-default-fg' and `ps-default-bg'. +;; On black/white printers, colors are displayed in gray scale. ;; To turn off color output, set `ps-print-color-p' to nil. +;; You can also set `ps-print-color-p' to 'black-white to have a better looking +;; on black/white printers. See also `ps-black-white-faces' for documentation. ;; ;; ;; How Ps-Print Maps Faces ;; ----------------------- ;; -;; As ps-print uses PostScript to print buffers, it is possible to have -;; other attributes associated with faces. So the new attributes used -;; by ps-print are: +;; As ps-print uses PostScript to print buffers, it is possible to have other +;; attributes associated with faces. So the new attributes used by ps-print +;; are: ;; ;; strikeout - like underline, but the line is in middle of text. ;; overline - like underline, but the line is over the text. @@ -1006,8 +1111,8 @@ Please send all bug fixes and enhancements to ;; ;; (ps-extend-face '(font-lock-keyword-face "RoyalBlue" nil bold) 'MERGE) ;; -;; If you want to use a new face, define it first with `defface', -;; and then call `ps-extend-face' to specify how to print it. +;; If you want to use a new face, define it first with `defface', and then call +;; `ps-extend-face' to specify how to print it. ;; ;; ;; How Ps-Print Has A Text And/Or Image On Background @@ -1044,7 +1149,7 @@ Please send all bug fixes and enhancements to ;; '(("~/images/EPS-image1.ps" ;; "LeftMargin" "BottomMargin") ; X and Y position (lower left corner) ;; ("~/images/EPS-image2.ps" -;; "LeftMargin" "BottomMargin PrintHeight 2 div add" ; X and Y position +;; "LeftMargin" "BottomMargin PrintHeight 2 div add" ; X and Y pos. ;; ; (upper left corner) ;; nil nil nil ;; 5 (11 . 17)) ; page list @@ -1072,18 +1177,18 @@ Please send all bug fixes and enhancements to ;; ;; `ps-setup' returns (some part of) the current setup. ;; -;; To avoid wrapping too many lines, you may want to adjust the -;; left and right margins and the font size. On UN*X systems, do: +;; To avoid wrapping too many lines, you may want to adjust the left and right +;; margins and the font size. On UN*X systems, do: ;; pr -t file | awk '{printf "%3d %s\n", length($0), $0}' | sort -r | head ;; to determine the longest lines of your file. -;; Then, the command `ps-line-lengths' will give you the correspondence -;; between a line length (number of characters) and the maximum font -;; size which doesn't wrap such a line with the current ps-print setup. +;; Then, the command `ps-line-lengths' will give you the correspondence between +;; a line length (number of characters) and the maximum font size which doesn't +;; wrap such a line with the current ps-print setup. ;; -;; The commands `ps-nb-pages-buffer' and `ps-nb-pages-region' display -;; the correspondence between a number of pages and the maximum font -;; size which allow the number of lines of the current buffer or of -;; its current region to fit in this number of pages. +;; The commands `ps-nb-pages-buffer' and `ps-nb-pages-region' display the +;; correspondence between a number of pages and the maximum font size which +;; allow the number of lines of the current buffer or of its current region to +;; fit in this number of pages. ;; ;; NOTE: line folding is not taken into account in this process and could ;; change the results. @@ -1106,7 +1211,31 @@ Please send all bug fixes and enhancements to ;; New since version 2.8 ;; --------------------- ;; -;; [vinicius] Vinicius Jose Latorre +;; [vinicius] Vinicius Jose Latorre +;; +;; 20040229 +;; `ps-time-stamp-yyyy-mm-dd', `ps-time-stamp-iso8601' +;; +;; 20010619 +;; `ps-time-stamp-locale-default' +;; +;; 20010530 +;; Handle before-string and after-string overlay properties. +;; +;; 20010407 +;; `ps-line-number-color', `ps-print-footer', `ps-footer-offset', +;; `ps-print-footer-frame', `ps-footer-font-family', +;; `ps-footer-font-size', `ps-footer-line-pad', `ps-footer-lines', +;; `ps-left-footer', `ps-right-footer', `ps-footer-frame-alist' and +;; `ps-header-frame-alist'. +;; +;; 20010328 +;; `ps-line-spacing', `ps-paragraph-spacing', `ps-paragraph-regexp', +;; `ps-begin-cut-regexp' and `ps-end-cut-regexp'. +;; +;; 20001122 +;; `ps-line-number-font', `ps-line-number-font-size' and +;; `ps-end-with-control-d'. ;; ;; 20000821 ;; `ps-even-or-odd-pages' @@ -1135,9 +1264,9 @@ Please send all bug fixes and enhancements to ;; ;; [keinichi] 19990509 Kein'ichi Handa ;; -;; `ps-print-region-function' +;; `ps-print-region-function' ;; -;; [vinicius] Vinicius Jose Latorre +;; [vinicius] Vinicius Jose Latorre ;; ;; 19990301 ;; PostScript tumble and setpagedevice. @@ -1148,9 +1277,9 @@ Please send all bug fixes and enhancements to ;; ;; [keinichi] 19980819 Kein'ichi Handa ;; -;; Multi-byte buffer handling. +;; Multi-byte buffer handling. ;; -;; [vinicius] Vinicius Jose Latorre +;; [vinicius] Vinicius Jose Latorre ;; ;; 19980306 ;; Skip invisible text. @@ -1182,20 +1311,19 @@ Please send all bug fixes and enhancements to ;; Known bugs and limitations of ps-print ;; -------------------------------------- ;; -;; Although color printing will work in XEmacs 19.12, it doesn't work -;; well; in particular, bold or italic fonts don't print in the right -;; background color. +;; Although color printing will work in XEmacs 19.12, it doesn't work well; in +;; particular, bold or italic fonts don't print in the right background color. ;; ;; Invisible properties aren't correctly ignored in XEmacs 19.12. ;; -;; Automatic font-attribute detection doesn't work well, especially -;; with hilit19 and older versions of get-create-face. Users having -;; problems with auto-font detection should use the lists -;; `ps-italic-faces', `ps-bold-faces' and `ps-underlined-faces' and/or -;; turn off automatic detection by setting `ps-auto-font-detect' to nil. +;; Automatic font-attribute detection doesn't work well, especially with +;; hilit19 and older versions of get-create-face. Users having problems with +;; auto-font detection should use the lists `ps-italic-faces', `ps-bold-faces' +;; and `ps-underlined-faces' and/or turn off automatic detection by setting +;; `ps-auto-font-detect' to nil. ;; -;; Automatic font-attribute detection doesn't work with XEmacs 19.12 -;; in tty mode; use the lists `ps-italic-faces', `ps-bold-faces' and +;; Automatic font-attribute detection doesn't work with XEmacs 19.12 in tty +;; mode; use the lists `ps-italic-faces', `ps-bold-faces' and ;; `ps-underlined-faces' instead. ;; ;; Still too slow; could use some hand-optimization. @@ -1204,12 +1332,12 @@ Please send all bug fixes and enhancements to ;; ;; Faces are always treated as opaque. ;; -;; Epoch and Emacs 19 not supported. At all. +;; Epoch, Lucid and Emacs 19 not supported. At all. ;; ;; Fixed-pitch fonts work better for line folding, but are not required. ;; -;; `ps-nb-pages-buffer' and `ps-nb-pages-region' don't take care -;; of folding lines. +;; `ps-nb-pages-buffer' and `ps-nb-pages-region' don't take care of folding +;; lines. ;; ;; ;; Things to change @@ -1218,12 +1346,23 @@ Please send all bug fixes and enhancements to ;; Avoid page break inside a paragraph. ;; Add `ps-non-bold-faces' and `ps-non-italic-faces' (should be easy). ;; Improve the memory management for big files (hard?). -;; `ps-nb-pages-buffer' and `ps-nb-pages-region' should take care -;; of folding lines. +;; `ps-nb-pages-buffer' and `ps-nb-pages-region' should take care of folding +;; lines. ;; ;; -;; Acknowledgements -;; ---------------- +;; Acknowledgments +;; --------------- +;; +;; Thanks to Adam Doppelt for face mapping suggestion +;; for black/white PostScript printers. +;; +;; Thanks to Toni Ronkko for line and paragraph spacing, +;; region to cut out when printing and footer suggestions. +;; +;; Thanks to Pavel Janik ml for documentation correction. +;; +;; Thanks to Corinne Ilvedson for line number font size +;; suggestion. ;; ;; Thanks to Gord Wait for ;; `ps-user-defined-prologue' example setting for HP PostScript printer. @@ -1234,12 +1373,15 @@ Please send all bug fixes and enhancements to ;; Thanks to David X Callaway for helping debugging PostScript ;; level 1 compatibility. ;; -;; Thanks to Colin Marquardt for upside-down, -;; line number step, line number start and zebra stripe follow suggestions, and -;; for XEmacs beta-tests. +;; Thanks to Colin Marquardt for: +;; - upside-down, line number step, line number start and zebra stripe +;; follow suggestions. +;; - `ps-time-stamp-yyyy-mm-dd' and `ps-time-stamp-iso8601' suggestion. +;; - and for XEmacs beta-tests. ;; ;; Thanks to Klaus Berndl for user defined PostScript -;; prologue code suggestion and for odd/even printing suggestion. +;; prologue code suggestion, for odd/even printing suggestion and for +;; `ps-prologue-file' enhancement. ;; ;; Thanks to Kein'ichi Handa for multi-byte buffer handling. ;; @@ -1270,99 +1412,143 @@ Please send all bug fixes and enhancements to ;; * XEmacs compatibility: William J. Henney ;; * Check `ps-paper-type': Sudhakar Frederick ;; -;; Thanks to Jacques Duthen (Jack) for the 3.4 version -;; I started from. [vinicius] +;; Thanks to Jacques Duthen (Jack) for version 3.4 I +;; started from. [vinicius] ;; -;; Thanks to Jim Thompson for the 2.8 version I started from. -;; [jack] +;; Thanks to Jim Thompson for the 2.8 version I started from. [jack] ;; -;; Thanks to Kevin Rodgers for adding support for -;; color and the invisible property. +;; Thanks to Kevin Rodgers for adding support for color and +;; the invisible property. ;; -;; Thanks to Avishai Yacobi, avishaiy@mcil.comm.mot.com, for writing -;; the initial port to Emacs 19. His code is no longer part of -;; ps-print, but his work is still appreciated. +;; Thanks to Avishai Yacobi, avishaiy@mcil.comm.mot.com, for writing the +;; initial port to Emacs 19. His code is no longer part of ps-print, but his +;; work is still appreciated. ;; -;; Thanks to Remi Houdaille and Michel Train, michel@metasoft.fdn.org, -;; for adding underline support. Their code also is no longer part of -;; ps-print, but their efforts are not forgotten. +;; Thanks to Remi Houdaille and Michel Train, michel@metasoft.fdn.org, for +;; adding underline support. Their code also is no longer part of ps-print, +;; but their efforts are not forgotten. ;; -;; Thanks also to all of you who mailed code to add features to -;; ps-print; although I didn't use your code, I still appreciate your -;; sharing it with me. +;; Thanks also to all of you who mailed code to add features to ps-print; +;; although I didn't use your code, I still appreciate your sharing it with me. ;; ;; Thanks to all who mailed comments, encouragement, and criticism. -;; Thanks also to all who responded to my survey; I had too many -;; responses to reply to them all, but I greatly appreciate your -;; interest. +;; Thanks also to all who responded to my survey; I had too many responses to +;; reply to them all, but I greatly appreciate your interest. ;; ;; Jim ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Code: -(unless (featurep 'lisp-float-type) - (error "`ps-print' requires floating point support")) +(eval-and-compile + (require 'lpr) + (or (featurep 'lisp-float-type) + (error "`ps-print' requires floating point support")) -;; For Emacs 20.2 and the earlier version. -(or (fboundp 'set-buffer-multibyte) - (defun set-buffer-multibyte (arg) - (setq enable-multibyte-characters arg))) + (defvar ps-print-emacs-type + (let ((case-fold-search t)) + (cond ((string-match "XEmacs" emacs-version) 'xemacs) + ((string-match "Lucid" emacs-version) + (error "`ps-print' doesn't support Lucid")) + ((string-match "Epoch" emacs-version) + (error "`ps-print' doesn't support Epoch")) + (t + (unless (and (boundp 'emacs-major-version) + (> emacs-major-version 19)) + (error "`ps-print' only supports Emacs 20 and higher")) + 'emacs)))) -(or (fboundp 'string-as-unibyte) - (defun string-as-unibyte (arg) arg)) -(or (fboundp 'string-as-multibyte) - (defun string-as-multibyte (arg) arg)) + ;; For Emacs 20.2 and the earlier version. -(or (fboundp 'char-charset) - (defun char-charset (arg) 'ascii)) + (or (fboundp 'set-buffer-multibyte) + (defun set-buffer-multibyte (arg) + (setq enable-multibyte-characters arg))) -(or (fboundp 'charset-after) - (defun charset-after (&optional arg) - (char-charset (char-after arg)))) + (or (fboundp 'string-as-unibyte) + (defun string-as-unibyte (arg) arg)) + (or (fboundp 'string-as-multibyte) + (defun string-as-multibyte (arg) arg)) -;; GNU Emacs -(or (fboundp 'line-beginning-position) - (defun line-beginning-position (&optional n) - (save-excursion - (and n (/= n 1) (forward-line (1- n))) - (beginning-of-line) - (point)))) + (or (fboundp 'char-charset) + (defun char-charset (arg) 'ascii)) + (or (fboundp 'charset-after) + (defun charset-after (&optional arg) + (char-charset (char-after arg)))) -;; to avoid compilation gripes -;; XEmacs -(defalias 'ps-x-color-instance-p 'color-instance-p) -(defalias 'ps-x-color-instance-rgb-components 'color-instance-rgb-components) -(defalias 'ps-x-color-name 'color-name) -(defalias 'ps-x-color-specifier-p 'color-specifier-p) -(defalias 'ps-x-copy-coding-system 'copy-coding-system) -(defalias 'ps-x-device-class 'device-class) -(defalias 'ps-x-extent-end-position 'extent-end-position) -(defalias 'ps-x-extent-face 'extent-face) -(defalias 'ps-x-extent-priority 'extent-priority) -(defalias 'ps-x-extent-start-position 'extent-start-position) -(defalias 'ps-x-face-font-instance 'face-font-instance) -(defalias 'ps-x-find-coding-system 'find-coding-system) -(defalias 'ps-x-font-instance-properties 'font-instance-properties) -(defalias 'ps-x-make-color-instance 'make-color-instance) -(defalias 'ps-x-map-extents 'map-extents) - -;; GNU Emacs -(if (fboundp 'find-composition) - (defalias 'ps-e-find-composition 'find-composition) - (defalias 'ps-e-find-composition 'ignore)) - - -(defconst ps-windows-system - (memq system-type '(emx win32 w32 mswindows ms-dos windows-nt))) -(defconst ps-lp-system - (memq system-type '(usq-unix-v dgux hpux irix))) + ;; GNU Emacs + (or (fboundp 'line-beginning-position) + (defun line-beginning-position (&optional n) + (save-excursion + (and n (/= n 1) (forward-line (1- n))) + (beginning-of-line) + (point)))) + + + ;; to avoid compilation gripes + + ;; XEmacs + (defalias 'ps-x-color-instance-p 'color-instance-p) + (defalias 'ps-x-color-instance-rgb-components 'color-instance-rgb-components) + (defalias 'ps-x-color-name 'color-name) + (defalias 'ps-x-color-specifier-p 'color-specifier-p) + (defalias 'ps-x-copy-coding-system 'copy-coding-system) + (defalias 'ps-x-device-class 'device-class) + (defalias 'ps-x-extent-end-position 'extent-end-position) + (defalias 'ps-x-extent-face 'extent-face) + (defalias 'ps-x-extent-priority 'extent-priority) + (defalias 'ps-x-extent-start-position 'extent-start-position) + (defalias 'ps-x-face-font-instance 'face-font-instance) + (defalias 'ps-x-find-coding-system 'find-coding-system) + (defalias 'ps-x-font-instance-properties 'font-instance-properties) + (defalias 'ps-x-make-color-instance 'make-color-instance) + (defalias 'ps-x-map-extents 'map-extents) + + ;; GNU Emacs + (defalias 'ps-e-face-bold-p 'face-bold-p) + (defalias 'ps-e-face-italic-p 'face-italic-p) + (defalias 'ps-e-next-overlay-change 'next-overlay-change) + (defalias 'ps-e-overlays-at 'overlays-at) + (defalias 'ps-e-overlay-get 'overlay-get) + (defalias 'ps-e-overlay-end 'overlay-end) + (defalias 'ps-e-x-color-values 'x-color-values) + (defalias 'ps-e-color-values 'color-values) + (if (fboundp 'find-composition) + (defalias 'ps-e-find-composition 'find-composition) + (defalias 'ps-e-find-composition 'ignore)) + + + (defconst ps-windows-system + (memq system-type '(emx win32 w32 mswindows ms-dos windows-nt))) + (defconst ps-lp-system + (memq system-type '(usg-unix-v dgux hpux irix))) + + + (defun ps-xemacs-color-name (color) + (if (ps-x-color-specifier-p color) + (ps-x-color-name color) + color)) + + + (cond ((eq ps-print-emacs-type 'emacs) ; emacs + (defvar mark-active nil) + (defun ps-mark-active-p () + mark-active) + (defalias 'ps-face-foreground-name 'face-foreground) + (defalias 'ps-face-background-name 'face-background) + ) + (t ; xemacs + (defalias 'ps-mark-active-p 'region-active-p) + (defun ps-face-foreground-name (face) + (ps-xemacs-color-name (face-foreground face))) + (defun ps-face-background-name (face) + (ps-xemacs-color-name (face-background face))) + ))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1396,9 +1582,9 @@ Please send all bug fixes and enhancements to :group 'ps-print) (defgroup ps-print-headers nil - "Headers layout" + "Headers & footers layout" :prefix "ps-" - :tag "Header" + :tag "Header & Footer" :group 'ps-print) (defgroup ps-print-font nil @@ -1438,7 +1624,7 @@ Please send all bug fixes and enhancements to :tag "Background" :group 'ps-print) -(defgroup ps-print-printer nil +(defgroup ps-print-printer '((lpr custom-group)) "Printer customization" :prefix "ps-" :tag "Printer" @@ -1495,8 +1681,8 @@ It's strongly recommended only insert PostScript code and/or comments specific for your printing system particularities. For example, some special initialization that only your printing system needs. -Do not insert code for duplex printing, n-up printing or error handler, ps-print -handles this in a suitable way. +Do not insert code for duplex printing, n-up printing or error handler, +ps-print handles this in a suitable way. For more information about PostScript, see: PostScript Language Reference Manual (2nd edition) @@ -1507,8 +1693,7 @@ As an example for `ps-user-defined-prologue' setting: ;; Setting for HP PostScript printer (setq ps-user-defined-prologue (concat \"<> setpagedevice\")) -" + \"/MediaPosition 2 /MediaType (Plain)>> setpagedevice\"))" :type '(choice :menu-tag "User Defined Prologue" :tag "User Defined Prologue" (const :tag "none" nil) string symbol) @@ -1517,18 +1702,18 @@ As an example for `ps-user-defined-prologue' setting: (defcustom ps-print-prologue-header nil "*PostScript prologue header comments besides that ps-print generates. -`ps-print-prologue-header' may be a string or a symbol function which -returns a string. Note that this string is inserted on PostScript prologue -header section which is used to define some document characteristic through -PostScript special comments, like \"%%Requirements: jog\\n\". +`ps-print-prologue-header' may be a string or a symbol function which returns a +string. Note that this string is inserted on PostScript prologue header +section which is used to define some document characteristic through PostScript +special comments, like \"%%Requirements: jog\\n\". ps-print always inserts the %%Requirements: comment, so if you need to insert more requirements put them first in `ps-print-prologue-header' using the \"%%+\" comment. For example, if you need to set numcopies to 3 and jog on requirements and set %%LanguageLevel: to 2, do: -(setq ps-print-prologue-header - \"%%+ numcopies(3) jog\\n%%LanguageLevel: 2\\n\") + (setq ps-print-prologue-header + \"%%+ numcopies(3) jog\\n%%LanguageLevel: 2\\n\") The duplex requirement is inserted by ps-print (see `ps-spool-duplex'). @@ -1544,7 +1729,7 @@ For more information about PostScript document comments, see: :group 'ps-print-miscellany) (defcustom ps-printer-name (and (boundp 'printer-name) - printer-name) + (symbol-value 'printer-name)) "*The name of a local printer for printing PostScript files. On Unix-like systems, a string value should be a name understood by lpr's -P @@ -1554,7 +1739,7 @@ On MS-DOS and MS-Windows systems, a string value is taken as the name of the printer device or port to which PostScript files are written, provided `ps-lpr-command' is \"\". By default it is the same as `printer-name'; typical non-default settings would be \"LPT1\" to \"LPT3\" for parallel printers, or -\"COM1\" to \"COM4\" or \"AUX\" for serial printers, or \"//hostname/printer\" +\"COM1\" to \"COM4\" or \"AUX\" for serial printers, or \"\\\\hostname\\printer\" for a shared network printer. You can also set it to a name of a file, in which case the output gets appended to that file. \(Note that `ps-print' package already has facilities for printing to a file, so you might as well use @@ -1583,24 +1768,26 @@ See also `ps-printer-name-option' for documentation." "-P" )) "*Option for `ps-printer-name' variable (see it). -On Unix-like systems, if it's been used lpr utility, it should be the string -\"-P\"; if it's been used lp utility, it should be the string \"-d\". +On Unix-like systems, if `lpr' is in use, this should be the string +\"-P\"; if `lp' is in use, this should be the string \"-d\". -On MS-DOS and MS-Windows systems, if it's been used print utility, it should be +On MS-DOS and MS-Windows systems, if `print' is in use, this should be the string \"/D:\". -For any other printing utility, see the proper manual or documentation. +For any other printing utility, see its documentation. -Set to \"\" or nil, if the utility given by `ps-lpr-command' needs an empty -option printer name option. +Set this to \"\" or nil, if the utility given by `ps-lpr-command' +needs an empty printer name option--that is, pass the printer name +with no special option preceding it. -Any other value is treated as nil, that is, an empty printer name option. +Any value that is not a string is treated as nil. This variable is used only when `ps-printer-name' is a non-empty string." :type '(choice :menu-tag "Printer Name Option" :tag "Printer Name Option" (const :tag "None" nil) (string :tag "Option")) + :version "21.1" :group 'ps-print-printer) (defcustom ps-lpr-command lpr-command @@ -1618,14 +1805,16 @@ an explicit filename is given as the last argument." (defcustom ps-lpr-switches lpr-switches "*A list of extra switches to pass to `ps-lpr-command'." :type '(repeat :tag "PostScript lpr Switches" - (choice string symbol (repeat sexp))) + (choice :menu-tag "PostScript lpr Switch" + :tag "PostScript lpr Switch" + string symbol (repeat sexp))) :group 'ps-print-printer) (defcustom ps-print-region-function nil "*Specify a function to print the region on a PostScript printer. -See definition of `call-process-region' for calling conventions. The fourth and -the sixth arguments are both nil." - :type 'function +See definition of `call-process-region' for calling conventions. The fourth +and the sixth arguments are both nil." + :type '(choice (const nil) function) :group 'ps-print-printer) (defcustom ps-manual-feed nil @@ -1635,6 +1824,12 @@ If it's nil, automatic feeding takes place." :type 'boolean :group 'ps-print-printer) +(defcustom ps-end-with-control-d (and ps-windows-system t) + "*Non-nil means insert C-d at end of PostScript file generated." + :version "21.1" + :type 'boolean + :group 'ps-print-printer) + ;;; Page layout ;; All page dimensions are in PostScript points. @@ -1655,6 +1850,7 @@ If it's nil, automatic feeding takes place." ;; B4 10.125 inch x 14.33 inch ;; B5 7.16 inch x 10.125 inch +;;;###autoload (defcustom ps-page-dimensions-database (list (list 'a4 (/ (* 72 21.0) 2.54) (/ (* 72 29.7) 2.54) "A4") (list 'a3 (/ (* 72 29.7) 2.54) (/ (* 72 42.0) 2.54) "A3") @@ -1703,26 +1899,29 @@ It's used when `ps-spool-config' is set to `setpagedevice'." :group 'ps-print-page) (defcustom ps-print-upside-down nil - "*Non-nil means print upside-down." + "*Non-nil means print upside-down (that is, rotated by 180 degrees)." :type 'boolean + :version "21.1" :group 'ps-print-page) (defcustom ps-selected-pages nil "*Specify which pages to print. -If it's nil, all pages are printed. +If nil, print all pages. -If it's a list, the list element may be an integer or a cons cell (FROM . TO) +If a list, the lists element may be an integer or a cons cell (FROM . TO) designating FROM page to TO page; any invalid element is ignored, that is, an integer lesser than one or if FROM is greater than TO. Otherwise, it's treated as nil. -After ps-print processing `ps-selected-pages' is set to nil. But the latest -`ps-selected-pages' is saved in `ps-last-selected-pages' (see it for -documentation). So you can restore the latest selected pages by using -`ps-last-selected-pages' or by calling `ps-restore-selected-pages' command (see -it for documentation)." +After ps-print processing `ps-selected-pages' is set to nil. But the +latest `ps-selected-pages' is saved in `ps-last-selected-pages' (which +see). So you can restore the latest selected pages by using +`ps-last-selected-pages' or with the `ps-restore-selected-pages' +command (which see). + +See also `ps-even-or-odd-pages'." :type '(repeat :tag "Selected Pages" (radio :tag "Page" (integer :tag "Number") @@ -1738,16 +1937,55 @@ Valid values are: nil print all pages. - `even' print only even pages. + `even-page' print only even pages. - `odd' print only odd pages. + `odd-page' print only odd pages. -Any other value is treated as nil." + `even-sheet' print only even sheets. + That is, if `ps-n-up-printing' is 1, it behaves as `even-page'; + but for values greater than 1, it'll print only the even sheet + of paper. + + `odd-sheet' print only odd sheets. + That is, if `ps-n-up-printing' is 1, it behaves as `odd-page'; + but for values greater than 1, it'll print only the odd sheet + of paper. + +Any other value is treated as nil. + +If you set `ps-selected-pages' (see it for documentation), first the pages are +filtered by `ps-selected-pages' and then by `ps-even-or-odd-pages'. For +example, if we have: + + (setq ps-selected-pages '(1 4 (6 . 10) (12 . 16) 20)) + +Combining with `ps-even-or-odd-pages' and `ps-n-up-printing', we have: + +`ps-n-up-printing' = 1: + `ps-even-or-odd-pages' PAGES PRINTED + nil 1, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 20 + even-page 4, 6, 8, 10, 12, 14, 16, 20 + odd-page 1, 7, 9, 13, 15 + even-sheet 4, 6, 8, 10, 12, 14, 16, 20 + odd-sheet 1, 7, 9, 13, 15 + +`ps-n-up-printing' = 2: + `ps-even-or-odd-pages' PAGES PRINTED + nil 1/4, 6/7, 8/9, 10/12, 13/14, 15/16, 20 + even-page 4/6, 8/10, 12/14, 16/20 + odd-page 1/7, 9/13, 15 + even-sheet 6/7, 10/12, 15/16 + odd-sheet 1/4, 8/9, 13/14, 20 + +So even-page/odd-page are about page parity and even-sheet/odd-sheet are about +sheet parity." :type '(choice :menu-tag "Print Even/Odd Pages" :tag "Print Even/Odd Pages" (const :tag "All Pages" nil) - (const :tag "Only Even Pages" even) - (const :tag "Only Odd Pages" odd)) + (const :tag "Only Even Pages" even-page) + (const :tag "Only Odd Pages" odd-page) + (const :tag "Only Even Sheets" even-sheet) + (const :tag "Only Odd Sheets" odd-sheet)) :group 'ps-print-page) (defcustom ps-print-control-characters 'control-8-bit @@ -1838,7 +2076,7 @@ Any other value is treated as `left-top'." :group 'ps-print-n-up) (defcustom ps-number-of-columns (if ps-landscape-mode 2 1) - "*Specify the number of columns" + "*Specify the number of columns." :type 'number :group 'ps-print-miscellany) @@ -1868,36 +2106,46 @@ See also documentation for `ps-zebra-stripes' and `ps-zebra-stripe-height'." :group 'ps-print-zebra) (defcustom ps-zebra-stripe-follow nil - "*Non-nil means zebra stripe continues on next page. - -If `ps-zebra-stripe-follow' is nil, zebra stripe is restarted on each page. -If `ps-zebra-stripe-follow' is non-nil, zebra stripe continues on next page. - -Visually, we have: - - `ps-zebra-stripe-follow' `ps-zebra-stripe-follow' - is nil is non-nil - Current Page ------------------------ ------------------------ - 1 XXXXXXXXXXXXXXXXXXXXX 1 XXXXXXXXXXXXXXXXXXXXX - 2 XXXXXXXXXXXXXXXXXXXXX 2 XXXXXXXXXXXXXXXXXXXXX - 3 XXXXXXXXXXXXXXXXXXXXX 3 XXXXXXXXXXXXXXXXXXXXX - 4 4 - 5 5 - 6 6 - 7 XXXXXXXXXXXXXXXXXXXXX 7 XXXXXXXXXXXXXXXXXXXXX - 8 XXXXXXXXXXXXXXXXXXXXX 8 XXXXXXXXXXXXXXXXXXXXX - ------------------------ ------------------------ - Next Page ------------------------ ------------------------ - 9 XXXXXXXXXXXXXXXXXXXXX 9 XXXXXXXXXXXXXXXXXXXXX - 10 XXXXXXXXXXXXXXXXXXXXX 10 - 11 XXXXXXXXXXXXXXXXXXXXX 11 - 12 12 - 13 13 XXXXXXXXXXXXXXXXXXXXX - 14 14 XXXXXXXXXXXXXXXXXXXXX - 15 XXXXXXXXXXXXXXXXXXXXX 15 XXXXXXXXXXXXXXXXXXXXX - 16 XXXXXXXXXXXXXXXXXXXXX 16 - ------------------------ ------------------------" - :type 'boolean + "*Specify how zebra stripes continue on next page. + +Visually, valid values are (the character `+' at right of each column indicates +that a line is printed): + + `nil' `follow' `full' `full-follow' + Current Page -------- ----------- --------- ---------------- + 1 XXXXX + 1 XXXXXXXX + 1 XXXXXX + 1 XXXXXXXXXXXXX + + 2 XXXXX + 2 XXXXXXXX + 2 XXXXXX + 2 XXXXXXXXXXXXX + + 3 XXXXX + 3 XXXXXXXX + 3 XXXXXX + 3 XXXXXXXXXXXXX + + 4 + 4 + 4 + 4 + + 5 + 5 + 5 + 5 + + 6 + 6 + 6 + 6 + + 7 XXXXX + 7 XXXXXXXX + 7 XXXXXX + 7 XXXXXXXXXXXXX + + 8 XXXXX + 8 XXXXXXXX + 8 XXXXXX + 8 XXXXXXXXXXXXX + + 9 XXXXX + 9 XXXXXXXX + 9 XXXXXX + 9 XXXXXXXXXXXXX + + 10 + 10 + + 11 + 11 + + -------- ----------- --------- ---------------- + Next Page -------- ----------- --------- ---------------- + 12 XXXXX + 12 + 10 XXXXXX + 10 + + 13 XXXXX + 13 XXXXXXXX + 11 XXXXXX + 11 + + 14 XXXXX + 14 XXXXXXXX + 12 XXXXXX + 12 + + 15 + 15 XXXXXXXX + 13 + 13 XXXXXXXXXXXXX + + 16 + 16 + 14 + 14 XXXXXXXXXXXXX + + 17 + 17 + 15 + 15 XXXXXXXXXXXXX + + 18 XXXXX + 18 + 16 XXXXXX + 16 + + 19 XXXXX + 19 XXXXXXXX + 17 XXXXXX + 17 + + 20 XXXXX + 20 XXXXXXXX + 18 XXXXXX + 18 + + 21 + 21 XXXXXXXX + + 22 + 22 + + -------- ----------- --------- ---------------- + +Any other value is treated as nil." + :type '(choice :menu-tag "Zebra Stripe Follow" + :tag "Zebra Stripe Follow" + (const :tag "Always Restart" nil) + (const :tag "Continue on Next Page" follow) + (const :tag "Print Only Full Stripe" full) + (const :tag "Continue on Full Stripe" full-follow)) :group 'ps-print-zebra) (defcustom ps-line-number nil @@ -1924,8 +2172,8 @@ Valid values are: printed. If it's lesser than or equal to zero, it's used the value 1. - `zebra' specifies that only the line number of the first line in a zebra - stripe is to be printed. + `zebra' specifies that only the line number of the first line in a + zebra stripe is to be printed. Any other value is treated as `zebra'." :type '(choice :menu-tag "Line Number Step" @@ -1954,8 +2202,8 @@ set to 3, the printing will look like: The values for `ps-line-number-start': - * If `ps-line-number-step' is an integer, must be between 1 and the value - of `ps-line-number-step' inclusive. + * If `ps-line-number-step' is an integer, must be between 1 and the value of + `ps-line-number-step' inclusive. * If `ps-line-number-step' is set to `zebra', must be between 1 and the value of `ps-zebra-strip-height' inclusive. Use this combination if you @@ -1983,13 +2231,13 @@ If XSCALE and YSCALE are nil, the original size is used. ROTATION is the image rotation angle; if nil, the default is 0. PAGES designates the page to print background image. -PAGES may be a number or a cons cell (FROM . TO) designating FROM page -to TO page. +PAGES may be a number or a cons cell (FROM . TO) designating FROM page to TO +page. If PAGES is nil, print background image on all pages. -X, Y, XSCALE, YSCALE and ROTATION may be a floating point number, -an integer number or a string. If it is a string, the string should contain -PostScript programming that returns a float or integer value. +X, Y, XSCALE, YSCALE and ROTATION may be a floating point number, an integer +number or a string. If it is a string, the string should contain PostScript +programming that returns a float or integer value. For example, if you wish to print an EPS image on all pages do: @@ -2029,17 +2277,17 @@ FONTSIZE is font size to be used, if nil, 200 is used. GRAY is the text gray factor (should be very light like 0.8). If nil, the default is 0.85. -ROTATION is the text rotation angle; if nil, the angle is given by -the diagonal from lower left corner to upper right corner. +ROTATION is the text rotation angle; if nil, the angle is given by the diagonal +from lower left corner to upper right corner. PAGES designates the page to print background text. -PAGES may be a number or a cons cell (FROM . TO) designating FROM page -to TO page. +PAGES may be a number or a cons cell (FROM . TO) designating FROM page to TO +page. If PAGES is nil, print background text on all pages. -X, Y, FONTSIZE, GRAY and ROTATION may be a floating point number, -an integer number or a string. If it is a string, the string should contain -PostScript programming that returns a float or integer value. +X, Y, FONTSIZE, GRAY and ROTATION may be a floating point number, an integer +number or a string. If it is a string, the string should contain PostScript +programming that returns a float or integer value. For example, if you wish to print text \"Preliminary\" on all pages do: @@ -2113,27 +2361,31 @@ For example, if you wish to print text \"Preliminary\" on all pages do: :group 'ps-print-vertical) (defcustom ps-header-line-pad 0.15 - "*Portion of a header title line height to insert between the header frame -and the text it contains, both in the vertical and horizontal directions." + "*Portion of a header title line height to insert. +The insertion is done between the header frame and the text it contains, +both in the vertical and horizontal directions." + :type 'number + :group 'ps-print-vertical) + +(defcustom ps-footer-offset (/ (* 72 1.0) 2.54) ; 1.0 cm + "*Vertical space in points (1/72 inch) between the main text and the footer." :type 'number :group 'ps-print-vertical) -;;; Header setup +(defcustom ps-footer-line-pad 0.15 + "*Portion of a footer title line height to insert. +The insertion is done between the footer frame and the text it contains, +both in the vertical and horizontal directions." + :type 'number + :group 'ps-print-vertical) + +;;; Header/Footer setup (defcustom ps-print-header t "*Non-nil means print a header at the top of each page. -By default, the header displays the buffer name, page number, and, if -the buffer is visiting a file, the file's directory. Headers are -customizable by changing variables `ps-left-header' and -`ps-right-header'." - :type 'boolean - :group 'ps-print-headers) - -(defcustom ps-print-only-one-header nil - "*Non-nil means print only one header at the top of each page. -This is useful when printing more than one column, so it is possible -to have only one header over all columns or one header per column. -See also `ps-print-header'." +By default, the header displays the buffer name, page number, and, if the +buffer is visiting a file, the file's directory. Headers are customizable by +changing variables `ps-left-header' and `ps-right-header'." :type 'boolean :group 'ps-print-headers) @@ -2142,26 +2394,197 @@ See also `ps-print-header'." :type 'boolean :group 'ps-print-headers) +(defcustom ps-header-frame-alist + '((fore-color . 0.0) + (back-color . 0.9) + (border-width . 0.4) + (border-color . 0.0) + (shadow-color . 0.0)) + "*Specify header frame properties alist. + +Valid frame properties are: + + `fore-color' Specify the foreground frame color. + It should be a float number between 0.0 (black color) + and 1.0 (white color), a string which is a color name, + or a list of 3 float numbers which corresponds to the + Red Green Blue color scale, each float number between + 0.0 (dark color) and 1.0 (bright color). + + `back-color' Specify the background frame color (similar to + `fore-color'). + + `shadow-color' Specify the shadow color (similar to `fore-color'). + + `border-color' Specify the border color (similar to `fore-color'). + + `border-width' Specify the border width. + +Any other property is ignored. + +Don't change this alist directly, instead use customization, or `ps-value', +`ps-get', `ps-put' and `ps-del' functions (see them for documentation)." + :version "21.1" + :type '(repeat + (choice :menu-tag "Header Frame Element" + :tag "" + (cons :tag "Foreground Color" :format "%v" + (const :format "" fore-color) + (choice :menu-tag "Foreground Color" + :tag "Foreground Color" + (number :tag "Gray Scale" :value 0.0) + (string :tag "Color Name" :value "black") + (list :tag "RGB Color" :value (0.0 0.0 0.0) + (number :tag "Red") + (number :tag "Green") + (number :tag "Blue")))) + (cons :tag "Background Color" :format "%v" + (const :format "" back-color) + (choice :menu-tag "Background Color" + :tag "Background Color" + (number :tag "Gray Scale" :value 0.9) + (string :tag "Color Name" :value "gray90") + (list :tag "RGB Color" :value (0.9 0.9 0.9) + (number :tag "Red") + (number :tag "Green") + (number :tag "Blue")))) + (cons :tag "Border Width" :format "%v" + (const :format "" border-width) + (number :tag "Border Width" :value 0.4)) + (cons :tag "Border Color" :format "%v" + (const :format "" border-color) + (choice :menu-tag "Border Color" + :tag "Border Color" + (number :tag "Gray Scale" :value 0.0) + (string :tag "Color Name" :value "black") + (list :tag "RGB Color" :value (0.0 0.0 0.0) + (number :tag "Red") + (number :tag "Green") + (number :tag "Blue")))) + (cons :tag "Shadow Color" :format "%v" + (const :format "" shadow-color) + (choice :menu-tag "Shadow Color" + :tag "Shadow Color" + (number :tag "Gray Scale" :value 0.0) + (string :tag "Color Name" :value "black") + (list :tag "RGB Color" :value (0.0 0.0 0.0) + (number :tag "Red") + (number :tag "Green") + (number :tag "Blue")))))) + :group 'ps-print-headers) + (defcustom ps-header-lines 2 "*Number of lines to display in page header, when generating PostScript." :type 'integer :group 'ps-print-headers) +(defcustom ps-print-footer nil + "*Non-nil means print a footer at the bottom of each page. +By default, the footer displays page number. +Footers are customizable by changing variables `ps-left-footer' and +`ps-right-footer'." + :version "21.1" + :type 'boolean + :group 'ps-print-headers) + +(defcustom ps-print-footer-frame t + "*Non-nil means draw a gaudy frame around the footer." + :version "21.1" + :type 'boolean + :group 'ps-print-headers) + +(defcustom ps-footer-frame-alist + '((fore-color . 0.0) + (back-color . 0.9) + (border-width . 0.4) + (border-color . 0.0) + (shadow-color . 0.0)) + "*Specify footer frame properties alist. + +Don't change this alist directly, instead use customization, or `ps-value', +`ps-get', `ps-put' and `ps-del' functions (see them for documentation). + +See also `ps-header-frame-alist' for documentation." + :version "21.1" + :type '(repeat + (choice :menu-tag "Header Frame Element" + :tag "" + (cons :tag "Foreground Color" :format "%v" + (const :format "" fore-color) + (choice :menu-tag "Foreground Color" + :tag "Foreground Color" + (number :tag "Gray Scale" :value 0.0) + (string :tag "Color Name" :value "black") + (list :tag "RGB Color" :value (0.0 0.0 0.0) + (number :tag "Red") + (number :tag "Green") + (number :tag "Blue")))) + (cons :tag "Background Color" :format "%v" + (const :format "" back-color) + (choice :menu-tag "Background Color" + :tag "Background Color" + (number :tag "Gray Scale" :value 0.9) + (string :tag "Color Name" :value "gray90") + (list :tag "RGB Color" :value (0.9 0.9 0.9) + (number :tag "Red") + (number :tag "Green") + (number :tag "Blue")))) + (cons :tag "Border Width" :format "%v" + (const :format "" border-width) + (number :tag "Border Width" :value 0.4)) + (cons :tag "Border Color" :format "%v" + (const :format "" border-color) + (choice :menu-tag "Border Color" + :tag "Border Color" + (number :tag "Gray Scale" :value 0.0) + (string :tag "Color Name" :value "black") + (list :tag "RGB Color" :value (0.0 0.0 0.0) + (number :tag "Red") + (number :tag "Green") + (number :tag "Blue")))) + (cons :tag "Shadow Color" :format "%v" + (const :format "" shadow-color) + (choice :menu-tag "Shadow Color" + :tag "Shadow Color" + (number :tag "Gray Scale" :value 0.0) + (string :tag "Color Name" :value "black") + (list :tag "RGB Color" :value (0.0 0.0 0.0) + (number :tag "Red") + (number :tag "Green") + (number :tag "Blue")))))) + :group 'ps-print-headers) + +(defcustom ps-footer-lines 2 + "*Number of lines to display in page footer, when generating PostScript." + :version "21.1" + :type 'integer + :group 'ps-print-headers) + +(defcustom ps-print-only-one-header nil + "*Non-nil means print only one header/footer at the top/bottom of each page. +This is useful when printing more than one column, so it is possible to have +only one header/footer over all columns or one header/footer per column. +See also `ps-print-header' and `ps-print-footer'." + :type 'boolean + :group 'ps-print-headers) + (defcustom ps-switch-header 'duplex - "*Specify if headers are switched or not. + "*Specify if headers/footers are switched or not. Valid values are: -nil Never switch headers. +nil Never switch headers/footers. -t Always switch headers. +t Always switch headers/footers. -duplex Switch headers only when duplexing is on, that is, when +duplex Switch headers/footers only when duplexing is on, that is, when `ps-spool-duplex' is non-nil. -Any other value is treated as t." - :type '(choice :menu-tag "Switch Header" - :tag "Switch Header" +Any other value is treated as t. + +See also `ps-print-header' and `ps-print-footer'." + :type '(choice :menu-tag "Switch Header/Footer" + :tag "Switch Header/Footer" (const :tag "Never Switch" nil) (const :tag "Always Switch" t) (const :tag "Switch When Duplexing" duplex)) @@ -2178,7 +2601,7 @@ NOTE: page numbers are displayed as part of headers, (if ps-windows-system nil 'lpr-switches) - "*Specify who is responsable for setting duplex and page size switches. + "*Specify who is responsible for setting duplex and page size. Valid values are: @@ -2202,7 +2625,7 @@ WARNING: The setpagedevice PostScript operator affects ghostview utility when specified by setpagedevice, your printing will be aborted. So, if you need to use setpagedevice, set `ps-spool-config' to `setpagedevice', generate a test file and send it to your printer; if - the printed file isn't ok, set `ps-spool-config' to nil." + the printed file isn't OK, set `ps-spool-config' to nil." :type '(choice :menu-tag "Spool Config" :tag "Spool Config" (const lpr-switches) (const setpagedevice) @@ -2224,9 +2647,9 @@ See also `ps-spool-tumble'." (defcustom ps-spool-tumble nil "*Specify how the page images on opposite sides of a sheet are oriented. -If `ps-spool-tumble' is nil, produces output suitable for binding on the left or -right. If `ps-spool-tumble' is non-nil, produces output suitable for binding at -the top or bottom. +If `ps-spool-tumble' is nil, produces output suitable for binding on the left +or right. If `ps-spool-tumble' is non-nil, produces output suitable for +binding at the top or bottom. It has effect only when `ps-spool-duplex' is non-nil." :type 'boolean @@ -2338,44 +2761,48 @@ It has effect only when `ps-spool-duplex' is non-nil." (space-width . 2.2) (avg-char-width . 4.10811)) ) - "*Font info database: font family (the key), name, bold, italic, bold-italic, + "*Font info database. +Each element comprises: font family (the key), name, bold, italic, bold-italic, reference size, line height, space width, average character width. To get the info for another specific font (say Helvetica), do the following: - create a new buffer - generate the PostScript image to a file (C-u M-x ps-print-buffer) -- open this file and delete the leading `%' (which is the PostScript - comment character) from the line +- open this file and delete the leading `%' (which is the PostScript comment + character) from the line `% 3 cm 20 cm moveto 10/Courier ReportFontInfo showpage' to get the line `3 cm 20 cm moveto 10/Helvetica ReportFontInfo showpage' - add the values to `ps-font-info-database'. You can get all the fonts of YOUR printer using `ReportAllFontInfo'. -Note also that ps-print DOESN'T download any font to your printer, instead -it uses the fonts resident in your printer." - :type '(repeat (list :tag "Font Definition" - (symbol :tag "Font Family") - (cons :format "%v" - (const :format "" fonts) - (repeat :tag "Faces" - (cons (choice (const normal) - (const bold) - (const italic) - (const bold-italic) - (symbol :tag "Face")) - (string :tag "Font Name")))) - (cons :format "%v" - (const :format "" size) - (number :tag "Reference Size")) - (cons :format "%v" - (const :format "" line-height) - (number :tag "Line Height")) - (cons :format "%v" - (const :format "" space-width) - (number :tag "Space Width")) - (cons :format "%v" - (const :format "" avg-char-width) - (number :tag "Average Character Width")))) +Note also that ps-print DOESN'T download any font to your printer, instead it +uses the fonts resident in your printer." + :type '(repeat + (list :tag "Font Definition" + (symbol :tag "Font Family") + (cons :format "%v" + (const :format "" fonts) + (repeat :tag "Faces" + (cons (choice :menu-tag "Font Weight/Slant" + :tag "Font Weight/Slant" + (const normal) + (const bold) + (const italic) + (const bold-italic) + (symbol :tag "Face")) + (string :tag "Font Name")))) + (cons :format "%v" + (const :format "" size) + (number :tag "Reference Size")) + (cons :format "%v" + (const :format "" line-height) + (number :tag "Line Height")) + (cons :format "%v" + (const :format "" space-width) + (number :tag "Space Width")) + (cons :format "%v" + (const :format "" avg-char-width) + (number :tag "Average Character Width")))) :group 'ps-print-font) (defcustom ps-font-family 'Courier @@ -2385,7 +2812,9 @@ it uses the fonts resident in your printer." (defcustom ps-font-size '(7 . 8.5) "*Font size, in points, for ordinary text, when generating PostScript." - :type '(choice (number :tag "Text Size") + :type '(choice :menu-tag "Ordinary Text Font Size" + :tag "Ordinary Text Font Size" + (number :tag "Text Size") (cons :tag "Landscape/Portrait" (number :tag "Landscape Text Size") (number :tag "Portrait Text Size"))) @@ -2398,7 +2827,9 @@ it uses the fonts resident in your printer." (defcustom ps-header-font-size '(10 . 12) "*Font size, in points, for text in the header, when generating PostScript." - :type '(choice (number :tag "Header Size") + :type '(choice :menu-tag "Header Font Size" + :tag "Header Font Size" + (number :tag "Header Size") (cons :tag "Landscape/Portrait" (number :tag "Landscape Header Size") (number :tag "Portrait Header Size"))) @@ -2406,26 +2837,122 @@ it uses the fonts resident in your printer." (defcustom ps-header-title-font-size '(12 . 14) "*Font size, in points, for the top line of text in header, in PostScript." - :type '(choice (number :tag "Header Title Size") + :type '(choice :menu-tag "Header Title Font Size" + :tag "Header Title Font Size" + (number :tag "Header Title Size") (cons :tag "Landscape/Portrait" (number :tag "Landscape Header Title Size") (number :tag "Portrait Header Title Size"))) :group 'ps-print-font) +(defcustom ps-footer-font-family 'Helvetica + "*Font family name for text in the footer, when generating PostScript." + :version "21.1" + :type 'symbol + :group 'ps-print-font) + +(defcustom ps-footer-font-size '(10 . 12) + "*Font size, in points, for text in the footer, when generating PostScript." + :version "21.1" + :type '(choice :menu-tag "Footer Font Size" + :tag "Footer Font Size" + (number :tag "Footer Size") + (cons :tag "Landscape/Portrait" + (number :tag "Landscape Footer Size") + (number :tag "Portrait Footer Size"))) + :group 'ps-print-font) + +(defcustom ps-line-number-color "black" + "*Specify color for line-number, when generating PostScript." + :type '(choice :menu-tag "Line Number Color" + :tag "Line Number Color" + (number :tag "Gray Scale" :value 0) + (string :tag "Color Name" :value "black") + (list :tag "RGB Color" :value (0 0 0) + (number :tag "Red") + (number :tag "Green") + (number :tag "Blue"))) + :version "21.1" + :group 'ps-print-font + :group 'ps-print-miscellany) + +(defcustom ps-line-number-font "Times-Italic" + "*Font for line-number, when generating PostScript." + :type 'string + :group 'ps-print-font + :group 'ps-print-miscellany) + +(defcustom ps-line-number-font-size 6 + "*Font size, in points, for line number, when generating PostScript." + :type '(choice :menu-tag "Line Number Font Size" + :tag "Line Number Font Size" + (number :tag "Font Size") + (cons :tag "Landscape/Portrait" + (number :tag "Landscape Font Size") + (number :tag "Portrait Font Size"))) + :group 'ps-print-font + :group 'ps-print-miscellany) + ;;; Colors ;; Printing color requires x-color-values. -(defcustom ps-print-color-p (or (fboundp 'x-color-values) ; Emacs - (fboundp 'color-instance-rgb-components)) +;; XEmacs change: Need autoload for the "Options->Printing->Color Printing" +;; widget to work. +;;;###autoload +(defcustom ps-print-color-p + (or (fboundp 'x-color-values) ; Emacs + (fboundp 'color-instance-rgb-components)) ; XEmacs - "*Non-nil means print the buffer's text in color." - :type 'boolean + "*Specify how buffer's text color is printed. + +Valid values are: + + nil Do not print colors. + + t Print colors. + + black-white Print colors on black/white printer. + See also `ps-black-white-faces'. + +Any other value is treated as t." + :type '(choice :menu-tag "Print Color" + :tag "Print Color" + (const :tag "Do NOT Print Color" nil) + (const :tag "Print Always Color" t) + (const :tag "Print Black/White Color" black-white)) :group 'ps-print-color) -(defcustom ps-default-fg '(0.0 0.0 0.0) - "*RGB values of the default foreground color. Defaults to black." +(defcustom ps-default-fg '(0.0 0.0 0.0) ; black + "*RGB values of the default foreground color. Defaults to black. + +The `ps-default-fg' variable contains the default foreground color used by +ps-print, that is, if there is a face in a text that doesn't have a foreground +color, the `ps-default-fg' color should be used. + +Valid values are: + + t The foreground color of Emacs session will be used. + + NUMBER It's a real value between 0.0 (black) and 1.0 (white) that + indicate the gray color. + + COLOR-NAME It's a string wich contains the color name. For example: + \"yellow\". + + LIST It's a list of RGB values, that is a list of three real values + of the form: + + (RED, GREEN, BLUE) + + Where RED, GREEN and BLUE are reals between 0.0 (no color) and + 1.0 (full color). + +Any other value is ignored and it's used the black color. + +It's used only when `ps-print-color-p' is non-nil." :type '(choice :menu-tag "Default Foreground Gray/Color" :tag "Default Foreground Gray/Color" + (const :tag "Session Foreground" t) (number :tag "Gray Scale" :value 0.0) (string :tag "Color Name" :value "black") (list :tag "RGB Color" :value (0.0 0.0 0.0) @@ -2434,10 +2961,39 @@ it uses the fonts resident in your printer." (number :tag "Blue"))) :group 'ps-print-color) -(defcustom ps-default-bg '(1.0 1.0 1.0) - "*RGB values of the default background color. Defaults to white." +(defcustom ps-default-bg '(1.0 1.0 1.0) ; white + "*RGB values of the default background color. Defaults to white. + +The `ps-default-bg' variable contains the default background color used by +ps-print, that is, if there is a face in a text that doesn't have a background +color, the `ps-default-bg' color should be used. + +Valid values are: + + t The background color of Emacs session will be used. + + NUMBER It's a real value between 0.0 (black) and 1.0 (white) that + indicate the gray color. + + COLOR-NAME It's a string wich contains the color name. For example: + \"yellow\". + + LIST It's a list of RGB values, that is a list of three real values + of the form: + + (RED, GREEN, BLUE) + + Where RED, GREEN and BLUE are reals between 0.0 (no color) and + 1.0 (full color). + +Any other value is ignored and it's used the white color. + +It's used only when `ps-print-color-p' is non-nil. + +See also `ps-use-face-background'." :type '(choice :menu-tag "Default Background Gray/Color" :tag "Default Background Gray/Color" + (const :tag "Session Background" t) (number :tag "Gray Scale" :value 1.0) (string :tag "Color Name" :value "white") (list :tag "RGB Color" :value (1.0 1.0 1.0) @@ -2448,11 +3004,50 @@ it uses the fonts resident in your printer." (defcustom ps-auto-font-detect t "*Non-nil means automatically detect bold/italic/underline face attributes. -If nil, we rely solely on the lists `ps-bold-faces', `ps-italic-faces', -and `ps-underlined-faces'." +If nil, we rely solely on the lists `ps-bold-faces', `ps-italic-faces', and +`ps-underlined-faces'." :type 'boolean :group 'ps-print-font) +(defcustom ps-black-white-faces + '((font-lock-builtin-face "black" nil bold ) + (font-lock-comment-face "gray20" nil italic) + (font-lock-constant-face "black" nil bold ) + (font-lock-function-name-face "black" nil bold ) + (font-lock-keyword-face "black" nil bold ) + (font-lock-string-face "black" nil italic) + (font-lock-type-face "black" nil italic) + (font-lock-variable-name-face "black" nil bold italic) + (font-lock-warning-face "black" nil bold italic)) + "*Specify list of face attributes to print colors on black/white printers. + +The list elements are the same as defined on `ps-extend-face' (which see). + +This variable is used only when `ps-print-color-p' is set to `black-white'." + :version "21.1" + :type '(repeat + (list :tag "Face Specification" + (face :tag "Face Symbol") + (choice :menu-tag "Foreground Color" + :tag "Foreground Color" + (const :tag "Black" nil) + (string :tag "Color Name")) + (choice :menu-tag "Background Color" + :tag "Background Color" + (const :tag "None" nil) + (string :tag "Color Name")) + (repeat :inline t + (choice :menu-tag "Attribute" + (const bold) + (const italic) + (const underline) + (const strikeout) + (const overline) + (const shadow) + (const box) + (const outline))))) + :group 'ps-print-face) + (defcustom ps-bold-faces (unless ps-print-color-p '(font-lock-function-name-face @@ -2511,29 +3106,107 @@ Any other value will be treated as t." "*The items to display (each on a line) on the left part of the page header. This applies to generating PostScript. -The value should be a list of strings and symbols, each representing an -entry in the PostScript array HeaderLinesLeft. +The value should be a list of strings and symbols, each representing an entry +in the PostScript array HeaderLinesLeft. Strings are inserted unchanged into the array; those representing PostScript string literals should be delimited with PostScript string delimiters '(' and ')'. -For symbols with bound functions, the function is called and should -return a string to be inserted into the array. For symbols with bound -values, the value should be a string to be inserted into the array. -In either case, function or variable, the string value has PostScript -string delimiters added to it." - :type '(repeat (choice string symbol)) +For symbols with bound functions, the function is called and should return a +string to be inserted into the array. For symbols with bound values, the value +should be a string to be inserted into the array. In either case, function or +variable, the string value has PostScript string delimiters added to it. + +If symbols are unbounded, they are silently ignored." + :type '(repeat (choice :menu-tag "Left Header" + :tag "Left Header" + string symbol)) :group 'ps-print-headers) (defcustom ps-right-header - (list "/pagenumberstring load" 'time-stamp-mon-dd-yyyy 'time-stamp-hh:mm:ss) + (list "/pagenumberstring load" + 'ps-time-stamp-locale-default 'ps-time-stamp-hh:mm:ss) "*The items to display (each on a line) on the right part of the page header. This applies to generating PostScript. -See the variable `ps-left-header' for a description of the format of -this variable." - :type '(repeat (choice string symbol)) +See the variable `ps-left-header' for a description of the format of this +variable. + +There are the following basic functions implemented: + + `ps-time-stamp-locale-default' Return the locale's \"preferred\" date + as, for example, \"06/18/01\". + + `ps-time-stamp-hh:mm:ss' Return time as \"17:28:31\". + + `ps-time-stamp-mon-dd-yyyy' Return date as \"Jun 18 2001\". + + `ps-time-stamp-yyyy-mm-dd' Return date as \"2001-06-18\" (ISO + date). + + `ps-time-stamp-iso8601' Alias for `ps-time-stamp-yyyy-mm-dd'. + +You can also create your own time stamp function by using `format-time-string' +\(which see)." + :type '(repeat (choice :menu-tag "Right Header" + :tag "Right Header" + string symbol)) + :group 'ps-print-headers) + +(defcustom ps-left-footer + (list 'ps-get-buffer-name 'ps-header-dirpart) + "*The items to display (each on a line) on the left part of the page footer. +This applies to generating PostScript. + +The value should be a list of strings and symbols, each representing an entry +in the PostScript array FooterLinesLeft. + +Strings are inserted unchanged into the array; those representing PostScript +string literals should be delimited with PostScript string delimiters '(' and +')'. + +For symbols with bound functions, the function is called and should return a +string to be inserted into the array. For symbols with bound values, the value +should be a string to be inserted into the array. In either case, function or +variable, the string value has PostScript string delimiters added to it. + +If symbols are unbounded, they are silently ignored." + :version "21.1" + :type '(repeat (choice :menu-tag "Left Footer" + :tag "Left Footer" + string symbol)) + :group 'ps-print-headers) + +(defcustom ps-right-footer + (list "/pagenumberstring load" + 'ps-time-stamp-locale-default 'ps-time-stamp-hh:mm:ss) + "*The items to display (each on a line) on the right part of the page footer. +This applies to generating PostScript. + +See the variable `ps-left-footer' for a description of the format of this +variable. + +There are the following basic functions implemented: + + `ps-time-stamp-locale-default' Return the locale's \"preferred\" date + as, for example, \"06/18/01\". + + `ps-time-stamp-hh:mm:ss' Return time as \"17:28:31\". + + `ps-time-stamp-mon-dd-yyyy' Return date as \"Jun 18 2001\". + + `ps-time-stamp-yyyy-mm-dd' Return date as \"2001-06-18\" (ISO + date). + + `ps-time-stamp-iso8601' Alias for `ps-time-stamp-yyyy-mm-dd'. + +You can also create your own time stamp function by using `format-time-string' +\(which see)." + :version "21.1" + :type '(repeat (choice :menu-tag "Right Footer" + :tag "Right Footer" + string symbol)) :group 'ps-print-headers) (defcustom ps-razzle-dazzle t @@ -2543,32 +3216,31 @@ this variable." (defcustom ps-adobe-tag "%!PS-Adobe-3.0\n" "*Contains the header line identifying the output as PostScript. -By default, `ps-adobe-tag' contains the standard identifier. Some -printers require slightly different versions of this line." +By default, `ps-adobe-tag' contains the standard identifier. Some printers +require slightly different versions of this line." :type 'string :group 'ps-print-miscellany) (defcustom ps-build-face-reference t "*Non-nil means build the reference face lists. -ps-print sets this value to nil after it builds its internal reference -lists of bold and italic faces. By settings its value back to t, you -can force ps-print to rebuild the lists the next time you invoke one -of the ...-with-faces commands. +ps-print sets this value to nil after it builds its internal reference lists of +bold and italic faces. By settings its value back to t, you can force ps-print +to rebuild the lists the next time you invoke one of the ...-with-faces +commands. -You should set this value back to t after you change the attributes of -any face, or create new faces. Most users shouldn't have to worry -about its setting, though." +You should set this value back to t after you change the attributes of any +face, or create new faces. Most users shouldn't have to worry about its +setting, though." :type 'boolean :group 'ps-print-face) (defcustom ps-always-build-face-reference nil "*Non-nil means always rebuild the reference face lists. -If this variable is non-nil, ps-print will rebuild its internal -reference lists of bold and italic faces *every* time one of the -...-with-faces commands is called. Most users shouldn't need to set this -variable." +If this variable is non-nil, ps-print will rebuild its internal reference lists +of bold and italic faces *every* time one of the ...-with-faces commands is +called. Most users shouldn't need to set this variable." :type 'boolean :group 'ps-print-face) @@ -2579,14 +3251,92 @@ It's like the very first character of buffer (or region) is ^L (\\014)." :group 'ps-print-headers) (defcustom ps-postscript-code-directory - (or (and (fboundp 'locate-data-directory) ; xemacs - (locate-data-directory "ps-print")) - data-directory) ; emacs + (or (cond + ((eq ps-print-emacs-type 'emacs) ; emacs + data-directory) + ((fboundp 'locate-data-directory) ; xemacs + (locate-data-directory "ps-print")) + ((boundp 'data-directory) ; xemacs + data-directory) + (t ; don't know what to do + nil)) + (error "`ps-postscript-code-directory' isn't set properly")) "*Directory where it's located the PostScript prologue file used by ps-print. By default, this directory is the same as in the variable `data-directory'." :type 'directory :group 'ps-print-miscellany) +(defcustom ps-line-spacing 0 + "*Specify line spacing, in points, for ordinary text. + +See also `ps-paragraph-spacing' and `ps-paragraph-regexp'. + +To get all lines with some spacing set both `ps-line-spacing' and +`ps-paragraph-spacing' variables." + :type '(choice :menu-tag "Line Spacing For Ordinary Text" + :tag "Line Spacing For Ordinary Text" + (number :tag "Line Spacing") + (cons :tag "Landscape/Portrait" + (number :tag "Landscape Line Spacing") + (number :tag "Portrait Line Spacing"))) + :version "21.1" + :group 'ps-print-miscellany) + +(defcustom ps-paragraph-spacing 0 + "*Specify paragraph spacing, in points, for ordinary text. + +See also `ps-line-spacing' and `ps-paragraph-regexp'. + +To get all lines with some spacing set both `ps-line-spacing' and +`ps-paragraph-spacing' variables." + :type '(choice :menu-tag "Paragraph Spacing For Ordinary Text" + :tag "Paragraph Spacing For Ordinary Text" + (number :tag "Paragraph Spacing") + (cons :tag "Landscape/Portrait" + (number :tag "Landscape Paragraph Spacing") + (number :tag "Portrait Paragraph Spacing"))) + :version "21.1" + :group 'ps-print-miscellany) + +(defcustom ps-paragraph-regexp "[ \t]*$" + "*Specify paragraph delimiter. + +It should be a regexp or nil. + +See also `ps-paragraph-spacing'." + :type '(choice :menu-tag "Paragraph Delimiter" + (const :tag "No Delimiter" nil) + (regexp :tag "Delimiter Regexp")) + :version "21.1" + :group 'ps-print-miscellany) + +(defcustom ps-begin-cut-regexp nil + "*Specify regexp which is start of a region to cut out when printing. + +As an example, variables `ps-begin-cut-regexp' and `ps-end-cut-regexp' may be +set to \"^Local Variables:\" and \"^End:\", respectively, in order to leave out +some special printing instructions from the actual print. Special printing +instructions may be appended to the end of the file just like any other +buffer-local variables. See section \"Local Variables in Files\" on Emacs +manual for more information. + +Variables `ps-begin-cut-regexp' and `ps-end-cut-regexp' control together what +actually gets printed. Both variables may be set to nil in which case no +cutting occurs." + :type '(choice (const :tag "No Delimiter" nil) + (regexp :tag "Delimiter Regexp")) + :version "21.1" + :group 'ps-print-miscellany) + +(defcustom ps-end-cut-regexp nil + "*Specify regexp which is end of the region to cut out when printing. + +See `ps-begin-cut-regexp' for more information." + :type '(choice (const :tag "No Delimiter" nil) + (regexp :tag "Delimiter Regexp")) + :version "21.1" + :group 'ps-print-miscellany) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Selected Pages @@ -2621,13 +3371,13 @@ By default, this directory is the same as in the variable `data-directory'." (defun ps-print-buffer (&optional filename) "Generate and print a PostScript image of the buffer. -Interactively, when you use a prefix argument (C-u), the command -prompts the user for a file name, and saves the PostScript image -in that file instead of sending it to the printer. +Interactively, when you use a prefix argument (\\[universal-argument]), the command prompts the +user for a file name, and saves the PostScript image in that file instead of +sending it to the printer. -Noninteractively, the argument FILENAME is treated as follows: if it -is nil, send the image to the printer. If FILENAME is a string, save -the PostScript image in a file with that name." +Noninteractively, the argument FILENAME is treated as follows: if it is nil, +send the image to the printer. If FILENAME is a string, save the PostScript +image in a file with that name." (interactive (list (ps-print-preprint current-prefix-arg))) (ps-print-without-faces (point-min) (point-max) filename)) @@ -2635,9 +3385,9 @@ the PostScript image in a file with that name." ;;;###autoload (defun ps-print-buffer-with-faces (&optional filename) "Generate and print a PostScript image of the buffer. -Like `ps-print-buffer', but includes font, color, and underline -information in the generated image. This command works only if you -are using a window system, so it has a way to determine color values." +Like `ps-print-buffer', but includes font, color, and underline information in +the generated image. This command works only if you are using a window system, +so it has a way to determine color values." (interactive (list (ps-print-preprint current-prefix-arg))) (ps-print-with-faces (point-min) (point-max) filename)) @@ -2646,25 +3396,25 @@ are using a window system, so it has a way to determine color values." (defun ps-print-region (from to &optional filename) "Generate and print a PostScript image of the region. Like `ps-print-buffer', but prints just the current region." - (interactive (list (point) (mark) (ps-print-preprint current-prefix-arg))) + (interactive (ps-print-preprint-region current-prefix-arg)) (ps-print-without-faces from to filename t)) ;;;###autoload (defun ps-print-region-with-faces (from to &optional filename) "Generate and print a PostScript image of the region. -Like `ps-print-region', but includes font, color, and underline -information in the generated image. This command works only if you -are using a window system, so it has a way to determine color values." - (interactive (list (point) (mark) (ps-print-preprint current-prefix-arg))) +Like `ps-print-region', but includes font, color, and underline information in +the generated image. This command works only if you are using a window system, +so it has a way to determine color values." + (interactive (ps-print-preprint-region current-prefix-arg)) (ps-print-with-faces from to filename t)) ;;;###autoload (defun ps-spool-buffer () "Generate and spool a PostScript image of the buffer. -Like `ps-print-buffer' except that the PostScript image is saved in a -local buffer to be sent to the printer later. +Like `ps-print-buffer' except that the PostScript image is saved in a local +buffer to be sent to the printer later. Use the command `ps-despool' to send the spooled images to the printer." (interactive) @@ -2674,9 +3424,9 @@ Use the command `ps-despool' to send the spooled images to the printer." ;;;###autoload (defun ps-spool-buffer-with-faces () "Generate and spool a PostScript image of the buffer. -Like `ps-spool-buffer', but includes font, color, and underline -information in the generated image. This command works only if you -are using a window system, so it has a way to determine color values. +Like `ps-spool-buffer', but includes font, color, and underline information in +the generated image. This command works only if you are using a window system, +so it has a way to determine color values. Use the command `ps-despool' to send the spooled images to the printer." (interactive) @@ -2696,9 +3446,9 @@ Use the command `ps-despool' to send the spooled images to the printer." ;;;###autoload (defun ps-spool-region-with-faces (from to) "Generate a PostScript image of the region and spool locally. -Like `ps-spool-region', but includes font, color, and underline -information in the generated image. This command works only if you -are using a window system, so it has a way to determine color values. +Like `ps-spool-region', but includes font, color, and underline information in +the generated image. This command works only if you are using a window system, +so it has a way to determine color values. Use the command `ps-despool' to send the spooled images to the printer." (interactive "r") @@ -2708,20 +3458,20 @@ Use the command `ps-despool' to send the spooled images to the printer." (defun ps-despool (&optional filename) "Send the spooled PostScript to the printer. -Interactively, when you use a prefix argument (C-u), the command -prompts the user for a file name, and saves the spooled PostScript -image in that file instead of sending it to the printer. +Interactively, when you use a prefix argument (\\[universal-argument]), the command prompts the +user for a file name, and saves the spooled PostScript image in that file +instead of sending it to the printer. -Noninteractively, the argument FILENAME is treated as follows: if it -is nil, send the image to the printer. If FILENAME is a string, save -the PostScript image in a file with that name." +Noninteractively, the argument FILENAME is treated as follows: if it is nil, +send the image to the printer. If FILENAME is a string, save the PostScript +image in a file with that name." (interactive (list (ps-print-preprint current-prefix-arg))) (ps-do-despool filename)) ;;;###autoload (defun ps-line-lengths () - "Display the correspondence between a line length and a font size, -using the current ps-print setup. + "Display the correspondence between a line length and a font size. +Done using the current ps-print setup. Try: pr -t file | awk '{printf \"%3d %s\n\", length($0), $0}' | sort -r | head" (interactive) (ps-line-lengths-internal)) @@ -2730,254 +3480,354 @@ Try: pr -t file | awk '{printf \"%3d %s\n\", length($0), $0}' | sort -r | head" (defun ps-nb-pages-buffer (nb-lines) "Display number of pages to print this buffer, for various font heights. The table depends on the current ps-print setup." - (interactive (list (count-lines (point-min) (point-max)))) + (interactive (ps-count-lines-preprint (point-min) (point-max))) (ps-nb-pages nb-lines)) ;;;###autoload (defun ps-nb-pages-region (nb-lines) "Display number of pages to print the region, for various font heights. The table depends on the current ps-print setup." - (interactive (list (count-lines (mark) (point)))) + (interactive (ps-count-lines-preprint (mark) (point))) (ps-nb-pages nb-lines)) +(defvar ps-prefix-quote nil + "Used for `ps-print-quote' (which see).") + ;;;###autoload (defun ps-setup () "Return the current PostScript-generation setup." - (format - " -;;; ps-print version %s - -\(setq ps-print-color-p %s - ps-lpr-command %S - ps-lpr-switches %s - ps-printer-name %s - ps-printer-name-option %s - ps-print-region-function %s - ps-manual-feed %S - - ps-paper-type %s - ps-warn-paper-type %s - ps-landscape-mode %s - ps-print-upside-down %s - ps-number-of-columns %s - - ps-zebra-stripes %s - ps-zebra-stripe-height %s - ps-zebra-stripe-follow %S - ps-zebra-color %s - ps-line-number %s - ps-line-number-step %s - ps-line-number-start %S - - ps-default-fg %s - ps-default-bg %s - - ps-use-face-background %s - - ps-print-control-characters %s - - ps-print-background-image %s - - ps-print-background-text %s - - ps-error-handler-message %s - ps-user-defined-prologue %s - ps-print-prologue-header %s - - ps-left-margin %s - ps-right-margin %s - ps-inter-column %s - ps-bottom-margin %s - ps-top-margin %s - ps-header-offset %s - ps-header-line-pad %s - ps-print-header %s - ps-print-only-one-header %s - ps-print-header-frame %s - ps-switch-header %s - ps-header-lines %s - ps-show-n-of-n %s - ps-spool-config %s - ps-spool-duplex %s - ps-spool-tumble %s - ps-banner-page-when-duplexing %s - - ps-n-up-printing %s - ps-n-up-margin %s - ps-n-up-border-p %s - ps-n-up-filling %s - - ps-multibyte-buffer %s - ps-font-family %s - ps-font-size %s - ps-header-font-family %s - ps-header-font-size %s - ps-header-title-font-size %s - - ps-even-or-odd-pages %s - ps-selected-pages %s - ps-last-selected-pages %s) - -;;; ps-print - end of settings -" - ps-print-version - ps-print-color-p - ps-lpr-command - (ps-print-quote ps-lpr-switches) - (ps-print-quote ps-printer-name) - (ps-print-quote ps-printer-name-option) - (ps-print-quote ps-print-region-function) - ps-manual-feed - (ps-print-quote ps-paper-type) - ps-warn-paper-type - ps-landscape-mode - ps-print-upside-down - ps-number-of-columns - ps-zebra-stripes - ps-zebra-stripe-height - ps-zebra-stripe-follow - (ps-print-quote ps-zebra-color) - ps-line-number - (ps-print-quote ps-line-number-step) - ps-line-number-start - (ps-print-quote ps-default-fg) - (ps-print-quote ps-default-bg) - (ps-print-quote ps-use-face-background) - (ps-print-quote ps-print-control-characters) - (ps-print-quote ps-print-background-image) - (ps-print-quote ps-print-background-text) - (ps-print-quote ps-error-handler-message) - (ps-print-quote ps-user-defined-prologue) - (ps-print-quote ps-print-prologue-header) - ps-left-margin - ps-right-margin - ps-inter-column - ps-bottom-margin - ps-top-margin - ps-header-offset - ps-header-line-pad - ps-print-header - ps-print-only-one-header - ps-print-header-frame - (ps-print-quote ps-switch-header) - ps-header-lines - ps-show-n-of-n - (ps-print-quote ps-spool-config) - ps-spool-duplex - ps-spool-tumble - ps-banner-page-when-duplexing - ps-n-up-printing - ps-n-up-margin - ps-n-up-border-p - (ps-print-quote ps-n-up-filling) - (ps-print-quote ps-multibyte-buffer) ; see `ps-mule.el' - (ps-print-quote ps-font-family) - (ps-print-quote ps-font-size) - (ps-print-quote ps-header-font-family) - (ps-print-quote ps-header-font-size) - (ps-print-quote ps-header-title-font-size) - (ps-print-quote ps-even-or-odd-pages) - (ps-print-quote ps-selected-pages) - (ps-print-quote ps-last-selected-pages))) + (let (ps-prefix-quote) + (mapconcat + #'ps-print-quote + (list + (concat "\n;;; ps-print version " ps-print-version "\n") + ";; internal vars" + (ps-comment-string "ps-print-emacs-type" ps-print-emacs-type) + (ps-comment-string "ps-windows-system " ps-windows-system) + (ps-comment-string "ps-lp-system " ps-lp-system) + nil + '(25 . ps-print-color-p) + '(25 . ps-lpr-command) + '(25 . ps-lpr-switches) + '(25 . ps-printer-name) + '(25 . ps-printer-name-option) + '(25 . ps-print-region-function) + '(25 . ps-manual-feed) + '(25 . ps-end-with-control-d) + nil + '(23 . ps-paper-type) + '(23 . ps-warn-paper-type) + '(23 . ps-landscape-mode) + '(23 . ps-print-upside-down) + '(23 . ps-number-of-columns) + nil + '(23 . ps-zebra-stripes) + '(23 . ps-zebra-stripe-height) + '(23 . ps-zebra-stripe-follow) + '(23 . ps-zebra-color) + '(23 . ps-line-number) + '(23 . ps-line-number-step) + '(23 . ps-line-number-start) + nil + '(17 . ps-default-fg) + '(17 . ps-default-bg) + '(17 . ps-razzle-dazzle) + nil + '(23 . ps-use-face-background) + nil + '(28 . ps-print-control-characters) + nil + '(26 . ps-print-background-image) + nil + '(25 . ps-print-background-text) + nil + '(29 . ps-error-handler-message) + '(29 . ps-user-defined-prologue) + '(29 . ps-print-prologue-header) + '(29 . ps-postscript-code-directory) + '(29 . ps-adobe-tag) + nil + '(30 . ps-left-margin) + '(30 . ps-right-margin) + '(30 . ps-inter-column) + '(30 . ps-bottom-margin) + '(30 . ps-top-margin) + '(30 . ps-print-only-one-header) + '(30 . ps-switch-header) + '(30 . ps-print-header) + '(30 . ps-header-lines) + '(30 . ps-header-offset) + '(30 . ps-header-line-pad) + '(30 . ps-print-header-frame) + '(30 . ps-header-frame-alist) + '(30 . ps-print-footer) + '(30 . ps-footer-lines) + '(30 . ps-footer-offset) + '(30 . ps-footer-line-pad) + '(30 . ps-print-footer-frame) + '(30 . ps-footer-frame-alist) + '(30 . ps-show-n-of-n) + '(30 . ps-spool-config) + '(30 . ps-spool-duplex) + '(30 . ps-spool-tumble) + '(30 . ps-banner-page-when-duplexing) + '(30 . ps-left-header) + '(30 . ps-right-header) + '(30 . ps-left-footer) + '(30 . ps-right-footer) + nil + '(23 . ps-n-up-printing) + '(23 . ps-n-up-margin) + '(23 . ps-n-up-border-p) + '(23 . ps-n-up-filling) + nil + '(26 . ps-multibyte-buffer) + '(26 . ps-font-family) + '(26 . ps-font-size) + '(26 . ps-header-font-family) + '(26 . ps-header-font-size) + '(26 . ps-header-title-font-size) + '(26 . ps-footer-font-family) + '(26 . ps-footer-font-size) + '(26 . ps-line-number-color) + '(26 . ps-line-number-font) + '(26 . ps-line-number-font-size) + '(26 . ps-line-spacing) + '(26 . ps-paragraph-spacing) + '(26 . ps-paragraph-regexp) + '(26 . ps-begin-cut-regexp) + '(26 . ps-end-cut-regexp) + nil + '(23 . ps-even-or-odd-pages) + '(23 . ps-selected-pages) + '(23 . ps-last-selected-pages) + nil + '(31 . ps-build-face-reference) + '(31 . ps-always-build-face-reference) + nil + '(20 . ps-auto-font-detect) + '(20 . ps-bold-faces) + '(20 . ps-italic-faces) + '(20 . ps-underlined-faces) + '(20 . ps-black-white-faces) + " )\n +;; The following customized variables have long lists and are seldom modified: +;; ps-page-dimensions-database +;; ps-font-info-database + +;;; ps-print - end of settings\n") + "\n"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Utility functions and variables: -(defun ps-print-quote (sym) - (cond ((null sym) - nil) - ((or (symbolp sym) (listp sym)) - (format "'%S" sym)) - ((stringp sym) - (format "%S" sym)) +(defun ps-print-quote (elt) + "Quote ELT for printing (used for showing settings). + +If ELT is nil, return an empty string. +If ELT is string, return it. +Otherwise, ELT should be a cons (LEN . SYM) where SYM is a variable symbol and +LEN is the field length where SYM name will be inserted. The variable +`ps-prefix-quote' is used to form the string, if `ps-prefix-quote' is nil, it's +used \"(setq \" as prefix; otherwise, it's used \" \". So, the string +generated is: + + * If `ps-prefix-quote' is nil: + \"(setq SYM-NAME SYM-VALUE\" + |<------->| + LEN + + * If `ps-prefix-quote' is non-nil: + \" SYM-NAME SYM-VALUE\" + |<------->| + LEN + +If `ps-prefix-quote' is nil, it's set to t after generating string." + (cond + ((stringp elt) elt) + ((and (consp elt) (integerp (car elt)) + (symbolp (cdr elt)) (boundp (cdr elt))) + (let* ((col (car elt)) + (sym (cdr elt)) + (key (symbol-name sym)) + (len (length key)) + (val (symbol-value sym))) + (concat (if ps-prefix-quote + " " + (setq ps-prefix-quote t) + "(setq ") + key + (if (> col len) + (make-string (- col len) ?\ ) + " ") + (ps-value-string val)))) + (t "") + )) + + +(defun ps-value-string (val) + "Return a string representation of VAL. Used by `ps-print-quote'." + (cond ((null val) + "nil") + ((eq val t) + "t") + ((or (symbolp val) (listp val)) + (format "'%S" val)) (t - sym))) + (format "%S" val)))) + + +(defun ps-comment-string (str value) + "Return a comment string like \";; STR = VALUE\"." + (format ";; %s = %s" str (ps-value-string value))) + + +(defun ps-value (alist-sym key) + "Return value from association list ALIST-SYM which car is `eq' to KEY." + (cdr (assq key (symbol-value alist-sym)))) + + +(defun ps-get (alist-sym key) + "Return element from association list ALIST-SYM which car is `eq' to KEY." + (assq key (symbol-value alist-sym))) + + +(defun ps-put (alist-sym key value) + "Store element (KEY . VALUE) into association list ALIST-SYM. +If KEY already exists in ALIST-SYM, modify cdr to VALUE. +It can be retrieved with `(ps-get ALIST-SYM KEY)'." + (let ((elt: (assq key (symbol-value alist-sym)))) ; to avoid name conflict + (if elt: + (setcdr elt: value) + (setq elt: (cons key value)) + (set alist-sym (cons elt: (symbol-value alist-sym)))) + elt:)) + + +(defun ps-del (alist-sym key) + "Delete by side effect element KEY from association list ALIST-SYM." + (let ((a:list: (symbol-value alist-sym)) ; to avoid name conflict + old) + (while a:list: + (if (eq key (car (car a:list:))) + (progn + (if old + (setcdr old (cdr a:list:)) + (set alist-sym (cdr a:list:))) + (setq a:list: nil)) + (setq old a:list: + a:list: (cdr a:list:))))) + (symbol-value alist-sym)) + + +(defun ps-time-stamp-locale-default () + "Return the locale's \"preferred\" date as, for example, \"06/18/01\"." + (format-time-string "%x")) + + +(defun ps-time-stamp-mon-dd-yyyy () + "Return date as \"Jun 18 2001\"." + (format-time-string "%b %d %Y")) + + +(defun ps-time-stamp-yyyy-mm-dd () + "Return date as \"2001-06-18\" (ISO date)." + (format-time-string "%Y-%m-%d")) + + +(defalias 'ps-time-stamp-iso8601 'ps-time-stamp-yyyy-mm-dd + "Alias for `ps-time-stamp-yyyy-mm-dd' (which see).") + + +(defun ps-time-stamp-hh:mm:ss () + "Return time as \"17:28:31\"." + (format-time-string "%T")) (eval-and-compile - (defvar ps-print-emacs-type - (cond ((string-match "XEmacs" emacs-version) 'xemacs) - ((string-match "Lucid" emacs-version) 'lucid) - ((string-match "Epoch" emacs-version) 'epoch) - (t 'emacs))) + (and (eq ps-print-emacs-type 'xemacs) + ;; XEmacs change: Need to check for emacs-major-version too. + (or (< emacs-major-version 19) + (and (= emacs-major-version 19) (< emacs-minor-version 12))) + (setq ps-print-color-p nil)) - (if (memq ps-print-emacs-type '(lucid xemacs)) - (if (< emacs-minor-version 12) - (setq ps-print-color-p nil)) - (require 'faces)) ; face-font, face-underline-p, - ; x-font-regexp ;; Return t if the device (which can be changed during an emacs session) ;; can handle colors. - ;; This is function is not yet implemented for GNU emacs. + ;; This function is not yet implemented for GNU emacs. (cond ((and (eq ps-print-emacs-type 'xemacs) - (>= emacs-minor-version 12)) ; xemacs + ;; XEmacs change: Need to check for emacs-major-version too. + (or (> emacs-major-version 19) + (and (= emacs-major-version 19) + (>= emacs-minor-version 12)))) ; xemacs >= 19.12 (defun ps-color-device () - (eq (ps-x-device-class) 'color)) - ) + (eq (ps-x-device-class) 'color))) (t ; emacs (defun ps-color-device () - t) - )) + (if (fboundp 'color-values) + (ps-e-color-values "Green") + t)))) + + + (defun ps-mapper (extent list) + (nconc list + (list (list (ps-x-extent-start-position extent) 'push extent) + (list (ps-x-extent-end-position extent) 'pull extent))) + nil) + + (defun ps-extent-sorter (a b) + (< (ps-x-extent-priority a) (ps-x-extent-priority b))) + + (defun ps-xemacs-face-kind-p (face kind kind-regex) + (let* ((frame-font (or (ps-x-face-font-instance face) + (ps-x-face-font-instance 'default))) + (kind-cons + (and frame-font + (assq kind + (ps-x-font-instance-properties frame-font)))) + (kind-spec (cdr-safe kind-cons)) + (case-fold-search t)) + (and kind-spec (string-match kind-regex kind-spec)))) (cond ((eq ps-print-emacs-type 'emacs) ; emacs (defun ps-color-values (x-color) - (if (fboundp 'x-color-values) - (x-color-values x-color) - (error "No available function to determine X color values."))) - - (defalias 'ps-face-foreground-name 'face-foreground) - (defalias 'ps-face-background-name 'face-background) + (cond + ((fboundp 'color-values) + (ps-e-color-values x-color)) + ((fboundp 'x-color-values) + (ps-e-x-color-values x-color)) + (t + (error "No available function to determine X color values")))) (defun ps-face-bold-p (face) - (or (face-bold-p face) + (or (ps-e-face-bold-p face) (memq face ps-bold-faces))) (defun ps-face-italic-p (face) - (or (face-italic-p face) + (or (ps-e-face-italic-p face) (memq face ps-italic-faces))) ) - ; xemacs - ; lucid - (t ; epoch - - (or (ps-x-find-coding-system 'raw-text-unix) - (ps-x-copy-coding-system 'no-conversion-unix 'raw-text-unix)) - - (defun ps-mapper (extent list) - (nconc list - (list (list (ps-x-extent-start-position extent) 'push extent) - (list (ps-x-extent-end-position extent) 'pull extent))) - nil) - - (defun ps-extent-sorter (a b) - (< (ps-x-extent-priority a) (ps-x-extent-priority b))) - - (defun ps-xemacs-face-kind-p (face kind kind-regex) - (let* ((frame-font (or (ps-x-face-font-instance face) - (ps-x-face-font-instance 'default))) - (kind-cons - (and frame-font - (assq kind - (ps-x-font-instance-properties frame-font)))) - (kind-spec (cdr-safe kind-cons)) - (case-fold-search t)) - (and kind-spec (string-match kind-regex kind-spec)))) - - (defun ps-xemacs-color-name (color) - (if (ps-x-color-specifier-p color) - (ps-x-color-name color) - color)) + + (t ; xemacs + + ;; to avoid XEmacs compilation gripes + (defvar coding-system-for-write nil) + (defvar coding-system-for-read nil) + (defvar buffer-file-coding-system nil) + + (and (fboundp 'find-coding-system) + (or (ps-x-find-coding-system 'raw-text-unix) + (ps-x-copy-coding-system 'no-conversion-unix 'raw-text-unix))) (defun ps-color-values (x-color) (let ((color (ps-xemacs-color-name x-color))) (cond ((fboundp 'x-color-values) - (x-color-values color)) + (ps-e-x-color-values color)) ((and (fboundp 'color-instance-rgb-components) (ps-color-device)) (ps-x-color-instance-rgb-components @@ -2985,13 +3835,7 @@ The table depends on the current ps-print setup." x-color (ps-x-make-color-instance color)))) (t - (error "No available function to determine X color values."))))) - - (defun ps-face-foreground-name (face) - (ps-xemacs-color-name (face-foreground face))) - - (defun ps-face-background-name (face) - (ps-xemacs-color-name (face-background face))) + (error "No available function to determine X color values"))))) (defun ps-face-bold-p (face) (or (ps-xemacs-face-kind-p face 'WEIGHT_NAME "bold\\|demibold") @@ -3004,6 +3848,8 @@ The table depends on the current ps-print setup." ))) +(defvar ps-print-color-scale 1.0) + (defun ps-color-scale (color) ;; Scale 16-bit X-COLOR-VALUE to PostScript color value in [0, 1] interval. (mapcar #'(lambda (value) (/ value ps-print-color-scale)) @@ -3015,21 +3861,22 @@ The table depends on the current ps-print setup." (memq face ps-underlined-faces))) -(require 'time-stamp) - - (defun ps-prologue-file (filenumber) - (save-excursion - (let* ((filename (format "%sps-prin%d.ps" - ps-postscript-code-directory filenumber)) - (buffer - (or (find-file-noselect filename 'no-warn 'rawfile) - (error "ps-print PostScript prologue `%s' file was not found." - filename)))) - (set-buffer buffer) - (prog1 - (buffer-string) - (kill-buffer buffer))))) + "If prologue FILENUMBER exists and is readable, return contents as string. + +Note: No major/minor-mode is activated and no local variables are evaluated for + FILENUMBER, but proper EOL-conversion and character interpretation is + done!" + (let ((filename (convert-standard-filename + (expand-file-name (format "ps-prin%d.ps" filenumber) + ps-postscript-code-directory)))) + (if (and (file-exists-p filename) + (file-readable-p filename)) + (with-temp-buffer + (insert-file-contents filename) + (buffer-string)) + (error "ps-print PostScript prologue `%s' file was not found" + filename)))) (defvar ps-mark-code-directory nil) @@ -3038,10 +3885,7 @@ The table depends on the current ps-print setup." "ps-print PostScript error handler.") (defvar ps-print-prologue-1 "" - "ps-print PostScript prologue begin.") - -(defvar ps-print-prologue-2 "" - "ps-print PostScript prologue end.") + "ps-print PostScript prologue.") ;; Start Editing Here: @@ -3052,12 +3896,17 @@ The table depends on the current ps-print setup." (defvar ps-output-head nil) (defvar ps-output-tail nil) -(defvar ps-page-postscript 0) -(defvar ps-page-order 0) -(defvar ps-page-count 0) -(defvar ps-showline-count 1) +(defvar ps-page-postscript 0) ; page number +(defvar ps-page-order 0) ; PostScript page counter +(defvar ps-page-sheet 0) ; sheet counter +(defvar ps-page-column 0) ; column counter +(defvar ps-page-printed 0) ; total pages printed +(defvar ps-page-n-up 0) ; n-up counter +(defvar ps-lines-printed 0) ; total lines printed +(defvar ps-showline-count 1) ; line number counter (defvar ps-first-page nil) (defvar ps-last-page nil) +(defvar ps-print-page-p t) (defvar ps-control-or-escape-regexp nil) (defvar ps-n-up-on nil) @@ -3069,10 +3918,12 @@ The table depends on the current ps-print setup." (defvar ps-current-font 0) (defvar ps-default-foreground nil) +(defvar ps-default-background nil) (defvar ps-default-color nil) (defvar ps-current-color nil) (defvar ps-current-bg nil) +(defvar ps-zebra-stripe-full-p nil) (defvar ps-razchunk 0) (defvar ps-color-p nil) @@ -3084,17 +3935,21 @@ The table depends on the current ps-print setup." ;; PostScript output. "%0.3f %0.3f %0.3f" - ;; Lucid emacsen will have to make do with %s (princ) for floats. + ;; XEmacs will have to make do with %s (princ) for floats. "%s %s %s")) -;; These values determine how much print-height to deduct when headers -;; are turned on. This is a pretty clumsy way of handling it, but -;; it'll do for now. +;; These values determine how much print-height to deduct when headers/footers +;; are turned on. This is a pretty clumsy way of handling it, but it'll do for +;; now. (defvar ps-header-pad 0 "Vertical and horizontal space between the header frame and the text. This is in units of points (1/72 inch).") +(defvar ps-footer-pad 0 + "Vertical and horizontal space between the footer frame and the text. +This is in units of points (1/72 inch).") + ;; Define accessors to the dimensions list. (defmacro ps-page-dimensions-get-width (dims) `(nth 0 ,dims)) @@ -3109,17 +3964,29 @@ This is in units of points (1/72 inch).") (defvar ps-height-remaining nil) (defvar ps-width-remaining nil) -(defvar ps-print-color-scale nil) - (defvar ps-font-size-internal nil) (defvar ps-header-font-size-internal nil) (defvar ps-header-title-font-size-internal nil) +(defvar ps-footer-font-size-internal nil) +(defvar ps-line-spacing-internal nil) +(defvar ps-paragraph-spacing-internal nil) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Internal Variables +(defvar ps-black-white-faces-alist nil + "Alist of symbolic faces used for black/white PostScript printers. +An element of this list has the same form as `ps-print-face-extension-alist' +\(which see). + +Don't change this list directly; instead, +use `ps-extend-face' and `ps-extend-face-list'. +See documentation for `ps-extend-face' for valid extension symbol. +See also documentation for `ps-print-color-p'.") + + (defvar ps-print-face-extension-alist nil "Alist of symbolic faces *WITH* extension features (box, outline, etc). An element of this list has the following form: @@ -3166,26 +4033,32 @@ Each symbol correspond to one bit in a bit vector.") ;;;###autoload -(defun ps-extend-face-list (face-extension-list &optional merge-p) - "Extend face in `ps-print-face-extension-alist'. +(defun ps-extend-face-list (face-extension-list &optional merge-p alist-sym) + "Extend face in ALIST-SYM. If optional MERGE-P is non-nil, extensions in FACE-EXTENSION-LIST are merged -with face extension in `ps-print-face-extension-alist'; otherwise, overrides. +with face extension in ALIST-SYM; otherwise, overrides. + +If optional ALIST-SYM is nil, it's used `ps-print-face-extension-alist'; +otherwise, it should be an alist symbol. The elements in FACE-EXTENSION-LIST is like those for `ps-extend-face'. See `ps-extend-face' for documentation." (while face-extension-list - (ps-extend-face (car face-extension-list) merge-p) + (ps-extend-face (car face-extension-list) merge-p alist-sym) (setq face-extension-list (cdr face-extension-list)))) ;;;###autoload -(defun ps-extend-face (face-extension &optional merge-p) - "Extend face in `ps-print-face-extension-alist'. +(defun ps-extend-face (face-extension &optional merge-p alist-sym) + "Extend face in ALIST-SYM. If optional MERGE-P is non-nil, extensions in FACE-EXTENSION list are merged -with face extensions in `ps-print-face-extension-alist'; otherwise, overrides. +with face extensions in ALIST-SYM; otherwise, overrides. + +If optional ALIST-SYM is nil, it's used `ps-print-face-extension-alist'; +otherwise, it should be an alist symbol. The elements of FACE-EXTENSION list have the form: @@ -3207,23 +4080,26 @@ EXTENSION is one of the following symbols: outline - print characters as hollow outlines. If EXTENSION is any other symbol, it is ignored." - (let* ((face-name (nth 0 face-extension)) - (foreground (nth 1 face-extension)) - (background (nth 2 face-extension)) - (ps-face (cdr (assq face-name ps-print-face-extension-alist))) + (or alist-sym + (setq alist-sym 'ps-print-face-extension-alist)) + (let* ((background (nth 2 face-extension)) + (foreground (nth 1 face-extension)) + (face-name (nth 0 face-extension)) + (ps-face (cdr (assq face-name (symbol-value alist-sym)))) (face-vector (or ps-face (vector 0 nil nil))) - (face-bit (ps-extension-bit face-extension))) + (face-bit (ps-extension-bit face-extension))) ;; extend face (aset face-vector 0 (if merge-p (logior (aref face-vector 0) face-bit) face-bit)) - (and foreground (stringp foreground) (aset face-vector 1 foreground)) - (and background (stringp background) (aset face-vector 2 background)) + (and (or (not merge-p) (and foreground (stringp foreground))) + (aset face-vector 1 foreground)) + (and (or (not merge-p) (and background (stringp background))) + (aset face-vector 2 background)) ;; if face does not exist, insert it (or ps-face - (setq ps-print-face-extension-alist - (cons (cons face-name face-vector) - ps-print-face-extension-alist))))) + (set alist-sym (cons (cons face-name face-vector) + (symbol-value alist-sym)))))) (defun ps-extension-bit (face-extension) @@ -3271,9 +4147,9 @@ If EXTENSION is any other symbol, it is ignored." (setq face-spec (cons ':background (cons background face-spec)))) (when bold-p - (setq face-spec (append '(:bold t) face-spec))) + (setq face-spec (append '(:weight bold) face-spec))) (when italic-p - (setq face-spec (append '(:italic t) face-spec))) + (setq face-spec (append '(:slant italic) face-spec))) (when underline-p (setq face-spec (append '(:underline t) face-spec))) (custom-declare-face face (list (list t face-spec)) nil) @@ -3284,6 +4160,11 @@ If EXTENSION is any other symbol, it is ignored." ;; Internal functions and variables +(defun ps-message-log-max () + (and (not (string= (buffer-name) "*Messages*")) + message-log-max)) + + (defvar ps-print-hook nil) (defvar ps-print-begin-sheet-hook nil) (defvar ps-print-begin-page-hook nil) @@ -3296,9 +4177,10 @@ If EXTENSION is any other symbol, it is ignored." (defun ps-spool-without-faces (from to &optional region-p) - (run-hooks 'ps-print-hook) - (ps-printing-region region-p from) - (ps-generate (current-buffer) from to 'ps-generate-postscript)) + (let ((message-log-max (ps-message-log-max))) ; to print *Messages* buffer + (run-hooks 'ps-print-hook) + (ps-printing-region region-p from to) + (ps-generate (current-buffer) from to 'ps-generate-postscript))) (defun ps-print-with-faces (from to &optional filename region-p) @@ -3307,9 +4189,17 @@ If EXTENSION is any other symbol, it is ignored." (defun ps-spool-with-faces (from to &optional region-p) - (run-hooks 'ps-print-hook) - (ps-printing-region region-p from) - (ps-generate (current-buffer) from to 'ps-generate-postscript-with-faces)) + (let ((message-log-max (ps-message-log-max))) ; to print *Messages* buffer + (run-hooks 'ps-print-hook) + (ps-printing-region region-p from to) + (ps-generate (current-buffer) from to 'ps-generate-postscript-with-faces))) + + +(defun ps-count-lines-preprint (from to) + (or (and from to) + (error "The mark is not set now")) + (let ((message-log-max (ps-message-log-max))) ; to count lines of *Messages* + (list (count-lines from to)))) (defun ps-count-lines (from to) @@ -3332,11 +4222,11 @@ file.") "Non-nil means ps-print is printing a region.") -(defun ps-printing-region (region-p from) +(defun ps-printing-region (region-p from to) (setq ps-printing-region-p region-p ps-printing-region (cons (if region-p - (ps-count-lines (point-min) from) + (ps-count-lines (point-min) (min from to)) 1) (ps-count-lines (point-min) (point-max))))) @@ -3356,10 +4246,10 @@ file.") (setq font-list (cdr font-list))) (or (cdr (car font-list)) normal-font))) -(defun ps-fonts (font-sym) +(defsubst ps-fonts (font-sym) (mapcar 'cdr (ps-font-alist font-sym))) -(defun ps-font-number (font-sym font-type) +(defsubst ps-font-number (font-sym font-type) (or (ps-alist-position font-type (ps-font-alist font-sym)) 0)) @@ -3392,8 +4282,8 @@ which long lines wrap around." (get font-sym 'avg-char-width)) (defun ps-line-lengths-internal () - "Display the correspondence between a line length and a font size, -using the current ps-print setup. + "Display the correspondence between a line length and a font size. +Done using the current ps-print setup. Try: pr -t file | awk '{printf \"%3d %s\n\", length($0), $0}' | sort -r | head" (let* ((ps-font-size-internal (or ps-font-size-internal @@ -3451,7 +4341,11 @@ and on the current ps-print setup." (ps-header-title-font-size-internal (or ps-header-title-font-size-internal (ps-get-font-size 'ps-header-title-font-size))) + (ps-line-spacing-internal + (or ps-line-spacing-internal + (ps-get-size ps-line-spacing "line spacing"))) (buf (get-buffer-create "*Nb-Pages*")) + (ils ps-line-spacing-internal) ; initial line spacing (ifs ps-font-size-internal) ; initial font size (ilh (ps-line-height 'ps-font-for-text)) ; initial line height (page-height (progn (ps-get-page-dimensions) @@ -3470,10 +4364,10 @@ and on the current ps-print setup." nb-lpp ; current nb of lines per page nb-page ; current nb of pages ) - (setq lh-min (/ (* ilh fs-min) ifs) + (setq lh-min (/ (- (* (+ ilh ils) fs-min) ils) ifs) nb-lpp-max (floor (/ page-height lh-min)) nb-page-min (ceiling (/ (float nb-lines) nb-lpp-max)) - lh-max (/ (* ilh fs-max) ifs) + lh-max (/ (- (* (+ ilh ils) fs-max) ils) ifs) nb-lpp-min (floor (/ page-height lh-max)) nb-page-max (ceiling (/ (float nb-lines) nb-lpp-min)) nb-page nb-page-min) @@ -3499,7 +4393,7 @@ and on the current ps-print setup." (defun ps-select-font (font-family sym font-size title-font-size) (let ((font-entry (cdr (assq font-family ps-font-info-database)))) (or font-entry - (error "Don't have data to scale font %s. Known fonts families are %s" + (error "Don't have data to scale font %s. Known fonts families are %s" font-family (mapcar 'car ps-font-info-database))) (let ((size (ps-lookup 'size))) @@ -3526,6 +4420,8 @@ and on the current ps-print setup." (ps-select-font ps-header-font-family 'ps-font-for-header ps-header-font-size-internal ps-header-title-font-size-internal) + (ps-select-font ps-footer-font-family 'ps-font-for-footer + ps-footer-font-size-internal ps-footer-font-size-internal) (setq page-width (ps-page-dimensions-get-width page-dimensions) page-height (ps-page-dimensions-get-height page-dimensions)) @@ -3573,8 +4469,8 @@ page-height == bm + print-height + tm ps-top-margin ps-bottom-margin ps-print-height)) - ;; If headers are turned on, deduct the height of the header from - ;; the print height. + ;; If headers are turned on, deduct the height of the header from the print + ;; height. (if ps-print-header (setq ps-header-pad (* ps-header-line-pad (ps-title-line-height 'ps-font-for-header)) @@ -3586,7 +4482,7 @@ page-height == bm + print-height + tm (1- ps-header-lines)) ps-header-pad))) (if (<= ps-print-height 0) - (error "Bad vertical layout: + (error "Bad vertical layout (header): ps-top-margin == %s ps-bottom-margin == %s ps-header-offset == %s @@ -3603,7 +4499,63 @@ page-height == bm + print-height + tm - ho - hh (* (ps-line-height 'ps-font-for-header) (1- ps-header-lines)) ps-header-pad) - ps-print-height)))) + ps-print-height)) + ;; If footers are turned on, deduct the height of the footer from the print + ;; height. + (if ps-print-footer + (setq ps-footer-pad (* ps-footer-line-pad + (ps-title-line-height 'ps-font-for-footer)) + ps-print-height (- ps-print-height + ps-footer-offset + ps-footer-pad + (* (ps-line-height 'ps-font-for-footer) + (1- ps-footer-lines)) + ps-footer-pad))) + (if (<= ps-print-height 0) + (error "Bad vertical layout (footer): +ps-top-margin == %s +ps-bottom-margin == %s +ps-footer-offset == %s +ps-footer-pad == %s +footer-height == %s +page-height == bm + print-height + tm - fo - fh +=> print-height == %d !" + ps-top-margin + ps-bottom-margin + ps-footer-offset + ps-footer-pad + (+ ps-footer-pad + (* (ps-line-height 'ps-font-for-footer) + (1- ps-footer-lines)) + ps-footer-pad) + ps-print-height)) + ;; ps-zebra-stripe-follow is `full' or `full-follow' + (if ps-zebra-stripe-full-p + (let* ((line-height (ps-line-height 'ps-font-for-text)) + (zebra (* (+ line-height ps-line-spacing-internal) + ps-zebra-stripe-height))) + (setq ps-print-height (- (* (floor ps-print-height zebra) zebra) + line-height)) + (if (<= ps-print-height 0) + (error "Bad vertical layout (full zebra stripe follow): +ps-zebra-stripe-follow == %s +ps-zebra-stripe-height == %s +font-text-height == %s +line-spacing == %s +page-height == ((floor print-height ((th + ls) * zh)) * ((th + ls) * zh)) - th +=> print-height == %d !" + ps-zebra-stripe-follow + ps-zebra-stripe-height + (ps-line-height 'ps-font-for-text) + ps-line-spacing-internal + ps-print-height)))))) + + +(defun ps-print-preprint-region (prefix-arg) + (or (ps-mark-active-p) + (error "The mark is not set now")) + (list (point) (mark) (ps-print-preprint prefix-arg))) + (defun ps-print-preprint (prefix-arg) (and prefix-arg @@ -3614,16 +4566,19 @@ page-height == bm + print-height + tm - ho - hh ".ps")) (prompt (format "Save PostScript to file: (default %s) " name)) (res (read-file-name prompt default-directory name nil))) - (while (cond ((not (file-writable-p res)) + (while (cond ((file-directory-p res) + (ding) + (setq prompt "It's a directory")) + ((not (file-writable-p res)) (ding) - (setq prompt "is unwritable")) + (setq prompt "File is unwritable")) ((file-exists-p res) - (setq prompt "exists") + (setq prompt "File exists") (not (y-or-n-p (format "File `%s' exists; overwrite? " res)))) (t nil)) (setq res (read-file-name - (format "File %s; save PostScript to file: " prompt) + (format "%s; save PostScript to file: " prompt) (file-name-directory res) nil nil (file-name-nondirectory res)))) (if (file-directory-p res) @@ -3664,7 +4619,7 @@ page-height == bm + print-height + tm - ho - hh table) "Vector used to map characters to PostScript string escape codes.") -(defun ps-output-string-prim (string) +(defsubst ps-output-string-prim (string) (insert "(") ;insert start-string delimiter (save-excursion ;insert string (insert (string-as-unibyte string))) @@ -3673,11 +4628,16 @@ page-height == bm + print-height + tm - ho - hh (while (progn (skip-chars-forward " -'*-[]-~") (not (eobp))) (let ((special (following-char))) (delete-char 1) - (insert (aref ps-string-escape-codes special)))) + (insert + (if (and (<= 0 special) (<= special 255)) + (aref ps-string-escape-codes special) + ;; insert hexadecimal representation if character code is out of range + (format "\\%04X" special) + )))) (goto-char (point-max)) (insert ")")) ;insert end-string delimiter -(defun ps-init-output-queue () +(defsubst ps-init-output-queue () (setq ps-output-head (list "") ps-output-tail ps-output-head)) @@ -3692,25 +4652,36 @@ page-height == bm + print-height + tm - ho - hh (defsubst ps-print-page-p () - (and (cond ((null ps-first-page)) - ((<= ps-page-postscript ps-last-page) - (<= ps-first-page ps-page-postscript)) - (ps-selected-pages - (ps-selected-pages) - (and (<= ps-first-page ps-page-postscript) - (<= ps-page-postscript ps-last-page))) - (t - nil)) - (cond ((eq ps-even-or-odd-pages 'even) - (= (logand ps-page-postscript 1) 0)) - ((eq ps-even-or-odd-pages 'odd) - (= (logand ps-page-postscript 1) 1)) - (t) - ))) + (setq ps-print-page-p + (and (cond ((null ps-first-page)) + ((<= ps-page-postscript ps-last-page) + (<= ps-first-page ps-page-postscript)) + (ps-selected-pages + (ps-selected-pages) + (and (<= ps-first-page ps-page-postscript) + (<= ps-page-postscript ps-last-page))) + (t + nil)) + (cond ((eq ps-even-or-odd-pages 'even-page) + (= (logand ps-page-postscript 1) 0)) + ((eq ps-even-or-odd-pages 'odd-page) + (= (logand ps-page-postscript 1) 1)) + (t) + )))) + + +(defsubst ps-print-sheet-p () + (setq ps-print-page-p + (cond ((eq ps-even-or-odd-pages 'even-sheet) + (= (logand ps-page-sheet 1) 0)) + ((eq ps-even-or-odd-pages 'odd-sheet) + (= (logand ps-page-sheet 1) 1)) + (t) + ))) (defun ps-output (&rest args) - (when (ps-print-page-p) + (when ps-print-page-p (setcdr ps-output-tail args) (while (cdr ps-output-tail) (setq ps-output-tail (cdr ps-output-tail))))) @@ -3718,9 +4689,6 @@ page-height == bm + print-height + tm - ho - hh (defun ps-output-string (string) (ps-output t string)) -(defun ps-output-list (the-list) - (mapcar 'ps-output the-list)) - ;; Output strings in the list ARGS in the PostScript prologue part. (defun ps-output-prologue (args) (ps-output 'prologue (if (stringp args) (list args) args))) @@ -3753,48 +4721,95 @@ page-height == bm + print-height + tm - ho - hh (goto-char (point-max)) (insert-file fname))) -;; These functions insert the arrays that define the contents of the -;; headers. +;; These functions are used in `ps-mule' to get charset of header and footer. +;; To avoid unnecessary calls to functions in `ps-left-header', +;; `ps-right-header', `ps-left-footer' and `ps-right-footer'. + +(defun ps-generate-string-list (content) + (let (str) + (while content + (setq str (cons (cond + ((stringp (car content)) + (car content)) + ((and (symbolp (car content)) (fboundp (car content))) + (concat "(" (funcall (car content)) ")")) + ((and (symbolp (car content)) (boundp (car content))) + (concat "(" (symbol-value (car content)) ")")) + (t + "")) + str) + content (cdr content))) + (nreverse str))) + +(defvar ps-lh-cache nil) +(defvar ps-rh-cache nil) +(defvar ps-lf-cache nil) +(defvar ps-rf-cache nil) + +(defun ps-header-footer-string () + (and ps-print-header + (setq ps-lh-cache (ps-generate-string-list ps-left-header) + ps-rh-cache (ps-generate-string-list ps-right-header))) + (and ps-print-footer + (setq ps-lf-cache (ps-generate-string-list ps-left-footer) + ps-rf-cache (ps-generate-string-list ps-right-footer))) + (mapconcat 'identity + (append ps-lh-cache ps-rh-cache ps-lf-cache ps-rf-cache) + "")) + +;; These functions insert the arrays that define the contents of the headers. (defun ps-generate-header-line (fonttag &optional content) - (ps-output " [ " fonttag " ") + (ps-output " [" fonttag " ") (cond - ;; Literal strings should be output as is -- the string must - ;; contain its own PS string delimiters, '(' and ')', if necessary. + ;; Literal strings should be output as is -- the string must contain its own + ;; PS string delimiters, '(' and ')', if necessary. ((stringp content) - (ps-output content)) + (ps-output (ps-mule-encode-header-string content fonttag))) - ;; Functions are called -- they should return strings; they will be - ;; inserted as strings and the PS string delimiters added. + ;; Functions are called -- they should return strings; they will be inserted + ;; as strings and the PS string delimiters added. ((and (symbolp content) (fboundp content)) - (ps-output-string (funcall content))) + (ps-output-string (ps-mule-encode-header-string (funcall content) + fonttag))) - ;; Variables will have their contents inserted. They should - ;; contain strings, and will be inserted as strings. + ;; Variables will have their contents inserted. They should contain + ;; strings, and will be inserted as strings. ((and (symbolp content) (boundp content)) - (ps-output-string (symbol-value content))) + (ps-output-string (ps-mule-encode-header-string (symbol-value content) + fonttag))) ;; Anything else will get turned into an empty string. (t (ps-output-string ""))) - (ps-output " ]\n")) + (ps-output "]\n")) -(defun ps-generate-header (name contents) - (ps-output "/" name " [\n") - (if (> ps-header-lines 0) - (let ((count 1)) - (ps-generate-header-line "/h0" (car contents)) - (while (and (< count ps-header-lines) - (setq contents (cdr contents))) - (ps-generate-header-line "/h1" (car contents)) - (setq count (1+ count))) - (ps-output "] def\n")))) +(defun ps-generate-header (name fonttag0 fonttag1 contents) + (ps-output "/" name "[\n") + (and contents (> ps-header-lines 0) + (let ((count 1)) + (ps-generate-header-line fonttag0 (car contents)) + (while (and (< count ps-header-lines) + (setq contents (cdr contents))) + (ps-generate-header-line fonttag1 (car contents)) + (setq count (1+ count))))) + (ps-output "]def\n")) (defun ps-output-boolean (name bool) (ps-output (format "/%s %s def\n" name (if bool "true" "false")))) +(defun ps-output-frame-properties (name alist) + (ps-output "/" name " [" + (ps-format-color (cdr (assq 'fore-color alist)) 0.0) + (ps-format-color (cdr (assq 'back-color alist)) 0.9) + (ps-float-format (or (cdr (assq 'border-width alist)) 0.4)) + (ps-format-color (cdr (assq 'border-color alist)) 0.0) + (ps-format-color (cdr (assq 'shadow-color alist)) 0.0) + "]def\n")) + + (defun ps-background-pages (page-list func) (if page-list (mapcar @@ -3830,21 +4845,22 @@ page-height == bm + print-height + tm - ho - hh ;; Emacs understands the %f format; we'll use it to limit color RGB values ;; to three decimals to cut down some on the size of the PostScript output. -;; Lucid emacsen will have to make do with %s (princ) for floats. +;; XEmacs will have to make do with %s (princ) for floats. (defvar ps-float-format (if (eq ps-print-emacs-type 'emacs) "%0.3f " ; emacs - "%s ")) ; Lucid emacsen + "%s ")) ; xemacs (defun ps-float-format (value &optional default) (let ((literal (or value default))) - (if literal - (format (if (numberp literal) - ps-float-format - "%s ") - literal) - " "))) + (cond ((null literal) + " ") + ((numberp literal) + (format ps-float-format (* literal 1.0))) ; force float number + (t + (format "%s " literal)) + ))) (defun ps-background-text () @@ -4381,13 +5397,19 @@ XSTART YSTART are the relative position for the first page in a sheet.") (paper . 1) (system . 2) (paper-and-system . 3)) - "Alist for error handler message") + "Alist for error handler message.") + + +(defconst ps-zebra-stripe-alist + '((follow . 1) + (full . 2) + (full-follow . 3)) + "Alist for zebra stripe continuation.") (defun ps-begin-file () - (ps-get-page-dimensions) - (setq ps-page-postscript 0 - ps-page-order 0 + (setq ps-page-order 0 + ps-page-printed 0 ps-background-text-count 0 ps-background-image-count 0 ps-background-pages nil @@ -4404,8 +5426,7 @@ XSTART YSTART are the relative position for the first page in a sheet.") ; first buffer printed "\n%%Creator: " (user-full-name) " (using ps-print v" ps-print-version - ")\n%%CreationDate: " - (time-stamp-hh:mm:ss) " " (time-stamp-mon-dd-yyyy) + ")\n%%CreationDate: " (format-time-string "%T %b %d %Y") "\n%%Orientation: " (if ps-landscape-mode "Landscape" "Portrait") "\n%%DocumentNeededResources: font Times-Roman Times-Italic\n%%+ font " @@ -4427,7 +5448,7 @@ XSTART YSTART are the relative position for the first page in a sheet.") (ps-output "%%EndComments\n%%BeginDefaults\n%%PageMedia: " (ps-page-dimensions-get-media dimensions) - "\n%%EndDefaults\n\n%%BeginPrologue\n\n" + "\n%%EndDefaults\n\n%%BeginProlog\n\n" "/languagelevel where{pop}{/languagelevel 1 def}ifelse\n" (format "/ErrorMessage %s def\n\n" (or (cdr (assoc ps-error-handler-message @@ -4461,38 +5482,56 @@ XSTART YSTART are the relative position for the first page in a sheet.") (format "/BottomMargin %s def\n" ps-bottom-margin) (format "/TopMargin %s def\n" ps-top-margin) ; not used (format "/HeaderOffset %s def\n" ps-header-offset) - (format "/HeaderPad %s def\n" ps-header-pad)) + (format "/HeaderPad %s def\n" ps-header-pad) + (format "/FooterOffset %s def\n" ps-footer-offset) + (format "/FooterPad %s def\n" ps-footer-pad) + (format "/FooterLines %s def\n" ps-footer-lines)) - (ps-output-boolean "PrintHeader " ps-print-header) - (ps-output-boolean "PrintOnlyOneHeader" ps-print-only-one-header) - (ps-output-boolean "PrintHeaderFrame " ps-print-header-frame) + (ps-output-boolean "ShowNofN " ps-show-n-of-n) (ps-output-boolean "SwitchHeader " (if (eq ps-switch-header 'duplex) ps-spool-duplex ps-switch-header)) - (ps-output-boolean "ShowNofN " ps-show-n-of-n) + (ps-output-boolean "PrintOnlyOneHeader" ps-print-only-one-header) + (ps-output-boolean "PrintHeader " ps-print-header) + (ps-output-boolean "PrintHeaderFrame " ps-print-header-frame) + (ps-output-frame-properties "HeaderFrameProperties" ps-header-frame-alist) + (ps-output-boolean "PrintFooter " ps-print-footer) + (ps-output-boolean "PrintFooterFrame " ps-print-footer-frame) + (ps-output-frame-properties "FooterFrameProperties" ps-footer-frame-alist) (let ((line-height (ps-line-height 'ps-font-for-text))) - (ps-output (format "/LineHeight %s def\n" line-height) - (format "/LinesPerColumn %d def\n" - (round (/ (+ ps-print-height - (* line-height 0.45)) - line-height))))) + (ps-output (format "/LineSpacing %s def\n" ps-line-spacing-internal) + (format "/ParagraphSpacing %s def\n" + ps-paragraph-spacing-internal) + (format "/LineHeight %s def\n" line-height) + (format "/LinesPerColumn %d def\n" + (let ((height (+ line-height + ps-line-spacing-internal))) + (round (/ (+ ps-print-height + (* height 0.45)) + height)))))) (ps-output-boolean "WarnPaperSize " ps-warn-paper-type) (ps-output-boolean "Zebra " ps-zebra-stripes) - (ps-output-boolean "ZebraFollow " ps-zebra-stripe-follow) (ps-output-boolean "PrintLineNumber " ps-line-number) (ps-output-boolean "SyncLineZebra " (not (integerp ps-line-number-step))) - (ps-output (format "/PrintLineStep %d def\n" + (ps-output (format "/ZebraFollow %d def\n" + (or (cdr (assq ps-zebra-stripe-follow + ps-zebra-stripe-alist)) + 0)) + (format "/PrintLineStep %d def\n" (if (integerp ps-line-number-step) ps-line-number-step ps-zebra-stripe-height)) (format "/PrintLineStart %d def\n" ps-line-number-start) - (format "/ZebraHeight %d def\n" ps-zebra-stripe-height) + "/LineNumberColor " + (ps-format-color ps-line-number-color 0.0) + (format "def\n/ZebraHeight %d def\n" + ps-zebra-stripe-height) "/ZebraColor " (ps-format-color ps-zebra-color 0.95) "def\n/BackgroundColor " - (ps-format-color ps-default-bg 1.0) + (ps-format-color ps-default-background 1.0) "def\n/UseSetpagedevice " (if (eq ps-spool-config 'setpagedevice) "/setpagedevice where{pop languagelevel 2 eq}{false}ifelse" @@ -4529,18 +5568,36 @@ XSTART YSTART are the relative position for the first page in a sheet.") (ps-output "\n" ps-print-prologue-1) (ps-output "\n/printGlobalBackground{\n") - (ps-output-list ps-background-all-pages) + (mapcar 'ps-output ps-background-all-pages) (ps-output "}def\n/printLocalBackground{\n}def\n") - ;; Header fonts - (ps-output (format "/h0 %s(%s)cvn DefFont\n" ; /h0 14 /Helvetica-Bold DefFont + ;; Header/line number fonts + (ps-output (format "/h0 %s(%s)cvn DefFont\n" ; /h0 14/Helvetica-Bold DefFont ps-header-title-font-size-internal (ps-font 'ps-font-for-header 'bold)) - (format "/h1 %s(%s)cvn DefFont\n" ; /h1 12 /Helvetica DefFont + (format "/h1 %s(%s)cvn DefFont\n" ; /h1 12/Helvetica DefFont ps-header-font-size-internal - (ps-font 'ps-font-for-header 'normal))) + (ps-font 'ps-font-for-header 'normal)) + (format "/L0 %s(%s)cvn DefFont\n" ; /L0 6/Times-Italic DefFont + (ps-get-font-size 'ps-line-number-font-size) + ps-line-number-font) + (format "/H0 %s(%s)cvn DefFont\n" ; /H0 12/Helvetica DefFont + ps-footer-font-size-internal + (ps-font 'ps-font-for-footer 'normal)) + "\n\n% ---- These lines must be kept together because... + +/h0 F +/HeaderTitleLineHeight FontHeight def - (ps-output "\n" ps-print-prologue-2 "\n") +/h1 F +/HeaderLineHeight FontHeight def +/HeaderDescent Descent def + +/H0 F +/FooterLineHeight FontHeight def +/FooterDescent Descent def + +% ---- ...because `F' has a side-effect on `FontHeight' and `Descent'\n\n") ;; Text fonts (let ((font (ps-font-alist 'ps-font-for-text)) @@ -4557,7 +5614,7 @@ XSTART YSTART are the relative position for the first page in a sheet.") (ps-output (format "/SpaceWidthRatio %f def\n" (/ (ps-lookup 'space-width) (ps-lookup 'size))))) - (ps-output "\n%%EndPrologue\n\n%%BeginSetup\n") + (ps-output "\n%%EndProlog\n\n%%BeginSetup\n") (unless (eq ps-spool-config 'lpr-switches) (ps-output "\n%%BeginFeature: *Duplex " (ps-boolean-capitalized ps-spool-duplex) @@ -4576,8 +5633,7 @@ XSTART YSTART are the relative position for the first page in a sheet.") (ps-boolean-capitalized ps-manual-feed) "\nBMark /ManualFeed " (ps-boolean-constant ps-manual-feed) - " EMark setpagedevice\n%%EndFeature\n" - "\n/Lines 0 def\n/PageCount 0 def\n\nBeginDoc\n%%EndSetup\n") + " EMark setpagedevice\n%%EndFeature\n\nBeginDoc\n%%EndSetup\n") (and ps-banner-page-when-duplexing (ps-output "\n%%Page: banner 0\nsave showpage restore\n"))) @@ -4589,9 +5645,9 @@ XSTART YSTART are the relative position for the first page in a sheet.") (if (and the-color (listp the-color)) (concat "[" (format ps-color-format - (nth 0 the-color) - (nth 1 the-color) - (nth 2 the-color)) + (* (nth 0 the-color) 1.0) ; force float number + (* (nth 1 the-color) 1.0) ; force float number + (* (nth 2 the-color) 1.0)) ; force float number "] ") (ps-float-format (if (numberp the-color) the-color default))))) @@ -4635,32 +5691,52 @@ XSTART YSTART are the relative position for the first page in a sheet.") (and (buffer-modified-p) " (unsaved)"))))) +(defun ps-get-size (size mess &optional arg) + (let ((siz (cond ((numberp size) + size) + ((and (consp size) + (numberp (car size)) + (numberp (cdr size))) + (if ps-landscape-mode + (car size) + (cdr size))) + (t + -1)))) + (and (< siz 0) + (error "Invalid %s `%S'%s" + mess size + (if arg + (format " for `%S'" arg) + ""))) + siz)) + + (defun ps-get-font-size (font-sym) - (let ((font-size (symbol-value font-sym))) - (cond ((numberp font-size) - font-size) - ((and (consp font-size) - (numberp (car font-size)) - (numberp (cdr font-size))) - (if ps-landscape-mode - (car font-size) - (cdr font-size))) - (t - (error "Invalid font size `%S' for `%S'" font-size font-sym))))) + (ps-get-size (symbol-value font-sym) "font size" font-sym)) + + +(defun ps-rgb-color (color default) + (cond ((and color (listp color) (= (length color) 3) + (let ((cl color) + (ok t) e) + (while (and ok cl) + (setq e (car cl) + cl (cdr cl) + ok (and (floatp e) (<= 0.0 e) (<= e 1.0)))) + ok)) + color) + ((and (floatp color) (<= 0.0 color) (<= color 1.0)) + (list color color color)) + ((stringp color) (ps-color-scale color)) + (t (list default default default)) + )) (defun ps-begin-job () ;; prologue files - (let ((last-char (aref ps-postscript-code-directory - (1- (length ps-postscript-code-directory))))) - (or (eq last-char ?/) - (and ps-windows-system (eq last-char ?\\)) - (setq ps-postscript-code-directory - (concat ps-postscript-code-directory "/")))) (or (equal ps-mark-code-directory ps-postscript-code-directory) (setq ps-print-prologue-0 (ps-prologue-file 0) ps-print-prologue-1 (ps-prologue-file 1) - ps-print-prologue-2 (ps-prologue-file 2) ps-mark-code-directory ps-postscript-code-directory)) ;; selected pages (let (new page) @@ -4699,12 +5775,24 @@ XSTART YSTART are the relative position for the first page in a sheet.") (and (re-search-backward "^%%Trailer$" nil t) (delete-region (match-beginning 0) (point-max)))) ;; miscellaneous - (setq ps-showline-count (car ps-printing-region) - ps-page-count 0 + (setq ps-zebra-stripe-full-p (memq ps-zebra-stripe-follow + '(full full-follow)) + ps-page-postscript 0 + ps-page-sheet 0 + ps-page-n-up 0 + ps-page-column 0 + ps-lines-printed 0 + ps-print-page-p t + ps-showline-count (car ps-printing-region) + ps-line-spacing-internal (ps-get-size ps-line-spacing + "line spacing") + ps-paragraph-spacing-internal (ps-get-size ps-paragraph-spacing + "paragraph spacing") ps-font-size-internal (ps-get-font-size 'ps-font-size) ps-header-font-size-internal (ps-get-font-size 'ps-header-font-size) ps-header-title-font-size-internal (ps-get-font-size 'ps-header-title-font-size) + ps-footer-font-size-internal (ps-get-font-size 'ps-footer-font-size) ps-control-or-escape-regexp (cond ((eq ps-print-control-characters '8-bit) (string-as-unibyte "[\000-\037\177-\377]")) @@ -4713,8 +5801,17 @@ XSTART YSTART are the relative position for the first page in a sheet.") ((eq ps-print-control-characters 'control) "[\000-\037\177]") (t "[\t\n\f]")) - ps-default-foreground (ps-rgb-color ps-default-fg 0.0) - ps-default-color (and ps-print-color-p ps-default-foreground) + ps-default-background (ps-rgb-color + (if (eq ps-default-bg t) + (ps-face-background-name 'default) + ps-default-bg) + 1.0) + ps-default-foreground (ps-rgb-color + (if (eq ps-default-fg t) + (ps-face-foreground-name 'default) + ps-default-fg) + 0.0) + ps-default-color (and (eq ps-print-color-p t) ps-default-foreground) ps-current-color ps-default-color ;; Set the color scale. We do it here instead of in the defvar so ;; that ps-print can be dumped into emacs. This expression can't be @@ -4722,50 +5819,29 @@ XSTART YSTART are the relative position for the first page in a sheet.") ps-color-p (and ps-print-color-p (ps-color-device)) ps-print-color-scale (if ps-color-p (float (car (ps-color-values "white"))) - 1.0))) - + 1.0)) + ;; initialize page dimensions + (ps-get-page-dimensions) + ;; final check + (and ps-color-p + (equal ps-default-background ps-default-foreground) + (error + (concat + "`ps-default-fg' and `ps-default-bg' have the same color.\n" + "Text won't appear on page. Please, check these variables.")))) -(defun ps-rgb-color (color default) - (cond ((and color (listp color)) color) - ((stringp color) (ps-color-scale color)) - ((numberp color) (list color color color)) - (t (list default default default)) - )) +(defun ps-page-number () + (if ps-print-only-one-header + (1+ (/ (1- ps-page-column) ps-number-of-columns)) + ps-page-column)) -(defmacro ps-page-number () - `(1+ (/ (1- ps-page-count) ps-number-of-columns))) -(defun ps-end-file (needs-begin-file) - (let (ps-even-or-odd-pages) - (ps-flush-output) - ;; Back to the PS output buffer to set the last page n-up printing - (save-excursion - (let ((pages-per-sheet (mod ps-page-postscript ps-n-up-printing)) - case-fold-search) - (set-buffer ps-spool-buffer) - (goto-char (point-max)) - (and (> pages-per-sheet 0) - (re-search-backward "^[0-9]+ BeginSheet$" nil t) - (replace-match (format "%d BeginSheet" pages-per-sheet) t)))) - ;; Set dummy page - (and ps-spool-duplex (= (mod ps-page-order 2) 1) - (let (ps-first-page) - (ps-dummy-page))) - ;; Set end of PostScript file - (or ps-first-page - (ps-output "EndSheet\n")) - (setq ps-first-page nil) ; disable selected pages - (ps-output "\n%%Trailer\n%%Pages: " - (format "%d" - (if (and needs-begin-file - ps-banner-page-when-duplexing) - (1+ ps-page-order) - ps-page-order)) - "\n\nEndDoc\n\n%%EOF\n"))) +(defsubst ps-end-page () + (ps-output "EndPage\nEndDSCPage\n")) -(defun ps-next-page () +(defsubst ps-next-page () (ps-end-page) (ps-flush-output) (ps-begin-page)) @@ -4773,94 +5849,104 @@ XSTART YSTART are the relative position for the first page in a sheet.") (defun ps-header-sheet () ;; Print only when a new sheet begins. - (let ((print-posterior (ps-print-page-p))) - (setq ps-page-postscript (1+ ps-page-postscript)) - (cond ((ps-print-page-p) - (setq ps-page-order (1+ ps-page-order)) - (and (or print-posterior ps-even-or-odd-pages) (> ps-page-order 1) - (ps-output "EndSheet\n")) - (ps-output (if ps-n-up-on - (format "\n%%%%Page: (%d \\(%d\\)) %d\n" - ps-page-order ps-page-postscript ps-page-order) - (format "\n%%%%Page: %d %d\n" - ps-page-postscript ps-page-order)) - (format "%d BeginSheet\nBeginDSCPage\n" - ps-n-up-printing))) - (print-posterior - (let (ps-first-page) - (ps-output "EndSheet\n")))))) - - -(defsubst ps-header-page () + (and ps-print-page-p (> ps-page-sheet 0) + (ps-output "EndSheet\n")) + (setq ps-page-sheet (1+ ps-page-sheet)) + (when (ps-print-sheet-p) + (setq ps-page-order (1+ ps-page-order)) + (ps-output (if ps-n-up-on + (format "\n%%%%Page: (%d \\(%d\\)) %d\n" + ps-page-order ps-page-postscript ps-page-order) + (format "\n%%%%Page: %d %d\n" + ps-page-postscript ps-page-order)) + ;; spooling needs to redefine Lines and PageCount on each page + "/Lines 0 def\n/PageCount 0 def\n" + (format "%d BeginSheet\nBeginDSCPage\n" + ps-n-up-printing)))) + + +(defun ps-header-page () ;; set total line and page number when printing has finished ;; (see `ps-generate') - (run-hooks - (if (prog1 - (zerop (mod ps-page-count ps-number-of-columns)) - (setq ps-page-count (1+ ps-page-count))) - (prog1 - (if (zerop (mod ps-page-postscript ps-n-up-printing)) - ;; Print only when a new sheet begins. - (progn - (ps-header-sheet) - 'ps-print-begin-sheet-hook) - ;; Print only when a new page begins. - (setq ps-page-postscript (1+ ps-page-postscript)) - (ps-output "BeginDSCPage\n") - 'ps-print-begin-page-hook) - (ps-background ps-page-postscript)) - ;; Print only when a new column begins. - (ps-output "BeginDSCPage\n") - 'ps-print-begin-column-hook))) + (if (zerop (mod ps-page-column ps-number-of-columns)) + (progn + (setq ps-page-postscript (1+ ps-page-postscript)) + (when (ps-print-page-p) + (ps-print-sheet-p) + (if (zerop (mod ps-page-n-up ps-n-up-printing)) + ;; Print only when a new sheet begins. + (progn + (ps-header-sheet) + (run-hooks 'ps-print-begin-sheet-hook)) + ;; Print only when a new page begins. + (ps-output "BeginDSCPage\n") + (run-hooks 'ps-print-begin-page-hook)) + (ps-background ps-page-postscript) + (setq ps-page-n-up (1+ ps-page-n-up)) + (and ps-print-page-p + (setq ps-page-printed (1+ ps-page-printed))))) + ;; Print only when a new column begins. + (ps-output "BeginDSCPage\n") + (run-hooks 'ps-print-begin-column-hook)) + (setq ps-page-column (1+ ps-page-column))) (defun ps-begin-page () - (ps-get-page-dimensions) (setq ps-width-remaining ps-print-width ps-height-remaining ps-print-height) (ps-header-page) (ps-output (format "/LineNumber %d def\n" ps-showline-count) - (format "/PageNumber %d def\n" (if ps-print-only-one-header - (ps-page-number) - ps-page-count))) + (format "/PageNumber %d def\n" (ps-page-number))) (when ps-print-header - (ps-generate-header "HeaderLinesLeft" ps-left-header) - (ps-generate-header "HeaderLinesRight" ps-right-header) - (ps-output (format "%d SetHeaderLines\n" ps-header-lines))) - - (ps-output "BeginPage\n") + (ps-generate-header "HeaderLinesLeft" "/h0" "/h1" + (or ps-lh-cache ps-left-header)) + (ps-generate-header "HeaderLinesRight" "/h0" "/h1" + (or ps-rh-cache ps-right-header)) + (ps-output (format "%d SetHeaderLines\n" ps-header-lines)) + (setq ps-lh-cache nil + ps-rh-cache nil)) + + (when ps-print-footer + (ps-generate-header "FooterLinesLeft" "/H0" "/H0" + (or ps-lf-cache ps-left-footer)) + (ps-generate-header "FooterLinesRight" "/H0" "/H0" + (or ps-rf-cache ps-right-footer)) + (ps-output (format "%d SetFooterLines\n" ps-footer-lines)) + (setq ps-lf-cache nil + ps-rf-cache nil)) + + (ps-output (number-to-string ps-lines-printed) " BeginPage\n") (ps-set-font ps-current-font) (ps-set-bg ps-current-bg) (ps-set-color ps-current-color) (ps-mule-begin-page)) -(defun ps-end-page () - (ps-output "EndPage\nEndDSCPage\n")) - -(defun ps-dummy-page () - (let ((ps-n-up-printing 0)) - (ps-header-sheet)) - (ps-output "/PrintHeader false def -/ColumnIndex 0 def -/PrintLineNumber false def -BeginPage -EndPage -EndDSCPage\n") - (setq ps-page-postscript ps-n-up-printing)) - -(defun ps-next-line () - (setq ps-showline-count (1+ ps-showline-count)) - (let ((lh (ps-line-height 'ps-font-for-text))) +(defsubst ps-skip-newline (limit) + (setq ps-showline-count (1+ ps-showline-count) + ps-lines-printed (1+ ps-lines-printed)) + (and (< (point) limit) + (forward-char 1))) + +(defsubst ps-next-line () + (setq ps-showline-count (1+ ps-showline-count) + ps-lines-printed (1+ ps-lines-printed)) + (let* ((paragraph-p (and ps-paragraph-regexp + (looking-at ps-paragraph-regexp))) + (lh (+ (ps-line-height 'ps-font-for-text) + (if paragraph-p + ps-paragraph-spacing-internal + ps-line-spacing-internal)))) (if (< ps-height-remaining lh) (ps-next-page) (setq ps-width-remaining ps-print-width ps-height-remaining (- ps-height-remaining lh)) - (ps-output "HL\n")))) + (ps-output (if paragraph-p "PHL\n" "LHL\n"))))) (defun ps-continue-line () - (let ((lh (ps-line-height 'ps-font-for-text))) + (setq ps-lines-printed (1+ ps-lines-printed)) + (let ((lh (+ (ps-line-height 'ps-font-for-text) ps-line-spacing-internal))) (if (< ps-height-remaining lh) (ps-next-page) (setq ps-width-remaining ps-print-width @@ -4874,6 +5960,16 @@ EndDSCPage\n") (cons to (* todo char-width)) (cons (+ from avail) ps-width-remaining)))) +(defun ps-basic-plot-str (from to string) + (let* ((wrappoint (ps-find-wrappoint from to + (ps-avg-char-width 'ps-font-for-text))) + (to (car wrappoint)) + (str (substring string from to))) + (ps-mule-prepare-ascii-font str) + (ps-output-string str) + (ps-output " S\n") + wrappoint)) + (defun ps-basic-plot-string (from to &optional bg-color) (let* ((wrappoint (ps-find-wrappoint from to (ps-avg-char-width 'ps-font-for-text))) @@ -4935,19 +6031,24 @@ EndDSCPage\n") " FG\n")) +(defsubst ps-plot-string (string) + (ps-plot 'ps-basic-plot-str 0 (length string) string)) + + (defvar ps-current-effect 0) (defun ps-plot-region (from to font &optional fg-color bg-color effects) - (if (not (equal font ps-current-font)) + (or (equal font ps-current-font) (ps-set-font font)) ;; Specify a foreground color only if one's specified and it's ;; different than the current. - (if (not (equal fg-color ps-current-color)) - (ps-set-color fg-color)) + (let ((fg (or fg-color ps-default-foreground))) + (or (equal fg ps-current-color) + (ps-set-color fg))) - (if (not (equal bg-color ps-current-bg)) + (or (equal bg-color ps-current-bg) (ps-set-bg bg-color)) ;; Specify effects (underline, overline, box, etc) @@ -4966,10 +6067,19 @@ EndDSCPage\n") ;; ...break the region up into chunks separated by tabs, linefeeds, ;; pagefeeds, control characters, and plot each chunk. (while (< from to) + ;; skip lines between cut markers + (and ps-begin-cut-regexp ps-end-cut-regexp + (looking-at ps-begin-cut-regexp) + (progn + (goto-char (match-end 0)) + (and (re-search-forward ps-end-cut-regexp to 'noerror) + (= (following-char) ?\n) + (forward-char 1)) + (setq from (point)))) (if (re-search-forward ps-control-or-escape-regexp to t) ;; region with some control characters or some multi-byte characters (let* ((match-point (match-beginning 0)) - (match (char-after match-point)) + (match (char-after match-point)) (composition (ps-e-find-composition from (1+ match-point)))) (if composition (if (and (nth 2 composition) @@ -4994,14 +6104,24 @@ EndDSCPage\n") bg-color)))) ((= match ?\n) ; newline - (ps-next-line)) + (if (looking-at "\f[^\n]") + ;; \n\ftext\n ==>> next page, but keep line counting!! + (progn + (ps-skip-newline to) + (ps-next-page)) + ;; \n\f\n ==>> it'll be handled by form feed + ;; \ntext\n ==>> next line + (ps-next-line))) ((= match ?\f) ; form feed ;; do not skip page if previous character is NEWLINE and ;; it is a beginning of page. - (or (and (equal (char-after (1- match-point)) ?\n) - (= ps-height-remaining ps-print-height)) - (ps-next-page))) + (unless (and (equal (char-after (1- match-point)) ?\n) + (= ps-height-remaining ps-print-height)) + ;; \f\n ==>> skip \n, but keep line counting!! + (and (equal (following-char) ?\n) + (ps-skip-newline to)) + (ps-next-page))) (composition ; a composite sequence (ps-plot 'ps-mule-plot-composition match-point (point) bg-color)) @@ -5066,6 +6186,10 @@ return the attribute vector. If FACE is not a valid face name, it is used default face." (cond + (ps-black-white-faces-alist + (or (and (symbolp face) + (cdr (assq face ps-black-white-faces-alist))) + (vector 0 nil nil))) ((symbolp face) (cdr (or (assq face ps-print-face-extension-alist) (assq face ps-print-face-alist) @@ -5215,10 +6339,14 @@ If FACE is not a valid face name, it is used default face." ;; to avoid compilation gripes -(eval-and-compile - (defun ps-print-ensure-fontified (start end) - (and (boundp 'lazy-lock-mode) (symbol-value 'lazy-lock-mode) - (lazy-lock-fontify-region start end)))) +(defun ps-print-ensure-fontified (start end) + (cond + ((and (boundp 'jit-lock-mode) (symbol-value 'jit-lock-mode)) + (defalias 'ps-jitify 'jit-lock-fontify-now) ; avoid compilation gripes + (ps-jitify start end)) + ((and (boundp 'lazy-lock-mode) (symbol-value 'lazy-lock-mode)) + (defalias 'ps-lazify 'lazy-lock-fontify-region) ; avoid compilation gripes + (ps-lazify start end)))) (defun ps-generate-postscript-with-faces (from to) @@ -5230,6 +6358,13 @@ If FACE is not a valid face name, it is used default face." ps-build-face-reference) (message "Collecting face information...") (ps-build-reference-face-lists)) + + ;; Black/white printer. + (setq ps-black-white-faces-alist nil) + (and (eq ps-print-color-p 'black-white) + (ps-extend-face-list ps-black-white-faces nil + 'ps-black-white-faces-alist)) + ;; Generate some PostScript. (save-restriction (narrow-to-region from to) @@ -5237,7 +6372,7 @@ If FACE is not a valid face name, it is used default face." (let ((face 'default) (position to)) (cond - ((memq ps-print-emacs-type '(xemacs lucid)) + ((eq ps-print-emacs-type 'xemacs) ;; Build the list of extents... (let ((a (cons 'dummy nil)) record type extent extent-list) @@ -5248,22 +6383,20 @@ If FACE is not a valid face name, it is used default face." ;; Loop through the extents... (while a (setq record (car a) - position (car record) - record (cdr record) - type (car record) record (cdr record) + type (car record) + record (cdr record) extent (car record)) ;; Plot up to this record. ;; XEmacs 19.12: for some reason, we're getting into a ;; situation in which some of the records have ;; positions less than 'from'. Since we've narrowed - ;; the buffer, this'll generate errors. This is a - ;; hack, but don't call ps-plot-with-face unless from > - ;; point-min. + ;; the buffer, this'll generate errors. This is a hack, + ;; but don't call ps-plot-with-face unless from > point-min. (and (>= from (point-min)) (ps-plot-with-face from (min position (point-max)) face)) @@ -5287,15 +6420,19 @@ If FACE is not a valid face name, it is used default face." (let ((property-change from) (overlay-change from) (save-buffer-invisibility-spec buffer-invisibility-spec) - (buffer-invisibility-spec nil)) + (buffer-invisibility-spec nil) + before-string after-string) (while (< from to) (and (< property-change to) ; Don't search for property change ; unless previous search succeeded. (setq property-change (next-property-change from nil to))) (and (< overlay-change to) ; Don't search for overlay change ; unless previous search succeeded. - (setq overlay-change (min (next-overlay-change from) to))) - (setq position (min property-change overlay-change)) + (setq overlay-change (min (ps-e-next-overlay-change from) + to))) + (setq position (min property-change overlay-change) + before-string nil + after-string nil) ;; The code below is not quite correct, ;; because a non-nil overlay invisible property ;; which is inactive according to the current value @@ -5312,29 +6449,43 @@ If FACE is not a valid face name, it is used default face." 'emacs--invisible--face) ((get-text-property from 'face)) (t 'default))) - (let ((overlays (overlays-at from)) + (let ((overlays (ps-e-overlays-at from)) (face-priority -1)) ; text-property (while (and overlays (not (eq face 'emacs--invisible--face))) (let* ((overlay (car overlays)) - (overlay-invisible (overlay-get overlay 'invisible)) - (overlay-priority (or (overlay-get overlay 'priority) - 0))) + (overlay-invisible + (ps-e-overlay-get overlay 'invisible)) + (overlay-priority + (or (ps-e-overlay-get overlay 'priority) 0))) (and (> overlay-priority face-priority) - (setq face - (cond ((if (eq save-buffer-invisibility-spec t) - (not (null overlay-invisible)) - (or (memq overlay-invisible - save-buffer-invisibility-spec) - (assq overlay-invisible - save-buffer-invisibility-spec))) - 'emacs--invisible--face) - ((overlay-get overlay 'face)) - (t face)) - face-priority overlay-priority))) + (setq before-string + (or (ps-e-overlay-get overlay 'before-string) + before-string) + after-string + (or (and (<= (ps-e-overlay-end overlay) position) + (ps-e-overlay-get overlay 'after-string)) + after-string) + face-priority overlay-priority + face + (cond + ((if (eq save-buffer-invisibility-spec t) + (not (null overlay-invisible)) + (or (memq overlay-invisible + save-buffer-invisibility-spec) + (assq overlay-invisible + save-buffer-invisibility-spec))) + 'emacs--invisible--face) + ((ps-e-overlay-get overlay 'face)) + (t face) + )))) (setq overlays (cdr overlays)))) ;; Plot up to this record. + (and before-string + (ps-plot-string before-string)) (ps-plot-with-face from position face) + (and after-string + (ps-plot-string after-string)) (setq from position))))) (ps-plot-with-face from to face)))) @@ -5370,21 +6521,21 @@ If FACE is not a valid face name, it is used default face." (goto-char (point-min)) (or (looking-at (regexp-quote ps-adobe-tag)) (setq needs-begin-file t)) - (save-excursion - (set-buffer ps-source-buffer) - (ps-begin-job) - (when needs-begin-file - (ps-begin-file) - (ps-mule-initialize)) - (ps-mule-begin-job from to) - (ps-selected-pages) - (ps-begin-page)) + (set-buffer ps-source-buffer) + (save-excursion + (let ((ps-print-page-p t) + ps-even-or-odd-pages) + (ps-begin-job) + (when needs-begin-file + (ps-begin-file) + (ps-mule-initialize)) + (ps-mule-begin-job from to) + (ps-selected-pages))) + (ps-begin-page) (funcall genfunc from to) (ps-end-page) - - (ps-end-file needs-begin-file) - (ps-end-job) + (ps-end-job needs-begin-file) ;; Setting this variable tells the unwind form that the ;; the PostScript was generated without error. @@ -5402,20 +6553,48 @@ If FACE is not a valid face name, it is used default face." (and ps-razzle-dazzle (message "Formatting...done")))))) -(defun ps-end-job () - (ps-flush-output) - (let ((total-lines (cdr ps-printing-region)) - (total-pages (if ps-print-only-one-header - (ps-page-number) - ps-page-count)) - case-fold-search) - (set-buffer ps-spool-buffer) - ;; Back to the PS output buffer to set the page count - (goto-char (point-min)) - (and (re-search-forward "^/Lines 0 def\n/PageCount 0 def$" nil t) - (replace-match (format "/Lines %d def\n/PageCount %d def" - total-lines total-pages) t))) - ;; selected pages +(defun ps-end-job (needs-begin-file) + (let ((previous-print ps-print-page-p) + (ps-print-page-p t)) + (ps-flush-output) + (save-excursion + (let ((pages-per-sheet (mod ps-page-printed ps-n-up-printing)) + (total-lines (cdr ps-printing-region)) + (total-pages (ps-page-number))) + (set-buffer ps-spool-buffer) + (let (case-fold-search) + ;; Back to the PS output buffer to set the last page n-up printing + (goto-char (point-max)) + (and (> pages-per-sheet 0) + (re-search-backward "^[0-9]+ BeginSheet$" nil t) + (replace-match (format "%d BeginSheet" pages-per-sheet) t)) + ;; Back to the PS output buffer to set the page count + (goto-char (point-min)) + (while (re-search-forward "^/Lines 0 def\n/PageCount 0 def$" nil t) + (replace-match (format "/Lines %d def\n/PageCount %d def" + total-lines total-pages) t))))) + ;; Set dummy page + (and ps-spool-duplex (= (mod ps-page-order 2) 1) + (let ((ps-n-up-printing 0)) + (ps-header-sheet) + (ps-output "/PrintHeader false def\n/ColumnIndex 0 def\n" + "/PrintLineNumber false def\n" + (number-to-string ps-lines-printed) " BeginPage\n") + (ps-end-page))) + ;; Set end of PostScript file + (and previous-print + (ps-output "EndSheet\n")) + (ps-output "\n%%Trailer\n%%Pages: " + (number-to-string + (if (and needs-begin-file + ps-banner-page-when-duplexing) + (1+ ps-page-order) + ps-page-order)) + "\n\nEndDoc\n\n%%EOF\n") + (and ps-end-with-control-d + (ps-output "\C-d")) + (ps-flush-output)) + ;; disable selected pages (setq ps-selected-pages nil)) @@ -5439,7 +6618,7 @@ If FACE is not a valid face name, it is used default face." (let* ((coding-system-for-write 'raw-text-unix) (ps-printer-name (or ps-printer-name (and (boundp 'printer-name) - printer-name))) + (symbol-value 'printer-name)))) (ps-lpr-switches (append ps-lpr-switches (and (stringp ps-printer-name) @@ -5484,10 +6663,12 @@ If FACE is not a valid face name, it is used default face." (defun ps-kill-emacs-check () (let (ps-buffer) (and (setq ps-buffer (get-buffer ps-spool-buffer-name)) + (buffer-name ps-buffer) ; check if it's not killed (buffer-modified-p ps-buffer) (y-or-n-p "Unprinted PostScript waiting; print now? ") (ps-despool)) (and (setq ps-buffer (get-buffer ps-spool-buffer-name)) + (buffer-name ps-buffer) ; check if it's not killed (buffer-modified-p ps-buffer) (not (yes-or-no-p "Unprinted PostScript waiting; exit anyway? ")) (error "Unprinted PostScript")))) @@ -5715,7 +6896,7 @@ STRING should contain only ASCII characters.") "Adjust current font if current charset is not ASCII.") (autoload 'ps-mule-plot-string "ps-mule" - "Generate PostScript code for ploting characters in the region FROM and TO. + "Generate PostScript code for plotting characters in the region FROM and TO. It is assumed that all characters in this region belong to the same charset. @@ -5738,9 +6919,15 @@ This checks if all multi-byte characters in the region are printable or not.") (autoload 'ps-mule-begin-page "ps-mule" "Initialize multi-byte charset for printing current page.") +(autoload 'ps-mule-encode-header-string "ps-mule" + "Generate PostScript code for plotting characters in header STRING. + +It is assumed that the length of STRING is not zero.") + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (provide 'ps-print) +;;; arch-tag: fb06a585-1112-4206-885d-a57d95d50579 ;;; ps-print.el ends here