GNU LilyPond 学習マニュアル: 5.6.1 オブジェクトを移動させる

### 5.6.1 オブジェクトを移動させる

これを聞いて驚くかもしれませんが、LilyPond は完璧ではありません。いくつかの記譜要素が重なりある可能性があります。これは遺憾なことですが、実際にはごく稀です。通常、オブジェクトを移動させる必要性は読みやすさや美しさのためです – オブジェクトの周りにもう少しスペースを多く/少なくとった方がより良くなるといった場合です。

記譜要素の重なりを解決する主要なアプローチが 3 つあります。それらは以下の順番で考慮されるべきです:

1. 重なり合っているオブジェクトの 1 つの direction を 譜内部オブジェクト でリストアップした内部オブジェクトのための定義済みコマンドを用いて変更することになるかもしれません。符幹、スラー、連桁、タイ、強弱記号、テキスト、連符はこの方法で容易に再配置できるかもしれません。この方法の限界は配置の仕方の選択肢が 2 つしかないことであり、どちらも適当でないかもしれません。
2. LilyPond がレイアウト オブジェクトを配置するときに使用するオブジェクト プロパティを `\override` を用いて変更することになるかもしれません。オブジェクト プロパティに変更を加えることの利点は、(a) スペースをとる必要がある場合に他のいくつかのオブジェクトは自動的に移動させられます、(b) 1 回のオーバライドを同じオブジェクト タイプのインスタンスすべてに適用することができます。変更するプロパティには以下のものが含まれます:
   - `direction`

     これはすでに詳しくカバーされています – 譜内部オブジェクト を参照してください。

   - `padding`, `left-padding`, `right-padding`, `staff-padding`

     あるオブジェクトが配置されるとき、そのオブジェクトの `padding` プロパティが、そのオブジェクトとそのオブジェクトに最も隣接するオブジェクトの端との間に置かれる間隔を指定します。配置される最中のオブジェクトの `padding` 値が使用されるということに注意してください。すでに配置されたオブジェクトの `padding` 値は無視されます。`padding` によって指定された間隔は `side-position-interface` をサポートするオブジェクトすべてに適用することができます。

     臨時記号のグループの配置は、`padding` の代わりに、`left-padding` と `right-padding` によって制御されます。これらのプロパティは `AccidentalPlacement` オブジェクトの中にあり、注意すべきことに、そのオブジェクトは Staff コンテキストの中にあります。譜刻プロセスでは、符頭が最初に譜刻され、臨時記号 (がある場合は) が次に符頭の左側に付け加えられます。このとき、臨時記号と符頭の間隔は `right-padding` プロパティによって指定されます。そのため、`AccidentalPlacement` オブジェクトの `right-padding` プロパティだけが臨時記号の配置に影響を与えます。

     `staff-padding` プロパティは `padding` プロパティと深い関わりがあります: `padding` プロパティは、`side-position-interface` をサポートするオブジェクトとそれに最隣接する他のオブジェクト (一般には音符や譜線) との間のスペースの最小量を制御します。一方、`staff-padding` は常に譜の外側に配置されるレイアウト オブジェクトにのみ適用されます – これは譜の外側に配置されるオブジェクトと譜の間に挿入されるべきスペースの最小量を制御します。`staff-paddin` は譜ではなく音符との相対関係で配置されるオブジェクトには影響を与えないということに注意してください。そのようなオブジェクトに対して `staff-padding` のオーバライドを行ったとしてもエラーは起きないかもしれませんが、無視されます。

     あなたが再配置しようとしているオブジェクトに対して求められる `padding` プロパティはどれなのかを見つけるには、内部リファレンスに戻ってそのオブジェクトのプロパティを調べる必要があります。`padding` プロパティはあなたが再配置しようとしているオブジェクトの中には無いかもしれないということに注意してください。その場合は、そのオブジェクトに関係があるオブジェクトを調べてください。

     すべての `padding` 値は譜スペースで測られます。たいていのオブジェクトでは、この値はデフォルトで約 1.0 かそれ以下にセットされています (それぞれのオブジェクトで値はさまざまです)。間隔を大きく (あるいは小さく) する必要がある場合、その値はオーバライドされるかもしれません。

   - `self-alignment-X`

     このプロパティを使うことで、親オブジェクトの参照ポイントに従って、オブジェクトを左、右、中央に揃えることができます。このプロパティは `self-alignment-interface` をサポートするオブジェクトすべてに対して使用することができます。一般に、テキストを保持するオブジェクトです。値は `Left`, `RIGHT`, `CENTER` です。代替手段として、`-1` から `+1` までの数値を指定することもできます。`-1` は左揃えであり、`+1` は右揃え、その間の数値は左揃えから右揃えへのテキストを移動させます (訳者: `-0.5` であれば、左揃えと中央揃えの中間ということ)。`1` よりも大きな数値を指定することでテキストをさらに左へ、`-1` よりも小さな数値を指定することでテキストをさらに右へ移動させることができます。この値を `1` 増減することによる移動量はそのテキストの長さの半分です。

   - `extra-spacing-width`

     このプロパティは `item-interface` をサポートするオブジェクトすべてで利用可能です。このプロパティは 2 つの数値をとり、最初の数値はオブジェクトの左側に余白を追加し、2 番目の数値はオブジェクトの右側に余白を追加します。負値はオブジェクトの端を左に移動させ、正値は右に移動させます。そのため、オブジェクトを広くするには、最初の数値を負値にして、2 番目の数値を正値にする必要があります。すべてのオブジェクトが両方の数値を遵守するわけではないということに注意してください。例えば、`Accidental` オブジェクトは最初の数値 (左端) にしか注意を払いません。

   - `staff-position`

     `staff-position` は `staff-symbol-referencer-interface` のプロパティです。これは、譜との相対関係で配置されるオブジェクトによってサポートされます。このプロパティはオブジェクトの垂直方向の位置を、譜の中央にある譜線から譜スペースの半分を単位として、指定します。このプロパティは複数小節に亘る休符、タイ、異なるボイスの中にある音符といったレイアウト オブジェクトの衝突を解決する場合に有用です。

   - `horizontal-shift`

     ボイスの中で、同じタイミングにある全ての音符は 1 つの音符列にグループ化され、`NoteColumn` オブジェクトがその音符のグループの水平位置をコントロールするために作成されます (ボイスを明示的にインスタンス化する の “Note columns” を参照してください)。 もし 1 つの Staff コンテキストにある 2 つ以上の音符列が、同じタイミングで出現し同じ向きの符幹を持つ場合に限り、それらの `horizontal-shift` プロパティの値が順位を付けるために使用され、高い順位にあるものが優先的に符頭の衝突を避けるために移動します。このプロパティは `\voiceXXX` コマンドによってセットされ、`\override` コマンドで直接上書きすることができますが、通常は `\shiftOn` コマンドによって上書きします。注意しなければならないことは、このプロパティは移動の 順位 を決定するだけだけであり、移動の大きさを決定するものではないということです。 移動の大きさは、順位ごとに符頭の幅を基にして 1 つずつ大きくなっていきます。1 つ分の幅は通常符頭の幅の半分ですが、それで近い場合には符頭 1 つ分の幅になります。

   - `force-hshift`

     `force-hshift` プロパティは `NoteColumn` のプロパティです (実際には `note-column-interface` のプロパティです)。このプロパティを変更することで、音符列が重なってしまう場合において音符列を移動させることができます。重ならない音符列には効果が無いということに注意してください。移動の量は音符列特有の単位、すなわち最初のボイスの中にある音符の符頭の幅で指定されます。 このプロパティは、通常の `\shiftOn` コマンド (ボイスを明示的にインスタンス化する を参照してください) が音符の衝突を十分に解決できないような複雑な状況で使用されるべきです。この目的のためには、`extra-offset` プロパティを用いるよりも `force-hshift` プロパティを用いる方が好ましいです。なぜなら、譜スペースを単位とした距離を算出する必要が無く、`NoteColumn` の内外に音符を移動させることは符頭のマージといった他のアクションに影響を与えるからです。

