Grobs that are not cross-staff are placed before staff-spacing,
so they may not force placement of cross-staff grobs.
When cross-staff items are placed around the spaced staves, let
them side-position using the final, not 'pure', information.
- texidoc = "Slurs that depend on a cross-staff beam are not calculated until after line-breaking."
+ texidoc = "Slurs that depend on a cross-staff beam are not calculated until
+after line-breaking, and after inside-going articulations have been placed."
}
\paper { ragged-right=##t }
\score {
\new PianoStaff <<
}
\paper { ragged-right=##t }
\score {
\new PianoStaff <<
- \context Staff = rh \relative c'' { c8([ d) \change Staff = lh c,] }
- \context Staff = lh { s4. }
+ \context Staff = rh \relative c'' { c8([ d) \change Staff = lh c,] r
+ \stemDown c'8 \change Staff = rh c_( \change Staff = lh c_\marcato c)}
+ \context Staff = lh { s1 }
Grob *staff_symbol = Staff_symbol_referencer::get_staff_symbol (me);
bool quantize_position = to_boolean (me->get_maybe_pure_property ("quantize-position", pure, start, end));
Grob *staff_symbol = Staff_symbol_referencer::get_staff_symbol (me);
bool quantize_position = to_boolean (me->get_maybe_pure_property ("quantize-position", pure, start, end));
+ bool me_cross_staff = to_boolean (me->get_property ("cross-staff"));
bool include_staff
= staff_symbol
bool include_staff
= staff_symbol
- // In the case of a stem, we will find a note head as well
- // ignoring the stem solves cyclic dependencies if the stem is
- // attached to a cross-staff beam.
bool cross_staff = to_boolean (e->get_property ("cross-staff"));
bool cross_staff = to_boolean (e->get_property ("cross-staff"));
-
- // avoid cyclic dependency for direction
- && pure
- && Stem::has_interface (e)
- && cross_staff
- && !is_direction (e->get_property_data ("direction")))
- continue;
-
- // avoid unnecessary stem look up (if pointing away, it is not
- // supporting anything)
+ && !me_cross_staff // 'me' promised not to adapt to staff-spacing
+ && cross_staff) // but 'e' might move based on staff-pacing
+ continue; // so 'me' may not move in response to 'e'
+
- && Stem::has_interface (e)
- && dir == - get_grob_direction (e))
- continue;
+ && Stem::has_interface (e))
+ {
+ // If called as 'pure' we may not force a stem to set its direction,
+ if (pure && !is_direction (e->get_property_data ("direction")))
+ continue;
+ // There is no need to consider stems pointing away.
+ if (dir == -get_grob_direction (e))
+ continue;
+ }
SCM sp = e->get_maybe_pure_property (a == X_AXIS
? "horizontal-skylines"
: "vertical-skylines",
SCM sp = e->get_maybe_pure_property (a == X_AXIS
? "horizontal-skylines"
: "vertical-skylines",
(cause ,scheme? "Any kind of causation objects (i.e., music, or perhaps
translator) that was the cause for this grob.")
(cause ,scheme? "Any kind of causation objects (i.e., music, or perhaps
translator) that was the cause for this grob.")
- (cross-staff ,boolean? "For a beam or a stem, this is true if we
-depend on inter-staff spacing.")
+ (cross-staff ,boolean? "True for grobs whose @code{Y-extent} depends on
+inter-staff spacing. The extent is measured relative to the grobs's parent
+staff (more generally, its @code{VerticalAxisGroup}) so this boolean flags
+grobs that are not rigidly fixed to their parent staff.
+Beams that join notes from two staves are @code{cross-staff}.
+Grobs that are positioned around such beams are also @code{cross-staff}.
+Grobs that are grouping objects, however, like @code{VerticalAxisGroups}
+will not in general be marked @code{cross-staff} when some of the members
+of the group are @code{cross-staff}.")
(delta-position ,number? "The vertical position difference.")
(delta-position ,number? "The vertical position difference.")