(vc-register): Allow registering a file passed as a
[bpt/emacs.git] / lisp / ps-print.el
CommitLineData
652a9be9 1;;; ps-print.el --- print text from the buffer as PostScript
12d89a2e 2
0d30b337 3;; Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
d7a0267c 4;; 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
ef2cbb24 5
652a9be9
PJ
6;; Author: Jim Thompson (was <thompson@wg2.waii.com>)
7;; Jacques Duthen (was <duthen@cegelec-red.fr>)
e59d29d6 8;; Vinicius Jose Latorre <viniciusjl@ig.com.br>
07239461
VJL
9;; Kenichi Handa <handa@m17n.org> (multi-byte characters)
10;; Maintainer: Kenichi Handa <handa@m17n.org> (multi-byte characters)
e59d29d6 11;; Vinicius Jose Latorre <viniciusjl@ig.com.br>
652a9be9 12;; Keywords: wp, print, PostScript
4a6789f7 13;; Version: 6.8.1
502ca00a 14;; X-URL: http://www.emacswiki.org/cgi-bin/wiki/ViniciusJoseLatorre
e65df0a1 15
4a6789f7
VJL
16(defconst ps-print-version "6.8.1"
17 "ps-print.el, v 6.8.1 <2007/11/09 vinicius>
090be653 18
535efc38 19Vinicius's last change version -- this file may have been edited as part of
906d41a7
GM
20Emacs without changes to the version number. When reporting bugs, please also
21report the version of Emacs, if any, that ps-print was distributed with.
090be653
RS
22
23Please send all bug fixes and enhancements to
e59d29d6 24 Vinicius Jose Latorre <viniciusjl@ig.com.br>.")
ef2cbb24 25
86c10ecb 26;; This file is part of GNU Emacs.
ef2cbb24 27
319acba0
GM
28;; GNU Emacs is free software; you can redistribute it and/or modify it under
29;; the terms of the GNU General Public License as published by the Free
b4aa6026 30;; Software Foundation; either version 3, or (at your option) any later
319acba0 31;; version.
ef2cbb24 32
319acba0
GM
33;; GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY
34;; WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
35;; FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
36;; details.
ef2cbb24 37
319acba0
GM
38;; You should have received a copy of the GNU General Public License along with
39;; GNU Emacs; see the file COPYING. If not, write to the Free Software
086add15 40;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
ef2cbb24 41
12d89a2e 42;;; Commentary:
ef2cbb24 43
bc0d41bd 44;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ef2cbb24 45;;
12d89a2e 46;; About ps-print
ef2cbb24 47;; --------------
bcc0d457 48;;
319acba0
GM
49;; This package provides printing of Emacs buffers on PostScript printers; the
50;; buffer's bold and italic text attributes are preserved in the printer
eafa92bf
RS
51;; output. ps-print is intended for use with Emacs or XEmacs, together with a
52;; fontifying package such as font-lock or hilit.
12d89a2e 53;;
319acba0
GM
54;; ps-print uses the same face attributes defined through font-lock or hilit to
55;; print a PostScript file, but some faces are better seeing on the screen than
56;; on paper, specially when you have a black/white PostScript printer.
87a16a06
RS
57;;
58;; ps-print allows a remap of face to another one that it is better to print,
59;; for example, the face font-lock-comment-face (if you are using font-lock)
60;; could have bold or italic attribute when printing, besides foreground color.
61;; This remap improves printing look (see How Ps-Print Maps Faces).
62;;
bcc0d457 63;;
12d89a2e 64;; Using ps-print
ef2cbb24 65;; --------------
ef2cbb24 66;;
319acba0
GM
67;; ps-print provides eight commands for generating PostScript images of Emacs
68;; buffers:
12d89a2e
RS
69;;
70;; ps-print-buffer
71;; ps-print-buffer-with-faces
72;; ps-print-region
73;; ps-print-region-with-faces
74;; ps-spool-buffer
75;; ps-spool-buffer-with-faces
76;; ps-spool-region
77;; ps-spool-region-with-faces
78;;
319acba0
GM
79;; These commands all perform essentially the same function: they generate
80;; PostScript images suitable for printing on a PostScript printer or
81;; displaying with GhostScript. These commands are collectively referred to as
82;; "ps-print- commands".
12d89a2e
RS
83;;
84;; The word "print" or "spool" in the command name determines when the
85;; PostScript image is sent to the printer:
ef2cbb24 86;;
319acba0 87;; print - The PostScript image is immediately sent to the printer;
ef2cbb24 88;;
319acba0
GM
89;; spool - The PostScript image is saved temporarily in an Emacs
90;; buffer. Many images may be spooled locally before
91;; printing them. To send the spooled images to the
92;; printer, use the command `ps-despool'.
ef2cbb24 93;;
319acba0
GM
94;; The spooling mechanism was designed for printing lots of small files (mail
95;; messages or netnews articles) to save paper that would otherwise be wasted
96;; on banner pages, and to make it easier to find your output at the printer
97;; (it's easier to pick up one 50-page printout than to find 50 single-page
98;; printouts).
06fb6aab 99;;
319acba0
GM
100;; ps-print has a hook in the `kill-emacs-hook' so that you won't accidentally
101;; quit from Emacs while you have unprinted PostScript waiting in the spool
102;; buffer. If you do attempt to exit with spooled PostScript, you'll be asked
103;; if you want to print it, and if you decline, you'll be asked to confirm the
104;; exit; this is modeled on the confirmation that Emacs uses for modified
105;; buffers.
12d89a2e 106;;
319acba0
GM
107;; The word "buffer" or "region" in the command name determines how much of the
108;; buffer is printed:
12d89a2e
RS
109;;
110;; buffer - Print the entire buffer.
111;;
112;; region - Print just the current region.
113;;
319acba0
GM
114;; The -with-faces suffix on the command name means that the command will
115;; include font, color, and underline information in the PostScript image, so
116;; the printed image can look as pretty as the buffer. The ps-print- commands
117;; without the -with-faces suffix don't include font, color, or underline
118;; information; images printed with these commands aren't as pretty, but are
119;; faster to generate.
12d89a2e
RS
120;;
121;; Two ps-print- command examples:
122;;
319acba0
GM
123;; ps-print-buffer - print the entire buffer, without font,
124;; color, or underline information, and
125;; send it immediately to the printer.
12d89a2e 126;;
319acba0
GM
127;; ps-spool-region-with-faces - print just the current region; include
128;; font, color, and underline information,
129;; and spool the image in Emacs to send to
130;; the printer later.
12d89a2e
RS
131;;
132;;
133;; Invoking Ps-Print
bcc0d457 134;; -----------------
ef2cbb24 135;;
12d89a2e 136;; To print your buffer, type
ef2cbb24 137;;
12d89a2e 138;; M-x ps-print-buffer
ef2cbb24 139;;
319acba0
GM
140;; or substitute one of the other seven ps-print- commands. The command will
141;; generate the PostScript image and print or spool it as specified. By giving
142;; the command a prefix argument
12d89a2e
RS
143;;
144;; C-u M-x ps-print-buffer
145;;
319acba0
GM
146;; it will save the PostScript image to a file instead of sending it to the
147;; printer; you will be prompted for the name of the file to save the image to.
148;; The prefix argument is ignored by the commands that spool their images, but
149;; you may save the spooled images to a file by giving a prefix argument to
150;; `ps-despool':
12d89a2e
RS
151;;
152;; C-u M-x ps-despool
153;;
319acba0
GM
154;; When invoked this way, `ps-despool' will prompt you for the name of the file
155;; to save to.
12d89a2e 156;;
319acba0
GM
157;; Any of the `ps-print-' commands can be bound to keys; I recommend binding
158;; `ps-spool-buffer-with-faces', `ps-spool-region-with-faces', and
159;; `ps-despool'. Here are the bindings I use on my Sun 4 keyboard:
12d89a2e
RS
160;;
161;; (global-set-key 'f22 'ps-spool-buffer-with-faces) ;f22 is prsc
ef2cbb24
RS
162;; (global-set-key '(shift f22) 'ps-spool-region-with-faces)
163;; (global-set-key '(control f22) 'ps-despool)
164;;
12d89a2e
RS
165;;
166;; The Printer Interface
bcc0d457 167;; ---------------------
12d89a2e 168;;
319acba0
GM
169;; The variables `ps-lpr-command' and `ps-lpr-switches' determine what command
170;; is used to send the PostScript images to the printer, and what arguments to
171;; give the command. These are analogous to `lpr-command' and `lpr-switches'.
87a16a06 172;;
bcc0d457
RS
173;; Make sure that they contain appropriate values for your system;
174;; see the usage notes below and the documentation of these variables.
175;;
bc0d41bd 176;; The variable `ps-printer-name' determines the name of a local printer for
d3ab8dac
KH
177;; printing PostScript files.
178;;
3556c6dd
GM
179;; The variable `ps-printer-name-option' determines the option used by some
180;; utilities to indicate the printer name, it's used only when
181;; `ps-printer-name' is a non-empty string. If you're using lpr utility to
182;; print, for example, `ps-printer-name-option' should be set to "-P".
183;;
319acba0
GM
184;; NOTE: `ps-lpr-command' and `ps-lpr-switches' take their initial values from
185;; the variables `lpr-command' and `lpr-switches'. If you have
186;; `lpr-command' set to invoke a pretty-printer such as `enscript', then
187;; ps-print won't work properly. `ps-lpr-command' must name a program
188;; that does not format the files it prints.
d3ab8dac 189;; `ps-printer-name' takes its initial value from the variable
3556c6dd
GM
190;; `printer-name'. `ps-printer-name-option' tries to guess which system
191;; Emacs is running and takes its initial value in accordance with this
192;; guess.
12d89a2e 193;;
bc0d41bd
KH
194;; The variable `ps-print-region-function' specifies a function to print the
195;; region on a PostScript printer.
196;; See definition of `call-process-region' for calling conventions. The fourth
197;; and the sixth arguments are both nil.
198;;
8e234846
GM
199;; The variable `ps-manual-feed' indicates if the printer will manually feed
200;; paper. If it's nil, automatic feeding takes place. If it's non-nil, manual
201;; feeding takes place. The default is nil (automatic feeding).
202;;
ef1159c2
EZ
203;; The variable `ps-end-with-control-d' specifies whether C-d (\x04) should be
204;; inserted at end of PostScript generated. Non-nil means do so. The default
205;; is nil (don't insert).
206;;
98f2fbe7 207;; If you're using Emacs for Windows 95/98/NT or MS-DOS, don't forget to
3556c6dd
GM
208;; customize the following variables: `ps-printer-name',
209;; `ps-printer-name-option', `ps-lpr-command', `ps-lpr-switches' and
210;; `ps-spool-config'. See these variables documentation in the code or by
211;; typing, for example, C-h v ps-printer-name RET.
edc9cd35 212;;
12d89a2e 213;;
bcc0d457
RS
214;; The Page Layout
215;; ---------------
12d89a2e 216;;
bcc0d457
RS
217;; All dimensions are floats in PostScript points.
218;; 1 inch == 2.54 cm == 72 points
219;; 1 cm == (/ 1 2.54) inch == (/ 72 2.54) points
12d89a2e 220;;
906d41a7
GM
221;; The variable `ps-paper-type' determines the size of paper ps-print formats
222;; for; it should contain one of the symbols: `a4' `a3' `letter' `legal'
223;; `letter-small' `tabloid' `ledger' `statement' `executive' `a4small' `b4'
224;; `b5'.
12d89a2e 225;;
8e234846
GM
226;; If variable `ps-warn-paper-type' is nil, it's *not* given an error if
227;; PostScript printer doesn't have a paper with the size indicated by
228;; `ps-paper-type', instead it uses the default paper size. If variable
229;; `ps-warn-paper-type' is non-nil, it's given an error if PostScript printer
230;; doesn't have a paper with the size indicated by `ps-paper-type'. It's used
231;; when `ps-spool-config' is set to `setpagedevice' (see section Duplex
232;; Printers). The default value is non-nil (it gives an error).
233;;
906d41a7
GM
234;; The variable `ps-landscape-mode' determines the orientation of the printing
235;; on the page: nil means `portrait' mode, non-nil means `landscape' mode.
bcc0d457 236;; There is no oblique mode yet, though this is easy to do in ps.
87a16a06 237;;
319acba0
GM
238;; In landscape mode, the text is NOT scaled: you may print 70 lines in
239;; portrait mode and only 50 lines in landscape mode. The margins represent
240;; margins in the printed paper: the top margin is the margin between the top
241;; of the page and the printed header, whatever the orientation is.
043620f4 242;;
906d41a7
GM
243;; The variable `ps-number-of-columns' determines the number of columns both in
244;; landscape and portrait mode.
bcc0d457 245;; You can use:
906d41a7
GM
246;; - (the standard) one column portrait mode.
247;; - (my favorite) two columns landscape mode (which spares trees).
248;; but also:
bcc0d457 249;; - one column landscape mode for files with very long lines.
906d41a7
GM
250;; - multi-column portrait or landscape mode.
251;;
319acba0
GM
252;; The variable `ps-print-upside-down' determines other orientation for
253;; printing page: nil means `normal' printing, non-nil means `upside-down'
254;; printing (that is, the page is rotated by 180 grades). The default value is
255;; nil (`normal' printing).
906d41a7
GM
256;;
257;; The `upside-down' orientation can be used in portrait or landscape mode.
12d89a2e 258;;
1fd9b7fe
GM
259;; The variable `ps-selected-pages' specifies which pages to print. If it's
260;; nil, all pages are printed. If it's a list, the list element may be an
261;; integer or a cons cell (FROM . TO) designating FROM page to TO page; any
262;; invalid element is ignored, that is, an integer lesser than one or if FROM
263;; is greater than TO. Otherwise, it's treated as nil. The default value is
264;; nil (print all pages). After ps-print processing `ps-selected-pages' is set
265;; to nil. But the latest `ps-selected-pages' is saved in
266;; `ps-last-selected-pages' (see it for documentation). So you can restore the
267;; latest selected pages by using `ps-last-selected-pages' or by calling
268;; `ps-restore-selected-pages' command (see it for documentation).
269;;
c3d6d211
GM
270;; The variable `ps-even-or-odd-pages' specifies if it prints even/odd pages.
271;;
272;; Valid values are:
273;;
274;; nil print all pages.
275;;
4b3eb10f 276;; even-page print only even pages.
c3d6d211 277;;
4b3eb10f
GM
278;; odd-page print only odd pages.
279;;
280;; even-sheet print only even sheets.
281;;
282;; odd-sheet print only odd sheets.
c3d6d211
GM
283;;
284;; Any other value is treated as nil. The default value is nil.
285;;
4b3eb10f
GM
286;; See `ps-even-or-odd-pages' for more detailed documentation.
287;;
12d89a2e 288;;
bcc0d457
RS
289;; Horizontal layout
290;; -----------------
12d89a2e 291;;
bcc0d457
RS
292;; The horizontal layout is determined by the variables
293;; `ps-left-margin' `ps-inter-column' `ps-right-margin'
294;; as follows:
12d89a2e 295;;
bcc0d457
RS
296;; ------------------------------------------
297;; | | | | | | | |
298;; | lm | text | ic | text | ic | text | rm |
299;; | | | | | | | |
300;; ------------------------------------------
12d89a2e 301;;
bcc0d457
RS
302;; If `ps-number-of-columns' is 1, `ps-inter-column' is not relevant.
303;; Usually, lm = rm > 0 and ic = lm
304;; If (ic < 0), the text of adjacent columns can overlap.
12d89a2e 305;;
12d89a2e 306;;
bcc0d457
RS
307;; Vertical layout
308;; ---------------
309;;
310;; The vertical layout is determined by the variables
319acba0 311;; `ps-bottom-margin' `ps-top-margin' `ps-header-offset' `ps-footer-offset'
bcc0d457
RS
312;; as follows:
313;;
319acba0
GM
314;; |--------| |--------| |--------| |--------|
315;; | tm | | tm | | tm | | tm |
316;; |--------| |--------| |--------| |--------|
317;; | header | | | | header | | |
318;; |--------| | | |--------| | |
319;; | ho | | | | ho | | |
320;; |--------| | | |--------| | |
321;; | | | | | | | |
322;; | text | or | text | or | text | or | text |
323;; | | | | | | | |
324;; | | |--------| |--------| | |
325;; | | | fo | | fo | | |
326;; | | |--------| |--------| | |
327;; | | | footer | | footer | | |
328;; |--------| |--------| |--------| |--------|
329;; | bm | | bm | | bm | | bm |
330;; |--------| |--------| |--------| |--------|
bcc0d457
RS
331;;
332;; If `ps-print-header' is nil, `ps-header-offset' is not relevant.
319acba0 333;; If `ps-print-footer' is nil, `ps-footer-offset' is not relevant.
bcc0d457 334;; The margins represent margins in the printed paper:
319acba0
GM
335;; the top margin is the margin between the top of the page and the printed
336;; header, whatever the orientation is;
337;; the bottom margin is the margin between the bottom of the page and the
338;; printed footer, whatever the orientation is.
12d89a2e
RS
339;;
340;;
319acba0
GM
341;; Headers & Footers
342;; -----------------
12d89a2e 343;;
319acba0
GM
344;; ps-print can print headers at the top of each column or at the top of each
345;; page; the default headers contain the following four items: on the left, the
346;; name of the buffer and, if the buffer is visiting a file, the file's
347;; directory; on the right, the page number and date of printing. The default
348;; headers look something like this:
12d89a2e
RS
349;;
350;; ps-print.el 1/21
351;; /home/jct/emacs-lisp/ps/new 94/12/31
06fb6aab 352;;
319acba0
GM
353;; When printing on duplex printers, left and right are reversed so that the
354;; page numbers are toward the outside (cf. `ps-spool-duplex').
12d89a2e 355;;
bcc0d457
RS
356;; Headers are configurable:
357;; To turn them off completely, set `ps-print-header' to nil.
358;; To turn off the header's gaudy framing box,
359;; set `ps-print-header-frame' to nil.
360;;
319acba0
GM
361;; The variable `ps-header-frame-alist' specifies header frame properties
362;; alist. Valid frame properties are:
363;;
364;; fore-color Specify the foreground frame color.
365;; It should be a float number between 0.0 (black color)
366;; and 1.0 (white color), a string which is a color name,
367;; or a list of 3 float numbers which corresponds to the
368;; Red Green Blue color scale, each float number between
369;; 0.0 (dark color) and 1.0 (bright color).
370;; The default is 0 ("black").
371;;
372;; back-color Specify the background frame color (similar to
373;; fore-color). The default is 0.9 ("gray90").
374;;
375;; shadow-color Specify the shadow color (similar to fore-color).
376;; The default is 0 ("black").
377;;
378;; border-color Specify the border color (similar to fore-color).
379;; The default is 0 ("black").
380;;
381;; border-width Specify the border width.
382;; The default is 0.4.
383;;
384;; Any other property is ignored.
385;;
386;; Don't change this alist directly, instead use customization, or `ps-value',
387;; `ps-get', `ps-put' and `ps-del' functions (see them for documentation).
388;;
389;; To print only one header at the top of each page, set
390;; `ps-print-only-one-header' to t.
12b88fff 391;;
8e234846
GM
392;; To switch headers, set `ps-switch-header' to:
393;;
394;; nil Never switch headers.
395;;
396;; t Always switch headers.
397;;
398;; duplex Switch headers only when duplexing is on, that is, when
399;; `ps-spool-duplex' is non-nil (see Duplex Printers).
400;;
401;; Any other value is treated as t. The default value is `duplex'.
402;;
319acba0
GM
403;; The font family and size of text in the header are determined by the
404;; variables `ps-header-font-family', `ps-header-font-size' and
bcc0d457
RS
405;; `ps-header-title-font-size' (see below).
406;;
319acba0
GM
407;; The variable `ps-header-line-pad' determines the portion of a header title
408;; line height to insert between the header frame and the text it contains,
409;; both in the vertical and horizontal directions: .5 means half a line.
410;;
411;; Page numbers are printed in `n/m' format, indicating page n of m pages; to
412;; omit the total page count and just print the page number, set
413;; `ps-show-n-of-n' to nil.
414;;
415;; The amount of information in the header can be changed by changing the
416;; number of lines. To show less, set `ps-header-lines' to 1, and the header
417;; will show only the buffer name and page number. To show more, set
418;; `ps-header-lines' to 3, and the header will show the time of printing below
419;; the date.
420;;
421;; To change the content of the headers, change the variables `ps-left-header'
422;; and `ps-right-header'.
423;; These variables are lists, specifying top-to-bottom the text to display on
424;; the left or right side of the header. Each element of the list should be a
425;; string or a symbol. Strings are inserted directly into the PostScript
426;; arrays, and should contain the PostScript string delimiters '(' and ')'.
427;;
428;; Symbols in the header format lists can either represent functions or
429;; variables. Functions are called, and should return a string to show in the
430;; header. Variables should contain strings to display in the header. In
431;; either case, function or variable, the PostScript string delimiters are
432;; added by ps-print, and should not be part of the returned value.
12d89a2e
RS
433;;
434;; Here's an example: say we want the left header to display the text
435;;
436;; Moe
437;; Larry
438;; Curly
439;;
440;; where we have a function to return "Moe"
441;;
442;; (defun moe-func ()
443;; "Moe")
444;;
445;; a variable specifying "Larry"
446;;
447;; (setq larry-var "Larry")
448;;
319acba0 449;; and a literal for "Curly". Here's how `ps-left-header' should be set:
12d89a2e
RS
450;;
451;; (setq ps-left-header (list 'moe-func 'larry-var "(Curly)"))
452;;
319acba0
GM
453;; Note that Curly has the PostScript string delimiters inside his quotes --
454;; those aren't misplaced lisp delimiters!
87a16a06 455;;
319acba0
GM
456;; Without them, PostScript would attempt to call the undefined function Curly,
457;; which would result in a PostScript error.
87a16a06 458;;
319acba0
GM
459;; Since most printers don't report PostScript errors except by aborting the
460;; print job, this kind of error can be hard to track down.
87a16a06 461;;
bcc0d457 462;; Consider yourself warned!
12d89a2e 463;;
319acba0
GM
464;; ps-print also print footers. The footer variables are: `ps-print-footer',
465;; `ps-footer-offset', `ps-print-footer-frame', `ps-footer-font-family',
466;; `ps-footer-font-size', `ps-footer-line-pad', `ps-footer-lines',
467;; `ps-left-footer', `ps-right-footer' and `ps-footer-frame-alist'. These
468;; variables are similar to those one that control headers.
469;;
470;; The variables `ps-print-only-one-header' and `ps-switch-header' also control
471;; the footer (The same way that control header).
472;;
473;; As a footer example, if you want to have a centered page number in the
474;; footer but without headers, set:
475;;
476;; (setq ps-print-header nil
477;; ps-print-footer t
478;; ps-print-footer-frame nil
479;; ps-footer-lines 1
480;; ps-right-footer nil
481;; ps-left-footer
482;; (list (concat "{pagenumberstring dup stringwidth pop"
483;; " 2 div PrintWidth 2 div exch sub 0 rmoveto}")))
484;;
12d89a2e 485;;
d3ab8dac
KH
486;; PostScript Prologue Header
487;; --------------------------
488;;
489;; It is possible to add PostScript prologue header comments besides that
490;; ps-print generates by setting the variable `ps-print-prologue-header'.
491;;
319acba0
GM
492;; `ps-print-prologue-header' may be a string or a symbol function which
493;; returns a string. Note that this string is inserted on PostScript prologue
494;; header section which is used to define some document characteristic through
d3ab8dac
KH
495;; PostScript special comments, like "%%Requirements: jog\n".
496;;
497;; By default `ps-print-prologue-header' is nil.
498;;
319acba0
GM
499;; ps-print always inserts the %%Requirements: comment, so if you need to
500;; insert more requirements put them first in `ps-print-prologue-header' using
501;; the "%%+" comment. For example, if you need to set numcopies to 3 and jog
502;; on requirements and set %%LanguageLevel: to 2, do:
d3ab8dac
KH
503;;
504;; (setq ps-print-prologue-header
505;; "%%+ numcopies(3) jog\n%%LanguageLevel: 2\n")
506;;
319acba0
GM
507;; The duplex requirement is inserted by ps-print (see section Duplex
508;; Printers).
d3ab8dac
KH
509;;
510;; Do not forget to terminate the string with "\n".
511;;
512;; For more information about PostScript document comments, see:
513;; PostScript Language Reference Manual (2nd edition)
514;; Adobe Systems Incorporated
515;; Appendix G: Document Structuring Conventions -- Version 3.0
516;;
66e63857
GM
517;; It is also possible to add an user defined PostScript prologue code before
518;; all generated prologue code by setting the variable
519;; `ps-user-defined-prologue'.
520;;
319acba0
GM
521;; `ps-user-defined-prologue' may be a string or a symbol function which
522;; returns a string. Note that this string is inserted after `ps-adobe-tag'
523;; and PostScript prologue comments, and before ps-print PostScript prologue
524;; code section. That is, this string is inserted after error handler
525;; initialization and before ps-print settings.
66e63857
GM
526;;
527;; By default `ps-user-defined-prologue' is nil.
528;;
66e63857 529;; It's strongly recommended only insert PostScript code and/or comments
319acba0
GM
530;; specific for your printing system particularities. For example, some
531;; special initialization that only your printing system needs.
66e63857
GM
532;;
533;; Do not insert code for duplex printing, n-up printing or error handler,
534;; ps-print handles this in a suitable way.
535;;
536;; For more information about PostScript, see:
537;; PostScript Language Reference Manual (2nd edition)
538;; Adobe Systems Incorporated
539;;
c3d6d211
GM
540;; As an example for `ps-user-defined-prologue' setting:
541;;
542;; ;; Setting for HP PostScript printer
543;; (setq ps-user-defined-prologue
544;; (concat "<</DeferredMediaSelection true /PageSize [612 792] "
545;; "/MediaPosition 2 /MediaType (Plain)>> setpagedevice"))
546;;
66e63857
GM
547;;
548;; PostScript Error Handler
549;; ------------------------
550;;
551;; ps-print instruments generated PostScript code with an error handler.
552;;
553;; The variable `ps-error-handler-message' specifies where the error handler
554;; message should be sent.
555;;
556;; Valid values are:
557;;
558;; none catch the error and *DON'T* send any message.
559;;
560;; paper catch the error and print on paper the error message.
561;; This is the default value.
562;;
563;; system catch the error and send back the error message to
319acba0
GM
564;; printing system. This is useful only if printing
565;; system send back an email reporting the error, or if
566;; there is some other alternative way to report back the
567;; error from the system to you.
66e63857
GM
568;;
569;; paper-and-system catch the error, print on paper the error message and
570;; send back the error message to printing system.
571;;
572;; Any other value is treated as `paper'.
573;;
d3ab8dac 574;;
12d89a2e 575;; Duplex Printers
bcc0d457 576;; ---------------
12d89a2e 577;;
bc0d41bd
KH
578;; If you have a duplex-capable printer (one that prints both sides of the
579;; paper), set `ps-spool-duplex' to t.
580;; ps-print will insert blank pages to make sure each buffer starts on the
581;; correct side of the paper.
582;;
319acba0
GM
583;; The variable `ps-spool-config' specifies who is the responsible for setting
584;; duplex and page size. Valid values are:
bc0d41bd
KH
585;;
586;; lpr-switches duplex and page size are configured by `ps-lpr-switches'.
587;; Don't forget to set `ps-lpr-switches' to select duplex
588;; printing for your printer.
589;;
590;; setpagedevice duplex and page size are configured by ps-print using the
591;; setpagedevice PostScript operator.
592;;
593;; nil duplex and page size are configured by ps-print *not* using
594;; the setpagedevice PostScript operator.
595;;
596;; Any other value is treated as nil.
597;;
598;; The default value is `lpr-switches'.
599;;
319acba0
GM
600;; WARNING: The setpagedevice PostScript operator affects ghostview utility
601;; when viewing file generated using landscape. Also on some
602;; printers, setpagedevice affects zebra stripes; on other printers,
bc0d41bd
KH
603;; setpagedevice affects the left margin.
604;; Besides all that, if your printer does not have the paper size
605;; specified by setpagedevice, your printing will be aborted.
606;; So, if you need to use setpagedevice, set `ps-spool-config' to
607;; `setpagedevice', generate a test file and send it to your printer;
608;; if the printed file isn't ok, set `ps-spool-config' to nil.
609;;
610;; The variable `ps-spool-tumble' specifies how the page images on opposite
611;; sides of a sheet are oriented with respect to each other. If
319acba0
GM
612;; `ps-spool-tumble' is nil, produces output suitable for binding on the left
613;; or right. If `ps-spool-tumble' is non-nil, produces output suitable for
614;; binding at the top or bottom. It has effect only when `ps-spool-duplex' is
615;; non-nil. The default value is nil.
bc0d41bd 616;;
319acba0
GM
617;; Some printer system prints a header page and forces the first page be
618;; printed on header page back, when using duplex. If your printer system has
619;; this behavior, set variable `ps-banner-page-when-duplexing' to t.
bc0d41bd 620;;
319acba0
GM
621;; When `ps-banner-page-when-duplexing' is non-nil, it prints a blank page as
622;; the very first printed page. So, it behaves as the very first character of
623;; buffer (or region) is ^L (\014).
bc0d41bd 624;;
319acba0
GM
625;; The default for `ps-banner-page-when-duplexing' is nil (*don't* skip the
626;; very first page).
bc0d41bd
KH
627;;
628;;
629;; N-up Printing
630;; -------------
631;;
632;; The variable `ps-n-up-printing' specifies the number of pages per sheet of
633;; paper. The value specified must be between 1 and 100. The default is 1.
634;;
319acba0
GM
635;; NOTE: some PostScript printer may crash printing if `ps-n-up-printing' is
636;; set to a high value (for example, 23). If this happens, set a lower value.
bc0d41bd
KH
637;;
638;; The variable `ps-n-up-margin' specifies the margin in points between the
639;; sheet border and the n-up printing. The default is 1 cm (or 0.3937 inches,
640;; or 28.35 points).
641;;
319acba0
GM
642;; If variable `ps-n-up-border-p' is non-nil a border is drawn around each
643;; page. The default is t.
bc0d41bd
KH
644;;
645;; The variable `ps-n-up-filling' specifies how page matrix is filled on each
646;; sheet of paper. Following are the valid values for `ps-n-up-filling' with a
647;; filling example using a 3x4 page matrix:
648;;
649;; left-top 1 2 3 4 left-bottom 9 10 11 12
650;; 5 6 7 8 5 6 7 8
651;; 9 10 11 12 1 2 3 4
652;;
653;; right-top 4 3 2 1 right-bottom 12 11 10 9
654;; 8 7 6 5 8 7 6 5
655;; 12 11 10 9 4 3 2 1
656;;
657;; top-left 1 4 7 10 bottom-left 3 6 9 12
658;; 2 5 8 11 2 5 8 11
659;; 3 6 9 12 1 4 7 10
660;;
661;; top-right 10 7 4 1 bottom-right 12 9 6 3
662;; 11 8 5 2 11 8 5 2
663;; 12 9 6 3 10 7 4 1
664;;
55732434 665;; Any other value is treated as `left-top'.
bc0d41bd
KH
666;;
667;; The default value is left-top.
bcc0d457 668;;
06fb6aab 669;;
857686a6
RS
670;; Control And 8-bit Characters
671;; ----------------------------
672;;
673;; The variable `ps-print-control-characters' specifies whether you want to see
674;; a printable form for control and 8-bit characters, that is, instead of
6bdb808e 675;; sending, for example, a ^D (\004) to printer, it is sent the string "^D".
857686a6
RS
676;;
677;; Valid values for `ps-print-control-characters' are:
678;;
c82b4a75
KH
679;; 8-bit This is the value to use when you want an ASCII encoding of
680;; any control or non-ASCII character. Control characters are
681;; encoded as "^D", and non-ASCII characters have an
6bdb808e
RS
682;; octal encoding.
683;;
c82b4a75 684;; control-8-bit This is the value to use when you want an ASCII encoding of
6bdb808e
RS
685;; any control character, whether it is 7 or 8-bit.
686;; European 8-bits accented characters are printed according
687;; the current font.
688;;
c82b4a75 689;; control Only ASCII control characters have an ASCII encoding.
6bdb808e
RS
690;; European 8-bits accented characters are printed according
691;; the current font.
692;;
c82b4a75 693;; nil No ASCII encoding. Any character is printed according the
6bdb808e 694;; current font.
857686a6
RS
695;;
696;; Any other value is treated as nil.
697;;
496725ad 698;; The default is `control-8-bit'.
857686a6
RS
699;;
700;; Characters TAB, NEWLINE and FORMFEED are always treated by ps-print engine.
701;;
702;;
024ced4d
KH
703;; Printing Multi-byte Buffer
704;; --------------------------
d3ab8dac 705;;
298bfad9 706;; See ps-mule.el for documentation.
e65df0a1
KH
707;;
708;;
87a16a06
RS
709;; Line Number
710;; -----------
711;;
a18ed129
RS
712;; The variable `ps-line-number' specifies whether to number each line;
713;; non-nil means do so. The default is nil (don't number each line).
87a16a06 714;;
319acba0
GM
715;; The variable `ps-line-number-color' specifies the color for line number.
716;; See `ps-zebra-color' for documentation. The default is "black" (or 0.0, or
717;; '(0.0 0.0 0.0)).
718;;
ef1159c2
EZ
719;; The variable `ps-line-number-font' specifies the font for line number.
720;; The default is "Times-Italic".
721;;
722;; The variable `ps-line-number-font-size' specifies the font size in points
723;; for line number. See `ps-font-size' for documentation. The default is 6.
724;;
319acba0
GM
725;; The variable `ps-line-number-step' specifies the interval that line number
726;; is printed. For example, if `ps-line-number-step' is set to 2, the printing
906d41a7
GM
727;; will look like:
728;;
729;; 1 one line
730;; one line
731;; 3 one line
732;; one line
98f2fbe7 733;; 5 one line
906d41a7
GM
734;; one line
735;; ...
736;;
737;; Valid values are:
738;;
739;; integer an integer that specifies the interval that line number is
740;; printed. If it's lesser than or equal to zero, it's used the
741;; value 1.
742;;
319acba0
GM
743;; `zebra' specifies that only the line number of the first line in a
744;; zebra stripe is to be printed.
906d41a7
GM
745;;
746;; Any other value is treated as `zebra'.
747;; The default value is 1, so each line number is printed.
748;;
98f2fbe7
GM
749;; The variable `ps-line-number-start' specifies the starting point in the
750;; interval given by `ps-line-number-step'. For example, if
319acba0
GM
751;; `ps-line-number-step' is set to 3 and `ps-line-number-start' is set to 3,
752;; the printing will look like:
98f2fbe7
GM
753;;
754;; one line
755;; one line
756;; 3 one line
757;; one line
758;; one line
759;; 6 one line
760;; one line
761;; one line
762;; 9 one line
763;; one line
764;; ...
765;;
766;; The values for `ps-line-number-start':
767;;
768;; * If `ps-line-number-step' is an integer, must be between 1 and the value
769;; of `ps-line-number-step' inclusive.
770;;
771;; * If `ps-line-number-step' is set to `zebra', must be between 1 and the
c3d6d211 772;; value of `ps-zebra-stripe-height' inclusive.
98f2fbe7 773;;
319acba0
GM
774;; The default value is 1, so the line number of the first line of each
775;; interval is printed.
98f2fbe7 776;;
87a16a06
RS
777;;
778;; Zebra Stripes
779;; -------------
780;;
319acba0
GM
781;; Zebra stripes are a kind of background that appear "underneath" the text and
782;; can make the text easier to read. They look like this:
87a16a06
RS
783;;
784;; XXXXXXXXXXXXXXXXXXXXXXXX
785;; XXXXXXXXXXXXXXXXXXXXXXXX
535efc38
RS
786;; XXXXXXXXXXXXXXXXXXXXXXXX
787;;
87a16a06
RS
788;;
789;;
790;; XXXXXXXXXXXXXXXXXXXXXXXX
791;; XXXXXXXXXXXXXXXXXXXXXXXX
535efc38 792;; XXXXXXXXXXXXXXXXXXXXXXXX
87a16a06 793;;
06fb6aab 794;; The blocks of X's represent rectangles filled with a light gray color.
a18ed129
RS
795;; Each rectangle extends all the way across the page.
796;;
319acba0
GM
797;; The height, in lines, of each rectangle is controlled by the variable
798;; `ps-zebra-stripe-height', which is 3 by default. The distance between
799;; stripes equals the height of a stripe.
8bd22fcf 800;;
01961237 801;; The variable `ps-zebra-stripes' controls whether to print zebra stripes.
a18ed129
RS
802;; Non-nil means yes, nil means no. The default is nil.
803;;
6e1b1da6
GM
804;; The variable `ps-zebra-color' controls the zebra stripes gray scale or RGB
805;; color. It should be a float number between 0.0 (black color) and 1.0 (white
806;; color), a string which is a color name, or a list of 3 numbers which
807;; corresponds to the Red Green Blue color scale.
808;; The default is 0.95 (or "gray95", or '(0.95 0.95 0.95)).
bc0d41bd 809;;
2bd80d73
GM
810;; The variable `ps-zebra-stripe-follow' specifies how zebra stripes continue
811;; on next page. Visually, valid values are (the character `+' at right of
812;; each column indicates that a line is printed):
813;;
814;; `nil' `follow' `full' `full-follow'
815;; Current Page -------- ----------- --------- ----------------
816;; 1 XXXXX + 1 XXXXXXXX + 1 XXXXXX + 1 XXXXXXXXXXXXX +
817;; 2 XXXXX + 2 XXXXXXXX + 2 XXXXXX + 2 XXXXXXXXXXXXX +
818;; 3 XXXXX + 3 XXXXXXXX + 3 XXXXXX + 3 XXXXXXXXXXXXX +
819;; 4 + 4 + 4 + 4 +
820;; 5 + 5 + 5 + 5 +
821;; 6 + 6 + 6 + 6 +
822;; 7 XXXXX + 7 XXXXXXXX + 7 XXXXXX + 7 XXXXXXXXXXXXX +
823;; 8 XXXXX + 8 XXXXXXXX + 8 XXXXXX + 8 XXXXXXXXXXXXX +
824;; 9 XXXXX + 9 XXXXXXXX + 9 XXXXXX + 9 XXXXXXXXXXXXX +
825;; 10 + 10 +
826;; 11 + 11 +
827;; -------- ----------- --------- ----------------
828;; Next Page -------- ----------- --------- ----------------
829;; 12 XXXXX + 12 + 10 XXXXXX + 10 +
830;; 13 XXXXX + 13 XXXXXXXX + 11 XXXXXX + 11 +
831;; 14 XXXXX + 14 XXXXXXXX + 12 XXXXXX + 12 +
832;; 15 + 15 XXXXXXXX + 13 + 13 XXXXXXXXXXXXX +
833;; 16 + 16 + 14 + 14 XXXXXXXXXXXXX +
834;; 17 + 17 + 15 + 15 XXXXXXXXXXXXX +
835;; 18 XXXXX + 18 + 16 XXXXXX + 16 +
836;; 19 XXXXX + 19 XXXXXXXX + 17 XXXXXX + 17 +
837;; 20 XXXXX + 20 XXXXXXXX + 18 XXXXXX + 18 +
838;; 21 + 21 XXXXXXXX +
839;; 22 + 22 +
840;; -------- ----------- --------- ----------------
841;;
edf0b0c5 842;; Any other value is treated as nil.
8e234846 843;;
a18ed129 844;; See also section How Ps-Print Has A Text And/Or Image On Background.
87a16a06 845;;
87a16a06 846;;
12b88fff
RS
847;; Hooks
848;; -----
849;;
d3ab8dac 850;; ps-print has the following hook variables:
12b88fff
RS
851;;
852;; `ps-print-hook'
853;; It is evaluated once before any printing process. This is the right
854;; place to initialize ps-print global data.
855;; For an example, see section Adding a New Font Family.
856;;
bc0d41bd
KH
857;; `ps-print-begin-sheet-hook'
858;; It is evaluated on each beginning of sheet of paper.
859;; If `ps-n-up-printing' is equal to 1, `ps-print-begin-page-hook' is never
860;; evaluated.
861;;
12b88fff 862;; `ps-print-begin-page-hook'
319acba0
GM
863;; It is evaluated on each beginning of page, except in the beginning of
864;; page that `ps-print-begin-sheet-hook' is evaluated.
12b88fff
RS
865;;
866;; `ps-print-begin-column-hook'
319acba0
GM
867;; It is evaluated on each beginning of column, except in the beginning of
868;; column that `ps-print-begin-page-hook' is evaluated or that
bc0d41bd 869;; `ps-print-begin-sheet-hook' is evaluated.
12b88fff
RS
870;;
871;;
872;; Font Managing
bcc0d457
RS
873;; -------------
874;;
7d8b7e8e
KH
875;; ps-print now knows rather precisely some fonts: the variable
876;; `ps-font-info-database' contains information for a list of font families
319acba0
GM
877;; (currently mainly `Courier' `Helvetica' `Times' `Palatino'
878;; `Helvetica-Narrow' `NewCenturySchlbk'). Each font family contains the font
879;; names for standard, bold, italic and bold-italic characters, a reference
880;; size (usually 10) and the corresponding line height, width of a space and
881;; average character width.
06fb6aab 882;;
7d8b7e8e
KH
883;; The variable `ps-font-family' determines which font family is to be used for
884;; ordinary text. If its value does not correspond to a known font family, an
885;; error message is printed into the `*Messages*' buffer, which lists the
886;; currently available font families.
bcc0d457 887;;
7d8b7e8e 888;; The variable `ps-font-size' determines the size (in points) of the font for
319acba0
GM
889;; ordinary text, when generating PostScript. Its value is a float or a cons
890;; of floats which has the following form:
bcc0d457 891;;
7d8b7e8e
KH
892;; (LANDSCAPE-SIZE . PORTRAIT-SIZE)
893;;
894;; Similarly, the variable `ps-header-font-family' determines which font family
895;; is to be used for text in the header.
896;;
897;; The variable `ps-header-font-size' determines the font size, in points, for
898;; text in the header (similar to `ps-font-size').
899;;
319acba0
GM
900;; The variable `ps-header-title-font-size' determines the font size, in
901;; points, for the top line of text in the header (similar to `ps-font-size').
bcc0d457 902;;
6bf5fb46
GM
903;; The variable `ps-line-spacing' determines the line spacing, in points, for
904;; ordinary text, when generating PostScript (similar to `ps-font-size'). The
905;; default value is 0 (zero = no line spacing).
906;;
907;; The variable `ps-paragraph-spacing' determines the paragraph spacing, in
908;; points, for ordinary text, when generating PostScript (similar to
909;; `ps-font-size'). The default value is 0 (zero = no paragraph spacing).
910;;
911;; To get all lines with some spacing set both `ps-line-spacing' and
912;; `ps-paragraph-spacing' variables.
913;;
914;; The variable `ps-paragraph-regexp' specifies the paragraph delimiter. It
915;; should be a regexp or nil. The default value is "[ \t]*$", that is, an
916;; empty line or a line containing only spaces and tabs.
917;;
918;; The variable `ps-begin-cut-regexp' and `ps-end-cut-regexp' specify the start
919;; and end of a region to cut out when printing.
920;;
921;; As an example, variables `ps-begin-cut-regexp' and `ps-end-cut-regexp' may
922;; be set to "^Local Variables:" and "^End:", respectively, in order to leave
923;; out some special printing instructions from the actual print. Special
924;; printing instructions may be appended to the end of the file just like any
925;; other buffer-local variables. See section "Local Variables in Files" on
926;; Emacs manual for more information.
319acba0
GM
927;;
928;; Variables `ps-begin-cut-regexp' and `ps-end-cut-regexp' control together
929;; what actually gets printed. Both variables may be set to nil in which case
930;; no cutting occurs. By default, both variables are set to nil.
6bf5fb46 931;;
bcc0d457 932;;
12b88fff 933;; Adding a New Font Family
bcc0d457
RS
934;; ------------------------
935;;
319acba0
GM
936;; To use a new font family, you MUST first teach ps-print this font, i.e., add
937;; its information to `ps-font-info-database', otherwise ps-print cannot
938;; correctly place line and page breaks.
bcc0d457 939;;
319acba0
GM
940;; For example, assuming `Helvetica' is unknown, you first need to do the
941;; following ONLY ONCE:
bcc0d457
RS
942;;
943;; - create a new buffer
944;; - generate the PostScript image to a file (C-u M-x ps-print-buffer)
945;; - open this file and find the line:
1fd9b7fe 946;; `% 3 cm 20 cm moveto 10/Courier ReportFontInfo showpage'
a18ed129 947;; - delete the leading `%' (which is the PostScript comment character)
319acba0
GM
948;; - replace in this line `Courier' by the new font (say `Helvetica') to get
949;; the line:
1fd9b7fe 950;; `3 cm 20 cm moveto 10/Helvetica ReportFontInfo showpage'
bcc0d457
RS
951;; - send this file to the printer (or to ghostscript).
952;; You should read the following on the output page:
953;;
954;; For Helvetica 10 point, the line height is 11.56, the space width is 2.78
955;; and a crude estimate of average character width is 5.09243
956;;
957;; - Add these values to the `ps-font-info-database':
958;; (setq ps-font-info-database
12b88fff
RS
959;; (append
960;; '((Helvetica ; the family key
961;; (fonts (normal . "Helvetica")
962;; (bold . "Helvetica-Bold")
963;; (italic . "Helvetica-Oblique")
964;; (bold-italic . "Helvetica-BoldOblique"))
965;; (size . 10.0)
966;; (line-height . 11.56)
967;; (space-width . 2.78)
968;; (avg-char-width . 5.09243)))
969;; ps-font-info-database))
bcc0d457
RS
970;; - Now you can use this font family with any size:
971;; (setq ps-font-family 'Helvetica)
319acba0
GM
972;; - if you want to use this family in another emacs session, you must put into
973;; your `~/.emacs':
bcc0d457
RS
974;; (require 'ps-print)
975;; (setq ps-font-info-database (append ...)))
976;; if you don't want to load ps-print, you have to copy the whole value:
977;; (setq ps-font-info-database '(<your stuff> <the standard stuff>))
12b88fff
RS
978;; or, use `ps-print-hook' (see section Hooks):
979;; (add-hook 'ps-print-hook
bc0d41bd
KH
980;; '(lambda ()
981;; (or (assq 'Helvetica ps-font-info-database)
982;; (setq ps-font-info-database (append ...)))))
bcc0d457
RS
983;;
984;; You can create new `mixed' font families like:
12b88fff
RS
985;; (my-mixed-family
986;; (fonts (normal . "Courier-Bold")
987;; (bold . "Helvetica")
92dc83a9 988;; (italic . "ZapfChancery-MediumItalic")
12b88fff
RS
989;; (bold-italic . "NewCenturySchlbk-BoldItalic")
990;; (w3-table-hack-x-face . "LineDrawNormal"))
991;; (size . 10.0)
992;; (line-height . 10.55)
993;; (space-width . 6.0)
994;; (avg-char-width . 6.0))
d3ab8dac 995;;
bcc0d457
RS
996;; Now you can use your new font family with any size:
997;; (setq ps-font-family 'my-mixed-family)
998;;
319acba0
GM
999;; Note that on above example the `w3-table-hack-x-face' entry refers to a face
1000;; symbol, so when printing this face it'll be used the font `LineDrawNormal'.
1001;; If the face `w3-table-hack-x-face' is remapped to use bold and/or italic
1002;; attribute, the corresponding entry (bold, italic or bold-italic) will be
1003;; used instead of `w3-table-hack-x-face' entry.
12b88fff
RS
1004;;
1005;; Note also that the font family entry order is irrelevant, so the above
1006;; example could also be written:
1007;; (my-mixed-family
1008;; (size . 10.0)
1009;; (fonts (w3-table-hack-x-face . "LineDrawNormal")
1010;; (bold . "Helvetica")
1011;; (bold-italic . "NewCenturySchlbk-BoldItalic")
92dc83a9 1012;; (italic . "ZapfChancery-MediumItalic")
12b88fff
RS
1013;; (normal . "Courier-Bold"))
1014;; (avg-char-width . 6.0)
1015;; (space-width . 6.0)
1016;; (line-height . 10.55))
1017;;
1018;; Despite the note above, it is recommended that some convention about
1019;; entry order be used.
1020;;
bcc0d457
RS
1021;; You can get information on all the fonts resident in YOUR printer
1022;; by uncommenting the line:
1023;; % 3 cm 20 cm moveto ReportAllFontInfo showpage
1024;;
a18ed129 1025;; The PostScript file should be sent to YOUR PostScript printer.
319acba0
GM
1026;; If you send it to ghostscript or to another PostScript printer, you may get
1027;; slightly different results.
c3d6d211
GM
1028;; Anyway, as ghostscript fonts are autoload, you won't get much font info.
1029;;
1030;; Note also that ps-print DOESN'T download any font to your printer, instead
1031;; it uses the fonts resident in your printer.
bcc0d457
RS
1032;;
1033;;
1034;; How Ps-Print Deals With Faces
1035;; -----------------------------
12d89a2e 1036;;
319acba0
GM
1037;; The ps-print-*-with-faces commands attempt to determine which faces should
1038;; be printed in bold or italic, but their guesses aren't always right. For
1039;; example, you might want to map colors into faces so that blue faces print in
1040;; bold, and red faces in italic.
12d89a2e 1041;;
319acba0
GM
1042;; It is possible to force ps-print to consider specific faces bold, italic or
1043;; underline, no matter what font they are displayed in, by setting the
1044;; variables `ps-bold-faces', `ps-italic-faces' and `ps-underlined-faces'.
857686a6
RS
1045;; These variables contain lists of faces that ps-print should consider bold,
1046;; italic or underline; to set them, put code like the following into your
1047;; .emacs file:
12d89a2e 1048;;
12b88fff 1049;; (setq ps-bold-faces '(my-blue-face))
bcc0d457 1050;; (setq ps-italic-faces '(my-red-face))
857686a6 1051;; (setq ps-underlined-faces '(my-green-face))
bcc0d457 1052;;
319acba0
GM
1053;; Faces like bold-italic that are both bold and italic should go in *both*
1054;; lists.
bcc0d457 1055;;
319acba0
GM
1056;; ps-print keeps internal lists of which fonts are bold and which are italic;
1057;; these lists are built the first time you invoke ps-print.
1058;; For the sake of efficiency, the lists are built only once; the same lists
1059;; are referred in later invocations of ps-print.
bcc0d457 1060;;
319acba0
GM
1061;; Because these lists are built only once, it's possible for them to get out
1062;; of sync, if a face changes, or if new faces are added. To get the lists
1063;; back in sync, you can set the variable `ps-build-face-reference' to t, and
1064;; the lists will be rebuilt the next time ps-print is invoked. If you need
1065;; that the lists always be rebuilt when ps-print is invoked, set the variable
857686a6 1066;; `ps-always-build-face-reference' to t.
bcc0d457 1067;;
906d41a7
GM
1068;; If you need to print without worrying about face background color, set the
1069;; variable `ps-use-face-background' which specifies if face background should
1070;; be used. Valid values are:
1071;;
1072;; t always use face background color.
1073;; nil never use face background color.
1074;; (face...) list of faces whose background color will be used.
1075;;
1076;; Any other value will be treated as t.
e59d29d6 1077;; The default value is nil.
906d41a7 1078;;
bcc0d457
RS
1079;;
1080;; How Ps-Print Deals With Color
1081;; -----------------------------
1082;;
319acba0
GM
1083;; ps-print detects faces with foreground and background colors defined and
1084;; embeds color information in the PostScript image.
1085;; The default foreground and background colors are defined by the variables
1086;; `ps-default-fg' and `ps-default-bg'.
55732434 1087;; On black/white printers, colors are displayed in gray scale.
bcc0d457 1088;; To turn off color output, set `ps-print-color-p' to nil.
55732434
GM
1089;; You can also set `ps-print-color-p' to 'black-white to have a better looking
1090;; on black/white printers. See also `ps-black-white-faces' for documentation.
bcc0d457 1091;;
ccae01a6
VJL
1092;; ps-print also detects if the text foreground and background colors are
1093;; equals when `ps-fg-validate-p' is non-nil. In this case, if these colors
1094;; are used, no text will appear. You can use `ps-fg-list' to give a list of
1095;; foreground colors to be used when text foreground and background colors are
1096;; equals. It'll be used the first foreground color in `ps-fg-list' which is
1097;; different from the background color. If `ps-fg-list' is nil, the default
1098;; foreground color is used.
1099;;
bcc0d457 1100;;
87a16a06
RS
1101;; How Ps-Print Maps Faces
1102;; -----------------------
1103;;
319acba0
GM
1104;; As ps-print uses PostScript to print buffers, it is possible to have other
1105;; attributes associated with faces. So the new attributes used by ps-print
1106;; are:
87a16a06
RS
1107;;
1108;; strikeout - like underline, but the line is in middle of text.
1109;; overline - like underline, but the line is over the text.
1110;; shadow - text will have a shadow.
1111;; box - text will be surrounded by a box.
a18ed129 1112;; outline - print characters as hollow outlines.
87a16a06 1113;;
06fb6aab 1114;; See the documentation for `ps-extend-face'.
87a16a06 1115;;
bc0d41bd
KH
1116;; Let's, for example, remap `font-lock-keyword-face' to another foreground
1117;; color and bold attribute:
87a16a06 1118;;
a18ed129 1119;; (ps-extend-face '(font-lock-keyword-face "RoyalBlue" nil bold) 'MERGE)
87a16a06 1120;;
319acba0
GM
1121;; If you want to use a new face, define it first with `defface', and then call
1122;; `ps-extend-face' to specify how to print it.
6c8f2753 1123;;
87a16a06
RS
1124;;
1125;; How Ps-Print Has A Text And/Or Image On Background
1126;; --------------------------------------------------
1127;;
d3ab8dac 1128;; ps-print can print texts and/or EPS PostScript images on background; it is
87a16a06
RS
1129;; possible to define the following text attributes: font name, font size,
1130;; initial position, angle, gray scale and pages to print.
1131;;
1132;; It has the following EPS PostScript images attributes: file name containing
1133;; the image, initial position, X and Y scales, angle and pages to print.
1134;;
1135;; See documentation for `ps-print-background-text' and
1136;; `ps-print-background-image'.
1137;;
1138;; For example, if we wish to print text "preliminary" on all pages and text
1139;; "special" on page 5 and from page 11 to page 17, we could specify:
1140;;
1141;; (setq ps-print-background-text
1142;; '(("preliminary")
1143;; ("special"
1144;; "LeftMargin" "BottomMargin PrintHeight add" ; X and Y position
1145;; ; (upper left corner)
1146;; nil nil nil
12b88fff 1147;; "PrintHeight neg PrintPageWidth atan" ; angle
87a16a06
RS
1148;; 5 (11 . 17)) ; page list
1149;; ))
1150;;
1151;; Similarly, we could print image "~/images/EPS-image1.ps" on all pages and
1152;; image "~/images/EPS-image2.ps" on page 5 and from page 11 to page 17, we
1153;; specify:
1154;;
1155;; (setq ps-print-background-image
1156;; '(("~/images/EPS-image1.ps"
1157;; "LeftMargin" "BottomMargin") ; X and Y position (lower left corner)
1158;; ("~/images/EPS-image2.ps"
319acba0 1159;; "LeftMargin" "BottomMargin PrintHeight 2 div add" ; X and Y pos.
87a16a06
RS
1160;; ; (upper left corner)
1161;; nil nil nil
1162;; 5 (11 . 17)) ; page list
1163;; ))
1164;;
1165;; If it is not possible to read (or does not exist) an image file, that file
1166;; is ignored.
1167;;
1168;; The printing order is:
1169;;
6e1b1da6
GM
1170;; 1. Print background color
1171;; 2. Print zebra stripes
1172;; 3. Print background texts that it should be on all pages
1173;; 4. Print background images that it should be on all pages
1174;; 5. Print background texts only for current page (if any)
1175;; 6. Print background images only for current page (if any)
1176;; 7. Print header
1177;; 8. Print buffer text (with faces, if specified) and line number
87a16a06
RS
1178;;
1179;;
bcc0d457
RS
1180;; Utilities
1181;; ---------
1182;;
1183;; Some tools are provided to help you customize your font setup.
1184;;
1185;; `ps-setup' returns (some part of) the current setup.
1186;;
319acba0
GM
1187;; To avoid wrapping too many lines, you may want to adjust the left and right
1188;; margins and the font size. On UN*X systems, do:
bcc0d457
RS
1189;; pr -t file | awk '{printf "%3d %s\n", length($0), $0}' | sort -r | head
1190;; to determine the longest lines of your file.
319acba0
GM
1191;; Then, the command `ps-line-lengths' will give you the correspondence between
1192;; a line length (number of characters) and the maximum font size which doesn't
1193;; wrap such a line with the current ps-print setup.
bcc0d457 1194;;
319acba0
GM
1195;; The commands `ps-nb-pages-buffer' and `ps-nb-pages-region' display the
1196;; correspondence between a number of pages and the maximum font size which
1197;; allow the number of lines of the current buffer or of its current region to
1198;; fit in this number of pages.
a18ed129
RS
1199;;
1200;; NOTE: line folding is not taken into account in this process and could
1201;; change the results.
b87c5d3d 1202;;
0a5daee5
KH
1203;; The command `ps-print-customize' activates a customization buffer for
1204;; ps-print options.
1205;;
b87c5d3d 1206;;
b87c5d3d
RS
1207;; New since version 1.5
1208;; ---------------------
b87c5d3d 1209;;
bcc0d457 1210;; Color output capability.
b87c5d3d 1211;; Automatic detection of font attributes (bold, italic).
b87c5d3d 1212;; Configurable headers with page numbers.
b87c5d3d 1213;; Slightly faster.
b87c5d3d 1214;; Support for different paper sizes.
b87c5d3d
RS
1215;; Better conformance to PostScript Document Structure Conventions.
1216;;
ef2cbb24 1217;;
bcc0d457
RS
1218;; New since version 2.8
1219;; ---------------------
1220;;
e59d29d6 1221;; [vinicius] Vinicius Jose Latorre <viniciusjl@ig.com.br>
0a5daee5 1222;;
ccae01a6
VJL
1223;; 2007-10-27
1224;; `ps-fg-validate-p', `ps-fg-list'
1225;;
1226;; 2004-02-29
71efd3c4
VJL
1227;; `ps-time-stamp-yyyy-mm-dd', `ps-time-stamp-iso8601'
1228;;
ccae01a6 1229;; 2001-06-19
4b81a999
GM
1230;; `ps-time-stamp-locale-default'
1231;;
ccae01a6 1232;; 2001-05-30
4b81a999
GM
1233;; Handle before-string and after-string overlay properties.
1234;;
ccae01a6 1235;; 2001-04-07
319acba0
GM
1236;; `ps-line-number-color', `ps-print-footer', `ps-footer-offset',
1237;; `ps-print-footer-frame', `ps-footer-font-family',
1238;; `ps-footer-font-size', `ps-footer-line-pad', `ps-footer-lines',
1239;; `ps-left-footer', `ps-right-footer', `ps-footer-frame-alist' and
1240;; `ps-header-frame-alist'.
1241;;
ccae01a6 1242;; 2001-03-28
319acba0
GM
1243;; `ps-line-spacing', `ps-paragraph-spacing', `ps-paragraph-regexp',
1244;; `ps-begin-cut-regexp' and `ps-end-cut-regexp'.
1245;;
ccae01a6 1246;; 2000-11-22
ef1159c2
EZ
1247;; `ps-line-number-font', `ps-line-number-font-size' and
1248;; `ps-end-with-control-d'.
1249;;
ccae01a6 1250;; 2000-08-21
c3d6d211
GM
1251;; `ps-even-or-odd-pages'
1252;;
ccae01a6 1253;; 2000-06-17
1fd9b7fe
GM
1254;; `ps-manual-feed', `ps-warn-paper-type', `ps-print-upside-down',
1255;; `ps-selected-pages', `ps-last-selected-pages',
1256;; `ps-restore-selected-pages', `ps-switch-header',
1257;; `ps-line-number-step', `ps-line-number-start',
1258;; `ps-zebra-stripe-follow' and `ps-use-face-background'.
0a5daee5 1259;;
ccae01a6 1260;; 2000-03-10
1fd9b7fe
GM
1261;; PostScript error handler.
1262;; `ps-user-defined-prologue' and `ps-error-handler-message'.
bc0d41bd 1263;;
ccae01a6 1264;; 1999-12-11
1fd9b7fe 1265;; `ps-print-customize'.
bc0d41bd 1266;;
ccae01a6 1267;; 1999-07-03
1fd9b7fe
GM
1268;; Better customization.
1269;; `ps-banner-page-when-duplexing' and `ps-zebra-color'.
bc0d41bd 1270;;
ccae01a6 1271;; 1999-05-13
1fd9b7fe
GM
1272;; N-up printing.
1273;; Hook: `ps-print-begin-sheet-hook'.
bc0d41bd 1274;;
ccae01a6 1275;; [kenichi] 1999-05-09 Ken'ichi Handa <handa@m17n.org>
bc0d41bd 1276;;
71efd3c4 1277;; `ps-print-region-function'
bc0d41bd 1278;;
e59d29d6 1279;; [vinicius] Vinicius Jose Latorre <viniciusjl@ig.com.br>
bc0d41bd 1280;;
ccae01a6 1281;; 1999-03-01
1fd9b7fe 1282;; PostScript tumble and setpagedevice.
bc0d41bd 1283;;
ccae01a6 1284;; 1998-09-22
1fd9b7fe
GM
1285;; PostScript prologue header comment insertion.
1286;; Skip invisible text better.
d3ab8dac 1287;;
ccae01a6 1288;; [kenichi] 1998-08-19 Ken'ichi Handa <handa@m17n.org>
e65df0a1 1289;;
71efd3c4 1290;; Multi-byte buffer handling.
e65df0a1 1291;;
e59d29d6 1292;; [vinicius] Vinicius Jose Latorre <viniciusjl@ig.com.br>
12b88fff 1293;;
ccae01a6 1294;; 1998-03-06
1fd9b7fe 1295;; Skip invisible text.
12b88fff 1296;;
ccae01a6 1297;; 1997-11-30
1fd9b7fe
GM
1298;; Hooks: `ps-print-hook', `ps-print-begin-page-hook' and
1299;; `ps-print-begin-column-hook'.
1300;; Put one header per page over the columns.
1301;; Better database font management.
1302;; Better control characters handling.
12b88fff 1303;;
ccae01a6 1304;; 1997-11-21
1fd9b7fe
GM
1305;; Dynamic evaluation at print time of `ps-lpr-switches'.
1306;; Handle control characters.
1307;; Face remapping.
1308;; New face attributes.
1309;; Line number.
1310;; Zebra stripes.
1311;; Text and/or image on background.
87a16a06 1312;;
ccae01a6 1313;; [jack] 1996-05-17 Jacques Duthen <duthen@cegelec-red.fr>
bcc0d457 1314;;
ccae01a6
VJL
1315;; Font family and float size for text and header.
1316;; Landscape mode.
1317;; Multiple columns.
1318;; Tools for page setup.
bcc0d457
RS
1319;;
1320;;
d3ab8dac 1321;; Known bugs and limitations of ps-print
ef2cbb24 1322;; --------------------------------------
bcc0d457 1323;;
319acba0
GM
1324;; Although color printing will work in XEmacs 19.12, it doesn't work well; in
1325;; particular, bold or italic fonts don't print in the right background color.
043620f4
KH
1326;;
1327;; Invisible properties aren't correctly ignored in XEmacs 19.12.
1328;;
319acba0
GM
1329;; Automatic font-attribute detection doesn't work well, especially with
1330;; hilit19 and older versions of get-create-face. Users having problems with
1331;; auto-font detection should use the lists `ps-italic-faces', `ps-bold-faces'
1332;; and `ps-underlined-faces' and/or turn off automatic detection by setting
1333;; `ps-auto-font-detect' to nil.
00aa16af 1334;;
319acba0
GM
1335;; Automatic font-attribute detection doesn't work with XEmacs 19.12 in tty
1336;; mode; use the lists `ps-italic-faces', `ps-bold-faces' and
857686a6 1337;; `ps-underlined-faces' instead.
12d89a2e 1338;;
00aa16af 1339;; Still too slow; could use some hand-optimization.
ef2cbb24 1340;;
12d89a2e 1341;; Default background color isn't working.
ef2cbb24
RS
1342;;
1343;; Faces are always treated as opaque.
1344;;
4abc74e8 1345;; Epoch, Lucid and Emacs 21 not supported. At all.
ef2cbb24 1346;;
06fb6aab 1347;; Fixed-pitch fonts work better for line folding, but are not required.
bcc0d457 1348;;
319acba0
GM
1349;; `ps-nb-pages-buffer' and `ps-nb-pages-region' don't take care of folding
1350;; lines.
ef2cbb24 1351;;
12d89a2e 1352;;
d3ab8dac 1353;; Things to change
bcc0d457 1354;; ----------------
ef2cbb24 1355;;
12b88fff 1356;; Avoid page break inside a paragraph.
ccae01a6 1357;;
bcc0d457 1358;; Add `ps-non-bold-faces' and `ps-non-italic-faces' (should be easy).
ccae01a6 1359;;
bcc0d457 1360;; Improve the memory management for big files (hard?).
ccae01a6 1361;;
319acba0
GM
1362;; `ps-nb-pages-buffer' and `ps-nb-pages-region' should take care of folding
1363;; lines.
ef2cbb24 1364;;
ef2cbb24 1365;;
6bf5fb46
GM
1366;; Acknowledgments
1367;; ---------------
1368;;
9586e1d3
VJL
1369;; Thanks to Michael Piotrowski <mxp@dynalabs.de> for improving the DSC
1370;; compliance of the generated PostScript.
1371;;
55732434
GM
1372;; Thanks to Adam Doppelt <adoppelt@avogadro.com> for face mapping suggestion
1373;; for black/white PostScript printers.
1374;;
319acba0
GM
1375;; Thanks to Toni Ronkko <tronkko@hytti.uku.fi> for line and paragraph spacing,
1376;; region to cut out when printing and footer suggestions.
1377;;
6bf5fb46 1378;; Thanks to Pavel Janik ml <Pavel@Janik.cz> for documentation correction.
12b88fff 1379;;
ef1159c2
EZ
1380;; Thanks to Corinne Ilvedson <cilvedson@draper.com> for line number font size
1381;; suggestion.
1382;;
c3d6d211
GM
1383;; Thanks to Gord Wait <Gord_Wait@spectrumsignal.com> for
1384;; `ps-user-defined-prologue' example setting for HP PostScript printer.
1385;;
98f2fbe7
GM
1386;; Thanks to Paul Furnanz <pfurnanz@synopsys.com> for XEmacs compatibility
1387;; suggestion for `ps-postscript-code-directory' variable.
1388;;
906d41a7
GM
1389;; Thanks to David X Callaway <dxc@xprt.net> for helping debugging PostScript
1390;; level 1 compatibility.
1391;;
71efd3c4
VJL
1392;; Thanks to Colin Marquardt <colin.marquardt@usa.alcatel.com> for:
1393;; - upside-down, line number step, line number start and zebra stripe
1394;; follow suggestions.
1395;; - `ps-time-stamp-yyyy-mm-dd' and `ps-time-stamp-iso8601' suggestion.
1396;; - and for XEmacs beta-tests.
906d41a7 1397;;
66e63857 1398;; Thanks to Klaus Berndl <klaus.berndl@sdm.de> for user defined PostScript
2bd80d73
GM
1399;; prologue code suggestion, for odd/even printing suggestion and for
1400;; `ps-prologue-file' enhancement.
66e63857 1401;;
edf2174f 1402;; Thanks to Ken'ichi Handa <handa@m17n.org> for multi-byte buffer handling.
915293a2
KH
1403;;
1404;; Thanks to Matthew O Persico <Matthew.Persico@lazard.com> for line number on
1405;; empty columns.
1406;;
1407;; Thanks to Theodore Jump <tjump@cais.com> for adjust PostScript code order on
1408;; last page.
1409;;
6bdb808e
RS
1410;; Thanks to Roland Ducournau <ducour@lirmm.fr> for
1411;; `ps-print-control-characters' variable documentation.
1412;;
12b88fff
RS
1413;; Thanks to Marcus G Daniels <marcus@cathcart.sysc.pdx.edu> for a better
1414;; database font management.
1415;;
1416;; Thanks to Martin Boyer <gamin@videotron.ca> for some ideas on putting one
6bdb808e
RS
1417;; header per page over the columns and correct line numbers when printing a
1418;; region.
12b88fff
RS
1419;;
1420;; Thanks to Steven L Baur <steve@miranova.com> for dynamic evaluation at
1421;; print time of `ps-lpr-switches'.
1422;;
6bdb808e
RS
1423;; Thanks to Kevin Rodgers <kevinr@ihs.com> for handling control characters
1424;; (his code was severely modified, but the main idea was kept).
1425;;
12b88fff
RS
1426;; Thanks to some suggestions on:
1427;; * Face color map: Marco Melgazzi <marco@techie.com>
1428;; * XEmacs compatibility: William J. Henney <will@astrosmo.unam.mx>
984e7bd9 1429;; * Check `ps-paper-type': Sudhakar Frederick <sfrederi@asc.corp.mot.com>
12b88fff 1430;;
319acba0
GM
1431;; Thanks to Jacques Duthen <duthen@cegelec-red.fr> (Jack) for version 3.4 I
1432;; started from. [vinicius]
857686a6 1433;;
319acba0 1434;; Thanks to Jim Thompson <?@?> for the 2.8 version I started from. [jack]
bcc0d457 1435;;
319acba0
GM
1436;; Thanks to Kevin Rodgers <kevinr@ihs.com> for adding support for color and
1437;; the invisible property.
ef2cbb24 1438;;
319acba0
GM
1439;; Thanks to Avishai Yacobi, avishaiy@mcil.comm.mot.com, for writing the
1440;; initial port to Emacs 19. His code is no longer part of ps-print, but his
1441;; work is still appreciated.
ef2cbb24 1442;;
9586e1d3 1443;; Thanks to Remi Houdaille and Michel Train <michel@metasoft.fdn.org> for
319acba0
GM
1444;; adding underline support. Their code also is no longer part of ps-print,
1445;; but their efforts are not forgotten.
12d89a2e 1446;;
319acba0
GM
1447;; Thanks also to all of you who mailed code to add features to ps-print;
1448;; although I didn't use your code, I still appreciate your sharing it with me.
12d89a2e
RS
1449;;
1450;; Thanks to all who mailed comments, encouragement, and criticism.
319acba0
GM
1451;; Thanks also to all who responded to my survey; I had too many responses to
1452;; reply to them all, but I greatly appreciate your interest.
12d89a2e
RS
1453;;
1454;; Jim
bc0d41bd 1455;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ef2cbb24
RS
1456
1457;;; Code:
1458
55732434 1459
b6d0ac87 1460(require 'lpr)
68e684a0 1461
b6d0ac87
VJL
1462(or (featurep 'lisp-float-type)
1463 (error "`ps-print' requires floating point support"))
68e684a0 1464
d54ad496
VJL
1465(if (featurep 'xemacs)
1466 ()
1467 (unless (and (boundp 'emacs-major-version)
1468 (>= emacs-major-version 22))
1469 (error "`ps-print' only supports Emacs 22 and higher")))
eafa92bf 1470
68e684a0 1471
b6d0ac87
VJL
1472;; GNU Emacs
1473(or (fboundp 'line-beginning-position)
1474 (defun line-beginning-position (&optional n)
1475 (save-excursion
1476 (and n (/= n 1) (forward-line (1- n)))
1477 (beginning-of-line)
1478 (point))))
1479
1480
1481;; to avoid compilation gripes
1482
b6d0ac87 1483;; GNU Emacs
cf04718a 1484(defalias 'ps-e-find-composition (if (fboundp 'find-composition)
d3241651
VJL
1485 'find-composition
1486 'ignore))
b6d0ac87
VJL
1487
1488
1489(defconst ps-windows-system
1490 (memq system-type '(emx win32 w32 mswindows ms-dos windows-nt)))
1491(defconst ps-lp-system
1492 (memq system-type '(usg-unix-v dgux hpux irix)))
1493
1494
1495(defun ps-xemacs-color-name (color)
c9b3d6a5
DN
1496 (when (featurep 'xemacs)
1497 (if (color-specifier-p color)
1498 (color-name color)
1499 color)))
b6d0ac87 1500
cf04718a
SM
1501(defalias 'ps-frame-parameter
1502 (if (fboundp 'frame-parameter) 'frame-parameter 'frame-property))
d3241651 1503
cf04718a
SM
1504(defalias 'ps-mark-active-p
1505 (if (fboundp 'region-active-p)
d3241651
VJL
1506 'region-active-p ; XEmacs
1507 (defvar mark-active) ; To shup up XEmacs's byte compiler.
1508 (lambda () mark-active))) ; Emacs
b6d0ac87 1509
c9b3d6a5
DN
1510(defun ps-face-foreground-name (face)
1511 (if (featurep 'xemacs)
1512 (ps-xemacs-color-name (face-foreground face))
1513 (face-foreground face nil t)))
906d41a7 1514
c9b3d6a5
DN
1515(defun ps-face-background-name (face)
1516 (if (featurep 'xemacs)
1517 (ps-xemacs-color-name (face-background face))
1518 (face-background face nil t)))
906d41a7 1519
ef2cbb24 1520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12d89a2e
RS
1521;; User Variables:
1522
0a5daee5 1523
bcc0d457
RS
1524;;; Interface to the command system
1525
bc0d41bd 1526(defgroup postscript nil
b0fa9df7 1527 "PostScript Group."
bc0d41bd 1528 :tag "PostScript"
b6d0ac87 1529 :version "20"
bc0d41bd
KH
1530 :group 'emacs)
1531
e0af0d3e 1532(defgroup ps-print nil
b0fa9df7 1533 "PostScript generator for Emacs."
3556c6dd 1534 :link '(emacs-library-link :tag "Source Lisp File" "ps-print.el")
e0af0d3e 1535 :prefix "ps-"
b6d0ac87 1536 :version "20"
bc0d41bd
KH
1537 :group 'wp
1538 :group 'postscript)
e0af0d3e
RS
1539
1540(defgroup ps-print-horizontal nil
b0fa9df7 1541 "Horizontal page layout."
e0af0d3e
RS
1542 :prefix "ps-"
1543 :tag "Horizontal"
b6d0ac87 1544 :version "20"
e0af0d3e
RS
1545 :group 'ps-print)
1546
1547(defgroup ps-print-vertical nil
b0fa9df7 1548 "Vertical page layout."
e0af0d3e
RS
1549 :prefix "ps-"
1550 :tag "Vertical"
b6d0ac87 1551 :version "20"
e0af0d3e
RS
1552 :group 'ps-print)
1553
6e1b1da6 1554(defgroup ps-print-headers nil
b0fa9df7 1555 "Headers & footers layout."
e0af0d3e 1556 :prefix "ps-"
319acba0 1557 :tag "Header & Footer"
b6d0ac87 1558 :version "20"
e0af0d3e
RS
1559 :group 'ps-print)
1560
1561(defgroup ps-print-font nil
b0fa9df7 1562 "Fonts customization."
e0af0d3e
RS
1563 :prefix "ps-"
1564 :tag "Font"
b6d0ac87 1565 :version "20"
e0af0d3e
RS
1566 :group 'ps-print)
1567
1568(defgroup ps-print-color nil
b0fa9df7 1569 "Color customization."
e0af0d3e
RS
1570 :prefix "ps-"
1571 :tag "Color"
b6d0ac87 1572 :version "20"
e0af0d3e
RS
1573 :group 'ps-print)
1574
1575(defgroup ps-print-face nil
b0fa9df7 1576 "Faces customization."
e0af0d3e
RS
1577 :prefix "ps-"
1578 :tag "PS Faces"
b6d0ac87 1579 :version "20"
e0af0d3e
RS
1580 :group 'ps-print
1581 :group 'faces)
1582
bc0d41bd 1583(defgroup ps-print-n-up nil
b0fa9df7 1584 "N-up customization."
bc0d41bd
KH
1585 :prefix "ps-"
1586 :tag "N-Up"
b6d0ac87 1587 :version "20"
bc0d41bd
KH
1588 :group 'ps-print)
1589
1590(defgroup ps-print-zebra nil
b0fa9df7 1591 "Zebra customization."
bc0d41bd
KH
1592 :prefix "ps-"
1593 :tag "Zebra"
b6d0ac87 1594 :version "20"
bc0d41bd
KH
1595 :group 'ps-print)
1596
1597(defgroup ps-print-background nil
b0fa9df7 1598 "Background customization."
bc0d41bd
KH
1599 :prefix "ps-"
1600 :tag "Background"
b6d0ac87 1601 :version "20"
bc0d41bd
KH
1602 :group 'ps-print)
1603
1426742b 1604(defgroup ps-print-printer '((lpr custom-group))
b0fa9df7 1605 "Printer customization."
bc0d41bd
KH
1606 :prefix "ps-"
1607 :tag "Printer"
b6d0ac87 1608 :version "20"
bc0d41bd
KH
1609 :group 'ps-print)
1610
1611(defgroup ps-print-page nil
b0fa9df7 1612 "Page customization."
bc0d41bd
KH
1613 :prefix "ps-"
1614 :tag "Page"
b6d0ac87 1615 :version "20"
bc0d41bd
KH
1616 :group 'ps-print)
1617
6e1b1da6 1618(defgroup ps-print-miscellany nil
b0fa9df7 1619 "Miscellany customization."
6e1b1da6
GM
1620 :prefix "ps-"
1621 :tag "Miscellany"
b6d0ac87 1622 :version "20"
6e1b1da6
GM
1623 :group 'ps-print)
1624
bc0d41bd 1625
66e63857
GM
1626(defcustom ps-error-handler-message 'paper
1627 "*Specify where the error handler message should be sent.
1628
1629Valid values are:
1630
1631 `none' catch the error and *DON'T* send any message.
1632
1633 `paper' catch the error and print on paper the error message.
1634
1635 `system' catch the error and send back the error message to
6e1b1da6
GM
1636 printing system. This is useful only if printing system
1637 send back an email reporting the error, or if there is
1638 some other alternative way to report back the error from
1639 the system to you.
66e63857
GM
1640
1641 `paper-and-system' catch the error, print on paper the error message and
1642 send back the error message to printing system.
1643
1644Any other value is treated as `paper'."
8e234846
GM
1645 :type '(choice :menu-tag "Error Handler Message"
1646 :tag "Error Handler Message"
66e63857
GM
1647 (const none) (const paper)
1648 (const system) (const paper-and-system))
b6d0ac87 1649 :version "20"
6e1b1da6 1650 :group 'ps-print-miscellany)
66e63857
GM
1651
1652(defcustom ps-user-defined-prologue nil
1653 "*User defined PostScript prologue code inserted before all prologue code.
1654
1655`ps-user-defined-prologue' may be a string or a symbol function which returns a
1656string. Note that this string is inserted after `ps-adobe-tag' and PostScript
1657prologue comments, and before ps-print PostScript prologue code section. That
1658is, this string is inserted after error handler initialization and before
1659ps-print settings.
1660
66e63857
GM
1661It's strongly recommended only insert PostScript code and/or comments specific
1662for your printing system particularities. For example, some special
1663initialization that only your printing system needs.
1664
319acba0
GM
1665Do not insert code for duplex printing, n-up printing or error handler,
1666ps-print handles this in a suitable way.
66e63857
GM
1667
1668For more information about PostScript, see:
1669 PostScript Language Reference Manual (2nd edition)
c3d6d211
GM
1670 Adobe Systems Incorporated
1671
1672As an example for `ps-user-defined-prologue' setting:
1673
1674 ;; Setting for HP PostScript printer
1675 (setq ps-user-defined-prologue
1676 (concat \"<</DeferredMediaSelection true /PageSize [612 792] \"
2285bf9d 1677 \"/MediaPosition 2 /MediaType (Plain)>> setpagedevice\"))"
8e234846
GM
1678 :type '(choice :menu-tag "User Defined Prologue"
1679 :tag "User Defined Prologue"
98f2fbe7 1680 (const :tag "none" nil) string symbol)
b6d0ac87 1681 :version "20"
6e1b1da6 1682 :group 'ps-print-miscellany)
66e63857 1683
d3ab8dac
KH
1684(defcustom ps-print-prologue-header nil
1685 "*PostScript prologue header comments besides that ps-print generates.
1686
319acba0
GM
1687`ps-print-prologue-header' may be a string or a symbol function which returns a
1688string. Note that this string is inserted on PostScript prologue header
1689section which is used to define some document characteristic through PostScript
1690special comments, like \"%%Requirements: jog\\n\".
d3ab8dac
KH
1691
1692ps-print always inserts the %%Requirements: comment, so if you need to insert
1693more requirements put them first in `ps-print-prologue-header' using the
1694\"%%+\" comment. For example, if you need to set numcopies to 3 and jog on
1695requirements and set %%LanguageLevel: to 2, do:
1696
2285bf9d 1697 (setq ps-print-prologue-header
e59d29d6 1698 \"%%+ numcopies(3) jog\\n%%LanguageLevel: 2\\n\")
d3ab8dac
KH
1699
1700The duplex requirement is inserted by ps-print (see `ps-spool-duplex').
1701
1702Do not forget to terminate the string with \"\\n\".
1703
1704For more information about PostScript document comments, see:
1705 PostScript Language Reference Manual (2nd edition)
1706 Adobe Systems Incorporated
1707 Appendix G: Document Structuring Conventions -- Version 3.0"
8e234846
GM
1708 :type '(choice :menu-tag "Prologue Header"
1709 :tag "Prologue Header"
98f2fbe7 1710 (const :tag "none" nil) string symbol)
b6d0ac87 1711 :version "20"
6e1b1da6 1712 :group 'ps-print-miscellany)
d3ab8dac 1713
298bfad9 1714(defcustom ps-printer-name (and (boundp 'printer-name)
2bd80d73 1715 (symbol-value 'printer-name))
03820514
RS
1716 "*The name of a local printer for printing PostScript files.
1717
3556c6dd
GM
1718On Unix-like systems, a string value should be a name understood by lpr's -P
1719option; a value of nil means use the value of `printer-name' instead.
1720
1721On MS-DOS and MS-Windows systems, a string value is taken as the name of the
1722printer device or port to which PostScript files are written, provided
1723`ps-lpr-command' is \"\". By default it is the same as `printer-name'; typical
1724non-default settings would be \"LPT1\" to \"LPT3\" for parallel printers, or
7bb054a5 1725\"COM1\" to \"COM4\" or \"AUX\" for serial printers, or \"\\\\hostname\\printer\"
3556c6dd
GM
1726for a shared network printer. You can also set it to a name of a file, in
1727which case the output gets appended to that file. \(Note that `ps-print'
1728package already has facilities for printing to a file, so you might as well use
1729them instead of changing the setting of this variable.\) If you want to
1730silently discard the printed output, set this to \"NUL\".
1731
1732Set to t, if the utility given by `ps-lpr-command' needs an empty printer name.
1733
1734Any other value is treated as t, that is, an empty printer name.
1735
1736See also `ps-printer-name-option' for documentation."
8e234846
GM
1737 :type '(choice :menu-tag "Printer Name"
1738 :tag "Printer Name"
1739 (const :tag "Same as printer-name" nil)
3556c6dd 1740 (const :tag "No Printer Name" t)
6e1b1da6 1741 (file :tag "Print to file")
8e234846 1742 (string :tag "Pipe to ps-lpr-command"))
b6d0ac87 1743 :version "20"
bc0d41bd 1744 :group 'ps-print-printer)
03820514 1745
3556c6dd
GM
1746(defcustom ps-printer-name-option
1747 (cond (ps-windows-system
1748 "/D:")
1749 (ps-lp-system
1750 "-d")
1751 (t
1752 "-P" ))
1753 "*Option for `ps-printer-name' variable (see it).
1754
2285bf9d
RS
1755On Unix-like systems, if `lpr' is in use, this should be the string
1756\"-P\"; if `lp' is in use, this should be the string \"-d\".
3556c6dd 1757
2285bf9d 1758On MS-DOS and MS-Windows systems, if `print' is in use, this should be
3556c6dd
GM
1759the string \"/D:\".
1760
2285bf9d 1761For any other printing utility, see its documentation.
3556c6dd 1762
c90a10fa
RS
1763Set this to \"\" or nil, if the utility given by `ps-lpr-command'
1764needs an empty printer name option--that is, pass the printer name
1765with no special option preceding it.
3556c6dd 1766
c90a10fa 1767Any value that is not a string is treated as nil.
3556c6dd
GM
1768
1769This variable is used only when `ps-printer-name' is a non-empty string."
1770 :type '(choice :menu-tag "Printer Name Option"
1771 :tag "Printer Name Option"
1772 (const :tag "None" nil)
1773 (string :tag "Option"))
6bf5fb46 1774 :version "21.1"
3556c6dd
GM
1775 :group 'ps-print-printer)
1776
e0af0d3e 1777(defcustom ps-lpr-command lpr-command
52cf535f
AI
1778 "*Name of program for printing a PostScript file.
1779
3556c6dd
GM
1780On MS-DOS and MS-Windows systems, if the value is an empty string then Emacs
1781will write directly to the printer port named by `ps-printer-name'. The
1782programs `print' and `nprint' (the standard print programs on Windows NT and
1783Novell Netware respectively) are handled specially, using `ps-printer-name' as
1784the destination for output; any other program is treated like `lpr' except that
1785an explicit filename is given as the last argument."
e0af0d3e 1786 :type 'string
b6d0ac87 1787 :version "20"
bc0d41bd 1788 :group 'ps-print-printer)
e0af0d3e
RS
1789
1790(defcustom ps-lpr-switches lpr-switches
1791 "*A list of extra switches to pass to `ps-lpr-command'."
edc9cd35 1792 :type '(repeat :tag "PostScript lpr Switches"
ef1159c2
EZ
1793 (choice :menu-tag "PostScript lpr Switch"
1794 :tag "PostScript lpr Switch"
1795 string symbol (repeat sexp)))
b6d0ac87 1796 :version "20"
bc0d41bd 1797 :group 'ps-print-printer)
12d89a2e 1798
52cf535f 1799(defcustom ps-print-region-function nil
bc0d41bd 1800 "*Specify a function to print the region on a PostScript printer.
319acba0
GM
1801See definition of `call-process-region' for calling conventions. The fourth
1802and the sixth arguments are both nil."
942a1d58 1803 :type '(choice (const nil) function)
b6d0ac87 1804 :version "20"
bc0d41bd 1805 :group 'ps-print-printer)
52cf535f 1806
8e234846
GM
1807(defcustom ps-manual-feed nil
1808 "*Non-nil means the printer will manually feed paper.
1809
1810If it's nil, automatic feeding takes place."
1811 :type 'boolean
b6d0ac87 1812 :version "20"
8e234846
GM
1813 :group 'ps-print-printer)
1814
bd7a2e26 1815(defcustom ps-end-with-control-d (and ps-windows-system t)
ef1159c2 1816 "*Non-nil means insert C-d at end of PostScript file generated."
6bf5fb46 1817 :version "21.1"
ef1159c2 1818 :type 'boolean
b6d0ac87 1819 :version "20"
ef1159c2
EZ
1820 :group 'ps-print-printer)
1821
bcc0d457 1822;;; Page layout
12d89a2e 1823
bcc0d457
RS
1824;; All page dimensions are in PostScript points.
1825;; 1 inch == 2.54 cm == 72 points
1826;; 1 cm == (/ 1 2.54) inch == (/ 72 2.54) points
1827
1828;; Letter 8.5 inch x 11.0 inch
1829;; Legal 8.5 inch x 14.0 inch
1830;; A4 8.26 inch x 11.69 inch = 21.0 cm x 29.7 cm
1831
1832;; LetterSmall 7.68 inch x 10.16 inch
1833;; Tabloid 11.0 inch x 17.0 inch
1834;; Ledger 17.0 inch x 11.0 inch
1835;; Statement 5.5 inch x 8.5 inch
1836;; Executive 7.5 inch x 10.0 inch
1837;; A3 11.69 inch x 16.5 inch = 29.7 cm x 42.0 cm
1838;; A4Small 7.47 inch x 10.85 inch
1839;; B4 10.125 inch x 14.33 inch
1840;; B5 7.16 inch x 10.125 inch
1841
c90a10fa 1842;;;###autoload
e0af0d3e 1843(defcustom ps-page-dimensions-database
bc0d41bd
KH
1844 (list (list 'a4 (/ (* 72 21.0) 2.54) (/ (* 72 29.7) 2.54) "A4")
1845 (list 'a3 (/ (* 72 29.7) 2.54) (/ (* 72 42.0) 2.54) "A3")
1846 (list 'letter (* 72 8.5) (* 72 11.0) "Letter")
1847 (list 'legal (* 72 8.5) (* 72 14.0) "Legal")
1848 (list 'letter-small (* 72 7.68) (* 72 10.16) "LetterSmall")
1849 (list 'tabloid (* 72 11.0) (* 72 17.0) "Tabloid")
1850 (list 'ledger (* 72 17.0) (* 72 11.0) "Ledger")
1851 (list 'statement (* 72 5.5) (* 72 8.5) "Statement")
1852 (list 'executive (* 72 7.5) (* 72 10.0) "Executive")
1853 (list 'a4small (* 72 7.47) (* 72 10.85) "A4Small")
1854 (list 'b4 (* 72 10.125) (* 72 14.33) "B4")
1855 (list 'b5 (* 72 7.16) (* 72 10.125) "B5"))
1856 "*List associating a symbolic paper type to its width, height and doc media.
1857See `ps-paper-type'."
e0af0d3e
RS
1858 :type '(repeat (list :tag "Paper Type"
1859 (symbol :tag "Name")
1860 (number :tag "Width")
bc0d41bd
KH
1861 (number :tag "Height")
1862 (string :tag "Media")))
b6d0ac87 1863 :version "20"
bc0d41bd 1864 :group 'ps-print-page)
e0af0d3e 1865
857686a6 1866;;;###autoload
e0af0d3e 1867(defcustom ps-paper-type 'letter
bc0d41bd 1868 "*Specify the size of paper to format for.
090be653 1869Should be one of the paper types defined in `ps-page-dimensions-database', for
e0af0d3e
RS
1870example `letter', `legal' or `a4'."
1871 :type '(symbol :validate (lambda (wid)
87a16a06
RS
1872 (if (assq (widget-value wid)
1873 ps-page-dimensions-database)
e0af0d3e
RS
1874 nil
1875 (widget-put wid :error "Unknown paper size")
1876 wid)))
b6d0ac87 1877 :version "20"
bc0d41bd 1878 :group 'ps-print-page)
e0af0d3e 1879
8e234846
GM
1880(defcustom ps-warn-paper-type t
1881 "*Non-nil means give an error if paper size is not equal to `ps-paper-type'.
1882
1883It's used when `ps-spool-config' is set to `setpagedevice'."
1884 :type 'boolean
b6d0ac87 1885 :version "20"
8e234846
GM
1886 :group 'ps-print-page)
1887
87a16a06 1888(defcustom ps-landscape-mode nil
e0af0d3e
RS
1889 "*Non-nil means print in landscape mode."
1890 :type 'boolean
b6d0ac87 1891 :version "20"
bc0d41bd 1892 :group 'ps-print-page)
e0af0d3e 1893
906d41a7 1894(defcustom ps-print-upside-down nil
2285bf9d 1895 "*Non-nil means print upside-down (that is, rotated by 180 degrees)."
906d41a7 1896 :type 'boolean
319acba0 1897 :version "21.1"
906d41a7
GM
1898 :group 'ps-print-page)
1899
1fd9b7fe
GM
1900(defcustom ps-selected-pages nil
1901 "*Specify which pages to print.
1902
2285bf9d 1903If nil, print all pages.
1fd9b7fe 1904
2285bf9d 1905If a list, the lists element may be an integer or a cons cell (FROM . TO)
1fd9b7fe 1906designating FROM page to TO page; any invalid element is ignored, that is, an
e59d29d6 1907integer lesser than one or if FROM is greater than TO.
1fd9b7fe
GM
1908
1909Otherwise, it's treated as nil.
1910
2285bf9d
RS
1911After ps-print processing `ps-selected-pages' is set to nil. But the
1912latest `ps-selected-pages' is saved in `ps-last-selected-pages' (which
1913see). So you can restore the latest selected pages by using
1914`ps-last-selected-pages' or with the `ps-restore-selected-pages'
1915command (which see).
ea0c615d
GM
1916
1917See also `ps-even-or-odd-pages'."
1fd9b7fe
GM
1918 :type '(repeat :tag "Selected Pages"
1919 (radio :tag "Page"
1920 (integer :tag "Number")
1921 (cons :tag "Range"
1922 (integer :tag "From")
1923 (integer :tag "To"))))
b6d0ac87 1924 :version "20"
1fd9b7fe
GM
1925 :group 'ps-print-page)
1926
c3d6d211
GM
1927(defcustom ps-even-or-odd-pages nil
1928 "*Specify if it prints even/odd pages.
1929
1930Valid values are:
1931
1932 nil print all pages.
1933
4b3eb10f
GM
1934 `even-page' print only even pages.
1935
1936 `odd-page' print only odd pages.
1937
1938 `even-sheet' print only even sheets.
bd7a2e26
GM
1939 That is, if `ps-n-up-printing' is 1, it behaves as `even-page';
1940 but for values greater than 1, it'll print only the even sheet
1941 of paper.
c3d6d211 1942
4b3eb10f 1943 `odd-sheet' print only odd sheets.
bd7a2e26
GM
1944 That is, if `ps-n-up-printing' is 1, it behaves as `odd-page';
1945 but for values greater than 1, it'll print only the odd sheet
1946 of paper.
c3d6d211 1947
ea0c615d
GM
1948Any other value is treated as nil.
1949
1950If you set `ps-selected-pages' (see it for documentation), first the pages are
1951filtered by `ps-selected-pages' and then by `ps-even-or-odd-pages'. For
1952example, if we have:
1953
4b3eb10f 1954 (setq ps-selected-pages '(1 4 (6 . 10) (12 . 16) 20))
ea0c615d 1955
4b3eb10f 1956Combining with `ps-even-or-odd-pages' and `ps-n-up-printing', we have:
ea0c615d 1957
4b3eb10f 1958`ps-n-up-printing' = 1:
ea0c615d 1959 `ps-even-or-odd-pages' PAGES PRINTED
4b3eb10f
GM
1960 nil 1, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 20
1961 even-page 4, 6, 8, 10, 12, 14, 16, 20
1962 odd-page 1, 7, 9, 13, 15
1963 even-sheet 4, 6, 8, 10, 12, 14, 16, 20
1964 odd-sheet 1, 7, 9, 13, 15
1965
1966`ps-n-up-printing' = 2:
1967 `ps-even-or-odd-pages' PAGES PRINTED
1968 nil 1/4, 6/7, 8/9, 10/12, 13/14, 15/16, 20
1969 even-page 4/6, 8/10, 12/14, 16/20
1970 odd-page 1/7, 9/13, 15
1971 even-sheet 6/7, 10/12, 15/16
1972 odd-sheet 1/4, 8/9, 13/14, 20
1973
1974So even-page/odd-page are about page parity and even-sheet/odd-sheet are about
1975sheet parity."
c3d6d211
GM
1976 :type '(choice :menu-tag "Print Even/Odd Pages"
1977 :tag "Print Even/Odd Pages"
1978 (const :tag "All Pages" nil)
4b3eb10f
GM
1979 (const :tag "Only Even Pages" even-page)
1980 (const :tag "Only Odd Pages" odd-page)
1981 (const :tag "Only Even Sheets" even-sheet)
1982 (const :tag "Only Odd Sheets" odd-sheet))
b6d0ac87 1983 :version "20"
c3d6d211
GM
1984 :group 'ps-print-page)
1985
857686a6 1986(defcustom ps-print-control-characters 'control-8-bit
bc0d41bd
KH
1987 "*Specify the printable form for control and 8-bit characters.
1988That is, instead of sending, for example, a ^D (\\004) to printer,
915293a2 1989it is sent the string \"^D\".
6bdb808e 1990
857686a6 1991Valid values are:
6bdb808e 1992
984e7bd9 1993 `8-bit' This is the value to use when you want an ASCII encoding of
d3ab8dac
KH
1994 any control or non-ASCII character. Control characters are
1995 encoded as \"^D\", and non-ASCII characters have an
1996 octal encoding.
6bdb808e 1997
984e7bd9 1998 `control-8-bit' This is the value to use when you want an ASCII encoding of
d3ab8dac
KH
1999 any control character, whether it is 7 or 8-bit.
2000 European 8-bits accented characters are printed according
2001 the current font.
6bdb808e 2002
c82b4a75 2003 `control' Only ASCII control characters have an ASCII encoding.
d3ab8dac
KH
2004 European 8-bits accented characters are printed according
2005 the current font.
6bdb808e 2006
984e7bd9 2007 nil No ASCII encoding. Any character is printed according the
d3ab8dac 2008 current font.
6bdb808e 2009
857686a6 2010Any other value is treated as nil."
8e234846
GM
2011 :type '(choice :menu-tag "Control Char"
2012 :tag "Control Char"
bc0d41bd 2013 (const 8-bit) (const control-8-bit)
edc9cd35 2014 (const control) (const :tag "nil" nil))
b6d0ac87 2015 :version "20"
6e1b1da6 2016 :group 'ps-print-miscellany)
857686a6 2017
bc0d41bd
KH
2018(defcustom ps-n-up-printing 1
2019 "*Specify the number of pages per sheet paper."
2020 :type '(integer
2021 :tag "N Up Printing"
2022 :validate
2023 (lambda (wid)
2024 (if (and (< 0 (widget-value wid))
2025 (<= (widget-value wid) 100))
2026 nil
2027 (widget-put
2028 wid :error
2029 "Number of pages per sheet paper must be between 1 and 100.")
2030 wid)))
b6d0ac87 2031 :version "20"
bc0d41bd
KH
2032 :group 'ps-print-n-up)
2033
2034(defcustom ps-n-up-margin (/ (* 72 1.0) 2.54) ; 1 cm
2035 "*Specify the margin in points between the sheet border and n-up printing."
2036 :type 'number
b6d0ac87 2037 :version "20"
bc0d41bd
KH
2038 :group 'ps-print-n-up)
2039
2040(defcustom ps-n-up-border-p t
2041 "*Non-nil means a border is drawn around each page."
2042 :type 'boolean
b6d0ac87 2043 :version "20"
bc0d41bd
KH
2044 :group 'ps-print-n-up)
2045
2046(defcustom ps-n-up-filling 'left-top
2047 "*Specify how page matrix is filled on each sheet of paper.
2048
2049Following are the valid values for `ps-n-up-filling' with a filling example
2050using a 3x4 page matrix:
2051
2052 `left-top' 1 2 3 4 `left-bottom' 9 10 11 12
2053 5 6 7 8 5 6 7 8
2054 9 10 11 12 1 2 3 4
2055
2056 `right-top' 4 3 2 1 `right-bottom' 12 11 10 9
2057 8 7 6 5 8 7 6 5
2058 12 11 10 9 4 3 2 1
2059
2060 `top-left' 1 4 7 10 `bottom-left' 3 6 9 12
2061 2 5 8 11 2 5 8 11
2062 3 6 9 12 1 4 7 10
2063
2064 `top-right' 10 7 4 1 `bottom-right' 12 9 6 3
2065 11 8 5 2 11 8 5 2
2066 12 9 6 3 10 7 4 1
2067
2068Any other value is treated as `left-top'."
8e234846
GM
2069 :type '(choice :menu-tag "N-Up Filling"
2070 :tag "N-Up Filling"
bc0d41bd
KH
2071 (const left-top) (const left-bottom)
2072 (const right-top) (const right-bottom)
2073 (const top-left) (const bottom-left)
2074 (const top-right) (const bottom-right))
b6d0ac87 2075 :version "20"
bc0d41bd
KH
2076 :group 'ps-print-n-up)
2077
e0af0d3e 2078(defcustom ps-number-of-columns (if ps-landscape-mode 2 1)
2285bf9d 2079 "*Specify the number of columns."
87a16a06 2080 :type 'number
b6d0ac87 2081 :version "20"
6e1b1da6 2082 :group 'ps-print-miscellany)
87a16a06 2083
535efc38 2084(defcustom ps-zebra-stripes nil
87a16a06 2085 "*Non-nil means print zebra stripes.
6e1b1da6 2086See also documentation for `ps-zebra-stripe-height' and `ps-zebra-color'."
87a16a06 2087 :type 'boolean
b6d0ac87 2088 :version "20"
bc0d41bd 2089 :group 'ps-print-zebra)
87a16a06 2090
535efc38 2091(defcustom ps-zebra-stripe-height 3
87a16a06 2092 "*Number of zebra stripe lines.
6e1b1da6 2093See also documentation for `ps-zebra-stripes' and `ps-zebra-color'."
87a16a06 2094 :type 'number
b6d0ac87 2095 :version "20"
bc0d41bd
KH
2096 :group 'ps-print-zebra)
2097
6e1b1da6
GM
2098(defcustom ps-zebra-color 0.95
2099 "*Zebra stripe gray scale or RGB color.
bc0d41bd 2100See also documentation for `ps-zebra-stripes' and `ps-zebra-stripe-height'."
8e234846
GM
2101 :type '(choice :menu-tag "Zebra Gray/Color"
2102 :tag "Zebra Gray/Color"
6e1b1da6
GM
2103 (number :tag "Gray Scale" :value 0.95)
2104 (string :tag "Color Name" :value "gray95")
2105 (list :tag "RGB Color" :value (0.95 0.95 0.95)
2106 (number :tag "Red")
2107 (number :tag "Green")
2108 (number :tag "Blue")))
b6d0ac87 2109 :version "20"
bc0d41bd 2110 :group 'ps-print-zebra)
87a16a06 2111
8e234846 2112(defcustom ps-zebra-stripe-follow nil
2bd80d73
GM
2113 "*Specify how zebra stripes continue on next page.
2114
2115Visually, valid values are (the character `+' at right of each column indicates
2116that a line is printed):
2117
2118 `nil' `follow' `full' `full-follow'
2119 Current Page -------- ----------- --------- ----------------
2120 1 XXXXX + 1 XXXXXXXX + 1 XXXXXX + 1 XXXXXXXXXXXXX +
2121 2 XXXXX + 2 XXXXXXXX + 2 XXXXXX + 2 XXXXXXXXXXXXX +
2122 3 XXXXX + 3 XXXXXXXX + 3 XXXXXX + 3 XXXXXXXXXXXXX +
2123 4 + 4 + 4 + 4 +
2124 5 + 5 + 5 + 5 +
2125 6 + 6 + 6 + 6 +
2126 7 XXXXX + 7 XXXXXXXX + 7 XXXXXX + 7 XXXXXXXXXXXXX +
2127 8 XXXXX + 8 XXXXXXXX + 8 XXXXXX + 8 XXXXXXXXXXXXX +
2128 9 XXXXX + 9 XXXXXXXX + 9 XXXXXX + 9 XXXXXXXXXXXXX +
2129 10 + 10 +
2130 11 + 11 +
2131 -------- ----------- --------- ----------------
2132 Next Page -------- ----------- --------- ----------------
2133 12 XXXXX + 12 + 10 XXXXXX + 10 +
2134 13 XXXXX + 13 XXXXXXXX + 11 XXXXXX + 11 +
2135 14 XXXXX + 14 XXXXXXXX + 12 XXXXXX + 12 +
2136 15 + 15 XXXXXXXX + 13 + 13 XXXXXXXXXXXXX +
2137 16 + 16 + 14 + 14 XXXXXXXXXXXXX +
2138 17 + 17 + 15 + 15 XXXXXXXXXXXXX +
2139 18 XXXXX + 18 + 16 XXXXXX + 16 +
2140 19 XXXXX + 19 XXXXXXXX + 17 XXXXXX + 17 +
2141 20 XXXXX + 20 XXXXXXXX + 18 XXXXXX + 18 +
2142 21 + 21 XXXXXXXX +
2143 22 + 22 +
2144 -------- ----------- --------- ----------------
2145
d730a5ac 2146Any other value is treated as nil."
2bd80d73
GM
2147 :type '(choice :menu-tag "Zebra Stripe Follow"
2148 :tag "Zebra Stripe Follow"
2149 (const :tag "Always Restart" nil)
2150 (const :tag "Continue on Next Page" follow)
2151 (const :tag "Print Only Full Stripe" full)
2152 (const :tag "Continue on Full Stripe" full-follow))
b6d0ac87 2153 :version "20"
8e234846
GM
2154 :group 'ps-print-zebra)
2155
87a16a06
RS
2156(defcustom ps-line-number nil
2157 "*Non-nil means print line number."
2158 :type 'boolean
b6d0ac87 2159 :version "20"
6e1b1da6 2160 :group 'ps-print-miscellany)
87a16a06 2161
906d41a7
GM
2162(defcustom ps-line-number-step 1
2163 "*Specify the interval that line number is printed.
2164
2165For example, `ps-line-number-step' is set to 2, the printing will look like:
2166
2167 1 one line
2168 one line
2169 3 one line
2170 one line
98f2fbe7 2171 5 one line
906d41a7
GM
2172 one line
2173 ...
2174
2175Valid values are:
2176
2177 integer an integer that specifies the interval that line number is
2178 printed. If it's lesser than or equal to zero, it's used the
2179 value 1.
2180
319acba0
GM
2181 `zebra' specifies that only the line number of the first line in a
2182 zebra stripe is to be printed.
906d41a7
GM
2183
2184Any other value is treated as `zebra'."
8e234846
GM
2185 :type '(choice :menu-tag "Line Number Step"
2186 :tag "Line Number Step"
906d41a7
GM
2187 (integer :tag "Step Interval")
2188 (const :tag "Synchronize Zebra" zebra))
b6d0ac87 2189 :version "20"
906d41a7
GM
2190 :group 'ps-print-miscellany)
2191
98f2fbe7
GM
2192(defcustom ps-line-number-start 1
2193 "*Specify the starting point in the interval given by `ps-line-number-step'.
2194
3556c6dd
GM
2195For example, if `ps-line-number-step' is set to 3 and `ps-line-number-start' is
2196set to 3, the printing will look like:
98f2fbe7
GM
2197
2198 one line
2199 one line
2200 3 one line
2201 one line
2202 one line
2203 6 one line
2204 one line
2205 one line
2206 9 one line
2207 one line
2208 ...
2209
2210The values for `ps-line-number-start':
2211
319acba0
GM
2212 * If `ps-line-number-step' is an integer, must be between 1 and the value of
2213 `ps-line-number-step' inclusive.
98f2fbe7
GM
2214
2215 * If `ps-line-number-step' is set to `zebra', must be between 1 and the
2216 value of `ps-zebra-strip-height' inclusive. Use this combination if you
2217 wish that line number be relative to zebra stripes."
2218 :type '(integer :tag "Start Step Interval")
b6d0ac87 2219 :version "20"
98f2fbe7
GM
2220 :group 'ps-print-miscellany)
2221
87a16a06
RS
2222(defcustom ps-print-background-image nil
2223 "*EPS image list to be printed on background.
2224
2225The elements are:
2226
2227 (FILENAME X Y XSCALE YSCALE ROTATION PAGES...)
2228
2229FILENAME is a file name which contains an EPS image or some PostScript
2230programming like EPS.
2231FILENAME is ignored, if it doesn't exist or is read protected.
2232
2233X and Y are relative positions on paper to put the image.
01cdabc6 2234If X and Y are nil, the image is centered on paper.
87a16a06
RS
2235
2236XSCALE and YSCALE are scale factor to be applied to image before printing.
2237If XSCALE and YSCALE are nil, the original size is used.
2238
2239ROTATION is the image rotation angle; if nil, the default is 0.
2240
2241PAGES designates the page to print background image.
319acba0
GM
2242PAGES may be a number or a cons cell (FROM . TO) designating FROM page to TO
2243page.
87a16a06
RS
2244If PAGES is nil, print background image on all pages.
2245
319acba0 2246X, Y, XSCALE, YSCALE and ROTATION may be a floating point number, an integer
2285bf9d 2247number or a string. If it is a string, the string should contain PostScript
319acba0 2248programming that returns a float or integer value.
87a16a06
RS
2249
2250For example, if you wish to print an EPS image on all pages do:
2251
2252 '((\"~/images/EPS-image.ps\"))"
98f2fbe7
GM
2253 :type '(repeat
2254 (list
2255 (file :tag "EPS File")
2256 (choice :tag "X" (const :tag "default" nil) number string)
2257 (choice :tag "Y" (const :tag "default" nil) number string)
2258 (choice :tag "X Scale" (const :tag "default" nil) number string)
2259 (choice :tag "Y Scale" (const :tag "default" nil) number string)
2260 (choice :tag "Rotation" (const :tag "default" nil) number string)
2261 (repeat :tag "Pages" :inline t
2262 (radio (integer :tag "Page")
2263 (cons :tag "Range"
2264 (integer :tag "From")
2265 (integer :tag "To"))))))
b6d0ac87 2266 :version "20"
bc0d41bd 2267 :group 'ps-print-background)
87a16a06
RS
2268
2269(defcustom ps-print-background-text nil
2270 "*Text list to be printed on background.
2271
2272The elements are:
2273
2274 (STRING X Y FONT FONTSIZE GRAY ROTATION PAGES...)
2275
2276STRING is the text to be printed on background.
2277
2278X and Y are positions on paper to put the text.
2279If X and Y are nil, the text is positioned at lower left corner.
2280
2281FONT is a font name to be used on printing the text.
2282If nil, \"Times-Roman\" is used.
2283
2284FONTSIZE is font size to be used, if nil, 200 is used.
2285
2286GRAY is the text gray factor (should be very light like 0.8).
2287If nil, the default is 0.85.
2288
319acba0
GM
2289ROTATION is the text rotation angle; if nil, the angle is given by the diagonal
2290from lower left corner to upper right corner.
87a16a06
RS
2291
2292PAGES designates the page to print background text.
319acba0
GM
2293PAGES may be a number or a cons cell (FROM . TO) designating FROM page to TO
2294page.
87a16a06
RS
2295If PAGES is nil, print background text on all pages.
2296
319acba0 2297X, Y, FONTSIZE, GRAY and ROTATION may be a floating point number, an integer
2285bf9d 2298number or a string. If it is a string, the string should contain PostScript
319acba0 2299programming that returns a float or integer value.
87a16a06
RS
2300
2301For example, if you wish to print text \"Preliminary\" on all pages do:
2302
2303 '((\"Preliminary\"))"
98f2fbe7
GM
2304 :type '(repeat
2305 (list
2306 (string :tag "Text")
2307 (choice :tag "X" (const :tag "default" nil) number string)
2308 (choice :tag "Y" (const :tag "default" nil) number string)
2309 (choice :tag "Font" (const :tag "default" nil) string)
2310 (choice :tag "Fontsize" (const :tag "default" nil) number string)
2311 (choice :tag "Gray" (const :tag "default" nil) number string)
2312 (choice :tag "Rotation" (const :tag "default" nil) number string)
2313 (repeat :tag "Pages" :inline t
2314 (radio (integer :tag "Page")
2315 (cons :tag "Range"
2316 (integer :tag "From")
2317 (integer :tag "To"))))))
b6d0ac87 2318 :version "20"
bc0d41bd 2319 :group 'ps-print-background)
bcc0d457
RS
2320
2321;;; Horizontal layout
2322
2323;; ------------------------------------------
2324;; | | | | | | | |
2325;; | lm | text | ic | text | ic | text | rm |
2326;; | | | | | | | |
2327;; ------------------------------------------
2328
e0af0d3e
RS
2329(defcustom ps-left-margin (/ (* 72 2.0) 2.54) ; 2 cm
2330 "*Left margin in points (1/72 inch)."
2331 :type 'number
b6d0ac87 2332 :version "20"
e0af0d3e 2333 :group 'ps-print-horizontal)
bcc0d457 2334
e0af0d3e
RS
2335(defcustom ps-right-margin (/ (* 72 2.0) 2.54) ; 2 cm
2336 "*Right margin in points (1/72 inch)."
2337 :type 'number
b6d0ac87 2338 :version "20"
e0af0d3e 2339 :group 'ps-print-horizontal)
bcc0d457 2340
e0af0d3e
RS
2341(defcustom ps-inter-column (/ (* 72 2.0) 2.54) ; 2 cm
2342 "*Horizontal space between columns in points (1/72 inch)."
2343 :type 'number
b6d0ac87 2344 :version "20"
e0af0d3e 2345 :group 'ps-print-horizontal)
bcc0d457
RS
2346
2347;;; Vertical layout
2348
2349;; |--------|
2350;; | tm |
2351;; |--------|
2352;; | header |
2353;; |--------|
2354;; | ho |
2355;; |--------|
2356;; | text |
2357;; |--------|
2358;; | bm |
2359;; |--------|
2360
e0af0d3e
RS
2361(defcustom ps-bottom-margin (/ (* 72 1.5) 2.54) ; 1.5 cm
2362 "*Bottom margin in points (1/72 inch)."
2363 :type 'number
b6d0ac87 2364 :version "20"
e0af0d3e 2365 :group 'ps-print-vertical)
bcc0d457 2366
e0af0d3e
RS
2367(defcustom ps-top-margin (/ (* 72 1.5) 2.54) ; 1.5 cm
2368 "*Top margin in points (1/72 inch)."
2369 :type 'number
b6d0ac87 2370 :version "20"
e0af0d3e 2371 :group 'ps-print-vertical)
bcc0d457 2372
e0af0d3e
RS
2373(defcustom ps-header-offset (/ (* 72 1.0) 2.54) ; 1.0 cm
2374 "*Vertical space in points (1/72 inch) between the main text and the header."
2375 :type 'number
b6d0ac87 2376 :version "20"
e0af0d3e 2377 :group 'ps-print-vertical)
bcc0d457 2378
e0af0d3e 2379(defcustom ps-header-line-pad 0.15
2285bf9d
RS
2380 "*Portion of a header title line height to insert.
2381The insertion is done between the header frame and the text it contains,
2382both in the vertical and horizontal directions."
e0af0d3e 2383 :type 'number
b6d0ac87 2384 :version "20"
e0af0d3e 2385 :group 'ps-print-vertical)
bcc0d457 2386
319acba0
GM
2387(defcustom ps-footer-offset (/ (* 72 1.0) 2.54) ; 1.0 cm
2388 "*Vertical space in points (1/72 inch) between the main text and the footer."
2389 :type 'number
b6d0ac87 2390 :version "20"
319acba0
GM
2391 :group 'ps-print-vertical)
2392
2393(defcustom ps-footer-line-pad 0.15
2285bf9d
RS
2394 "*Portion of a footer title line height to insert.
2395The insertion is done between the footer frame and the text it contains,
2396both in the vertical and horizontal directions."
319acba0 2397 :type 'number
b6d0ac87 2398 :version "20"
319acba0
GM
2399 :group 'ps-print-vertical)
2400
2401;;; Header/Footer setup
12d89a2e 2402
e0af0d3e 2403(defcustom ps-print-header t
86c10ecb 2404 "*Non-nil means print a header at the top of each page.
319acba0
GM
2405By default, the header displays the buffer name, page number, and, if the
2406buffer is visiting a file, the file's directory. Headers are customizable by
2407changing variables `ps-left-header' and `ps-right-header'."
12b88fff 2408 :type 'boolean
b6d0ac87 2409 :version "20"
6e1b1da6 2410 :group 'ps-print-headers)
12b88fff 2411
e0af0d3e
RS
2412(defcustom ps-print-header-frame t
2413 "*Non-nil means draw a gaudy frame around the header."
2414 :type 'boolean
b6d0ac87 2415 :version "20"
6e1b1da6 2416 :group 'ps-print-headers)
e0af0d3e 2417
319acba0 2418(defcustom ps-header-frame-alist
efa89c1f 2419 '((fore-color . 0.0)
319acba0
GM
2420 (back-color . 0.9)
2421 (border-width . 0.4)
efa89c1f
GM
2422 (border-color . 0.0)
2423 (shadow-color . 0.0))
319acba0
GM
2424 "*Specify header frame properties alist.
2425
2426Valid frame properties are:
2427
2428 `fore-color' Specify the foreground frame color.
2429 It should be a float number between 0.0 (black color)
2430 and 1.0 (white color), a string which is a color name,
2431 or a list of 3 float numbers which corresponds to the
2432 Red Green Blue color scale, each float number between
2433 0.0 (dark color) and 1.0 (bright color).
2434
2435 `back-color' Specify the background frame color (similar to
2436 `fore-color').
2437
2438 `shadow-color' Specify the shadow color (similar to `fore-color').
2439
2440 `border-color' Specify the border color (similar to `fore-color').
2441
2442 `border-width' Specify the border width.
2443
2444Any other property is ignored.
2445
2446Don't change this alist directly, instead use customization, or `ps-value',
2447`ps-get', `ps-put' and `ps-del' functions (see them for documentation)."
2448 :version "21.1"
2449 :type '(repeat
2450 (choice :menu-tag "Header Frame Element"
2451 :tag ""
2452 (cons :tag "Foreground Color" :format "%v"
2453 (const :format "" fore-color)
2454 (choice :menu-tag "Foreground Color"
2455 :tag "Foreground Color"
efa89c1f 2456 (number :tag "Gray Scale" :value 0.0)
319acba0 2457 (string :tag "Color Name" :value "black")
efa89c1f 2458 (list :tag "RGB Color" :value (0.0 0.0 0.0)
319acba0
GM
2459 (number :tag "Red")
2460 (number :tag "Green")
2461 (number :tag "Blue"))))
2462 (cons :tag "Background Color" :format "%v"
2463 (const :format "" back-color)
2464 (choice :menu-tag "Background Color"
2465 :tag "Background Color"
2466 (number :tag "Gray Scale" :value 0.9)
2467 (string :tag "Color Name" :value "gray90")
2468 (list :tag "RGB Color" :value (0.9 0.9 0.9)
2469 (number :tag "Red")
2470 (number :tag "Green")
2471 (number :tag "Blue"))))
2472 (cons :tag "Border Width" :format "%v"
2473 (const :format "" border-width)
2474 (number :tag "Border Width" :value 0.4))
2475 (cons :tag "Border Color" :format "%v"
2476 (const :format "" border-color)
2477 (choice :menu-tag "Border Color"
2478 :tag "Border Color"
efa89c1f 2479 (number :tag "Gray Scale" :value 0.0)
319acba0 2480 (string :tag "Color Name" :value "black")
efa89c1f 2481 (list :tag "RGB Color" :value (0.0 0.0 0.0)
319acba0
GM
2482 (number :tag "Red")
2483 (number :tag "Green")
2484 (number :tag "Blue"))))
2485 (cons :tag "Shadow Color" :format "%v"
2486 (const :format "" shadow-color)
2487 (choice :menu-tag "Shadow Color"
2488 :tag "Shadow Color"
efa89c1f 2489 (number :tag "Gray Scale" :value 0.0)
319acba0 2490 (string :tag "Color Name" :value "black")
efa89c1f 2491 (list :tag "RGB Color" :value (0.0 0.0 0.0)
319acba0
GM
2492 (number :tag "Red")
2493 (number :tag "Green")
2494 (number :tag "Blue"))))))
b6d0ac87 2495 :version "20"
319acba0
GM
2496 :group 'ps-print-headers)
2497
e0af0d3e 2498(defcustom ps-header-lines 2
8bd22fcf 2499 "*Number of lines to display in page header, when generating PostScript."
e0af0d3e 2500 :type 'integer
b6d0ac87 2501 :version "20"
6e1b1da6 2502 :group 'ps-print-headers)
bcc0d457 2503
319acba0
GM
2504(defcustom ps-print-footer nil
2505 "*Non-nil means print a footer at the bottom of each page.
2506By default, the footer displays page number.
2507Footers are customizable by changing variables `ps-left-footer' and
2508`ps-right-footer'."
319acba0 2509 :type 'boolean
b6d0ac87 2510 :version "21.1"
319acba0
GM
2511 :group 'ps-print-headers)
2512
2513(defcustom ps-print-footer-frame t
2514 "*Non-nil means draw a gaudy frame around the footer."
319acba0 2515 :type 'boolean
b6d0ac87 2516 :version "21.1"
319acba0
GM
2517 :group 'ps-print-headers)
2518
2519(defcustom ps-footer-frame-alist
efa89c1f 2520 '((fore-color . 0.0)
319acba0
GM
2521 (back-color . 0.9)
2522 (border-width . 0.4)
efa89c1f
GM
2523 (border-color . 0.0)
2524 (shadow-color . 0.0))
319acba0
GM
2525 "*Specify footer frame properties alist.
2526
2527Don't change this alist directly, instead use customization, or `ps-value',
2528`ps-get', `ps-put' and `ps-del' functions (see them for documentation).
2529
2530See also `ps-header-frame-alist' for documentation."
319acba0
GM
2531 :type '(repeat
2532 (choice :menu-tag "Header Frame Element"
2533 :tag ""
2534 (cons :tag "Foreground Color" :format "%v"
2535 (const :format "" fore-color)
2536 (choice :menu-tag "Foreground Color"
2537 :tag "Foreground Color"
efa89c1f 2538 (number :tag "Gray Scale" :value 0.0)
319acba0 2539 (string :tag "Color Name" :value "black")
efa89c1f 2540 (list :tag "RGB Color" :value (0.0 0.0 0.0)
319acba0
GM
2541 (number :tag "Red")
2542 (number :tag "Green")
2543 (number :tag "Blue"))))
2544 (cons :tag "Background Color" :format "%v"
2545 (const :format "" back-color)
2546 (choice :menu-tag "Background Color"
2547 :tag "Background Color"
2548 (number :tag "Gray Scale" :value 0.9)
2549 (string :tag "Color Name" :value "gray90")
2550 (list :tag "RGB Color" :value (0.9 0.9 0.9)
2551 (number :tag "Red")
2552 (number :tag "Green")
2553 (number :tag "Blue"))))
2554 (cons :tag "Border Width" :format "%v"
2555 (const :format "" border-width)
2556 (number :tag "Border Width" :value 0.4))
2557 (cons :tag "Border Color" :format "%v"
2558 (const :format "" border-color)
2559 (choice :menu-tag "Border Color"
2560 :tag "Border Color"
efa89c1f 2561 (number :tag "Gray Scale" :value 0.0)
319acba0 2562 (string :tag "Color Name" :value "black")
efa89c1f 2563 (list :tag "RGB Color" :value (0.0 0.0 0.0)
319acba0
GM
2564 (number :tag "Red")
2565 (number :tag "Green")
2566 (number :tag "Blue"))))
2567 (cons :tag "Shadow Color" :format "%v"
2568 (const :format "" shadow-color)
2569 (choice :menu-tag "Shadow Color"
2570 :tag "Shadow Color"
efa89c1f 2571 (number :tag "Gray Scale" :value 0.0)
319acba0 2572 (string :tag "Color Name" :value "black")
efa89c1f 2573 (list :tag "RGB Color" :value (0.0 0.0 0.0)
319acba0
GM
2574 (number :tag "Red")
2575 (number :tag "Green")
2576 (number :tag "Blue"))))))
b6d0ac87 2577 :version "21.1"
319acba0
GM
2578 :group 'ps-print-headers)
2579
2580(defcustom ps-footer-lines 2
2581 "*Number of lines to display in page footer, when generating PostScript."
319acba0 2582 :type 'integer
b6d0ac87 2583 :version "21.1"
319acba0
GM
2584 :group 'ps-print-headers)
2585
2586(defcustom ps-print-only-one-header nil
2587 "*Non-nil means print only one header/footer at the top/bottom of each page.
2588This is useful when printing more than one column, so it is possible to have
2589only one header/footer over all columns or one header/footer per column.
2590See also `ps-print-header' and `ps-print-footer'."
2591 :type 'boolean
b6d0ac87 2592 :version "20"
319acba0
GM
2593 :group 'ps-print-headers)
2594
8e234846 2595(defcustom ps-switch-header 'duplex
319acba0 2596 "*Specify if headers/footers are switched or not.
8e234846
GM
2597
2598Valid values are:
2599
319acba0 2600nil Never switch headers/footers.
8e234846 2601
319acba0 2602t Always switch headers/footers.
8e234846 2603
319acba0 2604duplex Switch headers/footers only when duplexing is on, that is, when
8e234846
GM
2605 `ps-spool-duplex' is non-nil.
2606
319acba0
GM
2607Any other value is treated as t.
2608
2609See also `ps-print-header' and `ps-print-footer'."
2610 :type '(choice :menu-tag "Switch Header/Footer"
2611 :tag "Switch Header/Footer"
8e234846
GM
2612 (const :tag "Never Switch" nil)
2613 (const :tag "Always Switch" t)
2614 (const :tag "Switch When Duplexing" duplex))
b6d0ac87 2615 :version "20"
8e234846
GM
2616 :group 'ps-print-headers)
2617
e0af0d3e 2618(defcustom ps-show-n-of-n t
00aa16af 2619 "*Non-nil means show page numbers as N/M, meaning page N of M.
8bd22fcf 2620NOTE: page numbers are displayed as part of headers,
6e1b1da6 2621 see variable `ps-print-header'."
e0af0d3e 2622 :type 'boolean
b6d0ac87 2623 :version "20"
6e1b1da6 2624 :group 'ps-print-headers)
12d89a2e 2625
edc9cd35 2626(defcustom ps-spool-config
906d41a7 2627 (if ps-windows-system
edc9cd35
GM
2628 nil
2629 'lpr-switches)
319acba0 2630 "*Specify who is responsible for setting duplex and page size.
bc0d41bd
KH
2631
2632Valid values are:
2633
2634 `lpr-switches' duplex and page size are configured by `ps-lpr-switches'.
2635 Don't forget to set `ps-lpr-switches' to select duplex
2636 printing for your printer.
2637
2638 `setpagedevice' duplex and page size are configured by ps-print using the
2639 setpagedevice PostScript operator.
2640
2641 nil duplex and page size are configured by ps-print *not* using
2642 the setpagedevice PostScript operator.
2643
2644Any other value is treated as nil.
2645
2646WARNING: The setpagedevice PostScript operator affects ghostview utility when
2647 viewing file generated using landscape. Also on some printers,
2648 setpagedevice affects zebra stripes; on other printers, setpagedevice
2649 affects the left margin.
2650 Besides all that, if your printer does not have the paper size
2651 specified by setpagedevice, your printing will be aborted.
2652 So, if you need to use setpagedevice, set `ps-spool-config' to
2653 `setpagedevice', generate a test file and send it to your printer; if
2285bf9d 2654 the printed file isn't OK, set `ps-spool-config' to nil."
8e234846
GM
2655 :type '(choice :menu-tag "Spool Config"
2656 :tag "Spool Config"
bc0d41bd 2657 (const lpr-switches) (const setpagedevice)
edc9cd35 2658 (const :tag "nil" nil))
b6d0ac87 2659 :version "20"
6e1b1da6 2660 :group 'ps-print-headers)
bc0d41bd
KH
2661
2662(defcustom ps-spool-duplex nil ; Not many people have duplex printers,
2663 ; so default to nil.
2664 "*Non-nil generates PostScript for a two-sided printer.
2665For a duplex printer, the `ps-spool-*' and `ps-print-*' commands will insert
2666blank pages as needed between print jobs so that the next buffer printed will
2667start on the right page. Also, if headers are turned on, the headers will be
2668reversed on duplex printers so that the page numbers fall to the left on
0a5daee5
KH
2669even-numbered pages.
2670
2671See also `ps-spool-tumble'."
bc0d41bd 2672 :type 'boolean
b6d0ac87 2673 :version "20"
6e1b1da6 2674 :group 'ps-print-headers)
bc0d41bd
KH
2675
2676(defcustom ps-spool-tumble nil
2677 "*Specify how the page images on opposite sides of a sheet are oriented.
319acba0
GM
2678If `ps-spool-tumble' is nil, produces output suitable for binding on the left
2679or right. If `ps-spool-tumble' is non-nil, produces output suitable for
2680binding at the top or bottom.
bc0d41bd
KH
2681
2682It has effect only when `ps-spool-duplex' is non-nil."
e0af0d3e 2683 :type 'boolean
b6d0ac87 2684 :version "20"
6e1b1da6 2685 :group 'ps-print-headers)
bcc0d457
RS
2686
2687;;; Fonts
2688
e0af0d3e 2689(defcustom ps-font-info-database
bcc0d457 2690 '((Courier ; the family key
12b88fff
RS
2691 (fonts (normal . "Courier")
2692 (bold . "Courier-Bold")
2693 (italic . "Courier-Oblique")
2694 (bold-italic . "Courier-BoldOblique"))
2695 (size . 10.0)
2696 (line-height . 10.55)
2697 (space-width . 6.0)
2698 (avg-char-width . 6.0))
bcc0d457 2699 (Helvetica ; the family key
12b88fff
RS
2700 (fonts (normal . "Helvetica")
2701 (bold . "Helvetica-Bold")
2702 (italic . "Helvetica-Oblique")
2703 (bold-italic . "Helvetica-BoldOblique"))
2704 (size . 10.0)
2705 (line-height . 11.56)
2706 (space-width . 2.78)
2707 (avg-char-width . 5.09243))
bcc0d457 2708 (Times
12b88fff
RS
2709 (fonts (normal . "Times-Roman")
2710 (bold . "Times-Bold")
2711 (italic . "Times-Italic")
2712 (bold-italic . "Times-BoldItalic"))
2713 (size . 10.0)
2714 (line-height . 11.0)
2715 (space-width . 2.5)
334cc3b7 2716 (avg-char-width . 4.71432))
bcc0d457 2717 (Palatino
12b88fff
RS
2718 (fonts (normal . "Palatino-Roman")
2719 (bold . "Palatino-Bold")
2720 (italic . "Palatino-Italic")
2721 (bold-italic . "Palatino-BoldItalic"))
2722 (size . 10.0)
2723 (line-height . 12.1)
2724 (space-width . 2.5)
2725 (avg-char-width . 5.08676))
bcc0d457 2726 (Helvetica-Narrow
12b88fff
RS
2727 (fonts (normal . "Helvetica-Narrow")
2728 (bold . "Helvetica-Narrow-Bold")
2729 (italic . "Helvetica-Narrow-Oblique")
2730 (bold-italic . "Helvetica-Narrow-BoldOblique"))
2731 (size . 10.0)
2732 (line-height . 11.56)
2733 (space-width . 2.2796)
2734 (avg-char-width . 4.17579))
bcc0d457 2735 (NewCenturySchlbk
12b88fff
RS
2736 (fonts (normal . "NewCenturySchlbk-Roman")
2737 (bold . "NewCenturySchlbk-Bold")
2738 (italic . "NewCenturySchlbk-Italic")
2739 (bold-italic . "NewCenturySchlbk-BoldItalic"))
2740 (size . 10.0)
334cc3b7 2741 (line-height . 12.15)
12b88fff
RS
2742 (space-width . 2.78)
2743 (avg-char-width . 5.31162))
bcc0d457
RS
2744 ;; got no bold for the next ones
2745 (AvantGarde-Book
12b88fff
RS
2746 (fonts (normal . "AvantGarde-Book")
2747 (italic . "AvantGarde-BookOblique"))
2748 (size . 10.0)
2749 (line-height . 11.77)
2750 (space-width . 2.77)
2751 (avg-char-width . 5.45189))
bcc0d457 2752 (AvantGarde-Demi
12b88fff
RS
2753 (fonts (normal . "AvantGarde-Demi")
2754 (italic . "AvantGarde-DemiOblique"))
2755 (size . 10.0)
2756 (line-height . 12.72)
2757 (space-width . 2.8)
2758 (avg-char-width . 5.51351))
bcc0d457 2759 (Bookman-Demi
12b88fff
RS
2760 (fonts (normal . "Bookman-Demi")
2761 (italic . "Bookman-DemiItalic"))
2762 (size . 10.0)
2763 (line-height . 11.77)
2764 (space-width . 3.4)
2765 (avg-char-width . 6.05946))
bcc0d457 2766 (Bookman-Light
12b88fff
RS
2767 (fonts (normal . "Bookman-Light")
2768 (italic . "Bookman-LightItalic"))
2769 (size . 10.0)
2770 (line-height . 11.79)
2771 (space-width . 3.2)
2772 (avg-char-width . 5.67027))
bcc0d457
RS
2773 ;; got no bold and no italic for the next ones
2774 (Symbol
12b88fff
RS
2775 (fonts (normal . "Symbol"))
2776 (size . 10.0)
2777 (line-height . 13.03)
2778 (space-width . 2.5)
2779 (avg-char-width . 3.24324))
bcc0d457 2780 (Zapf-Dingbats
12b88fff
RS
2781 (fonts (normal . "Zapf-Dingbats"))
2782 (size . 10.0)
2783 (line-height . 9.63)
2784 (space-width . 2.78)
2785 (avg-char-width . 2.78))
92dc83a9
KH
2786 (ZapfChancery-MediumItalic
2787 (fonts (normal . "ZapfChancery-MediumItalic"))
2788 (size . 10.0)
2789 (line-height . 11.45)
2790 (space-width . 2.2)
2791 (avg-char-width . 4.10811))
2792 ;; We keep this wrong entry name (but with correct font name) for
2793 ;; backward compatibility.
bcc0d457 2794 (Zapf-Chancery-MediumItalic
92dc83a9 2795 (fonts (normal . "ZapfChancery-MediumItalic"))
12b88fff
RS
2796 (size . 10.0)
2797 (line-height . 11.45)
2798 (space-width . 2.2)
2799 (avg-char-width . 4.10811))
87a16a06 2800 )
2285bf9d
RS
2801 "*Font info database.
2802Each element comprises: font family (the key), name, bold, italic, bold-italic,
bcc0d457
RS
2803reference size, line height, space width, average character width.
2804To get the info for another specific font (say Helvetica), do the following:
2805- create a new buffer
2806- generate the PostScript image to a file (C-u M-x ps-print-buffer)
319acba0
GM
2807- open this file and delete the leading `%' (which is the PostScript comment
2808 character) from the line
1fd9b7fe 2809 `% 3 cm 20 cm moveto 10/Courier ReportFontInfo showpage'
bcc0d457 2810 to get the line
1fd9b7fe 2811 `3 cm 20 cm moveto 10/Helvetica ReportFontInfo showpage'
bcc0d457 2812- add the values to `ps-font-info-database'.
c3d6d211
GM
2813You can get all the fonts of YOUR printer using `ReportAllFontInfo'.
2814
319acba0
GM
2815Note also that ps-print DOESN'T download any font to your printer, instead it
2816uses the fonts resident in your printer."
ef1159c2
EZ
2817 :type '(repeat
2818 (list :tag "Font Definition"
2819 (symbol :tag "Font Family")
2820 (cons :format "%v"
2821 (const :format "" fonts)
2822 (repeat :tag "Faces"
2823 (cons (choice :menu-tag "Font Weight/Slant"
2824 :tag "Font Weight/Slant"
2825 (const normal)
2826 (const bold)
2827 (const italic)
2828 (const bold-italic)
2829 (symbol :tag "Face"))
2830 (string :tag "Font Name"))))
2831 (cons :format "%v"
2832 (const :format "" size)
2833 (number :tag "Reference Size"))
2834 (cons :format "%v"
2835 (const :format "" line-height)
2836 (number :tag "Line Height"))
2837 (cons :format "%v"
2838 (const :format "" space-width)
2839 (number :tag "Space Width"))
2840 (cons :format "%v"
2841 (const :format "" avg-char-width)
2842 (number :tag "Average Character Width"))))
b6d0ac87 2843 :version "20"
e0af0d3e
RS
2844 :group 'ps-print-font)
2845
2846(defcustom ps-font-family 'Courier
d3ab8dac 2847 "*Font family name for ordinary text, when generating PostScript."
e0af0d3e 2848 :type 'symbol
b6d0ac87 2849 :version "20"
e0af0d3e
RS
2850 :group 'ps-print-font)
2851
7d8b7e8e 2852(defcustom ps-font-size '(7 . 8.5)
44a0e586
GM
2853 "*Font size, in points, for ordinary text, when generating PostScript.
2854Either a float or a cons of floats (LANDSCAPE-SIZE . PORTRAIT-SIZE)."
ef1159c2
EZ
2855 :type '(choice :menu-tag "Ordinary Text Font Size"
2856 :tag "Ordinary Text Font Size"
2857 (number :tag "Text Size")
7d8b7e8e
KH
2858 (cons :tag "Landscape/Portrait"
2859 (number :tag "Landscape Text Size")
2860 (number :tag "Portrait Text Size")))
b6d0ac87 2861 :version "20"
e0af0d3e
RS
2862 :group 'ps-print-font)
2863
2864(defcustom ps-header-font-family 'Helvetica
d3ab8dac 2865 "*Font family name for text in the header, when generating PostScript."
e0af0d3e 2866 :type 'symbol
b6d0ac87 2867 :version "20"
e0af0d3e
RS
2868 :group 'ps-print-font)
2869
7d8b7e8e 2870(defcustom ps-header-font-size '(10 . 12)
76fd0079
VJL
2871 "*Font size, in points, for text in the header, when generating PostScript.
2872Either a float or a cons of floats (LANDSCAPE-SIZE . PORTRAIT-SIZE)."
ef1159c2
EZ
2873 :type '(choice :menu-tag "Header Font Size"
2874 :tag "Header Font Size"
2875 (number :tag "Header Size")
7d8b7e8e
KH
2876 (cons :tag "Landscape/Portrait"
2877 (number :tag "Landscape Header Size")
2878 (number :tag "Portrait Header Size")))
b6d0ac87 2879 :version "20"
e0af0d3e
RS
2880 :group 'ps-print-font)
2881
7d8b7e8e 2882(defcustom ps-header-title-font-size '(12 . 14)
76fd0079
VJL
2883 "*Font size, in points, for the top line of text in header, in PostScript.
2884Either a float or a cons of floats (LANDSCAPE-SIZE . PORTRAIT-SIZE)."
ef1159c2
EZ
2885 :type '(choice :menu-tag "Header Title Font Size"
2886 :tag "Header Title Font Size"
2887 (number :tag "Header Title Size")
7d8b7e8e
KH
2888 (cons :tag "Landscape/Portrait"
2889 (number :tag "Landscape Header Title Size")
2890 (number :tag "Portrait Header Title Size")))
b6d0ac87 2891 :version "20"
e0af0d3e 2892 :group 'ps-print-font)
bcc0d457 2893
319acba0
GM
2894(defcustom ps-footer-font-family 'Helvetica
2895 "*Font family name for text in the footer, when generating PostScript."
319acba0 2896 :type 'symbol
b6d0ac87 2897 :version "21.1"
319acba0
GM
2898 :group 'ps-print-font)
2899
2900(defcustom ps-footer-font-size '(10 . 12)
76fd0079
VJL
2901 "*Font size, in points, for text in the footer, when generating PostScript.
2902Either a float or a cons of floats (LANDSCAPE-SIZE . PORTRAIT-SIZE)."
319acba0
GM
2903 :type '(choice :menu-tag "Footer Font Size"
2904 :tag "Footer Font Size"
2905 (number :tag "Footer Size")
2906 (cons :tag "Landscape/Portrait"
2907 (number :tag "Landscape Footer Size")
2908 (number :tag "Portrait Footer Size")))
b6d0ac87 2909 :version "21.1"
319acba0
GM
2910 :group 'ps-print-font)
2911
2912(defcustom ps-line-number-color "black"
2913 "*Specify color for line-number, when generating PostScript."
2914 :type '(choice :menu-tag "Line Number Color"
2915 :tag "Line Number Color"
2916 (number :tag "Gray Scale" :value 0)
2917 (string :tag "Color Name" :value "black")
2918 (list :tag "RGB Color" :value (0 0 0)
2919 (number :tag "Red")
2920 (number :tag "Green")
2921 (number :tag "Blue")))
2922 :version "21.1"
2923 :group 'ps-print-font
2924 :group 'ps-print-miscellany)
2925
ef1159c2
EZ
2926(defcustom ps-line-number-font "Times-Italic"
2927 "*Font for line-number, when generating PostScript."
2928 :type 'string
b6d0ac87 2929 :version "20"
ef1159c2
EZ
2930 :group 'ps-print-font
2931 :group 'ps-print-miscellany)
2932
2933(defcustom ps-line-number-font-size 6
76fd0079
VJL
2934 "*Font size, in points, for line number, when generating PostScript.
2935Either a float or a cons of floats (LANDSCAPE-SIZE . PORTRAIT-SIZE)."
ef1159c2
EZ
2936 :type '(choice :menu-tag "Line Number Font Size"
2937 :tag "Line Number Font Size"
2938 (number :tag "Font Size")
2939 (cons :tag "Landscape/Portrait"
2940 (number :tag "Landscape Font Size")
2941 (number :tag "Portrait Font Size")))
b6d0ac87 2942 :version "20"
ef1159c2
EZ
2943 :group 'ps-print-font
2944 :group 'ps-print-miscellany)
2945
bcc0d457
RS
2946;;; Colors
2947
87a16a06 2948;; Printing color requires x-color-values.
c90a10fa
RS
2949;; XEmacs change: Need autoload for the "Options->Printing->Color Printing"
2950;; widget to work.
2951;;;###autoload
ea0c615d 2952(defcustom ps-print-color-p
509b4dbc 2953 (or (fboundp 'x-color-values) ; Emacs
ea0c615d 2954 (fboundp 'color-instance-rgb-components))
857686a6 2955 ; XEmacs
55732434
GM
2956 "*Specify how buffer's text color is printed.
2957
2958Valid values are:
2959
2960 nil Do not print colors.
2961
2962 t Print colors.
2963
2964 black-white Print colors on black/white printer.
2965 See also `ps-black-white-faces'.
2966
2967Any other value is treated as t."
2968 :type '(choice :menu-tag "Print Color"
2969 :tag "Print Color"
2970 (const :tag "Do NOT Print Color" nil)
2971 (const :tag "Print Always Color" t)
2972 (const :tag "Print Black/White Color" black-white))
b6d0ac87 2973 :version "20"
e0af0d3e 2974 :group 'ps-print-color)
12d89a2e 2975
3f0257cb 2976(defcustom ps-default-fg nil
c1a1c994 2977 "*RGB values of the default foreground color.
e59d29d6
VJL
2978
2979The `ps-default-fg' variable contains the default foreground color used by
2980ps-print, that is, if there is a face in a text that doesn't have a foreground
2981color, the `ps-default-fg' color should be used.
2982
2983Valid values are:
2984
2985 t The foreground color of Emacs session will be used.
2986
c1a1c994
VJL
2987 frame-parameter The foreground-color frame parameter will be used.
2988
e59d29d6
VJL
2989 NUMBER It's a real value between 0.0 (black) and 1.0 (white) that
2990 indicate the gray color.
2991
640477ee 2992 COLOR-NAME It's a string which contains the color name. For example:
e59d29d6
VJL
2993 \"yellow\".
2994
2995 LIST It's a list of RGB values, that is a list of three real values
2996 of the form:
2997
ccae01a6 2998 (RED GREEN BLUE)
e59d29d6
VJL
2999
3000 Where RED, GREEN and BLUE are reals between 0.0 (no color) and
3001 1.0 (full color).
3002
c1a1c994 3003Any other value is ignored and black color will be used.
e59d29d6 3004
d3509e50
VJL
3005This variable is used only when `ps-print-color-p' (which see) is neither nil
3006nor black-white."
8e234846
GM
3007 :type '(choice :menu-tag "Default Foreground Gray/Color"
3008 :tag "Default Foreground Gray/Color"
c794a94d 3009 (const :tag "Session Foreground" t)
c1a1c994 3010 (const :tag "Frame Foreground" frame-parameter)
6e1b1da6
GM
3011 (number :tag "Gray Scale" :value 0.0)
3012 (string :tag "Color Name" :value "black")
3013 (list :tag "RGB Color" :value (0.0 0.0 0.0)
3014 (number :tag "Red")
3015 (number :tag "Green")
3016 (number :tag "Blue")))
b6d0ac87 3017 :version "20"
e0af0d3e 3018 :group 'ps-print-color)
12d89a2e 3019
3f0257cb 3020(defcustom ps-default-bg nil
c1a1c994 3021 "*RGB values of the default background color.
e59d29d6
VJL
3022
3023The `ps-default-bg' variable contains the default background color used by
3024ps-print, that is, if there is a face in a text that doesn't have a background
3025color, the `ps-default-bg' color should be used.
3026
3027Valid values are:
3028
3029 t The background color of Emacs session will be used.
3030
c1a1c994
VJL
3031 frame-parameter The background-color frame parameter will be used.
3032
e59d29d6
VJL
3033 NUMBER It's a real value between 0.0 (black) and 1.0 (white) that
3034 indicate the gray color.
3035
640477ee 3036 COLOR-NAME It's a string which contains the color name. For example:
e59d29d6
VJL
3037 \"yellow\".
3038
3039 LIST It's a list of RGB values, that is a list of three real values
3040 of the form:
3041
ccae01a6 3042 (RED GREEN BLUE)
e59d29d6
VJL
3043
3044 Where RED, GREEN and BLUE are reals between 0.0 (no color) and
3045 1.0 (full color).
3046
c1a1c994 3047Any other value is ignored and white color will be used.
e59d29d6 3048
d3509e50
VJL
3049This variable is used only when `ps-print-color-p' (which see) is neither nil
3050nor black-white.
e59d29d6
VJL
3051
3052See also `ps-use-face-background'."
8e234846
GM
3053 :type '(choice :menu-tag "Default Background Gray/Color"
3054 :tag "Default Background Gray/Color"
c794a94d 3055 (const :tag "Session Background" t)
c1a1c994 3056 (const :tag "Frame Background" frame-parameter)
6e1b1da6
GM
3057 (number :tag "Gray Scale" :value 1.0)
3058 (string :tag "Color Name" :value "white")
3059 (list :tag "RGB Color" :value (1.0 1.0 1.0)
3060 (number :tag "Red")
3061 (number :tag "Green")
3062 (number :tag "Blue")))
b6d0ac87 3063 :version "20"
e0af0d3e 3064 :group 'ps-print-color)
12d89a2e 3065
ccae01a6
VJL
3066(defcustom ps-fg-list nil
3067 "*Specify foreground color list.
3068
3069This list is used to chose a text foreground color which is different than the
3070background color. It'll be used the first foreground color in `ps-fg-list'
3071which is different from the background color.
3072
3073If this list is nil, the default foreground color is used. See
3074`ps-default-fg'.
3075
3076The list element valid values are:
3077
3078 NUMBER It's a real value between 0.0 (black) and 1.0 (white) that
3079 indicate the gray color.
3080
3081 COLOR-NAME It's a string which contains the color name. For example:
3082 \"yellow\".
3083
3084 LIST It's a list of RGB values, that is a list of three real values
3085 of the form:
3086
3087 (RED GREEN BLUE)
3088
3089 Where RED, GREEN and BLUE are reals between 0.0 (no color) and
3090 1.0 (full color).
3091
3092Any other value is ignored and black color will be used.
3093
3094This variable is used only when `ps-fg-validate-p' (which see) is non-nil and
3095when `ps-print-color-p' (which see) is neither nil nor black-white."
3096 :type '(repeat
3097 (choice :menu-tag "Foreground Gray/Color"
3098 :tag "Foreground Gray/Color"
3099 (number :tag "Gray Scale" :value 0.0)
3100 (string :tag "Color Name" :value "black")
3101 (list :tag "RGB Color" :value (0.0 0.0 0.0)
3102 (number :tag "Red")
3103 (number :tag "Green")
3104 (number :tag "Blue"))))
3105 :version "22"
3106 :group 'ps-print-color)
3107
3108(defcustom ps-fg-validate-p t
3109 "*Non-nil means validate if foreground color is different than background.
3110
3111If text foreground and background colors are equals, no text will appear.
3112
3113See also `ps-fg-list'."
3114 :type 'boolean
3115 :version "22"
3116 :group 'ps-print-color)
3117
e0af0d3e 3118(defcustom ps-auto-font-detect t
df5e6194 3119 "*Non-nil means automatically detect bold/italic/underline face attributes.
319acba0
GM
3120If nil, we rely solely on the lists `ps-bold-faces', `ps-italic-faces', and
3121`ps-underlined-faces'."
e0af0d3e 3122 :type 'boolean
b6d0ac87 3123 :version "20"
e0af0d3e 3124 :group 'ps-print-font)
12d89a2e 3125
55732434
GM
3126(defcustom ps-black-white-faces
3127 '((font-lock-builtin-face "black" nil bold )
3128 (font-lock-comment-face "gray20" nil italic)
3129 (font-lock-constant-face "black" nil bold )
3130 (font-lock-function-name-face "black" nil bold )
3131 (font-lock-keyword-face "black" nil bold )
3132 (font-lock-string-face "black" nil italic)
3133 (font-lock-type-face "black" nil italic)
3134 (font-lock-variable-name-face "black" nil bold italic)
3135 (font-lock-warning-face "black" nil bold italic))
3136 "*Specify list of face attributes to print colors on black/white printers.
3137
3138The list elements are the same as defined on `ps-extend-face' (which see).
3139
3140This variable is used only when `ps-print-color-p' is set to `black-white'."
3141 :version "21.1"
3142 :type '(repeat
3143 (list :tag "Face Specification"
3144 (face :tag "Face Symbol")
3145 (choice :menu-tag "Foreground Color"
3146 :tag "Foreground Color"
3147 (const :tag "Black" nil)
3148 (string :tag "Color Name"))
3149 (choice :menu-tag "Background Color"
3150 :tag "Background Color"
3151 (const :tag "None" nil)
3152 (string :tag "Color Name"))
3153 (repeat :inline t
3154 (choice :menu-tag "Attribute"
3155 (const bold)
3156 (const italic)
3157 (const underline)
3158 (const strikeout)
3159 (const overline)
3160 (const shadow)
3161 (const box)
3162 (const outline)))))
b6d0ac87 3163 :version "20"
55732434
GM
3164 :group 'ps-print-face)
3165
e0af0d3e 3166(defcustom ps-bold-faces
090be653
RS
3167 (unless ps-print-color-p
3168 '(font-lock-function-name-face
3169 font-lock-builtin-face
3170 font-lock-variable-name-face
3171 font-lock-keyword-face
3172 font-lock-warning-face))
86c10ecb 3173 "*A list of the \(non-bold\) faces that should be printed in bold font.
8bd22fcf 3174This applies to generating PostScript."
e0af0d3e 3175 :type '(repeat face)
b6d0ac87 3176 :version "20"
e0af0d3e 3177 :group 'ps-print-face)
12d89a2e 3178
e0af0d3e 3179(defcustom ps-italic-faces
090be653
RS
3180 (unless ps-print-color-p
3181 '(font-lock-variable-name-face
8bd22fcf 3182 font-lock-type-face
090be653
RS
3183 font-lock-string-face
3184 font-lock-comment-face
3185 font-lock-warning-face))
86c10ecb 3186 "*A list of the \(non-italic\) faces that should be printed in italic font.
8bd22fcf 3187This applies to generating PostScript."
e0af0d3e 3188 :type '(repeat face)
b6d0ac87 3189 :version "20"
e0af0d3e 3190 :group 'ps-print-face)
12d89a2e 3191
e0af0d3e 3192(defcustom ps-underlined-faces
090be653
RS
3193 (unless ps-print-color-p
3194 '(font-lock-function-name-face
883212ce 3195 font-lock-constant-face
090be653 3196 font-lock-warning-face))
86c10ecb 3197 "*A list of the \(non-underlined\) faces that should be printed underlined.
8bd22fcf 3198This applies to generating PostScript."
e0af0d3e 3199 :type '(repeat face)
b6d0ac87 3200 :version "20"
e0af0d3e 3201 :group 'ps-print-face)
12d89a2e 3202
906d41a7
GM
3203(defcustom ps-use-face-background nil
3204 "*Specify if face background should be used.
3205
3206Valid values are:
3207
3208 t always use face background color.
3209 nil never use face background color.
3210 (face...) list of faces whose background color will be used.
3211
3212Any other value will be treated as t."
8e234846
GM
3213 :type '(choice :menu-tag "Use Face Background"
3214 :tag "Use Face Background"
906d41a7
GM
3215 (const :tag "Always Use Face Background" t)
3216 (const :tag "Never Use Face Background" nil)
3217 (repeat :menu-tag "Face Background List"
3218 :tag "Face Background List"
3219 face))
b6d0ac87 3220 :version "20"
906d41a7
GM
3221 :group 'ps-print-face)
3222
e0af0d3e 3223(defcustom ps-left-header
12d89a2e 3224 (list 'ps-get-buffer-name 'ps-header-dirpart)
bcc0d457 3225 "*The items to display (each on a line) on the left part of the page header.
8bd22fcf 3226This applies to generating PostScript.
12d89a2e 3227
319acba0
GM
3228The value should be a list of strings and symbols, each representing an entry
3229in the PostScript array HeaderLinesLeft.
12d89a2e
RS
3230
3231Strings are inserted unchanged into the array; those representing
3232PostScript string literals should be delimited with PostScript string
3233delimiters '(' and ')'.
3234
319acba0
GM
3235For symbols with bound functions, the function is called and should return a
3236string to be inserted into the array. For symbols with bound values, the value
3237should be a string to be inserted into the array. In either case, function or
71efd3c4
VJL
3238variable, the string value has PostScript string delimiters added to it.
3239
3240If symbols are unbounded, they are silently ignored."
ef1159c2
EZ
3241 :type '(repeat (choice :menu-tag "Left Header"
3242 :tag "Left Header"
3243 string symbol))
b6d0ac87 3244 :version "20"
6e1b1da6 3245 :group 'ps-print-headers)
12d89a2e 3246
e0af0d3e 3247(defcustom ps-right-header
2bd80d73 3248 (list "/pagenumberstring load"
4b81a999 3249 'ps-time-stamp-locale-default 'ps-time-stamp-hh:mm:ss)
bcc0d457 3250 "*The items to display (each on a line) on the right part of the page header.
8bd22fcf 3251This applies to generating PostScript.
12d89a2e 3252
319acba0 3253See the variable `ps-left-header' for a description of the format of this
4b81a999
GM
3254variable.
3255
3256There are the following basic functions implemented:
3257
3258 `ps-time-stamp-locale-default' Return the locale's \"preferred\" date
3259 as, for example, \"06/18/01\".
3260
3261 `ps-time-stamp-hh:mm:ss' Return time as \"17:28:31\".
3262
3263 `ps-time-stamp-mon-dd-yyyy' Return date as \"Jun 18 2001\".
3264
71efd3c4
VJL
3265 `ps-time-stamp-yyyy-mm-dd' Return date as \"2001-06-18\" (ISO
3266 date).
3267
3268 `ps-time-stamp-iso8601' Alias for `ps-time-stamp-yyyy-mm-dd'.
3269
4b81a999 3270You can also create your own time stamp function by using `format-time-string'
2285bf9d 3271\(which see)."
ef1159c2
EZ
3272 :type '(repeat (choice :menu-tag "Right Header"
3273 :tag "Right Header"
3274 string symbol))
b6d0ac87 3275 :version "20"
6e1b1da6 3276 :group 'ps-print-headers)
ef2cbb24 3277
319acba0
GM
3278(defcustom ps-left-footer
3279 (list 'ps-get-buffer-name 'ps-header-dirpart)
3280 "*The items to display (each on a line) on the left part of the page footer.
3281This applies to generating PostScript.
3282
3283The value should be a list of strings and symbols, each representing an entry
3284in the PostScript array FooterLinesLeft.
3285
3286Strings are inserted unchanged into the array; those representing PostScript
3287string literals should be delimited with PostScript string delimiters '(' and
3288')'.
3289
3290For symbols with bound functions, the function is called and should return a
3291string to be inserted into the array. For symbols with bound values, the value
3292should be a string to be inserted into the array. In either case, function or
71efd3c4
VJL
3293variable, the string value has PostScript string delimiters added to it.
3294
3295If symbols are unbounded, they are silently ignored."
319acba0
GM
3296 :type '(repeat (choice :menu-tag "Left Footer"
3297 :tag "Left Footer"
3298 string symbol))
b6d0ac87 3299 :version "21.1"
319acba0
GM
3300 :group 'ps-print-headers)
3301
3302(defcustom ps-right-footer
3303 (list "/pagenumberstring load"
4b81a999 3304 'ps-time-stamp-locale-default 'ps-time-stamp-hh:mm:ss)
319acba0
GM
3305 "*The items to display (each on a line) on the right part of the page footer.
3306This applies to generating PostScript.
3307
3308See the variable `ps-left-footer' for a description of the format of this
4b81a999
GM
3309variable.
3310
3311There are the following basic functions implemented:
3312
3313 `ps-time-stamp-locale-default' Return the locale's \"preferred\" date
3314 as, for example, \"06/18/01\".
3315
3316 `ps-time-stamp-hh:mm:ss' Return time as \"17:28:31\".
3317
3318 `ps-time-stamp-mon-dd-yyyy' Return date as \"Jun 18 2001\".
3319
71efd3c4
VJL
3320 `ps-time-stamp-yyyy-mm-dd' Return date as \"2001-06-18\" (ISO
3321 date).
3322
3323 `ps-time-stamp-iso8601' Alias for `ps-time-stamp-yyyy-mm-dd'.
3324
4b81a999 3325You can also create your own time stamp function by using `format-time-string'
2285bf9d 3326\(which see)."
319acba0
GM
3327 :type '(repeat (choice :menu-tag "Right Footer"
3328 :tag "Right Footer"
3329 string symbol))
b6d0ac87 3330 :version "21.1"
319acba0
GM
3331 :group 'ps-print-headers)
3332
e0af0d3e
RS
3333(defcustom ps-razzle-dazzle t
3334 "*Non-nil means report progress while formatting buffer."
3335 :type 'boolean
b6d0ac87 3336 :version "20"
6e1b1da6 3337 :group 'ps-print-miscellany)
12d89a2e 3338
a18ed129 3339(defcustom ps-adobe-tag "%!PS-Adobe-3.0\n"
12d89a2e 3340 "*Contains the header line identifying the output as PostScript.
319acba0
GM
3341By default, `ps-adobe-tag' contains the standard identifier. Some printers
3342require slightly different versions of this line."
a18ed129 3343 :type 'string
b6d0ac87 3344 :version "20"
6e1b1da6 3345 :group 'ps-print-miscellany)
12d89a2e 3346
e0af0d3e 3347(defcustom ps-build-face-reference t
12d89a2e
RS
3348 "*Non-nil means build the reference face lists.
3349
319acba0 3350ps-print sets this value to nil after it builds its internal reference lists of
1b1200a1 3351bold and italic faces. By setting its value back to t, you can force ps-print
319acba0
GM
3352to rebuild the lists the next time you invoke one of the ...-with-faces
3353commands.
12d89a2e 3354
319acba0
GM
3355You should set this value back to t after you change the attributes of any
3356face, or create new faces. Most users shouldn't have to worry about its
3357setting, though."
e0af0d3e 3358 :type 'boolean
b6d0ac87 3359 :version "20"
e0af0d3e 3360 :group 'ps-print-face)
12d89a2e 3361
e0af0d3e 3362(defcustom ps-always-build-face-reference nil
12d89a2e
RS
3363 "*Non-nil means always rebuild the reference face lists.
3364
319acba0
GM
3365If this variable is non-nil, ps-print will rebuild its internal reference lists
3366of bold and italic faces *every* time one of the ...-with-faces commands is
3367called. Most users shouldn't need to set this variable."
e0af0d3e 3368 :type 'boolean
b6d0ac87 3369 :version "20"
e0af0d3e 3370 :group 'ps-print-face)
ef2cbb24 3371
bc0d41bd
KH
3372(defcustom ps-banner-page-when-duplexing nil
3373 "*Non-nil means the very first page is skipped.
3374It's like the very first character of buffer (or region) is ^L (\\014)."
3375 :type 'boolean
b6d0ac87 3376 :version "20"
6e1b1da6 3377 :group 'ps-print-headers)
bc0d41bd 3378
98f2fbe7 3379(defcustom ps-postscript-code-directory
b6d0ac87 3380 (or (if (featurep 'xemacs)
073238d6 3381 (cond ((fboundp 'locate-data-directory) ; XEmacs
ccae01a6 3382 (funcall 'locate-data-directory "ps-print"))
073238d6 3383 ((boundp 'data-directory) ; XEmacs
ccae01a6 3384 (symbol-value 'data-directory))
b6d0ac87
VJL
3385 (t ; don't know what to do
3386 nil))
073238d6 3387 data-directory) ; Emacs
eafa92bf 3388 (error "`ps-postscript-code-directory' isn't set properly"))
41481e4b
KH
3389 "*Directory where it's located the PostScript prologue file used by ps-print.
3390By default, this directory is the same as in the variable `data-directory'."
3391 :type 'directory
b6d0ac87 3392 :version "20"
6e1b1da6 3393 :group 'ps-print-miscellany)
41481e4b 3394
6bf5fb46
GM
3395(defcustom ps-line-spacing 0
3396 "*Specify line spacing, in points, for ordinary text.
3397
386ee3b0
VJL
3398Either a float or a cons of floats (LANDSCAPE-SIZE . PORTRAIT-SIZE).
3399
6bf5fb46
GM
3400See also `ps-paragraph-spacing' and `ps-paragraph-regexp'.
3401
3402To get all lines with some spacing set both `ps-line-spacing' and
3403`ps-paragraph-spacing' variables."
3404 :type '(choice :menu-tag "Line Spacing For Ordinary Text"
3405 :tag "Line Spacing For Ordinary Text"
3406 (number :tag "Line Spacing")
3407 (cons :tag "Landscape/Portrait"
3408 (number :tag "Landscape Line Spacing")
3409 (number :tag "Portrait Line Spacing")))
3410 :version "21.1"
3411 :group 'ps-print-miscellany)
3412
3413(defcustom ps-paragraph-spacing 0
3414 "*Specify paragraph spacing, in points, for ordinary text.
3415
386ee3b0
VJL
3416Either a float or a cons of floats (LANDSCAPE-SIZE . PORTRAIT-SIZE).
3417
6bf5fb46
GM
3418See also `ps-line-spacing' and `ps-paragraph-regexp'.
3419
3420To get all lines with some spacing set both `ps-line-spacing' and
3421`ps-paragraph-spacing' variables."
3422 :type '(choice :menu-tag "Paragraph Spacing For Ordinary Text"
3423 :tag "Paragraph Spacing For Ordinary Text"
3424 (number :tag "Paragraph Spacing")
3425 (cons :tag "Landscape/Portrait"
3426 (number :tag "Landscape Paragraph Spacing")
3427 (number :tag "Portrait Paragraph Spacing")))
3428 :version "21.1"
3429 :group 'ps-print-miscellany)
3430
3431(defcustom ps-paragraph-regexp "[ \t]*$"
3432 "*Specify paragraph delimiter.
3433
3434It should be a regexp or nil.
3435
3436See also `ps-paragraph-spacing'."
3437 :type '(choice :menu-tag "Paragraph Delimiter"
3438 (const :tag "No Delimiter" nil)
3439 (regexp :tag "Delimiter Regexp"))
3440 :version "21.1"
3441 :group 'ps-print-miscellany)
3442
3443(defcustom ps-begin-cut-regexp nil
3444 "*Specify regexp which is start of a region to cut out when printing.
3445
3446As an example, variables `ps-begin-cut-regexp' and `ps-end-cut-regexp' may be
3447set to \"^Local Variables:\" and \"^End:\", respectively, in order to leave out
3448some special printing instructions from the actual print. Special printing
3449instructions may be appended to the end of the file just like any other
3450buffer-local variables. See section \"Local Variables in Files\" on Emacs
3451manual for more information.
3452
3453Variables `ps-begin-cut-regexp' and `ps-end-cut-regexp' control together what
3454actually gets printed. Both variables may be set to nil in which case no
3455cutting occurs."
bf29d4c1
MR
3456 :type '(choice (const :tag "No Delimiter" nil)
3457 (regexp :tag "Delimiter Regexp"))
6bf5fb46
GM
3458 :version "21.1"
3459 :group 'ps-print-miscellany)
3460
3461(defcustom ps-end-cut-regexp nil
3462 "*Specify regexp which is end of the region to cut out when printing.
3463
3464See `ps-begin-cut-regexp' for more information."
bf29d4c1
MR
3465 :type '(choice (const :tag "No Delimiter" nil)
3466 (regexp :tag "Delimiter Regexp"))
6bf5fb46
GM
3467 :version "21.1"
3468 :group 'ps-print-miscellany)
3469
0a5daee5 3470
1fd9b7fe
GM
3471;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3472;; Selected Pages
3473
3474
3475(defvar ps-last-selected-pages nil
3476 "Latest `ps-selected-pages' value.")
3477
3478
3479(defun ps-restore-selected-pages ()
3480 "Restore latest `ps-selected-pages' value."
3481 (interactive)
3482 (setq ps-selected-pages ps-last-selected-pages))
3483
3484
0a5daee5
KH
3485;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3486;; Customization
3487
3488
3489;;;###autoload
3490(defun ps-print-customize ()
3491 "Customization of ps-print group."
3492 (interactive)
3493 (customize-group 'ps-print))
3494
3495
ef2cbb24 3496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12d89a2e 3497;; User commands
ef2cbb24 3498
0a5daee5 3499
00aa16af 3500;;;###autoload
ef2cbb24 3501(defun ps-print-buffer (&optional filename)
12d89a2e 3502 "Generate and print a PostScript image of the buffer.
ef2cbb24 3503
2285bf9d 3504Interactively, when you use a prefix argument (\\[universal-argument]), the command prompts the
319acba0
GM
3505user for a file name, and saves the PostScript image in that file instead of
3506sending it to the printer.
ef2cbb24 3507
319acba0
GM
3508Noninteractively, the argument FILENAME is treated as follows: if it is nil,
3509send the image to the printer. If FILENAME is a string, save the PostScript
3510image in a file with that name."
00aa16af 3511 (interactive (list (ps-print-preprint current-prefix-arg)))
87a16a06 3512 (ps-print-without-faces (point-min) (point-max) filename))
ef2cbb24
RS
3513
3514
00aa16af 3515;;;###autoload
ef2cbb24 3516(defun ps-print-buffer-with-faces (&optional filename)
12d89a2e 3517 "Generate and print a PostScript image of the buffer.
319acba0
GM
3518Like `ps-print-buffer', but includes font, color, and underline information in
3519the generated image. This command works only if you are using a window system,
3520so it has a way to determine color values."
00aa16af 3521 (interactive (list (ps-print-preprint current-prefix-arg)))
87a16a06 3522 (ps-print-with-faces (point-min) (point-max) filename))
ef2cbb24 3523
ef2cbb24 3524
00aa16af 3525;;;###autoload
ef2cbb24 3526(defun ps-print-region (from to &optional filename)
12d89a2e 3527 "Generate and print a PostScript image of the region.
12d89a2e 3528Like `ps-print-buffer', but prints just the current region."
55732434 3529 (interactive (ps-print-preprint-region current-prefix-arg))
a18ed129 3530 (ps-print-without-faces from to filename t))
ef2cbb24 3531
ef2cbb24 3532
00aa16af 3533;;;###autoload
ef2cbb24 3534(defun ps-print-region-with-faces (from to &optional filename)
12d89a2e 3535 "Generate and print a PostScript image of the region.
319acba0
GM
3536Like `ps-print-region', but includes font, color, and underline information in
3537the generated image. This command works only if you are using a window system,
3538so it has a way to determine color values."
55732434 3539 (interactive (ps-print-preprint-region current-prefix-arg))
a18ed129 3540 (ps-print-with-faces from to filename t))
ef2cbb24 3541
ef2cbb24 3542
00aa16af 3543;;;###autoload
ef2cbb24 3544(defun ps-spool-buffer ()
12d89a2e 3545 "Generate and spool a PostScript image of the buffer.
319acba0
GM
3546Like `ps-print-buffer' except that the PostScript image is saved in a local
3547buffer to be sent to the printer later.
ef2cbb24 3548
12d89a2e 3549Use the command `ps-despool' to send the spooled images to the printer."
ef2cbb24 3550 (interactive)
87a16a06 3551 (ps-spool-without-faces (point-min) (point-max)))
ef2cbb24 3552
ef2cbb24 3553
00aa16af 3554;;;###autoload
ef2cbb24 3555(defun ps-spool-buffer-with-faces ()
12d89a2e 3556 "Generate and spool a PostScript image of the buffer.
319acba0
GM
3557Like `ps-spool-buffer', but includes font, color, and underline information in
3558the generated image. This command works only if you are using a window system,
3559so it has a way to determine color values.
ef2cbb24 3560
12d89a2e 3561Use the command `ps-despool' to send the spooled images to the printer."
ef2cbb24 3562 (interactive)
87a16a06 3563 (ps-spool-with-faces (point-min) (point-max)))
ef2cbb24 3564
ef2cbb24 3565
00aa16af 3566;;;###autoload
ef2cbb24 3567(defun ps-spool-region (from to)
12d89a2e 3568 "Generate a PostScript image of the region and spool locally.
12d89a2e 3569Like `ps-spool-buffer', but spools just the current region.
ef2cbb24 3570
12d89a2e 3571Use the command `ps-despool' to send the spooled images to the printer."
ef2cbb24 3572 (interactive "r")
a18ed129 3573 (ps-spool-without-faces from to t))
ef2cbb24 3574
ef2cbb24 3575
00aa16af 3576;;;###autoload
ef2cbb24 3577(defun ps-spool-region-with-faces (from to)
12d89a2e 3578 "Generate a PostScript image of the region and spool locally.
319acba0
GM
3579Like `ps-spool-region', but includes font, color, and underline information in
3580the generated image. This command works only if you are using a window system,
3581so it has a way to determine color values.
ef2cbb24 3582
12d89a2e 3583Use the command `ps-despool' to send the spooled images to the printer."
ef2cbb24 3584 (interactive "r")
a18ed129 3585 (ps-spool-with-faces from to t))
ef2cbb24 3586
00aa16af 3587;;;###autoload
ef2cbb24
RS
3588(defun ps-despool (&optional filename)
3589 "Send the spooled PostScript to the printer.
3590
2285bf9d 3591Interactively, when you use a prefix argument (\\[universal-argument]), the command prompts the
319acba0
GM
3592user for a file name, and saves the spooled PostScript image in that file
3593instead of sending it to the printer.
ef2cbb24 3594
319acba0
GM
3595Noninteractively, the argument FILENAME is treated as follows: if it is nil,
3596send the image to the printer. If FILENAME is a string, save the PostScript
3597image in a file with that name."
00aa16af
RS
3598 (interactive (list (ps-print-preprint current-prefix-arg)))
3599 (ps-do-despool filename))
12d89a2e 3600
bcc0d457
RS
3601;;;###autoload
3602(defun ps-line-lengths ()
2285bf9d
RS
3603 "Display the correspondence between a line length and a font size.
3604Done using the current ps-print setup.
bcc0d457
RS
3605Try: pr -t file | awk '{printf \"%3d %s\n\", length($0), $0}' | sort -r | head"
3606 (interactive)
3607 (ps-line-lengths-internal))
3608
3609;;;###autoload
3610(defun ps-nb-pages-buffer (nb-lines)
06fb6aab
RS
3611 "Display number of pages to print this buffer, for various font heights.
3612The table depends on the current ps-print setup."
55732434 3613 (interactive (ps-count-lines-preprint (point-min) (point-max)))
bcc0d457
RS
3614 (ps-nb-pages nb-lines))
3615
3616;;;###autoload
3617(defun ps-nb-pages-region (nb-lines)
06fb6aab
RS
3618 "Display number of pages to print the region, for various font heights.
3619The table depends on the current ps-print setup."
55732434 3620 (interactive (ps-count-lines-preprint (mark) (point)))
bcc0d457
RS
3621 (ps-nb-pages nb-lines))
3622
c86f4619
GM
3623(defvar ps-prefix-quote nil
3624 "Used for `ps-print-quote' (which see).")
efa89c1f 3625
bcc0d457
RS
3626;;;###autoload
3627(defun ps-setup ()
496725ad 3628 "Return the current PostScript-generation setup."
efa89c1f 3629 (let (ps-prefix-quote)
319acba0 3630 (mapconcat
efa89c1f 3631 #'ps-print-quote
319acba0 3632 (list
d3241651
VJL
3633 (concat "\n;;; (" (if (featurep 'xemacs) "XEmacs" "Emacs")
3634 ") ps-print version " ps-print-version "\n")
208ccc30 3635 ";; internal vars"
d3241651
VJL
3636 (ps-comment-string "emacs-version " emacs-version)
3637 (ps-comment-string "ps-windows-system " ps-windows-system)
3638 (ps-comment-string "ps-lp-system " ps-lp-system)
208ccc30 3639 nil
319acba0
GM
3640 '(25 . ps-print-color-p)
3641 '(25 . ps-lpr-command)
3642 '(25 . ps-lpr-switches)
3643 '(25 . ps-printer-name)
3644 '(25 . ps-printer-name-option)
3645 '(25 . ps-print-region-function)
3646 '(25 . ps-manual-feed)
3647 '(25 . ps-end-with-control-d)
3648 nil
3649 '(23 . ps-paper-type)
3650 '(23 . ps-warn-paper-type)
3651 '(23 . ps-landscape-mode)
3652 '(23 . ps-print-upside-down)
3653 '(23 . ps-number-of-columns)
3654 nil
3655 '(23 . ps-zebra-stripes)
3656 '(23 . ps-zebra-stripe-height)
3657 '(23 . ps-zebra-stripe-follow)
3658 '(23 . ps-zebra-color)
3659 '(23 . ps-line-number)
3660 '(23 . ps-line-number-step)
3661 '(23 . ps-line-number-start)
3662 nil
319acba0 3663 '(17 . ps-razzle-dazzle)
ccae01a6
VJL
3664 '(17 . ps-default-bg)
3665 '(17 . ps-default-fg)
3666 '(17 . ps-fg-validate-p)
3667 '(17 . ps-fg-list)
319acba0
GM
3668 nil
3669 '(23 . ps-use-face-background)
3670 nil
3671 '(28 . ps-print-control-characters)
3672 nil
3673 '(26 . ps-print-background-image)
3674 nil
3675 '(25 . ps-print-background-text)
3676 nil
3677 '(29 . ps-error-handler-message)
3678 '(29 . ps-user-defined-prologue)
3679 '(29 . ps-print-prologue-header)
3680 '(29 . ps-postscript-code-directory)
3681 '(29 . ps-adobe-tag)
3682 nil
3683 '(30 . ps-left-margin)
3684 '(30 . ps-right-margin)
3685 '(30 . ps-inter-column)
3686 '(30 . ps-bottom-margin)
3687 '(30 . ps-top-margin)
3688 '(30 . ps-print-only-one-header)
3689 '(30 . ps-switch-header)
3690 '(30 . ps-print-header)
3691 '(30 . ps-header-lines)
3692 '(30 . ps-header-offset)
3693 '(30 . ps-header-line-pad)
3694 '(30 . ps-print-header-frame)
3695 '(30 . ps-header-frame-alist)
3696 '(30 . ps-print-footer)
3697 '(30 . ps-footer-lines)
3698 '(30 . ps-footer-offset)
3699 '(30 . ps-footer-line-pad)
3700 '(30 . ps-print-footer-frame)
3701 '(30 . ps-footer-frame-alist)
3702 '(30 . ps-show-n-of-n)
3703 '(30 . ps-spool-config)
3704 '(30 . ps-spool-duplex)
3705 '(30 . ps-spool-tumble)
3706 '(30 . ps-banner-page-when-duplexing)
3707 '(30 . ps-left-header)
3708 '(30 . ps-right-header)
3709 '(30 . ps-left-footer)
3710 '(30 . ps-right-footer)
3711 nil
3712 '(23 . ps-n-up-printing)
3713 '(23 . ps-n-up-margin)
3714 '(23 . ps-n-up-border-p)
3715 '(23 . ps-n-up-filling)
3716 nil
3717 '(26 . ps-multibyte-buffer)
3718 '(26 . ps-font-family)
3719 '(26 . ps-font-size)
3720 '(26 . ps-header-font-family)
3721 '(26 . ps-header-font-size)
3722 '(26 . ps-header-title-font-size)
3723 '(26 . ps-footer-font-family)
3724 '(26 . ps-footer-font-size)
3725 '(26 . ps-line-number-color)
3726 '(26 . ps-line-number-font)
3727 '(26 . ps-line-number-font-size)
3728 '(26 . ps-line-spacing)
3729 '(26 . ps-paragraph-spacing)
3730 '(26 . ps-paragraph-regexp)
3731 '(26 . ps-begin-cut-regexp)
3732 '(26 . ps-end-cut-regexp)
3733 nil
3734 '(23 . ps-even-or-odd-pages)
3735 '(23 . ps-selected-pages)
3736 '(23 . ps-last-selected-pages)
3737 nil
3738 '(31 . ps-build-face-reference)
3739 '(31 . ps-always-build-face-reference)
3740 nil
3741 '(20 . ps-auto-font-detect)
3742 '(20 . ps-bold-faces)
3743 '(20 . ps-italic-faces)
3744 '(20 . ps-underlined-faces)
55732434 3745 '(20 . ps-black-white-faces)
c86f4619 3746 " )\n
ccae01a6
VJL
3747\;; The following customized variables have long lists and are seldom modified:
3748\;; ps-page-dimensions-database
3749\;; ps-font-info-database
1fd9b7fe 3750
231f3e66 3751\;;; ps-print - end of settings\n")
319acba0 3752 "\n")))
bcc0d457 3753
0a5daee5 3754
12d89a2e
RS
3755;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3756;; Utility functions and variables:
3757
0a5daee5 3758
efa89c1f 3759(defun ps-print-quote (elt)
c86f4619
GM
3760 "Quote ELT for printing (used for showing settings).
3761
3762If ELT is nil, return an empty string.
3763If ELT is string, return it.
3764Otherwise, ELT should be a cons (LEN . SYM) where SYM is a variable symbol and
3765LEN is the field length where SYM name will be inserted. The variable
3766`ps-prefix-quote' is used to form the string, if `ps-prefix-quote' is nil, it's
3767used \"(setq \" as prefix; otherwise, it's used \" \". So, the string
3768generated is:
3769
3770 * If `ps-prefix-quote' is nil:
3771 \"(setq SYM-NAME SYM-VALUE\"
3772 |<------->|
3773 LEN
3774
3775 * If `ps-prefix-quote' is non-nil:
3776 \" SYM-NAME SYM-VALUE\"
3777 |<------->|
3778 LEN
3779
3780If `ps-prefix-quote' is nil, it's set to t after generating string."
efa89c1f 3781 (cond
efa89c1f 3782 ((stringp elt) elt)
c90a10fa
RS
3783 ((and (consp elt) (integerp (car elt))
3784 (symbolp (cdr elt)) (boundp (cdr elt)))
efa89c1f
GM
3785 (let* ((col (car elt))
3786 (sym (cdr elt))
3787 (key (symbol-name sym))
3788 (len (length key))
3789 (val (symbol-value sym)))
3790 (concat (if ps-prefix-quote
c86f4619
GM
3791 " "
3792 (setq ps-prefix-quote t)
efa89c1f
GM
3793 "(setq ")
3794 key
3795 (if (> col len)
4abc74e8 3796 (make-string (- col len) ?\s)
efa89c1f 3797 " ")
51138c94 3798 (ps-value-string val))))
c90a10fa 3799 (t "")
efa89c1f
GM
3800 ))
3801
3802
51138c94
VJL
3803(defun ps-value-string (val)
3804 "Return a string representation of VAL. Used by `ps-print-quote'."
3805 (cond ((null val)
3806 "nil")
3807 ((eq val t)
3808 "t")
3809 ((or (symbolp val) (listp val))
3810 (format "'%S" val))
3811 (t
3812 (format "%S" val))))
3813
3814
bd20e8cd 3815(defun ps-comment-string (str value)
cfb7b9ce
VJL
3816 "Return a comment string like \";; STR = VALUE\"."
3817 (format ";; %s = %s" str (ps-value-string value)))
bd20e8cd
VJL
3818
3819
319acba0
GM
3820(defun ps-value (alist-sym key)
3821 "Return value from association list ALIST-SYM which car is `eq' to KEY."
3822 (cdr (assq key (symbol-value alist-sym))))
3823
3824
3825(defun ps-get (alist-sym key)
3826 "Return element from association list ALIST-SYM which car is `eq' to KEY."
3827 (assq key (symbol-value alist-sym)))
3828
3829
3830(defun ps-put (alist-sym key value)
3831 "Store element (KEY . VALUE) into association list ALIST-SYM.
3832If KEY already exists in ALIST-SYM, modify cdr to VALUE.
3833It can be retrieved with `(ps-get ALIST-SYM KEY)'."
3834 (let ((elt: (assq key (symbol-value alist-sym)))) ; to avoid name conflict
3835 (if elt:
3836 (setcdr elt: value)
3837 (setq elt: (cons key value))
3838 (set alist-sym (cons elt: (symbol-value alist-sym))))
3839 elt:))
3840
3841
3842(defun ps-del (alist-sym key)
3843 "Delete by side effect element KEY from association list ALIST-SYM."
3844 (let ((a:list: (symbol-value alist-sym)) ; to avoid name conflict
3845 old)
3846 (while a:list:
3847 (if (eq key (car (car a:list:)))
3848 (progn
3849 (if old
3850 (setcdr old (cdr a:list:))
3851 (set alist-sym (cdr a:list:)))
3852 (setq a:list: nil))
3853 (setq old a:list:
3854 a:list: (cdr a:list:)))))
3855 (symbol-value alist-sym))
3856
3857
4b81a999
GM
3858(defun ps-time-stamp-locale-default ()
3859 "Return the locale's \"preferred\" date as, for example, \"06/18/01\"."
3860 (format-time-string "%x"))
3861
3862
2bd80d73 3863(defun ps-time-stamp-mon-dd-yyyy ()
4b81a999 3864 "Return date as \"Jun 18 2001\"."
2bd80d73
GM
3865 (format-time-string "%b %d %Y"))
3866
3867
71efd3c4
VJL
3868(defun ps-time-stamp-yyyy-mm-dd ()
3869 "Return date as \"2001-06-18\" (ISO date)."
3870 (format-time-string "%Y-%m-%d"))
3871
3872
3a504454
VJL
3873;; Alias for `ps-time-stamp-yyyy-mm-dd' (which see).
3874(defalias 'ps-time-stamp-iso8601 'ps-time-stamp-yyyy-mm-dd)
71efd3c4
VJL
3875
3876
2bd80d73 3877(defun ps-time-stamp-hh:mm:ss ()
4b81a999 3878 "Return time as \"17:28:31\"."
2bd80d73
GM
3879 (format-time-string "%T"))
3880
3881
b6d0ac87
VJL
3882(and (featurep 'xemacs)
3883 ;; XEmacs change: Need to check for emacs-major-version too.
3884 (or (< emacs-major-version 19)
3885 (and (= emacs-major-version 19) (< emacs-minor-version 12)))
3886 (setq ps-print-color-p nil))
3887
3888
3889;; Return t if the device (which can be changed during an emacs session)
3890;; can handle colors.
3891;; This function is not yet implemented for GNU emacs.
cf04718a
SM
3892(defalias 'ps-color-device
3893 (cond ((and (featurep 'xemacs)
d3241651
VJL
3894 ;; XEmacs change: Need to check for emacs-major-version too.
3895 (or (> emacs-major-version 19)
3896 (and (= emacs-major-version 19)
3897 (>= emacs-minor-version 12)))) ; XEmacs >= 19.12
3898 (lambda ()
c9b3d6a5 3899 (eq (device-class) 'color)))
d3241651
VJL
3900
3901 (t ; Emacs
3902 (lambda ()
3903 (if (fboundp 'color-values)
c9b3d6a5 3904 (color-values "Green")
d3241651 3905 t)))))
b6d0ac87
VJL
3906
3907
c9b3d6a5
DN
3908(defun ps-xemacs-mapper (extent list)
3909 (when (featurep 'xemacs)
3910 (nconc list
3911 (list (list (extent-start-position extent) 'push extent)
3912 (list (extent-end-position extent) 'pull extent))))
b6d0ac87
VJL
3913 nil)
3914
c9b3d6a5
DN
3915(defun ps-xemacs-extent-sorter (a b)
3916 (when (featurep 'xemacs)
3917 (< (extent-priority a) (extent-priority b))))
b6d0ac87
VJL
3918
3919(defun ps-xemacs-face-kind-p (face kind kind-regex)
c9b3d6a5
DN
3920 (when (featurep 'xemacs)
3921 (let* ((frame-font (or (face-font-instance face)
3922 (face-font-instance 'default)))
3923 (kind-cons
3924 (and frame-font
3925 (assq kind
3926 (font-instance-properties frame-font))))
3927 (kind-spec (cdr-safe kind-cons))
3928 (case-fold-search t))
3929 (and kind-spec (string-match kind-regex kind-spec)))))
3930
3931(when (featurep 'xemacs)
3932 ;; to avoid XEmacs compilation gripes
3933 (defvar coding-system-for-write)
3934 (defvar coding-system-for-read)
3935 (defvar buffer-file-coding-system)
3936
3937 (and (fboundp 'find-coding-system)
3938 (or (find-coding-system 'raw-text-unix)
3939 (copy-coding-system 'no-conversion-unix 'raw-text-unix))))
3940
3941(defun ps-color-values (x-color)
3942 (if (featurep 'xemacs)
3943 (let ((color (ps-xemacs-color-name x-color)))
3944 (cond
3945 ((fboundp 'x-color-values)
3946 (x-color-values color))
3947 ((and (fboundp 'color-instance-rgb-components)
3948 (ps-color-device))
3949 (color-instance-rgb-components
3950 (if (color-instance-p x-color)
3951 x-color
3952 (make-color-instance color))))
3953 (t
3954 (error "No available function to determine X color values"))))
3955 (cond
3956 ((fboundp 'color-values)
3957 (color-values x-color))
3958 ((fboundp 'x-color-values)
3959 (x-color-values x-color))
3960 (t
3961 (error "No available function to determine X color values")))))
3962
3963(defun ps-face-bold-p (face)
3964 (if (featurep 'xemacs)
3965 (or (ps-xemacs-face-kind-p face 'WEIGHT_NAME "bold\\|demibold")
3966 (memq face ps-bold-faces)) ; Kludge-compatible
3967 (or (face-bold-p face)
3968 (memq face ps-bold-faces))))
3e9cb08f 3969
c9b3d6a5
DN
3970(defun ps-face-italic-p (face)
3971 (if (featurep 'xemacs)
3972 (or (ps-xemacs-face-kind-p face 'ANGLE_NAME "i\\|o")
3973 (ps-xemacs-face-kind-p face 'SLANT "i\\|o")
3974 (memq face ps-italic-faces)) ; Kludge-compatible
3975 (or (face-italic-p face)
3976 (memq face ps-italic-faces))))
3e9cb08f 3977
ea0c615d 3978(defvar ps-print-color-scale 1.0)
47b54c71 3979
3e9cb08f
GM
3980(defun ps-color-scale (color)
3981 ;; Scale 16-bit X-COLOR-VALUE to PostScript color value in [0, 1] interval.
3982 (mapcar #'(lambda (value) (/ value ps-print-color-scale))
3983 (ps-color-values color)))
3984
3985
3986(defun ps-face-underlined-p (face)
3987 (or (face-underline-p face)
3988 (memq face ps-underlined-faces)))
e65df0a1 3989
857686a6 3990
41481e4b 3991(defun ps-prologue-file (filenumber)
2285bf9d 3992 "If prologue FILENUMBER exists and is readable, return contents as string.
2bd80d73
GM
3993
3994Note: No major/minor-mode is activated and no local variables are evaluated for
3995 FILENUMBER, but proper EOL-conversion and character interpretation is
3996 done!"
3997 (let ((filename (convert-standard-filename
3998 (expand-file-name (format "ps-prin%d.ps" filenumber)
3999 ps-postscript-code-directory))))
4000 (if (and (file-exists-p filename)
319acba0
GM
4001 (file-readable-p filename))
4002 (with-temp-buffer
4003 (insert-file-contents filename)
4004 (buffer-string))
e8af40ee 4005 (error "ps-print PostScript prologue `%s' file was not found"
2bd80d73 4006 filename))))
bcc0d457 4007
bcc0d457 4008
6db15364 4009(defvar ps-mark-code-directory nil)
bcc0d457 4010
66e63857
GM
4011(defvar ps-print-prologue-0 ""
4012 "ps-print PostScript error handler.")
4013
41481e4b 4014(defvar ps-print-prologue-1 ""
6bf5fb46 4015 "ps-print PostScript prologue.")
12d89a2e
RS
4016
4017;; Start Editing Here:
ef2cbb24 4018
6db15364 4019(defvar ps-source-buffer nil)
12d89a2e 4020(defvar ps-spool-buffer-name "*PostScript*")
6db15364 4021(defvar ps-spool-buffer nil)
ef2cbb24 4022
6db15364
VJL
4023(defvar ps-output-head nil)
4024(defvar ps-output-tail nil)
ef2cbb24 4025
4b3eb10f
GM
4026(defvar ps-page-postscript 0) ; page number
4027(defvar ps-page-order 0) ; PostScript page counter
4028(defvar ps-page-sheet 0) ; sheet counter
4029(defvar ps-page-column 0) ; column counter
4030(defvar ps-page-printed 0) ; total pages printed
4031(defvar ps-page-n-up 0) ; n-up counter
bd7a2e26
GM
4032(defvar ps-lines-printed 0) ; total lines printed
4033(defvar ps-showline-count 1) ; line number counter
6db15364
VJL
4034(defvar ps-first-page nil)
4035(defvar ps-last-page nil)
ea0c615d 4036(defvar ps-print-page-p t)
87a16a06 4037
6db15364
VJL
4038(defvar ps-control-or-escape-regexp nil)
4039(defvar ps-n-up-on nil)
857686a6 4040
6db15364
VJL
4041(defvar ps-background-pages nil)
4042(defvar ps-background-all-pages nil)
87a16a06
RS
4043(defvar ps-background-text-count 0)
4044(defvar ps-background-image-count 0)
ef2cbb24 4045
12d89a2e 4046(defvar ps-current-font 0)
6db15364
VJL
4047(defvar ps-default-foreground nil)
4048(defvar ps-default-background nil)
4049(defvar ps-default-color nil)
4050(defvar ps-current-color nil)
4051(defvar ps-current-bg nil)
ccae01a6 4052(defvar ps-foreground-list nil)
12d89a2e 4053
6db15364 4054(defvar ps-zebra-stripe-full-p nil)
12d89a2e
RS
4055(defvar ps-razchunk 0)
4056
6db15364 4057(defvar ps-color-p nil)
bcc0d457 4058(defvar ps-color-format
b6d0ac87
VJL
4059 (if (featurep 'xemacs)
4060 ;; XEmacs will have to make do with %s (princ) for floats.
4061 "%s %s %s"
12d89a2e 4062
b6d0ac87
VJL
4063 ;; Emacs understands the %f format; we'll use it to limit color RGB
4064 ;; values to three decimals to cut down some on the size of the
4065 ;; PostScript output.
4066 "%0.3f %0.3f %0.3f"))
12d89a2e 4067
319acba0
GM
4068;; These values determine how much print-height to deduct when headers/footers
4069;; are turned on. This is a pretty clumsy way of handling it, but it'll do for
4070;; now.
12d89a2e 4071
bcc0d457 4072(defvar ps-header-pad 0
496725ad
RS
4073 "Vertical and horizontal space between the header frame and the text.
4074This is in units of points (1/72 inch).")
12d89a2e 4075
319acba0
GM
4076(defvar ps-footer-pad 0
4077 "Vertical and horizontal space between the footer frame and the text.
4078This is in units of points (1/72 inch).")
4079
bcc0d457 4080;; Define accessors to the dimensions list.
12d89a2e 4081
bcc0d457
RS
4082(defmacro ps-page-dimensions-get-width (dims) `(nth 0 ,dims))
4083(defmacro ps-page-dimensions-get-height (dims) `(nth 1 ,dims))
bc0d41bd 4084(defmacro ps-page-dimensions-get-media (dims) `(nth 2 ,dims))
12d89a2e 4085
6db15364 4086(defvar ps-landscape-page-height nil)
12d89a2e 4087
6db15364
VJL
4088(defvar ps-print-width nil)
4089(defvar ps-print-height nil)
12d89a2e 4090
6db15364
VJL
4091(defvar ps-height-remaining nil)
4092(defvar ps-width-remaining nil)
12d89a2e 4093
6db15364
VJL
4094(defvar ps-font-size-internal nil)
4095(defvar ps-header-font-size-internal nil)
4096(defvar ps-header-title-font-size-internal nil)
4097(defvar ps-footer-font-size-internal nil)
4098(defvar ps-line-spacing-internal nil)
4099(defvar ps-paragraph-spacing-internal nil)
7d8b7e8e 4100
87a16a06
RS
4101\f
4102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4103;; Internal Variables
4104
4105
55732434
GM
4106(defvar ps-black-white-faces-alist nil
4107 "Alist of symbolic faces used for black/white PostScript printers.
4108An element of this list has the same form as `ps-print-face-extension-alist'
2285bf9d 4109\(which see).
55732434
GM
4110
4111Don't change this list directly; instead,
4112use `ps-extend-face' and `ps-extend-face-list'.
4113See documentation for `ps-extend-face' for valid extension symbol.
4114See also documentation for `ps-print-color-p'.")
4115
4116
87a16a06 4117(defvar ps-print-face-extension-alist nil
a18ed129 4118 "Alist of symbolic faces *WITH* extension features (box, outline, etc).
87a16a06
RS
4119An element of this list has the following form:
4120
4121 (FACE . [BITS FG BG])
4122
4123 FACE is a symbol denoting a face name
4124 BITS is a bit vector, where each bit correspond
4125 to a feature (bold, underline, etc)
4126 (see documentation for `ps-print-face-map-alist')
4127 FG foreground color (string or nil)
4128 BG background color (string or nil)
4129
a18ed129
RS
4130Don't change this list directly; instead,
4131use `ps-extend-face' and `ps-extend-face-list'.
4132See documentation for `ps-extend-face' for valid extension symbol.")
4133
4134
4135(defvar ps-print-face-alist nil
4136 "Alist of symbolic faces *WITHOUT* extension features (box, outline, etc).
4137
4138An element of this list has the same form as an element of
4139`ps-print-face-extension-alist'.
4140
4141Don't change this list directly; this list is used by `ps-face-attributes',
4142`ps-map-face' and `ps-build-reference-face-lists'.")
87a16a06
RS
4143
4144
4145(defconst ps-print-face-map-alist
4146 '((bold . 1)
4147 (italic . 2)
4148 (underline . 4)
4149 (strikeout . 8)
4150 (overline . 16)
4151 (shadow . 32)
4152 (box . 64)
4153 (outline . 128))
4154 "Alist of all features and the corresponding bit mask.
4155Each symbol correspond to one bit in a bit vector.")
4156
4157\f
4158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
a18ed129 4159;; Remapping Faces
87a16a06
RS
4160
4161
4162;;;###autoload
55732434
GM
4163(defun ps-extend-face-list (face-extension-list &optional merge-p alist-sym)
4164 "Extend face in ALIST-SYM.
87a16a06 4165
a18ed129 4166If optional MERGE-P is non-nil, extensions in FACE-EXTENSION-LIST are merged
55732434
GM
4167with face extension in ALIST-SYM; otherwise, overrides.
4168
01cdabc6 4169If optional ALIST-SYM is nil, `ps-print-face-extension-alist' is used;
55732434 4170otherwise, it should be an alist symbol.
87a16a06 4171
01cdabc6 4172The elements in FACE-EXTENSION-LIST are like those for `ps-extend-face'.
87a16a06
RS
4173
4174See `ps-extend-face' for documentation."
4175 (while face-extension-list
55732434 4176 (ps-extend-face (car face-extension-list) merge-p alist-sym)
87a16a06
RS
4177 (setq face-extension-list (cdr face-extension-list))))
4178
4179
4180;;;###autoload
55732434
GM
4181(defun ps-extend-face (face-extension &optional merge-p alist-sym)
4182 "Extend face in ALIST-SYM.
87a16a06 4183
6bdb808e 4184If optional MERGE-P is non-nil, extensions in FACE-EXTENSION list are merged
55732434
GM
4185with face extensions in ALIST-SYM; otherwise, overrides.
4186
01cdabc6 4187If optional ALIST-SYM is nil, `ps-print-face-extension-alist' is used;
55732434 4188otherwise, it should be an alist symbol.
87a16a06
RS
4189
4190The elements of FACE-EXTENSION list have the form:
4191
4192 (FACE-NAME FOREGROUND BACKGROUND EXTENSION...)
4193
4194FACE-NAME is a face name symbol.
4195
4196FOREGROUND and BACKGROUND may be nil or a string that denotes the
4197foreground and background colors respectively.
4198
4199EXTENSION is one of the following symbols:
4200 bold - use bold font.
4201 italic - use italic font.
4202 underline - put a line under text.
4203 strikeout - like underline, but the line is in middle of text.
4204 overline - like underline, but the line is over the text.
4205 shadow - text will have a shadow.
4206 box - text will be surrounded by a box.
a18ed129 4207 outline - print characters as hollow outlines.
87a16a06
RS
4208
4209If EXTENSION is any other symbol, it is ignored."
55732434
GM
4210 (or alist-sym
4211 (setq alist-sym 'ps-print-face-extension-alist))
4212 (let* ((background (nth 2 face-extension))
4213 (foreground (nth 1 face-extension))
4214 (face-name (nth 0 face-extension))
4215 (ps-face (cdr (assq face-name (symbol-value alist-sym))))
87a16a06 4216 (face-vector (or ps-face (vector 0 nil nil)))
55732434 4217 (face-bit (ps-extension-bit face-extension)))
87a16a06
RS
4218 ;; extend face
4219 (aset face-vector 0 (if merge-p
4220 (logior (aref face-vector 0) face-bit)
4221 face-bit))
55732434
GM
4222 (and (or (not merge-p) (and foreground (stringp foreground)))
4223 (aset face-vector 1 foreground))
4224 (and (or (not merge-p) (and background (stringp background)))
4225 (aset face-vector 2 background))
87a16a06
RS
4226 ;; if face does not exist, insert it
4227 (or ps-face
55732434
GM
4228 (set alist-sym (cons (cons face-name face-vector)
4229 (symbol-value alist-sym))))))
87a16a06
RS
4230
4231
4232(defun ps-extension-bit (face-extension)
4233 (let ((face-bit 0))
4234 ;; map valid symbol extension to bit vector
4235 (setq face-extension (cdr (cdr face-extension)))
4236 (while (setq face-extension (cdr face-extension))
4237 (setq face-bit (logior face-bit
4238 (or (cdr (assq (car face-extension)
4239 ps-print-face-map-alist))
4240 0))))
4241 face-bit))
4242
4243\f
857686a6 4244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
bc0d41bd 4245;; Adapted from font-lock: (obsolete stuff)
857686a6
RS
4246;; Originally face attributes were specified via `font-lock-face-attributes'.
4247;; Users then changed the default face attributes by setting that variable.
4248;; However, we try and be back-compatible and respect its value if set except
4249;; for faces where M-x customize has been used to save changes for the face.
4250
0a5daee5 4251
857686a6
RS
4252(defun ps-font-lock-face-attributes ()
4253 (and (boundp 'font-lock-mode) (symbol-value 'font-lock-mode)
4254 (boundp 'font-lock-face-attributes)
3e9cb08f 4255 (let ((face-attributes (symbol-value 'font-lock-face-attributes)))
857686a6 4256 (while face-attributes
6bdb808e
RS
4257 (let* ((face-attribute
4258 (car (prog1 face-attributes
4259 (setq face-attributes (cdr face-attributes)))))
857686a6
RS
4260 (face (car face-attribute)))
4261 ;; Rustle up a `defface' SPEC from a
4262 ;; `font-lock-face-attributes' entry.
4263 (unless (get face 'saved-face)
4264 (let ((foreground (nth 1 face-attribute))
4265 (background (nth 2 face-attribute))
4266 (bold-p (nth 3 face-attribute))
4267 (italic-p (nth 4 face-attribute))
4268 (underline-p (nth 5 face-attribute))
4269 face-spec)
4270 (when foreground
4271 (setq face-spec (cons ':foreground
4272 (cons foreground face-spec))))
4273 (when background
4274 (setq face-spec (cons ':background
4275 (cons background face-spec))))
4276 (when bold-p
e31c1fd5 4277 (setq face-spec (append '(:weight bold) face-spec)))
857686a6 4278 (when italic-p
e31c1fd5 4279 (setq face-spec (append '(:slant italic) face-spec)))
857686a6
RS
4280 (when underline-p
4281 (setq face-spec (append '(:underline t) face-spec)))
4282 (custom-declare-face face (list (list t face-spec)) nil)
4283 )))))))
4284
4285\f
87a16a06
RS
4286;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4287;; Internal functions and variables
4288
4289
197d4ebc
VJL
4290(defun ps-message-log-max ()
4291 (and (not (string= (buffer-name) "*Messages*"))
9586e1d3 4292 (boundp 'message-log-max)
197d4ebc
VJL
4293 message-log-max))
4294
4295
6db15364
VJL
4296(defvar ps-print-hook nil)
4297(defvar ps-print-begin-sheet-hook nil)
4298(defvar ps-print-begin-page-hook nil)
4299(defvar ps-print-begin-column-hook nil)
12b88fff
RS
4300
4301
a18ed129 4302(defun ps-print-without-faces (from to &optional filename region-p)
857686a6 4303 (ps-spool-without-faces from to region-p)
87a16a06
RS
4304 (ps-do-despool filename))
4305
4306
a18ed129 4307(defun ps-spool-without-faces (from to &optional region-p)
197d4ebc
VJL
4308 (let ((message-log-max (ps-message-log-max))) ; to print *Messages* buffer
4309 (run-hooks 'ps-print-hook)
4310 (ps-printing-region region-p from to)
4311 (ps-generate (current-buffer) from to 'ps-generate-postscript)))
87a16a06
RS
4312
4313
a18ed129 4314(defun ps-print-with-faces (from to &optional filename region-p)
857686a6 4315 (ps-spool-with-faces from to region-p)
87a16a06
RS
4316 (ps-do-despool filename))
4317
4318
a18ed129 4319(defun ps-spool-with-faces (from to &optional region-p)
197d4ebc
VJL
4320 (let ((message-log-max (ps-message-log-max))) ; to print *Messages* buffer
4321 (run-hooks 'ps-print-hook)
4322 (ps-printing-region region-p from to)
4323 (ps-generate (current-buffer) from to 'ps-generate-postscript-with-faces)))
87a16a06
RS
4324
4325
55732434 4326(defun ps-count-lines-preprint (from to)
197d4ebc
VJL
4327 (or (and from to)
4328 (error "The mark is not set now"))
4329 (let ((message-log-max (ps-message-log-max))) ; to count lines of *Messages*
4330 (list (count-lines from to))))
55732434
GM
4331
4332
bc0d41bd 4333(defun ps-count-lines (from to)
a18ed129 4334 (+ (count-lines from to)
857686a6
RS
4335 (save-excursion
4336 (goto-char to)
4337 (if (= (current-column) 0) 1 0))))
87a16a06
RS
4338
4339
a18ed129 4340(defvar ps-printing-region nil
9586e1d3 4341 "Variable used to indicate the region that ps-print is printing.
bc0d41bd
KH
4342It is a cons, the car of which is the line number where the region begins, and
4343its cdr is the total number of lines in the buffer. Formatting functions can
4344use this information to print the original line number (and not the number of
4345lines printed), and to indicate in the header that the printout is of a partial
4346file.")
4347
4348
4349(defvar ps-printing-region-p nil
4350 "Non-nil means ps-print is printing a region.")
87a16a06
RS
4351
4352
e22ba851 4353(defun ps-printing-region (region-p from to)
bc0d41bd
KH
4354 (setq ps-printing-region-p region-p
4355 ps-printing-region
4356 (cons (if region-p
e22ba851 4357 (ps-count-lines (point-min) (min from to))
bc0d41bd
KH
4358 1)
4359 (ps-count-lines (point-min) (point-max)))))
87a16a06
RS
4360
4361\f
12d89a2e
RS
4362;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4363;; Internal functions
4364
0a5daee5 4365
7ae35a2f 4366(defsubst ps-font-alist (font-sym)
12b88fff
RS
4367 (get font-sym 'fonts))
4368
4369(defun ps-font (font-sym font-type)
4370 "Font family name for text of `font-type', when generating PostScript."
7ae35a2f 4371 (let* ((font-list (ps-font-alist font-sym))
12b88fff 4372 (normal-font (cdr (assq 'normal font-list))))
6bdb808e
RS
4373 (while (and font-list (not (eq font-type (car (car font-list)))))
4374 (setq font-list (cdr font-list)))
4375 (or (cdr (car font-list)) normal-font)))
12b88fff 4376
319acba0 4377(defsubst ps-fonts (font-sym)
7ae35a2f 4378 (mapcar 'cdr (ps-font-alist font-sym)))
12b88fff 4379
319acba0 4380(defsubst ps-font-number (font-sym font-type)
7ae35a2f 4381 (or (ps-alist-position font-type (ps-font-alist font-sym))
12b88fff
RS
4382 0))
4383
4384(defsubst ps-line-height (font-sym)
4385 "The height of a line, for generating PostScript.
4386This is the value that ps-print uses to determine the height,
4387y-dimension, of the lines of text it has printed, and thus affects the
4388point at which page-breaks are placed.
4389The line-height is *not* the same as the point size of the font."
4390 (get font-sym 'line-height))
4391
4392(defsubst ps-title-line-height (font-sym)
4393 "The height of a `title' line, for generating PostScript.
4394This is the value that ps-print uses to determine the height,
4395y-dimension, of the lines of text it has printed, and thus affects the
4396point at which page-breaks are placed.
4397The title-line-height is *not* the same as the point size of the font."
4398 (get font-sym 'title-line-height))
4399
4400(defsubst ps-space-width (font-sym)
4401 "The width of a space character, for generating PostScript.
4402This value is used in expanding tab characters."
4403 (get font-sym 'space-width))
4404
4405(defsubst ps-avg-char-width (font-sym)
4406 "The average width, in points, of a character, for generating PostScript.
4407This is the value that ps-print uses to determine the length,
4408x-dimension, of the text it has printed, and thus affects the point at
4409which long lines wrap around."
4410 (get font-sym 'avg-char-width))
4411
bcc0d457 4412(defun ps-line-lengths-internal ()
2285bf9d
RS
4413 "Display the correspondence between a line length and a font size.
4414Done using the current ps-print setup.
bcc0d457 4415Try: pr -t file | awk '{printf \"%3d %s\n\", length($0), $0}' | sort -r | head"
df5e6194
GM
4416 (let* ((ps-font-size-internal
4417 (or ps-font-size-internal
4418 (ps-get-font-size 'ps-font-size)))
4419 (ps-header-font-size-internal
4420 (or ps-header-font-size-internal
4421 (ps-get-font-size 'ps-header-font-size)))
4422 (ps-header-title-font-size-internal
4423 (or ps-header-title-font-size-internal
4424 (ps-get-font-size 'ps-header-title-font-size)))
4425 (buf (get-buffer-create "*Line-lengths*"))
4426 (ifs ps-font-size-internal) ; initial font size
4427 (icw (ps-avg-char-width 'ps-font-for-text)) ; initial character width
4428 (print-width (progn (ps-get-page-dimensions)
4429 ps-print-width))
4430 (ps-setup (ps-setup)) ; setup for the current buffer
4431 (fs-min 5) ; minimum font size
4432 cw-min ; minimum character width
4433 nb-cpl-max ; maximum nb of characters per line
4434 (fs-max 14) ; maximum font size
4435 cw-max ; maximum character width
4436 nb-cpl-min ; minimum nb of characters per line
4437 fs ; current font size
4438 cw ; current character width
4439 nb-cpl ; current nb of characters per line
4440 )
bcc0d457
RS
4441 (setq cw-min (/ (* icw fs-min) ifs)
4442 nb-cpl-max (floor (/ print-width cw-min))
4443 cw-max (/ (* icw fs-max) ifs)
8bd22fcf
KH
4444 nb-cpl-min (floor (/ print-width cw-max))
4445 nb-cpl nb-cpl-min)
bcc0d457
RS
4446 (set-buffer buf)
4447 (goto-char (point-max))
df5e6194 4448 (or (bobp) (insert "\n" (make-string 75 ?\;) "\n"))
8bd22fcf 4449 (insert ps-setup
df5e6194 4450 "\nnb char per line / font size\n")
bcc0d457 4451 (while (<= nb-cpl nb-cpl-max)
8bd22fcf
KH
4452 (setq cw (/ print-width (float nb-cpl))
4453 fs (/ (* ifs cw) icw))
df5e6194 4454 (insert (format "%16d %s\n" nb-cpl fs))
bcc0d457
RS
4455 (setq nb-cpl (1+ nb-cpl)))
4456 (insert "\n")
4457 (display-buffer buf 'not-this-window)))
4458
4459(defun ps-nb-pages (nb-lines)
496725ad
RS
4460 "Display correspondence between font size and the number of pages.
4461The correspondence is based on having NB-LINES lines of text,
4462and on the current ps-print setup."
df5e6194
GM
4463 (let* ((ps-font-size-internal
4464 (or ps-font-size-internal
4465 (ps-get-font-size 'ps-font-size)))
4466 (ps-header-font-size-internal
4467 (or ps-header-font-size-internal
4468 (ps-get-font-size 'ps-header-font-size)))
4469 (ps-header-title-font-size-internal
4470 (or ps-header-title-font-size-internal
4471 (ps-get-font-size 'ps-header-title-font-size)))
6bf5fb46
GM
4472 (ps-line-spacing-internal
4473 (or ps-line-spacing-internal
4474 (ps-get-size ps-line-spacing "line spacing")))
df5e6194 4475 (buf (get-buffer-create "*Nb-Pages*"))
6bf5fb46 4476 (ils ps-line-spacing-internal) ; initial line spacing
df5e6194
GM
4477 (ifs ps-font-size-internal) ; initial font size
4478 (ilh (ps-line-height 'ps-font-for-text)) ; initial line height
4479 (page-height (progn (ps-get-page-dimensions)
4480 ps-print-height))
4481 (ps-setup (ps-setup)) ; setup for the current buffer
4482 (fs-min 4) ; minimum font size
4483 lh-min ; minimum line height
4484 nb-lpp-max ; maximum nb of lines per page
4485 nb-page-min ; minimum nb of pages
4486 (fs-max 14) ; maximum font size
4487 lh-max ; maximum line height
4488 nb-lpp-min ; minimum nb of lines per page
4489 nb-page-max ; maximum nb of pages
4490 fs ; current font size
4491 lh ; current line height
4492 nb-lpp ; current nb of lines per page
4493 nb-page ; current nb of pages
4494 )
6bf5fb46 4495 (setq lh-min (/ (- (* (+ ilh ils) fs-min) ils) ifs)
bcc0d457
RS
4496 nb-lpp-max (floor (/ page-height lh-min))
4497 nb-page-min (ceiling (/ (float nb-lines) nb-lpp-max))
6bf5fb46 4498 lh-max (/ (- (* (+ ilh ils) fs-max) ils) ifs)
bcc0d457 4499 nb-lpp-min (floor (/ page-height lh-max))
8bd22fcf
KH
4500 nb-page-max (ceiling (/ (float nb-lines) nb-lpp-min))
4501 nb-page nb-page-min)
bcc0d457
RS
4502 (set-buffer buf)
4503 (goto-char (point-max))
df5e6194 4504 (or (bobp) (insert "\n" (make-string 75 ?\;) "\n"))
8bd22fcf 4505 (insert ps-setup
df5e6194 4506 (format "\nThere are %d lines.\n\n" nb-lines)
8bd22fcf 4507 "nb page / font size\n")
bcc0d457
RS
4508 (while (<= nb-page nb-page-max)
4509 (setq nb-lpp (ceiling (/ nb-lines (float nb-page)))
4510 lh (/ page-height nb-lpp)
4511 fs (/ (* ifs lh) ilh))
df5e6194 4512 (insert (format "%7d %s\n" nb-page fs))
bcc0d457
RS
4513 (setq nb-page (1+ nb-page)))
4514 (insert "\n")
4515 (display-buffer buf 'not-this-window)))
4516
6bdb808e
RS
4517;; macros used in `ps-select-font'
4518(defmacro ps-lookup (key) `(cdr (assq ,key font-entry)))
4519(defmacro ps-size-scale (key) `(/ (* (ps-lookup ,key) font-size) size))
4520
12b88fff
RS
4521(defun ps-select-font (font-family sym font-size title-font-size)
4522 (let ((font-entry (cdr (assq font-family ps-font-info-database))))
4523 (or font-entry
ef1159c2 4524 (error "Don't have data to scale font %s. Known fonts families are %s"
12b88fff
RS
4525 font-family
4526 (mapcar 'car ps-font-info-database)))
6bdb808e
RS
4527 (let ((size (ps-lookup 'size)))
4528 (put sym 'fonts (ps-lookup 'fonts))
4529 (put sym 'space-width (ps-size-scale 'space-width))
4530 (put sym 'avg-char-width (ps-size-scale 'avg-char-width))
4531 (put sym 'line-height (ps-size-scale 'line-height))
4532 (put sym 'title-line-height
4533 (/ (* (ps-lookup 'line-height) title-font-size) size)))))
bcc0d457 4534
12d89a2e 4535(defun ps-get-page-dimensions ()
bcc0d457
RS
4536 (let ((page-dimensions (cdr (assq ps-paper-type ps-page-dimensions-database)))
4537 page-width page-height)
4538 (cond
4539 ((null page-dimensions)
4540 (error "`ps-paper-type' must be one of:\n%s"
4541 (mapcar 'car ps-page-dimensions-database)))
4542 ((< ps-number-of-columns 1)
12b88fff 4543 (error "The number of columns %d should be positive"
8bd22fcf 4544 ps-number-of-columns)))
bcc0d457 4545
12b88fff 4546 (ps-select-font ps-font-family 'ps-font-for-text
7d8b7e8e 4547 ps-font-size-internal ps-font-size-internal)
12b88fff 4548 (ps-select-font ps-header-font-family 'ps-font-for-header
7d8b7e8e
KH
4549 ps-header-font-size-internal
4550 ps-header-title-font-size-internal)
319acba0
GM
4551 (ps-select-font ps-footer-font-family 'ps-font-for-footer
4552 ps-footer-font-size-internal ps-footer-font-size-internal)
bcc0d457
RS
4553
4554 (setq page-width (ps-page-dimensions-get-width page-dimensions)
4555 page-height (ps-page-dimensions-get-height page-dimensions))
4556
4557 ;; Landscape mode
4558 (if ps-landscape-mode
4559 ;; exchange width and height
4560 (setq page-width (prog1 page-height (setq page-height page-width))))
4561
4562 ;; It is used to get the lower right corner (only in landscape mode)
4563 (setq ps-landscape-page-height page-height)
4564
4565 ;; | lm | text | ic | text | ic | text | rm |
4566 ;; page-width == lm + n * pw + (n - 1) * ic + rm
4567 ;; => pw == (page-width - lm -rm - (n - 1) * ic) / n
8bd22fcf
KH
4568 (setq ps-print-width (/ (- page-width
4569 ps-left-margin ps-right-margin
4570 (* (1- ps-number-of-columns) ps-inter-column))
4571 ps-number-of-columns))
bcc0d457
RS
4572 (if (<= ps-print-width 0)
4573 (error "Bad horizontal layout:
4574page-width == %s
4575ps-left-margin == %s
4576ps-right-margin == %s
4577ps-inter-column == %s
4578ps-number-of-columns == %s
4579| lm | text | ic | text | ic | text | rm |
4580page-width == lm + n * print-width + (n - 1) * ic + rm
4581=> print-width == %d !"
4582 page-width
4583 ps-left-margin
4584 ps-right-margin
4585 ps-inter-column
4586 ps-number-of-columns
4587 ps-print-width))
4588
4589 (setq ps-print-height
4590 (- page-height ps-bottom-margin ps-top-margin))
4591 (if (<= ps-print-height 0)
4592 (error "Bad vertical layout:
4593ps-top-margin == %s
4594ps-bottom-margin == %s
4595page-height == bm + print-height + tm
4596=> print-height == %d !"
4597 ps-top-margin
4598 ps-bottom-margin
4599 ps-print-height))
319acba0
GM
4600 ;; If headers are turned on, deduct the height of the header from the print
4601 ;; height.
8bd22fcf 4602 (if ps-print-header
12b88fff
RS
4603 (setq ps-header-pad (* ps-header-line-pad
4604 (ps-title-line-height 'ps-font-for-header))
8bd22fcf
KH
4605 ps-print-height (- ps-print-height
4606 ps-header-offset
4607 ps-header-pad
12b88fff
RS
4608 (ps-title-line-height 'ps-font-for-header)
4609 (* (ps-line-height 'ps-font-for-header)
4610 (1- ps-header-lines))
8bd22fcf 4611 ps-header-pad)))
bcc0d457 4612 (if (<= ps-print-height 0)
319acba0 4613 (error "Bad vertical layout (header):
bcc0d457
RS
4614ps-top-margin == %s
4615ps-bottom-margin == %s
4616ps-header-offset == %s
4617ps-header-pad == %s
4618header-height == %s
4619page-height == bm + print-height + tm - ho - hh
4620=> print-height == %d !"
4621 ps-top-margin
4622 ps-bottom-margin
4623 ps-header-offset
4624 ps-header-pad
4625 (+ ps-header-pad
12b88fff
RS
4626 (ps-title-line-height 'ps-font-for-header)
4627 (* (ps-line-height 'ps-font-for-header)
4628 (1- ps-header-lines))
bcc0d457 4629 ps-header-pad)
2bd80d73 4630 ps-print-height))
319acba0
GM
4631 ;; If footers are turned on, deduct the height of the footer from the print
4632 ;; height.
4633 (if ps-print-footer
4634 (setq ps-footer-pad (* ps-footer-line-pad
4635 (ps-title-line-height 'ps-font-for-footer))
4636 ps-print-height (- ps-print-height
4637 ps-footer-offset
4638 ps-footer-pad
4639 (* (ps-line-height 'ps-font-for-footer)
4640 (1- ps-footer-lines))
4641 ps-footer-pad)))
4642 (if (<= ps-print-height 0)
4643 (error "Bad vertical layout (footer):
4644ps-top-margin == %s
4645ps-bottom-margin == %s
4646ps-footer-offset == %s
4647ps-footer-pad == %s
4648footer-height == %s
4649page-height == bm + print-height + tm - fo - fh
4650=> print-height == %d !"
4651 ps-top-margin
4652 ps-bottom-margin
4653 ps-footer-offset
4654 ps-footer-pad
4655 (+ ps-footer-pad
4656 (* (ps-line-height 'ps-font-for-footer)
4657 (1- ps-footer-lines))
4658 ps-footer-pad)
4659 ps-print-height))
2bd80d73
GM
4660 ;; ps-zebra-stripe-follow is `full' or `full-follow'
4661 (if ps-zebra-stripe-full-p
4662 (let* ((line-height (ps-line-height 'ps-font-for-text))
6bf5fb46
GM
4663 (zebra (* (+ line-height ps-line-spacing-internal)
4664 ps-zebra-stripe-height)))
2bd80d73
GM
4665 (setq ps-print-height (- (* (floor ps-print-height zebra) zebra)
4666 line-height))
4667 (if (<= ps-print-height 0)
319acba0 4668 (error "Bad vertical layout (full zebra stripe follow):
2bd80d73
GM
4669ps-zebra-stripe-follow == %s
4670ps-zebra-stripe-height == %s
4671font-text-height == %s
6bf5fb46
GM
4672line-spacing == %s
4673page-height == ((floor print-height ((th + ls) * zh)) * ((th + ls) * zh)) - th
2bd80d73
GM
4674=> print-height == %d !"
4675 ps-zebra-stripe-follow
4676 ps-zebra-stripe-height
4677 (ps-line-height 'ps-font-for-text)
6bf5fb46 4678 ps-line-spacing-internal
2bd80d73 4679 ps-print-height))))))
ef2cbb24 4680
55732434
GM
4681
4682(defun ps-print-preprint-region (prefix-arg)
509b4dbc 4683 (or (ps-mark-active-p)
55732434
GM
4684 (error "The mark is not set now"))
4685 (list (point) (mark) (ps-print-preprint prefix-arg)))
4686
4687
edc9cd35
GM
4688(defun ps-print-preprint (prefix-arg)
4689 (and prefix-arg
4690 (or (numberp prefix-arg)
4691 (listp prefix-arg))
d3ab8dac
KH
4692 (let* ((name (concat (file-name-nondirectory (or (buffer-file-name)
4693 (buffer-name)))
4694 ".ps"))
5b76833f 4695 (prompt (format "Save PostScript to file (default %s): " name))
8bd22fcf 4696 (res (read-file-name prompt default-directory name nil)))
ea0c615d
GM
4697 (while (cond ((file-directory-p res)
4698 (ding)
4699 (setq prompt "It's a directory"))
4700 ((not (file-writable-p res))
d3ab8dac 4701 (ding)
ea0c615d 4702 (setq prompt "File is unwritable"))
d3ab8dac 4703 ((file-exists-p res)
ea0c615d 4704 (setq prompt "File exists")
d3ab8dac
KH
4705 (not (y-or-n-p (format "File `%s' exists; overwrite? "
4706 res))))
4707 (t nil))
4708 (setq res (read-file-name
ea0c615d 4709 (format "%s; save PostScript to file: " prompt)
d3ab8dac
KH
4710 (file-name-directory res) nil nil
4711 (file-name-nondirectory res))))
8bd22fcf
KH
4712 (if (file-directory-p res)
4713 (expand-file-name name (file-name-as-directory res))
4714 res))))
12d89a2e
RS
4715
4716;; The following functions implement a simple list-buffering scheme so
4717;; that ps-print doesn't have to repeatedly switch between buffers
857686a6
RS
4718;; while spooling. The functions `ps-output' and `ps-output-string' build
4719;; up the lists; the function `ps-flush-output' takes the lists and
12d89a2e
RS
4720;; insert its contents into the spool buffer (*PostScript*).
4721
857686a6
RS
4722(defvar ps-string-escape-codes
4723 (let ((table (make-vector 256 nil))
4724 (char ?\000))
4725 ;; control characters
4726 (while (<= char ?\037)
4727 (aset table char (format "\\%03o" char))
4728 (setq char (1+ char)))
4729 ;; printable characters
4730 (while (< char ?\177)
4731 (aset table char (format "%c" char))
4732 (setq char (1+ char)))
4733 ;; DEL and 8-bit characters
4734 (while (<= char ?\377)
4735 (aset table char (format "\\%o" char))
4736 (setq char (1+ char)))
4737 ;; Override ASCII formatting characters with named escape code:
4738 (aset table ?\n "\\n") ; [NL] linefeed
4739 (aset table ?\r "\\r") ; [CR] carriage return
4740 (aset table ?\t "\\t") ; [HT] horizontal tab
4741 (aset table ?\b "\\b") ; [BS] backspace
4742 (aset table ?\f "\\f") ; [NP] form feed
4743 ;; Escape PostScript escape and string delimiter characters:
4744 (aset table ?\\ "\\\\")
4745 (aset table ?\( "\\(")
4746 (aset table ?\) "\\)")
4747 table)
4748 "Vector used to map characters to PostScript string escape codes.")
4749
6bf5fb46 4750(defsubst ps-output-string-prim (string)
12d89a2e
RS
4751 (insert "(") ;insert start-string delimiter
4752 (save-excursion ;insert string
e65df0a1 4753 (insert (string-as-unibyte string)))
12d89a2e 4754 ;; Find and quote special characters as necessary for PS
c82b4a75 4755 ;; This skips everything except control chars, non-ASCII chars, (, ) and \.
b61e2c11
RS
4756 (while (progn (skip-chars-forward " -'*-[]-~") (not (eobp)))
4757 (let ((special (following-char)))
e65df0a1 4758 (delete-char 1)
c794a94d
JB
4759 (insert
4760 (if (and (<= 0 special) (<= special 255))
4761 (aref ps-string-escape-codes special)
4762 ;; insert hexadecimal representation if character code is out of range
4763 (format "\\%04X" special)
4764 ))))
12d89a2e
RS
4765 (goto-char (point-max))
4766 (insert ")")) ;insert end-string delimiter
ef2cbb24 4767
6bf5fb46 4768(defsubst ps-init-output-queue ()
1fd9b7fe 4769 (setq ps-output-head (list "")
8bd22fcf 4770 ps-output-tail ps-output-head))
ef2cbb24 4771
1fd9b7fe
GM
4772
4773(defun ps-selected-pages ()
4774 (while (progn
4775 (setq ps-first-page (car (car ps-selected-pages))
4776 ps-last-page (cdr (car ps-selected-pages))
4777 ps-selected-pages (cdr ps-selected-pages))
4778 (and ps-selected-pages
4779 (< ps-last-page ps-page-postscript)))))
4780
4781
6bf5fb46 4782(defsubst ps-print-page-p ()
ea0c615d
GM
4783 (setq ps-print-page-p
4784 (and (cond ((null ps-first-page))
4785 ((<= ps-page-postscript ps-last-page)
4786 (<= ps-first-page ps-page-postscript))
4787 (ps-selected-pages
4788 (ps-selected-pages)
4789 (and (<= ps-first-page ps-page-postscript)
4790 (<= ps-page-postscript ps-last-page)))
4791 (t
4792 nil))
4b3eb10f 4793 (cond ((eq ps-even-or-odd-pages 'even-page)
ea0c615d 4794 (= (logand ps-page-postscript 1) 0))
4b3eb10f 4795 ((eq ps-even-or-odd-pages 'odd-page)
ea0c615d
GM
4796 (= (logand ps-page-postscript 1) 1))
4797 (t)
4798 ))))
1fd9b7fe
GM
4799
4800
6bf5fb46 4801(defsubst ps-print-sheet-p ()
4b3eb10f
GM
4802 (setq ps-print-page-p
4803 (cond ((eq ps-even-or-odd-pages 'even-sheet)
4804 (= (logand ps-page-sheet 1) 0))
4805 ((eq ps-even-or-odd-pages 'odd-sheet)
4806 (= (logand ps-page-sheet 1) 1))
4807 (t)
4808 )))
4809
4810
12d89a2e 4811(defun ps-output (&rest args)
ea0c615d 4812 (when ps-print-page-p
1fd9b7fe
GM
4813 (setcdr ps-output-tail args)
4814 (while (cdr ps-output-tail)
4815 (setq ps-output-tail (cdr ps-output-tail)))))
ef2cbb24 4816
12d89a2e
RS
4817(defun ps-output-string (string)
4818 (ps-output t string))
ef2cbb24 4819
e65df0a1
KH
4820;; Output strings in the list ARGS in the PostScript prologue part.
4821(defun ps-output-prologue (args)
4822 (ps-output 'prologue (if (stringp args) (list args) args)))
4823
12d89a2e
RS
4824(defun ps-flush-output ()
4825 (save-excursion
4826 (set-buffer ps-spool-buffer)
4827 (goto-char (point-max))
4828 (while ps-output-head
4829 (let ((it (car ps-output-head)))
e65df0a1
KH
4830 (cond
4831 ((eq t it)
4832 (setq ps-output-head (cdr ps-output-head))
4833 (ps-output-string-prim (car ps-output-head)))
4834 ((eq 'prologue it)
12d89a2e 4835 (setq ps-output-head (cdr ps-output-head))
e65df0a1
KH
4836 (save-excursion
4837 (search-backward "\nBeginDoc")
4838 (forward-char 1)
4839 (apply 'insert (car ps-output-head))))
4840 (t
4841 (insert it))))
12d89a2e
RS
4842 (setq ps-output-head (cdr ps-output-head))))
4843 (ps-init-output-queue))
4844
4845(defun ps-insert-file (fname)
4846 (ps-flush-output)
12d89a2e
RS
4847 (save-excursion
4848 (set-buffer ps-spool-buffer)
4849 (goto-char (point-max))
b6d0ac87 4850 (insert-file-contents fname)))
06fb6aab 4851
edf0b0c5
VJL
4852;; These functions are used in `ps-mule' to get charset of header and footer.
4853;; To avoid unnecessary calls to functions in `ps-left-header',
4854;; `ps-right-header', `ps-left-footer' and `ps-right-footer'.
4855
4856(defun ps-generate-string-list (content)
4857 (let (str)
4858 (while content
4859 (setq str (cons (cond
9586e1d3 4860 ;; string
edf0b0c5
VJL
4861 ((stringp (car content))
4862 (car content))
9586e1d3 4863 ;; function symbol
5d62baca 4864 ((functionp (car content))
edf0b0c5 4865 (concat "(" (funcall (car content)) ")"))
9586e1d3 4866 ;; variable symbol
edf0b0c5
VJL
4867 ((and (symbolp (car content)) (boundp (car content)))
4868 (concat "(" (symbol-value (car content)) ")"))
9586e1d3 4869 ;; otherwise, empty string
edf0b0c5
VJL
4870 (t
4871 ""))
4872 str)
4873 content (cdr content)))
4874 (nreverse str)))
4875
6db15364
VJL
4876(defvar ps-lh-cache nil)
4877(defvar ps-rh-cache nil)
4878(defvar ps-lf-cache nil)
4879(defvar ps-rf-cache nil)
edf0b0c5
VJL
4880
4881(defun ps-header-footer-string ()
4882 (and ps-print-header
4883 (setq ps-lh-cache (ps-generate-string-list ps-left-header)
4884 ps-rh-cache (ps-generate-string-list ps-right-header)))
4885 (and ps-print-footer
4886 (setq ps-lf-cache (ps-generate-string-list ps-left-footer)
4887 ps-rf-cache (ps-generate-string-list ps-right-footer)))
b77ba60f 4888 (append ps-lh-cache ps-rh-cache ps-lf-cache ps-rf-cache))
edf0b0c5 4889
319acba0 4890;; These functions insert the arrays that define the contents of the headers.
ef2cbb24 4891
12d89a2e 4892(defun ps-generate-header-line (fonttag &optional content)
319acba0 4893 (ps-output " [" fonttag " ")
12d89a2e 4894 (cond
319acba0
GM
4895 ;; Literal strings should be output as is -- the string must contain its own
4896 ;; PS string delimiters, '(' and ')', if necessary.
12d89a2e 4897 ((stringp content)
6bf5fb46 4898 (ps-output (ps-mule-encode-header-string content fonttag)))
12d89a2e 4899
319acba0
GM
4900 ;; Functions are called -- they should return strings; they will be inserted
4901 ;; as strings and the PS string delimiters added.
5d62baca 4902 ((functionp content)
6bf5fb46
GM
4903 (ps-output-string (ps-mule-encode-header-string (funcall content)
4904 fonttag)))
12d89a2e 4905
319acba0
GM
4906 ;; Variables will have their contents inserted. They should contain
4907 ;; strings, and will be inserted as strings.
12d89a2e 4908 ((and (symbolp content) (boundp content))
6bf5fb46
GM
4909 (ps-output-string (ps-mule-encode-header-string (symbol-value content)
4910 fonttag)))
12d89a2e
RS
4911
4912 ;; Anything else will get turned into an empty string.
4913 (t
4914 (ps-output-string "")))
319acba0 4915 (ps-output "]\n"))
12d89a2e 4916
319acba0
GM
4917(defun ps-generate-header (name fonttag0 fonttag1 contents)
4918 (ps-output "/" name "[\n")
4919 (and contents (> ps-header-lines 0)
4920 (let ((count 1))
4921 (ps-generate-header-line fonttag0 (car contents))
4922 (while (and (< count ps-header-lines)
4923 (setq contents (cdr contents)))
4924 (ps-generate-header-line fonttag1 (car contents))
4925 (setq count (1+ count)))))
4926 (ps-output "]def\n"))
12d89a2e 4927
bc0d41bd 4928
6e1b1da6
GM
4929(defun ps-output-boolean (name bool)
4930 (ps-output (format "/%s %s def\n" name (if bool "true" "false"))))
ef2cbb24 4931
06fb6aab 4932
319acba0
GM
4933(defun ps-output-frame-properties (name alist)
4934 (ps-output "/" name " ["
efa89c1f 4935 (ps-format-color (cdr (assq 'fore-color alist)) 0.0)
319acba0
GM
4936 (ps-format-color (cdr (assq 'back-color alist)) 0.9)
4937 (ps-float-format (or (cdr (assq 'border-width alist)) 0.4))
efa89c1f
GM
4938 (ps-format-color (cdr (assq 'border-color alist)) 0.0)
4939 (ps-format-color (cdr (assq 'shadow-color alist)) 0.0)
319acba0
GM
4940 "]def\n"))
4941
4942
87a16a06
RS
4943(defun ps-background-pages (page-list func)
4944 (if page-list
4945 (mapcar
bc0d41bd
KH
4946 #'(lambda (pages)
4947 (let ((start (if (consp pages) (car pages) pages))
4948 (end (if (consp pages) (cdr pages) pages)))
4949 (and (integerp start) (integerp end) (<= start end)
4950 (add-to-list 'ps-background-pages (vector start end func)))))
87a16a06
RS
4951 page-list)
4952 (setq ps-background-all-pages (cons func ps-background-all-pages))))
4953
4954
bc0d41bd
KH
4955(defconst ps-boundingbox-re
4956 "^%%BoundingBox:\
4957\\s-+\\([0-9.]+\\)\\s-+\\([0-9.]+\\)\\s-+\\([0-9.]+\\)\\s-+\\([0-9.]+\\)")
4958
4959
87a16a06
RS
4960(defun ps-get-boundingbox ()
4961 (save-excursion
4962 (set-buffer ps-spool-buffer)
4963 (save-excursion
bc0d41bd 4964 (if (re-search-forward ps-boundingbox-re nil t)
87a16a06
RS
4965 (vector (string-to-number ; lower x
4966 (buffer-substring (match-beginning 1) (match-end 1)))
4967 (string-to-number ; lower y
4968 (buffer-substring (match-beginning 2) (match-end 2)))
4969 (string-to-number ; upper x
4970 (buffer-substring (match-beginning 3) (match-end 3)))
4971 (string-to-number ; upper y
4972 (buffer-substring (match-beginning 4) (match-end 4))))
4973 (vector 0 0 0 0)))))
4974
4975
4976;; Emacs understands the %f format; we'll use it to limit color RGB values
4977;; to three decimals to cut down some on the size of the PostScript output.
eafa92bf 4978;; XEmacs will have to make do with %s (princ) for floats.
87a16a06 4979
b6d0ac87 4980(defvar ps-float-format (if (featurep 'xemacs)
cf04718a
SM
4981 "%s " ; XEmacs
4982 "%0.3f ")) ; Emacs
87a16a06
RS
4983
4984
4985(defun ps-float-format (value &optional default)
4986 (let ((literal (or value default)))
efa89c1f
GM
4987 (cond ((null literal)
4988 " ")
4989 ((numberp literal)
4990 (format ps-float-format (* literal 1.0))) ; force float number
4991 (t
4992 (format "%s " literal))
4993 )))
87a16a06
RS
4994
4995
4996(defun ps-background-text ()
4997 (mapcar
bc0d41bd
KH
4998 #'(lambda (text)
4999 (setq ps-background-text-count (1+ ps-background-text-count))
c3d6d211 5000 (ps-output (format "/ShowBackText-%d{\n" ps-background-text-count))
bc0d41bd
KH
5001 (ps-output-string (nth 0 text)) ; text
5002 (ps-output
5003 "\n"
5004 (ps-float-format (nth 4 text) 200.0) ; font size
5005 (format "/%s " (or (nth 3 text) "Times-Roman")) ; font name
5006 (ps-float-format (nth 6 text)
5007 "PrintHeight PrintPageWidth atan") ; rotation
5008 (ps-float-format (nth 5 text) 0.85) ; gray
5009 (ps-float-format (nth 1 text) "0") ; x position
8e234846 5010 (ps-float-format (nth 2 text) "0") ; y position
c3d6d211 5011 "\nShowBackText}def\n")
bc0d41bd
KH
5012 (ps-background-pages (nthcdr 7 text) ; page list
5013 (format "ShowBackText-%d\n"
5014 ps-background-text-count)))
87a16a06
RS
5015 ps-print-background-text))
5016
5017
5018(defun ps-background-image ()
5019 (mapcar
bc0d41bd
KH
5020 #'(lambda (image)
5021 (let ((image-file (expand-file-name (nth 0 image))))
41481e4b
KH
5022 (when (file-readable-p image-file)
5023 (setq ps-background-image-count (1+ ps-background-image-count))
5024 (ps-output
c3d6d211 5025 (format "/ShowBackImage-%d{\n--back-- "
41481e4b
KH
5026 ps-background-image-count)
5027 (ps-float-format (nth 5 image) 0.0) ; rotation
5028 (ps-float-format (nth 3 image) 1.0) ; x scale
5029 (ps-float-format (nth 4 image) 1.0) ; y scale
5030 (ps-float-format (nth 1 image) ; x position
5031 "PrintPageWidth 2 div")
5032 (ps-float-format (nth 2 image) ; y position
5033 "PrintHeight 2 div BottomMargin add")
5034 "\nBeginBackImage\n")
5035 (ps-insert-file image-file)
01cdabc6 5036 ;; coordinate adjustment to center image
41481e4b
KH
5037 ;; around x and y position
5038 (let ((box (ps-get-boundingbox)))
5039 (save-excursion
5040 (set-buffer ps-spool-buffer)
5041 (save-excursion
5042 (if (re-search-backward "^--back--" nil t)
5043 (replace-match
5044 (format "%s %s"
5045 (ps-float-format
5046 (- (+ (/ (- (aref box 2) (aref box 0)) 2.0)
5047 (aref box 0))))
5048 (ps-float-format
5049 (- (+ (/ (- (aref box 3) (aref box 1)) 2.0)
5050 (aref box 1)))))
5051 t)))))
c3d6d211 5052 (ps-output "\nEndBackImage}def\n")
41481e4b
KH
5053 (ps-background-pages (nthcdr 6 image) ; page list
5054 (format "ShowBackImage-%d\n"
5055 ps-background-image-count)))))
87a16a06
RS
5056 ps-print-background-image))
5057
5058
a18ed129 5059(defun ps-background (page-number)
87a16a06 5060 (let (has-local-background)
81ce287c
JB
5061 (mapc #'(lambda (range)
5062 (and (<= (aref range 0) page-number)
5063 (<= page-number (aref range 1))
5064 (if has-local-background
5065 (ps-output (aref range 2))
5066 (setq has-local-background t)
5067 (ps-output "/printLocalBackground{\n"
5068 (aref range 2)))))
5069 ps-background-pages)
c3d6d211 5070 (and has-local-background (ps-output "}def\n"))))
87a16a06
RS
5071
5072
0140c600
EZ
5073;; Return a list of the distinct elements of LIST.
5074;; Elements are compared with `equal'.
5075(defun ps-remove-duplicates (list)
5076 (let (new (tail list))
5077 (while tail
5078 (or (member (car tail) new)
5079 (setq new (cons (car tail) new)))
5080 (setq tail (cdr tail)))
5081 (nreverse new)))
5082
c82b4a75 5083
6bdb808e
RS
5084;; Find the first occurrence of ITEM in LIST.
5085;; Return the index of the matching item, or nil if not found.
5086;; Elements are compared with `eq'.
7ae35a2f 5087(defun ps-alist-position (item list)
6bdb808e
RS
5088 (let ((tail list) (index 0) found)
5089 (while tail
7ae35a2f 5090 (if (setq found (eq (car (car tail)) item))
6bdb808e
RS
5091 (setq tail nil)
5092 (setq index (1+ index)
5093 tail (cdr tail))))
5094 (and found index)))
5095
5096
bc0d41bd
KH
5097(defconst ps-n-up-database
5098 '((a4
5099 (1 nil 1 1 0)
5100 (2 t 1 2 0)
5101 (4 nil 2 2 0)
5102 (6 t 2 3 1)
5103 (8 t 2 4 0)
5104 (9 nil 3 3 0)
5105 (12 t 3 4 2)
5106 (16 nil 4 4 0)
5107 (18 t 3 6 0)
5108 (20 nil 5 4 1)
5109 (25 nil 5 5 0)
5110 (30 nil 6 5 1)
5111 (32 t 4 8 0)
5112 (36 nil 6 6 0)
5113 (42 nil 7 6 1)
5114 (49 nil 7 7 0)
5115 (50 t 5 10 0)
5116 (56 nil 8 7 1)
5117 (64 nil 8 8 0)
5118 (72 nil 9 8 1)
5119 (81 nil 9 9 0)
5120 (90 nil 10 9 1)
5121 (100 nil 10 10 0))
5122 (a3
5123 (1 nil 1 1 0)
5124 (2 t 1 2 0)
5125 (4 nil 2 2 0)
5126 (6 t 2 3 1)
5127 (8 t 2 4 0)
5128 (9 nil 3 3 0)
5129 (12 nil 4 3 1)
5130 (16 nil 4 4 0)
5131 (18 t 3 6 0)
5132 (20 nil 5 4 1)
5133 (25 nil 5 5 0)
5134 (30 nil 6 5 1)
5135 (32 t 4 8 0)
5136 (36 nil 6 6 0)
5137 (42 nil 7 6 1)
5138 (49 nil 7 7 0)
5139 (50 t 5 10 0)
5140 (56 nil 8 7 1)
5141 (64 nil 8 8 0)
5142 (72 nil 9 8 1)
5143 (81 nil 9 9 0)
5144 (90 nil 10 9 1)
5145 (100 nil 10 10 0))
5146 (letter
5147 (1 nil 1 1 0)
8e234846 5148 (2 t 1 2 0) ; adjusted by PostScript code
bc0d41bd
KH
5149 (4 nil 2 2 0)
5150 (6 t 2 3 0)
5151 (9 nil 3 3 0)
5152 (12 nil 4 3 1)
5153 (16 nil 4 4 0)
5154 (20 nil 5 4 1)
5155 (25 nil 5 5 0)
5156 (30 nil 6 5 1)
5157 (36 nil 6 6 0)
5158 (40 t 5 8 0)
5159 (42 nil 7 6 1)
5160 (49 nil 7 7 0)
5161 (56 nil 8 7 1)
5162 (64 nil 8 8 0)
5163 (72 nil 9 8 1)
5164 (81 nil 9 9 0)
5165 (90 nil 10 9 1)
5166 (100 nil 10 10 0))
5167 (legal
5168 (1 nil 1 1 0)
5169 (2 t 1 2 0)
5170 (4 nil 2 2 0)
5171 (6 nil 3 2 1)
5172 (9 nil 3 3 0)
5173 (10 t 2 5 0)
5174 (12 nil 4 3 1)
5175 (16 nil 4 4 0)
5176 (20 nil 5 4 1)
5177 (25 nil 5 5 0)
5178 (30 nil 6 5 1)
5179 (36 nil 6 6 0)
5180 (42 nil 7 6 1)
5181 (49 nil 7 7 0)
5182 (56 nil 8 7 1)
5183 (64 nil 8 8 0)
5184 (70 t 5 14 0)
5185 (72 nil 9 8 1)
5186 (81 nil 9 9 0)
5187 (90 nil 10 9 1)
5188 (100 nil 10 10 0))
5189 (letter-small
5190 (1 nil 1 1 0)
8e234846 5191 (2 t 1 2 0) ; adjusted by PostScript code
bc0d41bd
KH
5192 (4 nil 2 2 0)
5193 (6 t 2 3 0)
5194 (9 nil 3 3 0)
5195 (12 t 3 4 1)
5196 (15 t 3 5 0)
5197 (16 nil 4 4 0)
5198 (20 nil 5 4 1)
5199 (25 nil 5 5 0)
5200 (28 t 4 7 0)
5201 (30 nil 6 5 1)
5202 (36 nil 6 6 0)
5203 (40 t 5 8 0)
5204 (42 nil 7 6 1)
5205 (49 nil 7 7 0)
5206 (56 nil 8 7 1)
5207 (60 t 6 10 0)
5208 (64 nil 8 8 0)
5209 (72 ni 9 8 1)
5210 (81 nil 9 9 0)
5211 (84 t 7 12 0)
5212 (90 nil 10 9 1)
5213 (100 nil 10 10 0))
5214 (tabloid
5215 (1 nil 1 1 0)
5216 (2 t 1 2 0)
5217 (4 nil 2 2 0)
5218 (6 t 2 3 1)
5219 (8 t 2 4 0)
5220 (9 nil 3 3 0)
5221 (12 nil 4 3 1)
5222 (16 nil 4 4 0)
5223 (20 nil 5 4 1)
5224 (25 nil 5 5 0)
5225 (30 nil 6 5 1)
5226 (36 nil 6 6 0)
5227 (42 nil 7 6 1)
5228 (49 nil 7 7 0)
5229 (56 nil 8 7 1)
5230 (64 nil 8 8 0)
5231 (72 nil 9 8 1)
5232 (81 nil 9 9 0)
5233 (84 t 6 14 0)
5234 (90 nil 10 9 1)
5235 (100 nil 10 10 0))
5236 ;; Ledger paper size is a special case, it is the only paper size where the
5237 ;; normal size is landscaped, that is, the height is smaller than width.
5238 ;; So, we use the special value `pag' in the `landscape' field.
5239 (ledger
5240 (1 nil 1 1 0)
5241 (2 pag 1 2 0)
5242 (4 nil 2 2 0)
5243 (6 pag 2 3 1)
5244 (8 pag 2 4 0)
5245 (9 nil 3 3 0)
5246 (12 nil 4 3 1)
5247 (16 nil 4 4 0)
5248 (20 nil 5 4 1)
5249 (25 nil 5 5 0)
5250 (30 nil 6 5 1)
5251 (36 nil 6 6 0)
5252 (42 nil 7 6 1)
5253 (49 nil 7 7 0)
5254 (56 nil 8 7 1)
5255 (64 nil 8 8 0)
5256 (72 nil 9 8 1)
5257 (81 nil 9 9 0)
5258 (84 pag 6 14 0)
5259 (90 nil 10 9 1)
5260 (100 nil 10 10 0))
5261 (statement
5262 (1 nil 1 1 0)
5263 (2 t 1 2 0)
5264 (4 nil 2 2 0)
5265 (6 nil 3 2 1)
5266 (9 nil 3 3 0)
5267 (10 t 2 5 0)
5268 (12 nil 4 3 1)
5269 (16 nil 4 4 0)
5270 (20 nil 5 4 1)
5271 (21 t 3 7 0)
5272 (25 nil 5 5 0)
5273 (30 nil 6 5 1)
5274 (36 nil 6 6 0)
5275 (40 t 4 10 0)
5276 (42 nil 7 6 1)
5277 (49 nil 7 7 0)
5278 (56 nil 8 7 1)
5279 (60 t 5 12 0)
5280 (64 nil 8 8 0)
5281 (72 nil 9 8 1)
5282 (81 nil 9 9 0)
5283 (90 nil 10 9 1)
5284 (100 nil 10 10 0))
5285 (executive
5286 (1 nil 1 1 0)
8e234846 5287 (2 t 1 2 0) ; adjusted by PostScript code
bc0d41bd
KH
5288 (4 nil 2 2 0)
5289 (6 t 2 3 0)
5290 (9 nil 3 3 0)
5291 (12 nil 4 3 1)
5292 (16 nil 4 4 0)
5293 (20 nil 5 4 1)
5294 (25 nil 5 5 0)
5295 (28 t 4 7 0)
5296 (30 nil 6 5 1)
5297 (36 nil 6 6 0)
5298 (42 nil 7 6 1)
5299 (45 t 5 9 0)
5300 (49 nil 7 7 0)
5301 (56 nil 8 7 1)
5302 (60 t 6 10 0)
5303 (64 nil 8 8 0)
5304 (72 nil 9 8 1)
5305 (81 nil 9 9 0)
5306 (84 t 7 12 0)
5307 (90 nil 10 9 1)
5308 (100 nil 10 10 0))
5309 (a4small
5310 (1 nil 1 1 0)
5311 (2 t 1 2 0)
5312 (4 nil 2 2 0)
5313 (6 t 2 3 1)
5314 (8 t 2 4 0)
5315 (9 nil 3 3 0)
5316 (12 nil 4 3 1)
5317 (16 nil 4 4 0)
5318 (18 t 3 6 0)
5319 (20 nil 5 4 1)
5320 (25 nil 5 5 0)
5321 (30 nil 6 5 1)
5322 (32 t 4 8 0)
5323 (36 nil 6 6 0)
5324 (42 nil 7 6 1)
5325 (49 nil 7 7 0)
5326 (50 t 5 10 0)
5327 (56 nil 8 7 1)
5328 (64 nil 8 8 0)
5329 (72 nil 9 8 1)
5330 (78 t 6 13 0)
5331 (81 nil 9 9 0)
5332 (90 nil 10 9 1)
5333 (100 nil 10 10 0))
5334 (b4
5335 (1 nil 1 1 0)
5336 (2 t 1 2 0)
5337 (4 nil 2 2 0)
5338 (6 t 2 3 1)
5339 (8 t 2 4 0)
5340 (9 nil 3 3 0)
5341 (12 nil 4 3 1)
5342 (16 nil 4 4 0)
5343 (18 t 3 6 0)
5344 (20 nil 5 4 1)
5345 (25 nil 5 5 0)
5346 (30 nil 6 5 1)
5347 (32 t 4 8 0)
5348 (36 nil 6 6 0)
5349 (42 nil 7 6 1)
5350 (49 nil 7 7 0)
5351 (50 t 5 10 0)
5352 (56 nil 8 7 1)
5353 (64 nil 8 8 0)
5354 (72 nil 9 8 1)
5355 (81 nil 9 9 0)
5356 (90 nil 10 9 1)
5357 (100 nil 10 10 0))
5358 (b5
5359 (1 nil 1 1 0)
5360 (2 t 1 2 0)
5361 (4 nil 2 2 0)
5362 (6 t 2 3 1)
5363 (8 t 2 4 0)
5364 (9 nil 3 3 0)
5365 (12 nil 4 3 1)
5366 (16 nil 4 4 0)
5367 (18 t 3 6 0)
5368 (20 nil 5 4 1)
5369 (25 nil 5 5 0)
5370 (30 nil 6 5 1)
5371 (32 t 4 8 0)
5372 (36 nil 6 6 0)
5373 (42 nil 7 6 1)
5374 (49 nil 7 7 0)
5375 (50 t 5 10 0)
5376 (56 nil 8 7 1)
5377 (64 nil 8 8 0)
5378 (72 nil 9 8 0)
5379 (81 nil 9 9 0)
5380 (90 nil 10 9 1)
5381 (98 t 7 14 0)
5382 (100 nil 10 10 0)))
5383 "Alist which is the page matrix database used for N-up printing.
5384
5385Each element has the following form:
5386
5387 (PAGE
5388 (MAX LANDSCAPE LINES COLUMNS COL-MISSING)
5389 ...)
5390
5391Where:
5392PAGE is the page size used (see `ps-paper-type').
5393MAX is the maximum elements of this page matrix.
5394LANDSCAPE specifies if page matrix is landscaped, has the following valid
5395 values:
5396 nil the sheet is in portrait mode.
5397 t the sheet is in landscape mode.
5398 pag the sheet is in portrait mode and page is in landscape mode.
5399LINES is the number of lines of page matrix.
5400COLUMNS is the number of columns of page matrix.
5401COL-MISSING is the number of columns missing to fill the sheet.")
5402
5403
5404(defmacro ps-n-up-landscape (mat) `(nth 1 ,mat))
5405(defmacro ps-n-up-lines (mat) `(nth 2 ,mat))
5406(defmacro ps-n-up-columns (mat) `(nth 3 ,mat))
5407(defmacro ps-n-up-missing (mat) `(nth 4 ,mat))
5408
5409
5410(defun ps-n-up-printing ()
5411 ;; force `ps-n-up-printing' be in range 1 to 100.
5412 (setq ps-n-up-printing (max (min ps-n-up-printing 100) 1))
5413 ;; find suitable page matrix for a given `ps-paper-type'.
5414 (let ((the-list (cdr (assq ps-paper-type ps-n-up-database))))
5415 (and the-list
5416 (while (> ps-n-up-printing (caar the-list))
5417 (setq the-list (cdr the-list))))
5418 (car the-list)))
5419
5420
5421(defconst ps-n-up-filling-database
5422 '((left-top
5423 "PageWidth" ; N-Up-XColumn
5424 "0" ; N-Up-YColumn
5425 "N-Up-End 1 sub PageWidth mul neg" ; N-Up-XLine
5426 "LandscapePageHeight neg" ; N-Up-YLine
5427 "N-Up-Lines" ; N-Up-Repeat
5428 "N-Up-Columns" ; N-Up-End
5429 "0" ; N-Up-XStart
5430 "0") ; N-Up-YStart
5431 (left-bottom
5432 "PageWidth" ; N-Up-XColumn
5433 "0" ; N-Up-YColumn
5434 "N-Up-End 1 sub PageWidth mul neg" ; N-Up-XLine
5435 "LandscapePageHeight" ; N-Up-YLine
5436 "N-Up-Lines" ; N-Up-Repeat
5437 "N-Up-Columns" ; N-Up-End
5438 "0" ; N-Up-XStart
5439 "N-Up-Repeat 1 sub LandscapePageHeight mul neg") ; N-Up-YStart
5440 (right-top
5441 "PageWidth neg" ; N-Up-XColumn
5442 "0" ; N-Up-YColumn
5443 "N-Up-End 1 sub PageWidth mul" ; N-Up-XLine
5444 "LandscapePageHeight neg" ; N-Up-YLine
5445 "N-Up-Lines" ; N-Up-Repeat
5446 "N-Up-Columns" ; N-Up-End
5447 "N-Up-End 1 sub PageWidth mul" ; N-Up-XStart
5448 "0") ; N-Up-YStart
5449 (right-bottom
5450 "PageWidth neg" ; N-Up-XColumn
5451 "0" ; N-Up-YColumn
5452 "N-Up-End 1 sub PageWidth mul" ; N-Up-XLine
5453 "LandscapePageHeight" ; N-Up-YLine
5454 "N-Up-Lines" ; N-Up-Repeat
5455 "N-Up-Columns" ; N-Up-End
5456 "N-Up-End 1 sub PageWidth mul" ; N-Up-XStart
5457 "N-Up-Repeat 1 sub LandscapePageHeight mul neg") ; N-Up-YStart
5458 (top-left
5459 "0" ; N-Up-XColumn
5460 "LandscapePageHeight neg" ; N-Up-YColumn
5461 "PageWidth" ; N-Up-XLine
5462 "N-Up-End 1 sub LandscapePageHeight mul" ; N-Up-YLine
5463 "N-Up-Columns" ; N-Up-Repeat
5464 "N-Up-Lines" ; N-Up-End
5465 "0" ; N-Up-XStart
5466 "0") ; N-Up-YStart
5467 (bottom-left
5468 "0" ; N-Up-XColumn
5469 "LandscapePageHeight" ; N-Up-YColumn
5470 "PageWidth" ; N-Up-XLine
5471 "N-Up-End 1 sub LandscapePageHeight mul neg" ; N-Up-YLine
5472 "N-Up-Columns" ; N-Up-Repeat
5473 "N-Up-Lines" ; N-Up-End
5474 "0" ; N-Up-XStart
5475 "N-Up-End 1 sub LandscapePageHeight mul neg") ; N-Up-YStart
5476 (top-right
5477 "0" ; N-Up-XColumn
5478 "LandscapePageHeight neg" ; N-Up-YColumn
5479 "PageWidth neg" ; N-Up-XLine
5480 "N-Up-End 1 sub LandscapePageHeight mul" ; N-Up-YLine
5481 "N-Up-Columns" ; N-Up-Repeat
5482 "N-Up-Lines" ; N-Up-End
5483 "N-Up-Repeat 1 sub PageWidth mul" ; N-Up-XStart
5484 "0") ; N-Up-YStart
5485 (bottom-right
5486 "0" ; N-Up-XColumn
5487 "LandscapePageHeight" ; N-Up-YColumn
5488 "PageWidth neg" ; N-Up-XLine
5489 "N-Up-End 1 sub LandscapePageHeight mul neg" ; N-Up-YLine
5490 "N-Up-Columns" ; N-Up-Repeat
5491 "N-Up-Lines" ; N-Up-End
5492 "N-Up-Repeat 1 sub PageWidth mul" ; N-Up-XStart
5493 "N-Up-End 1 sub LandscapePageHeight mul neg")) ; N-Up-YStart
5494 "Alist for n-up printing initializations.
5495
5496Each element has the following form:
5497
5498 (KIND XCOL YCOL XLIN YLIN REPEAT END XSTART YSTART)
5499
5500Where:
5501KIND is a valid value of `ps-n-up-filling'.
5502XCOL YCOL are the relative position for the next column.
5503XLIN YLIN are the relative position for the beginning of next line.
5504REPEAT is the number of repetions for external loop.
5505END is the number of repetions for internal loop and also the number of pages in
5506 a row.
5507XSTART YSTART are the relative position for the first page in a sheet.")
5508
5509
5510(defun ps-n-up-filling ()
5511 (cdr (or (assq ps-n-up-filling ps-n-up-filling-database)
5512 (assq 'left-top ps-n-up-filling-database))))
5513
5514
5515(defmacro ps-n-up-xcolumn (init) `(nth 0 ,init))
5516(defmacro ps-n-up-ycolumn (init) `(nth 1 ,init))
5517(defmacro ps-n-up-xline (init) `(nth 2 ,init))
5518(defmacro ps-n-up-yline (init) `(nth 3 ,init))
5519(defmacro ps-n-up-repeat (init) `(nth 4 ,init))
5520(defmacro ps-n-up-end (init) `(nth 5 ,init))
5521(defmacro ps-n-up-xstart (init) `(nth 6 ,init))
5522(defmacro ps-n-up-ystart (init) `(nth 7 ,init))
5523
5524
66e63857
GM
5525(defconst ps-error-handler-alist
5526 '((none . 0)
5527 (paper . 1)
5528 (system . 2)
5529 (paper-and-system . 3))
2bd80d73
GM
5530 "Alist for error handler message.")
5531
5532
5533(defconst ps-zebra-stripe-alist
5534 '((follow . 1)
5535 (full . 2)
5536 (full-follow . 3))
5537 "Alist for zebra stripe continuation.")
66e63857
GM
5538
5539
ef2cbb24 5540(defun ps-begin-file ()
7bb054a5 5541 (setq ps-page-order 0
4b3eb10f 5542 ps-page-printed 0
87a16a06
RS
5543 ps-background-text-count 0
5544 ps-background-image-count 0
5545 ps-background-pages nil
5546 ps-background-all-pages nil)
12d89a2e 5547
bc0d41bd
KH
5548 (let ((dimensions (cdr (assq ps-paper-type ps-page-dimensions-database)))
5549 (tumble (if ps-landscape-mode (not ps-spool-tumble) ps-spool-tumble))
5550 (n-up (ps-n-up-printing))
5551 (n-up-filling (ps-n-up-filling)))
98f2fbe7 5552 (and ps-n-up-on (setq tumble (not tumble)))
bc0d41bd
KH
5553 (ps-output
5554 ps-adobe-tag
5555 "%%Title: " (buffer-name) ; Take job name from name of
8bd22fcf 5556 ; first buffer printed
9586e1d3
VJL
5557 "\n%%Creator: ps-print v" ps-print-version
5558 "\n%%For: " (user-full-name)
5559 "\n%%CreationDate: " (format-time-string "%T %b %d %Y")
bc0d41bd
KH
5560 "\n%%Orientation: "
5561 (if ps-landscape-mode "Landscape" "Portrait")
5562 "\n%%DocumentNeededResources: font Times-Roman Times-Italic\n%%+ font "
5563 (mapconcat 'identity
5564 (ps-remove-duplicates
5565 (append (ps-fonts 'ps-font-for-text)
5566 (list (ps-font 'ps-font-for-header 'normal)
9586e1d3
VJL
5567 (ps-font 'ps-font-for-header 'bold)
5568 (ps-font 'ps-font-for-footer 'normal)
5569 (ps-font 'ps-font-for-footer 'bold))))
bc0d41bd 5570 "\n%%+ font ")
9586e1d3 5571 "\n%%DocumentSuppliedResources: procset PSPrintUserDefinedPrologue-" (user-login-name) " 0 0"
bc0d41bd
KH
5572 "\n%%DocumentMedia: " (ps-page-dimensions-get-media dimensions)
5573 (format " %d" (round (ps-page-dimensions-get-width dimensions)))
5574 (format " %d" (round (ps-page-dimensions-get-height dimensions)))
5575 " 0 () ()\n%%PageOrder: Ascend\n%%Pages: (atend)\n%%Requirements:"
5576 (if ps-spool-duplex
8e234846 5577 (if tumble " duplex(tumble)\n" " duplex\n")
bc0d41bd
KH
5578 "\n"))
5579
66e63857 5580 (ps-insert-string ps-print-prologue-header)
bc0d41bd 5581
8e234846
GM
5582 (ps-output "%%EndComments\n%%BeginDefaults\n%%PageMedia: "
5583 (ps-page-dimensions-get-media dimensions)
6bf5fb46 5584 "\n%%EndDefaults\n\n%%BeginProlog\n\n"
6e1b1da6
GM
5585 "/languagelevel where{pop}{/languagelevel 1 def}ifelse\n"
5586 (format "/ErrorMessage %s def\n\n"
66e63857
GM
5587 (or (cdr (assoc ps-error-handler-message
5588 ps-error-handler-alist))
5589 1)) ; send to paper
5590 ps-print-prologue-0
9586e1d3 5591 "\n%%BeginResource: procset PSPrintUserDefinedPrologue-" (user-login-name) " 0 0\n\n")
66e63857
GM
5592
5593 (ps-insert-string ps-user-defined-prologue)
5594
9586e1d3 5595 (ps-output "\n%%EndResource\n\n")
bc0d41bd 5596
bc0d41bd
KH
5597 (ps-output-boolean "LandscapeMode "
5598 (or ps-landscape-mode
5599 (eq (ps-n-up-landscape n-up) 'pag)))
906d41a7 5600 (ps-output-boolean "UpsideDown " ps-print-upside-down)
bc0d41bd
KH
5601 (ps-output (format "/NumberOfColumns %d def\n" ps-number-of-columns)
5602
5603 (format "/LandscapePageHeight %s def\n" ps-landscape-page-height)
5604 (format "/PrintPageWidth %s def\n"
5605 (- (* (+ ps-print-width ps-inter-column)
5606 ps-number-of-columns)
5607 ps-inter-column))
5608 (format "/PrintWidth %s def\n" ps-print-width)
5609 (format "/PrintHeight %s def\n" ps-print-height)
5610
5611 (format "/LeftMargin %s def\n" ps-left-margin)
5612 (format "/RightMargin %s def\n" ps-right-margin)
5613 (format "/InterColumn %s def\n" ps-inter-column)
5614
5615 (format "/BottomMargin %s def\n" ps-bottom-margin)
5616 (format "/TopMargin %s def\n" ps-top-margin) ; not used
5617 (format "/HeaderOffset %s def\n" ps-header-offset)
319acba0
GM
5618 (format "/HeaderPad %s def\n" ps-header-pad)
5619 (format "/FooterOffset %s def\n" ps-footer-offset)
5620 (format "/FooterPad %s def\n" ps-footer-pad)
5621 (format "/FooterLines %s def\n" ps-footer-lines))
bc0d41bd 5622
319acba0 5623 (ps-output-boolean "ShowNofN " ps-show-n-of-n)
8e234846
GM
5624 (ps-output-boolean "SwitchHeader " (if (eq ps-switch-header 'duplex)
5625 ps-spool-duplex
5626 ps-switch-header))
319acba0
GM
5627 (ps-output-boolean "PrintOnlyOneHeader" ps-print-only-one-header)
5628 (ps-output-boolean "PrintHeader " ps-print-header)
5629 (ps-output-boolean "PrintHeaderFrame " ps-print-header-frame)
5630 (ps-output-frame-properties "HeaderFrameProperties" ps-header-frame-alist)
5631 (ps-output-boolean "PrintFooter " ps-print-footer)
5632 (ps-output-boolean "PrintFooterFrame " ps-print-footer-frame)
5633 (ps-output-frame-properties "FooterFrameProperties" ps-footer-frame-alist)
bc0d41bd
KH
5634
5635 (let ((line-height (ps-line-height 'ps-font-for-text)))
6bf5fb46
GM
5636 (ps-output (format "/LineSpacing %s def\n" ps-line-spacing-internal)
5637 (format "/ParagraphSpacing %s def\n"
5638 ps-paragraph-spacing-internal)
5639 (format "/LineHeight %s def\n" line-height)
2bd80d73 5640 (format "/LinesPerColumn %d def\n"
6bf5fb46
GM
5641 (let ((height (+ line-height
5642 ps-line-spacing-internal)))
5643 (round (/ (+ ps-print-height
5644 (* height 0.45))
5645 height))))))
bc0d41bd 5646
8e234846 5647 (ps-output-boolean "WarnPaperSize " ps-warn-paper-type)
bc0d41bd
KH
5648 (ps-output-boolean "Zebra " ps-zebra-stripes)
5649 (ps-output-boolean "PrintLineNumber " ps-line-number)
906d41a7 5650 (ps-output-boolean "SyncLineZebra " (not (integerp ps-line-number-step)))
2bd80d73
GM
5651 (ps-output (format "/ZebraFollow %d def\n"
5652 (or (cdr (assq ps-zebra-stripe-follow
5653 ps-zebra-stripe-alist))
5654 0))
5655 (format "/PrintLineStep %d def\n"
906d41a7
GM
5656 (if (integerp ps-line-number-step)
5657 ps-line-number-step
98f2fbe7
GM
5658 ps-zebra-stripe-height))
5659 (format "/PrintLineStart %d def\n" ps-line-number-start)
319acba0
GM
5660 "/LineNumberColor "
5661 (ps-format-color ps-line-number-color 0.0)
5662 (format "def\n/ZebraHeight %d def\n"
5663 ps-zebra-stripe-height)
6e1b1da6
GM
5664 "/ZebraColor "
5665 (ps-format-color ps-zebra-color 0.95)
3f0257cb
VJL
5666 "def\n")
5667 (ps-output "/BackgroundColor "
e59d29d6 5668 (ps-format-color ps-default-background 1.0)
3f0257cb
VJL
5669 "def\n")
5670 (ps-output "/UseSetpagedevice "
bc0d41bd 5671 (if (eq ps-spool-config 'setpagedevice)
6e1b1da6
GM
5672 "/setpagedevice where{pop languagelevel 2 eq}{false}ifelse"
5673 "false")
5674 " def\n\n/PageWidth "
bc0d41bd
KH
5675 "PrintPageWidth LeftMargin add RightMargin add def\n\n"
5676 (format "/N-Up %d def\n" ps-n-up-printing))
5677 (ps-output-boolean "N-Up-Landscape" (eq (ps-n-up-landscape n-up) t))
5678 (ps-output-boolean "N-Up-Border " ps-n-up-border-p)
5679 (ps-output (format "/N-Up-Lines %d def\n" (ps-n-up-lines n-up))
5680 (format "/N-Up-Columns %d def\n" (ps-n-up-columns n-up))
5681 (format "/N-Up-Missing %d def\n" (ps-n-up-missing n-up))
6e1b1da6
GM
5682 (format "/N-Up-Margin %s def\n" ps-n-up-margin)
5683 "/N-Up-Repeat "
bc0d41bd
KH
5684 (if ps-landscape-mode
5685 (ps-n-up-end n-up-filling)
5686 (ps-n-up-repeat n-up-filling))
5687 " def\n/N-Up-End "
5688 (if ps-landscape-mode
5689 (ps-n-up-repeat n-up-filling)
5690 (ps-n-up-end n-up-filling))
5691 " def\n/N-Up-XColumn " (ps-n-up-xcolumn n-up-filling)
5692 " def\n/N-Up-YColumn " (ps-n-up-ycolumn n-up-filling)
5693 " def\n/N-Up-XLine " (ps-n-up-xline n-up-filling)
5694 " def\n/N-Up-YLine " (ps-n-up-yline n-up-filling)
5695 " def\n/N-Up-XStart " (ps-n-up-xstart n-up-filling)
5696 " def\n/N-Up-YStart " (ps-n-up-ystart n-up-filling) " def\n")
5697
5698 (ps-background-text)
5699 (ps-background-image)
5700 (setq ps-background-all-pages (nreverse ps-background-all-pages)
5701 ps-background-pages (nreverse ps-background-pages))
5702
47a97a6d
VJL
5703 (ps-output "\n" ps-print-prologue-1
5704 "\n/printGlobalBackground{\n")
81ce287c 5705 (mapc 'ps-output ps-background-all-pages)
9586e1d3 5706 (ps-output
47a97a6d
VJL
5707 "}def\n/printLocalBackground{\n}def\n"
5708 "\n%%EndProlog\n\n%%BeginSetup\n"
9586e1d3 5709 "\n%%IncludeResource: font Times-Roman"
47a97a6d
VJL
5710 "\n%%IncludeResource: font Times-Italic"
5711 "\n%%IncludeResource: font "
9586e1d3
VJL
5712 (mapconcat 'identity
5713 (ps-remove-duplicates
5714 (append (ps-fonts 'ps-font-for-text)
5715 (list (ps-font 'ps-font-for-header 'normal)
5716 (ps-font 'ps-font-for-header 'bold)
5717 (ps-font 'ps-font-for-footer 'normal)
5718 (ps-font 'ps-font-for-footer 'bold))))
5719 "\n%%IncludeResource: font ")
47a97a6d
VJL
5720 ;; Header/line number fonts
5721 (format "\n/h0 %s(%s)cvn DefFont\n" ; /h0 14/Helvetica-Bold DefFont
5722 ps-header-title-font-size-internal
5723 (ps-font 'ps-font-for-header 'bold))
5724 (format "/h1 %s(%s)cvn DefFont\n" ; /h1 12/Helvetica DefFont
5725 ps-header-font-size-internal
5726 (ps-font 'ps-font-for-header 'normal))
5727 (format "/L0 %s(%s)cvn DefFont\n" ; /L0 6/Times-Italic DefFont
5728 (ps-get-font-size 'ps-line-number-font-size)
5729 ps-line-number-font)
5730 (format "/H0 %s(%s)cvn DefFont\n" ; /H0 12/Helvetica DefFont
5731 ps-footer-font-size-internal
5732 (ps-font 'ps-font-for-footer 'normal))
5733 "\n\n% ---- These lines must be kept together because...
6bf5fb46
GM
5734
5735/h0 F
5736/HeaderTitleLineHeight FontHeight def
5737
5738/h1 F
5739/HeaderLineHeight FontHeight def
5740/HeaderDescent Descent def
5741
319acba0
GM
5742/H0 F
5743/FooterLineHeight FontHeight def
5744/FooterDescent Descent def
5745
6bf5fb46 5746% ---- ...because `F' has a side-effect on `FontHeight' and `Descent'\n\n")
bc0d41bd
KH
5747
5748 ;; Text fonts
5749 (let ((font (ps-font-alist 'ps-font-for-text))
5750 (i 0))
5751 (while font
c3d6d211 5752 (ps-output (format "/f%d %s(%s)cvn DefFont\n"
bc0d41bd
KH
5753 i
5754 ps-font-size-internal
5755 (ps-font 'ps-font-for-text (car (car font)))))
5756 (setq font (cdr font)
5757 i (1+ i))))
5758
5759 (let ((font-entry (cdr (assq ps-font-family ps-font-info-database))))
5760 (ps-output (format "/SpaceWidthRatio %f def\n"
5761 (/ (ps-lookup 'space-width) (ps-lookup 'size)))))
5762
bc0d41bd
KH
5763 (unless (eq ps-spool-config 'lpr-switches)
5764 (ps-output "\n%%BeginFeature: *Duplex "
5765 (ps-boolean-capitalized ps-spool-duplex)
5766 " *Tumble "
5767 (ps-boolean-capitalized tumble)
c3d6d211
GM
5768 "\nUseSetpagedevice\n{BMark/Duplex "
5769 (ps-boolean-constant ps-spool-duplex)
5770 "/Tumble "
5771 (ps-boolean-constant tumble)
5772 " EMark setpagedevice}\n{statusdict begin "
5773 (ps-boolean-constant ps-spool-duplex)
5774 " setduplexmode "
5775 (ps-boolean-constant tumble)
5776 " settumble end}ifelse\n%%EndFeature\n")))
8e234846
GM
5777 (ps-output "\n%%BeginFeature: *ManualFeed "
5778 (ps-boolean-capitalized ps-manual-feed)
5779 "\nBMark /ManualFeed "
5780 (ps-boolean-constant ps-manual-feed)
ef1159c2 5781 " EMark setpagedevice\n%%EndFeature\n\nBeginDoc\n%%EndSetup\n")
47d2ac75 5782 (and ps-banner-page-when-duplexing
98f2fbe7 5783 (ps-output "\n%%Page: banner 0\nsave showpage restore\n")))
bc0d41bd
KH
5784
5785
6e1b1da6
GM
5786(defun ps-format-color (color &optional default)
5787 (let ((the-color (if (stringp color)
5788 (ps-color-scale color)
5789 color)))
5790 (if (and the-color (listp the-color))
5791 (concat "["
5792 (format ps-color-format
efa89c1f
GM
5793 (* (nth 0 the-color) 1.0) ; force float number
5794 (* (nth 1 the-color) 1.0) ; force float number
5795 (* (nth 2 the-color) 1.0)) ; force float number
6e1b1da6
GM
5796 "] ")
5797 (ps-float-format (if (numberp the-color) the-color default)))))
5798
5799
66e63857
GM
5800(defun ps-insert-string (prologue)
5801 (let ((str (if (functionp prologue)
5802 (funcall prologue)
5803 prologue)))
5804 (and (stringp str)
5805 (ps-output str))))
5806
5807
bc0d41bd
KH
5808(defun ps-boolean-capitalized (bool)
5809 (if bool "True" "False"))
5810
ef2cbb24 5811
8e234846
GM
5812(defun ps-boolean-constant (bool)
5813 (if bool "true" "false"))
5814
5815
12d89a2e
RS
5816(defun ps-header-dirpart ()
5817 (let ((fname (buffer-file-name)))
5818 (if fname
5819 (if (string-equal (buffer-name) (file-name-nondirectory fname))
68e684a0 5820 (abbreviate-file-name (file-name-directory fname))
12d89a2e
RS
5821 fname)
5822 "")))
ef2cbb24 5823
bc0d41bd 5824
12d89a2e 5825(defun ps-get-buffer-name ()
bcc0d457
RS
5826 (cond
5827 ;; Indulge Jim this little easter egg:
5828 ((string= (buffer-name) "ps-print.el")
5829 "Hey, Cool! It's ps-print.el!!!")
5830 ;; Indulge Jack this other little easter egg:
5831 ((string= (buffer-name) "sokoban.el")
5832 "Super! C'est sokoban.el!")
87a16a06 5833 (t (concat
bc0d41bd 5834 (and ps-printing-region-p "Subset of: ")
87a16a06
RS
5835 (buffer-name)
5836 (and (buffer-modified-p) " (unsaved)")))))
ef2cbb24 5837
7d8b7e8e 5838
6bf5fb46
GM
5839(defun ps-get-size (size mess &optional arg)
5840 (let ((siz (cond ((numberp size)
5841 size)
5842 ((and (consp size)
5843 (numberp (car size))
5844 (numberp (cdr size)))
5845 (if ps-landscape-mode
5846 (car size)
5847 (cdr size)))
5848 (t
5849 -1))))
5850 (and (< siz 0)
5851 (error "Invalid %s `%S'%s"
5852 mess size
5853 (if arg
5854 (format " for `%S'" arg)
5855 "")))
5856 siz))
5857
5858
7d8b7e8e 5859(defun ps-get-font-size (font-sym)
6bf5fb46 5860 (ps-get-size (symbol-value font-sym) "font size" font-sym))
7d8b7e8e
KH
5861
5862
c6f33bac
VJL
5863(defun ps-rgb-color (color unspecified default)
5864 (cond
5865 ;; (float float float) ==> (R G B)
5866 ((and color (listp color) (= (length color) 3)
5867 (let ((cl color)
5868 (ok t) e)
5869 (while (and ok cl)
5870 (setq e (car cl)
5871 cl (cdr cl)
5872 ok (and (floatp e) (<= 0.0 e) (<= e 1.0))))
5873 ok))
5874 color)
5875 ;; float ==> 0.0 = black .. 1.0 = white
5876 ((and (floatp color) (<= 0.0 color) (<= color 1.0))
5877 (list color color color))
5878 ;; "colorName" but different from "unspecified-[bf]g"
5879 ((and (stringp color) (not (string= color unspecified)))
5880 (ps-color-scale color))
5881 ;; ok, use the default
5882 (t
5883 (list default default default))))
319acba0
GM
5884
5885
5167749c 5886(defun ps-begin-job (genfunc)
1fd9b7fe 5887 ;; prologue files
41481e4b 5888 (or (equal ps-mark-code-directory ps-postscript-code-directory)
c3d6d211
GM
5889 (setq ps-print-prologue-0 (ps-prologue-file 0)
5890 ps-print-prologue-1 (ps-prologue-file 1)
c3d6d211 5891 ps-mark-code-directory ps-postscript-code-directory))
1fd9b7fe
GM
5892 ;; selected pages
5893 (let (new page)
5894 (while ps-selected-pages
5895 (setq page (car ps-selected-pages)
5896 ps-selected-pages (cdr ps-selected-pages))
5897 (cond ((integerp page)
5898 (and (> page 0)
5899 (setq new (cons (cons page page) new))))
5900 ((consp page)
5901 (and (integerp (car page)) (integerp (cdr page))
5902 (> (car page) 0)
5903 (<= (car page) (cdr page))
5904 (setq new (cons page new))))))
5905 (setq ps-selected-pages (sort new #'(lambda (one other)
5906 (< (car one) (car other))))
5907 ps-last-selected-pages ps-selected-pages
5908 ps-first-page nil
5909 ps-last-page nil))
5910 ;; face background
906d41a7
GM
5911 (or (listp ps-use-face-background)
5912 (setq ps-use-face-background t))
1fd9b7fe 5913 ;; line number
906d41a7
GM
5914 (and (integerp ps-line-number-step)
5915 (<= ps-line-number-step 0)
5916 (setq ps-line-number-step 1))
98f2fbe7
GM
5917 (setq ps-n-up-on (> ps-n-up-printing 1)
5918 ps-line-number-start (max 1 (min ps-line-number-start
5919 (if (integerp ps-line-number-step)
5920 ps-line-number-step
5921 ps-zebra-stripe-height))))
1fd9b7fe 5922 ;; spooling buffer
7da17ab6
RS
5923 (save-excursion
5924 (set-buffer ps-spool-buffer)
5925 (goto-char (point-max))
5926 (and (re-search-backward "^%%Trailer$" nil t)
5927 (delete-region (match-beginning 0) (point-max))))
1fd9b7fe 5928 ;; miscellaneous
2bd80d73
GM
5929 (setq ps-zebra-stripe-full-p (memq ps-zebra-stripe-follow
5930 '(full full-follow))
5931 ps-page-postscript 0
7bb054a5
GM
5932 ps-page-sheet 0
5933 ps-page-n-up 0
4b3eb10f 5934 ps-page-column 0
bd7a2e26 5935 ps-lines-printed 0
7bb054a5
GM
5936 ps-print-page-p t
5937 ps-showline-count (car ps-printing-region)
6bf5fb46
GM
5938 ps-line-spacing-internal (ps-get-size ps-line-spacing
5939 "line spacing")
5940 ps-paragraph-spacing-internal (ps-get-size ps-paragraph-spacing
5941 "paragraph spacing")
7d8b7e8e
KH
5942 ps-font-size-internal (ps-get-font-size 'ps-font-size)
5943 ps-header-font-size-internal (ps-get-font-size 'ps-header-font-size)
5944 ps-header-title-font-size-internal
5945 (ps-get-font-size 'ps-header-title-font-size)
319acba0 5946 ps-footer-font-size-internal (ps-get-font-size 'ps-footer-font-size)
857686a6 5947 ps-control-or-escape-regexp
298bfad9
KH
5948 (cond ((eq ps-print-control-characters '8-bit)
5949 (string-as-unibyte "[\000-\037\177-\377]"))
5950 ((eq ps-print-control-characters 'control-8-bit)
5951 (string-as-unibyte "[\000-\037\177-\237]"))
5952 ((eq ps-print-control-characters 'control)
5953 "[\000-\037\177]")
6e1b1da6 5954 (t "[\t\n\f]"))
3f0257cb
VJL
5955 ;; Set the color scale. We do it here instead of in the defvar so
5956 ;; that ps-print can be dumped into emacs. This expression can't be
5957 ;; evaluated at dump-time because X isn't initialized.
5958 ps-color-p (and ps-print-color-p (ps-color-device))
5959 ps-print-color-scale (if ps-color-p
5960 (float (car (ps-color-values "white")))
5961 1.0)
e59d29d6 5962 ps-default-background (ps-rgb-color
c1a1c994 5963 (cond
d3509e50
VJL
5964 ((or (member ps-print-color-p
5965 '(nil back-white))
3f0257cb 5966 (eq genfunc 'ps-generate-postscript))
5167749c 5967 nil)
c1a1c994 5968 ((eq ps-default-bg 'frame-parameter)
cf04718a 5969 (ps-frame-parameter nil 'background-color))
c1a1c994
VJL
5970 ((eq ps-default-bg t)
5971 (ps-face-background-name 'default))
5972 (t
5973 ps-default-bg))
c6f33bac 5974 "unspecified-bg"
e59d29d6 5975 1.0)
c794a94d 5976 ps-default-foreground (ps-rgb-color
c1a1c994 5977 (cond
d3509e50
VJL
5978 ((or (member ps-print-color-p
5979 '(nil back-white))
3f0257cb 5980 (eq genfunc 'ps-generate-postscript))
5167749c 5981 nil)
c1a1c994 5982 ((eq ps-default-fg 'frame-parameter)
cf04718a 5983 (ps-frame-parameter nil 'foreground-color))
c1a1c994
VJL
5984 ((eq ps-default-fg t)
5985 (ps-face-foreground-name 'default))
5986 (t
5987 ps-default-fg))
c6f33bac 5988 "unspecified-fg"
c794a94d 5989 0.0)
ccae01a6
VJL
5990 ps-foreground-list (mapcar
5991 #'(lambda (arg)
5992 (ps-rgb-color arg "unspecified-fg" 0.0))
5993 (append (and (not (member ps-print-color-p
5994 '(nil back-white)))
5995 ps-fg-list)
5996 (list ps-default-foreground
5997 "black")))
d3509e50
VJL
5998 ps-default-color (and (not (member ps-print-color-p
5999 '(nil back-white)))
3f0257cb
VJL
6000 ps-default-foreground)
6001 ps-current-color ps-default-color)
319acba0 6002 ;; initialize page dimensions
e59d29d6
VJL
6003 (ps-get-page-dimensions)
6004 ;; final check
3bcc60cf
VJL
6005 (unless (listp ps-lpr-switches)
6006 (error "`ps-lpr-switches' value should be a list."))
e59d29d6
VJL
6007 (and ps-color-p
6008 (equal ps-default-background ps-default-foreground)
6009 (error
6010 (concat
6011 "`ps-default-fg' and `ps-default-bg' have the same color.\n"
6012 "Text won't appear on page. Please, check these variables."))))
6e1b1da6 6013
ef2cbb24 6014
ea0c615d
GM
6015(defun ps-page-number ()
6016 (if ps-print-only-one-header
4b3eb10f
GM
6017 (1+ (/ (1- ps-page-column) ps-number-of-columns))
6018 ps-page-column))
87a16a06
RS
6019
6020
319acba0
GM
6021(defsubst ps-end-page ()
6022 (ps-output "EndPage\nEndDSCPage\n"))
6023
6024
6025(defsubst ps-next-page ()
ef2cbb24 6026 (ps-end-page)
12d89a2e
RS
6027 (ps-flush-output)
6028 (ps-begin-page))
6029
bc0d41bd 6030
9dae638c
VJL
6031(defun ps-end-sheet ()
6032 (and ps-print-page-p (> ps-page-sheet 0)
6033 (ps-output "EndSheet\n")))
6034
6035
bc0d41bd
KH
6036(defun ps-header-sheet ()
6037 ;; Print only when a new sheet begins.
9dae638c 6038 (ps-end-sheet)
4b3eb10f
GM
6039 (setq ps-page-sheet (1+ ps-page-sheet))
6040 (when (ps-print-sheet-p)
6041 (setq ps-page-order (1+ ps-page-order))
6042 (ps-output (if ps-n-up-on
6043 (format "\n%%%%Page: (%d \\(%d\\)) %d\n"
6044 ps-page-order ps-page-postscript ps-page-order)
6045 (format "\n%%%%Page: %d %d\n"
6046 ps-page-postscript ps-page-order))
ef1159c2
EZ
6047 ;; spooling needs to redefine Lines and PageCount on each page
6048 "/Lines 0 def\n/PageCount 0 def\n"
4b3eb10f
GM
6049 (format "%d BeginSheet\nBeginDSCPage\n"
6050 ps-n-up-printing))))
ea0c615d
GM
6051
6052
6053(defun ps-header-page ()
7da17ab6
RS
6054 ;; set total line and page number when printing has finished
6055 ;; (see `ps-generate')
4b3eb10f 6056 (if (zerop (mod ps-page-column ps-number-of-columns))
ea0c615d
GM
6057 (progn
6058 (setq ps-page-postscript (1+ ps-page-postscript))
6059 (when (ps-print-page-p)
4b3eb10f 6060 (ps-print-sheet-p)
ea0c615d
GM
6061 (if (zerop (mod ps-page-n-up ps-n-up-printing))
6062 ;; Print only when a new sheet begins.
6063 (progn
6064 (ps-header-sheet)
6065 (run-hooks 'ps-print-begin-sheet-hook))
6066 ;; Print only when a new page begins.
6067 (ps-output "BeginDSCPage\n")
6068 (run-hooks 'ps-print-begin-page-hook))
6069 (ps-background ps-page-postscript)
4b3eb10f
GM
6070 (setq ps-page-n-up (1+ ps-page-n-up))
6071 (and ps-print-page-p
6072 (setq ps-page-printed (1+ ps-page-printed)))))
ea0c615d
GM
6073 ;; Print only when a new column begins.
6074 (ps-output "BeginDSCPage\n")
6075 (run-hooks 'ps-print-begin-column-hook))
4b3eb10f 6076 (setq ps-page-column (1+ ps-page-column)))
a18ed129 6077
8bd22fcf 6078(defun ps-begin-page ()
8bd22fcf 6079 (setq ps-width-remaining ps-print-width
298bfad9 6080 ps-height-remaining ps-print-height)
12d89a2e 6081
a18ed129 6082 (ps-header-page)
12d89a2e 6083
87a16a06 6084 (ps-output (format "/LineNumber %d def\n" ps-showline-count)
ea0c615d 6085 (format "/PageNumber %d def\n" (ps-page-number)))
12d89a2e 6086
090be653 6087 (when ps-print-header
edf0b0c5
VJL
6088 (ps-generate-header "HeaderLinesLeft" "/h0" "/h1"
6089 (or ps-lh-cache ps-left-header))
6090 (ps-generate-header "HeaderLinesRight" "/h0" "/h1"
6091 (or ps-rh-cache ps-right-header))
6092 (ps-output (format "%d SetHeaderLines\n" ps-header-lines))
6093 (setq ps-lh-cache nil
6094 ps-rh-cache nil))
12d89a2e 6095
319acba0 6096 (when ps-print-footer
edf0b0c5
VJL
6097 (ps-generate-header "FooterLinesLeft" "/H0" "/H0"
6098 (or ps-lf-cache ps-left-footer))
6099 (ps-generate-header "FooterLinesRight" "/H0" "/H0"
6100 (or ps-rf-cache ps-right-footer))
6101 (ps-output (format "%d SetFooterLines\n" ps-footer-lines))
6102 (setq ps-lf-cache nil
6103 ps-rf-cache nil))
319acba0 6104
bd7a2e26 6105 (ps-output (number-to-string ps-lines-printed) " BeginPage\n")
87a16a06
RS
6106 (ps-set-font ps-current-font)
6107 (ps-set-bg ps-current-bg)
298bfad9
KH
6108 (ps-set-color ps-current-color)
6109 (ps-mule-begin-page))
ef2cbb24 6110
319acba0 6111(defsubst ps-skip-newline (limit)
bd7a2e26
GM
6112 (setq ps-showline-count (1+ ps-showline-count)
6113 ps-lines-printed (1+ ps-lines-printed))
6114 (and (< (point) limit)
6115 (forward-char 1)))
6116
6bf5fb46 6117(defsubst ps-next-line ()
bd7a2e26
GM
6118 (setq ps-showline-count (1+ ps-showline-count)
6119 ps-lines-printed (1+ ps-lines-printed))
6bf5fb46
GM
6120 (let* ((paragraph-p (and ps-paragraph-regexp
6121 (looking-at ps-paragraph-regexp)))
6122 (lh (+ (ps-line-height 'ps-font-for-text)
6123 (if paragraph-p
6124 ps-paragraph-spacing-internal
6125 ps-line-spacing-internal))))
12b88fff
RS
6126 (if (< ps-height-remaining lh)
6127 (ps-next-page)
6128 (setq ps-width-remaining ps-print-width
6129 ps-height-remaining (- ps-height-remaining lh))
6bf5fb46 6130 (ps-output (if paragraph-p "PHL\n" "LHL\n")))))
ef2cbb24
RS
6131
6132(defun ps-continue-line ()
bd7a2e26 6133 (setq ps-lines-printed (1+ ps-lines-printed))
6bf5fb46 6134 (let ((lh (+ (ps-line-height 'ps-font-for-text) ps-line-spacing-internal)))
12b88fff
RS
6135 (if (< ps-height-remaining lh)
6136 (ps-next-page)
6137 (setq ps-width-remaining ps-print-width
6138 ps-height-remaining (- ps-height-remaining lh))
6139 (ps-output "SL\n"))))
12d89a2e
RS
6140
6141(defun ps-find-wrappoint (from to char-width)
6142 (let ((avail (truncate (/ ps-width-remaining char-width)))
6143 (todo (- to from)))
6144 (if (< todo avail)
6145 (cons to (* todo char-width))
6146 (cons (+ from avail) ps-width-remaining))))
6147
c86f4619
GM
6148(defun ps-basic-plot-str (from to string)
6149 (let* ((wrappoint (ps-find-wrappoint from to
6150 (ps-avg-char-width 'ps-font-for-text)))
6151 (to (car wrappoint))
6152 (str (substring string from to)))
6153 (ps-mule-prepare-ascii-font str)
6154 (ps-output-string str)
6155 (ps-output " S\n")
6156 wrappoint))
6157
12d89a2e 6158(defun ps-basic-plot-string (from to &optional bg-color)
12b88fff
RS
6159 (let* ((wrappoint (ps-find-wrappoint from to
6160 (ps-avg-char-width 'ps-font-for-text)))
12d89a2e 6161 (to (car wrappoint))
298bfad9
KH
6162 (string (buffer-substring-no-properties from to)))
6163 (ps-mule-prepare-ascii-font string)
12d89a2e 6164 (ps-output-string string)
bcc0d457 6165 (ps-output " S\n")
12d89a2e
RS
6166 wrappoint))
6167
6168(defun ps-basic-plot-whitespace (from to &optional bg-color)
12b88fff
RS
6169 (let* ((wrappoint (ps-find-wrappoint from to
6170 (ps-space-width 'ps-font-for-text)))
12d89a2e 6171 (to (car wrappoint)))
12d89a2e
RS
6172 (ps-output (format "%d W\n" (- to from)))
6173 wrappoint))
6174
6175(defun ps-plot (plotfunc from to &optional bg-color)
ef2cbb24 6176 (while (< from to)
12d89a2e
RS
6177 (let* ((wrappoint (funcall plotfunc from to bg-color))
6178 (plotted-to (car wrappoint))
6179 (plotted-width (cdr wrappoint)))
8bd22fcf
KH
6180 (setq from plotted-to
6181 ps-width-remaining (- ps-width-remaining plotted-width))
12d89a2e
RS
6182 (if (< from to)
6183 (ps-continue-line))))
ef2cbb24
RS
6184 (if ps-razzle-dazzle
6185 (let* ((q-todo (- (point-max) (point-min)))
12d89a2e 6186 (q-done (- (point) (point-min)))
ef2cbb24 6187 (chunkfrac (/ q-todo 8))
857686a6 6188 (chunksize (min chunkfrac 1000)))
ef2cbb24 6189 (if (> (- q-done ps-razchunk) chunksize)
8bd22fcf 6190 (progn
ef2cbb24 6191 (setq ps-razchunk q-done)
8bd22fcf
KH
6192 (message "Formatting...%3d%%"
6193 (if (< q-todo 100)
6194 (/ (* 100 q-done) q-todo)
6195 (/ q-done (/ q-todo 100)))
6196 ))))))
12d89a2e 6197
6db15364 6198(defvar ps-last-font nil)
298bfad9 6199
12d89a2e 6200(defun ps-set-font (font)
e65df0a1
KH
6201 (setq ps-last-font (format "f%d" (setq ps-current-font font)))
6202 (ps-output (format "/%s F\n" ps-last-font)))
12d89a2e 6203
12d89a2e
RS
6204(defun ps-set-bg (color)
6205 (if (setq ps-current-bg color)
8bd22fcf
KH
6206 (ps-output (format ps-color-format
6207 (nth 0 color) (nth 1 color) (nth 2 color))
12d89a2e
RS
6208 " true BG\n")
6209 (ps-output "false BG\n")))
6210
6211(defun ps-set-color (color)
6e1b1da6 6212 (setq ps-current-color (or color ps-default-foreground))
8bd22fcf
KH
6213 (ps-output (format ps-color-format
6214 (nth 0 ps-current-color)
043620f4
KH
6215 (nth 1 ps-current-color) (nth 2 ps-current-color))
6216 " FG\n"))
12d89a2e 6217
12d89a2e 6218
c86f4619
GM
6219(defsubst ps-plot-string (string)
6220 (ps-plot 'ps-basic-plot-str 0 (length string) string))
6221
6222
87a16a06 6223(defvar ps-current-effect 0)
12d89a2e 6224
3409eda2
KH
6225(defvar ps-print-translation-table
6226 (let ((tbl (make-char-table 'translation-table nil)))
6227 (if (and (boundp 'ucs-mule-8859-to-mule-unicode)
6228 (char-table-p ucs-mule-8859-to-mule-unicode))
6229 (map-char-table
640477ee 6230 #'(lambda (k v)
3409eda2
KH
6231 (if (and v (eq (char-charset v) 'latin-iso8859-1) (/= k v))
6232 (aset tbl k v)))
6233 ucs-mule-8859-to-mule-unicode))
6234 tbl)
6235 "Translation table for PostScript printing.
6236The default value is a table that translates non-Latin-1 Latin characters
6237to the equivalent Latin-1 characters.")
87a16a06
RS
6238
6239(defun ps-plot-region (from to font &optional fg-color bg-color effects)
efa89c1f 6240 (or (equal font ps-current-font)
12d89a2e 6241 (ps-set-font font))
06fb6aab 6242
ccae01a6
VJL
6243 ;; Specify a foreground color only if:
6244 ;; one's specified,
6245 ;; it's different than the background (if `ps-fg-validate-p' is non-nil)
6246 ;; and it's different than the current.
efa89c1f 6247 (let ((fg (or fg-color ps-default-foreground)))
ccae01a6
VJL
6248 (if ps-fg-validate-p
6249 (let ((bg (or bg-color ps-default-background))
6250 (el ps-foreground-list))
6251 (while (and el (equal fg bg))
6252 (setq fg (car el)
6253 el (cdr el)))))
efa89c1f
GM
6254 (or (equal fg ps-current-color)
6255 (ps-set-color fg)))
06fb6aab 6256
efa89c1f 6257 (or (equal bg-color ps-current-bg)
12d89a2e 6258 (ps-set-bg bg-color))
06fb6aab 6259
ccae01a6 6260 ;; Specify effects (underline, overline, box, etc.)
87a16a06
RS
6261 (cond
6262 ((not (integerp effects))
6263 (ps-output "0 EF\n")
6264 (setq ps-current-effect 0))
6265 ((/= effects ps-current-effect)
6266 (ps-output (number-to-string effects) " EF\n")
6267 (setq ps-current-effect effects)))
ef2cbb24 6268
12d89a2e 6269 ;; Starting at the beginning of the specified region...
ef2cbb24
RS
6270 (save-excursion
6271 (goto-char from)
12d89a2e
RS
6272
6273 ;; ...break the region up into chunks separated by tabs, linefeeds,
87a16a06 6274 ;; pagefeeds, control characters, and plot each chunk.
ef2cbb24 6275 (while (< from to)
6bf5fb46
GM
6276 ;; skip lines between cut markers
6277 (and ps-begin-cut-regexp ps-end-cut-regexp
6278 (looking-at ps-begin-cut-regexp)
6279 (progn
6280 (goto-char (match-end 0))
6281 (and (re-search-forward ps-end-cut-regexp to 'noerror)
6282 (= (following-char) ?\n)
6283 (forward-char 1))
6284 (setq from (point))))
857686a6 6285 (if (re-search-forward ps-control-or-escape-regexp to t)
024ced4d 6286 ;; region with some control characters or some multi-byte characters
12b88fff 6287 (let* ((match-point (match-beginning 0))
ea0c615d 6288 (match (char-after match-point))
3e9cb08f 6289 (composition (ps-e-find-composition from (1+ match-point))))
9d4d60c1
KH
6290 (if composition
6291 (if (and (nth 2 composition)
6292 (<= (car composition) match-point))
6293 (progn
6294 (setq match-point (car composition)
6295 match 0)
6296 (goto-char (nth 1 composition)))
6297 (setq composition nil)))
e65df0a1 6298 (when (< from match-point)
298bfad9 6299 (ps-mule-set-ascii-font)
e65df0a1 6300 (ps-plot 'ps-basic-plot-string from match-point bg-color))
857686a6
RS
6301 (cond
6302 ((= match ?\t) ; tab
be415ea7 6303 (let ((linestart (line-beginning-position)))
857686a6
RS
6304 (forward-char -1)
6305 (setq from (+ linestart (current-column)))
e65df0a1 6306 (when (re-search-forward "[ \t]+" to t)
298bfad9 6307 (ps-mule-set-ascii-font)
e65df0a1
KH
6308 (ps-plot 'ps-basic-plot-whitespace
6309 from (+ linestart (current-column))
6310 bg-color))))
857686a6
RS
6311
6312 ((= match ?\n) ; newline
bd7a2e26
GM
6313 (if (looking-at "\f[^\n]")
6314 ;; \n\ftext\n ==>> next page, but keep line counting!!
6315 (progn
6316 (ps-skip-newline to)
6317 (ps-next-page))
6318 ;; \n\f\n ==>> it'll be handled by form feed
6319 ;; \ntext\n ==>> next line
6320 (ps-next-line)))
857686a6
RS
6321
6322 ((= match ?\f) ; form feed
12b88fff
RS
6323 ;; do not skip page if previous character is NEWLINE and
6324 ;; it is a beginning of page.
bd7a2e26
GM
6325 (unless (and (equal (char-after (1- match-point)) ?\n)
6326 (= ps-height-remaining ps-print-height))
6327 ;; \f\n ==>> skip \n, but keep line counting!!
6328 (and (equal (following-char) ?\n)
6329 (ps-skip-newline to))
6330 (ps-next-page)))
e65df0a1 6331
9d4d60c1
KH
6332 (composition ; a composite sequence
6333 (ps-plot 'ps-mule-plot-composition match-point (point) bg-color))
6334
024ced4d 6335 ((> match 255) ; a multi-byte character
3409eda2 6336 (setq match (or (aref ps-print-translation-table match) match))
9d4d60c1 6337 (let* ((charset (char-charset match))
3e9cb08f 6338 (composition (ps-e-find-composition match-point to))
9d4d60c1 6339 (stop (if (nth 2 composition) (car composition) to)))
e65df0a1 6340 (or (eq charset 'composition)
3409eda2
KH
6341 (while (and (< (point) stop)
6342 (let ((ch (following-char)))
6343 (setq ch
6344 (or (aref ps-print-translation-table ch)
6345 ch))
6346 (eq (char-charset ch) charset)))
298bfad9 6347 (forward-char 1)))
e65df0a1 6348 (ps-plot 'ps-mule-plot-string match-point (point) bg-color)))
3556c6dd 6349 ; characters from ^@ to ^_ and
857686a6
RS
6350 (t ; characters from 127 to 255
6351 (ps-control-character match)))
87a16a06 6352 (setq from (point)))
024ced4d 6353 ;; region without control characters nor multi-byte characters
298bfad9 6354 (ps-mule-set-ascii-font)
87a16a06
RS
6355 (ps-plot 'ps-basic-plot-string from to bg-color)
6356 (setq from to)))))
6357
857686a6
RS
6358(defvar ps-string-control-codes
6359 (let ((table (make-vector 256 nil))
6360 (char ?\000))
6361 ;; control character
6362 (while (<= char ?\037)
6363 (aset table char (format "^%c" (+ char ?@)))
6364 (setq char (1+ char)))
6365 ;; printable character
6366 (while (< char ?\177)
6367 (aset table char (format "%c" char))
6368 (setq char (1+ char)))
6369 ;; DEL
6370 (aset table char "^?")
6371 ;; 8-bit character
6372 (while (<= (setq char (1+ char)) ?\377)
6373 (aset table char (format "\\%o" char)))
6374 table)
6375 "Vector used to map characters to a printable string.")
6376
6377(defun ps-control-character (char)
6378 (let* ((str (aref ps-string-control-codes char))
6379 (from (1- (point)))
87a16a06
RS
6380 (len (length str))
6381 (to (+ from len))
12b88fff
RS
6382 (char-width (ps-avg-char-width 'ps-font-for-text))
6383 (wrappoint (ps-find-wrappoint from to char-width)))
87a16a06
RS
6384 (if (< (car wrappoint) to)
6385 (ps-continue-line))
12b88fff 6386 (setq ps-width-remaining (- ps-width-remaining (* len char-width)))
36243805 6387 (ps-mule-prepare-ascii-font str)
87a16a06
RS
6388 (ps-output-string str)
6389 (ps-output " S\n")))
ef2cbb24 6390
87a16a06 6391
4d7a3631
VJL
6392(defsubst ps-face-foreground-color-p (attr)
6393 (memq attr '(foreground-color :foreground)))
6394
6395
6396(defsubst ps-face-background-color-p (attr)
6397 (memq attr '(background-color :background)))
6398
6399
6400(defsubst ps-face-color-p (attr)
6401 (memq attr '(foreground-color :foreground background-color :background)))
6402
6403
a18ed129
RS
6404(defun ps-face-attributes (face)
6405 "Return face attribute vector.
87a16a06 6406
a18ed129
RS
6407If FACE is not in `ps-print-face-extension-alist' or in
6408`ps-print-face-alist', insert it on `ps-print-face-alist' and
6409return the attribute vector.
87a16a06 6410
5167749c 6411If FACE is not a valid face name, use default face."
df5e6194 6412 (cond
55732434
GM
6413 (ps-black-white-faces-alist
6414 (or (and (symbolp face)
6415 (cdr (assq face ps-black-white-faces-alist)))
6416 (vector 0 nil nil)))
df5e6194
GM
6417 ((symbolp face)
6418 (cdr (or (assq face ps-print-face-extension-alist)
6419 (assq face ps-print-face-alist)
6420 (let* ((the-face (if (facep face) face 'default))
6421 (new-face (ps-screen-to-bit-face the-face)))
6422 (or (and (eq the-face 'default)
6423 (assq the-face ps-print-face-alist))
6424 (setq ps-print-face-alist
6425 (cons new-face ps-print-face-alist)))
6426 new-face))))
4d7a3631 6427 ((ps-face-foreground-color-p (car face))
df5e6194 6428 (vector 0 (cdr face) nil))
4d7a3631 6429 ((ps-face-background-color-p (car face))
df5e6194
GM
6430 (vector 0 nil (cdr face)))
6431 (t
6432 (vector 0 nil nil))))
87a16a06 6433
043620f4 6434
906d41a7 6435(defun ps-face-background (face background)
ccae01a6 6436 (and (cond ((eq ps-use-face-background t)) ; always
5167749c
VJL
6437 ((null ps-use-face-background) nil) ; never
6438 ;; ps-user-face-background is a symbol face list
6439 ((symbolp face)
6440 (memq face ps-use-face-background))
6441 ((listp face)
4d7a3631 6442 (or (ps-face-color-p (car face))
5167749c
VJL
6443 (let (ok)
6444 (while face
6445 (if (or (memq (car face) ps-use-face-background)
4d7a3631 6446 (ps-face-color-p (car face)))
5167749c
VJL
6447 (setq face nil
6448 ok t)
6449 (setq face (cdr face))))
6450 ok)))
6451 (t
6452 nil)
6453 )
906d41a7
GM
6454 background))
6455
6456
043620f4 6457(defun ps-face-attribute-list (face-or-list)
df5e6194
GM
6458 (cond
6459 ;; simple face
6460 ((not (listp face-or-list))
6461 (ps-face-attributes face-or-list))
6462 ;; only foreground color, not a `real' face
4d7a3631 6463 ((ps-face-foreground-color-p (car face-or-list))
df5e6194
GM
6464 (vector 0 (cdr face-or-list) nil))
6465 ;; only background color, not a `real' face
4d7a3631 6466 ((ps-face-background-color-p (car face-or-list))
df5e6194
GM
6467 (vector 0 nil (cdr face-or-list)))
6468 ;; list of faces
6469 (t
6470 (let ((effects 0)
6471 foreground background face-attr face)
6472 (while face-or-list
6473 (setq face (car face-or-list)
6474 face-or-list (cdr face-or-list)
6475 face-attr (ps-face-attributes face)
6476 effects (logior effects (aref face-attr 0)))
6477 (or foreground (setq foreground (aref face-attr 1)))
6478 (or background
6479 (setq background (ps-face-background face (aref face-attr 2)))))
6480 (vector effects foreground background)))))
043620f4 6481
87a16a06 6482
12b88fff
RS
6483(defconst ps-font-type (vector nil 'bold 'italic 'bold-italic))
6484
6485
12d89a2e 6486(defun ps-plot-with-face (from to face)
12b88fff
RS
6487 (cond
6488 ((null face) ; print text with null face
87a16a06 6489 (ps-plot-region from to 0))
12b88fff
RS
6490 ((eq face 'emacs--invisible--face)) ; skip invisible text!!!
6491 (t ; otherwise, text has a valid face
6492 (let* ((face-bit (ps-face-attribute-list face))
6493 (effect (aref face-bit 0))
6494 (foreground (aref face-bit 1))
906d41a7 6495 (background (ps-face-background face (aref face-bit 2)))
d3ab8dac 6496 (fg-color (if (and ps-color-p foreground)
6e1b1da6 6497 (ps-color-scale foreground)
12b88fff 6498 ps-default-color))
d3ab8dac 6499 (bg-color (and ps-color-p background
6e1b1da6 6500 (ps-color-scale background))))
12b88fff
RS
6501 (ps-plot-region
6502 from to
6503 (ps-font-number 'ps-font-for-text
6504 (or (aref ps-font-type (logand effect 3))
6505 face))
6506 fg-color bg-color (lsh effect -2)))))
87a16a06 6507 (goto-char to))
12d89a2e
RS
6508
6509
043620f4
KH
6510;; Ensure that face-list is fbound.
6511(or (fboundp 'face-list) (defalias 'face-list 'list-faces))
12d89a2e 6512
a18ed129 6513
12d89a2e 6514(defun ps-build-reference-face-lists ()
857686a6
RS
6515 ;; Ensure that face database is updated with faces on
6516 ;; `font-lock-face-attributes' (obsolete stuff)
6517 (ps-font-lock-face-attributes)
6518 ;; Now, rebuild reference face lists
a18ed129 6519 (setq ps-print-face-alist nil)
12d89a2e 6520 (if ps-auto-font-detect
81ce287c
JB
6521 (mapc 'ps-map-face (face-list))
6522 (mapc 'ps-set-face-bold ps-bold-faces)
6523 (mapc 'ps-set-face-italic ps-italic-faces)
6524 (mapc 'ps-set-face-underline ps-underlined-faces))
12d89a2e 6525 (setq ps-build-face-reference nil))
ef2cbb24 6526
a18ed129
RS
6527
6528(defun ps-set-face-bold (face)
6529 (ps-set-face-attribute face 1))
6530
6531(defun ps-set-face-italic (face)
6532 (ps-set-face-attribute face 2))
6533
6534(defun ps-set-face-underline (face)
6535 (ps-set-face-attribute face 4))
6536
6537
6538(defun ps-set-face-attribute (face effect)
6539 (let ((face-bit (cdr (ps-map-face face))))
6540 (aset face-bit 0 (logior (aref face-bit 0) effect))))
6541
6542
6543(defun ps-map-face (face)
6544 (let* ((face-map (ps-screen-to-bit-face face))
6545 (ps-face-bit (cdr (assq (car face-map) ps-print-face-alist))))
6546 (if ps-face-bit
6547 ;; if face exists, merge both
6548 (let ((face-bit (cdr face-map)))
6549 (aset ps-face-bit 0 (logior (aref ps-face-bit 0) (aref face-bit 0)))
6550 (or (aref ps-face-bit 1) (aset ps-face-bit 1 (aref face-bit 1)))
6551 (or (aref ps-face-bit 2) (aset ps-face-bit 2 (aref face-bit 2))))
6552 ;; if face does not exist, insert it
6553 (setq ps-print-face-alist (cons face-map ps-print-face-alist)))
6554 face-map))
6555
6556
6557(defun ps-screen-to-bit-face (face)
6558 (cons face
6559 (vector (logior (if (ps-face-bold-p face) 1 0) ; bold
6560 (if (ps-face-italic-p face) 2 0) ; italic
6561 (if (ps-face-underlined-p face) 4 0)) ; underline
8e234846
GM
6562 (ps-face-foreground-name face)
6563 (ps-face-background-name face))))
a18ed129
RS
6564
6565
b6d0ac87
VJL
6566;; to avoid compilation gripes
6567(defalias 'ps-jitify 'jit-lock-fontify-now)
6568(defalias 'ps-lazify 'lazy-lock-fontify-region)
6569
6570
3e9cb08f 6571;; to avoid compilation gripes
ea0c615d 6572(defun ps-print-ensure-fontified (start end)
b6d0ac87
VJL
6573 (cond ((and (boundp 'jit-lock-mode) (symbol-value 'jit-lock-mode))
6574 (ps-jitify start end))
6575 ((and (boundp 'lazy-lock-mode) (symbol-value 'lazy-lock-mode))
6576 (ps-lazify start end))))
043620f4 6577
043620f4 6578
ef2cbb24 6579(defun ps-generate-postscript-with-faces (from to)
87a16a06 6580 ;; Some initialization...
857686a6 6581 (setq ps-current-effect 0)
87a16a06 6582
00aa16af 6583 ;; Build the reference lists of faces if necessary.
8e234846
GM
6584 (when (or ps-always-build-face-reference
6585 ps-build-face-reference)
6586 (message "Collecting face information...")
6587 (ps-build-reference-face-lists))
55732434
GM
6588
6589 ;; Black/white printer.
6590 (setq ps-black-white-faces-alist nil)
6591 (and (eq ps-print-color-p 'black-white)
6592 (ps-extend-face-list ps-black-white-faces nil
6593 'ps-black-white-faces-alist))
6594
00aa16af 6595 ;; Generate some PostScript.
ef2cbb24
RS
6596 (save-restriction
6597 (narrow-to-region from to)
d3ab8dac 6598 (ps-print-ensure-fontified from to)
12d89a2e
RS
6599 (let ((face 'default)
6600 (position to))
87a16a06 6601 (cond
cf04718a 6602 ((featurep 'xemacs) ; XEmacs
87a16a06
RS
6603 ;; Build the list of extents...
6604 (let ((a (cons 'dummy nil))
6605 record type extent extent-list)
c9b3d6a5 6606 (map-extents 'ps-xemacs-mapper nil from to a)
8bd22fcf
KH
6607 (setq a (sort (cdr a) 'car-less-than-car)
6608 extent-list nil)
87a16a06
RS
6609
6610 ;; Loop through the extents...
6611 (while a
8bd22fcf 6612 (setq record (car a)
8bd22fcf 6613 position (car record)
87a16a06 6614
8bd22fcf 6615 record (cdr record)
bd7a2e26 6616 type (car record)
87a16a06 6617
bd7a2e26 6618 record (cdr record)
8bd22fcf 6619 extent (car record))
87a16a06
RS
6620
6621 ;; Plot up to this record.
6622 ;; XEmacs 19.12: for some reason, we're getting into a
6623 ;; situation in which some of the records have
6624 ;; positions less than 'from'. Since we've narrowed
ea0c615d
GM
6625 ;; the buffer, this'll generate errors. This is a hack,
6626 ;; but don't call ps-plot-with-face unless from > point-min.
3e9cb08f
GM
6627 (and (>= from (point-min))
6628 (ps-plot-with-face from (min position (point-max)) face))
87a16a06
RS
6629
6630 (cond
6631 ((eq type 'push)
c9b3d6a5 6632 (and (extent-face extent)
d3ab8dac 6633 (setq extent-list (sort (cons extent extent-list)
c9b3d6a5 6634 'ps-xemacs-extent-sorter))))
87a16a06
RS
6635
6636 ((eq type 'pull)
6637 (setq extent-list (sort (delq extent extent-list)
c9b3d6a5 6638 'ps-xemacs-extent-sorter))))
87a16a06 6639
d3ab8dac 6640 (setq face (if extent-list
c9b3d6a5 6641 (extent-face (car extent-list))
d3ab8dac 6642 'default)
8bd22fcf
KH
6643 from position
6644 a (cdr a)))))
87a16a06 6645
cf04718a 6646 (t ; Emacs
87a16a06 6647 (let ((property-change from)
e65df0a1
KH
6648 (overlay-change from)
6649 (save-buffer-invisibility-spec buffer-invisibility-spec)
c86f4619
GM
6650 (buffer-invisibility-spec nil)
6651 before-string after-string)
87a16a06 6652 (while (< from to)
d3ab8dac 6653 (and (< property-change to) ; Don't search for property change
12d89a2e 6654 ; unless previous search succeeded.
d3ab8dac
KH
6655 (setq property-change (next-property-change from nil to)))
6656 (and (< overlay-change to) ; Don't search for overlay change
12d89a2e 6657 ; unless previous search succeeded.
c9b3d6a5 6658 (setq overlay-change (min (next-overlay-change from)
2bd80d73 6659 to)))
c86f4619
GM
6660 (setq position (min property-change overlay-change)
6661 before-string nil
6662 after-string nil)
87a16a06
RS
6663 ;; The code below is not quite correct,
6664 ;; because a non-nil overlay invisible property
6665 ;; which is inactive according to the current value
6666 ;; of buffer-invisibility-spec nonetheless overrides
6667 ;; a face text property.
6668 (setq face
6669 (cond ((let ((prop (get-text-property from 'invisible)))
6670 ;; Decide whether this invisible property
6671 ;; really makes the text invisible.
e65df0a1 6672 (if (eq save-buffer-invisibility-spec t)
87a16a06 6673 (not (null prop))
e65df0a1
KH
6674 (or (memq prop save-buffer-invisibility-spec)
6675 (assq prop save-buffer-invisibility-spec))))
12b88fff 6676 'emacs--invisible--face)
87a16a06
RS
6677 ((get-text-property from 'face))
6678 (t 'default)))
c9b3d6a5 6679 (let ((overlays (overlays-at from))
87a16a06 6680 (face-priority -1)) ; text-property
d3ab8dac
KH
6681 (while (and overlays
6682 (not (eq face 'emacs--invisible--face)))
87a16a06 6683 (let* ((overlay (car overlays))
c86f4619 6684 (overlay-invisible
c9b3d6a5 6685 (overlay-get overlay 'invisible))
c86f4619 6686 (overlay-priority
c9b3d6a5 6687 (or (overlay-get overlay 'priority) 0)))
d3ab8dac 6688 (and (> overlay-priority face-priority)
c86f4619 6689 (setq before-string
c9b3d6a5 6690 (or (overlay-get overlay 'before-string)
c86f4619
GM
6691 before-string)
6692 after-string
c9b3d6a5
DN
6693 (or (and (<= (overlay-end overlay) position)
6694 (overlay-get overlay 'after-string))
c86f4619
GM
6695 after-string)
6696 face-priority overlay-priority
6697 face
6698 (cond
6699 ((if (eq save-buffer-invisibility-spec t)
6700 (not (null overlay-invisible))
6701 (or (memq overlay-invisible
6702 save-buffer-invisibility-spec)
6703 (assq overlay-invisible
6704 save-buffer-invisibility-spec)))
6705 'emacs--invisible--face)
c9b3d6a5 6706 ((overlay-get overlay 'face))
c86f4619
GM
6707 (t face)
6708 ))))
87a16a06
RS
6709 (setq overlays (cdr overlays))))
6710 ;; Plot up to this record.
c86f4619
GM
6711 (and before-string
6712 (ps-plot-string before-string))
87a16a06 6713 (ps-plot-with-face from position face)
c86f4619
GM
6714 (and after-string
6715 (ps-plot-string after-string))
87a16a06
RS
6716 (setq from position)))))
6717 (ps-plot-with-face from to face))))
ef2cbb24
RS
6718
6719(defun ps-generate-postscript (from to)
5167749c 6720 (ps-plot-region from to 0))
ef2cbb24
RS
6721
6722(defun ps-generate (buffer from to genfunc)
87a16a06
RS
6723 (save-excursion
6724 (let ((from (min to from))
6725 (to (max to from))
6726 ;; This avoids trouble if chars with read-only properties
6727 ;; are copied into ps-spool-buffer.
6728 (inhibit-read-only t))
6729 (save-restriction
6730 (narrow-to-region from to)
857686a6
RS
6731 (and ps-razzle-dazzle
6732 (message "Formatting...%3d%%" (setq ps-razchunk 0)))
8bd22fcf
KH
6733 (setq ps-source-buffer buffer
6734 ps-spool-buffer (get-buffer-create ps-spool-buffer-name))
87a16a06
RS
6735 (ps-init-output-queue)
6736 (let (safe-marker completed-safely needs-begin-file)
6737 (unwind-protect
00aa16af
RS
6738 (progn
6739 (set-buffer ps-spool-buffer)
7da17ab6 6740 (set-buffer-multibyte nil)
915293a2 6741
87a16a06
RS
6742 ;; Get a marker and make it point to the current end of the
6743 ;; buffer, If an error occurs, we'll delete everything from
6744 ;; the end of this marker onwards.
6745 (setq safe-marker (make-marker))
6746 (set-marker safe-marker (point-max))
6747
6748 (goto-char (point-min))
8bd22fcf
KH
6749 (or (looking-at (regexp-quote ps-adobe-tag))
6750 (setq needs-begin-file t))
ea0c615d
GM
6751
6752 (set-buffer ps-source-buffer)
87a16a06 6753 (save-excursion
ea0c615d
GM
6754 (let ((ps-print-page-p t)
6755 ps-even-or-odd-pages)
5167749c 6756 (ps-begin-job genfunc)
70f57a72
GM
6757 (when needs-begin-file
6758 (ps-begin-file)
6759 (ps-mule-initialize))
6760 (ps-mule-begin-job from to)
ea0c615d
GM
6761 (ps-selected-pages)))
6762 (ps-begin-page)
87a16a06
RS
6763 (funcall genfunc from to)
6764 (ps-end-page)
ea0c615d 6765 (ps-end-job needs-begin-file)
87a16a06
RS
6766
6767 ;; Setting this variable tells the unwind form that the
8bd22fcf 6768 ;; the PostScript was generated without error.
87a16a06
RS
6769 (setq completed-safely t))
6770
6771 ;; Unwind form: If some bad mojo occurred while generating
8bd22fcf 6772 ;; PostScript, delete all the PostScript that was generated.
87a16a06
RS
6773 ;; This protects the previously spooled files from getting
6774 ;; corrupted.
8bd22fcf
KH
6775 (and (markerp safe-marker) (not completed-safely)
6776 (progn
6777 (set-buffer ps-spool-buffer)
6778 (delete-region (marker-position safe-marker) (point-max))))))
87a16a06 6779
857686a6 6780 (and ps-razzle-dazzle (message "Formatting...done"))))))
ef2cbb24 6781
e65df0a1 6782
ea0c615d 6783(defun ps-end-job (needs-begin-file)
9dae638c 6784 (let ((ps-print-page-p t))
ea0c615d
GM
6785 (ps-flush-output)
6786 (save-excursion
4b3eb10f 6787 (let ((pages-per-sheet (mod ps-page-printed ps-n-up-printing))
ea0c615d 6788 (total-lines (cdr ps-printing-region))
ef1159c2 6789 (total-pages (ps-page-number)))
ea0c615d 6790 (set-buffer ps-spool-buffer)
ef1159c2
EZ
6791 (let (case-fold-search)
6792 ;; Back to the PS output buffer to set the last page n-up printing
6793 (goto-char (point-max))
6794 (and (> pages-per-sheet 0)
6795 (re-search-backward "^[0-9]+ BeginSheet$" nil t)
6796 (replace-match (format "%d BeginSheet" pages-per-sheet) t))
6797 ;; Back to the PS output buffer to set the page count
6798 (goto-char (point-min))
6799 (while (re-search-forward "^/Lines 0 def\n/PageCount 0 def$" nil t)
6800 (replace-match (format "/Lines %d def\n/PageCount %d def"
6801 total-lines total-pages) t)))))
ea0c615d
GM
6802 ;; Set dummy page
6803 (and ps-spool-duplex (= (mod ps-page-order 2) 1)
6804 (let ((ps-n-up-printing 0))
6805 (ps-header-sheet)
6806 (ps-output "/PrintHeader false def\n/ColumnIndex 0 def\n"
bd7a2e26
GM
6807 "/PrintLineNumber false def\n"
6808 (number-to-string ps-lines-printed) " BeginPage\n")
ea0c615d
GM
6809 (ps-end-page)))
6810 ;; Set end of PostScript file
9dae638c 6811 (ps-end-sheet)
4b3eb10f 6812 (ps-output "\n%%Trailer\n%%Pages: "
ea0c615d
GM
6813 (number-to-string
6814 (if (and needs-begin-file
6815 ps-banner-page-when-duplexing)
6816 (1+ ps-page-order)
6817 ps-page-order))
6818 "\n\nEndDoc\n\n%%EOF\n")
ef1159c2
EZ
6819 (and ps-end-with-control-d
6820 (ps-output "\C-d"))
ea0c615d
GM
6821 (ps-flush-output))
6822 ;; disable selected pages
1fd9b7fe 6823 (setq ps-selected-pages nil))
7d8b7e8e
KH
6824
6825
857686a6 6826;; Permit dynamic evaluation at print time of `ps-lpr-switches'.
ef2cbb24 6827(defun ps-do-despool (filename)
12d89a2e 6828 (if (or (not (boundp 'ps-spool-buffer))
bcc0d457 6829 (not (symbol-value 'ps-spool-buffer)))
12d89a2e 6830 (message "No spooled PostScript to print")
ef2cbb24
RS
6831 (if filename
6832 (save-excursion
857686a6 6833 (and ps-razzle-dazzle (message "Saving..."))
12d89a2e 6834 (set-buffer ps-spool-buffer)
ef2cbb24 6835 (setq filename (expand-file-name filename))
7ffaf659
EZ
6836 (let ((coding-system-for-write 'raw-text-unix))
6837 (write-region (point-min) (point-max) filename))
857686a6 6838 (and ps-razzle-dazzle (message "Wrote %s" filename)))
ef2cbb24 6839 ;; Else, spool to the printer
857686a6 6840 (and ps-razzle-dazzle (message "Printing..."))
ef2cbb24 6841 (save-excursion
12d89a2e 6842 (set-buffer ps-spool-buffer)
200127fd 6843 (let* ((coding-system-for-write 'raw-text-unix)
298bfad9
KH
6844 (ps-printer-name (or ps-printer-name
6845 (and (boundp 'printer-name)
2bd80d73 6846 (symbol-value 'printer-name))))
200127fd 6847 (ps-lpr-switches
3bcc60cf 6848 (append ps-lpr-switches
3556c6dd
GM
6849 (and (stringp ps-printer-name)
6850 (string< "" ps-printer-name)
6851 (list (concat
6852 (and (stringp ps-printer-name-option)
6853 ps-printer-name-option)
6854 ps-printer-name))))))
c1a1c994
VJL
6855 (or (stringp ps-printer-name)
6856 (setq ps-printer-name nil))
52cf535f
AI
6857 (apply (or ps-print-region-function 'call-process-region)
6858 (point-min) (point-max) ps-lpr-command nil
6859 (and (fboundp 'start-process) 0)
6860 nil
6861 (ps-flatten-list ; dynamic evaluation
6862 (mapcar 'ps-eval-switch ps-lpr-switches)))))
857686a6 6863 (and ps-razzle-dazzle (message "Printing...done")))
12d89a2e
RS
6864 (kill-buffer ps-spool-buffer)))
6865
857686a6
RS
6866;; Dynamic evaluation
6867(defun ps-eval-switch (arg)
6868 (cond ((stringp arg) arg)
6869 ((functionp arg) (apply arg nil))
6870 ((symbolp arg) (symbol-value arg))
6871 ((consp arg) (apply (car arg) (cdr arg)))
6872 (t nil)))
6873
6874;; `ps-flatten-list' is defined here (copied from "message.el" and
6875;; enhanced to handle dotted pairs as well) until we can get some
6876;; sensible autoloads, or `flatten-list' gets put somewhere decent.
6877
6878;; (ps-flatten-list '((a . b) c (d . e) (f g h) i . j))
6879;; => (a b c d e f g h i j)
6880
6881(defun ps-flatten-list (&rest list)
6882 (ps-flatten-list-1 list))
6883
6884(defun ps-flatten-list-1 (list)
6885 (cond ((null list) nil)
6886 ((consp list) (append (ps-flatten-list-1 (car list))
6887 (ps-flatten-list-1 (cdr list))))
6888 (t (list list))))
6889
12d89a2e
RS
6890(defun ps-kill-emacs-check ()
6891 (let (ps-buffer)
8bd22fcf 6892 (and (setq ps-buffer (get-buffer ps-spool-buffer-name))
71efd3c4 6893 (buffer-name ps-buffer) ; check if it's not killed
8bd22fcf
KH
6894 (buffer-modified-p ps-buffer)
6895 (y-or-n-p "Unprinted PostScript waiting; print now? ")
6896 (ps-despool))
6897 (and (setq ps-buffer (get-buffer ps-spool-buffer-name))
71efd3c4 6898 (buffer-name ps-buffer) ; check if it's not killed
8bd22fcf
KH
6899 (buffer-modified-p ps-buffer)
6900 (not (yes-or-no-p "Unprinted PostScript waiting; exit anyway? "))
6901 (error "Unprinted PostScript"))))
12d89a2e 6902
d3ab8dac
KH
6903(cond ((fboundp 'add-hook)
6904 (funcall 'add-hook 'kill-emacs-hook 'ps-kill-emacs-check))
6905 (kill-emacs-hook
6906 (message "Won't override existing `kill-emacs-hook'"))
6907 (t
6908 (setq kill-emacs-hook 'ps-kill-emacs-check)))
ef2cbb24 6909
298bfad9
KH
6910\f
6911;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12d89a2e 6912;;; Sample Setup Code:
ef2cbb24 6913
0a5daee5 6914
12d89a2e 6915;; This stuff is for anybody that's brave enough to look this far,
87a16a06
RS
6916;; and able to figure out how to use it. It isn't really part of
6917;; ps-print, but I'll leave it here in hopes it might be useful:
ef2cbb24 6918
298bfad9
KH
6919;; WARNING!!! The following code is *sample* code only.
6920;; Don't use it unless you understand what it does!
043620f4 6921
cf04718a 6922;; The key `f22' should probably be replaced by `print'. --Stef
00aa16af 6923
a18ed129
RS
6924;; A hook to bind to `rmail-mode-hook' to locally bind prsc and set the
6925;; `ps-left-headers' specially for mail messages.
6926(defun ps-rmail-mode-hook ()
cf04718a 6927 (local-set-key [(f22)] 'ps-rmail-print-message-from-summary)
a18ed129
RS
6928 (setq ps-header-lines 3
6929 ps-left-header
6930 ;; The left headers will display the message's subject, its
6931 ;; author, and the name of the folder it was in.
6932 '(ps-article-subject ps-article-author buffer-name)))
6933
6934;; See `ps-gnus-print-article-from-summary'. This function does the
6935;; same thing for rmail.
6936(defun ps-rmail-print-message-from-summary ()
6937 (interactive)
6938 (ps-print-message-from-summary 'rmail-summary-buffer "RMAIL"))
6939
6940;; Used in `ps-rmail-print-article-from-summary',
6941;; `ps-gnus-print-article-from-summary' and `ps-vm-print-message-from-summary'.
6942(defun ps-print-message-from-summary (summary-buffer summary-default)
6943 (let ((ps-buf (or (and (boundp summary-buffer)
6944 (symbol-value summary-buffer))
6945 summary-default)))
6946 (and (get-buffer ps-buf)
6947 (save-excursion
6948 (set-buffer ps-buf)
6949 (ps-spool-buffer-with-faces)))))
6950
12d89a2e 6951;; Look in an article or mail message for the Subject: line. To be
87a16a06 6952;; placed in `ps-left-headers'.
12d89a2e 6953(defun ps-article-subject ()
ef2cbb24 6954 (save-excursion
12d89a2e 6955 (goto-char (point-min))
45a870d9 6956 (if (re-search-forward "^Subject:[ \t]+\\(.*\\)$" nil t)
edc9cd35 6957 (buffer-substring (match-beginning 1) (match-end 1))
12d89a2e
RS
6958 "Subject ???")))
6959
6960;; Look in an article or mail message for the From: line. Sorta-kinda
6961;; understands RFC-822 addresses and can pull the real name out where
87a16a06 6962;; it's provided. To be placed in `ps-left-headers'.
12d89a2e
RS
6963(defun ps-article-author ()
6964 (save-excursion
6965 (goto-char (point-min))
a97592dd 6966 (if (re-search-forward "^From:[ \t]+\\(.*\\)$" nil t)
edc9cd35 6967 (let ((fromstring (buffer-substring (match-beginning 1) (match-end 1))))
12d89a2e
RS
6968 (cond
6969
6970 ;; Try first to match addresses that look like
6971 ;; thompson@wg2.waii.com (Jim Thompson)
6972 ((string-match ".*[ \t]+(\\(.*\\))" fromstring)
6973 (substring fromstring (match-beginning 1) (match-end 1)))
6974
6975 ;; Next try to match addresses that look like
edc9cd35
GM
6976 ;; Jim Thompson <thompson@wg2.waii.com> or
6977 ;; "Jim Thompson" <thompson@wg2.waii.com>
6978 ((string-match "\\(\"?\\)\\(.*\\)\\1[ \t]+<.*>" fromstring)
6979 (substring fromstring (match-beginning 2) (match-end 2)))
12d89a2e
RS
6980
6981 ;; Couldn't find a real name -- show the address instead.
6982 (t fromstring)))
6983 "From ???")))
6984
a18ed129 6985;; A hook to bind to `gnus-article-prepare-hook'. This will set the
87a16a06
RS
6986;; `ps-left-headers' specially for gnus articles. Unfortunately,
6987;; `gnus-article-mode-hook' is called only once, the first time the *Article*
12d89a2e
RS
6988;; buffer enters that mode, so it would only work for the first time
6989;; we ran gnus. The second time, this hook wouldn't get set up. The
87a16a06 6990;; only alternative is `gnus-article-prepare-hook'.
12d89a2e 6991(defun ps-gnus-article-prepare-hook ()
8bd22fcf
KH
6992 (setq ps-header-lines 3
6993 ps-left-header
12d89a2e
RS
6994 ;; The left headers will display the article's subject, its
6995 ;; author, and the newsgroup it was in.
8bd22fcf 6996 '(ps-article-subject ps-article-author gnus-newsgroup-name)))
12d89a2e 6997
a18ed129
RS
6998;; A hook to bind to `vm-mode-hook' to locally bind prsc and set the
6999;; `ps-left-headers' specially for mail messages.
12d89a2e 7000(defun ps-vm-mode-hook ()
cf04718a 7001 (local-set-key [(f22)] 'ps-vm-print-message-from-summary)
8bd22fcf
KH
7002 (setq ps-header-lines 3
7003 ps-left-header
12d89a2e
RS
7004 ;; The left headers will display the message's subject, its
7005 ;; author, and the name of the folder it was in.
8bd22fcf 7006 '(ps-article-subject ps-article-author buffer-name)))
12d89a2e
RS
7007
7008;; Every now and then I forget to switch from the *Summary* buffer to
7009;; the *Article* before hitting prsc, and a nicely formatted list of
7010;; article subjects shows up at the printer. This function, bound to
7011;; prsc for the gnus *Summary* buffer means I don't have to switch
7012;; buffers first.
87a16a06 7013;; sb: Updated for Gnus 5.
12d89a2e
RS
7014(defun ps-gnus-print-article-from-summary ()
7015 (interactive)
a18ed129 7016 (ps-print-message-from-summary 'gnus-article-buffer "*Article*"))
ef2cbb24 7017
87a16a06 7018;; See `ps-gnus-print-article-from-summary'. This function does the
12d89a2e
RS
7019;; same thing for vm.
7020(defun ps-vm-print-message-from-summary ()
7021 (interactive)
a18ed129 7022 (ps-print-message-from-summary 'vm-mail-buffer ""))
ef2cbb24 7023
87a16a06 7024;; A hook to bind to bind to `gnus-summary-setup-buffer' to locally bind
12d89a2e
RS
7025;; prsc.
7026(defun ps-gnus-summary-setup ()
cf04718a 7027 (local-set-key [(f22)] 'ps-gnus-print-article-from-summary))
12d89a2e
RS
7028
7029;; Look in an article or mail message for the Subject: line. To be
87a16a06 7030;; placed in `ps-left-headers'.
12d89a2e
RS
7031(defun ps-info-file ()
7032 (save-excursion
7033 (goto-char (point-min))
a97592dd 7034 (if (re-search-forward "File:[ \t]+\\([^, \t\n]*\\)" nil t)
edc9cd35 7035 (buffer-substring (match-beginning 1) (match-end 1))
12d89a2e
RS
7036 "File ???")))
7037
7038;; Look in an article or mail message for the Subject: line. To be
87a16a06 7039;; placed in `ps-left-headers'.
12d89a2e
RS
7040(defun ps-info-node ()
7041 (save-excursion
7042 (goto-char (point-min))
a97592dd 7043 (if (re-search-forward "Node:[ \t]+\\([^,\t\n]*\\)" nil t)
edc9cd35 7044 (buffer-substring (match-beginning 1) (match-end 1))
12d89a2e
RS
7045 "Node ???")))
7046
7047(defun ps-info-mode-hook ()
7048 (setq ps-left-header
7049 ;; The left headers will display the node name and file name.
8bd22fcf 7050 '(ps-info-node ps-info-file)))
12d89a2e 7051
043620f4
KH
7052;; WARNING! The following function is a *sample* only, and is *not*
7053;; meant to be used as a whole unless you understand what the effects
87a16a06
RS
7054;; will be! (In fact, this is a copy of Jim's setup for ps-print --
7055;; I'd be very surprised if it was useful to *anybody*, without
043620f4
KH
7056;; modification.)
7057
12d89a2e 7058(defun ps-jts-ps-setup ()
cf04718a
SM
7059 (global-set-key [(f22)] 'ps-spool-buffer-with-faces) ;f22 is prsc
7060 (global-set-key [(shift f22)] 'ps-spool-region-with-faces)
7061 (global-set-key [(control f22)] 'ps-despool)
12d89a2e
RS
7062 (add-hook 'gnus-article-prepare-hook 'ps-gnus-article-prepare-hook)
7063 (add-hook 'gnus-summary-mode-hook 'ps-gnus-summary-setup)
7064 (add-hook 'vm-mode-hook 'ps-vm-mode-hook)
00aa16af 7065 (add-hook 'vm-mode-hooks 'ps-vm-mode-hook)
12d89a2e 7066 (add-hook 'Info-mode-hook 'ps-info-mode-hook)
8bd22fcf
KH
7067 (setq ps-spool-duplex t
7068 ps-print-color-p nil
7069 ps-lpr-command "lpr"
7070 ps-lpr-switches '("-Jjct,duplex_long"))
bcc0d457
RS
7071 'ps-jts-ps-setup)
7072
7073;; WARNING! The following function is a *sample* only, and is *not*
7074;; meant to be used as a whole unless it corresponds to your needs.
7075;; (In fact, this is a copy of Jack's setup for ps-print --
7076;; I would not be that surprised if it was useful to *anybody*,
7077;; without modification.)
7078
7079(defun ps-jack-setup ()
87a16a06 7080 (setq ps-print-color-p nil
bcc0d457 7081 ps-lpr-command "lpr"
8bd22fcf 7082 ps-lpr-switches nil
bcc0d457 7083
87a16a06
RS
7084 ps-paper-type 'a4
7085 ps-landscape-mode t
bcc0d457
RS
7086 ps-number-of-columns 2
7087
7088 ps-left-margin (/ (* 72 1.0) 2.54) ; 1.0 cm
7089 ps-right-margin (/ (* 72 1.0) 2.54) ; 1.0 cm
7090 ps-inter-column (/ (* 72 1.0) 2.54) ; 1.0 cm
7091 ps-bottom-margin (/ (* 72 1.5) 2.54) ; 1.5 cm
7092 ps-top-margin (/ (* 72 1.5) 2.54) ; 1.5 cm
7093 ps-header-offset (/ (* 72 1.0) 2.54) ; 1.0 cm
7094 ps-header-line-pad .15
7095 ps-print-header t
7096 ps-print-header-frame t
7097 ps-header-lines 2
7098 ps-show-n-of-n t
7099 ps-spool-duplex nil
7100
7101 ps-font-family 'Courier
7102 ps-font-size 5.5
7103 ps-header-font-family 'Helvetica
7104 ps-header-font-size 6
7105 ps-header-title-font-size 8)
7106 'ps-jack-setup)
12d89a2e 7107
298bfad9
KH
7108\f
7109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7110;; To make this file smaller, some commands go in a separate file.
7111;; But autoload them here to make the separation invisible.
231f3e66
SM
7112\f
7113;;;### (autoloads (ps-mule-begin-page ps-mule-begin-job ps-mule-encode-header-string
7114;;;;;; ps-mule-initialize ps-mule-plot-composition ps-mule-plot-string
7115;;;;;; ps-mule-set-ascii-font ps-mule-prepare-ascii-font ps-multibyte-buffer)
5ef05ae3 7116;;;;;; "ps-mule" "ps-mule.el" "586d0a4deeb89be9b80cc01def34481c")
231f3e66 7117;;; Generated autoloads from ps-mule.el
298bfad9 7118
231f3e66 7119(defvar ps-multibyte-buffer nil "\
6fb87e51 7120*Specifies the multi-byte buffer handling.
298bfad9 7121
231f3e66 7122Valid values are:
298bfad9 7123
5da6890d
SM
7124 nil This is the value to use the default settings;
7125 by default, this only works to print buffers with
7126 only ASCII and Latin characters. But this default
7127 setting can be changed by setting the variable
231f3e66
SM
7128 `ps-mule-font-info-database-default' differently.
7129 The initial value of this variable is
7130 `ps-mule-font-info-database-latin' (see
7131 documentation).
7132
5da6890d 7133 `non-latin-printer' This is the value to use when you have a Japanese
231f3e66
SM
7134 or Korean PostScript printer and want to print
7135 buffer with ASCII, Latin-1, Japanese (JISX0208 and
7136 JISX0201-Kana) and Korean characters. At present,
6fb87e51
VJL
7137 it was not tested with the Korean characters
7138 printing. If you have a korean PostScript printer,
7139 please, test it.
231f3e66 7140
5da6890d 7141 `bdf-font' This is the value to use when you want to print
231f3e66
SM
7142 buffer with BDF fonts. BDF fonts include both latin
7143 and non-latin fonts. BDF (Bitmap Distribution
7144 Format) is a format used for distributing X's font
7145 source file. BDF fonts are included in
7146 `intlfonts-1.2' which is a collection of X11 fonts
7147 for all characters supported by Emacs. In order to
7148 use this value, be sure to have installed
7149 `intlfonts-1.2' and set the variable
7150 `bdf-directory-list' appropriately (see ps-bdf.el for
7151 documentation of this variable).
7152
5da6890d 7153 `bdf-font-except-latin' This is like `bdf-font' except that it uses
231f3e66
SM
7154 PostScript default fonts to print ASCII and Latin-1
7155 characters. This is convenient when you want or
7156 need to use both latin and non-latin characters on
7157 the same buffer. See `ps-font-family',
7158 `ps-header-font-family' and `ps-font-info-database'.
7159
7160Any other value is treated as nil.")
7161
ccae01a6 7162(custom-autoload 'ps-multibyte-buffer "ps-mule" t)
231f3e66 7163
ccae01a6 7164(autoload 'ps-mule-prepare-ascii-font "ps-mule" "\
231f3e66
SM
7165Setup special ASCII font for STRING.
7166STRING should contain only ASCII characters.
7167
7168\(fn STRING)" nil nil)
7169
ccae01a6 7170(autoload 'ps-mule-set-ascii-font "ps-mule" "\
231f3e66
SM
7171Not documented
7172
7173\(fn)" nil nil)
7174
ccae01a6 7175(autoload 'ps-mule-plot-string "ps-mule" "\
231f3e66 7176Generate PostScript code for plotting characters in the region FROM and TO.
298bfad9
KH
7177
7178It is assumed that all characters in this region belong to the same charset.
7179
7180Optional argument BG-COLOR specifies background color.
7181
7182Returns the value:
7183
7184 (ENDPOS . RUN-WIDTH)
7185
7186Where ENDPOS is the end position of the sequence and RUN-WIDTH is the width of
231f3e66
SM
7187the sequence.
7188
7189\(fn FROM TO &optional BG-COLOR)" nil nil)
7190
ccae01a6 7191(autoload 'ps-mule-plot-composition "ps-mule" "\
231f3e66
SM
7192Generate PostScript code for plotting composition in the region FROM and TO.
7193
7194It is assumed that all characters in this region belong to the same
7195composition.
7196
7197Optional argument BG-COLOR specifies background color.
7198
7199Returns the value:
7200
7201 (ENDPOS . RUN-WIDTH)
7202
7203Where ENDPOS is the end position of the sequence and RUN-WIDTH is the width of
7204the sequence.
7205
7206\(fn FROM TO &optional BG-COLOR)" nil nil)
7207
ccae01a6 7208(autoload 'ps-mule-initialize "ps-mule" "\
231f3e66
SM
7209Initialize global data for printing multi-byte characters.
7210
7211\(fn)" nil nil)
7212
ccae01a6 7213(autoload 'ps-mule-encode-header-string "ps-mule" "\
231f3e66
SM
7214Generate PostScript code for ploting STRING by font FONTTAG.
7215FONTTAG should be a string \"/h0\" or \"/h1\".
298bfad9 7216
231f3e66 7217\(fn STRING FONTTAG)" nil nil)
298bfad9 7218
ccae01a6 7219(autoload 'ps-mule-begin-job "ps-mule" "\
231f3e66 7220Start printing job for multi-byte chars between FROM and TO.
5ef05ae3 7221It checks if all multi-byte characters in the region are printable or not.
298bfad9 7222
231f3e66 7223\(fn FROM TO)" nil nil)
298bfad9 7224
ccae01a6 7225(autoload 'ps-mule-begin-page "ps-mule" "\
231f3e66 7226Not documented
6bf5fb46 7227
231f3e66 7228\(fn)" nil nil)
6bf5fb46 7229
231f3e66 7230;;;***
298bfad9
KH
7231\f
7232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7233
12d89a2e 7234(provide 'ps-print)
b87c5d3d 7235
231f3e66 7236;; arch-tag: fb06a585-1112-4206-885d-a57d95d50579
12d89a2e 7237;;; ps-print.el ends here