]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/translator-group.cc
Fix tight spacing for markuplines spread over several pages.
[lilypond.git] / lily / translator-group.cc
index 8100a4de17592ce660ffa8d45a8635112a81ef55..84a97bf52e206bdf980ab6bae228fabac470cbab 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>,
+  Copyright (C) 1997--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>,
                  Erik Sandberg <mandolaerik@gmail.com>
 
   LilyPond is free software: you can redistribute it and/or modify
@@ -153,25 +153,34 @@ Translator_group::create_child_translator (SCM sev)
   for (SCM s = trans_names; scm_is_pair (s); s = scm_cdr (s))
     {
       SCM definition = scm_car (s);
+      bool is_scheme = false;
 
       Translator *type = 0;
-      Translator *instance = type;
       if (ly_is_symbol (definition))
+       type = get_translator (definition);
+      else if (ly_is_pair (definition))
        {
-         type = get_translator (definition);
-         instance = type->clone ();
+         type = get_translator (ly_symbol2scm ("Scheme_engraver"));
+         is_scheme = true;
        }
-      else if (ly_is_pair (definition))
+      else if (ly_is_procedure (definition))
        {
+         // `definition' is a procedure, which takes the context as
+         // an argument and evaluates to an a-list scheme engraver
+         // definition.
+         definition = scm_call_1 (definition, cs);
          type = get_translator (ly_symbol2scm ("Scheme_engraver"));
-         instance = type->clone ();
-         dynamic_cast<Scheme_engraver*> (instance)->init_from_scheme (definition);
+         is_scheme = true;
        }
         
       if (!type)
        warning (_f ("cannot find: `%s'", ly_symbol2string (scm_car (s)).c_str ()));
       else
        {
+         Translator *instance = type->clone ();
+         if (is_scheme)
+           dynamic_cast<Scheme_engraver *> (instance)->init_from_scheme (definition);
+
          SCM str = instance->self_scm ();
 
          if (instance->must_be_last ())