5.3.7 連想配列を変更する

ユーザが変更可能なプロパティの中には、内部的には 連想配列 として存在しているものがあります – 連想配列は キー のペアの配列を保持します。連想配列の構造は下記のとおりです:

'((キー1 . 値1)
  (キー2 . 値2)
  (キー3 . 値3)
  …)

ある連想配列がグラフィカル オブジェクト プロパティまたは \paper 変数である場合、その連想配列の個々のキーを、他のキーに影響を与えることなく、変更することができます。

例えば、譜グループの中にある隣り合う譜間のスペースを減らすには、StaffGrouper グラフィカル オブジェクトの staff-staff-spacing プロパティを使用します。このプロパティは 4 つのキー – basic-distance, minimum-distance, padding, それに stretchability – を持つ連想配列です。このプロパティの標準設定は、内部リファレンスの “Backend” セクションでリストアップされています (StaffGrouper を参照してください):

'((basic-distance . 9)
  (minimum-distance . 7)
  (padding . 1)
  (stretchability . 5))

譜間のスペースを小さくする方法の 1 つは、basic-distance キーの値 (9) を minimum-distance キーの値 (7) 近くまで減らすことです。個々のキーを変更するには、ネストされた宣言 を使います:

% デフォルトの譜間スペース
\new PianoStaff <<
  \new Staff { \clef treble c''1 }
  \new Staff { \clef bass   c1   }
>>

% 譜間スペースを減らします
\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   }
>>

[image of music]

ネストされた宣言は、プロパティの他のキーに変更を加えることなく、指定されたキー (上の例では basic-distance) を更新します。

今度は、譜を重ならない範囲でできる限り近づけたいとします。最も簡単な方法は、連想配列の 4 つのキーすべてを 0 にセットすることです。しかしながら、4 つのネストされた宣言を記述する必要はありません。1 つの宣言でプロパティを丸ごと再定義することができます:

\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   }
>>

[image of music]

連想配列の再定義でリストアップされなかったキーは、セットされなかった場合のデフォルト値 にリセットされます。staff-staff-spacing の場合、セットされなかったキーは 0 にリセットされます (stretchability は例外で、セットされなかった場合、basic-distance にリセットされます)。このため、以下の 2 つの宣言は等価です:

\override StaffGrouper.staff-staff-spacing =
  #'((basic-distance . 7))

\override StaffGrouper.staff-staff-spacing =
  #'((basic-distance . 7)
     (minimum-distance . 0)
     (padding . 0)
     (stretchability . 7))

連想配列の再定義でリストアップされなかったキーがあることにより、初期化ファイルでセットされたり、入力ファイルがコンパイルされるときに読み込まれた標準設定が (意図せずに) 削除される可能性があります。上の例では、paddingminimum-distance の標準設定 (scm/define-grobs.scm で定義されます) は、セットされなかった場合のデフォルト値 (両方とも 0) にリセットされます。プロパティや (任意のサイズ) 連想配列を定義した場合、セットされなかったキー値はすべて セットされなかった場合のデフォルト値 にリセットされます。そうすることを意図しているのでない限り、ネストされた宣言を用いてキー値を個々に更新する方が安全です。

Note: ネストされた宣言は、コンテキスト プロパティ連想配列 (beamExceptions, keyAlterations, timeSignatureSettings 等) に対しては機能しません。これらのプロパティを変更するには、連想配列として丸ごと再定義するしかありません。


LilyPond 記譜法リファレンス v2.25.22 (development-branch).