]> code.delx.au - gnu-emacs/blobdiff - lisp/ps-print.el
Revision: miles@gnu.org--gnu-2005/emacs--unicode--0--patch-25
[gnu-emacs] / lisp / ps-print.el
index 54fbf2d6c854dddccf8e54ec1529467e5665cd68..330a09de412ac500edfa9a720d215f6f2a8bedc7 100644 (file)
@@ -1,28 +1,28 @@
 ;;; ps-print.el --- print text from the buffer as PostScript
 
-;; Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
-;; 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 <thompson@wg2.waii.com>)
 ;;     Jacques Duthen (was <duthen@cegelec-red.fr>)
-;;     Vinicius Jose Latorre <vinicius@cpqd.com.br>
+;;     Vinicius Jose Latorre <viniciusjl@ig.com.br>
 ;;     Kenichi Handa <handa@etl.go.jp> (multi-byte characters)
 ;; Maintainer: Kenichi Handa <handa@etl.go.jp> (multi-byte characters)
-;;     Vinicius Jose Latorre <vinicius@cpqd.com.br>
+;;     Vinicius Jose Latorre <viniciusjl@ig.com.br>
 ;; Keywords: wp, print, PostScript
-;; Time-stamp: <2002/09/06 20:11:00 vinicius>
-;; Version: 6.5.6
+;; Time-stamp: <2004/07/21 23:12:05 vinicius>
+;; Version: 6.6.5
 ;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/
 
