changeset 37135:18c2d3c6096d

Line and paragraph spacing feature. Region to cut out when printing. Doc fix. (ps-print-version): New version number (6.5). (ps-line-spacing, ps-paragraph-spacing, ps-paragraph-regexp): New vars. Line and paragraph spacing feature. (ps-begin-cut-regexp, ps-end-cut-regexp): New vars. Region to cut out when printing. (ps-setup, ps-nb-pages, ps-get-page-dimensions, ps-begin-file) (ps-get-font-size, ps-begin-job, ps-continue-line) (ps-plot-region): Code fix. (ps-print-prologue-2): Var eliminated. (ps-line-spacing-internal, ps-paragraph-spacing-internal): New internal vars. (ps-get-size): New fun. (ps-output-string-prim, ps-init-output-queue, ps-print-page-p) (ps-next-line): Replace defun by defsubst. (ps-mule-plot-string): Autoload doc fix. (ps-mule-generate-font): New arg HEADER-P. If it is non-nil, generate font for the header strings. (ps-mule-prepare-font): Likewise. (ps-mule-generate-glyphs): Likewise. (ps-mule-string-encoding): Likewise. (ps-mule-header-charsets): New variable. (ps-mule-encode-header-string): New function. (ps-mule-header-string-charsets): New function. (ps-mule-begin-job): Check charsets in the header strings. If there are non-ASCII and non-Latin1 charsets, prepare fonts for them.
author Gerd Moellmann <gerd@gnu.org>
date Mon, 02 Apr 2001 10:35:07 +0000
parents 87685591e368
children 422bd2e720f2
files lisp/ps-print.el
diffstat 1 files changed, 211 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ps-print.el	Mon Apr 02 10:19:52 2001 +0000
+++ b/lisp/ps-print.el	Mon Apr 02 10:35:07 2001 +0000
@@ -10,12 +10,12 @@
 ;; Maintainer:	Kenichi Handa <handa@etl.go.jp> (multi-byte characters)
 ;; Maintainer:	Vinicius Jose Latorre <vinicius@cpqd.com.br>
 ;; Keywords:	wp, print, PostScript
-;; Time-stamp:	<2001/02/19 14:54:52 Vinicius>
-;; Version:	6.4
+;; Time-stamp:	<2001/03/23 21:27:46 Vinicius>
+;; Version:	6.5
 ;; X-URL:	http://www.cpqd.com.br/~vinicius/emacs/
 
