From: fred <fred>
Date: Tue, 26 Mar 2002 22:47:06 +0000 (+0000)
Subject: lilypond-1.3.34
X-Git-Tag: release/1.5.59~1820
X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=bb895b6dec470dd8f15f1cd763e67e31a74fcae9;p=lilypond.git

lilypond-1.3.34
---

diff --git a/input/bugs/hara-clef.ly b/input/bugs/hara-clef.ly
new file mode 100644
index 0000000000..639ebaa150
--- /dev/null
+++ b/input/bugs/hara-clef.ly
@@ -0,0 +1,10 @@
+
+\score {
+\notes <  \context Staff { \clef "G^8"; s1 s1 s1 }
+	  \context Staff = CC { c1 c c  } >
+
+\paper {
+\translator {
+  \HaraKiriStaffContext
+}}
+}
diff --git a/input/test/bar-break.ly b/input/test/bar-break.ly
new file mode 100644
index 0000000000..d45a9ddf01
--- /dev/null
+++ b/input/test/bar-break.ly
@@ -0,0 +1,23 @@
+\score
+{
+  \context StaffGroup = a < 
+    \context PianoStaff = b <
+      \context Staff = "c" \notes\relative c'' { b1 \break b }
+      \context Staff = "d" \notes\relative c'' { b1 \break b }
+    >
+  >
+
+  \paper {
+  	indent=100.0\mm;
+  	linewidth=150.0\mm;
+    \translator
+    {
+      \StaffContext
+        \consists "Staff_margin_engraver";
+	numberOfStaffLines  = #1
+        marginScriptPadding = #10  % urg: this is in PT
+	instrument = #"Foo"
+	instr = #"Foo"
+    }
+  }
+}
diff --git a/input/test/bb.ly b/input/test/bb.ly
new file mode 100644
index 0000000000..0c01477ada
--- /dev/null
+++ b/input/test/bb.ly
@@ -0,0 +1,23 @@
+\score
+{
+  \context StaffGroup = a < 
+    \context PianoStaff = b <
+      \context Staff = "c" \notes\relative c'' { b1 \break b }
+      \context Staff = "d" \notes\relative c'' { b1 \break b }
+    >
+  >
+
+  \paper {
+  	indent=100.0\mm;
+  	linewidth=150.0\mm;
+    \translator
+    {
+      \StaffContext
+        \consists "Staff_margin_engraver";
+	numberOfStaffLines  = #1
+        marginScriptPadding = #30  % urg: this is in PT
+	instrument = #"Foo"
+	instr = #"Bar"
+    }
+  }
+}
diff --git a/lily/align-element.cc b/lily/align-element.cc
index c75902783b..d892e73316 100644
--- a/lily/align-element.cc
+++ b/lily/align-element.cc
@@ -13,23 +13,39 @@
 #include "hash-table-iter.hh"
 #include "dimension-cache.hh"
 
-void
-Align_element::after_line_breaking()
+/*
+  This callback is set in the children of the align element. It does
+  not compute anything, but a side effect of a->do_side_processing ()
+  is that the elements are placed correctly.  */
+Real
+Align_element::alignment_callback (Dimension_cache const *c)
 {
-  if (axis () == Y_AXIS)
-    do_side_processing ();
+  Axis ax = c->axis ();
+  Score_element * sc = c->element_l ()->parent_l (ax);
+  Align_element * a = dynamic_cast<Align_element*> (sc);
+  if (a && a->get_elt_property ("alignment-done") == SCM_UNDEFINED) 
+    {
+      a->do_side_processing (ax);
+    }
+  return 0.0;
 }
 
 void
-Align_element::before_line_breaking ()
+Align_element::add_element (Score_element* s)
 {
-  if (axis () == X_AXIS)
-    do_side_processing ();
+  s->add_offset_callback (alignment_callback, axis ());
+  Axis_group_element::add_element (s);
 }
 
