@c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
@ignore
- Translation of GIT committish: aa632c095138aaaa0f50f73c90e72efb4b61d745
+ Translation of GIT committish: 06f227dd80f3a30cbf33c879b7c125079dfaf5c3
When revising a translation, copy the HEAD committish of the
version that you are working on. For details, see the Contributors'
Guide, node Updating translation committishes..
@end ignore
-@c \version "2.13.36"
+@c \version "2.15.20"
@c Translators: Till Paala
die in LilyPond möglich sind. Es existiert als ein HTML-Dokumente, das
sich
@c leave the @uref as one long line.
-@uref{http://@/lilypond@/.org/@/doc/@/stable/@/Documentation/@/user/@/lilypond@/-internals/,on@/-line},
+@uref{http://@/lilypond@/.org/@/doc/@/stable/@/Documentation/@/internals/,on@/-line},
aber auch lokal in das LilyPond-Dokumentationspaket integriert lesen lässt.
Intern benutzt LilyPond Scheme (ein LISP-Dialekt), um eine Infrastruktur
zur Verfügung zu stellen. Wenn Layoutentscheidungen verändert werden
sollen, müssen auf die programminternen Prozesse zugegriffen werden,
wozu Scheme-Code benötigt wird. Scheme-Abschnitte werden in einer
-LilyPond-Quelldatei mit einer Raute @code{#} begonnen (siehe auch
-@rlearning{Scheme-Übung}).
+LilyPond-Quelldatei mit einer Raute@tie{}@code{#} begonnen.@footnote{@rextend{Scheme-Übung} enthält eine kurze Übung, wie
+man Zahlen, Listen, Zeichenketten und Symbole in Scheme notiert.}
@menu
* Umgebungs-Plugins verändern::
* Die Standardeinstellungen von Kontexten ändern::
* Neue Kontexte definieren::
-* Kontexte aneinander ausrichten::
+* Reihenfolge des Kontextlayouts::
@end menu
@rlearning{Kontexte und Engraver}.
Installierte Dateien:
-@file{ly/@/engraver@/-init@/.ly},
-@file{ly/@/performer@/-init@/.ly}.
+@file{ly/engraver-init.ly},
+@file{ly/performer-init.ly}.
Schnipsel:
@rlsr{Contexts and engravers}.
Systemen. Jede Stimme wird auf einem eigenen System notiert, das
mit @code{\new Staff} begonnen wird.
-@lilypond[quote,verbatim,relative=2,ragged-right,fragment]
+@lilypond[quote,verbatim,relative=2,ragged-right]
<<
\new Staff { c4 c }
\new Staff { d4 d }
Diese Variante wird bei musikalischen Ausdrücken benutzt, die auf
verschiedenen Ebenen interpretiert werden können. Beispielsweise
der @code{\applyOutput}-Befehl (siehe
-@ref{Eine Funktion auf alle Layout-Objekte anwenden}). Ohne einen
+@rextend{Eine Funktion auf alle Layout-Objekte anwenden}). Ohne einen
expliziten @code{\context} wird die Ausgabe normalerweise einem
@code{Voice}-Kontext zugewiesen:
nicht nur Eigenschaften, sie enthalten auch Plugins (@qq{engraver}
genannt), die die einzelnen Notationselemente erstellen. Ein
@code{Voice}-Kontext enthält beispielsweise einen
-@code{Note_head_engraver}, der die Notenköpfe erstellt, und ein
-@code{Staff}-Kontext einen @code{Key_signature_engraver}, der die
+@code{Note_heads_engraver}, der die Notenköpfe erstellt, und ein
+@code{Staff}-Kontext einen @code{Key_engraver}, der die
Vorzeichen erstellt.
Eine vollständige Erklärung jedes Plugins findet sich in
@code{Clef_engraver} (Engraver für den Schlüssel) aus dem
@code{Staff}-Kontext entfernt werden:
-@lilypond[quote,relative=1,verbatim,fragment]
+@lilypond[quote,relative=1,verbatim]
<<
\new Staff {
f2 g
Veränderungen können auch für den @code{Score}- oder alle
@code{Voice}-Kontexte auf gleiche Weise vorgenommen werden.
-@knownissues
+Kontextänderungen können in eine Variable geschrieben werden und dann
+einer @code{\context}-Definition zu gewiesen werden, indem man der
+Veränderung ein @code{\with} voranstellt:
-Es ist nicht möglich, Kontextänderungen als Variable zu definieren und
-sie dann in der @code{\context}-Definition anzuwenden, indem man die
-Variable aufruft.
+@lilypond[quote,verbatim]
+blubb = \with {
+ fontSize = #-4
+ \override Stem #'thickness = #4.0
+ \remove "Time_signature_engraver"
+}
-Der Befehl @code{\Staff \RemoveEmptyStaves} überschreibt die
-aktuellen Einstellungen für @code{Staff}. Wenn die Einstellungen
-für Systeme verändert werden sollen, die @code{\Staff \RemoveEmptyStaves}
-benutzen, müssen die Veränderungen gemacht werden, nachdem
-@code{\Staff \RemoveEmptyStaves} aufgerufen wurde, etwa:
+bla = \with {
+ fontSize = #3
+ \override Stem #'thickness = #-2.0
+}
-@example
-\layout @{
- \context @{
- \Staff \RemoveEmptyStaves
+melody = \relative c'' {
+ a4 a a a |
+ a4 a a a |
+}
- \override Stem #'thickness = #4.0
- @}
-@}
-@end example
+\score {
+ <<
+ \new Staff <<
+ \melody
+ s1*0^"Small, thicker stems, no time signature"
+ >>
+ \new Staff \bla <<
+ \melody
+ s1*0^"Different"
+ >>
+ >>
+ \layout {
+ \context {
+ \Staff
+ \blubb
+ }
+ }
+}
+@end lilypond
+ @c TODO: add \with in here.
+
@node Neue Kontexte definieren
@subsection Neue Kontexte definieren
squashedPosition = #0
\override NoteHead #'style = #'slash
\override Stem #'transparent = ##t
+ \override Flag #'transparent = ##t
\alias Voice
}
\context { \Staff
@example
\override NoteHead #'style = #'slash
\override Stem #'transparent = ##t
+\override Flag #'transparent = ##t
@end example
Alle diese Engraver müssen zusammenarbeiten, und das wird erreicht mit
squashedPosition = #0
\override NoteHead #'style = #'slash
\override Stem #'transparent = ##t
+ \override Flag #'transparent = ##t
\alias Voice
@}
@end example
@end example
-@node Kontexte aneinander ausrichten
-@subsection Kontexte aneinander ausrichten
-@translationof Aligning contexts
-
-Neue Kontexte können über oder unter existierenden ausgerichtet
-werden. Das kann nützlich sein, wenn man eine Chorparitur
-oder Ossia schreiben will:
-
-@cindex Ossia
-
-@funindex alignAboveContext
-@funindex alignBelowContext
-
-@lilypond[quote,ragged-right]
-ossia = { f4 f f f }
-\score{
- \relative c' \new Staff = "main" {
- c4 c c c
- <<
- \new Staff \with { alignAboveContext = #"main" } \ossia
- { d8 f d f d f d f }
- >>
- }
-}
-@end lilypond
-
-@cindex verschachtelte Kontexte
-@cindex Kontexte, verschachtelt
+@node Reihenfolge des Kontextlayouts
+@subsection Reihenfolge des Kontextlayouts
+@translationof Context layout order
+@cindex Kontext, Layoutreihenfolge
@funindex \accepts
-@funindex accepts
@funindex \denies
-@funindex denies
-Kontexte wie @code{PianoStaff} können andere Kontexte innerhalb
-enthalten. Kontexte, die als innere Kontexte akzeptiert werden,
-werden in einer @qq{accepts}-Liste für den bestimmten Kontext
-definiert. Kontexte, die sich nicht in dieser Liste finden,
-werden unter den äußeren Kontext gesetzt. Der
-@code{PianoStaff}-Kontext etwa akzeptiert die Kontexte @code{Staff}
-und @code{FiguredBass} innerhalb, aber beispielsweise keinen
-@code{Lyrics}-(Gesangstext)-Kontext. In dem folgenden Beispiel
-wird deshalb der Gesangstext unter das gesamte Klaviersystem
-gesetzt, anstatt zwischen die beiden Notensysteme zu kommen:
+Kontexte werden in einer Systemgruppe normalerweise von oben nach
+unten positioniert in der Reihenfolge, wie sie in der Quelldatei
+auftreten. Wenn Kontext verschachtelt ewrden, enthält der äußere
+Kontexte geschachtelte innere Kontexte, wie in der Quelldatei
+angegeben, vorausgesetzt, die inneren Kontexte befinden sich auch
+in der @qq{accepts}-Liste. Geschachtelte Kontexte, die nicht
+in dieser @qq{accepts}-Liste enthalten sind, werden unterhalb
+des äußeren Kontextes neu positioniert, anstatt innerhalb von ihm
+gesetzt zu werden.
+
+Die @qq{accepts}-Liste eines Kontextes kann mit dem Befehlen
+@code{\accepts} und @code{\denies} verändert werden. @code{\accepts}
+fügt einen Kontext zur @qq{accepts}-Liste, und @code{\denies}
+entfernt einen Kontext aus der Liste. Akkordbezeichnungen sollen
+beispielsweise normalerweise nicht innerhalb eines @code{Staff}-Kontextes
+geschachtelt werden, sodass der @code{ChordNames}-Kontext nicht
+automatisch in der @qq{accepts}-Liste des @code{Staff}-Kontextes
+geführt ist. Wenn er aber benötigt wird, kann er hinzugefügt werden:
-@lilypond[verbatim,quote,relative=1]
-\new PianoStaff
-<<
- \new Staff { e4 d c2 }
- \addlyrics { Three blind mice }
+@lilypond[verbatim,quote]
+\score {
\new Staff {
- \clef "bass"
- { c,1 }
+ c' d' e' f'
+ \chords { d1:m7 b1:min7.5- }
}
->>
+}
@end lilypond
-Die @qq{accepts}-Liste eines Kontextes kann verändert werden, so
-dass sie weitere innere Kontexte akzeptiert. Wenn also der
-Gesangstext als Teil eines Klaviersystems gesetzt werden soll,
-müsste man schreiben:
-
-@lilypond[verbatim,quote,relative=1]
-\new PianoStaff \with { \accepts Lyrics }
-<<
- \new Staff { e4 d c2 }
- \addlyrics { Three blind mice }
+@lilypond[verbatim,quote]
+\score {
\new Staff {
- \clef "bass"
- { c,1 }
+ c' d' e' f'
+ \chords { d1:m7 b1:min7.5- }
}
->>
+ \layout {
+ \context {
+ \Staff
+ \accepts "ChordNames"
+ }
+ }
+}
@end lilypond
-Das Gegenteil von @code{\accepts} ist @code{\denies}; es bedeutet,
-dass ein Kontext aus der @code{\accepts}-Liste gestrichen wird.
+@code{\denies} wird vorrangig eingesetzt, wenn ein neuer Kontext
+basierend auf einem existierenden erstellt wird, aber sein
+Schachtelungsverhalten sich unterscheidet. Der
+@code{VaticanaStaff}-Kontext beispielsweise basiert auf dem
+@code{Staff}-Kontext, hat aber den @code{VaticanaVoice}-Kontext
+anstellt des @code{Voice}-Kontexts in seiner @qq{accepts}-Liste.
+
+Zur Erinnerung: ein Kontext wird automatisch erstellt, wenn ein
+Befehl auftritt, der in den aktuellen Kontexten nicht enthalten
+sein kann. Dass kann zu unerwarteten neuen Systemgruppen oder Partituren
+führen.
+
+@seealso
+Handbuch zur Benutzung:
+@rprogram{Ein zusätzliches System erscheint}.
+
+Installierte Dateien:
+@file{ly/engraver-init.ly}.
@node Die Referenz der Programminterna erklärt
Folgende Aufgabe wird bearbeitet: Der Fingersatz aus dem Beispiel
unten soll verändert werden:
-@lilypond[quote,fragment,relative=2,verbatim]
+@lilypond[quote,relative=2,verbatim]
c-2
\stemUp
f
Es wurde immer von einem @code{Fingering}-Objekt gesprochen, aber
eigentlich handelt es sich nicht um sehr viel. Die Initialisierungsdatei
-@file{scm/@/define@/-grobs@/.scm} zeigt den Inhalt dieses @qq{Objekts}
+@file{scm/define-grobs.scm} zeigt den Inhalt dieses @qq{Objekts}
(zu Information, wo diese Dateien sich finden siehe
@rlearning{Mehr Information}):
Die Position der @b{2} aus dem Beispiel unten soll also geändert werden:
-@lilypond[quote,fragment,relative=2,verbatim]
+@lilypond[quote,relative=2,verbatim]
c-2
\stemUp
f
Wenn dieser Befehl in den Quelltext eingefügt wird, bevor der
Fingersatz notiert ist, erhält man folgendes:
-@lilypond[quote,relative=2,fragment,verbatim]
+@lilypond[quote,relative=2,verbatim]
\once \override Voice.Fingering #'padding = #3
c-2
\stemUp
* Der override-Befehl::
* Der tweak-Befehl::
* set versus override::
+* Alisten verändern::
@end menu
das gerade aktuelle Notensystem aus. Andere Systeme behalten
ihr normales Aussehen. Hier ein Beispiel mit diesem Befehl:
-@lilypond[quote,verbatim,relative=2,fragment]
+@lilypond[quote,verbatim,relative=2]
c4
\override Staff.Stem #'thickness = #4.0
c4
@code{Voice}-Kontext angenommen wird. Mit einem zusätzlichen
@code{\once} wirkt sich die Änderung nur einmal aus:
-@lilypond[quote,fragment,verbatim,relative=2]
+@lilypond[quote,verbatim,relative=2]
c4
\once \override Stem #'thickness = #4.0
c4
schon geschrieben werden, bevor das Objekt begonnen wird. In dem
folgenden Beispiel
-@lilypond[quote,fragment,verbatim,relative=2]
+@lilypond[quote,verbatim,relative=2]
\override Slur #'thickness = #3.0
c8[( c
\override Beam #'beam-thickness = #0.6
\set @var{Kontext}.@var{Eigenschaft} = #@var{Wert}
@end example
-@var{Wert} ist ein Scheme-Objekt, weshalb ihm @code{#} vorangestellt
+@var{Wert} ist ein Scheme-Objekt, weshalb ihm@tie{}@code{#} vorangestellt
werden muss.
Kontexteigenschaften werden üblicherweise mit @code{kleinGroßbuchstabe}
Kontexteigenschaft @code{skipBars} (Takte überspringen) auf @code{#t}
(wahr) gesetzt wird:
-@lilypond[quote,verbatim,relative=2,fragment]
+@lilypond[quote,verbatim,relative=2]
R1*2
\set Score.skipBars = ##t
R1*2
üblicherweise @code{ChordNames}, @code{Voice} oder
@code{Lyrics}.
-@lilypond[quote,verbatim,relative=2,fragment]
+@lilypond[quote,verbatim,relative=2]
\set Score.autoBeaming = ##f
<<
{
bezieht, die Eigenschaft sich aber im @code{Score}-Kontext
befindet:
-@lilypond[quote,verbatim,relative=2,fragment]
+@lilypond[quote,verbatim,relative=2]
R1*2
\set skipBars = ##t
R1*2
Kontext rückgängig. Wenn also im @code{Staff}-Kontext die
Bebalkung ausgeschaltet wird:
-@lilypond[quote,verbatim,relative=2,fragment]
+@lilypond[quote,verbatim,relative=2]
\set Score.autoBeaming = ##t
<<
{
Einstellungen, die nur einmal vorgenommen werden sollen, können
mit @code{\once} notiert werden, etwa:
-@lilypond[quote,verbatim,relative=2,fragment]
+@lilypond[quote,verbatim,relative=2]
c4
\once \set fontSize = #4.7
c4
Es gibt eine besondere Art von Kontexteigenschaft: die Grob-Beschreibung.
Grob-Beschreibungen werden mit @code{GroßGroßbuchstabe} benannt. Sie
enthalten @qq{Standardeinstellungen} für ein bestimmtes Grob als eine
-assoziative Liste. Siehe @file{scm/@/define@/-grobs@/.scm} für die
+assoziative Liste. Siehe @file{scm/define-grobs.scm} für die
Einstellungen aller Grob-Beschreibungen. Grob-Beschreibungen werden
mit @code{\override} verändert.
Beispielsweise kann die Dicke eines Notenhalses verändert werden, indem
man die @code{thickness}-Eigenschaft des @code{Stem}-Objekts verändert:
-@lilypond[quote, verbatim, relative=2, fragment]
+@lilypond[quote, verbatim, relative=2]
c4 c
\override Voice.Stem #'thickness = #3.0
c4 c
Wenn kein Kontext angegeben wird, wird der tiefste aktuelle Kontext
benutzt:
-@lilypond[quote, verbatim, relative=2, fragment]
+@lilypond[quote, verbatim, relative=2]
{ \override Staff.Stem #'thickness = #3.0
<<
{
Die Auswirkungen von @code{\override} können mit @code{\revert} wieder
rückgängig gemacht werden:
-@lilypond[quote, verbatim, relative=2, fragment]
+@lilypond[quote, verbatim, relative=2]
c4
\override Voice.Stem #'thickness = #3.0
c4 c
Die Auswirkungen von @code{\override} und @code{\revert} wirken sich auf alle
Grobs im entsprechenden Kontext aber der Stelle aus, an der sie gesetzt werden:
-@lilypond[quote, verbatim, relative=2, fragment]
+@lilypond[quote, verbatim, relative=2]
{
<<
{
@code{\once} kann zusammen mit @code{\override} benutzt werden,
um nur den aktuellen Zeitwert zu verändern:
-@lilypond[quote, verbatim, relative=2, fragment]
+@lilypond[quote, verbatim, relative=2]
{
<<
{
Viele Eigenschaften können unabhängig von der Art der Daten, die
sie enthalten, ausgeschaltet werden, indem man sie als @qq{falsch}
-(@code{##f}) definiert. Dadurch wird diese Eigenschaft von LilyPond
+(@code{#f}) definiert. Dadurch wird diese Eigenschaft von LilyPond
ignoriert. Das ist insbesondere nützlich, wenn man Grob-Eigenschaften
ausschalten will, die Probleme verursachen.
@end ignore
+
@seealso
Referenz der Interna:
Der Strom der musikalischen Ereignisse (engl. music stream), der aus
dem Quelltext erstellt wird, und zu dem auch die automatisch eingefügten
Elemente gehören, kann betrachtet werden, siehe
-@ref{Musikalische Funktionen darstellen}. Das kann nützlich sein,
+@rextend{Musikalische Funktionen darstellen}. Das kann nützlich sein,
wenn man herausfinden will, was mit dem @code{\tweak}-Befehl
verändert werden kann.
@subsection @code{\\set} versus @code{\\override}
@translationof set versus override
-TODO: überflüssig?
+@c TODO: überflüssig?
@ignore
Es wurden zwei unterschiedliche Methoden vorgestellt, mit denen
@code{GroßGroß} benannt (beginnen also auch mit einem
Großbuchstaben). Sie beinhalten die Standardeinstellungen
für die besagten graphischen Objekte in Form einer
-Assosiationsliste. Siehe auch die Datei @file{scm/@/define@/-grobs@/.scm}
+Assosiationsliste. Siehe auch die Datei @file{scm/define-grobs.scm}
für ein Beispiel zu diesen Einstellungen. Elementbeschreibungen
können mit dem Befehl @code{\override} verändert werden.
@end ignore
+@node Alisten verändern
+@subsection Alisten verändern
+@translationof Modifying alists
+
+Einige vom Benutzer einstellbare Eigenschaften sind intern als
+@emph{alists} (Assoziative Listen) dargestellt, die Paare von
+Schlüsseln und Werten speichern. Die Struktur einer Aliste ist:
+
+@example
+'((@var{Schlüssel1} . @var{Wert1})
+ (@var{Schlüssel2} . @var{Wert2})
+ (@var{Schlüssel3} . @var{Wert3})
+ @dots{})
+@end example
+
+Wenn eine Aliste eine Grob-Eigenschaft oder eine Variable der
+@code{\paper}-Umgebung ist, können ihre Schlüssel einzeln verändert
+werden, ohne andere Schlüssel zu beeinflussen.
+
+Um beispielsweise den Freiraum zwischen benachbarten Systemen
+in einer Systemgruppe zu verkleinern, kann man die
+@code{staff-staff-spacing}-Eigenschaft des
++@code{StaffGrouper}-Grobs benutzen. Die Eigenschaft ist eine
+Aliste mit vier Schlüsseln: : @code{basic-distance} (Grund-Abstand),
+@code{minimum-distance} (minimaler Abstand), @code{padding} (Verschiebung)
+und @code{stretchability} (Dehnbarkeit). Die Standardwerte dieser
+Eigenschaft finden sich im Abschnitt @qq{Backend} der Referenz der
+Interna (siehe @rinternals{StaffGrouper}):
+
+@example
+'((basic-distance . 9)
+ (minimum-distance . 7)
+ (padding . 1)
+ (stretchability . 5))
+@end example
+
+Eine Möglichkeit, die Systemen dichter zueinander zu zwingen,
+ist es, der Wert des @code{basic-distance}-Schlüssels (@code{9}) zu
+verändern, sodass der den gleichen Wert wie
+@code{minimum-distance} (@code{7}) hat. Um einen einzelnen
+Schlüssel zu verändern, wird ein geschachtelter Aufruf benutzt:
+
+@lilypond[quote,verbatim]
+% default space between staves
+\new PianoStaff <<
+ \new Staff { \clef treble c''1 }
+ \new Staff { \clef bass c1 }
+>>
+
+% reduced space between staves
+\new PianoStaff \with {
+ % this is the nested declaration
+ \override StaffGrouper #'staff-staff-spacing #'basic-distance = #7
+} <<
+ \new Staff { \clef treble c''1 }
+ \new Staff { \clef bass c1 }
+>>
+@end lilypond
+
+Wenn man diese Art des geschachtelten Aufrufs einsetzt, wird der
+spezifische Schlüssel (@code{basic-distance} im obigen Beispiel) verändert,
+ohne dass sich andere Wert für die gleiche Eigenschaft ändern würden.
+
+Nun sollen die Systeme so dicht wie möglich gesetzt werden, ohne das
+Überlappungen vorkommen. Die einfachste Möglichkeit, das zu tun, wäre
+es, alle vier Wert auf 0 zu setzen. Man muss jedoch nicht vier
+Werte definieren, sondern die Eigenschaft
+kann mit einem Aufruf als Aliste vollständig verändert werden:
+
+@lilypond[quote,verbatim]
+\new PianoStaff \with {
+ \override StaffGrouper #'staff-staff-spacing =
+ #'((basic-distance . 0)
+ (minimum-distance . 0)
+ (padding . 0)
+ (stretchability . 0))
+} <<
+ \new Staff { \clef treble c''1 }
+ \new Staff { \clef bass c1 }
+>>
+@end lilypond
+
+Dabei sollte beachtet werden, dass alle Schlüssel, die bei dieser
+Weise des Aufrufs nicht explizit aufgelistet sind, auf den Standardwert
+gesetzt werden, den sie hätten, wenn sie nicht definiert werden.
+Im Falle von @code{staff-staff-spacing} würden alle nicht genannten
+Schlüsselwerte auf 0 gesetzt (außer @code{stretchability}, welche immer
+den Wert von @code{space} hat, wenn sie nicht definiert ist). Somit sind
+folgende Aufrufe äquivalent:
+
+@example
+\override StaffGrouper #'staff-staff-spacing =
+ #'((basic-distance . 7))
+
+\override StaffGrouper #'staff-staff-spacing =
+ #'((basic-distance . 7)
+ (minimum-distance . 0)
+ (padding . 0)
+ (stretchability . 7))
+@end example
+
+Eine möglicherweise ungewollte Konsequenz hiervon ist, dass alle
+Standardwerte, die etwa in einer Initialisierungsdatei
+zu Beginn einer LilyPond-Partitur geladen werden, nach dem Aufruf
+rückgängig gemacht werden. Im obigen Beispiel werden die
+initialisierten Standardwerte für @code{padding} und @code{minimum-distance}
+(definiert in @file{scm/define-grobs.scm}) auf den Standard zurückgesetzt,
+den sie uninitialisiert hätten (0 in beiden Fällen). Wenn eine Eigenschaft oder
+Variable in Form einer Aliste (jeder Größe) definiert wird, werden
+immer alle Schlüsselwerte auf den uninitialisierten Zustand zurückgesetzt.
+Es ist also sicherer, geschachtelte Aufrufe zu benutzen, wenn man nicht
+bewusst alle Werte zurücksetzen will.
+
+@warning{Geschachtelte Aufrufe funktionieren nicht mit
+Kontexteigenschaften (wie etwa @code{beamExceptions}, @code{keySignature},
+@code{timeSignatureSettings}, usw.) Diese Eigenschaften können
+nur verändert werden, indem man sie vollständig als Alisten umdefiniert.}
+
+
@node Nützliche Konzepte und Eigenschaften
@section Nützliche Konzepte und Eigenschaften
@translationof Useful concepts and properties
@menu
* Eingabe-Modi::
* Richtung und Platzierung::
-* Reihenfolge des Kontextlayouts::
* Abstände und Maße::
* Eigenschaften des Staff-Symbols::
* Strecker::
@item @code{\markup}-(Textbeschriftungs-)Befehlen
@item @code{\tag}-Befehlen
@item Textbeschriftungen in reiner Textform, wie etwa @code{-"string"}
-@item Fingersatzanweisungen: @code{-1}
-@item Abkürzungen von Artikulationen, wie @code{-.}, @code{->}, @code{--}
+@item Fingersatzanweisungen: @w{@code{-1}}
+@item Abkürzungen von Artikulationen, wie @w{@code{-.}}, @w{@code{->}}, @w{@code{--}}
@end itemize
Ausrichtungsmarkierer haben nur eine Auswirkung auf die nächste Note:
Der Wert der @code{direction}-Eigenschaft kann auf den Wert
@code{1} gesetzt werden, was gleichbedeutend mit @qq{nach oben}
-bzw. @qq{oberhalb} ist, oder auf den Wert @code{-1}, was
+bzw. @qq{oberhalb} ist, oder auf den Wert @w{@code{-1}}, was
@qq{nach unten} bzw. @qq{unterhalb} bedeutet. Die Symbole
@code{UP} und @code{DOWN} können anstelle von @code{1}
-und @code{-1} benutzt werden. Die Standardausrichtung kann
+und @w{@code{-1}} benutzt werden. Die Standardausrichtung kann
angegeben werden, indem @code{direction} auf den Wert
@code{0} oder @code{CENTER} gesetzt wird. In vielen Fällen
bestehen auch vordefinierte Befehle, mit denen die Ausrichtung
vorkommende Beispiel darstellt, entscheidet der Wert von
@code{direction}, ob das Objekt auf der rechten oder linken
Seite das Ursprungsobjektes ausgegeben wird. In diesem Fall
-bedeutet @code{-1} oder @code{LEFT} @qq{auf der linken Seite}
+bedeutet @w{@code{-1}} oder @code{LEFT} @qq{auf der linken Seite}
und @code{1} oder @code{RIGHT} @qq{auf der rechten Seite}. @code{0}
oder @code{CENTER} bedeutet @qq{benutze Standardausrichtung}.
c2( c)
@end lilypond
-
-@node Reihenfolge des Kontextlayouts
-@subsection Reihenfolge des Kontextlayouts
-@translationof Context layout order
-
-@cindex Kontexte, Reihenfolge
-
-Kontexte werden normalerweise in einer Notensystemgruppe dargestellt,
-von oben nach unten in der Reihenfolge, in der sie
-in der Eingabedatei auftreten. Wenn Kontexte verschachtelt sind,
-enthält der äußere Kontext die inneren geschachtelten Kontexte,
-wie in der Eingabedatei angegeben, vorausgesetzt die inneren
-Kontexte befinden sich in der @qq{accepts}-Liste des äußeren
-Kontextes. Verschachtelte Kontexte, die nicht in dieser Liste
-auftauchen, werden neu unter den äußeren Kontext angeordnet, anstatt
-dass sie innerhalb dieses Kontextes gesetzt werden.
-
-Es ist wichtig zu erinnern, dass ein Kontext implizit erstellt
-werden kann, wenn ein Befehl vorkommt und kein passender Kontext
-zur Verfügung steht, um den Befehl auszuführen. Dadurch können
-unerwartet neue Systeme oder Partituren erstellt werden.
-
-Die Standardreihenfolge, in der die Kontexte gesetzt werden und
-die @qq{accepts}-Liste können geändert werden, siehe auch
-@ref{Aligning contexts}.
+In polyphoner Musik ist es normalerweise besser, eine explizite
+Stimme (@code{voice} zu erstellen, als die Richtung eines Objektes zu
+ändern. Zu mehr Information siehe @ref{Mehrere Stimmen}.
@seealso
-Handbuch zum Lernen
-@rlearning{An extra staff appears}.
+Handbuch zum Lernen:
+@rlearning{within-staff (Objekte innerhalb des Notensystems)}.
+
+Notationsreferenz:
+@ref{Mehrere Stimmen}.
@node Abstände und Maße
skalierbaren Einheiten (siehe folgenden Absatz) definiert
werden, indem man den Befehl @code{\staff-space} an die
Zahl hängt. Das Seitenlayout ist genauer beschrieben in
-@ref{Seitenformatierung}.
+@ref{Seitenlayout}.
Skalierbare Abstände werden immer in Einheiten von
Notenlinienabständen angegeben, oder seltener in halben
@rlearning{Länge und Dicke von Objekten}.
Notationsreferenz:
-@ref{Seitenformatierung},
+@ref{Seitenlayout},
@ref{Die Notensystemgröße einstellen}.
@item attach-dir
Das entscheidet, wo die Linie auf der X-Achse beginnt und endet,
-relativ zum Elternobjekt. Ein Wert @code{-1} (oder
+relativ zum Elternobjekt. Ein Wert @w{@code{-1}} (oder
@code{LEFT}) lässt die Linie an der linken Seite der Noten
beginnen/enden, mit der sie verknüpft ist.
um @i{cresc.}, @i{tr} oder andere Texte an horizontale
Strecker zu setzen.
-@lilypond[quote,ragged-right,fragment,relative=2,verbatim]
+@lilypond[quote,ragged-right,relative=2,verbatim]
\override TextSpanner #'(bound-details left text)
= \markup { \small \bold Slower }
c2\startTextSpan b c a\stopTextSpan
Dabei sollte beachtet werden, dass negative Werte das Objekt
nach @emph{oben} verschieben, anders als man erwarten könnte,
-weil der Wert @code{-1} oder @code{DOWN} bedeutet, dass
+weil der Wert @w{@code{-1}} oder @code{DOWN} bedeutet, dass
die @emph{Unterkante} des Textes mit der Streckerlinie
ausgerichtet wird. Ein Wert @code{1} oder @code{UP}
richtet die Oberkante des Textes mit der Streckerlinie aus.
@code{to-barline} auf wahr gesetzt ist und eine Taktlinie
vor der nächsten Note erscheint.
-@lilypond[verbatim,quote,ragged-right,relative=2,fragment]
+@lilypond[verbatim,quote,ragged-right,relative=2]
\endSpanners
c2 \startTextSpan c2 c2
\endSpanners
@code{1} für @code{layer} hat, nach den Notenlinien gesetzt
(die einen Wert von @code{0} für @code{layer} haben) und
überschneidet sie also. Um das zu ändern, muss dem @code{Clef}-Objekt
-(Notenschlüssel) ein niedrigerer Wert, etwa @code{-1}, gegeben
+(Notenschlüssel) ein niedrigerer Wert, etwa @w{@code{-1}}, gegeben
werden, sodass es früher gesetzt wird:
@lilypond[quote,verbatim,relative=2]
wo kein Zeilenumbruch auftritt oder nach einem Zeilenumbruch.
Die acht möglichen Kombinationen können auch durch vordefinierte
-Funktionen bestimmt werden, welche in der Datei @file{scm/@/output@/-lib@/.scm}
+Funktionen bestimmt werden, welche in der Datei @file{scm/output-lib.scm}
definiert sind. Die letzten drei Spalten der folgenden Tabelle
zeigen an, ob das Layout-Objekt an einer bestimmten Position
sichtbar sein wird oder nicht:
Das kleine Oktavierungssymbol von oktavierten Notenschlüsseln
wird durch das @code{OctavateEight}-Layout-Objekt erstellt.
-Seine Sichtbarkeit wird unabhängig vom @code{Clef}-Objekt
-bestimmt, sodass notwendige Veränderungen von @code{break-visibility}
-sowohl für @code{Clef} als auch für @code{OctavateEight} vorgenommen
-werden müssen, damit derartige Schlüssel entfernt werden.
+Seine Sichtbarkeit wird automatisch vom @code{Clef}-Objekt
+geerbt, sodass Veränderungen von @code{break-visibility}
+des @code{OctavateEight}-Layout-Objekts nicht auch noch
+für unsichtbare Schlüssel zusätzlich vorgenommen werden müssen.
Bei expliziten Schlüsseländerungn kontrolliert die
@code{explicitClefVisibility}-Eigenschaft wohl das
@seealso
Handbuch zum Lernen:
-@rlearning{Sichtbarkeit und Farbe von Objekten}
+@rlearning{Sichtbarkeit und Farbe von Objekten}.
@node Linienstile
@end lilypond
Der Wert von @code{Y} wird für den rechten Endpunkt auf
-@code{-2} gesetzt. Die linke Seite kann ähnlich angepasst
+@w{@code{-2}} gesetzt. Die linke Seite kann ähnlich angepasst
werden, indem man @code{left} anstelle von @code{right} angibt.
Wenn @code{Y} nicht gesetzt ist, wird der Wert ausgehend von
werden muss, unterscheidet sich je nach Objekt.
@menu
-* Drehen von Objekten::
+* Drehen von Layout-Objekten::
* Textbeschriftung drehen::
@end menu
-@node Drehen von Objekten
-@unnumberedsubsubsec Drehen von Objekten
+@node Drehen von Layout-Objekten
+@unnumberedsubsubsec Drehen von Layout-Objekten
@translationof Rotating layout objects
@cindex Drehen von Objekten
* Vertikale Gruppierung der grafischen Objekte („grob“s)::
* stencils verändern::
* Formen verändern::
+* Reine und unreine Container::
@end menu
Notationsreferenz:
@ref{Die Referenz der Programminterna erklärt},
-@ref{Eigenschaften verändern},
-@ref{Schnittstellen für Programmierer}.
+@ref{Eigenschaften verändern}.
+
+Erweitern:
+@rextend{Schnittstellen für Programmierer}.
Installierte Dateien:
-@file{scm/@/define@/-grobs@/.scm}.
+@file{scm/define-grobs.scm}.
Schnipsel:
@rlsr{Tweaks and overrides}.
X-Gesamtausdehnung des Objekts. Negative Werte verschieben
das Objekt nach rechts, positive nach links. Ein Wert von
@code{0} zentriert das Objekt auf dem Referenzpunkt des
-Ursprungs, ein Wert von @code{-1} richtet die linke Ecke des
+Ursprungs, ein Wert von @w{@code{-1}} richtet die linke Ecke des
Objekts am Referenzpunkt des Ursprungsobjektes aus, ein
Wert von @code{1} richtet die rechte Ecke des Objektes am
Referenzpunkt des Ursprungsobjektes aus. Die Symbole
@code{LEFT}, @code{CENTER} und @code{RIGHT} können anstelle
-von @code{-1, 0, 1} eingesetzt werden.
+von @w{@code{-1}}, @code{0} und @code{1} eingesetzt werden.
Normalerweise würde der @code{\override}-Befehl benutzt werden, um
die Werte von @code{self-alignment-X} zu verändern, aber der
Wert für einige Objekte richtig anzupassen. Die Einheiten
sind Halbe der vertikalen Ausdehnung des Objektes, welche
normalerweise recht klein ist, sodass ziemlich große Werte
-erforderlich sein können. Der Wert @code{-1} richtet die
+erforderlich sein können. Der Wert @w{@code{-1}} richtet die
untere Kante des Objekts am Referenzpunkt des Ursprungsobjektes
aus, der Wert @code{0} richtet die Mitte des Objekts am
Referenzpunkt des Ursprungsobjektes aus und der Wert @code{1}
richtet die Oberkante des Objektes am Referenzpunkt des
Ursprungsobjektes aus. Die Symbole @code{DOWN}, @code{CENTER}
-und @code{UP} können anstelle von @code{-1, 0, 1} benutzt
-werden.
+und @code{UP} können anstelle von @w{@code{-1}}, @code{0}
+und @code{1} benutzt werden.
@emph{Automatische Ausrichtung in beide Richtungen}
mit dem @code{\musicglyph}-Befehl erreicht werden.
Siehe auch @ref{Die Feta-Schriftart}.
-
-
@seealso
Notationsreferenz:
@ref{Graphische Notation innerhalb einer Textbeschriftung},
@ref{Text formatieren},
-@ref{Text markup commands},
+@ref{Textbeschriftungsbefehle},
@ref{Die Feta-Schriftart}.
@lilypond[verbatim,quote,relative=1]
<<
- { e1 ~ e }
+ { e1~ e }
\\
{ r4 <g c,> <g c,> <g c,> }
>>
{
\once \override Tie
#'control-points = #'((1 . -1) (3 . 0.6) (12.5 . 0.6) (14.5 . -1))
- e1 ~ e1
+ e1~ e1
}
\\
- { r4 <g c,> <g c,> <g c,>4 }
+ { r4 <g c,> <g c,> <g c,> }
>>
@end lilypond
Es ist nicht möglich, die Form von Bögen anhand ihrer
@code{control-points}-Eigenschaft zu verändern, wenn
-mehr als ein Bogen zum gleichen musikalischen Moment
-auftritt, nicht einmal mit dem @code{\tweak}-Befehl.
+mehrere Binde- oder Legatobögen zum gleichen musikalischen Moment
+auftreten, nicht einmal mit dem @code{\tweak}-Befehl. Die Eigenschaft
+@code{tie-configuration} von @code{TieColumn} kann jedoch verändert
+werden, sodass Startlinie und Richtung wie benötigt platziert werden.
+@seealso
+Referenz der Interna:
+@rinternals{TieColumn}.
+
+
+@cindex Scheme, reine Container
+@cindex Scheme, unreine Container
+@cindex reine Container, Scheme
+@cindex unreine Container, Scheme
+@cindex horizontale Platzierung, verändern
+
+@node Reine und unreine Container
+@subsection Reine und unreine Container
+@translationof Unpure-pure containers
+
+Unreine und reine Container (engl. unpure/pure containers) sind
+nützlich, wenn man die Berechnungen der Platzierungen für die
+@emph{Y-Achse} verändern will, insbesondere für @code{Y-offset}
+und @code{Y-extent}. Mit diesen Containern kann die Veränderung
+durch eine Scheme-Funktion anstelle einer direkten Zahl oder eines
+Paares vorgenommen werden.
+
+Für bestimmte Grobs basiert die Eigenschaft @code{Y-extent} auf
+der @code{stencil}-Eigenschaft. Wenn diese mit @code{\override}
+verändert werden soll, braucht man eine zusätzliche Veränderung
+von @code{Y-extent} mit einem unreinen-reinen Container. Wenn eine
+Funktion @code{Y-offset} und/oder @code{Y-extent} verändert, wird
+angenommen, dass dadurch Zeilenumbruchsberechnungen zu früh während
+der Kompilation aufgerufen werden. Die Funktion wird also überhaupt
+nicht ausgewertet (und gibt also normalerweise den Wert @samp{0} oder
+@samp{'(0 . 0)} zurück), wodurch sich Zusammenstöße ergeben können.
+Eine @qq{saubere} Funktion beeinflusst keine Eigeschaften, Objekte
+oder Grob-Suizide, weshalb ihre Werte, die sich auf @code{Y-axis}
+beziehen, richtig berechnet werden.
+
+Es gibt zuzeit etwa 30 Funktionen, die schon als @qq{sauber} erachtet
+werden, und unsaubere-saubere Container sind eine Möglichkeit, auch
+Funktionen, die sich nicht auf dieser Liste befinden, als @qq{sauber}
+zu markieren. Die @qq{saubere} Funktion wird ausgewertet, @emph{bevor}
+Seitenumbruch stattfindet, sodass die horizontale Platzierung
+@qq{rechtzeitig} stattfindet. Die @qq{unsaubere} Funktion wird dann
+@emph{nach} dem Seitenumbruch ausgewertet.
+
+@warning{Da es schwierig ist, immer sicher zu sein, welche Funktionen sich
+auf dieser Liste befinden, wird empfohlen, dass die selbsterstellten
+@qq{sauberen} Funktionen nicht die Grobs @code{Beam} oder @code{VerticalAlignment}
+einsetzen.}
+
+Ein unsauberer-sauberer Container wird wie folgend erstellt:
+
+@code{(ly:make-unpure-pure-container f0 f1)}
+
+wobei @code{f0} eine Fuktion ist, die @var{n} Arguments braucht
+(@var{n >= 1}) und deren erstes Argument immer der Grob sein muss.
+Das ist die Funktion, die das eigentliche Resultat ausgibt. @var{f1}
+ist die Funktion, die als @qq{sauber} bezeichnet wird, und braucht @var{n + 2}
+Argumente. Wiederum muss das erste Argument immer der Grob sein, aber
+das erste und zweite Argument sind @qq{Beginn-} und @qq{Endeargumente}.
+
+
+
+@var{start} (Beginn) und @var{end} (Ende) sind absichtlich
+nur Platzhalter, die nur für die Strecker gelten (etwa @code{Hairpin} oder
+@code{Beam}), die unterschiedliche Höhenberechnungen je nach beginnender und
+endender Note ausgeben können.
+
+Der Rest sind andere Argumente für die erste Funktion (es können auch
+Null sein, wenn @var{n = 1}).
+
+Die Ergebnisse der zweiten Funktion werden als Näherungswert des benötigten
+Wertes benutzt, welche dann von der ersten Funktion eingesetzt wird,
+um den wirklichen Wert auszugeben, mit dem dann sehr viel später im
+Layoutprozess die Platzierung justiert werden soll.
+
+@lilypond[verbatim,quote,ragged-right]
+#(define (square-line-circle-space grob)
+(let* ((pitch (ly:event-property (ly:grob-property grob 'cause) 'pitch))
+ (notename (ly:pitch-notename pitch)))
+ (if (= 0 (modulo notename 2))
+ (make-circle-stencil 0.5 0.0 #t)
+ (make-filled-box-stencil '(0 . 1.0)
+ '(-0.5 . 0.5)))))
+
+squareLineCircleSpace = {
+ \override NoteHead #'stencil = #square-line-circle-space
+}
+
+smartSquareLineCircleSpace = {
+ \squareLineCircleSpace
+ \override NoteHead #'Y-extent =
+ #(ly:make-unpure-pure-container
+ ly:grob::stencil-height
+ (lambda (grob start end) (ly:grob::stencil-height grob)))
+}
+
+\new Voice \with { \remove "Stem_engraver" }
+\relative c'' {
+ \squareLineCircleSpace
+ cis4 ces cisis c
+ \smartSquareLineCircleSpace
+ cis4 ces cisis c
+}
+@end lilypond
+
+Im ersten Takt weiß die Layoutmaschine ohne den unsauberen-sauberen
+Container nicht die Breite des Notenkopfes und lässt ihn deshalb mit
+den Versetzungszeichen zusammenstoßen. Im zweiten Takt, mit
+unreinen-reinen Containern, weiß die Layoutmaschine die Breite
+des Notenkopfes und vermeidet den Zusammenstoßf, indem die Zeile
+entsprechend verlängert wird.
+
+Normalerweise können für eine einfache Berechnungen fast identische
+Funktionen für den @qq{unsauberen} und @qq{sauberen} Teil benutzt
+werden, indem nur die Zahl der Argumente und die Reichweite der
+Funktion verändert wird.
+
+@warning{Wenn eine Funktion als @qq{sauber} bezeichnet ist und das aber
+nicht ist, können unerwartete Ergebnisse auftreten.}
@node Musikfunktionen benutzen
@menu
* Syntax der Ersetzungsfunktion::
-* Beispiele der Ersetzungsfunktion::
+* Beispiele der Ersetzungsfunktionen::
@end menu
@node Syntax der Ersetzungsfunktion
den Wert @code{#t} ausgibt.
@item @code{@var{@dots{}Noten@dots{}}}
-@tab normale LilyPond-Eingab, wobei @code{$} benutzt wird, um
+@tab normale LilyPond-Eingabe, wobei @code{$} (wenn nur LilyPond-Konstruktionen
+erlaubt sind) oder @code{#} (um es als Scheme-Wert oder Argument einer
+musikalischen Funktionen einzusetzen) benutzt wird, um
Argumente zu referenzieren (etwa @samp{$Arg1}).
@end multitable
-
Die @code{parser} und @code{location}-Argumente sind zwingend und
werden in einigen fortgeschrittenen Situationen benutzt, wie sie
im @qq{Erweitern}-Handbuch beschrieben werden (siehe
@example
boolean?
cheap-list? @emph{(benutze anstelle von }@q{list?}@emph{ für schnelleres Kompilieren)}
+ly:duration?
ly:music?
+ly:pitch?
markup?
number?
pair?
(parser location padding)
(number?)
#{
- \once \override TextScript #'padding = $padding
+ \once \override TextScript #'padding = #padding
#})
\relative c''' {
(parser location padding tempotext)
(number? string?)
#{
- \once \override Score.MetronomeMark #'padding = $padding
- \tempo \markup { \bold $tempotext }
+ \once \override Score.MetronomeMark #'padding = #padding
+ \tempo \markup { \bold #tempotext }
#})
\relative c'' {