diff lisp/packages/ps-print.el @ 70:131b0175ea99 r20-0b30

Import from CVS: tag r20-0b30
author cvs
date Mon, 13 Aug 2007 09:02:59 +0200
parents 4103f0995bd7
children 54cc21c15cbb
line wrap: on
line diff
--- a/lisp/packages/ps-print.el	Mon Aug 13 09:00:04 2007 +0200
+++ b/lisp/packages/ps-print.el	Mon Aug 13 09:02:59 2007 +0200
@@ -2,160 +2,51 @@
 
 ;; Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
 
-;; Author:     Jim Thompson (was <thompson@wg2.waii.com>)
-;; Maintainer: Jacques Duthen <duthen@club-internet.fr>
-;; Keywords:   print, PostScript
-;; Time-stamp: <97/01/29 23:21:25 tjchol01>
-;; Version:    3.05
-
-(defconst ps-print-version "3.05"
-  "ps-print.el, v 3.05 <97/01/17 duthen>
+;; Author: Jim Thompson <thompson@wg2.waii.com>
+;; Maintainer: duthen@cegelec-red.fr (Jacques Duthen Prestataire)
+;; Keywords: print, PostScript
 
-Jack'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.
+;; This file is part of XEmacs.
 
-Please send all bug fixes and enhancements to
-	Jacques Duthen <duthen@cegelec-red.fr>.
-")
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
+;; XEmacs is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
 ;; the Free Software Foundation; either version 2, or (at your option)
 ;; any later version.
 
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
+;; XEmacs is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; along with XEmacs; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+;; 02111-1307, USA.
 
 ;; LCD Archive Entry:
 ;; ps-print|James C. Thompson|thompson@wg2.waii.com|
 ;; Jim's Pretty-Good PostScript Generator for Emacs 19 (ps-print)|
 ;; 26-Feb-1994|2.8|~/packages/ps-print.el|
 
-;; 3.05 [jack] <97/01/16 duthen>
-;; Ben Wing <ben@666.com> took ps-print.el from the official 19.34
-;; GNU distribution:
-;; -rw-rw-r--  1 duthen      69315 Jul 22 1996 ps-print.el
-;; He patched it for XEmacs.  
-;; Steven L Baur <steve@miranova.com> sent me this version which has
-;; 26 diffs with 19.34.
-;; I merge these 26 diffs into my 3.04 version. 
-
-;; `ps-paper-type': ###autoload.
-;; `ps-print-color-p' `ps-color-values': Replace pixel-components by
-;;  color-instance-rgb-components for XEmacs.
-;; `ps-color-device': New function to dynamically test the device
-;;  color capability, added where ps-print-color-p is tested.
-;; `ps-xemacs-face-kind-p': Fixed.
-;; `ps-do-despool': Permit dynamic evaluation at print time of
-;;  ps-lpr-switches.  
-;; `ps-eval-switch' `ps-flatten-list' `ps-flatten-list-1': New for
-;;  the previous feature.
-;; `ps-gnus-print-article-from-summary': Updated for Gnus 5.
-
-
-;; 3.04 [jack] after [simon] Oct 8, 1996 Simon Marshall <simon@gnu.ai.mit.edu>
-;; `ps-print-version':
-;;  Fix value.
-;; `cl' `lisp-float-type':
-;;  Require them.
-;; `ps-number-of-columns' `ps-*-font-size':
-;;  Try to select defaults better suited when `ps-landscape-mode' is non-nil. 
-;; `ps-*-faces':
-;;  Change default for Font Lock mode faces when `ps-print-color-p' is nil. 
-;; `ps-right-header':
-;;  Replace `time-stamp-yy/mm/dd' by `time-stamp-mon-dd-yyyy'. 
-;; `ps-end-file' `ps-begin-page':
-;;  Fix bug in page count for Ghostview. 
-;; `ps-generate-postscript-with-faces':
-;;  Replace `ps-sorter' by `car-less-than-car'.  
-;; `ps-plot' `ps-generate':
-;;  Replace `%d' by `%3d'.  
-
-;; 3.03 [jack] Sept 27, 1996 Jacques Duthen <duthen@cegelec-red.fr>
-;; Merge 31 diffs between 19.29 and 19.34
-
-;; 3.02 [jack] June 26, 1996 Jacques Duthen <duthen@cegelec-red.fr>
-;; Add new page dimensions to `ps-page-dimensions-database' for `paper-type'
-;; Improve landscape mode `ps-landscape-mode' and multiple columns
-;; printing `ps-number-of-columns':
-;; The text and the margins are no more scaled.
-;; Simplify the semantics of `ps-inter-column' (space between columns).
-;; Add error checking for negative `ps-print-width' and `ps-print-height'.
-;; Change the semantics of `ps-top-margin' which is now the TOP MARGIN,
-;; and add `ps-header-offset' instead of having `ps-top-margin' split in 2.
-;; Add `ps-header-font-family', `ps-header-font-size' and 
-;; `ps-header-title-font-size' to control the header.
-;; Add `ps-header-line-pad'.
-;; Change the semantics of `ps-font-info-database' to have symbolic
-;; font families.
-;; Add new fonts to `ps-font-info-database': `Courier' `Helvetica'
-;; `Times' `Palatino' `Helvetica-Narrow' `NewCenturySchlbk'
-;; Make public `ps-font-family' and `ps-font-size' so that the user
-;; can directly control the text font and size without loading ps-print.
-;; Add error checking for unknown font families and a message giving
-;; the exhaustive list of available font families.
-;; Document how to install a new font family.
-;; Add `/ReportAllFontInfo' to get all the font families of the printer.
-;; Add the possibility to make `mixed' font families.
-;; Add `ps-setup' to get the current setup.
-;; Add tools `ps-line-lengths' `ps-nb-pages-buffer' `ps-nb-pages-region'
-;; to help choose the font size.
-;; Split `ps-print-prologue' in two to insert info from header fonts
-;; Replace indexes by macro `ps-page-dimensions-get-width'
-;; to get access to the dimensions list.
-;; Add `ps-select-font' inside `ps-get-page-dimensions'.
-;; Fix the "clumsy" `ps-page-height' management.
-;; Move `ps-get-page-dimensions' to the beginning of `ps-begin-file'
-;; to get early error checking.
-;; Add sample setup `ps-jack-setup'.
-;;
-;; Rewrite a lot of postscript code and add comments inside it
-;; (maybe they should not (or optionally) be included in the generated
-;; Postscript).
-;; Translate the origin to (lm, bm) to simplify the other moves.
-;; Fix bug in `/HeaderOffset' with `/PrintStartY'.
-;; Fix bug in `/SetHeaderLines'.
-;; Change `/ReportFontInfo' for use by `/ReportAllFontInfo'.
-
-;; 3.01 [jack] June 4, 1996 Jacques Duthen <duthen@cegelec-red.fr>
-;; Manage float value for every variable representing a size.
-;; Add `ps-font-info-database' `ps-inter-column'
-
-;; 3.00 [jack] May 17, 1996 Jacques Duthen <duthen@cegelec-red.fr>
-;;	based on 2.8 Jim's Pretty-Good version:
-;; Add `ps-landscape-mode' and `ps-number-of-columns'
-;; for dumb multi-column landscape mode.
-
 ;; Baseline-version: 2.8.  (Jim'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.)
 
+;;; Synched up with: FSF 19.34.
+
 ;;; Commentary:
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;
 ;; About ps-print
 ;; --------------
-;;
 ;; This package provides printing of Emacs buffers on PostScript
 ;; printers; the buffer's bold and italic text attributes are
 ;; preserved in the printer output.  Ps-print is intended for use with
 ;; Emacs 19 or Lucid Emacs, together with a fontifying package such as
 ;; font-lock or hilit.
 ;;
-;;
 ;; Using ps-print
 ;; --------------
 ;;
@@ -187,7 +78,7 @@
 ;;        spool      - The PostScript image is saved temporarily in an
 ;;                     Emacs buffer.  Many images may be spooled locally
 ;;                     before printing them.  To send the spooled images
-;;                     to the printer, use the command `ps-despool'.
+;;                     to the printer, use the command ps-despool.
 ;;
 ;; The spooling mechanism was designed for printing lots of small
 ;; files (mail messages or netnews articles) to save paper that would
@@ -195,7 +86,7 @@
 ;; your output at the printer (it's easier to pick up one 50-page
 ;; printout than to find 50 single-page printouts).
 ;; 
-;; Ps-print has a hook in the `kill-emacs-hooks' so that you won't
+;; Ps-print has a hook in the kill-emacs-hooks so that you won't
 ;; accidentally quit from Emacs while you have unprinted PostScript
 ;; waiting in the spool buffer.  If you do attempt to exit with
 ;; spooled PostScript, you'll be asked if you want to print it, and if
@@ -232,7 +123,6 @@
 ;;
 ;;
 ;; Invoking Ps-Print
-;; -----------------
 ;;
 ;; To print your buffer, type
 ;;
@@ -248,16 +138,16 @@
 ;; to the printer; you will be prompted for the name of the file to
 ;; save the image to.  The prefix argument is ignored by the commands
 ;; that spool their images, but you may save the spooled images to a
-;; file by giving a prefix argument to `ps-despool':
+;; file by giving a prefix argument to ps-despool:
 ;;
 ;;        C-u M-x ps-despool
 ;;
-;; When invoked this way, `ps-despool' will prompt you for the name of
+;; When invoked this way, ps-despool will prompt you for the name of
 ;; the file to save to.
 ;;
-;; Any of the `ps-print-' commands can be bound to keys; I recommend
-;; binding `ps-spool-buffer-with-faces', `ps-spool-region-with-faces',
-;; and `ps-despool'.  Here are the bindings I use on my Sun 4 keyboard:
+;; Any of the ps-print- commands can be bound to keys; I recommend
+;; binding ps-spool-buffer-with-faces, ps-spool-region-with-faces, and
+;; ps-despool.  Here are the bindings I use on my Sun 4 keyboard:
 ;;
 ;;   (global-set-key 'f22 'ps-spool-buffer-with-faces) ;f22 is prsc
 ;;   (global-set-key '(shift f22) 'ps-spool-region-with-faces)
@@ -265,153 +155,111 @@
 ;;
 ;;
 ;; The Printer Interface
-;; ---------------------
-;;
-;; The variables `ps-lpr-command' and `ps-lpr-switches' determine what
-;; command is used to send the PostScript images to the printer, and
-;; what arguments to give the command.  These are analogous to
-;; `lpr-command' and `lpr-switches'.
 ;;
-;; Make sure that they contain appropriate values for your system;
-;; see the usage notes below and the documentation of these variables.
+;; The variables ps-lpr-command and ps-lpr-switches determine what
+;; command is used to send the PostScript images to the printer, and
+;; what arguments to give the command.  These are analogous to lpr-
+;; command and lpr-switches.
 ;;
-;; NOTE: `ps-lpr-command' and `ps-lpr-switches' take their initial values
-;;       from the variables `lpr-command' and `lpr-switches'.  If you have
-;;       `lpr-command' set to invoke a pretty-printer such as `enscript',
-;;       then ps-print won't work properly.  `ps-lpr-command' must name
+;; NOTE: ps-lpr-command and ps-lpr-switches take their initial values
+;;       from the variables lpr-command and lpr-switches.  If you have
+;;       lpr-command set to invoke a pretty-printer such as enscript,
+;;       then ps-print won't work properly.  ps-lpr-command must name
 ;;       a program that does not format the files it prints.
 ;;
 ;;
-;; The Page Layout
-;; ---------------
+;; How Ps-Print Deals With Fonts
+;;
+;; The ps-print-*-with-faces commands attempt to determine which faces
+;; should be printed in bold or italic, but their guesses aren't
+;; always right.  For example, you might want to map colors into faces
+;; so that blue faces print in bold, and red faces in italic.
 ;;
-;; All dimensions are floats in PostScript points.
-;; 1 inch  ==       2.54  cm    ==     72       points
-;; 1 cm    ==  (/ 1 2.54) inch  ==  (/ 72 2.54) points
+;; It is possible to force ps-print to consider specific faces bold or
+;; italic, no matter what font they are displayed in, by setting the
+;; variables ps-bold-faces and ps-italic-faces.  These variables
+;; contain lists of faces that ps-print should consider bold or
+;; italic; to set them, put code like the following into your .emacs
+;; file:
 ;;
-;; The variable `ps-paper-type' determines the size of paper ps-print
-;; formats for; it should contain one of the symbols:
-;; `a4' `a3' `letter' `legal' `letter-small' `tabloid'
-;; `ledger' `statement' `executive' `a4small' `b4' `b5'
+;; 	(setq ps-bold-faces '(my-blue-face))
+;;      (setq ps-italic-faces '(my-red-face))
+;;
+;; Faces like bold-italic that are both bold and italic should go in
+;; *both* lists.
 ;;
-;; The variable `ps-landscape-mode' determines the orientation
-;; of the printing on the page:
-;; nil means `portrait' mode, non-nil means `landscape' mode.
-;; There is no oblique mode yet, though this is easy to do in ps.
-
-;; In landscape mode, the text is NOT scaled: you may print 70 lines
-;; in portrait mode and only 50 lignes in landscape mode.
-;; The margins represent margins in the printed paper:
-;; the top margin is the margin between the top of the page
-;; and the printed header, whatever the orientation is.
+;; Ps-print does not attempt to guess the sizes of fonts; all text is
+;; rendered using the Courier font family, in 10 point size.  To
+;; change the font family, change the variables ps-font, ps-font-bold,
+;; ps-font-italic, and ps-font-bold-italic; fixed-pitch fonts work
+;; best, but are not required.  To change the font size, change the
+;; variable ps-font-size.
+;;
+;; If you change the font family or size, you MUST also change the
+;; variables ps-line-height, ps-avg-char-width, and ps-space-width, or
+;; ps-print cannot correctly place line and page breaks.
 ;;
-;; The variable `ps-number-of-columns' determines the number of columns
-;; both in landscape and portrait mode.
-;; You can use:
-;; - (the standard) one column portrait mode
-;; - (my favorite) two columns landscape mode (which spares trees)
-;; but also
-;; - one column landscape mode for files with very long lines.
-;; - multi-column portrait or landscape mode
+;; Ps-print keeps internal lists of which fonts are bold and which are
+;; italic; these lists are built the first time you invoke ps-print.
+;; For the sake of efficiency, the lists are built only once; the same
+;; lists are referred in later invocations of ps-print.
+;;
+;; Because these lists are built only once, it's possible for them to
+;; get out of sync, if a face changes, or if new faces are added.  To
+;; get the lists back in sync, you can set the variable
+;; ps-build-face-reference to t, and the lists will be rebuilt the
+;; next time ps-print is invoked.
 ;;
 ;;
-;; Horizontal layout
-;; -----------------
-;;
-;; The horizontal layout is determined by the variables
-;; `ps-left-margin' `ps-inter-column' `ps-right-margin'
-;; as follows:
-;;
-;;  ------------------------------------------
-;;  |    |      |    |      |    |      |    |
-;;  | lm | text | ic | text | ic | text | rm |
-;;  |    |      |    |      |    |      |    |
-;;  ------------------------------------------
-;;
-;; If `ps-number-of-columns' is 1, `ps-inter-column' is not relevant.
-;; Usually, lm = rm > 0 and ic = lm
-;; If (ic < 0), the text of adjacent columns can overlap.
-;;
-;;
-;; Vertical layout
-;; ---------------
+;; How Ps-Print Deals With Color
 ;;
-;; The vertical layout is determined by the variables
-;; `ps-bottom-margin' `ps-top-margin' `ps-header-offset'
-;; as follows:
-;;
-;; |--------|        |--------|
-;; | tm     |        | tm     |
-;; |--------|        |--------|
-;; | header |        |        |
-;; |--------|        |        |
-;; | ho     |        |        |
-;; |--------|   or   | text   |
-;; |        |        |        |
-;; | text   |        |        |
-;; |        |        |        |
-;; |--------|        |--------|
-;; | bm     |        | bm     |
-;; |--------|        |--------|
-;;
-;; If `ps-print-header' is nil, `ps-header-offset' is not relevant.
-;; The margins represent margins in the printed paper:
-;; the top margin is the margin between the top of the page
-;; and the printed header, whatever the orientation is.
+;; Ps-print detects faces with foreground and background colors
+;; defined and embeds color information in the PostScript image.  The
+;; default foreground and background colors are defined by the
+;; variables ps-default-fg and ps-default-bg.  On black-and-white
+;; printers, colors are displayed in grayscale.  To turn off color
+;; output, set ps-print-color-p to nil.
 ;;
 ;;
 ;; Headers
-;; -------
 ;;
-;; Ps-print can print headers at the top of each column; the default
+;; Ps-print can print headers at the top of each page; the default
 ;; headers contain the following four items: on the left, the name of
 ;; the buffer and, if the buffer is visiting a file, the file's
-;; directory; on the right, the page number and date of printing.
-;; The default headers look something like this:
+;; directory; on the right, the page number and date of printing.  The
+;; default headers look something like this:
 ;;
 ;;     ps-print.el                                         1/21
 ;;     /home/jct/emacs-lisp/ps/new                     94/12/31
 ;; 
 ;; When printing on duplex printers, left and right are reversed so
-;; that the page numbers are toward the outside (cf. `ps-spool-duplex').
-;;
-;; Headers are configurable:
-;; To turn them off completely, set `ps-print-header' to nil.
-;; To turn off the header's gaudy framing box,
-;; set `ps-print-header-frame' to nil.
+;; that the page numbers are toward the outside.
 ;;
-;; The font family and size of text in the header are determined
-;; by the variables `ps-header-font-family', `ps-header-font-size' and 
-;; `ps-header-title-font-size' (see below).
-;;
-;; The variable `ps-header-line-pad' determines the portion of a header
-;; title line height to insert between the header frame and the text
-;; it contains, both in the vertical and horizontal directions:
-;; .5 means half a line.
-
-;; Page numbers are printed in `n/m' format, indicating page n of m pages;
-;; to omit the total page count and just print the page number,
-;; set `ps-show-n-of-n' to nil.
+;; Headers are configurable.  To turn them off completely, set
+;; ps-print-header to nil.  To turn off the header's gaudy framing
+;; box, set ps-print-header-frame to nil.  Page numbers are printed in
+;; "n/m" format, indicating page n of m pages; to omit the total page
+;; count and just print the page number, set ps-show-n-of-n to nil.
 ;;
 ;; The amount of information in the header can be changed by changing
-;; the number of lines.  To show less, set `ps-header-lines' to 1, and
+;; the number of lines.  To show less, set ps-header-lines to 1, and
 ;; the header will show only the buffer name and page number.  To show
-;; more, set `ps-header-lines' to 3, and the header will show the time of
+;; more, set ps-header-lines to 3, and the header will show the time of
 ;; printing below the date.
 ;;
 ;; To change the content of the headers, change the variables
-;; `ps-left-header' and `ps-right-header'.
-;; These variables are lists, specifying top-to-bottom the text
-;; to display on the left or right side of the header.
-;; Each element of the list should be a string or a symbol.
-;; Strings are inserted directly into the PostScript arrays,
-;; and should contain the PostScript string delimiters '(' and ')'.
+;; ps-left-header and ps-right-header.  These variables are lists,
+;; specifying top-to-bottom the text to display on the left or right
+;; side of the header.  Each element of the list should be a string or
+;; a symbol.  Strings are inserted directly into the PostScript
+;; arrays, and should contain the PostScript string delimiters '(' and
+;; ')'.
 ;;
 ;; Symbols in the header format lists can either represent functions
 ;; or variables.  Functions are called, and should return a string to
 ;; show in the header.  Variables should contain strings to display in
 ;; the header.  In either case, function or variable, the PostScript
-;; string delimiters are added by ps-print, and should not be part of
+;; string delimeters are added by ps-print, and should not be part of
 ;; the returned value.
 ;;
 ;; Here's an example: say we want the left header to display the text
@@ -429,217 +277,56 @@
 ;;
 ;;     (setq larry-var "Larry")
 ;;
-;; and a literal for "Curly".  Here's how `ps-left-header' should be
+;; and a literal for "Curly".  Here's how ps-left-header should be
 ;; set:
 ;;
 ;;     (setq ps-left-header (list 'moe-func 'larry-var "(Curly)"))
 ;;
 ;; Note that Curly has the PostScript string delimiters inside his
-;; quotes -- those aren't misplaced lisp delimiters!
-;;
-;; Without them, PostScript would attempt to call the undefined
-;; function Curly, which would result in a PostScript error.
-;;
-;; Since most printers don't report PostScript errors except by
-;; aborting the print job, this kind of error can be hard to track down.
-;;
-;; Consider yourself warned!
+;; quotes -- those aren't misplaced lisp delimiters!  Without them,
+;; PostScript would attempt to call the undefined function Curly,
+;; which would result in a PostScript error.  Since most printers
+;; don't report PostScript errors except by aborting the print job,
+;; this kind of error can be hard to track down.  Consider yourself
+;; warned.
 ;;
 ;;
 ;; Duplex Printers
-;; ---------------
 ;;
 ;; If you have a duplex-capable printer (one that prints both sides of
-;; the paper), set `ps-spool-duplex' to t.
-;; Ps-print will insert blank pages to make sure each buffer starts
-;; on the correct side of the paper.
-;; Don't forget to set `ps-lpr-switches' to select duplex printing
-;; for your printer.
-;;
-;; 
-;; Font managing
-;; -------------
-;;
-;; Ps-print now knows rather precisely some fonts:
-;; the variable `ps-font-info-database' contains information
-;; for a list of font families (currently mainly `Courier' `Helvetica'
-;; `Times' `Palatino' `Helvetica-Narrow' `NewCenturySchlbk').
-;; Each font family contains the font names for standard, bold, italic
-;; and bold-italic characters, a reference size (usually 10) and the
-;; corresponding line height, width of a space and average character width.
+;; the paper), set ps-spool-duplex to t.  Ps-print will insert blank
+;; pages to make sure each buffer starts on the correct side of the
+;; paper.  Don't forget to set ps-lpr-switches to select duplex
+;; printing for your printer.
 ;; 
-;; The variable `ps-font-family' determines which font family
-;; is to be used for ordinary text.
-;; If its value does not correspond to a known font family,
-;; an error message is printed into the `*Messages*' buffer,
-;; which lists the currently available font families.
-;;
-;; The variable `ps-font-size' determines the size (in points)
-;; of the font for ordinary text, when generating Postscript.
-;; Its value is a float.
-;;
-;; Similarly, the variable `ps-header-font-family' determines
-;; which font family is to be used for text in the header.
-;; The variable `ps-header-font-size' determines the font size,
-;; in points, for text in the header.
-;; The variable `ps-header-title-font-size' determines the font size,
-;; in points, for the top line of text in the header.
-;;
-;;
-;; Adding a new font family
-;; ------------------------
 ;;
-;; To use a new font family, you MUST first teach ps-print
-;; this font, i.e., add its information to `ps-font-info-database',
-;; otherwise ps-print cannot correctly place line and page breaks.
-;;
-;; For example, assuming `Helvetica' is unknown,
-;; you first need to do the following ONLY ONCE:
-;;
-;; - create a new buffer
-;; - generate the PostScript image to a file (C-u M-x ps-print-buffer)
-;; - open this file and find the line:
-;;	`% 3 cm 20 cm moveto  10 /Courier ReportFontInfo  showpage'
-;; - delete the leading `%' (which is the Postscript comment character)
-;; - replace in this line `Courier' by the new font (say `Helvetica')
-;;   to get the line:
-;;	`3 cm 20 cm moveto  10 /Helvetica ReportFontInfo  showpage'
-;; - send this file to the printer (or to ghostscript).
-;;   You should read the following on the output page:
-;;
-;;     For Helvetica 10 point, the line height is 11.56, the space width is 2.78
-;;     and a crude estimate of average character width is 5.09243
-;;
-;; - Add these values to the `ps-font-info-database':
-;;   (setq ps-font-info-database
-;;	 (append
-;;	  '((Helvetica ; the family name
-;;	    "Helvetica" "Helvetica-Bold" "Helvetica-Oblique" "Helvetica-BoldOblique"
-;;	    10.0 11.56 2.78 5.09243))
-;;	  ps-font-info-database))
-;; - Now you can use this font family with any size:
-;;	(setq ps-font-family 'Helvetica)
-;; - if you want to use this family in another emacs session, you must
-;;   put into your `~/.emacs':
-;;	(require 'ps-print)
-;;	(setq ps-font-info-database (append ...)))
-;;   if you don't want to load ps-print, you have to copy the whole value:
-;;	(setq ps-font-info-database '(<your stuff> <the standard stuff>))
-;;   or, if you can wait until the `ps-print-hook' is implemented, do:
-;;      (add-hook 'ps-print-hook '(setq ps-font-info-database (append ...)))
-;;      This does not work yet, since there is no `ps-print-hook' yet.
+;; Paper Size
 ;;
-;; You can create new `mixed' font families like:
-;;	(my-mixed-family
-;;	 "Courier-Bold" "Helvetica"
-;;	 "Zapf-Chancery-MediumItalic" "NewCenturySchlbk-BoldItalic"
-;;	 10.0 10.55 6.0 6.0)
-;; Now you can use your new font family with any size:
-;;	(setq ps-font-family 'my-mixed-family)
-;;
-;; You can get information on all the fonts resident in YOUR printer
-;; 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,
-;; you may get slightly different results.
-;; Anyway, as ghostscript fonts are autoload, you won't get
-;; much font info.
-;;
-;;
-;; How Ps-Print Deals With Faces
-;; -----------------------------
-;;
-;; The ps-print-*-with-faces commands attempt to determine which faces
-;; should be printed in bold or italic, but their guesses aren't
-;; always right.  For example, you might want to map colors into faces
-;; so that blue faces print in bold, and red faces in italic.
-;;
-;; It is possible to force ps-print to consider specific faces bold or
-;; italic, no matter what font they are displayed in, by setting the
-;; variables `ps-bold-faces' and `ps-italic-faces'.  These variables
-;; contain lists of faces that ps-print should consider bold or
-;; italic; to set them, put code like the following into your .emacs
-;; file:
-;;
-;; 	(setq ps-bold-faces '(my-blue-face))
-;;      (setq ps-italic-faces '(my-red-face))
-;;
-;; Faces like bold-italic that are both bold and italic should go in
-;; *both* lists.
+;; The variable ps-paper-type determines the size of paper ps-print
+;; formats for; it should contain one of the symbols ps-letter,
+;; ps-legal, or ps-a4.  The default is ps-letter.
 ;;
-;; Ps-print keeps internal lists of which fonts are bold and which are
-;; italic; these lists are built the first time you invoke ps-print.
-;; For the sake of efficiency, the lists are built only once; the same
-;; lists are referred in later invocations of ps-print.
-;;
-;; Because these lists are built only once, it's possible for them to
-;; get out of sync, if a face changes, or if new faces are added.  To
-;; get the lists back in sync, you can set the variable
-;; `ps-build-face-reference' to t, and the lists will be rebuilt the
-;; next time ps-print is invoked.
-;;
-;;
-;; How Ps-Print Deals With Color
-;; -----------------------------
-;;
-;; Ps-print detects faces with foreground and background colors
-;; defined and embeds color information in the PostScript image.
-;; The default foreground and background colors are defined by the
-;; variables `ps-default-fg' and `ps-default-bg'.
-;; On black-and-white printers, colors are displayed in grayscale.
-;; To turn off color output, set `ps-print-color-p' to nil.
-;;
-;;
-;; Utilities
-;; ---------
-;;
-;; Some tools are provided to help you customize your font setup.
-;;
-;; `ps-setup' returns (some part of) the current setup.
-;;
-;; To avoid wrapping too many lines, you may want to adjust the
-;; left and right margins and the font size.  On UN*X systems, do:
-;; pr -t file | awk '{printf "%3d %s\n", length($0), $0}' | sort -r | head
-;; to determine the longest lines of your file.
-;; Then, the command `ps-line-lengths' will give you the correspondence
-;; between a line length (number of characters) and the maximum font
-;; size which doesn't wrap such a line with the current ps-print setup.
-;;
-;; The commands `ps-nb-pages-buffer' and `ps-nb-pages-region' display
-;; the correspondence between a number of pages and the maximum font
-;; size which allow the number of lines of the current buffer or of
-;; its current region to fit in this number of pages.
-;; Note: line folding is not taken into account in this process
-;; and could change the results.
-;;
-;;
+;; Make sure that the variables ps-lpr-command and ps-lpr-switches
+;; contain appropriate values for your system; see the usage notes
+;; below and the documentation of these variables.
+;; 
 ;; New since version 1.5
 ;; ---------------------
+;; Color output capability.
 ;;
-;; Color output capability.
 ;; Automatic detection of font attributes (bold, italic).
+;;
 ;; Configurable headers with page numbers.
-;; Slightly faster.
-;; Support for different paper sizes.
-;; Better conformance to PostScript Document Structure Conventions.
-;;
 ;;
-;; New since version 2.8
-;; ---------------------
-;;
-;; [jack] 960517 Jacques Duthen <duthen@cegelec-red.fr>
+;; Slightly faster.
 ;;
-;; Font familiy and float size for text and header.
-;; Landscape mode.
-;; Multiple columns.
-;; Tools for page setup.
+;; Support for different paper sizes.
+;;
+;; Better conformance to PostScript Document Structure Conventions.
 ;;
 ;;
 ;; Known bugs and limitations of ps-print:
 ;; --------------------------------------
-;;
 ;; Although color printing will work in XEmacs 19.12, it doesn't work
 ;; well; in particular, bold or italic fonts don't print in the right
 ;; background color.
@@ -648,12 +335,12 @@
 ;;
 ;; Automatic font-attribute detection doesn't work well, especially
 ;; with hilit19 and older versions of get-create-face.  Users having
-;; problems with auto-font detection should use the lists
-;; `ps-italic-faces' and `ps-bold-faces' and/or turn off automatic
-;; detection by setting `ps-auto-font-detect' to nil.
+;; problems with auto-font detection should use the lists ps-italic-
+;; faces and ps-bold-faces and/or turn off automatic detection by
+;; setting ps-auto-font-detect to nil.
 ;;
 ;; Automatic font-attribute detection doesn't work with XEmacs 19.12
-;; in tty mode; use the lists `ps-italic-faces' and `ps-bold-faces'
+;; in tty mode; use the lists ps-italic-faces and ps-bold-faces
 ;; instead.
 ;;
 ;; Still too slow; could use some hand-optimization.
@@ -667,30 +354,18 @@
 ;;
 ;; Epoch and Emacs 18 not supported.  At all.
 ;;
-;; Fixed-pitch fonts work better for line folding, but are not required.  
-;;
-;; `ps-nb-pages-buffer' and `ps-nb-pages-region' don't take care
-;; of folding lines.
-;;
-;;
-;; Things to change:
-;; ----------------
 ;;
-;; 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?).
-;; `ps-nb-pages-buffer' and `ps-nb-pages-region' should take care
-;; of folding lines.
+;; Features to add:
+;; ---------------
+;; 2-up and 4-up capability.
+;;
+;; Line numbers.
+;;
+;; Wide-print (landscape) capability.
 ;;
 ;;
 ;; Acknowledgements
 ;; ----------------
-;; Thanks to Jim Thompson <?@?> for the 2.8 version I started from.
-;; [jack]
-;;
 ;; Thanks to Kevin Rodgers <kevinr@ihs.com> for adding support for
 ;; color and the invisible property.
 ;;
@@ -716,116 +391,39 @@
 
 ;;; Code:
 
-(eval-when-compile
-  (require 'cl))
+(defconst ps-print-version "2.8"
+  "ps-print.el,v 2.8 1995/05/04 12:06:10 jct Exp
 
-(unless (featurep 'lisp-float-type)
-  (error "`ps-print' requires floating point support"))
+Jim'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
+	Jim Thompson <thompson@wg2.waii.com>.")
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; User Variables:
 
-;;; Interface to the command system
-
 (defvar ps-lpr-command lpr-command
   "*The shell command for printing a PostScript file.")
 
 (defvar ps-lpr-switches lpr-switches
   "*A list of extra switches to pass to `ps-lpr-command'.")
 
-;;; Page layout
-
-;; All page dimensions are in PostScript points.
-;; 1 inch  ==       2.54  cm    ==     72       points
-;; 1 cm    ==  (/ 1 2.54) inch  ==  (/ 72 2.54) points
-
-;; Letter      8.5   inch x 11.0   inch
-;; Legal       8.5   inch x 14.0   inch
-;; A4          8.26  inch x 11.69  inch = 21.0 cm x 29.7 cm
-
-;; LetterSmall 7.68  inch x 10.16  inch
-;; Tabloid    11.0   inch x 17.0   inch
-;; Ledger     17.0   inch x 11.0   inch
-;; Statement   5.5   inch x  8.5   inch
-;; Executive   7.5   inch x 10.0   inch
-;; A3         11.69  inch x 16.5   inch = 29.7 cm x 42.0 cm
-;; A4Small     7.47  inch x 10.85  inch
-;; B4         10.125 inch x 14.33  inch
-;; B5          7.16  inch x 10.125 inch
-
-(defvar ps-page-dimensions-database
-  (list (list 'a4    (/ (* 72 21.0) 2.54) (/ (* 72 29.7) 2.54))
-	(list 'a3    (/ (* 72 29.7) 2.54) (/ (* 72 42.0) 2.54))
-	(list 'letter       (* 72  8.5)   (* 72 11.0))
-	(list 'legal        (* 72  8.5)   (* 72 14.0))
-	(list 'letter-small (* 72  7.68)  (* 72 10.16))
-	(list 'tabloid      (* 72 11.0)   (* 72 17.0))
-	(list 'ledger       (* 72 17.0)   (* 72 11.0))
-	(list 'statement    (* 72  5.5)   (* 72  8.5))
-	(list 'executive    (* 72  7.5)   (* 72 10.0))
-	(list 'a4small      (* 72  7.47)  (* 72 10.85))
-	(list 'b4           (* 72 10.125) (* 72 14.33))
-	(list 'b5           (* 72  7.16)  (* 72 10.125)))
-  "*List associating a symbolic paper type to its width and height.
-see `ps-paper-type'.")
+(defvar ps-spool-duplex nil		; Not many people have duplex
+					; printers, so default to nil.
+  "*Non-nil indicates spooling is for a two-sided printer.
+For a duplex printer, the `ps-spool-*' commands will insert blank pages
+as needed between print jobs so that the next buffer printed will
+start on the right page.  Also, if headers are turned on, the headers
+will be reversed on duplex printers so that the page numbers fall to
+the left on even-numbered pages.")
 
 ;;;###autoload
-(defvar ps-paper-type 'letter
-  "*Specifies the size of paper to format for.
-Should be one of the paper types defined in `ps-page-dimensions-database', for
-example `letter', `legal' or `a4'.")
-
-(defvar ps-landscape-mode 'nil
-  "*Non-nil means print in landscape mode.")
-
-(defvar ps-number-of-columns (if ps-landscape-mode 2 1)
-  "*Specifies the number of columns")
-
-;;; Horizontal layout
-
-;;  ------------------------------------------
-;;  |    |      |    |      |    |      |    |
-;;  | lm | text | ic | text | ic | text | rm |
-;;  |    |      |    |      |    |      |    |
-;;  ------------------------------------------
-
-(defvar ps-left-margin   (/ (* 72  2.0) 2.54) ;   2 cm
-  "*Left margin in points (1/72 inch).")
-
-(defvar ps-right-margin  (/ (* 72  2.0) 2.54) ;   2 cm
-  "*Right margin in points (1/72 inch).")
-
-(defvar ps-inter-column  (/ (* 72  2.0) 2.54) ;   2 cm
-  "*Horizontal space between columns in points (1/72 inch).")
-
-;;; Vertical layout
-
-;; |--------|
-;; | tm     |
-;; |--------|
-;; | header |
-;; |--------|
-;; | ho     |
-;; |--------|
-;; | text   |
-;; |--------|
-;; | bm     |
-;; |--------|
-
-(defvar ps-bottom-margin (/ (* 72  1.5) 2.54) ; 1.5 cm
-  "*Bottom margin in points (1/72 inch).")
-
-(defvar ps-top-margin    (/ (* 72  1.5) 2.54) ; 1.5 cm
-  "*Top margin in points (1/72 inch).")
-
-(defvar 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.")
-
-(defvar ps-header-line-pad 0.15
-  "*Portion of a header title line height to insert between the header frame
-and the text it contains, both in the vertical and horizontal directions.")
-
-;;; Header setup
+(defvar ps-paper-type 'ps-letter
+  "*Specifies the size of paper to format for.  Should be one of
+`ps-letter', `ps-legal', or `ps-a4'.")
 
 (defvar ps-print-header t
   "*Non-nil means print a header at the top of each page.
@@ -837,114 +435,19 @@
 (defvar ps-print-header-frame t
   "*Non-nil means draw a gaudy frame around the header.")
 
-(defvar ps-header-lines 2
-  "*Number of lines to display in page header, when generating Postscript.")
-(make-variable-buffer-local 'ps-header-lines)
-
 (defvar ps-show-n-of-n t
   "*Non-nil means show page numbers as N/M, meaning page N of M.
 Note: page numbers are displayed as part of headers, see variable
 `ps-print-headers'.")
 
-(defvar ps-spool-duplex nil		; Not many people have duplex
-					; printers, so default to nil.
-  "*Non-nil indicates spooling is for a two-sided printer.
-For a duplex printer, the `ps-spool-*' commands will insert blank pages
-as needed between print jobs so that the next buffer printed will
-start on the right page.  Also, if headers are turned on, the headers
-will be reversed on duplex printers so that the page numbers fall to
-the left on even-numbered pages.")
-
-;;; Fonts
-
-(defvar ps-font-info-database
-  '((Courier				; the family key
-     "Courier" "Courier-Bold" "Courier-Oblique" "Courier-BoldOblique"
-     10.0 10.55 6.0     6.0)
-    (Helvetica				; the family key
-     "Helvetica" "Helvetica-Bold" "Helvetica-Oblique" "Helvetica-BoldOblique"
-     10.0 11.56 2.78    5.09243)
-    (Times
-     "Times-Roman" "Times-Bold" "Times-Italic" "Times-BoldItalic"
-     10.0 11.0  2.5     4.71432)
-    (Palatino
-     "Palatino-Roman" "Palatino-Bold" "Palatino-Italic" "Palatino-BoldItalic"
-     10.0 12.1  2.5     5.08676)
-    (Helvetica-Narrow
-     "Helvetica-Narrow" "Helvetica-Narrow-Bold"
-     "Helvetica-Narrow-Oblique" "Helvetica-Narrow-BoldOblique"
-     10.0 11.56 2.2796  4.17579)
-    (NewCenturySchlbk
-     "NewCenturySchlbk-Roman" "NewCenturySchlbk-Bold"
-     "NewCenturySchlbk-Italic" "NewCenturySchlbk-BoldItalic"
-     10.0 12.15 2.78    5.31162)
-    ;; got no bold for the next ones
-    (AvantGarde-Book
-     "AvantGarde-Book" "AvantGarde-Book"
-     "AvantGarde-BookOblique" "AvantGarde-BookOblique"
-     10.0 11.77 2.77    5.45189)
-    (AvantGarde-Demi
-     "AvantGarde-Demi" "AvantGarde-Demi"
-     "AvantGarde-DemiOblique" "AvantGarde-DemiOblique"
-     10.0 12.72 2.8     5.51351)
-    (Bookman-Demi
-     "Bookman-Demi" "Bookman-Demi"
-     "Bookman-DemiItalic" "Bookman-DemiItalic"
-     10.0 11.77 3.4     6.05946)
-    (Bookman-Light
-     "Bookman-Light" "Bookman-Light"
-     "Bookman-LightItalic" "Bookman-LightItalic"
-     10.0 11.79 3.2     5.67027)
-    ;; got no bold and no italic for the next ones
-    (Symbol
-     "Symbol" "Symbol" "Symbol" "Symbol"
-     10.0 13.03 2.5     3.24324)
-    (Zapf-Dingbats
-     "Zapf-Dingbats" "Zapf-Dingbats" "Zapf-Dingbats" "Zapf-Dingbats"
-     10.0  9.63 2.78    2.78)
-    (Zapf-Chancery-MediumItalic
-     "Zapf-Chancery-MediumItalic" "Zapf-Chancery-MediumItalic"
-     "Zapf-Chancery-MediumItalic" "Zapf-Chancery-MediumItalic"
-     10.0 11.45 2.2     4.10811)
-)
-  "*Font info database: font family (the key), name, bold, italic, bold-italic,
-reference size, line height, space width, average character width.
-To get the info for another specific font (say Helvetica), do the following:
-- create a new buffer
-- generate the PostScript image to a file (C-u M-x ps-print-buffer)
-- open this file and delete the leading `%' (which is the Postscript
-  comment character) from the line
-	`% 3 cm 20 cm moveto  10 /Courier ReportFontInfo  showpage'
-  to get the line
-	`3 cm 20 cm moveto  10 /Helvetica ReportFontInfo  showpage'
-- add the values to `ps-font-info-database'.
-You can get all the fonts of YOUR printer using `ReportAllFontInfo'.")
-
-(defvar ps-font-family 'Courier
-  "Font family name for ordinary text, when generating Postscript.")
-
-(defvar ps-font-size   (if ps-landscape-mode 7 8.5)
-  "Font size, in points, for ordinary text, when generating Postscript.")
-
-(defvar ps-header-font-family      'Helvetica
-  "Font family name for text in the header, when generating Postscript.")
-
-(defvar ps-header-font-size       (if ps-landscape-mode 10 12)
-  "Font size, in points, for text in the header, when generating Postscript.")
-
-(defvar ps-header-title-font-size (if ps-landscape-mode 12 14)
-  "Font size, in points, for the top line of text in the header,
-when generating Postscript.")
-
-;;; Colors
-
 ;;;###autoload
 ;;; The 19.33 fsf version includes a test on pixel components instead
 ;;;  of color-instance-rgb-components
-(defvar ps-print-color-p (or (fboundp 'x-color-values)	; fsf
-			     (fboundp 'color-instance-rgb-components))
+(defvar ps-print-color-p (and (or (fboundp 'x-color-values)	; fsf
+				  (fboundp 'color-instance-rgb-components))
 					; xemacs
-; Printing color requires x-color-values.
+			      (fboundp 'float))
+; Printing color requires both floating point and x-color-values.
   "*If non-nil, print the buffer's text in color.")
 
 (defvar ps-default-fg '(0.0 0.0 0.0)
@@ -953,42 +456,64 @@
 (defvar ps-default-bg '(1.0 1.0 1.0)
   "*RGB values of the default background color.  Defaults to white.")
 
+(defvar ps-font-size 10
+  "*Font size, in points, for generating Postscript.")
+
+(defvar ps-font "Courier"
+  "*Font family name for ordinary text, when generating Postscript.")
+
+(defvar ps-font-bold "Courier-Bold"
+  "*Font family name for bold text, when generating Postscript.")
+
+(defvar ps-font-italic "Courier-Oblique"
+  "*Font family name for italic text, when generating Postscript.")
+
+(defvar ps-font-bold-italic "Courier-BoldOblique"
+  "*Font family name for bold italic text, when generating Postscript.")
+
+(defvar ps-avg-char-width (if (fboundp 'float) 5.6 6)
+  "*The average width, in points, of a character, for generating Postscript.
+This is the value that ps-print uses to determine the length,
+x-dimension, of the text it has printed, and thus affects the point at
+which long lines wrap around.  If you change the font or
+font size, you will probably have to adjust this value to match.")
+
+(defvar ps-space-width (if (fboundp 'float) 5.6 6)
+  "*The width of a space character, for generating Postscript.
+This value is used in expanding tab characters.")
+
+(defvar ps-line-height (if (fboundp 'float) 11.29 11)
+  "*The height of a line, for generating Postscript.
+This is the value that ps-print uses to determine the height,
+y-dimension, of the lines of text it has printed, and thus affects the
+point at which page-breaks are placed.  If you change the font or font
+size, you will probably have to adjust this value to match.  The
+line-height is *not* the same as the point size of the font.")
+
 (defvar ps-auto-font-detect t
   "*Non-nil means automatically detect bold/italic face attributes.
 nil means rely solely on the lists `ps-bold-faces', `ps-italic-faces',
 and `ps-underlined-faces'.")
 
-(defvar ps-bold-faces
-  (unless ps-print-color-p
-    '(font-lock-function-name-face
-      font-lock-builtin-face
-      font-lock-variable-name-face
-      font-lock-keyword-face
-      font-lock-warning-face))
+(defvar ps-bold-faces '()
   "*A list of the \(non-bold\) faces that should be printed in bold font.
 This applies to generating Postscript.")
 
-(defvar ps-italic-faces
-  (unless ps-print-color-p
-    '(font-lock-variable-name-face
-      font-lock-string-face
-      font-lock-comment-face
-      font-lock-warning-face))
+(defvar ps-italic-faces '()
   "*A list of the \(non-italic\) faces that should be printed in italic font.
 This applies to generating Postscript.")
 
-(defvar ps-underlined-faces
-  (unless ps-print-color-p
-    '(font-lock-function-name-face
-      font-lock-type-face
-      font-lock-reference-face
-      font-lock-warning-face))
+(defvar ps-underlined-faces '()
   "*A list of the \(non-underlined\) faces that should be printed underlined.
 This applies to generating Postscript.")
 
+(defvar ps-header-lines 2
+  "*Number of lines to display in page header, when generating Postscript.")
+(make-variable-buffer-local 'ps-header-lines)
+
 (defvar ps-left-header
   (list 'ps-get-buffer-name 'ps-header-dirpart)
-  "*The items to display (each on a line) on the left part of the page header.
+  "*The items to display on the right part of the page header.
 This applies to generating Postscript.
 
 The value should be a list of strings and symbols, each representing an
@@ -1006,8 +531,8 @@
 (make-variable-buffer-local 'ps-left-header)
 
 (defvar ps-right-header
-  (list "/pagenumberstring load" 'time-stamp-mon-dd-yyyy 'time-stamp-hh:mm:ss)
-  "*The items to display (each on a line) on the right part of the page header.
+  (list "/pagenumberstring load" 'time-stamp-yy/mm/dd 'time-stamp-hh:mm:ss)
+  "*The items to display on the left part of the page header.
 This applies to generating Postscript.
 
 See the variable `ps-left-header' for a description of the format of
@@ -1017,7 +542,7 @@
 (defvar ps-razzle-dazzle t
   "*Non-nil means report progress while formatting buffer.")
 
-(defvar ps-adobe-tag "%!PS-Adobe-3.0\n"
+(defvar ps-adobe-tag "%!PS-Adobe-1.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.")
@@ -1164,85 +689,6 @@
   (interactive (list (ps-print-preprint current-prefix-arg)))
   (ps-do-despool filename))
 
-;;;###autoload
-(defun ps-line-lengths ()
-  "*Display the correspondence between a line length and a font size,
-using the current ps-print setup.
-Try: pr -t file | awk '{printf \"%3d %s\n\", length($0), $0}' | sort -r | head"
-  (interactive)
-  (ps-line-lengths-internal))
-
-;;;###autoload
-(defun ps-nb-pages-buffer (nb-lines)
-  "*Display an approximate correspondence between a font size and the number
-of pages the current buffer would require to print
-using the current ps-print setup."
-  (interactive (list (count-lines (point-min) (point-max))))
-  (ps-nb-pages nb-lines))
-
-;;;###autoload
-(defun ps-nb-pages-region (nb-lines)
-  "*Display an approximate correspondence between a font size and the number
-of pages the current region would require to print
-using the current ps-print setup."
-  (interactive (list (count-lines (mark) (point))))
-  (ps-nb-pages nb-lines))
-
-;;;###autoload
-(defun ps-setup ()
-  "*Return the current setup"
-  (format "
- (setq ps-print-color-p  %s
-      ps-lpr-command    \"%s\"
-      ps-lpr-switches   %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-header-line-pad    %s
-      ps-print-header       %s
-      ps-print-header-frame %s
-      ps-header-lines       %s
-      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-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))
-
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Utility functions and variables:
 
@@ -1259,10 +705,7 @@
   (require 'faces))			; face-font, face-underline-p,
 					; x-font-regexp
 
-;; Return t if the device (which can be changed during an emacs
-;; session) can handle colors.  
-;; This is function is not yet implemented for GNU emacs.
-(defun ps-color-device ()
+(defun xemacs-color-device ()
   (if (and (eq ps-print-emacs-type 'xemacs)
 	   (>= emacs-minor-version 12))
       (eq (device-class) 'color)
@@ -1270,41 +713,12 @@
 
 (require 'time-stamp)
 
-(defvar ps-font nil
-  "Font family name for ordinary text, when generating Postscript.")
-
-(defvar ps-font-bold nil
-  "Font family name for bold text, when generating Postscript.")
-
-(defvar ps-font-italic nil
-  "Font family name for italic text, when generating Postscript.")
-
-(defvar ps-font-bold-italic nil
-  "Font family name for bold italic text, when generating Postscript.")
-
-(defvar ps-avg-char-width nil
-  "The average width, in points, of a character, for generating Postscript.
-This is the value that ps-print uses to determine the length,
-x-dimension, of the text it has printed, and thus affects the point at
-which long lines wrap around.")
-
-(defvar ps-space-width nil
-  "The width of a space character, for generating Postscript.
-This value is used in expanding tab characters.")
-
-(defvar ps-line-height nil
-  "The height of a line, for generating Postscript.
-This is the value that ps-print uses to determine the height,
-y-dimension, of the lines of text it has printed, and thus affects the
-point at which page-breaks are placed.
-The line-height is *not* the same as the point size of the font.")
-
-(defvar ps-print-prologue-1
-  "% ISOLatin1Encoding stolen from ps_init.ps in GhostScript 2.6.1.4:
+(defvar ps-print-prologue "% ISOLatin1Encoding stolen from ps_init.ps in GhostScript 2.6.1.4:
+% If the ISOLatin1Encoding vector isn't known, define it.
 /ISOLatin1Encoding where { pop } {
-% -- The ISO Latin-1 encoding vector isn't known, so define it.
-% -- The first half is the same as the standard encoding,
-% -- except for minus instead of hyphen at code 055.
+% Define the ISO Latin-1 encoding vector.
+% The first half is the same as the standard encoding,
+% except for minus instead of hyphen at code 055.
 /ISOLatin1Encoding
 StandardEncoding 0 45 getinterval aload pop
     /minus
@@ -1312,12 +726,12 @@
 %*** NOTE: the following are missing in the Adobe documentation,
 %*** but appear in the displayed table:
 %*** macron at 0225, dieresis at 0230, cedilla at 0233, space at 0240.
-% 0200 (128)
+% ^Px
     /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
     /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
     /dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent
     /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron
-% 0240 (160)
+% ^Tx
     /space /exclamdown /cent /sterling
 	/currency /yen /brokenbar /section
     /dieresis /copyright /ordfeminine /guillemotleft
@@ -1326,7 +740,7 @@
 	/acute /mu /paragraph /periodcentered
     /cedilla /onesuperior /ordmasculine /guillemotright
 	/onequarter /onehalf /threequarters /questiondown
-% 0300 (192)
+% ^Xx
     /Agrave /Aacute /Acircumflex /Atilde
 	/Adieresis /Aring /AE /Ccedilla
     /Egrave /Eacute /Ecircumflex /Edieresis
@@ -1335,7 +749,7 @@
 	/Ocircumflex /Otilde /Odieresis /multiply
     /Oslash /Ugrave /Uacute /Ucircumflex
 	/Udieresis /Yacute /Thorn /germandbls
-% 0340 (224)
+% ^\\x
     /agrave /aacute /acircumflex /atilde
 	/adieresis /aring /ae /ccedilla
     /egrave /eacute /ecircumflex /edieresis
@@ -1349,16 +763,21 @@
 
 /reencodeFontISO { %def
   dup
-  length 5 add dict	% Make a new font (a new dict the same size
-			% as the old one) with room for our new symbols.
+  length 5 add dict			% Make a new font (a new dict
+					% the same size as the old
+					% one) with room for our new
+					% symbols.
 
-  begin			% Make the new font the current dictionary.
+  begin					% Make the new font the
+					% current dictionary.
 
 
     { 1 index /FID ne
       { def } { pop pop } ifelse
-    } forall		% Copy each of the symbols from the old dictionary
-			% to the new one except for the font ID.
+    } forall				% Copy each of the symbols
+					% from the old dictionary to
+					% the new except for the font
+					% ID.
 
     /Encoding ISOLatin1Encoding def	% Override the encoding with
 					% the ISOLatin1 encoding.
@@ -1366,27 +785,14 @@
     % Use the font's bounding box to determine the ascent, descent,
     % and overall height; don't forget that these values have to be
     % transformed using the font's matrix.
+    FontBBox
+    FontMatrix transform /Ascent exch def pop
+    FontMatrix transform /Descent exch def pop
+    /FontHeight Ascent Descent sub def
 
-%          ^    (x2 y2)
-%          |       |
-%          |       v
-%          |  +----+ - -
-%          |  |    |   ^
-%          |  |    |   | Ascent (usually > 0)
-%          |  |    |   |
-% (0 0) -> +--+----+-------->
-%             |    |   |
-%             |    |   v Descent (usually < 0)
-% (x1 y1) --> +----+ - -
-
-    FontBBox				% -- x1 y1 x2 y2
-    FontMatrix transform /Ascent  exch def pop
-    FontMatrix transform /Descent exch def pop
-    /FontHeight Ascent Descent sub def	% use `sub' because descent < 0
-
-    % Define these in case they're not in the FontInfo
-    % (also, here they're easier to get to.
-    /UnderlinePosition  1 def
+    % Define these in case they're not in the FontInfo (also, here
+    % they're easier to get to.
+    /UnderlinePosition 1 def
     /UnderlineThickness 1 def
 
     % Get the underline position and thickness if they're defined.
@@ -1407,22 +813,28 @@
 
     } if
 
-    currentdict		% Leave the new font on the stack
-    end			% Stop using the font as the current dictionary.
-    definefont		% Put the font into the font dictionary
-    pop			% Discard the returned font.
+    currentdict				% Leave the new font on the
+					% stack
+
+    end					% Stop using the font as the
+					% current dictionary.
+
+    definefont				% Put the font into the font
+					% dictionary
+
+    pop					% Discard the returned font.
 } bind def
 
-/DefFont {				% Font definition
+/Font {
   findfont exch scalefont reencodeFontISO
 } def
 
-/F {					% Font selection
+/F {					% Font select
   findfont
-  dup /Ascent             get /Ascent             exch def
-  dup /Descent            get /Descent            exch def
-  dup /FontHeight         get /FontHeight         exch def
-  dup /UnderlinePosition  get /UnderlinePosition  exch def
+  dup /Ascent get /Ascent exch def
+  dup /Descent get /Descent exch def
+  dup /FontHeight get /FontHeight exch def
+  dup /UnderlinePosition get /UnderlinePosition exch def
   dup /UnderlineThickness get /UnderlineThickness exch def
   setfont
 } def
@@ -1435,23 +847,15 @@
   { mark 4 1 roll ] /bgcolor exch def } if
 } def
 
-%  B    width    C
-%   +-----------+
-%               | Ascent  (usually > 0)
-% A +           +
-%               | Descent (usually < 0)
-%   +-----------+
-%  E    width    D
-
 /dobackground {				% width --
-  currentpoint				% -- width x y
+  currentpoint
   gsave
     newpath
-    moveto				% A (x y)
-    0 Ascent rmoveto			% B
-    dup 0 rlineto			% C
-    0 Descent Ascent sub rlineto	% D
-    neg 0 rlineto			% E
+    moveto
+    0 Ascent rmoveto
+    dup 0 rlineto
+    0 Descent Ascent sub rlineto
+    neg 0 rlineto
     closepath
     bgcolor aload pop setrgbcolor
     fill
@@ -1474,23 +878,20 @@
   grestore
 } def
 
-/eolbg {				% dobackground until right margin
-  PrintWidth				% -- x-eol
-  currentpoint pop			% -- cur-x
-  sub					% -- width until eol
-  dobackground
+/eolbg {
+  currentpoint pop
+  PrintWidth LeftMargin add exch sub dobackground
 } def
 
-/eolul {				% idem for underline
-  PrintWidth				% -- x-eol
-  currentpoint exch pop			% -- x-eol cur-y
-  dounderline
+/eolul {
+  currentpoint exch pop
+  PrintWidth LeftMargin add exch dounderline
 } def
 
 /SL {					% Soft Linefeed
   bg { eolbg } if
   ul { eolul } if
-  0  currentpoint exch pop LineHeight sub  moveto
+  currentpoint LineHeight sub LeftMargin exch moveto pop
 } def
 
 /HL /SL load def			% Hard Linefeed
@@ -1511,48 +912,18 @@
 
 /W {
   ul { sp1 } if
-  ( ) stringwidth	% Get the width of a space in the current font.
-  pop			% Discard the Y component.
-  mul			% Multiply the width of a space
-			% by the number of spaces to plot
+  ( ) stringwidth			% Get the width of a space
+  pop					% Discard the Y component
+  mul					% Multiply the width of a
+					% space by the number of
+					% spaces to plot
   bg { dup dobackground } if
   0 rmoveto
   ul { dounderline } if
 } def
 
-/BeginDoc {
-  % ---- save the state of the document (useful for ghostscript!)
-  /docState save def
-  % ---- [jack] Kludge: my ghostscript window is 21x27.7 instead of 21x29.7
-  /JackGhostscript where {
-    pop 1 27.7 29.7 div scale
-  } if
-  LandscapeMode {
-    % ---- translate to bottom-right corner of Portrait page
-    LandscapePageHeight 0 translate
-    90 rotate
-    } if
-  /ColumnWidth PrintWidth InterColumn add def
-  % ---- translate to lower left corner of TEXT
-  LeftMargin BottomMargin translate
-  % ---- define where  printing will start
-  /f0 F					% this installs Ascent
-  /PrintStartY PrintHeight Ascent sub def
-  /ColumnIndex 1 def
-} def
-
-/EndDoc {
-  % ---- on last page but not last column, spit out the page
-  ColumnIndex 1 eq not { showpage } if
-  % ---- restore the state of the document (useful for ghostscript!)
-  docState restore
-} def
-
 /BeginDSCPage {
-  % ---- when 1st column, save the state of the page
-  ColumnIndex 1 eq { /pageState save def } if
-  % ---- save the state of the column
-  /columnState save def
+  /vmstate save def
 } def
 
 /BeginPage {
@@ -1560,90 +931,71 @@
     PrintHeaderFrame { HeaderFrame } if
     HeaderText
   } if
-  0 PrintStartY moveto			% move to where printing will start
+  LeftMargin
+  BottomMargin PrintHeight add
+  moveto				% move to where printing will
+					% start.
 } def
 
 /EndPage {
   bg { eolbg } if
   ul { eolul } if
+  showpage				% Spit out a page
 } def
 
 /EndDSCPage {
-  ColumnIndex NumberOfColumns eq {
-    % ---- on last column, spit out the page
-    showpage
-    % ---- restore the state of the page
-    pageState restore
-    /ColumnIndex 1 def
-  } { % else
-    % ---- restore the state of the current column
-    columnState restore
-    % ---- and translate to the next column
-    ColumnWidth 0 translate
-    /ColumnIndex ColumnIndex 1 add def
-  } ifelse
+  vmstate restore
 } def
 
 /ul false def
 
 /UL { /ul exch def } def
 
-/SetHeaderLines {			% nb-lines --
+/h0 14 /Helvetica-Bold Font
+/h1 12 /Helvetica Font
+
+/h1 F
+
+/HeaderLineHeight FontHeight def
+/HeaderDescent Descent def
+/HeaderPad 2 def
+
+/SetHeaderLines {
+  /HeaderOffset TopMargin 2 div def
   /HeaderLines exch def
-  % ---- bottom up
-  HeaderPad
-  HeaderLines 1 sub HeaderLineHeight mul add
-  HeaderTitleLineHeight add
-  HeaderPad add
-  /HeaderHeight exch def
+  /HeaderHeight HeaderLines HeaderLineHeight mul HeaderPad 2 mul add def
+  /PrintHeight PrintHeight HeaderHeight sub def
 } def
 
-% |---------|
-% |  tm     |
-% |---------|
-% |  header |
-% |-+-------| <-- (x y)
-% |  ho     |
-% |---------|
-% |  text   |
-% |-+-------| <-- (0 0)
-% |  bm     |
-% |---------|
-
-/HeaderFrameStart {			% -- x y
-  0  PrintHeight HeaderOffset add
+/HeaderFrameStart {
+  LeftMargin BottomMargin PrintHeight add HeaderOffset add
 } def
 
 /HeaderFramePath {
-  PrintWidth	 0			rlineto
-  0		 HeaderHeight		rlineto
-  PrintWidth neg 0			rlineto
-  0		 HeaderHeight neg	rlineto
+  PrintWidth 0 rlineto
+  0 HeaderHeight rlineto
+  PrintWidth neg 0 rlineto
+  0 HeaderHeight neg rlineto
 } def
 
 /HeaderFrame {
   gsave
     0.4 setlinewidth
-    % ---- fill a black rectangle (the shadow of the next one)
     HeaderFrameStart moveto
     1 -1 rmoveto
     HeaderFramePath
     0 setgray fill
-    % ---- do the next rectangle ...
     HeaderFrameStart moveto
     HeaderFramePath
-    gsave 0.9 setgray fill grestore	% filled with grey
-    gsave 0 setgray stroke grestore	% drawn  with black
+    gsave 0.9 setgray fill grestore
+    gsave 0 setgray stroke grestore
   grestore
 } def
 
 /HeaderStart {
   HeaderFrameStart
-  exch HeaderPad add exch	% horizontal pad
-  % ---- bottom up
-  HeaderPad add			% vertical   pad
-  HeaderDescent sub
-  HeaderLineHeight HeaderLines 1 sub mul add
+  exch HeaderPad add exch
+  HeaderLineHeight HeaderLines 1 sub mul add HeaderDescent sub HeaderPad add
 } def
 
 /strcat {
@@ -1663,14 +1015,10 @@
 /HeaderText {
   HeaderStart moveto
 
-  HeaderLinesRight HeaderLinesLeft	% -- rightLines leftLines
-
-  % ---- hack: `PN 1 and'  ==  `PN 2 modulo'
-
-  % ---- if duplex and even page number, then exchange left and right
+  HeaderLinesRight HeaderLinesLeft
   Duplex PageNumber 1 and 0 eq and { exch } if
 
-  { % ---- process the left lines
+  {
     aload pop
     exch F
     gsave
@@ -1682,7 +1030,7 @@
 
   HeaderStart moveto
 
-  { % ---- process the right lines
+   {
     aload pop
     exch F
     gsave
@@ -1697,14 +1045,15 @@
 
 /ReportFontInfo {
   2 copy
-  /t0 3 1 roll DefFont
+  /t0 3 1 roll Font
   /t0 F
   /lh FontHeight def
   /sw ( ) stringwidth pop def
   /aw (01234567890abcdefghijklmnopqrstuvwxyz) dup length exch
   stringwidth pop exch div def
-  /t1 12 /Helvetica-Oblique DefFont
+  /t1 12 /Helvetica-Oblique Font
   /t1 F
+  72 72 moveto
   gsave
     (For ) show
     128 string cvs show
@@ -1717,43 +1066,13 @@
     (,) show
   grestore
   0 FontHeight neg rmoveto
-  gsave
-    (and a crude estimate of average character width is ) show
-    aw 32 string cvs show
-    (.) show
-  grestore
-  0 FontHeight neg rmoveto
-} def
-
-/cm { % cm to point
-  72 mul 2.54 div
-} def
-
-/ReportAllFontInfo {
-  FontDirectory
-  { % key = font name  value = font dictionary
-    pop 10 exch ReportFontInfo
-  } forall
+  (and a crude estimate of average character width is ) show
+  aw 32 string cvs show
+  (.) show
+  showpage
 } def
 
-% 3 cm 20 cm moveto  10 /Courier ReportFontInfo  showpage
-% 3 cm 20 cm moveto  ReportAllFontInfo           showpage
-
-")
-
-(defvar ps-print-prologue-2
-  "
-% ---- These lines must be kept together because...
-
-/h0 F
-/HeaderTitleLineHeight FontHeight def
-
-/h1 F
-/HeaderLineHeight FontHeight def
-/HeaderDescent    Descent def
-
-% ---- ...because `F' has a side-effect on `FontHeight' and `Descent'
-
+% 10 /Courier ReportFontInfo
 ")
 
 ;; Start Editing Here:
@@ -1776,39 +1095,64 @@
 
 (defvar ps-razchunk 0)
 
-(defvar ps-color-format
-  (if (eq ps-print-emacs-type 'emacs)
+(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"
+			    ;;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"
 
-    ;; Lucid emacsen 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"))
 
 ;; These values determine how much print-height to deduct when headers
 ;; are turned on.  This is a pretty clumsy way of handling it, but
 ;; it'll do for now.
+(defvar ps-header-title-line-height (if (fboundp 'float) 16.0 16));Helvetica 14
+(defvar ps-header-line-height (if (fboundp 'float) 13.7 14));Helvetica 12
+(defvar ps-header-pad 2)
 
-(defvar ps-header-font)
-(defvar ps-header-title-font)
+;; LetterSmall 7.68 inch 10.16 inch
+;; Tabloid 11.0 inch 17.0 inch
+;; Ledger 17.0 inch 11.0 inch
+;; Statement 5.5 inch 8.5 inch
+;; Executive 7.5 inch 10.0 inch
+;; A3 11.69 inch 16.5 inch
+;; A4Small 7.47 inch 10.85 inch
+;; B4 10.125 inch 14.33 inch
+;; B5 7.16 inch 10.125 inch
+
+;; All page dimensions are in PostScript points.
+
+(defvar ps-left-margin 72)		; 1 inch
+(defvar ps-right-margin 72)		; 1 inch
+(defvar ps-bottom-margin 36)		; 1/2 inch
+(defvar ps-top-margin 72)		; 1 inch
 
-(defvar ps-header-line-height)
-(defvar ps-header-title-line-height)
-(defvar ps-header-pad 0
-  "Vertical and horizontal space in points (1/72 inch) between the header frame
-and the text it contains.")
+;; Letter 8.5 inch x 11.0 inch
+(defvar ps-letter-page-height 792)	; 11 inches
+(defvar ps-letter-page-width 612)	; 8.5 inches
+
+;; Legal 8.5 inch x 14.0 inch
+(defvar ps-legal-page-height 1008)	; 14.0 inches
+(defvar ps-legal-page-width 612)	; 8.5 inches
 
-;; Define accessors to the dimensions list.
+;; A4 8.26 inch x 11.69 inch
+(defvar ps-a4-page-height 842)	; 11.69 inches
+(defvar ps-a4-page-width 595)	; 8.26 inches
 
-(defmacro ps-page-dimensions-get-width  (dims) `(nth 0 ,dims))
-(defmacro ps-page-dimensions-get-height (dims) `(nth 1 ,dims))
+(defvar ps-pages-alist
+  (list (list 'ps-letter ps-letter-page-width ps-letter-page-height)
+	(list 'ps-legal ps-legal-page-width ps-legal-page-height)
+	(list 'ps-a4 ps-a4-page-width ps-a4-page-height)))
 
-(defvar ps-landscape-page-height)
+;; Define some constants to index into the page lists.
+(defvar ps-page-width-i 1)
+(defvar ps-page-height-i 2)
 
+(defvar ps-page-dimensions nil)
 (defvar ps-print-width nil)
 (defvar ps-print-height nil)
 
@@ -1819,239 +1163,15 @@
 (defvar ps-ref-italic-faces nil)
 (defvar ps-ref-underlined-faces nil)
 
-(defvar ps-print-color-scale nil)
-
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Internal functions
 
-(defun ps-line-lengths-internal ()
-  "Display the correspondence between a line length and a font size,
-using the current ps-print setup.
-Try: pr -t file | awk '{printf \"%3d %s\n\", length($0), $0}' | sort -r | head"
-  (let ((buf (get-buffer-create "*Line-lengths*"))
-	(ifs ps-font-size)		; initial font size
-	(icw ps-avg-char-width)		; initial character width
-	(print-width (progn (ps-get-page-dimensions)
-			    ps-print-width))
-	(ps-setup (ps-setup))		; setup for the current buffer
-	(fs-min 5)			; minimum font size
-	cw-min				; minimum character width
-	nb-cpl-max			; maximum nb of characters per line
-	(fs-max 14)			; maximum font size
-	cw-max				; maximum character width
-	nb-cpl-min			; minimum nb of characters per line
-	fs				; current font size
-	cw				; current character width
-	nb-cpl				; current nb of characters per line
-	)
-    (setq cw-min     (/ (* icw fs-min) ifs)
-	  nb-cpl-max (floor (/ print-width cw-min))
-	  cw-max     (/ (* icw fs-max) ifs)
-	  nb-cpl-min (floor (/ print-width cw-max)))
-    (setq nb-cpl nb-cpl-min)
-    (set-buffer buf)
-    (goto-char (point-max))
-    (if (not (bolp)) (insert "\n"))
-    (insert ps-setup)
-    (insert "nb char per line / font size\n")
-    (while (<= nb-cpl nb-cpl-max)
-      (setq cw     (/ print-width (float nb-cpl))
-	    fs     (/ (* ifs cw) icw))
-      (insert (format "%3s %s\n" nb-cpl fs))
-      (setq nb-cpl (1+ nb-cpl)))
-    (insert "\n")
-    (display-buffer buf 'not-this-window)))
-
-(defun ps-nb-pages (nb-lines)
-  "Display an approximate correspondence between a font size and the number
-of pages the number of lines would require to print
-using the current ps-print setup."
-  (let ((buf (get-buffer-create "*Nb-Pages*"))
-	(ifs ps-font-size)		; initial font size
-	(ilh ps-line-height)		; initial line height
-	(page-height (progn (ps-get-page-dimensions)
-			    ps-print-height))
-	(ps-setup (ps-setup))		; setup for the current buffer
-	(fs-min 4)			; minimum font size
-	lh-min				; minimum line height
-	nb-lpp-max			; maximum nb of lines per page
-	nb-page-min			; minimum nb of pages
-	(fs-max 14)			; maximum font size
-	lh-max				; maximum line height
-	nb-lpp-min			; minimum nb of lines per page
-	nb-page-max			; maximum nb of pages
-	fs				; current font size
-	lh				; current line height
-	nb-lpp				; current nb of lines per page
-	nb-page				; current nb of pages
-	)
-    (setq lh-min      (/ (* ilh fs-min) ifs)
-	  nb-lpp-max  (floor (/ page-height lh-min))
-	  nb-page-min (ceiling (/ (float nb-lines) nb-lpp-max))
-	  lh-max      (/ (* ilh fs-max) ifs)
-	  nb-lpp-min  (floor (/ page-height lh-max))
-	  nb-page-max (ceiling (/ (float nb-lines) nb-lpp-min)))
-    (setq nb-page nb-page-min)
-    (set-buffer buf)
-    (goto-char (point-max))
-    (if (not (bolp)) (insert "\n"))
-    (insert ps-setup)
-    (insert (format "%d lines\n" nb-lines))
-    (insert "nb page / font size\n")
-    (while (<= nb-page nb-page-max)
-      (setq nb-lpp (ceiling (/ nb-lines (float nb-page)))
-	    lh     (/ page-height nb-lpp)
-	    fs     (/ (* ifs lh) ilh))
-      (insert (format "%s %s\n" nb-page fs))
-      (setq nb-page (1+ nb-page)))
-    (insert "\n")
-    (display-buffer buf 'not-this-window)))
-
-(defun ps-select-font ()
-  "Choose the font name and size (scaling data)."
-  (let ((assoc (assq ps-font-family ps-font-info-database))
-	l fn fb fi bi sz lh sw aw)
-    (if (null assoc)
-	(error "Don't have data to scale font %s. Known fonts families are %s"
-	       ps-font-family
-	       (mapcar 'car ps-font-info-database)))
-    (setq l  (cdr assoc)
-	  fn (prog1 (car l) (setq l (cdr l))) ; need `pop'
-	  fb (prog1 (car l) (setq l (cdr l)))
-	  fi (prog1 (car l) (setq l (cdr l)))
-	  bi (prog1 (car l) (setq l (cdr l)))
-	  sz (prog1 (car l) (setq l (cdr l)))
-	  lh (prog1 (car l) (setq l (cdr l)))
-	  sw (prog1 (car l) (setq l (cdr l)))
-	  aw (prog1 (car l) (setq l (cdr l))))
-
-    (setq ps-font             fn)
-    (setq ps-font-bold        fb)
-    (setq ps-font-italic      fi)
-    (setq ps-font-bold-italic bi)
-    ;; These data just need to be rescaled:
-    (setq ps-line-height    (/ (* lh ps-font-size) sz))
-    (setq ps-space-width    (/ (* sw ps-font-size) sz))
-    (setq ps-avg-char-width (/ (* aw ps-font-size) sz))
-    ps-font-family))
-
-(defun ps-select-header-font ()
-  "Choose the font name and size (scaling data) for the header."
-  (let ((assoc (assq ps-header-font-family ps-font-info-database))
-	l fn fb fi bi sz lh sw aw)
-    (if (null assoc)
-	(error "Don't have data to scale font %s. Known fonts families are %s"
-	       ps-font-family
-	       (mapcar 'car ps-font-info-database)))
-    (setq l  (cdr assoc)
-	  fn (prog1 (car l) (setq l (cdr l))) ; need `pop'
-	  fb (prog1 (car l) (setq l (cdr l)))
-	  fi (prog1 (car l) (setq l (cdr l)))
-	  bi (prog1 (car l) (setq l (cdr l)))
-	  sz (prog1 (car l) (setq l (cdr l)))
-	  lh (prog1 (car l) (setq l (cdr l)))
-	  sw (prog1 (car l) (setq l (cdr l)))
-	  aw (prog1 (car l) (setq l (cdr l))))
-
-    ;; Font name
-    (setq ps-header-font             fn)
-    (setq ps-header-title-font       fb)
-    ;; Line height: These data just need to be rescaled:
-    (setq ps-header-title-line-height (/ (* lh ps-header-title-font-size) sz))
-    (setq ps-header-line-height       (/ (* lh ps-header-font-size)       sz))
-    ps-header-font-family))
-
 (defun ps-get-page-dimensions ()
-  (let ((page-dimensions (cdr (assq ps-paper-type ps-page-dimensions-database)))
-	page-width page-height)
-    (cond
-     ((null page-dimensions)
-      (error "`ps-paper-type' must be one of:\n%s"
-	     (mapcar 'car ps-page-dimensions-database)))
-     ((< ps-number-of-columns 1)
-      (error "The number of columns %d should not be negative")))
-
-    (ps-select-font)
-    (ps-select-header-font)
-
-    (setq page-width  (ps-page-dimensions-get-width  page-dimensions)
-	  page-height (ps-page-dimensions-get-height page-dimensions))
-
-    ;; Landscape mode
-    (if ps-landscape-mode
-	;; exchange width and height
-	(setq page-width (prog1 page-height (setq page-height page-width))))
-
-    ;; It is used to get the lower right corner (only in landscape mode)
-    (setq ps-landscape-page-height page-height)
-
-    ;; | lm | text | ic | text | ic | text | rm |
-    ;; page-width == lm  +  n * pw  +  (n - 1) * ic  +  rm
-    ;; => pw == (page-width - lm -rm - (n - 1) * ic) / n
-    (setq ps-print-width
-	  (/ (- page-width
-		ps-left-margin ps-right-margin
-		(* (1- ps-number-of-columns) ps-inter-column))
-	     ps-number-of-columns))
-    (if (<= ps-print-width 0)
-	(error "Bad horizontal layout:
-page-width           == %s
-ps-left-margin       == %s
-ps-right-margin      == %s
-ps-inter-column      == %s
-ps-number-of-columns == %s
-| lm | text | ic | text | ic | text | rm |
-page-width == lm  +  n * print-width  +  (n - 1) * ic  +  rm
-=> print-width == %d !"
-	       page-width
-	       ps-left-margin
-	       ps-right-margin
-	       ps-inter-column
-	       ps-number-of-columns
-	       ps-print-width))
-
-    (setq ps-print-height
-	  (- page-height ps-bottom-margin ps-top-margin))
-    (if (<= ps-print-height 0)
-	(error "Bad vertical layout:
-ps-top-margin    == %s
-ps-bottom-margin == %s
-page-height == bm + print-height + tm
-=> print-height == %d !"
-	       ps-top-margin
-	       ps-bottom-margin
-	       ps-print-height))
-    ;; If headers are turned on, deduct the height of the header from
-    ;; the print height.
-    (cond
-     (ps-print-header
-      (setq ps-header-pad
-	    (* ps-header-line-pad ps-header-title-line-height))
-      (setq ps-print-height
-	    (- ps-print-height
-	       ps-header-offset
-	       ps-header-pad
-	       ps-header-title-line-height
-	       (* ps-header-line-height (- ps-header-lines 1))
-	       ps-header-pad))))
-    (if (<= ps-print-height 0)
-	(error "Bad vertical layout:
-ps-top-margin    == %s
-ps-bottom-margin == %s
-ps-header-offset == %s
-ps-header-pad    == %s
-header-height    == %s
-page-height == bm + print-height + tm - ho - hh
-=> print-height == %d !"
-	       ps-top-margin
-	       ps-bottom-margin
-	       ps-header-offset
-	       ps-header-pad
-	       (+ ps-header-pad
-		  ps-header-title-line-height
-		  (* ps-header-line-height (- ps-header-lines 1))
-		  ps-header-pad)
-	       ps-print-height))))
+  (setq ps-page-dimensions (assq ps-paper-type ps-pages-alist))
+  (let ((ps-page-width (nth ps-page-width-i ps-page-dimensions))
+	(ps-page-height (nth ps-page-height-i ps-page-dimensions)))
+    (setq ps-print-height (- ps-page-height ps-top-margin ps-bottom-margin))
+    (setq ps-print-width (- ps-page-width ps-left-margin ps-right-margin))))
 
 (defun ps-print-preprint (&optional filename)
   (if (and filename
@@ -2114,7 +1234,7 @@
   (ps-flush-output)
 
   ;; Check to see that the file exists and is readable; if not, throw
-  ;; an error.
+  ;; and error.
   (if (not (file-readable-p fname))
       (error "Could not read file `%s'" fname))
 
@@ -2164,7 +1284,6 @@
   (ps-output (format "/%s %s def\n" name (if bool "true" "false"))))
 
 (defun ps-begin-file ()
-  (ps-get-page-dimensions)
   (setq ps-showpage-count 0)
 
   (ps-output ps-adobe-tag)
@@ -2173,56 +1292,37 @@
   (ps-output "%%Creator: " (user-full-name) "\n")
   (ps-output "%%CreationDate: " 
 	     (time-stamp-hh:mm:ss) " " (time-stamp-mon-dd-yyyy) "\n")
+  (ps-output "%% DocumentFonts: Helvetica Helvetica-Bold "
+	     ps-font " " ps-font-bold " " ps-font-italic " "
+	     ps-font-bold-italic "\n")
   (ps-output "%%Pages: (atend)\n")
   (ps-output "%%EndComments\n\n")
 
-  (ps-output "%%BeginProlog\n")
-  (ps-output-boolean "LandscapeMode"             ps-landscape-mode)
-  (ps-output (format "/NumberOfColumns %d def\n" ps-number-of-columns))
-
-  (ps-output (format "/LandscapePageHeight %s def\n" ps-landscape-page-height))
-  (ps-output (format "/PrintWidth   %s def\n" ps-print-width))
-  (ps-output (format "/PrintHeight  %s def\n" ps-print-height))
-
-  (ps-output (format "/LeftMargin   %s def\n" ps-left-margin))
-  (ps-output (format "/RightMargin  %s def\n" ps-right-margin)) ; not used
-  (ps-output (format "/InterColumn  %s def\n" ps-inter-column))
+  (ps-output-boolean "Duplex" ps-spool-duplex)
+  (ps-output-boolean "PrintHeader" ps-print-header)
+  (ps-output-boolean "PrintHeaderFrame" ps-print-header-frame)
+  (ps-output-boolean "ShowNofN" ps-show-n-of-n)
 
-  (ps-output (format "/BottomMargin %s def\n" ps-bottom-margin))
-  (ps-output (format "/TopMargin    %s def\n" ps-top-margin)) ; not used
-  (ps-output (format "/HeaderOffset %s def\n" ps-header-offset))
-  (ps-output (format "/HeaderPad    %s def\n" ps-header-pad))
-  
-  (ps-output-boolean "PrintHeader"      ps-print-header)
-  (ps-output-boolean "PrintHeaderFrame" ps-print-header-frame)
-  (ps-output-boolean "ShowNofN"         ps-show-n-of-n)
-  (ps-output-boolean "Duplex"           ps-spool-duplex)
-
-  (ps-output (format "/LineHeight   %s def\n" ps-line-height))
+  (ps-output (format "/LeftMargin %d def\n" ps-left-margin))
+  (ps-output (format "/RightMargin %d def\n" ps-right-margin))
+  (ps-output (format "/BottomMargin %d def\n" ps-bottom-margin))
+  (ps-output (format "/TopMargin %d def\n" ps-top-margin))
 
-  (ps-output ps-print-prologue-1)
-  (ps-output "%%EndProlog\n\n")
-
-
-  (ps-output "%%BeginSetup\n")
-
-  ;; Header fonts
-  (ps-output				; /h0 14 /Helvetica-Bold Font
-   (format "/h0 %s /%s DefFont\n" ps-header-title-font-size ps-header-title-font))
-  (ps-output				; /h1 12 /Helvetica Font
-   (format "/h1 %s /%s DefFont\n" ps-header-font-size       ps-header-font))
+  (ps-get-page-dimensions)
+  (ps-output (format "/PrintWidth %d def\n" ps-print-width))
+  (ps-output (format "/PrintHeight %d def\n" ps-print-height))
+  
+  (ps-output (format "/LineHeight %s def\n" ps-line-height))
+  
+  (ps-output ps-print-prologue)
 
-  (ps-output ps-print-prologue-2)
+  (ps-output (format "/f0 %d /%s Font\n" ps-font-size ps-font))
+  (ps-output (format "/f1 %d /%s Font\n" ps-font-size ps-font-bold))
+  (ps-output (format "/f2 %d /%s Font\n" ps-font-size ps-font-italic))
+  (ps-output (format "/f3 %d /%s Font\n" ps-font-size
+		     ps-font-bold-italic))
 
-  ;; Text fonts
-  (ps-output (format "/f0 %s /%s DefFont\n" ps-font-size ps-font))
-  (ps-output (format "/f1 %s /%s DefFont\n" ps-font-size ps-font-bold))
-  (ps-output (format "/f2 %s /%s DefFont\n" ps-font-size ps-font-italic))
-  (ps-output (format "/f3 %s /%s DefFont\n" ps-font-size ps-font-bold-italic))
-
-  (ps-output "\nBeginDoc\n\n")
-  (ps-output "%%EndSetup\n")
-)
+  (ps-output "%%EndPrologue\n"))
 
 (defun ps-header-dirpart ()
   (let ((fname (buffer-file-name)))
@@ -2233,24 +1333,17 @@
       "")))
 
 (defun ps-get-buffer-name ()
-  (cond
-   ;; Indulge Jim this little easter egg:
-   ((string= (buffer-name) "ps-print.el")
-    "Hey, Cool!  It's ps-print.el!!!")
-   ;; Indulge Jack this other little easter egg:
-   ((string= (buffer-name) "sokoban.el")
-    "Super! C'est sokoban.el!")
-   (t (buffer-name))))
+  ;; Indulge me this little easter egg:
+  (if (string= (buffer-name) "ps-print.el")
+      "Hey, Cool!  It's ps-print.el!!!"
+    (buffer-name)))
 
 (defun ps-begin-job ()
   (setq ps-page-count 0))
 
 (defun ps-end-file ()
-  (ps-output "\n\n%%Trailer\n")
-  (ps-output (format "%%%%Pages: %d\n" (1+ (/ (1- ps-page-count)
-					      ps-number-of-columns))))
-  (ps-output "EndDoc\n")
-  (ps-output "%%EOF\n"))
+  (ps-output "%%Trailer\n")
+  (ps-output "%%Pages: " (format "%d\n" ps-showpage-count)))
 
 (defun ps-next-page ()
   (ps-end-page)
@@ -2259,28 +1352,36 @@
 
 (defun ps-begin-page (&optional dummypage)
   (ps-get-page-dimensions)
-  (setq ps-width-remaining  ps-print-width)
+  (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)))))
+  ;; If headers are turned on, deduct the height of the header from
+  ;; the print height remaining.  Clumsy clumsy clumsy.
+  (if ps-print-header
+      (setq ps-height-remaining
+	    (- ps-height-remaining
+	       ps-header-title-line-height
+	       (* ps-header-line-height (- ps-header-lines 1))
+	       (* 2 ps-header-pad))))
 
+  (setq ps-page-count (+ ps-page-count 1))
+
+  (ps-output "\n%%Page: " 
+	     (format "%d %d\n" ps-page-count (+ 1 ps-showpage-count)))
   (ps-output "BeginDSCPage\n")
-  (ps-output (format "/PageNumber %d def\n" (incf ps-page-count)))
+  (ps-output (format "/PageNumber %d def\n" ps-page-count))
   (ps-output "/PageCount 0 def\n")
 
-  (when ps-print-header
-    (ps-generate-header "HeaderLinesLeft"    ps-left-header)
-    (ps-generate-header "HeaderLinesRight"   ps-right-header)
-    (ps-output (format "%d SetHeaderLines\n" ps-header-lines)))
+  (if ps-print-header
+      (progn
+	(ps-generate-header "HeaderLinesLeft" ps-left-header)
+	(ps-generate-header "HeaderLinesRight" ps-right-header)
+	(ps-output (format "%d SetHeaderLines\n" ps-header-lines))))
 
   (ps-output "BeginPage\n")
-  (ps-set-font      ps-current-font)
-  (ps-set-bg        ps-current-bg)
-  (ps-set-color     ps-current-color)
+  (ps-set-font ps-current-font)
+  (ps-set-bg ps-current-bg)
+  (ps-set-color ps-current-color)
   (ps-set-underline ps-current-underline-p))
 
 (defun ps-end-page ()
@@ -2300,19 +1401,17 @@
 (defun ps-next-line ()
   (if (< ps-height-remaining ps-line-height)
       (ps-next-page)
-    (setq ps-width-remaining  ps-print-width)
+    (setq ps-width-remaining ps-print-width)
     (setq ps-height-remaining (- ps-height-remaining ps-line-height))
     (ps-hard-lf)))
 
 (defun ps-continue-line ()
   (if (< ps-height-remaining ps-line-height)
       (ps-next-page)
-    (setq ps-width-remaining  ps-print-width)
+    (setq ps-width-remaining ps-print-width)
     (setq ps-height-remaining (- ps-height-remaining ps-line-height))
     (ps-soft-lf)))
 
-;; [jack] Why hard and soft ?
-
 (defun ps-hard-lf ()
   (ps-output "HL\n"))
 
@@ -2331,7 +1430,7 @@
 	 (to (car wrappoint))
 	 (string (buffer-substring from to)))
     (ps-output-string string)
-    (ps-output " S\n")
+    (ps-output " S\n")			;
     wrappoint))
 
 (defun ps-basic-plot-whitespace (from to &optional bg-color)
@@ -2362,12 +1461,14 @@
 		    (if (< q-todo 100)
 			(/ (* 100 q-done) q-todo)
 		      (/ q-done (/ q-todo 100))))
-	      (message "Formatting...%3d%%" foo))))))
+	      (message "Formatting...%d%%" foo))))))
 
 (defun ps-set-font (font)
   (setq ps-current-font font)
   (ps-output (format "/f%d F\n" ps-current-font)))
 
+(defvar ps-print-color-scale nil)
+
 (defun ps-set-bg (color)
   (if (setq ps-current-bg color)
       (ps-output (format ps-color-format (nth 0 color) (nth 1 color)
@@ -2445,16 +1546,18 @@
   (/ x-color-value ps-print-color-scale))
 
 (defun ps-color-values (x-color)
-  (cond ((fboundp 'color-instance-rgb-components)
-	 (if (ps-color-device)
-	     (color-instance-rgb-components
-	      (if (color-instance-p x-color) x-color
-		(if (color-specifier-p x-color)
-		    (make-color-instance (color-name x-color))
-		  (make-color-instance x-color))))
-	   (error "No available function to determine X color values.")))
-	((fboundp 'x-color-values)
+  (cond ((fboundp 'x-color-values)
 	 (x-color-values x-color))
+        ;; From fsf 19.33
+        ;; ((fboundp 'pixel-components)
+	;;  (pixel-components x-color))
+	((and (fboundp 'color-instance-rgb-components)
+	      (xemacs-color-device))
+	 (color-instance-rgb-components
+	  (if (color-instance-p x-color) x-color
+	    (if (color-specifier-p x-color)
+		(make-color-instance (color-name x-color))
+	      (make-color-instance x-color)))))
 	(t (error "No available function to determine X color values."))))
 
 (defun ps-face-attributes (face)
@@ -2494,13 +1597,13 @@
 	     (foreground (nth 3 face-attr))
 	     (background (nth 4 face-attr))
 	     (fg-color (if (and ps-print-color-p
-				(ps-color-device) 
+				(xemacs-color-device) 
 				foreground)
 			   (mapcar 'ps-color-value
 				   (ps-color-values foreground))
 			 ps-default-color))
 	     (bg-color (if (and ps-print-color-p
-				(ps-color-device)
+				(xemacs-color-device)
 				background)
 			   (mapcar 'ps-color-value
 				   (ps-color-values background)))))
@@ -2527,6 +1630,9 @@
      (memq face kind-list))))
 
 (defun ps-xemacs-face-kind-p (face kind kind-regex kind-list)
+  ;; fsf 19.33:
+  ;; (let* ((frame-font (or (face-font face) (face-font 'default)))
+  ;;       (kind-cons (assq kind (x-font-properties frame-font)))
   (let* ((frame-font
 	  (or (face-font-instance face) (face-font-instance 'default)))
 	 (kind-cons (and frame-font
@@ -2561,9 +1667,7 @@
 
 (defun ps-build-reference-face-lists ()
   (if ps-auto-font-detect
-      (let ((faces (if (eq ps-print-emacs-type 'xemacs)
-		       (face-list 5)
-		     (face-list)))
+      (let ((faces (face-list))
 	    the-face)
 	(setq ps-ref-bold-faces nil
 	      ps-ref-italic-faces nil
@@ -2590,14 +1694,17 @@
                     (list (extent-end-position extent) 'pull extent)))
   nil)
 
+(defun ps-sorter (a b)
+  (< (car a) (car b)))
+
 (defun ps-extent-sorter (a b)
   (< (extent-priority a) (extent-priority b)))
 
 (defun ps-print-ensure-fontified (start end)
   (if (and (boundp 'lazy-lock-mode) lazy-lock-mode)
       (if (fboundp 'lazy-lock-fontify-region)
-          (lazy-lock-fontify-region start end) ; the new
-        (lazy-lock-fontify-buffer))))	       ; the old
+          (lazy-lock-fontify-region start end)
+        (lazy-lock-fontify-buffer))))
 
 (defun ps-generate-postscript-with-faces (from to)
   ;; Build the reference lists of faces if necessary.
@@ -2610,7 +1717,7 @@
   ;; that ps-print can be dumped into emacs.  This expression can't be
   ;; evaluated at dump-time because X isn't initialized.
   (setq ps-print-color-scale
-	(if (and ps-print-color-p (ps-color-device))
+	(if (and ps-print-color-p (xemacs-color-device))
 	    (float (car (ps-color-values "white")))
 	  1.0))
   ;; Generate some PostScript.
@@ -2619,13 +1726,13 @@
     (let ((face 'default)
 	  (position to))
       (ps-print-ensure-fontified from to)
-      (cond ((or (eq ps-print-emacs-type 'lucid)
-		 (eq ps-print-emacs-type 'xemacs))
+      (cond ((or (eq ps-print-emacs-type 'lucid) (eq ps-print-emacs-type 'xemacs))
 	   ;; Build the list of extents...
 	   (let ((a (cons 'dummy nil))
 		 record type extent extent-list)
 	     (map-extents 'ps-mapper nil from to a)
-	     (setq a (sort (cdr a) 'car-less-than-car))
+	     (setq a (cdr a))
+	     (setq a (sort a 'ps-sorter))
 	   
 	     (setq extent-list nil)
 	   
@@ -2736,7 +1843,7 @@
     (save-restriction
       (narrow-to-region from to)
       (if ps-razzle-dazzle
-	  (message "Formatting...%3d%%" (setq ps-razchunk 0)))
+	  (message "Formatting...%d%%" (setq ps-razchunk 0)))
       (set-buffer buffer)
       (setq ps-source-buffer buffer)
       (setq ps-spool-buffer (get-buffer-create ps-spool-buffer-name))
@@ -2753,7 +1860,7 @@
 	      (set-marker safe-marker (point-max))
 	    
 	      (goto-char (point-min))
-	      (if (looking-at (regexp-quote ps-adobe-tag))
+	      (if (looking-at (regexp-quote "%!PS-Adobe-1.0"))
 		  nil
 		(setq needs-begin-file t))
 	      (save-excursion
@@ -2792,10 +1899,9 @@
       (if ps-razzle-dazzle
 	  (message "Formatting...done")))))
 
-;; Permit dynamic evaluation at print time of ps-lpr-switches
 (defun ps-do-despool (filename)
   (if (or (not (boundp 'ps-spool-buffer))
-	  (not (symbol-value 'ps-spool-buffer)))
+	  (not ps-spool-buffer))
       (message "No spooled PostScript to print")
     (ps-end-file)
     (ps-flush-output)
@@ -2815,44 +1921,16 @@
 	(set-buffer ps-spool-buffer)
 	(if (and (eq system-type 'ms-dos) (stringp dos-ps-printer))
 	    (write-region (point-min) (point-max) dos-ps-printer t 0)
-	  (let ((binary-process-input t)  ; for MS-DOS
-		(ps-lpr-sw ; Dynamic evaluation
-		 (ps-flatten-list (mapcar 'ps-eval-switch ps-lpr-switches))))
+	  (let ((binary-process-input t)) ; for MS-DOS
 	    (apply 'call-process-region
 		   (point-min) (point-max) ps-lpr-command nil
 		   (if (fboundp 'start-process) 0 nil)
 		   nil
-		   ps-lpr-sw))))
+		   ps-lpr-switches))))
       (if ps-razzle-dazzle
 	  (message "Printing...done")))
     (kill-buffer ps-spool-buffer)))
 
-;; Dynamic evaluation
-(defun ps-eval-switch (arg)
-  (cond ((stringp arg) arg)
-	((functionp arg) (apply arg nil))
-	((symbolp arg) (symbol-value arg))
-	((consp arg) (apply (car arg) (cdr arg)))
-	(t nil)))
-
-;; `ps-flatten-list' is defined here (copied from "message.el" and
-;; enhanced to handle dotted pairs as well) until we can get some
-;; sensible autoloads, or `flatten-list' gets put somewhere decent.
-
-;; (ps-flatten-list '((a . b) c (d . e) (f g h) i . j))
-;; => (a b c d e f g h i j)
-
-(defun ps-flatten-list (&rest list)
-  (ps-flatten-list-1 list))
-
-(defun ps-flatten-list-1 (list)
-  (cond
-    ((null list) (list))
-    ((consp list)
-     (append (ps-flatten-list-1 (car list))
-	     (ps-flatten-list-1 (cdr list))))
-    (t (list list))))
-
 (defun ps-kill-emacs-check ()
   (let (ps-buffer)
     (if (and (setq ps-buffer (get-buffer ps-spool-buffer-name))
@@ -2951,24 +2029,20 @@
 ;; article subjects shows up at the printer.  This function, bound to
 ;; prsc for the gnus *Summary* buffer means I don't have to switch
 ;; buffers first.
-;; sb:  Updated for Gnus 5.
 (defun ps-gnus-print-article-from-summary ()
   (interactive)
-  (let ((ps-buf (if (boundp 'gnus-article-buffer)
-		    gnus-article-buffer
-		  "*Article*")))
-    (if (get-buffer ps-buf)
-	(save-excursion
-	  (set-buffer ps-buf)
-	  (ps-spool-buffer-with-faces)))))
+  (if (get-buffer "*Article*")
+      (save-excursion
+	(set-buffer "*Article*")
+	(ps-spool-buffer-with-faces))))
 
 ;; 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))
+  (if vm-mail-buffer
       (save-excursion
-	(set-buffer (symbol-value 'vm-mail-buffer))
+	(set-buffer vm-mail-buffer)
 	(ps-spool-buffer-with-faces))))
 
 ;; A hook to bind to bind to gnus-summary-setup-buffer to locally bind
@@ -3001,8 +2075,8 @@
 
 ;; WARNING! The following function is a *sample* only, and is *not*
 ;; meant to be used as a whole unless you understand what the effects
-;; will be!  (In fact, this is a copy of Jim's setup for ps-print --
-;; I'd be very surprised if it was useful to *anybody*, without
+;; will be!  (In fact, this is a copy if my setup for ps-print -- I'd
+;; be very surprised if it was useful to *anybody*, without
 ;; modification.)
 
 (defun ps-jts-ps-setup ()
@@ -3017,43 +2091,7 @@
   (setq ps-spool-duplex t)
   (setq ps-print-color-p nil)
   (setq ps-lpr-command "lpr")
-  (setq ps-lpr-switches '("-Jjct,duplex_long"))
-  'ps-jts-ps-setup)
-
-;; WARNING! The following function is a *sample* only, and is *not*
-;; meant to be used as a whole unless it corresponds to your needs.
-;; (In fact, this is a copy of Jack's setup for ps-print --
-;; I would not be that surprised if it was useful to *anybody*,
-;; without modification.)
-
-(defun ps-jack-setup ()
-  (setq ps-print-color-p  'nil
-	ps-lpr-command    "lpr"
-	ps-lpr-switches   (list)
-
-	ps-paper-type       'a4
-	ps-landscape-mode   't
-	ps-number-of-columns 2
-
-	ps-left-margin   (/ (* 72  1.0) 2.54) ;  1.0 cm
-	ps-right-margin  (/ (* 72  1.0) 2.54) ;  1.0 cm
-	ps-inter-column  (/ (* 72  1.0) 2.54) ;  1.0 cm
-	ps-bottom-margin (/ (* 72  1.5) 2.54) ;  1.5 cm
-	ps-top-margin    (/ (* 72  1.5) 2.54) ;  1.5 cm
-	ps-header-offset (/ (* 72  1.0) 2.54) ;  1.0 cm
-	ps-header-line-pad    .15
-	ps-print-header       t
-	ps-print-header-frame t
-	ps-header-lines       2
-	ps-show-n-of-n        t
-	ps-spool-duplex       nil
-
-	ps-font-family             'Courier
-	ps-font-size               5.5
-	ps-header-font-family      'Helvetica
-	ps-header-font-size        6
-	ps-header-title-font-size  8)
-  'ps-jack-setup)
+  (setq ps-lpr-switches '("-Jjct,duplex_long")))
 
 (provide 'ps-print)