+ if (!slur)
+ return SCM_BOOL_F;
+ return slur->get_property ("cross-staff");
+}
+
+MAKE_SCHEME_CALLBACK (Slur, calc_cross_staff, 1)
+SCM
+Slur::calc_cross_staff (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+
+ extract_grob_set (me, "note-columns", cols);
+ extract_grob_set (me, "encompass-objects", extras);
+
+ for (vsize i = 0; i < cols.size (); i++)
+ {
+ if (Grob *s = Note_column::get_stem (cols[i]))
+ if (to_boolean (s->get_property ("cross-staff")))
+ return SCM_BOOL_T;
+ }
+
+ /* the separation items are dealt with in replace_breakable_encompass_objects
+ so we can ignore them here */
+ vector<Grob*> non_sep_extras;
+ for (vsize i = 0; i < extras.size (); i++)
+ if (!Separation_item::has_interface (extras[i]))
+ non_sep_extras.push_back (extras[i]);
+
+ Grob *common = common_refpoint_of_array (cols, me, Y_AXIS);
+ common = common_refpoint_of_array (non_sep_extras, common, Y_AXIS);
+
+ return scm_from_bool (common != me->get_parent (Y_AXIS));
+}
+
+ADD_INTERFACE (Slur,
+ "A slur."
+ "\n"
+ "The following properties may be set in the @code{details}"
+ " list.\n"
+ "\n"
+ "@table @code\n"
+ "@item region-size\n"
+ "Size of region (in staff spaces) for determining"
+ " potential endpoints in the Y direction.\n"
+ "@item head-encompass-penalty\n"
+ "Demerit to apply when note heads collide with a slur.\n"
+ "@item stem-encompass-penalty\n"
+ "Demerit to apply when stems collide with a slur.\n"
+ "@item closeness-factor\n"
+ "Additional demerit used when scoring encompasses.\n"
+ "@item edge-attraction-factor\n"
+ "Factor used to calculate the demerit for distances"
+ " between slur endpoints and their corresponding base"
+ " attachments.\n"
+ "@item same-slope-penalty\n"
+ "Demerit for slurs with attachment points that are"
+ " horizontally aligned.\n"
+ "@item steeper-slope-factor\n"
+ "Factor used to calculate demerit only if this slur is"
+ " not broken.\n"
+ "@item non-horizontal-penalty\n"
+ "Demerit for slurs with attachment points that are not"
+ " horizontally aligned.\n"
+ "@item max-slope\n"
+ "The maximum slope allowed for this slur.\n"
+ "@item max-slope-factor\n"
+ "Factor that calculates demerit based on the max slope.\n"
+ "@item free-head-distance\n"
+ "The amount of vertical free space that must exist"
+ " between a slur and note heads.\n"
+ "@item absolute-closeness-measure\n"
+ "Factor to calculate demerit for variance between a note"
+ " head and slur.\n"
+ "@item extra-object-collision-penalty\n"
+ "Factor to calculate demerit for extra objects that the"
+ " slur encompasses, including accidentals, fingerings, and"
+ " tuplet numbers.\n"
+ "@item accidental-collision\n"
+ "Factor to calculate demerit for @code{Accidental} objects"
+ " that the slur encompasses. This property value replaces"
+ " the value of @code{extra-object-collision-penalty}.\n"
+ "@item extra-encompass-free-distance\n"
+ "The amount of vertical free space that must exist"
+ " between a slur and various objects it encompasses,"
+ " including accidentals, fingerings, and tuplet numbers.\n"
+ "@item extra-encompass-collision-distance\n"
+ "This detail is currently unused.\n"
+ "@item head-slur-distance-factor\n"
+ "Factor to calculate demerit for variance between a note"
+ " head and slur.\n"
+ "@item head-slur-distance-max-ratio\n"
+ "The maximum value for the ratio of distance between a"
+ " note head and slur.\n"
+ "@item free-slur-distance\n"
+ "The amount of vertical free space that must exist"
+ " between adjacent slurs. This subproperty only works"
+ " for @code{PhrasingSlur}.\n"
+ "@item edge-slope-exponent\n"
+ "Factor used to calculate the demerit for the slope of"
+ " a slur near its endpoints; a larger value yields a"
+ " larger demerit.\n"
+ "@end table\n",