+@node unpure-pure コンテナ
+@subsection unpure-pure コンテナ
+@translationof Unpure-pure containers
+
+@cindex Scheme, pure containers (Scheme pure コンテナ)
+@cindex Scheme, unpure containers (Scheme unpure コンテナ)
+@cindex pure containers, Scheme (Scheme pure コンテナ)
+@cindex unpure containers, Scheme (Scheme unpure コンテナ)
+@cindex horizontal spacing, overriding (水平方向のスペースを上書きする)
+
+unpure-pure コンテナは @emph{Y-axis} スペース - 特に @code{Y-offset} と
+@code{Y-extent} - の算出を文字 (つまり、数字やペア) ではなく、Scheme 関数で@c
+上書きする際に有用です。
+
+ある特定のグラフィカル オブジェクトでは、@code{Y-extent} は @code{stencil}
+プロパティをベースにしていて、それらの @code{stencil} プロパティを上書きする場合は
+unpure-pure コンテナで @code{Y-extent} も上書きする必要があります。@c
+関数が @code{Y-offset} と/または @code{Y-extent} を上書きした場合、@c
+その関数はコンパイルの最中に改行の算出を早すぎるタイミングで引き起こすと見なされます。@c
+そのため、その関数はまったく評価されず (通常、@samp{0} または @samp{'(0 . 0)} の@c
+値を返します)、結果として衝突を引き起こすことがあります。@c
+@q{pure} 関数はプロパティ、オブジェクト、あるいはグラフィカル オブジェクトの消失に@c
+影響を与えないため、その関数の Y-axis に関する評価は常に正しく行われます。
+
+現在のところ @q{pure} と見なされる関数が約 30 あり、Unpure-pure コンテナを用いて
+@q{pure} ではない関数を @q{pure} な関数としてセットすることができます。@c
+@q{pure} 関数は改行の @emph{前に} 評価されるため、水平方向のスペースを
+@q{正しいタイミングで} 調節することができます。@c
+@q{unpure} 関数は改行の @emph{後に} 評価されます。
+
+@warning{@q{pure} な関数を常に把握していることは困難なので、作成する @q{pure}
+関数ではグラフィカル オブジェクト @code{Beam} や @code{VerticalAlignment} を@c
+使わないことをおすすめします。}
+
+unpure-pure コンテナは以下のように構築します:
+
+@code{(ly:make-unpure-pure-container f0 f1)}
+
+ここで @code{f0} は @var{n} (@var{n >= 1}) 個の引数を取る関数であり、最初の引数@c
+は常にグラフィカル オブジェクトである必要があります。@c
+これが実際に結果を返す関数です。@c
+@code{f1} は @q{pure} であると見なされる関数であり、@var{n + 2} 個の引数を@c
+取ります。@c
+@code{f1} も最初の引数は常にグラフィカル オブジェクトである必要があり、2 番目と
+3 番目の引数は @q{start} と @q{end} です。
+
+@q{start} と @q{end} は事実上、@code{Spanners} (つまり、@code{Hairpin} や
+@code{Beam}) だけで問題となるダミー値であり、
+@var{start} and @var{end} are, for all intents and purposes, dummy
+values that only matter for @code{Spanners} (i.e @code{Hairpin} or
+@code{Beam}), that can return different height estimations based on a
+starting and ending column.
+
+@code{f1} の残りの引数は @code{f0} の引数と同じです (@var{n = 1} である場合は@c
+残りの引数はありません)。
+
+関数 @code{f1} の結果は概算であり、@code{f0} が実際の値を得るのに用いられます。@c
+@code{f0} の結果はもっと後のスペースの処理で微調整に用いられます。
+
+@lilypond[verbatim,quote,ragged-right]
+#(define (square-line-circle-space grob)
+(let* ((pitch (ly:event-property (ly:grob-property grob 'cause) 'pitch))
+ (notename (ly:pitch-notename pitch)))
+ (if (= 0 (modulo notename 2))
+ (make-circle-stencil 0.5 0.0 #t)
+ (make-filled-box-stencil '(0 . 1.0)
+ '(-0.5 . 0.5)))))
+
+squareLineCircleSpace = {
+ \override NoteHead.stencil = #square-line-circle-space
+}
+
+smartSquareLineCircleSpace = {
+ \squareLineCircleSpace
+ \override NoteHead.Y-extent =
+ #(ly:make-unpure-pure-container
+ ly:grob::stencil-height
+ (lambda (grob start end) (ly:grob::stencil-height grob)))
+}
+
+\new Voice \with { \remove "Stem_engraver" }
+\relative c'' {
+ \squareLineCircleSpace
+ cis4 ces disis d
+ \smartSquareLineCircleSpace
+ cis4 ces disis d
+}
+@end lilypond
+
+最初の小節では unpure-pure コンテナを用いていないため、スペース算出エンジンは符頭の@c
+幅を知ることができず、符頭と臨時記号が衝突しています。@c
+次の小節では unpure-pure コンテナを用いているため、スペース算出エンジンは符頭の幅を@c
+知ることができ、それに応じて小節の幅を増やすことで衝突を回避しています。
+
+通常、簡単な計算では、unpure-pure コンテナの @q{unpure} パートと @q{pure} パート@c
+の両方に、引数の数とスコープを変えただけのほとんど同じ関数を用いることができます。
+
+@warning{@q{pure} と見なした関数が @q{pure} でなかった場合、予期しない結果となる@c
+ことがあります。}
+
+