*** empty log message ***
[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,
830f437e 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>
0e80c373
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
e85cca87 13;; Version: 7.2.2
502ca00a 14;; X-URL: http://www.emacswiki.org/cgi-bin/wiki/ViniciusJoseLatorre
e65df0a1 15
e85cca87
VJL
16(defconst ps-print-version "7.2.2"
17 "ps-print.el, v 7.2.2 <2007/02/07 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
30;; Software Foundation; either version 2, or (at your option) any later
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
RS
1091;;
1092;;
87a16a06
RS
1093;; How Ps-Print Maps Faces
1094;; -----------------------
1095;;
319acba0
GM
1096;; As ps-print uses PostScript to print buffers, it is possible to have other
1097;; attributes associated with faces. So the new attributes used by ps-print
1098;; are:
87a16a06
RS
1099;;
1100;; strikeout - like underline, but the line is in middle of text.
1101;; overline - like underline, but the line is over the text.
1102;; shadow - text will have a shadow.
1103;; box - text will be surrounded by a box.
a18ed129 1104;; outline - print characters as hollow outlines.
87a16a06 1105;;
06fb6aab 1106;; See the documentation for `ps-extend-face'.
87a16a06 1107;;
bc0d41bd
KH
1108;; Let's, for example, remap `font-lock-keyword-face' to another foreground
1109;; color and bold attribute:
87a16a06 1110;;
a18ed129 1111;; (ps-extend-face '(font-lock-keyword-face "RoyalBlue" nil bold) 'MERGE)
87a16a06 1112;;
319acba0
GM
1113;; If you want to use a new face, define it first with `defface', and then call
1114;; `ps-extend-face' to specify how to print it.
6c8f2753 1115;;
87a16a06
RS
1116;;
1117;; How Ps-Print Has A Text And/Or Image On Background
1118;; --------------------------------------------------
1119;;
d3ab8dac 1120;; ps-print can print texts and/or EPS PostScript images on background; it is
87a16a06
RS
1121;; possible to define the following text attributes: font name, font size,
1122;; initial position, angle, gray scale and pages to print.
1123;;
1124;; It has the following EPS PostScript images attributes: file name containing
1125;; the image, initial position, X and Y scales, angle and pages to print.
1126;;
1127;; See documentation for `ps-print-background-text' and
1128;; `ps-print-background-image'.
1129;;
1130;; For example, if we wish to print text "preliminary" on all pages and text
1131;; "special" on page 5 and from page 11 to page 17, we could specify:
1132;;
1133;; (setq ps-print-background-text
1134;; '(("preliminary")
1135;; ("special"
1136;; "LeftMargin" "BottomMargin PrintHeight add" ; X and Y position
1137;; ; (upper left corner)
1138;; nil nil nil
12b88fff 1139;; "PrintHeight neg PrintPageWidth atan" ; angle
87a16a06
RS
1140;; 5 (11 . 17)) ; page list
1141;; ))
1142;;
1143;; Similarly, we could print image "~/images/EPS-image1.ps" on all pages and
1144;; image "~/images/EPS-image2.ps" on page 5 and from page 11 to page 17, we
1145;; specify:
1146;;
1147;; (setq ps-print-background-image
1148;; '(("~/images/EPS-image1.ps"
1149;; "LeftMargin" "BottomMargin") ; X and Y position (lower left corner)
1150;; ("~/images/EPS-image2.ps"
319acba0 1151;; "LeftMargin" "BottomMargin PrintHeight 2 div add" ; X and Y pos.
87a16a06
RS
1152;; ; (upper left corner)
1153;; nil nil nil
1154;; 5 (11 . 17)) ; page list
1155;; ))
1156;;
1157;; If it is not possible to read (or does not exist) an image file, that file
1158;; is ignored.
1159;;
1160;; The printing order is:
1161;;
6e1b1da6
GM
1162;; 1. Print background color
1163;; 2. Print zebra stripes
1164;; 3. Print background texts that it should be on all pages
1165;; 4. Print background images that it should be on all pages
1166;; 5. Print background texts only for current page (if any)
1167;; 6. Print background images only for current page (if any)
1168;; 7. Print header
1169;; 8. Print buffer text (with faces, if specified) and line number
87a16a06
RS
1170;;
1171;;
bcc0d457
RS
1172;; Utilities
1173;; ---------
1174;;
1175;; Some tools are provided to help you customize your font setup.
1176;;
1177;; `ps-setup' returns (some part of) the current setup.
1178;;
319acba0
GM
1179;; To avoid wrapping too many lines, you may want to adjust the left and right
1180;; margins and the font size. On UN*X systems, do:
bcc0d457
RS
1181;; pr -t file | awk '{printf "%3d %s\n", length($0), $0}' | sort -r | head
1182;; to determine the longest lines of your file.
319acba0
GM
1183;; Then, the command `ps-line-lengths' will give you the correspondence between
1184;; a line length (number of characters) and the maximum font size which doesn't
1185;; wrap such a line with the current ps-print setup.
bcc0d457 1186;;
319acba0
GM
1187;; The commands `ps-nb-pages-buffer' and `ps-nb-pages-region' display the
1188;; correspondence between a number of pages and the maximum font size which
1189;; allow the number of lines of the current buffer or of its current region to
1190;; fit in this number of pages.
a18ed129
RS
1191;;
1192;; NOTE: line folding is not taken into account in this process and could
1193;; change the results.
b87c5d3d 1194;;
0a5daee5
KH
1195;; The command `ps-print-customize' activates a customization buffer for
1196;; ps-print options.
1197;;
b87c5d3d 1198;;
b87c5d3d
RS
1199;; New since version 1.5
1200;; ---------------------
b87c5d3d 1201;;
bcc0d457 1202;; Color output capability.
b87c5d3d 1203;; Automatic detection of font attributes (bold, italic).
b87c5d3d 1204;; Configurable headers with page numbers.
b87c5d3d 1205;; Slightly faster.
b87c5d3d 1206;; Support for different paper sizes.
b87c5d3d
RS
1207;; Better conformance to PostScript Document Structure Conventions.
1208;;
ef2cbb24 1209;;
bcc0d457
RS
1210;; New since version 2.8
1211;; ---------------------
1212;;
e59d29d6 1213;; [vinicius] Vinicius Jose Latorre <viniciusjl@ig.com.br>
0a5daee5 1214;;
6b61353c
KH
1215;; 20040229
1216;; `ps-time-stamp-yyyy-mm-dd', `ps-time-stamp-iso8601'
1217;;
4b81a999
GM
1218;; 20010619
1219;; `ps-time-stamp-locale-default'
1220;;
1221;; 20010530
1222;; Handle before-string and after-string overlay properties.
1223;;
319acba0
GM
1224;; 20010407
1225;; `ps-line-number-color', `ps-print-footer', `ps-footer-offset',
1226;; `ps-print-footer-frame', `ps-footer-font-family',
1227;; `ps-footer-font-size', `ps-footer-line-pad', `ps-footer-lines',
1228;; `ps-left-footer', `ps-right-footer', `ps-footer-frame-alist' and
1229;; `ps-header-frame-alist'.
1230;;
1231;; 20010328
1232;; `ps-line-spacing', `ps-paragraph-spacing', `ps-paragraph-regexp',
1233;; `ps-begin-cut-regexp' and `ps-end-cut-regexp'.
1234;;
ef1159c2
EZ
1235;; 20001122
1236;; `ps-line-number-font', `ps-line-number-font-size' and
1237;; `ps-end-with-control-d'.
1238;;
c3d6d211
GM
1239;; 20000821
1240;; `ps-even-or-odd-pages'
1241;;
1fd9b7fe
GM
1242;; 20000617
1243;; `ps-manual-feed', `ps-warn-paper-type', `ps-print-upside-down',
1244;; `ps-selected-pages', `ps-last-selected-pages',
1245;; `ps-restore-selected-pages', `ps-switch-header',
1246;; `ps-line-number-step', `ps-line-number-start',
1247;; `ps-zebra-stripe-follow' and `ps-use-face-background'.
0a5daee5 1248;;
1fd9b7fe
GM
1249;; 20000310
1250;; PostScript error handler.
1251;; `ps-user-defined-prologue' and `ps-error-handler-message'.
bc0d41bd 1252;;
df5e6194 1253;; 19991211
1fd9b7fe 1254;; `ps-print-customize'.
bc0d41bd 1255;;
df5e6194 1256;; 19990703
1fd9b7fe
GM
1257;; Better customization.
1258;; `ps-banner-page-when-duplexing' and `ps-zebra-color'.
bc0d41bd 1259;;
df5e6194 1260;; 19990513
1fd9b7fe
GM
1261;; N-up printing.
1262;; Hook: `ps-print-begin-sheet-hook'.
bc0d41bd 1263;;
edf2174f 1264;; [kenichi] 19990509 Ken'ichi Handa <handa@m17n.org>
bc0d41bd 1265;;
6b61353c 1266;; `ps-print-region-function'
bc0d41bd 1267;;
e59d29d6 1268;; [vinicius] Vinicius Jose Latorre <viniciusjl@ig.com.br>
bc0d41bd 1269;;
df5e6194 1270;; 19990301
1fd9b7fe 1271;; PostScript tumble and setpagedevice.
bc0d41bd 1272;;
df5e6194 1273;; 19980922
1fd9b7fe
GM
1274;; PostScript prologue header comment insertion.
1275;; Skip invisible text better.
d3ab8dac 1276;;
edf2174f 1277;; [kenichi] 19980819 Ken'ichi Handa <handa@m17n.org>
e65df0a1 1278;;
6b61353c 1279;; Multi-byte buffer handling.
e65df0a1 1280;;
e59d29d6 1281;; [vinicius] Vinicius Jose Latorre <viniciusjl@ig.com.br>
12b88fff 1282;;
df5e6194 1283;; 19980306
1fd9b7fe 1284;; Skip invisible text.
12b88fff 1285;;
df5e6194 1286;; 19971130
1fd9b7fe
GM
1287;; Hooks: `ps-print-hook', `ps-print-begin-page-hook' and
1288;; `ps-print-begin-column-hook'.
1289;; Put one header per page over the columns.
1290;; Better database font management.
1291;; Better control characters handling.
12b88fff 1292;;
df5e6194 1293;; 19971121
1fd9b7fe
GM
1294;; Dynamic evaluation at print time of `ps-lpr-switches'.
1295;; Handle control characters.
1296;; Face remapping.
1297;; New face attributes.
1298;; Line number.
1299;; Zebra stripes.
1300;; Text and/or image on background.
87a16a06 1301;;
df5e6194 1302;; [jack] 19960517 Jacques Duthen <duthen@cegelec-red.fr>
bcc0d457 1303;;
a18ed129 1304;; Font family and float size for text and header.
bcc0d457
RS
1305;; Landscape mode.
1306;; Multiple columns.
1307;; Tools for page setup.
1308;;
1309;;
d3ab8dac 1310;; Known bugs and limitations of ps-print
ef2cbb24 1311;; --------------------------------------
bcc0d457 1312;;
319acba0
GM
1313;; Although color printing will work in XEmacs 19.12, it doesn't work well; in
1314;; particular, bold or italic fonts don't print in the right background color.
043620f4
KH
1315;;
1316;; Invisible properties aren't correctly ignored in XEmacs 19.12.
1317;;
319acba0
GM
1318;; Automatic font-attribute detection doesn't work well, especially with
1319;; hilit19 and older versions of get-create-face. Users having problems with
1320;; auto-font detection should use the lists `ps-italic-faces', `ps-bold-faces'
1321;; and `ps-underlined-faces' and/or turn off automatic detection by setting
1322;; `ps-auto-font-detect' to nil.
00aa16af 1323;;
319acba0
GM
1324;; Automatic font-attribute detection doesn't work with XEmacs 19.12 in tty
1325;; mode; use the lists `ps-italic-faces', `ps-bold-faces' and
857686a6 1326;; `ps-underlined-faces' instead.
12d89a2e 1327;;
00aa16af 1328;; Still too slow; could use some hand-optimization.
ef2cbb24 1329;;
12d89a2e 1330;; Default background color isn't working.
ef2cbb24
RS
1331;;
1332;; Faces are always treated as opaque.
1333;;
d6d3eaab 1334;; Epoch, Lucid and Emacs 22 not supported. At all.
ef2cbb24 1335;;
06fb6aab 1336;; Fixed-pitch fonts work better for line folding, but are not required.
bcc0d457 1337;;
319acba0
GM
1338;; `ps-nb-pages-buffer' and `ps-nb-pages-region' don't take care of folding
1339;; lines.
ef2cbb24 1340;;
12d89a2e 1341;;
d3ab8dac 1342;; Things to change
bcc0d457 1343;; ----------------
ef2cbb24 1344;;
12b88fff 1345;; Avoid page break inside a paragraph.
bcc0d457 1346;; Add `ps-non-bold-faces' and `ps-non-italic-faces' (should be easy).
bcc0d457 1347;; Improve the memory management for big files (hard?).
319acba0
GM
1348;; `ps-nb-pages-buffer' and `ps-nb-pages-region' should take care of folding
1349;; lines.
ef2cbb24 1350;;
ef2cbb24 1351;;
6bf5fb46
GM
1352;; Acknowledgments
1353;; ---------------
1354;;
9586e1d3
VJL
1355;; Thanks to Michael Piotrowski <mxp@dynalabs.de> for improving the DSC
1356;; compliance of the generated PostScript.
1357;;
55732434
GM
1358;; Thanks to Adam Doppelt <adoppelt@avogadro.com> for face mapping suggestion
1359;; for black/white PostScript printers.
1360;;
319acba0
GM
1361;; Thanks to Toni Ronkko <tronkko@hytti.uku.fi> for line and paragraph spacing,
1362;; region to cut out when printing and footer suggestions.
1363;;
6bf5fb46 1364;; Thanks to Pavel Janik ml <Pavel@Janik.cz> for documentation correction.
12b88fff 1365;;
ef1159c2
EZ
1366;; Thanks to Corinne Ilvedson <cilvedson@draper.com> for line number font size
1367;; suggestion.
1368;;
c3d6d211
GM
1369;; Thanks to Gord Wait <Gord_Wait@spectrumsignal.com> for
1370;; `ps-user-defined-prologue' example setting for HP PostScript printer.
1371;;
98f2fbe7
GM
1372;; Thanks to Paul Furnanz <pfurnanz@synopsys.com> for XEmacs compatibility
1373;; suggestion for `ps-postscript-code-directory' variable.
1374;;
906d41a7
GM
1375;; Thanks to David X Callaway <dxc@xprt.net> for helping debugging PostScript
1376;; level 1 compatibility.
1377;;
6b61353c
KH
1378;; Thanks to Colin Marquardt <colin.marquardt@usa.alcatel.com> for:
1379;; - upside-down, line number step, line number start and zebra stripe
1380;; follow suggestions.
1381;; - `ps-time-stamp-yyyy-mm-dd' and `ps-time-stamp-iso8601' suggestion.
1382;; - and for XEmacs beta-tests.
906d41a7 1383;;
66e63857 1384;; Thanks to Klaus Berndl <klaus.berndl@sdm.de> for user defined PostScript
2bd80d73
GM
1385;; prologue code suggestion, for odd/even printing suggestion and for
1386;; `ps-prologue-file' enhancement.
66e63857 1387;;
edf2174f 1388;; Thanks to Ken'ichi Handa <handa@m17n.org> for multi-byte buffer handling.
915293a2
KH
1389;;
1390;; Thanks to Matthew O Persico <Matthew.Persico@lazard.com> for line number on
1391;; empty columns.
1392;;
1393;; Thanks to Theodore Jump <tjump@cais.com> for adjust PostScript code order on
1394;; last page.
1395;;
6bdb808e
RS
1396;; Thanks to Roland Ducournau <ducour@lirmm.fr> for
1397;; `ps-print-control-characters' variable documentation.
1398;;
12b88fff
RS
1399;; Thanks to Marcus G Daniels <marcus@cathcart.sysc.pdx.edu> for a better
1400;; database font management.
1401;;
1402;; Thanks to Martin Boyer <gamin@videotron.ca> for some ideas on putting one
6bdb808e
RS
1403;; header per page over the columns and correct line numbers when printing a
1404;; region.
12b88fff
RS
1405;;
1406;; Thanks to Steven L Baur <steve@miranova.com> for dynamic evaluation at
1407;; print time of `ps-lpr-switches'.
1408;;
6bdb808e
RS
1409;; Thanks to Kevin Rodgers <kevinr@ihs.com> for handling control characters
1410;; (his code was severely modified, but the main idea was kept).
1411;;
12b88fff
RS
1412;; Thanks to some suggestions on:
1413;; * Face color map: Marco Melgazzi <marco@techie.com>
1414;; * XEmacs compatibility: William J. Henney <will@astrosmo.unam.mx>
984e7bd9 1415;; * Check `ps-paper-type': Sudhakar Frederick <sfrederi@asc.corp.mot.com>
12b88fff 1416;;
319acba0
GM
1417;; Thanks to Jacques Duthen <duthen@cegelec-red.fr> (Jack) for version 3.4 I
1418;; started from. [vinicius]
857686a6 1419;;
319acba0 1420;; Thanks to Jim Thompson <?@?> for the 2.8 version I started from. [jack]
bcc0d457 1421;;
319acba0
GM
1422;; Thanks to Kevin Rodgers <kevinr@ihs.com> for adding support for color and
1423;; the invisible property.
ef2cbb24 1424;;
319acba0
GM
1425;; Thanks to Avishai Yacobi, avishaiy@mcil.comm.mot.com, for writing the
1426;; initial port to Emacs 19. His code is no longer part of ps-print, but his
1427;; work is still appreciated.
ef2cbb24 1428;;
9586e1d3 1429;; Thanks to Remi Houdaille and Michel Train <michel@metasoft.fdn.org> for
319acba0
GM
1430;; adding underline support. Their code also is no longer part of ps-print,
1431;; but their efforts are not forgotten.
12d89a2e 1432;;
319acba0
GM
1433;; Thanks also to all of you who mailed code to add features to ps-print;
1434;; although I didn't use your code, I still appreciate your sharing it with me.
12d89a2e
RS
1435;;
1436;; Thanks to all who mailed comments, encouragement, and criticism.
319acba0
GM
1437;; Thanks also to all who responded to my survey; I had too many responses to
1438;; reply to them all, but I greatly appreciate your interest.
12d89a2e
RS
1439;;
1440;; Jim
bc0d41bd 1441;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ef2cbb24
RS
1442
1443;;; Code:
1444
55732434 1445
b6d0ac87 1446(require 'lpr)
68e684a0 1447
c97a3f22 1448
b6d0ac87
VJL
1449(or (featurep 'lisp-float-type)
1450 (error "`ps-print' requires floating point support"))
68e684a0 1451
eafa92bf 1452
b6d0ac87
VJL
1453(defvar ps-print-emacs-type
1454 (let ((case-fold-search t))
1455 (cond ((string-match "XEmacs" emacs-version) 'xemacs)
1456 ((string-match "Lucid" emacs-version)
1457 (error "`ps-print' doesn't support Lucid"))
1458 ((string-match "Epoch" emacs-version)
1459 (error "`ps-print' doesn't support Epoch"))
1460 (t
1461 (unless (and (boundp 'emacs-major-version)
0e80c373
VJL
1462 (> emacs-major-version 22))
1463 (error "`ps-print' only supports Emacs 23 and higher"))
b6d0ac87 1464 'emacs))))
eafa92bf 1465
68e684a0 1466
b6d0ac87
VJL
1467(defconst ps-windows-system
1468 (memq system-type '(emx win32 w32 mswindows ms-dos windows-nt)))
1469(defconst ps-lp-system
1470 (memq system-type '(usg-unix-v dgux hpux irix)))
1471
1472
c97a3f22
VJL
1473;; Load XEmacs/Emacs definitions
1474(eval-and-compile (require 'ps-def))
906d41a7
GM
1475
1476
ef2cbb24 1477;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12d89a2e
RS
1478;; User Variables:
1479
0a5daee5 1480
bcc0d457
RS
1481;;; Interface to the command system
1482
bc0d41bd 1483(defgroup postscript nil
b0fa9df7 1484 "PostScript Group."
bc0d41bd 1485 :tag "PostScript"
b6d0ac87 1486 :version "20"
bc0d41bd
KH
1487 :group 'emacs)
1488
e0af0d3e 1489(defgroup ps-print nil
b0fa9df7 1490 "PostScript generator for Emacs."
3556c6dd 1491 :link '(emacs-library-link :tag "Source Lisp File" "ps-print.el")
e0af0d3e 1492 :prefix "ps-"
b6d0ac87 1493 :version "20"
bc0d41bd
KH
1494 :group 'wp
1495 :group 'postscript)
e0af0d3e
RS
1496
1497(defgroup ps-print-horizontal nil
b0fa9df7 1498 "Horizontal page layout."
e0af0d3e
RS
1499 :prefix "ps-"
1500 :tag "Horizontal"
b6d0ac87 1501 :version "20"
e0af0d3e
RS
1502 :group 'ps-print)
1503
1504(defgroup ps-print-vertical nil
b0fa9df7 1505 "Vertical page layout."
e0af0d3e
RS
1506 :prefix "ps-"
1507 :tag "Vertical"
b6d0ac87 1508 :version "20"
e0af0d3e
RS
1509 :group 'ps-print)
1510
6e1b1da6 1511(defgroup ps-print-headers nil
b0fa9df7 1512 "Headers & footers layout."
e0af0d3e 1513 :prefix "ps-"
319acba0 1514 :tag "Header & Footer"
b6d0ac87 1515 :version "20"
e0af0d3e
RS
1516 :group 'ps-print)
1517
1518(defgroup ps-print-font nil
b0fa9df7 1519 "Fonts customization."
e0af0d3e
RS
1520 :prefix "ps-"
1521 :tag "Font"
b6d0ac87 1522 :version "20"
e0af0d3e
RS
1523 :group 'ps-print)
1524
1525(defgroup ps-print-color nil
b0fa9df7 1526 "Color customization."
e0af0d3e
RS
1527 :prefix "ps-"
1528 :tag "Color"
b6d0ac87 1529 :version "20"
e0af0d3e
RS
1530 :group 'ps-print)
1531
1532(defgroup ps-print-face nil
b0fa9df7 1533 "Faces customization."
e0af0d3e
RS
1534 :prefix "ps-"
1535 :tag "PS Faces"
b6d0ac87 1536 :version "20"
e0af0d3e
RS
1537 :group 'ps-print
1538 :group 'faces)
1539
bc0d41bd 1540(defgroup ps-print-n-up nil
b0fa9df7 1541 "N-up customization."
bc0d41bd
KH
1542 :prefix "ps-"
1543 :tag "N-Up"
b6d0ac87 1544 :version "20"
bc0d41bd
KH
1545 :group 'ps-print)
1546
1547(defgroup ps-print-zebra nil
b0fa9df7 1548 "Zebra customization."
bc0d41bd
KH
1549 :prefix "ps-"
1550 :tag "Zebra"
b6d0ac87 1551 :version "20"
bc0d41bd
KH
1552 :group 'ps-print)
1553
1554(defgroup ps-print-background nil
b0fa9df7 1555 "Background customization."
bc0d41bd
KH
1556 :prefix "ps-"
1557 :tag "Background"
b6d0ac87 1558 :version "20"
bc0d41bd
KH
1559 :group 'ps-print)
1560
1426742b 1561(defgroup ps-print-printer '((lpr custom-group))
b0fa9df7 1562 "Printer customization."
bc0d41bd
KH
1563 :prefix "ps-"
1564 :tag "Printer"
b6d0ac87 1565 :version "20"
bc0d41bd
KH
1566 :group 'ps-print)
1567
1568(defgroup ps-print-page nil
b0fa9df7 1569 "Page customization."
bc0d41bd
KH
1570 :prefix "ps-"
1571 :tag "Page"
b6d0ac87 1572 :version "20"
bc0d41bd
KH
1573 :group 'ps-print)
1574
6e1b1da6 1575(defgroup ps-print-miscellany nil
b0fa9df7 1576 "Miscellany customization."
6e1b1da6
GM
1577 :prefix "ps-"
1578 :tag "Miscellany"
b6d0ac87 1579 :version "20"
6e1b1da6
GM
1580 :group 'ps-print)
1581
bc0d41bd 1582
66e63857
GM
1583(defcustom ps-error-handler-message 'paper
1584 "*Specify where the error handler message should be sent.
1585
1586Valid values are:
1587
1588 `none' catch the error and *DON'T* send any message.
1589
1590 `paper' catch the error and print on paper the error message.
1591
1592 `system' catch the error and send back the error message to
6e1b1da6
GM
1593 printing system. This is useful only if printing system
1594 send back an email reporting the error, or if there is
1595 some other alternative way to report back the error from
1596 the system to you.
66e63857
GM
1597
1598 `paper-and-system' catch the error, print on paper the error message and
1599 send back the error message to printing system.
1600
1601Any other value is treated as `paper'."
8e234846
GM
1602 :type '(choice :menu-tag "Error Handler Message"
1603 :tag "Error Handler Message"
66e63857
GM
1604 (const none) (const paper)
1605 (const system) (const paper-and-system))
b6d0ac87 1606 :version "20"
6e1b1da6 1607 :group 'ps-print-miscellany)
66e63857
GM
1608
1609(defcustom ps-user-defined-prologue nil
1610 "*User defined PostScript prologue code inserted before all prologue code.
1611
1612`ps-user-defined-prologue' may be a string or a symbol function which returns a
1613string. Note that this string is inserted after `ps-adobe-tag' and PostScript
1614prologue comments, and before ps-print PostScript prologue code section. That
1615is, this string is inserted after error handler initialization and before
1616ps-print settings.
1617
66e63857
GM
1618It's strongly recommended only insert PostScript code and/or comments specific
1619for your printing system particularities. For example, some special
1620initialization that only your printing system needs.
1621
319acba0
GM
1622Do not insert code for duplex printing, n-up printing or error handler,
1623ps-print handles this in a suitable way.
66e63857
GM
1624
1625For more information about PostScript, see:
1626 PostScript Language Reference Manual (2nd edition)
c3d6d211
GM
1627 Adobe Systems Incorporated
1628
1629As an example for `ps-user-defined-prologue' setting:
1630
1631 ;; Setting for HP PostScript printer
1632 (setq ps-user-defined-prologue
1633 (concat \"<</DeferredMediaSelection true /PageSize [612 792] \"
2285bf9d 1634 \"/MediaPosition 2 /MediaType (Plain)>> setpagedevice\"))"
8e234846
GM
1635 :type '(choice :menu-tag "User Defined Prologue"
1636 :tag "User Defined Prologue"
98f2fbe7 1637 (const :tag "none" nil) string symbol)
b6d0ac87 1638 :version "20"
6e1b1da6 1639 :group 'ps-print-miscellany)
66e63857 1640
d3ab8dac
KH
1641(defcustom ps-print-prologue-header nil
1642 "*PostScript prologue header comments besides that ps-print generates.
1643
319acba0
GM
1644`ps-print-prologue-header' may be a string or a symbol function which returns a
1645string. Note that this string is inserted on PostScript prologue header
1646section which is used to define some document characteristic through PostScript
1647special comments, like \"%%Requirements: jog\\n\".
d3ab8dac
KH
1648
1649ps-print always inserts the %%Requirements: comment, so if you need to insert
1650more requirements put them first in `ps-print-prologue-header' using the
1651\"%%+\" comment. For example, if you need to set numcopies to 3 and jog on
1652requirements and set %%LanguageLevel: to 2, do:
1653
2285bf9d 1654 (setq ps-print-prologue-header
e59d29d6 1655 \"%%+ numcopies(3) jog\\n%%LanguageLevel: 2\\n\")
d3ab8dac
KH
1656
1657The duplex requirement is inserted by ps-print (see `ps-spool-duplex').
1658
1659Do not forget to terminate the string with \"\\n\".
1660
1661For more information about PostScript document comments, see:
1662 PostScript Language Reference Manual (2nd edition)
1663 Adobe Systems Incorporated
1664 Appendix G: Document Structuring Conventions -- Version 3.0"
8e234846
GM
1665 :type '(choice :menu-tag "Prologue Header"
1666 :tag "Prologue Header"
98f2fbe7 1667 (const :tag "none" nil) string symbol)
b6d0ac87 1668 :version "20"
6e1b1da6 1669 :group 'ps-print-miscellany)
d3ab8dac 1670
298bfad9 1671(defcustom ps-printer-name (and (boundp 'printer-name)
2bd80d73 1672 (symbol-value 'printer-name))
03820514
RS
1673 "*The name of a local printer for printing PostScript files.
1674
3556c6dd
GM
1675On Unix-like systems, a string value should be a name understood by lpr's -P
1676option; a value of nil means use the value of `printer-name' instead.
1677
1678On MS-DOS and MS-Windows systems, a string value is taken as the name of the
1679printer device or port to which PostScript files are written, provided
1680`ps-lpr-command' is \"\". By default it is the same as `printer-name'; typical
1681non-default settings would be \"LPT1\" to \"LPT3\" for parallel printers, or
7bb054a5 1682\"COM1\" to \"COM4\" or \"AUX\" for serial printers, or \"\\\\hostname\\printer\"
3556c6dd
GM
1683for a shared network printer. You can also set it to a name of a file, in
1684which case the output gets appended to that file. \(Note that `ps-print'
1685package already has facilities for printing to a file, so you might as well use
1686them instead of changing the setting of this variable.\) If you want to
1687silently discard the printed output, set this to \"NUL\".
1688
1689Set to t, if the utility given by `ps-lpr-command' needs an empty printer name.
1690
1691Any other value is treated as t, that is, an empty printer name.
1692
1693See also `ps-printer-name-option' for documentation."
8e234846
GM
1694 :type '(choice :menu-tag "Printer Name"
1695 :tag "Printer Name"
1696 (const :tag "Same as printer-name" nil)
3556c6dd 1697 (const :tag "No Printer Name" t)
6e1b1da6 1698 (file :tag "Print to file")
8e234846 1699 (string :tag "Pipe to ps-lpr-command"))
b6d0ac87 1700 :version "20"
bc0d41bd 1701 :group 'ps-print-printer)
03820514 1702
3556c6dd
GM
1703(defcustom ps-printer-name-option
1704 (cond (ps-windows-system
1705 "/D:")
1706 (ps-lp-system
1707 "-d")
1708 (t
1709 "-P" ))
1710 "*Option for `ps-printer-name' variable (see it).
1711
2285bf9d
RS
1712On Unix-like systems, if `lpr' is in use, this should be the string
1713\"-P\"; if `lp' is in use, this should be the string \"-d\".
3556c6dd 1714
2285bf9d 1715On MS-DOS and MS-Windows systems, if `print' is in use, this should be
3556c6dd
GM
1716the string \"/D:\".
1717
2285bf9d 1718For any other printing utility, see its documentation.
3556c6dd 1719
c90a10fa
RS
1720Set this to \"\" or nil, if the utility given by `ps-lpr-command'
1721needs an empty printer name option--that is, pass the printer name
1722with no special option preceding it.
3556c6dd 1723
c90a10fa 1724Any value that is not a string is treated as nil.
3556c6dd
GM
1725
1726This variable is used only when `ps-printer-name' is a non-empty string."
1727 :type '(choice :menu-tag "Printer Name Option"
1728 :tag "Printer Name Option"
1729 (const :tag "None" nil)
1730 (string :tag "Option"))
6bf5fb46 1731 :version "21.1"
3556c6dd
GM
1732 :group 'ps-print-printer)
1733
e0af0d3e 1734(defcustom ps-lpr-command lpr-command
52cf535f
AI
1735 "*Name of program for printing a PostScript file.
1736
3556c6dd
GM
1737On MS-DOS and MS-Windows systems, if the value is an empty string then Emacs
1738will write directly to the printer port named by `ps-printer-name'. The
1739programs `print' and `nprint' (the standard print programs on Windows NT and
1740Novell Netware respectively) are handled specially, using `ps-printer-name' as
1741the destination for output; any other program is treated like `lpr' except that
1742an explicit filename is given as the last argument."
e0af0d3e 1743 :type 'string
b6d0ac87 1744 :version "20"
bc0d41bd 1745 :group 'ps-print-printer)
e0af0d3e
RS
1746
1747(defcustom ps-lpr-switches lpr-switches
1748 "*A list of extra switches to pass to `ps-lpr-command'."
edc9cd35 1749 :type '(repeat :tag "PostScript lpr Switches"
ef1159c2
EZ
1750 (choice :menu-tag "PostScript lpr Switch"
1751 :tag "PostScript lpr Switch"
1752 string symbol (repeat sexp)))
b6d0ac87 1753 :version "20"
bc0d41bd 1754 :group 'ps-print-printer)
12d89a2e 1755
52cf535f 1756(defcustom ps-print-region-function nil
bc0d41bd 1757 "*Specify a function to print the region on a PostScript printer.
319acba0
GM
1758See definition of `call-process-region' for calling conventions. The fourth
1759and the sixth arguments are both nil."
942a1d58 1760 :type '(choice (const nil) function)
b6d0ac87 1761 :version "20"
bc0d41bd 1762 :group 'ps-print-printer)
52cf535f 1763
8e234846
GM
1764(defcustom ps-manual-feed nil
1765 "*Non-nil means the printer will manually feed paper.
1766
1767If it's nil, automatic feeding takes place."
1768 :type 'boolean
b6d0ac87 1769 :version "20"
8e234846
GM
1770 :group 'ps-print-printer)
1771
bd7a2e26 1772(defcustom ps-end-with-control-d (and ps-windows-system t)
ef1159c2 1773 "*Non-nil means insert C-d at end of PostScript file generated."
6bf5fb46 1774 :version "21.1"
ef1159c2 1775 :type 'boolean
b6d0ac87 1776 :version "20"
ef1159c2
EZ
1777 :group 'ps-print-printer)
1778
bcc0d457 1779;;; Page layout
12d89a2e 1780
bcc0d457
RS
1781;; All page dimensions are in PostScript points.
1782;; 1 inch == 2.54 cm == 72 points
1783;; 1 cm == (/ 1 2.54) inch == (/ 72 2.54) points
1784
1785;; Letter 8.5 inch x 11.0 inch
1786;; Legal 8.5 inch x 14.0 inch
1787;; A4 8.26 inch x 11.69 inch = 21.0 cm x 29.7 cm
1788
1789;; LetterSmall 7.68 inch x 10.16 inch
1790;; Tabloid 11.0 inch x 17.0 inch
1791;; Ledger 17.0 inch x 11.0 inch
1792;; Statement 5.5 inch x 8.5 inch
1793;; Executive 7.5 inch x 10.0 inch
1794;; A3 11.69 inch x 16.5 inch = 29.7 cm x 42.0 cm
1795;; A4Small 7.47 inch x 10.85 inch
1796;; B4 10.125 inch x 14.33 inch
1797;; B5 7.16 inch x 10.125 inch
1798
c90a10fa 1799;;;###autoload
e0af0d3e 1800(defcustom ps-page-dimensions-database
bc0d41bd
KH
1801 (list (list 'a4 (/ (* 72 21.0) 2.54) (/ (* 72 29.7) 2.54) "A4")
1802 (list 'a3 (/ (* 72 29.7) 2.54) (/ (* 72 42.0) 2.54) "A3")
1803 (list 'letter (* 72 8.5) (* 72 11.0) "Letter")
1804 (list 'legal (* 72 8.5) (* 72 14.0) "Legal")
1805 (list 'letter-small (* 72 7.68) (* 72 10.16) "LetterSmall")
1806 (list 'tabloid (* 72 11.0) (* 72 17.0) "Tabloid")
1807 (list 'ledger (* 72 17.0) (* 72 11.0) "Ledger")
1808 (list 'statement (* 72 5.5) (* 72 8.5) "Statement")
1809 (list 'executive (* 72 7.5) (* 72 10.0) "Executive")
1810 (list 'a4small (* 72 7.47) (* 72 10.85) "A4Small")
1811 (list 'b4 (* 72 10.125) (* 72 14.33) "B4")
1812 (list 'b5 (* 72 7.16) (* 72 10.125) "B5"))
1813 "*List associating a symbolic paper type to its width, height and doc media.
1814See `ps-paper-type'."
e0af0d3e
RS
1815 :type '(repeat (list :tag "Paper Type"
1816 (symbol :tag "Name")
1817 (number :tag "Width")
bc0d41bd
KH
1818 (number :tag "Height")
1819 (string :tag "Media")))
b6d0ac87 1820 :version "20"
bc0d41bd 1821 :group 'ps-print-page)
e0af0d3e 1822
857686a6 1823;;;###autoload
e0af0d3e 1824(defcustom ps-paper-type 'letter
bc0d41bd 1825 "*Specify the size of paper to format for.
090be653 1826Should be one of the paper types defined in `ps-page-dimensions-database', for
e0af0d3e
RS
1827example `letter', `legal' or `a4'."
1828 :type '(symbol :validate (lambda (wid)
87a16a06
RS
1829 (if (assq (widget-value wid)
1830 ps-page-dimensions-database)
e0af0d3e
RS
1831 nil
1832 (widget-put wid :error "Unknown paper size")
1833 wid)))
b6d0ac87 1834 :version "20"
bc0d41bd 1835 :group 'ps-print-page)
e0af0d3e 1836
8e234846
GM
1837(defcustom ps-warn-paper-type t
1838 "*Non-nil means give an error if paper size is not equal to `ps-paper-type'.
1839
1840It's used when `ps-spool-config' is set to `setpagedevice'."
1841 :type 'boolean
b6d0ac87 1842 :version "20"
8e234846
GM
1843 :group 'ps-print-page)
1844
87a16a06 1845(defcustom ps-landscape-mode nil
e0af0d3e
RS
1846 "*Non-nil means print in landscape mode."
1847 :type 'boolean
b6d0ac87 1848 :version "20"
bc0d41bd 1849 :group 'ps-print-page)
e0af0d3e 1850
906d41a7 1851(defcustom ps-print-upside-down nil
2285bf9d 1852 "*Non-nil means print upside-down (that is, rotated by 180 degrees)."
906d41a7 1853 :type 'boolean
319acba0 1854 :version "21.1"
906d41a7
GM
1855 :group 'ps-print-page)
1856
1fd9b7fe
GM
1857(defcustom ps-selected-pages nil
1858 "*Specify which pages to print.
1859
2285bf9d 1860If nil, print all pages.
1fd9b7fe 1861
2285bf9d 1862If a list, the lists element may be an integer or a cons cell (FROM . TO)
1fd9b7fe 1863designating FROM page to TO page; any invalid element is ignored, that is, an
e59d29d6 1864integer lesser than one or if FROM is greater than TO.
1fd9b7fe
GM
1865
1866Otherwise, it's treated as nil.
1867
2285bf9d
RS
1868After ps-print processing `ps-selected-pages' is set to nil. But the
1869latest `ps-selected-pages' is saved in `ps-last-selected-pages' (which
1870see). So you can restore the latest selected pages by using
1871`ps-last-selected-pages' or with the `ps-restore-selected-pages'
1872command (which see).
ea0c615d
GM
1873
1874See also `ps-even-or-odd-pages'."
1fd9b7fe
GM
1875 :type '(repeat :tag "Selected Pages"
1876 (radio :tag "Page"
1877 (integer :tag "Number")
1878 (cons :tag "Range"
1879 (integer :tag "From")
1880 (integer :tag "To"))))
b6d0ac87 1881 :version "20"
1fd9b7fe
GM
1882 :group 'ps-print-page)
1883
c3d6d211
GM
1884(defcustom ps-even-or-odd-pages nil
1885 "*Specify if it prints even/odd pages.
1886
1887Valid values are:
1888
1889 nil print all pages.
1890
4b3eb10f
GM
1891 `even-page' print only even pages.
1892
1893 `odd-page' print only odd pages.
1894
1895 `even-sheet' print only even sheets.
bd7a2e26
GM
1896 That is, if `ps-n-up-printing' is 1, it behaves as `even-page';
1897 but for values greater than 1, it'll print only the even sheet
1898 of paper.
c3d6d211 1899
4b3eb10f 1900 `odd-sheet' print only odd sheets.
bd7a2e26
GM
1901 That is, if `ps-n-up-printing' is 1, it behaves as `odd-page';
1902 but for values greater than 1, it'll print only the odd sheet
1903 of paper.
c3d6d211 1904
ea0c615d
GM
1905Any other value is treated as nil.
1906
1907If you set `ps-selected-pages' (see it for documentation), first the pages are
1908filtered by `ps-selected-pages' and then by `ps-even-or-odd-pages'. For
1909example, if we have:
1910
4b3eb10f 1911 (setq ps-selected-pages '(1 4 (6 . 10) (12 . 16) 20))
ea0c615d 1912
4b3eb10f 1913Combining with `ps-even-or-odd-pages' and `ps-n-up-printing', we have:
ea0c615d 1914
4b3eb10f 1915`ps-n-up-printing' = 1:
ea0c615d 1916 `ps-even-or-odd-pages' PAGES PRINTED
4b3eb10f
GM
1917 nil 1, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 20
1918 even-page 4, 6, 8, 10, 12, 14, 16, 20
1919 odd-page 1, 7, 9, 13, 15
1920 even-sheet 4, 6, 8, 10, 12, 14, 16, 20
1921 odd-sheet 1, 7, 9, 13, 15
1922
1923`ps-n-up-printing' = 2:
1924 `ps-even-or-odd-pages' PAGES PRINTED
1925 nil 1/4, 6/7, 8/9, 10/12, 13/14, 15/16, 20
1926 even-page 4/6, 8/10, 12/14, 16/20
1927 odd-page 1/7, 9/13, 15
1928 even-sheet 6/7, 10/12, 15/16
1929 odd-sheet 1/4, 8/9, 13/14, 20
1930
1931So even-page/odd-page are about page parity and even-sheet/odd-sheet are about
1932sheet parity."
c3d6d211
GM
1933 :type '(choice :menu-tag "Print Even/Odd Pages"
1934 :tag "Print Even/Odd Pages"
1935 (const :tag "All Pages" nil)
4b3eb10f
GM
1936 (const :tag "Only Even Pages" even-page)
1937 (const :tag "Only Odd Pages" odd-page)
1938 (const :tag "Only Even Sheets" even-sheet)
1939 (const :tag "Only Odd Sheets" odd-sheet))
b6d0ac87 1940 :version "20"
c3d6d211
GM
1941 :group 'ps-print-page)
1942
857686a6 1943(defcustom ps-print-control-characters 'control-8-bit
bc0d41bd
KH
1944 "*Specify the printable form for control and 8-bit characters.
1945That is, instead of sending, for example, a ^D (\\004) to printer,
915293a2 1946it is sent the string \"^D\".
6bdb808e 1947
857686a6 1948Valid values are:
6bdb808e 1949
984e7bd9 1950 `8-bit' This is the value to use when you want an ASCII encoding of
d3ab8dac
KH
1951 any control or non-ASCII character. Control characters are
1952 encoded as \"^D\", and non-ASCII characters have an
1953 octal encoding.
6bdb808e 1954
984e7bd9 1955 `control-8-bit' This is the value to use when you want an ASCII encoding of
d3ab8dac
KH
1956 any control character, whether it is 7 or 8-bit.
1957 European 8-bits accented characters are printed according
1958 the current font.
6bdb808e 1959
c82b4a75 1960 `control' Only ASCII control characters have an ASCII encoding.
d3ab8dac
KH
1961 European 8-bits accented characters are printed according
1962 the current font.
6bdb808e 1963
984e7bd9 1964 nil No ASCII encoding. Any character is printed according the
d3ab8dac 1965 current font.
6bdb808e 1966
857686a6 1967Any other value is treated as nil."
8e234846
GM
1968 :type '(choice :menu-tag "Control Char"
1969 :tag "Control Char"
bc0d41bd 1970 (const 8-bit) (const control-8-bit)
edc9cd35 1971 (const control) (const :tag "nil" nil))
b6d0ac87 1972 :version "20"
6e1b1da6 1973 :group 'ps-print-miscellany)
857686a6 1974
bc0d41bd
KH
1975(defcustom ps-n-up-printing 1
1976 "*Specify the number of pages per sheet paper."
1977 :type '(integer
1978 :tag "N Up Printing"
1979 :validate
1980 (lambda (wid)
1981 (if (and (< 0 (widget-value wid))
1982 (<= (widget-value wid) 100))
1983 nil
1984 (widget-put
1985 wid :error
1986 "Number of pages per sheet paper must be between 1 and 100.")
1987 wid)))
b6d0ac87 1988 :version "20"
bc0d41bd
KH
1989 :group 'ps-print-n-up)
1990
1991(defcustom ps-n-up-margin (/ (* 72 1.0) 2.54) ; 1 cm
1992 "*Specify the margin in points between the sheet border and n-up printing."
1993 :type 'number
b6d0ac87 1994 :version "20"
bc0d41bd
KH
1995 :group 'ps-print-n-up)
1996
1997(defcustom ps-n-up-border-p t
1998 "*Non-nil means a border is drawn around each page."
1999 :type 'boolean
b6d0ac87 2000 :version "20"
bc0d41bd
KH
2001 :group 'ps-print-n-up)
2002
2003(defcustom ps-n-up-filling 'left-top
2004 "*Specify how page matrix is filled on each sheet of paper.
2005
2006Following are the valid values for `ps-n-up-filling' with a filling example
2007using a 3x4 page matrix:
2008
2009 `left-top' 1 2 3 4 `left-bottom' 9 10 11 12
2010 5 6 7 8 5 6 7 8
2011 9 10 11 12 1 2 3 4
2012
2013 `right-top' 4 3 2 1 `right-bottom' 12 11 10 9
2014 8 7 6 5 8 7 6 5
2015 12 11 10 9 4 3 2 1
2016
2017 `top-left' 1 4 7 10 `bottom-left' 3 6 9 12
2018 2 5 8 11 2 5 8 11
2019 3 6 9 12 1 4 7 10
2020
2021 `top-right' 10 7 4 1 `bottom-right' 12 9 6 3
2022 11 8 5 2 11 8 5 2
2023 12 9 6 3 10 7 4 1
2024
2025Any other value is treated as `left-top'."
8e234846
GM
2026 :type '(choice :menu-tag "N-Up Filling"
2027 :tag "N-Up Filling"
bc0d41bd
KH
2028 (const left-top) (const left-bottom)
2029 (const right-top) (const right-bottom)
2030 (const top-left) (const bottom-left)
2031 (const top-right) (const bottom-right))
b6d0ac87 2032 :version "20"
bc0d41bd
KH
2033 :group 'ps-print-n-up)
2034
e0af0d3e 2035(defcustom ps-number-of-columns (if ps-landscape-mode 2 1)
2285bf9d 2036 "*Specify the number of columns."
87a16a06 2037 :type 'number
b6d0ac87 2038 :version "20"
6e1b1da6 2039 :group 'ps-print-miscellany)
87a16a06 2040
535efc38 2041(defcustom ps-zebra-stripes nil
87a16a06 2042 "*Non-nil means print zebra stripes.
6e1b1da6 2043See also documentation for `ps-zebra-stripe-height' and `ps-zebra-color'."
87a16a06 2044 :type 'boolean
b6d0ac87 2045 :version "20"
bc0d41bd 2046 :group 'ps-print-zebra)
87a16a06 2047
535efc38 2048(defcustom ps-zebra-stripe-height 3
87a16a06 2049 "*Number of zebra stripe lines.
6e1b1da6 2050See also documentation for `ps-zebra-stripes' and `ps-zebra-color'."
87a16a06 2051 :type 'number
b6d0ac87 2052 :version "20"
bc0d41bd
KH
2053 :group 'ps-print-zebra)
2054
6e1b1da6
GM
2055(defcustom ps-zebra-color 0.95
2056 "*Zebra stripe gray scale or RGB color.
bc0d41bd 2057See also documentation for `ps-zebra-stripes' and `ps-zebra-stripe-height'."
8e234846
GM
2058 :type '(choice :menu-tag "Zebra Gray/Color"
2059 :tag "Zebra Gray/Color"
6e1b1da6
GM
2060 (number :tag "Gray Scale" :value 0.95)
2061 (string :tag "Color Name" :value "gray95")
2062 (list :tag "RGB Color" :value (0.95 0.95 0.95)
2063 (number :tag "Red")
2064 (number :tag "Green")
2065 (number :tag "Blue")))
b6d0ac87 2066 :version "20"
bc0d41bd 2067 :group 'ps-print-zebra)
87a16a06 2068
8e234846 2069(defcustom ps-zebra-stripe-follow nil
2bd80d73
GM
2070 "*Specify how zebra stripes continue on next page.
2071
2072Visually, valid values are (the character `+' at right of each column indicates
2073that a line is printed):
2074
2075 `nil' `follow' `full' `full-follow'
2076 Current Page -------- ----------- --------- ----------------
2077 1 XXXXX + 1 XXXXXXXX + 1 XXXXXX + 1 XXXXXXXXXXXXX +
2078 2 XXXXX + 2 XXXXXXXX + 2 XXXXXX + 2 XXXXXXXXXXXXX +
2079 3 XXXXX + 3 XXXXXXXX + 3 XXXXXX + 3 XXXXXXXXXXXXX +
2080 4 + 4 + 4 + 4 +
2081 5 + 5 + 5 + 5 +
2082 6 + 6 + 6 + 6 +
2083 7 XXXXX + 7 XXXXXXXX + 7 XXXXXX + 7 XXXXXXXXXXXXX +
2084 8 XXXXX + 8 XXXXXXXX + 8 XXXXXX + 8 XXXXXXXXXXXXX +
2085 9 XXXXX + 9 XXXXXXXX + 9 XXXXXX + 9 XXXXXXXXXXXXX +
2086 10 + 10 +
2087 11 + 11 +
2088 -------- ----------- --------- ----------------
2089 Next Page -------- ----------- --------- ----------------
2090 12 XXXXX + 12 + 10 XXXXXX + 10 +
2091 13 XXXXX + 13 XXXXXXXX + 11 XXXXXX + 11 +
2092 14 XXXXX + 14 XXXXXXXX + 12 XXXXXX + 12 +
2093 15 + 15 XXXXXXXX + 13 + 13 XXXXXXXXXXXXX +
2094 16 + 16 + 14 + 14 XXXXXXXXXXXXX +
2095 17 + 17 + 15 + 15 XXXXXXXXXXXXX +
2096 18 XXXXX + 18 + 16 XXXXXX + 16 +
2097 19 XXXXX + 19 XXXXXXXX + 17 XXXXXX + 17 +
2098 20 XXXXX + 20 XXXXXXXX + 18 XXXXXX + 18 +
2099 21 + 21 XXXXXXXX +
2100 22 + 22 +
2101 -------- ----------- --------- ----------------
2102
d730a5ac 2103Any other value is treated as nil."
2bd80d73
GM
2104 :type '(choice :menu-tag "Zebra Stripe Follow"
2105 :tag "Zebra Stripe Follow"
2106 (const :tag "Always Restart" nil)
2107 (const :tag "Continue on Next Page" follow)
2108 (const :tag "Print Only Full Stripe" full)
2109 (const :tag "Continue on Full Stripe" full-follow))
b6d0ac87 2110 :version "20"
8e234846
GM
2111 :group 'ps-print-zebra)
2112
87a16a06
RS
2113(defcustom ps-line-number nil
2114 "*Non-nil means print line number."
2115 :type 'boolean
b6d0ac87 2116 :version "20"
6e1b1da6 2117 :group 'ps-print-miscellany)
87a16a06 2118
906d41a7
GM
2119(defcustom ps-line-number-step 1
2120 "*Specify the interval that line number is printed.
2121
2122For example, `ps-line-number-step' is set to 2, the printing will look like:
2123
2124 1 one line
2125 one line
2126 3 one line
2127 one line
98f2fbe7 2128 5 one line
906d41a7
GM
2129 one line
2130 ...
2131
2132Valid values are:
2133
2134 integer an integer that specifies the interval that line number is
2135 printed. If it's lesser than or equal to zero, it's used the
2136 value 1.
2137
319acba0
GM
2138 `zebra' specifies that only the line number of the first line in a
2139 zebra stripe is to be printed.
906d41a7
GM
2140
2141Any other value is treated as `zebra'."
8e234846
GM
2142 :type '(choice :menu-tag "Line Number Step"
2143 :tag "Line Number Step"
906d41a7
GM
2144 (integer :tag "Step Interval")
2145 (const :tag "Synchronize Zebra" zebra))
b6d0ac87 2146 :version "20"
906d41a7
GM
2147 :group 'ps-print-miscellany)
2148
98f2fbe7
GM
2149(defcustom ps-line-number-start 1
2150 "*Specify the starting point in the interval given by `ps-line-number-step'.
2151
3556c6dd
GM
2152For example, if `ps-line-number-step' is set to 3 and `ps-line-number-start' is
2153set to 3, the printing will look like:
98f2fbe7
GM
2154
2155 one line
2156 one line
2157 3 one line
2158 one line
2159 one line
2160 6 one line
2161 one line
2162 one line
2163 9 one line
2164 one line
2165 ...
2166
2167The values for `ps-line-number-start':
2168
319acba0
GM
2169 * If `ps-line-number-step' is an integer, must be between 1 and the value of
2170 `ps-line-number-step' inclusive.
98f2fbe7
GM
2171
2172 * If `ps-line-number-step' is set to `zebra', must be between 1 and the
2173 value of `ps-zebra-strip-height' inclusive. Use this combination if you
2174 wish that line number be relative to zebra stripes."
2175 :type '(integer :tag "Start Step Interval")
b6d0ac87 2176 :version "20"
98f2fbe7
GM
2177 :group 'ps-print-miscellany)
2178
87a16a06
RS
2179(defcustom ps-print-background-image nil
2180 "*EPS image list to be printed on background.
2181
2182The elements are:
2183
2184 (FILENAME X Y XSCALE YSCALE ROTATION PAGES...)
2185
2186FILENAME is a file name which contains an EPS image or some PostScript
2187programming like EPS.
2188FILENAME is ignored, if it doesn't exist or is read protected.
2189
2190X and Y are relative positions on paper to put the image.
01cdabc6 2191If X and Y are nil, the image is centered on paper.
87a16a06
RS
2192
2193XSCALE and YSCALE are scale factor to be applied to image before printing.
2194If XSCALE and YSCALE are nil, the original size is used.
2195
2196ROTATION is the image rotation angle; if nil, the default is 0.
2197
2198PAGES designates the page to print background image.
319acba0
GM
2199PAGES may be a number or a cons cell (FROM . TO) designating FROM page to TO
2200page.
87a16a06
RS
2201If PAGES is nil, print background image on all pages.
2202
319acba0 2203X, Y, XSCALE, YSCALE and ROTATION may be a floating point number, an integer
2285bf9d 2204number or a string. If it is a string, the string should contain PostScript
319acba0 2205programming that returns a float or integer value.
87a16a06
RS
2206
2207For example, if you wish to print an EPS image on all pages do:
2208
2209 '((\"~/images/EPS-image.ps\"))"
98f2fbe7
GM
2210 :type '(repeat
2211 (list
2212 (file :tag "EPS File")
2213 (choice :tag "X" (const :tag "default" nil) number string)
2214 (choice :tag "Y" (const :tag "default" nil) number string)
2215 (choice :tag "X Scale" (const :tag "default" nil) number string)
2216 (choice :tag "Y Scale" (const :tag "default" nil) number string)
2217 (choice :tag "Rotation" (const :tag "default" nil) number string)
2218 (repeat :tag "Pages" :inline t
2219 (radio (integer :tag "Page")
2220 (cons :tag "Range"
2221 (integer :tag "From")
2222 (integer :tag "To"))))))
b6d0ac87 2223 :version "20"
bc0d41bd 2224 :group 'ps-print-background)
87a16a06
RS
2225
2226(defcustom ps-print-background-text nil
2227 "*Text list to be printed on background.
2228
2229The elements are:
2230
2231 (STRING X Y FONT FONTSIZE GRAY ROTATION PAGES...)
2232
2233STRING is the text to be printed on background.
2234
2235X and Y are positions on paper to put the text.
2236If X and Y are nil, the text is positioned at lower left corner.
2237
2238FONT is a font name to be used on printing the text.
2239If nil, \"Times-Roman\" is used.
2240
2241FONTSIZE is font size to be used, if nil, 200 is used.
2242
2243GRAY is the text gray factor (should be very light like 0.8).
2244If nil, the default is 0.85.
2245
319acba0
GM
2246ROTATION is the text rotation angle; if nil, the angle is given by the diagonal
2247from lower left corner to upper right corner.
87a16a06
RS
2248
2249PAGES designates the page to print background text.
319acba0
GM
2250PAGES may be a number or a cons cell (FROM . TO) designating FROM page to TO
2251page.
87a16a06
RS
2252If PAGES is nil, print background text on all pages.
2253
319acba0 2254X, Y, FONTSIZE, GRAY and ROTATION may be a floating point number, an integer
2285bf9d 2255number or a string. If it is a string, the string should contain PostScript
319acba0 2256programming that returns a float or integer value.
87a16a06
RS
2257
2258For example, if you wish to print text \"Preliminary\" on all pages do:
2259
2260 '((\"Preliminary\"))"
98f2fbe7
GM
2261 :type '(repeat
2262 (list
2263 (string :tag "Text")
2264 (choice :tag "X" (const :tag "default" nil) number string)
2265 (choice :tag "Y" (const :tag "default" nil) number string)
2266 (choice :tag "Font" (const :tag "default" nil) string)
2267 (choice :tag "Fontsize" (const :tag "default" nil) number string)
2268 (choice :tag "Gray" (const :tag "default" nil) number string)
2269 (choice :tag "Rotation" (const :tag "default" nil) number string)
2270 (repeat :tag "Pages" :inline t
2271 (radio (integer :tag "Page")
2272 (cons :tag "Range"
2273 (integer :tag "From")
2274 (integer :tag "To"))))))
b6d0ac87 2275 :version "20"
bc0d41bd 2276 :group 'ps-print-background)
bcc0d457
RS
2277
2278;;; Horizontal layout
2279
2280;; ------------------------------------------
2281;; | | | | | | | |
2282;; | lm | text | ic | text | ic | text | rm |
2283;; | | | | | | | |
2284;; ------------------------------------------
2285
e0af0d3e
RS
2286(defcustom ps-left-margin (/ (* 72 2.0) 2.54) ; 2 cm
2287 "*Left margin in points (1/72 inch)."
2288 :type 'number
b6d0ac87 2289 :version "20"
e0af0d3e 2290 :group 'ps-print-horizontal)
bcc0d457 2291
e0af0d3e
RS
2292(defcustom ps-right-margin (/ (* 72 2.0) 2.54) ; 2 cm
2293 "*Right margin in points (1/72 inch)."
2294 :type 'number
b6d0ac87 2295 :version "20"
e0af0d3e 2296 :group 'ps-print-horizontal)
bcc0d457 2297
e0af0d3e
RS
2298(defcustom ps-inter-column (/ (* 72 2.0) 2.54) ; 2 cm
2299 "*Horizontal space between columns in points (1/72 inch)."
2300 :type 'number
b6d0ac87 2301 :version "20"
e0af0d3e 2302 :group 'ps-print-horizontal)
bcc0d457
RS
2303
2304;;; Vertical layout
2305
2306;; |--------|
2307;; | tm |
2308;; |--------|
2309;; | header |
2310;; |--------|
2311;; | ho |
2312;; |--------|
2313;; | text |
2314;; |--------|
2315;; | bm |
2316;; |--------|
2317
e0af0d3e
RS
2318(defcustom ps-bottom-margin (/ (* 72 1.5) 2.54) ; 1.5 cm
2319 "*Bottom margin in points (1/72 inch)."
2320 :type 'number
b6d0ac87 2321 :version "20"
e0af0d3e 2322 :group 'ps-print-vertical)
bcc0d457 2323
e0af0d3e
RS
2324(defcustom ps-top-margin (/ (* 72 1.5) 2.54) ; 1.5 cm
2325 "*Top margin in points (1/72 inch)."
2326 :type 'number
b6d0ac87 2327 :version "20"
e0af0d3e 2328 :group 'ps-print-vertical)
bcc0d457 2329
e0af0d3e
RS
2330(defcustom ps-header-offset (/ (* 72 1.0) 2.54) ; 1.0 cm
2331 "*Vertical space in points (1/72 inch) between the main text and the header."
2332 :type 'number
b6d0ac87 2333 :version "20"
e0af0d3e 2334 :group 'ps-print-vertical)
bcc0d457 2335
e0af0d3e 2336(defcustom ps-header-line-pad 0.15
2285bf9d
RS
2337 "*Portion of a header title line height to insert.
2338The insertion is done between the header frame and the text it contains,
2339both in the vertical and horizontal directions."
e0af0d3e 2340 :type 'number
b6d0ac87 2341 :version "20"
e0af0d3e 2342 :group 'ps-print-vertical)
bcc0d457 2343
319acba0
GM
2344(defcustom ps-footer-offset (/ (* 72 1.0) 2.54) ; 1.0 cm
2345 "*Vertical space in points (1/72 inch) between the main text and the footer."
2346 :type 'number
b6d0ac87 2347 :version "20"
319acba0
GM
2348 :group 'ps-print-vertical)
2349
2350(defcustom ps-footer-line-pad 0.15
2285bf9d
RS
2351 "*Portion of a footer title line height to insert.
2352The insertion is done between the footer frame and the text it contains,
2353both in the vertical and horizontal directions."
319acba0 2354 :type 'number
b6d0ac87 2355 :version "20"
319acba0
GM
2356 :group 'ps-print-vertical)
2357
2358;;; Header/Footer setup
12d89a2e 2359
e0af0d3e 2360(defcustom ps-print-header t
86c10ecb 2361 "*Non-nil means print a header at the top of each page.
319acba0
GM
2362By default, the header displays the buffer name, page number, and, if the
2363buffer is visiting a file, the file's directory. Headers are customizable by
2364changing variables `ps-left-header' and `ps-right-header'."
12b88fff 2365 :type 'boolean
b6d0ac87 2366 :version "20"
6e1b1da6 2367 :group 'ps-print-headers)
12b88fff 2368
e0af0d3e
RS
2369(defcustom ps-print-header-frame t
2370 "*Non-nil means draw a gaudy frame around the header."
2371 :type 'boolean
b6d0ac87 2372 :version "20"
6e1b1da6 2373 :group 'ps-print-headers)
e0af0d3e 2374
319acba0 2375(defcustom ps-header-frame-alist
efa89c1f 2376 '((fore-color . 0.0)
319acba0
GM
2377 (back-color . 0.9)
2378 (border-width . 0.4)
efa89c1f
GM
2379 (border-color . 0.0)
2380 (shadow-color . 0.0))
319acba0
GM
2381 "*Specify header frame properties alist.
2382
2383Valid frame properties are:
2384
2385 `fore-color' Specify the foreground frame color.
2386 It should be a float number between 0.0 (black color)
2387 and 1.0 (white color), a string which is a color name,
2388 or a list of 3 float numbers which corresponds to the
2389 Red Green Blue color scale, each float number between
2390 0.0 (dark color) and 1.0 (bright color).
2391
2392 `back-color' Specify the background frame color (similar to
2393 `fore-color').
2394
2395 `shadow-color' Specify the shadow color (similar to `fore-color').
2396
2397 `border-color' Specify the border color (similar to `fore-color').
2398
2399 `border-width' Specify the border width.
2400
2401Any other property is ignored.
2402
2403Don't change this alist directly, instead use customization, or `ps-value',
2404`ps-get', `ps-put' and `ps-del' functions (see them for documentation)."
2405 :version "21.1"
2406 :type '(repeat
2407 (choice :menu-tag "Header Frame Element"
2408 :tag ""
2409 (cons :tag "Foreground Color" :format "%v"
2410 (const :format "" fore-color)
2411 (choice :menu-tag "Foreground Color"
2412 :tag "Foreground Color"
efa89c1f 2413 (number :tag "Gray Scale" :value 0.0)
319acba0 2414 (string :tag "Color Name" :value "black")
efa89c1f 2415 (list :tag "RGB Color" :value (0.0 0.0 0.0)
319acba0
GM
2416 (number :tag "Red")
2417 (number :tag "Green")
2418 (number :tag "Blue"))))
2419 (cons :tag "Background Color" :format "%v"
2420 (const :format "" back-color)
2421 (choice :menu-tag "Background Color"
2422 :tag "Background Color"
2423 (number :tag "Gray Scale" :value 0.9)
2424 (string :tag "Color Name" :value "gray90")
2425 (list :tag "RGB Color" :value (0.9 0.9 0.9)
2426 (number :tag "Red")
2427 (number :tag "Green")
2428 (number :tag "Blue"))))
2429 (cons :tag "Border Width" :format "%v"
2430 (const :format "" border-width)
2431 (number :tag "Border Width" :value 0.4))
2432 (cons :tag "Border Color" :format "%v"
2433 (const :format "" border-color)
2434 (choice :menu-tag "Border Color"
2435 :tag "Border Color"
efa89c1f 2436 (number :tag "Gray Scale" :value 0.0)
319acba0 2437 (string :tag "Color Name" :value "black")
efa89c1f 2438 (list :tag "RGB Color" :value (0.0 0.0 0.0)
319acba0
GM
2439 (number :tag "Red")
2440 (number :tag "Green")
2441 (number :tag "Blue"))))
2442 (cons :tag "Shadow Color" :format "%v"
2443 (const :format "" shadow-color)
2444 (choice :menu-tag "Shadow Color"
2445 :tag "Shadow Color"
efa89c1f 2446 (number :tag "Gray Scale" :value 0.0)
319acba0 2447 (string :tag "Color Name" :value "black")
efa89c1f 2448 (list :tag "RGB Color" :value (0.0 0.0 0.0)
319acba0
GM
2449 (number :tag "Red")
2450 (number :tag "Green")
2451 (number :tag "Blue"))))))
b6d0ac87 2452 :version "20"
319acba0
GM
2453 :group 'ps-print-headers)
2454
e0af0d3e 2455(defcustom ps-header-lines 2
8bd22fcf 2456 "*Number of lines to display in page header, when generating PostScript."
e0af0d3e 2457 :type 'integer
b6d0ac87 2458 :version "20"
6e1b1da6 2459 :group 'ps-print-headers)
bcc0d457 2460
319acba0
GM
2461(defcustom ps-print-footer nil
2462 "*Non-nil means print a footer at the bottom of each page.
2463By default, the footer displays page number.
2464Footers are customizable by changing variables `ps-left-footer' and
2465`ps-right-footer'."
319acba0 2466 :type 'boolean
b6d0ac87 2467 :version "21.1"
319acba0
GM
2468 :group 'ps-print-headers)
2469
2470(defcustom ps-print-footer-frame t
2471 "*Non-nil means draw a gaudy frame around the footer."
319acba0 2472 :type 'boolean
b6d0ac87 2473 :version "21.1"
319acba0
GM
2474 :group 'ps-print-headers)
2475
2476(defcustom ps-footer-frame-alist
efa89c1f 2477 '((fore-color . 0.0)
319acba0
GM
2478 (back-color . 0.9)
2479 (border-width . 0.4)
efa89c1f
GM
2480 (border-color . 0.0)
2481 (shadow-color . 0.0))
319acba0
GM
2482 "*Specify footer frame properties alist.
2483
2484Don't change this alist directly, instead use customization, or `ps-value',
2485`ps-get', `ps-put' and `ps-del' functions (see them for documentation).
2486
2487See also `ps-header-frame-alist' for documentation."
319acba0
GM
2488 :type '(repeat
2489 (choice :menu-tag "Header Frame Element"
2490 :tag ""
2491 (cons :tag "Foreground Color" :format "%v"
2492 (const :format "" fore-color)
2493 (choice :menu-tag "Foreground Color"
2494 :tag "Foreground Color"
efa89c1f 2495 (number :tag "Gray Scale" :value 0.0)
319acba0 2496 (string :tag "Color Name" :value "black")
efa89c1f 2497 (list :tag "RGB Color" :value (0.0 0.0 0.0)
319acba0
GM
2498 (number :tag "Red")
2499 (number :tag "Green")
2500 (number :tag "Blue"))))
2501 (cons :tag "Background Color" :format "%v"
2502 (const :format "" back-color)
2503 (choice :menu-tag "Background Color"
2504 :tag "Background Color"
2505 (number :tag "Gray Scale" :value 0.9)
2506 (string :tag "Color Name" :value "gray90")
2507 (list :tag "RGB Color" :value (0.9 0.9 0.9)
2508 (number :tag "Red")
2509 (number :tag "Green")
2510 (number :tag "Blue"))))
2511 (cons :tag "Border Width" :format "%v"
2512 (const :format "" border-width)
2513 (number :tag "Border Width" :value 0.4))
2514 (cons :tag "Border Color" :format "%v"
2515 (const :format "" border-color)
2516 (choice :menu-tag "Border Color"
2517 :tag "Border Color"
efa89c1f 2518 (number :tag "Gray Scale" :value 0.0)
319acba0 2519 (string :tag "Color Name" :value "black")
efa89c1f 2520 (list :tag "RGB Color" :value (0.0 0.0 0.0)
319acba0
GM
2521 (number :tag "Red")
2522 (number :tag "Green")
2523 (number :tag "Blue"))))
2524 (cons :tag "Shadow Color" :format "%v"
2525 (const :format "" shadow-color)
2526 (choice :menu-tag "Shadow Color"
2527 :tag "Shadow Color"
efa89c1f 2528 (number :tag "Gray Scale" :value 0.0)
319acba0 2529 (string :tag "Color Name" :value "black")
efa89c1f 2530 (list :tag "RGB Color" :value (0.0 0.0 0.0)
319acba0
GM
2531 (number :tag "Red")
2532 (number :tag "Green")
2533 (number :tag "Blue"))))))
b6d0ac87 2534 :version "21.1"
319acba0
GM
2535 :group 'ps-print-headers)
2536
2537(defcustom ps-footer-lines 2
2538 "*Number of lines to display in page footer, when generating PostScript."
319acba0 2539 :type 'integer
b6d0ac87 2540 :version "21.1"
319acba0
GM
2541 :group 'ps-print-headers)
2542
2543(defcustom ps-print-only-one-header nil
2544 "*Non-nil means print only one header/footer at the top/bottom of each page.
2545This is useful when printing more than one column, so it is possible to have
2546only one header/footer over all columns or one header/footer per column.
2547See also `ps-print-header' and `ps-print-footer'."
2548 :type 'boolean
b6d0ac87 2549 :version "20"
319acba0
GM
2550 :group 'ps-print-headers)
2551
8e234846 2552(defcustom ps-switch-header 'duplex
319acba0 2553 "*Specify if headers/footers are switched or not.
8e234846
GM
2554
2555Valid values are:
2556
319acba0 2557nil Never switch headers/footers.
8e234846 2558
319acba0 2559t Always switch headers/footers.
8e234846 2560
319acba0 2561duplex Switch headers/footers only when duplexing is on, that is, when
8e234846
GM
2562 `ps-spool-duplex' is non-nil.
2563
319acba0
GM
2564Any other value is treated as t.
2565
2566See also `ps-print-header' and `ps-print-footer'."
2567 :type '(choice :menu-tag "Switch Header/Footer"
2568 :tag "Switch Header/Footer"
8e234846
GM
2569 (const :tag "Never Switch" nil)
2570 (const :tag "Always Switch" t)
2571 (const :tag "Switch When Duplexing" duplex))
b6d0ac87 2572 :version "20"
8e234846
GM
2573 :group 'ps-print-headers)
2574
e0af0d3e 2575(defcustom ps-show-n-of-n t
00aa16af 2576 "*Non-nil means show page numbers as N/M, meaning page N of M.
8bd22fcf 2577NOTE: page numbers are displayed as part of headers,
6e1b1da6 2578 see variable `ps-print-header'."
e0af0d3e 2579 :type 'boolean
b6d0ac87 2580 :version "20"
6e1b1da6 2581 :group 'ps-print-headers)
12d89a2e 2582
edc9cd35 2583(defcustom ps-spool-config
906d41a7 2584 (if ps-windows-system
edc9cd35
GM
2585 nil
2586 'lpr-switches)
319acba0 2587 "*Specify who is responsible for setting duplex and page size.
bc0d41bd
KH
2588
2589Valid values are:
2590
2591 `lpr-switches' duplex and page size are configured by `ps-lpr-switches'.
2592 Don't forget to set `ps-lpr-switches' to select duplex
2593 printing for your printer.
2594
2595 `setpagedevice' duplex and page size are configured by ps-print using the
2596 setpagedevice PostScript operator.
2597
2598 nil duplex and page size are configured by ps-print *not* using
2599 the setpagedevice PostScript operator.
2600
2601Any other value is treated as nil.
2602
2603WARNING: The setpagedevice PostScript operator affects ghostview utility when
2604 viewing file generated using landscape. Also on some printers,
2605 setpagedevice affects zebra stripes; on other printers, setpagedevice
2606 affects the left margin.
2607 Besides all that, if your printer does not have the paper size
2608 specified by setpagedevice, your printing will be aborted.
2609 So, if you need to use setpagedevice, set `ps-spool-config' to
2610 `setpagedevice', generate a test file and send it to your printer; if
2285bf9d 2611 the printed file isn't OK, set `ps-spool-config' to nil."
8e234846
GM
2612 :type '(choice :menu-tag "Spool Config"
2613 :tag "Spool Config"
bc0d41bd 2614 (const lpr-switches) (const setpagedevice)
edc9cd35 2615 (const :tag "nil" nil))
b6d0ac87 2616 :version "20"
6e1b1da6 2617 :group 'ps-print-headers)
bc0d41bd
KH
2618
2619(defcustom ps-spool-duplex nil ; Not many people have duplex printers,
2620 ; so default to nil.
2621 "*Non-nil generates PostScript for a two-sided printer.
2622For a duplex printer, the `ps-spool-*' and `ps-print-*' commands will insert
2623blank pages as needed between print jobs so that the next buffer printed will
2624start on the right page. Also, if headers are turned on, the headers will be
2625reversed on duplex printers so that the page numbers fall to the left on
0a5daee5
KH
2626even-numbered pages.
2627
2628See also `ps-spool-tumble'."
bc0d41bd 2629 :type 'boolean
b6d0ac87 2630 :version "20"
6e1b1da6 2631 :group 'ps-print-headers)
bc0d41bd
KH
2632
2633(defcustom ps-spool-tumble nil
2634 "*Specify how the page images on opposite sides of a sheet are oriented.
319acba0
GM
2635If `ps-spool-tumble' is nil, produces output suitable for binding on the left
2636or right. If `ps-spool-tumble' is non-nil, produces output suitable for
2637binding at the top or bottom.
bc0d41bd
KH
2638
2639It has effect only when `ps-spool-duplex' is non-nil."
e0af0d3e 2640 :type 'boolean
b6d0ac87 2641 :version "20"
6e1b1da6 2642 :group 'ps-print-headers)
bcc0d457
RS
2643
2644;;; Fonts
2645
e0af0d3e 2646(defcustom ps-font-info-database
bcc0d457 2647 '((Courier ; the family key
12b88fff
RS
2648 (fonts (normal . "Courier")
2649 (bold . "Courier-Bold")
2650 (italic . "Courier-Oblique")
2651 (bold-italic . "Courier-BoldOblique"))
2652 (size . 10.0)
2653 (line-height . 10.55)
2654 (space-width . 6.0)
2655 (avg-char-width . 6.0))
bcc0d457 2656 (Helvetica ; the family key
12b88fff
RS
2657 (fonts (normal . "Helvetica")
2658 (bold . "Helvetica-Bold")
2659 (italic . "Helvetica-Oblique")
2660 (bold-italic . "Helvetica-BoldOblique"))
2661 (size . 10.0)
2662 (line-height . 11.56)
2663 (space-width . 2.78)
2664 (avg-char-width . 5.09243))
bcc0d457 2665 (Times
12b88fff
RS
2666 (fonts (normal . "Times-Roman")
2667 (bold . "Times-Bold")
2668 (italic . "Times-Italic")
2669 (bold-italic . "Times-BoldItalic"))
2670 (size . 10.0)
2671 (line-height . 11.0)
2672 (space-width . 2.5)
334cc3b7 2673 (avg-char-width . 4.71432))
bcc0d457 2674 (Palatino
12b88fff
RS
2675 (fonts (normal . "Palatino-Roman")
2676 (bold . "Palatino-Bold")
2677 (italic . "Palatino-Italic")
2678 (bold-italic . "Palatino-BoldItalic"))
2679 (size . 10.0)
2680 (line-height . 12.1)
2681 (space-width . 2.5)
2682 (avg-char-width . 5.08676))
bcc0d457 2683 (Helvetica-Narrow
12b88fff
RS
2684 (fonts (normal . "Helvetica-Narrow")
2685 (bold . "Helvetica-Narrow-Bold")
2686 (italic . "Helvetica-Narrow-Oblique")
2687 (bold-italic . "Helvetica-Narrow-BoldOblique"))
2688 (size . 10.0)
2689 (line-height . 11.56)
2690 (space-width . 2.2796)
2691 (avg-char-width . 4.17579))
bcc0d457 2692 (NewCenturySchlbk
12b88fff
RS
2693 (fonts (normal . "NewCenturySchlbk-Roman")
2694 (bold . "NewCenturySchlbk-Bold")
2695 (italic . "NewCenturySchlbk-Italic")
2696 (bold-italic . "NewCenturySchlbk-BoldItalic"))
2697 (size . 10.0)
334cc3b7 2698 (line-height . 12.15)
12b88fff
RS
2699 (space-width . 2.78)
2700 (avg-char-width . 5.31162))
bcc0d457
RS
2701 ;; got no bold for the next ones
2702 (AvantGarde-Book
12b88fff
RS
2703 (fonts (normal . "AvantGarde-Book")
2704 (italic . "AvantGarde-BookOblique"))
2705 (size . 10.0)
2706 (line-height . 11.77)
2707 (space-width . 2.77)
2708 (avg-char-width . 5.45189))
bcc0d457 2709 (AvantGarde-Demi
12b88fff
RS
2710 (fonts (normal . "AvantGarde-Demi")
2711 (italic . "AvantGarde-DemiOblique"))
2712 (size . 10.0)
2713 (line-height . 12.72)
2714 (space-width . 2.8)
2715 (avg-char-width . 5.51351))
bcc0d457 2716 (Bookman-Demi
12b88fff
RS
2717 (fonts (normal . "Bookman-Demi")
2718 (italic . "Bookman-DemiItalic"))
2719 (size . 10.0)
2720 (line-height . 11.77)
2721 (space-width . 3.4)
2722 (avg-char-width . 6.05946))
bcc0d457 2723 (Bookman-Light
12b88fff
RS
2724 (fonts (normal . "Bookman-Light")
2725 (italic . "Bookman-LightItalic"))
2726 (size . 10.0)
2727 (line-height . 11.79)
2728 (space-width . 3.2)
2729 (avg-char-width . 5.67027))
bcc0d457
RS
2730 ;; got no bold and no italic for the next ones
2731 (Symbol
12b88fff
RS
2732 (fonts (normal . "Symbol"))
2733 (size . 10.0)
2734 (line-height . 13.03)
2735 (space-width . 2.5)
2736 (avg-char-width . 3.24324))
bcc0d457 2737 (Zapf-Dingbats
12b88fff
RS
2738 (fonts (normal . "Zapf-Dingbats"))
2739 (size . 10.0)
2740 (line-height . 9.63)
2741 (space-width . 2.78)
2742 (avg-char-width . 2.78))
92dc83a9
KH
2743 (ZapfChancery-MediumItalic
2744 (fonts (normal . "ZapfChancery-MediumItalic"))
2745 (size . 10.0)
2746 (line-height . 11.45)
2747 (space-width . 2.2)
2748 (avg-char-width . 4.10811))
2749 ;; We keep this wrong entry name (but with correct font name) for
2750 ;; backward compatibility.
bcc0d457 2751 (Zapf-Chancery-MediumItalic
92dc83a9 2752 (fonts (normal . "ZapfChancery-MediumItalic"))
12b88fff
RS
2753 (size . 10.0)
2754 (line-height . 11.45)
2755 (space-width . 2.2)
2756 (avg-char-width . 4.10811))
87a16a06 2757 )
2285bf9d
RS
2758 "*Font info database.
2759Each element comprises: font family (the key), name, bold, italic, bold-italic,
bcc0d457
RS
2760reference size, line height, space width, average character width.
2761To get the info for another specific font (say Helvetica), do the following:
2762- create a new buffer
2763- generate the PostScript image to a file (C-u M-x ps-print-buffer)
319acba0
GM
2764- open this file and delete the leading `%' (which is the PostScript comment
2765 character) from the line
1fd9b7fe 2766 `% 3 cm 20 cm moveto 10/Courier ReportFontInfo showpage'
bcc0d457 2767 to get the line
1fd9b7fe 2768 `3 cm 20 cm moveto 10/Helvetica ReportFontInfo showpage'
bcc0d457 2769- add the values to `ps-font-info-database'.
c3d6d211
GM
2770You can get all the fonts of YOUR printer using `ReportAllFontInfo'.
2771
319acba0
GM
2772Note also that ps-print DOESN'T download any font to your printer, instead it
2773uses the fonts resident in your printer."
ef1159c2
EZ
2774 :type '(repeat
2775 (list :tag "Font Definition"
2776 (symbol :tag "Font Family")
2777 (cons :format "%v"
2778 (const :format "" fonts)
2779 (repeat :tag "Faces"
2780 (cons (choice :menu-tag "Font Weight/Slant"
2781 :tag "Font Weight/Slant"
2782 (const normal)
2783 (const bold)
2784 (const italic)
2785 (const bold-italic)
2786 (symbol :tag "Face"))
2787 (string :tag "Font Name"))))
2788 (cons :format "%v"
2789 (const :format "" size)
2790 (number :tag "Reference Size"))
2791 (cons :format "%v"
2792 (const :format "" line-height)
2793 (number :tag "Line Height"))
2794 (cons :format "%v"
2795 (const :format "" space-width)
2796 (number :tag "Space Width"))
2797 (cons :format "%v"
2798 (const :format "" avg-char-width)
2799 (number :tag "Average Character Width"))))
b6d0ac87 2800 :version "20"
e0af0d3e
RS
2801 :group 'ps-print-font)
2802
2803(defcustom ps-font-family 'Courier
d3ab8dac 2804 "*Font family name for ordinary text, when generating PostScript."
e0af0d3e 2805 :type 'symbol
b6d0ac87 2806 :version "20"
e0af0d3e
RS
2807 :group 'ps-print-font)
2808
7d8b7e8e 2809(defcustom ps-font-size '(7 . 8.5)
d3ab8dac 2810 "*Font size, in points, for ordinary text, when generating PostScript."
ef1159c2
EZ
2811 :type '(choice :menu-tag "Ordinary Text Font Size"
2812 :tag "Ordinary Text Font Size"
2813 (number :tag "Text Size")
7d8b7e8e
KH
2814 (cons :tag "Landscape/Portrait"
2815 (number :tag "Landscape Text Size")
2816 (number :tag "Portrait Text Size")))
b6d0ac87 2817 :version "20"
e0af0d3e
RS
2818 :group 'ps-print-font)
2819
2820(defcustom ps-header-font-family 'Helvetica
d3ab8dac 2821 "*Font family name for text in the header, when generating PostScript."
e0af0d3e 2822 :type 'symbol
b6d0ac87 2823 :version "20"
e0af0d3e
RS
2824 :group 'ps-print-font)
2825
7d8b7e8e 2826(defcustom ps-header-font-size '(10 . 12)
d3ab8dac 2827 "*Font size, in points, for text in the header, when generating PostScript."
ef1159c2
EZ
2828 :type '(choice :menu-tag "Header Font Size"
2829 :tag "Header Font Size"
2830 (number :tag "Header Size")
7d8b7e8e
KH
2831 (cons :tag "Landscape/Portrait"
2832 (number :tag "Landscape Header Size")
2833 (number :tag "Portrait Header Size")))
b6d0ac87 2834 :version "20"
e0af0d3e
RS
2835 :group 'ps-print-font)
2836
7d8b7e8e 2837(defcustom ps-header-title-font-size '(12 . 14)
d3ab8dac 2838 "*Font size, in points, for the top line of text in header, in PostScript."
ef1159c2
EZ
2839 :type '(choice :menu-tag "Header Title Font Size"
2840 :tag "Header Title Font Size"
2841 (number :tag "Header Title Size")
7d8b7e8e
KH
2842 (cons :tag "Landscape/Portrait"
2843 (number :tag "Landscape Header Title Size")
2844 (number :tag "Portrait Header Title Size")))
b6d0ac87 2845 :version "20"
e0af0d3e 2846 :group 'ps-print-font)
bcc0d457 2847
319acba0
GM
2848(defcustom ps-footer-font-family 'Helvetica
2849 "*Font family name for text in the footer, when generating PostScript."
319acba0 2850 :type 'symbol
b6d0ac87 2851 :version "21.1"
319acba0
GM
2852 :group 'ps-print-font)
2853
2854(defcustom ps-footer-font-size '(10 . 12)
2855 "*Font size, in points, for text in the footer, when generating PostScript."
319acba0
GM
2856 :type '(choice :menu-tag "Footer Font Size"
2857 :tag "Footer Font Size"
2858 (number :tag "Footer Size")
2859 (cons :tag "Landscape/Portrait"
2860 (number :tag "Landscape Footer Size")
2861 (number :tag "Portrait Footer Size")))
b6d0ac87 2862 :version "21.1"
319acba0
GM
2863 :group 'ps-print-font)
2864
2865(defcustom ps-line-number-color "black"
2866 "*Specify color for line-number, when generating PostScript."
2867 :type '(choice :menu-tag "Line Number Color"
2868 :tag "Line Number Color"
2869 (number :tag "Gray Scale" :value 0)
2870 (string :tag "Color Name" :value "black")
2871 (list :tag "RGB Color" :value (0 0 0)
2872 (number :tag "Red")
2873 (number :tag "Green")
2874 (number :tag "Blue")))
2875 :version "21.1"
2876 :group 'ps-print-font
2877 :group 'ps-print-miscellany)
2878
ef1159c2
EZ
2879(defcustom ps-line-number-font "Times-Italic"
2880 "*Font for line-number, when generating PostScript."
2881 :type 'string
b6d0ac87 2882 :version "20"
ef1159c2
EZ
2883 :group 'ps-print-font
2884 :group 'ps-print-miscellany)
2885
2886(defcustom ps-line-number-font-size 6
2887 "*Font size, in points, for line number, when generating PostScript."
2888 :type '(choice :menu-tag "Line Number Font Size"
2889 :tag "Line Number Font Size"
2890 (number :tag "Font Size")
2891 (cons :tag "Landscape/Portrait"
2892 (number :tag "Landscape Font Size")
2893 (number :tag "Portrait Font Size")))
b6d0ac87 2894 :version "20"
ef1159c2
EZ
2895 :group 'ps-print-font
2896 :group 'ps-print-miscellany)
2897
bcc0d457
RS
2898;;; Colors
2899
87a16a06 2900;; Printing color requires x-color-values.
c90a10fa
RS
2901;; XEmacs change: Need autoload for the "Options->Printing->Color Printing"
2902;; widget to work.
2903;;;###autoload
ea0c615d 2904(defcustom ps-print-color-p
509b4dbc 2905 (or (fboundp 'x-color-values) ; Emacs
ea0c615d 2906 (fboundp 'color-instance-rgb-components))
857686a6 2907 ; XEmacs
55732434
GM
2908 "*Specify how buffer's text color is printed.
2909
2910Valid values are:
2911
2912 nil Do not print colors.
2913
2914 t Print colors.
2915
2916 black-white Print colors on black/white printer.
2917 See also `ps-black-white-faces'.
2918
2919Any other value is treated as t."
2920 :type '(choice :menu-tag "Print Color"
2921 :tag "Print Color"
2922 (const :tag "Do NOT Print Color" nil)
2923 (const :tag "Print Always Color" t)
2924 (const :tag "Print Black/White Color" black-white))
b6d0ac87 2925 :version "20"
e0af0d3e 2926 :group 'ps-print-color)
12d89a2e 2927
830f437e
VJL
2928(defcustom ps-default-fg 'frame-parameter
2929 "*RGB values of the default foreground color.
e59d29d6
VJL
2930
2931The `ps-default-fg' variable contains the default foreground color used by
2932ps-print, that is, if there is a face in a text that doesn't have a foreground
2933color, the `ps-default-fg' color should be used.
2934
2935Valid values are:
2936
2937 t The foreground color of Emacs session will be used.
2938
830f437e
VJL
2939 frame-parameter The foreground-color frame parameter will be used.
2940
e59d29d6
VJL
2941 NUMBER It's a real value between 0.0 (black) and 1.0 (white) that
2942 indicate the gray color.
2943
640477ee 2944 COLOR-NAME It's a string which contains the color name. For example:
e59d29d6
VJL
2945 \"yellow\".
2946
2947 LIST It's a list of RGB values, that is a list of three real values
2948 of the form:
2949
2950 (RED, GREEN, BLUE)
2951
2952 Where RED, GREEN and BLUE are reals between 0.0 (no color) and
2953 1.0 (full color).
2954
830f437e 2955Any other value is ignored and black color will be used.
e59d29d6
VJL
2956
2957It's used only when `ps-print-color-p' is non-nil."
8e234846
GM
2958 :type '(choice :menu-tag "Default Foreground Gray/Color"
2959 :tag "Default Foreground Gray/Color"
c794a94d 2960 (const :tag "Session Foreground" t)
830f437e 2961 (const :tag "Frame Foreground" frame-parameter)
6e1b1da6
GM
2962 (number :tag "Gray Scale" :value 0.0)
2963 (string :tag "Color Name" :value "black")
2964 (list :tag "RGB Color" :value (0.0 0.0 0.0)
2965 (number :tag "Red")
2966 (number :tag "Green")
2967 (number :tag "Blue")))
b6d0ac87 2968 :version "20"
e0af0d3e 2969 :group 'ps-print-color)
12d89a2e 2970
830f437e
VJL
2971(defcustom ps-default-bg 'frame-parameter
2972 "*RGB values of the default background color.
e59d29d6
VJL
2973
2974The `ps-default-bg' variable contains the default background color used by
2975ps-print, that is, if there is a face in a text that doesn't have a background
2976color, the `ps-default-bg' color should be used.
2977
2978Valid values are:
2979
2980 t The background color of Emacs session will be used.
2981
830f437e
VJL
2982 frame-parameter The background-color frame parameter will be used.
2983
e59d29d6
VJL
2984 NUMBER It's a real value between 0.0 (black) and 1.0 (white) that
2985 indicate the gray color.
2986
640477ee 2987 COLOR-NAME It's a string which contains the color name. For example:
e59d29d6
VJL
2988 \"yellow\".
2989
2990 LIST It's a list of RGB values, that is a list of three real values
2991 of the form:
2992
2993 (RED, GREEN, BLUE)
2994
2995 Where RED, GREEN and BLUE are reals between 0.0 (no color) and
2996 1.0 (full color).
2997
830f437e 2998Any other value is ignored and white color will be used.
e59d29d6
VJL
2999
3000It's used only when `ps-print-color-p' is non-nil.
3001
3002See also `ps-use-face-background'."
8e234846
GM
3003 :type '(choice :menu-tag "Default Background Gray/Color"
3004 :tag "Default Background Gray/Color"
c794a94d 3005 (const :tag "Session Background" t)
830f437e 3006 (const :tag "Frame Background" frame-parameter)
6e1b1da6
GM
3007 (number :tag "Gray Scale" :value 1.0)
3008 (string :tag "Color Name" :value "white")
3009 (list :tag "RGB Color" :value (1.0 1.0 1.0)
3010 (number :tag "Red")
3011 (number :tag "Green")
3012 (number :tag "Blue")))
b6d0ac87 3013 :version "20"
e0af0d3e 3014 :group 'ps-print-color)
12d89a2e 3015
e0af0d3e 3016(defcustom ps-auto-font-detect t
df5e6194 3017 "*Non-nil means automatically detect bold/italic/underline face attributes.
319acba0
GM
3018If nil, we rely solely on the lists `ps-bold-faces', `ps-italic-faces', and
3019`ps-underlined-faces'."
e0af0d3e 3020 :type 'boolean
b6d0ac87 3021 :version "20"
e0af0d3e 3022 :group 'ps-print-font)
12d89a2e 3023
55732434
GM
3024(defcustom ps-black-white-faces
3025 '((font-lock-builtin-face "black" nil bold )
3026 (font-lock-comment-face "gray20" nil italic)
3027 (font-lock-constant-face "black" nil bold )
3028 (font-lock-function-name-face "black" nil bold )
3029 (font-lock-keyword-face "black" nil bold )
3030 (font-lock-string-face "black" nil italic)
3031 (font-lock-type-face "black" nil italic)
3032 (font-lock-variable-name-face "black" nil bold italic)
3033 (font-lock-warning-face "black" nil bold italic))
3034 "*Specify list of face attributes to print colors on black/white printers.
3035
3036The list elements are the same as defined on `ps-extend-face' (which see).
3037
3038This variable is used only when `ps-print-color-p' is set to `black-white'."
3039 :version "21.1"
3040 :type '(repeat
3041 (list :tag "Face Specification"
3042 (face :tag "Face Symbol")
3043 (choice :menu-tag "Foreground Color"
3044 :tag "Foreground Color"
3045 (const :tag "Black" nil)
3046 (string :tag "Color Name"))
3047 (choice :menu-tag "Background Color"
3048 :tag "Background Color"
3049 (const :tag "None" nil)
3050 (string :tag "Color Name"))
3051 (repeat :inline t
3052 (choice :menu-tag "Attribute"
3053 (const bold)
3054 (const italic)
3055 (const underline)
3056 (const strikeout)
3057 (const overline)
3058 (const shadow)
3059 (const box)
3060 (const outline)))))
b6d0ac87 3061 :version "20"
55732434
GM
3062 :group 'ps-print-face)
3063
e0af0d3e 3064(defcustom ps-bold-faces
090be653
RS
3065 (unless ps-print-color-p
3066 '(font-lock-function-name-face
3067 font-lock-builtin-face
3068 font-lock-variable-name-face
3069 font-lock-keyword-face
3070 font-lock-warning-face))
86c10ecb 3071 "*A list of the \(non-bold\) faces that should be printed in bold font.
8bd22fcf 3072This applies to generating PostScript."
e0af0d3e 3073 :type '(repeat face)
b6d0ac87 3074 :version "20"
e0af0d3e 3075 :group 'ps-print-face)
12d89a2e 3076
e0af0d3e 3077(defcustom ps-italic-faces
090be653
RS
3078 (unless ps-print-color-p
3079 '(font-lock-variable-name-face
8bd22fcf 3080 font-lock-type-face
090be653
RS
3081 font-lock-string-face
3082 font-lock-comment-face
3083 font-lock-warning-face))
86c10ecb 3084 "*A list of the \(non-italic\) faces that should be printed in italic font.
8bd22fcf 3085This applies to generating PostScript."
e0af0d3e 3086 :type '(repeat face)
b6d0ac87 3087 :version "20"
e0af0d3e 3088 :group 'ps-print-face)
12d89a2e 3089
e0af0d3e 3090(defcustom ps-underlined-faces
090be653
RS
3091 (unless ps-print-color-p
3092 '(font-lock-function-name-face
883212ce 3093 font-lock-constant-face
090be653 3094 font-lock-warning-face))
86c10ecb 3095 "*A list of the \(non-underlined\) faces that should be printed underlined.
8bd22fcf 3096This applies to generating PostScript."
e0af0d3e 3097 :type '(repeat face)
b6d0ac87 3098 :version "20"
e0af0d3e 3099 :group 'ps-print-face)
12d89a2e 3100
906d41a7
GM
3101(defcustom ps-use-face-background nil
3102 "*Specify if face background should be used.
3103
3104Valid values are:
3105
3106 t always use face background color.
3107 nil never use face background color.
3108 (face...) list of faces whose background color will be used.
3109
3110Any other value will be treated as t."
8e234846
GM
3111 :type '(choice :menu-tag "Use Face Background"
3112 :tag "Use Face Background"
906d41a7
GM
3113 (const :tag "Always Use Face Background" t)
3114 (const :tag "Never Use Face Background" nil)
3115 (repeat :menu-tag "Face Background List"
3116 :tag "Face Background List"
3117 face))
b6d0ac87 3118 :version "20"
906d41a7
GM
3119 :group 'ps-print-face)
3120
e0af0d3e 3121(defcustom ps-left-header
12d89a2e 3122 (list 'ps-get-buffer-name 'ps-header-dirpart)
bcc0d457 3123 "*The items to display (each on a line) on the left part of the page header.
8bd22fcf 3124This applies to generating PostScript.
12d89a2e 3125
319acba0
GM
3126The value should be a list of strings and symbols, each representing an entry
3127in the PostScript array HeaderLinesLeft.
12d89a2e
RS
3128
3129Strings are inserted unchanged into the array; those representing
3130PostScript string literals should be delimited with PostScript string
3131delimiters '(' and ')'.
3132
319acba0
GM
3133For symbols with bound functions, the function is called and should return a
3134string to be inserted into the array. For symbols with bound values, the value
3135should be a string to be inserted into the array. In either case, function or
6b61353c
KH
3136variable, the string value has PostScript string delimiters added to it.
3137
3138If symbols are unbounded, they are silently ignored."
ef1159c2
EZ
3139 :type '(repeat (choice :menu-tag "Left Header"
3140 :tag "Left Header"
3141 string symbol))
b6d0ac87 3142 :version "20"
6e1b1da6 3143 :group 'ps-print-headers)
12d89a2e 3144
e0af0d3e 3145(defcustom ps-right-header
2bd80d73 3146 (list "/pagenumberstring load"
4b81a999 3147 'ps-time-stamp-locale-default 'ps-time-stamp-hh:mm:ss)
bcc0d457 3148 "*The items to display (each on a line) on the right part of the page header.
8bd22fcf 3149This applies to generating PostScript.
12d89a2e 3150
319acba0 3151See the variable `ps-left-header' for a description of the format of this
4b81a999
GM
3152variable.
3153
3154There are the following basic functions implemented:
3155
3156 `ps-time-stamp-locale-default' Return the locale's \"preferred\" date
3157 as, for example, \"06/18/01\".
3158
3159 `ps-time-stamp-hh:mm:ss' Return time as \"17:28:31\".
3160
3161 `ps-time-stamp-mon-dd-yyyy' Return date as \"Jun 18 2001\".
3162
6b61353c
KH
3163 `ps-time-stamp-yyyy-mm-dd' Return date as \"2001-06-18\" (ISO
3164 date).
3165
3166 `ps-time-stamp-iso8601' Alias for `ps-time-stamp-yyyy-mm-dd'.
3167
4b81a999 3168You can also create your own time stamp function by using `format-time-string'
2285bf9d 3169\(which see)."
ef1159c2
EZ
3170 :type '(repeat (choice :menu-tag "Right Header"
3171 :tag "Right Header"
3172 string symbol))
b6d0ac87 3173 :version "20"
6e1b1da6 3174 :group 'ps-print-headers)
ef2cbb24 3175
319acba0
GM
3176(defcustom ps-left-footer
3177 (list 'ps-get-buffer-name 'ps-header-dirpart)
3178 "*The items to display (each on a line) on the left part of the page footer.
3179This applies to generating PostScript.
3180
3181The value should be a list of strings and symbols, each representing an entry
3182in the PostScript array FooterLinesLeft.
3183
3184Strings are inserted unchanged into the array; those representing PostScript
3185string literals should be delimited with PostScript string delimiters '(' and
3186')'.
3187
3188For symbols with bound functions, the function is called and should return a
3189string to be inserted into the array. For symbols with bound values, the value
3190should be a string to be inserted into the array. In either case, function or
6b61353c
KH
3191variable, the string value has PostScript string delimiters added to it.
3192
3193If symbols are unbounded, they are silently ignored."
319acba0
GM
3194 :type '(repeat (choice :menu-tag "Left Footer"
3195 :tag "Left Footer"
3196 string symbol))
b6d0ac87 3197 :version "21.1"
319acba0
GM
3198 :group 'ps-print-headers)
3199
3200(defcustom ps-right-footer
3201 (list "/pagenumberstring load"
4b81a999 3202 'ps-time-stamp-locale-default 'ps-time-stamp-hh:mm:ss)
319acba0
GM
3203 "*The items to display (each on a line) on the right part of the page footer.
3204This applies to generating PostScript.
3205
3206See the variable `ps-left-footer' for a description of the format of this
4b81a999
GM
3207variable.
3208
3209There are the following basic functions implemented:
3210
3211 `ps-time-stamp-locale-default' Return the locale's \"preferred\" date
3212 as, for example, \"06/18/01\".
3213
3214 `ps-time-stamp-hh:mm:ss' Return time as \"17:28:31\".
3215
3216 `ps-time-stamp-mon-dd-yyyy' Return date as \"Jun 18 2001\".
3217
6b61353c
KH
3218 `ps-time-stamp-yyyy-mm-dd' Return date as \"2001-06-18\" (ISO
3219 date).
3220
3221 `ps-time-stamp-iso8601' Alias for `ps-time-stamp-yyyy-mm-dd'.
3222
4b81a999 3223You can also create your own time stamp function by using `format-time-string'
2285bf9d 3224\(which see)."
319acba0
GM
3225 :type '(repeat (choice :menu-tag "Right Footer"
3226 :tag "Right Footer"
3227 string symbol))
b6d0ac87 3228 :version "21.1"
319acba0
GM
3229 :group 'ps-print-headers)
3230
e0af0d3e
RS
3231(defcustom ps-razzle-dazzle t
3232 "*Non-nil means report progress while formatting buffer."
3233 :type 'boolean
b6d0ac87 3234 :version "20"
6e1b1da6 3235 :group 'ps-print-miscellany)
12d89a2e 3236
a18ed129 3237(defcustom ps-adobe-tag "%!PS-Adobe-3.0\n"
12d89a2e 3238 "*Contains the header line identifying the output as PostScript.
319acba0
GM
3239By default, `ps-adobe-tag' contains the standard identifier. Some printers
3240require slightly different versions of this line."
a18ed129 3241 :type 'string
b6d0ac87 3242 :version "20"
6e1b1da6 3243 :group 'ps-print-miscellany)
12d89a2e 3244
e0af0d3e 3245(defcustom ps-build-face-reference t
12d89a2e
RS
3246 "*Non-nil means build the reference face lists.
3247
319acba0 3248ps-print sets this value to nil after it builds its internal reference lists of
1b1200a1 3249bold and italic faces. By setting its value back to t, you can force ps-print
319acba0
GM
3250to rebuild the lists the next time you invoke one of the ...-with-faces
3251commands.
12d89a2e 3252
319acba0
GM
3253You should set this value back to t after you change the attributes of any
3254face, or create new faces. Most users shouldn't have to worry about its
3255setting, though."
e0af0d3e 3256 :type 'boolean
b6d0ac87 3257 :version "20"
e0af0d3e 3258 :group 'ps-print-face)
12d89a2e 3259
e0af0d3e 3260(defcustom ps-always-build-face-reference nil
12d89a2e
RS
3261 "*Non-nil means always rebuild the reference face lists.
3262
319acba0
GM
3263If this variable is non-nil, ps-print will rebuild its internal reference lists
3264of bold and italic faces *every* time one of the ...-with-faces commands is
3265called. Most users shouldn't need to set this variable."
e0af0d3e 3266 :type 'boolean
b6d0ac87 3267 :version "20"
e0af0d3e 3268 :group 'ps-print-face)
ef2cbb24 3269
bc0d41bd
KH
3270(defcustom ps-banner-page-when-duplexing nil
3271 "*Non-nil means the very first page is skipped.
3272It's like the very first character of buffer (or region) is ^L (\\014)."
3273 :type 'boolean
b6d0ac87 3274 :version "20"
6e1b1da6 3275 :group 'ps-print-headers)
bc0d41bd 3276
98f2fbe7 3277(defcustom ps-postscript-code-directory
b6d0ac87
VJL
3278 (or (if (featurep 'xemacs)
3279 (cond ((fboundp 'locate-data-directory) ; xemacs
c97a3f22 3280 (funcall 'locate-data-directory "ps-print"))
b6d0ac87 3281 ((boundp 'data-directory) ; xemacs
c97a3f22 3282 (symbol-value 'data-directory))
b6d0ac87
VJL
3283 (t ; don't know what to do
3284 nil))
3285 data-directory) ; emacs
eafa92bf 3286 (error "`ps-postscript-code-directory' isn't set properly"))
41481e4b
KH
3287 "*Directory where it's located the PostScript prologue file used by ps-print.
3288By default, this directory is the same as in the variable `data-directory'."
3289 :type 'directory
b6d0ac87 3290 :version "20"
6e1b1da6 3291 :group 'ps-print-miscellany)
41481e4b 3292
6bf5fb46
GM
3293(defcustom ps-line-spacing 0
3294 "*Specify line spacing, in points, for ordinary text.
3295
3296See also `ps-paragraph-spacing' and `ps-paragraph-regexp'.
3297
3298To get all lines with some spacing set both `ps-line-spacing' and
3299`ps-paragraph-spacing' variables."
3300 :type '(choice :menu-tag "Line Spacing For Ordinary Text"
3301 :tag "Line Spacing For Ordinary Text"
3302 (number :tag "Line Spacing")
3303 (cons :tag "Landscape/Portrait"
3304 (number :tag "Landscape Line Spacing")
3305 (number :tag "Portrait Line Spacing")))
3306 :version "21.1"
3307 :group 'ps-print-miscellany)
3308
3309(defcustom ps-paragraph-spacing 0
3310 "*Specify paragraph spacing, in points, for ordinary text.
3311
3312See also `ps-line-spacing' and `ps-paragraph-regexp'.
3313
3314To get all lines with some spacing set both `ps-line-spacing' and
3315`ps-paragraph-spacing' variables."
3316 :type '(choice :menu-tag "Paragraph Spacing For Ordinary Text"
3317 :tag "Paragraph Spacing For Ordinary Text"
3318 (number :tag "Paragraph Spacing")
3319 (cons :tag "Landscape/Portrait"
3320 (number :tag "Landscape Paragraph Spacing")
3321 (number :tag "Portrait Paragraph Spacing")))
3322 :version "21.1"
3323 :group 'ps-print-miscellany)
3324
3325(defcustom ps-paragraph-regexp "[ \t]*$"
3326 "*Specify paragraph delimiter.
3327
3328It should be a regexp or nil.
3329
3330See also `ps-paragraph-spacing'."
3331 :type '(choice :menu-tag "Paragraph Delimiter"
3332 (const :tag "No Delimiter" nil)
3333 (regexp :tag "Delimiter Regexp"))
3334 :version "21.1"
3335 :group 'ps-print-miscellany)
3336
3337(defcustom ps-begin-cut-regexp nil
3338 "*Specify regexp which is start of a region to cut out when printing.
3339
3340As an example, variables `ps-begin-cut-regexp' and `ps-end-cut-regexp' may be
3341set to \"^Local Variables:\" and \"^End:\", respectively, in order to leave out
3342some special printing instructions from the actual print. Special printing
3343instructions may be appended to the end of the file just like any other
3344buffer-local variables. See section \"Local Variables in Files\" on Emacs
3345manual for more information.
3346
3347Variables `ps-begin-cut-regexp' and `ps-end-cut-regexp' control together what
3348actually gets printed. Both variables may be set to nil in which case no
3349cutting occurs."
bf29d4c1
MR
3350 :type '(choice (const :tag "No Delimiter" nil)
3351 (regexp :tag "Delimiter Regexp"))
6bf5fb46
GM
3352 :version "21.1"
3353 :group 'ps-print-miscellany)
3354
3355(defcustom ps-end-cut-regexp nil
3356 "*Specify regexp which is end of the region to cut out when printing.
3357
3358See `ps-begin-cut-regexp' for more information."
bf29d4c1
MR
3359 :type '(choice (const :tag "No Delimiter" nil)
3360 (regexp :tag "Delimiter Regexp"))
6bf5fb46
GM
3361 :version "21.1"
3362 :group 'ps-print-miscellany)
3363
0a5daee5 3364
1fd9b7fe
GM
3365;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3366;; Selected Pages
3367
3368
3369(defvar ps-last-selected-pages nil
3370 "Latest `ps-selected-pages' value.")
3371
3372
3373(defun ps-restore-selected-pages ()
3374 "Restore latest `ps-selected-pages' value."
3375 (interactive)
3376 (setq ps-selected-pages ps-last-selected-pages))
3377
3378
0a5daee5
KH
3379;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3380;; Customization
3381
3382
3383;;;###autoload
3384(defun ps-print-customize ()
3385 "Customization of ps-print group."
3386 (interactive)
3387 (customize-group 'ps-print))
3388
3389
ef2cbb24 3390;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12d89a2e 3391;; User commands
ef2cbb24 3392
0a5daee5 3393
00aa16af 3394;;;###autoload
ef2cbb24 3395(defun ps-print-buffer (&optional filename)
12d89a2e 3396 "Generate and print a PostScript image of the buffer.
ef2cbb24 3397
2285bf9d 3398Interactively, when you use a prefix argument (\\[universal-argument]), the command prompts the
319acba0
GM
3399user for a file name, and saves the PostScript image in that file instead of
3400sending it to the printer.
ef2cbb24 3401
319acba0
GM
3402Noninteractively, the argument FILENAME is treated as follows: if it is nil,
3403send the image to the printer. If FILENAME is a string, save the PostScript
3404image in a file with that name."
00aa16af 3405 (interactive (list (ps-print-preprint current-prefix-arg)))
87a16a06 3406 (ps-print-without-faces (point-min) (point-max) filename))
ef2cbb24
RS
3407
3408
00aa16af 3409;;;###autoload
ef2cbb24 3410(defun ps-print-buffer-with-faces (&optional filename)
12d89a2e 3411 "Generate and print a PostScript image of the buffer.
319acba0
GM
3412Like `ps-print-buffer', but includes font, color, and underline information in
3413the generated image. This command works only if you are using a window system,
3414so it has a way to determine color values."
00aa16af 3415 (interactive (list (ps-print-preprint current-prefix-arg)))
87a16a06 3416 (ps-print-with-faces (point-min) (point-max) filename))
ef2cbb24 3417
ef2cbb24 3418
00aa16af 3419;;;###autoload
ef2cbb24 3420(defun ps-print-region (from to &optional filename)
12d89a2e 3421 "Generate and print a PostScript image of the region.
12d89a2e 3422Like `ps-print-buffer', but prints just the current region."
55732434 3423 (interactive (ps-print-preprint-region current-prefix-arg))
a18ed129 3424 (ps-print-without-faces from to filename t))
ef2cbb24 3425
ef2cbb24 3426
00aa16af 3427;;;###autoload
ef2cbb24 3428(defun ps-print-region-with-faces (from to &optional filename)
12d89a2e 3429 "Generate and print a PostScript image of the region.
319acba0
GM
3430Like `ps-print-region', but includes font, color, and underline information in
3431the generated image. This command works only if you are using a window system,
3432so it has a way to determine color values."
55732434 3433 (interactive (ps-print-preprint-region current-prefix-arg))
a18ed129 3434 (ps-print-with-faces from to filename t))
ef2cbb24 3435
ef2cbb24 3436
00aa16af 3437;;;###autoload
ef2cbb24 3438(defun ps-spool-buffer ()
12d89a2e 3439 "Generate and spool a PostScript image of the buffer.
319acba0
GM
3440Like `ps-print-buffer' except that the PostScript image is saved in a local
3441buffer to be sent to the printer later.
ef2cbb24 3442
12d89a2e 3443Use the command `ps-despool' to send the spooled images to the printer."
ef2cbb24 3444 (interactive)
87a16a06 3445 (ps-spool-without-faces (point-min) (point-max)))
ef2cbb24 3446
ef2cbb24 3447
00aa16af 3448;;;###autoload
ef2cbb24 3449(defun ps-spool-buffer-with-faces ()
12d89a2e 3450 "Generate and spool a PostScript image of the buffer.
319acba0
GM
3451Like `ps-spool-buffer', but includes font, color, and underline information in
3452the generated image. This command works only if you are using a window system,
3453so it has a way to determine color values.
ef2cbb24 3454
12d89a2e 3455Use the command `ps-despool' to send the spooled images to the printer."
ef2cbb24 3456 (interactive)
87a16a06 3457 (ps-spool-with-faces (point-min) (point-max)))
ef2cbb24 3458
ef2cbb24 3459
00aa16af 3460;;;###autoload
ef2cbb24 3461(defun ps-spool-region (from to)
12d89a2e 3462 "Generate a PostScript image of the region and spool locally.
12d89a2e 3463Like `ps-spool-buffer', but spools just the current region.
ef2cbb24 3464
12d89a2e 3465Use the command `ps-despool' to send the spooled images to the printer."
ef2cbb24 3466 (interactive "r")
a18ed129 3467 (ps-spool-without-faces from to t))
ef2cbb24 3468
ef2cbb24 3469
00aa16af 3470;;;###autoload
ef2cbb24 3471(defun ps-spool-region-with-faces (from to)
12d89a2e 3472 "Generate a PostScript image of the region and spool locally.
319acba0
GM
3473Like `ps-spool-region', but includes font, color, and underline information in
3474the generated image. This command works only if you are using a window system,
3475so it has a way to determine color values.
ef2cbb24 3476
12d89a2e 3477Use the command `ps-despool' to send the spooled images to the printer."
ef2cbb24 3478 (interactive "r")
a18ed129 3479 (ps-spool-with-faces from to t))
ef2cbb24 3480
00aa16af 3481;;;###autoload
ef2cbb24
RS
3482(defun ps-despool (&optional filename)
3483 "Send the spooled PostScript to the printer.
3484
2285bf9d 3485Interactively, when you use a prefix argument (\\[universal-argument]), the command prompts the
319acba0
GM
3486user for a file name, and saves the spooled PostScript image in that file
3487instead of sending it to the printer.
ef2cbb24 3488
319acba0
GM
3489Noninteractively, the argument FILENAME is treated as follows: if it is nil,
3490send the image to the printer. If FILENAME is a string, save the PostScript
3491image in a file with that name."
00aa16af
RS
3492 (interactive (list (ps-print-preprint current-prefix-arg)))
3493 (ps-do-despool filename))
12d89a2e 3494
bcc0d457
RS
3495;;;###autoload
3496(defun ps-line-lengths ()
2285bf9d
RS
3497 "Display the correspondence between a line length and a font size.
3498Done using the current ps-print setup.
bcc0d457
RS
3499Try: pr -t file | awk '{printf \"%3d %s\n\", length($0), $0}' | sort -r | head"
3500 (interactive)
3501 (ps-line-lengths-internal))
3502
3503;;;###autoload
3504(defun ps-nb-pages-buffer (nb-lines)
06fb6aab
RS
3505 "Display number of pages to print this buffer, for various font heights.
3506The table depends on the current ps-print setup."
55732434 3507 (interactive (ps-count-lines-preprint (point-min) (point-max)))
bcc0d457
RS
3508 (ps-nb-pages nb-lines))
3509
3510;;;###autoload
3511(defun ps-nb-pages-region (nb-lines)
06fb6aab
RS
3512 "Display number of pages to print the region, for various font heights.
3513The table depends on the current ps-print setup."
55732434 3514 (interactive (ps-count-lines-preprint (mark) (point)))
bcc0d457
RS
3515 (ps-nb-pages nb-lines))
3516
c86f4619
GM
3517(defvar ps-prefix-quote nil
3518 "Used for `ps-print-quote' (which see).")
efa89c1f 3519
bcc0d457
RS
3520;;;###autoload
3521(defun ps-setup ()
496725ad 3522 "Return the current PostScript-generation setup."
efa89c1f 3523 (let (ps-prefix-quote)
319acba0 3524 (mapconcat
efa89c1f 3525 #'ps-print-quote
319acba0
GM
3526 (list
3527 (concat "\n;;; ps-print version " ps-print-version "\n")
208ccc30 3528 ";; internal vars"
c033ddef 3529 (ps-comment-string "emacs-version " emacs-version)
208ccc30
VJL
3530 (ps-comment-string "ps-windows-system " ps-windows-system)
3531 (ps-comment-string "ps-lp-system " ps-lp-system)
3532 nil
319acba0
GM
3533 '(25 . ps-print-color-p)
3534 '(25 . ps-lpr-command)
3535 '(25 . ps-lpr-switches)
3536 '(25 . ps-printer-name)
3537 '(25 . ps-printer-name-option)
3538 '(25 . ps-print-region-function)
3539 '(25 . ps-manual-feed)
3540 '(25 . ps-end-with-control-d)
3541 nil
3542 '(23 . ps-paper-type)
3543 '(23 . ps-warn-paper-type)
3544 '(23 . ps-landscape-mode)
3545 '(23 . ps-print-upside-down)
3546 '(23 . ps-number-of-columns)
3547 nil
3548 '(23 . ps-zebra-stripes)
3549 '(23 . ps-zebra-stripe-height)
3550 '(23 . ps-zebra-stripe-follow)
3551 '(23 . ps-zebra-color)
3552 '(23 . ps-line-number)
3553 '(23 . ps-line-number-step)
3554 '(23 . ps-line-number-start)
3555 nil
3556 '(17 . ps-default-fg)
3557 '(17 . ps-default-bg)
3558 '(17 . ps-razzle-dazzle)
3559 nil
3560 '(23 . ps-use-face-background)
3561 nil
3562 '(28 . ps-print-control-characters)
3563 nil
3564 '(26 . ps-print-background-image)
3565 nil
3566 '(25 . ps-print-background-text)
3567 nil
3568 '(29 . ps-error-handler-message)
3569 '(29 . ps-user-defined-prologue)
3570 '(29 . ps-print-prologue-header)
3571 '(29 . ps-postscript-code-directory)
3572 '(29 . ps-adobe-tag)
3573 nil
3574 '(30 . ps-left-margin)
3575 '(30 . ps-right-margin)
3576 '(30 . ps-inter-column)
3577 '(30 . ps-bottom-margin)
3578 '(30 . ps-top-margin)
3579 '(30 . ps-print-only-one-header)
3580 '(30 . ps-switch-header)
3581 '(30 . ps-print-header)
3582 '(30 . ps-header-lines)
3583 '(30 . ps-header-offset)
3584 '(30 . ps-header-line-pad)
3585 '(30 . ps-print-header-frame)
3586 '(30 . ps-header-frame-alist)
3587 '(30 . ps-print-footer)
3588 '(30 . ps-footer-lines)
3589 '(30 . ps-footer-offset)
3590 '(30 . ps-footer-line-pad)
3591 '(30 . ps-print-footer-frame)
3592 '(30 . ps-footer-frame-alist)
3593 '(30 . ps-show-n-of-n)
3594 '(30 . ps-spool-config)
3595 '(30 . ps-spool-duplex)
3596 '(30 . ps-spool-tumble)
3597 '(30 . ps-banner-page-when-duplexing)
3598 '(30 . ps-left-header)
3599 '(30 . ps-right-header)
3600 '(30 . ps-left-footer)
3601 '(30 . ps-right-footer)
3602 nil
3603 '(23 . ps-n-up-printing)
3604 '(23 . ps-n-up-margin)
3605 '(23 . ps-n-up-border-p)
3606 '(23 . ps-n-up-filling)
3607 nil
3608 '(26 . ps-multibyte-buffer)
3609 '(26 . ps-font-family)
3610 '(26 . ps-font-size)
3611 '(26 . ps-header-font-family)
3612 '(26 . ps-header-font-size)
3613 '(26 . ps-header-title-font-size)
3614 '(26 . ps-footer-font-family)
3615 '(26 . ps-footer-font-size)
3616 '(26 . ps-line-number-color)
3617 '(26 . ps-line-number-font)
3618 '(26 . ps-line-number-font-size)
3619 '(26 . ps-line-spacing)
3620 '(26 . ps-paragraph-spacing)
3621 '(26 . ps-paragraph-regexp)
3622 '(26 . ps-begin-cut-regexp)
3623 '(26 . ps-end-cut-regexp)
3624 nil
3625 '(23 . ps-even-or-odd-pages)
3626 '(23 . ps-selected-pages)
3627 '(23 . ps-last-selected-pages)
3628 nil
3629 '(31 . ps-build-face-reference)
3630 '(31 . ps-always-build-face-reference)
3631 nil
3632 '(20 . ps-auto-font-detect)
3633 '(20 . ps-bold-faces)
3634 '(20 . ps-italic-faces)
3635 '(20 . ps-underlined-faces)
55732434 3636 '(20 . ps-black-white-faces)
c86f4619 3637 " )\n
bd7a2e26
GM
3638;; The following customized variables have long lists and are seldom modified:
3639;; ps-page-dimensions-database
3640;; ps-font-info-database
1fd9b7fe 3641
319acba0
GM
3642;;; ps-print - end of settings\n")
3643 "\n")))
bcc0d457 3644
0a5daee5 3645
12d89a2e
RS
3646;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3647;; Utility functions and variables:
3648
0a5daee5 3649
efa89c1f 3650(defun ps-print-quote (elt)
c86f4619
GM
3651 "Quote ELT for printing (used for showing settings).
3652
3653If ELT is nil, return an empty string.
3654If ELT is string, return it.
3655Otherwise, ELT should be a cons (LEN . SYM) where SYM is a variable symbol and
3656LEN is the field length where SYM name will be inserted. The variable
3657`ps-prefix-quote' is used to form the string, if `ps-prefix-quote' is nil, it's
3658used \"(setq \" as prefix; otherwise, it's used \" \". So, the string
3659generated is:
3660
3661 * If `ps-prefix-quote' is nil:
3662 \"(setq SYM-NAME SYM-VALUE\"
3663 |<------->|
3664 LEN
3665
3666 * If `ps-prefix-quote' is non-nil:
3667 \" SYM-NAME SYM-VALUE\"
3668 |<------->|
3669 LEN
3670
3671If `ps-prefix-quote' is nil, it's set to t after generating string."
efa89c1f 3672 (cond
efa89c1f 3673 ((stringp elt) elt)
c90a10fa
RS
3674 ((and (consp elt) (integerp (car elt))
3675 (symbolp (cdr elt)) (boundp (cdr elt)))
efa89c1f
GM
3676 (let* ((col (car elt))
3677 (sym (cdr elt))
3678 (key (symbol-name sym))
3679 (len (length key))
3680 (val (symbol-value sym)))
3681 (concat (if ps-prefix-quote
c86f4619
GM
3682 " "
3683 (setq ps-prefix-quote t)
efa89c1f
GM
3684 "(setq ")
3685 key
3686 (if (> col len)
b0fa9df7 3687 (make-string (- col len) ?\s)
efa89c1f 3688 " ")
51138c94 3689 (ps-value-string val))))
c90a10fa 3690 (t "")
efa89c1f
GM
3691 ))
3692
3693
51138c94
VJL
3694(defun ps-value-string (val)
3695 "Return a string representation of VAL. Used by `ps-print-quote'."
3696 (cond ((null val)
3697 "nil")
3698 ((eq val t)
3699 "t")
3700 ((or (symbolp val) (listp val))
3701 (format "'%S" val))
3702 (t
3703 (format "%S" val))))
3704
3705
bd20e8cd 3706(defun ps-comment-string (str value)
cfb7b9ce
VJL
3707 "Return a comment string like \";; STR = VALUE\"."
3708 (format ";; %s = %s" str (ps-value-string value)))
bd20e8cd
VJL
3709
3710
319acba0
GM
3711(defun ps-value (alist-sym key)
3712 "Return value from association list ALIST-SYM which car is `eq' to KEY."
3713 (cdr (assq key (symbol-value alist-sym))))
3714
3715
3716(defun ps-get (alist-sym key)
3717 "Return element from association list ALIST-SYM which car is `eq' to KEY."
3718 (assq key (symbol-value alist-sym)))
3719
3720
3721(defun ps-put (alist-sym key value)
3722 "Store element (KEY . VALUE) into association list ALIST-SYM.
3723If KEY already exists in ALIST-SYM, modify cdr to VALUE.
3724It can be retrieved with `(ps-get ALIST-SYM KEY)'."
3725 (let ((elt: (assq key (symbol-value alist-sym)))) ; to avoid name conflict
3726 (if elt:
3727 (setcdr elt: value)
3728 (setq elt: (cons key value))
3729 (set alist-sym (cons elt: (symbol-value alist-sym))))
3730 elt:))
3731
3732
3733(defun ps-del (alist-sym key)
3734 "Delete by side effect element KEY from association list ALIST-SYM."
3735 (let ((a:list: (symbol-value alist-sym)) ; to avoid name conflict
3736 old)
3737 (while a:list:
3738 (if (eq key (car (car a:list:)))
3739 (progn
3740 (if old
3741 (setcdr old (cdr a:list:))
3742 (set alist-sym (cdr a:list:)))
3743 (setq a:list: nil))
3744 (setq old a:list:
3745 a:list: (cdr a:list:)))))
3746 (symbol-value alist-sym))
3747
3748
4b81a999
GM
3749(defun ps-time-stamp-locale-default ()
3750 "Return the locale's \"preferred\" date as, for example, \"06/18/01\"."
3751 (format-time-string "%x"))
3752
3753
2bd80d73 3754(defun ps-time-stamp-mon-dd-yyyy ()
4b81a999 3755 "Return date as \"Jun 18 2001\"."
2bd80d73
GM
3756 (format-time-string "%b %d %Y"))
3757
3758
6b61353c
KH
3759(defun ps-time-stamp-yyyy-mm-dd ()
3760 "Return date as \"2001-06-18\" (ISO date)."
3761 (format-time-string "%Y-%m-%d"))
3762
3763
3a504454
VJL
3764;; Alias for `ps-time-stamp-yyyy-mm-dd' (which see).
3765(defalias 'ps-time-stamp-iso8601 'ps-time-stamp-yyyy-mm-dd)
6b61353c
KH
3766
3767
2bd80d73 3768(defun ps-time-stamp-hh:mm:ss ()
4b81a999 3769 "Return time as \"17:28:31\"."
2bd80d73
GM
3770 (format-time-string "%T"))
3771
3772
ea0c615d 3773(defvar ps-print-color-scale 1.0)
47b54c71 3774
3e9cb08f
GM
3775(defun ps-color-scale (color)
3776 ;; Scale 16-bit X-COLOR-VALUE to PostScript color value in [0, 1] interval.
3777 (mapcar #'(lambda (value) (/ value ps-print-color-scale))
3778 (ps-color-values color)))
3779
3780
3781(defun ps-face-underlined-p (face)
3782 (or (face-underline-p face)
3783 (memq face ps-underlined-faces)))
e65df0a1 3784
857686a6 3785
41481e4b 3786(defun ps-prologue-file (filenumber)
2285bf9d 3787 "If prologue FILENUMBER exists and is readable, return contents as string.
2bd80d73
GM
3788
3789Note: No major/minor-mode is activated and no local variables are evaluated for
3790 FILENUMBER, but proper EOL-conversion and character interpretation is
3791 done!"
3792 (let ((filename (convert-standard-filename
3793 (expand-file-name (format "ps-prin%d.ps" filenumber)
3794 ps-postscript-code-directory))))
3795 (if (and (file-exists-p filename)
319acba0
GM
3796 (file-readable-p filename))
3797 (with-temp-buffer
3798 (insert-file-contents filename)
3799 (buffer-string))
e8af40ee 3800 (error "ps-print PostScript prologue `%s' file was not found"
2bd80d73 3801 filename))))
bcc0d457 3802
bcc0d457 3803
41481e4b 3804(defvar ps-mark-code-directory nil)
bcc0d457 3805
66e63857
GM
3806(defvar ps-print-prologue-0 ""
3807 "ps-print PostScript error handler.")
3808
41481e4b 3809(defvar ps-print-prologue-1 ""
6bf5fb46 3810 "ps-print PostScript prologue.")
12d89a2e
RS
3811
3812;; Start Editing Here:
ef2cbb24 3813
12d89a2e
RS
3814(defvar ps-source-buffer nil)
3815(defvar ps-spool-buffer-name "*PostScript*")
3816(defvar ps-spool-buffer nil)
ef2cbb24 3817
12d89a2e
RS
3818(defvar ps-output-head nil)
3819(defvar ps-output-tail nil)
ef2cbb24 3820
4b3eb10f
GM
3821(defvar ps-page-postscript 0) ; page number
3822(defvar ps-page-order 0) ; PostScript page counter
3823(defvar ps-page-sheet 0) ; sheet counter
3824(defvar ps-page-column 0) ; column counter
3825(defvar ps-page-printed 0) ; total pages printed
3826(defvar ps-page-n-up 0) ; n-up counter
bd7a2e26
GM
3827(defvar ps-lines-printed 0) ; total lines printed
3828(defvar ps-showline-count 1) ; line number counter
1fd9b7fe
GM
3829(defvar ps-first-page nil)
3830(defvar ps-last-page nil)
ea0c615d 3831(defvar ps-print-page-p t)
87a16a06 3832
857686a6 3833(defvar ps-control-or-escape-regexp nil)
98f2fbe7 3834(defvar ps-n-up-on nil)
857686a6 3835
87a16a06
RS
3836(defvar ps-background-pages nil)
3837(defvar ps-background-all-pages nil)
3838(defvar ps-background-text-count 0)
3839(defvar ps-background-image-count 0)
ef2cbb24 3840
12d89a2e 3841(defvar ps-current-font 0)
6e1b1da6 3842(defvar ps-default-foreground nil)
e59d29d6 3843(defvar ps-default-background nil)
6e1b1da6
GM
3844(defvar ps-default-color nil)
3845(defvar ps-current-color nil)
12d89a2e
RS
3846(defvar ps-current-bg nil)
3847
2bd80d73 3848(defvar ps-zebra-stripe-full-p nil)
12d89a2e
RS
3849(defvar ps-razchunk 0)
3850
d3ab8dac 3851(defvar ps-color-p nil)
12d89a2e 3852
319acba0
GM
3853;; These values determine how much print-height to deduct when headers/footers
3854;; are turned on. This is a pretty clumsy way of handling it, but it'll do for
3855;; now.
12d89a2e 3856
bcc0d457 3857(defvar ps-header-pad 0
496725ad
RS
3858 "Vertical and horizontal space between the header frame and the text.
3859This is in units of points (1/72 inch).")
12d89a2e 3860
319acba0
GM
3861(defvar ps-footer-pad 0
3862 "Vertical and horizontal space between the footer frame and the text.
3863This is in units of points (1/72 inch).")
3864
bcc0d457 3865;; Define accessors to the dimensions list.
12d89a2e 3866
bcc0d457
RS
3867(defmacro ps-page-dimensions-get-width (dims) `(nth 0 ,dims))
3868(defmacro ps-page-dimensions-get-height (dims) `(nth 1 ,dims))
bc0d41bd 3869(defmacro ps-page-dimensions-get-media (dims) `(nth 2 ,dims))
12d89a2e 3870
87a16a06 3871(defvar ps-landscape-page-height nil)
12d89a2e 3872
12d89a2e
RS
3873(defvar ps-print-width nil)
3874(defvar ps-print-height nil)
3875
8bd22fcf
KH
3876(defvar ps-height-remaining nil)
3877(defvar ps-width-remaining nil)
12d89a2e 3878
7d8b7e8e
KH
3879(defvar ps-font-size-internal nil)
3880(defvar ps-header-font-size-internal nil)
3881(defvar ps-header-title-font-size-internal nil)
319acba0 3882(defvar ps-footer-font-size-internal nil)
6bf5fb46
GM
3883(defvar ps-line-spacing-internal nil)
3884(defvar ps-paragraph-spacing-internal nil)
7d8b7e8e 3885
87a16a06
RS
3886\f
3887;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3888;; Internal Variables
3889
3890
55732434
GM
3891(defvar ps-black-white-faces-alist nil
3892 "Alist of symbolic faces used for black/white PostScript printers.
3893An element of this list has the same form as `ps-print-face-extension-alist'
2285bf9d 3894\(which see).
55732434
GM
3895
3896Don't change this list directly; instead,
3897use `ps-extend-face' and `ps-extend-face-list'.
3898See documentation for `ps-extend-face' for valid extension symbol.
3899See also documentation for `ps-print-color-p'.")
3900
3901
87a16a06 3902(defvar ps-print-face-extension-alist nil
a18ed129 3903 "Alist of symbolic faces *WITH* extension features (box, outline, etc).
87a16a06
RS
3904An element of this list has the following form:
3905
3906 (FACE . [BITS FG BG])
3907
3908 FACE is a symbol denoting a face name
3909 BITS is a bit vector, where each bit correspond
3910 to a feature (bold, underline, etc)
3911 (see documentation for `ps-print-face-map-alist')
3912 FG foreground color (string or nil)
3913 BG background color (string or nil)
3914
a18ed129
RS
3915Don't change this list directly; instead,
3916use `ps-extend-face' and `ps-extend-face-list'.
3917See documentation for `ps-extend-face' for valid extension symbol.")
3918
3919
3920(defvar ps-print-face-alist nil
3921 "Alist of symbolic faces *WITHOUT* extension features (box, outline, etc).
3922
3923An element of this list has the same form as an element of
3924`ps-print-face-extension-alist'.
3925
3926Don't change this list directly; this list is used by `ps-face-attributes',
3927`ps-map-face' and `ps-build-reference-face-lists'.")
87a16a06
RS
3928
3929
3930(defconst ps-print-face-map-alist
3931 '((bold . 1)
3932 (italic . 2)
3933 (underline . 4)
3934 (strikeout . 8)
3935 (overline . 16)
3936 (shadow . 32)
3937 (box . 64)
3938 (outline . 128))
3939 "Alist of all features and the corresponding bit mask.
3940Each symbol correspond to one bit in a bit vector.")
3941
3942\f
3943;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
a18ed129 3944;; Remapping Faces
87a16a06
RS
3945
3946
3947;;;###autoload
55732434
GM
3948(defun ps-extend-face-list (face-extension-list &optional merge-p alist-sym)
3949 "Extend face in ALIST-SYM.
87a16a06 3950
a18ed129 3951If optional MERGE-P is non-nil, extensions in FACE-EXTENSION-LIST are merged
55732434
GM
3952with face extension in ALIST-SYM; otherwise, overrides.
3953
01cdabc6 3954If optional ALIST-SYM is nil, `ps-print-face-extension-alist' is used;
55732434 3955otherwise, it should be an alist symbol.
87a16a06 3956
01cdabc6 3957The elements in FACE-EXTENSION-LIST are like those for `ps-extend-face'.
87a16a06
RS
3958
3959See `ps-extend-face' for documentation."
3960 (while face-extension-list
55732434 3961 (ps-extend-face (car face-extension-list) merge-p alist-sym)
87a16a06
RS
3962 (setq face-extension-list (cdr face-extension-list))))
3963
3964
3965;;;###autoload
55732434
GM
3966(defun ps-extend-face (face-extension &optional merge-p alist-sym)
3967 "Extend face in ALIST-SYM.
87a16a06 3968
6bdb808e 3969If optional MERGE-P is non-nil, extensions in FACE-EXTENSION list are merged
55732434
GM
3970with face extensions in ALIST-SYM; otherwise, overrides.
3971
01cdabc6 3972If optional ALIST-SYM is nil, `ps-print-face-extension-alist' is used;
55732434 3973otherwise, it should be an alist symbol.
87a16a06
RS
3974
3975The elements of FACE-EXTENSION list have the form:
3976
3977 (FACE-NAME FOREGROUND BACKGROUND EXTENSION...)
3978
3979FACE-NAME is a face name symbol.
3980
3981FOREGROUND and BACKGROUND may be nil or a string that denotes the
3982foreground and background colors respectively.
3983
3984EXTENSION is one of the following symbols:
3985 bold - use bold font.
3986 italic - use italic font.
3987 underline - put a line under text.
3988 strikeout - like underline, but the line is in middle of text.
3989 overline - like underline, but the line is over the text.
3990 shadow - text will have a shadow.
3991 box - text will be surrounded by a box.
a18ed129 3992 outline - print characters as hollow outlines.
87a16a06
RS
3993
3994If EXTENSION is any other symbol, it is ignored."
55732434
GM
3995 (or alist-sym
3996 (setq alist-sym 'ps-print-face-extension-alist))
3997 (let* ((background (nth 2 face-extension))
3998 (foreground (nth 1 face-extension))
3999 (face-name (nth 0 face-extension))
4000 (ps-face (cdr (assq face-name (symbol-value alist-sym))))
87a16a06 4001 (face-vector (or ps-face (vector 0 nil nil)))
55732434 4002 (face-bit (ps-extension-bit face-extension)))
87a16a06
RS
4003 ;; extend face
4004 (aset face-vector 0 (if merge-p
4005 (logior (aref face-vector 0) face-bit)
4006 face-bit))
55732434
GM
4007 (and (or (not merge-p) (and foreground (stringp foreground)))
4008 (aset face-vector 1 foreground))
4009 (and (or (not merge-p) (and background (stringp background)))
4010 (aset face-vector 2 background))
87a16a06
RS
4011 ;; if face does not exist, insert it
4012 (or ps-face
55732434
GM
4013 (set alist-sym (cons (cons face-name face-vector)
4014 (symbol-value alist-sym))))))
87a16a06
RS
4015
4016
4017(defun ps-extension-bit (face-extension)
4018 (let ((face-bit 0))
4019 ;; map valid symbol extension to bit vector
4020 (setq face-extension (cdr (cdr face-extension)))
4021 (while (setq face-extension (cdr face-extension))
4022 (setq face-bit (logior face-bit
4023 (or (cdr (assq (car face-extension)
4024 ps-print-face-map-alist))
4025 0))))
4026 face-bit))
4027
4028\f
857686a6 4029;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
bc0d41bd 4030;; Adapted from font-lock: (obsolete stuff)
857686a6
RS
4031;; Originally face attributes were specified via `font-lock-face-attributes'.
4032;; Users then changed the default face attributes by setting that variable.
4033;; However, we try and be back-compatible and respect its value if set except
4034;; for faces where M-x customize has been used to save changes for the face.
4035
0a5daee5 4036
857686a6
RS
4037(defun ps-font-lock-face-attributes ()
4038 (and (boundp 'font-lock-mode) (symbol-value 'font-lock-mode)
4039 (boundp 'font-lock-face-attributes)
3e9cb08f 4040 (let ((face-attributes (symbol-value 'font-lock-face-attributes)))
857686a6 4041 (while face-attributes
6bdb808e
RS
4042 (let* ((face-attribute
4043 (car (prog1 face-attributes
4044 (setq face-attributes (cdr face-attributes)))))
857686a6
RS
4045 (face (car face-attribute)))
4046 ;; Rustle up a `defface' SPEC from a
4047 ;; `font-lock-face-attributes' entry.
4048 (unless (get face 'saved-face)
4049 (let ((foreground (nth 1 face-attribute))
4050 (background (nth 2 face-attribute))
4051 (bold-p (nth 3 face-attribute))
4052 (italic-p (nth 4 face-attribute))
4053 (underline-p (nth 5 face-attribute))
4054 face-spec)
4055 (when foreground
4056 (setq face-spec (cons ':foreground
4057 (cons foreground face-spec))))
4058 (when background
4059 (setq face-spec (cons ':background
4060 (cons background face-spec))))
4061 (when bold-p
e31c1fd5 4062 (setq face-spec (append '(:weight bold) face-spec)))
857686a6 4063 (when italic-p
e31c1fd5 4064 (setq face-spec (append '(:slant italic) face-spec)))
857686a6
RS
4065 (when underline-p
4066 (setq face-spec (append '(:underline t) face-spec)))
4067 (custom-declare-face face (list (list t face-spec)) nil)
4068 )))))))
4069
4070\f
87a16a06
RS
4071;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4072;; Internal functions and variables
4073
4074
6b61353c
KH
4075(defun ps-message-log-max ()
4076 (and (not (string= (buffer-name) "*Messages*"))
9586e1d3 4077 (boundp 'message-log-max)
6b61353c
KH
4078 message-log-max))
4079
4080
3556c6dd
GM
4081(defvar ps-print-hook nil)
4082(defvar ps-print-begin-sheet-hook nil)
4083(defvar ps-print-begin-page-hook nil)
4084(defvar ps-print-begin-column-hook nil)
12b88fff
RS
4085
4086
a18ed129 4087(defun ps-print-without-faces (from to &optional filename region-p)
857686a6 4088 (ps-spool-without-faces from to region-p)
87a16a06
RS
4089 (ps-do-despool filename))
4090
4091
a18ed129 4092(defun ps-spool-without-faces (from to &optional region-p)
6b61353c
KH
4093 (let ((message-log-max (ps-message-log-max))) ; to print *Messages* buffer
4094 (run-hooks 'ps-print-hook)
4095 (ps-printing-region region-p from to)
4096 (ps-generate (current-buffer) from to 'ps-generate-postscript)))
87a16a06
RS
4097
4098
a18ed129 4099(defun ps-print-with-faces (from to &optional filename region-p)
857686a6 4100 (ps-spool-with-faces from to region-p)
87a16a06
RS
4101 (ps-do-despool filename))
4102
4103
a18ed129 4104(defun ps-spool-with-faces (from to &optional region-p)
6b61353c
KH
4105 (let ((message-log-max (ps-message-log-max))) ; to print *Messages* buffer
4106 (run-hooks 'ps-print-hook)
4107 (ps-printing-region region-p from to)
4108 (ps-generate (current-buffer) from to 'ps-generate-postscript-with-faces)))
87a16a06
RS
4109
4110
55732434 4111(defun ps-count-lines-preprint (from to)
6b61353c
KH
4112 (or (and from to)
4113 (error "The mark is not set now"))
4114 (let ((message-log-max (ps-message-log-max))) ; to count lines of *Messages*
4115 (list (count-lines from to))))
55732434
GM
4116
4117
bc0d41bd 4118(defun ps-count-lines (from to)
a18ed129 4119 (+ (count-lines from to)
857686a6
RS
4120 (save-excursion
4121 (goto-char to)
4122 (if (= (current-column) 0) 1 0))))
87a16a06
RS
4123
4124
a18ed129 4125(defvar ps-printing-region nil
9586e1d3 4126 "Variable used to indicate the region that ps-print is printing.
bc0d41bd
KH
4127It is a cons, the car of which is the line number where the region begins, and
4128its cdr is the total number of lines in the buffer. Formatting functions can
4129use this information to print the original line number (and not the number of
4130lines printed), and to indicate in the header that the printout is of a partial
4131file.")
4132
4133
4134(defvar ps-printing-region-p nil
4135 "Non-nil means ps-print is printing a region.")
87a16a06
RS
4136
4137
e22ba851 4138(defun ps-printing-region (region-p from to)
bc0d41bd
KH
4139 (setq ps-printing-region-p region-p
4140 ps-printing-region
4141 (cons (if region-p
e22ba851 4142 (ps-count-lines (point-min) (min from to))
bc0d41bd
KH
4143 1)
4144 (ps-count-lines (point-min) (point-max)))))
87a16a06
RS
4145
4146\f
12d89a2e
RS
4147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4148;; Internal functions
4149
0a5daee5 4150
7ae35a2f 4151(defsubst ps-font-alist (font-sym)
12b88fff
RS
4152 (get font-sym 'fonts))
4153
4154(defun ps-font (font-sym font-type)
4155 "Font family name for text of `font-type', when generating PostScript."
7ae35a2f 4156 (let* ((font-list (ps-font-alist font-sym))
12b88fff 4157 (normal-font (cdr (assq 'normal font-list))))
6bdb808e
RS
4158 (while (and font-list (not (eq font-type (car (car font-list)))))
4159 (setq font-list (cdr font-list)))
4160 (or (cdr (car font-list)) normal-font)))
12b88fff 4161
319acba0 4162(defsubst ps-fonts (font-sym)
7ae35a2f 4163 (mapcar 'cdr (ps-font-alist font-sym)))
12b88fff 4164
319acba0 4165(defsubst ps-font-number (font-sym font-type)
7ae35a2f 4166 (or (ps-alist-position font-type (ps-font-alist font-sym))
12b88fff
RS
4167 0))
4168
4169(defsubst ps-line-height (font-sym)
4170 "The height of a line, for generating PostScript.
4171This is the value that ps-print uses to determine the height,
4172y-dimension, of the lines of text it has printed, and thus affects the
4173point at which page-breaks are placed.
4174The line-height is *not* the same as the point size of the font."
4175 (get font-sym 'line-height))
4176
4177(defsubst ps-title-line-height (font-sym)
4178 "The height of a `title' line, for generating PostScript.
4179This is the value that ps-print uses to determine the height,
4180y-dimension, of the lines of text it has printed, and thus affects the
4181point at which page-breaks are placed.
4182The title-line-height is *not* the same as the point size of the font."
4183 (get font-sym 'title-line-height))
4184
4185(defsubst ps-space-width (font-sym)
4186 "The width of a space character, for generating PostScript.
4187This value is used in expanding tab characters."
4188 (get font-sym 'space-width))
4189
4190(defsubst ps-avg-char-width (font-sym)
4191 "The average width, in points, of a character, for generating PostScript.
4192This is the value that ps-print uses to determine the length,
4193x-dimension, of the text it has printed, and thus affects the point at
4194which long lines wrap around."
4195 (get font-sym 'avg-char-width))
4196
bcc0d457 4197(defun ps-line-lengths-internal ()
2285bf9d
RS
4198 "Display the correspondence between a line length and a font size.
4199Done using the current ps-print setup.
bcc0d457 4200Try: pr -t file | awk '{printf \"%3d %s\n\", length($0), $0}' | sort -r | head"
df5e6194
GM
4201 (let* ((ps-font-size-internal
4202 (or ps-font-size-internal
4203 (ps-get-font-size 'ps-font-size)))
4204 (ps-header-font-size-internal
4205 (or ps-header-font-size-internal
4206 (ps-get-font-size 'ps-header-font-size)))
4207 (ps-header-title-font-size-internal
4208 (or ps-header-title-font-size-internal
4209 (ps-get-font-size 'ps-header-title-font-size)))
4210 (buf (get-buffer-create "*Line-lengths*"))
4211 (ifs ps-font-size-internal) ; initial font size
4212 (icw (ps-avg-char-width 'ps-font-for-text)) ; initial character width
4213 (print-width (progn (ps-get-page-dimensions)
4214 ps-print-width))
4215 (ps-setup (ps-setup)) ; setup for the current buffer
4216 (fs-min 5) ; minimum font size
4217 cw-min ; minimum character width
4218 nb-cpl-max ; maximum nb of characters per line
4219 (fs-max 14) ; maximum font size
4220 cw-max ; maximum character width
4221 nb-cpl-min ; minimum nb of characters per line
4222 fs ; current font size
4223 cw ; current character width
4224 nb-cpl ; current nb of characters per line
4225 )
bcc0d457
RS
4226 (setq cw-min (/ (* icw fs-min) ifs)
4227 nb-cpl-max (floor (/ print-width cw-min))
4228 cw-max (/ (* icw fs-max) ifs)
8bd22fcf
KH
4229 nb-cpl-min (floor (/ print-width cw-max))
4230 nb-cpl nb-cpl-min)
bcc0d457
RS
4231 (set-buffer buf)
4232 (goto-char (point-max))
df5e6194 4233 (or (bobp) (insert "\n" (make-string 75 ?\;) "\n"))
8bd22fcf 4234 (insert ps-setup
df5e6194 4235 "\nnb char per line / font size\n")
bcc0d457 4236 (while (<= nb-cpl nb-cpl-max)
8bd22fcf
KH
4237 (setq cw (/ print-width (float nb-cpl))
4238 fs (/ (* ifs cw) icw))
df5e6194 4239 (insert (format "%16d %s\n" nb-cpl fs))
bcc0d457
RS
4240 (setq nb-cpl (1+ nb-cpl)))
4241 (insert "\n")
4242 (display-buffer buf 'not-this-window)))
4243
4244(defun ps-nb-pages (nb-lines)
496725ad
RS
4245 "Display correspondence between font size and the number of pages.
4246The correspondence is based on having NB-LINES lines of text,
4247and on the current ps-print setup."
df5e6194
GM
4248 (let* ((ps-font-size-internal
4249 (or ps-font-size-internal
4250 (ps-get-font-size 'ps-font-size)))
4251 (ps-header-font-size-internal
4252 (or ps-header-font-size-internal
4253 (ps-get-font-size 'ps-header-font-size)))
4254 (ps-header-title-font-size-internal
4255 (or ps-header-title-font-size-internal
4256 (ps-get-font-size 'ps-header-title-font-size)))
6bf5fb46
GM
4257 (ps-line-spacing-internal
4258 (or ps-line-spacing-internal
4259 (ps-get-size ps-line-spacing "line spacing")))
df5e6194 4260 (buf (get-buffer-create "*Nb-Pages*"))
6bf5fb46 4261 (ils ps-line-spacing-internal) ; initial line spacing
df5e6194
GM
4262 (ifs ps-font-size-internal) ; initial font size
4263 (ilh (ps-line-height 'ps-font-for-text)) ; initial line height
4264 (page-height (progn (ps-get-page-dimensions)
4265 ps-print-height))
4266 (ps-setup (ps-setup)) ; setup for the current buffer
4267 (fs-min 4) ; minimum font size
4268 lh-min ; minimum line height
4269 nb-lpp-max ; maximum nb of lines per page
4270 nb-page-min ; minimum nb of pages
4271 (fs-max 14) ; maximum font size
4272 lh-max ; maximum line height
4273 nb-lpp-min ; minimum nb of lines per page
4274 nb-page-max ; maximum nb of pages
4275 fs ; current font size
4276 lh ; current line height
4277 nb-lpp ; current nb of lines per page
4278 nb-page ; current nb of pages
4279 )
6bf5fb46 4280 (setq lh-min (/ (- (* (+ ilh ils) fs-min) ils) ifs)
bcc0d457
RS
4281 nb-lpp-max (floor (/ page-height lh-min))
4282 nb-page-min (ceiling (/ (float nb-lines) nb-lpp-max))
6bf5fb46 4283 lh-max (/ (- (* (+ ilh ils) fs-max) ils) ifs)
bcc0d457 4284 nb-lpp-min (floor (/ page-height lh-max))
8bd22fcf
KH
4285 nb-page-max (ceiling (/ (float nb-lines) nb-lpp-min))
4286 nb-page nb-page-min)
bcc0d457
RS
4287 (set-buffer buf)
4288 (goto-char (point-max))
df5e6194 4289 (or (bobp) (insert "\n" (make-string 75 ?\;) "\n"))
8bd22fcf 4290 (insert ps-setup
df5e6194 4291 (format "\nThere are %d lines.\n\n" nb-lines)
8bd22fcf 4292 "nb page / font size\n")
bcc0d457
RS
4293 (while (<= nb-page nb-page-max)
4294 (setq nb-lpp (ceiling (/ nb-lines (float nb-page)))
4295 lh (/ page-height nb-lpp)
4296 fs (/ (* ifs lh) ilh))
df5e6194 4297 (insert (format "%7d %s\n" nb-page fs))
bcc0d457
RS
4298 (setq nb-page (1+ nb-page)))
4299 (insert "\n")
4300 (display-buffer buf 'not-this-window)))
4301
6bdb808e
RS
4302;; macros used in `ps-select-font'
4303(defmacro ps-lookup (key) `(cdr (assq ,key font-entry)))
4304(defmacro ps-size-scale (key) `(/ (* (ps-lookup ,key) font-size) size))
4305
12b88fff
RS
4306(defun ps-select-font (font-family sym font-size title-font-size)
4307 (let ((font-entry (cdr (assq font-family ps-font-info-database))))
4308 (or font-entry
ef1159c2 4309 (error "Don't have data to scale font %s. Known fonts families are %s"
12b88fff
RS
4310 font-family
4311 (mapcar 'car ps-font-info-database)))
6bdb808e
RS
4312 (let ((size (ps-lookup 'size)))
4313 (put sym 'fonts (ps-lookup 'fonts))
4314 (put sym 'space-width (ps-size-scale 'space-width))
4315 (put sym 'avg-char-width (ps-size-scale 'avg-char-width))
4316 (put sym 'line-height (ps-size-scale 'line-height))
4317 (put sym 'title-line-height
4318 (/ (* (ps-lookup 'line-height) title-font-size) size)))))
bcc0d457 4319
12d89a2e 4320(defun ps-get-page-dimensions ()
bcc0d457
RS
4321 (let ((page-dimensions (cdr (assq ps-paper-type ps-page-dimensions-database)))
4322 page-width page-height)
4323 (cond
4324 ((null page-dimensions)
4325 (error "`ps-paper-type' must be one of:\n%s"
4326 (mapcar 'car ps-page-dimensions-database)))
4327 ((< ps-number-of-columns 1)
12b88fff 4328 (error "The number of columns %d should be positive"
8bd22fcf 4329 ps-number-of-columns)))
bcc0d457 4330
12b88fff 4331 (ps-select-font ps-font-family 'ps-font-for-text
7d8b7e8e 4332 ps-font-size-internal ps-font-size-internal)
12b88fff 4333 (ps-select-font ps-header-font-family 'ps-font-for-header
7d8b7e8e
KH
4334 ps-header-font-size-internal
4335 ps-header-title-font-size-internal)
319acba0
GM
4336 (ps-select-font ps-footer-font-family 'ps-font-for-footer
4337 ps-footer-font-size-internal ps-footer-font-size-internal)
bcc0d457
RS
4338
4339 (setq page-width (ps-page-dimensions-get-width page-dimensions)
4340 page-height (ps-page-dimensions-get-height page-dimensions))
4341
4342 ;; Landscape mode
4343 (if ps-landscape-mode
4344 ;; exchange width and height
4345 (setq page-width (prog1 page-height (setq page-height page-width))))
4346
4347 ;; It is used to get the lower right corner (only in landscape mode)
4348 (setq ps-landscape-page-height page-height)
4349
4350 ;; | lm | text | ic | text | ic | text | rm |
4351 ;; page-width == lm + n * pw + (n - 1) * ic + rm
4352 ;; => pw == (page-width - lm -rm - (n - 1) * ic) / n
8bd22fcf
KH
4353 (setq ps-print-width (/ (- page-width
4354 ps-left-margin ps-right-margin
4355 (* (1- ps-number-of-columns) ps-inter-column))
4356 ps-number-of-columns))
bcc0d457
RS
4357 (if (<= ps-print-width 0)
4358 (error "Bad horizontal layout:
4359page-width == %s
4360ps-left-margin == %s
4361ps-right-margin == %s
4362ps-inter-column == %s
4363ps-number-of-columns == %s
4364| lm | text | ic | text | ic | text | rm |
4365page-width == lm + n * print-width + (n - 1) * ic + rm
4366=> print-width == %d !"
4367 page-width
4368 ps-left-margin
4369 ps-right-margin
4370 ps-inter-column
4371 ps-number-of-columns
4372 ps-print-width))
4373
4374 (setq ps-print-height
4375 (- page-height ps-bottom-margin ps-top-margin))
4376 (if (<= ps-print-height 0)
4377 (error "Bad vertical layout:
4378ps-top-margin == %s
4379ps-bottom-margin == %s
4380page-height == bm + print-height + tm
4381=> print-height == %d !"
4382 ps-top-margin
4383 ps-bottom-margin
4384 ps-print-height))
319acba0
GM
4385 ;; If headers are turned on, deduct the height of the header from the print
4386 ;; height.
8bd22fcf 4387 (if ps-print-header
12b88fff
RS
4388 (setq ps-header-pad (* ps-header-line-pad
4389 (ps-title-line-height 'ps-font-for-header))
8bd22fcf
KH
4390 ps-print-height (- ps-print-height
4391 ps-header-offset
4392 ps-header-pad
12b88fff
RS
4393 (ps-title-line-height 'ps-font-for-header)
4394 (* (ps-line-height 'ps-font-for-header)
4395 (1- ps-header-lines))
8bd22fcf 4396 ps-header-pad)))
bcc0d457 4397 (if (<= ps-print-height 0)
319acba0 4398 (error "Bad vertical layout (header):
bcc0d457
RS
4399ps-top-margin == %s
4400ps-bottom-margin == %s
4401ps-header-offset == %s
4402ps-header-pad == %s
4403header-height == %s
4404page-height == bm + print-height + tm - ho - hh
4405=> print-height == %d !"
4406 ps-top-margin
4407 ps-bottom-margin
4408 ps-header-offset
4409 ps-header-pad
4410 (+ ps-header-pad
12b88fff
RS
4411 (ps-title-line-height 'ps-font-for-header)
4412 (* (ps-line-height 'ps-font-for-header)
4413 (1- ps-header-lines))
bcc0d457 4414 ps-header-pad)
2bd80d73 4415 ps-print-height))
319acba0
GM
4416 ;; If footers are turned on, deduct the height of the footer from the print
4417 ;; height.
4418 (if ps-print-footer
4419 (setq ps-footer-pad (* ps-footer-line-pad
4420 (ps-title-line-height 'ps-font-for-footer))
4421 ps-print-height (- ps-print-height
4422 ps-footer-offset
4423 ps-footer-pad
4424 (* (ps-line-height 'ps-font-for-footer)
4425 (1- ps-footer-lines))
4426 ps-footer-pad)))
4427 (if (<= ps-print-height 0)
4428 (error "Bad vertical layout (footer):
4429ps-top-margin == %s
4430ps-bottom-margin == %s
4431ps-footer-offset == %s
4432ps-footer-pad == %s
4433footer-height == %s
4434page-height == bm + print-height + tm - fo - fh
4435=> print-height == %d !"
4436 ps-top-margin
4437 ps-bottom-margin
4438 ps-footer-offset
4439 ps-footer-pad
4440 (+ ps-footer-pad
4441 (* (ps-line-height 'ps-font-for-footer)
4442 (1- ps-footer-lines))
4443 ps-footer-pad)
4444 ps-print-height))
2bd80d73
GM
4445 ;; ps-zebra-stripe-follow is `full' or `full-follow'
4446 (if ps-zebra-stripe-full-p
4447 (let* ((line-height (ps-line-height 'ps-font-for-text))
6bf5fb46
GM
4448 (zebra (* (+ line-height ps-line-spacing-internal)
4449 ps-zebra-stripe-height)))
2bd80d73
GM
4450 (setq ps-print-height (- (* (floor ps-print-height zebra) zebra)
4451 line-height))
4452 (if (<= ps-print-height 0)
319acba0 4453 (error "Bad vertical layout (full zebra stripe follow):
2bd80d73
GM
4454ps-zebra-stripe-follow == %s
4455ps-zebra-stripe-height == %s
4456font-text-height == %s
6bf5fb46
GM
4457line-spacing == %s
4458page-height == ((floor print-height ((th + ls) * zh)) * ((th + ls) * zh)) - th
2bd80d73
GM
4459=> print-height == %d !"
4460 ps-zebra-stripe-follow
4461 ps-zebra-stripe-height
4462 (ps-line-height 'ps-font-for-text)
6bf5fb46 4463 ps-line-spacing-internal
2bd80d73 4464 ps-print-height))))))
ef2cbb24 4465
55732434
GM
4466
4467(defun ps-print-preprint-region (prefix-arg)
509b4dbc 4468 (or (ps-mark-active-p)
55732434
GM
4469 (error "The mark is not set now"))
4470 (list (point) (mark) (ps-print-preprint prefix-arg)))
4471
4472
edc9cd35
GM
4473(defun ps-print-preprint (prefix-arg)
4474 (and prefix-arg
4475 (or (numberp prefix-arg)
4476 (listp prefix-arg))
d3ab8dac
KH
4477 (let* ((name (concat (file-name-nondirectory (or (buffer-file-name)
4478 (buffer-name)))
4479 ".ps"))
5b76833f 4480 (prompt (format "Save PostScript to file (default %s): " name))
8bd22fcf 4481 (res (read-file-name prompt default-directory name nil)))
ea0c615d
GM
4482 (while (cond ((file-directory-p res)
4483 (ding)
4484 (setq prompt "It's a directory"))
4485 ((not (file-writable-p res))
d3ab8dac 4486 (ding)
ea0c615d 4487 (setq prompt "File is unwritable"))
d3ab8dac 4488 ((file-exists-p res)
ea0c615d 4489 (setq prompt "File exists")
d3ab8dac
KH
4490 (not (y-or-n-p (format "File `%s' exists; overwrite? "
4491 res))))
4492 (t nil))
4493 (setq res (read-file-name
ea0c615d 4494 (format "%s; save PostScript to file: " prompt)
d3ab8dac
KH
4495 (file-name-directory res) nil nil
4496 (file-name-nondirectory res))))
8bd22fcf
KH
4497 (if (file-directory-p res)
4498 (expand-file-name name (file-name-as-directory res))
4499 res))))
12d89a2e
RS
4500
4501;; The following functions implement a simple list-buffering scheme so
4502;; that ps-print doesn't have to repeatedly switch between buffers
857686a6
RS
4503;; while spooling. The functions `ps-output' and `ps-output-string' build
4504;; up the lists; the function `ps-flush-output' takes the lists and
12d89a2e
RS
4505;; insert its contents into the spool buffer (*PostScript*).
4506
857686a6
RS
4507(defvar ps-string-escape-codes
4508 (let ((table (make-vector 256 nil))
4509 (char ?\000))
4510 ;; control characters
4511 (while (<= char ?\037)
4512 (aset table char (format "\\%03o" char))
4513 (setq char (1+ char)))
4514 ;; printable characters
4515 (while (< char ?\177)
4516 (aset table char (format "%c" char))
4517 (setq char (1+ char)))
4518 ;; DEL and 8-bit characters
4519 (while (<= char ?\377)
4520 (aset table char (format "\\%o" char))
4521 (setq char (1+ char)))
4522 ;; Override ASCII formatting characters with named escape code:
4523 (aset table ?\n "\\n") ; [NL] linefeed
4524 (aset table ?\r "\\r") ; [CR] carriage return
4525 (aset table ?\t "\\t") ; [HT] horizontal tab
4526 (aset table ?\b "\\b") ; [BS] backspace
4527 (aset table ?\f "\\f") ; [NP] form feed
4528 ;; Escape PostScript escape and string delimiter characters:
4529 (aset table ?\\ "\\\\")
4530 (aset table ?\( "\\(")
4531 (aset table ?\) "\\)")
4532 table)
4533 "Vector used to map characters to PostScript string escape codes.")
4534
6bf5fb46 4535(defsubst ps-output-string-prim (string)
12d89a2e
RS
4536 (insert "(") ;insert start-string delimiter
4537 (save-excursion ;insert string
e65df0a1 4538 (insert (string-as-unibyte string)))
12d89a2e 4539 ;; Find and quote special characters as necessary for PS
c82b4a75 4540 ;; This skips everything except control chars, non-ASCII chars, (, ) and \.
b61e2c11
RS
4541 (while (progn (skip-chars-forward " -'*-[]-~") (not (eobp)))
4542 (let ((special (following-char)))
e65df0a1 4543 (delete-char 1)
c794a94d
JB
4544 (insert
4545 (if (and (<= 0 special) (<= special 255))
4546 (aref ps-string-escape-codes special)
4547 ;; insert hexadecimal representation if character code is out of range
4548 (format "\\%04X" special)
4549 ))))
12d89a2e
RS
4550 (goto-char (point-max))
4551 (insert ")")) ;insert end-string delimiter
ef2cbb24 4552
6bf5fb46 4553(defsubst ps-init-output-queue ()
1fd9b7fe 4554 (setq ps-output-head (list "")
8bd22fcf 4555 ps-output-tail ps-output-head))
ef2cbb24 4556
1fd9b7fe
GM
4557
4558(defun ps-selected-pages ()
4559 (while (progn
4560 (setq ps-first-page (car (car ps-selected-pages))
4561 ps-last-page (cdr (car ps-selected-pages))
4562 ps-selected-pages (cdr ps-selected-pages))
4563 (and ps-selected-pages
4564 (< ps-last-page ps-page-postscript)))))
4565
4566
6bf5fb46 4567(defsubst ps-print-page-p ()
ea0c615d
GM
4568 (setq ps-print-page-p
4569 (and (cond ((null ps-first-page))
4570 ((<= ps-page-postscript ps-last-page)
4571 (<= ps-first-page ps-page-postscript))
4572 (ps-selected-pages
4573 (ps-selected-pages)
4574 (and (<= ps-first-page ps-page-postscript)
4575 (<= ps-page-postscript ps-last-page)))
4576 (t
4577 nil))
4b3eb10f 4578 (cond ((eq ps-even-or-odd-pages 'even-page)
ea0c615d 4579 (= (logand ps-page-postscript 1) 0))
4b3eb10f 4580 ((eq ps-even-or-odd-pages 'odd-page)
ea0c615d
GM
4581 (= (logand ps-page-postscript 1) 1))
4582 (t)
4583 ))))
1fd9b7fe
GM
4584
4585
6bf5fb46 4586(defsubst ps-print-sheet-p ()
4b3eb10f
GM
4587 (setq ps-print-page-p
4588 (cond ((eq ps-even-or-odd-pages 'even-sheet)
4589 (= (logand ps-page-sheet 1) 0))
4590 ((eq ps-even-or-odd-pages 'odd-sheet)
4591 (= (logand ps-page-sheet 1) 1))
4592 (t)
4593 )))
4594
4595
12d89a2e 4596(defun ps-output (&rest args)
ea0c615d 4597 (when ps-print-page-p
1fd9b7fe
GM
4598 (setcdr ps-output-tail args)
4599 (while (cdr ps-output-tail)
4600 (setq ps-output-tail (cdr ps-output-tail)))))
ef2cbb24 4601
12d89a2e
RS
4602(defun ps-output-string (string)
4603 (ps-output t string))
ef2cbb24 4604
e65df0a1
KH
4605;; Output strings in the list ARGS in the PostScript prologue part.
4606(defun ps-output-prologue (args)
4607 (ps-output 'prologue (if (stringp args) (list args) args)))
4608
12d89a2e
RS
4609(defun ps-flush-output ()
4610 (save-excursion
4611 (set-buffer ps-spool-buffer)
4612 (goto-char (point-max))
4613 (while ps-output-head
4614 (let ((it (car ps-output-head)))
e65df0a1
KH
4615 (cond
4616 ((eq t it)
4617 (setq ps-output-head (cdr ps-output-head))
4618 (ps-output-string-prim (car ps-output-head)))
4619 ((eq 'prologue it)
12d89a2e 4620 (setq ps-output-head (cdr ps-output-head))
e65df0a1
KH
4621 (save-excursion
4622 (search-backward "\nBeginDoc")
4623 (forward-char 1)
4624 (apply 'insert (car ps-output-head))))
4625 (t
4626 (insert it))))
12d89a2e
RS
4627 (setq ps-output-head (cdr ps-output-head))))
4628 (ps-init-output-queue))
4629
4630(defun ps-insert-file (fname)
4631 (ps-flush-output)
12d89a2e
RS
4632 (save-excursion
4633 (set-buffer ps-spool-buffer)
4634 (goto-char (point-max))
b6d0ac87 4635 (insert-file-contents fname)))
06fb6aab 4636
319acba0 4637;; These functions insert the arrays that define the contents of the headers.
ef2cbb24 4638
f07bb446
KH
4639(defvar ps-encode-header-string-function nil)
4640
12d89a2e 4641(defun ps-generate-header-line (fonttag &optional content)
319acba0 4642 (ps-output " [" fonttag " ")
12d89a2e 4643 (cond
319acba0
GM
4644 ;; Literal strings should be output as is -- the string must contain its own
4645 ;; PS string delimiters, '(' and ')', if necessary.
12d89a2e 4646 ((stringp content)
f07bb446 4647 (ps-output content))
12d89a2e 4648
319acba0
GM
4649 ;; Functions are called -- they should return strings; they will be inserted
4650 ;; as strings and the PS string delimiters added.
5c538596
MB
4651 ((fboundp content)
4652 (if (fboundp ps-encode-header-string-function)
4653 (dolist (l (funcall ps-encode-header-string-function
4654 (funcall content) fonttag))
4655 (ps-output-string l))
4656 (ps-output-string (funcall content))))
12d89a2e 4657
319acba0
GM
4658 ;; Variables will have their contents inserted. They should contain
4659 ;; strings, and will be inserted as strings.
12d89a2e 4660 ((and (symbolp content) (boundp content))
f07bb446
KH
4661 (if (fboundp ps-encode-header-string-function)
4662 (dolist (l (funcall ps-encode-header-string-function
4663 (symbol-value content) fonttag))
4664 (ps-output-string l))
4665 (ps-output-string (symbol-value content))))
12d89a2e
RS
4666
4667 ;; Anything else will get turned into an empty string.
4668 (t
4669 (ps-output-string "")))
319acba0 4670 (ps-output "]\n"))
12d89a2e 4671
319acba0
GM
4672(defun ps-generate-header (name fonttag0 fonttag1 contents)
4673 (ps-output "/" name "[\n")
4674 (and contents (> ps-header-lines 0)
4675 (let ((count 1))
4676 (ps-generate-header-line fonttag0 (car contents))
4677 (while (and (< count ps-header-lines)
4678 (setq contents (cdr contents)))
4679 (ps-generate-header-line fonttag1 (car contents))
4680 (setq count (1+ count)))))
4681 (ps-output "]def\n"))
12d89a2e 4682
bc0d41bd 4683
6e1b1da6
GM
4684(defun ps-output-boolean (name bool)
4685 (ps-output (format "/%s %s def\n" name (if bool "true" "false"))))
ef2cbb24 4686
06fb6aab 4687
319acba0
GM
4688(defun ps-output-frame-properties (name alist)
4689 (ps-output "/" name " ["
efa89c1f 4690 (ps-format-color (cdr (assq 'fore-color alist)) 0.0)
319acba0
GM
4691 (ps-format-color (cdr (assq 'back-color alist)) 0.9)
4692 (ps-float-format (or (cdr (assq 'border-width alist)) 0.4))
efa89c1f
GM
4693 (ps-format-color (cdr (assq 'border-color alist)) 0.0)
4694 (ps-format-color (cdr (assq 'shadow-color alist)) 0.0)
319acba0
GM
4695 "]def\n"))
4696
4697
87a16a06
RS
4698(defun ps-background-pages (page-list func)
4699 (if page-list
4700 (mapcar
bc0d41bd
KH
4701 #'(lambda (pages)
4702 (let ((start (if (consp pages) (car pages) pages))
4703 (end (if (consp pages) (cdr pages) pages)))
4704 (and (integerp start) (integerp end) (<= start end)
4705 (add-to-list 'ps-background-pages (vector start end func)))))
87a16a06
RS
4706 page-list)
4707 (setq ps-background-all-pages (cons func ps-background-all-pages))))
4708
4709
bc0d41bd
KH
4710(defconst ps-boundingbox-re
4711 "^%%BoundingBox:\
4712\\s-+\\([0-9.]+\\)\\s-+\\([0-9.]+\\)\\s-+\\([0-9.]+\\)\\s-+\\([0-9.]+\\)")
4713
4714
87a16a06
RS
4715(defun ps-get-boundingbox ()
4716 (save-excursion
4717 (set-buffer ps-spool-buffer)
4718 (save-excursion
bc0d41bd 4719 (if (re-search-forward ps-boundingbox-re nil t)
87a16a06
RS
4720 (vector (string-to-number ; lower x
4721 (buffer-substring (match-beginning 1) (match-end 1)))
4722 (string-to-number ; lower y
4723 (buffer-substring (match-beginning 2) (match-end 2)))
4724 (string-to-number ; upper x
4725 (buffer-substring (match-beginning 3) (match-end 3)))
4726 (string-to-number ; upper y
4727 (buffer-substring (match-beginning 4) (match-end 4))))
4728 (vector 0 0 0 0)))))
4729
4730
87a16a06
RS
4731(defun ps-float-format (value &optional default)
4732 (let ((literal (or value default)))
efa89c1f
GM
4733 (cond ((null literal)
4734 " ")
4735 ((numberp literal)
4736 (format ps-float-format (* literal 1.0))) ; force float number
4737 (t
4738 (format "%s " literal))
4739 )))
87a16a06
RS
4740
4741
4742(defun ps-background-text ()
4743 (mapcar
bc0d41bd
KH
4744 #'(lambda (text)
4745 (setq ps-background-text-count (1+ ps-background-text-count))
c3d6d211 4746 (ps-output (format "/ShowBackText-%d{\n" ps-background-text-count))
bc0d41bd
KH
4747 (ps-output-string (nth 0 text)) ; text
4748 (ps-output
4749 "\n"
4750 (ps-float-format (nth 4 text) 200.0) ; font size
4751 (format "/%s " (or (nth 3 text) "Times-Roman")) ; font name
4752 (ps-float-format (nth 6 text)
4753 "PrintHeight PrintPageWidth atan") ; rotation
4754 (ps-float-format (nth 5 text) 0.85) ; gray
4755 (ps-float-format (nth 1 text) "0") ; x position
8e234846 4756 (ps-float-format (nth 2 text) "0") ; y position
c3d6d211 4757 "\nShowBackText}def\n")
bc0d41bd
KH
4758 (ps-background-pages (nthcdr 7 text) ; page list
4759 (format "ShowBackText-%d\n"
4760 ps-background-text-count)))
87a16a06
RS
4761 ps-print-background-text))
4762
4763
4764(defun ps-background-image ()
4765 (mapcar
bc0d41bd
KH
4766 #'(lambda (image)
4767 (let ((image-file (expand-file-name (nth 0 image))))
41481e4b
KH
4768 (when (file-readable-p image-file)
4769 (setq ps-background-image-count (1+ ps-background-image-count))
4770 (ps-output
c3d6d211 4771 (format "/ShowBackImage-%d{\n--back-- "
41481e4b
KH
4772 ps-background-image-count)
4773 (ps-float-format (nth 5 image) 0.0) ; rotation
4774 (ps-float-format (nth 3 image) 1.0) ; x scale
4775 (ps-float-format (nth 4 image) 1.0) ; y scale
4776 (ps-float-format (nth 1 image) ; x position
4777 "PrintPageWidth 2 div")
4778 (ps-float-format (nth 2 image) ; y position
4779 "PrintHeight 2 div BottomMargin add")
4780 "\nBeginBackImage\n")
4781 (ps-insert-file image-file)
01cdabc6 4782 ;; coordinate adjustment to center image
41481e4b
KH
4783 ;; around x and y position
4784 (let ((box (ps-get-boundingbox)))
4785 (save-excursion
4786 (set-buffer ps-spool-buffer)
4787 (save-excursion
4788 (if (re-search-backward "^--back--" nil t)
4789 (replace-match
4790 (format "%s %s"
4791 (ps-float-format
4792 (- (+ (/ (- (aref box 2) (aref box 0)) 2.0)
4793 (aref box 0))))
4794 (ps-float-format
4795 (- (+ (/ (- (aref box 3) (aref box 1)) 2.0)
4796 (aref box 1)))))
4797 t)))))
c3d6d211 4798 (ps-output "\nEndBackImage}def\n")
41481e4b
KH
4799 (ps-background-pages (nthcdr 6 image) ; page list
4800 (format "ShowBackImage-%d\n"
4801 ps-background-image-count)))))
87a16a06
RS
4802 ps-print-background-image))
4803
4804
a18ed129 4805(defun ps-background (page-number)
87a16a06 4806 (let (has-local-background)
bc0d41bd
KH
4807 (mapcar #'(lambda (range)
4808 (and (<= (aref range 0) page-number)
4809 (<= page-number (aref range 1))
4810 (if has-local-background
4811 (ps-output (aref range 2))
4812 (setq has-local-background t)
c3d6d211 4813 (ps-output "/printLocalBackground{\n"
bc0d41bd 4814 (aref range 2)))))
87a16a06 4815 ps-background-pages)
c3d6d211 4816 (and has-local-background (ps-output "}def\n"))))
87a16a06
RS
4817
4818
0140c600
EZ
4819;; Return a list of the distinct elements of LIST.
4820;; Elements are compared with `equal'.
4821(defun ps-remove-duplicates (list)
4822 (let (new (tail list))
4823 (while tail
4824 (or (member (car tail) new)
4825 (setq new (cons (car tail) new)))
4826 (setq tail (cdr tail)))
4827 (nreverse new)))
4828
c82b4a75 4829
6bdb808e
RS
4830;; Find the first occurrence of ITEM in LIST.
4831;; Return the index of the matching item, or nil if not found.
4832;; Elements are compared with `eq'.
7ae35a2f 4833(defun ps-alist-position (item list)
6bdb808e
RS
4834 (let ((tail list) (index 0) found)
4835 (while tail
7ae35a2f 4836 (if (setq found (eq (car (car tail)) item))
6bdb808e
RS
4837 (setq tail nil)
4838 (setq index (1+ index)
4839 tail (cdr tail))))
4840 (and found index)))
4841
4842
bc0d41bd
KH
4843(defconst ps-n-up-database
4844 '((a4
4845 (1 nil 1 1 0)
4846 (2 t 1 2 0)
4847 (4 nil 2 2 0)
4848 (6 t 2 3 1)
4849 (8 t 2 4 0)
4850 (9 nil 3 3 0)
4851 (12 t 3 4 2)
4852 (16 nil 4 4 0)
4853 (18 t 3 6 0)
4854 (20 nil 5 4 1)
4855 (25 nil 5 5 0)
4856 (30 nil 6 5 1)
4857 (32 t 4 8 0)
4858 (36 nil 6 6 0)
4859 (42 nil 7 6 1)
4860 (49 nil 7 7 0)
4861 (50 t 5 10 0)
4862 (56 nil 8 7 1)
4863 (64 nil 8 8 0)
4864 (72 nil 9 8 1)
4865 (81 nil 9 9 0)
4866 (90 nil 10 9 1)
4867 (100 nil 10 10 0))
4868 (a3
4869 (1 nil 1 1 0)
4870 (2 t 1 2 0)
4871 (4 nil 2 2 0)
4872 (6 t 2 3 1)
4873 (8 t 2 4 0)
4874 (9 nil 3 3 0)
4875 (12 nil 4 3 1)
4876 (16 nil 4 4 0)
4877 (18 t 3 6 0)
4878 (20 nil 5 4 1)
4879 (25 nil 5 5 0)
4880 (30 nil 6 5 1)
4881 (32 t 4 8 0)
4882 (36 nil 6 6 0)
4883 (42 nil 7 6 1)
4884 (49 nil 7 7 0)
4885 (50 t 5 10 0)
4886 (56 nil 8 7 1)
4887 (64 nil 8 8 0)
4888 (72 nil 9 8 1)
4889 (81 nil 9 9 0)
4890 (90 nil 10 9 1)
4891 (100 nil 10 10 0))
4892 (letter
4893 (1 nil 1 1 0)
8e234846 4894 (2 t 1 2 0) ; adjusted by PostScript code
bc0d41bd
KH
4895 (4 nil 2 2 0)
4896 (6 t 2 3 0)
4897 (9 nil 3 3 0)
4898 (12 nil 4 3 1)
4899 (16 nil 4 4 0)
4900 (20 nil 5 4 1)
4901 (25 nil 5 5 0)
4902 (30 nil 6 5 1)
4903 (36 nil 6 6 0)
4904 (40 t 5 8 0)
4905 (42 nil 7 6 1)
4906 (49 nil 7 7 0)
4907 (56 nil 8 7 1)
4908 (64 nil 8 8 0)
4909 (72 nil 9 8 1)
4910 (81 nil 9 9 0)
4911 (90 nil 10 9 1)
4912 (100 nil 10 10 0))
4913 (legal
4914 (1 nil 1 1 0)
4915 (2 t 1 2 0)
4916 (4 nil 2 2 0)
4917 (6 nil 3 2 1)
4918 (9 nil 3 3 0)
4919 (10 t 2 5 0)
4920 (12 nil 4 3 1)
4921 (16 nil 4 4 0)
4922 (20 nil 5 4 1)
4923 (25 nil 5 5 0)
4924 (30 nil 6 5 1)
4925 (36 nil 6 6 0)
4926 (42 nil 7 6 1)
4927 (49 nil 7 7 0)
4928 (56 nil 8 7 1)
4929 (64 nil 8 8 0)
4930 (70 t 5 14 0)
4931 (72 nil 9 8 1)
4932 (81 nil 9 9 0)
4933 (90 nil 10 9 1)
4934 (100 nil 10 10 0))
4935 (letter-small
4936 (1 nil 1 1 0)
8e234846 4937 (2 t 1 2 0) ; adjusted by PostScript code
bc0d41bd
KH
4938 (4 nil 2 2 0)
4939 (6 t 2 3 0)
4940 (9 nil 3 3 0)
4941 (12 t 3 4 1)
4942 (15 t 3 5 0)
4943 (16 nil 4 4 0)
4944 (20 nil 5 4 1)
4945 (25 nil 5 5 0)
4946 (28 t 4 7 0)
4947 (30 nil 6 5 1)
4948 (36 nil 6 6 0)
4949 (40 t 5 8 0)
4950 (42 nil 7 6 1)
4951 (49 nil 7 7 0)
4952 (56 nil 8 7 1)
4953 (60 t 6 10 0)
4954 (64 nil 8 8 0)
4955 (72 ni 9 8 1)
4956 (81 nil 9 9 0)
4957 (84 t 7 12 0)
4958 (90 nil 10 9 1)
4959 (100 nil 10 10 0))
4960 (tabloid
4961 (1 nil 1 1 0)
4962 (2 t 1 2 0)
4963 (4 nil 2 2 0)
4964 (6 t 2 3 1)
4965 (8 t 2 4 0)
4966 (9 nil 3 3 0)
4967 (12 nil 4 3 1)
4968 (16 nil 4 4 0)
4969 (20 nil 5 4 1)
4970 (25 nil 5 5 0)
4971 (30 nil 6 5 1)
4972 (36 nil 6 6 0)
4973 (42 nil 7 6 1)
4974 (49 nil 7 7 0)
4975 (56 nil 8 7 1)
4976 (64 nil 8 8 0)
4977 (72 nil 9 8 1)
4978 (81 nil 9 9 0)
4979 (84 t 6 14 0)
4980 (90 nil 10 9 1)
4981 (100 nil 10 10 0))
4982 ;; Ledger paper size is a special case, it is the only paper size where the
4983 ;; normal size is landscaped, that is, the height is smaller than width.
4984 ;; So, we use the special value `pag' in the `landscape' field.
4985 (ledger
4986 (1 nil 1 1 0)
4987 (2 pag 1 2 0)
4988 (4 nil 2 2 0)
4989 (6 pag 2 3 1)
4990 (8 pag 2 4 0)
4991 (9 nil 3 3 0)
4992 (12 nil 4 3 1)
4993 (16 nil 4 4 0)
4994 (20 nil 5 4 1)
4995 (25 nil 5 5 0)
4996 (30 nil 6 5 1)
4997 (36 nil 6 6 0)
4998 (42 nil 7 6 1)
4999 (49 nil 7 7 0)
5000 (56 nil 8 7 1)
5001 (64 nil 8 8 0)
5002 (72 nil 9 8 1)
5003 (81 nil 9 9 0)
5004 (84 pag 6 14 0)
5005 (90 nil 10 9 1)
5006 (100 nil 10 10 0))
5007 (statement
5008 (1 nil 1 1 0)
5009 (2 t 1 2 0)
5010 (4 nil 2 2 0)
5011 (6 nil 3 2 1)
5012 (9 nil 3 3 0)
5013 (10 t 2 5 0)
5014 (12 nil 4 3 1)
5015 (16 nil 4 4 0)
5016 (20 nil 5 4 1)
5017 (21 t 3 7 0)
5018 (25 nil 5 5 0)
5019 (30 nil 6 5 1)
5020 (36 nil 6 6 0)
5021 (40 t 4 10 0)
5022 (42 nil 7 6 1)
5023 (49 nil 7 7 0)
5024 (56 nil 8 7 1)
5025 (60 t 5 12 0)
5026 (64 nil 8 8 0)
5027 (72 nil 9 8 1)
5028 (81 nil 9 9 0)
5029 (90 nil 10 9 1)
5030 (100 nil 10 10 0))
5031 (executive
5032 (1 nil 1 1 0)
8e234846 5033 (2 t 1 2 0) ; adjusted by PostScript code
bc0d41bd
KH
5034 (4 nil 2 2 0)
5035 (6 t 2 3 0)
5036 (9 nil 3 3 0)
5037 (12 nil 4 3 1)
5038 (16 nil 4 4 0)
5039 (20 nil 5 4 1)
5040 (25 nil 5 5 0)
5041 (28 t 4 7 0)
5042 (30 nil 6 5 1)
5043 (36 nil 6 6 0)
5044 (42 nil 7 6 1)
5045 (45 t 5 9 0)
5046 (49 nil 7 7 0)
5047 (56 nil 8 7 1)
5048 (60 t 6 10 0)
5049 (64 nil 8 8 0)
5050 (72 nil 9 8 1)
5051 (81 nil 9 9 0)
5052 (84 t 7 12 0)
5053 (90 nil 10 9 1)
5054 (100 nil 10 10 0))
5055 (a4small
5056 (1 nil 1 1 0)
5057 (2 t 1 2 0)
5058 (4 nil 2 2 0)
5059 (6 t 2 3 1)
5060 (8 t 2 4 0)
5061 (9 nil 3 3 0)
5062 (12 nil 4 3 1)
5063 (16 nil 4 4 0)
5064 (18 t 3 6 0)
5065 (20 nil 5 4 1)
5066 (25 nil 5 5 0)
5067 (30 nil 6 5 1)
5068 (32 t 4 8 0)
5069 (36 nil 6 6 0)
5070 (42 nil 7 6 1)
5071 (49 nil 7 7 0)
5072 (50 t 5 10 0)
5073 (56 nil 8 7 1)
5074 (64 nil 8 8 0)
5075 (72 nil 9 8 1)
5076 (78 t 6 13 0)
5077 (81 nil 9 9 0)
5078 (90 nil 10 9 1)
5079 (100 nil 10 10 0))
5080 (b4
5081 (1 nil 1 1 0)
5082 (2 t 1 2 0)
5083 (4 nil 2 2 0)
5084 (6 t 2 3 1)
5085 (8 t 2 4 0)
5086 (9 nil 3 3 0)
5087 (12 nil 4 3 1)
5088 (16 nil 4 4 0)
5089 (18 t 3 6 0)
5090 (20 nil 5 4 1)
5091 (25 nil 5 5 0)
5092 (30 nil 6 5 1)
5093 (32 t 4 8 0)
5094 (36 nil 6 6 0)
5095 (42 nil 7 6 1)
5096 (49 nil 7 7 0)
5097 (50 t 5 10 0)
5098 (56 nil 8 7 1)
5099 (64 nil 8 8 0)
5100 (72 nil 9 8 1)
5101 (81 nil 9 9 0)
5102 (90 nil 10 9 1)
5103 (100 nil 10 10 0))
5104 (b5
5105 (1 nil 1 1 0)
5106 (2 t 1 2 0)
5107 (4 nil 2 2 0)
5108 (6 t 2 3 1)
5109 (8 t 2 4 0)
5110 (9 nil 3 3 0)
5111 (12 nil 4 3 1)
5112 (16 nil 4 4 0)
5113 (18 t 3 6 0)
5114 (20 nil 5 4 1)
5115 (25 nil 5 5 0)
5116 (30 nil 6 5 1)
5117 (32 t 4 8 0)
5118 (36 nil 6 6 0)
5119 (42 nil 7 6 1)
5120 (49 nil 7 7 0)
5121 (50 t 5 10 0)
5122 (56 nil 8 7 1)
5123 (64 nil 8 8 0)
5124 (72 nil 9 8 0)
5125 (81 nil 9 9 0)
5126 (90 nil 10 9 1)
5127 (98 t 7 14 0)
5128 (100 nil 10 10 0)))
5129 "Alist which is the page matrix database used for N-up printing.
5130
5131Each element has the following form:
5132
5133 (PAGE
5134 (MAX LANDSCAPE LINES COLUMNS COL-MISSING)
5135 ...)
5136
5137Where:
5138PAGE is the page size used (see `ps-paper-type').
5139MAX is the maximum elements of this page matrix.
5140LANDSCAPE specifies if page matrix is landscaped, has the following valid
5141 values:
5142 nil the sheet is in portrait mode.
5143 t the sheet is in landscape mode.
5144 pag the sheet is in portrait mode and page is in landscape mode.
5145LINES is the number of lines of page matrix.
5146COLUMNS is the number of columns of page matrix.
5147COL-MISSING is the number of columns missing to fill the sheet.")
5148
5149
5150(defmacro ps-n-up-landscape (mat) `(nth 1 ,mat))
5151(defmacro ps-n-up-lines (mat) `(nth 2 ,mat))
5152(defmacro ps-n-up-columns (mat) `(nth 3 ,mat))
5153(defmacro ps-n-up-missing (mat) `(nth 4 ,mat))
5154
5155
5156(defun ps-n-up-printing ()
5157 ;; force `ps-n-up-printing' be in range 1 to 100.
5158 (setq ps-n-up-printing (max (min ps-n-up-printing 100) 1))
5159 ;; find suitable page matrix for a given `ps-paper-type'.
5160 (let ((the-list (cdr (assq ps-paper-type ps-n-up-database))))
5161 (and the-list
5162 (while (> ps-n-up-printing (caar the-list))
5163 (setq the-list (cdr the-list))))
5164 (car the-list)))
5165
5166
5167(defconst ps-n-up-filling-database
5168 '((left-top
5169 "PageWidth" ; N-Up-XColumn
5170 "0" ; N-Up-YColumn
5171 "N-Up-End 1 sub PageWidth mul neg" ; N-Up-XLine
5172 "LandscapePageHeight neg" ; N-Up-YLine
5173 "N-Up-Lines" ; N-Up-Repeat
5174 "N-Up-Columns" ; N-Up-End
5175 "0" ; N-Up-XStart
5176 "0") ; N-Up-YStart
5177 (left-bottom
5178 "PageWidth" ; N-Up-XColumn
5179 "0" ; N-Up-YColumn
5180 "N-Up-End 1 sub PageWidth mul neg" ; N-Up-XLine
5181 "LandscapePageHeight" ; N-Up-YLine
5182 "N-Up-Lines" ; N-Up-Repeat
5183 "N-Up-Columns" ; N-Up-End
5184 "0" ; N-Up-XStart
5185 "N-Up-Repeat 1 sub LandscapePageHeight mul neg") ; N-Up-YStart
5186 (right-top
5187 "PageWidth neg" ; N-Up-XColumn
5188 "0" ; N-Up-YColumn
5189 "N-Up-End 1 sub PageWidth mul" ; N-Up-XLine
5190 "LandscapePageHeight neg" ; N-Up-YLine
5191 "N-Up-Lines" ; N-Up-Repeat
5192 "N-Up-Columns" ; N-Up-End
5193 "N-Up-End 1 sub PageWidth mul" ; N-Up-XStart
5194 "0") ; N-Up-YStart
5195 (right-bottom
5196 "PageWidth neg" ; N-Up-XColumn
5197 "0" ; N-Up-YColumn
5198 "N-Up-End 1 sub PageWidth mul" ; N-Up-XLine
5199 "LandscapePageHeight" ; N-Up-YLine
5200 "N-Up-Lines" ; N-Up-Repeat
5201 "N-Up-Columns" ; N-Up-End
5202 "N-Up-End 1 sub PageWidth mul" ; N-Up-XStart
5203 "N-Up-Repeat 1 sub LandscapePageHeight mul neg") ; N-Up-YStart
5204 (top-left
5205 "0" ; N-Up-XColumn
5206 "LandscapePageHeight neg" ; N-Up-YColumn
5207 "PageWidth" ; N-Up-XLine
5208 "N-Up-End 1 sub LandscapePageHeight mul" ; N-Up-YLine
5209 "N-Up-Columns" ; N-Up-Repeat
5210 "N-Up-Lines" ; N-Up-End
5211 "0" ; N-Up-XStart
5212 "0") ; N-Up-YStart
5213 (bottom-left
5214 "0" ; N-Up-XColumn
5215 "LandscapePageHeight" ; N-Up-YColumn
5216 "PageWidth" ; N-Up-XLine
5217 "N-Up-End 1 sub LandscapePageHeight mul neg" ; N-Up-YLine
5218 "N-Up-Columns" ; N-Up-Repeat
5219 "N-Up-Lines" ; N-Up-End
5220 "0" ; N-Up-XStart
5221 "N-Up-End 1 sub LandscapePageHeight mul neg") ; N-Up-YStart
5222 (top-right
5223 "0" ; N-Up-XColumn
5224 "LandscapePageHeight neg" ; N-Up-YColumn
5225 "PageWidth neg" ; N-Up-XLine
5226 "N-Up-End 1 sub LandscapePageHeight mul" ; N-Up-YLine
5227 "N-Up-Columns" ; N-Up-Repeat
5228 "N-Up-Lines" ; N-Up-End
5229 "N-Up-Repeat 1 sub PageWidth mul" ; N-Up-XStart
5230 "0") ; N-Up-YStart
5231 (bottom-right
5232 "0" ; N-Up-XColumn
5233 "LandscapePageHeight" ; N-Up-YColumn
5234 "PageWidth neg" ; N-Up-XLine
5235 "N-Up-End 1 sub LandscapePageHeight mul neg" ; N-Up-YLine
5236 "N-Up-Columns" ; N-Up-Repeat
5237 "N-Up-Lines" ; N-Up-End
5238 "N-Up-Repeat 1 sub PageWidth mul" ; N-Up-XStart
5239 "N-Up-End 1 sub LandscapePageHeight mul neg")) ; N-Up-YStart
5240 "Alist for n-up printing initializations.
5241
5242Each element has the following form:
5243
5244 (KIND XCOL YCOL XLIN YLIN REPEAT END XSTART YSTART)
5245
5246Where:
5247KIND is a valid value of `ps-n-up-filling'.
5248XCOL YCOL are the relative position for the next column.
5249XLIN YLIN are the relative position for the beginning of next line.
5250REPEAT is the number of repetions for external loop.
5251END is the number of repetions for internal loop and also the number of pages in
5252 a row.
5253XSTART YSTART are the relative position for the first page in a sheet.")
5254
5255
5256(defun ps-n-up-filling ()
5257 (cdr (or (assq ps-n-up-filling ps-n-up-filling-database)
5258 (assq 'left-top ps-n-up-filling-database))))
5259
5260
5261(defmacro ps-n-up-xcolumn (init) `(nth 0 ,init))
5262(defmacro ps-n-up-ycolumn (init) `(nth 1 ,init))
5263(defmacro ps-n-up-xline (init) `(nth 2 ,init))
5264(defmacro ps-n-up-yline (init) `(nth 3 ,init))
5265(defmacro ps-n-up-repeat (init) `(nth 4 ,init))
5266(defmacro ps-n-up-end (init) `(nth 5 ,init))
5267(defmacro ps-n-up-xstart (init) `(nth 6 ,init))
5268(defmacro ps-n-up-ystart (init) `(nth 7 ,init))
5269
5270
66e63857
GM
5271(defconst ps-error-handler-alist
5272 '((none . 0)
5273 (paper . 1)
5274 (system . 2)
5275 (paper-and-system . 3))
2bd80d73
GM
5276 "Alist for error handler message.")
5277
5278
5279(defconst ps-zebra-stripe-alist
5280 '((follow . 1)
5281 (full . 2)
5282 (full-follow . 3))
5283 "Alist for zebra stripe continuation.")
66e63857
GM
5284
5285
ef2cbb24 5286(defun ps-begin-file ()
7bb054a5 5287 (setq ps-page-order 0
4b3eb10f 5288 ps-page-printed 0
87a16a06
RS
5289 ps-background-text-count 0
5290 ps-background-image-count 0
5291 ps-background-pages nil
5292 ps-background-all-pages nil)
12d89a2e 5293
bc0d41bd
KH
5294 (let ((dimensions (cdr (assq ps-paper-type ps-page-dimensions-database)))
5295 (tumble (if ps-landscape-mode (not ps-spool-tumble) ps-spool-tumble))
5296 (n-up (ps-n-up-printing))
5297 (n-up-filling (ps-n-up-filling)))
98f2fbe7 5298 (and ps-n-up-on (setq tumble (not tumble)))
bc0d41bd
KH
5299 (ps-output
5300 ps-adobe-tag
5301 "%%Title: " (buffer-name) ; Take job name from name of
8bd22fcf 5302 ; first buffer printed
9586e1d3
VJL
5303 "\n%%Creator: ps-print v" ps-print-version
5304 "\n%%For: " (user-full-name)
5305 "\n%%CreationDate: " (format-time-string "%T %b %d %Y")
bc0d41bd
KH
5306 "\n%%Orientation: "
5307 (if ps-landscape-mode "Landscape" "Portrait")
5308 "\n%%DocumentNeededResources: font Times-Roman Times-Italic\n%%+ font "
5309 (mapconcat 'identity
5310 (ps-remove-duplicates
5311 (append (ps-fonts 'ps-font-for-text)
5312 (list (ps-font 'ps-font-for-header 'normal)
9586e1d3
VJL
5313 (ps-font 'ps-font-for-header 'bold)
5314 (ps-font 'ps-font-for-footer 'normal)
5315 (ps-font 'ps-font-for-footer 'bold))))
bc0d41bd 5316 "\n%%+ font ")
9586e1d3 5317 "\n%%DocumentSuppliedResources: procset PSPrintUserDefinedPrologue-" (user-login-name) " 0 0"
bc0d41bd
KH
5318 "\n%%DocumentMedia: " (ps-page-dimensions-get-media dimensions)
5319 (format " %d" (round (ps-page-dimensions-get-width dimensions)))
5320 (format " %d" (round (ps-page-dimensions-get-height dimensions)))
5321 " 0 () ()\n%%PageOrder: Ascend\n%%Pages: (atend)\n%%Requirements:"
5322 (if ps-spool-duplex
8e234846 5323 (if tumble " duplex(tumble)\n" " duplex\n")
bc0d41bd
KH
5324 "\n"))
5325
66e63857 5326 (ps-insert-string ps-print-prologue-header)
bc0d41bd 5327
8e234846
GM
5328 (ps-output "%%EndComments\n%%BeginDefaults\n%%PageMedia: "
5329 (ps-page-dimensions-get-media dimensions)
6bf5fb46 5330 "\n%%EndDefaults\n\n%%BeginProlog\n\n"
6e1b1da6
GM
5331 "/languagelevel where{pop}{/languagelevel 1 def}ifelse\n"
5332 (format "/ErrorMessage %s def\n\n"
66e63857
GM
5333 (or (cdr (assoc ps-error-handler-message
5334 ps-error-handler-alist))
5335 1)) ; send to paper
5336 ps-print-prologue-0
9586e1d3 5337 "\n%%BeginResource: procset PSPrintUserDefinedPrologue-" (user-login-name) " 0 0\n\n")
66e63857
GM
5338
5339 (ps-insert-string ps-user-defined-prologue)
5340
9586e1d3 5341 (ps-output "\n%%EndResource\n\n")
bc0d41bd 5342
bc0d41bd
KH
5343 (ps-output-boolean "LandscapeMode "
5344 (or ps-landscape-mode
5345 (eq (ps-n-up-landscape n-up) 'pag)))
906d41a7 5346 (ps-output-boolean "UpsideDown " ps-print-upside-down)
bc0d41bd
KH
5347 (ps-output (format "/NumberOfColumns %d def\n" ps-number-of-columns)
5348
5349 (format "/LandscapePageHeight %s def\n" ps-landscape-page-height)
5350 (format "/PrintPageWidth %s def\n"
5351 (- (* (+ ps-print-width ps-inter-column)
5352 ps-number-of-columns)
5353 ps-inter-column))
5354 (format "/PrintWidth %s def\n" ps-print-width)
5355 (format "/PrintHeight %s def\n" ps-print-height)
5356
5357 (format "/LeftMargin %s def\n" ps-left-margin)
5358 (format "/RightMargin %s def\n" ps-right-margin)
5359 (format "/InterColumn %s def\n" ps-inter-column)
5360
5361 (format "/BottomMargin %s def\n" ps-bottom-margin)
5362 (format "/TopMargin %s def\n" ps-top-margin) ; not used
5363 (format "/HeaderOffset %s def\n" ps-header-offset)
319acba0
GM
5364 (format "/HeaderPad %s def\n" ps-header-pad)
5365 (format "/FooterOffset %s def\n" ps-footer-offset)
5366 (format "/FooterPad %s def\n" ps-footer-pad)
5367 (format "/FooterLines %s def\n" ps-footer-lines))
bc0d41bd 5368
319acba0 5369 (ps-output-boolean "ShowNofN " ps-show-n-of-n)
8e234846
GM
5370 (ps-output-boolean "SwitchHeader " (if (eq ps-switch-header 'duplex)
5371 ps-spool-duplex
5372 ps-switch-header))
319acba0
GM
5373 (ps-output-boolean "PrintOnlyOneHeader" ps-print-only-one-header)
5374 (ps-output-boolean "PrintHeader " ps-print-header)
5375 (ps-output-boolean "PrintHeaderFrame " ps-print-header-frame)
5376 (ps-output-frame-properties "HeaderFrameProperties" ps-header-frame-alist)
5377 (ps-output-boolean "PrintFooter " ps-print-footer)
5378 (ps-output-boolean "PrintFooterFrame " ps-print-footer-frame)
5379 (ps-output-frame-properties "FooterFrameProperties" ps-footer-frame-alist)
bc0d41bd
KH
5380
5381 (let ((line-height (ps-line-height 'ps-font-for-text)))
6bf5fb46
GM
5382 (ps-output (format "/LineSpacing %s def\n" ps-line-spacing-internal)
5383 (format "/ParagraphSpacing %s def\n"
5384 ps-paragraph-spacing-internal)
5385 (format "/LineHeight %s def\n" line-height)
2bd80d73 5386 (format "/LinesPerColumn %d def\n"
6bf5fb46
GM
5387 (let ((height (+ line-height
5388 ps-line-spacing-internal)))
5389 (round (/ (+ ps-print-height
5390 (* height 0.45))
5391 height))))))
bc0d41bd 5392
8e234846 5393 (ps-output-boolean "WarnPaperSize " ps-warn-paper-type)
bc0d41bd
KH
5394 (ps-output-boolean "Zebra " ps-zebra-stripes)
5395 (ps-output-boolean "PrintLineNumber " ps-line-number)
906d41a7 5396 (ps-output-boolean "SyncLineZebra " (not (integerp ps-line-number-step)))
2bd80d73
GM
5397 (ps-output (format "/ZebraFollow %d def\n"
5398 (or (cdr (assq ps-zebra-stripe-follow
5399 ps-zebra-stripe-alist))
5400 0))
5401 (format "/PrintLineStep %d def\n"
906d41a7
GM
5402 (if (integerp ps-line-number-step)
5403 ps-line-number-step
98f2fbe7
GM
5404 ps-zebra-stripe-height))
5405 (format "/PrintLineStart %d def\n" ps-line-number-start)
319acba0
GM
5406 "/LineNumberColor "
5407 (ps-format-color ps-line-number-color 0.0)
5408 (format "def\n/ZebraHeight %d def\n"
5409 ps-zebra-stripe-height)
6e1b1da6
GM
5410 "/ZebraColor "
5411 (ps-format-color ps-zebra-color 0.95)
5412 "def\n/BackgroundColor "
e59d29d6 5413 (ps-format-color ps-default-background 1.0)
6e1b1da6 5414 "def\n/UseSetpagedevice "
bc0d41bd 5415 (if (eq ps-spool-config 'setpagedevice)
6e1b1da6
GM
5416 "/setpagedevice where{pop languagelevel 2 eq}{false}ifelse"
5417 "false")
5418 " def\n\n/PageWidth "
bc0d41bd
KH
5419 "PrintPageWidth LeftMargin add RightMargin add def\n\n"
5420 (format "/N-Up %d def\n" ps-n-up-printing))
5421 (ps-output-boolean "N-Up-Landscape" (eq (ps-n-up-landscape n-up) t))
5422 (ps-output-boolean "N-Up-Border " ps-n-up-border-p)
5423 (ps-output (format "/N-Up-Lines %d def\n" (ps-n-up-lines n-up))
5424 (format "/N-Up-Columns %d def\n" (ps-n-up-columns n-up))
5425 (format "/N-Up-Missing %d def\n" (ps-n-up-missing n-up))
6e1b1da6
GM
5426 (format "/N-Up-Margin %s def\n" ps-n-up-margin)
5427 "/N-Up-Repeat "
bc0d41bd
KH
5428 (if ps-landscape-mode
5429 (ps-n-up-end n-up-filling)
5430 (ps-n-up-repeat n-up-filling))
5431 " def\n/N-Up-End "
5432 (if ps-landscape-mode
5433 (ps-n-up-repeat n-up-filling)
5434 (ps-n-up-end n-up-filling))
5435 " def\n/N-Up-XColumn " (ps-n-up-xcolumn n-up-filling)
5436 " def\n/N-Up-YColumn " (ps-n-up-ycolumn n-up-filling)
5437 " def\n/N-Up-XLine " (ps-n-up-xline n-up-filling)
5438 " def\n/N-Up-YLine " (ps-n-up-yline n-up-filling)
5439 " def\n/N-Up-XStart " (ps-n-up-xstart n-up-filling)
5440 " def\n/N-Up-YStart " (ps-n-up-ystart n-up-filling) " def\n")
5441
5442 (ps-background-text)
5443 (ps-background-image)
5444 (setq ps-background-all-pages (nreverse ps-background-all-pages)
5445 ps-background-pages (nreverse ps-background-pages))
5446
47a97a6d
VJL
5447 (ps-output "\n" ps-print-prologue-1
5448 "\n/printGlobalBackground{\n")
7bb054a5 5449 (mapcar 'ps-output ps-background-all-pages)
9586e1d3 5450 (ps-output
47a97a6d
VJL
5451 "}def\n/printLocalBackground{\n}def\n"
5452 "\n%%EndProlog\n\n%%BeginSetup\n"
9586e1d3 5453 "\n%%IncludeResource: font Times-Roman"
47a97a6d
VJL
5454 "\n%%IncludeResource: font Times-Italic"
5455 "\n%%IncludeResource: font "
9586e1d3
VJL
5456 (mapconcat 'identity
5457 (ps-remove-duplicates
5458 (append (ps-fonts 'ps-font-for-text)
5459 (list (ps-font 'ps-font-for-header 'normal)
5460 (ps-font 'ps-font-for-header 'bold)
5461 (ps-font 'ps-font-for-footer 'normal)
5462 (ps-font 'ps-font-for-footer 'bold))))
5463 "\n%%IncludeResource: font ")
47a97a6d
VJL
5464 ;; Header/line number fonts
5465 (format "\n/h0 %s(%s)cvn DefFont\n" ; /h0 14/Helvetica-Bold DefFont
5466 ps-header-title-font-size-internal
5467 (ps-font 'ps-font-for-header 'bold))
5468 (format "/h1 %s(%s)cvn DefFont\n" ; /h1 12/Helvetica DefFont
5469 ps-header-font-size-internal
5470 (ps-font 'ps-font-for-header 'normal))
5471 (format "/L0 %s(%s)cvn DefFont\n" ; /L0 6/Times-Italic DefFont
5472 (ps-get-font-size 'ps-line-number-font-size)
5473 ps-line-number-font)
5474 (format "/H0 %s(%s)cvn DefFont\n" ; /H0 12/Helvetica DefFont
5475 ps-footer-font-size-internal
5476 (ps-font 'ps-font-for-footer 'normal))
5477 "\n\n% ---- These lines must be kept together because...
6bf5fb46
GM
5478
5479/h0 F
5480/HeaderTitleLineHeight FontHeight def
5481
5482/h1 F
5483/HeaderLineHeight FontHeight def
5484/HeaderDescent Descent def
5485
319acba0
GM
5486/H0 F
5487/FooterLineHeight FontHeight def
5488/FooterDescent Descent def
5489
6bf5fb46 5490% ---- ...because `F' has a side-effect on `FontHeight' and `Descent'\n\n")
bc0d41bd
KH
5491
5492 ;; Text fonts
5493 (let ((font (ps-font-alist 'ps-font-for-text))
5494 (i 0))
5495 (while font
c3d6d211 5496 (ps-output (format "/f%d %s(%s)cvn DefFont\n"
bc0d41bd
KH
5497 i
5498 ps-font-size-internal
5499 (ps-font 'ps-font-for-text (car (car font)))))
5500 (setq font (cdr font)
5501 i (1+ i))))
5502
5503 (let ((font-entry (cdr (assq ps-font-family ps-font-info-database))))
5504 (ps-output (format "/SpaceWidthRatio %f def\n"
5505 (/ (ps-lookup 'space-width) (ps-lookup 'size)))))
5506
bc0d41bd
KH
5507 (unless (eq ps-spool-config 'lpr-switches)
5508 (ps-output "\n%%BeginFeature: *Duplex "
5509 (ps-boolean-capitalized ps-spool-duplex)
5510 " *Tumble "
5511 (ps-boolean-capitalized tumble)
c3d6d211
GM
5512 "\nUseSetpagedevice\n{BMark/Duplex "
5513 (ps-boolean-constant ps-spool-duplex)
5514 "/Tumble "
5515 (ps-boolean-constant tumble)
5516 " EMark setpagedevice}\n{statusdict begin "
5517 (ps-boolean-constant ps-spool-duplex)
5518 " setduplexmode "
5519 (ps-boolean-constant tumble)
5520 " settumble end}ifelse\n%%EndFeature\n")))
8e234846
GM
5521 (ps-output "\n%%BeginFeature: *ManualFeed "
5522 (ps-boolean-capitalized ps-manual-feed)
5523 "\nBMark /ManualFeed "
5524 (ps-boolean-constant ps-manual-feed)
ef1159c2 5525 " EMark setpagedevice\n%%EndFeature\n\nBeginDoc\n%%EndSetup\n")
47d2ac75 5526 (and ps-banner-page-when-duplexing
98f2fbe7 5527 (ps-output "\n%%Page: banner 0\nsave showpage restore\n")))
bc0d41bd
KH
5528
5529
6e1b1da6
GM
5530(defun ps-format-color (color &optional default)
5531 (let ((the-color (if (stringp color)
5532 (ps-color-scale color)
5533 color)))
5534 (if (and the-color (listp the-color))
5535 (concat "["
5536 (format ps-color-format
efa89c1f
GM
5537 (* (nth 0 the-color) 1.0) ; force float number
5538 (* (nth 1 the-color) 1.0) ; force float number
5539 (* (nth 2 the-color) 1.0)) ; force float number
6e1b1da6
GM
5540 "] ")
5541 (ps-float-format (if (numberp the-color) the-color default)))))
5542
5543
66e63857
GM
5544(defun ps-insert-string (prologue)
5545 (let ((str (if (functionp prologue)
5546 (funcall prologue)
5547 prologue)))
5548 (and (stringp str)
5549 (ps-output str))))
5550
5551
bc0d41bd
KH
5552(defun ps-boolean-capitalized (bool)
5553 (if bool "True" "False"))
5554
ef2cbb24 5555
8e234846
GM
5556(defun ps-boolean-constant (bool)
5557 (if bool "true" "false"))
5558
5559
12d89a2e
RS
5560(defun ps-header-dirpart ()
5561 (let ((fname (buffer-file-name)))
5562 (if fname
5563 (if (string-equal (buffer-name) (file-name-nondirectory fname))
68e684a0 5564 (abbreviate-file-name (file-name-directory fname))
12d89a2e
RS
5565 fname)
5566 "")))
ef2cbb24 5567
bc0d41bd 5568
12d89a2e 5569(defun ps-get-buffer-name ()
bcc0d457
RS
5570 (cond
5571 ;; Indulge Jim this little easter egg:
5572 ((string= (buffer-name) "ps-print.el")
5573 "Hey, Cool! It's ps-print.el!!!")
5574 ;; Indulge Jack this other little easter egg:
5575 ((string= (buffer-name) "sokoban.el")
5576 "Super! C'est sokoban.el!")
87a16a06 5577 (t (concat
bc0d41bd 5578 (and ps-printing-region-p "Subset of: ")
87a16a06
RS
5579 (buffer-name)
5580 (and (buffer-modified-p) " (unsaved)")))))
ef2cbb24 5581
7d8b7e8e 5582
6bf5fb46
GM
5583(defun ps-get-size (size mess &optional arg)
5584 (let ((siz (cond ((numberp size)
5585 size)
5586 ((and (consp size)
5587 (numberp (car size))
5588 (numberp (cdr size)))
5589 (if ps-landscape-mode
5590 (car size)
5591 (cdr size)))
5592 (t
5593 -1))))
5594 (and (< siz 0)
5595 (error "Invalid %s `%S'%s"
5596 mess size
5597 (if arg
5598 (format " for `%S'" arg)
5599 "")))
5600 siz))
5601
5602
7d8b7e8e 5603(defun ps-get-font-size (font-sym)
6bf5fb46 5604 (ps-get-size (symbol-value font-sym) "font size" font-sym))
7d8b7e8e
KH
5605
5606
e59d29d6
VJL
5607(defun ps-rgb-color (color default)
5608 (cond ((and color (listp color) (= (length color) 3)
5609 (let ((cl color)
5610 (ok t) e)
5611 (while (and ok cl)
5612 (setq e (car cl)
5613 cl (cdr cl)
5614 ok (and (floatp e) (<= 0.0 e) (<= e 1.0))))
5615 ok))
5616 color)
5617 ((and (floatp color) (<= 0.0 color) (<= color 1.0))
5618 (list color color color))
319acba0 5619 ((stringp color) (ps-color-scale color))
319acba0
GM
5620 (t (list default default default))
5621 ))
5622
f07bb446 5623(defvar ps-basic-plot-string-function 'ps-basic-plot-string)
319acba0 5624
e85cca87 5625(defun ps-begin-job (genfunc)
1fd9b7fe 5626 ;; prologue files
41481e4b 5627 (or (equal ps-mark-code-directory ps-postscript-code-directory)
c3d6d211
GM
5628 (setq ps-print-prologue-0 (ps-prologue-file 0)
5629 ps-print-prologue-1 (ps-prologue-file 1)
c3d6d211 5630 ps-mark-code-directory ps-postscript-code-directory))
1fd9b7fe
GM
5631 ;; selected pages
5632 (let (new page)
5633 (while ps-selected-pages
5634 (setq page (car ps-selected-pages)
5635 ps-selected-pages (cdr ps-selected-pages))
5636 (cond ((integerp page)
5637 (and (> page 0)
5638 (setq new (cons (cons page page) new))))
5639 ((consp page)
5640 (and (integerp (car page)) (integerp (cdr page))
5641 (> (car page) 0)
5642 (<= (car page) (cdr page))
5643 (setq new (cons page new))))))
5644 (setq ps-selected-pages (sort new #'(lambda (one other)
5645 (< (car one) (car other))))
5646 ps-last-selected-pages ps-selected-pages
5647 ps-first-page nil
5648 ps-last-page nil))
5649 ;; face background
906d41a7
GM
5650 (or (listp ps-use-face-background)
5651 (setq ps-use-face-background t))
1fd9b7fe 5652 ;; line number
906d41a7
GM
5653 (and (integerp ps-line-number-step)
5654 (<= ps-line-number-step 0)
5655 (setq ps-line-number-step 1))
98f2fbe7
GM
5656 (setq ps-n-up-on (> ps-n-up-printing 1)
5657 ps-line-number-start (max 1 (min ps-line-number-start
5658 (if (integerp ps-line-number-step)
5659 ps-line-number-step
5660 ps-zebra-stripe-height))))
1fd9b7fe 5661 ;; spooling buffer
7da17ab6
RS
5662 (save-excursion
5663 (set-buffer ps-spool-buffer)
5664 (goto-char (point-max))
5665 (and (re-search-backward "^%%Trailer$" nil t)
5666 (delete-region (match-beginning 0) (point-max))))
1fd9b7fe 5667 ;; miscellaneous
2bd80d73
GM
5668 (setq ps-zebra-stripe-full-p (memq ps-zebra-stripe-follow
5669 '(full full-follow))
5670 ps-page-postscript 0
7bb054a5
GM
5671 ps-page-sheet 0
5672 ps-page-n-up 0
4b3eb10f 5673 ps-page-column 0
bd7a2e26 5674 ps-lines-printed 0
7bb054a5
GM
5675 ps-print-page-p t
5676 ps-showline-count (car ps-printing-region)
6bf5fb46
GM
5677 ps-line-spacing-internal (ps-get-size ps-line-spacing
5678 "line spacing")
5679 ps-paragraph-spacing-internal (ps-get-size ps-paragraph-spacing
5680 "paragraph spacing")
7d8b7e8e
KH
5681 ps-font-size-internal (ps-get-font-size 'ps-font-size)
5682 ps-header-font-size-internal (ps-get-font-size 'ps-header-font-size)
5683 ps-header-title-font-size-internal
5684 (ps-get-font-size 'ps-header-title-font-size)
319acba0 5685 ps-footer-font-size-internal (ps-get-font-size 'ps-footer-font-size)
857686a6 5686 ps-control-or-escape-regexp
298bfad9
KH
5687 (cond ((eq ps-print-control-characters '8-bit)
5688 (string-as-unibyte "[\000-\037\177-\377]"))
5689 ((eq ps-print-control-characters 'control-8-bit)
5690 (string-as-unibyte "[\000-\037\177-\237]"))
5691 ((eq ps-print-control-characters 'control)
5692 "[\000-\037\177]")
6e1b1da6 5693 (t "[\t\n\f]"))
e59d29d6 5694 ps-default-background (ps-rgb-color
830f437e 5695 (cond
e85cca87
VJL
5696 ((eq genfunc 'ps-generate-postscript)
5697 nil)
830f437e 5698 ((eq ps-default-bg 'frame-parameter)
cf04718a 5699 (ps-frame-parameter nil 'background-color))
830f437e
VJL
5700 ((eq ps-default-bg t)
5701 (ps-face-background-name 'default))
5702 (t
5703 ps-default-bg))
e59d29d6 5704 1.0)
c794a94d 5705 ps-default-foreground (ps-rgb-color
830f437e 5706 (cond
e85cca87
VJL
5707 ((eq genfunc 'ps-generate-postscript)
5708 nil)
830f437e 5709 ((eq ps-default-fg 'frame-parameter)
cf04718a 5710 (ps-frame-parameter nil 'foreground-color))
830f437e
VJL
5711 ((eq ps-default-fg t)
5712 (ps-face-foreground-name 'default))
5713 (t
5714 ps-default-fg))
c794a94d 5715 0.0)
55732434 5716 ps-default-color (and (eq ps-print-color-p t) ps-default-foreground)
6e1b1da6
GM
5717 ps-current-color ps-default-color
5718 ;; Set the color scale. We do it here instead of in the defvar so
5719 ;; that ps-print can be dumped into emacs. This expression can't be
5720 ;; evaluated at dump-time because X isn't initialized.
5721 ps-color-p (and ps-print-color-p (ps-color-device))
5722 ps-print-color-scale (if ps-color-p
5723 (float (car (ps-color-values "white")))
f07bb446
KH
5724 1.0)
5725 ;; Set up default functions. They may be overridden by
5726 ;; ps-mule-begin-job.
5727 ps-basic-plot-string-function 'ps-basic-plot-string
5728 ps-encode-header-string-function nil)
319acba0 5729 ;; initialize page dimensions
e59d29d6
VJL
5730 (ps-get-page-dimensions)
5731 ;; final check
5732 (and ps-color-p
5733 (equal ps-default-background ps-default-foreground)
5734 (error
5735 (concat
5736 "`ps-default-fg' and `ps-default-bg' have the same color.\n"
5737 "Text won't appear on page. Please, check these variables."))))
6e1b1da6 5738
ef2cbb24 5739
ea0c615d
GM
5740(defun ps-page-number ()
5741 (if ps-print-only-one-header
4b3eb10f
GM
5742 (1+ (/ (1- ps-page-column) ps-number-of-columns))
5743 ps-page-column))
87a16a06
RS
5744
5745
319acba0
GM
5746(defsubst ps-end-page ()
5747 (ps-output "EndPage\nEndDSCPage\n"))
5748
5749
5750(defsubst ps-next-page ()
ef2cbb24 5751 (ps-end-page)
12d89a2e
RS
5752 (ps-flush-output)
5753 (ps-begin-page))
5754
bc0d41bd 5755
9dae638c
VJL
5756(defun ps-end-sheet ()
5757 (and ps-print-page-p (> ps-page-sheet 0)
5758 (ps-output "EndSheet\n")))
5759
5760
bc0d41bd
KH
5761(defun ps-header-sheet ()
5762 ;; Print only when a new sheet begins.
9dae638c 5763 (ps-end-sheet)
4b3eb10f
GM
5764 (setq ps-page-sheet (1+ ps-page-sheet))
5765 (when (ps-print-sheet-p)
5766 (setq ps-page-order (1+ ps-page-order))
5767 (ps-output (if ps-n-up-on
5768 (format "\n%%%%Page: (%d \\(%d\\)) %d\n"
5769 ps-page-order ps-page-postscript ps-page-order)
5770 (format "\n%%%%Page: %d %d\n"
5771 ps-page-postscript ps-page-order))
ef1159c2
EZ
5772 ;; spooling needs to redefine Lines and PageCount on each page
5773 "/Lines 0 def\n/PageCount 0 def\n"
4b3eb10f
GM
5774 (format "%d BeginSheet\nBeginDSCPage\n"
5775 ps-n-up-printing))))
ea0c615d
GM
5776
5777
5778(defun ps-header-page ()
7da17ab6
RS
5779 ;; set total line and page number when printing has finished
5780 ;; (see `ps-generate')
4b3eb10f 5781 (if (zerop (mod ps-page-column ps-number-of-columns))
ea0c615d
GM
5782 (progn
5783 (setq ps-page-postscript (1+ ps-page-postscript))
5784 (when (ps-print-page-p)
4b3eb10f 5785 (ps-print-sheet-p)
ea0c615d
GM
5786 (if (zerop (mod ps-page-n-up ps-n-up-printing))
5787 ;; Print only when a new sheet begins.
5788 (progn
5789 (ps-header-sheet)
5790 (run-hooks 'ps-print-begin-sheet-hook))
5791 ;; Print only when a new page begins.
5792 (ps-output "BeginDSCPage\n")
5793 (run-hooks 'ps-print-begin-page-hook))
5794 (ps-background ps-page-postscript)
4b3eb10f
GM
5795 (setq ps-page-n-up (1+ ps-page-n-up))
5796 (and ps-print-page-p
5797 (setq ps-page-printed (1+ ps-page-printed)))))
ea0c615d
GM
5798 ;; Print only when a new column begins.
5799 (ps-output "BeginDSCPage\n")
5800 (run-hooks 'ps-print-begin-column-hook))
4b3eb10f 5801 (setq ps-page-column (1+ ps-page-column)))
a18ed129 5802
8bd22fcf 5803(defun ps-begin-page ()
8bd22fcf 5804 (setq ps-width-remaining ps-print-width
298bfad9 5805 ps-height-remaining ps-print-height)
12d89a2e 5806
a18ed129 5807 (ps-header-page)
12d89a2e 5808
87a16a06 5809 (ps-output (format "/LineNumber %d def\n" ps-showline-count)
ea0c615d 5810 (format "/PageNumber %d def\n" (ps-page-number)))
12d89a2e 5811
090be653 5812 (when ps-print-header
f07bb446
KH
5813 (ps-generate-header "HeaderLinesLeft" "/h0" "/h1" ps-left-header)
5814 (ps-generate-header "HeaderLinesRight" "/h0" "/h1" ps-right-header)
5815 (ps-output (format "%d SetHeaderLines\n" ps-header-lines)))
12d89a2e 5816
319acba0 5817 (when ps-print-footer
f07bb446
KH
5818 (ps-generate-header "FooterLinesLeft" "/H0" "/H0" ps-left-footer)
5819 (ps-generate-header "FooterLinesRight" "/H0" "/H0" ps-right-footer)
5820 (ps-output (format "%d SetFooterLines\n" ps-footer-lines)))
319acba0 5821
bd7a2e26 5822 (ps-output (number-to-string ps-lines-printed) " BeginPage\n")
87a16a06
RS
5823 (ps-set-font ps-current-font)
5824 (ps-set-bg ps-current-bg)
f07bb446 5825 (ps-set-color ps-current-color))
ef2cbb24 5826
319acba0 5827(defsubst ps-skip-newline (limit)
bd7a2e26
GM
5828 (setq ps-showline-count (1+ ps-showline-count)
5829 ps-lines-printed (1+ ps-lines-printed))
5830 (and (< (point) limit)
5831 (forward-char 1)))
5832
6bf5fb46 5833(defsubst ps-next-line ()
bd7a2e26
GM
5834 (setq ps-showline-count (1+ ps-showline-count)
5835 ps-lines-printed (1+ ps-lines-printed))
6bf5fb46
GM
5836 (let* ((paragraph-p (and ps-paragraph-regexp
5837 (looking-at ps-paragraph-regexp)))
5838 (lh (+ (ps-line-height 'ps-font-for-text)
5839 (if paragraph-p
5840 ps-paragraph-spacing-internal
5841 ps-line-spacing-internal))))
12b88fff
RS
5842 (if (< ps-height-remaining lh)
5843 (ps-next-page)
5844 (setq ps-width-remaining ps-print-width
5845 ps-height-remaining (- ps-height-remaining lh))
6bf5fb46 5846 (ps-output (if paragraph-p "PHL\n" "LHL\n")))))
ef2cbb24
RS
5847
5848(defun ps-continue-line ()
bd7a2e26 5849 (setq ps-lines-printed (1+ ps-lines-printed))
6bf5fb46 5850 (let ((lh (+ (ps-line-height 'ps-font-for-text) ps-line-spacing-internal)))
12b88fff
RS
5851 (if (< ps-height-remaining lh)
5852 (ps-next-page)
5853 (setq ps-width-remaining ps-print-width
5854 ps-height-remaining (- ps-height-remaining lh))
5855 (ps-output "SL\n"))))
12d89a2e
RS
5856
5857(defun ps-find-wrappoint (from to char-width)
5858 (let ((avail (truncate (/ ps-width-remaining char-width)))
5859 (todo (- to from)))
5860 (if (< todo avail)
5861 (cons to (* todo char-width))
5862 (cons (+ from avail) ps-width-remaining))))
5863
c86f4619
GM
5864(defun ps-basic-plot-str (from to string)
5865 (let* ((wrappoint (ps-find-wrappoint from to
5866 (ps-avg-char-width 'ps-font-for-text)))
5867 (to (car wrappoint))
5868 (str (substring string from to)))
c86f4619
GM
5869 (ps-output-string str)
5870 (ps-output " S\n")
5871 wrappoint))
5872
12d89a2e 5873(defun ps-basic-plot-string (from to &optional bg-color)
12b88fff
RS
5874 (let* ((wrappoint (ps-find-wrappoint from to
5875 (ps-avg-char-width 'ps-font-for-text)))
12d89a2e 5876 (to (car wrappoint))
298bfad9 5877 (string (buffer-substring-no-properties from to)))
12d89a2e 5878 (ps-output-string string)
bcc0d457 5879 (ps-output " S\n")
12d89a2e
RS
5880 wrappoint))
5881
5882(defun ps-basic-plot-whitespace (from to &optional bg-color)
12b88fff
RS
5883 (let* ((wrappoint (ps-find-wrappoint from to
5884 (ps-space-width 'ps-font-for-text)))
12d89a2e 5885 (to (car wrappoint)))
12d89a2e
RS
5886 (ps-output (format "%d W\n" (- to from)))
5887 wrappoint))
5888
5889(defun ps-plot (plotfunc from to &optional bg-color)
ef2cbb24 5890 (while (< from to)
12d89a2e
RS
5891 (let* ((wrappoint (funcall plotfunc from to bg-color))
5892 (plotted-to (car wrappoint))
5893 (plotted-width (cdr wrappoint)))
8bd22fcf
KH
5894 (setq from plotted-to
5895 ps-width-remaining (- ps-width-remaining plotted-width))
12d89a2e
RS
5896 (if (< from to)
5897 (ps-continue-line))))
ef2cbb24
RS
5898 (if ps-razzle-dazzle
5899 (let* ((q-todo (- (point-max) (point-min)))
12d89a2e 5900 (q-done (- (point) (point-min)))
ef2cbb24 5901 (chunkfrac (/ q-todo 8))
857686a6 5902 (chunksize (min chunkfrac 1000)))
ef2cbb24 5903 (if (> (- q-done ps-razchunk) chunksize)
8bd22fcf 5904 (progn
ef2cbb24 5905 (setq ps-razchunk q-done)
8bd22fcf
KH
5906 (message "Formatting...%3d%%"
5907 (if (< q-todo 100)
5908 (/ (* 100 q-done) q-todo)
5909 (/ q-done (/ q-todo 100)))
5910 ))))))
12d89a2e 5911
298bfad9
KH
5912(defvar ps-last-font nil)
5913
12d89a2e 5914(defun ps-set-font (font)
e65df0a1
KH
5915 (setq ps-last-font (format "f%d" (setq ps-current-font font)))
5916 (ps-output (format "/%s F\n" ps-last-font)))
12d89a2e 5917
12d89a2e
RS
5918(defun ps-set-bg (color)
5919 (if (setq ps-current-bg color)
8bd22fcf
KH
5920 (ps-output (format ps-color-format
5921 (nth 0 color) (nth 1 color) (nth 2 color))
12d89a2e
RS
5922 " true BG\n")
5923 (ps-output "false BG\n")))
5924
5925(defun ps-set-color (color)
6e1b1da6 5926 (setq ps-current-color (or color ps-default-foreground))
8bd22fcf
KH
5927 (ps-output (format ps-color-format
5928 (nth 0 ps-current-color)
043620f4
KH
5929 (nth 1 ps-current-color) (nth 2 ps-current-color))
5930 " FG\n"))
12d89a2e 5931
12d89a2e 5932
c86f4619
GM
5933(defsubst ps-plot-string (string)
5934 (ps-plot 'ps-basic-plot-str 0 (length string) string))
5935
5936
87a16a06 5937(defvar ps-current-effect 0)
12d89a2e 5938
3409eda2
KH
5939(defvar ps-print-translation-table
5940 (let ((tbl (make-char-table 'translation-table nil)))
5941 (if (and (boundp 'ucs-mule-8859-to-mule-unicode)
5942 (char-table-p ucs-mule-8859-to-mule-unicode))
5943 (map-char-table
640477ee 5944 #'(lambda (k v)
3409eda2
KH
5945 (if (and v (eq (char-charset v) 'latin-iso8859-1) (/= k v))
5946 (aset tbl k v)))
5947 ucs-mule-8859-to-mule-unicode))
5948 tbl)
5949 "Translation table for PostScript printing.
5950The default value is a table that translates non-Latin-1 Latin characters
5951to the equivalent Latin-1 characters.")
87a16a06
RS
5952
5953(defun ps-plot-region (from to font &optional fg-color bg-color effects)
efa89c1f 5954 (or (equal font ps-current-font)
12d89a2e 5955 (ps-set-font font))
06fb6aab 5956
12d89a2e
RS
5957 ;; Specify a foreground color only if one's specified and it's
5958 ;; different than the current.
efa89c1f
GM
5959 (let ((fg (or fg-color ps-default-foreground)))
5960 (or (equal fg ps-current-color)
5961 (ps-set-color fg)))
06fb6aab 5962
efa89c1f 5963 (or (equal bg-color ps-current-bg)
12d89a2e 5964 (ps-set-bg bg-color))
06fb6aab 5965
87a16a06
RS
5966 ;; Specify effects (underline, overline, box, etc)
5967 (cond
5968 ((not (integerp effects))
5969 (ps-output "0 EF\n")
5970 (setq ps-current-effect 0))
5971 ((/= effects ps-current-effect)
5972 (ps-output (number-to-string effects) " EF\n")
5973 (setq ps-current-effect effects)))
ef2cbb24 5974
12d89a2e 5975 ;; Starting at the beginning of the specified region...
ef2cbb24
RS
5976 (save-excursion
5977 (goto-char from)
12d89a2e
RS
5978
5979 ;; ...break the region up into chunks separated by tabs, linefeeds,
87a16a06 5980 ;; pagefeeds, control characters, and plot each chunk.
ef2cbb24 5981 (while (< from to)
6bf5fb46
GM
5982 ;; skip lines between cut markers
5983 (and ps-begin-cut-regexp ps-end-cut-regexp
5984 (looking-at ps-begin-cut-regexp)
5985 (progn
5986 (goto-char (match-end 0))
5987 (and (re-search-forward ps-end-cut-regexp to 'noerror)
5988 (= (following-char) ?\n)
5989 (forward-char 1))
5990 (setq from (point))))
857686a6 5991 (if (re-search-forward ps-control-or-escape-regexp to t)
024ced4d 5992 ;; region with some control characters or some multi-byte characters
12b88fff 5993 (let* ((match-point (match-beginning 0))
f07bb446 5994 (match (char-after match-point)))
e65df0a1 5995 (when (< from match-point)
f07bb446
KH
5996 (ps-plot ps-basic-plot-string-function
5997 from match-point bg-color))
857686a6
RS
5998 (cond
5999 ((= match ?\t) ; tab
be415ea7 6000 (let ((linestart (line-beginning-position)))
857686a6
RS
6001 (forward-char -1)
6002 (setq from (+ linestart (current-column)))
e65df0a1 6003 (when (re-search-forward "[ \t]+" to t)
e65df0a1
KH
6004 (ps-plot 'ps-basic-plot-whitespace
6005 from (+ linestart (current-column))
6006 bg-color))))
857686a6
RS
6007
6008 ((= match ?\n) ; newline
bd7a2e26
GM
6009 (if (looking-at "\f[^\n]")
6010 ;; \n\ftext\n ==>> next page, but keep line counting!!
6011 (progn
6012 (ps-skip-newline to)
6013 (ps-next-page))
6014 ;; \n\f\n ==>> it'll be handled by form feed
6015 ;; \ntext\n ==>> next line
6016 (ps-next-line)))
857686a6
RS
6017
6018 ((= match ?\f) ; form feed
12b88fff
RS
6019 ;; do not skip page if previous character is NEWLINE and
6020 ;; it is a beginning of page.
bd7a2e26
GM
6021 (unless (and (equal (char-after (1- match-point)) ?\n)
6022 (= ps-height-remaining ps-print-height))
6023 ;; \f\n ==>> skip \n, but keep line counting!!
6024 (and (equal (following-char) ?\n)
6025 (ps-skip-newline to))
6026 (ps-next-page)))
e65df0a1 6027
857686a6
RS
6028 (t ; characters from 127 to 255
6029 (ps-control-character match)))
87a16a06 6030 (setq from (point)))
f07bb446
KH
6031 ;; region without control characters
6032 (ps-plot ps-basic-plot-string-function from to bg-color)
87a16a06
RS
6033 (setq from to)))))
6034
857686a6
RS
6035(defvar ps-string-control-codes
6036 (let ((table (make-vector 256 nil))
6037 (char ?\000))
6038 ;; control character
6039 (while (<= char ?\037)
6040 (aset table char (format "^%c" (+ char ?@)))
6041 (setq char (1+ char)))
6042 ;; printable character
6043 (while (< char ?\177)
6044 (aset table char (format "%c" char))
6045 (setq char (1+ char)))
6046 ;; DEL
6047 (aset table char "^?")
6048 ;; 8-bit character
6049 (while (<= (setq char (1+ char)) ?\377)
6050 (aset table char (format "\\%o" char)))
6051 table)
6052 "Vector used to map characters to a printable string.")
6053
6054(defun ps-control-character (char)
6055 (let* ((str (aref ps-string-control-codes char))
6056 (from (1- (point)))
87a16a06
RS
6057 (len (length str))
6058 (to (+ from len))
12b88fff
RS
6059 (char-width (ps-avg-char-width 'ps-font-for-text))
6060 (wrappoint (ps-find-wrappoint from to char-width)))
87a16a06
RS
6061 (if (< (car wrappoint) to)
6062 (ps-continue-line))
12b88fff 6063 (setq ps-width-remaining (- ps-width-remaining (* len char-width)))
87a16a06
RS
6064 (ps-output-string str)
6065 (ps-output " S\n")))
ef2cbb24 6066
87a16a06 6067
a18ed129
RS
6068(defun ps-face-attributes (face)
6069 "Return face attribute vector.
87a16a06 6070
a18ed129
RS
6071If FACE is not in `ps-print-face-extension-alist' or in
6072`ps-print-face-alist', insert it on `ps-print-face-alist' and
6073return the attribute vector.
87a16a06 6074
e85cca87 6075If FACE is not a valid face name, use default face."
df5e6194 6076 (cond
55732434
GM
6077 (ps-black-white-faces-alist
6078 (or (and (symbolp face)
6079 (cdr (assq face ps-black-white-faces-alist)))
6080 (vector 0 nil nil)))
df5e6194
GM
6081 ((symbolp face)
6082 (cdr (or (assq face ps-print-face-extension-alist)
6083 (assq face ps-print-face-alist)
6084 (let* ((the-face (if (facep face) face 'default))
6085 (new-face (ps-screen-to-bit-face the-face)))
6086 (or (and (eq the-face 'default)
6087 (assq the-face ps-print-face-alist))
6088 (setq ps-print-face-alist
6089 (cons new-face ps-print-face-alist)))
6090 new-face))))
6091 ((eq (car face) 'foreground-color)
6092 (vector 0 (cdr face) nil))
6093 ((eq (car face) 'background-color)
6094 (vector 0 nil (cdr face)))
6095 (t
6096 (vector 0 nil nil))))
87a16a06 6097
043620f4 6098
906d41a7 6099(defun ps-face-background (face background)
e85cca87
VJL
6100 (and (cond ((eq ps-use-face-background t)) ; always
6101 ((null ps-use-face-background) nil) ; never
6102 ;; ps-user-face-background is a symbol face list
6103 ((symbolp face)
6104 (memq face ps-use-face-background))
6105 ((listp face)
6106 (or (memq (car face) '(foreground-color background-color))
6107 (let (ok)
6108 (while face
6109 (if (or (memq (car face) ps-use-face-background)
6110 (memq (car face)
6111 '(foreground-color background-color)))
6112 (setq face nil
6113 ok t)
6114 (setq face (cdr face))))
6115 ok)))
6116 (t
6117 nil)
6118 )
906d41a7
GM
6119 background))
6120
6121
043620f4 6122(defun ps-face-attribute-list (face-or-list)
df5e6194
GM
6123 (cond
6124 ;; simple face
6125 ((not (listp face-or-list))
6126 (ps-face-attributes face-or-list))
6127 ;; only foreground color, not a `real' face
6128 ((eq (car face-or-list) 'foreground-color)
6129 (vector 0 (cdr face-or-list) nil))
6130 ;; only background color, not a `real' face
6131 ((eq (car face-or-list) 'background-color)
6132 (vector 0 nil (cdr face-or-list)))
6133 ;; list of faces
6134 (t
6135 (let ((effects 0)
6136 foreground background face-attr face)
6137 (while face-or-list
6138 (setq face (car face-or-list)
6139 face-or-list (cdr face-or-list)
6140 face-attr (ps-face-attributes face)
6141 effects (logior effects (aref face-attr 0)))
6142 (or foreground (setq foreground (aref face-attr 1)))
6143 (or background
6144 (setq background (ps-face-background face (aref face-attr 2)))))
6145 (vector effects foreground background)))))
043620f4 6146
87a16a06 6147
12b88fff
RS
6148(defconst ps-font-type (vector nil 'bold 'italic 'bold-italic))
6149
6150
12d89a2e 6151(defun ps-plot-with-face (from to face)
12b88fff
RS
6152 (cond
6153 ((null face) ; print text with null face
87a16a06 6154 (ps-plot-region from to 0))
12b88fff
RS
6155 ((eq face 'emacs--invisible--face)) ; skip invisible text!!!
6156 (t ; otherwise, text has a valid face
6157 (let* ((face-bit (ps-face-attribute-list face))
6158 (effect (aref face-bit 0))
6159 (foreground (aref face-bit 1))
906d41a7 6160 (background (ps-face-background face (aref face-bit 2)))
d3ab8dac 6161 (fg-color (if (and ps-color-p foreground)
6e1b1da6 6162 (ps-color-scale foreground)
12b88fff 6163 ps-default-color))
d3ab8dac 6164 (bg-color (and ps-color-p background
6e1b1da6 6165 (ps-color-scale background))))
12b88fff
RS
6166 (ps-plot-region
6167 from to
6168 (ps-font-number 'ps-font-for-text
6169 (or (aref ps-font-type (logand effect 3))
6170 face))
6171 fg-color bg-color (lsh effect -2)))))
87a16a06 6172 (goto-char to))
12d89a2e
RS
6173
6174
043620f4
KH
6175;; Ensure that face-list is fbound.
6176(or (fboundp 'face-list) (defalias 'face-list 'list-faces))
12d89a2e 6177
a18ed129 6178
12d89a2e 6179(defun ps-build-reference-face-lists ()
857686a6
RS
6180 ;; Ensure that face database is updated with faces on
6181 ;; `font-lock-face-attributes' (obsolete stuff)
6182 (ps-font-lock-face-attributes)
6183 ;; Now, rebuild reference face lists
a18ed129 6184 (setq ps-print-face-alist nil)
12d89a2e 6185 (if ps-auto-font-detect
a18ed129
RS
6186 (mapcar 'ps-map-face (face-list))
6187 (mapcar 'ps-set-face-bold ps-bold-faces)
6188 (mapcar 'ps-set-face-italic ps-italic-faces)
6189 (mapcar 'ps-set-face-underline ps-underlined-faces))
12d89a2e 6190 (setq ps-build-face-reference nil))
ef2cbb24 6191
a18ed129
RS
6192
6193(defun ps-set-face-bold (face)
6194 (ps-set-face-attribute face 1))
6195
6196(defun ps-set-face-italic (face)
6197 (ps-set-face-attribute face 2))
6198
6199(defun ps-set-face-underline (face)
6200 (ps-set-face-attribute face 4))
6201
6202
6203(defun ps-set-face-attribute (face effect)
6204 (let ((face-bit (cdr (ps-map-face face))))
6205 (aset face-bit 0 (logior (aref face-bit 0) effect))))
6206
6207
6208(defun ps-map-face (face)
6209 (let* ((face-map (ps-screen-to-bit-face face))
6210 (ps-face-bit (cdr (assq (car face-map) ps-print-face-alist))))
6211 (if ps-face-bit
6212 ;; if face exists, merge both
6213 (let ((face-bit (cdr face-map)))
6214 (aset ps-face-bit 0 (logior (aref ps-face-bit 0) (aref face-bit 0)))
6215 (or (aref ps-face-bit 1) (aset ps-face-bit 1 (aref face-bit 1)))
6216 (or (aref ps-face-bit 2) (aset ps-face-bit 2 (aref face-bit 2))))
6217 ;; if face does not exist, insert it
6218 (setq ps-print-face-alist (cons face-map ps-print-face-alist)))
6219 face-map))
6220
6221
6222(defun ps-screen-to-bit-face (face)
6223 (cons face
6224 (vector (logior (if (ps-face-bold-p face) 1 0) ; bold
6225 (if (ps-face-italic-p face) 2 0) ; italic
6226 (if (ps-face-underlined-p face) 4 0)) ; underline
8e234846
GM
6227 (ps-face-foreground-name face)
6228 (ps-face-background-name face))))
a18ed129
RS
6229
6230
b6d0ac87
VJL
6231;; to avoid compilation gripes
6232(defalias 'ps-jitify 'jit-lock-fontify-now)
6233(defalias 'ps-lazify 'lazy-lock-fontify-region)
6234
6235
3e9cb08f 6236;; to avoid compilation gripes
ea0c615d 6237(defun ps-print-ensure-fontified (start end)
b6d0ac87
VJL
6238 (cond ((and (boundp 'jit-lock-mode) (symbol-value 'jit-lock-mode))
6239 (ps-jitify start end))
6240 ((and (boundp 'lazy-lock-mode) (symbol-value 'lazy-lock-mode))
6241 (ps-lazify start end))))
043620f4 6242
043620f4 6243
ef2cbb24 6244(defun ps-generate-postscript-with-faces (from to)
87a16a06 6245 ;; Some initialization...
857686a6 6246 (setq ps-current-effect 0)
87a16a06 6247
00aa16af 6248 ;; Build the reference lists of faces if necessary.
8e234846
GM
6249 (when (or ps-always-build-face-reference
6250 ps-build-face-reference)
6251 (message "Collecting face information...")
6252 (ps-build-reference-face-lists))
55732434
GM
6253
6254 ;; Black/white printer.
6255 (setq ps-black-white-faces-alist nil)
6256 (and (eq ps-print-color-p 'black-white)
6257 (ps-extend-face-list ps-black-white-faces nil
6258 'ps-black-white-faces-alist))
6259
00aa16af 6260 ;; Generate some PostScript.
ef2cbb24
RS
6261 (save-restriction
6262 (narrow-to-region from to)
d3ab8dac 6263 (ps-print-ensure-fontified from to)
c97a3f22 6264 (ps-generate-postscript-with-faces1 from to)))
ef2cbb24
RS
6265
6266(defun ps-generate-postscript (from to)
e85cca87 6267 (ps-plot-region from to 0))
ef2cbb24
RS
6268
6269(defun ps-generate (buffer from to genfunc)
87a16a06
RS
6270 (save-excursion
6271 (let ((from (min to from))
6272 (to (max to from))
6273 ;; This avoids trouble if chars with read-only properties
6274 ;; are copied into ps-spool-buffer.
6275 (inhibit-read-only t))
6276 (save-restriction
6277 (narrow-to-region from to)
857686a6
RS
6278 (and ps-razzle-dazzle
6279 (message "Formatting...%3d%%" (setq ps-razchunk 0)))
8bd22fcf
KH
6280 (setq ps-source-buffer buffer
6281 ps-spool-buffer (get-buffer-create ps-spool-buffer-name))
87a16a06
RS
6282 (ps-init-output-queue)
6283 (let (safe-marker completed-safely needs-begin-file)
6284 (unwind-protect
00aa16af
RS
6285 (progn
6286 (set-buffer ps-spool-buffer)
7da17ab6 6287 (set-buffer-multibyte nil)
915293a2 6288
87a16a06
RS
6289 ;; Get a marker and make it point to the current end of the
6290 ;; buffer, If an error occurs, we'll delete everything from
6291 ;; the end of this marker onwards.
6292 (setq safe-marker (make-marker))
6293 (set-marker safe-marker (point-max))
6294
6295 (goto-char (point-min))
8bd22fcf
KH
6296 (or (looking-at (regexp-quote ps-adobe-tag))
6297 (setq needs-begin-file t))
ea0c615d
GM
6298
6299 (set-buffer ps-source-buffer)
87a16a06 6300 (save-excursion
ea0c615d
GM
6301 (let ((ps-print-page-p t)
6302 ps-even-or-odd-pages)
e85cca87 6303 (ps-begin-job genfunc)
70f57a72
GM
6304 (when needs-begin-file
6305 (ps-begin-file)
6306 (ps-mule-initialize))
6307 (ps-mule-begin-job from to)
ea0c615d
GM
6308 (ps-selected-pages)))
6309 (ps-begin-page)
87a16a06
RS
6310 (funcall genfunc from to)
6311 (ps-end-page)
f07bb446 6312 (ps-mule-end-job)
ea0c615d 6313 (ps-end-job needs-begin-file)
87a16a06
RS
6314
6315 ;; Setting this variable tells the unwind form that the
8bd22fcf 6316 ;; the PostScript was generated without error.
87a16a06
RS
6317 (setq completed-safely t))
6318
6319 ;; Unwind form: If some bad mojo occurred while generating
8bd22fcf 6320 ;; PostScript, delete all the PostScript that was generated.
87a16a06
RS
6321 ;; This protects the previously spooled files from getting
6322 ;; corrupted.
8bd22fcf
KH
6323 (and (markerp safe-marker) (not completed-safely)
6324 (progn
6325 (set-buffer ps-spool-buffer)
6326 (delete-region (marker-position safe-marker) (point-max))))))
87a16a06 6327
857686a6 6328 (and ps-razzle-dazzle (message "Formatting...done"))))))
ef2cbb24 6329
e65df0a1 6330
ea0c615d 6331(defun ps-end-job (needs-begin-file)
9dae638c 6332 (let ((ps-print-page-p t))
ea0c615d
GM
6333 (ps-flush-output)
6334 (save-excursion
4b3eb10f 6335 (let ((pages-per-sheet (mod ps-page-printed ps-n-up-printing))
ea0c615d 6336 (total-lines (cdr ps-printing-region))
ef1159c2 6337 (total-pages (ps-page-number)))
ea0c615d 6338 (set-buffer ps-spool-buffer)
ef1159c2
EZ
6339 (let (case-fold-search)
6340 ;; Back to the PS output buffer to set the last page n-up printing
6341 (goto-char (point-max))
6342 (and (> pages-per-sheet 0)
6343 (re-search-backward "^[0-9]+ BeginSheet$" nil t)
6344 (replace-match (format "%d BeginSheet" pages-per-sheet) t))
6345 ;; Back to the PS output buffer to set the page count
6346 (goto-char (point-min))
6347 (while (re-search-forward "^/Lines 0 def\n/PageCount 0 def$" nil t)
6348 (replace-match (format "/Lines %d def\n/PageCount %d def"
6349 total-lines total-pages) t)))))
ea0c615d
GM
6350 ;; Set dummy page
6351 (and ps-spool-duplex (= (mod ps-page-order 2) 1)
6352 (let ((ps-n-up-printing 0))
6353 (ps-header-sheet)
6354 (ps-output "/PrintHeader false def\n/ColumnIndex 0 def\n"
bd7a2e26
GM
6355 "/PrintLineNumber false def\n"
6356 (number-to-string ps-lines-printed) " BeginPage\n")
ea0c615d
GM
6357 (ps-end-page)))
6358 ;; Set end of PostScript file
9dae638c 6359 (ps-end-sheet)
4b3eb10f 6360 (ps-output "\n%%Trailer\n%%Pages: "
ea0c615d
GM
6361 (number-to-string
6362 (if (and needs-begin-file
6363 ps-banner-page-when-duplexing)
6364 (1+ ps-page-order)
6365 ps-page-order))
6366 "\n\nEndDoc\n\n%%EOF\n")
ef1159c2
EZ
6367 (and ps-end-with-control-d
6368 (ps-output "\C-d"))
ea0c615d
GM
6369 (ps-flush-output))
6370 ;; disable selected pages
1fd9b7fe 6371 (setq ps-selected-pages nil))
7d8b7e8e
KH
6372
6373
857686a6 6374;; Permit dynamic evaluation at print time of `ps-lpr-switches'.
ef2cbb24 6375(defun ps-do-despool (filename)
12d89a2e 6376 (if (or (not (boundp 'ps-spool-buffer))
bcc0d457 6377 (not (symbol-value 'ps-spool-buffer)))
12d89a2e 6378 (message "No spooled PostScript to print")
ef2cbb24
RS
6379 (if filename
6380 (save-excursion
857686a6 6381 (and ps-razzle-dazzle (message "Saving..."))
12d89a2e 6382 (set-buffer ps-spool-buffer)
ef2cbb24 6383 (setq filename (expand-file-name filename))
7ffaf659
EZ
6384 (let ((coding-system-for-write 'raw-text-unix))
6385 (write-region (point-min) (point-max) filename))
857686a6 6386 (and ps-razzle-dazzle (message "Wrote %s" filename)))
ef2cbb24 6387 ;; Else, spool to the printer
857686a6 6388 (and ps-razzle-dazzle (message "Printing..."))
ef2cbb24 6389 (save-excursion
12d89a2e 6390 (set-buffer ps-spool-buffer)
200127fd 6391 (let* ((coding-system-for-write 'raw-text-unix)
298bfad9
KH
6392 (ps-printer-name (or ps-printer-name
6393 (and (boundp 'printer-name)
2bd80d73 6394 (symbol-value 'printer-name))))
200127fd 6395 (ps-lpr-switches
3556c6dd
GM
6396 (append ps-lpr-switches
6397 (and (stringp ps-printer-name)
6398 (string< "" ps-printer-name)
6399 (list (concat
6400 (and (stringp ps-printer-name-option)
6401 ps-printer-name-option)
6402 ps-printer-name))))))
830f437e
VJL
6403 (or (stringp ps-printer-name)
6404 (setq ps-printer-name nil))
52cf535f
AI
6405 (apply (or ps-print-region-function 'call-process-region)
6406 (point-min) (point-max) ps-lpr-command nil
6407 (and (fboundp 'start-process) 0)
6408 nil
6409 (ps-flatten-list ; dynamic evaluation
6410 (mapcar 'ps-eval-switch ps-lpr-switches)))))
857686a6 6411 (and ps-razzle-dazzle (message "Printing...done")))
12d89a2e
RS
6412 (kill-buffer ps-spool-buffer)))
6413
857686a6
RS
6414;; Dynamic evaluation
6415(defun ps-eval-switch (arg)
6416 (cond ((stringp arg) arg)
6417 ((functionp arg) (apply arg nil))
6418 ((symbolp arg) (symbol-value arg))
6419 ((consp arg) (apply (car arg) (cdr arg)))
6420 (t nil)))
6421
6422;; `ps-flatten-list' is defined here (copied from "message.el" and
6423;; enhanced to handle dotted pairs as well) until we can get some
6424;; sensible autoloads, or `flatten-list' gets put somewhere decent.
6425
6426;; (ps-flatten-list '((a . b) c (d . e) (f g h) i . j))
6427;; => (a b c d e f g h i j)
6428
6429(defun ps-flatten-list (&rest list)
6430 (ps-flatten-list-1 list))
6431
6432(defun ps-flatten-list-1 (list)
6433 (cond ((null list) nil)
6434 ((consp list) (append (ps-flatten-list-1 (car list))
6435 (ps-flatten-list-1 (cdr list))))
6436 (t (list list))))
6437
12d89a2e
RS
6438(defun ps-kill-emacs-check ()
6439 (let (ps-buffer)
8bd22fcf 6440 (and (setq ps-buffer (get-buffer ps-spool-buffer-name))
6b61353c 6441 (buffer-name ps-buffer) ; check if it's not killed
8bd22fcf
KH
6442 (buffer-modified-p ps-buffer)
6443 (y-or-n-p "Unprinted PostScript waiting; print now? ")
6444 (ps-despool))
6445 (and (setq ps-buffer (get-buffer ps-spool-buffer-name))
6b61353c 6446 (buffer-name ps-buffer) ; check if it's not killed
8bd22fcf
KH
6447 (buffer-modified-p ps-buffer)
6448 (not (yes-or-no-p "Unprinted PostScript waiting; exit anyway? "))
6449 (error "Unprinted PostScript"))))
12d89a2e 6450
d3ab8dac
KH
6451(cond ((fboundp 'add-hook)
6452 (funcall 'add-hook 'kill-emacs-hook 'ps-kill-emacs-check))
6453 (kill-emacs-hook
6454 (message "Won't override existing `kill-emacs-hook'"))
6455 (t
6456 (setq kill-emacs-hook 'ps-kill-emacs-check)))
ef2cbb24 6457
298bfad9 6458\f
298bfad9
KH
6459;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6460;; To make this file smaller, some commands go in a separate file.
6461;; But autoload them here to make the separation invisible.
6462
298bfad9
KH
6463(autoload 'ps-mule-initialize "ps-mule"
6464 "Initialize global data for printing multi-byte characters.")
6465
6466(autoload 'ps-mule-begin-job "ps-mule"
6467 "Start printing job for multi-byte chars between FROM and TO.
6468This checks if all multi-byte characters in the region are printable or not.")
6469
6470(autoload 'ps-mule-begin-page "ps-mule"
6471 "Initialize multi-byte charset for printing current page.")
6472
f07bb446
KH
6473(autoload 'ps-mule-end-job "ps-mule"
6474 "Finish printing job for multi-byte chars.")
6bf5fb46 6475
298bfad9
KH
6476\f
6477;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6478
12d89a2e 6479(provide 'ps-print)
b87c5d3d 6480
6b61353c 6481;;; arch-tag: fb06a585-1112-4206-885d-a57d95d50579
12d89a2e 6482;;; ps-print.el ends here