### 3.3.4 Změna vlastností prostředí

Kontexte sind dafür verantwortlich, die Werte bestimmter Kontext-Eigenschaften zu speichern. Viele davon können verändert werden, um die Interpretation der Eingabe zu beeinflussen und die Ausgabe zu verändern. Kontexte werden mit dem `\set`-Befehl geändert. Er wird in Form

>     \set KontextBezeichnung.eigenschaftsBezeichnung = #Wert

verwendet, wobei KontextBezeichnung üblicherweise `Score`, `Staff` oder `Voice` ist. Der erste Teil kann auch ausgelassen werden; in diesem Fall wird der aktuelle Kontext (üblicherweise `Voice`) eingesetzt.

Die Bezeichnung von Kontexten-Eigenschaften besteht aus zwei Wörtern, die ohne Unterstrich oder Bindestrich verbunden sind. Alle außer dem ersten werden am Anfang groß geschrieben. Hier einige Beispiele der gebräuchlichsten Kontext-Eigenschaften. Es gibt sehr viel mehr.

eigenschaftsBezeichnung | Typ | Funktion | Beispiel-Wert
--- | --- | --- | ---
extraNatural | boolescher Wert | Wenn wahr, werden zusätzliche Auflösungszeichen vor Versetzungszeichen gesetzt. | `#t`, `#f`
currentBarNumber | Integer | Setzt die aktuelle Taktnummer. | `50`
doubleSlurs | boolescher Wert | Wenn wahr, werden Legatobögen über und unter die Noten gesetzt. | `#t`, `#f`
instrumentName | Text | Setzt die Instrumentenbezeichnung am Anfang eines Systems. | `"Cello I"`
fontSize | reale Zahl | Vergrößert oder verkleinert die Schriftgröße. | `2.4`
stanza | Text | Setzt den Text zu Beginn einer Strophe. | `"2"`

Ein boolescher Wert ist entweder wahr (`#t`) oder falsch (`#f`), ein Integer eine positive ganze Zahl, ein Real (reelle Zahl) eine positive oder negative Dezimalzahl, und Text wird in doppelte Anführungszeichen (Shift+2) eingeschlossen. Beachten Sie das Vorkommen des Rautenzeichens (`#`) an unterschiedlichen Stellen: als Teil eines booleschen Wertes vor dem `t` oder `f`, aber auch vor einem Wert in der `\set`-Befehlskette. Wenn ein boolescher Wert eingegeben werden soll, braucht man also zwei Rautenzeichen, z. B. `##t`.

Bevor eine Eigenschaft geändert werden kann, muss man wissen, in welchem Kontext sie sich befindet. Manchmal versteht das sich von selbst, aber in einigen Fällen kann es zunächst unverständlich erscheinen. Wenn der falsche Kontext angegeben wird, wird keine Fehlermeldung produziert, aber die Veränderung wird einfach nicht ausgeführt. `instrumentName` befindet sich offensichtlich innerhalb von einem `Staff`-Kontext, denn das Notensystem soll benannt werden. In dem folgenden Beispiel erhält das erste System korrekt die Instrumentenbezeichnung, das zweite aber nicht, weil der Kontext ausgelassen wurde.

>     <<
>       \new Staff \relative {
>         \set Staff.instrumentName = "Soprano"
>         c''2 c
>      }
>       \new Staff \relative {
>         \set instrumentName = "Alto"  % Wrong!
>         d'2 d
>      }
>     >>

Denken Sie daran, dass der Standardkontext `Voice` ist; in dem zweiten `\set`-Befehl wird also die Eigenschaft `instrumentName` im `Voice`-Kontext auf „Alto“, gesetzt, aber weil LilyPond diese Eigenschaft nicht im `Voice`-Kontext vermutet, passiert einfach gar nichts. Das ist kein Fehler, und darum wird auch keine Fehlermeldung produziert.

