+ }
+ return all_translates;
+}
+
+void
+Align_interface::align_elements_to_extents (Grob *me, Axis a)
+{
+ extract_grob_set (me, "elements", all_grobs);
+
+ vector<Real> translates = get_extents_aligned_translates (me, all_grobs, a, false, 0, 0);
+ if (translates.size ())
+ for (vsize j = 0; j < all_grobs.size (); j++)
+ all_grobs[j]->translate_axis (translates[j], a);
+}
+
+/* After we have already determined the y-offsets of our children, we may still
+ want to stretch them a little. */
+void
+Align_interface::stretch (Grob *me, Real amount, Axis a)
+{
+ extract_grob_set (me, "elements", elts);
+ Real non_empty_elts = stretchable_children_count (me);
+ Real offset = 0.0;
+ Direction dir = robust_scm2dir (me->get_property ("stacking-dir"), DOWN);
+ for (vsize i = 1; i < elts.size (); i++)
+ {
+ if (!elts[i]->extent (me, a).is_empty ()
+ && !to_boolean (elts[i]->get_property ("keep-fixed-while-stretching")))
+ offset += amount / non_empty_elts;
+ elts[i]->translate_axis (dir * offset, a);
+ }
+ me->flush_extent_cache (Y_AXIS);
+}
+
+Real
+Align_interface::get_pure_child_y_translation (Grob *me, Grob *ch, int start, int end)
+{
+ extract_grob_set (me, "elements", all_grobs);
+ SCM dy_scm = me->get_property ("forced-distance");