NestedSystemStartDelimiter.
* input/regression/system-start-heavy-bar.ly: new file.
* lily/nested-system-start-delimiter-engraver.cc: new file.
* lily/nested-system-start-delimiter.cc: new file.
* input/regression/system-start-nesting.ly: new file.
* scm/define-grobs.scm (all-grob-descriptions): use X side
positioning for positioning braces for nested contexts.
* lily/system-start-delimiter.cc (print): don't divide extent by
staff_space.
(print): use style iso. glyph.
(staff_bracket): translate glyph inside routine already.
+2005-11-18 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+ * scm/define-grobs.scm (all-grob-descriptions): new grob
+ NestedSystemStartDelimiter.
+
+ * input/regression/system-start-heavy-bar.ly: new file.
+
+ * lily/nested-system-start-delimiter-engraver.cc: new file.
+
+ * lily/nested-system-start-delimiter.cc: new file.
+
+ * input/regression/system-start-nesting.ly: new file.
+
+ * scm/define-grobs.scm (all-grob-descriptions): use X side
+ positioning for positioning braces for nested contexts.
+
+ * lily/system-start-delimiter.cc (print): don't divide extent by
+ staff_space.
+ (print): use style iso. glyph.
+ (staff_bracket): translate glyph inside routine already.
+
2005-11-18 Michael Welsh Duggan <md5i@cs.cmu.edu>
* lily/vaticana-ligature-engraver.cc: fixed 2 typos in glyph
@itemize @bullet
+
+@item
+It's now possible to easily create deeply nested system start
+brackets,
+
+@lilypond[raggedright]
+\new StaffGroup \with {
+ \remove "System_start_delimiter_engraver"
+ \consists "Nested_system_start_delimiter_engraver"
+}
+\relative <<
+ \override StaffGroup.NestedSystemStartDelimiter #'styles
+ = #'(line-bracket bracket line-bracket)
+ \set StaffGroup.systemStartDelimiterHierarchy = #'((a (b)) c)
+ \new Staff { c1 }
+ \new Staff { c1 }
+ \new Staff { c1 }
+ \new Staff { c1 }
+ \new Staff { c1 }
+>>
+@end lilypond
+
+
+In addition, there is now also support for ``square'' system start
+brackets.
+
+This feature was sponsored by Trevor Bača.
+
@item
Tie formatting now uses scoring. This opens the road to formatting
which handles complex situations require tradeoffs between different
--- /dev/null
+\header { texidoc = "A heavy-bar system start delimiter may be created by tuning the @code{SystemStartBar} grob."
+ }
+
+\version "2.7.18"
+
+\paper {
+ raggedright = ##t
+}
+<<
+ \new StaffGroup
+ \relative <<
+ \set StaffGroup.systemStartDelimiter = #'SystemStartBar
+ \override StaffGroup.SystemStartBar #'thickness = #8
+ \override StaffGroup.SystemStartBar #'padding = #0.2
+ \new Staff { c1 }
+ \new Staff { c1 }
+ >>
+ \new Staff { c1 }
+>>
--- /dev/null
+\header { texidoc = "Deeply nested system braces/brackets/etc. may be created with the
+ @code{Nested_system_start_delimiter_engraver}"
+
+}
+
+\version "2.7.18"
+
+\paper {
+ raggedright = ##t
+}
+
+\new StaffGroup \with {
+ \remove "System_start_delimiter_engraver"
+ \consists "Nested_system_start_delimiter_engraver"
+}
+\relative <<
+ \override StaffGroup.NestedSystemStartDelimiter #'styles = #'(line-bracket bracket line-bracket)
+ \set StaffGroup.systemStartDelimiterHierarchy = #'((a (b)) c)
+ \new Staff { c1 }
+ \new Staff { c1 }
+ \new Staff { c1 }
+ \new Staff { c1 }
+ \new Staff { c1 }
+ >>
static Stencil old_staff_bracket (Grob *, Real);
static Stencil staff_brace (Grob *, Real);
static Stencil simple_bar (Grob *, Real);
+ static Stencil line_bracket (Grob *, Real);
};
#endif /* SYSTEM_START_DELIMITER_HH */
--- /dev/null
+/*
+ new-system-start-delimiter-engraver.cc -- implement
+ Nested_system_start_delimiter_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+*/
+
+#include "side-position-interface.hh"
+#include "system-start-delimiter.hh"
+#include "engraver.hh"
+#include "staff-symbol.hh"
+#include "pointer-group-interface.hh"
+#include "paper-column.hh"
+#include "output-def.hh"
+#include "spanner.hh"
+
+class Nested_system_start_delimiter_engraver : public Engraver
+{
+public:
+ TRANSLATOR_DECLARATIONS (Nested_system_start_delimiter_engraver);
+
+protected:
+ Spanner *delimiter_;
+
+ DECLARE_ACKNOWLEDGER (system_start_delimiter);
+ DECLARE_ACKNOWLEDGER (staff_symbol);
+
+ void process_music ();
+ virtual void finalize ();
+};
+
+Nested_system_start_delimiter_engraver::Nested_system_start_delimiter_engraver ()
+{
+ delimiter_ = 0;
+}
+
+bool
+add_staff_to_hierarchy (SCM hierarchy, SCM grob)
+{
+ for (SCM s = hierarchy; scm_is_pair (s); s = scm_cdr (s))
+ {
+ SCM entry = scm_car (s);
+
+ if (unsmob_grob (entry))
+ ;
+ else if (scm_is_pair (entry))
+ {
+ bool success = add_staff_to_hierarchy (entry, grob);
+ if (success)
+ return success;
+ }
+ else
+ {
+ scm_set_car_x (s, grob);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void
+Nested_system_start_delimiter_engraver::process_music ()
+{
+ if (!delimiter_)
+ {
+ delimiter_ = make_spanner ("NestedSystemStartDelimiter", SCM_EOL);
+ SCM hierarchy = get_property ("systemStartDelimiterHierarchy");
+
+
+ delimiter_->set_object ("staff-hierarchy", ly_deep_copy (hierarchy));
+ delimiter_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
+ }
+}
+
+void
+Nested_system_start_delimiter_engraver::finalize ()
+{
+ if (delimiter_)
+ delimiter_->set_bound (RIGHT,
+ unsmob_grob (get_property ("currentCommandColumn")));
+}
+
+void
+Nested_system_start_delimiter_engraver::acknowledge_staff_symbol (Grob_info inf)
+{
+ Grob *staff = inf.grob();
+ SCM hier = delimiter_->get_object ("staff-hierarchy");
+ bool succ = add_staff_to_hierarchy (hier, staff->self_scm ());
+
+ if (!succ)
+ {
+ hier = scm_append_x (scm_list_2 (hier,
+ scm_list_1 (staff->self_scm ())));
+
+ delimiter_->set_object ("staff-hierarchy", hier);
+ }
+}
+
+
+void
+Nested_system_start_delimiter_engraver::acknowledge_system_start_delimiter (Grob_info inf)
+{
+ Side_position_interface::add_support (inf.grob (), delimiter_);
+}
+
+#include "translator.icc"
+
+ADD_ACKNOWLEDGER (Nested_system_start_delimiter_engraver, staff_symbol);
+ADD_ACKNOWLEDGER (Nested_system_start_delimiter_engraver, system_start_delimiter);
+
+ADD_TRANSLATOR (Nested_system_start_delimiter_engraver,
+ /* doc */ "Creates a system start delimiter (ie. SystemStart@{Bar, Brace, Bracket@} spanner",
+ /* create */ "NestedSystemStartDelimiter",
+ /* accept */ "",
+ /* read */ "systemStartDelimiterHierarchy",
+ /* write */ "");
--- /dev/null
+/*
+ system-start-delimiter.cc -- implement Nested_system_start_delimiter
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2000--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+*/
+
+#include "system-start-delimiter.hh"
+#include "spanner.hh"
+#include "axis-group-interface.hh"
+#include "output-def.hh"
+#include "font-interface.hh"
+#include "all-font-metrics.hh"
+#include "staff-symbol-referencer.hh"
+#include "lookup.hh"
+#include "item.hh"
+
+#include "pointer-group-interface.hh"
+
+
+struct Nested_system_start_delimiter
+{
+public:
+ bool has_interface (Grob *);
+ Stencil static make_substencil (Spanner *, Grob *, SCM, SCM, SCM);
+ DECLARE_SCHEME_CALLBACK (print, (SCM));
+};
+
+Link_array<Grob>
+flatten_hierarchy (SCM hier)
+{
+ Link_array<Grob> retval;
+ if (unsmob_grob (hier))
+ retval.push (unsmob_grob (hier));
+
+ if (scm_is_pair (hier))
+ {
+ retval = flatten_hierarchy (scm_car (hier));
+ retval.concat (flatten_hierarchy (scm_cdr (hier)));
+ }
+
+ return retval;
+}
+
+
+Stencil
+Nested_system_start_delimiter::make_substencil (Spanner *me,
+ Grob *common,
+ SCM hierarchy,
+ SCM depth_styles,
+ SCM default_style
+ )
+{
+ Interval ext;
+ Link_array<Grob> elts = flatten_hierarchy (hierarchy);
+
+ if (elts.is_empty ())
+ return Stencil();
+
+ int non_empty_count = 0;
+ for (int i = elts.size (); i--;)
+ {
+ Spanner *sp = dynamic_cast<Spanner *> (elts[i]);
+
+ if (sp
+ && sp->get_bound (LEFT) == me->get_bound (LEFT))
+ {
+ Interval dims = sp->extent (common, Y_AXIS);
+ if (!dims.is_empty ())
+ {
+ non_empty_count ++;
+ ext.unite (dims);
+ }
+ }
+ }
+
+ SCM glyph_sym = ly_symbol2scm ("bracket");
+ if (scm_is_pair (depth_styles))
+ glyph_sym = scm_car (depth_styles);
+
+ if (ext.is_empty ()
+ || (robust_scm2double (me->get_property ("collapse-height"), 0.0) >= ext.length()))
+ {
+ return Stencil();
+ }
+
+ Stencil total;
+
+ Real len = ext.length ();
+ if (glyph_sym == ly_symbol2scm ("bracket"))
+ total = System_start_delimiter::staff_bracket (me, len);
+ else if (glyph_sym == ly_symbol2scm ("brace"))
+ total = System_start_delimiter::staff_brace (me, len);
+ else if (glyph_sym == ly_symbol2scm ("bar-line"))
+ total = System_start_delimiter::simple_bar (me, len);
+ else if (glyph_sym == ly_symbol2scm ("line-bracket"))
+ total = System_start_delimiter::line_bracket (me, len);
+
+ total.translate_axis (ext.center (), Y_AXIS);
+
+ Real left_x = total.extent (X_AXIS)[LEFT];
+ for (SCM s = hierarchy; scm_is_pair (s); s = scm_cdr (s))
+ {
+ SCM entry = scm_car (s);
+
+ if (scm_is_pair (entry)
+ && !scm_is_symbol (scm_car (entry)))
+ {
+ Stencil sub = make_substencil (me, common, entry,
+ scm_is_pair (depth_styles)
+ ? scm_cdr (depth_styles) : SCM_EOL,
+ default_style);
+ sub.translate_axis (left_x, X_AXIS);
+ total.add_stencil (sub);
+ }
+ }
+
+ return total;
+}
+
+MAKE_SCHEME_CALLBACK (Nested_system_start_delimiter, print, 1);
+SCM
+Nested_system_start_delimiter::print (SCM smob)
+{
+ Spanner *me = unsmob_spanner (smob);
+ if (!me)
+ return SCM_EOL;
+
+ SCM hierarchy = me->get_object ("staff-hierarchy");
+ Link_array<Grob> elts = flatten_hierarchy (hierarchy);
+ Grob *common = common_refpoint_of_array (elts, me, Y_AXIS);
+
+ SCM default_style = me->get_property ("style");
+ if (!scm_is_symbol (default_style))
+ default_style = ly_symbol2scm ("line-bracket");
+
+ Stencil total = make_substencil (me, common, hierarchy, me->get_property ("styles"),
+ default_style);
+ total.translate_axis (- me->relative_coordinate (common, Y_AXIS), Y_AXIS);
+
+ return total.smobbed_copy ();
+
+}
+
+ADD_INTERFACE (Nested_system_start_delimiter,
+ "nested-system-start-delimiter-interface",
+
+ "The brace, bracket or bar in front of the system. By setting "
+ "@code{staff-hierarchy}, eg. to @code{(a (b d) c)}, nesting for staff "
+ "braces can be produced."
+ ,
+
+
+ /* properties */
+ "collapse-height "
+ "styles "
+ "staff-hierarchy "
+ );
#include "staff-spacing.hh"
#include "spacing-interface.hh"
+
+/*
+ TODO:
+
+ use callback instead?
+
+*/
Rational
Spacing_spanner::effective_shortest_duration (Grob *me,
Link_array<Grob> const &all)
(c) 2000--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
*/
-#include "system-start-delimiter.hh"
#include "engraver.hh"
+
+#include "system-start-delimiter.hh"
#include "staff-symbol.hh"
#include "pointer-group-interface.hh"
#include "paper-column.hh"
#include "output-def.hh"
#include "spanner.hh"
+#include "side-position-interface.hh"
class System_start_delimiter_engraver : public Engraver
{
TRANSLATOR_DECLARATIONS (System_start_delimiter_engraver);
protected:
- Spanner *delim_;
+ Spanner *delimiter_;
DECLARE_ACKNOWLEDGER (system_start_delimiter);
DECLARE_ACKNOWLEDGER (staff_symbol);
void
System_start_delimiter_engraver::acknowledge_staff_symbol (Grob_info inf)
{
- /*
- don't add as Axis_group_interface::add_element (delim_, ),
- because that would set the parent as well */
-
- Pointer_group_interface::add_grob (delim_, ly_symbol2scm ("elements"), inf.grob ());
+ Pointer_group_interface::add_grob (delimiter_, ly_symbol2scm ("elements"), inf.grob ());
}
+
void
System_start_delimiter_engraver::acknowledge_system_start_delimiter (Grob_info inf)
{
- SCM gl = inf.grob ()->get_property ("glyph");
- SCM my_gl = delim_->get_property ("glyph");
-
- /*
- UGH UGH
- */
- if (scm_is_string (gl) && ly_is_equal (gl, scm_makfrom0str ("brace"))
- && scm_is_string (my_gl) && ly_is_equal (my_gl, scm_makfrom0str ("bracket")))
- add_offset_callback (inf.grob (), scm_from_double (-0.8), X_AXIS);
- else if (scm_is_string (gl) && ly_is_equal (gl, scm_makfrom0str ("bracket"))
- && scm_is_string (my_gl) && ly_is_equal (my_gl, scm_makfrom0str ("bracket")))
- add_offset_callback (inf.grob (), scm_from_double (-0.8), X_AXIS);
+ Side_position_interface::add_support (inf.grob (), delimiter_);
}
System_start_delimiter_engraver::System_start_delimiter_engraver ()
{
- delim_ = 0;
+ delimiter_ = 0;
}
void
System_start_delimiter_engraver::process_music ()
{
- if (!delim_)
+ if (!delimiter_)
{
- SCM delim_name = get_property ("systemStartDelimiter");
- delim_ = make_spanner_from_properties (this, delim_name, SCM_EOL,
- ly_symbol2string (delim_name).to_str0 ());
+ SCM delimiter_name = get_property ("systemStartDelimiter");
+ delimiter_ = make_spanner_from_properties (this, delimiter_name, SCM_EOL,
+ ly_symbol2string (delimiter_name).to_str0 ());
- delim_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
+ delimiter_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
}
}
void
System_start_delimiter_engraver::finalize ()
{
- if (delim_)
- delim_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn")));
+ if (delimiter_)
+ delimiter_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn")));
}
#include "translator.icc"
#include "staff-symbol-referencer.hh"
#include "lookup.hh"
#include "item.hh"
+#include "line-interface.hh"
#include "pointer-group-interface.hh"
Stencil
System_start_delimiter::staff_bracket (Grob *me, Real height)
{
- Font_metric *fm = Font_interface::get_default_font (me);
+ SCM fam = scm_cons (ly_symbol2scm ("font-encoding"),
+ ly_symbol2scm ("fetaMusic"));
+
+ SCM alist = scm_list_n (fam, SCM_UNDEFINED);
+ Font_metric *fm = select_font (me->layout (), scm_list_n (alist, SCM_UNDEFINED));
+
Drul_array<Stencil> tips (fm->find_by_name ("brackettips.down"),
fm->find_by_name ("brackettips.up"));
Real overlap = 0.1 * thickness;
- Stencil bracket = Lookup::filled_box (Box (Interval (0, thickness),
- Interval (-1, 1)
- * (height / 2 + overlap)));
-
+ Box box (Interval (0, thickness),
+ Interval (-1, 1)
+ * (height / 2 + overlap));
+
+ Stencil bracket = Lookup::filled_box (box);
Direction d = DOWN;
do
bracket.add_at_edge (Y_AXIS, d, tips[d], -overlap, 0.0);
- while (flip (&d) != DOWN)
- ;
+ while (flip (&d) != DOWN);
+ bracket = Stencil (box, bracket.expr ());
+ bracket.translate_axis (-0.8, X_AXIS);
+
return bracket;
}
+Stencil
+System_start_delimiter::line_bracket (Grob *me, Real height)
+{
+ height -= 1.0;
+
+ Real thick
+ = me->layout ()->get_dimension (ly_symbol2scm ("linethickness"))
+ * robust_scm2double (me->get_property ("thickness"), 1);
+ Real w = 0.8;
+
+ Stencil tip1 = Line_interface::make_line (thick,
+ Offset (0, -height/2),
+ Offset (w, -height/2));
+ Stencil tip2 = Line_interface::make_line (thick,
+ Offset (0, height/2),
+ Offset (w, height/2));
+ Stencil vline = Line_interface::make_line (thick,
+ Offset (0, -height/2),
+ Offset (0, height/2));
+
+ vline.add_stencil (tip1);
+ vline.add_stencil (tip2);
+ vline.translate_axis (-w, X_AXIS);
+ return vline;
+}
+
Stencil
System_start_delimiter::simple_bar (Grob *me, Real h)
{
System_start_delimiter::print (SCM smob)
{
Spanner *me = unsmob_spanner (smob);
- if (!me)
- return SCM_EOL;
-
- SCM s = me->get_property ("glyph");
- if (!scm_is_string (s))
- return SCM_EOL;
- SCM gsym = scm_string_to_symbol (s);
-
- Real staff_space = Staff_symbol_referencer::staff_space (me);
-
extract_grob_set (me, "elements", elts);
Grob *common = common_refpoint_of_array (elts, me, Y_AXIS);
Interval ext;
-
int non_empty_count = 0;
for (int i = elts.size (); i--;)
{
}
}
- if (gsym == ly_symbol2scm ("bar-line")
- && non_empty_count <= 1)
- {
- me->suicide ();
- return SCM_EOL;
- }
-
- ext -= me->relative_coordinate (common, Y_AXIS);
-
- Real len = ext.length () / staff_space;
-
+ SCM glyph_sym = me->get_property ("style");
+ Real len = ext.length ();
if (ext.is_empty ()
- || (robust_scm2double (me->get_property ("collapse-height"), 0.0) >= len))
+ || (robust_scm2double (me->get_property ("collapse-height"), 0.0) >= ext.length ())
+ || (glyph_sym == ly_symbol2scm ("bar-line")
+ && non_empty_count <= 1))
{
me->suicide ();
- return SCM_EOL;
+ return SCM_UNSPECIFIED;
}
Stencil m;
-
- if (gsym == ly_symbol2scm ("bracket"))
+ if (glyph_sym == ly_symbol2scm ("bracket"))
m = staff_bracket (me, len);
- else if (gsym == ly_symbol2scm ("brace"))
+ else if (glyph_sym == ly_symbol2scm ("brace"))
m = staff_brace (me, len);
- else if (gsym == ly_symbol2scm ("bar-line"))
+ else if (glyph_sym == ly_symbol2scm ("bar-line"))
m = simple_bar (me, len);
m.translate_axis (ext.center (), Y_AXIS);
/* We go through the style sheet to lookup the font file
name. This is better than using find_font directly,
esp. because that triggers mktextfm for non-existent
- fonts. */
+> fonts. */
SCM fam = scm_cons (ly_symbol2scm ("font-encoding"),
ly_symbol2scm ("fetaBraces"));
Stencil stil (fm->find_by_name ("brace" + to_string (lo)));
stil.translate_axis (-b[X_AXIS].length()/2, X_AXIS);
+ stil.translate_axis (-0.2, X_AXIS);
+
return stil;
}
ADD_INTERFACE (System_start_delimiter, "system-start-delimiter-interface",
"The brace, bracket or bar in front of the system. "
- "It is implemented as a spanner.",
+ ,
/* properties */
"collapse-height "
- "glyph "
+ "styles "
+ "staff-hierarchy "
"thickness "
);
\consists "Skip_event_swallow_translator"
\consists "Separating_line_group_engraver"
\consists "Hara_kiri_engraver"
+
\override VerticalAxisGroup #'remove-empty = ##t
\override VerticalAxisGroup #'remove-first = ##t
\override VerticalAxisGroup #'minimum-Y-extent = #'(-0.5 . 2.5)
at beat positions by only drawing one beam over the beat.")
(suggestAccidentals ,boolean? "If set, accidentals are typeset as cautionary suggestions over the note.")
+ (systemStartDelimiterHierarchy ,pair? "A nested list, indicating the nesting of a start delimiters.")
(systemStartDelimiter ,symbol? "Which grob to make for the start of
the system/staff? Set to @code{SystemStartBrace},
@code{SystemStartBracket} or @code{SystemStartBar}.")
(style ,symbol? "This setting determines in what style a grob is
typeset. Valid choices depend on the @code{stencil} callback reading
this property.")
+ (styles ,list? "A list of style symbols.")
(text ,markup? "Text markup. See @usermanref{Text markup}.")
;;FIXME -- Should both be the same?
(text-direction ,ly:dir? "This controls the ordering of the
(shorten ,ly:dimension? "The amount of space that a
stem. Internally used to distribute beam shortening over stems. ")
(slur ,ly:grob? "A pointer to a slur object")
+ (staff-hierarchy ,pair? "A nested list of staff symbol grobs.")
(use-breve-rest ,boolean? "Use breve rests for measures longer
than a whole rest.")
(spaceable-staves ,ly:grob-array? "Objects to be spaced during page layout.")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ancient notation
-
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;; TODO:
;; there are too many properties for ancient notation
;; probably neume-types (a list of symbols) would also work.
(interfaces . (system-interface
axis-group-interface))))))
+ (NestedSystemStartDelimiter
+ . (
+ (stencil . ,Nested_system_start_delimiter::print)
+ (X-offset . ,Side_position_interface::x_aligned_side)
+ (direction . ,LEFT)
+ (collapse-height . 1.0)
+ (padding . 0.0)
+ (font-encoding . fetaBraces)
+ (Y-extent . #f)
+ (meta . ((class . Spanner)
+ (interfaces . (system-start-delimiter-interface
+ side-position-interface
+ font-interface))))))
+
(SystemStartBrace
. (
- (glyph . "brace")
+ (style . brace)
+ (padding . 0.2)
(stencil . ,System_start_delimiter::print)
(collapse-height . 5.0)
+ (X-offset . ,Side_position_interface::x_aligned_side)
+ (direction . ,LEFT)
(font-encoding . fetaBraces)
(Y-extent . #f)
(meta . ((class . Spanner)
(interfaces . (system-start-delimiter-interface
+ side-position-interface
font-interface))))))
(SystemStartBracket
. (
(Y-extent . #f)
- (X-offset . -0.8)
+ (padding . 0.8)
+ (X-offset . ,Side_position_interface::x_aligned_side)
+ (direction . ,LEFT)
(stencil . ,System_start_delimiter::print)
- (glyph . "bracket")
+ (style . bracket)
(collapse-height . 5.0)
(thickness . 0.45)
(meta . ((class . Spanner)
(interfaces . (font-interface
+ side-position-interface
system-start-delimiter-interface))))))
(SystemStartBar
. (
(Y-extent . #f)
- (glyph . "bar-line")
+ (padding . 0.0)
+ (X-offset . ,Side_position_interface::x_aligned_side)
+ (direction . ,LEFT)
+ (style . bar-line)
(thickness . 1.6)
(stencil . ,System_start_delimiter::print)
(meta . ((class . Spanner)
- (interfaces . (system-start-delimiter-interface))))))
+ (interfaces . (side-position-interface
+ system-start-delimiter-interface))))))
+
(TabNoteHead
. (