--- /dev/null
+
+\header {
+
+texidoc = "3 ways to customize ledger line positions."
+
+}
+
+\version "2.19.41"
+\paper { ragged-right = ##t }
+
+\relative {
+ \override Staff.StaffSymbol.ledger-positions = #'(7 10)
+ f''4 g a b c d e f g a b c
+}
+
+\relative {
+ % note: the scheme procedure (lambda expression) is quoted
+ \override Staff.StaffSymbol.ledger-positions-function =
+ #'(lambda (staff-symbol-grob pos) (list pos))
+ c'''4 d e f
+}
+
+\relative {
+ c'''4
+ \once \override NoteHead.ledger-positions = #'(8 10 12 14)
+ d e f
+}
static Real get_ledger_line_thickness (Grob *);
static vector<Real> line_positions (Grob *);
- static vector<Real> ledger_positions (Grob *me, int pos);
+ static vector<Real> ledger_positions (Grob *me, int pos, Item const *head = 0);
static int line_count (Grob *);
static bool on_line (Grob *me, int pos, bool allow_ledger = true);
static Interval line_span (Grob *);
for (vsize i = heads.size (); i--;)
{
Item *h = dynamic_cast<Item *> (heads[i]);
-
int pos = Staff_symbol_referencer::get_rounded_position (h);
vector<Real> ledger_positions =
- Staff_symbol::ledger_positions (staff, pos);
+ Staff_symbol::ledger_positions (staff, pos, h);
// We work with all notes that produce ledgers and any notes that
// fall outside the staff that do not produce ledgers, such as
"glyph-name "
"stem-attachment "
"style "
+ "ledger-positions "
);
}
vector<Real>
-Staff_symbol::ledger_positions (Grob *me, int pos)
+Staff_symbol::ledger_positions (Grob *me, int pos, Item const *head)
{
+ // allow override of ledger positions via note head grob...
+ if (head)
+ {
+ SCM posns = head->get_property ("ledger-positions");
+ if (scm_is_pair (posns))
+ return ly_scm2floatvector (posns);
+ }
+
+ // ...or via custom ledger positions function
+ SCM lp_function = me->get_property ("ledger-positions-function");
+ if (scm_is_pair (lp_function))
+ {
+ SCM func = scm_eval (lp_function, scm_interaction_environment ());
+ if (ly_is_procedure (func))
+ return ly_scm2floatvector (scm_call_2 (func,
+ me->self_scm (),
+ scm_from_int (pos)));
+ }
+
SCM ledger_positions = me->get_property ("ledger-positions");
Real ledger_extra = robust_scm2double (me->get_property ("ledger-extra"), 0);
vector<Real> line_positions = Staff_symbol::line_positions (me);
Direction dir = (Direction)sign (pos - nearest_line);
if (scm_is_pair (ledger_positions))
- // custom ledger line positions
+ // custom ledger positions via StaffSymbol.ledger-positions
{
Real min_pos = HUGE_VAL;
Real max_pos = -HUGE_VAL;
"ledger-extra "
"ledger-line-thickness "
"ledger-positions "
+ "ledger-positions-function "
"line-count "
"line-positions "
"staff-space "
lines. It is the sum of 2@tie{}numbers: The first is the factor for
line thickness, and the second for staff space. Both contributions
are added.")
- (ledger-positions ,list? "Repeating pattern for the vertical positions
-of ledger lines. Bracketed groups are always shown together.")
+ (ledger-positions ,list? "Vertical positions of ledger lines.
+When set on a @code{StaffSymbol} grob it defines a repeating
+pattern of ledger lines and any parenthesized groups will always be
+shown together.")
+ (ledger-positions-function ,scheme? "A quoted Scheme procedure that
+takes a @code{StaffSymbol} grob and the vertical position of a note head
+as arguments and returns a list of ledger line positions.")
(left-bound-info ,list? "An alist of properties for determining
attachments of spanners to edges.")
(left-padding ,ly:dimension? "The amount of space that is put