+ return Self_alignment_interface::aligned_on_self (element_smob, axis);
+}
+
+
+/*
+ This is tricky: we cannot modify 'elements, since callers are
+ iterating the same list. Reordering the list in-place, or resetting
+ 'elements will skip elements in the loops of callers.
+
+ So we return the correct order as an array.
+ */
+Link_array<Grob>
+Break_align_interface::ordered_elements (Grob *grob)
+{
+ Item *me = dynamic_cast<Item*> (grob);
+ SCM elts = me->get_property ("elements");
+ SCM order_vec = me->get_property ("break-align-orders");
+ if (!ly_c_vector_p (order_vec)
+ || ly_vector_length (order_vec) < 3)
+ return Pointer_group_interface__extract_grobs (me, (Grob*)0,
+ "elements");
+ SCM order = scm_vector_ref (order_vec,
+ scm_int2num (me->break_status_dir() + 1));
+
+
+ /*
+ Copy in order specified in BREAK-ALIGN-ORDER.
+ */
+ Link_array<Grob> new_elts;
+ for (; ly_c_pair_p (order); order = ly_cdr (order))
+ {
+ SCM sym = ly_car (order);
+
+ for (SCM s =elts; ly_c_pair_p (s); s = ly_cdr (s))
+ {
+ Grob *g = unsmob_grob (ly_car (s));
+ if (g && sym == g->get_property ("break-align-symbol"))
+ {
+ new_elts.push (g);
+ elts = scm_delq (g->self_scm (), elts);
+ }
+ }
+ }
+ return new_elts;