2.9 Schwierige Korrekturen (LilyPond erweitern)

### 2.9 Schwierige Korrekturen

Hier finden sich einige Klassen an schwierigeren Anpassungen.

- Ein Typ der schwierigen Anpassungen ist die Erscheinung von Strecker-Objekten wie Binde- oder Legatobögen. Zunächst wird nur eins dieser Objekte erstellt, und sie können mit dem normalen Mechanismus verändert werden. In einigen Fällen reichen die Strecker jedoch über Zeilenumbrüche. Wenn das geschieht, werden diese Objekte geklont. Ein eigenes Objekt wird für jedes System erstellt, in dem es sich befindet. Sie sind Klone des originalen Objektes und erben alle Eigenschaften, auch `\override`-Befehle.

  Anders gesagt wirkt sich ein `\override` immer auf alle Stücke eines geteilten Streckers aus. Um nur einen Teil eines Streckers bei einem Zeilenumbruch zu verändern, ist es notwendig, in den Formatierungsprozess einzugreifen. Das Callback `after-line-breaking` enthält die Schemefunktion, die aufgerufen wird, nachdem Zeilenumbrüche errechnet worden sind und die Layout-Objekte über die unterschiedlichen Systeme verteilt wurden.

  Im folgenden Beispiel wird die Funktion `my-callback` definiert. Diese Funktion

  - bestimmt, ob das Objekt durch Zeilenumbrüche geteilt ist,
  - wenn ja, ruft sie alle geteilten Objekte auf,
  - testet, ob es sich um das letzte der geteilten Objekte handelt,
  - wenn ja, wird `extra-offset` gesetzt.

  Diese Funktion muss in Tie (Bindebogen) installiert werden, damit der letzte Teil eines gebrochenen Bindebogens neu ausgerichtet wird.

  >     #(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 {
  >       \override Tie.after-line-breaking =
  >       #my-callback
  >       c''1 ~ \break c2 ~ 2
  >     }

  Wenn man diesen Trick anwendet, sollte das neue `after-line-breaking` auch das alte `after-line-breaking`-Callback aufrufen, wenn es vorhanden ist. Wenn diese Funktion etwa mit `Hairpin` (Crescendo-Klammer) eingesetzt wird, sollte auch `ly:spanner::kill-zero-spanned-time` aufgerufen werden.

- Manche Objekte können aus technischen Gründen nicht mit `\override` verändert werden. Beispiele hiervon sind `NonMusicalPaperColumn` und `PaperColumn`. Sie können mit der `\overrideProperty`-Funktion geändert werden, die ähnlich wie `\once \override` funktioniert, aber eine andere Syntax einsetzt.

      \overrideProperty
      Score.NonMusicalPaperColumn  % Grob-Bezeichnung
      #'line-break-system-details     % Eigenschaftsbezeichnung
      #'((next-padding . 20))         % Wert

  Es sollte angemerkt werden, dass `\override`, wenn man es auf `NonMusicalPaperColumn` und `PaperColumn` anwendet, immer noch innerhalb der `\context`-Umgebung funktioniert.

#### LilyPond erweitern v2.26.0 (stable-branch).

- 1 Scheme-Tutorium
  - 1.1 Einleitung in Scheme
    - 1.1.1 Scheme-Sandkasten
    - 1.1.2 Scheme-Variablen
    - 1.1.3 Einfache Scheme-Datentypen
    - 1.1.4 Zusammengesetzte Scheme-Datentypen
    - 1.1.5 Berechnungen in Scheme
    - 1.1.6 Scheme-Prozeduren
    - 1.1.7 Scheme-Konditionale
  - 1.2 Scheme in LilyPond
    - 1.2.1 LilyPond Scheme-Syntax
    - 1.2.2 LilyPond-Variablen
    - 1.2.3 Eingabe-Variablen und Scheme
    - 1.2.4 Scheme in LilyPond importieren
    - 1.2.5 Objekteigenschaften
    - 1.2.6 Zusammengesetzte LilyPond-Variablen
    - 1.2.7 Interne musikalische Repräsentation
  - 1.3 Komplizierte Funktionen erstellen
    - 1.3.1 Musikalische Funktionen darstellen
    - 1.3.2 Eigenschaften von Musikobjekten
    - 1.3.3 Verdoppelung einer Note mit Bindebögen (Beispiel)
    - 1.3.4 Artikulationszeichen zu Noten hinzufügen (Beispiel)
- 2 Schnittstellen für Programmierer
  - 2.1 LilyPond-Codeabschnitte
  - 2.2 Scheme-Funktionen
    - 2.2.1 Definition von Scheme-Funktionen
    - 2.2.2 Benutzung von Scheme-Funktionen
    - 2.2.3 Leere Scheme-Funktionen
  - 2.3 Musikalische Funktionen
    - 2.3.1 Definition der musikalischen Funktionen
    - 2.3.2 Benutzung von musikalischen Funktionen
    - 2.3.3 Einfache Ersetzungsfunktionen
    - 2.3.4 Mittlere Ersetzungsfunktionen
    - 2.3.5 Mathematik in Funktionen
    - 2.3.6 Funktionen ohne Argumente
    - 2.3.7 Leere musikalische Funktionen
  - 2.4 Ereignisfunktionen
  - 2.5 Textbeschriftungsfunktionen
    - 2.5.1 Beschriftungskonstruktionen in Scheme
    - 2.5.2 Wie Beschriftungen intern funktionieren
    - 2.5.3 Neue Definitionen von Beschriftungsbefehlen
      - Syntax der Definition von Textbeschriftungsbefehlen
      - Über Eigenschaften
      - Ein vollständiges Bespiel
      - Eingebaute Befehle anpassen
    - 2.5.4 Neue Definitionen von Beschriftungslistenbefehlen
  - 2.6 Kontexte für Programmierer
    - 2.6.1 Kontextauswertung
    - 2.6.2 Eine Funktion auf alle Layout-Objekte anwenden
  - 2.7 Callback-Funktionen
  - 2.8 Scheme-Code innerhalb LilyPonds
  - 2.9 Schwierige Korrekturen
- 3 LilyPond Scheme-Schnittstellen
- Appendix A GNU Free Documentation License
- Appendix B Register