+/*
+  Hairy function to put elements where they should be. Can be tweaked
+  from the outside by setting minimum-space and extra-space in its
+  children */
 void
-Align_element::do_side_processing ()
+Align_element::do_side_processing (Axis a)
 {
+  set_elt_property ("alignment-done", SCM_BOOL_T);
+  
   SCM d = get_elt_property ("stacking-dir");
   Direction stacking_dir = gh_number_p(d) ? to_dir (d) : CENTER;
   if (!stacking_dir)
@@ -42,7 +58,7 @@ Align_element::do_side_processing ()
   Link_array<Score_element> all_elts (elem_l_arr ());
   for (int i=0; i < all_elts.size(); i++) 
     {
-      Interval y = all_elts[i]->extent(axis ()) + all_elts[i]->relative_coordinate (this, axis ());
+      Interval y = all_elts[i]->extent(a) + all_elts[i]->relative_coordinate (this, a);
       if (!y.empty_b())
 	{
 	  Score_element *e =dynamic_cast<Score_element*>(all_elts[i]);
@@ -71,6 +87,15 @@ Align_element::do_side_processing ()
 	}
     }
 
+  
+  Interval threshold = Interval (0, Interval::infinity ());
+  SCM thr = get_elt_property ("threshold");
+  if (gh_pair_p (thr))
+    {
+      threshold[SMALLER] = gh_scm2double (gh_car (thr));
+      threshold[BIGGER] = gh_scm2double (gh_cdr (thr));      
+    }
+
   Real where_f=0;
   for (int i=0 ;  i < elems.size(); i++) 
     {
@@ -80,20 +105,15 @@ Align_element::do_side_processing ()
 
       if (i)
 	{
-	  dy = (dy >? threshold_interval_[SMALLER] )
-	    <? threshold_interval_[BIGGER];
+	  dy = (dy >? threshold[SMALLER] )
+	    <? threshold[BIGGER];
 	}
 
-
       where_f += stacking_dir * dy;
-      elems[i]->translate_axis (where_f, axis ());
+      elems[i]->translate_axis (where_f, a);
     }
 }
 
-Align_element::Align_element()
-{
-  threshold_interval_ = Interval (0, Interval::infinity ());
-}
 
 int
 Align_element::get_count (Score_element*s)const
@@ -113,13 +133,13 @@ Align_element::get_count (Score_element*s)const
 Axis
 Align_element::axis () const
 {
-  return axes_[0];
+  return Axis (gh_scm2int (gh_car (get_elt_property ("axes"))));
 }
 
 void
 Align_element::set_axis (Axis a)
 {
-  set_axes (a,a);
+  set_axes (a, a);
 }
 
 
diff --git a/lily/axis-group-element.cc b/lily/axis-group-element.cc
index 7e2cdacf13..d3235510d4 100644
--- a/lily/axis-group-element.cc
+++ b/lily/axis-group-element.cc
@@ -10,13 +10,6 @@
 #include "dimension-cache.hh"
 #include "group-interface.hh"
 