-(defconst ps-print-version "6.4"
-  "ps-print.el, v 6.4 <2001/02/19 vinicius>
+(defconst ps-print-version "6.5"
+  "ps-print.el, v 6.5 <2001/03/23 vinicius>
 
 Vinicius's last change version -- this file may have been edited as part of
 Emacs without changes to the version number.  When reporting bugs, please also
@@ -849,6 +849,35 @@
 ;; The variable `ps-header-title-font-size' determines the font size, in points,
 ;; for the top line of text in the header (similar to `ps-font-size').
 ;;
+;; The variable `ps-line-spacing' determines the line spacing, in points, for
+;; ordinary text, when generating PostScript (similar to `ps-font-size').  The
+;; default value is 0 (zero = no line spacing).
+;;
+;; The variable `ps-paragraph-spacing' determines the paragraph spacing, in
+;; points, for ordinary text, when generating PostScript (similar to
+;; `ps-font-size').  The default value is 0 (zero = no paragraph spacing).
+;;
+;; To get all lines with some spacing set both `ps-line-spacing' and
+;; `ps-paragraph-spacing' variables.
+;;
+;; The variable `ps-paragraph-regexp' specifies the paragraph delimiter.  It
+;; should be a regexp or nil.  The default value is "[ \t]*$", that is, an
+;; empty line or a line containing only spaces and tabs.
+;;
+;; The variable `ps-begin-cut-regexp' and `ps-end-cut-regexp' specify the start
+;; and end of a region to cut out when printing.
+;;
+;; As an example, variables `ps-begin-cut-regexp' and `ps-end-cut-regexp' may
+;; be set to "^Local Variables:" and "^End:", respectively, in order to leave
+;; out some special printing instructions from the actual print.  Special
+;; printing instructions may be appended to the end of the file just like any
+;; other buffer-local variables.  See section "Local Variables in Files" on
+;; Emacs manual for more information.
+;; 
+;; Variables `ps-begin-cut-regexp' and `ps-end-cut-regexp' control together what
+;; actually gets printed.  Both variables may be set to nil in which case no
+;; cutting occurs.  By default, both variables are set to nil.
+;;
 ;;
 ;; Adding a New Font Family
 ;; ------------------------
@@ -1249,8 +1278,10 @@
 ;; of folding lines.
 ;;
 ;;
-;; Acknowledgements
-;; ----------------
+;; Acknowledgments
+;; ---------------
+;;
+;; Thanks to Pavel Janik ml <Pavel@Janik.cz> for documentation correction.
 ;;
 ;; Thanks to Corinne Ilvedson <cilvedson@draper.com> for line number font size
 ;; suggestion.
@@ -1640,6 +1671,7 @@
 		 :tag "Printer Name Option"
 		 (const :tag "None" nil)
 		 (string :tag "Option"))
+  :version "21.1"
   :group 'ps-print-printer)
 
 (defcustom ps-lpr-command lpr-command
@@ -1678,6 +1710,7 @@
 
 (defcustom ps-end-with-control-d (and ps-windows-system t)
   "*Non-nil means insert C-d at end of PostScript file generated."
+  :version "21.1"
   :type 'boolean
   :group 'ps-print-printer)
 
@@ -2718,6 +2751,75 @@
   :type 'directory
   :group 'ps-print-miscellany)
 
+(defcustom ps-line-spacing 0
+  "*Specify line spacing, in points, for ordinary text.
+
+See also `ps-paragraph-spacing' and `ps-paragraph-regexp'.
+
+To get all lines with some spacing set both `ps-line-spacing' and
+`ps-paragraph-spacing' variables."
+  :type '(choice :menu-tag "Line Spacing For Ordinary Text"
+		 :tag "Line Spacing For Ordinary Text"
+		 (number :tag "Line Spacing")
+		 (cons :tag "Landscape/Portrait"
+		       (number :tag "Landscape Line Spacing")
+		       (number :tag "Portrait Line Spacing")))
+  :version "21.1"
+  :group 'ps-print-miscellany)
+
+(defcustom ps-paragraph-spacing 0
+  "*Specify paragraph spacing, in points, for ordinary text.
+
+See also `ps-line-spacing' and `ps-paragraph-regexp'.
+
+To get all lines with some spacing set both `ps-line-spacing' and
+`ps-paragraph-spacing' variables."
+  :type '(choice :menu-tag "Paragraph Spacing For Ordinary Text"
+		 :tag "Paragraph Spacing For Ordinary Text"
+		 (number :tag "Paragraph Spacing")
+		 (cons :tag "Landscape/Portrait"
+		       (number :tag "Landscape Paragraph Spacing")
+		       (number :tag "Portrait Paragraph Spacing")))
+  :version "21.1"
+  :group 'ps-print-miscellany)
+
+(defcustom ps-paragraph-regexp "[ \t]*$"
+  "*Specify paragraph delimiter.
+
+It should be a regexp or nil.
+
+See also `ps-paragraph-spacing'."
+  :type '(choice :menu-tag "Paragraph Delimiter"
+		 (const :tag "No Delimiter" nil)
+		 (regexp :tag "Delimiter Regexp"))
+  :version "21.1"
+  :group 'ps-print-miscellany)
+
+(defcustom ps-begin-cut-regexp nil
+  "*Specify regexp which is start of a region to cut out when printing.
+
+As an example, variables `ps-begin-cut-regexp' and `ps-end-cut-regexp' may be
+set to \"^Local Variables:\" and \"^End:\", respectively, in order to leave out
+some special printing instructions from the actual print.  Special printing
+instructions may be appended to the end of the file just like any other
+buffer-local variables.  See section \"Local Variables in Files\" on Emacs
+manual for more information.
+
+Variables `ps-begin-cut-regexp' and `ps-end-cut-regexp' control together what
+actually gets printed.  Both variables may be set to nil in which case no
+cutting occurs."
+  :type 'regexp
+  :version "21.1"
+  :group 'ps-print-miscellany)
+
+(defcustom ps-end-cut-regexp nil
+  "*Specify regexp which is end of the region to cut out when printing.
+
+See `ps-begin-cut-regexp' for more information."
+  :type 'regexp
+  :version "21.1"
+  :group 'ps-print-miscellany)
+
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Selected Pages
@@ -2952,6 +3054,11 @@
       ps-header-title-font-size %s
       ps-line-number-font       %s
       ps-line-number-font-size  %s
+      ps-line-spacing           %s
+      ps-paragraph-spacing      %s
+      ps-paragraph-regexp       %s
+      ps-begin-cut-regexp       %s
+      ps-end-cut-regexp         %s
 
       ps-even-or-odd-pages   %s
       ps-selected-pages      %s
@@ -3035,6 +3142,11 @@
    (ps-print-quote ps-header-title-font-size)
    ps-line-number-font
    (ps-print-quote ps-line-number-font-size)
+   (ps-print-quote ps-line-spacing)
+   (ps-print-quote ps-paragraph-spacing)
+   (ps-print-quote ps-paragraph-regexp)
+   (ps-print-quote ps-begin-cut-regexp)
+   (ps-print-quote ps-end-cut-regexp)
    (ps-print-quote ps-even-or-odd-pages)
    (ps-print-quote ps-selected-pages)
    (ps-print-quote ps-last-selected-pages)
@@ -3224,10 +3336,7 @@
   "ps-print PostScript error handler.")
 
 (defvar ps-print-prologue-1 ""
-  "ps-print PostScript prologue begin.")
-
-(defvar ps-print-prologue-2 ""
-  "ps-print PostScript prologue end.")
+  "ps-print PostScript prologue.")
 
 ;; Start Editing Here:
 
@@ -3304,6 +3413,8 @@
 (defvar ps-font-size-internal nil)
 (defvar ps-header-font-size-internal nil)
 (defvar ps-header-title-font-size-internal nil)
+(defvar ps-line-spacing-internal nil)
+(defvar ps-paragraph-spacing-internal nil)
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -3641,7 +3752,11 @@
 	 (ps-header-title-font-size-internal
 	  (or ps-header-title-font-size-internal
 	      (ps-get-font-size 'ps-header-title-font-size)))
+	 (ps-line-spacing-internal
+	  (or ps-line-spacing-internal
+	      (ps-get-size ps-line-spacing "line spacing")))
 	 (buf (get-buffer-create "*Nb-Pages*"))
+	 (ils ps-line-spacing-internal) ; initial line spacing
 	 (ifs ps-font-size-internal)	; initial font size
 	 (ilh (ps-line-height 'ps-font-for-text)) ; initial line height
 	 (page-height (progn (ps-get-page-dimensions)
@@ -3660,10 +3775,10 @@
 	 nb-lpp				; current nb of lines per page
 	 nb-page			; current nb of pages
 	 )
-    (setq lh-min      (/ (* ilh fs-min) ifs)
+    (setq lh-min      (/ (- (* (+ ilh ils) fs-min) ils) ifs)
 	  nb-lpp-max  (floor (/ page-height lh-min))
 	  nb-page-min (ceiling (/ (float nb-lines) nb-lpp-max))
-	  lh-max      (/ (* ilh fs-max) ifs)
+	  lh-max      (/ (- (* (+ ilh ils) fs-max) ils) ifs)
 	  nb-lpp-min  (floor (/ page-height lh-max))
 	  nb-page-max (ceiling (/ (float nb-lines) nb-lpp-min))
 	  nb-page     nb-page-min)
@@ -3797,7 +3912,8 @@
     ;; ps-zebra-stripe-follow is `full' or `full-follow'
     (if ps-zebra-stripe-full-p
 	(let* ((line-height (ps-line-height 'ps-font-for-text))
-	       (zebra (* line-height ps-zebra-stripe-height)))
+	       (zebra (* (+ line-height ps-line-spacing-internal)
+			 ps-zebra-stripe-height)))
 	  (setq ps-print-height (- (* (floor ps-print-height zebra) zebra)
 				   line-height))
 	  (if (<= ps-print-height 0)
@@ -3805,11 +3921,13 @@
 ps-zebra-stripe-follow == %s
 ps-zebra-stripe-height == %s
 font-text-height       == %s
-page-height == ((floor print-height (th * zh)) * (th * zh)) - th
+line-spacing           == %s
+page-height == ((floor print-height ((th + ls) * zh)) * ((th + ls) * zh)) - th
 => print-height == %d !"
 		     ps-zebra-stripe-follow
 		     ps-zebra-stripe-height
 		     (ps-line-height 'ps-font-for-text)
+		     ps-line-spacing-internal
 		     ps-print-height))))))
 
 (defun ps-print-preprint (prefix-arg)
@@ -3874,7 +3992,7 @@
     table)
   "Vector used to map characters to PostScript string escape codes.")
 
-(defun ps-output-string-prim (string)
+(defsubst ps-output-string-prim (string)
   (insert "(")				;insert start-string delimiter
   (save-excursion			;insert string
     (insert (string-as-unibyte string)))
@@ -3887,7 +4005,7 @@
   (goto-char (point-max))
   (insert ")"))				;insert end-string delimiter
 
-(defun ps-init-output-queue ()
+(defsubst ps-init-output-queue ()
   (setq ps-output-head (list "")
 	ps-output-tail ps-output-head))
 
@@ -3901,7 +4019,7 @@
 		(< ps-last-page ps-page-postscript)))))
 
 
-(defun ps-print-page-p ()
+(defsubst ps-print-page-p ()
   (setq ps-print-page-p
 	(and (cond ((null ps-first-page))
 		   ((<= ps-page-postscript ps-last-page)
@@ -3920,7 +4038,7 @@
 		   ))))
 
 
-(defun ps-print-sheet-p ()
+(defsubst ps-print-sheet-p ()
   (setq ps-print-page-p
 	(cond ((eq ps-even-or-odd-pages 'even-sheet)
 	       (= (logand ps-page-sheet 1) 0))
@@ -3980,17 +4098,19 @@
    ;; Literal strings should be output as is -- the string must
    ;; contain its own PS string delimiters, '(' and ')', if necessary.
    ((stringp content)
-    (ps-output content))
+    (ps-output (ps-mule-encode-header-string content fonttag)))
 
    ;; Functions are called -- they should return strings; they will be
    ;; inserted as strings and the PS string delimiters added.
    ((and (symbolp content) (fboundp content))
-    (ps-output-string (funcall content)))
+    (ps-output-string (ps-mule-encode-header-string (funcall content)
+						    fonttag)))
 
    ;; Variables will have their contents inserted.  They should
    ;; contain strings, and will be inserted as strings.
    ((and (symbolp content) (boundp content))
-    (ps-output-string (symbol-value content)))
+    (ps-output-string (ps-mule-encode-header-string (symbol-value content)
+						    fonttag)))
 
    ;; Anything else will get turned into an empty string.
    (t
@@ -4651,7 +4771,7 @@
 
     (ps-output "%%EndComments\n%%BeginDefaults\n%%PageMedia: "
 	       (ps-page-dimensions-get-media dimensions)
-	       "\n%%EndDefaults\n\n%%BeginPrologue\n\n"
+	       "\n%%EndDefaults\n\n%%BeginProlog\n\n"
 	       "/languagelevel where{pop}{/languagelevel 1 def}ifelse\n"
 	       (format "/ErrorMessage  %s def\n\n"
 		       (or (cdr (assoc ps-error-handler-message
@@ -4696,11 +4816,16 @@
     (ps-output-boolean "ShowNofN          " ps-show-n-of-n)
 
     (let ((line-height (ps-line-height 'ps-font-for-text)))
-      (ps-output (format "/LineHeight       %s def\n" line-height)
+      (ps-output (format "/LineSpacing      %s def\n" ps-line-spacing-internal)
+		 (format "/ParagraphSpacing %s def\n"
+			 ps-paragraph-spacing-internal)
+		 (format "/LineHeight       %s def\n" line-height)
 		 (format "/LinesPerColumn   %d def\n"
-			 (round (/ (+ ps-print-height
-				      (* line-height 0.45))
-				   line-height)))))
+			 (let ((height (+ line-height
+					  ps-line-spacing-internal)))
+			   (round (/ (+ ps-print-height
+					(* height 0.45))
+				     height))))))
 
     (ps-output-boolean "WarnPaperSize   " ps-warn-paper-type)
     (ps-output-boolean "Zebra           " ps-zebra-stripes)
@@ -4770,7 +4895,16 @@
 		       (ps-get-font-size 'ps-line-number-font-size)
 		       ps-line-number-font))
 
-    (ps-output "\n" ps-print-prologue-2 "\n")
+    (ps-output "\n\n% ---- These lines must be kept together because...
+
+/h0 F
+/HeaderTitleLineHeight FontHeight def
+
+/h1 F
+/HeaderLineHeight FontHeight def
+/HeaderDescent    Descent def
+
+% ---- ...because `F' has a side-effect on `FontHeight' and `Descent'\n\n")
 
     ;; Text fonts
     (let ((font (ps-font-alist 'ps-font-for-text))
@@ -4787,7 +4921,7 @@
       (ps-output (format "/SpaceWidthRatio %f def\n"
 			 (/ (ps-lookup 'space-width) (ps-lookup 'size)))))
 
-    (ps-output "\n%%EndPrologue\n\n%%BeginSetup\n")
+    (ps-output "\n%%EndProlog\n\n%%BeginSetup\n")
     (unless (eq ps-spool-config 'lpr-switches)
       (ps-output "\n%%BeginFeature: *Duplex "
 		 (ps-boolean-capitalized ps-spool-duplex)
@@ -4864,18 +4998,28 @@
        (and (buffer-modified-p) " (unsaved)")))))
 
 
+(defun ps-get-size (size mess &optional arg)
+  (let ((siz (cond ((numberp size)
+		    size)
+		   ((and (consp size)
+			 (numberp (car size))
+			 (numberp (cdr size)))
+		    (if ps-landscape-mode
+			(car size)
+		      (cdr size)))
+		   (t
+		    -1))))
+    (and (< siz 0)
+	 (error "Invalid %s `%S'%s"
+		mess size
+		(if arg
+		    (format " for `%S'" arg)
+		  "")))
+    siz))
+
+
 (defun ps-get-font-size (font-sym)
-  (let ((font-size (symbol-value font-sym)))
-    (cond ((numberp font-size)
-	   font-size)
-	  ((and (consp font-size)
-		(numberp (car font-size))
-		(numberp (cdr font-size)))
-	   (if ps-landscape-mode
-	       (car font-size)
-	     (cdr font-size)))
-	  (t
-	   (error "Invalid font size `%S' for `%S'" font-size font-sym)))))
+  (ps-get-size (symbol-value font-sym) "font size" font-sym))
 
 
 (defun ps-begin-job ()
@@ -4883,7 +5027,6 @@
   (or (equal ps-mark-code-directory ps-postscript-code-directory)
       (setq ps-print-prologue-0    (ps-prologue-file 0)
 	    ps-print-prologue-1    (ps-prologue-file 1)
-	    ps-print-prologue-2    (ps-prologue-file 2)
 	    ps-mark-code-directory ps-postscript-code-directory))
   ;; selected pages
   (let (new page)
@@ -4931,6 +5074,10 @@
 	ps-lines-printed 0
 	ps-print-page-p t
 	ps-showline-count (car ps-printing-region)
+	ps-line-spacing-internal      (ps-get-size ps-line-spacing
+						   "line spacing")
+	ps-paragraph-spacing-internal (ps-get-size ps-paragraph-spacing
+						   "paragraph spacing")
 	ps-font-size-internal        (ps-get-font-size 'ps-font-size)
 	ps-header-font-size-internal (ps-get-font-size 'ps-header-font-size)
 	ps-header-title-font-size-internal
@@ -5048,19 +5195,24 @@
   (and (< (point) limit)
        (forward-char 1)))
 
-(defun ps-next-line ()
+(defsubst ps-next-line ()
   (setq ps-showline-count (1+ ps-showline-count)
 	ps-lines-printed  (1+ ps-lines-printed))
-  (let ((lh (ps-line-height 'ps-font-for-text)))
+  (let* ((paragraph-p (and ps-paragraph-regexp
+			   (looking-at ps-paragraph-regexp)))
+	 (lh (+ (ps-line-height 'ps-font-for-text)
+		(if paragraph-p
+		    ps-paragraph-spacing-internal
+		  ps-line-spacing-internal))))
     (if (< ps-height-remaining lh)
 	(ps-next-page)
       (setq ps-width-remaining  ps-print-width
 	    ps-height-remaining (- ps-height-remaining lh))
-      (ps-output "HL\n"))))
+      (ps-output (if paragraph-p "PHL\n" "LHL\n")))))
 
 (defun ps-continue-line ()
   (setq ps-lines-printed (1+ ps-lines-printed))
-  (let ((lh (ps-line-height 'ps-font-for-text)))
+  (let ((lh (+ (ps-line-height 'ps-font-for-text) ps-line-spacing-internal)))
     (if (< ps-height-remaining lh)
 	(ps-next-page)
       (setq ps-width-remaining  ps-print-width
@@ -5166,6 +5318,15 @@
     ;; ...break the region up into chunks separated by tabs, linefeeds,
     ;; pagefeeds, control characters, and plot each chunk.
     (while (< from to)
+      ;; skip lines between cut markers
+      (and ps-begin-cut-regexp ps-end-cut-regexp
+	   (looking-at ps-begin-cut-regexp)
+	   (progn
+	     (goto-char (match-end 0))
+	     (and (re-search-forward ps-end-cut-regexp to 'noerror)
+		  (= (following-char) ?\n)
+		  (forward-char 1))
+	     (setq from (point))))
       (if (re-search-forward ps-control-or-escape-regexp to t)
 	  ;; region with some control characters or some multi-byte characters
 	  (let* ((match-point (match-beginning 0))
@@ -5956,7 +6117,7 @@
   "Adjust current font if current charset is not ASCII.")
 
 (autoload 'ps-mule-plot-string        "ps-mule"
-  "Generate PostScript code for ploting characters in the region FROM and TO.
+  "Generate PostScript code for plotting characters in the region FROM and TO.
 
 It is assumed that all characters in this region belong to the same charset.
 
@@ -5979,6 +6140,11 @@
 (autoload 'ps-mule-begin-page         "ps-mule"
   "Initialize multi-byte charset for printing current page.")
 
+(autoload 'ps-mule-encode-header-string "ps-mule"
+  "Generate PostScript code for plotting characters in header STRING.
+
+It is assumed that the length of STRING is not zero.")
+
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;