先に述べたように,
2
つの隣り合ったクラスタ,Nq
とNp
の間には,ペナルティ,\vadjust
,whatsit
など,行組版には関係しないものがある.模式的に表すと,cluster
Nq ⟶
(a)
⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞penalty
𝑝 ⟶ ⋯ ⟶ whatsit ⟶ clusterNp
*38大雑把に言えば,kcatcodeが奇数であるようなJAcharを約物として考えていることになる.kcatcodeの最下位ビッ トはこのjcharwidowpenalty用にのみ利用される.
のようになっている.間の
(a)
に相当する部分には,何のノードもない場合ももちろんあり得る.そうして,
JFM
グルー挿入後には,この2
クラスタ間は次のようになる:cluster
Nq ⟶
(a)
⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞⏞penalty
𝑝 + 𝑥 ⟶ ⋯ ⟶ whatsit ⟶ glue or kern
右空白 ⟶ clusterNp
以後,典型的な例として,クラスタNqとNpが共に和文Aである場合を見ていこう,この場合 が全ての場合の基本となる.
■「右空白」の算出 まず,「右空白」にあたる量を算出する.通常はこれが,隣り合った
2
つの JAchar間に入る空白量となる.JFM由来[M]
JFM
の文字クラス指定によって入る空白を以下によって求める.この段階で空白量 が未定義(未指定)だった場合,デフォルト値kanjiskipを採用することとなるので,次へ.1.
もし両クラスタの間で\inhibitglue
が実行されていた場合(証としてwhatsit
ノードが自 動挿入される),代わりにkanjiskipが挿入されることとなる.次へ.2. Nq
とNp
が同じJFM
・同じjfmvar
キー・同じサイズの和文フォントであったならば,共通 に使っているJFM
内で挿入される空白(グルーかカーン)が決まっているか調べ,決まって いればそれを採用.3. 1.
でも2.
でもない場合は,JFM
・jfmvar
・サイズの3
つ組はNq
とNp
で異なる.この場合,まず
𝑔𝑏 ∶=
(Nq
と「使用フォントがNq
のそれと同じで,文字コードが
Np
のそれの文字」との間に入るグルー/カーン)
𝑔𝑎 ∶=「使用フォントが
( Np
のそれと同じで,文字コードが
Nq
のそれの文字」とNp
との間に入るグルー/カーン)
として,前側の文字のJFM
を使った時の空白(グルー/カーン)と,後側の文字のJFM
を 使った時のそれを求める.gb, ga
それぞれに対する⟨ratio
⟩の値を𝑑𝑏,
𝑑𝑎とする.• ga
とgb
の両方が未定義であるならば,JFM
由来のグルーは挿入されず,kanjiskipを採 用することとなる.どちらか片方のみが未定義であるならば,次のステップでその未定 義の方は長さ0
のkern
で,⟨ratio
⟩の値は0
であるかのように扱われる.•
diffrentjfmの値がpleft, pright, paverage
のとき,⟨ratio
⟩の指定に従って比例配分を 行う.JFM
由来のグルー/カーンは以下の値となる:𝑓( 1 − 𝑑𝑏
2
gb
+1 + 𝑑𝑏2
ga
,1 − 𝑑𝑎2
gb
+1 + 𝑑𝑎 2ga
) ここで.𝑓 (𝑥, 𝑦)は
𝑓 (𝑥, 𝑦) =
⎧⎪
⎨⎪
⎩
𝑥
if
diffrentjfm=pleft
; 𝑦if
diffrentjfm=pright
; (𝑥 + 𝑦)/2if
diffrentjfm=paverage
;.
•
differentjfm がそれ以外の値の時は,⟨ratio
⟩ の値は無視され,JFM
由来のグルー/カーンは以下の値となる:
𝑓 (
gb
,ga
)ここで.𝑓 (𝑥, 𝑦)は
𝑓 (𝑥, 𝑦) =
⎧⎪
⎪⎨
⎪⎪
⎩
min
(𝑥, 𝑦)if
diffrentjfm=small
;max
(𝑥, 𝑦)if
diffrentjfm=large
; (𝑥 + 𝑦)/2if
diffrentjfm=average
; 𝑥 + 𝑦if
diffrentjfm=both
;.
例えば,
\jfont\foo=psft:Ryumin-Light:jfm=ujis;-kern
\jfont\bar=psft:GothicBBB-Medium:jfm=ujis;-kern
\jfont\baz=psft:GothicBBB-Medium:jfm=ujis;jfmvar=piyo;-kern という
3
フォントを考え,𝑝
⏞⏞⏞⏞⏞⏞⏞glyph
\foo, ‘あ’ ⟶
𝑞
⏞⏞⏞⏞⏞⏞⏞glyph
\bar, ‘い’ ⟶
𝑟
⏞⏞⏞⏞⏞⏞⏞glyph
\baz, ‘う’
という
3
ノードを考える(それぞれ単独でクラスタをなす).この場合,𝑝と𝑞の間は,実フォ ントが異なるにもかかわらず2.
の状況となる一方で,𝑞と𝑟の間は(実フォントが同じなのに)jfmvar
キーの内容が異なるので3.
の状況となる.kanjiskip[K] 上の
[M]
において空白が定まらなかった場合,以下で定めた量「右空白」として採用する.この段階においては,
\inhibitglue
は効力を持たないため,結果として,2
つのJAchar間には常に何らかのグルー/カーンが挿入されることとなる.
1.
両クラスタ(厳密にはNq
.tail
,Np
.head
)の中身の文字コードに対する autospacing パラメ タが両方ともfalse
だった場合は,長さ0
のglue
とする.2.
ユーザ側から見た kanjiskip パラメタの自然長が\maxdimen
= (230− 1)sp
でなければ,kanjiskipパラメタの値を持つ
glue
を採用する.3. 2.
でない場合は,Nq, Np
で使われているJFM
に指定されているkanjiskipの値を用いる.どちらか片方のクラスタだけがJAchar(和文A・和文B)のときは,そちらのクラスタで使わ れている
JFM
由来の値だけを用いる.もし両者で使われているJFM
が異なった場合は,上の
[M] 3.
と同様の方法を用いて調整する.■禁則用ペナルティの挿入 まず,
𝑎 ∶= (
Nq
*39の文字に対するpostbreakpenaltyの値) + (Np
*40の文字に対するprebreakpenaltyの値) とおく.ペナルティは通常[−10000, 10000]の整数値をとり,また±10000は正負の無限大を意味す ることになっているが,この𝑎の算出では単純な整数の加減算を行う.𝑎は禁則処理用に
Nq
とNp
の間に加えられるべきペナルティ量である.P-normal [PN]
Nq
とNp
の間の(a)
部分にペナルティ(penalty node)
があれば処理は簡単であ る:それらの各ノードにおいて,ペナルティ値を(±10000を無限大として扱いつつ)𝑎だけ増 加させればよい.また,10000 + (−10000) = 0としている.*40厳密にはそれぞれNq.tail,Np.head.
表15. JFMグルーの概要
Np↓ 和文A 和文B 欧文 箱 glue kern
和文A M→K PN
OA→K PN
NA→X PN
OA PA
OA PN
OA PS 和文B OB→K
PA
K PS
X PS 欧文 NB→X
PA
X PS 箱 OB
PA glue OB PN kern OB PS 上の表において, M→K
PN は次の意味である:
1.
「右空白」を決めるために,LuaTEX-ja
はまず「JFM
由来[M]
」の方法を試みる.これが失敗 したら,LuaTEX-ja
は「kanjiskip[K]
」の方法を試みる.2. LuaTEX-ja
は2
つ の ク ラ ス タ の 間 の 禁 則 処 理 用 の ペ ナ ル テ ィ を 設 定 す る た め に 「P-normal [PN]」の方法を採用する.
少々困るのは,
(a)
部分にペナルティが存在していない場合である.直感的に,補正すべき量𝑎 が0
でないとき,その値をもつpenalty node
を作って「右空白」の(もし未定義ならNp
の)直前に挿入……ということになるが,実際には僅かにこれより複雑である.