[ << Interfaces for programmers ] | [Top][Contents][Index] | [ LilyPond Scheme interfaces >> ] |
[ < Unpure-pure containers ] | [ Up : Interfaces for programmers ] | [ LilyPond Scheme interfaces > ] |
2.9 Difficult tweaks
There are a few classes of difficult adjustments.
- One type of difficult adjustment involves the appearance of
spanner objects, such as slurs and ties. Usually, only one
spanner object is created at a time, and it can be adjusted with
the normal mechanism. However, occasionally a spanner crosses a
line break. When this happens, the object is cloned. A separate
object is created for every system in which the spanner appears.
The new objects are clones of the original object and inherit all
properties, including
\override
s.In other words, an
\override
always affects all pieces of a broken spanner. To change only one part of a spanner at a line break, it is necessary to hook into the formatting process. Theafter-line-breaking
callback contains the Scheme procedure that is called after the line breaks have been determined and layout objects have been split over different systems.In the following example, we define a procedure
my-callback
. This procedure- determines if the spanner has been split across line breaks
- if yes, retrieves all the split objects
- checks if this grob is the last of the split objects
- if yes, it sets
extra-offset
.
This procedure is installed into Tie, so the last part of the broken tie is repositioned.
#(define (my-callback grob) (let* ( ;; have we been split? (orig (ly:grob-original grob)) ;; if yes, get the split pieces (our siblings) (siblings (if (ly:grob? orig) (ly:spanner-broken-into orig) '()))) (if (and (>= (length siblings) 2) (eq? (car (last-pair siblings)) grob)) (ly:grob-set-property! grob 'extra-offset '(1 . -4))))) \relative { \override Tie.after-line-breaking = #my-callback c''1 ~ \break c2 ~ 2 }
When applying this trick, the new
after-line-breaking
callback should also call the old one, if such a default exists. For example, if using this withHairpin
,ly:spanner::kill-zero-spanned-time
should also be called. - Some objects cannot be changed with
\override
for technical reasons. They can be changed with the\overrideProperty
function, which works similar to\once \override
, but uses a different syntax.1\overrideProperty [ContextName].GrobName.property-name[.subproperty-name] value
Footnotes
(1)
Over time, \overrideProperty
is being replaced with the more usual \once \override
command. If you still find yourself needing \overrideProperty
,
a bug report would be appreciated.
[ << Interfaces for programmers ] | [Top][Contents][Index] | [ LilyPond Scheme interfaces >> ] |
[ < Unpure-pure containers ] | [ Up : Interfaces for programmers ] | [ LilyPond Scheme interfaces > ] |