LilyPond 記譜法リファレンス: 5.3.6 \offset コマンド

### 5.3.6 `\offset` コマンド

`\override`, `\tweak`, `\overrideProperty` コマンドによって Grob プロパティを新たな値にセットすることができますが、そのようなプロパティをデフォルトの値との相対関係で変更できると便利な場合があります。`\offset` コマンドはこのような目的のために使用することができます。

`\offset` の記法は:

>     [-]\offset property offsets item

このコマンドは、item によって指定される Grob の property プロパティのデフォルト値に、offsets の内容を加算します。

コマンドの記法によって、`\offset` は `\tweak` のように作用するか `\override` のように作用します。この使用法の差は `\offset` と用いられる Grob プロパティについてもう少し説明した後に示します。

#### オフセットできるプロパティ

全てではないですが、多くの Grob プロパティをオフセットすることができます。property がオフセットできない場合、オブジェクトは変更されず、警告が出力されます。このような場合には、代わりに `\override` や `\tweak` を用いてオブジェクトを変更する必要があります。

トライアンドエラーで、警告を手がかりにしてオフセットできるものとできないものを判別することができます。しかし、より系統的なアプローチも存在します。

次の基準は、プロパティが `\offset` で変更できるかどうかの目安になります:

- Grob の説明に‘デフォルト設定’が記述されているプロパティ。このようなプロパティは All layout objects に Grob 毎にリストアップされています。(これらは ‘`scm/define-grobs.scm`’ からも確認することができます。)
- 数値を取るプロパティ。具体的には `number`、`number` のリスト、`number-pair`、`number-pair-list` を取るものを指します。 All layout objects のページは、それぞれのプロパティが取るデータの型をリストアップしています。これはデフォルト設定が関数であっても問題ありません。
- ‘サブ プロパティ’ではないプロパティ。サブ プロパティとは、他のプロパティの中にあるプロパティを指します。
- 無限大にセットされていないプロパティ。正や負の無限大をオフセットする良い方法はありません。

次の例では、いくつかの Grob プロパティのオフセット可能性を、上の基準に基づいて判断します。

- オフセットできるプロパティ
  `Hairpin.height`

    このプロパティはサブ プロパティではなく、 Hairpin にリストアップされています。値については、‘dimension, in staff space’ を取り、デフォルト値は `0.6666` です—無限大ではない `number` となっています。

  `Arpeggio.positions`

    Arpeggio のページには、`positions` プロパティが ‘pair of numbers’ を取ると記述されています。デフォルト値は `ly:arpeggio::positions` となっています—これは、タイプセットの時に評価され、各 `Arpeggio` オブジェクトについて `number` のペアを返すコールバック関数です。

- オフセットできないプロパティ
  `Hairpin.color`

    Hairpin には、`color` がリストアップされていません。

  `Hairpin.circled-tip`

    Hairpin の `Hairpin.circled-tip` には、`boolean` の値を取るという記述があります。`boolean` は数値ではありません。

  `Stem.details.lengths`

    Stem の中にリストアップされており、デフォルト値が `number` のリストになっていますが、これは‘サブ プロパティ’です。‘ネストされたプロパティ’のオフセットには対応していません。

#### \offset を override として使う

item が Grob の名前 (例えば `Arpeggio` や `Staff.OttavaBracket`) である場合、`\offset` の結果は指定された Grob の `\override` となります。

>     \offset property offsets [context.]GrobName

‘override’ の形では、先頭のハイフンは必ず使われません。`\override` コマンドにハイフンが使われないのと同様です。

次の例では、最初の小節にあるデフォルト設定のアルペジオを、‘override’ 形でより和音全体に広がるようにオフセットします。アルペジオは上下に譜スペースの半分ずつ広がります。また、最初の和音について通常の方法で `positions` プロパティをオーバライドする例も示しています。この方法では端点を相対座標ではなく絶対座標で指定しなければならないため、‘譜スペースの半分だけ広げる’という目的を全く表現できていません。また、他の和音についてはまたサイズや位置が異なるため、それぞれに別の `\override` が必要です。

>     arpeggioMusic = {
>       <c' e' g'>\arpeggio <a' c'' e''>\arpeggio
>       <d' f' a' c''>\arpeggio <c' e' g' b' d'' f'' a''>\arpeggio
>     }

>     {
>       \arpeggioMusic
>       \bar "||"
>       \offset positions #'(-0.5 . 0.5) Arpeggio
>       \arpeggioMusic
>       \bar "||"
>       \once \override Arpeggio.positions = #'(-3.5 . -0.5)
>       <c' e' g'>1\arpeggio
>       \bar "||"
>     }

‘override’ の形では、`\offset` の前に `\once` や `\temporary` を置くことができ、`\revert` で元に戻すことができます ( Intermediate substitution functions を参照してください)。つまり、`\offset` は実際には property の `\override` を作成していることになります。

