LilyPond 記譜法リファレンス: 5.3.7 連想配列を変更する

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

ネストされた宣言は、プロパティの他のキーに変更を加えることなく、指定されたキー (上の例では `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   }
>     >>

連想配列の再定義でリストアップされなかったキーは、セットされなかった場合のデフォルト値 にリセットされます。`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))

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

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

#### LilyPond — 記譜法リファレンス v2.22.2 (安定版).

- 2. 専門的な記譜法
- 3. 入出力全般
- 4. スペースの問題
- 5. デフォルトを変更する
- A. 付表
- B. カンニング ペーパー
- C. GNU Free Documentation License
- D. LilyPond コマンド インデックス
- E. LilyPond インデックス