(Grep Searching): Fix index entry for lgrep.
[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
c4abbb04 14;; Version: 7.3.3
502ca00a 15;; X-URL: http://www.emacswiki.org/cgi-bin/wiki/ViniciusJoseLatorre
e65df0a1 16
c4abbb04
VJL
17(defconst ps-print-version "7.3.3"
18 "ps-print.el, v 7.3.3 <2008/10/22 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;;
c4abbb04
VJL
1369;; Thanks to Friedrich Delgado Friedrichs <friedel@nomaden.org> for new label
1370;; printer page sizes.
1371;;
9586e1d3
VJL
1372;; Thanks to Michael Piotrowski <mxp@dynalabs.de> for improving the DSC
1373;; compliance of the generated PostScript.
1374;;
55732434
GM
1375;; Thanks to Adam Doppelt <adoppelt@avogadro.com> for face mapping suggestion
1376;; for black/white PostScript printers.
1377;;
319acba0
GM
1378;; Thanks to Toni Ronkko <tronkko@hytti.uku.fi> for line and paragraph spacing,
1379;; region to cut out when printing and footer suggestions.
1380;;
6bf5fb46 1381;; Thanks to Pavel Janik ml <Pavel@Janik.cz> for documentation correction.
12b88fff 1382;;
ef1159c2
EZ
1383;; Thanks to Corinne Ilvedson <cilvedson@draper.com> for line number font size
1384;; suggestion.
1385;;
c3d6d211
GM
1386;; Thanks to Gord Wait <Gord_Wait@spectrumsignal.com> for
1387;; `ps-user-defined-prologue' example setting for HP PostScript printer.
1388;;
98f2fbe7
GM
1389;; Thanks to Paul Furnanz <pfurnanz@synopsys.com> for XEmacs compatibility
1390;; suggestion for `ps-postscript-code-directory' variable.
1391;;
906d41a7
GM
1392;; Thanks to David X Callaway <dxc@xprt.net> for helping debugging PostScript
1393;; level 1 compatibility.
1394;;
6b61353c
KH
1395;; Thanks to Colin Marquardt <colin.marquardt@usa.alcatel.com> for:
1396;; - upside-down, line number step, line number start and zebra stripe
1397;; follow suggestions.
1398;; - `ps-time-stamp-yyyy-mm-dd' and `ps-time-stamp-iso8601' suggestion.
1399;; - and for XEmacs beta-tests.
906d41a7 1400;;
66e63857 1401;; Thanks to Klaus Berndl <klaus.berndl@sdm.de> for user defined PostScript
2bd80d73
GM
1402;; prologue code suggestion, for odd/even printing suggestion and for
1403;; `ps-prologue-file' enhancement.
66e63857 1404;;
edf2174f 1405;; Thanks to Ken'ichi Handa <handa@m17n.org> for multi-byte buffer handling.
915293a2
KH
1406;;
1407;; Thanks to Matthew O Persico <Matthew.Persico@lazard.com> for line number on
1408;; empty columns.
1409;;
1410;; Thanks to Theodore Jump <tjump@cais.com> for adjust PostScript code order on
1411;; last page.
1412;;
6bdb808e
RS
1413;; Thanks to Roland Ducournau <ducour@lirmm.fr> for
1414;; `ps-print-control-characters' variable documentation.
1415;;
12b88fff
RS
1416;; Thanks to Marcus G Daniels <marcus@cathcart.sysc.pdx.edu> for a better
1417;; database font management.
1418;;
1419;; Thanks to Martin Boyer <gamin@videotron.ca> for some ideas on putting one
6bdb808e
RS
1420;; header per page over the columns and correct line numbers when printing a
1421;; region.
12b88fff
RS
1422;;
1423;; Thanks to Steven L Baur <steve@miranova.com> for dynamic evaluation at
1424;; print time of `ps-lpr-switches'.
1425;;
6bdb808e
RS
1426;; Thanks to Kevin Rodgers <kevinr@ihs.com> for handling control characters
1427;; (his code was severely modified, but the main idea was kept).
1428;;
12b88fff
RS
1429;; Thanks to some suggestions on:
1430;; * Face color map: Marco Melgazzi <marco@techie.com>
1431;; * XEmacs compatibility: William J. Henney <will@astrosmo.unam.mx>
984e7bd9 1432;; * Check `ps-paper-type': Sudhakar Frederick <sfrederi@asc.corp.mot.com>
12b88fff 1433;;
319acba0
GM
1434;; Thanks to Jacques Duthen <duthen@cegelec-red.fr> (Jack) for version 3.4 I
1435;; started from. [vinicius]
857686a6 1436;;
319acba0 1437;; Thanks to Jim Thompson <?@?> for the 2.8 version I started from. [jack]
bcc0d457 1438;;
319acba0
GM
1439;; Thanks to Kevin Rodgers <kevinr@ihs.com> for adding support for color and
1440;; the invisible property.
ef2cbb24 1441;;
319acba0
GM
1442;; Thanks to Avishai Yacobi, avishaiy@mcil.comm.mot.com, for writing the
1443;; initial port to Emacs 19. His code is no longer part of ps-print, but his
1444;; work is still appreciated.
ef2cbb24 1445;;
9586e1d3 1446;; Thanks to Remi Houdaille and Michel Train <michel@metasoft.fdn.org> for
319acba0
GM
1447;; adding underline support. Their code also is no longer part of ps-print,
1448;; but their efforts are not forgotten.
12d89a2e 1449;;
319acba0
GM
1450;; Thanks also to all of you who mailed code to add features to ps-print;
1451;; although I didn't use your code, I still appreciate your sharing it with me.
12d89a2e
RS
1452;;
1453;; Thanks to all who mailed comments, encouragement, and criticism.
319acba0
GM
1454;; Thanks also to all who responded to my survey; I had too many responses to
1455;; reply to them all, but I greatly appreciate your interest.
12d89a2e
RS
1456;;
1457;; Jim
bc0d41bd 1458;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ef2cbb24
RS
1459
1460;;; Code:
1461
55732434 1462
b6d0ac87 1463(require 'lpr)
68e684a0 1464
c97a3f22 1465
b6d0ac87
VJL
1466(or (featurep 'lisp-float-type)
1467 (error "`ps-print' requires floating point support"))
68e684a0 1468
eafa92bf 1469
6b1c1c40
VJL
1470(if (featurep 'xemacs)
1471 ()
1472 (unless (and (boundp 'emacs-major-version)
1473 (>= emacs-major-version 23))
1474 (error "`ps-print' only supports Emacs 23 and higher")))
eafa92bf 1475
68e684a0 1476
b6d0ac87
VJL
1477(defconst ps-windows-system
1478 (memq system-type '(emx win32 w32 mswindows ms-dos windows-nt)))
1479(defconst ps-lp-system
f3041af1 1480 (memq system-type '(usg-unix-v hpux irix)))
b6d0ac87
VJL
1481
1482
c97a3f22
VJL
1483;; Load XEmacs/Emacs definitions
1484(eval-and-compile (require 'ps-def))
906d41a7
GM
1485
1486
ef2cbb24 1487;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12d89a2e
RS
1488;; User Variables:
1489
0a5daee5 1490
bcc0d457
RS
1491;;; Interface to the command system
1492
bc0d41bd 1493(defgroup postscript nil
b0fa9df7 1494 "PostScript Group."
bc0d41bd 1495 :tag "PostScript"
b6d0ac87 1496 :version "20"
bc0d41bd
KH
1497 :group 'emacs)
1498
e0af0d3e 1499(defgroup ps-print nil
b0fa9df7 1500 "PostScript generator for Emacs."
3556c6dd 1501 :link '(emacs-library-link :tag "Source Lisp File" "ps-print.el")
e0af0d3e 1502 :prefix "ps-"
b6d0ac87 1503 :version "20"
bc0d41bd
KH
1504 :group 'wp
1505 :group 'postscript)
e0af0d3e
RS
1506
1507(defgroup ps-print-horizontal nil
b0fa9df7 1508 "Horizontal page layout."
e0af0d3e
RS
1509 :prefix "ps-"
1510 :tag "Horizontal"
b6d0ac87 1511 :version "20"
e0af0d3e
RS
1512 :group 'ps-print)
1513
1514(defgroup ps-print-vertical nil
b0fa9df7 1515 "Vertical page layout."
e0af0d3e
RS
1516 :prefix "ps-"
1517 :tag "Vertical"
b6d0ac87 1518 :version "20"
e0af0d3e
RS
1519 :group 'ps-print)
1520
6e1b1da6 1521(defgroup ps-print-headers nil
b0fa9df7 1522 "Headers & footers layout."
e0af0d3e 1523 :prefix "ps-"
319acba0 1524 :tag "Header & Footer"
b6d0ac87 1525 :version "20"
e0af0d3e
RS
1526 :group 'ps-print)
1527
1528(defgroup ps-print-font nil
b0fa9df7 1529 "Fonts customization."
e0af0d3e
RS
1530 :prefix "ps-"
1531 :tag "Font"
b6d0ac87 1532 :version "20"
e0af0d3e
RS
1533 :group 'ps-print)
1534
1535(defgroup ps-print-color nil
b0fa9df7 1536 "Color customization."
e0af0d3e
RS
1537 :prefix "ps-"
1538 :tag "Color"
b6d0ac87 1539 :version "20"
e0af0d3e
RS
1540 :group 'ps-print)
1541
1542(defgroup ps-print-face nil
b0fa9df7 1543 "Faces customization."
e0af0d3e
RS
1544 :prefix "ps-"
1545 :tag "PS Faces"
b6d0ac87 1546 :version "20"
e0af0d3e
RS
1547 :group 'ps-print
1548 :group 'faces)
1549
bc0d41bd 1550(defgroup ps-print-n-up nil
b0fa9df7 1551 "N-up customization."
bc0d41bd
KH
1552 :prefix "ps-"
1553 :tag "N-Up"
b6d0ac87 1554 :version "20"
bc0d41bd
KH
1555 :group 'ps-print)
1556
1557(defgroup ps-print-zebra nil
b0fa9df7 1558 "Zebra customization."
bc0d41bd
KH
1559 :prefix "ps-"
1560 :tag "Zebra"
b6d0ac87 1561 :version "20"
bc0d41bd
KH
1562 :group 'ps-print)
1563
1564(defgroup ps-print-background nil
b0fa9df7 1565 "Background customization."
bc0d41bd
KH
1566 :prefix "ps-"
1567 :tag "Background"
b6d0ac87 1568 :version "20"
bc0d41bd
KH
1569 :group 'ps-print)
1570
1426742b 1571(defgroup ps-print-printer '((lpr custom-group))
b0fa9df7 1572 "Printer customization."
bc0d41bd
KH
1573 :prefix "ps-"
1574 :tag "Printer"
b6d0ac87 1575 :version "20"
bc0d41bd
KH
1576 :group 'ps-print)
1577
1578(defgroup ps-print-page nil
b0fa9df7 1579 "Page customization."
bc0d41bd
KH
1580 :prefix "ps-"
1581 :tag "Page"
b6d0ac87 1582 :version "20"
bc0d41bd
KH
1583 :group 'ps-print)
1584
6e1b1da6 1585(defgroup ps-print-miscellany nil
b0fa9df7 1586 "Miscellany customization."
6e1b1da6
GM
1587 :prefix "ps-"
1588 :tag "Miscellany"
b6d0ac87 1589 :version "20"
6e1b1da6
GM
1590 :group 'ps-print)
1591
bc0d41bd 1592
66e63857 1593(defcustom ps-error-handler-message 'paper
9201cc28 1594 "Specify where the error handler message should be sent.
66e63857
GM
1595
1596Valid values are:
1597
1598 `none' catch the error and *DON'T* send any message.
1599
1600 `paper' catch the error and print on paper the error message.
1601
1602 `system' catch the error and send back the error message to
6e1b1da6
GM
1603 printing system. This is useful only if printing system
1604 send back an email reporting the error, or if there is
1605 some other alternative way to report back the error from
1606 the system to you.
66e63857
GM
1607
1608 `paper-and-system' catch the error, print on paper the error message and
1609 send back the error message to printing system.
1610
1611Any other value is treated as `paper'."
8e234846
GM
1612 :type '(choice :menu-tag "Error Handler Message"
1613 :tag "Error Handler Message"
66e63857
GM
1614 (const none) (const paper)
1615 (const system) (const paper-and-system))
b6d0ac87 1616 :version "20"
6e1b1da6 1617 :group 'ps-print-miscellany)
66e63857
GM
1618
1619(defcustom ps-user-defined-prologue nil
9201cc28 1620 "User defined PostScript prologue code inserted before all prologue code.
66e63857
GM
1621
1622`ps-user-defined-prologue' may be a string or a symbol function which returns a
1623string. Note that this string is inserted after `ps-adobe-tag' and PostScript
1624prologue comments, and before ps-print PostScript prologue code section. That
1625is, this string is inserted after error handler initialization and before
1626ps-print settings.
1627
66e63857
GM
1628It's strongly recommended only insert PostScript code and/or comments specific
1629for your printing system particularities. For example, some special
1630initialization that only your printing system needs.
1631
319acba0
GM
1632Do not insert code for duplex printing, n-up printing or error handler,
1633ps-print handles this in a suitable way.
66e63857
GM
1634
1635For more information about PostScript, see:
1636 PostScript Language Reference Manual (2nd edition)
c3d6d211
GM
1637 Adobe Systems Incorporated
1638
1639As an example for `ps-user-defined-prologue' setting:
1640
1641 ;; Setting for HP PostScript printer
1642 (setq ps-user-defined-prologue
1643 (concat \"<</DeferredMediaSelection true /PageSize [612 792] \"
2285bf9d 1644 \"/MediaPosition 2 /MediaType (Plain)>> setpagedevice\"))"
8e234846
GM
1645 :type '(choice :menu-tag "User Defined Prologue"
1646 :tag "User Defined Prologue"
98f2fbe7 1647 (const :tag "none" nil) string symbol)
b6d0ac87 1648 :version "20"
6e1b1da6 1649 :group 'ps-print-miscellany)
66e63857 1650
d3ab8dac 1651(defcustom ps-print-prologue-header nil
9201cc28 1652 "PostScript prologue header comments besides that ps-print generates.
d3ab8dac 1653
319acba0
GM
1654`ps-print-prologue-header' may be a string or a symbol function which returns a
1655string. Note that this string is inserted on PostScript prologue header
1656section which is used to define some document characteristic through PostScript
1657special comments, like \"%%Requirements: jog\\n\".
d3ab8dac
KH
1658
1659ps-print always inserts the %%Requirements: comment, so if you need to insert
1660more requirements put them first in `ps-print-prologue-header' using the
1661\"%%+\" comment. For example, if you need to set numcopies to 3 and jog on
1662requirements and set %%LanguageLevel: to 2, do:
1663
2285bf9d 1664 (setq ps-print-prologue-header
e59d29d6 1665 \"%%+ numcopies(3) jog\\n%%LanguageLevel: 2\\n\")
d3ab8dac
KH
1666
1667The duplex requirement is inserted by ps-print (see `ps-spool-duplex').
1668
1669Do not forget to terminate the string with \"\\n\".
1670
1671For more information about PostScript document comments, see:
1672 PostScript Language Reference Manual (2nd edition)
1673 Adobe Systems Incorporated
1674 Appendix G: Document Structuring Conventions -- Version 3.0"
8e234846
GM
1675 :type '(choice :menu-tag "Prologue Header"
1676 :tag "Prologue Header"
98f2fbe7 1677 (const :tag "none" nil) string symbol)
b6d0ac87 1678 :version "20"
6e1b1da6 1679 :group 'ps-print-miscellany)
d3ab8dac 1680
298bfad9 1681(defcustom ps-printer-name (and (boundp 'printer-name)
2bd80d73 1682 (symbol-value 'printer-name))
9201cc28 1683 "The name of a local printer for printing PostScript files.
03820514 1684
3556c6dd
GM
1685On Unix-like systems, a string value should be a name understood by lpr's -P
1686option; a value of nil means use the value of `printer-name' instead.
1687
1688On MS-DOS and MS-Windows systems, a string value is taken as the name of the
1689printer device or port to which PostScript files are written, provided
1690`ps-lpr-command' is \"\". By default it is the same as `printer-name'; typical
1691non-default settings would be \"LPT1\" to \"LPT3\" for parallel printers, or
7bb054a5 1692\"COM1\" to \"COM4\" or \"AUX\" for serial printers, or \"\\\\hostname\\printer\"
3556c6dd
GM
1693for a shared network printer. You can also set it to a name of a file, in
1694which case the output gets appended to that file. \(Note that `ps-print'
1695package already has facilities for printing to a file, so you might as well use
1696them instead of changing the setting of this variable.\) If you want to
1697silently discard the printed output, set this to \"NUL\".
1698
1699Set to t, if the utility given by `ps-lpr-command' needs an empty printer name.
1700
1701Any other value is treated as t, that is, an empty printer name.
1702
1703See also `ps-printer-name-option' for documentation."
8e234846
GM
1704 :type '(choice :menu-tag "Printer Name"
1705 :tag "Printer Name"
1706 (const :tag "Same as printer-name" nil)
3556c6dd 1707 (const :tag "No Printer Name" t)
6e1b1da6 1708 (file :tag "Print to file")
8e234846 1709 (string :tag "Pipe to ps-lpr-command"))
b6d0ac87 1710 :version "20"
bc0d41bd 1711 :group 'ps-print-printer)
03820514 1712
3556c6dd
GM
1713(defcustom ps-printer-name-option
1714 (cond (ps-windows-system
1715 "/D:")
1716 (ps-lp-system
1717 "-d")
1718 (t
1719 "-P" ))
9201cc28 1720 "Option for `ps-printer-name' variable (see it).
3556c6dd 1721
2285bf9d
RS
1722On Unix-like systems, if `lpr' is in use, this should be the string
1723\"-P\"; if `lp' is in use, this should be the string \"-d\".
3556c6dd 1724
2285bf9d 1725On MS-DOS and MS-Windows systems, if `print' is in use, this should be
3556c6dd
GM
1726the string \"/D:\".
1727
2285bf9d 1728For any other printing utility, see its documentation.
3556c6dd 1729
c90a10fa
RS
1730Set this to \"\" or nil, if the utility given by `ps-lpr-command'
1731needs an empty printer name option--that is, pass the printer name
1732with no special option preceding it.
3556c6dd 1733
c90a10fa 1734Any value that is not a string is treated as nil.
3556c6dd
GM
1735
1736This variable is used only when `ps-printer-name' is a non-empty string."
1737 :type '(choice :menu-tag "Printer Name Option"
1738 :tag "Printer Name Option"
1739 (const :tag "None" nil)
1740 (string :tag "Option"))
6bf5fb46 1741 :version "21.1"
3556c6dd
GM
1742 :group 'ps-print-printer)
1743
e0af0d3e 1744(defcustom ps-lpr-command lpr-command
9201cc28 1745 "Name of program for printing a PostScript file.
52cf535f 1746
3556c6dd
GM
1747On MS-DOS and MS-Windows systems, if the value is an empty string then Emacs
1748will write directly to the printer port named by `ps-printer-name'. The
1749programs `print' and `nprint' (the standard print programs on Windows NT and
1750Novell Netware respectively) are handled specially, using `ps-printer-name' as
1751the destination for output; any other program is treated like `lpr' except that
1752an explicit filename is given as the last argument."
e0af0d3e 1753 :type 'string
b6d0ac87 1754 :version "20"
bc0d41bd 1755 :group 'ps-print-printer)
e0af0d3e
RS
1756
1757(defcustom ps-lpr-switches lpr-switches
9201cc28 1758 "List of extra switches to pass to `ps-lpr-command'.
7d5cb920
VJL
1759
1760The list element can be:
1761
1762 string it should be an option for `ps-lpr-command' (which see).
1763 For example: \"-o Duplex=DuplexNoTumble\"
1764
1765 symbol it can be a function or variable symbol. If it's a function
1766 symbol, it should be a function with no argument. The result
1767 of the function or the variable value should be a string or a
1768 list of strings.
1769
1770 list the header should be a symbol function and the tail is the
1771 arguments for this function. This function should return a
1772 string or a list of strings.
1773
1774Any other value is silently ignored.
1775
1776It is recommended to set `ps-printer-name' (which see) instead of including an
1777explicit switch on this list.
1778
1779See `ps-lpr-command'."
edc9cd35 1780 :type '(repeat :tag "PostScript lpr Switches"
ef1159c2
EZ
1781 (choice :menu-tag "PostScript lpr Switch"
1782 :tag "PostScript lpr Switch"
1783 string symbol (repeat sexp)))
b6d0ac87 1784 :version "20"
bc0d41bd 1785 :group 'ps-print-printer)
12d89a2e 1786
52cf535f 1787(defcustom ps-print-region-function nil
9201cc28 1788 "Specify a function to print the region on a PostScript printer.
319acba0
GM
1789See definition of `call-process-region' for calling conventions. The fourth
1790and the sixth arguments are both nil."
942a1d58 1791 :type '(choice (const nil) function)
b6d0ac87 1792 :version "20"
bc0d41bd 1793 :group 'ps-print-printer)
52cf535f 1794
8e234846 1795(defcustom ps-manual-feed nil
9201cc28 1796 "Non-nil means the printer will manually feed paper.
8e234846
GM
1797
1798If it's nil, automatic feeding takes place."
1799 :type 'boolean
b6d0ac87 1800 :version "20"
8e234846
GM
1801 :group 'ps-print-printer)
1802
bd7a2e26 1803(defcustom ps-end-with-control-d (and ps-windows-system t)
9201cc28 1804 "Non-nil means insert C-d at end of PostScript file generated."
6bf5fb46 1805 :version "21.1"
ef1159c2 1806 :type 'boolean
b6d0ac87 1807 :version "20"
ef1159c2
EZ
1808 :group 'ps-print-printer)
1809
bcc0d457 1810;;; Page layout
12d89a2e 1811
bcc0d457
RS
1812;; All page dimensions are in PostScript points.
1813;; 1 inch == 2.54 cm == 72 points
1814;; 1 cm == (/ 1 2.54) inch == (/ 72 2.54) points
1815
1816;; Letter 8.5 inch x 11.0 inch
1817;; Legal 8.5 inch x 14.0 inch
1818;; A4 8.26 inch x 11.69 inch = 21.0 cm x 29.7 cm
1819
1820;; LetterSmall 7.68 inch x 10.16 inch
1821;; Tabloid 11.0 inch x 17.0 inch
1822;; Ledger 17.0 inch x 11.0 inch
1823;; Statement 5.5 inch x 8.5 inch
1824;; Executive 7.5 inch x 10.0 inch
1825;; A3 11.69 inch x 16.5 inch = 29.7 cm x 42.0 cm
1826;; A4Small 7.47 inch x 10.85 inch
1827;; B4 10.125 inch x 14.33 inch
1828;; B5 7.16 inch x 10.125 inch
1829
c90a10fa 1830;;;###autoload
e0af0d3e 1831(defcustom ps-page-dimensions-database
c4abbb04
VJL
1832 (list (list 'a4 (/ (* 72 21.0) 2.54) (/ (* 72 29.7) 2.54) "A4")
1833 (list 'a3 (/ (* 72 29.7) 2.54) (/ (* 72 42.0) 2.54) "A3")
1834 (list 'letter (* 72 8.5) (* 72 11.0) "Letter")
1835 (list 'legal (* 72 8.5) (* 72 14.0) "Legal")
1836 (list 'letter-small (* 72 7.68) (* 72 10.16) "LetterSmall")
1837 (list 'tabloid (* 72 11.0) (* 72 17.0) "Tabloid")
1838 (list 'ledger (* 72 17.0) (* 72 11.0) "Ledger")
1839 (list 'statement (* 72 5.5) (* 72 8.5) "Statement")
1840 (list 'executive (* 72 7.5) (* 72 10.0) "Executive")
1841 (list 'a4small (* 72 7.47) (* 72 10.85) "A4Small")
1842 (list 'b4 (* 72 10.125) (* 72 14.33) "B4")
1843 (list 'b5 (* 72 7.16) (* 72 10.125) "B5")
1844 ;; page sizes for label printer
1845 ;; NOTE: the page sizes below don't have n-up > 1.
1846 '(addresslarge 236.0 99.0 "AddressLarge")
1847 '(addresssmall 236.0 68.0 "AddressSmall")
1848 '(cuthanging13 90.0 222.0 "CutHanging13")
1849 '(cuthanging15 90.0 114.0 "CutHanging15")
1850 '(diskette 181.0 136.0 "Diskette")
1851 '(eurofilefolder 139.0 112.0 "EuropeanFilefolder")
1852 '(eurofoldernarrow 526.0 107.0 "EuroFolderNarrow")
1853 '(eurofolderwide 526.0 136.0 "EuroFolderWide")
1854 '(euronamebadge 189.0 108.0 "EuroNameBadge")
1855 '(euronamebadgelarge 223.0 136.0 "EuroNameBadgeLarge")
1856 '(filefolder 230.0 37.0 "FileFolder")
1857 '(jewelry 76.0 136.0 "Jewelry")
1858 '(mediabadge 180.0 136.0 "MediaBadge")
1859 '(multipurpose 126.0 68.0 "MultiPurpose")
1860 '(retaillabel 90.0 104.0 "RetailLabel")
1861 '(shipping 271.0 136.0 "Shipping")
1862 '(slide35mm 26.0 104.0 "Slide35mm")
1863 '(spine8mm 187.0 26.0 "Spine8mm")
1864 '(topcoated 425.19685 136.0 "TopCoatedPaper")
1865 '(topcoatedpaper 396.0 136.0 "TopcoatedPaper150")
1866 '(vhsface 205.0 127.0 "VHSFace")
1867 '(vhsspine 400.0 50.0 "VHSSpine")
1868 '(zipdisk 156.0 136.0 "ZipDisk"))
9201cc28 1869 "List associating a symbolic paper type to its width, height and doc media.
bc0d41bd 1870See `ps-paper-type'."
e0af0d3e 1871 :type '(repeat (list :tag "Paper Type"
c4abbb04
VJL
1872 (symbol :tag "Symbol Name")
1873 (number :tag "Width in points")
1874 (number :tag "Height in points")
bc0d41bd 1875 (string :tag "Media")))
b6d0ac87 1876 :version "20"
bc0d41bd 1877 :group 'ps-print-page)
e0af0d3e 1878
857686a6 1879;;;###autoload
e0af0d3e 1880(defcustom ps-paper-type 'letter
9201cc28 1881 "Specify the size of paper to format for.
090be653 1882Should be one of the paper types defined in `ps-page-dimensions-database', for
e0af0d3e
RS
1883example `letter', `legal' or `a4'."
1884 :type '(symbol :validate (lambda (wid)
87a16a06
RS
1885 (if (assq (widget-value wid)
1886 ps-page-dimensions-database)
e0af0d3e
RS
1887 nil
1888 (widget-put wid :error "Unknown paper size")
1889 wid)))
b6d0ac87 1890 :version "20"
bc0d41bd 1891 :group 'ps-print-page)
e0af0d3e 1892
8e234846 1893(defcustom ps-warn-paper-type t
9201cc28 1894 "Non-nil means give an error if paper size is not equal to `ps-paper-type'.
8e234846
GM
1895
1896It's used when `ps-spool-config' is set to `setpagedevice'."
1897 :type 'boolean
b6d0ac87 1898 :version "20"
8e234846
GM
1899 :group 'ps-print-page)
1900
87a16a06 1901(defcustom ps-landscape-mode nil
9201cc28 1902 "Non-nil means print in landscape mode."
e0af0d3e 1903 :type 'boolean
b6d0ac87 1904 :version "20"
bc0d41bd 1905 :group 'ps-print-page)
e0af0d3e 1906
906d41a7 1907(defcustom ps-print-upside-down nil
9201cc28 1908 "Non-nil means print upside-down (that is, rotated by 180 degrees)."
906d41a7 1909 :type 'boolean
319acba0 1910 :version "21.1"
906d41a7
GM
1911 :group 'ps-print-page)
1912
1fd9b7fe 1913(defcustom ps-selected-pages nil
9201cc28 1914 "Specify which pages to print.
1fd9b7fe 1915
2285bf9d 1916If nil, print all pages.
1fd9b7fe 1917
2285bf9d 1918If a list, the lists element may be an integer or a cons cell (FROM . TO)
1fd9b7fe 1919designating FROM page to TO page; any invalid element is ignored, that is, an
e59d29d6 1920integer lesser than one or if FROM is greater than TO.
1fd9b7fe
GM
1921
1922Otherwise, it's treated as nil.
1923
2285bf9d
RS
1924After ps-print processing `ps-selected-pages' is set to nil. But the
1925latest `ps-selected-pages' is saved in `ps-last-selected-pages' (which
1926see). So you can restore the latest selected pages by using
1927`ps-last-selected-pages' or with the `ps-restore-selected-pages'
1928command (which see).
ea0c615d
GM
1929
1930See also `ps-even-or-odd-pages'."
1fd9b7fe
GM
1931 :type '(repeat :tag "Selected Pages"
1932 (radio :tag "Page"
1933 (integer :tag "Number")
1934 (cons :tag "Range"
1935 (integer :tag "From")
1936 (integer :tag "To"))))
b6d0ac87 1937 :version "20"
1fd9b7fe
GM
1938 :group 'ps-print-page)
1939
c3d6d211 1940(defcustom ps-even-or-odd-pages nil
9201cc28 1941 "Specify if it prints even/odd pages.
c3d6d211
GM
1942
1943Valid values are:
1944
1945 nil print all pages.
1946
4b3eb10f
GM
1947 `even-page' print only even pages.
1948
1949 `odd-page' print only odd pages.
1950
1951 `even-sheet' print only even sheets.
bd7a2e26
GM
1952 That is, if `ps-n-up-printing' is 1, it behaves as `even-page';
1953 but for values greater than 1, it'll print only the even sheet
1954 of paper.
c3d6d211 1955
4b3eb10f 1956 `odd-sheet' print only odd sheets.
bd7a2e26
GM
1957 That is, if `ps-n-up-printing' is 1, it behaves as `odd-page';
1958 but for values greater than 1, it'll print only the odd sheet
1959 of paper.
c3d6d211 1960
ea0c615d
GM
1961Any other value is treated as nil.
1962
1963If you set `ps-selected-pages' (see it for documentation), first the pages are
1964filtered by `ps-selected-pages' and then by `ps-even-or-odd-pages'. For
1965example, if we have:
1966
4b3eb10f 1967 (setq ps-selected-pages '(1 4 (6 . 10) (12 . 16) 20))
ea0c615d 1968
4b3eb10f 1969Combining with `ps-even-or-odd-pages' and `ps-n-up-printing', we have:
ea0c615d 1970
4b3eb10f 1971`ps-n-up-printing' = 1:
ea0c615d 1972 `ps-even-or-odd-pages' PAGES PRINTED
4b3eb10f
GM
1973 nil 1, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 20
1974 even-page 4, 6, 8, 10, 12, 14, 16, 20
1975 odd-page 1, 7, 9, 13, 15
1976 even-sheet 4, 6, 8, 10, 12, 14, 16, 20
1977 odd-sheet 1, 7, 9, 13, 15
1978
1979`ps-n-up-printing' = 2:
1980 `ps-even-or-odd-pages' PAGES PRINTED
1981 nil 1/4, 6/7, 8/9, 10/12, 13/14, 15/16, 20
1982 even-page 4/6, 8/10, 12/14, 16/20
1983 odd-page 1/7, 9/13, 15
1984 even-sheet 6/7, 10/12, 15/16
1985 odd-sheet 1/4, 8/9, 13/14, 20
1986
1987So even-page/odd-page are about page parity and even-sheet/odd-sheet are about
1988sheet parity."
c3d6d211
GM
1989 :type '(choice :menu-tag "Print Even/Odd Pages"
1990 :tag "Print Even/Odd Pages"
1991 (const :tag "All Pages" nil)
4b3eb10f
GM
1992 (const :tag "Only Even Pages" even-page)
1993 (const :tag "Only Odd Pages" odd-page)
1994 (const :tag "Only Even Sheets" even-sheet)
1995 (const :tag "Only Odd Sheets" odd-sheet))
b6d0ac87 1996 :version "20"
c3d6d211
GM
1997 :group 'ps-print-page)
1998
857686a6 1999(defcustom ps-print-control-characters 'control-8-bit
9201cc28 2000 "Specify the printable form for control and 8-bit characters.
bc0d41bd 2001That is, instead of sending, for example, a ^D (\\004) to printer,
915293a2 2002it is sent the string \"^D\".
6bdb808e 2003
857686a6 2004Valid values are:
6bdb808e 2005
984e7bd9 2006 `8-bit' This is the value to use when you want an ASCII encoding of
d3ab8dac
KH
2007 any control or non-ASCII character. Control characters are
2008 encoded as \"^D\", and non-ASCII characters have an
2009 octal encoding.
6bdb808e 2010
984e7bd9 2011 `control-8-bit' This is the value to use when you want an ASCII encoding of
d3ab8dac
KH
2012 any control character, whether it is 7 or 8-bit.
2013 European 8-bits accented characters are printed according
2014 the current font.
6bdb808e 2015
c82b4a75 2016 `control' Only ASCII control characters have an ASCII encoding.
d3ab8dac
KH
2017 European 8-bits accented characters are printed according
2018 the current font.
6bdb808e 2019
984e7bd9 2020 nil No ASCII encoding. Any character is printed according the
d3ab8dac 2021 current font.
6bdb808e 2022
857686a6 2023Any other value is treated as nil."
8e234846
GM
2024 :type '(choice :menu-tag "Control Char"
2025 :tag "Control Char"
bc0d41bd 2026 (const 8-bit) (const control-8-bit)
edc9cd35 2027 (const control) (const :tag "nil" nil))
b6d0ac87 2028 :version "20"
6e1b1da6 2029 :group 'ps-print-miscellany)
857686a6 2030
bc0d41bd 2031(defcustom ps-n-up-printing 1
9201cc28 2032 "Specify the number of pages per sheet paper."
bc0d41bd
KH
2033 :type '(integer
2034 :tag "N Up Printing"
2035 :validate
2036 (lambda (wid)
2037 (if (and (< 0 (widget-value wid))
2038 (<= (widget-value wid) 100))
2039 nil
2040 (widget-put
2041 wid :error
2042 "Number of pages per sheet paper must be between 1 and 100.")
2043 wid)))
b6d0ac87 2044 :version "20"
bc0d41bd
KH
2045 :group 'ps-print-n-up)
2046
2047(defcustom ps-n-up-margin (/ (* 72 1.0) 2.54) ; 1 cm
9201cc28 2048 "Specify the margin in points between the sheet border and n-up printing."
bc0d41bd 2049 :type 'number
b6d0ac87 2050 :version "20"
bc0d41bd
KH
2051 :group 'ps-print-n-up)
2052
2053(defcustom ps-n-up-border-p t
9201cc28 2054 "Non-nil means a border is drawn around each page."
bc0d41bd 2055 :type 'boolean
b6d0ac87 2056 :version "20"
bc0d41bd
KH
2057 :group 'ps-print-n-up)
2058
2059(defcustom ps-n-up-filling 'left-top
9201cc28 2060 "Specify how page matrix is filled on each sheet of paper.
bc0d41bd
KH
2061
2062Following are the valid values for `ps-n-up-filling' with a filling example
2063using a 3x4 page matrix:
2064
2065 `left-top' 1 2 3 4 `left-bottom' 9 10 11 12
2066 5 6 7 8 5 6 7 8
2067 9 10 11 12 1 2 3 4
2068
2069 `right-top' 4 3 2 1 `right-bottom' 12 11 10 9
2070 8 7 6 5 8 7 6 5
2071 12 11 10 9 4 3 2 1
2072
2073 `top-left' 1 4 7 10 `bottom-left' 3 6 9 12
2074 2 5 8 11 2 5 8 11
2075 3 6 9 12 1 4 7 10
2076
2077 `top-right' 10 7 4 1 `bottom-right' 12 9 6 3
2078 11 8 5 2 11 8 5 2
2079 12 9 6 3 10 7 4 1
2080
2081Any other value is treated as `left-top'."
8e234846
GM
2082 :type '(choice :menu-tag "N-Up Filling"
2083 :tag "N-Up Filling"
bc0d41bd
KH
2084 (const left-top) (const left-bottom)
2085 (const right-top) (const right-bottom)
2086 (const top-left) (const bottom-left)
2087 (const top-right) (const bottom-right))
b6d0ac87 2088 :version "20"
bc0d41bd
KH
2089 :group 'ps-print-n-up)
2090
e0af0d3e 2091(defcustom ps-number-of-columns (if ps-landscape-mode 2 1)
9201cc28 2092 "Specify the number of columns."
87a16a06 2093 :type 'number
b6d0ac87 2094 :version "20"
6e1b1da6 2095 :group 'ps-print-miscellany)
87a16a06 2096
535efc38 2097(defcustom ps-zebra-stripes nil
9201cc28 2098 "Non-nil means print zebra stripes.
6e1b1da6 2099See also documentation for `ps-zebra-stripe-height' and `ps-zebra-color'."
87a16a06 2100 :type 'boolean
b6d0ac87 2101 :version "20"
bc0d41bd 2102 :group 'ps-print-zebra)
87a16a06 2103
535efc38 2104(defcustom ps-zebra-stripe-height 3
9201cc28 2105 "Number of zebra stripe lines.
6e1b1da6 2106See also documentation for `ps-zebra-stripes' and `ps-zebra-color'."
87a16a06 2107 :type 'number
b6d0ac87 2108 :version "20"
bc0d41bd
KH
2109 :group 'ps-print-zebra)
2110
6e1b1da6 2111(defcustom ps-zebra-color 0.95
9201cc28 2112 "Zebra stripe gray scale or RGB color.
bc0d41bd 2113See also documentation for `ps-zebra-stripes' and `ps-zebra-stripe-height'."
8e234846
GM
2114 :type '(choice :menu-tag "Zebra Gray/Color"
2115 :tag "Zebra Gray/Color"
6e1b1da6
GM
2116 (number :tag "Gray Scale" :value 0.95)
2117 (string :tag "Color Name" :value "gray95")
2118 (list :tag "RGB Color" :value (0.95 0.95 0.95)
2119 (number :tag "Red")
2120 (number :tag "Green")
2121 (number :tag "Blue")))
b6d0ac87 2122 :version "20"
bc0d41bd 2123 :group 'ps-print-zebra)
87a16a06 2124
8e234846 2125(defcustom ps-zebra-stripe-follow nil
9201cc28 2126 "Specify how zebra stripes continue on next page.
2bd80d73
GM
2127
2128Visually, valid values are (the character `+' at right of each column indicates
2129that a line is printed):
2130
2131 `nil' `follow' `full' `full-follow'
2132 Current Page -------- ----------- --------- ----------------
2133 1 XXXXX + 1 XXXXXXXX + 1 XXXXXX + 1 XXXXXXXXXXXXX +
2134 2 XXXXX + 2 XXXXXXXX + 2 XXXXXX + 2 XXXXXXXXXXXXX +
2135 3 XXXXX + 3 XXXXXXXX + 3 XXXXXX + 3 XXXXXXXXXXXXX +
2136 4 + 4 + 4 + 4 +
2137 5 + 5 + 5 + 5 +
2138 6 + 6 + 6 + 6 +
2139 7 XXXXX + 7 XXXXXXXX + 7 XXXXXX + 7 XXXXXXXXXXXXX +
2140 8 XXXXX + 8 XXXXXXXX + 8 XXXXXX + 8 XXXXXXXXXXXXX +
2141 9 XXXXX + 9 XXXXXXXX + 9 XXXXXX + 9 XXXXXXXXXXXXX +
2142 10 + 10 +
2143 11 + 11 +
2144 -------- ----------- --------- ----------------
2145 Next Page -------- ----------- --------- ----------------
2146 12 XXXXX + 12 + 10 XXXXXX + 10 +
2147 13 XXXXX + 13 XXXXXXXX + 11 XXXXXX + 11 +
2148 14 XXXXX + 14 XXXXXXXX + 12 XXXXXX + 12 +
2149 15 + 15 XXXXXXXX + 13 + 13 XXXXXXXXXXXXX +
2150 16 + 16 + 14 + 14 XXXXXXXXXXXXX +
2151 17 + 17 + 15 + 15 XXXXXXXXXXXXX +
2152 18 XXXXX + 18 + 16 XXXXXX + 16 +
2153 19 XXXXX + 19 XXXXXXXX + 17 XXXXXX + 17 +
2154 20 XXXXX + 20 XXXXXXXX + 18 XXXXXX + 18 +
2155 21 + 21 XXXXXXXX +
2156 22 + 22 +
2157 -------- ----------- --------- ----------------
2158
d730a5ac 2159Any other value is treated as nil."
2bd80d73
GM
2160 :type '(choice :menu-tag "Zebra Stripe Follow"
2161 :tag "Zebra Stripe Follow"
2162 (const :tag "Always Restart" nil)
2163 (const :tag "Continue on Next Page" follow)
2164 (const :tag "Print Only Full Stripe" full)
2165 (const :tag "Continue on Full Stripe" full-follow))
b6d0ac87 2166 :version "20"
8e234846
GM
2167 :group 'ps-print-zebra)
2168
87a16a06 2169(defcustom ps-line-number nil
9201cc28 2170 "Non-nil means print line number."
87a16a06 2171 :type 'boolean
b6d0ac87 2172 :version "20"
6e1b1da6 2173 :group 'ps-print-miscellany)
87a16a06 2174
906d41a7 2175(defcustom ps-line-number-step 1
9201cc28 2176 "Specify the interval that line number is printed.
906d41a7
GM
2177
2178For example, `ps-line-number-step' is set to 2, the printing will look like:
2179
2180 1 one line
2181 one line
2182 3 one line
2183 one line
98f2fbe7 2184 5 one line
906d41a7
GM
2185 one line
2186 ...
2187
2188Valid values are:
2189
2190 integer an integer that specifies the interval that line number is
2191 printed. If it's lesser than or equal to zero, it's used the
2192 value 1.
2193
319acba0
GM
2194 `zebra' specifies that only the line number of the first line in a
2195 zebra stripe is to be printed.
906d41a7
GM
2196
2197Any other value is treated as `zebra'."
8e234846
GM
2198 :type '(choice :menu-tag "Line Number Step"
2199 :tag "Line Number Step"
906d41a7
GM
2200 (integer :tag "Step Interval")
2201 (const :tag "Synchronize Zebra" zebra))
b6d0ac87 2202 :version "20"
906d41a7
GM
2203 :group 'ps-print-miscellany)
2204
98f2fbe7 2205(defcustom ps-line-number-start 1
9201cc28 2206 "Specify the starting point in the interval given by `ps-line-number-step'.
98f2fbe7 2207
3556c6dd
GM
2208For example, if `ps-line-number-step' is set to 3 and `ps-line-number-start' is
2209set to 3, the printing will look like:
98f2fbe7
GM
2210
2211 one line
2212 one line
2213 3 one line
2214 one line
2215 one line
2216 6 one line
2217 one line
2218 one line
2219 9 one line
2220 one line
2221 ...
2222
2223The values for `ps-line-number-start':
2224
319acba0
GM
2225 * If `ps-line-number-step' is an integer, must be between 1 and the value of
2226 `ps-line-number-step' inclusive.
98f2fbe7
GM
2227
2228 * If `ps-line-number-step' is set to `zebra', must be between 1 and the
2229 value of `ps-zebra-strip-height' inclusive. Use this combination if you
2230 wish that line number be relative to zebra stripes."
2231 :type '(integer :tag "Start Step Interval")
b6d0ac87 2232 :version "20"
98f2fbe7
GM
2233 :group 'ps-print-miscellany)
2234
87a16a06 2235(defcustom ps-print-background-image nil
9201cc28 2236 "EPS image list to be printed on background.
87a16a06
RS
2237
2238The elements are:
2239
2240 (FILENAME X Y XSCALE YSCALE ROTATION PAGES...)
2241
2242FILENAME is a file name which contains an EPS image or some PostScript
2243programming like EPS.
2244FILENAME is ignored, if it doesn't exist or is read protected.
2245
2246X and Y are relative positions on paper to put the image.
01cdabc6 2247If X and Y are nil, the image is centered on paper.
87a16a06
RS
2248
2249XSCALE and YSCALE are scale factor to be applied to image before printing.
2250If XSCALE and YSCALE are nil, the original size is used.
2251
2252ROTATION is the image rotation angle; if nil, the default is 0.
2253
2254PAGES designates the page to print background image.
319acba0
GM
2255PAGES may be a number or a cons cell (FROM . TO) designating FROM page to TO
2256page.
87a16a06
RS
2257If PAGES is nil, print background image on all pages.
2258
319acba0 2259X, Y, XSCALE, YSCALE and ROTATION may be a floating point number, an integer
2285bf9d 2260number or a string. If it is a string, the string should contain PostScript
319acba0 2261programming that returns a float or integer value.
87a16a06
RS
2262
2263For example, if you wish to print an EPS image on all pages do:
2264
2265 '((\"~/images/EPS-image.ps\"))"
98f2fbe7
GM
2266 :type '(repeat
2267 (list
2268 (file :tag "EPS File")
2269 (choice :tag "X" (const :tag "default" nil) number string)
2270 (choice :tag "Y" (const :tag "default" nil) number string)
2271 (choice :tag "X Scale" (const :tag "default" nil) number string)
2272 (choice :tag "Y Scale" (const :tag "default" nil) number string)
2273 (choice :tag "Rotation" (const :tag "default" nil) number string)
2274 (repeat :tag "Pages" :inline t
2275 (radio (integer :tag "Page")
2276 (cons :tag "Range"
2277 (integer :tag "From")
2278 (integer :tag "To"))))))
b6d0ac87 2279 :version "20"
bc0d41bd 2280 :group 'ps-print-background)
87a16a06
RS
2281
2282(defcustom ps-print-background-text nil
9201cc28 2283 "Text list to be printed on background.
87a16a06
RS
2284
2285The elements are:
2286
2287 (STRING X Y FONT FONTSIZE GRAY ROTATION PAGES...)
2288
2289STRING is the text to be printed on background.
2290
2291X and Y are positions on paper to put the text.
2292If X and Y are nil, the text is positioned at lower left corner.
2293
2294FONT is a font name to be used on printing the text.
2295If nil, \"Times-Roman\" is used.
2296
2297FONTSIZE is font size to be used, if nil, 200 is used.
2298
2299GRAY is the text gray factor (should be very light like 0.8).
2300If nil, the default is 0.85.
2301
319acba0
GM
2302ROTATION is the text rotation angle; if nil, the angle is given by the diagonal
2303from lower left corner to upper right corner.
87a16a06
RS
2304
2305PAGES designates the page to print background text.
319acba0
GM
2306PAGES may be a number or a cons cell (FROM . TO) designating FROM page to TO
2307page.
87a16a06
RS
2308If PAGES is nil, print background text on all pages.
2309
319acba0 2310X, Y, FONTSIZE, GRAY and ROTATION may be a floating point number, an integer
2285bf9d 2311number or a string. If it is a string, the string should contain PostScript
319acba0 2312programming that returns a float or integer value.
87a16a06
RS
2313
2314For example, if you wish to print text \"Preliminary\" on all pages do:
2315
2316 '((\"Preliminary\"))"
98f2fbe7
GM
2317 :type '(repeat
2318 (list
2319 (string :tag "Text")
2320 (choice :tag "X" (const :tag "default" nil) number string)
2321 (choice :tag "Y" (const :tag "default" nil) number string)
2322 (choice :tag "Font" (const :tag "default" nil) string)
2323 (choice :tag "Fontsize" (const :tag "default" nil) number string)
2324 (choice :tag "Gray" (const :tag "default" nil) number string)
2325 (choice :tag "Rotation" (const :tag "default" nil) number string)
2326 (repeat :tag "Pages" :inline t
2327 (radio (integer :tag "Page")
2328 (cons :tag "Range"
2329 (integer :tag "From")
2330 (integer :tag "To"))))))
b6d0ac87 2331 :version "20"
bc0d41bd 2332 :group 'ps-print-background)
bcc0d457
RS
2333
2334;;; Horizontal layout
2335
2336;; ------------------------------------------
2337;; | | | | | | | |
2338;; | lm | text | ic | text | ic | text | rm |
2339;; | | | | | | | |
2340;; ------------------------------------------
2341
e0af0d3e 2342(defcustom ps-left-margin (/ (* 72 2.0) 2.54) ; 2 cm
9201cc28 2343 "Left margin in points (1/72 inch)."
e0af0d3e 2344 :type 'number
b6d0ac87 2345 :version "20"
e0af0d3e 2346 :group 'ps-print-horizontal)
bcc0d457 2347
e0af0d3e 2348(defcustom ps-right-margin (/ (* 72 2.0) 2.54) ; 2 cm
9201cc28 2349 "Right margin in points (1/72 inch)."
e0af0d3e 2350 :type 'number
b6d0ac87 2351 :version "20"
e0af0d3e 2352 :group 'ps-print-horizontal)
bcc0d457 2353
e0af0d3e 2354(defcustom ps-inter-column (/ (* 72 2.0) 2.54) ; 2 cm
9201cc28 2355 "Horizontal space between columns in points (1/72 inch)."
e0af0d3e 2356 :type 'number
b6d0ac87 2357 :version "20"
e0af0d3e 2358 :group 'ps-print-horizontal)
bcc0d457
RS
2359
2360;;; Vertical layout
2361
2362;; |--------|
2363;; | tm |
2364;; |--------|
2365;; | header |
2366;; |--------|
2367;; | ho |
2368;; |--------|
2369;; | text |
2370;; |--------|
2371;; | bm |
2372;; |--------|
2373
e0af0d3e 2374(defcustom ps-bottom-margin (/ (* 72 1.5) 2.54) ; 1.5 cm
9201cc28 2375 "Bottom margin in points (1/72 inch)."
e0af0d3e 2376 :type 'number
b6d0ac87 2377 :version "20"
e0af0d3e 2378 :group 'ps-print-vertical)
bcc0d457 2379
e0af0d3e 2380(defcustom ps-top-margin (/ (* 72 1.5) 2.54) ; 1.5 cm
9201cc28 2381 "Top margin in points (1/72 inch)."
e0af0d3e 2382 :type 'number
b6d0ac87 2383 :version "20"
e0af0d3e 2384 :group 'ps-print-vertical)
bcc0d457 2385
e0af0d3e 2386(defcustom ps-header-offset (/ (* 72 1.0) 2.54) ; 1.0 cm
9201cc28 2387 "Vertical space in points (1/72 inch) between the main text and the header."
e0af0d3e 2388 :type 'number
b6d0ac87 2389 :version "20"
e0af0d3e 2390 :group 'ps-print-vertical)
bcc0d457 2391
e0af0d3e 2392(defcustom ps-header-line-pad 0.15
9201cc28 2393 "Portion of a header title line height to insert.
2285bf9d
RS
2394The insertion is done between the header frame and the text it contains,
2395both in the vertical and horizontal directions."
e0af0d3e 2396 :type 'number
b6d0ac87 2397 :version "20"
e0af0d3e 2398 :group 'ps-print-vertical)
bcc0d457 2399
319acba0 2400(defcustom ps-footer-offset (/ (* 72 1.0) 2.54) ; 1.0 cm
9201cc28 2401 "Vertical space in points (1/72 inch) between the main text and the footer."
319acba0 2402 :type 'number
b6d0ac87 2403 :version "20"
319acba0
GM
2404 :group 'ps-print-vertical)
2405
2406(defcustom ps-footer-line-pad 0.15
9201cc28 2407 "Portion of a footer title line height to insert.
2285bf9d
RS
2408The insertion is done between the footer frame and the text it contains,
2409both in the vertical and horizontal directions."
319acba0 2410 :type 'number
b6d0ac87 2411 :version "20"
319acba0
GM
2412 :group 'ps-print-vertical)
2413
2414;;; Header/Footer setup
12d89a2e 2415
e0af0d3e 2416(defcustom ps-print-header t
9201cc28 2417 "Non-nil means print a header at the top of each page.
319acba0
GM
2418By default, the header displays the buffer name, page number, and, if the
2419buffer is visiting a file, the file's directory. Headers are customizable by
2420changing variables `ps-left-header' and `ps-right-header'."
12b88fff 2421 :type 'boolean
b6d0ac87 2422 :version "20"
6e1b1da6 2423 :group 'ps-print-headers)
12b88fff 2424
e0af0d3e 2425(defcustom ps-print-header-frame t
9201cc28 2426 "Non-nil means draw a gaudy frame around the header."
e0af0d3e 2427 :type 'boolean
b6d0ac87 2428 :version "20"
6e1b1da6 2429 :group 'ps-print-headers)
e0af0d3e 2430
319acba0 2431(defcustom ps-header-frame-alist
efa89c1f 2432 '((fore-color . 0.0)
319acba0
GM
2433 (back-color . 0.9)
2434 (border-width . 0.4)
efa89c1f
GM
2435 (border-color . 0.0)
2436 (shadow-color . 0.0))
9201cc28 2437 "Specify header frame properties alist.
319acba0
GM
2438
2439Valid frame properties are:
2440
2441 `fore-color' Specify the foreground frame color.
2442 It should be a float number between 0.0 (black color)
2443 and 1.0 (white color), a string which is a color name,
2444 or a list of 3 float numbers which corresponds to the
2445 Red Green Blue color scale, each float number between
2446 0.0 (dark color) and 1.0 (bright color).
2447
2448 `back-color' Specify the background frame color (similar to
2449 `fore-color').
2450
2451 `shadow-color' Specify the shadow color (similar to `fore-color').
2452
2453 `border-color' Specify the border color (similar to `fore-color').
2454
2455 `border-width' Specify the border width.
2456
2457Any other property is ignored.
2458
2459Don't change this alist directly, instead use customization, or `ps-value',
2460`ps-get', `ps-put' and `ps-del' functions (see them for documentation)."
2461 :version "21.1"
2462 :type '(repeat
2463 (choice :menu-tag "Header Frame Element"
2464 :tag ""
2465 (cons :tag "Foreground Color" :format "%v"
2466 (const :format "" fore-color)
2467 (choice :menu-tag "Foreground Color"
2468 :tag "Foreground Color"
efa89c1f 2469 (number :tag "Gray Scale" :value 0.0)
319acba0 2470 (string :tag "Color Name" :value "black")
efa89c1f 2471 (list :tag "RGB Color" :value (0.0 0.0 0.0)
319acba0
GM
2472 (number :tag "Red")
2473 (number :tag "Green")
2474 (number :tag "Blue"))))
2475 (cons :tag "Background Color" :format "%v"
2476 (const :format "" back-color)
2477 (choice :menu-tag "Background Color"
2478 :tag "Background Color"
2479 (number :tag "Gray Scale" :value 0.9)
2480 (string :tag "Color Name" :value "gray90")
2481 (list :tag "RGB Color" :value (0.9 0.9 0.9)
2482 (number :tag "Red")
2483 (number :tag "Green")
2484 (number :tag "Blue"))))
2485 (cons :tag "Border Width" :format "%v"
2486 (const :format "" border-width)
2487 (number :tag "Border Width" :value 0.4))
2488 (cons :tag "Border Color" :format "%v"
2489 (const :format "" border-color)
2490 (choice :menu-tag "Border Color"
2491 :tag "Border Color"
efa89c1f 2492 (number :tag "Gray Scale" :value 0.0)
319acba0 2493 (string :tag "Color Name" :value "black")
efa89c1f 2494 (list :tag "RGB Color" :value (0.0 0.0 0.0)
319acba0
GM
2495 (number :tag "Red")
2496 (number :tag "Green")
2497 (number :tag "Blue"))))
2498 (cons :tag "Shadow Color" :format "%v"
2499 (const :format "" shadow-color)
2500 (choice :menu-tag "Shadow Color"
2501 :tag "Shadow Color"
efa89c1f 2502 (number :tag "Gray Scale" :value 0.0)
319acba0 2503 (string :tag "Color Name" :value "black")
efa89c1f 2504 (list :tag "RGB Color" :value (0.0 0.0 0.0)
319acba0
GM
2505 (number :tag "Red")
2506 (number :tag "Green")
2507 (number :tag "Blue"))))))
b6d0ac87 2508 :version "20"
319acba0
GM
2509 :group 'ps-print-headers)
2510
e0af0d3e 2511(defcustom ps-header-lines 2
9201cc28 2512 "Number of lines to display in page header, when generating PostScript."
e0af0d3e 2513 :type 'integer
b6d0ac87 2514 :version "20"
6e1b1da6 2515 :group 'ps-print-headers)
bcc0d457 2516
319acba0 2517(defcustom ps-print-footer nil
9201cc28 2518 "Non-nil means print a footer at the bottom of each page.
319acba0
GM
2519By default, the footer displays page number.
2520Footers are customizable by changing variables `ps-left-footer' and
2521`ps-right-footer'."
319acba0 2522 :type 'boolean
b6d0ac87 2523 :version "21.1"
319acba0
GM
2524 :group 'ps-print-headers)
2525
2526(defcustom ps-print-footer-frame t
9201cc28 2527 "Non-nil means draw a gaudy frame around the footer."
319acba0 2528 :type 'boolean
b6d0ac87 2529 :version "21.1"
319acba0
GM
2530 :group 'ps-print-headers)
2531
2532(defcustom ps-footer-frame-alist
efa89c1f 2533 '((fore-color . 0.0)
319acba0
GM
2534 (back-color . 0.9)
2535 (border-width . 0.4)
efa89c1f
GM
2536 (border-color . 0.0)
2537 (shadow-color . 0.0))
9201cc28 2538 "Specify footer frame properties alist.
319acba0
GM
2539
2540Don't change this alist directly, instead use customization, or `ps-value',
2541`ps-get', `ps-put' and `ps-del' functions (see them for documentation).
2542
2543See also `ps-header-frame-alist' for documentation."
319acba0
GM
2544 :type '(repeat
2545 (choice :menu-tag "Header Frame Element"
2546 :tag ""
2547 (cons :tag "Foreground Color" :format "%v"
2548 (const :format "" fore-color)
2549 (choice :menu-tag "Foreground Color"
2550 :tag "Foreground Color"
efa89c1f 2551 (number :tag "Gray Scale" :value 0.0)
319acba0 2552 (string :tag "Color Name" :value "black")
efa89c1f 2553 (list :tag "RGB Color" :value (0.0 0.0 0.0)
319acba0
GM
2554 (number :tag "Red")
2555 (number :tag "Green")
2556 (number :tag "Blue"))))
2557 (cons :tag "Background Color" :format "%v"
2558 (const :format "" back-color)
2559 (choice :menu-tag "Background Color"
2560 :tag "Background Color"
2561 (number :tag "Gray Scale" :value 0.9)
2562 (string :tag "Color Name" :value "gray90")
2563 (list :tag "RGB Color" :value (0.9 0.9 0.9)
2564 (number :tag "Red")
2565 (number :tag "Green")
2566 (number :tag "Blue"))))
2567 (cons :tag "Border Width" :format "%v"
2568 (const :format "" border-width)
2569 (number :tag "Border Width" :value 0.4))
2570 (cons :tag "Border Color" :format "%v"
2571 (const :format "" border-color)
2572 (choice :menu-tag "Border Color"
2573 :tag "Border Color"
efa89c1f 2574 (number :tag "Gray Scale" :value 0.0)
319acba0 2575 (string :tag "Color Name" :value "black")
efa89c1f 2576 (list :tag "RGB Color" :value (0.0 0.0 0.0)
319acba0
GM
2577 (number :tag "Red")
2578 (number :tag "Green")
2579 (number :tag "Blue"))))
2580 (cons :tag "Shadow Color" :format "%v"
2581 (const :format "" shadow-color)
2582 (choice :menu-tag "Shadow Color"
2583 :tag "Shadow Color"
efa89c1f 2584 (number :tag "Gray Scale" :value 0.0)
319acba0 2585 (string :tag "Color Name" :value "black")
efa89c1f 2586 (list :tag "RGB Color" :value (0.0 0.0 0.0)
319acba0
GM
2587 (number :tag "Red")
2588 (number :tag "Green")
2589 (number :tag "Blue"))))))
b6d0ac87 2590 :version "21.1"
319acba0
GM
2591 :group 'ps-print-headers)
2592
2593(defcustom ps-footer-lines 2
9201cc28 2594 "Number of lines to display in page footer, when generating PostScript."
319acba0 2595 :type 'integer
b6d0ac87 2596 :version "21.1"
319acba0
GM
2597 :group 'ps-print-headers)
2598
2599(defcustom ps-print-only-one-header nil
9201cc28 2600 "Non-nil means print only one header/footer at the top/bottom of each page.
319acba0
GM
2601This is useful when printing more than one column, so it is possible to have
2602only one header/footer over all columns or one header/footer per column.
2603See also `ps-print-header' and `ps-print-footer'."
2604 :type 'boolean
b6d0ac87 2605 :version "20"
319acba0
GM
2606 :group 'ps-print-headers)
2607
8e234846 2608(defcustom ps-switch-header 'duplex
9201cc28 2609 "Specify if headers/footers are switched or not.
8e234846
GM
2610
2611Valid values are:
2612
319acba0 2613nil Never switch headers/footers.
8e234846 2614
319acba0 2615t Always switch headers/footers.
8e234846 2616
319acba0 2617duplex Switch headers/footers only when duplexing is on, that is, when
8e234846
GM
2618 `ps-spool-duplex' is non-nil.
2619
319acba0
GM
2620Any other value is treated as t.
2621
2622See also `ps-print-header' and `ps-print-footer'."
2623 :type '(choice :menu-tag "Switch Header/Footer"
2624 :tag "Switch Header/Footer"
8e234846
GM
2625 (const :tag "Never Switch" nil)
2626 (const :tag "Always Switch" t)
2627 (const :tag "Switch When Duplexing" duplex))
b6d0ac87 2628 :version "20"
8e234846
GM
2629 :group 'ps-print-headers)
2630
e0af0d3e 2631(defcustom ps-show-n-of-n t
9201cc28 2632 "Non-nil means show page numbers as N/M, meaning page N of M.
8bd22fcf 2633NOTE: page numbers are displayed as part of headers,
6e1b1da6 2634 see variable `ps-print-header'."
e0af0d3e 2635 :type 'boolean
b6d0ac87 2636 :version "20"
6e1b1da6 2637 :group 'ps-print-headers)
12d89a2e 2638
edc9cd35 2639(defcustom ps-spool-config
906d41a7 2640 (if ps-windows-system
edc9cd35
GM
2641 nil
2642 'lpr-switches)
9201cc28 2643 "Specify who is responsible for setting duplex and page size.
bc0d41bd
KH
2644
2645Valid values are:
2646
2647 `lpr-switches' duplex and page size are configured by `ps-lpr-switches'.
2648 Don't forget to set `ps-lpr-switches' to select duplex
2649 printing for your printer.
2650
2651 `setpagedevice' duplex and page size are configured by ps-print using the
2652 setpagedevice PostScript operator.
2653
2654 nil duplex and page size are configured by ps-print *not* using
2655 the setpagedevice PostScript operator.
2656
2657Any other value is treated as nil.
2658
2659WARNING: The setpagedevice PostScript operator affects ghostview utility when
2660 viewing file generated using landscape. Also on some printers,
2661 setpagedevice affects zebra stripes; on other printers, setpagedevice
2662 affects the left margin.
2663 Besides all that, if your printer does not have the paper size
2664 specified by setpagedevice, your printing will be aborted.
2665 So, if you need to use setpagedevice, set `ps-spool-config' to
2666 `setpagedevice', generate a test file and send it to your printer; if
2285bf9d 2667 the printed file isn't OK, set `ps-spool-config' to nil."
8e234846
GM
2668 :type '(choice :menu-tag "Spool Config"
2669 :tag "Spool Config"
bc0d41bd 2670 (const lpr-switches) (const setpagedevice)
edc9cd35 2671 (const :tag "nil" nil))
b6d0ac87 2672 :version "20"
6e1b1da6 2673 :group 'ps-print-headers)
bc0d41bd
KH
2674
2675(defcustom ps-spool-duplex nil ; Not many people have duplex printers,
2676 ; so default to nil.
9201cc28 2677 "Non-nil generates PostScript for a two-sided printer.
bc0d41bd
KH
2678For a duplex printer, the `ps-spool-*' and `ps-print-*' commands will insert
2679blank pages as needed between print jobs so that the next buffer printed will
2680start on the right page. Also, if headers are turned on, the headers will be
2681reversed on duplex printers so that the page numbers fall to the left on
0a5daee5
KH
2682even-numbered pages.
2683
2684See also `ps-spool-tumble'."
bc0d41bd 2685 :type 'boolean
b6d0ac87 2686 :version "20"
6e1b1da6 2687 :group 'ps-print-headers)
bc0d41bd
KH
2688
2689(defcustom ps-spool-tumble nil
9201cc28 2690 "Specify how the page images on opposite sides of a sheet are oriented.
319acba0
GM
2691If `ps-spool-tumble' is nil, produces output suitable for binding on the left
2692or right. If `ps-spool-tumble' is non-nil, produces output suitable for
2693binding at the top or bottom.
bc0d41bd
KH
2694
2695It has effect only when `ps-spool-duplex' is non-nil."
e0af0d3e 2696 :type 'boolean
b6d0ac87 2697 :version "20"
6e1b1da6 2698 :group 'ps-print-headers)
bcc0d457
RS
2699
2700;;; Fonts
2701
e0af0d3e 2702(defcustom ps-font-info-database
bcc0d457 2703 '((Courier ; the family key
12b88fff
RS
2704 (fonts (normal . "Courier")
2705 (bold . "Courier-Bold")
2706 (italic . "Courier-Oblique")
2707 (bold-italic . "Courier-BoldOblique"))
2708 (size . 10.0)
2709 (line-height . 10.55)
2710 (space-width . 6.0)
2711 (avg-char-width . 6.0))
bcc0d457 2712 (Helvetica ; the family key
12b88fff
RS
2713 (fonts (normal . "Helvetica")
2714 (bold . "Helvetica-Bold")
2715 (italic . "Helvetica-Oblique")
2716 (bold-italic . "Helvetica-BoldOblique"))
2717 (size . 10.0)
2718 (line-height . 11.56)
2719 (space-width . 2.78)
2720 (avg-char-width . 5.09243))
bcc0d457 2721 (Times
12b88fff
RS
2722 (fonts (normal . "Times-Roman")
2723 (bold . "Times-Bold")
2724 (italic . "Times-Italic")
2725 (bold-italic . "Times-BoldItalic"))
2726 (size . 10.0)
2727 (line-height . 11.0)
2728 (space-width . 2.5)
334cc3b7 2729 (avg-char-width . 4.71432))
bcc0d457 2730 (Palatino
12b88fff
RS
2731 (fonts (normal . "Palatino-Roman")
2732 (bold . "Palatino-Bold")
2733 (italic . "Palatino-Italic")
2734 (bold-italic . "Palatino-BoldItalic"))
2735 (size . 10.0)
2736 (line-height . 12.1)
2737 (space-width . 2.5)
2738 (avg-char-width . 5.08676))
bcc0d457 2739 (Helvetica-Narrow
12b88fff
RS
2740 (fonts (normal . "Helvetica-Narrow")
2741 (bold . "Helvetica-Narrow-Bold")
2742 (italic . "Helvetica-Narrow-Oblique")
2743 (bold-italic . "Helvetica-Narrow-BoldOblique"))
2744 (size . 10.0)
2745 (line-height . 11.56)
2746 (space-width . 2.2796)
2747 (avg-char-width . 4.17579))
bcc0d457 2748 (NewCenturySchlbk
12b88fff
RS
2749 (fonts (normal . "NewCenturySchlbk-Roman")
2750 (bold . "NewCenturySchlbk-Bold")
2751 (italic . "NewCenturySchlbk-Italic")
2752 (bold-italic . "NewCenturySchlbk-BoldItalic"))
2753 (size . 10.0)
334cc3b7 2754 (line-height . 12.15)
12b88fff
RS
2755 (space-width . 2.78)
2756 (avg-char-width . 5.31162))
bcc0d457
RS
2757 ;; got no bold for the next ones
2758 (AvantGarde-Book
12b88fff
RS
2759 (fonts (normal . "AvantGarde-Book")
2760 (italic . "AvantGarde-BookOblique"))
2761 (size . 10.0)
2762 (line-height . 11.77)
2763 (space-width . 2.77)
2764 (avg-char-width . 5.45189))
bcc0d457 2765 (AvantGarde-Demi
12b88fff
RS
2766 (fonts (normal . "AvantGarde-Demi")
2767 (italic . "AvantGarde-DemiOblique"))
2768 (size . 10.0)
2769 (line-height . 12.72)
2770 (space-width . 2.8)
2771 (avg-char-width . 5.51351))
bcc0d457 2772 (Bookman-Demi
12b88fff
RS
2773 (fonts (normal . "Bookman-Demi")
2774 (italic . "Bookman-DemiItalic"))
2775 (size . 10.0)
2776 (line-height . 11.77)
2777 (space-width . 3.4)
2778 (avg-char-width . 6.05946))
bcc0d457 2779 (Bookman-Light
12b88fff
RS
2780 (fonts (normal . "Bookman-Light")
2781 (italic . "Bookman-LightItalic"))
2782 (size . 10.0)
2783 (line-height . 11.79)
2784 (space-width . 3.2)
2785 (avg-char-width . 5.67027))
bcc0d457
RS
2786 ;; got no bold and no italic for the next ones
2787 (Symbol
12b88fff
RS
2788 (fonts (normal . "Symbol"))
2789 (size . 10.0)
2790 (line-height . 13.03)
2791 (space-width . 2.5)
2792 (avg-char-width . 3.24324))
bcc0d457 2793 (Zapf-Dingbats
12b88fff
RS
2794 (fonts (normal . "Zapf-Dingbats"))
2795 (size . 10.0)
2796 (line-height . 9.63)
2797 (space-width . 2.78)
2798 (avg-char-width . 2.78))
92dc83a9
KH
2799 (ZapfChancery-MediumItalic
2800 (fonts (normal . "ZapfChancery-MediumItalic"))
2801 (size . 10.0)
2802 (line-height . 11.45)
2803 (space-width . 2.2)
2804 (avg-char-width . 4.10811))
2805 ;; We keep this wrong entry name (but with correct font name) for
2806 ;; backward compatibility.
bcc0d457 2807 (Zapf-Chancery-MediumItalic
92dc83a9 2808 (fonts (normal . "ZapfChancery-MediumItalic"))
12b88fff
RS
2809 (size . 10.0)
2810 (line-height . 11.45)
2811 (space-width . 2.2)
2812 (avg-char-width . 4.10811))
87a16a06 2813 )
9201cc28 2814 "Font info database.
2285bf9d 2815Each element comprises: font family (the key), name, bold, italic, bold-italic,
bcc0d457
RS
2816reference size, line height, space width, average character width.
2817To get the info for another specific font (say Helvetica), do the following:
2818- create a new buffer
2819- generate the PostScript image to a file (C-u M-x ps-print-buffer)
319acba0
GM
2820- open this file and delete the leading `%' (which is the PostScript comment
2821 character) from the line
1fd9b7fe 2822 `% 3 cm 20 cm moveto 10/Courier ReportFontInfo showpage'
bcc0d457 2823 to get the line
1fd9b7fe 2824 `3 cm 20 cm moveto 10/Helvetica ReportFontInfo showpage'
bcc0d457 2825- add the values to `ps-font-info-database'.
c3d6d211
GM
2826You can get all the fonts of YOUR printer using `ReportAllFontInfo'.
2827
319acba0
GM
2828Note also that ps-print DOESN'T download any font to your printer, instead it
2829uses the fonts resident in your printer."
ef1159c2
EZ
2830 :type '(repeat
2831 (list :tag "Font Definition"
2832 (symbol :tag "Font Family")
2833 (cons :format "%v"
2834 (const :format "" fonts)
2835 (repeat :tag "Faces"
2836 (cons (choice :menu-tag "Font Weight/Slant"
2837 :tag "Font Weight/Slant"
2838 (const normal)
2839 (const bold)
2840 (const italic)
2841 (const bold-italic)
2842 (symbol :tag "Face"))
2843 (string :tag "Font Name"))))
2844 (cons :format "%v"
2845 (const :format "" size)
2846 (number :tag "Reference Size"))
2847 (cons :format "%v"
2848 (const :format "" line-height)
2849 (number :tag "Line Height"))
2850 (cons :format "%v"
2851 (const :format "" space-width)
2852 (number :tag "Space Width"))
2853 (cons :format "%v"
2854 (const :format "" avg-char-width)
2855 (number :tag "Average Character Width"))))
b6d0ac87 2856 :version "20"
e0af0d3e
RS
2857 :group 'ps-print-font)
2858
2859(defcustom ps-font-family 'Courier
9201cc28 2860 "Font family name for ordinary text, when generating PostScript."
e0af0d3e 2861 :type 'symbol
b6d0ac87 2862 :version "20"
e0af0d3e
RS
2863 :group 'ps-print-font)
2864
7d8b7e8e 2865(defcustom ps-font-size '(7 . 8.5)
9201cc28 2866 "Font size, in points, for ordinary text, when generating PostScript.
54b506db 2867Either a float or a cons of floats (LANDSCAPE-SIZE . PORTRAIT-SIZE)."
ef1159c2
EZ
2868 :type '(choice :menu-tag "Ordinary Text Font Size"
2869 :tag "Ordinary Text Font Size"
2870 (number :tag "Text Size")
7d8b7e8e
KH
2871 (cons :tag "Landscape/Portrait"
2872 (number :tag "Landscape Text Size")
2873 (number :tag "Portrait Text Size")))
b6d0ac87 2874 :version "20"
e0af0d3e
RS
2875 :group 'ps-print-font)
2876
2877(defcustom ps-header-font-family 'Helvetica
9201cc28 2878 "Font family name for text in the header, when generating PostScript."
e0af0d3e 2879 :type 'symbol
b6d0ac87 2880 :version "20"
e0af0d3e
RS
2881 :group 'ps-print-font)
2882
7d8b7e8e 2883(defcustom ps-header-font-size '(10 . 12)
9201cc28 2884 "Font size, in points, for text in the header, when generating PostScript.
54b506db 2885Either a float or a cons of floats (LANDSCAPE-SIZE . PORTRAIT-SIZE)."
ef1159c2
EZ
2886 :type '(choice :menu-tag "Header Font Size"
2887 :tag "Header Font Size"
2888 (number :tag "Header Size")
7d8b7e8e
KH
2889 (cons :tag "Landscape/Portrait"
2890 (number :tag "Landscape Header Size")
2891 (number :tag "Portrait Header Size")))
b6d0ac87 2892 :version "20"
e0af0d3e
RS
2893 :group 'ps-print-font)
2894
7d8b7e8e 2895(defcustom ps-header-title-font-size '(12 . 14)
9201cc28 2896 "Font size, in points, for the top line of text in header, in PostScript.
54b506db 2897Either a float or a cons of floats (LANDSCAPE-SIZE . PORTRAIT-SIZE)."
ef1159c2
EZ
2898 :type '(choice :menu-tag "Header Title Font Size"
2899 :tag "Header Title Font Size"
2900 (number :tag "Header Title Size")
7d8b7e8e
KH
2901 (cons :tag "Landscape/Portrait"
2902 (number :tag "Landscape Header Title Size")
2903 (number :tag "Portrait Header Title Size")))
b6d0ac87 2904 :version "20"
e0af0d3e 2905 :group 'ps-print-font)
bcc0d457 2906
319acba0 2907(defcustom ps-footer-font-family 'Helvetica
9201cc28 2908 "Font family name for text in the footer, when generating PostScript."
319acba0 2909 :type 'symbol
b6d0ac87 2910 :version "21.1"
319acba0
GM
2911 :group 'ps-print-font)
2912
2913(defcustom ps-footer-font-size '(10 . 12)
9201cc28 2914 "Font size, in points, for text in the footer, when generating PostScript.
54b506db 2915Either a float or a cons of floats (LANDSCAPE-SIZE . PORTRAIT-SIZE)."
319acba0
GM
2916 :type '(choice :menu-tag "Footer Font Size"
2917 :tag "Footer Font Size"
2918 (number :tag "Footer Size")
2919 (cons :tag "Landscape/Portrait"
2920 (number :tag "Landscape Footer Size")
2921 (number :tag "Portrait Footer Size")))
b6d0ac87 2922 :version "21.1"
319acba0
GM
2923 :group 'ps-print-font)
2924
2925(defcustom ps-line-number-color "black"
9201cc28 2926 "Specify color for line-number, when generating PostScript."
319acba0
GM
2927 :type '(choice :menu-tag "Line Number Color"
2928 :tag "Line Number Color"
2929 (number :tag "Gray Scale" :value 0)
2930 (string :tag "Color Name" :value "black")
2931 (list :tag "RGB Color" :value (0 0 0)
2932 (number :tag "Red")
2933 (number :tag "Green")
2934 (number :tag "Blue")))
2935 :version "21.1"
2936 :group 'ps-print-font
2937 :group 'ps-print-miscellany)
2938
ef1159c2 2939(defcustom ps-line-number-font "Times-Italic"
9201cc28 2940 "Font for line-number, when generating PostScript."
ef1159c2 2941 :type 'string
b6d0ac87 2942 :version "20"
ef1159c2
EZ
2943 :group 'ps-print-font
2944 :group 'ps-print-miscellany)
2945
2946(defcustom ps-line-number-font-size 6
9201cc28 2947 "Font size, in points, for line number, when generating PostScript.
54b506db 2948Either a float or a cons of floats (LANDSCAPE-SIZE . PORTRAIT-SIZE)."
ef1159c2
EZ
2949 :type '(choice :menu-tag "Line Number Font Size"
2950 :tag "Line Number Font Size"
2951 (number :tag "Font Size")
2952 (cons :tag "Landscape/Portrait"
2953 (number :tag "Landscape Font Size")
2954 (number :tag "Portrait Font Size")))
b6d0ac87 2955 :version "20"
ef1159c2
EZ
2956 :group 'ps-print-font
2957 :group 'ps-print-miscellany)
2958
bcc0d457
RS
2959;;; Colors
2960
87a16a06 2961;; Printing color requires x-color-values.
c90a10fa
RS
2962;; XEmacs change: Need autoload for the "Options->Printing->Color Printing"
2963;; widget to work.
2964;;;###autoload
ea0c615d 2965(defcustom ps-print-color-p
509b4dbc 2966 (or (fboundp 'x-color-values) ; Emacs
ea0c615d 2967 (fboundp 'color-instance-rgb-components))
857686a6 2968 ; XEmacs
9201cc28 2969 "Specify how buffer's text color is printed.
55732434
GM
2970
2971Valid values are:
2972
2973 nil Do not print colors.
2974
2975 t Print colors.
2976
2977 black-white Print colors on black/white printer.
2978 See also `ps-black-white-faces'.
2979
2980Any other value is treated as t."
2981 :type '(choice :menu-tag "Print Color"
2982 :tag "Print Color"
2983 (const :tag "Do NOT Print Color" nil)
2984 (const :tag "Print Always Color" t)
2985 (const :tag "Print Black/White Color" black-white))
b6d0ac87 2986 :version "20"
e0af0d3e 2987 :group 'ps-print-color)
12d89a2e 2988
f1024355 2989(defcustom ps-default-fg nil
9201cc28 2990 "RGB values of the default foreground color.
e59d29d6
VJL
2991
2992The `ps-default-fg' variable contains the default foreground color used by
2993ps-print, that is, if there is a face in a text that doesn't have a foreground
2994color, the `ps-default-fg' color should be used.
2995
2996Valid values are:
2997
2998 t The foreground color of Emacs session will be used.
2999
830f437e
VJL
3000 frame-parameter The foreground-color frame parameter will be used.
3001
e59d29d6
VJL
3002 NUMBER It's a real value between 0.0 (black) and 1.0 (white) that
3003 indicate the gray color.
3004
640477ee 3005 COLOR-NAME It's a string which contains the color name. For example:
e59d29d6
VJL
3006 \"yellow\".
3007
3008 LIST It's a list of RGB values, that is a list of three real values
3009 of the form:
3010
212db81d 3011 (RED GREEN BLUE)
e59d29d6
VJL
3012
3013 Where RED, GREEN and BLUE are reals between 0.0 (no color) and
3014 1.0 (full color).
3015
830f437e 3016Any other value is ignored and black color will be used.
e59d29d6 3017
905350be
VJL
3018This variable is used only when `ps-print-color-p' (which see) is neither nil
3019nor black-white."
8e234846
GM
3020 :type '(choice :menu-tag "Default Foreground Gray/Color"
3021 :tag "Default Foreground Gray/Color"
c794a94d 3022 (const :tag "Session Foreground" t)
830f437e 3023 (const :tag "Frame Foreground" frame-parameter)
6e1b1da6
GM
3024 (number :tag "Gray Scale" :value 0.0)
3025 (string :tag "Color Name" :value "black")
3026 (list :tag "RGB Color" :value (0.0 0.0 0.0)
3027 (number :tag "Red")
3028 (number :tag "Green")
3029 (number :tag "Blue")))
b6d0ac87 3030 :version "20"
e0af0d3e 3031 :group 'ps-print-color)
12d89a2e 3032
f1024355 3033(defcustom ps-default-bg nil
9201cc28 3034 "RGB values of the default background color.
e59d29d6
VJL
3035
3036The `ps-default-bg' variable contains the default background color used by
3037ps-print, that is, if there is a face in a text that doesn't have a background
3038color, the `ps-default-bg' color should be used.
3039
3040Valid values are:
3041
3042 t The background color of Emacs session will be used.
3043
830f437e
VJL
3044 frame-parameter The background-color frame parameter will be used.
3045
e59d29d6
VJL
3046 NUMBER It's a real value between 0.0 (black) and 1.0 (white) that
3047 indicate the gray color.
3048
640477ee 3049 COLOR-NAME It's a string which contains the color name. For example:
e59d29d6
VJL
3050 \"yellow\".
3051
3052 LIST It's a list of RGB values, that is a list of three real values
3053 of the form:
3054
212db81d 3055 (RED GREEN BLUE)
e59d29d6
VJL
3056
3057 Where RED, GREEN and BLUE are reals between 0.0 (no color) and
3058 1.0 (full color).
3059
830f437e 3060Any other value is ignored and white color will be used.
e59d29d6 3061
905350be
VJL
3062This variable is used only when `ps-print-color-p' (which see) is neither nil
3063nor black-white.
e59d29d6
VJL
3064
3065See also `ps-use-face-background'."
8e234846
GM
3066 :type '(choice :menu-tag "Default Background Gray/Color"
3067 :tag "Default Background Gray/Color"
c794a94d 3068 (const :tag "Session Background" t)
830f437e 3069 (const :tag "Frame Background" frame-parameter)
6e1b1da6
GM
3070 (number :tag "Gray Scale" :value 1.0)
3071 (string :tag "Color Name" :value "white")
3072 (list :tag "RGB Color" :value (1.0 1.0 1.0)
3073 (number :tag "Red")
3074 (number :tag "Green")
3075 (number :tag "Blue")))
b6d0ac87 3076 :version "20"
e0af0d3e 3077 :group 'ps-print-color)
12d89a2e 3078
212db81d 3079(defcustom ps-fg-list nil
9201cc28 3080 "Specify foreground color list.
212db81d
VJL
3081
3082This list is used to chose a text foreground color which is different than the
3083background color. It'll be used the first foreground color in `ps-fg-list'
3084which is different from the background color.
3085
3086If this list is nil, the default foreground color is used. See
3087`ps-default-fg'.
3088
3089The list element valid values are:
3090
3091 NUMBER It's a real value between 0.0 (black) and 1.0 (white) that
3092 indicate the gray color.
3093
3094 COLOR-NAME It's a string which contains the color name. For example:
3095 \"yellow\".
3096
3097 LIST It's a list of RGB values, that is a list of three real values
3098 of the form:
3099
3100 (RED GREEN BLUE)
3101
3102 Where RED, GREEN and BLUE are reals between 0.0 (no color) and
3103 1.0 (full color).
3104
3105Any other value is ignored and black color will be used.
3106
3107This variable is used only when `ps-fg-validate-p' (which see) is non-nil and
3108when `ps-print-color-p' (which see) is neither nil nor black-white."
3109 :type '(repeat
3110 (choice :menu-tag "Foreground Gray/Color"
3111 :tag "Foreground Gray/Color"
3112 (number :tag "Gray Scale" :value 0.0)
3113 (string :tag "Color Name" :value "black")
3114 (list :tag "RGB Color" :value (0.0 0.0 0.0)
3115 (number :tag "Red")
3116 (number :tag "Green")
3117 (number :tag "Blue"))))
3118 :version "22"
3119 :group 'ps-print-color)
3120
3121(defcustom ps-fg-validate-p t
9201cc28 3122 "Non-nil means validate if foreground color is different than background.
212db81d
VJL
3123
3124If text foreground and background colors are equals, no text will appear.
3125
3126See also `ps-fg-list'."
3127 :type 'boolean
3128 :version "22"
3129 :group 'ps-print-color)
3130
e0af0d3e 3131(defcustom ps-auto-font-detect t
9201cc28 3132 "Non-nil means automatically detect bold/italic/underline face attributes.
319acba0
GM
3133If nil, we rely solely on the lists `ps-bold-faces', `ps-italic-faces', and
3134`ps-underlined-faces'."
e0af0d3e 3135 :type 'boolean
b6d0ac87 3136 :version "20"
e0af0d3e 3137 :group 'ps-print-font)
12d89a2e 3138
55732434
GM
3139(defcustom ps-black-white-faces
3140 '((font-lock-builtin-face "black" nil bold )
3141 (font-lock-comment-face "gray20" nil italic)
3142 (font-lock-constant-face "black" nil bold )
3143 (font-lock-function-name-face "black" nil bold )
3144 (font-lock-keyword-face "black" nil bold )
3145 (font-lock-string-face "black" nil italic)
3146 (font-lock-type-face "black" nil italic)
3147 (font-lock-variable-name-face "black" nil bold italic)
3148 (font-lock-warning-face "black" nil bold italic))
9201cc28 3149 "Specify list of face attributes to print colors on black/white printers.
55732434
GM
3150
3151The list elements are the same as defined on `ps-extend-face' (which see).
3152
3153This variable is used only when `ps-print-color-p' is set to `black-white'."
3154 :version "21.1"
3155 :type '(repeat
3156 (list :tag "Face Specification"
3157 (face :tag "Face Symbol")
3158 (choice :menu-tag "Foreground Color"
3159 :tag "Foreground Color"
3160 (const :tag "Black" nil)
3161 (string :tag "Color Name"))
3162 (choice :menu-tag "Background Color"
3163 :tag "Background Color"
3164 (const :tag "None" nil)
3165 (string :tag "Color Name"))
3166 (repeat :inline t
3167 (choice :menu-tag "Attribute"
3168 (const bold)
3169 (const italic)
3170 (const underline)
3171 (const strikeout)
3172 (const overline)
3173 (const shadow)
3174 (const box)
3175 (const outline)))))
b6d0ac87 3176 :version "20"
55732434
GM
3177 :group 'ps-print-face)
3178
e0af0d3e 3179(defcustom ps-bold-faces
090be653
RS
3180 (unless ps-print-color-p
3181 '(font-lock-function-name-face
3182 font-lock-builtin-face
3183 font-lock-variable-name-face
3184 font-lock-keyword-face
3185 font-lock-warning-face))
9201cc28 3186 "A list of the \(non-bold\) faces that should be printed in bold font.
8bd22fcf 3187This applies to generating PostScript."
e0af0d3e 3188 :type '(repeat face)
b6d0ac87 3189 :version "20"
e0af0d3e 3190 :group 'ps-print-face)
12d89a2e 3191
e0af0d3e 3192(defcustom ps-italic-faces
090be653
RS
3193 (unless ps-print-color-p
3194 '(font-lock-variable-name-face
8bd22fcf 3195 font-lock-type-face
090be653
RS
3196 font-lock-string-face
3197 font-lock-comment-face
3198 font-lock-warning-face))
9201cc28 3199 "A list of the \(non-italic\) faces that should be printed in italic font.
8bd22fcf 3200This applies to generating PostScript."
e0af0d3e 3201 :type '(repeat face)
b6d0ac87 3202 :version "20"
e0af0d3e 3203 :group 'ps-print-face)
12d89a2e 3204
e0af0d3e 3205(defcustom ps-underlined-faces
090be653
RS
3206 (unless ps-print-color-p
3207 '(font-lock-function-name-face
883212ce 3208 font-lock-constant-face
090be653 3209 font-lock-warning-face))
9201cc28 3210 "A list of the \(non-underlined\) faces that should be printed underlined.
8bd22fcf 3211This applies to generating PostScript."
e0af0d3e 3212 :type '(repeat face)
b6d0ac87 3213 :version "20"
e0af0d3e 3214 :group 'ps-print-face)
12d89a2e 3215
906d41a7 3216(defcustom ps-use-face-background nil
9201cc28 3217 "Specify if face background should be used.
906d41a7
GM
3218
3219Valid values are:
3220
3221 t always use face background color.
3222 nil never use face background color.
3223 (face...) list of faces whose background color will be used.
3224
3225Any other value will be treated as t."
8e234846
GM
3226 :type '(choice :menu-tag "Use Face Background"
3227 :tag "Use Face Background"
906d41a7
GM
3228 (const :tag "Always Use Face Background" t)
3229 (const :tag "Never Use Face Background" nil)
3230 (repeat :menu-tag "Face Background List"
3231 :tag "Face Background List"
3232 face))
b6d0ac87 3233 :version "20"
906d41a7
GM
3234 :group 'ps-print-face)
3235
e0af0d3e 3236(defcustom ps-left-header
12d89a2e 3237 (list 'ps-get-buffer-name 'ps-header-dirpart)
9201cc28 3238 "The items to display (each on a line) on the left part of the page header.
8bd22fcf 3239This applies to generating PostScript.
12d89a2e 3240
319acba0
GM
3241The value should be a list of strings and symbols, each representing an entry
3242in the PostScript array HeaderLinesLeft.
12d89a2e
RS
3243
3244Strings are inserted unchanged into the array; those representing
3245PostScript string literals should be delimited with PostScript string
3246delimiters '(' and ')'.
3247
319acba0
GM
3248For symbols with bound functions, the function is called and should return a
3249string to be inserted into the array. For symbols with bound values, the value
3250should be a string to be inserted into the array. In either case, function or
6b61353c
KH
3251variable, the string value has PostScript string delimiters added to it.
3252
3253If symbols are unbounded, they are silently ignored."
ef1159c2
EZ
3254 :type '(repeat (choice :menu-tag "Left Header"
3255 :tag "Left Header"
3256 string symbol))
b6d0ac87 3257 :version "20"
6e1b1da6 3258 :group 'ps-print-headers)
12d89a2e 3259
e0af0d3e 3260(defcustom ps-right-header
2bd80d73 3261 (list "/pagenumberstring load"
4b81a999 3262 'ps-time-stamp-locale-default 'ps-time-stamp-hh:mm:ss)
9201cc28 3263 "The items to display (each on a line) on the right part of the page header.
8bd22fcf 3264This applies to generating PostScript.
12d89a2e 3265
319acba0 3266See the variable `ps-left-header' for a description of the format of this
4b81a999
GM
3267variable.
3268
3269There are the following basic functions implemented:
3270
3271 `ps-time-stamp-locale-default' Return the locale's \"preferred\" date
3272 as, for example, \"06/18/01\".
3273
3274 `ps-time-stamp-hh:mm:ss' Return time as \"17:28:31\".
3275
3276 `ps-time-stamp-mon-dd-yyyy' Return date as \"Jun 18 2001\".
3277
6b61353c
KH
3278 `ps-time-stamp-yyyy-mm-dd' Return date as \"2001-06-18\" (ISO
3279 date).
3280
3281 `ps-time-stamp-iso8601' Alias for `ps-time-stamp-yyyy-mm-dd'.
3282
4b81a999 3283You can also create your own time stamp function by using `format-time-string'
2285bf9d 3284\(which see)."
ef1159c2
EZ
3285 :type '(repeat (choice :menu-tag "Right Header"
3286 :tag "Right Header"
3287 string symbol))
b6d0ac87 3288 :version "20"
6e1b1da6 3289 :group 'ps-print-headers)
ef2cbb24 3290
319acba0
GM
3291(defcustom ps-left-footer
3292 (list 'ps-get-buffer-name 'ps-header-dirpart)
9201cc28 3293 "The items to display (each on a line) on the left part of the page footer.
319acba0
GM
3294This applies to generating PostScript.
3295
3296The value should be a list of strings and symbols, each representing an entry
3297in the PostScript array FooterLinesLeft.
3298
3299Strings are inserted unchanged into the array; those representing PostScript
3300string literals should be delimited with PostScript string delimiters '(' and
3301')'.
3302
3303For symbols with bound functions, the function is called and should return a
3304string to be inserted into the array. For symbols with bound values, the value
3305should be a string to be inserted into the array. In either case, function or
6b61353c
KH
3306variable, the string value has PostScript string delimiters added to it.
3307
3308If symbols are unbounded, they are silently ignored."
319acba0
GM
3309 :type '(repeat (choice :menu-tag "Left Footer"
3310 :tag "Left Footer"
3311 string symbol))
b6d0ac87 3312 :version "21.1"
319acba0
GM
3313 :group 'ps-print-headers)
3314
3315(defcustom ps-right-footer
3316 (list "/pagenumberstring load"
4b81a999 3317 'ps-time-stamp-locale-default 'ps-time-stamp-hh:mm:ss)
9201cc28 3318 "The items to display (each on a line) on the right part of the page footer.
319acba0
GM
3319This applies to generating PostScript.
3320
3321See the variable `ps-left-footer' for a description of the format of this
4b81a999
GM
3322variable.
3323
3324There are the following basic functions implemented:
3325
3326 `ps-time-stamp-locale-default' Return the locale's \"preferred\" date
3327 as, for example, \"06/18/01\".
3328
3329 `ps-time-stamp-hh:mm:ss' Return time as \"17:28:31\".
3330
3331 `ps-time-stamp-mon-dd-yyyy' Return date as \"Jun 18 2001\".
3332
6b61353c
KH
3333 `ps-time-stamp-yyyy-mm-dd' Return date as \"2001-06-18\" (ISO
3334 date).
3335
3336 `ps-time-stamp-iso8601' Alias for `ps-time-stamp-yyyy-mm-dd'.
3337
4b81a999 3338You can also create your own time stamp function by using `format-time-string'
2285bf9d 3339\(which see)."
319acba0
GM
3340 :type '(repeat (choice :menu-tag "Right Footer"
3341 :tag "Right Footer"
3342 string symbol))
b6d0ac87 3343 :version "21.1"
319acba0
GM
3344 :group 'ps-print-headers)
3345
e0af0d3e 3346(defcustom ps-razzle-dazzle t
9201cc28 3347 "Non-nil means report progress while formatting buffer."
e0af0d3e 3348 :type 'boolean
b6d0ac87 3349 :version "20"
6e1b1da6 3350 :group 'ps-print-miscellany)
12d89a2e 3351
a18ed129 3352(defcustom ps-adobe-tag "%!PS-Adobe-3.0\n"
9201cc28 3353 "Contains the header line identifying the output as PostScript.
319acba0
GM
3354By default, `ps-adobe-tag' contains the standard identifier. Some printers
3355require slightly different versions of this line."
a18ed129 3356 :type 'string
b6d0ac87 3357 :version "20"
6e1b1da6 3358 :group 'ps-print-miscellany)
12d89a2e 3359
e0af0d3e 3360(defcustom ps-build-face-reference t
9201cc28 3361 "Non-nil means build the reference face lists.
12d89a2e 3362
319acba0 3363ps-print sets this value to nil after it builds its internal reference lists of
1b1200a1 3364bold and italic faces. By setting its value back to t, you can force ps-print
319acba0
GM
3365to rebuild the lists the next time you invoke one of the ...-with-faces
3366commands.
12d89a2e 3367
319acba0
GM
3368You should set this value back to t after you change the attributes of any
3369face, or create new faces. Most users shouldn't have to worry about its
3370setting, though."
e0af0d3e 3371 :type 'boolean
b6d0ac87 3372 :version "20"
e0af0d3e 3373 :group 'ps-print-face)
12d89a2e 3374
e0af0d3e 3375(defcustom ps-always-build-face-reference nil
9201cc28 3376 "Non-nil means always rebuild the reference face lists.
12d89a2e 3377
319acba0
GM
3378If this variable is non-nil, ps-print will rebuild its internal reference lists
3379of bold and italic faces *every* time one of the ...-with-faces commands is
3380called. Most users shouldn't need to set this variable."
e0af0d3e 3381 :type 'boolean
b6d0ac87 3382 :version "20"
e0af0d3e 3383 :group 'ps-print-face)
ef2cbb24 3384
bc0d41bd 3385(defcustom ps-banner-page-when-duplexing nil
9201cc28 3386 "Non-nil means the very first page is skipped.
bc0d41bd
KH
3387It's like the very first character of buffer (or region) is ^L (\\014)."
3388 :type 'boolean
b6d0ac87 3389 :version "20"
6e1b1da6 3390 :group 'ps-print-headers)
bc0d41bd 3391
98f2fbe7 3392(defcustom ps-postscript-code-directory
b6d0ac87 3393 (or (if (featurep 'xemacs)
9e53076e 3394 (cond ((fboundp 'locate-data-directory) ; XEmacs
c97a3f22 3395 (funcall 'locate-data-directory "ps-print"))
9e53076e 3396 ((boundp 'data-directory) ; XEmacs
c97a3f22 3397 (symbol-value 'data-directory))
b6d0ac87
VJL
3398 (t ; don't know what to do
3399 nil))
9e53076e 3400 data-directory) ; Emacs
eafa92bf 3401 (error "`ps-postscript-code-directory' isn't set properly"))
9201cc28 3402 "Directory where it's located the PostScript prologue file used by ps-print.
41481e4b
KH
3403By default, this directory is the same as in the variable `data-directory'."
3404 :type 'directory
b6d0ac87 3405 :version "20"
6e1b1da6 3406 :group 'ps-print-miscellany)
41481e4b 3407
6bf5fb46 3408(defcustom ps-line-spacing 0
9201cc28 3409 "Specify line spacing, in points, for ordinary text.
6bf5fb46 3410
5d1d76ac
VJL
3411Either a float or a cons of floats (LANDSCAPE-SIZE . PORTRAIT-SIZE).
3412
6bf5fb46
GM
3413See also `ps-paragraph-spacing' and `ps-paragraph-regexp'.
3414
3415To get all lines with some spacing set both `ps-line-spacing' and
3416`ps-paragraph-spacing' variables."
3417 :type '(choice :menu-tag "Line Spacing For Ordinary Text"
3418 :tag "Line Spacing For Ordinary Text"
3419 (number :tag "Line Spacing")
3420 (cons :tag "Landscape/Portrait"
3421 (number :tag "Landscape Line Spacing")
3422 (number :tag "Portrait Line Spacing")))
3423 :version "21.1"
3424 :group 'ps-print-miscellany)
3425
3426(defcustom ps-paragraph-spacing 0
9201cc28 3427 "Specify paragraph spacing, in points, for ordinary text.
6bf5fb46 3428
5d1d76ac
VJL
3429Either a float or a cons of floats (LANDSCAPE-SIZE . PORTRAIT-SIZE).
3430
6bf5fb46
GM
3431See also `ps-line-spacing' and `ps-paragraph-regexp'.
3432
3433To get all lines with some spacing set both `ps-line-spacing' and
3434`ps-paragraph-spacing' variables."
3435 :type '(choice :menu-tag "Paragraph Spacing For Ordinary Text"
3436 :tag "Paragraph Spacing For Ordinary Text"
3437 (number :tag "Paragraph Spacing")
3438 (cons :tag "Landscape/Portrait"
3439 (number :tag "Landscape Paragraph Spacing")
3440 (number :tag "Portrait Paragraph Spacing")))
3441 :version "21.1"
3442 :group 'ps-print-miscellany)
3443
3444(defcustom ps-paragraph-regexp "[ \t]*$"
9201cc28 3445 "Specify paragraph delimiter.
6bf5fb46
GM
3446
3447It should be a regexp or nil.
3448
3449See also `ps-paragraph-spacing'."
3450 :type '(choice :menu-tag "Paragraph Delimiter"
3451 (const :tag "No Delimiter" nil)
3452 (regexp :tag "Delimiter Regexp"))
3453 :version "21.1"
3454 :group 'ps-print-miscellany)
3455
3456(defcustom ps-begin-cut-regexp nil
9201cc28 3457 "Specify regexp which is start of a region to cut out when printing.
6bf5fb46
GM
3458
3459As an example, variables `ps-begin-cut-regexp' and `ps-end-cut-regexp' may be
3460set to \"^Local Variables:\" and \"^End:\", respectively, in order to leave out
3461some special printing instructions from the actual print. Special printing
3462instructions may be appended to the end of the file just like any other
3463buffer-local variables. See section \"Local Variables in Files\" on Emacs
3464manual for more information.
3465
3466Variables `ps-begin-cut-regexp' and `ps-end-cut-regexp' control together what
3467actually gets printed. Both variables may be set to nil in which case no
3468cutting occurs."
bf29d4c1
MR
3469 :type '(choice (const :tag "No Delimiter" nil)
3470 (regexp :tag "Delimiter Regexp"))
6bf5fb46
GM
3471 :version "21.1"
3472 :group 'ps-print-miscellany)
3473
3474(defcustom ps-end-cut-regexp nil
9201cc28 3475 "Specify regexp which is end of the region to cut out when printing.
6bf5fb46
GM
3476
3477See `ps-begin-cut-regexp' for more information."
bf29d4c1
MR
3478 :type '(choice (const :tag "No Delimiter" nil)
3479 (regexp :tag "Delimiter Regexp"))
6bf5fb46
GM
3480 :version "21.1"
3481 :group 'ps-print-miscellany)
3482
0a5daee5 3483
1fd9b7fe
GM
3484;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3485;; Selected Pages
3486
3487
3488(defvar ps-last-selected-pages nil
3489 "Latest `ps-selected-pages' value.")
3490
3491
3492(defun ps-restore-selected-pages ()
3493 "Restore latest `ps-selected-pages' value."
3494 (interactive)
3495 (setq ps-selected-pages ps-last-selected-pages))
3496
3497
0a5daee5
KH
3498;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3499;; Customization
3500
3501
3502;;;###autoload
3503(defun ps-print-customize ()
3504 "Customization of ps-print group."
3505 (interactive)
3506 (customize-group 'ps-print))
3507
3508
ef2cbb24 3509;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12d89a2e 3510;; User commands
ef2cbb24 3511
0a5daee5 3512
00aa16af 3513;;;###autoload
ef2cbb24 3514(defun ps-print-buffer (&optional filename)
12d89a2e 3515 "Generate and print a PostScript image of the buffer.
ef2cbb24 3516
2285bf9d 3517Interactively, when you use a prefix argument (\\[universal-argument]), the command prompts the
319acba0
GM
3518user for a file name, and saves the PostScript image in that file instead of
3519sending it to the printer.
ef2cbb24 3520
319acba0
GM
3521Noninteractively, the argument FILENAME is treated as follows: if it is nil,
3522send the image to the printer. If FILENAME is a string, save the PostScript
3523image in a file with that name."
00aa16af 3524 (interactive (list (ps-print-preprint current-prefix-arg)))
87a16a06 3525 (ps-print-without-faces (point-min) (point-max) filename))
ef2cbb24
RS
3526
3527
00aa16af 3528;;;###autoload
ef2cbb24 3529(defun ps-print-buffer-with-faces (&optional filename)
12d89a2e 3530 "Generate and print a PostScript image of the buffer.
319acba0
GM
3531Like `ps-print-buffer', but includes font, color, and underline information in
3532the generated image. This command works only if you are using a window system,
3533so it has a way to determine color values."
00aa16af 3534 (interactive (list (ps-print-preprint current-prefix-arg)))
87a16a06 3535 (ps-print-with-faces (point-min) (point-max) filename))
ef2cbb24 3536
ef2cbb24 3537
00aa16af 3538;;;###autoload
ef2cbb24 3539(defun ps-print-region (from to &optional filename)
12d89a2e 3540 "Generate and print a PostScript image of the region.
12d89a2e 3541Like `ps-print-buffer', but prints just the current region."
55732434 3542 (interactive (ps-print-preprint-region current-prefix-arg))
a18ed129 3543 (ps-print-without-faces from to filename t))
ef2cbb24 3544
ef2cbb24 3545
00aa16af 3546;;;###autoload
ef2cbb24 3547(defun ps-print-region-with-faces (from to &optional filename)
12d89a2e 3548 "Generate and print a PostScript image of the region.
319acba0
GM
3549Like `ps-print-region', but includes font, color, and underline information in
3550the generated image. This command works only if you are using a window system,
3551so it has a way to determine color values."
55732434 3552 (interactive (ps-print-preprint-region current-prefix-arg))
a18ed129 3553 (ps-print-with-faces from to filename t))
ef2cbb24 3554
ef2cbb24 3555
00aa16af 3556;;;###autoload
ef2cbb24 3557(defun ps-spool-buffer ()
12d89a2e 3558 "Generate and spool a PostScript image of the buffer.
319acba0
GM
3559Like `ps-print-buffer' except that the PostScript image is saved in a local
3560buffer to be sent to the printer later.
ef2cbb24 3561
12d89a2e 3562Use the command `ps-despool' to send the spooled images to the printer."
ef2cbb24 3563 (interactive)
87a16a06 3564 (ps-spool-without-faces (point-min) (point-max)))
ef2cbb24 3565
ef2cbb24 3566
00aa16af 3567;;;###autoload
ef2cbb24 3568(defun ps-spool-buffer-with-faces ()
12d89a2e 3569 "Generate and spool a PostScript image of the buffer.
319acba0
GM
3570Like `ps-spool-buffer', but includes font, color, and underline information in
3571the generated image. This command works only if you are using a window system,
3572so it has a way to determine color values.
ef2cbb24 3573
12d89a2e 3574Use the command `ps-despool' to send the spooled images to the printer."
ef2cbb24 3575 (interactive)
87a16a06 3576 (ps-spool-with-faces (point-min) (point-max)))
ef2cbb24 3577
ef2cbb24 3578
00aa16af 3579;;;###autoload
ef2cbb24 3580(defun ps-spool-region (from to)
12d89a2e 3581 "Generate a PostScript image of the region and spool locally.
12d89a2e 3582Like `ps-spool-buffer', but spools just the current region.
ef2cbb24 3583
12d89a2e 3584Use the command `ps-despool' to send the spooled images to the printer."
ef2cbb24 3585 (interactive "r")
a18ed129 3586 (ps-spool-without-faces from to t))
ef2cbb24 3587
ef2cbb24 3588
00aa16af 3589;;;###autoload
ef2cbb24 3590(defun ps-spool-region-with-faces (from to)
12d89a2e 3591 "Generate a PostScript image of the region and spool locally.
319acba0
GM
3592Like `ps-spool-region', but includes font, color, and underline information in
3593the generated image. This command works only if you are using a window system,
3594so it has a way to determine color values.
ef2cbb24 3595
12d89a2e 3596Use the command `ps-despool' to send the spooled images to the printer."
ef2cbb24 3597 (interactive "r")
a18ed129 3598 (ps-spool-with-faces from to t))
ef2cbb24 3599
00aa16af 3600;;;###autoload
ef2cbb24
RS
3601(defun ps-despool (&optional filename)
3602 "Send the spooled PostScript to the printer.
3603
2285bf9d 3604Interactively, when you use a prefix argument (\\[universal-argument]), the command prompts the
319acba0
GM
3605user for a file name, and saves the spooled PostScript image in that file
3606instead of sending it to the printer.
ef2cbb24 3607
319acba0
GM
3608Noninteractively, the argument FILENAME is treated as follows: if it is nil,
3609send the image to the printer. If FILENAME is a string, save the PostScript
3610image in a file with that name."
00aa16af
RS
3611 (interactive (list (ps-print-preprint current-prefix-arg)))
3612 (ps-do-despool filename))
12d89a2e 3613
bcc0d457
RS
3614;;;###autoload
3615(defun ps-line-lengths ()
2285bf9d
RS
3616 "Display the correspondence between a line length and a font size.
3617Done using the current ps-print setup.
bcc0d457
RS
3618Try: pr -t file | awk '{printf \"%3d %s\n\", length($0), $0}' | sort -r | head"
3619 (interactive)
3620 (ps-line-lengths-internal))
3621
3622;;;###autoload
3623(defun ps-nb-pages-buffer (nb-lines)
06fb6aab
RS
3624 "Display number of pages to print this buffer, for various font heights.
3625The table depends on the current ps-print setup."
55732434 3626 (interactive (ps-count-lines-preprint (point-min) (point-max)))
bcc0d457
RS
3627 (ps-nb-pages nb-lines))
3628
3629;;;###autoload
3630(defun ps-nb-pages-region (nb-lines)
06fb6aab
RS
3631 "Display number of pages to print the region, for various font heights.
3632The table depends on the current ps-print setup."
55732434 3633 (interactive (ps-count-lines-preprint (mark) (point)))
bcc0d457
RS
3634 (ps-nb-pages nb-lines))
3635
c86f4619
GM
3636(defvar ps-prefix-quote nil
3637 "Used for `ps-print-quote' (which see).")
efa89c1f 3638
bcc0d457
RS
3639;;;###autoload
3640(defun ps-setup ()
496725ad 3641 "Return the current PostScript-generation setup."
efa89c1f 3642 (let (ps-prefix-quote)
319acba0 3643 (mapconcat
efa89c1f 3644 #'ps-print-quote
319acba0 3645 (list
9e53076e
VJL
3646 (concat "\n;;; (" (if (featurep 'xemacs) "XEmacs" "Emacs")
3647 ") ps-print version " ps-print-version "\n")
208ccc30 3648 ";; internal vars"
9e53076e
VJL
3649 (ps-comment-string "emacs-version " emacs-version)
3650 (ps-comment-string "ps-windows-system " ps-windows-system)
3651 (ps-comment-string "ps-lp-system " ps-lp-system)
208ccc30 3652 nil
319acba0
GM
3653 '(25 . ps-print-color-p)
3654 '(25 . ps-lpr-command)
3655 '(25 . ps-lpr-switches)
3656 '(25 . ps-printer-name)
3657 '(25 . ps-printer-name-option)
3658 '(25 . ps-print-region-function)
3659 '(25 . ps-manual-feed)
3660 '(25 . ps-end-with-control-d)
3661 nil
3662 '(23 . ps-paper-type)
3663 '(23 . ps-warn-paper-type)
3664 '(23 . ps-landscape-mode)
3665 '(23 . ps-print-upside-down)
3666 '(23 . ps-number-of-columns)
3667 nil
3668 '(23 . ps-zebra-stripes)
3669 '(23 . ps-zebra-stripe-height)
3670 '(23 . ps-zebra-stripe-follow)
3671 '(23 . ps-zebra-color)
3672 '(23 . ps-line-number)
3673 '(23 . ps-line-number-step)
3674 '(23 . ps-line-number-start)
3675 nil
319acba0 3676 '(17 . ps-razzle-dazzle)
212db81d
VJL
3677 '(17 . ps-default-bg)
3678 '(17 . ps-default-fg)
3679 '(17 . ps-fg-validate-p)
3680 '(17 . ps-fg-list)
319acba0
GM
3681 nil
3682 '(23 . ps-use-face-background)
3683 nil
3684 '(28 . ps-print-control-characters)
3685 nil
3686 '(26 . ps-print-background-image)
3687 nil
3688 '(25 . ps-print-background-text)
3689 nil
3690 '(29 . ps-error-handler-message)
3691 '(29 . ps-user-defined-prologue)
3692 '(29 . ps-print-prologue-header)
3693 '(29 . ps-postscript-code-directory)
3694 '(29 . ps-adobe-tag)
3695 nil
3696 '(30 . ps-left-margin)
3697 '(30 . ps-right-margin)
3698 '(30 . ps-inter-column)
3699 '(30 . ps-bottom-margin)
3700 '(30 . ps-top-margin)
3701 '(30 . ps-print-only-one-header)
3702 '(30 . ps-switch-header)
3703 '(30 . ps-print-header)
3704 '(30 . ps-header-lines)
3705 '(30 . ps-header-offset)
3706 '(30 . ps-header-line-pad)
3707 '(30 . ps-print-header-frame)
3708 '(30 . ps-header-frame-alist)
3709 '(30 . ps-print-footer)
3710 '(30 . ps-footer-lines)
3711 '(30 . ps-footer-offset)
3712 '(30 . ps-footer-line-pad)
3713 '(30 . ps-print-footer-frame)
3714 '(30 . ps-footer-frame-alist)
3715 '(30 . ps-show-n-of-n)
3716 '(30 . ps-spool-config)
3717 '(30 . ps-spool-duplex)
3718 '(30 . ps-spool-tumble)
3719 '(30 . ps-banner-page-when-duplexing)
3720 '(30 . ps-left-header)
3721 '(30 . ps-right-header)
3722 '(30 . ps-left-footer)
3723 '(30 . ps-right-footer)
3724 nil
3725 '(23 . ps-n-up-printing)
3726 '(23 . ps-n-up-margin)
3727 '(23 . ps-n-up-border-p)
3728 '(23 . ps-n-up-filling)
3729 nil
3730 '(26 . ps-multibyte-buffer)
3731 '(26 . ps-font-family)
3732 '(26 . ps-font-size)
3733 '(26 . ps-header-font-family)
3734 '(26 . ps-header-font-size)
3735 '(26 . ps-header-title-font-size)
3736 '(26 . ps-footer-font-family)
3737 '(26 . ps-footer-font-size)
3738 '(26 . ps-line-number-color)
3739 '(26 . ps-line-number-font)
3740 '(26 . ps-line-number-font-size)
3741 '(26 . ps-line-spacing)
3742 '(26 . ps-paragraph-spacing)
3743 '(26 . ps-paragraph-regexp)
3744 '(26 . ps-begin-cut-regexp)
3745 '(26 . ps-end-cut-regexp)
3746 nil
3747 '(23 . ps-even-or-odd-pages)
3748 '(23 . ps-selected-pages)
3749 '(23 . ps-last-selected-pages)
3750 nil
3751 '(31 . ps-build-face-reference)
3752 '(31 . ps-always-build-face-reference)
3753 nil
3754 '(20 . ps-auto-font-detect)
3755 '(20 . ps-bold-faces)
3756 '(20 . ps-italic-faces)
3757 '(20 . ps-underlined-faces)
55732434 3758 '(20 . ps-black-white-faces)
c86f4619 3759 " )\n
212db81d
VJL
3760\;; The following customized variables have long lists and are seldom modified:
3761\;; ps-page-dimensions-database
3762\;; ps-font-info-database
1fd9b7fe 3763
231f3e66 3764\;;; ps-print - end of settings\n")
319acba0 3765 "\n")))
bcc0d457 3766
0a5daee5 3767
12d89a2e
RS
3768;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3769;; Utility functions and variables:
3770
0a5daee5 3771
efa89c1f 3772(defun ps-print-quote (elt)
c86f4619
GM
3773 "Quote ELT for printing (used for showing settings).
3774
3775If ELT is nil, return an empty string.
3776If ELT is string, return it.
3777Otherwise, ELT should be a cons (LEN . SYM) where SYM is a variable symbol and
3778LEN is the field length where SYM name will be inserted. The variable
3779`ps-prefix-quote' is used to form the string, if `ps-prefix-quote' is nil, it's
3780used \"(setq \" as prefix; otherwise, it's used \" \". So, the string
3781generated is:
3782
3783 * If `ps-prefix-quote' is nil:
3784 \"(setq SYM-NAME SYM-VALUE\"
3785 |<------->|
3786 LEN
3787
3788 * If `ps-prefix-quote' is non-nil:
3789 \" SYM-NAME SYM-VALUE\"
3790 |<------->|
3791 LEN
3792
3793If `ps-prefix-quote' is nil, it's set to t after generating string."
efa89c1f 3794 (cond
efa89c1f 3795 ((stringp elt) elt)
c90a10fa
RS
3796 ((and (consp elt) (integerp (car elt))
3797 (symbolp (cdr elt)) (boundp (cdr elt)))
efa89c1f
GM
3798 (let* ((col (car elt))
3799 (sym (cdr elt))
3800 (key (symbol-name sym))
3801 (len (length key))
3802 (val (symbol-value sym)))
3803 (concat (if ps-prefix-quote
c86f4619
GM
3804 " "
3805 (setq ps-prefix-quote t)
efa89c1f
GM
3806 "(setq ")
3807 key
3808 (if (> col len)
b0fa9df7 3809 (make-string (- col len) ?\s)
efa89c1f 3810 " ")
51138c94 3811 (ps-value-string val))))
c90a10fa 3812 (t "")
efa89c1f
GM
3813 ))
3814
3815
51138c94
VJL
3816(defun ps-value-string (val)
3817 "Return a string representation of VAL. Used by `ps-print-quote'."
3818 (cond ((null val)
3819 "nil")
3820 ((eq val t)
3821 "t")
3822 ((or (symbolp val) (listp val))
3823 (format "'%S" val))
3824 (t
3825 (format "%S" val))))
3826
3827
bd20e8cd 3828(defun ps-comment-string (str value)
cfb7b9ce
VJL
3829 "Return a comment string like \";; STR = VALUE\"."
3830 (format ";; %s = %s" str (ps-value-string value)))
bd20e8cd
VJL
3831
3832
319acba0
GM
3833(defun ps-value (alist-sym key)
3834 "Return value from association list ALIST-SYM which car is `eq' to KEY."
3835 (cdr (assq key (symbol-value alist-sym))))
3836
3837
3838(defun ps-get (alist-sym key)
3839 "Return element from association list ALIST-SYM which car is `eq' to KEY."
3840 (assq key (symbol-value alist-sym)))
3841
3842
3843(defun ps-put (alist-sym key value)
3844 "Store element (KEY . VALUE) into association list ALIST-SYM.
3845If KEY already exists in ALIST-SYM, modify cdr to VALUE.
3846It can be retrieved with `(ps-get ALIST-SYM KEY)'."
3847 (let ((elt: (assq key (symbol-value alist-sym)))) ; to avoid name conflict
3848 (if elt:
3849 (setcdr elt: value)
3850 (setq elt: (cons key value))
3851 (set alist-sym (cons elt: (symbol-value alist-sym))))
3852 elt:))
3853
3854
3855(defun ps-del (alist-sym key)
3856 "Delete by side effect element KEY from association list ALIST-SYM."
3857 (let ((a:list: (symbol-value alist-sym)) ; to avoid name conflict
3858 old)
3859 (while a:list:
3860 (if (eq key (car (car a:list:)))
3861 (progn
3862 (if old
3863 (setcdr old (cdr a:list:))
3864 (set alist-sym (cdr a:list:)))
3865 (setq a:list: nil))
3866 (setq old a:list:
3867 a:list: (cdr a:list:)))))
3868 (symbol-value alist-sym))
3869
3870
4b81a999
GM
3871(defun ps-time-stamp-locale-default ()
3872 "Return the locale's \"preferred\" date as, for example, \"06/18/01\"."
3873 (format-time-string "%x"))
3874
3875
2bd80d73 3876(defun ps-time-stamp-mon-dd-yyyy ()
4b81a999 3877 "Return date as \"Jun 18 2001\"."
2bd80d73
GM
3878 (format-time-string "%b %d %Y"))
3879
3880
6b61353c
KH
3881(defun ps-time-stamp-yyyy-mm-dd ()
3882 "Return date as \"2001-06-18\" (ISO date)."
3883 (format-time-string "%Y-%m-%d"))
3884
3885
3a504454
VJL
3886;; Alias for `ps-time-stamp-yyyy-mm-dd' (which see).
3887(defalias 'ps-time-stamp-iso8601 'ps-time-stamp-yyyy-mm-dd)
6b61353c
KH
3888
3889
2bd80d73 3890(defun ps-time-stamp-hh:mm:ss ()
4b81a999 3891 "Return time as \"17:28:31\"."
2bd80d73
GM
3892 (format-time-string "%T"))
3893
3894
ea0c615d 3895(defvar ps-print-color-scale 1.0)
47b54c71 3896
3e9cb08f
GM
3897(defun ps-color-scale (color)
3898 ;; Scale 16-bit X-COLOR-VALUE to PostScript color value in [0, 1] interval.
3899 (mapcar #'(lambda (value) (/ value ps-print-color-scale))
3900 (ps-color-values color)))
3901
3902
3903(defun ps-face-underlined-p (face)
3904 (or (face-underline-p face)
3905 (memq face ps-underlined-faces)))
e65df0a1 3906
857686a6 3907
41481e4b 3908(defun ps-prologue-file (filenumber)
2285bf9d 3909 "If prologue FILENUMBER exists and is readable, return contents as string.
2bd80d73
GM
3910
3911Note: No major/minor-mode is activated and no local variables are evaluated for
3912 FILENUMBER, but proper EOL-conversion and character interpretation is
3913 done!"
3914 (let ((filename (convert-standard-filename
3915 (expand-file-name (format "ps-prin%d.ps" filenumber)
3916 ps-postscript-code-directory))))
3917 (if (and (file-exists-p filename)
319acba0
GM
3918 (file-readable-p filename))
3919 (with-temp-buffer
3920 (insert-file-contents filename)
3921 (buffer-string))
e8af40ee 3922 (error "ps-print PostScript prologue `%s' file was not found"
2bd80d73 3923 filename))))
bcc0d457 3924
bcc0d457 3925
374b7675 3926(defvar ps-mark-code-directory nil)
bcc0d457 3927
66e63857
GM
3928(defvar ps-print-prologue-0 ""
3929 "ps-print PostScript error handler.")
3930
41481e4b 3931(defvar ps-print-prologue-1 ""
6bf5fb46 3932 "ps-print PostScript prologue.")
12d89a2e
RS
3933
3934;; Start Editing Here:
ef2cbb24 3935
374b7675 3936(defvar ps-source-buffer nil)
12d89a2e 3937(defvar ps-spool-buffer-name "*PostScript*")
374b7675 3938(defvar ps-spool-buffer nil)
ef2cbb24 3939
374b7675
VJL
3940(defvar ps-output-head nil)
3941(defvar ps-output-tail nil)
ef2cbb24 3942
4b3eb10f
GM
3943(defvar ps-page-postscript 0) ; page number
3944(defvar ps-page-order 0) ; PostScript page counter
3945(defvar ps-page-sheet 0) ; sheet counter
3946(defvar ps-page-column 0) ; column counter
3947(defvar ps-page-printed 0) ; total pages printed
3948(defvar ps-page-n-up 0) ; n-up counter
bd7a2e26
GM
3949(defvar ps-lines-printed 0) ; total lines printed
3950(defvar ps-showline-count 1) ; line number counter
374b7675
VJL
3951(defvar ps-first-page nil)
3952(defvar ps-last-page nil)
ea0c615d 3953(defvar ps-print-page-p t)
87a16a06 3954
374b7675
VJL
3955(defvar ps-control-or-escape-regexp nil)
3956(defvar ps-n-up-on nil)
857686a6 3957
374b7675
VJL
3958(defvar ps-background-pages nil)
3959(defvar ps-background-all-pages nil)
87a16a06
RS
3960(defvar ps-background-text-count 0)
3961(defvar ps-background-image-count 0)
ef2cbb24 3962
12d89a2e 3963(defvar ps-current-font 0)
374b7675
VJL
3964(defvar ps-default-foreground nil)
3965(defvar ps-default-background nil)
3966(defvar ps-default-color nil)
3967(defvar ps-current-color nil)
3968(defvar ps-current-bg nil)
212db81d 3969(defvar ps-foreground-list nil)
12d89a2e 3970
374b7675 3971(defvar ps-zebra-stripe-full-p nil)
12d89a2e
RS
3972(defvar ps-razchunk 0)
3973
374b7675 3974(defvar ps-color-p nil)
12d89a2e 3975
319acba0
GM
3976;; These values determine how much print-height to deduct when headers/footers
3977;; are turned on. This is a pretty clumsy way of handling it, but it'll do for
3978;; now.
12d89a2e 3979
bcc0d457 3980(defvar ps-header-pad 0
496725ad
RS
3981 "Vertical and horizontal space between the header frame and the text.
3982This is in units of points (1/72 inch).")
12d89a2e 3983
319acba0
GM
3984(defvar ps-footer-pad 0
3985 "Vertical and horizontal space between the footer frame and the text.
3986This is in units of points (1/72 inch).")
3987
bcc0d457 3988;; Define accessors to the dimensions list.
12d89a2e 3989
bcc0d457
RS
3990(defmacro ps-page-dimensions-get-width (dims) `(nth 0 ,dims))
3991(defmacro ps-page-dimensions-get-height (dims) `(nth 1 ,dims))
bc0d41bd 3992(defmacro ps-page-dimensions-get-media (dims) `(nth 2 ,dims))
12d89a2e 3993
374b7675 3994(defvar ps-landscape-page-height nil)
12d89a2e 3995
374b7675
VJL
3996(defvar ps-print-width nil)
3997(defvar ps-print-height nil)
12d89a2e 3998
374b7675
VJL
3999(defvar ps-height-remaining nil)
4000(defvar ps-width-remaining nil)
12d89a2e 4001
374b7675
VJL
4002(defvar ps-font-size-internal nil)
4003(defvar ps-header-font-size-internal nil)
4004(defvar ps-header-title-font-size-internal nil)
4005(defvar ps-footer-font-size-internal nil)
4006(defvar ps-line-spacing-internal nil)
4007(defvar ps-paragraph-spacing-internal nil)
7d8b7e8e 4008
87a16a06
RS
4009\f
4010;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4011;; Internal Variables
4012
4013
55732434
GM
4014(defvar ps-black-white-faces-alist nil
4015 "Alist of symbolic faces used for black/white PostScript printers.
4016An element of this list has the same form as `ps-print-face-extension-alist'
2285bf9d 4017\(which see).
55732434
GM
4018
4019Don't change this list directly; instead,
4020use `ps-extend-face' and `ps-extend-face-list'.
4021See documentation for `ps-extend-face' for valid extension symbol.
4022See also documentation for `ps-print-color-p'.")
4023
4024
87a16a06 4025(defvar ps-print-face-extension-alist nil
a18ed129 4026 "Alist of symbolic faces *WITH* extension features (box, outline, etc).
87a16a06
RS
4027An element of this list has the following form:
4028
4029 (FACE . [BITS FG BG])
4030
4031 FACE is a symbol denoting a face name
4032 BITS is a bit vector, where each bit correspond
4033 to a feature (bold, underline, etc)
4034 (see documentation for `ps-print-face-map-alist')
4035 FG foreground color (string or nil)
4036 BG background color (string or nil)
4037
a18ed129
RS
4038Don't change this list directly; instead,
4039use `ps-extend-face' and `ps-extend-face-list'.
4040See documentation for `ps-extend-face' for valid extension symbol.")
4041
4042
4043(defvar ps-print-face-alist nil
4044 "Alist of symbolic faces *WITHOUT* extension features (box, outline, etc).
4045
4046An element of this list has the same form as an element of
4047`ps-print-face-extension-alist'.
4048
4049Don't change this list directly; this list is used by `ps-face-attributes',
4050`ps-map-face' and `ps-build-reference-face-lists'.")
87a16a06
RS
4051
4052
4053(defconst ps-print-face-map-alist
4054 '((bold . 1)
4055 (italic . 2)
4056 (underline . 4)
4057 (strikeout . 8)
4058 (overline . 16)
4059 (shadow . 32)
4060 (box . 64)
4061 (outline . 128))
4062 "Alist of all features and the corresponding bit mask.
4063Each symbol correspond to one bit in a bit vector.")
4064
4065\f
4066;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
a18ed129 4067;; Remapping Faces
87a16a06
RS
4068
4069
4070;;;###autoload
55732434
GM
4071(defun ps-extend-face-list (face-extension-list &optional merge-p alist-sym)
4072 "Extend face in ALIST-SYM.
87a16a06 4073
a18ed129 4074If optional MERGE-P is non-nil, extensions in FACE-EXTENSION-LIST are merged
55732434
GM
4075with face extension in ALIST-SYM; otherwise, overrides.
4076
01cdabc6 4077If optional ALIST-SYM is nil, `ps-print-face-extension-alist' is used;
55732434 4078otherwise, it should be an alist symbol.
87a16a06 4079
01cdabc6 4080The elements in FACE-EXTENSION-LIST are like those for `ps-extend-face'.
87a16a06
RS
4081
4082See `ps-extend-face' for documentation."
4083 (while face-extension-list
55732434 4084 (ps-extend-face (car face-extension-list) merge-p alist-sym)
87a16a06
RS
4085 (setq face-extension-list (cdr face-extension-list))))
4086
4087
4088;;;###autoload
55732434
GM
4089(defun ps-extend-face (face-extension &optional merge-p alist-sym)
4090 "Extend face in ALIST-SYM.
87a16a06 4091
6bdb808e 4092If optional MERGE-P is non-nil, extensions in FACE-EXTENSION list are merged
55732434
GM
4093with face extensions in ALIST-SYM; otherwise, overrides.
4094
01cdabc6 4095If optional ALIST-SYM is nil, `ps-print-face-extension-alist' is used;
55732434 4096otherwise, it should be an alist symbol.
87a16a06
RS
4097
4098The elements of FACE-EXTENSION list have the form:
4099
4100 (FACE-NAME FOREGROUND BACKGROUND EXTENSION...)
4101
4102FACE-NAME is a face name symbol.
4103
4104FOREGROUND and BACKGROUND may be nil or a string that denotes the
4105foreground and background colors respectively.
4106
4107EXTENSION is one of the following symbols:
4108 bold - use bold font.
4109 italic - use italic font.
4110 underline - put a line under text.
4111 strikeout - like underline, but the line is in middle of text.
4112 overline - like underline, but the line is over the text.
4113 shadow - text will have a shadow.
4114 box - text will be surrounded by a box.
a18ed129 4115 outline - print characters as hollow outlines.
87a16a06
RS
4116
4117If EXTENSION is any other symbol, it is ignored."
55732434
GM
4118 (or alist-sym
4119 (setq alist-sym 'ps-print-face-extension-alist))
4120 (let* ((background (nth 2 face-extension))
4121 (foreground (nth 1 face-extension))
4122 (face-name (nth 0 face-extension))
4123 (ps-face (cdr (assq face-name (symbol-value alist-sym))))
87a16a06 4124 (face-vector (or ps-face (vector 0 nil nil)))
55732434 4125 (face-bit (ps-extension-bit face-extension)))
87a16a06
RS
4126 ;; extend face
4127 (aset face-vector 0 (if merge-p
4128 (logior (aref face-vector 0) face-bit)
4129 face-bit))
55732434
GM
4130 (and (or (not merge-p) (and foreground (stringp foreground)))
4131 (aset face-vector 1 foreground))
4132 (and (or (not merge-p) (and background (stringp background)))
4133 (aset face-vector 2 background))
87a16a06
RS
4134 ;; if face does not exist, insert it
4135 (or ps-face
55732434
GM
4136 (set alist-sym (cons (cons face-name face-vector)
4137 (symbol-value alist-sym))))))
87a16a06
RS
4138
4139
4140(defun ps-extension-bit (face-extension)
4141 (let ((face-bit 0))
4142 ;; map valid symbol extension to bit vector
4143 (setq face-extension (cdr (cdr face-extension)))
4144 (while (setq face-extension (cdr face-extension))
4145 (setq face-bit (logior face-bit
4146 (or (cdr (assq (car face-extension)
4147 ps-print-face-map-alist))
4148 0))))
4149 face-bit))
4150
4151\f
857686a6 4152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
bc0d41bd 4153;; Adapted from font-lock: (obsolete stuff)
857686a6
RS
4154;; Originally face attributes were specified via `font-lock-face-attributes'.
4155;; Users then changed the default face attributes by setting that variable.
4156;; However, we try and be back-compatible and respect its value if set except
4157;; for faces where M-x customize has been used to save changes for the face.
4158
0a5daee5 4159
857686a6
RS
4160(defun ps-font-lock-face-attributes ()
4161 (and (boundp 'font-lock-mode) (symbol-value 'font-lock-mode)
4162 (boundp 'font-lock-face-attributes)
3e9cb08f 4163 (let ((face-attributes (symbol-value 'font-lock-face-attributes)))
857686a6 4164 (while face-attributes
6bdb808e
RS
4165 (let* ((face-attribute
4166 (car (prog1 face-attributes
4167 (setq face-attributes (cdr face-attributes)))))
857686a6
RS
4168 (face (car face-attribute)))
4169 ;; Rustle up a `defface' SPEC from a
4170 ;; `font-lock-face-attributes' entry.
4171 (unless (get face 'saved-face)
4172 (let ((foreground (nth 1 face-attribute))
4173 (background (nth 2 face-attribute))
4174 (bold-p (nth 3 face-attribute))
4175 (italic-p (nth 4 face-attribute))
4176 (underline-p (nth 5 face-attribute))
4177 face-spec)
4178 (when foreground
4179 (setq face-spec (cons ':foreground
4180 (cons foreground face-spec))))
4181 (when background
4182 (setq face-spec (cons ':background
4183 (cons background face-spec))))
4184 (when bold-p
e31c1fd5 4185 (setq face-spec (append '(:weight bold) face-spec)))
857686a6 4186 (when italic-p
e31c1fd5 4187 (setq face-spec (append '(:slant italic) face-spec)))
857686a6
RS
4188 (when underline-p
4189 (setq face-spec (append '(:underline t) face-spec)))
4190 (custom-declare-face face (list (list t face-spec)) nil)
4191 )))))))
4192
4193\f
87a16a06
RS
4194;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4195;; Internal functions and variables
4196
4197
6b61353c
KH
4198(defun ps-message-log-max ()
4199 (and (not (string= (buffer-name) "*Messages*"))
9586e1d3 4200 (boundp 'message-log-max)
6b61353c
KH
4201 message-log-max))
4202
4203
374b7675
VJL
4204(defvar ps-print-hook nil)
4205(defvar ps-print-begin-sheet-hook nil)
4206(defvar ps-print-begin-page-hook nil)
4207(defvar ps-print-begin-column-hook nil)
12b88fff
RS
4208
4209
a18ed129 4210(defun ps-print-without-faces (from to &optional filename region-p)
857686a6 4211 (ps-spool-without-faces from to region-p)
87a16a06
RS
4212 (ps-do-despool filename))
4213
4214
a18ed129 4215(defun ps-spool-without-faces (from to &optional region-p)
6b61353c
KH
4216 (let ((message-log-max (ps-message-log-max))) ; to print *Messages* buffer
4217 (run-hooks 'ps-print-hook)
4218 (ps-printing-region region-p from to)
4219 (ps-generate (current-buffer) from to 'ps-generate-postscript)))
87a16a06
RS
4220
4221
a18ed129 4222(defun ps-print-with-faces (from to &optional filename region-p)
857686a6 4223 (ps-spool-with-faces from to region-p)
87a16a06
RS
4224 (ps-do-despool filename))
4225
4226
a18ed129 4227(defun ps-spool-with-faces (from to &optional region-p)
6b61353c
KH
4228 (let ((message-log-max (ps-message-log-max))) ; to print *Messages* buffer
4229 (run-hooks 'ps-print-hook)
4230 (ps-printing-region region-p from to)
4231 (ps-generate (current-buffer) from to 'ps-generate-postscript-with-faces)))
87a16a06
RS
4232
4233
55732434 4234(defun ps-count-lines-preprint (from to)
6b61353c
KH
4235 (or (and from to)
4236 (error "The mark is not set now"))
4237 (let ((message-log-max (ps-message-log-max))) ; to count lines of *Messages*
4238 (list (count-lines from to))))
55732434
GM
4239
4240
bc0d41bd 4241(defun ps-count-lines (from to)
a18ed129 4242 (+ (count-lines from to)
857686a6
RS
4243 (save-excursion
4244 (goto-char to)
4245 (if (= (current-column) 0) 1 0))))
87a16a06
RS
4246
4247
a18ed129 4248(defvar ps-printing-region nil
9586e1d3 4249 "Variable used to indicate the region that ps-print is printing.
bc0d41bd
KH
4250It is a cons, the car of which is the line number where the region begins, and
4251its cdr is the total number of lines in the buffer. Formatting functions can
4252use this information to print the original line number (and not the number of
4253lines printed), and to indicate in the header that the printout is of a partial
4254file.")
4255
4256
4257(defvar ps-printing-region-p nil
4258 "Non-nil means ps-print is printing a region.")
87a16a06
RS
4259
4260
e22ba851 4261(defun ps-printing-region (region-p from to)
bc0d41bd
KH
4262 (setq ps-printing-region-p region-p
4263 ps-printing-region
4264 (cons (if region-p
e22ba851 4265 (ps-count-lines (point-min) (min from to))
bc0d41bd
KH
4266 1)
4267 (ps-count-lines (point-min) (point-max)))))
87a16a06
RS
4268
4269\f
12d89a2e
RS
4270;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4271;; Internal functions
4272
0a5daee5 4273
7ae35a2f 4274(defsubst ps-font-alist (font-sym)
12b88fff
RS
4275 (get font-sym 'fonts))
4276
4277(defun ps-font (font-sym font-type)
4278 "Font family name for text of `font-type', when generating PostScript."
7ae35a2f 4279 (let* ((font-list (ps-font-alist font-sym))
12b88fff 4280 (normal-font (cdr (assq 'normal font-list))))
6bdb808e
RS
4281 (while (and font-list (not (eq font-type (car (car font-list)))))
4282 (setq font-list (cdr font-list)))
4283 (or (cdr (car font-list)) normal-font)))
12b88fff 4284
319acba0 4285(defsubst ps-fonts (font-sym)
7ae35a2f 4286 (mapcar 'cdr (ps-font-alist font-sym)))
12b88fff 4287
319acba0 4288(defsubst ps-font-number (font-sym font-type)
7ae35a2f 4289 (or (ps-alist-position font-type (ps-font-alist font-sym))
12b88fff
RS
4290 0))
4291
4292(defsubst ps-line-height (font-sym)
4293 "The height of a line, for generating PostScript.
4294This is the value that ps-print uses to determine the height,
4295y-dimension, of the lines of text it has printed, and thus affects the
4296point at which page-breaks are placed.
4297The line-height is *not* the same as the point size of the font."
4298 (get font-sym 'line-height))
4299
4300(defsubst ps-title-line-height (font-sym)
4301 "The height of a `title' line, for generating PostScript.
4302This is the value that ps-print uses to determine the height,
4303y-dimension, of the lines of text it has printed, and thus affects the
4304point at which page-breaks are placed.
4305The title-line-height is *not* the same as the point size of the font."
4306 (get font-sym 'title-line-height))
4307
4308(defsubst ps-space-width (font-sym)
4309 "The width of a space character, for generating PostScript.
4310This value is used in expanding tab characters."
4311 (get font-sym 'space-width))
4312
4313(defsubst ps-avg-char-width (font-sym)
4314 "The average width, in points, of a character, for generating PostScript.
4315This is the value that ps-print uses to determine the length,
4316x-dimension, of the text it has printed, and thus affects the point at
4317which long lines wrap around."
4318 (get font-sym 'avg-char-width))
4319
bcc0d457 4320(defun ps-line-lengths-internal ()
2285bf9d
RS
4321 "Display the correspondence between a line length and a font size.
4322Done using the current ps-print setup.
bcc0d457 4323Try: pr -t file | awk '{printf \"%3d %s\n\", length($0), $0}' | sort -r | head"
df5e6194
GM
4324 (let* ((ps-font-size-internal
4325 (or ps-font-size-internal
4326 (ps-get-font-size 'ps-font-size)))
4327 (ps-header-font-size-internal
4328 (or ps-header-font-size-internal
4329 (ps-get-font-size 'ps-header-font-size)))
4330 (ps-header-title-font-size-internal
4331 (or ps-header-title-font-size-internal
4332 (ps-get-font-size 'ps-header-title-font-size)))
4333 (buf (get-buffer-create "*Line-lengths*"))
4334 (ifs ps-font-size-internal) ; initial font size
4335 (icw (ps-avg-char-width 'ps-font-for-text)) ; initial character width
4336 (print-width (progn (ps-get-page-dimensions)
4337 ps-print-width))
4338 (ps-setup (ps-setup)) ; setup for the current buffer
4339 (fs-min 5) ; minimum font size
4340 cw-min ; minimum character width
4341 nb-cpl-max ; maximum nb of characters per line
4342 (fs-max 14) ; maximum font size
4343 cw-max ; maximum character width
4344 nb-cpl-min ; minimum nb of characters per line
4345 fs ; current font size
4346 cw ; current character width
4347 nb-cpl ; current nb of characters per line
4348 )
bcc0d457
RS
4349 (setq cw-min (/ (* icw fs-min) ifs)
4350 nb-cpl-max (floor (/ print-width cw-min))
4351 cw-max (/ (* icw fs-max) ifs)
8bd22fcf
KH
4352 nb-cpl-min (floor (/ print-width cw-max))
4353 nb-cpl nb-cpl-min)
bcc0d457
RS
4354 (set-buffer buf)
4355 (goto-char (point-max))
df5e6194 4356 (or (bobp) (insert "\n" (make-string 75 ?\;) "\n"))
8bd22fcf 4357 (insert ps-setup
df5e6194 4358 "\nnb char per line / font size\n")
bcc0d457 4359 (while (<= nb-cpl nb-cpl-max)
8bd22fcf
KH
4360 (setq cw (/ print-width (float nb-cpl))
4361 fs (/ (* ifs cw) icw))
df5e6194 4362 (insert (format "%16d %s\n" nb-cpl fs))
bcc0d457
RS
4363 (setq nb-cpl (1+ nb-cpl)))
4364 (insert "\n")
4365 (display-buffer buf 'not-this-window)))
4366
4367(defun ps-nb-pages (nb-lines)
496725ad
RS
4368 "Display correspondence between font size and the number of pages.
4369The correspondence is based on having NB-LINES lines of text,
4370and on the current ps-print setup."
df5e6194
GM
4371 (let* ((ps-font-size-internal
4372 (or ps-font-size-internal
4373 (ps-get-font-size 'ps-font-size)))
4374 (ps-header-font-size-internal
4375 (or ps-header-font-size-internal
4376 (ps-get-font-size 'ps-header-font-size)))
4377 (ps-header-title-font-size-internal
4378 (or ps-header-title-font-size-internal
4379 (ps-get-font-size 'ps-header-title-font-size)))
6bf5fb46
GM
4380 (ps-line-spacing-internal
4381 (or ps-line-spacing-internal
4382 (ps-get-size ps-line-spacing "line spacing")))
df5e6194 4383 (buf (get-buffer-create "*Nb-Pages*"))
6bf5fb46 4384 (ils ps-line-spacing-internal) ; initial line spacing
df5e6194
GM
4385 (ifs ps-font-size-internal) ; initial font size
4386 (ilh (ps-line-height 'ps-font-for-text)) ; initial line height
4387 (page-height (progn (ps-get-page-dimensions)
4388 ps-print-height))
4389 (ps-setup (ps-setup)) ; setup for the current buffer
4390 (fs-min 4) ; minimum font size
4391 lh-min ; minimum line height
4392 nb-lpp-max ; maximum nb of lines per page
4393 nb-page-min ; minimum nb of pages
4394 (fs-max 14) ; maximum font size
4395 lh-max ; maximum line height
4396 nb-lpp-min ; minimum nb of lines per page
4397 nb-page-max ; maximum nb of pages
4398 fs ; current font size
4399 lh ; current line height
4400 nb-lpp ; current nb of lines per page
4401 nb-page ; current nb of pages
4402 )
6bf5fb46 4403 (setq lh-min (/ (- (* (+ ilh ils) fs-min) ils) ifs)
bcc0d457
RS
4404 nb-lpp-max (floor (/ page-height lh-min))
4405 nb-page-min (ceiling (/ (float nb-lines) nb-lpp-max))
6bf5fb46 4406 lh-max (/ (- (* (+ ilh ils) fs-max) ils) ifs)
bcc0d457 4407 nb-lpp-min (floor (/ page-height lh-max))
8bd22fcf
KH
4408 nb-page-max (ceiling (/ (float nb-lines) nb-lpp-min))
4409 nb-page nb-page-min)
bcc0d457
RS
4410 (set-buffer buf)
4411 (goto-char (point-max))
df5e6194 4412 (or (bobp) (insert "\n" (make-string 75 ?\;) "\n"))
8bd22fcf 4413 (insert ps-setup
df5e6194 4414 (format "\nThere are %d lines.\n\n" nb-lines)
8bd22fcf 4415 "nb page / font size\n")
bcc0d457
RS
4416 (while (<= nb-page nb-page-max)
4417 (setq nb-lpp (ceiling (/ nb-lines (float nb-page)))
4418 lh (/ page-height nb-lpp)
4419 fs (/ (* ifs lh) ilh))
df5e6194 4420 (insert (format "%7d %s\n" nb-page fs))
bcc0d457
RS
4421 (setq nb-page (1+ nb-page)))
4422 (insert "\n")
4423 (display-buffer buf 'not-this-window)))
4424
6bdb808e
RS
4425;; macros used in `ps-select-font'
4426(defmacro ps-lookup (key) `(cdr (assq ,key font-entry)))
4427(defmacro ps-size-scale (key) `(/ (* (ps-lookup ,key) font-size) size))
4428
12b88fff
RS
4429(defun ps-select-font (font-family sym font-size title-font-size)
4430 (let ((font-entry (cdr (assq font-family ps-font-info-database))))
4431 (or font-entry
ef1159c2 4432 (error "Don't have data to scale font %s. Known fonts families are %s"
12b88fff
RS
4433 font-family
4434 (mapcar 'car ps-font-info-database)))
6bdb808e
RS
4435 (let ((size (ps-lookup 'size)))
4436 (put sym 'fonts (ps-lookup 'fonts))
4437 (put sym 'space-width (ps-size-scale 'space-width))
4438 (put sym 'avg-char-width (ps-size-scale 'avg-char-width))
4439 (put sym 'line-height (ps-size-scale 'line-height))
4440 (put sym 'title-line-height
4441 (/ (* (ps-lookup 'line-height) title-font-size) size)))))
bcc0d457 4442
12d89a2e 4443(defun ps-get-page-dimensions ()
bcc0d457
RS
4444 (let ((page-dimensions (cdr (assq ps-paper-type ps-page-dimensions-database)))
4445 page-width page-height)
4446 (cond
4447 ((null page-dimensions)
4448 (error "`ps-paper-type' must be one of:\n%s"
4449 (mapcar 'car ps-page-dimensions-database)))
4450 ((< ps-number-of-columns 1)
12b88fff 4451 (error "The number of columns %d should be positive"
8bd22fcf 4452 ps-number-of-columns)))
bcc0d457 4453
12b88fff 4454 (ps-select-font ps-font-family 'ps-font-for-text
7d8b7e8e 4455 ps-font-size-internal ps-font-size-internal)
12b88fff 4456 (ps-select-font ps-header-font-family 'ps-font-for-header
7d8b7e8e
KH
4457 ps-header-font-size-internal
4458 ps-header-title-font-size-internal)
319acba0
GM
4459 (ps-select-font ps-footer-font-family 'ps-font-for-footer
4460 ps-footer-font-size-internal ps-footer-font-size-internal)
bcc0d457
RS
4461
4462 (setq page-width (ps-page-dimensions-get-width page-dimensions)
4463 page-height (ps-page-dimensions-get-height page-dimensions))
4464
4465 ;; Landscape mode
4466 (if ps-landscape-mode
4467 ;; exchange width and height
4468 (setq page-width (prog1 page-height (setq page-height page-width))))
4469
4470 ;; It is used to get the lower right corner (only in landscape mode)
4471 (setq ps-landscape-page-height page-height)
4472
4473 ;; | lm | text | ic | text | ic | text | rm |
4474 ;; page-width == lm + n * pw + (n - 1) * ic + rm
4475 ;; => pw == (page-width - lm -rm - (n - 1) * ic) / n
8bd22fcf
KH
4476 (setq ps-print-width (/ (- page-width
4477 ps-left-margin ps-right-margin
4478 (* (1- ps-number-of-columns) ps-inter-column))
4479 ps-number-of-columns))
bcc0d457
RS
4480 (if (<= ps-print-width 0)
4481 (error "Bad horizontal layout:
4482page-width == %s
4483ps-left-margin == %s
4484ps-right-margin == %s
4485ps-inter-column == %s
4486ps-number-of-columns == %s
4487| lm | text | ic | text | ic | text | rm |
4488page-width == lm + n * print-width + (n - 1) * ic + rm
4489=> print-width == %d !"
4490 page-width
4491 ps-left-margin
4492 ps-right-margin
4493 ps-inter-column
4494 ps-number-of-columns
4495 ps-print-width))
4496
4497 (setq ps-print-height
4498 (- page-height ps-bottom-margin ps-top-margin))
4499 (if (<= ps-print-height 0)
4500 (error "Bad vertical layout:
4501ps-top-margin == %s
4502ps-bottom-margin == %s
4503page-height == bm + print-height + tm
4504=> print-height == %d !"
4505 ps-top-margin
4506 ps-bottom-margin
4507 ps-print-height))
319acba0
GM
4508 ;; If headers are turned on, deduct the height of the header from the print
4509 ;; height.
8bd22fcf 4510 (if ps-print-header
12b88fff
RS
4511 (setq ps-header-pad (* ps-header-line-pad
4512 (ps-title-line-height 'ps-font-for-header))
8bd22fcf
KH
4513 ps-print-height (- ps-print-height
4514 ps-header-offset
4515 ps-header-pad
12b88fff
RS
4516 (ps-title-line-height 'ps-font-for-header)
4517 (* (ps-line-height 'ps-font-for-header)
4518 (1- ps-header-lines))
8bd22fcf 4519 ps-header-pad)))
bcc0d457 4520 (if (<= ps-print-height 0)
319acba0 4521 (error "Bad vertical layout (header):
bcc0d457
RS
4522ps-top-margin == %s
4523ps-bottom-margin == %s
4524ps-header-offset == %s
4525ps-header-pad == %s
4526header-height == %s
4527page-height == bm + print-height + tm - ho - hh
4528=> print-height == %d !"
4529 ps-top-margin
4530 ps-bottom-margin
4531 ps-header-offset
4532 ps-header-pad
4533 (+ ps-header-pad
12b88fff
RS
4534 (ps-title-line-height 'ps-font-for-header)
4535 (* (ps-line-height 'ps-font-for-header)
4536 (1- ps-header-lines))
bcc0d457 4537 ps-header-pad)
2bd80d73 4538 ps-print-height))
319acba0
GM
4539 ;; If footers are turned on, deduct the height of the footer from the print
4540 ;; height.
4541 (if ps-print-footer
4542 (setq ps-footer-pad (* ps-footer-line-pad
4543 (ps-title-line-height 'ps-font-for-footer))
4544 ps-print-height (- ps-print-height
4545 ps-footer-offset
4546 ps-footer-pad
4547 (* (ps-line-height 'ps-font-for-footer)
4548 (1- ps-footer-lines))
4549 ps-footer-pad)))
4550 (if (<= ps-print-height 0)
4551 (error "Bad vertical layout (footer):
4552ps-top-margin == %s
4553ps-bottom-margin == %s
4554ps-footer-offset == %s
4555ps-footer-pad == %s
4556footer-height == %s
4557page-height == bm + print-height + tm - fo - fh
4558=> print-height == %d !"
4559 ps-top-margin
4560 ps-bottom-margin
4561 ps-footer-offset
4562 ps-footer-pad
4563 (+ ps-footer-pad
4564 (* (ps-line-height 'ps-font-for-footer)
4565 (1- ps-footer-lines))
4566 ps-footer-pad)
4567 ps-print-height))
2bd80d73
GM
4568 ;; ps-zebra-stripe-follow is `full' or `full-follow'
4569 (if ps-zebra-stripe-full-p
4570 (let* ((line-height (ps-line-height 'ps-font-for-text))
6bf5fb46
GM
4571 (zebra (* (+ line-height ps-line-spacing-internal)
4572 ps-zebra-stripe-height)))
2bd80d73
GM
4573 (setq ps-print-height (- (* (floor ps-print-height zebra) zebra)
4574 line-height))
4575 (if (<= ps-print-height 0)
319acba0 4576 (error "Bad vertical layout (full zebra stripe follow):
2bd80d73
GM
4577ps-zebra-stripe-follow == %s
4578ps-zebra-stripe-height == %s
4579font-text-height == %s
6bf5fb46
GM
4580line-spacing == %s
4581page-height == ((floor print-height ((th + ls) * zh)) * ((th + ls) * zh)) - th
2bd80d73
GM
4582=> print-height == %d !"
4583 ps-zebra-stripe-follow
4584 ps-zebra-stripe-height
4585 (ps-line-height 'ps-font-for-text)
6bf5fb46 4586 ps-line-spacing-internal
2bd80d73 4587 ps-print-height))))))
ef2cbb24 4588
55732434
GM
4589
4590(defun ps-print-preprint-region (prefix-arg)
509b4dbc 4591 (or (ps-mark-active-p)
55732434
GM
4592 (error "The mark is not set now"))
4593 (list (point) (mark) (ps-print-preprint prefix-arg)))
4594
4595
edc9cd35
GM
4596(defun ps-print-preprint (prefix-arg)
4597 (and prefix-arg
4598 (or (numberp prefix-arg)
4599 (listp prefix-arg))
d3ab8dac
KH
4600 (let* ((name (concat (file-name-nondirectory (or (buffer-file-name)
4601 (buffer-name)))
4602 ".ps"))
5b76833f 4603 (prompt (format "Save PostScript to file (default %s): " name))
8bd22fcf 4604 (res (read-file-name prompt default-directory name nil)))
ea0c615d
GM
4605 (while (cond ((file-directory-p res)
4606 (ding)
4607 (setq prompt "It's a directory"))
4608 ((not (file-writable-p res))
d3ab8dac 4609 (ding)
ea0c615d 4610 (setq prompt "File is unwritable"))
d3ab8dac 4611 ((file-exists-p res)
ea0c615d 4612 (setq prompt "File exists")
d3ab8dac
KH
4613 (not (y-or-n-p (format "File `%s' exists; overwrite? "
4614 res))))
4615 (t nil))
4616 (setq res (read-file-name
ea0c615d 4617 (format "%s; save PostScript to file: " prompt)
d3ab8dac
KH
4618 (file-name-directory res) nil nil
4619 (file-name-nondirectory res))))
8bd22fcf
KH
4620 (if (file-directory-p res)
4621 (expand-file-name name (file-name-as-directory res))
4622 res))))
12d89a2e
RS
4623
4624;; The following functions implement a simple list-buffering scheme so
4625;; that ps-print doesn't have to repeatedly switch between buffers
857686a6
RS
4626;; while spooling. The functions `ps-output' and `ps-output-string' build
4627;; up the lists; the function `ps-flush-output' takes the lists and
12d89a2e
RS
4628;; insert its contents into the spool buffer (*PostScript*).
4629
857686a6
RS
4630(defvar ps-string-escape-codes
4631 (let ((table (make-vector 256 nil))
4632 (char ?\000))
4633 ;; control characters
4634 (while (<= char ?\037)
4635 (aset table char (format "\\%03o" char))
4636 (setq char (1+ char)))
4637 ;; printable characters
4638 (while (< char ?\177)
4639 (aset table char (format "%c" char))
4640 (setq char (1+ char)))
4641 ;; DEL and 8-bit characters
4642 (while (<= char ?\377)
4643 (aset table char (format "\\%o" char))
4644 (setq char (1+ char)))
4645 ;; Override ASCII formatting characters with named escape code:
4646 (aset table ?\n "\\n") ; [NL] linefeed
4647 (aset table ?\r "\\r") ; [CR] carriage return
4648 (aset table ?\t "\\t") ; [HT] horizontal tab
4649 (aset table ?\b "\\b") ; [BS] backspace
4650 (aset table ?\f "\\f") ; [NP] form feed
4651 ;; Escape PostScript escape and string delimiter characters:
4652 (aset table ?\\ "\\\\")
4653 (aset table ?\( "\\(")
4654 (aset table ?\) "\\)")
4655 table)
4656 "Vector used to map characters to PostScript string escape codes.")
4657
6bf5fb46 4658(defsubst ps-output-string-prim (string)
12d89a2e
RS
4659 (insert "(") ;insert start-string delimiter
4660 (save-excursion ;insert string
e65df0a1 4661 (insert (string-as-unibyte string)))
12d89a2e 4662 ;; Find and quote special characters as necessary for PS
c82b4a75 4663 ;; This skips everything except control chars, non-ASCII chars, (, ) and \.
b61e2c11
RS
4664 (while (progn (skip-chars-forward " -'*-[]-~") (not (eobp)))
4665 (let ((special (following-char)))
e65df0a1 4666 (delete-char 1)
c794a94d
JB
4667 (insert
4668 (if (and (<= 0 special) (<= special 255))
4669 (aref ps-string-escape-codes special)
4670 ;; insert hexadecimal representation if character code is out of range
4671 (format "\\%04X" special)
4672 ))))
12d89a2e
RS
4673 (goto-char (point-max))
4674 (insert ")")) ;insert end-string delimiter
ef2cbb24 4675
6bf5fb46 4676(defsubst ps-init-output-queue ()
1fd9b7fe 4677 (setq ps-output-head (list "")
8bd22fcf 4678 ps-output-tail ps-output-head))
ef2cbb24 4679
1fd9b7fe
GM
4680
4681(defun ps-selected-pages ()
4682 (while (progn
4683 (setq ps-first-page (car (car ps-selected-pages))
4684 ps-last-page (cdr (car ps-selected-pages))
4685 ps-selected-pages (cdr ps-selected-pages))
4686 (and ps-selected-pages
4687 (< ps-last-page ps-page-postscript)))))
4688
4689
6bf5fb46 4690(defsubst ps-print-page-p ()
ea0c615d
GM
4691 (setq ps-print-page-p
4692 (and (cond ((null ps-first-page))
4693 ((<= ps-page-postscript ps-last-page)
4694 (<= ps-first-page ps-page-postscript))
4695 (ps-selected-pages
4696 (ps-selected-pages)
4697 (and (<= ps-first-page ps-page-postscript)
4698 (<= ps-page-postscript ps-last-page)))
4699 (t
4700 nil))
4b3eb10f 4701 (cond ((eq ps-even-or-odd-pages 'even-page)
ea0c615d 4702 (= (logand ps-page-postscript 1) 0))
4b3eb10f 4703 ((eq ps-even-or-odd-pages 'odd-page)
ea0c615d
GM
4704 (= (logand ps-page-postscript 1) 1))
4705 (t)
4706 ))))
1fd9b7fe
GM
4707
4708
6bf5fb46 4709(defsubst ps-print-sheet-p ()
4b3eb10f
GM
4710 (setq ps-print-page-p
4711 (cond ((eq ps-even-or-odd-pages 'even-sheet)
4712 (= (logand ps-page-sheet 1) 0))
4713 ((eq ps-even-or-odd-pages 'odd-sheet)
4714 (= (logand ps-page-sheet 1) 1))
4715 (t)
4716 )))
4717
4718
12d89a2e 4719(defun ps-output (&rest args)
ea0c615d 4720 (when ps-print-page-p
1fd9b7fe
GM
4721 (setcdr ps-output-tail args)
4722 (while (cdr ps-output-tail)
4723 (setq ps-output-tail (cdr ps-output-tail)))))
ef2cbb24 4724
12d89a2e
RS
4725(defun ps-output-string (string)
4726 (ps-output t string))
ef2cbb24 4727
e65df0a1
KH
4728;; Output strings in the list ARGS in the PostScript prologue part.
4729(defun ps-output-prologue (args)
4730 (ps-output 'prologue (if (stringp args) (list args) args)))
4731
12d89a2e
RS
4732(defun ps-flush-output ()
4733 (save-excursion
4734 (set-buffer ps-spool-buffer)
4735 (goto-char (point-max))
4736 (while ps-output-head
4737 (let ((it (car ps-output-head)))
e65df0a1
KH
4738 (cond
4739 ((eq t it)
4740 (setq ps-output-head (cdr ps-output-head))
4741 (ps-output-string-prim (car ps-output-head)))
4742 ((eq 'prologue it)
12d89a2e 4743 (setq ps-output-head (cdr ps-output-head))
e65df0a1
KH
4744 (save-excursion
4745 (search-backward "\nBeginDoc")
4746 (forward-char 1)
4747 (apply 'insert (car ps-output-head))))
4748 (t
4749 (insert it))))
12d89a2e
RS
4750 (setq ps-output-head (cdr ps-output-head))))
4751 (ps-init-output-queue))
4752
4753(defun ps-insert-file (fname)
4754 (ps-flush-output)
12d89a2e
RS
4755 (save-excursion
4756 (set-buffer ps-spool-buffer)
4757 (goto-char (point-max))
b6d0ac87 4758 (insert-file-contents fname)))
06fb6aab 4759
319acba0 4760;; These functions insert the arrays that define the contents of the headers.
ef2cbb24 4761
374b7675 4762(defvar ps-encode-header-string-function nil)
f07bb446 4763
12d89a2e 4764(defun ps-generate-header-line (fonttag &optional content)
319acba0 4765 (ps-output " [" fonttag " ")
12d89a2e 4766 (cond
319acba0
GM
4767 ;; Literal strings should be output as is -- the string must contain its own
4768 ;; PS string delimiters, '(' and ')', if necessary.
12d89a2e 4769 ((stringp content)
f07bb446 4770 (ps-output content))
12d89a2e 4771
319acba0
GM
4772 ;; Functions are called -- they should return strings; they will be inserted
4773 ;; as strings and the PS string delimiters added.
212db81d
VJL
4774 ((functionp content)
4775 (if (functionp ps-encode-header-string-function)
5c538596
MB
4776 (dolist (l (funcall ps-encode-header-string-function
4777 (funcall content) fonttag))
4778 (ps-output-string l))
4779 (ps-output-string (funcall content))))
12d89a2e 4780
319acba0
GM
4781 ;; Variables will have their contents inserted. They should contain
4782 ;; strings, and will be inserted as strings.
12d89a2e 4783 ((and (symbolp content) (boundp content))
f07bb446
KH
4784 (if (fboundp ps-encode-header-string-function)
4785 (dolist (l (funcall ps-encode-header-string-function
4786 (symbol-value content) fonttag))
4787 (ps-output-string l))
4788 (ps-output-string (symbol-value content))))
12d89a2e
RS
4789
4790 ;; Anything else will get turned into an empty string.
4791 (t
4792 (ps-output-string "")))
319acba0 4793 (ps-output "]\n"))
12d89a2e 4794
319acba0
GM
4795(defun ps-generate-header (name fonttag0 fonttag1 contents)
4796 (ps-output "/" name "[\n")
4797 (and contents (> ps-header-lines 0)
4798 (let ((count 1))
4799 (ps-generate-header-line fonttag0 (car contents))
4800 (while (and (< count ps-header-lines)
4801 (setq contents (cdr contents)))
4802 (ps-generate-header-line fonttag1 (car contents))
4803 (setq count (1+ count)))))
4804 (ps-output "]def\n"))
12d89a2e 4805
bc0d41bd 4806
6e1b1da6
GM
4807(defun ps-output-boolean (name bool)
4808 (ps-output (format "/%s %s def\n" name (if bool "true" "false"))))
ef2cbb24 4809
06fb6aab 4810
319acba0
GM
4811(defun ps-output-frame-properties (name alist)
4812 (ps-output "/" name " ["
efa89c1f 4813 (ps-format-color (cdr (assq 'fore-color alist)) 0.0)
319acba0
GM
4814 (ps-format-color (cdr (assq 'back-color alist)) 0.9)
4815 (ps-float-format (or (cdr (assq 'border-width alist)) 0.4))
efa89c1f
GM
4816 (ps-format-color (cdr (assq 'border-color alist)) 0.0)
4817 (ps-format-color (cdr (assq 'shadow-color alist)) 0.0)
319acba0
GM
4818 "]def\n"))
4819
4820
87a16a06
RS
4821(defun ps-background-pages (page-list func)
4822 (if page-list
4823 (mapcar
bc0d41bd
KH
4824 #'(lambda (pages)
4825 (let ((start (if (consp pages) (car pages) pages))
4826 (end (if (consp pages) (cdr pages) pages)))
4827 (and (integerp start) (integerp end) (<= start end)
4828 (add-to-list 'ps-background-pages (vector start end func)))))
87a16a06
RS
4829 page-list)
4830 (setq ps-background-all-pages (cons func ps-background-all-pages))))
4831
4832
bc0d41bd
KH
4833(defconst ps-boundingbox-re
4834 "^%%BoundingBox:\
4835\\s-+\\([0-9.]+\\)\\s-+\\([0-9.]+\\)\\s-+\\([0-9.]+\\)\\s-+\\([0-9.]+\\)")
4836
4837
87a16a06
RS
4838(defun ps-get-boundingbox ()
4839 (save-excursion
4840 (set-buffer ps-spool-buffer)
4841 (save-excursion
bc0d41bd 4842 (if (re-search-forward ps-boundingbox-re nil t)
87a16a06
RS
4843 (vector (string-to-number ; lower x
4844 (buffer-substring (match-beginning 1) (match-end 1)))
4845 (string-to-number ; lower y
4846 (buffer-substring (match-beginning 2) (match-end 2)))
4847 (string-to-number ; upper x
4848 (buffer-substring (match-beginning 3) (match-end 3)))
4849 (string-to-number ; upper y
4850 (buffer-substring (match-beginning 4) (match-end 4))))
4851 (vector 0 0 0 0)))))
4852
4853
87a16a06
RS
4854(defun ps-float-format (value &optional default)
4855 (let ((literal (or value default)))
efa89c1f
GM
4856 (cond ((null literal)
4857 " ")
4858 ((numberp literal)
4859 (format ps-float-format (* literal 1.0))) ; force float number
4860 (t
4861 (format "%s " literal))
4862 )))
87a16a06
RS
4863
4864
4865(defun ps-background-text ()
4866 (mapcar
bc0d41bd
KH
4867 #'(lambda (text)
4868 (setq ps-background-text-count (1+ ps-background-text-count))
c3d6d211 4869 (ps-output (format "/ShowBackText-%d{\n" ps-background-text-count))
bc0d41bd
KH
4870 (ps-output-string (nth 0 text)) ; text
4871 (ps-output
4872 "\n"
4873 (ps-float-format (nth 4 text) 200.0) ; font size
4874 (format "/%s " (or (nth 3 text) "Times-Roman")) ; font name
4875 (ps-float-format (nth 6 text)
4876 "PrintHeight PrintPageWidth atan") ; rotation
4877 (ps-float-format (nth 5 text) 0.85) ; gray
4878 (ps-float-format (nth 1 text) "0") ; x position
8e234846 4879 (ps-float-format (nth 2 text) "0") ; y position
c3d6d211 4880 "\nShowBackText}def\n")
bc0d41bd
KH
4881 (ps-background-pages (nthcdr 7 text) ; page list
4882 (format "ShowBackText-%d\n"
4883 ps-background-text-count)))
87a16a06
RS
4884 ps-print-background-text))
4885
4886
4887(defun ps-background-image ()
4888 (mapcar
bc0d41bd
KH
4889 #'(lambda (image)
4890 (let ((image-file (expand-file-name (nth 0 image))))
41481e4b
KH
4891 (when (file-readable-p image-file)
4892 (setq ps-background-image-count (1+ ps-background-image-count))
4893 (ps-output
c3d6d211 4894 (format "/ShowBackImage-%d{\n--back-- "
41481e4b
KH
4895 ps-background-image-count)
4896 (ps-float-format (nth 5 image) 0.0) ; rotation
4897 (ps-float-format (nth 3 image) 1.0) ; x scale
4898 (ps-float-format (nth 4 image) 1.0) ; y scale
4899 (ps-float-format (nth 1 image) ; x position
4900 "PrintPageWidth 2 div")
4901 (ps-float-format (nth 2 image) ; y position
4902 "PrintHeight 2 div BottomMargin add")
4903 "\nBeginBackImage\n")
4904 (ps-insert-file image-file)
01cdabc6 4905 ;; coordinate adjustment to center image
41481e4b
KH
4906 ;; around x and y position
4907 (let ((box (ps-get-boundingbox)))
4908 (save-excursion
4909 (set-buffer ps-spool-buffer)
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
7da17ab6
RS
5794 (save-excursion
5795 (set-buffer ps-spool-buffer)
5796 (goto-char (point-max))
5797 (and (re-search-backward "^%%Trailer$" nil t)
5798 (delete-region (match-beginning 0) (point-max))))
1fd9b7fe 5799 ;; miscellaneous
2bd80d73
GM
5800 (setq ps-zebra-stripe-full-p (memq ps-zebra-stripe-follow
5801 '(full full-follow))
5802 ps-page-postscript 0
7bb054a5
GM
5803 ps-page-sheet 0
5804 ps-page-n-up 0
4b3eb10f 5805 ps-page-column 0
bd7a2e26 5806 ps-lines-printed 0
7bb054a5
GM
5807 ps-print-page-p t
5808 ps-showline-count (car ps-printing-region)
6bf5fb46
GM
5809 ps-line-spacing-internal (ps-get-size ps-line-spacing
5810 "line spacing")
5811 ps-paragraph-spacing-internal (ps-get-size ps-paragraph-spacing
5812 "paragraph spacing")
7d8b7e8e
KH
5813 ps-font-size-internal (ps-get-font-size 'ps-font-size)
5814 ps-header-font-size-internal (ps-get-font-size 'ps-header-font-size)
5815 ps-header-title-font-size-internal
5816 (ps-get-font-size 'ps-header-title-font-size)
319acba0 5817 ps-footer-font-size-internal (ps-get-font-size 'ps-footer-font-size)
857686a6 5818 ps-control-or-escape-regexp
298bfad9
KH
5819 (cond ((eq ps-print-control-characters '8-bit)
5820 (string-as-unibyte "[\000-\037\177-\377]"))
5821 ((eq ps-print-control-characters 'control-8-bit)
5822 (string-as-unibyte "[\000-\037\177-\237]"))
5823 ((eq ps-print-control-characters 'control)
5824 "[\000-\037\177]")
6e1b1da6 5825 (t "[\t\n\f]"))
f1024355
VJL
5826 ;; Set the color scale. We do it here instead of in the defvar so
5827 ;; that ps-print can be dumped into emacs. This expression can't be
5828 ;; evaluated at dump-time because X isn't initialized.
5829 ps-color-p (and ps-print-color-p (ps-color-device))
5830 ps-print-color-scale (if ps-color-p
5831 (float (car (ps-color-values "white")))
5832 1.0)
e59d29d6 5833 ps-default-background (ps-rgb-color
830f437e 5834 (cond
905350be
VJL
5835 ((or (member ps-print-color-p
5836 '(nil back-white))
f1024355 5837 (eq genfunc 'ps-generate-postscript))
e85cca87 5838 nil)
830f437e 5839 ((eq ps-default-bg 'frame-parameter)
cf04718a 5840 (ps-frame-parameter nil 'background-color))
830f437e
VJL
5841 ((eq ps-default-bg t)
5842 (ps-face-background-name 'default))
5843 (t
5844 ps-default-bg))
c8296a63 5845 "unspecified-bg"
e59d29d6 5846 1.0)
c794a94d 5847 ps-default-foreground (ps-rgb-color
830f437e 5848 (cond
905350be
VJL
5849 ((or (member ps-print-color-p
5850 '(nil back-white))
f1024355 5851 (eq genfunc 'ps-generate-postscript))
e85cca87 5852 nil)
830f437e 5853 ((eq ps-default-fg 'frame-parameter)
cf04718a 5854 (ps-frame-parameter nil 'foreground-color))
830f437e
VJL
5855 ((eq ps-default-fg t)
5856 (ps-face-foreground-name 'default))
5857 (t
5858 ps-default-fg))
c8296a63 5859 "unspecified-fg"
c794a94d 5860 0.0)
212db81d
VJL
5861 ps-foreground-list (mapcar
5862 #'(lambda (arg)
5863 (ps-rgb-color arg "unspecified-fg" 0.0))
5864 (append (and (not (member ps-print-color-p
5865 '(nil back-white)))
5866 ps-fg-list)
5867 (list ps-default-foreground
5868 "black")))
905350be
VJL
5869 ps-default-color (and (not (member ps-print-color-p
5870 '(nil back-white)))
f1024355
VJL
5871 ps-default-foreground)
5872 ps-current-color ps-default-color
212db81d
VJL
5873 ;; Set up default functions.
5874 ;; They may be overridden by ps-mule-begin-job.
5875 ps-basic-plot-string-function 'ps-basic-plot-string
f07bb446 5876 ps-encode-header-string-function nil)
319acba0 5877 ;; initialize page dimensions
e59d29d6
VJL
5878 (ps-get-page-dimensions)
5879 ;; final check
da13a4be
VJL
5880 (unless (listp ps-lpr-switches)
5881 (error "`ps-lpr-switches' value should be a list."))
e59d29d6
VJL
5882 (and ps-color-p
5883 (equal ps-default-background ps-default-foreground)
5884 (error
5885 (concat
5886 "`ps-default-fg' and `ps-default-bg' have the same color.\n"
5887 "Text won't appear on page. Please, check these variables."))))
6e1b1da6 5888
ef2cbb24 5889
ea0c615d
GM
5890(defun ps-page-number ()
5891 (if ps-print-only-one-header
4b3eb10f
GM
5892 (1+ (/ (1- ps-page-column) ps-number-of-columns))
5893 ps-page-column))
87a16a06
RS
5894
5895
319acba0
GM
5896(defsubst ps-end-page ()
5897 (ps-output "EndPage\nEndDSCPage\n"))
5898
5899
5900(defsubst ps-next-page ()
ef2cbb24 5901 (ps-end-page)
12d89a2e
RS
5902 (ps-flush-output)
5903 (ps-begin-page))
5904
bc0d41bd 5905
9dae638c
VJL
5906(defun ps-end-sheet ()
5907 (and ps-print-page-p (> ps-page-sheet 0)
5908 (ps-output "EndSheet\n")))
5909
5910
bc0d41bd
KH
5911(defun ps-header-sheet ()
5912 ;; Print only when a new sheet begins.
9dae638c 5913 (ps-end-sheet)
4b3eb10f
GM
5914 (setq ps-page-sheet (1+ ps-page-sheet))
5915 (when (ps-print-sheet-p)
5916 (setq ps-page-order (1+ ps-page-order))
5917 (ps-output (if ps-n-up-on
5918 (format "\n%%%%Page: (%d \\(%d\\)) %d\n"
5919 ps-page-order ps-page-postscript ps-page-order)
5920 (format "\n%%%%Page: %d %d\n"
5921 ps-page-postscript ps-page-order))
ef1159c2
EZ
5922 ;; spooling needs to redefine Lines and PageCount on each page
5923 "/Lines 0 def\n/PageCount 0 def\n"
4b3eb10f
GM
5924 (format "%d BeginSheet\nBeginDSCPage\n"
5925 ps-n-up-printing))))
ea0c615d
GM
5926
5927
5928(defun ps-header-page ()
7da17ab6
RS
5929 ;; set total line and page number when printing has finished
5930 ;; (see `ps-generate')
4b3eb10f 5931 (if (zerop (mod ps-page-column ps-number-of-columns))
ea0c615d
GM
5932 (progn
5933 (setq ps-page-postscript (1+ ps-page-postscript))
5934 (when (ps-print-page-p)
4b3eb10f 5935 (ps-print-sheet-p)
ea0c615d
GM
5936 (if (zerop (mod ps-page-n-up ps-n-up-printing))
5937 ;; Print only when a new sheet begins.
5938 (progn
5939 (ps-header-sheet)
5940 (run-hooks 'ps-print-begin-sheet-hook))
5941 ;; Print only when a new page begins.
5942 (ps-output "BeginDSCPage\n")
5943 (run-hooks 'ps-print-begin-page-hook))
5944 (ps-background ps-page-postscript)
4b3eb10f
GM
5945 (setq ps-page-n-up (1+ ps-page-n-up))
5946 (and ps-print-page-p
5947 (setq ps-page-printed (1+ ps-page-printed)))))
ea0c615d
GM
5948 ;; Print only when a new column begins.
5949 (ps-output "BeginDSCPage\n")
5950 (run-hooks 'ps-print-begin-column-hook))
4b3eb10f 5951 (setq ps-page-column (1+ ps-page-column)))
a18ed129 5952
8bd22fcf 5953(defun ps-begin-page ()
8bd22fcf 5954 (setq ps-width-remaining ps-print-width
298bfad9 5955 ps-height-remaining ps-print-height)
12d89a2e 5956
a18ed129 5957 (ps-header-page)
12d89a2e 5958
87a16a06 5959 (ps-output (format "/LineNumber %d def\n" ps-showline-count)
ea0c615d 5960 (format "/PageNumber %d def\n" (ps-page-number)))
12d89a2e 5961
090be653 5962 (when ps-print-header
f07bb446
KH
5963 (ps-generate-header "HeaderLinesLeft" "/h0" "/h1" ps-left-header)
5964 (ps-generate-header "HeaderLinesRight" "/h0" "/h1" ps-right-header)
5965 (ps-output (format "%d SetHeaderLines\n" ps-header-lines)))
12d89a2e 5966
319acba0 5967 (when ps-print-footer
f07bb446
KH
5968 (ps-generate-header "FooterLinesLeft" "/H0" "/H0" ps-left-footer)
5969 (ps-generate-header "FooterLinesRight" "/H0" "/H0" ps-right-footer)
5970 (ps-output (format "%d SetFooterLines\n" ps-footer-lines)))
319acba0 5971
bd7a2e26 5972 (ps-output (number-to-string ps-lines-printed) " BeginPage\n")
87a16a06
RS
5973 (ps-set-font ps-current-font)
5974 (ps-set-bg ps-current-bg)
f07bb446 5975 (ps-set-color ps-current-color))
ef2cbb24 5976
319acba0 5977(defsubst ps-skip-newline (limit)
bd7a2e26
GM
5978 (setq ps-showline-count (1+ ps-showline-count)
5979 ps-lines-printed (1+ ps-lines-printed))
5980 (and (< (point) limit)
5981 (forward-char 1)))
5982
6bf5fb46 5983(defsubst ps-next-line ()
bd7a2e26
GM
5984 (setq ps-showline-count (1+ ps-showline-count)
5985 ps-lines-printed (1+ ps-lines-printed))
6bf5fb46
GM
5986 (let* ((paragraph-p (and ps-paragraph-regexp
5987 (looking-at ps-paragraph-regexp)))
5988 (lh (+ (ps-line-height 'ps-font-for-text)
5989 (if paragraph-p
5990 ps-paragraph-spacing-internal
5991 ps-line-spacing-internal))))
12b88fff
RS
5992 (if (< ps-height-remaining lh)
5993 (ps-next-page)
5994 (setq ps-width-remaining ps-print-width
5995 ps-height-remaining (- ps-height-remaining lh))
6bf5fb46 5996 (ps-output (if paragraph-p "PHL\n" "LHL\n")))))
ef2cbb24
RS
5997
5998(defun ps-continue-line ()
bd7a2e26 5999 (setq ps-lines-printed (1+ ps-lines-printed))
6bf5fb46 6000 (let ((lh (+ (ps-line-height 'ps-font-for-text) ps-line-spacing-internal)))
12b88fff
RS
6001 (if (< ps-height-remaining lh)
6002 (ps-next-page)
6003 (setq ps-width-remaining ps-print-width
6004 ps-height-remaining (- ps-height-remaining lh))
6005 (ps-output "SL\n"))))
12d89a2e
RS
6006
6007(defun ps-find-wrappoint (from to char-width)
6008 (let ((avail (truncate (/ ps-width-remaining char-width)))
6009 (todo (- to from)))
6010 (if (< todo avail)
6011 (cons to (* todo char-width))
6012 (cons (+ from avail) ps-width-remaining))))
6013
c86f4619
GM
6014(defun ps-basic-plot-str (from to string)
6015 (let* ((wrappoint (ps-find-wrappoint from to
6016 (ps-avg-char-width 'ps-font-for-text)))
6017 (to (car wrappoint))
6018 (str (substring string from to)))
c86f4619
GM
6019 (ps-output-string str)
6020 (ps-output " S\n")
6021 wrappoint))
6022
12d89a2e 6023(defun ps-basic-plot-string (from to &optional bg-color)
12b88fff
RS
6024 (let* ((wrappoint (ps-find-wrappoint from to
6025 (ps-avg-char-width 'ps-font-for-text)))
12d89a2e 6026 (to (car wrappoint))
298bfad9 6027 (string (buffer-substring-no-properties from to)))
12d89a2e 6028 (ps-output-string string)
bcc0d457 6029 (ps-output " S\n")
12d89a2e
RS
6030 wrappoint))
6031
6032(defun ps-basic-plot-whitespace (from to &optional bg-color)
12b88fff
RS
6033 (let* ((wrappoint (ps-find-wrappoint from to
6034 (ps-space-width 'ps-font-for-text)))
12d89a2e 6035 (to (car wrappoint)))
12d89a2e
RS
6036 (ps-output (format "%d W\n" (- to from)))
6037 wrappoint))
6038
6039(defun ps-plot (plotfunc from to &optional bg-color)
ef2cbb24 6040 (while (< from to)
12d89a2e
RS
6041 (let* ((wrappoint (funcall plotfunc from to bg-color))
6042 (plotted-to (car wrappoint))
6043 (plotted-width (cdr wrappoint)))
8bd22fcf
KH
6044 (setq from plotted-to
6045 ps-width-remaining (- ps-width-remaining plotted-width))
12d89a2e
RS
6046 (if (< from to)
6047 (ps-continue-line))))
ef2cbb24
RS
6048 (if ps-razzle-dazzle
6049 (let* ((q-todo (- (point-max) (point-min)))
12d89a2e 6050 (q-done (- (point) (point-min)))
ef2cbb24 6051 (chunkfrac (/ q-todo 8))
857686a6 6052 (chunksize (min chunkfrac 1000)))
ef2cbb24 6053 (if (> (- q-done ps-razchunk) chunksize)
8bd22fcf 6054 (progn
ef2cbb24 6055 (setq ps-razchunk q-done)
8bd22fcf
KH
6056 (message "Formatting...%3d%%"
6057 (if (< q-todo 100)
6058 (/ (* 100 q-done) q-todo)
6059 (/ q-done (/ q-todo 100)))
6060 ))))))
12d89a2e 6061
374b7675 6062(defvar ps-last-font nil)
298bfad9 6063
12d89a2e 6064(defun ps-set-font (font)
e65df0a1
KH
6065 (setq ps-last-font (format "f%d" (setq ps-current-font font)))
6066 (ps-output (format "/%s F\n" ps-last-font)))
12d89a2e 6067
12d89a2e
RS
6068(defun ps-set-bg (color)
6069 (if (setq ps-current-bg color)
8bd22fcf
KH
6070 (ps-output (format ps-color-format
6071 (nth 0 color) (nth 1 color) (nth 2 color))
12d89a2e
RS
6072 " true BG\n")
6073 (ps-output "false BG\n")))
6074
6075(defun ps-set-color (color)
6e1b1da6 6076 (setq ps-current-color (or color ps-default-foreground))
8bd22fcf
KH
6077 (ps-output (format ps-color-format
6078 (nth 0 ps-current-color)
043620f4
KH
6079 (nth 1 ps-current-color) (nth 2 ps-current-color))
6080 " FG\n"))
12d89a2e 6081
12d89a2e 6082
c86f4619
GM
6083(defsubst ps-plot-string (string)
6084 (ps-plot 'ps-basic-plot-str 0 (length string) string))
6085
6086
87a16a06 6087(defvar ps-current-effect 0)
12d89a2e 6088
3409eda2
KH
6089(defvar ps-print-translation-table
6090 (let ((tbl (make-char-table 'translation-table nil)))
6091 (if (and (boundp 'ucs-mule-8859-to-mule-unicode)
6092 (char-table-p ucs-mule-8859-to-mule-unicode))
6093 (map-char-table
640477ee 6094 #'(lambda (k v)
3409eda2
KH
6095 (if (and v (eq (char-charset v) 'latin-iso8859-1) (/= k v))
6096 (aset tbl k v)))
6097 ucs-mule-8859-to-mule-unicode))
6098 tbl)
6099 "Translation table for PostScript printing.
6100The default value is a table that translates non-Latin-1 Latin characters
6101to the equivalent Latin-1 characters.")
87a16a06
RS
6102
6103(defun ps-plot-region (from to font &optional fg-color bg-color effects)
efa89c1f 6104 (or (equal font ps-current-font)
12d89a2e 6105 (ps-set-font font))
06fb6aab 6106
212db81d
VJL
6107 ;; Specify a foreground color only if:
6108 ;; one's specified,
6109 ;; it's different than the background (if `ps-fg-validate-p' is non-nil)
6110 ;; and it's different than the current.
efa89c1f 6111 (let ((fg (or fg-color ps-default-foreground)))
212db81d
VJL
6112 (if ps-fg-validate-p
6113 (let ((bg (or bg-color ps-default-background))
6114 (el ps-foreground-list))
6115 (while (and el (equal fg bg))
6116 (setq fg (car el)
6117 el (cdr el)))))
efa89c1f
GM
6118 (or (equal fg ps-current-color)
6119 (ps-set-color fg)))
06fb6aab 6120
efa89c1f 6121 (or (equal bg-color ps-current-bg)
12d89a2e 6122 (ps-set-bg bg-color))
06fb6aab 6123
212db81d 6124 ;; Specify effects (underline, overline, box, etc.)
87a16a06
RS
6125 (cond
6126 ((not (integerp effects))
6127 (ps-output "0 EF\n")
6128 (setq ps-current-effect 0))
6129 ((/= effects ps-current-effect)
6130 (ps-output (number-to-string effects) " EF\n")
6131 (setq ps-current-effect effects)))
ef2cbb24 6132
12d89a2e 6133 ;; Starting at the beginning of the specified region...
ef2cbb24
RS
6134 (save-excursion
6135 (goto-char from)
12d89a2e
RS
6136
6137 ;; ...break the region up into chunks separated by tabs, linefeeds,
87a16a06 6138 ;; pagefeeds, control characters, and plot each chunk.
ef2cbb24 6139 (while (< from to)
6bf5fb46
GM
6140 ;; skip lines between cut markers
6141 (and ps-begin-cut-regexp ps-end-cut-regexp
6142 (looking-at ps-begin-cut-regexp)
6143 (progn
6144 (goto-char (match-end 0))
6145 (and (re-search-forward ps-end-cut-regexp to 'noerror)
6146 (= (following-char) ?\n)
6147 (forward-char 1))
6148 (setq from (point))))
857686a6 6149 (if (re-search-forward ps-control-or-escape-regexp to t)
024ced4d 6150 ;; region with some control characters or some multi-byte characters
12b88fff 6151 (let* ((match-point (match-beginning 0))
f07bb446 6152 (match (char-after match-point)))
e65df0a1 6153 (when (< from match-point)
f07bb446
KH
6154 (ps-plot ps-basic-plot-string-function
6155 from match-point bg-color))
857686a6
RS
6156 (cond
6157 ((= match ?\t) ; tab
be415ea7 6158 (let ((linestart (line-beginning-position)))
857686a6
RS
6159 (forward-char -1)
6160 (setq from (+ linestart (current-column)))
e65df0a1 6161 (when (re-search-forward "[ \t]+" to t)
e65df0a1
KH
6162 (ps-plot 'ps-basic-plot-whitespace
6163 from (+ linestart (current-column))
6164 bg-color))))
857686a6
RS
6165
6166 ((= match ?\n) ; newline
bd7a2e26
GM
6167 (if (looking-at "\f[^\n]")
6168 ;; \n\ftext\n ==>> next page, but keep line counting!!
6169 (progn
6170 (ps-skip-newline to)
6171 (ps-next-page))
6172 ;; \n\f\n ==>> it'll be handled by form feed
6173 ;; \ntext\n ==>> next line
6174 (ps-next-line)))
857686a6
RS
6175
6176 ((= match ?\f) ; form feed
12b88fff
RS
6177 ;; do not skip page if previous character is NEWLINE and
6178 ;; it is a beginning of page.
bd7a2e26
GM
6179 (unless (and (equal (char-after (1- match-point)) ?\n)
6180 (= ps-height-remaining ps-print-height))
6181 ;; \f\n ==>> skip \n, but keep line counting!!
6182 (and (equal (following-char) ?\n)
6183 (ps-skip-newline to))
6184 (ps-next-page)))
e65df0a1 6185
857686a6
RS
6186 (t ; characters from 127 to 255
6187 (ps-control-character match)))
87a16a06 6188 (setq from (point)))
f07bb446
KH
6189 ;; region without control characters
6190 (ps-plot ps-basic-plot-string-function from to bg-color)
87a16a06
RS
6191 (setq from to)))))
6192
857686a6
RS
6193(defvar ps-string-control-codes
6194 (let ((table (make-vector 256 nil))
6195 (char ?\000))
6196 ;; control character
6197 (while (<= char ?\037)
6198 (aset table char (format "^%c" (+ char ?@)))
6199 (setq char (1+ char)))
6200 ;; printable character
6201 (while (< char ?\177)
6202 (aset table char (format "%c" char))
6203 (setq char (1+ char)))
6204 ;; DEL
6205 (aset table char "^?")
6206 ;; 8-bit character
6207 (while (<= (setq char (1+ char)) ?\377)
6208 (aset table char (format "\\%o" char)))
6209 table)
6210 "Vector used to map characters to a printable string.")
6211
6212(defun ps-control-character (char)
6213 (let* ((str (aref ps-string-control-codes char))
6214 (from (1- (point)))
87a16a06
RS
6215 (len (length str))
6216 (to (+ from len))
12b88fff
RS
6217 (char-width (ps-avg-char-width 'ps-font-for-text))
6218 (wrappoint (ps-find-wrappoint from to char-width)))
87a16a06
RS
6219 (if (< (car wrappoint) to)
6220 (ps-continue-line))
12b88fff 6221 (setq ps-width-remaining (- ps-width-remaining (* len char-width)))
87a16a06
RS
6222 (ps-output-string str)
6223 (ps-output " S\n")))
ef2cbb24 6224
87a16a06 6225
42af7493
VJL
6226(defsubst ps-face-foreground-color-p (attr)
6227 (memq attr '(foreground-color :foreground)))
6228
6229
6230(defsubst ps-face-background-color-p (attr)
6231 (memq attr '(background-color :background)))
6232
6233
6234(defsubst ps-face-color-p (attr)
6235 (memq attr '(foreground-color :foreground background-color :background)))
6236
6237
a18ed129
RS
6238(defun ps-face-attributes (face)
6239 "Return face attribute vector.
87a16a06 6240
a18ed129
RS
6241If FACE is not in `ps-print-face-extension-alist' or in
6242`ps-print-face-alist', insert it on `ps-print-face-alist' and
6243return the attribute vector.
87a16a06 6244
e85cca87 6245If FACE is not a valid face name, use default face."
df5e6194 6246 (cond
55732434
GM
6247 (ps-black-white-faces-alist
6248 (or (and (symbolp face)
6249 (cdr (assq face ps-black-white-faces-alist)))
6250 (vector 0 nil nil)))
df5e6194
GM
6251 ((symbolp face)
6252 (cdr (or (assq face ps-print-face-extension-alist)
6253 (assq face ps-print-face-alist)
6254 (let* ((the-face (if (facep face) face 'default))
6255 (new-face (ps-screen-to-bit-face the-face)))
6256 (or (and (eq the-face 'default)
6257 (assq the-face ps-print-face-alist))
6258 (setq ps-print-face-alist
6259 (cons new-face ps-print-face-alist)))
6260 new-face))))
42af7493 6261 ((ps-face-foreground-color-p (car face))
df5e6194 6262 (vector 0 (cdr face) nil))
42af7493 6263 ((ps-face-background-color-p (car face))
df5e6194
GM
6264 (vector 0 nil (cdr face)))
6265 (t
6266 (vector 0 nil nil))))
87a16a06 6267
043620f4 6268
906d41a7 6269(defun ps-face-background (face background)
e85cca87
VJL
6270 (and (cond ((eq ps-use-face-background t)) ; always
6271 ((null ps-use-face-background) nil) ; never
6272 ;; ps-user-face-background is a symbol face list
6273 ((symbolp face)
6274 (memq face ps-use-face-background))
6275 ((listp face)
42af7493 6276 (or (ps-face-color-p (car face))
e85cca87
VJL
6277 (let (ok)
6278 (while face
6279 (if (or (memq (car face) ps-use-face-background)
42af7493 6280 (ps-face-color-p (car face)))
e85cca87
VJL
6281 (setq face nil
6282 ok t)
6283 (setq face (cdr face))))
6284 ok)))
6285 (t
6286 nil)
6287 )
906d41a7
GM
6288 background))
6289
6290
043620f4 6291(defun ps-face-attribute-list (face-or-list)
df5e6194
GM
6292 (cond
6293 ;; simple face
6294 ((not (listp face-or-list))
6295 (ps-face-attributes face-or-list))
6296 ;; only foreground color, not a `real' face
42af7493 6297 ((ps-face-foreground-color-p (car face-or-list))
df5e6194
GM
6298 (vector 0 (cdr face-or-list) nil))
6299 ;; only background color, not a `real' face
42af7493 6300 ((ps-face-background-color-p (car face-or-list))
df5e6194
GM
6301 (vector 0 nil (cdr face-or-list)))
6302 ;; list of faces
6303 (t
6304 (let ((effects 0)
6305 foreground background face-attr face)
6306 (while face-or-list
6307 (setq face (car face-or-list)
6308 face-or-list (cdr face-or-list)
6309 face-attr (ps-face-attributes face)
6310 effects (logior effects (aref face-attr 0)))
6311 (or foreground (setq foreground (aref face-attr 1)))
6312 (or background
6313 (setq background (ps-face-background face (aref face-attr 2)))))
6314 (vector effects foreground background)))))
043620f4 6315
87a16a06 6316
12b88fff
RS
6317(defconst ps-font-type (vector nil 'bold 'italic 'bold-italic))
6318
6319
12d89a2e 6320(defun ps-plot-with-face (from to face)
12b88fff
RS
6321 (cond
6322 ((null face) ; print text with null face
87a16a06 6323 (ps-plot-region from to 0))
12b88fff
RS
6324 ((eq face 'emacs--invisible--face)) ; skip invisible text!!!
6325 (t ; otherwise, text has a valid face
6326 (let* ((face-bit (ps-face-attribute-list face))
6327 (effect (aref face-bit 0))
6328 (foreground (aref face-bit 1))
906d41a7 6329 (background (ps-face-background face (aref face-bit 2)))
d3ab8dac 6330 (fg-color (if (and ps-color-p foreground)
6e1b1da6 6331 (ps-color-scale foreground)
12b88fff 6332 ps-default-color))
d3ab8dac 6333 (bg-color (and ps-color-p background
6e1b1da6 6334 (ps-color-scale background))))
12b88fff
RS
6335 (ps-plot-region
6336 from to
6337 (ps-font-number 'ps-font-for-text
6338 (or (aref ps-font-type (logand effect 3))
6339 face))
6340 fg-color bg-color (lsh effect -2)))))
87a16a06 6341 (goto-char to))
12d89a2e
RS
6342
6343
043620f4
KH
6344;; Ensure that face-list is fbound.
6345(or (fboundp 'face-list) (defalias 'face-list 'list-faces))
12d89a2e 6346
a18ed129 6347
12d89a2e 6348(defun ps-build-reference-face-lists ()
857686a6
RS
6349 ;; Ensure that face database is updated with faces on
6350 ;; `font-lock-face-attributes' (obsolete stuff)
6351 (ps-font-lock-face-attributes)
6352 ;; Now, rebuild reference face lists
a18ed129 6353 (setq ps-print-face-alist nil)
12d89a2e 6354 (if ps-auto-font-detect
42af7493
VJL
6355 (mapc 'ps-map-face (face-list))
6356 (mapc 'ps-set-face-bold ps-bold-faces)
6357 (mapc 'ps-set-face-italic ps-italic-faces)
6358 (mapc 'ps-set-face-underline ps-underlined-faces))
12d89a2e 6359 (setq ps-build-face-reference nil))
ef2cbb24 6360
a18ed129
RS
6361
6362(defun ps-set-face-bold (face)
6363 (ps-set-face-attribute face 1))
6364
6365(defun ps-set-face-italic (face)
6366 (ps-set-face-attribute face 2))
6367
6368(defun ps-set-face-underline (face)
6369 (ps-set-face-attribute face 4))
6370
6371
6372(defun ps-set-face-attribute (face effect)
6373 (let ((face-bit (cdr (ps-map-face face))))
6374 (aset face-bit 0 (logior (aref face-bit 0) effect))))
6375
6376
6377(defun ps-map-face (face)
6378 (let* ((face-map (ps-screen-to-bit-face face))
6379 (ps-face-bit (cdr (assq (car face-map) ps-print-face-alist))))
6380 (if ps-face-bit
6381 ;; if face exists, merge both
6382 (let ((face-bit (cdr face-map)))
6383 (aset ps-face-bit 0 (logior (aref ps-face-bit 0) (aref face-bit 0)))
6384 (or (aref ps-face-bit 1) (aset ps-face-bit 1 (aref face-bit 1)))
6385 (or (aref ps-face-bit 2) (aset ps-face-bit 2 (aref face-bit 2))))
6386 ;; if face does not exist, insert it
6387 (setq ps-print-face-alist (cons face-map ps-print-face-alist)))
6388 face-map))
6389
6390
6391(defun ps-screen-to-bit-face (face)
6392 (cons face
fd7ec851
VJL
6393 (vector (logior (if (ps-face-bold-p face) 1 0) ; bold
6394 (if (ps-face-italic-p face) 2 0) ; italic
6395 (if (ps-face-underlined-p face) 4 0) ; underline
6396 (if (ps-face-strikeout-p face) 8 0) ; strikeout
6397 (if (ps-face-overline-p face) 16 0) ; overline
6398 (if (ps-face-box-p face) 64 0)) ; box
8e234846
GM
6399 (ps-face-foreground-name face)
6400 (ps-face-background-name face))))
a18ed129
RS
6401
6402
b6d0ac87
VJL
6403;; to avoid compilation gripes
6404(defalias 'ps-jitify 'jit-lock-fontify-now)
6405(defalias 'ps-lazify 'lazy-lock-fontify-region)
6406
6407
3e9cb08f 6408;; to avoid compilation gripes
ea0c615d 6409(defun ps-print-ensure-fontified (start end)
b6d0ac87
VJL
6410 (cond ((and (boundp 'jit-lock-mode) (symbol-value 'jit-lock-mode))
6411 (ps-jitify start end))
6412 ((and (boundp 'lazy-lock-mode) (symbol-value 'lazy-lock-mode))
6413 (ps-lazify start end))))
043620f4 6414
043620f4 6415
ef2cbb24 6416(defun ps-generate-postscript-with-faces (from to)
87a16a06 6417 ;; Some initialization...
857686a6 6418 (setq ps-current-effect 0)
87a16a06 6419
00aa16af 6420 ;; Build the reference lists of faces if necessary.
8e234846
GM
6421 (when (or ps-always-build-face-reference
6422 ps-build-face-reference)
6423 (message "Collecting face information...")
6424 (ps-build-reference-face-lists))
55732434
GM
6425
6426 ;; Black/white printer.
6427 (setq ps-black-white-faces-alist nil)
6428 (and (eq ps-print-color-p 'black-white)
6429 (ps-extend-face-list ps-black-white-faces nil
6430 'ps-black-white-faces-alist))
6431
00aa16af 6432 ;; Generate some PostScript.
ef2cbb24
RS
6433 (save-restriction
6434 (narrow-to-region from to)
d3ab8dac 6435 (ps-print-ensure-fontified from to)
c97a3f22 6436 (ps-generate-postscript-with-faces1 from to)))
ef2cbb24
RS
6437
6438(defun ps-generate-postscript (from to)
e85cca87 6439 (ps-plot-region from to 0))
ef2cbb24 6440
723bbcec
GM
6441;; These are autoloaded, but ps-mule generates autoloads at the end of
6442;; this file, so they are unknown at this point when compiling.
6443(declare-function ps-mule-initialize "ps-mule" ())
6444(declare-function ps-mule-begin-job "ps-mule" (from to))
6445(declare-function ps-mule-end-job "ps-mule" ())
6446
ef2cbb24 6447(defun ps-generate (buffer from to genfunc)
87a16a06
RS
6448 (save-excursion
6449 (let ((from (min to from))
6450 (to (max to from))
6451 ;; This avoids trouble if chars with read-only properties
6452 ;; are copied into ps-spool-buffer.
6453 (inhibit-read-only t))
6454 (save-restriction
6455 (narrow-to-region from to)
857686a6
RS
6456 (and ps-razzle-dazzle
6457 (message "Formatting...%3d%%" (setq ps-razchunk 0)))
8bd22fcf
KH
6458 (setq ps-source-buffer buffer
6459 ps-spool-buffer (get-buffer-create ps-spool-buffer-name))
87a16a06
RS
6460 (ps-init-output-queue)
6461 (let (safe-marker completed-safely needs-begin-file)
6462 (unwind-protect
00aa16af
RS
6463 (progn
6464 (set-buffer ps-spool-buffer)
7da17ab6 6465 (set-buffer-multibyte nil)
915293a2 6466
87a16a06
RS
6467 ;; Get a marker and make it point to the current end of the
6468 ;; buffer, If an error occurs, we'll delete everything from
6469 ;; the end of this marker onwards.
6470 (setq safe-marker (make-marker))
6471 (set-marker safe-marker (point-max))
6472
6473 (goto-char (point-min))
8bd22fcf
KH
6474 (or (looking-at (regexp-quote ps-adobe-tag))
6475 (setq needs-begin-file t))
ea0c615d
GM
6476
6477 (set-buffer ps-source-buffer)
87a16a06 6478 (save-excursion
ea0c615d
GM
6479 (let ((ps-print-page-p t)
6480 ps-even-or-odd-pages)
e85cca87 6481 (ps-begin-job genfunc)
70f57a72
GM
6482 (when needs-begin-file
6483 (ps-begin-file)
6484 (ps-mule-initialize))
6485 (ps-mule-begin-job from to)
ea0c615d
GM
6486 (ps-selected-pages)))
6487 (ps-begin-page)
87a16a06
RS
6488 (funcall genfunc from to)
6489 (ps-end-page)
f07bb446 6490 (ps-mule-end-job)
ea0c615d 6491 (ps-end-job needs-begin-file)
87a16a06
RS
6492
6493 ;; Setting this variable tells the unwind form that the
8bd22fcf 6494 ;; the PostScript was generated without error.
87a16a06
RS
6495 (setq completed-safely t))
6496
6497 ;; Unwind form: If some bad mojo occurred while generating
8bd22fcf 6498 ;; PostScript, delete all the PostScript that was generated.
87a16a06
RS
6499 ;; This protects the previously spooled files from getting
6500 ;; corrupted.
8bd22fcf
KH
6501 (and (markerp safe-marker) (not completed-safely)
6502 (progn
6503 (set-buffer ps-spool-buffer)
6504 (delete-region (marker-position safe-marker) (point-max))))))
87a16a06 6505
857686a6 6506 (and ps-razzle-dazzle (message "Formatting...done"))))))
ef2cbb24 6507
e65df0a1 6508
ea0c615d 6509(defun ps-end-job (needs-begin-file)
9dae638c 6510 (let ((ps-print-page-p t))
ea0c615d
GM
6511 (ps-flush-output)
6512 (save-excursion
4b3eb10f 6513 (let ((pages-per-sheet (mod ps-page-printed ps-n-up-printing))
ea0c615d 6514 (total-lines (cdr ps-printing-region))
ef1159c2 6515 (total-pages (ps-page-number)))
ea0c615d 6516 (set-buffer ps-spool-buffer)
ef1159c2
EZ
6517 (let (case-fold-search)
6518 ;; Back to the PS output buffer to set the last page n-up printing
6519 (goto-char (point-max))
6520 (and (> pages-per-sheet 0)
6521 (re-search-backward "^[0-9]+ BeginSheet$" nil t)
6522 (replace-match (format "%d BeginSheet" pages-per-sheet) t))
6523 ;; Back to the PS output buffer to set the page count
6524 (goto-char (point-min))
6525 (while (re-search-forward "^/Lines 0 def\n/PageCount 0 def$" nil t)
6526 (replace-match (format "/Lines %d def\n/PageCount %d def"
6527 total-lines total-pages) t)))))
ea0c615d
GM
6528 ;; Set dummy page
6529 (and ps-spool-duplex (= (mod ps-page-order 2) 1)
6530 (let ((ps-n-up-printing 0))
6531 (ps-header-sheet)
6532 (ps-output "/PrintHeader false def\n/ColumnIndex 0 def\n"
bd7a2e26
GM
6533 "/PrintLineNumber false def\n"
6534 (number-to-string ps-lines-printed) " BeginPage\n")
ea0c615d
GM
6535 (ps-end-page)))
6536 ;; Set end of PostScript file
9dae638c 6537 (ps-end-sheet)
4b3eb10f 6538 (ps-output "\n%%Trailer\n%%Pages: "
ea0c615d
GM
6539 (number-to-string
6540 (if (and needs-begin-file
6541 ps-banner-page-when-duplexing)
6542 (1+ ps-page-order)
6543 ps-page-order))
6544 "\n\nEndDoc\n\n%%EOF\n")
ef1159c2
EZ
6545 (and ps-end-with-control-d
6546 (ps-output "\C-d"))
ea0c615d
GM
6547 (ps-flush-output))
6548 ;; disable selected pages
1fd9b7fe 6549 (setq ps-selected-pages nil))
7d8b7e8e
KH
6550
6551
857686a6 6552;; Permit dynamic evaluation at print time of `ps-lpr-switches'.
ef2cbb24 6553(defun ps-do-despool (filename)
12d89a2e 6554 (if (or (not (boundp 'ps-spool-buffer))
bcc0d457 6555 (not (symbol-value 'ps-spool-buffer)))
12d89a2e 6556 (message "No spooled PostScript to print")
ef2cbb24
RS
6557 (if filename
6558 (save-excursion
857686a6 6559 (and ps-razzle-dazzle (message "Saving..."))
12d89a2e 6560 (set-buffer ps-spool-buffer)
ef2cbb24 6561 (setq filename (expand-file-name filename))
7ffaf659
EZ
6562 (let ((coding-system-for-write 'raw-text-unix))
6563 (write-region (point-min) (point-max) filename))
857686a6 6564 (and ps-razzle-dazzle (message "Wrote %s" filename)))
ef2cbb24 6565 ;; Else, spool to the printer
857686a6 6566 (and ps-razzle-dazzle (message "Printing..."))
ef2cbb24 6567 (save-excursion
12d89a2e 6568 (set-buffer ps-spool-buffer)
200127fd 6569 (let* ((coding-system-for-write 'raw-text-unix)
298bfad9
KH
6570 (ps-printer-name (or ps-printer-name
6571 (and (boundp 'printer-name)
2bd80d73 6572 (symbol-value 'printer-name))))
200127fd 6573 (ps-lpr-switches
da13a4be 6574 (append ps-lpr-switches
3556c6dd
GM
6575 (and (stringp ps-printer-name)
6576 (string< "" ps-printer-name)
6577 (list (concat
6578 (and (stringp ps-printer-name-option)
6579 ps-printer-name-option)
6580 ps-printer-name))))))
830f437e
VJL
6581 (or (stringp ps-printer-name)
6582 (setq ps-printer-name nil))
52cf535f
AI
6583 (apply (or ps-print-region-function 'call-process-region)
6584 (point-min) (point-max) ps-lpr-command nil
6585 (and (fboundp 'start-process) 0)
6586 nil
6587 (ps-flatten-list ; dynamic evaluation
7d5cb920
VJL
6588 (ps-string-list
6589 (mapcar 'ps-eval-switch ps-lpr-switches))))))
857686a6 6590 (and ps-razzle-dazzle (message "Printing...done")))
12d89a2e
RS
6591 (kill-buffer ps-spool-buffer)))
6592
7d5cb920
VJL
6593(defun ps-string-list (arg)
6594 (let (lstr)
6595 (dolist (elm arg)
6596 (cond ((stringp elm)
6597 (setq lstr (cons elm lstr)))
6598 ((listp elm)
6599 (let ((s (ps-string-list elm)))
6600 (when s
6601 (setq lstr (cons s lstr)))))
6602 (t ))) ; ignore any other value
6603 (nreverse lstr)))
6604
857686a6
RS
6605;; Dynamic evaluation
6606(defun ps-eval-switch (arg)
6607 (cond ((stringp arg) arg)
6608 ((functionp arg) (apply arg nil))
6609 ((symbolp arg) (symbol-value arg))
6610 ((consp arg) (apply (car arg) (cdr arg)))
6611 (t nil)))
6612
6613;; `ps-flatten-list' is defined here (copied from "message.el" and
6614;; enhanced to handle dotted pairs as well) until we can get some
6615;; sensible autoloads, or `flatten-list' gets put somewhere decent.
6616
6617;; (ps-flatten-list '((a . b) c (d . e) (f g h) i . j))
6618;; => (a b c d e f g h i j)
6619
6620(defun ps-flatten-list (&rest list)
6621 (ps-flatten-list-1 list))
6622
6623(defun ps-flatten-list-1 (list)
6624 (cond ((null list) nil)
6625 ((consp list) (append (ps-flatten-list-1 (car list))
6626 (ps-flatten-list-1 (cdr list))))
6627 (t (list list))))
6628
12d89a2e
RS
6629(defun ps-kill-emacs-check ()
6630 (let (ps-buffer)
8bd22fcf 6631 (and (setq ps-buffer (get-buffer ps-spool-buffer-name))
6b61353c 6632 (buffer-name ps-buffer) ; check if it's not killed
8bd22fcf
KH
6633 (buffer-modified-p ps-buffer)
6634 (y-or-n-p "Unprinted PostScript waiting; print now? ")
6635 (ps-despool))
6636 (and (setq ps-buffer (get-buffer ps-spool-buffer-name))
6b61353c 6637 (buffer-name ps-buffer) ; check if it's not killed
8bd22fcf
KH
6638 (buffer-modified-p ps-buffer)
6639 (not (yes-or-no-p "Unprinted PostScript waiting; exit anyway? "))
6640 (error "Unprinted PostScript"))))
12d89a2e 6641
d3ab8dac
KH
6642(cond ((fboundp 'add-hook)
6643 (funcall 'add-hook 'kill-emacs-hook 'ps-kill-emacs-check))
6644 (kill-emacs-hook
6645 (message "Won't override existing `kill-emacs-hook'"))
6646 (t
6647 (setq kill-emacs-hook 'ps-kill-emacs-check)))
ef2cbb24 6648
298bfad9 6649\f
298bfad9
KH
6650;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6651;; To make this file smaller, some commands go in a separate file.
6652;; But autoload them here to make the separation invisible.
231f3e66 6653\f
4dacf5c5 6654;;;### (autoloads (ps-mule-end-job ps-mule-begin-job ps-mule-initialize
8d5e14a9 6655;;;;;; ps-multibyte-buffer) "ps-mule" "ps-mule.el" "1d4fa71bb8102914d3c5f0bf853a08e3")
231f3e66 6656;;; Generated autoloads from ps-mule.el
298bfad9 6657
231f3e66 6658(defvar ps-multibyte-buffer nil "\
9201cc28 6659Specifies the multi-byte buffer handling.
298bfad9 6660
231f3e66 6661Valid values are:
298bfad9 6662
5da6890d
SM
6663 nil This is the value to use the default settings;
6664 by default, this only works to print buffers with
6665 only ASCII and Latin characters. But this default
6666 setting can be changed by setting the variable
231f3e66
SM
6667 `ps-mule-font-info-database-default' differently.
6668 The initial value of this variable is
6669 `ps-mule-font-info-database-latin' (see
6670 documentation).
6671
5da6890d 6672 `non-latin-printer' This is the value to use when you have a Japanese
231f3e66
SM
6673 or Korean PostScript printer and want to print
6674 buffer with ASCII, Latin-1, Japanese (JISX0208 and
6675 JISX0201-Kana) and Korean characters. At present,
6fb87e51
VJL
6676 it was not tested with the Korean characters
6677 printing. If you have a korean PostScript printer,
6678 please, test it.
231f3e66 6679
5da6890d 6680 `bdf-font' This is the value to use when you want to print
231f3e66
SM
6681 buffer with BDF fonts. BDF fonts include both latin
6682 and non-latin fonts. BDF (Bitmap Distribution
6683 Format) is a format used for distributing X's font
6684 source file. BDF fonts are included in
6685 `intlfonts-1.2' which is a collection of X11 fonts
6686 for all characters supported by Emacs. In order to
6687 use this value, be sure to have installed
6688 `intlfonts-1.2' and set the variable
6689 `bdf-directory-list' appropriately (see ps-bdf.el for
6690 documentation of this variable).
6691
5da6890d 6692 `bdf-font-except-latin' This is like `bdf-font' except that it uses
231f3e66
SM
6693 PostScript default fonts to print ASCII and Latin-1
6694 characters. This is convenient when you want or
6695 need to use both latin and non-latin characters on
6696 the same buffer. See `ps-font-family',
6697 `ps-header-font-family' and `ps-font-info-database'.
6698
6699Any other value is treated as nil.")
6700
985773c9 6701(custom-autoload 'ps-multibyte-buffer "ps-mule" t)
231f3e66 6702
985773c9 6703(autoload 'ps-mule-initialize "ps-mule" "\
231f3e66
SM
6704Initialize global data for printing multi-byte characters.
6705
6706\(fn)" nil nil)
6707
985773c9 6708(autoload 'ps-mule-begin-job "ps-mule" "\
231f3e66 6709Start printing job for multi-byte chars between FROM and TO.
5ef05ae3 6710It checks if all multi-byte characters in the region are printable or not.
298bfad9 6711
231f3e66 6712\(fn FROM TO)" nil nil)
298bfad9 6713
985773c9 6714(autoload 'ps-mule-end-job "ps-mule" "\
4dacf5c5 6715Finish printing job for multi-byte chars.
298bfad9 6716
231f3e66 6717\(fn)" nil nil)
6bf5fb46 6718
231f3e66 6719;;;***
298bfad9
KH
6720\f
6721;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6722
12d89a2e 6723(provide 'ps-print)
b87c5d3d 6724
231f3e66 6725;; arch-tag: fb06a585-1112-4206-885d-a57d95d50579
12d89a2e 6726;;; ps-print.el ends here