-(defconst ps-print-version "6.5.6"
-  "ps-print.el, v 6.5.6 <2002/09/06 vinicius>
+(defconst ps-print-version "6.6.5"
+  "ps-print.el, v 6.6.5 <2004/07/21 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@cpqd.com.br>.")
+       Vinicius Jose Latorre <viniciusjl@ig.com.br>.")
 
 ;; This file is part of GNU Emacs.
 
@@ -49,8 +49,8 @@ Please send all bug fixes and enhancements to
 ;;
 ;; 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.
+;; 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
@@ -840,7 +840,7 @@ Please send all bug fixes and enhancements to
 ;;             22       +   22          +
 ;;             --------     -----------     ---------     ----------------
 ;;
-;; Any other value is treated as `nil'.
+;; Any other value is treated as nil.
 ;;
 ;; See also section How Ps-Print Has A Text And/Or Image On Background.
 ;;
@@ -986,7 +986,7 @@ Please send all bug fixes and enhancements to
 ;;      (my-mixed-family
 ;;       (fonts (normal               . "Courier-Bold")
 ;;              (bold                 . "Helvetica")
-;;              (italic               . "Zapf-Chancery-MediumItalic")
+;;              (italic               . "ZapfChancery-MediumItalic")
 ;;              (bold-italic          . "NewCenturySchlbk-BoldItalic")
 ;;              (w3-table-hack-x-face . "LineDrawNormal"))
 ;;       (size . 10.0)
@@ -1010,7 +1010,7 @@ Please send all bug fixes and enhancements to
 ;;       (fonts (w3-table-hack-x-face . "LineDrawNormal")
 ;;              (bold                 . "Helvetica")
 ;;              (bold-italic          . "NewCenturySchlbk-BoldItalic")
-;;              (italic               . "Zapf-Chancery-MediumItalic")
+;;              (italic               . "ZapfChancery-MediumItalic")
 ;;              (normal               . "Courier-Bold"))
 ;;       (avg-char-width . 6.0)
 ;;       (space-width . 6.0)
@@ -1075,7 +1075,7 @@ 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
@@ -1211,7 +1211,10 @@ Please send all bug fixes and enhancements to
 ;; New since version 2.8
 ;; ---------------------
 ;;
-;; [vinicius] Vinicius Jose Latorre <vinicius@cpqd.com.br>
+;; [vinicius] Vinicius Jose Latorre <viniciusjl@ig.com.br>
+;;
+;;    20040229
+;;      `ps-time-stamp-yyyy-mm-dd', `ps-time-stamp-iso8601'
 ;;
 ;;    20010619
 ;;      `ps-time-stamp-locale-default'
@@ -1259,11 +1262,11 @@ Please send all bug fixes and enhancements to
 ;;      N-up printing.
 ;;      Hook: `ps-print-begin-sheet-hook'.
 ;;
-;; [keinichi] 19990509 Kein'ichi Handa <handa@etl.go.jp>
+;; [kenichi] 19990509 Ken'ichi Handa <handa@m17n.org>
 ;;
-;; `ps-print-region-function'
+;;    `ps-print-region-function'
 ;;
-;; [vinicius] Vinicius Jose Latorre <vinicius@cpqd.com.br>
+;; [vinicius] Vinicius Jose Latorre <viniciusjl@ig.com.br>
 ;;
 ;;    19990301
 ;;      PostScript tumble and setpagedevice.
@@ -1272,11 +1275,11 @@ Please send all bug fixes and enhancements to
 ;;      PostScript prologue header comment insertion.
 ;;      Skip invisible text better.
 ;;
-;; [keinichi] 19980819 Kein'ichi Handa <handa@etl.go.jp>
+;; [kenichi] 19980819 Ken'ichi Handa <handa@m17n.org>
 ;;
-;; Multi-byte buffer handling.
+;;    Multi-byte buffer handling.
 ;;
-;; [vinicius] Vinicius Jose Latorre <vinicius@cpqd.com.br>
+;; [vinicius] Vinicius Jose Latorre <viniciusjl@ig.com.br>
 ;;
 ;;    19980306
 ;;      Skip invisible text.
@@ -1329,7 +1332,7 @@ 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.
 ;;
@@ -1350,6 +1353,9 @@ Please send all bug fixes and enhancements to
 ;; Acknowledgments
 ;; ---------------
 ;;
+;; Thanks to Michael Piotrowski <mxp@dynalabs.de> for improving the DSC
+;; compliance of the generated PostScript.
+;;
 ;; Thanks to Adam Doppelt <adoppelt@avogadro.com> for face mapping suggestion
 ;; for black/white PostScript printers.
 ;;
@@ -1370,15 +1376,17 @@ Please send all bug fixes and enhancements to
 ;; Thanks to David X Callaway <dxc@xprt.net> for helping debugging PostScript
 ;; level 1 compatibility.
 ;;
-;; Thanks to Colin Marquardt <colin.marquardt@usa.alcatel.com> for upside-down,
-;; line number step, line number start and zebra stripe follow suggestions, and
-;; for XEmacs beta-tests.
+;; Thanks to Colin Marquardt <colin.marquardt@usa.alcatel.com> 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 <klaus.berndl@sdm.de> for user defined PostScript
 ;; prologue code suggestion, for odd/even printing suggestion and for
 ;; `ps-prologue-file' enhancement.
 ;;
-;; Thanks to Kein'ichi Handa <handa@etl.go.jp> for multi-byte buffer handling.
+;; Thanks to Ken'ichi Handa <handa@m17n.org> for multi-byte buffer handling.
 ;;
 ;; Thanks to Matthew O Persico <Matthew.Persico@lazard.com> for line number on
 ;; empty columns.
@@ -1419,7 +1427,7 @@ Please send all bug fixes and enhancements to
 ;; 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
+;; 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.
 ;;
@@ -1435,86 +1443,115 @@ Please send all bug fixes and enhancements to
 
 ;;; Code:
 
-(eval-and-compile
-  (require 'lpr)
 
-  (or (featurep 'lisp-float-type)
-      (error "`ps-print' requires floating point support"))
+(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))))
-
-
-  ;; 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)))
-
-
-  (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))))
+(or (fboundp 'char-charset)
+    (defun char-charset (arg) 'ascii))
+
+(or (fboundp 'charset-after)
+    (defun charset-after (&optional arg)
+      (char-charset (char-after 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))))
+
+
+;; 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 ((featurep 'xemacs)              ; 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)))
+       )
+      (t                               ; 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)
+       ))
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1526,12 +1563,14 @@ Please send all bug fixes and enhancements to
 (defgroup postscript nil
   "PostScript Group"
   :tag "PostScript"
+  :version "20"
   :group 'emacs)
 
 (defgroup ps-print nil
   "PostScript generator for Emacs"
   :link '(emacs-library-link :tag "Source Lisp File" "ps-print.el")
   :prefix "ps-"
+  :version "20"
   :group 'wp
   :group 'postscript)
 
@@ -1539,36 +1578,42 @@ Please send all bug fixes and enhancements to
   "Horizontal page layout"
   :prefix "ps-"
   :tag "Horizontal"
+  :version "20"
   :group 'ps-print)
 
 (defgroup ps-print-vertical nil
   "Vertical page layout"
   :prefix "ps-"
   :tag "Vertical"
+  :version "20"
   :group 'ps-print)
 
 (defgroup ps-print-headers nil
   "Headers & footers layout"
   :prefix "ps-"
   :tag "Header & Footer"
+  :version "20"
   :group 'ps-print)
 
 (defgroup ps-print-font nil
   "Fonts customization"
   :prefix "ps-"
   :tag "Font"
+  :version "20"
   :group 'ps-print)
 
 (defgroup ps-print-color nil
   "Color customization"
   :prefix "ps-"
   :tag "Color"
+  :version "20"
   :group 'ps-print)
 
 (defgroup ps-print-face nil
   "Faces customization"
   :prefix "ps-"
   :tag "PS Faces"
+  :version "20"
   :group 'ps-print
   :group 'faces)
 
@@ -1576,36 +1621,42 @@ Please send all bug fixes and enhancements to
   "N-up customization"
   :prefix "ps-"
   :tag "N-Up"
+  :version "20"
   :group 'ps-print)
 
 (defgroup ps-print-zebra nil
   "Zebra customization"
   :prefix "ps-"
   :tag "Zebra"
+  :version "20"
   :group 'ps-print)
 
 (defgroup ps-print-background nil
   "Background customization"
   :prefix "ps-"
   :tag "Background"
+  :version "20"
   :group 'ps-print)
 
 (defgroup ps-print-printer '((lpr custom-group))
   "Printer customization"
   :prefix "ps-"
   :tag "Printer"
+  :version "20"
   :group 'ps-print)
 
 (defgroup ps-print-page nil
   "Page customization"
   :prefix "ps-"
   :tag "Page"
+  :version "20"
   :group 'ps-print)
 
 (defgroup ps-print-miscellany nil
   "Miscellany customization"
   :prefix "ps-"
   :tag "Miscellany"
+  :version "20"
   :group 'ps-print)
 
 
@@ -1632,6 +1683,7 @@ Any other value is treated as `paper'."
                 :tag "Error Handler Message"
                 (const none)   (const paper)
                 (const system) (const paper-and-system))
+  :version "20"
   :group 'ps-print-miscellany)
 
 (defcustom ps-user-defined-prologue nil
@@ -1663,6 +1715,7 @@ As an example for `ps-user-defined-prologue' setting:
   :type '(choice :menu-tag "User Defined Prologue"
                 :tag "User Defined Prologue"
                 (const :tag "none" nil) string symbol)
+  :version "20"
   :group 'ps-print-miscellany)
 
 (defcustom ps-print-prologue-header nil
@@ -1679,7 +1732,7 @@ more requirements put them first in `ps-print-prologue-header' using the
 requirements and set %%LanguageLevel: to 2, do:
 
  (setq ps-print-prologue-header
-      \"%%+ numcopies(3) jog\\n%%LanguageLevel: 2\\n\")
+       \"%%+ numcopies(3) jog\\n%%LanguageLevel: 2\\n\")
 
 The duplex requirement is inserted by ps-print (see `ps-spool-duplex').
 
@@ -1692,6 +1745,7 @@ For more information about PostScript document comments, see:
   :type '(choice :menu-tag "Prologue Header"
                 :tag "Prologue Header"
                 (const :tag "none" nil) string symbol)
+  :version "20"
   :group 'ps-print-miscellany)
 
 (defcustom ps-printer-name (and (boundp 'printer-name)
@@ -1723,6 +1777,7 @@ See also `ps-printer-name-option' for documentation."
                 (const :tag "No Printer Name" t)
                 (file :tag "Print to file")
                 (string :tag "Pipe to ps-lpr-command"))
+  :version "20"
   :group 'ps-print-printer)
 
 (defcustom ps-printer-name-option
@@ -1766,6 +1821,7 @@ Novell Netware respectively) are handled specially, using `ps-printer-name' as
 the destination for output; any other program is treated like `lpr' except that
 an explicit filename is given as the last argument."
   :type 'string
+  :version "20"
   :group 'ps-print-printer)
 
 (defcustom ps-lpr-switches lpr-switches
@@ -1774,6 +1830,7 @@ an explicit filename is given as the last argument."
                 (choice :menu-tag "PostScript lpr Switch"
                         :tag "PostScript lpr Switch"
                         string symbol (repeat sexp)))
+  :version "20"
   :group 'ps-print-printer)
 
 (defcustom ps-print-region-function nil
@@ -1781,6 +1838,7 @@ an explicit filename is given as the last argument."
 See definition of `call-process-region' for calling conventions.  The fourth
 and the sixth arguments are both nil."
   :type '(choice (const nil) function)
+  :version "20"
   :group 'ps-print-printer)
 
 (defcustom ps-manual-feed nil
@@ -1788,12 +1846,14 @@ and the sixth arguments are both nil."
 
 If it's nil, automatic feeding takes place."
   :type 'boolean
+  :version "20"
   :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
+  :version "20"
   :group 'ps-print-printer)
 
 ;;; Page layout
@@ -1837,6 +1897,7 @@ See `ps-paper-type'."
                       (number :tag "Width")
                       (number :tag "Height")
                       (string :tag "Media")))
+  :version "20"
   :group 'ps-print-page)
 
 ;;;###autoload
@@ -1850,6 +1911,7 @@ example `letter', `legal' or `a4'."
                                 nil
                               (widget-put wid :error "Unknown paper size")
                               wid)))
+  :version "20"
   :group 'ps-print-page)
 
 (defcustom ps-warn-paper-type t
@@ -1857,11 +1919,13 @@ example `letter', `legal' or `a4'."
 
 It's used when `ps-spool-config' is set to `setpagedevice'."
   :type 'boolean
+  :version "20"
   :group 'ps-print-page)
 
 (defcustom ps-landscape-mode nil
   "*Non-nil means print in landscape mode."
   :type 'boolean
+  :version "20"
   :group 'ps-print-page)
 
 (defcustom ps-print-upside-down nil
@@ -1877,7 +1941,7 @@ If nil, print all pages.
 
 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 less than one or if FROM is greater than TO.
+integer lesser than one or if FROM is greater than TO.
 
 Otherwise, it's treated as nil.
 
@@ -1894,6 +1958,7 @@ See also `ps-even-or-odd-pages'."
                        (cons :tag "Range"
                              (integer :tag "From")
                              (integer :tag "To"))))
+  :version "20"
   :group 'ps-print-page)
 
 (defcustom ps-even-or-odd-pages nil
@@ -1952,6 +2017,7 @@ sheet parity."
                 (const :tag "Only Odd Pages" odd-page)
                 (const :tag "Only Even Sheets" even-sheet)
                 (const :tag "Only Odd Sheets" odd-sheet))
+  :version "20"
   :group 'ps-print-page)
 
 (defcustom ps-print-control-characters 'control-8-bit
@@ -1983,6 +2049,7 @@ Any other value is treated as nil."
                 :tag "Control Char"
                 (const 8-bit)   (const control-8-bit)
                 (const control) (const :tag "nil" nil))
+  :version "20"
   :group 'ps-print-miscellany)
 
 (defcustom ps-n-up-printing 1
@@ -1998,16 +2065,19 @@ Any other value is treated as nil."
               wid :error
               "Number of pages per sheet paper must be between 1 and 100.")
              wid)))
+  :version "20"
   :group 'ps-print-n-up)
 
 (defcustom ps-n-up-margin (/ (* 72  1.0) 2.54) ; 1 cm
   "*Specify the margin in points between the sheet border and n-up printing."
   :type 'number
+  :version "20"
   :group 'ps-print-n-up)
 
 (defcustom ps-n-up-border-p t
   "*Non-nil means a border is drawn around each page."
   :type 'boolean
+  :version "20"
   :group 'ps-print-n-up)
 
 (defcustom ps-n-up-filling 'left-top
@@ -2039,23 +2109,27 @@ Any other value is treated as `left-top'."
                 (const right-top) (const right-bottom)
                 (const top-left)  (const bottom-left)
                 (const top-right) (const bottom-right))
+  :version "20"
   :group 'ps-print-n-up)
 
 (defcustom ps-number-of-columns (if ps-landscape-mode 2 1)
   "*Specify the number of columns."
   :type 'number
+  :version "20"
   :group 'ps-print-miscellany)
 
 (defcustom ps-zebra-stripes nil
   "*Non-nil means print zebra stripes.
 See also documentation for `ps-zebra-stripe-height' and `ps-zebra-color'."
   :type 'boolean
+  :version "20"
   :group 'ps-print-zebra)
 
 (defcustom ps-zebra-stripe-height 3
   "*Number of zebra stripe lines.
 See also documentation for `ps-zebra-stripes' and `ps-zebra-color'."
   :type 'number
+  :version "20"
   :group 'ps-print-zebra)
 
 (defcustom ps-zebra-color 0.95
@@ -2069,6 +2143,7 @@ See also documentation for `ps-zebra-stripes' and `ps-zebra-stripe-height'."
                       (number :tag "Red")
                       (number :tag "Green")
                       (number :tag "Blue")))
+  :version "20"
   :group 'ps-print-zebra)
 
 (defcustom ps-zebra-stripe-follow nil
@@ -2105,18 +2180,20 @@ that a line is printed):
                22       +   22          +
                --------     -----------     ---------     ----------------
 
-Any other value is treated as `nil'."
+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))
+  :version "20"
   :group 'ps-print-zebra)
 
 (defcustom ps-line-number nil
   "*Non-nil means print line number."
   :type 'boolean
+  :version "20"
   :group 'ps-print-miscellany)
 
 (defcustom ps-line-number-step 1
@@ -2146,6 +2223,7 @@ Any other value is treated as `zebra'."
                 :tag "Line Number Step"
                 (integer :tag "Step Interval")
                 (const :tag "Synchronize Zebra" zebra))
+  :version "20"
   :group 'ps-print-miscellany)
 
 (defcustom ps-line-number-start 1
@@ -2175,6 +2253,7 @@ The values for `ps-line-number-start':
      value of `ps-zebra-strip-height' inclusive.  Use this combination if you
      wish that line number be relative to zebra stripes."
   :type '(integer :tag "Start Step Interval")
+  :version "20"
   :group 'ps-print-miscellany)
 
 (defcustom ps-print-background-image nil
@@ -2221,6 +2300,7 @@ For example, if you wish to print an EPS image on all pages do:
                          (cons :tag "Range"
                                (integer :tag "From")
                                (integer :tag "To"))))))
+  :version "20"
   :group 'ps-print-background)
 
 (defcustom ps-print-background-text nil
@@ -2272,6 +2352,7 @@ For example, if you wish to print text \"Preliminary\" on all pages do:
                          (cons :tag "Range"
                                (integer :tag "From")
                                (integer :tag "To"))))))
+  :version "20"
   :group 'ps-print-background)
 
 ;;; Horizontal layout
@@ -2285,16 +2366,19 @@ For example, if you wish to print text \"Preliminary\" on all pages do:
 (defcustom ps-left-margin   (/ (* 72  2.0) 2.54) ;   2 cm
   "*Left margin in points (1/72 inch)."
   :type 'number
+  :version "20"
   :group 'ps-print-horizontal)
 
 (defcustom ps-right-margin  (/ (* 72  2.0) 2.54) ;   2 cm
   "*Right margin in points (1/72 inch)."
   :type 'number
+  :version "20"
   :group 'ps-print-horizontal)
 
 (defcustom ps-inter-column  (/ (* 72  2.0) 2.54) ;   2 cm
   "*Horizontal space between columns in points (1/72 inch)."
   :type 'number
+  :version "20"
   :group 'ps-print-horizontal)
 
 ;;; Vertical layout
@@ -2314,16 +2398,19 @@ For example, if you wish to print text \"Preliminary\" on all pages do:
 (defcustom ps-bottom-margin (/ (* 72  1.5) 2.54) ; 1.5 cm
   "*Bottom margin in points (1/72 inch)."
   :type 'number
+  :version "20"
   :group 'ps-print-vertical)
 
 (defcustom ps-top-margin    (/ (* 72  1.5) 2.54) ; 1.5 cm
   "*Top margin in points (1/72 inch)."
   :type 'number
+  :version "20"
   :group 'ps-print-vertical)
 
 (defcustom ps-header-offset (/ (* 72  1.0) 2.54) ; 1.0 cm
   "*Vertical space in points (1/72 inch) between the main text and the header."
   :type 'number
+  :version "20"
   :group 'ps-print-vertical)
 
 (defcustom ps-header-line-pad 0.15
@@ -2331,11 +2418,13 @@ For example, if you wish to print text \"Preliminary\" on all pages do:
 The insertion is done between the header frame and the text it contains,
 both in the vertical and horizontal directions."
   :type 'number
+  :version "20"
   :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
+  :version "20"
   :group 'ps-print-vertical)
 
 (defcustom ps-footer-line-pad 0.15
@@ -2343,6 +2432,7 @@ both in the vertical and horizontal directions."
 The insertion is done between the footer frame and the text it contains,
 both in the vertical and horizontal directions."
   :type 'number
+  :version "20"
   :group 'ps-print-vertical)
 
 ;;; Header/Footer setup
@@ -2353,11 +2443,13 @@ 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
+  :version "20"
   :group 'ps-print-headers)
 
 (defcustom ps-print-header-frame t
   "*Non-nil means draw a gaudy frame around the header."
   :type 'boolean
+  :version "20"
   :group 'ps-print-headers)
 
 (defcustom ps-header-frame-alist
@@ -2437,11 +2529,13 @@ Don't change this alist directly, instead use customization, or `ps-value',
                                      (number :tag "Red")
                                      (number :tag "Green")
                                      (number :tag "Blue"))))))
+  :version "20"
   :group 'ps-print-headers)
 
 (defcustom ps-header-lines 2
   "*Number of lines to display in page header, when generating PostScript."
   :type 'integer
+  :version "20"
   :group 'ps-print-headers)
 
 (defcustom ps-print-footer nil
@@ -2449,14 +2543,14 @@ Don't change this alist directly, instead use customization, or `ps-value',
 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
+  :version "21.1"
   :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
+  :version "21.1"
   :group 'ps-print-headers)
 
 (defcustom ps-footer-frame-alist
@@ -2471,7 +2565,6 @@ 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 ""
@@ -2518,12 +2611,13 @@ See also `ps-header-frame-alist' for documentation."
                                      (number :tag "Red")
                                      (number :tag "Green")
                                      (number :tag "Blue"))))))
+  :version "21.1"
   :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
+  :version "21.1"
   :group 'ps-print-headers)
 
 (defcustom ps-print-only-one-header nil
@@ -2532,6 +2626,7 @@ 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
+  :version "20"
   :group 'ps-print-headers)
 
 (defcustom ps-switch-header 'duplex
@@ -2554,6 +2649,7 @@ See also `ps-print-header' and `ps-print-footer'."
                 (const :tag "Never Switch" nil)
                 (const :tag "Always Switch" t)
                 (const :tag "Switch When Duplexing" duplex))
+  :version "20"
   :group 'ps-print-headers)
 
 (defcustom ps-show-n-of-n t
@@ -2561,6 +2657,7 @@ See also `ps-print-header' and `ps-print-footer'."
 NOTE: page numbers are displayed as part of headers,
       see variable `ps-print-header'."
   :type 'boolean
+  :version "20"
   :group 'ps-print-headers)
 
 (defcustom ps-spool-config
@@ -2596,6 +2693,7 @@ WARNING: The setpagedevice PostScript operator affects ghostview utility when
                 :tag "Spool Config"
                 (const lpr-switches) (const setpagedevice)
                 (const :tag "nil" nil))
+  :version "20"
   :group 'ps-print-headers)
 
 (defcustom ps-spool-duplex nil         ; Not many people have duplex printers,
@@ -2609,6 +2707,7 @@ even-numbered pages.
 
 See also `ps-spool-tumble'."
   :type 'boolean
+  :version "20"
   :group 'ps-print-headers)
 
 (defcustom ps-spool-tumble nil
@@ -2619,6 +2718,7 @@ binding at the top or bottom.
 
 It has effect only when `ps-spool-duplex' is non-nil."
   :type 'boolean
+  :version "20"
   :group 'ps-print-headers)
 
 ;;; Fonts
@@ -2720,8 +2820,16 @@ It has effect only when `ps-spool-duplex' is non-nil."
      (line-height . 9.63)
      (space-width . 2.78)
      (avg-char-width . 2.78))
+    (ZapfChancery-MediumItalic
+     (fonts (normal . "ZapfChancery-MediumItalic"))
+     (size . 10.0)
+     (line-height . 11.45)
+     (space-width . 2.2)
+     (avg-char-width . 4.10811))
+    ;; We keep this wrong entry name (but with correct font name) for
+    ;; backward compatibility.
     (Zapf-Chancery-MediumItalic
-     (fonts (normal . "Zapf-Chancery-MediumItalic"))
+     (fonts (normal . "ZapfChancery-MediumItalic"))
      (size . 10.0)
      (line-height . 11.45)
      (space-width . 2.2)
@@ -2769,11 +2877,13 @@ uses the fonts resident in your printer."
                (cons :format "%v"
                      (const :format "" avg-char-width)
                      (number :tag "Average Character Width"))))
+  :version "20"
   :group 'ps-print-font)
 
 (defcustom ps-font-family 'Courier
   "*Font family name for ordinary text, when generating PostScript."
   :type 'symbol
+  :version "20"
   :group 'ps-print-font)
 
 (defcustom ps-font-size   '(7 . 8.5)
@@ -2784,11 +2894,13 @@ uses the fonts resident in your printer."
                 (cons :tag "Landscape/Portrait"
                       (number :tag "Landscape Text Size")
                       (number :tag "Portrait Text Size")))
+  :version "20"
   :group 'ps-print-font)
 
 (defcustom ps-header-font-family      'Helvetica
   "*Font family name for text in the header, when generating PostScript."
   :type 'symbol
+  :version "20"
   :group 'ps-print-font)
 
 (defcustom ps-header-font-size       '(10 . 12)
@@ -2799,6 +2911,7 @@ uses the fonts resident in your printer."
                 (cons :tag "Landscape/Portrait"
                       (number :tag "Landscape Header Size")
                       (number :tag "Portrait Header Size")))
+  :version "20"
   :group 'ps-print-font)
 
 (defcustom ps-header-title-font-size '(12 . 14)
@@ -2809,23 +2922,24 @@ uses the fonts resident in your printer."
                 (cons :tag "Landscape/Portrait"
                       (number :tag "Landscape Header Title Size")
                       (number :tag "Portrait Header Title Size")))
+  :version "20"
   :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
+  :version "21.1"
   :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")))
+  :version "21.1"
   :group 'ps-print-font)
 
 (defcustom ps-line-number-color      "black"
@@ -2845,6 +2959,7 @@ uses the fonts resident in your printer."
 (defcustom ps-line-number-font      "Times-Italic"
   "*Font for line-number, when generating PostScript."
   :type 'string
+  :version "20"
   :group 'ps-print-font
   :group 'ps-print-miscellany)
 
@@ -2856,6 +2971,7 @@ uses the fonts resident in your printer."
                 (cons :tag "Landscape/Portrait"
                       (number :tag "Landscape Font Size")
                       (number :tag "Portrait Font Size")))
+  :version "20"
   :group 'ps-print-font
   :group 'ps-print-miscellany)
 
@@ -2866,9 +2982,7 @@ uses the fonts resident in your printer."
 ;;                widget to work.
 ;;;###autoload
 (defcustom ps-print-color-p
-  (or (and (fboundp 'color-values)     ; Emacs
-          (ps-e-color-values "Green"))
-      (fboundp 'x-color-values)                ; Emacs
+  (or (fboundp 'x-color-values)                ; Emacs
       (fboundp 'color-instance-rgb-components))
                                        ; XEmacs
   "*Specify how buffer's text color is printed.
@@ -2888,30 +3002,89 @@ Any other value is treated as t."
                 (const :tag "Do NOT Print Color" nil)
                 (const :tag "Print Always Color" t)
                 (const :tag "Print Black/White Color" black-white))
+  :version "20"
   :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)
                       (number :tag "Red")
                       (number :tag "Green")
                       (number :tag "Blue")))
+  :version "20"
   :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)
                       (number :tag "Red")
                       (number :tag "Green")
                       (number :tag "Blue")))
+  :version "20"
   :group 'ps-print-color)
 
 (defcustom ps-auto-font-detect t
@@ -2919,6 +3092,7 @@ Any other value is treated as t."
 If nil, we rely solely on the lists `ps-bold-faces', `ps-italic-faces', and
 `ps-underlined-faces'."
   :type 'boolean
+  :version "20"
   :group 'ps-print-font)
 
 (defcustom ps-black-white-faces
@@ -2958,6 +3132,7 @@ This variable is used only when `ps-print-color-p' is set to `black-white'."
                                (const shadow)
                                (const box)
                                (const outline)))))
+  :version "20"
   :group 'ps-print-face)
 
 (defcustom ps-bold-faces
@@ -2970,6 +3145,7 @@ This variable is used only when `ps-print-color-p' is set to `black-white'."
   "*A list of the \(non-bold\) faces that should be printed in bold font.
 This applies to generating PostScript."
   :type '(repeat face)
+  :version "20"
   :group 'ps-print-face)
 
 (defcustom ps-italic-faces
@@ -2982,6 +3158,7 @@ This applies to generating PostScript."
   "*A list of the \(non-italic\) faces that should be printed in italic font.
 This applies to generating PostScript."
   :type '(repeat face)
+  :version "20"
   :group 'ps-print-face)
 
 (defcustom ps-underlined-faces
@@ -2992,6 +3169,7 @@ This applies to generating PostScript."
   "*A list of the \(non-underlined\) faces that should be printed underlined.
 This applies to generating PostScript."
   :type '(repeat face)
+  :version "20"
   :group 'ps-print-face)
 
 (defcustom ps-use-face-background nil
@@ -3011,6 +3189,7 @@ Any other value will be treated as t."
                 (repeat :menu-tag "Face Background List"
                         :tag "Face Background List"
                         face))
+  :version "20"
   :group 'ps-print-face)
 
 (defcustom ps-left-header
@@ -3028,10 +3207,13 @@ 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."
+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))
+  :version "20"
   :group 'ps-print-headers)
 
 (defcustom ps-right-header
@@ -3052,11 +3234,17 @@ There are the following basic functions implemented:
 
    `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))
+  :version "20"
   :group 'ps-print-headers)
 
 (defcustom ps-left-footer
@@ -3074,11 +3262,13 @@ 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."
-  :version "21.1"
+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 Footer"
                         :tag "Left Footer"
                         string symbol))
+  :version "21.1"
   :group 'ps-print-headers)
 
 (defcustom ps-right-footer
@@ -3099,17 +3289,23 @@ There are the following basic functions implemented:
 
    `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))
+  :version "21.1"
   :group 'ps-print-headers)
 
 (defcustom ps-razzle-dazzle t
   "*Non-nil means report progress while formatting buffer."
   :type 'boolean
+  :version "20"
   :group 'ps-print-miscellany)
 
 (defcustom ps-adobe-tag "%!PS-Adobe-3.0\n"
@@ -3117,6 +3313,7 @@ You can also create your own time stamp function by using `format-time-string'
 By default, `ps-adobe-tag' contains the standard identifier.  Some printers
 require slightly different versions of this line."
   :type 'string
+  :version "20"
   :group 'ps-print-miscellany)
 
 (defcustom ps-build-face-reference t
@@ -3131,6 +3328,7 @@ 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
+  :version "20"
   :group 'ps-print-face)
 
 (defcustom ps-always-build-face-reference nil
@@ -3140,28 +3338,30 @@ 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
+  :version "20"
   :group 'ps-print-face)
 
 (defcustom ps-banner-page-when-duplexing nil
   "*Non-nil means the very first page is skipped.
 It's like the very first character of buffer (or region) is ^L (\\014)."
   :type 'boolean
+  :version "20"
   :group 'ps-print-headers)
 
 (defcustom ps-postscript-code-directory
-  (or (cond
-       ((eq ps-print-emacs-type 'emacs)        ; emacs
-       data-directory)
-       ((fboundp 'locate-data-directory) ; emacsens (xemacs, etc.)
-       (locate-data-directory "ps-print"))
-       ((boundp 'data-directory)       ; emacsens (xemacs, etc.)
-       data-directory)
-       (t                              ; don't know what to do
-       nil))
-      (error "ps-postscript-code-directory isn't set properly"))
+  (or (if (featurep 'xemacs)
+         (cond ((fboundp 'locate-data-directory) ; xemacs
+                (locate-data-directory "ps-print"))
+               ((boundp 'data-directory) ; xemacs
+                data-directory)
+               (t                      ; don't know what to do
+                nil))
+       data-directory)                 ; emacs
+      (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
+  :version "20"
   :group 'ps-print-miscellany)
 
 (defcustom ps-line-spacing 0
@@ -3399,6 +3599,12 @@ The table depends on the current ps-print setup."
      #'ps-print-quote
      (list
       (concat "\n;;; ps-print version " ps-print-version "\n")
+      ";; internal vars"
+      (ps-comment-string "emacs-version      " emacs-version)
+      (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)
@@ -3555,14 +3761,28 @@ If `ps-prefix-quote' is nil, it's set to t after generating string."
              (if (> col len)
                  (make-string (- col len) ?\ )
                " ")
-             (cond ((null val) "nil")
-                   ((eq val t) "t")
-                   ((or (symbolp val) (listp val)) (format "'%S" val))
-                   (t          (format "%S" val))))))
+             (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
+        (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))))
@@ -3611,128 +3831,119 @@ It can be retrieved with `(ps-get ALIST-SYM KEY)'."
   (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"))
+
+
+;; Alias for `ps-time-stamp-yyyy-mm-dd' (which see).
+(defalias 'ps-time-stamp-iso8601 'ps-time-stamp-yyyy-mm-dd)
+
+
 (defun ps-time-stamp-hh:mm:ss ()
   "Return time as \"17:28:31\"."
   (format-time-string "%T"))
 
 
-(eval-and-compile
-  (if (memq ps-print-emacs-type '(lucid xemacs))
-      ;; XEmacs change: Need to check for emacs-major-version too.
-      (if (or (< emacs-major-version 19)
-             (and (= emacs-major-version 19) (< 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 function is not yet implemented for GNU emacs.
-  (cond ((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)))) ; xemacs >= 19.12
-        (defun ps-color-device ()
-          (eq (ps-x-device-class) 'color)))
-
-       (t                              ; emacs
-        (defun ps-color-device ()
-          (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))))
-
-  (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
-
-        (defun ps-color-values (x-color)
+(and (featurep '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))
+
+
+;; Return t if the device (which can be changed during an emacs session)
+;; can handle colors.
+;; This function is not yet implemented for GNU emacs.
+(cond ((and (featurep '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)))
+
+      (t                               ; emacs
+       (defun ps-color-device ()
+        (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 ((featurep 'xemacs)              ; 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 'color-values)
-            (ps-e-color-values x-color))
            ((fboundp 'x-color-values)
-            (ps-e-x-color-values x-color))
+            (ps-e-x-color-values color))
+           ((and (fboundp 'color-instance-rgb-components)
+                 (ps-color-device))
+            (ps-x-color-instance-rgb-components
+             (if (ps-x-color-instance-p x-color)
+                 x-color
+               (ps-x-make-color-instance color))))
            (t
-            (error "No available function to determine X color values"))))
+            (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")
+            (memq face ps-bold-faces))) ; Kludge-compatible
+
+       (defun ps-face-italic-p (face)
+        (or (ps-xemacs-face-kind-p face 'ANGLE_NAME "i\\|o")
+            (ps-xemacs-face-kind-p face 'SLANT "i\\|o")
+            (memq face ps-italic-faces))) ; Kludge-compatible
+       )
+
+      (t                               ; emacs
+
+       (defun ps-color-values (x-color)
+        (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"))))
 
-        (defalias 'ps-face-foreground-name 'face-foreground)
-        (defalias 'ps-face-background-name 'face-background)
+       (defun ps-face-bold-p (face)
+        (or (ps-e-face-bold-p face)
+            (memq face ps-bold-faces)))
 
-        (defun ps-face-bold-p (face)
-          (or (ps-e-face-bold-p face)
-              (memq face ps-bold-faces)))
-
-        (defun ps-face-italic-p (face)
-          (or (ps-e-face-italic-p face)
-              (memq face ps-italic-faces)))
-        )
-                                       ; xemacs
-                                       ; lucid
-       (t                              ; epoch
-
-        ;; 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)
-              (ps-e-x-color-values color))
-             ((and (fboundp 'color-instance-rgb-components)
-                   (ps-color-device))
-              (ps-x-color-instance-rgb-components
-               (if (ps-x-color-instance-p x-color)
-                   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)))
-
-        (defun ps-face-bold-p (face)
-          (or (ps-xemacs-face-kind-p face 'WEIGHT_NAME "bold\\|demibold")
-              (memq face ps-bold-faces))) ; Kludge-compatible
-
-        (defun ps-face-italic-p (face)
-          (or (ps-xemacs-face-kind-p face 'ANGLE_NAME "i\\|o")
-              (ps-xemacs-face-kind-p face 'SLANT "i\\|o")
-              (memq face ps-italic-faces))) ; Kludge-compatible
-        )))
+       (defun ps-face-italic-p (face)
+        (or (ps-e-face-italic-p face)
+            (memq face ps-italic-faces)))
+       ))
 
 
 (defvar ps-print-color-scale 1.0)
@@ -3805,6 +4016,7 @@ Note: No major/minor-mode is activated and no local variables are evaluated for
 
 (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)
@@ -3814,15 +4026,14 @@ Note: No major/minor-mode is activated and no local variables are evaluated for
 
 (defvar ps-color-p nil)
 (defvar ps-color-format
-  (if (eq ps-print-emacs-type 'emacs)
-
-      ;; 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.
-      "%0.3f %0.3f %0.3f"
+  (if (featurep 'xemacs)
+      ;; XEmacs will have to make do with %s (princ) for floats.
+      "%s %s %s"
 
-    ;; Lucid emacsen will have to make do with %s (princ) for floats.
-    "%s %s %s"))
+    ;; 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.
+    "%0.3f %0.3f %0.3f"))
 
 ;; 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
@@ -4046,6 +4257,12 @@ If EXTENSION is any other symbol, it is ignored."
 ;; Internal functions and variables
 
 
+(defun ps-message-log-max ()
+  (and (not (string= (buffer-name) "*Messages*"))
+       (boundp 'message-log-max)
+       message-log-max))
+
+
 (defvar ps-print-hook nil)
 (defvar ps-print-begin-sheet-hook nil)
 (defvar ps-print-begin-page-hook nil)
@@ -4058,9 +4275,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)
@@ -4069,15 +4287,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"))
-   (list (count-lines 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)
@@ -4088,7 +4308,7 @@ If EXTENSION is any other symbol, it is ignored."
 
 
 (defvar ps-printing-region nil
-  "Variable used to indicate if the region that ps-print is printing.
+  "Variable used to indicate the region that ps-print is printing.
 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
@@ -4100,11 +4320,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)))))
 
@@ -4430,10 +4650,7 @@ page-height == ((floor print-height ((th + ls) * zh)) * ((th + ls) * zh)) - th
 
 
 (defun ps-print-preprint-region (prefix-arg)
-  (or (and (fboundp 'mark-active)
-          (mark-active))
-      (and (fboundp 'region-active-p)
-          (region-active-p))
+  (or (ps-mark-active-p)
       (error "The mark is not set now"))
   (list (point) (mark) (ps-print-preprint prefix-arg)))
 
@@ -4509,7 +4726,12 @@ page-height == ((floor print-height ((th + ls) * zh)) * ((th + ls) * zh)) - th
   (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
 
@@ -4595,29 +4817,37 @@ page-height == ((floor print-height ((th + ls) * zh)) * ((th + ls) * zh)) - th
   (save-excursion
     (set-buffer ps-spool-buffer)
     (goto-char (point-max))
-    (insert-file fname)))
+    (insert-file-contents fname)))
 
 ;; These functions insert the arrays that define the contents of the headers.
 
+(defvar ps-encode-header-string-function nil)
+
 (defun ps-generate-header-line (fonttag &optional content)
   (ps-output " [" fonttag " ")
   (cond
    ;; Literal strings should be output as is -- the string must contain its own
    ;; PS string delimiters, '(' and ')', if necessary.
    ((stringp content)
-    (ps-output (ps-mule-encode-header-string content fonttag)))
+    (ps-output content))
 
    ;; 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 (ps-mule-encode-header-string (funcall content)
-                                                   fonttag)))
+     (if (fboundp ps-encode-header-string-function)
+        (dolist (l (funcall ps-encode-header-string-function
+                            (funcall content) fonttag))
+          (ps-output-string l))
+    (ps-output-string (funcall content))))
 
    ;; Variables will have their contents inserted.  They should contain
    ;; strings, and will be inserted as strings.
    ((and (symbolp content) (boundp content))
-    (ps-output-string (ps-mule-encode-header-string (symbol-value content)
-                                                   fonttag)))
+    (if (fboundp ps-encode-header-string-function)
+       (dolist (l (funcall ps-encode-header-string-function
+                            (symbol-value content) fonttag))
+         (ps-output-string l))
+      (ps-output-string (symbol-value content))))
 
    ;; Anything else will get turned into an empty string.
    (t
@@ -4685,11 +4915,11 @@ page-height == ((floor print-height ((th + ls) * zh)) * ((th + ls) * zh)) - th
 
 ;; 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
+(defvar ps-float-format (if (featurep 'xemacs)
+                           "%s "       ; xemacs
+                         "%0.3f "))    ; emacs
 
 
 (defun ps-float-format (value &optional default)
@@ -5264,9 +5494,9 @@ XSTART YSTART are the relative position for the first page in a sheet.")
      ps-adobe-tag
      "%%Title: " (buffer-name)         ; Take job name from name of
                                        ; first buffer printed
-     "\n%%Creator: " (user-full-name)
-     " (using ps-print v" ps-print-version
-     ")\n%%CreationDate: " (format-time-string "%T %b %d %Y")
+     "\n%%Creator: ps-print v" ps-print-version
+     "\n%%For: " (user-full-name)
+     "\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 "
@@ -5274,8 +5504,11 @@ XSTART YSTART are the relative position for the first page in a sheet.")
                (ps-remove-duplicates
                 (append (ps-fonts 'ps-font-for-text)
                         (list (ps-font 'ps-font-for-header 'normal)
-                              (ps-font 'ps-font-for-header 'bold))))
+                              (ps-font 'ps-font-for-header 'bold)
+                              (ps-font 'ps-font-for-footer 'normal)
+                              (ps-font 'ps-font-for-footer 'bold))))
                "\n%%+ font ")
+     "\n%%DocumentSuppliedResources: procset PSPrintUserDefinedPrologue-" (user-login-name) " 0 0"
      "\n%%DocumentMedia: " (ps-page-dimensions-get-media dimensions)
      (format " %d" (round (ps-page-dimensions-get-width dimensions)))
      (format " %d" (round (ps-page-dimensions-get-height dimensions)))
@@ -5295,11 +5528,11 @@ XSTART YSTART are the relative position for the first page in a sheet.")
                                       ps-error-handler-alist))
                           1))          ; send to paper
               ps-print-prologue-0
-              "\n%%BeginProcSet: UserDefinedPrologue\n\n")
+              "\n%%BeginResource: procset PSPrintUserDefinedPrologue-" (user-login-name) " 0 0\n\n")
 
     (ps-insert-string ps-user-defined-prologue)
 
-    (ps-output "\n%%EndProcSet\n\n")
+    (ps-output "\n%%EndResource\n\n")
 
     (ps-output-boolean "LandscapeMode      "
                       (or ps-landscape-mode
@@ -5371,7 +5604,7 @@ XSTART YSTART are the relative position for the first page in a sheet.")
               "/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"
@@ -5405,26 +5638,37 @@ XSTART YSTART are the relative position for the first page in a sheet.")
     (setq ps-background-all-pages (nreverse ps-background-all-pages)
          ps-background-pages (nreverse ps-background-pages))
 
-    (ps-output "\n" ps-print-prologue-1)
-
-    (ps-output "\n/printGlobalBackground{\n")
+    (ps-output "\n" ps-print-prologue-1
+              "\n/printGlobalBackground{\n")
     (mapcar 'ps-output ps-background-all-pages)
-    (ps-output "}def\n/printLocalBackground{\n}def\n")
-
-    ;; 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
-                      ps-header-font-size-internal
-                      (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...
+    (ps-output
+     "}def\n/printLocalBackground{\n}def\n"
+     "\n%%EndProlog\n\n%%BeginSetup\n"
+     "\n%%IncludeResource: font Times-Roman"
+     "\n%%IncludeResource: font Times-Italic"
+     "\n%%IncludeResource: font "
+     (mapconcat 'identity
+               (ps-remove-duplicates
+                (append (ps-fonts 'ps-font-for-text)
+                        (list (ps-font 'ps-font-for-header 'normal)
+                              (ps-font 'ps-font-for-header 'bold)
+                              (ps-font 'ps-font-for-footer 'normal)
+                              (ps-font 'ps-font-for-footer 'bold))))
+               "\n%%IncludeResource: font ")
+     ;; Header/line number fonts
+     (format "\n/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
+            ps-header-font-size-internal
+            (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
@@ -5454,7 +5698,6 @@ 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%%EndProlog\n\n%%BeginSetup\n")
     (unless (eq ps-spool-config 'lpr-switches)
       (ps-output "\n%%BeginFeature: *Duplex "
                 (ps-boolean-capitalized ps-spool-duplex)
@@ -5555,13 +5798,23 @@ XSTART YSTART are the relative position for the first page in a sheet.")
   (ps-get-size (symbol-value font-sym) "font size" font-sym))
 
 
-(defsubst ps-rgb-color (color default)
-  (cond ((and color (listp color)) color)
+(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))
-       ((numberp color) (list color color color))
        (t (list default default default))
        ))
 
+(defvar ps-basic-plot-string-function 'ps-basic-plot-string)
 
 (defun ps-begin-job ()
   ;; prologue files
@@ -5632,7 +5885,16 @@ 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-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
@@ -5641,9 +5903,20 @@ 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)
+       ;; Set up default functions.  They may be overridden by
+       ;; ps-mule-begin-job.
+       ps-basic-plot-string-function 'ps-basic-plot-string
+       ps-encode-header-string-function nil)
   ;; initialize page dimensions
-  (ps-get-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-page-number ()
@@ -5727,8 +6000,7 @@ XSTART YSTART are the relative position for the first page in a sheet.")
   (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))
+  (ps-set-color ps-current-color))
 
 (defsubst ps-skip-newline (limit)
   (setq ps-showline-count (1+ ps-showline-count)
@@ -5772,7 +6044,6 @@ XSTART YSTART are the relative position for the first page in a sheet.")
                                       (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))
@@ -5782,7 +6053,6 @@ XSTART YSTART are the relative position for the first page in a sheet.")
                                       (ps-avg-char-width 'ps-font-for-text)))
         (to (car wrappoint))
         (string (buffer-substring-no-properties from to)))
-    (ps-mule-prepare-ascii-font string)
     (ps-output-string string)
     (ps-output " S\n")
     wrappoint))
@@ -5886,26 +6156,16 @@ XSTART YSTART are the relative position for the first page in a sheet.")
       (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))
-                (composition (ps-e-find-composition from (1+ match-point))))
-           (if composition
-               (if (and (nth 2 composition)
-                        (<= (car composition) match-point))
-                   (progn
-                     (setq match-point (car composition)
-                           match 0)
-                     (goto-char (nth 1 composition)))
-                 (setq composition nil)))
+                (match       (char-after match-point)))
            (when (< from match-point)
-             (ps-mule-set-ascii-font)
-             (ps-plot 'ps-basic-plot-string from match-point bg-color))
+             (ps-plot ps-basic-plot-string-function
+                      from match-point bg-color))
            (cond
             ((= match ?\t)             ; tab
              (let ((linestart (line-beginning-position)))
                (forward-char -1)
                (setq from (+ linestart (current-column)))
                (when (re-search-forward "[ \t]+" to t)
-                 (ps-mule-set-ascii-font)
                  (ps-plot 'ps-basic-plot-whitespace
                           from (+ linestart (current-column))
                           bg-color))))
@@ -5930,24 +6190,11 @@ XSTART YSTART are the relative position for the first page in a sheet.")
                     (ps-skip-newline to))
                (ps-next-page)))
 
-            (composition               ; a composite sequence
-             (ps-plot 'ps-mule-plot-composition match-point (point) bg-color))
-
-            ((> match 255)             ; a multi-byte character
-             (let* ((charset (char-charset match))
-                    (composition (ps-e-find-composition match-point to))
-                    (stop (if (nth 2 composition) (car composition) to)))
-               (or (eq charset 'composition)
-                   (while (and (< (point) stop) (eq (charset-after) charset))
-                     (forward-char 1)))
-               (ps-plot 'ps-mule-plot-string match-point (point) bg-color)))
-                                       ; characters from ^@ to ^_ and
             (t                         ; characters from 127 to 255
              (ps-control-character match)))
            (setq from (point)))
-       ;; region without control characters nor multi-byte characters
-       (ps-mule-set-ascii-font)
-       (ps-plot 'ps-basic-plot-string from to bg-color)
+       ;; region without control characters
+       (ps-plot ps-basic-plot-string-function from to bg-color)
        (setq from to)))))
 
 (defvar ps-string-control-codes
@@ -5979,7 +6226,6 @@ XSTART YSTART are the relative position for the first page in a sheet.")
     (if (< (car wrappoint) to)
        (ps-continue-line))
     (setq ps-width-remaining (- ps-width-remaining (* len char-width)))
-    (ps-mule-prepare-ascii-font str)
     (ps-output-string str)
     (ps-output " S\n")))
 
@@ -6145,15 +6391,17 @@ If FACE is not a valid face name, it is used default face."
                (ps-face-background-name face))))
 
 
+;; to avoid compilation gripes
+(defalias 'ps-jitify 'jit-lock-fontify-now)
+(defalias 'ps-lazify 'lazy-lock-fontify-region)
+
+
 ;; to avoid compilation gripes
 (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))))
+  (cond ((and (boundp 'jit-lock-mode) (symbol-value 'jit-lock-mode))
+        (ps-jitify start end))
+       ((and (boundp 'lazy-lock-mode) (symbol-value 'lazy-lock-mode))
+        (ps-lazify start end))))
 
 
 (defun ps-generate-postscript-with-faces (from to)
@@ -6179,7 +6427,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))
+       ((featurep 'xemacs)             ; xemacs
        ;; Build the list of extents...
        (let ((a (cons 'dummy nil))
              record type extent extent-list)
@@ -6223,7 +6471,7 @@ If FACE is not a valid face name, it is used default face."
                  from position
                  a (cdr a)))))
 
-       ((eq ps-print-emacs-type 'emacs)
+       (t                              ; emacs
        (let ((property-change from)
              (overlay-change from)
              (save-buffer-invisibility-spec buffer-invisibility-spec)
@@ -6342,6 +6590,7 @@ If FACE is not a valid face name, it is used default face."
                (ps-begin-page)
                (funcall genfunc from to)
                (ps-end-page)
+               (ps-mule-end-job)
                (ps-end-job needs-begin-file)
 
                ;; Setting this variable tells the unwind form that the
@@ -6470,10 +6719,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"))))
@@ -6498,11 +6749,11 @@ If FACE is not a valid face name, it is used default face."
 ;; Don't use it unless you understand what it does!
 
 (defmacro ps-prsc ()
-  `(if (eq ps-print-emacs-type 'emacs) [f22] 'f22))
+  `(if (featurep 'xemacs) 'f22           [f22]))
 (defmacro ps-c-prsc ()
-  `(if (eq ps-print-emacs-type 'emacs) [C-f22] '(control f22)))
+  `(if (featurep 'xemacs) '(control f22) [C-f22]))
 (defmacro ps-s-prsc ()
-  `(if (eq ps-print-emacs-type 'emacs) [S-f22] '(shift f22)))
+  `(if (featurep 'xemacs) '(shift f22)   [S-f22]))
 
 ;; A hook to bind to `rmail-mode-hook' to locally bind prsc and set the
 ;; `ps-left-headers' specially for mail messages.
@@ -6693,27 +6944,6 @@ If FACE is not a valid face name, it is used default face."
 ;; To make this file smaller, some commands go in a separate file.
 ;; But autoload them here to make the separation invisible.
 
-(autoload 'ps-mule-prepare-ascii-font "ps-mule"
-  "Setup special ASCII font for STRING.
-STRING should contain only ASCII characters.")
-
-(autoload 'ps-mule-set-ascii-font     "ps-mule"
-  "Adjust current font if current charset is not ASCII.")
-
-(autoload 'ps-mule-plot-string        "ps-mule"
-  "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.
-
-Optional argument BG-COLOR specifies background color.
-
-Returns the value:
-
-       (ENDPOS . RUN-WIDTH)
-
-Where ENDPOS is the end position of the sequence and RUN-WIDTH is the width of
-the sequence.")
-
 (autoload 'ps-mule-initialize         "ps-mule"
   "Initialize global data for printing multi-byte characters.")
 
@@ -6724,14 +6954,13 @@ 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.")
+(autoload 'ps-mule-end-job         "ps-mule"
+  "Finish printing job for multi-byte chars.")
 
 \f
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (provide 'ps-print)
 
+;;; arch-tag: fb06a585-1112-4206-885d-a57d95d50579
 ;;; ps-print.el ends here