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