+/*
+ merge with align-to-extents?
+*/
+void
+Align_interface::align_to_fixed_distance (Grob *me, Axis a)
+{
+ Direction stacking_dir = robust_scm2dir (me->get_property ("stacking-dir"),
+ DOWN);
+
+ Real dy = robust_scm2double (me->get_property ("forced-distance"), 0.0);
+
+ extract_grob_set (me, "elements", elem_source);
+
+ vector<Grob*> elems (elem_source); // writable..
+
+ Real where = 0;
+
+ Interval v;
+ v.set_empty ();
+ vector<Real> translates;
+
+ for (vsize j = elems.size (); j--;)
+ {
+ /*
+ This is not very elegant, in that we need special support for
+ hara-kiri. Unfortunately, the generic wiring of
+ force_hara_kiri_callback () (extent and offset callback) is
+ such that we might get into a loop if we call extent () or
+ offset () the elements.
+ */
+ if (a == Y_AXIS
+ && Hara_kiri_group_spanner::has_interface (elems[j]))
+ Hara_kiri_group_spanner::consider_suicide (elems[j]);
+
+ if (!elems[j]->is_live ())
+ elems.erase (elems.begin () + j);
+ }
+
+ for (vsize j = 0; j < elems.size (); j++)
+ {
+ where += stacking_dir * dy;
+ translates.push_back (where);
+ v.unite (Interval (where, where));
+ }
+
+ /*
+ TODO: support self-alignment-{Y, X}
+ */
+ for (vsize i = 0; i < translates.size (); i++)
+ elems[i]->translate_axis (translates[i] - v.center (), a);
+}