-Link_array<Score_element>
-Axis_group_element::get_extra_dependencies() const
-{
-  Link_array<Score_element> e(elem_l_arr ());
-  return e;
-}
-
 Link_array<Score_element>
 Axis_group_element::elem_l_arr () const
 {  
@@ -44,9 +37,6 @@ Axis_group_element::get_children ()
 
 Axis_group_element::Axis_group_element()
 {
-  axes_[0] = (Axis)-1 ; 
-  axes_[1] = (Axis)-1 ;
-
   set_elt_property ("elements", SCM_EOL);
   set_elt_property ("transparent", SCM_BOOL_T);
 }
@@ -54,8 +44,13 @@ Axis_group_element::Axis_group_element()
 void
 Axis_group_element::set_axes (Axis a1, Axis a2)
 {
-  axes_[0] = a1 ; 
-  axes_[1] = a2 ;
+  SCM ax = gh_cons (gh_int2scm (a1), SCM_EOL);
+  if (a1 != a2)
+    ax= gh_cons (gh_int2scm (a2), ax);
+
+  
+  set_elt_property ("axes", ax);
+
   if (a1 != X_AXIS && a2 != X_AXIS)
     set_empty (X_AXIS);
   if (a1 != Y_AXIS && a2 != Y_AXIS)
@@ -87,19 +82,29 @@ Axis_group_element::extent_callback (Dimension_cache const *c)
 }
 
 
+bool
+Axis_group_element::axis_b (Axis a )const
+{
+  return dim_cache_[a]->extent_callback_l_ == extent_callback;
+}
+
 
 void
 Axis_group_element::add_element (Score_element *e)
 {
   used_b_ =true;
   e->used_b_ = true;
-  
-  for (int i = 0; i < 2; i++)
+
+  for (SCM ax = get_elt_property ("axes"); ax != SCM_EOL ; ax = gh_cdr (ax))
     {
-      if (!e->parent_l (axes_[i]))
-	e->set_parent (this, axes_[i]);
+      Axis a = (Axis) gh_scm2int (gh_car (ax));
+      
+      if (!e->parent_l (a))
+	e->set_parent (this, a);
     }
   Group_interface gi (this);
   gi.add_element (e);
+
+  add_dependency (e);
 }
 
diff --git a/lily/break-align-item.cc b/lily/break-align-item.cc
index dfb91c3845..0d67818da9 100644
--- a/lily/break-align-item.cc
+++ b/lily/break-align-item.cc
@@ -155,5 +155,5 @@ Break_align_item::Break_align_item ()
   set_elt_property ("stacking-dir" , gh_int2scm (RIGHT));
   set_axis (X_AXIS);
 
-  dim_cache_[X_AXIS]->off_callbacks_.push (Side_position_interface::aligned_on_self);
+  add_offset_callback (Side_position_interface::aligned_on_self, X_AXIS);
 }
diff --git a/lily/clef-item.cc b/lily/clef-item.cc
index d49534d727..a7c9661293 100644
--- a/lily/clef-item.cc
+++ b/lily/clef-item.cc
@@ -74,9 +74,9 @@ Clef_item::do_add_processing ()
 	  g->set_parent (this, X_AXIS);
 	  
 	  g->set_elt_property ("self-alignment-X", gh_int2scm (0));
-	  g->dim_cache_[X_AXIS]->off_callbacks_.push (Side_position_interface::aligned_on_self);
-	  g->dim_cache_[X_AXIS]->off_callbacks_.push (Side_position_interface::centered_on_parent);
-	  
+	  g->add_offset_callback (Side_position_interface::aligned_on_self, X_AXIS);
+	  g->add_offset_callback (Side_position_interface::centered_on_parent, X_AXIS);
+
 	  g->set_elt_property ("direction", octave_dir);
 	  
 	  add_dependency (g);	// just to be sure.
