]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/lily-library.scm
lilypond-book: Set include path for --output option (issue 2423).
[lilypond.git] / scm / lily-library.scm
index b109b81be60eb59c7122fed49d07c8d0ed8dac06..91ece1e476a360785b81614f636d59e79d9123d7 100644 (file)
@@ -302,15 +302,7 @@ bookoutput function"
     mods))
 
 (define-public (context-defs-from-music parser output-def music)
-  (let ((bottom 'Voice) (warn #t))
-    (define (get-bottom sym)
-      (or
-       (let ((def (ly:output-def-lookup output-def sym #f)))
-       (and def
-            (let ((def-child (ly:context-def-lookup def 'default-child #f)))
-              (and def-child
-                   (get-bottom def-child)))))
-       sym))
+  (let ((warn #t))
     (let loop ((m music) (mods #f))
       ;; The parser turns all sets, overrides etc into something
       ;; wrapped in ContextSpeccedMusic.  If we ever get a set,
@@ -345,21 +337,23 @@ bookoutput function"
                                 (list 'apply
                                       (ly:music-property m 'procedure))))
            ((ContextSpeccedMusic)
-            (let ((sym (ly:music-property m 'context-type)))
-              (if (eq? sym 'Bottom)
-                  (set! sym bottom)
-                  (set! bottom (get-bottom sym)))
-              (let ((def (ly:output-def-lookup output-def sym)))
-                (if (ly:context-def? def)
-                    (ly:output-def-set-variable!
-                     output-def sym
-                     (ly:context-def-modify
-                      def
-                      (loop (ly:music-property m 'element)
-                            (ly:make-context-mod))))
-                    (ly:music-warning
-                     music
-                     (ly:format (_ "Cannot find context-def \\~a") sym))))))
+            ;; Use let* here to let defs catch up with modifications
+            ;; to the context defs made in the recursion
+            (let* ((mods (loop (ly:music-property m 'element)
+                               (ly:make-context-mod)))
+                   (defs (ly:output-find-context-def
+                          output-def (ly:music-property m 'context-type))))
+              (if (null? defs)
+                  (ly:music-warning
+                   music
+                   (ly:format (_ "Cannot find context-def \\~a")
+                              (ly:music-property m 'context-type)))
+                  (for-each
+                   (lambda (entry)
+                     (ly:output-def-set-variable!
+                      output-def (car entry)
+                      (ly:context-def-modify (cdr entry) mods)))
+                   defs))))
            (else
             (let ((callback (ly:music-property m 'elements-callback)))
               (if (procedure? callback)