Lilypond Markups
Allgemeines
Mittels \markup Befehlen können Texte in Lilypond-Scores eingebaut werden, entweder als Zusatzbeschriftung zu Noten oder als eigenständige Texte zwischen Scores.
Die Module mit den Textbeschriftungsbefehlen stehen im Verzeichnis /usr/local/lilypond/usr/share/lilypond/current/scm/ und heißen
stencil.scm markup.scm define-markup-commands.scm
Aufbau eines Markup-Befehls
Markup-Befehle verwenden den define-markup-command-Scheme-Makro und sind folgendermaßen aufgebaut:
#(define-markup-command (command-name layout props args...)
args-signature
[ #:category category ]
[ #:properties property-bindings ]
documentation-string
..body..)
- command-name
- Name des Befehls
- layout props
- diese Parameter werden automatisch übergeben, wenn der Makro aufgerufen wird
- layout ist eine Output def, deren Eigenschaften mit ly:output-def-lookup abgerufen werden können
- props ist eine Eigenschaftsliste, auf die mittels chain-assoc-get zugegriffen werden kann
- args
- Liste der Argumente
- Es gibt keine Beschränkung für Reihenfolge und Anzahl der Argumente.
- Markup-Funktionen, deren letztes Argument ein markup ist, sind insofern besonders als sie auf eine Markup-Liste angewendet werden können, und das Ergebnis ist eine Markup-Liste, wobei die Markup-Funktion auf jedes einzelne Element der Liste angewendet wurde
- args-signature
- eine Liste von Typ-Prädikaten, die angibt, welchen Typ die Argumente haben müssen. Reihenfolge und Anzahl müssen übereinstimmen.
- category
- optional, für Dokumentationszwecke; ordnet die Funktion einer bestimmten Kategorie zu
- property-bindings
- eine Liste von Eigenschaften, die in der Markup-Funktion vorkommen sowie die standardmäßige Belegung
- documentation-string
- Beschreibung zwischen Doppelhochkomma eingeschlossen
- body
- Funktionsrumpf, muss einen stencil erzeugen
Und die gesamte Mühe hätte ich mir sparen können, wenn ich diesen Link vorher gefunden hätte: Syntax der Definition von Textbeschriftungsbefehlen
Beispiel einer Markup-Funktion
#(define-markup-command (fontsize layout props increment arg)
(number? markup?)
#:category font
#:properties ((font-size 0)
(word-space 1)
(baseline-skip 2))
(interpret-markup
layout
(cons
`((baseline-skip . ,(* baseline-skip (magstep increment)))
(word-space . ,(* word-space (magstep increment)))
(font-size . ,(+ font-size increment)))
props)
arg))
Die Dokumentation habe ich aus Gründen der Übersichtlichkeit weggelassen.
Diese Funktion ändert die Schriftgröße eines Markups, das 1. Argument ist der Vergrößerungsfaktor, das 2. Argument das Markup.
Fix voreingestellte Eigenschaften, die mittels \override #'(name . wert) überschrieben werden können, sind font-size, word-space und baseline-skip
Anwendung
\version "2.19.82"
\language "deutsch"
\markup \left-column
{
\line { noch smaller }
\override #'(word-space . 15)
\fontsize #-1.5
{
smaller
\line { noch smaller }
small
}
}
Anmerkungen
Die Angabe von \override #'(baseline-skip . x) hat keinen Effekt, zumindest nicht den, den ich erwartet hätte.
Graphische Ausgabe
SVG
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" width="210.00mm" height="297.00mm" viewBox="0 0 119.5016 169.0094">
<text transform="translate(5.6906, 2.8453)" font-family="serif" font-size="2.2001" text-anchor="start" fill="currentColor">
<tspan/>
</text>
<text transform="translate(5.6906, 5.5183)" font-family="serif" font-size="2.2001" text-anchor="start" fill="currentColor">
<tspan>
noch</tspan>
</text>
<text transform="translate(11.6511, 5.5183)" font-family="serif" font-size="2.2001" text-anchor="start" fill="currentColor">
<tspan>
smaller</tspan>
</text>
<text transform="translate(5.6906, 8.5183)" font-family="serif" font-size="1.8500" text-anchor="start" fill="currentColor">
<tspan>
smaller</tspan>
</text>
<text transform="translate(5.6906, 11.5183)" font-family="serif" font-size="1.8500" text-anchor="start" fill="currentColor">
<tspan>
noch</tspan>
</text>
<text transform="translate(22.8451, 11.5183)" font-family="serif" font-size="1.8500" text-anchor="start" fill="currentColor">
<tspan>
smaller</tspan>
</text>
<text transform="translate(5.6906, 14.5183)" font-family="serif" font-size="1.8500" text-anchor="start" fill="currentColor">
<tspan>
small</tspan>
</text>
</svg>
Weitere Untersuchungen
Mithilfe des Linux-Befehls
find /usr/local/lilypond/usr/share/lilypond/current/ -name "*.scm" -type f -exec grep -H "interpret-markup" {} \;
lässt sich herausfinden, wie die Prozedur interpret-markup definiert ist. Das Ergebnis ist ein wenig enttäuschend
(define-public interpret-markup ly:text-interface::interpret-markup)
Die interne Referenz gibt Auskunft:
Links
- Notation: A.10 Textbeschriftungsbefehle
- Notation: A.11 Textbeschriftungslistenbefehle
- 1.8.1 Notation: Text eingeben
- Extending: 2.5 Textbeschriftungsfunktionen
- Extending: 2.5.3 New markup command definition
- Forumsarchiv: 2 parallel numerierte Spalten als scheme-function
- Forumsarchiv: Markup mit automatischem Seitenumbruch