+Interval
+Paper_column::break_align_width (Grob *me, SCM align_syms)
+{
+ Grob *p = me->get_parent (X_AXIS);
+
+ if (scm_is_symbol (align_syms))
+ align_syms = scm_list_1 (align_syms);
+
+ if (is_musical (me))
+ {
+ me->programming_error ("tried to get break-align-width of a musical column");
+ return Interval (0, 0) + me->relative_coordinate (p, X_AXIS);
+ }
+
+ Grob *align = 0;
+ for (;!align && scm_is_pair (align_syms); align_syms = scm_cdr (align_syms))
+ {
+ SCM align_sym = scm_car (align_syms);
+ if (scm_is_eq (align_sym, ly_symbol2scm ("staff-bar"))
+ || scm_is_eq (align_sym, ly_symbol2scm ("break-alignment")))
+ align = Pointer_group_interface::find_grob
+ (me, ly_symbol2scm ("elements"),
+ (scm_is_eq (align_sym, ly_symbol2scm ("staff-bar"))
+ ? Bar_line::non_empty_barline
+ : has_interface<Break_alignment_interface>));
+ else
+ {
+ extract_grob_set (me, "elements", elts);
+ for (vsize i = 0; i < elts.size (); i++)
+ {
+ if (scm_is_eq (align_sym, elts[i]->get_property ("break-align-symbol"))
+ // TODO SCM: there must be a simpler way to put this.
+ && !elts[i]->extent (elts[i], X_AXIS).is_empty ())
+ {
+ align = elts[i];
+ break;
+ }
+ }
+ }
+ }
+
+ if (!align)
+ return Interval (0, 0) + me->relative_coordinate (p, X_AXIS);
+
+ return align->extent (p, X_AXIS);
+}
+
+LY_DEFINE (ly_paper_column__break_align_width, "ly:paper-column::break-align-width",
+ 2, 0, 0, (SCM col, SCM align_syms),
+ "Determine the extent along the X-axis of a grob used for"
+ " break-alignment organized by column @var{col}. The grob is"
+ " specified by @var{align-syms}, which contains either a"
+ " single @code{break-align-symbol} or a list of such"
+ " symbols.")
+{
+ LY_ASSERT_SMOB (Grob, col, 1);
+ SCM_ASSERT_TYPE (scm_is_symbol (align_syms) || ly_is_list (align_syms),
+ align_syms, SCM_ARG2, __FUNCTION__, "symbol or list");
+
+ Interval ext = Paper_column::break_align_width (unsmob<Grob> (col), align_syms);
+ return ly_interval2scm (ext);
+}
+
+/*
+ Loop through elements of a PaperColumn, find all grobs implementing specified
+ interface and return their combined extent.
+*/
+Interval
+Paper_column::get_interface_extent (Grob *column, SCM iface, Axis a)
+{
+ Interval extent = Interval (0, 0);
+ extract_grob_set (column, "elements", elts);
+
+ for (vsize i = 0; i < elts.size (); i++)
+ if (elts[i]->internal_has_interface (iface))
+ extent.unite (robust_relative_extent (elts[i], elts[i], a));
+
+ return extent;
+}
+