;;; this is still too big a mess.
-(use-modules (ice-9 regex)
- (ice-9 string-fun)
- (ice-9 format)
+(use-modules (ice-9 string-fun)
(guile)
(scm page)
(scm paper-system)
(scm clip-region)
(lily))
+(define (format dest . rest)
+ (if (string? dest)
+ (apply simple-format (cons #f (cons dest rest)))
+ (apply simple-format (cons dest rest))))
(define framework-ps-module (current-module))
(string-append
"magfont"
- (string-regexp-substitute "[ /%]" "_" name)
+ (ly:string-substitute
+ " " "_"
+ (ly:string-substitute
+ "/" "_"
+ (ly:string-substitute
+ "%" "_" name)))
"m" (string-encode-integer (inexact->exact (round (* 1000 magnify)))))))
(define (tex-font? fontname)
(string-append
"/" command " { /" fontname " " (ly:number->string scaling) " output-scale div selectfont } bind def\n"))
- (define (standard-tex-font? x)
- (or (equal? (substring x 0 2) "ms")
- (equal? (substring x 0 2) "cm")))
-
(define (font-load-command font)
(let* ((specced-font-name (ly:font-name font))
(fontname (if specced-font-name
(ops (ly:output-def-lookup paper 'output-scale))
(scaling (* ops magnification designsize)))
- ;; Bluesky pfbs have UPCASE names (sigh.)
- ;; FIXME - don't support Bluesky?
- (if (standard-tex-font? fontname)
- (set! fontname (string-upcase fontname)))
(if (equal? fontname "unknown")
(display (list font fontname)))
(define-font plain fontname scaling)))
(ly:output-def-lookup paper 'output-scale))
(ly:bp 1)))
(landscape? (eq? (ly:output-def-lookup paper 'landscape) #t)))
- (format "%%DocumentMedia: ~a ~$ ~$ ~a ~a ~a\n"
- (ly:output-def-lookup paper 'papersizename)
- (if landscape? h w)
- (if landscape? w h)
- 80 ;; weight
- "()" ;; color
- "()" ;; type
+ (ly:format "%%DocumentMedia: ~a ~2f ~2f ~a ~a ~a\n"
+ (ly:output-def-lookup paper 'papersizename)
+ (if landscape? h w)
+ (if landscape? w h)
+ 80 ;; weight
+ "()" ;; color
+ "()" ;; type
)))
(format
(if (string? name)
"(~a) (r) file .loadfont\n"
- "% can't find font file: ~a\n")
+ "% cannot find font file: ~a\n")
name))
(let* ((font (car font-name-filename))
(if (mac-font? bare-file-name)
(handle-mac-font name bare-file-name)
(cond
- ((string-match "^([eE]mmentaler|[Aa]ybabtu)" file-name)
+ ((or (string-startswith file-name "Emmentaler")
+ (string-startswith file-name "emmentaler")
+ (string-startswith file-name "aybabtu")
+ (string-startswith file-name "Aybabtu"))
(ps-load-file (ly:find-file
(format "~a.otf" file-name))))
((string? bare-file-name)
(ps-load-file file-name))
(else
- (ly:warning (_ "can't embed ~S=~S") name file-name)
+ (ly:warning (_ "cannot embed ~S=~S") name file-name)
"")))
)))
(if (not embed)
(begin
(set! embed "% failed \n")
- (ly:warning (_ "can't extract file matching ~a from ~a") name filename)))
+ (ly:warning (_ "cannot extract file matching ~a from ~a") name filename)))
embed))
(define (font-file-as-ps-string name file-name)
((downcase-file-name (string-downcase file-name)))
(cond
- ((and file-name (string-match "\\.pfa" downcase-file-name))
+ ((and file-name (string-endswith downcase-file-name ".pfa"))
(embed-document file-name))
- ((and file-name (string-match "\\.pfb" downcase-file-name))
+ ((and file-name (string-endswith downcase-file-name ".pfb"))
(ly:pfb->pfa file-name))
- ((and file-name (string-match "\\.ttf" downcase-file-name))
+ ((and file-name (string-endswith downcase-file-name ".ttf"))
(ly:ttf->pfa file-name))
- ((and file-name (string-match "\\.otf" downcase-file-name))
+ ((and file-name (string-endswith downcase-file-name ".otf"))
(ps-embed-cff (ly:otf->cff file-name) name 0))
(else
- (ly:warning (_ "don't know how to embed ~S=~S") name file-name)
+ (ly:warning (_ "do not know how to embed ~S=~S") name file-name)
""))))
(define (mac-font? bare-file-name)
(eq? PLATFORM 'darwin)
bare-file-name
(or
- (string-match "\\.dfont" bare-file-name)
+ (string-endswith bare-file-name ".dfont")
(= (stat:size (stat bare-file-name)) 0))))
(define (load-font font-name-filename)
(bare-file-name (font-file-as-ps-string name bare-file-name))
(else
- (ly:warning (_ "don't know how to embed font ~s ~s ~s")
+ (ly:warning (_ "do not know how to embed font ~s ~s ~s")
name file-name font))))))
(sort (apply append all-font-names)
(lambda (x y) (string<? (cadr x) (cadr y))))))
-
(font-loader (if (ly:get-option 'gs-load-fonts)
load-font-via-GS
load-font))
(ly:output-formats))))
(define-public (dump-stencil-as-EPS paper dump-me filename
- load-fonts
- )
+ load-fonts)
+
(let*
((xext (ly:stencil-extent dump-me X))
(yext (ly:stencil-extent dump-me Y))
+ (padding (ly:get-option 'eps-box-padding))
+ (left-overshoot (if (number? padding)
+ (* -1 padding (ly:output-def-lookup paper 'mm))
+ #f))
(bbox
(map
(lambda (x)
;; FIXME: huh?
(equal? (format #f "~S" x) "+#.#")
(equal? (format #f "~S" x) "-#.#"))
- 0.0 x))))
+ 0.0 x))
;; the left-overshoot is to make sure that
;; bar numbers stick out of margin uniformly.
;;
(list
- (if (ly:get-option 'pad-eps-boxes)
+ (if (number? left-overshoot)
(min left-overshoot (car xext))
(car xext))
- (car yext) (cdr xext) (cdr yext)))
+ (car yext) (cdr xext) (cdr yext)))))
- (dump-stencil-as-EPS-with-bbox paper dump-me filename load-fonts bbox)))
+ (dump-stencil-as-EPS-with-bbox paper dump-me filename load-fonts bbox)
+ ))
(define-public (dump-stencil-as-EPS-with-bbox paper dump-me filename
(open-file (format "~a.eps" filename) "wb")
"ps"))
- (left-overshoot -3)
(port (ly:outputter-port outputter))
-
-
(rounded-bbox (to-bp-box bbox))
(port (ly:outputter-port outputter))
(header (eps-header paper rounded-bbox load-fonts)))
-(define (clip-system-EPS basename paper paper-system clip-regions
- do-pdf)
+(define (clip-systems-to-region
+ basename paper systems region
+ do-pdf)
(let*
- ((system-grob (paper-system-system-grob paper-system))
- (extents-region-pairs
+ ((extents-system-pairs
(filtered-map
- (lambda (region)
+ (lambda (paper-system)
(let*
- ((x-ext (system-clipped-x-extent system-grob region)))
+ ((x-ext (system-clipped-x-extent
+ (paper-system-system-grob paper-system)
+ region)))
(if x-ext
- (cons x-ext region)
+ (cons x-ext paper-system)
#f)))
- clip-regions)))
+ systems))
+ (count 0))
(for-each
- (lambda (ext-region-pair)
+ (lambda (ext-system-pair)
(let*
- ((xext (car ext-region-pair))
- (region (cdr ext-region-pair))
+ ((xext (car ext-system-pair))
+ (paper-system (cdr ext-system-pair))
(yext (paper-system-extent paper-system Y))
(bbox (list (car xext) (car yext)
(cdr xext) (cdr yext)))
- (filename (format "~a-clip-~a-~a" basename
- (rhythmic-location->file-string (car region))
- (rhythmic-location->file-string (cdr region)))))
+ (filename (if (< 0 count)
+ (format "~a-~a" basename count)
+ basename)))
+ (set! count (1+ count))
(dump-stencil-as-EPS-with-bbox
paper
(paper-system-stencil paper-system)
(postscript->pdf 0 0 (format "~a.eps" filename)))
))
- extents-region-pairs)
-
-
+ extents-system-pairs)
))
-(define (clip-system-EPSes basename paper-book)
+
+(define-public (clip-system-EPSes basename paper-book)
+ (define do-pdf (member "pdf" (ly:output-formats)))
+
+ (define (clip-score-systems basename systems)
+ (let*
+ ((layout (ly:grob-layout (paper-system-system-grob (car systems))))
+ (regions (ly:output-def-lookup layout 'clip-regions)))
+
+ (for-each
+ (lambda (region)
+ (clip-systems-to-region
+ (format "~a-from-~a-to-~a-clip"
+ basename
+ (rhythmic-location->file-string (car region))
+ (rhythmic-location->file-string (cdr region)))
+ layout systems region
+ do-pdf))
+
+ regions)))
+
+
+ ;; partition in system lists sharing their layout blocks
(let*
- ((paper-def (ly:paper-book-paper paper-book))
- (do-pdf (member "pdf" (ly:output-formats)))
+ ((systems (ly:paper-book-systems paper-book))
+ (count 0)
+ (score-system-list '()))
+
+ (fold
+ (lambda (system last-system)
+
+
+ (if (not (and last-system
+ (equal? (paper-system-layout last-system)
+ (paper-system-layout system))))
+ (set! score-system-list (cons '() score-system-list)))
+
+ (if (paper-system-layout system)
+ (set-car! score-system-list (cons system (car score-system-list))))
+
+ ;; pass value.
+ system)
- (regions
- (ly:output-def-lookup paper-def
- 'clip-regions))
- (count 1)
- (systems
- (ly:paper-book-systems paper-book)))
+ #f
+ systems)
(for-each
- (lambda (system)
- (clip-system-EPS
- (format "~a-system-~a" basename count) paper-def system regions
- do-pdf)
- (set! count (1+ count))
+ (lambda (system-list)
+ (clip-score-systems
+ (if (> count 0)
+ (format "~a-~a" basename count)
+ basename)
+ system-list))
+
+ score-system-list)))
- )
- systems)))
(define-public (output-preview-framework basename book scopes fields)
(let* ((paper (ly:paper-book-paper book))
)
(if (equal? (basename name ".ps") "-")
- (ly:warning (_ "can't convert <stdout> to ~S" "PDF"))
+ (ly:warning (_ "cannot convert <stdout> to ~S" "PDF"))
(postscript->pdf w h name))))
(define-public (convert-to-png book name)
name)))
(define-public (convert-to-dvi book name)
- (ly:warning (_ "can't generate ~S using the postscript back-end") "DVI"))
+ (ly:warning (_ "cannot generate ~S using the postscript back-end") "DVI"))
(define-public (convert-to-tex book name)
- (ly:warning (_ "can't generate ~S using the postscript back-end") "TeX"))
+ (ly:warning (_ "cannot generate ~S using the postscript back-end") "TeX"))
(define-public (convert-to-ps book name)
#t)
(define-public (output-classic-framework basename book scopes fields)
- (ly:error (_ "\nThe PostScript backend does not support the 'classic'
-framework. Use the EPS backend instead,
+ (ly:error (_ "\nThe PostScript backend does not support the system-by-system
+output. For that, use the EPS backend instead,
lilypond -b eps <file>
-or remove the lilypond-book specific settings from the input.
+If have cut & pasted a lilypond fragment from a webpage, be sure
+to only remove anything before
+
+ %% ****************************************************************
+ %% Start cut-&-pastable-section
+ %% ****************************************************************
+
")))