commit 75d9336b83e91fa3bbab43b31099f3d5d00f8b47
Author: Keith OHara <k-ohara5a5a@oco.net>
Date:   Mon May 23 18:49:23 2011 -0700

    Loose lines honor padding between systems
    
    When placing a loose line (e.g. Lyrics) at the top or bottom of a
    system, include as a constraint the padding to the neighboring
    system or markup.  Fix 1654.

diff --git a/input/regression/page-spacing-nonstaff-lines-between-systems.ly b/input/regression/page-spacing-nonstaff-lines-between-systems.ly
index da6600e..20aeb6e 100644
--- a/input/regression/page-spacing-nonstaff-lines-between-systems.ly
+++ b/input/regression/page-spacing-nonstaff-lines-between-systems.ly
@@ -15,8 +15,9 @@ next system."
   \score {
     <<
       \chords { s1 \break d1 }
-      \relative c { c1 c1 }
+      \new Staff = "s" { c1 c1 }
       \addlyrics { word }
+      \addlyrics { \set alignAboveContext = "s" _ up }
     >>
   }
 }
diff --git a/lily/include/page-layout-problem.hh b/lily/include/page-layout-problem.hh
index fb1c7c3..ff6fcec 100644
--- a/lily/include/page-layout-problem.hh
+++ b/lily/include/page-layout-problem.hh
@@ -57,17 +57,22 @@ protected:
     Prob *prob;
     vector<Grob*> staves;
     vector<Real> min_offsets;
+    // Store the appropriate '*-*-spacing 'padding,
+    //  for spacing any adjacent loose line
+    Real padding;
 
-    Element (vector<Grob*> const& a, vector<Real> const& o)
+    Element (vector<Grob*> const& a, vector<Real> const& o, Real p)
     {
       staves = a;
       min_offsets = o;
+      padding = p;
       prob = 0;
     }
 
-    Element (Prob *p)
+    Element (Prob *p, Real pad)
     {
       prob = p;
+      padding = pad;
     }
   } Element;
 
diff --git a/lily/page-layout-problem.cc b/lily/page-layout-problem.cc
index fa4bd9c..51cec86 100644
--- a/lily/page-layout-problem.cc
+++ b/lily/page-layout-problem.cc
@@ -312,7 +312,7 @@ Page_layout_problem::append_system (System *sys, Spring const& spring, Real inde
   springs_.push_back (spring_copy);
 
   bottom_skyline_ = down_skyline;
-  elements_.push_back (Element (elts, minimum_offsets));
+  elements_.push_back (Element (elts, minimum_offsets, padding));
 
   // Add the springs for the VerticalAxisGroups in this system.
 
@@ -398,7 +398,7 @@ Page_layout_problem::append_prob (Prob *prob, Spring const& spring, Real padding
     spring_copy.ensure_min_distance (minimum_distance + padding);
 
   springs_.push_back (spring_copy);
-  elements_.push_back (Element (prob));
+  elements_.push_back (Element (prob, padding));
 }
 
 void
@@ -462,7 +462,8 @@ Page_layout_problem::find_system_offsets ()
 	  if (loose_lines.size ())
 	    {
 	      Interval loose_extent = loose_lines.back ()->extent (loose_lines.back (), Y_AXIS);
-	      Real min_distance = -loose_extent[DOWN] + prob_extent[UP]; // TODO: include padding/minimum-distance
+	      Real min_distance = (-loose_extent[DOWN] + prob_extent[UP]
+				   + elements_[i].padding);
 
 	      loose_line_min_distances.push_back (min_distance);
 	      loose_lines.push_back (0);
@@ -513,7 +514,10 @@ Page_layout_problem::find_system_offsets ()
 		  // the last one.
 		  if (loose_lines.size ())
 		    {
-		      loose_line_min_distances.push_back (min_offsets[staff_idx-1] - min_offsets[staff_idx]);
+		      if (staff_idx)
+			loose_line_min_distances.push_back (min_offsets[staff_idx-1] - min_offsets[staff_idx]);
+		      else
+			loose_line_min_distances.push_back (elements_[i].padding - min_offsets[staff_idx]);
 		      loose_lines.push_back (staff);
 
 		      distribute_loose_lines (loose_lines, loose_line_min_distances,
@@ -536,18 +540,20 @@ Page_layout_problem::find_system_offsets ()
 		  if (staff_idx)