>     music = { c'8\< d' e' f'\! }

>     {
>       \music
>       \offset height 1 Hairpin
>       \music
>       \music
>       \revert Hairpin.height
>       \music
>       \bar "||"
>       \once \offset height 1 Hairpin
>       \music \music
>       \bar "||"
>       \override Hairpin.height = 0.2
>       \music
>       \temporary \offset height 2 Hairpin
>       \music
>       \music
>       \revert Hairpin.height
>       \music
>       \bar "||"
>     }

また、`\override` と同様に、`\offset` の ‘override’ 形は `\undo` や `\single` と使用することもできます:

>     longStem = \offset length 6 Stem

>     {
>      \longStem c'4 c''' c' c''
>      \bar "||"
>      \undo \longStem c'4 c''' c' c''
>      \bar "||"
>      \single \longStem c'4 c''' c' c''
>      \bar "||"
>     }

#### \offset を tweak として使う

item が音楽表記 (`(` や `\arpeggio` など) である場合、‘tweak’ が適用された音楽表記が出力されます。

>     [-]\offset [GrobName.]property offsets music-expression

‘tweak’ 形の `\offset` の記法は、`\tweak` コマンドそのものに似ています。引数の順番や、前に付くハイフンはそれと同様です。

次の例は、`BreathingSign` オブジェクトの縦位置を調整するために ‘tweak’ 形を用いています。これと、通常の `\tweak` コマンドによる例を見比べてください。記法は同一ですが、`\tweak` の出力はあまり直感的ではありません。なぜなら、`BreathingSign.Y-offset` が譜線の中央を原点として計算されるためです。`\offset` を使えば、`Y-offset` がどのように計算されているかを知る必要はありません。

>     {
>       c''4
>       \breathe
>       c''4
>       \offset Y-offset 2 \breathe
>       c''2
>       \tweak Y-offset 3 \breathe
>     }

前の例では、‘tweak’ されたオブジェクトはユーザの入力から直接作られています: `\breathe` コマンドは `BreathingSign` オブジェクトを明示的に作り出すためです。コマンドが対象にするオブジェクトが曖昧ではないため、オブジェクトの名前を指定する必要はありませんでした。しかし、オブジェクトが間接的に作られる場合には、Grob の名前を含める必要があります。これは `\tweak` コマンドと同様です。

次の例では、`Beam` オブジェクトの `positions` プロパティを `\offset` することで、連桁を 2 譜スペース分下にずらしています。

最初の `\offset` では、連桁を明示的に作り出すものが存在しないため、 Grob の名前が必要となります。次の `\offset` では、連桁が音楽表記 `[` によって手動で作り出されるため、Grob の名前は必要ではありません。(また、後者では `number-pair` の両方をオフセットするために、単一の `number` を用いる省略記法も示しています。)

>     {
>       c''8 g'' e'' d''
>       \offset Beam.positions #'(-2 . -2)
>       c''8 g'' e'' d''
>       c''8 g'' e'' d''
>       c''8-\offset positions #-2 [ g'' e'' d'']
>     }

#### 改行するスパナを \offset する

改行や改ページにまたがるスパナの一部分を個別に変更することもできます。このような場合、offsets はプロパティが要求する型のリストを取ります。

このように用いられる `\offset` コマンドは `\alterBroken` コマンドと類似しています。(改行するスパナを変更する を参照してください。) ただし、`\alterBroken` とは異なり、`\offset` に与えられる値は絶対値ではなく相対値となります。

次の例は、‘改行する’ `OttavaBracket` オブジェクトを、`staff-padding` プロパティにより移動します。プロパティは元々 `number` を取るため、offsets は `number` のリストを取り、改行によって分けられる 2 つの部分に対応します。1 行目のブラケットは、`staff-padding` のデフォルト値に `0` が加算されることになるため実質変更されません。2 行目のブラケットはデフォルトの高さから 3 譜スペースだけ上に移動します。高さのデフォルト値 (絶対値) は `2` ですが、位置をオフセットするためにこの値を知る必要はありません。

>     {
>       \offset staff-padding #'(0 3) Staff.OttavaBracket
>       \ottava #1
>       c'''2 c'''
>       \break
>       c'''2 c'''
>     }

次の例は、`Slur` オブジェクトの `control-points` プロパティをオフセットすることで `\shape` コマンドを模倣しています。ここでは、offsets は `number-pair-list` のリストとなり、それぞれの要素がスラーの一つの部分に対応します。この例では、形状を変更する に示した例と全く同じ結果を出力します。

>     {
>       c'4-\offset control-points #'(
>                    ((0 . 0) (0 . 0) (0 . 0) (0 . 1))
>                    ((0.5 . 1.5) (1 . 0) (0 . 0) (0 . -1.5))
>                   ) ( f'4 g' c''
>       \break
>       d'4 c'' f' c')
>     }

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

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