Ein vollständiges Bespiel
Das folgende Beispiel definiert einen Beschriftungsbefehl, der einen doppelten Kasten um einen Text zeichnet.
Zuerst wollen wir ein annäherndes Ergebnis mit Textbeschriftungen definieren.
Nach Stöbern in Textbeschriftungsbefehle finden wir den Befehl
\box
:
\markup \box \box HELLO
Wir wollen aber etwas mehr Abstand (engl. padding) zwischen dem Text und dem Kasten.
Nach der Dokumentation von \box
hat der Befehl eine
box-padding
-Eigenschaft, die den Standardwert von 0.2 hat. Die
Dokumentation zeit auch, wir man den Wert verändert:
\markup \box \override #'(box-padding . 0.6) \box A
Auch der Abstand zwischen den zwei Kästen ist uns zu klein und soll auch vergrößert werden:
\markup \override #'(box-padding . 0.4) \box \override #'(box-padding . 0.6) \box A
Diese lange Textbeschriftung immer wieder schreiben zu müssen, ist
anstrengend. Hier kömmt ein Textbeschriftungsbefehl ins Spiel. Wir
schreiben uns alle einen double-box
-Beschriftungsbefehl, der
ein Argument annimmt (den Text). Er zeichnet zwei Kästen mit genügend Abstand:
#(define-markup-command (double-box layout props text) (markup?) "Draw a double box around text." (interpret-markup layout props #{\markup \override #'(box-padding . 0.4) \box \override #'(box-padding . 0.6) \box { #text }#}))
oder äquivalent
#(define-markup-command (double-box layout props text) (markup?) "Draw a double box around text." (interpret-markup layout props (markup #:override '(box-padding . 0.4) #:box #:override '(box-padding . 0.6) #:box text)))
text
ist die Bezeichnung des Arguments dieses Befehls,
und markup?
ist seine Art: hiermit wird der Befehl als
Beschriftungsbefehl identifiziert. Die interpret-markup
-Funktion
wird in den meisten Beschriftungsbefehlen benutzt: sie erstellt einen
Stencil, wobei layout
, props
und eine Beschriftung benutzt
werden. Im zweiten Fall wird diese Beschriftung durch das
markup
-Scheme-Makro erstellt, siehe auche
Beschriftungskonstruktionen in Scheme.
Die Transformation des \markup
-Ausdrucks in einen
Scheme-Beschriftungsausdruck geschieht durch Umschreiben des LilyPond-Codes
in Scheme-Code.
Der neue Befehl kann wie folgt benutzt werden:
\markup \double-box A
Es wäre schön, den double-box
-Befehl noch konfigurierbar zu gestalten:
in unserem Fall sind die Werte von box-padding
direkt definiert und
können nicht mehr vom Benutzer verändert werden. Es wäre auch besser, wenn
der Abstand zwischen den beiden Kästen vom Abstand zwischen dem inneren Kasten
und dem Text unterschieden werden könnte. Eine neue Eigenschaft muss also
definiert werden: inter-box-padding
für den Abstand zwischen den Kästen.
box-padding
wird für den inneren Abstand benutzt. Der neue Befehl wird
so definiert:
#(define-markup-command (double-box layout props text) (markup?) #:properties ((inter-box-padding 0.4) (box-padding 0.6)) "Draw a double box around text." (interpret-markup layout props #{\markup \override #`(box-padding . ,inter-box-padding) \box \override #`(box-padding . ,box-padding) \box { #text } #}))
Wiederum wäre die entsprechende Version mit dem markup
-Makro
so aussehen:
#(define-markup-command (double-box layout props text) (markup?) #:properties ((inter-box-padding 0.4) (box-padding 0.6)) "Draw a double box around text." (interpret-markup layout props (markup #:override `(box-padding . ,inter-box-padding) #:box #:override `(box-padding . ,box-padding) #:box text)))
In diesem Code wird das #:properties
-Schlüsselwort benutzt, sodass
die Eigenschaften inter-box-padding
und box-padding
aus dem
props
-Argument ausgelesen werden, und Standardwerte werden gegeben,
falls die Eigenschaften nicht definiert sein sollten.
Dann werden diese Werte benutzt, um die box-padding
-Eigenschaft
zu verändert, die von beiden \box
-Befehlen benutzt wird. Beachten
Sie Akzent und das Komma des \override
-Arguments: hiermit kann man
einen Variablenwert in einen wörtlichen Ausdruck überführen.
Jetzt kann der Befehl in Beschriftungen benutzt werden und der Abstand der Kästen kann angepasst werden:
#(define-markup-command (double-box layout props text) (markup?) #:properties ((inter-box-padding 0.4) (box-padding 0.6)) "Draw a double box around text." (interpret-markup layout props #{\markup \override #`(box-padding . ,inter-box-padding) \box \override #`(box-padding . ,box-padding) \box { #text } #})) \markup \double-box A \markup \override #'(inter-box-padding . 0.8) \double-box A \markup \override #'(box-padding . 1.0) \double-box A