Ebenso gibt es keine Fehlermeldung, wenn die Kontext-Bezeichnung falsch geschrieben wird und die Änderung also nicht ausgeführt werden kann. Tatsächlich kann eine beliebige (ausgedachte) Kontextbezeichnung mit dem `\set`-Befehl eingesetzt werden, genauso wie die, die wirklich existieren. Aber wenn LilyPond diese Bezeichnung nicht zuordnen kann, bewirkt der Befehl einfach gar nichts. Manche Editoren, die Unterstützung für LilyPond-Befehle mitbringen, markieren existierende Kontextbezeichnungen mit einem Punkt, wenn man mit der Maus darüber fährt (wie etwa JEdit mit dem LilyPondTool), oder markieren unbekannte Bezeichnungen anders (wie ConTEXT). Wenn Sie keinen Editor mit LilyPond-Unterstützung einsetzen, wird empfohlen, die Bezeichnungen in der Interna-Referenz zu überprüfen: siehe Tunable context properties, oder Contexts.

Die Eigenschaft `instrumentName` wird erst aktiv, wenn sie in einem `Staff`-Kontext gesetzt wird, aber manche Eigenschaften können in mehr als einem Kontext benutzt werden. Als Beispiel mag die `extraNatural`-Eigenschaft dienen, die zusätzliche Erniedrigungszeichen setzt. Die Standardeinstellung ist ##t (wahr) in allen Systemen. Wenn sie nur in einem `Staff` (Notensystem) auf ##f (falsch) gesetzt wird, wirkt sie sich auf alle Noten in diesem System aus. Wird sie dagegen in der `Score`-Umgebung gesetzt, wirkt sich das auf alle darin enthaltenen Systeme aus.

Das also bewirkt, dass die zusätzlichen Erniedrigungszeichen in einem System ausgeschaltet sind:

>     <<
>       \new Staff \relative {
>         ais'2 aes
>       }
>       \new Staff \relative {
>         \set Staff.extraNatural = ##f
>         ais'2 aes
>       }
>     >>

während das dazu dient, sie in allen Systemen auszuschalten:

>     <<
>       \new Staff \relative {
>         ais'2 aes
>       }
>       \new Staff \relative {
>         \set Score.extraNatural = ##f
>         ais'2 aes
>       }
>     >>

Ein anderes Beispiel ist die Eigenschaft `clefTransposition`: wenn sie im `Score`-Kontext gesetzt wird, ändert sich sofort der Wert der Oktavierung in allen aktuellen Systemen und wird auf einen neuen Wert gesetzt, der sich auf alle Systeme auswirkt.

Der gegenteilige Befehl, `\unset`, entfernt die Eigenschaft effektiv wieder von dem Kontext: in den meisten Fällen wird der Kontext auf ihre Standardeinstellungen zurückgesetzt. Normalerweise wird aber `\unset` nicht benötigt, denn ein neues `\set` erledigt alles, was man braucht.

Die `\set`- und `\unset`-Befehle könne überall im Eingabequelltext erscheinen und werden aktiv von dem Moment, an dem sie auftreten bis zum Ende der Partitur oder bis die Eigenschaft mit `\set` oder `\unset` neu gesetzt wird. Versuchen wir als Beispiel, die Schriftgröße mehrmals zu ändern, was sich unter anderem auf die Notenköpfe auswirkt. Die Änderung bezieht sich immer auf den Standard, nicht vom letzten gesetzten Wert.

>     \relative {
>       c'4 d
>       % make note heads smaller
>       \set fontSize = #-4
>       e4 f |
>       % make note heads larger
>       \set fontSize = #2.5
>       g4 a
>       % return to default size
>       \unset fontSize
>       b4 c |
>     }

Wir haben jetzt gesehen, wie sich die Werte von unterschiedlichen Eigenschaften ändern lassen. Beachten Sie, dass Integer und Zahlen immer mit einem Rautenzeichen beginnen, während die Werte wahr und falsch (mit `##t` und `##f` notiert) immer mit zwei Rauten beginnen. Eine Eigenschaft, die aus Text besteht, muss in doppelte Anführungsstriche gesetzt werden, auch wenn wir später sehen werden, dass Text auf eine sehr viel allgemeinere und mächtigere Art mit dem `\markup`-Befehl eingegeben werden kann.

