2.7 Callback-Funktionen
Eigenschaften (wie Dicke (thickness
), Richtung (direction
)
usw.) können mit \override
auf feste Werte gesetzt werden, etwa:
\override Stem.thickness = #2.0
Eigenschaften können auch auf eine Scheme-Prozedur gesetzt werden:
\override Stem.thickness = #(lambda (grob) (if (= UP (ly:grob-property grob 'direction)) 2.0 7.0)) \relative { c'' b a g b a g b }
In diesem Fall wird die Prozedur ausgeführt, sobald der Wert der Eigenschaft während das Formatierungsprozesses angefordert wird.
Der größte Teil der Satzmaschinierie funktioniert mit derartigen Callbacks. Eigenschaften, die üblicherweise Callbacks benutzen, sind u. A.:
-
stencil
Die Druckfunktion, die eine Ausgabe des Symbols hervorruft
-
X-offset
Die Funktion, die die horizontale Position setzt
-
X-extent
Die Funktion, die die Breite eines Objekts errechnet
Die Funktionen brauchen immer ein einziges Argument, das der Grob ist.
Wenn Funktionen mit mehreren Argumenten aufgerufen werden müssen,
kann der aktuelle Grob mit einer Grob-Einschließung
eingefügt werden. Hier eine Einstellung aus
AccidentalSuggestion
:
(X-offset . ,(ly:make-simple-closure `(,+ ,(ly:make-simple-closure (list ly:self-alignment-interface::centered-on-x-parent)) ,(ly:make-simple-closure (list ly:self-alignment-interface::x-aligned-on-self)))))
In diesem Beispiel werden sowohl ly:self-alignment-interface::x-aligned-on-self
als auch ly:self-alignment-interface::centered-on-x-parent
mit dem Grob als Argument aufgerufen. Die Resultate werden mit der
+
-Funktion addiert. Um sicherzugehen, dass die Addition
richtig ausgeführt wird, wird das ganze Konstrukt in
ly:make-simple-closure
eingeschlossen.
In der Tat ist die Benutzung einer einzelnen Funktion als Eigenschaftswert äquivalent zu
(ly:make-simple-closure (ly:make-simple-closure (list proc)))
Das innere ly:make-simple-closure
stellt den Grob als Argument
für proc zur Verfügung, das äußere stellt sicher, dass das
Resultat der Funktion ausgegeben wird und nicht das
simple-closure
-Objekt.
Aus dem Callback heraus kann man eine Beschriftung am einfachsten mit
grob-interpret-markup
auswerten. Beispielsweise:
mein-callback = #(lambda (grob) (grob-interpret-markup grob (markup "foo")))