1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-15 10:30:25 -08:00

Some comment and doc fixes.

(ps-print-version): New version number (3.05.1).
(ps-adobe-tag): Replace defvar by defcustom, and doc fix.
(ps-print-with-faces, ps-print-without-faces)
(ps-spool-with-faces, ps-spool-without-faces): Add arg REGION-P.
(ps-print-region-with-faces, ps-print-region)
(ps-spool-region, ps-spool-region-with-faces): Fix calls to
the functions above.
(ps-setup): Print value of ps-zebra-stripe, ps-number-of-zebra,
ps-line-number, ps-print-background-image,
and ps-print-background-text.
(ps-print-prologue-1): Bug fix in PostScript programming:
/BeginDSCPage, /BeginPage.
(ps-showpage-count, ps-ref-bold-faces, ps-ref-italic-faces)
(ps-ref-underlined-faces, font-lock-face-attributes)
(ps-initialize-faces): Vars deleted.
(ps-override-list, ps-extension-to-bit-face)
(ps-extension-to-screen-face, ps-initialize-faces, ps-header-height)
(ps-hard-lf, ps-soft-lf, ps-get-face, ps-map-font-lock): Fn deleted.
(ps-extend-face-list, ps-extend-face): Doc fix.
(ps-print-face-alist): New var to handle face alist.
(ps-printing-region): New var and fn.
(ps-header-page, ps-set-face-bold, ps-set-face-italic)
(ps-set-face-underline, ps-set-face-attribute, ps-map-face): New fn.
(ps-rmail-mode-hook, ps-rmail-print-message-from-summary)
(ps-print-message-from-summary, ps-vm-print-message-from-summary):
Fns moved.
(ps-background): New argument PAGE-NUMBER.
(ps-begin-file): Bug fix and print proper line number in a region.
(ps-begin-page): Call ps-header-page.
(ps-get-buffer-name): Indicates in the header when printing a region.
(ps-end-page): Delete ps-showpage-count.
(ps-dummy-page): Calls ps-header-page.
(ps-set-color): Programming improvement.
(ps-plot-region): Doc fix.
(ps-face-attributes): Same functionality as deleted ps-get-face.
(ps-build-reference-face-lists): Do the job by calling
ps-set-face-bold and ps-bold-faces, and friends.
This commit is contained in:
Richard M. Stallman 1997-09-06 02:52:00 +00:00
parent 3c72adf28e
commit a18ed1290d

View file

