1 ;;;; layout-page-tweaks.scm -- page breaking and page layout
3 ;;;; source file of the GNU LilyPond music typesetter
5 ;;;; (c) 2006 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 (define-module (scm layout-page-dump)
8 #:use-module (srfi srfi-1)
9 #:use-module (ice-9 pretty-print)
10 #:use-module (scm paper-system)
11 #:use-module (scm page)
13 #:export (write-page-breaks
14 ;; utilisties for writing other page dump functions
15 record-tweaks dump-all-tweaks))
18 (define (record-tweaks what property-pairs tweaks)
19 (let ((key (ly:output-def-lookup (ly:grob-layout what)
22 (when (ly:grob-property what 'when)))
23 (if (not (hash-ref tweaks key))
24 (hash-set! tweaks key '()))
26 (acons when property-pairs
27 (hash-ref tweaks key)))))
29 (define (graceless-moment mom)
30 (ly:make-moment (ly:moment-main-numerator mom)
31 (ly:moment-main-denominator mom)
34 (define (moment->skip mom)
35 (let ((main (if (> (ly:moment-main-numerator mom) 0)
36 (format "\\skip 1*~a/~a"
37 (ly:moment-main-numerator mom)
38 (ly:moment-main-denominator mom))
40 (grace (if (< (ly:moment-grace-numerator mom) 0)
41 (format "\\grace { \\skip 1*~a/~a }"
42 (- (ly:moment-grace-numerator mom))
43 (ly:moment-grace-denominator mom))
45 (format "~a~a" main grace)))
47 (define (dump-tweaks out-port tweak-list last-moment)
48 (if (not (null? tweak-list))
49 (let* ((now (caar tweak-list))
50 (diff (ly:moment-sub now last-moment))
51 (these-tweaks (cdar tweak-list))
52 (skip (moment->skip diff))
53 (line-break-str (if (assoc-get 'line-break these-tweaks #f)
56 (page-break-str (if (assoc-get 'page-break these-tweaks #f)
59 (space-tweaks (format "\\spacingTweaks #'~a\n"
60 (with-output-to-string
63 (assoc-get 'spacing-parameters
64 these-tweaks '()))))))
65 (base (format "~a~a~a"
69 (format out-port "~a\n~a\n" skip base)
70 (dump-tweaks out-port (cdr tweak-list) (graceless-moment now)))))
72 (define (dump-all-tweaks pages tweaks)
73 (let* ((paper (ly:paper-book-paper (page-property (car pages) 'paper-book)))
74 (parser (ly:output-def-parser paper))
75 (name (format "~a-page-layout.ly"
76 (ly:parser-output-name parser)))
77 (out-port (open-output-file name)))
78 (ly:progress "Writing page layout to ~a" name)
81 (format out-port "~a = {" key)
82 (dump-tweaks out-port (reverse val) (ly:make-moment 0 1))
83 (display "}" out-port))
85 (close-port out-port)))
87 (define (write-page-breaks pages)
89 (let ((tweaks (make-hash-table 23)))
90 (define (handle-page page)
92 (define music-system-heights
93 (map-in-order (lambda (sys)
94 (* -1 (car (paper-system-extent sys Y))))
96 (ly:prob-property? sys 'is-title))
98 (define (handle-system sys)
99 (let* ((props `((line-break . #t)
101 . ((system-Y-extent . ,(paper-system-extent sys Y))
102 (system-refpoint-Y-extent . ,(paper-system-staff-extents sys))
103 (system-index . ,index)
104 (music-system-heights . ,music-system-heights)
105 (page-system-count . ,(length (page-lines page)))
106 (page-printable-height . ,(page-printable-height page))
107 (page-space-left . ,(page-property page 'space-left)))))))
108 (if (equal? (car (page-lines page)) sys)
109 (set! props (cons '(page-break . #t)
111 (if (not (ly:prob-property? sys 'is-title))
112 (record-tweaks (ly:spanner-bound (ly:prob-property sys 'system-grob) LEFT)
115 (set! index (1+ index))))
116 (for-each handle-system (page-lines page)))
117 (for-each handle-page pages)
118 (dump-all-tweaks pages tweaks)))