Extending LilyPond: 2.6 Difficult tweaks

## 2.6 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. The `after-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 '(-2 . 5)))))

  >     \relative c'' {
  >       \override Tie #'after-line-breaking =
  >       #my-callback
  >       c1 ~ \break
  >       c2 ~ c
  >     }

  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 with `Hairpin`, `ly:spanner::kill-zero-spanned-time` should also be called.

- Some objects cannot be changed with `\override` for technical reasons. Examples of those are `NonMusicalPaperColumn` and `PaperColumn`. They can be changed with the `\overrideProperty` function, which works similar to `\once \override`, but uses a different syntax.

  >     \overrideProperty
  >     #"Score.NonMusicalPaperColumn"  % Grob name
  >     #'line-break-system-details     % Property name
  >     #'((next-padding . 20))         % Value

  Note, however, that `\override`, applied to `NonMusicalPaperColumn` and `PaperColumn`, still works as expected within `\context` blocks.

其它语言：deutsch, español。

#### LilyPond — Extending