#### Kontexteigenschaften mit `\with` setzen

Die Standardwerte von Kontexteigenschaften können zu dem Zeitpunkt definiert werden, an welchem der Kontext erstellt wird. Manchmal ist das eine saubere Weise, eine Eigenschaft zu bestimmen, die für die gesamte Partitur erhalten bleichen soll. Wenn ein Kontext mit einem `\new`-Befehl erstellt wird, können in einer direkt folgenden `\with { .. }`-Umgebung die Eigenschaften bestimmt werden. Wenn also die zusätzlichen Auflösungszeichen für eine ganze Partitur gelten sollen, könnte man schreiben:

>     \new Staff \with { extraNatural = ##f }

etwa so:

>     <<
>       \new Staff
>         \relative {
>           gis'4 ges aes ais
>         }
>       \new Staff \with { extraNatural = ##f } {
>         \relative {
>           gis' ges aes ais
>         }
>       }
>     >>

Eigenschaften, die auf diese Arte gesetzt werden, können immer noch dynamisch mit dem `\set`-Befehl geändert werden und mit `\unset` auf ihre Standardeinstellungen zurückgesetzt werden, wie sie vorher in der `\with`-Umgebung definiert wurden.

Wenn also die `fontSize`-Eigenschaft in einer `\with`-Umgebung definiert wird, wird der Standardwert für die Schriftgröße festgelegt. Wenn dieser Wert später mit `\set` verändert wird, kann dieser neue Standardwert mit dem Befehl `\unset fontSize` wieder erreicht werden.

#### Kontexteigenschaften mit `\context` setzen

Die Werte von Kontext-Eigenschaften können in allen Kontexten eines bestimmten Typs (etwa alle `Staff`-Kontexte) gleichzeitig mit einem Befehl gesetzt werden. Der Kontext wird spezifiziert, indem seine Bezeichnung benutzt wird, also etwa `Staff`, mit einem Backslash davor: `\Staff`. Der Befehl für die Eigenschaft ist der gleiche, wie er auch in der `\with`-Konstruktion benutzt wird, wie oben gezeigt. Er wird in eine `\context`-Umgebung eingebettet, welche wiederum innerhalb von einer `\layout`-Umgebung steht. Jede `\context`-Umgebung wirkt sich auf alle Kontexte dieses Types aus, welche sich in der aktuellen Partitur befinden (d. h. innerhalb einer `\score`- oder `\book`-Umgebung). Hier ist ein Beispiel, wie man diese Funktion anwendet:

>     \score {
>       \new Staff {
>         \relative {
>           cis''4 e d ces
>         }
>       }
>       \layout {
>         \context {
>           \Staff
>           extraNatural = ##t
>         }
>       }
>     }

Wenn die Veränderung der Eigenschaft sich auf alle Systeme einer `score`-Umgebung beziehen soll:

>     \score {
>       <<
>         \new Staff {
>           \relative {
>             gis'4 ges aes ais
>           }
>         }
>         \new Staff {
>           \relative {
>             gis'4 ges aes ais
>           }
>         }
>       >>
>       \layout {
>         \context {
>           \Score extraNatural = ##f
>         }
>       }
>     }

Kontext-Eigenschaften, die auf diese Weise gesetzt werden, können für bestimmten Kontexte überschrieben werden, indem die `\with`-Konstruktion eingesetzt wird, oder mit `\set`-Befehlen innerhalb der aktuellen Noten.

#### Podívejte se také na

Notationsreferenz: Die Standardeinstellungen von Kontexten ändern, Der set-Befehl.

Referenz der Interna: Contexts, Tunable context properties.

#### LilyPond – Learning Manual v2.22.1 (Stálá větev).