Spacing between adjacent non-musical items
Within a non-musical column, items are laid out in a specific
order. For instance, with the set of items in the picture below,
the default order places the breathing sign first, then the clef,
then the bar line, the key cancellation and key signature, and
finally the time signature (this is controlled by the
BreakAlignment.break-align-orders
property).
\relative { \key g \minor g'1 \breathe \clef alto \time 6/8 \key a \major aes4. }
The distance between two adjacent items from the same non-musical
column is controlled by the value of the space-alist
property of the leftmost one of the two. space-alist
has
the form of an associative list mapping break-align symbols to
(spacing-style . value)
pairs. A breakable item’s
break-align symbol is given by the value of its
break-align-symbol
property; standard choices are
listed in break-alignment-interface. Spacing styles
are listed in break-aligned-interface. Among the
available options, only extra-space
and
minimum-space
are relevant for tweaking the space between
non-musical items. The difference is that extra-space
measures the padding from the right of the first object to the
left of the second object while minimum-space
counts from
the left of the first object. Thus, a way to move the bar line
farther from the clef is:
\relative { \key g \minor g'1 \override Staff.Clef.space-alist.staff-bar = #'(extra-space . 4) \breathe \clef alto \time 6/8 \key a \major aes4. }
space-alist
settings, not limited to the two spacing styles
described above, are also possible to override the spacing between
different columns. However, this kind of spacing is flexible, and
does not merely depend on the types of object involved but also
their shapes. Methods specific to it are documented in the next
section.
Selected Snippets
Separating key cancellations from key signature changes
By default, the accidentals used for key cancellations are placed
adjacent to those for key signature changes. This behavior can be
changed by overriding the break-align-orders
property of the
BreakAlignment
grob.
The value of break-align-orders
is a vector of length 3,
with quoted lists of breakable items as elements. Each list describes
the default order of prefatory matter at the end, in the middle, and at
the beginning of a line, respectively. We are only interested in
changing the behaviour in the middle of a line.
If you look up the definition of break-align-orders
in
LilyPond’s Internal Reference (see the
BreakAlignment
grob), you get the following order in the second element:
... staff-bar key-cancellation key-signature ...
We want to change that, moving key-cancellation
before
staff-bar
. To make this happen we use the
grob-transformer
function, which gives us access to the original
vector as the second argument of the lambda function, here called
orig (we don’t need the first argument,
grob). We return a new vector, with unchanged first and
last elements. For the middle element, we first remove
key-cancellation
from the list, then adding it again before
staff-bar
.
#(define (insert-before where what lst) (cond ((null? lst) ; If the list is empty, (list what)) ; return a single-element list. ((eq? where (car lst)) ; If we find symbol `where`, (cons what lst)) ; insert `what` before curr. position. (else ; Otherwise keep building the list by (cons (car lst) ; adding the current element and ; recursing with the next element. (insert-before where what (cdr lst)))))) cancellationFirst = \override Score.BreakAlignment.break-align-orders = #(grob-transformer 'break-align-orders (lambda (grob orig) (let* ((middle (vector-ref orig 1)) (middle (delq 'key-cancellation middle)) (middle (insert-before 'staff-bar 'key-cancellation middle))) (vector ;; end of line (vector-ref orig 0) ;; middle of line middle ;; beginning of line (vector-ref orig 2))))) music = { \key es \major d'1 \bar "||" \key a \major d'1 } { <>^\markup "default" \music } { <>^\markup "cancellation first" \cancellationFirst \music } \paper { tagline = ##f }
See also
Notation Reference:
Using the break-alignable-interface
.
Extending LilyPond: Association lists (alists).
Internals Reference: Break_align_engraver, BreakAlignGroup, BreakAlignment, break-alignable-interface, break-aligned-interface, break-alignment-interface.