]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/page-layout.scm
(output_def): push scope of parent_ Output_def
[lilypond.git] / scm / page-layout.scm
index 133032a37a16cb42870a00aab5c00d28645117c8..999c0947486d7ef199dc0724aab7f981b3e53650 100644 (file)
@@ -4,99 +4,29 @@
 ;;;; 
 ;;;; (c) 2004 Jan Nieuwenhuizen <janneke@gnu.org>
 
-(define (ly:modules-lookup modules sym)
-  (let ((v (module-variable (car modules) sym)))
-    (if (and v (variable-bound? v) (variable-ref v))
-       (variable-ref v)
-       (if (module? (cdr modules)) (ly:modules-lookup (cdr modules) sym)))))
 
-(define (page-properties paper)
+(define-public (page-properties paper)
   (list (append `((linewidth . ,(ly:paper-get-number
                                 paper 'linewidth)))
-               (ly:paper-lookup paper 'text-font-defaults))))
+               (ly:output-def-lookup paper 'text-font-defaults))))
 
-(define-public (book-title paper scopes)
-  "Generate book title from header strings."
-  
-  (define (get sym)
-    (let ((x (ly:modules-lookup scopes sym)))
-      (if (and x (not (unspecified? x))) x "")))
-  
-  (let ((props (page-properties paper)))
-    
-    (interpret-markup
-     paper props
-     (markup
-      #:column
-      (#:override '(baseline-skip . 4)
-      #:column
-      (#:fill-line
-       (#:normalsize (get 'dedication))
-       #:fill-line
-       (#:huge #:bigger #:bigger #:bigger #:bigger #:bold (get 'title))
-       #:override '(baseline-skip . 3)
-       #:column
-       (#:fill-line
-       (#:large #:bigger #:bigger #:bold (get 'subtitle))
-       #:fill-line (#:bigger #:bigger #:bold (get 'subsubtitle)))
-       #:override '(baseline-skip . 5)
-       #:column ("")
-       #:override '(baseline-skip . 2.5)
-       #:column
-       (#:fill-line
-       (#:bigger (get 'poet) #:large #:bigger #:caps (get 'composer))
-       #:fill-line (#:bigger (get 'texttranslator) #:bigger (get 'opus))
-       #:fill-line
-       (#:bigger (get 'meter) #:bigger (get 'arranger))
-       ""
-       #:fill-line (#:large #:bigger (get 'instrument))
-       " "
-       #:fill-line (#:large #:bigger #:caps (get 'piece) ""))))))))
-
-(define-public (user-title paper markup)
-  "Generate book title from header markup."
-  (if (markup? markup)
-      (let ((props (page-properties paper))
-           (baseline-skip (chain-assoc-get 'baseline-skip props 2)) )
-       (stack-lines DOWN 0 BASELINE-SKIP
-                    (list (interpret-markup paper props markup))))))
-
-(define-public (score-title paper scopes)
-  "Generate score title from header strings."
-  
-  (define (get sym)
-    (let ((x (ly:modules-lookup scopes sym)))
-      (if (and x (not (unspecified? x))) x "")))
-  
-  (let ((props (page-properties paper)))
-    
-    (interpret-markup
-     paper props
-     (markup
-      #:column
-      (#:override '(baseline-skip . 4)
-      #:column
-      (#:fill-line
-       ("" (get 'opus))
-       #:fill-line (#:large #:bigger #:caps (get 'piece) "")))))))
-
-(define-public (make-header paper page-number)
+(define-public (plain-header paper page-number)
   (let ((props (page-properties paper) ))
     (interpret-markup paper props
                      (markup #:fill-line
                              ("" #:bold (number->string page-number))))))
 
-(define-public (make-footer paper page-number)
+(define-public (plain-footer paper page-number)
   (let ((props (page-properties paper)))
 
     (interpret-markup paper props
-                   (markup #:fill-line ("" (number->string page-number))))))
+                     (markup #:fill-line ("" (number->string page-number))))))
 
 
 (define TAGLINE
   (string-append "Engraved by LilyPond (version " (lilypond-version) ")"))
 
-(define-public (make-tagline paper scopes)
+(define-public (TAGLINE-or-tagline-from-header paper scopes)
   (let* ((props (page-properties paper))
         (tagline-var (ly:modules-lookup scopes 'tagline))
         (tagline (if (markup? tagline-var) tagline-var TAGLINE)))
                                 (markup #:fill-line (tagline "")))))
          ((markup? tagline) (interpret-markup paper props tagline)))))
 
-(define-public (make-copyright paper scopes)
+(define-public (copyright-from-header paper scopes)
   (let ((props (page-properties paper))
        (copyright (ly:modules-lookup scopes 'copyright)))
     
 
 (define-public (ly:optimal-page-breaks lines book-height text-height
                                       first-diff last-diff)
-
+  "DOCME"
   ;; FIXME: may need some tweaking: square, cubic
   (define (height-score available used)
     (let* ((empty (- available used))
           (mean (/ (apply + densities) (length densities)))
           (diff (map (lambda (x) (- x mean)) densities))
           (var (map sqr (map (lambda (x) (* (car p-heights) x)) diff))))
-      (if #f
-         (begin
-           (format (current-error-port) "\nDENSITIES")
-           (format (current-error-port) "lines: ~S\n"
-                   (map robust-line-number height-nodes))
-           (format (current-error-port) "page-heighs: ~S\n" p-heights)
-           (format (current-error-port) "heights: ~S\n" heights)
-           (format (current-error-port) "densities: ~S\n" densities)
-           (format (current-error-port) "mean: ~S\n" mean)
-           (format (current-error-port) "diff: ~S\n" diff)
-           (format (current-error-port) "density-var: ~S\n" var)))
       (apply + var)))
 
   (define (walk-paths best node lines nodes paths)
           (hh (make-node '() (node-line node) 0 0 height))
           (break-score (robust-break-score node))
           (density-score (if (null? paths) 0
-                             (* 0 (density-variance
+                             ;; TODO: find out why we need density
+                             ;;       use other height-score parameters?
+                             ;; See: input/test/page-breaks.ly
+                             (* 1 (density-variance
                                    (cons hh (get-path (car paths)))))))
           (page-score (height-score page height))
           (this-score (add-scores page-score break-score density-score))
           (path-score (if (null? paths) 0 (node-score (car paths))))
           (score (add-scores path-score this-score)))
 
-      (if #f
-         (begin
-           (format (current-error-port) "page-score: ~S\n" page-score)
-           (format (current-error-port) "density-score: ~S\n" density-score)
-           (format (current-error-port) "this-score: ~S\n" this-score)))
-      
       (if (and (>= score 0)
-              (or (< score (node-score best))
+              (or (<= score (node-score best))
                   (= (node-score best) -1)))
          (begin
            (set! (node-score best) score)
            (set! (node-page best) next-page)
            (set! (node-height best) height)
-           (set! (node-prev best) node)))
-      
-      (if (null? nodes)
+           (set! (node-prev best) (car paths))))
+
+      (if (or (null? nodes)
+             ;; short circuit
+             (and (= path-score -1)
+                  (> (- (/ height page) 1) MAX-CRAMP)))
          best
-         (walk-paths best (car paths) (cons (node-line node) lines)
+         (walk-paths best (car nodes)
+                     (cons (node-line (car paths)) lines)
                      (cdr nodes) (cdr paths)))))
 
   (define (walk-lines lines nodes paths)
        (let* ((prev (node-prev (car nodes)))
               (this (make-node prev (car lines) 0 INFINITY))
               (next (make-node this (cadr lines) 0 0))
-              (best (walk-paths this (car paths)
-                                (list (node-line (car nodes)))
-                                (cddr nodes) (cdr paths))))
+              (best (walk-paths this prev (list (node-line (car nodes)))
+                                (cddr nodes) paths)))
          (walk-lines (cdr lines) (cons next nodes) (cons best paths)))))
   
   (let* ((dummy (make-node '() '() 0 0))
         ;; CDR: junk dummy node
         (breaks (cdr (reverse (map robust-line-number path)))))
 
-    (format (current-error-port) "ESTIMATE: ~S\n"
-           (/ book-height text-height))
-    (format (current-error-port) "breaks: ~S\n" breaks)
-    (force-output (current-error-port))
-
-    (if #f (format (current-error-port) "scores: ~S\n" (map node-score path)))
-         
+    (if (ly:get-option 'verbose)
+       (begin
+         (format (current-error-port) "Estimated page count: ~S\n"
+                 (/ book-height text-height))
+       (format (current-error-port) "breaks: ~S\n" breaks)
+       (force-output (current-error-port))))
+       ;; TODO: if solution is bad return no breaks and revert to
+       ;;       ragged bottom
     (list->vector breaks)))
+
+
+
+;;;;;;;;;;;;;;;;;;
+; titling.
+(define-public (default-book-title paper scopes)
+  "Generate book title from header strings."
+  
+  (define (get sym)
+    (let ((x (ly:modules-lookup scopes sym)))
+      (if (and x (not (unspecified? x))) x "")))
+  
+  (let ((props (page-properties paper)))
+    
+    (interpret-markup
+     paper props
+     (markup
+      #:column
+      (#:override '(baseline-skip . 4)
+                 #:column
+                 (#:fill-line
+                  (#:normalsize (get 'dedication))
+                  #:fill-line
+                  (#:huge #:bigger #:bigger #:bigger #:bigger #:bold (get 'title))
+                  #:override '(baseline-skip . 3)
+                  #:column
+                  (#:fill-line
+                   (#:large #:bigger #:bigger #:bold (get 'subtitle))
+                   #:fill-line (#:bigger #:bigger #:bold (get 'subsubtitle)))
+                  #:override '(baseline-skip . 5)
+                  #:column ("")
+                  #:override '(baseline-skip . 2.5)
+                  #:column
+                  (#:fill-line
+                   (#:bigger (get 'poet) #:large #:bigger #:caps (get 'composer))
+                   #:fill-line (#:bigger (get 'texttranslator) #:bigger (get 'opus))
+                   #:fill-line
+                   (#:bigger (get 'meter) #:bigger (get 'arranger))
+                   ""
+                   #:fill-line (#:large #:bigger (get 'instrument))
+                   " "
+                   #:fill-line (#:large #:bigger #:caps (get 'piece) ""))))))))
+
+(define-public (default-user-title paper markup)
+  "Generate book title from header markup."
+  (if (markup? markup)
+      (let ((props (page-properties paper))
+           (baseline-skip (chain-assoc-get 'baseline-skip props 2)) )
+       (stack-lines DOWN 0 BASELINE-SKIP
+                    (list (interpret-markup paper props markup))))))
+
+(define-public (default-score-title paper scopes)
+  "Generate score title from header strings."
+  
+  (define (get sym)
+    (let ((x (ly:modules-lookup scopes sym)))
+      (if (and x (not (unspecified? x))) x "")))
+  
+  (let ((props (page-properties paper)))
+    
+    (interpret-markup
+     paper props
+     (markup
+      #:column
+      (#:override '(baseline-skip . 4)
+                 #:column
+                 (#:fill-line
+                  ("" (get 'opus))
+                  #:fill-line (#:large #:bigger #:caps (get 'piece) "")))))))