diff --git a/lily/cross-staff.cc b/lily/cross-staff.cc
index ca44c30e9d..c7855b5836 100644
--- a/lily/cross-staff.cc
+++ b/lily/cross-staff.cc
@@ -12,11 +12,14 @@ calc_interstaff_dist (Item const *item, Spanner const *span)
   Align_element * align = dynamic_cast<Align_element*> (common);
   if (align && align->axis() == Y_AXIS)
     {
-      if (align->threshold_interval_[MIN] != 
-	  align->threshold_interval_[MAX])
+      SCM threshold = align->get_elt_property ("threshold");
+      if (!gh_pair_p (threshold)
+	  || !scm_equal_p (gh_car (threshold), gh_cdr (threshold)))
 	warning (_ ("minVerticalAlign != maxVerticalAlign: cross staff spanners may be broken"));
 
-      interstaff = align->threshold_interval_[MIN];
+      interstaff = 0.0;
+      if (gh_pair_p (threshold))
+	interstaff =  gh_scm2double (gh_car (threshold));
 
       Score_element const * span_refpoint = span;
       while (span_refpoint->parent_l  (Y_AXIS) != common)
diff --git a/lily/dimension-cache.cc b/lily/dimension-cache.cc
index 69ff282b0a..f314dbc24e 100644
--- a/lily/dimension-cache.cc
+++ b/lily/dimension-cache.cc
@@ -14,7 +14,7 @@
 Dimension_cache::Dimension_cache (Dimension_cache const &d)
 {
   init();
-  callback_l_ = d.callback_l_;
+  extent_callback_l_ = d.extent_callback_l_;
   basic_offset_ = d.basic_offset_;
   extra_offset_ = d.extra_offset_;
   off_valid_b_ = d.off_valid_b_;
@@ -30,7 +30,7 @@ Dimension_cache::Dimension_cache ()
 void
 Dimension_cache::init()
 {
-  callback_l_ =0;
+  extent_callback_l_ =0;
   basic_offset_ =0.0;
   extra_offset_ =0.0;
   
@@ -113,13 +113,13 @@ Dimension_cache::get_dim () const
 {
   Interval r;
   Dimension_cache *nc = ((Dimension_cache*)this);
-  if (!callback_l_)
+  if (!extent_callback_l_)
     {
       nc->dim_.set_empty ();
     }
   else if (!valid_b_)
     {
-      nc->dim_= (*callback_l_ ) (nc);
+      nc->dim_= (*extent_callback_l_ ) (nc);
       nc->valid_b_ = true;
     }
 
@@ -130,7 +130,7 @@ Dimension_cache::get_dim () const
 void
 Dimension_cache::set_callback (Dim_cache_callback c)
 {
-  callback_l_ =c;
+  extent_callback_l_ =c;
 }
 
 
diff --git a/lily/include/align-element.hh b/lily/include/align-element.hh
index 49d4e4bab1..b4fae22642 100644
--- a/lily/include/align-element.hh
+++ b/lily/include/align-element.hh
@@ -34,24 +34,18 @@
   Which side to align?  -1: left side, 0: centered (around
      center_l_ if not nil, or around center of width), 1: right side
 
-  *****
-
-  align-dir: deprecate! Use Side_pos_interface::self_align
-  
 
 */
 class Align_element : public virtual Axis_group_element {
 public:
-  Interval threshold_interval_ ;
-
   Axis axis () const;
-  
-  Align_element ();
+
   void set_axis (Axis);
   int get_count (Score_element*)const;
+  void add_element (Score_element *);
+  static Real alignment_callback (Dimension_cache const *);
 protected:
-  virtual void after_line_breaking () ;
-  virtual void before_line_breaking ();
-  virtual void do_side_processing ();
+  virtual void do_side_processing (Axis);
+  
 };
 #endif // VERTICAL_ALIGN_ITEM_HH
diff --git a/lily/include/axis-group-element.hh b/lily/include/axis-group-element.hh
index 83acd188b1..75cf8d13d9 100644
--- a/lily/include/axis-group-element.hh
+++ b/lily/include/axis-group-element.hh
@@ -21,19 +21,13 @@
 */
 class Axis_group_element : public virtual Score_element
 {
-  /// modify fields of E for removal.
-  void do_remove (Score_element*e);
-
 protected:
-  virtual Link_array<Score_element> get_extra_dependencies() const;
   virtual Link_array<Score_element> elem_l_arr() const;
   static Interval extent_callback (Dimension_cache const*);
 
 public:
-  Axis axes_[2];
-    
   void add_element (Score_element*);
-
+  bool axis_b (Axis) const;
   Axis_group_element ();
   void set_axes (Axis,Axis);
 
diff --git a/lily/include/dimension-cache-callback.hh b/lily/include/dimension-cache-callback.hh
new file mode 100644
index 0000000000..b12dc1078d
--- /dev/null
+++ b/lily/include/dimension-cache-callback.hh
@@ -0,0 +1,18 @@
+/*   
+  dimension-cache-callback.hh -- declare 
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#ifndef DIMENSION_CACHE_CALLBACK_HH
+#define DIMENSION_CACHE_CALLBACK_HH
+
+class Dimension_cache;
+typedef Interval (*Dim_cache_callback)(Dimension_cache const *);
+typedef Real (*Offset_cache_callback)(Dimension_cache const *);
+
+#endif /* DIMENSION_CACHE_CALLBACK_HH */
+
diff --git a/lily/include/dimension-cache.hh b/lily/include/dimension-cache.hh
index 52985161a3..e110041d0b 100644
--- a/lily/include/dimension-cache.hh
+++ b/lily/include/dimension-cache.hh
@@ -14,10 +14,8 @@
 #include "real.hh"
 #include "lily-proto.hh"
 #include "parray.hh"
+#include "dimension-cache-callback.hh"
 
-class Dimension_cache;
-typedef Interval (*Dim_cache_callback)(Dimension_cache const *);
-typedef Real (*Offset_cache_callback)(Dimension_cache const *);
 
 /**
   Adminstration of offset dimension info. 
@@ -38,12 +36,12 @@ class Dimension_cache
   friend class Score_element;
 
   void init ();
-public:
   Array<Offset_cache_callback> off_callbacks_;
   /**
      What to call to find extent.  Nil means empty. 
    */
-  Dim_cache_callback callback_l_;
+public:
+  Dim_cache_callback extent_callback_l_;
   static Interval point_dimension_callback (Dimension_cache const* );
   Axis axis () const;
   Real get_offset () const;
diff --git a/lily/include/lily-proto.hh b/lily/include/lily-proto.hh
index d5f93d6a06..8309d245a9 100644
--- a/lily/include/lily-proto.hh
+++ b/lily/include/lily-proto.hh
@@ -113,6 +113,7 @@ struct Key_item;
 struct Key_performer;
 struct Keyword;
 struct Keyword_table;
+struct Left_edge_item;
 struct Lily_stream;
 struct Line_group_engraver;
 struct Line_of_score;
diff --git a/lily/score-element.cc b/lily/score-element.cc
index 141d95a22d..a2d31ab4a5 100644
--- a/lily/score-element.cc
+++ b/lily/score-element.cc
@@ -202,14 +202,14 @@ Score_element::add_processing()
   if (get_elt_property ("self-alignment-X") != SCM_UNDEFINED
       && !dim_cache_[X_AXIS]->off_callback_l_)
     {
-      dim_cache_[X_AXIS]->off_callbacks_.push (Side_position_interface::aligned_on_self);
+      add_offset_callback (Side_position_interface::aligned_on_self,X_AXIS);
     }
   
   if (get_elt_property ("self-alignment-Y") != SCM_UNDEFINED
       && !dim_cache_[X_AXIS]->off_callback_l_)
       
     {
-      dim_cache_[Y_AXIS]->set_offset_callback (Side_position_interface::aligned_on_self);
+      add_offset_callback (Side_position_interface::aligned_on_self, Y_AXIS);
     }
 #endif
   
@@ -228,16 +228,12 @@ Score_element::calculate_dependencies (int final, int busy,
   assert (status_i_!= busy);
   status_i_= busy;
 
-  Link_array<Score_element> dependency_arr =
-    Group_interface__extract_elements (this, (Score_element*)0, "dependencies");
-  
-  for (int i=0; i < dependency_arr.size(); i++)
-    dependency_arr[i]->calculate_dependencies (final, busy, funcptr);
+  for (SCM d=  get_elt_property ("dependencies"); d != SCM_EOL; d = gh_cdr (d))
+    {
+      unsmob_element (gh_car (d))
+	->calculate_dependencies (final, busy, funcptr);
+    }
 
-  Link_array<Score_element> extra (get_extra_dependencies());
-  for (int i=0; i < extra.size(); i++)
-    extra[i]->calculate_dependencies (final, busy, funcptr);
-  
   (this->*funcptr)();
   status_i_= final;
 }
@@ -453,13 +449,6 @@ Score_element::handle_prebroken_dependencies()
     }
 }
 
-Link_array<Score_element>
-Score_element::get_extra_dependencies() const
-{
-  Link_array<Score_element> empty;
-  return empty;
-}
-
 bool
 Score_element::linked_b() const
 {
@@ -499,13 +488,13 @@ Score_element::common_refpoint (Score_element const* s, Axis a) const
 void
 Score_element::set_empty (Axis a)
 {
-  dim_cache_[a]->callback_l_ =0;
+  dim_cache_[a]->extent_callback_l_ =0;
 }
 
 bool
 Score_element::empty_b (Axis a)const
 {
-  return !dim_cache_[a]->callback_l_;
+  return !dim_cache_[a]->extent_callback_l_;
 }
 
 Interval
@@ -542,6 +531,22 @@ Score_element::name () const
   return classname (this);
 }
 
+void
+Score_element::add_offset_callback (Offset_cache_callback cb, Axis a)
+{
+  dim_cache_[a]->off_callbacks_.push (cb);
+}
+
+bool
+Score_element::has_offset_callback_b (Offset_cache_callback cb, Axis a)const
+{
+  for (int i= dim_cache_[a]->off_callbacks_.size (); i--;)
+    {
+      if (dim_cache_[a]->off_callbacks_[i] == cb)
+	return true;
+    }
+  return false;
+}
 
 void
 Score_element::set_parent (Score_element *g, Axis a)
diff --git a/lily/side-position-interface.cc b/lily/side-position-interface.cc
index ba8861c502..787a22ac94 100644
--- a/lily/side-position-interface.cc
+++ b/lily/side-position-interface.cc
@@ -230,26 +230,22 @@ Side_position_interface::set_axis (Axis a)
   if (elt_l_->get_elt_property ("side-support") == SCM_UNDEFINED)
     elt_l_->set_elt_property ("side-support" ,SCM_EOL);
 
-  elt_l_->dim_cache_[a]->off_callbacks_.push (aligned_side);
+  elt_l_->add_offset_callback (aligned_side, a);
 }
 
 
 void
 Side_position_interface::set_quantised (Axis a)
 {
-  Dimension_cache * c = elt_l_->dim_cache_[a];
-  
-  c->off_callbacks_.push (quantised_position);
+  elt_l_->add_offset_callback (quantised_position, a);
 }
 
 Axis
 Side_position_interface::get_axis () const
 {
-  Dimension_cache * c =  elt_l_->dim_cache_[X_AXIS];
-  for (int i=0 ; i < c->off_callbacks_.size();i ++)
-    if (c->off_callbacks_[i] == side_position
-	||c->off_callbacks_[i] == aligned_side)
-      return X_AXIS;
+  if (elt_l_->has_offset_callback_b (&side_position, X_AXIS)
+      || elt_l_->has_offset_callback_b (&aligned_side , X_AXIS))
+    return X_AXIS;
 
   
   return Y_AXIS;
diff --git a/lily/vertical-align-engraver.cc b/lily/vertical-align-engraver.cc
index 001d79f494..46da337596 100644
--- a/lily/vertical-align-engraver.cc
+++ b/lily/vertical-align-engraver.cc
@@ -32,18 +32,17 @@ Vertical_align_engraver::do_creation_processing()
 void
 Vertical_align_engraver::do_removal_processing()
 {
-  SCM dist (get_property ("maxVerticalAlign"));
-  if (gh_number_p(dist))
-    {
-      valign_p_->threshold_interval_[BIGGER]  = gh_scm2double (dist);
-    }
-
-  dist = get_property ("minVerticalAlign");
-  if (gh_number_p(dist))
-    {
-      valign_p_->threshold_interval_[SMALLER]  = gh_scm2double (dist);
-    }
+  SCM min = get_property ("maxVerticalAlign");
+  SCM max = get_property ("minVerticalAlign");
 
+  if (gh_number_p (min) || gh_number_p (max))
+  {
+    min = gh_number_p (min) ? min : gh_double2scm (0.0);
+    max = gh_number_p (max) ? max : gh_double2scm (infinity_f);    
+    
+    valign_p_->set_elt_property ("threshold",
+				 gh_cons (min,max));
+  }
   valign_p_->set_bound(RIGHT,get_staff_info().command_pcol_l ());
   typeset_element (valign_p_);
   valign_p_ =0;
@@ -57,7 +56,7 @@ Vertical_align_engraver::qualifies_b (Score_element_info i) const
 
   Axis_group_element * elt = dynamic_cast<Axis_group_element *> (i.elem_l_);
 
-  return sz > 1 && elt && elt->axes_[0] == Y_AXIS && !elt->parent_l (Y_AXIS);
+  return sz > 1 && elt && !elt->parent_l (Y_AXIS) && elt->axis_b (Y_AXIS);
 }
 
 void
diff --git a/ly/engraver.ly b/ly/engraver.ly
index 93ca721d07..f95e8cdf8d 100644
--- a/ly/engraver.ly
+++ b/ly/engraver.ly
@@ -113,7 +113,7 @@ VoiceContext = \translator {
 	\type "Engraver_group_engraver";
 	\name Voice;
 
-	dynamicPadding = #5.0
+	dynamicPadding = #2.0
 	Generic_property_list = #generic-voice-properties
 	\consists "Output_property_engraver";	
 
@@ -329,6 +329,7 @@ ScoreContext = \translator {
 %	\consists "Score_priority_engraver";
 	\consists "Break_align_engraver";
 	breakAlignOrder = #'(
+	  "Left_edge_item"
 	  "Span_bar"
 	  "Breathing_sign"
 	  "Clef_item"
diff --git a/ly/params.ly b/ly/params.ly
index 0f3052930e..c57a1120d5 100644
--- a/ly/params.ly
+++ b/ly/params.ly
@@ -41,6 +41,7 @@ arithmetic_multiplier = 0.9 * \quartwidth ;
 
 #'Stem_tremolo::beam-width = 1.5 * \quartwidth ; 
 
+#'Left_edge_item::visibility-lambda = #begin-of-line-visible
 #'Clef_item::visibility-lambda = #begin-of-line-visible
 #'Key_item::visibility-lambda = #begin-of-line-visible
 #'Breathing_sign::visibility-lambda = #begin-of-line-invisible
diff --git a/scm/lily.scm b/scm/lily.scm
index aef1ec55cc..f5965cb7f2 100644
--- a/scm/lily.scm
+++ b/scm/lily.scm
@@ -100,6 +100,7 @@
 ;; (Measured in staff space)
 (define space-alist
  '(
+   (("" "Left_edge_item") . (minimum-space -15.0))
    (("" "Clef_item") . (minimum-space 1.0))
    (("" "Staff_bar") . (minimum-space 0.0))
    (("" "Clef_item") . (minimum-space 1.0))
diff --git a/scripts/mudela-book.py b/scripts/mudela-book.py
index f84a660505..a78822588d 100644
--- a/scripts/mudela-book.py
+++ b/scripts/mudela-book.py
@@ -96,6 +96,9 @@ output_dict= {
 # override EndLilyPondOutput, since @tex is done
 # in a sandbox, you can't do \input lilyponddefs at the
 # top of the document.
+
+# should also support fragment in
+		  
 		  'output-all': r"""@tex
 \catcode`\@=12
 \input lilyponddefs
@@ -104,6 +107,7 @@ output_dict= {
 \catcode`\@=0
 @end tex
 @html
+<p>
 <img src=%s.png>
 @end html
 """,