Lilypond Markups

Zur Navigation springen Zur Suche springen

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