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