@ -6,11 +6,11 @@
;; Author: Jacques Duthen <duthen@cegelec-red.fr>
;; Maintainer: Vinicius Jose Latorre <vinicius@cpqd.br>
;; Keywords: print, PostScript
;; Time-stamp: <97/08/09 1:30:17 vinicius>
;; Version: 3.05
;; Time-stamp: <97/08/27 13:00:37 vinicius>
;; Version: 3.05.1
(defconst ps-print-version "3.05"
"ps-print.el, v 3.05 <97/08/09 vinicius>
(defconst ps-print-version "3.05.1"
"ps-print.el, v 3.05.1 <97/08/24 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,
@ -365,16 +365,15 @@ Please send all bug fixes and enhancements to
;; Line Number
;; -----------
;;
;; The variable `ps-line-number' determines if lines will be
;; numerated (non-nil value) or not (nil value).
;; The default is not numerated (nil value).
;; 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).
;;
;;
;; Zebra Stripes
;; -------------
;;
;; Zebra stripes are a kind of background which you can request
;; to appear "underneath" the text. 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
@ -386,14 +385,17 @@ Please send all bug fixes and enhancements to
;; XXXXXXXXXXXXXXXXXXXXXXXX
;; XXXXXXXXXXXXXXXXXXXXXXXX
;;
;; The X's here represent a rectangle area filled with a light gray color.
;; The height, in lines, of the gray area pis controlled by
;; The X's here 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 variable `ps-zebra-stripe' determines if zebra stripe lines will be
;; printed (non-nil value) or not (nil value).
;; The default is not print zebra stripes (nil value).
;; The variable `ps-zebra-stripe' controls whether to print zebra stripes.
;; Non-nil means yes, nil means no. The default is nil.
;;
;; See also section How Ps-Print Has A Text And/Or Image On Background.
;;
;;
;; Font managing
@ -439,7 +441,7 @@ Please send all bug fixes and enhancements to
;; - 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)
;; - delete the leading `%' (which is the PostScript comment character)
;; - replace in this line `Courier' by the new font (say `Helvetica')
;; to get the line:
;; `3 cm 20 cm moveto 10 /Helvetica ReportFontInfo showpage'
@ -480,8 +482,8 @@ Please send all bug fixes and enhancements to
;; by uncommenting the line:
;; % 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,
;; 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.
;; Anyway, as ghostscript fonts are autoload, you won't get
;; much font info.
@ -542,21 +544,21 @@ Please send all bug fixes and enhancements to
;; overline - like underline, but the line is over the text.
;; shadow - text will have a shadow.
;; box - text will be surrounded by a box.
;; outline - only the contour of the characters will be printed.
;; outline - print characters as hollow outlines.
;;
;; See the documentation for `ps-extend-face' and `ps-extend-face-list'.
;;
;; Let's, for example, remap font-lock-keyword-face to another foreground color
;; and bold attribute:
;;
;; (ps-extend-face '(font-lock-keyword-face "RoyalBlue" nil bold))
;;
;; Note: the only attributes that have effect on screen are: bold, italic and
;; underline. All other screen effect is ignored.
;; (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.
;;
;; NOTE: the only face attributes that have an effect are bold, italic and
;; underline. All other attributes are ignored.
;;
;;
;; How Ps-Print Has A Text And/Or Image On Background
;; --------------------------------------------------
@ -609,7 +611,7 @@ Please send all bug fixes and enhancements to
;; 4. Print background texts only for current page (if any)
;; 5. Print background images only for current page (if any)
;; 6. Print header
;; 7. Print buffer text (with faces, if specified) with line number
;; 7. Print buffer text (with faces, if specified) and line number
;;
;;
;; Utilities
@ -631,8 +633,9 @@ Please send all bug fixes and enhancements to
;; 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.
;;
;; NOTE: line folding is not taken into account in this process and could
;; change the results.
;;
;;
;; New since version 1.5
@ -660,7 +663,7 @@ Please send all bug fixes and enhancements to
;;
;; [jack] 960517 Jacques Duthen <duthen@cegelec-red.fr>
;;
;; Font familiy and float size for text and header.
;; Font family and float size for text and header.
;; Landscape mode.
;; Multiple columns.
;; Tools for page setup.
@ -704,7 +707,6 @@ Please send all bug fixes and enhancements to
;;
;; Add `ps-print-hook' (I don't know how to do that (yet!)).
;; Add 4-up capability (really needed?).
;; Add line numbers (should not be too hard).
;; Add `ps-non-bold-faces' and `ps-non-italic-faces' (should be easy).
;; Put one header per page over the columns (easy but needed?).
;; Improve the memory management for big files (hard?).
@ -1255,10 +1257,12 @@ this variable."
:type 'boolean
:group 'ps-print)
(defvar ps-adobe-tag "%!PS-Adobe-3.0\n"
(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.")
printers require slightly different versions of this line."
:type 'string
:group 'ps-print)
(defcustom ps-build-face-reference t
"*Non-nil means build the reference face lists.
@ -1318,7 +1322,7 @@ are using a window system, so it has a way to determine color values."
"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)))
(ps-print-without-faces from to filename))
(ps-print-without-faces from to filename t))
;;;###autoload
@ -1328,9 +1332,7 @@ 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)))
(ps-generate (current-buffer) from to
'ps-generate-postscript-with-faces)
(ps-print-with-faces from to filename))
(ps-print-with-faces from to filename t))
;;;###autoload
@ -1363,7 +1365,7 @@ Like `ps-spool-buffer', but spools just the current region.
Use the command `ps-despool' to send the spooled images to the printer."
(interactive "r")
(ps-spool-without-faces from to))
(ps-spool-without-faces from to t))
;;;###autoload
@ -1375,7 +1377,7 @@ 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")
(ps-spool-with-faces from to))
(ps-spool-with-faces from to t))
;;;###autoload
(defun ps-despool (&optional filename)
@ -1419,21 +1421,30 @@ using the current ps-print setup."
;;;###autoload
(defun ps-setup ()
"*Return the current setup"
(format "
(setq ps-print-color-p %s
(format
"
\(setq ps-print-color-p %s
ps-lpr-command \"%s\"
ps-lpr-switches %s
ps-paper-type '%s
ps-landscape-mode %s
ps-paper-type '%s
ps-landscape-mode %s
ps-number-of-columns %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-zebra-stripe %s
ps-number-of-zebra %s
ps-line-number %s
ps-print-background-image %s
ps-print-background-text %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-header-frame %s
@ -1441,35 +1452,40 @@ using the current ps-print setup."
ps-show-n-of-n %s
ps-spool-duplex %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-font-family '%s
ps-font-size %s
ps-header-font-family '%s
ps-header-font-size %s
ps-header-title-font-size %s)
"
ps-print-color-p
ps-lpr-command
ps-lpr-switches
ps-paper-type
ps-landscape-mode
ps-number-of-columns
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-header-frame
ps-header-lines
ps-show-n-of-n
ps-spool-duplex
ps-font-family
ps-font-size
ps-header-font-family
ps-header-font-size
ps-header-title-font-size))
ps-print-color-p
ps-lpr-command
ps-lpr-switches
ps-paper-type
ps-landscape-mode
ps-number-of-columns
ps-zebra-stripe
ps-number-of-zebra
ps-line-number
ps-print-background-image
ps-print-background-text
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-header-frame
ps-header-lines
ps-show-n-of-n
ps-spool-duplex
ps-font-family
ps-font-size
ps-header-font-family
ps-header-font-size
ps-header-title-font-size))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Utility functions and variables:
@ -1920,17 +1936,19 @@ StandardEncoding 46 82 getinterval aload pop
/BeginDSCPage {
% ---- when 1st column, save the state of the page
ColumnIndex 1 eq { /pageState save def
0 PrintStartY moveto % move to where printing will start
Zebra {printZebra}if
printGlobalBackground
printLocalBackground
} if
ColumnIndex 1 eq { /pageState save def } if
% ---- save the state of the column
/columnState save def
} def
/BeginPage {
% ---- when 1st column, print all background effects
ColumnIndex 1 eq {
0 PrintStartY moveto % move to where printing will start
Zebra {printZebra}if
printGlobalBackground
printLocalBackground
} if
PrintHeader {
PrintHeaderFrame { HeaderFrame } if
HeaderText
@ -2137,7 +2155,6 @@ StandardEncoding 46 82 getinterval aload pop
(defvar ps-output-tail nil)
(defvar ps-page-count 0)
(defvar ps-showpage-count 0)
(defvar ps-showline-count 1)
(defvar ps-background-pages nil)
@ -2191,10 +2208,6 @@ and the text it contains.")
(defvar ps-height-remaining)
(defvar ps-width-remaining)
(defvar ps-ref-bold-faces nil)
(defvar ps-ref-italic-faces nil)
(defvar ps-ref-underlined-faces nil)
(defvar ps-print-color-scale nil)
@ -2203,7 +2216,7 @@ and the text it contains.")
(defvar ps-print-face-extension-alist nil
"Alist of symbolic faces with extension features (box, outline, etc).
"Alist of symbolic faces *WITH* extension features (box, outline, etc).
An element of this list has the following form:
(FACE . [BITS FG BG])
@ -2215,10 +2228,19 @@ An element of this list has the following form:
FG foreground color (string or nil)
BG background color (string or nil)
Don't change this list directly; instead, use
`ps-extend-face' and `ps-extend-face-list' to change it.
See documentation for `ps-extend-face' for valid extension symbol.
See also `font-lock-face-attributes'.")
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.")
(defvar ps-print-face-alist nil
"Alist of symbolic faces *WITHOUT* extension features (box, outline, etc).
An element of this list has the same form as an element of
`ps-print-face-extension-alist'.
Don't change this list directly; this list is used by `ps-face-attributes',
`ps-map-face' and `ps-build-reference-face-lists'.")
(defconst ps-print-face-map-alist
@ -2235,51 +2257,15 @@ Each symbol correspond to one bit in a bit vector.")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Creating and Remapping Faces
(require 'font-lock)
;; The definition below is necessary because some emacs variant does not
;; define it on font-lock package.
(defvar font-lock-face-attributes nil)
(defun ps-override-list (sym-list element)
(let ((maplist (assq (car element) (symbol-value sym-list))))
(if maplist
(setcdr maplist (cdr element))
(set sym-list (cons element (symbol-value sym-list)))
)))
(defun ps-extension-to-bit-face (face-extension)
(cons (nth 0 face-extension)
(vector (ps-extension-bit face-extension)
(nth 1 face-extension)
(nth 2 face-extension))))
(defun ps-extension-to-screen-face (face)
(let ((face-name (nth 0 face))
(face-foreground (nth 1 face))
(face-background (nth 2 face))
(face-attributes (nthcdr 3 face)))
(list face-name face-foreground face-background
(and (memq 'bold face-attributes) t)
(and (memq 'italic face-attributes) t)
(and (memq 'underline face-attributes) t))))
;; Remapping Faces
;;;###autoload
(defun ps-extend-face-list (face-extension-list &optional merge-p)
"Extend face in `ps-print-face-extension-alist'.
If optional MERGE-P is non-nil, extensions in FACE-EXTENSION are merged with
face extension in `ps-print-face-extension-alist'; otherwise, overrides.
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.
The elements in FACE-EXTENSION-LIST is like those for `ps-extend-face'.
@ -2293,8 +2279,8 @@ See `ps-extend-face' for documentation."
(defun ps-extend-face (face-extension &optional merge-p)
"Extend face in `ps-print-face-extension-alist'.
If optional MERGE-p is non-nil, extensions in FACE-EXTENSION are merged with
face extensions in `ps-print-face-extension-alist'; otherwise, overrides.
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.
The elements of FACE-EXTENSION list have the form:
@ -2313,7 +2299,7 @@ EXTENSION is one of the following symbols:
overline - like underline, but the line is over the text.
shadow - text will have a shadow.
box - text will be surrounded by a box.
outline - only the text border font will be printed.
outline - print characters as hollow outlines.
If EXTENSION is any other symbol, it is ignored."
(let* ((face-name (nth 0 face-extension))
@ -2351,60 +2337,48 @@ If EXTENSION is any other symbol, it is ignored."
;; Internal functions and variables
(defun ps-print-without-faces (from to &optional filename)
(defun ps-print-without-faces (from to &optional filename region-p)
(ps-printing-region region-p)
(ps-generate (current-buffer) from to 'ps-generate-postscript)
(ps-do-despool filename))
(defun ps-spool-without-faces (from to)
(defun ps-spool-without-faces (from to &optional region-p)
(ps-printing-region region-p)
(ps-generate (current-buffer) from to 'ps-generate-postscript))
(defun ps-print-with-faces (from to &optional filename)
(ps-initialize-faces)
(defun ps-print-with-faces (from to &optional filename region-p)
(ps-printing-region region-p)
(ps-generate (current-buffer) from to 'ps-generate-postscript-with-faces)
(ps-do-despool filename))
(defun ps-spool-with-faces (from to)
(ps-initialize-faces)
(defun ps-spool-with-faces (from to &optional region-p)
(ps-printing-region region-p)
(ps-generate (current-buffer) from to 'ps-generate-postscript-with-faces))
(defvar ps-initialize-faces nil)
(defsubst ps-count-lines (from to)
(+ (count-lines from to)
(save-excursion (goto-char to)
(if (= (current-column) 0) 1 0))))
(defun ps-initialize-faces ()
(or ps-initialize-faces
(progn
(setq ps-initialize-faces t)
(mapcar 'ps-map-font-lock font-lock-face-attributes))))
(defvar ps-printing-region nil
"Variable used to indicate if it is printing a region.
If non-nil, it is a cons, the car of which is the line number
where the region begins, and its cdr is the total number of lines
in the buffer. Formatting functions can use this information
to print the original line number (and not the number of lines printed),
and to indicate in the header that the printout is of a partial file.")
(defun ps-map-font-lock (face)
(let* ((face-map (ps-screen-to-bit-face face))
(ps-face-bit (cdr (assq (car face-map)
ps-print-face-extension-alist))))
(if ps-face-bit
;; if face exists, merge both
(let ((face-bit (cdr face-map)))
(aset ps-face-bit 0 (logior (aref ps-face-bit 0) (aref face-bit 0)))
(or (aref ps-face-bit 1) (aset ps-face-bit 1 (aref face-bit 1)))
(or (aref ps-face-bit 2) (aset ps-face-bit 2 (aref face-bit 2))))
;; if face does not exist, insert it
(setq ps-print-face-extension-alist
(cons face-map ps-print-face-extension-alist))
)))
(defun ps-screen-to-bit-face (face)
(let ((face-name (car face))
(face-foreground (nth 1 face))
(face-background (nth 2 face))
(face-bit (logior (if (nth 3 face) 1 0) ; bold
(if (nth 4 face) 2 0) ; italic
(if (nth 5 face) 4 0)))) ; underline
(cons face-name (vector face-bit face-foreground face-background))))
(defun ps-printing-region (region-p)
(setq ps-printing-region
(and region-p
(cons (ps-count-lines (point-min) (region-beginning))
(ps-count-lines (point-min) (point-max))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -2750,12 +2724,6 @@ page-height == bm + print-height + tm - ho - hh
(defun ps-output-boolean (name bool)
(ps-output (format "/%s %s def\n" name (if bool "true" "false"))))
(defsubst ps-count-lines (from to)
(+ (count-lines from to)
(save-excursion (goto-char to)
(if (= (current-column) 0) 1 0))))
(defun ps-background-pages (page-list func)
(if page-list
(mapcar
@ -2868,11 +2836,11 @@ page-height == bm + print-height + tm - ho - hh
ps-print-background-image))
(defun ps-background ()
(defun ps-background (page-number)
(let (has-local-background)
(mapcar '(lambda (range)
(and (<= (aref range 0) ps-page-count)
(<= ps-page-count (aref range 1))
(and (<= (aref range 0) page-number)
(<= page-number (aref range 1))
(if has-local-background
(ps-output (aref range 2))
(setq has-local-background t)
@ -2884,15 +2852,14 @@ page-height == bm + print-height + tm - ho - hh
(defun ps-begin-file ()
(ps-get-page-dimensions)
(setq ps-showpage-count 0
ps-showline-count 1
(setq ps-showline-count (if ps-printing-region (car ps-printing-region) 1)
ps-background-text-count 0
ps-background-image-count 0
ps-background-pages nil
ps-background-all-pages nil)
(ps-output ps-adobe-tag)
(ps-output "%%Title: " (buffer-name)) ;Take job name from name of
(ps-output "%%Title: " (buffer-name)) ;Take job name from name of
;first buffer printed
(ps-output "\n%%Creator: " (user-full-name))
(ps-output "\n%%CreationDate: "
@ -2933,9 +2900,7 @@ page-height == bm + print-height + tm - ho - hh
(ps-output (format "/LineHeight %s def\n" ps-line-height)
(format "/LinesPerColumn %d def\n"
(round (/ (+ (if ps-print-header
(- ps-print-height (ps-header-height))
ps-print-height)
(round (/ (+ ps-print-height
(* ps-line-height 0.45))
ps-line-height))))
@ -2943,7 +2908,10 @@ page-height == bm + print-height + tm - ho - hh
(ps-output (format "/NumberOfZebra %d def\n" ps-zebra-stripe-height))
(ps-output-boolean "PrintLineNumber" ps-line-number)
(ps-output (format "/Lines %d def\n" (ps-count-lines (point-min) (point-max))))
(ps-output (format "/Lines %d def\n"
(if ps-printing-region
(cdr ps-printing-region)
(ps-count-lines (point-min) (point-max)))))
(ps-background-text)
(ps-background-image)
@ -2990,6 +2958,7 @@ page-height == bm + print-height + tm - ho - hh
((string= (buffer-name) "sokoban.el")
"Super! C'est sokoban.el!")
(t (concat
(and ps-printing-region "Subset of: ")
(buffer-name)
(and (buffer-modified-p) " (unsaved)")))))
@ -3003,29 +2972,29 @@ page-height == bm + print-height + tm - ho - hh
(ps-output "\nEndDoc\n\n%%EOF\n"))
(defun ps-header-height ()
(+ ps-header-title-line-height
(* ps-header-line-height (1- ps-header-lines))
(* 2 ps-header-pad)))
(defun ps-next-page ()
(ps-end-page)
(ps-flush-output)
(ps-begin-page))
(defun ps-header-page (&optional inc-p)
(if (zerop (mod ps-page-count ps-number-of-columns))
;; Print only when a new real page begins.
(let ((page-number (1+ (/ ps-page-count ps-number-of-columns))))
(ps-output (format "\n%%%%Page: %d %d\n" page-number page-number))
(ps-output "BeginDSCPage\n")
(ps-background page-number)
(and inc-p (incf ps-page-count)))
;; Print when any other page begins.
(ps-output "BeginDSCPage\n")))
(defun ps-begin-page (&optional dummypage)
(ps-get-page-dimensions)
(setq ps-width-remaining ps-print-width)
(setq ps-height-remaining ps-print-height)
;; Print only when a new real page begins.
(when (zerop (mod ps-page-count ps-number-of-columns))
(ps-output (format "\n%%%%Page: %d %d\n"
(1+ (/ ps-page-count ps-number-of-columns))
(1+ (/ ps-page-count ps-number-of-columns)))))
(ps-header-page)
(ps-output "BeginDSCPage\n")
(ps-output (format "/LineNumber %d def\n" ps-showline-count)
(format "/PageNumber %d def\n" (incf ps-page-count)))
(ps-output "/PageCount 0 def\n")
@ -3035,23 +3004,17 @@ page-height == bm + print-height + tm - ho - hh
(ps-generate-header "HeaderLinesRight" ps-right-header)
(ps-output (format "%d SetHeaderLines\n" ps-header-lines)))
(ps-background)
(ps-output "BeginPage\n")
(ps-set-font ps-current-font)
(ps-set-bg ps-current-bg)
(ps-set-color ps-current-color))
(defun ps-end-page ()
(setq ps-showpage-count (+ 1 ps-showpage-count))
(ps-output "EndPage\n")
(ps-output "EndDSCPage\n"))
(ps-output "EndPage\nEndDSCPage\n"))
(defun ps-dummy-page ()
(setq ps-showpage-count (+ 1 ps-showpage-count))
(ps-output "%%Page: " (format "- %d\n" ps-showpage-count)
"BeginDSCPage
/PrintHeader false def
(ps-header-page t)
(ps-output "/PrintHeader false def
BeginPage
EndPage
EndDSCPage\n"))
@ -3135,9 +3098,7 @@ EndDSCPage\n"))
(ps-output "false BG\n")))
(defun ps-set-color (color)
(if (setq ps-current-color color)
nil
(setq ps-current-color ps-default-fg))
(setq ps-current-color (or color ps-default-fg))
(ps-output (format ps-color-format (nth 0 ps-current-color)
(nth 1 ps-current-color) (nth 2 ps-current-color))
" FG\n"))
@ -3175,7 +3136,7 @@ EndDSCPage\n"))
;; pagefeeds, control characters, and plot each chunk.
(while (< from to)
(if (re-search-forward "[\000-\037\177-\377]" to t)
;; region whith some control characters
;; region with some control characters
(let ((match (char-after (match-beginning 0))))
(if (= match ?\t) ; tab
(let ((linestart
@ -3233,39 +3194,22 @@ EndDSCPage\n"))
(t (error "No available function to determine X color values."))))
(defun ps-get-face (face)
"Return face description on `ps-print-face-extension-alist'.
(defun ps-face-attributes (face)
"Return face attribute vector.
If FACE is not in `ps-print-face-extension-alist',
insert it and return the description.
If FACE is not in `ps-print-face-extension-alist' or in
`ps-print-face-alist', insert it on `ps-print-face-alist' and
return the attribute vector.
If FACE is not a valid face name, it is used default face."
(or (assq face ps-print-face-extension-alist)
(let* ((the-face (if (facep face) face 'default))
(font (face-font the-face t))
(new-face
(cons the-face
(vector
(logior (if (memq 'bold font) 1 0)
(if (memq 'italic font) 2 0)
(if (face-underline-p the-face) 4 0))
(face-foreground the-face)
(face-background the-face)))))
(or (and (eq the-face 'default)
(assq the-face ps-print-face-extension-alist))
(setq ps-print-face-extension-alist
(cons new-face
ps-print-face-extension-alist)))
new-face)))
(defun ps-face-attributes (face)
(let* ((face-vector (cdr (ps-get-face face)))
(effects (logior (aref face-vector 0)
(if (memq face ps-ref-bold-faces) 1 0)
(if (memq face ps-ref-italic-faces) 2 0)
(if (memq face ps-ref-underlined-faces) 4 0))))
(vector effects (aref face-vector 1) (aref face-vector 2))))
(cdr (or (assq face ps-print-face-extension-alist)
(assq face ps-print-face-alist)
(let* ((the-face (if (facep face) face 'default))
(new-face (ps-screen-to-bit-face the-face)))
(or (and (eq the-face 'default)
(assq the-face ps-print-face-alist))
(setq ps-print-face-alist (cons new-face ps-print-face-alist)))
new-face))))
(defun ps-face-attribute-list (face-or-list)
@ -3326,7 +3270,7 @@ If FACE is not a valid face name, it is used default face."
(defun ps-face-bold-p (face)
(if (eq ps-print-emacs-type 'emacs)
(ps-emacs-face-kind-p face 'bold "-\\(bold\\|demibold\\)-"
ps-bold-faces)
ps-bold-faces)
(ps-xemacs-face-kind-p face 'WEIGHT_NAME "bold\\|demibold"
ps-bold-faces)))
@ -3341,33 +3285,59 @@ If FACE is not a valid face name, it is used default face."
(or (face-underline-p face)
(memq face ps-underlined-faces)))
;; Ensure that face-list is fbound.
(or (fboundp 'face-list) (defalias 'face-list 'list-faces))
(defun ps-build-reference-face-lists ()
(setq ps-print-face-alist nil)
(if ps-auto-font-detect
(let ((faces (face-list))
the-face)
(setq ps-ref-bold-faces nil
ps-ref-italic-faces nil
ps-ref-underlined-faces nil)
(while faces
(setq the-face (car faces))
(if (ps-face-italic-p the-face)
(setq ps-ref-italic-faces
(cons the-face ps-ref-italic-faces)))
(if (ps-face-bold-p the-face)
(setq ps-ref-bold-faces
(cons the-face ps-ref-bold-faces)))
(if (ps-face-underlined-p the-face)
(setq ps-ref-underlined-faces
(cons the-face ps-ref-underlined-faces)))
(setq faces (cdr faces))))
(setq ps-ref-bold-faces ps-bold-faces)
(setq ps-ref-italic-faces ps-italic-faces)
(setq ps-ref-underlined-faces ps-underlined-faces))
(mapcar 'ps-map-face (face-list))
(mapcar 'ps-set-face-bold ps-bold-faces)
(mapcar 'ps-set-face-italic ps-italic-faces)
(mapcar 'ps-set-face-underline ps-underlined-faces))
(setq ps-build-face-reference nil))
(defun ps-set-face-bold (face)
(ps-set-face-attribute face 1))
(defun ps-set-face-italic (face)
(ps-set-face-attribute face 2))
(defun ps-set-face-underline (face)
(ps-set-face-attribute face 4))
(defun ps-set-face-attribute (face effect)
(let ((face-bit (cdr (ps-map-face face))))
(aset face-bit 0 (logior (aref face-bit 0) effect))))
(defun ps-map-face (face)
(let* ((face-map (ps-screen-to-bit-face face))
(ps-face-bit (cdr (assq (car face-map) ps-print-face-alist))))
(if ps-face-bit
;; if face exists, merge both
(let ((face-bit (cdr face-map)))
(aset ps-face-bit 0 (logior (aref ps-face-bit 0) (aref face-bit 0)))
(or (aref ps-face-bit 1) (aset ps-face-bit 1 (aref face-bit 1)))
(or (aref ps-face-bit 2) (aset ps-face-bit 2 (aref face-bit 2))))
;; if face does not exist, insert it
(setq ps-print-face-alist (cons face-map ps-print-face-alist)))
face-map))
(defun ps-screen-to-bit-face (face)
(cons face
(vector (logior (if (ps-face-bold-p face) 1 0) ; bold
(if (ps-face-italic-p face) 2 0) ; italic
(if (ps-face-underlined-p face) 4 0)) ; underline
(face-foreground face)
(face-background face))))
(defun ps-mapper (extent list)
(nconc list (list (list (extent-start-position extent) 'push extent)
(list (extent-end-position extent) 'pull extent)))
@ -3650,6 +3620,33 @@ If FACE is not a valid face name, it is used default face."
(defmacro ps-s-prsc ()
`(if (eq ps-print-emacs-type 'emacs) [S-f22] '(shift f22)))
;; A hook to bind to `rmail-mode-hook' to locally bind prsc and set the
;; `ps-left-headers' specially for mail messages.
(defun ps-rmail-mode-hook ()
(local-set-key (ps-prsc) 'ps-rmail-print-message-from-summary)
(setq ps-header-lines 3
ps-left-header
;; The left headers will display the message's subject, its
;; author, and the name of the folder it was in.
'(ps-article-subject ps-article-author buffer-name)))
;; See `ps-gnus-print-article-from-summary'. This function does the
;; same thing for rmail.
(defun ps-rmail-print-message-from-summary ()
(interactive)
(ps-print-message-from-summary 'rmail-summary-buffer "RMAIL"))
;; Used in `ps-rmail-print-article-from-summary',
;; `ps-gnus-print-article-from-summary' and `ps-vm-print-message-from-summary'.
(defun ps-print-message-from-summary (summary-buffer summary-default)
(let ((ps-buf (or (and (boundp summary-buffer)
(symbol-value summary-buffer))
summary-default)))
(and (get-buffer ps-buf)
(save-excursion
(set-buffer ps-buf)
(ps-spool-buffer-with-faces)))))
;; Look in an article or mail message for the Subject: line. To be
;; placed in `ps-left-headers'.
(defun ps-article-subject ()
@ -3684,7 +3681,7 @@ If FACE is not a valid face name, it is used default face."
(t fromstring)))
"From ???")))
;; A hook to bind to gnus-Article-prepare-hook. This will set the
;; A hook to bind to `gnus-article-prepare-hook'. This will set the
;; `ps-left-headers' specially for gnus articles. Unfortunately,
;; `gnus-article-mode-hook' is called only once, the first time the *Article*
;; buffer enters that mode, so it would only work for the first time
@ -3697,9 +3694,8 @@ If FACE is not a valid face name, it is used default face."
;; author, and the newsgroup it was in.
(list 'ps-article-subject 'ps-article-author 'gnus-newsgroup-name)))
;; A hook to bind to vm-mode-hook to locally bind prsc and set the
;; ps-left-headers specially for mail messages. This header setup would
;; also work, I think, for RMAIL.
;; A hook to bind to `vm-mode-hook' to locally bind prsc and set the
;; `ps-left-headers' specially for mail messages.
(defun ps-vm-mode-hook ()
(local-set-key (ps-prsc) 'ps-vm-print-message-from-summary)
(setq ps-header-lines 3)
@ -3716,22 +3712,13 @@ If FACE is not a valid face name, it is used default face."
;; sb: Updated for Gnus 5.
(defun ps-gnus-print-article-from-summary ()
(interactive)
(let ((ps-buf (or (and (boundp 'gnus-article-buffer)
(symbol-value 'gnus-article-buffer))
"*Article*")))
(if (get-buffer ps-buf)
(save-excursion
(set-buffer ps-buf)
(ps-spool-buffer-with-faces)))))
(ps-print-message-from-summary 'gnus-article-buffer "*Article*"))
;; See `ps-gnus-print-article-from-summary'. This function does the
;; same thing for vm.
(defun ps-vm-print-message-from-summary ()
(interactive)
(if (and (boundp 'vm-mail-buffer) (symbol-value 'vm-mail-buffer))
(save-excursion
(set-buffer (symbol-value 'vm-mail-buffer))
(ps-spool-buffer-with-faces))))
(ps-print-message-from-summary 'vm-mail-buffer ""))
;; A hook to bind to bind to `gnus-summary-setup-buffer' to locally bind
;; prsc.