… und jetzt kommen (wir) alle wieder runter, denn ich habe hier meinen persönlichen Erfahrungsschatz, um ansprechende und nützliche Header und Footer zu gestalten, woran ich gern unsere Forencommunity und den Rest der (deutsch lesenden) Welt teilhaben lassen möchte.
Vorab möchte ich auf zwei viel zu oft unterschätzte und selten gesehene Lily-Funktionen hinweisen, die im Gebrauch freier Markup-Blöcke unschätzbare Dienste leisten:
\null und
\abs-fontsize.
\null ist ein Platzhalter für
leeres Markup mit den Abmessungen eines
typographischen Punktes, welcher in verschiedenen Normsystemen verschiedene absolute Längen hat (die NR schweigt sich darüber aus, auf welchen „point“ sich Lily bezieht). Für uns von Interesse sind die Fakten, dass (a) der Punkt als Maßeinheit mit der gewählten Schriftart korrespondiert und (b) lilypondintern das Punktmaß in Abhängigkeit der globalen Schriftart, dessen Versalhöhe und hauptsächlich der Zeilenhöhe (staff-size) skaliert wird. Ganz lapidar ausgedrückt aber ist
\null der saubere Ersatz für
" ", wobei dies effektiv bei
horizontalem Spacing wirkt. Bezüglich
vertikalem Spacing tut uns Lily den Gefallen leider
nicht.
\abs-fontsize ist der Makrobefehl, um mit
absoluter Schriftgröße (wie der Makroname bereits vermuten lässt) zu arbeiten. Einzige – dafür um so essentiellere – Bedingungen für eine korrekte Interpretation des Makros ist (a) die Definition der globalen Zeilenhöhe (default 20 pt) (z.B.
#(set-global-staff-size 15.87))
vor dem Ersteinsatz von
\abs-fontsize und
vor der
\book- und den
\bookpart-Definitionen sowie (b) die optionale Umdefinition der Default-Schriftart (Century School[book]) in einem
\paper-Block
innerhalb des gesamten
\book-Blocks, aber
vor allen anderen
\bookpart-Blöcken (incl. deren
\paper-Blöcke). Klingt zunächst verwirrend, ist aber in meinem kommenden Struktur-Workshop hoffentlich besser veranschaulicht. Zur Notwendigkeit und dem Einsatz von
\book- bzw.
\bookpart-Blöcken bitte zwischenzeitlich die
NR 3. Allgemeine Eingabe und Ausgabe konsultieren.
Zur
Soforthilfe seien folgende
Basics erläutert (vielleicht ergänze ich sie ausführlicher in einem Header-/Footer-Workshop).
N.B.: Alle beschriebenen Markup-Funktionen sind im \paper-Block der Partitur bzw. des Partiturabschnitts (\bookpart) definierbar. Eine Ausnahme ist tagline, welche sowohl im \header- als auch im \paper-Block notiert bzw. unterdrückt werden kann. Ich empfehle aber auf Grund meiner persönlichen Erfahrung, diese Variable im \header-Block zu belassen.LilyPond in der (stabilen) Version 2.12 geht uns zur Kopf- und Fußzeilengestaltung mit
vier wesentlichen Werkzeugen zur Hand:
- Kopfzeilen auf ungeraden Seiten: oddHeaderMarkup
- Kopfzeilen auf geraden Seiten: evenHeaderMarkup
- Fußzeilen auf ungeraden Seiten: oddFooterMarkup
- Fußzeilen auf geraden Seiten: evenFooterMarkup
Zunächst aber setzt Lilypond Kopf- und Fußzeilen unter Verwendung interner
Defaults nach folgenden Regeln:
- Fußzeilen
- Die \header-Variable (nicht zu verwechseln mit „HeaderMarkup“!) tagline ist als Fußzeile vorbelegt mit dem zentriert gesetzten Inhalt Music engraving by LilyPond <Versionsnummer>—www.lilypond.org – im PDF eingebettet als klickbarer URI der angegebenen Webadresse. Die tagline kann
- gänzlich unterbunden werden: tagline = ##f
- mit anderem Inhalt belegt werden, z.B. tagline = "Engraved with LilyPond—Edited by Me, Myself, and I"
- durch even[odd]FooterMarkup ersetzt werden.
Wird die Ausgabe der tagline nicht explizit unterbunden oder durch even[odd]FooterMarkup geändert, erscheint sie einmalig in der Fußzeile auf der letzten Partiturseite. Wird nur eine Seite ausgegeben, zählt diese Seite – wie auch sonst üblich in LilyPond – als letzte Seite, und die tagline wird anstelle des Copyrightvermerks erzeugt (→ nächster Punkt). - Die \header-Variable (auch dies nicht verwechseln) copyright hingegen ist nicht vorbelegt, wird aber, sobald sie mit Inhalt per copyright = "© 2010 by me" gefüttert wird, auf der ersten Seite als Fußzeile mit selbstdefiniertem Inhalt zentriert gesetzt. Auch copyright wird ersetzt
- durch even[odd]FooterMarkup
- durch tagline im Falle einer einzigen Seite Output (wenn die erste Seite gleichzeitig die letzte ist).
- Kopfzeilen werden von LilyPond ohne äußeren Einfluss mit Seitenzahlen und Instrumentenbezeichnung gemäß folgendem Schema erzeugt:
- Die erste Seite erhält keine Kopfzeile.
- Alle weiteren Seiten erhalten in der Kopfzeile
- die Seitennummer am äußeren Rand (also ungerade Seiten rechts oben, gerade Seiten links oben);
- die Instrumentenangabe zentriert.
Das war zum Verständnis der ersten größeren Hürde: „Was macht Lily ohne mein Zutun, und warum macht es, wenn ich schon etwas tue, dieses nur einmal oder gar nicht?“
Bevor nun gleich die Header-/Footer-Markups zum Einsatz kommen, möchte ich noch kurz die grundlegendsten
Formatierungsbefehle aufzählen und (möglichst) knapp beschreiben.
N.B.: Es ist ein wesentlicher
Unterschied, Ausdrücke in geschweiften Klammern {…}
oder in Anführungszeichen "…"
zusammenzufassen. Die folgenden Formatierungsbefehle erwarten je ein Argument
bzw. je einen Ausdruck,
worauf der vorangegangene Befehl angewandt wird. Wenn man also eine Wortgruppe z.B. kursiv gesetzt haben möchte, muss man die gesamte Wortgruppe entweder in geschweiften Klammern oder in Anführungszeichen zusammenfassen!
Beispiel: { \italic Ich bin nicht ganz kursiv. } wird interpretiert als: Ich bin nicht ganz kursiv. Um den gesamten Satz kursiv zu setzen, notiert man: { \italic "Ich bin komplett kursiv." } oder { \italic { Ich bin komplett kursiv. } } Innerhalb von Anführungszeichen wird jeglicher Text wie eingegeben
(verbatim) interpretiert. Ein Befehl, der in Lily mit einem Backslash (\) beginnen muss, wird also nicht
ausgeführt, sondern als Text
dargestellt.- \line { Wort Wörtchen "Wort Gruppe" } – setzt alle Komponenten (hier 3) innerhalb der Klammern auf eine Grundlinie.
- \fill-line { Wort Wörtchen "Wort Gruppe" } – verteilt alle Komponenten (hier wieder 3) auf einer Grundlinie gleichmäßig über die zur Verfügung stehende Zeilenlänge; in diesem Beispiel würde somit „Wort“ ganz links stehen, „Wort Gruppe“ ganz rechts und „Wörtchen“ zentriert – jawohl, selbst wenn „Wort Gruppe“ breiter ist als „Wort“. LilyPond geht hier von der Mittelachse des Arguments aus und nicht vom (dehnbaren) Abstand dazwischen wie (La)TeX.
- \column { Wort Wörtchen "Wort Gruppe" } – setzt den Inhalt der Klammern (auch wieder 3) untereinander als Spalte; standardmäßig innerhalb der Spalte linksbündig. Weitere Varianten, falls die Ausrichtung bereits vorgegeben sein sollte: \left-column, \center-column, \right-column Achtung: Hier ist die Ausrichtungsachse der Bezugspunkt! Eine \right-column am linken Seitenrand wird in den Seitenrand nach links hineinragen, da der rechte Rand der Spalte den Bezug herstellt!!!
- \with-url #"http://..." { Linktext } – der Text innerhalb der Klammern wird angezeigt und klickbar zum URI in #"" gemacht.
- \with-color #benannteFarbe { Text } – Text in Klammern wird eingefärbt.
- \bold, \italic, \smallCaps, \teeny, \tiny, \small, \normalsize, \large, \huge, \smaller, \larger, \fontsize #x, \magnify #x, \underline, \sup, \sub, \raise #x, \lower #x sind nur einige zusätzliche Auszeichnungs- und Formatierungsbefehle, die überwiegend für sich sprechen und ansonsten in der NR gut aufzufinden sind.
Jetzt endlich sind wir kurz davor! Es fehlen nur noch die Funktionen, mit denen wir bspw. Seitenzahl oder Titel/Untertitel herausbekommen bzw. Bedingungen stellen können:
- \fromproperty #'page:page-number-string – liefert die Seitenzahl
- \fromproperty #'header:title – liefert den Titel
- \fromproperty #'header:subtitle – liefert den Untertitel
- \fromproperty #'header:... – liefert … aus unserem \header (was sich dort halt alles finden lässt)
- \on-the-fly #not-first-page – überprüft, dass wir gerade nicht auf der ersten Seite sind
- \on-the-fly #first-page – überprüft, ob wir gerade auf der ersten Seite sind
Mit diesem Vorwissen, können wir uns nun die coolsten
Kopf- und Fußzeilen basteln! Es sind bereits alle wichtigen Komponenten erwähnt, aber ein klassisches Beispiel möchte ich dennoch erläutern:
„Ich möchte gern (a) auf allen Seiten (außer der ersten) oben die Seitennummer (außen), in der Mitte das Instrument, gegenüber der Seitenzahl (also innen) das Stück mit Komponisten, dazwischen irgendwo die Satzbezeichnung und (b) unten auf der ersten Seite, dass ich es gesetzt habe und womit, ansonsten meine Archiv-/Editionsnummer!“Gut – schauen wir, was wir bereits haben können:
\header {
title = "Meine kleine Suite"
composer = "Lukas Gerhard Fluß"
piece = "2. Courante"
instrument = "Viola"
tagline = ##f
copyright = ##f
}
Prima, das können wir verwenden! Gleich weiter zu den Kopf- und Fußzeilen:
\paper {
%% Kopfzeilen auf ungeraden Seiten mit Abfrage "nicht-erste-Seite":
oddHeaderMarkup = \markup \abs-fontsize #11 \fill-line {
\on-the-fly #not-first-page \fromproperty #'header:composer
\on-the-fly #not-first-page \fromproperty #'header:title
\on-the-fly #not-first-page \fromproperty #'header:instrument
\on-the-fly #not-first-page \fromproperty #'header:piece
\on-the-fly #print-page-number-check-first \fromproperty #'page:page-number-string
}
%% für gerade Seiten gespiegelte Reihenfolge:
evenHeaderMarkup = \markup \abs-fontsize #11 \fill-line {
\on-the-fly #print-page-number-check-first \fromproperty #'page:page-number-string
\fromproperty #'header:piece
\fromproperty #'header:instrument
\fromproperty #'header:title
\fromproperty #'header:composer
}
%% Fußzeile erste Seite und ungerade Seiten
oddFooterMarkup = \markup \abs-fontsize #11 {
\on-the-fly #first-page \fill-line {
\concat { "Engraved with " \with-url #"http://www.lilypond.org/" {LilyPond.} " Edited by L. G. Fluß" }
}
\on-the-fly #not-first-page \fill-line {
"Edition LGF – II/2010"
}
}
}
Warum die Fußzeile für gerade Seiten fehlt? Gut aufgepasst! Man könnte es in den ersten Abschnitt noch mit hineinnehmen:
Wenn die geraden Kopf- bzw. Fußzeilen nicht definiert sind, werden stattdessen die Inhalte der ungeraden verwendet.
Abschließend möchte ich nicht unerwähnt lassen, dass alle hier aufgeführten Funktionen im LM und in der NR gut auffindbar und dokumentiert sind. Das Handling dieser Möglichkeiten klappt nicht von heute auf morgen, sondern kostet etliche Wochen Zeit: 80% Lesen, 20% Ausprobieren. Dieser Forumspost soll weder belehren noch vermeintliche Arroganz ausdrücken – es ist meine ganz persönliche Zusammenfassung eines durchaus komplexen LilyPond-Bereichs, der mir als Anfänger (und das liegt nicht etwa Jahrzehnte zurück) ebenso schwer fiel wie jedem, der erst seit kurzem in die Materie einzutauchen bereit ist. Ich möchte alle ausdrücklich ermutigen, immer weiter zu forschen und zu experimentieren und auch vermeintlich kleine (für einen selbst oft riesengroße) Erkenntnisse hier zu dokumentieren! Es geht mir selbst immer noch so, und ich mache aus meiner Erfahrung kein Geheimnis, sondern gebe mir größte Mühe, an allen Ecken und Enden Ansätze zu finden und Lösungen im Detail zu verbessern, um für alle Hilfesuchenden das maximal mögliche aus LilyPond herauszuholen. Es möge bitte verziehen werden, wenn eine Antwort auf Grund des Inhalts oder der Fragestellung nicht gerade üppig oder ausschweifend formuliert ist – häufig genügt auf eine kurze, eindeutige Frage eine ebenso kurze, präzise Antwort ohne Umschweife. Der eine brauch’s schnell und auf den Punkt, dem anderen gefällt vielleicht ein bisschen Plauderei. Das ist bei mir auch tagesformabhängig.
In diesem Sinne (wiederholt) ein weiteres, konstruktives Miteinander und weniger Überinterpretation der Forenposts,
Viele Grüße, Robert