3. 最後に、他の方法がすべて失敗した場合、オブジェクトを手動で譜の中央線からの垂直方向の相対位置に従って、あるいは新たに設定した位置との距離に従って、再配置することになるかもしれません。この方法の欠点は、再配置のための正確な値を算出する必要がある – しばしば、その算出はそれぞれのオブジェクトに対して個々に、トライ＆エラーで行われます – 必要があるということ、さらに、この方法による移動は LilyPond が他のオブジェクトをすべて配置した後に行われるため、ユーザはその結果として起こるかもしれない衝突をすべて回避する責任があるということです。しかし、この方法の最大の問題点は、音楽が後で変更された場合に、再配置用の値を再び算出する必要があるということです。このタイプの手動再配置のために使用されるプロパティは以下のようなものです:
   `extra-offset`

     このプロパティは `grob-interface` をサポートするレイアウト オブジェクトのいずれかに適用されます。このプロパティはペアになった数値をとり、それぞれの数値は水平方向と垂直方向の移動を指定します。負値はオブジェクトを左または下へ移動させます。単位は譜スペースです。この移動はオブジェクトの譜刻が完了した後に行われるため、あるオブジェクトを任意の位置へ、他のオブジェクトに影響を与えることなく、再配置することができます。

   `positions`

     このプロパティは、連桁、スラー、連符の傾きと高さを手動で調節するために最も有用なプロパティです。このプロパティはペアになった数値をとり、それぞれの数値は連桁、スラーなどの左端と右端の位置を譜の中央線との距離で指定します。単位は譜スペースです。けれども、スラーとフレージング スラーを任意の値で再配置することはできないということに注意してください。LilyPond はまずスラーが取り得る位置のリストを生成し、それからデフォルトでは “最良に見える” スラーを探します。`positions` がオーバライドされていた場合、そのリストの中からリクエストされた位置に最も近いスラーが選択されます。

あるオブジェクトがこれらのプロパティすべてを持っているわけではありません。内部リファレンスに行き、そのオブジェクトではどのプロパティが利用可能なのかを調べる必要があります。

ここで、衝突に関係しそうなオブジェクトをリスト アップします。内部リファレンスを調べるためのオブジェクト名を付けるので、それらのオブジェクトを移動させるのに使うプロパティを見つけ出すのに使ってください。

オブジェクト タイプ | オブジェクト名
--- | ---
アーティキュレーション (Articulation) | `Script`
連桁 (Beam) | `Beam`
強弱記号 (Dynamic) (垂直方向) | `DynamicLineSpanner`
強弱記号 (Dynamic) (水平方向) | `DynamicText`
運指法記号 (Fingering) | `Fingering`
リハーサル / テキスト記号 (Rehearsal / Text mark) | `RehearsalMark`
スラー (Slur) | `Slur`
テキスト – つまり、`^"text"` (Text) | `TextScript`
タイ (Tie) | `Tie`
連符 (Tuplet) | `TupletBracket`

#### LilyPond — 学習マニュアル v2.24.4 (安定版).