表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
の)直前に挿入……ということになるが,実際には僅かにこれより複雑である.
•
「右空白」がカーンであるとき,それは「Nq
とNp
の間で改行は許されない」ことを意図し ている.そのため,この場合は𝑎 ≠ 0であってもペナルティの挿入はしない.•
そうでないないときは,𝑎 ≠ 0ならばpenalty node
を作って挿入する.の𝑥は次の場合分けによる:
• Np
.id
がid math
のとき(つまりクラスタNp
が文中数式を表す)ときは,𝑥 = −1.• Np
の中身の中身の文字コードについて,「直前へのxkanjiskipの挿入」が禁止されてい る(つまり,jaxspmode(or
alxspmode)
パラメタが偶数)ときは,𝑥 ='nox alchar'
.•
以上のいずれでもないときは,𝑥 ='alchar'
.xkanjiskip[X] この段階では,kanjiskip[K]のときと同じように,以下で定めた量を「右空白」と して採用する.
\inhibitglue
は効力を持たない.1.
以下のいずれかの場合は,xkanjiskip の挿入は抑止される.しかし,実際には行分割を許容 するために,長さ0
のglue
を採用する:•
両クラスタにおいて,それらの中身の文字コードに対するautoxspacingパラメタが共にfalse
である.• Nq
の中身の文字コードについて,「直後へのxkanjiskipの挿入」が禁止されている(つ まり,jaxspmode(or
alxspmode)
パラメタが2
以上).• Np
の中身の文字コードについて,「直前へのxkanjiskipの挿入」が禁止されている(つ まり,jaxspmode(or
alxspmode)
パラメタが偶数).2.
ユーザ側から見た xkanjiskip パラメタの自然長が\maxdimen
= (230 − 1)sp
でなければ,xkanjiskipパラメタの値を持つ
glue
を採用する.3. 2.
でない場合は,Nq, Np
(和文A/
和文Bなのは片方だけ)で使われているJFM
に指定されているxkanjiskipの値を用いる.
■欧文と和文Aの間
Nq
が欧文で,Np
が和文Aの場合,JFM
グルー挿入処理は上の場合とほぼ 同じである.和文Aのクラスタが逆になるので,欧文境界B [NB]の部分が変わるだけである.•
「右空白」については,まず以下に述べる欧文境界 A [OA] により空白を決定しようと試みる.それが失敗した場合は,xkanjiskip[X]によって定める.
•
禁則用ペナルティは,以前述べたP-normal [PN]と同じである.欧文境界A [NA] これは欧文境界B [NB]で
Np
とNq
の役割が交換されたものと思えば良い.この 処理で定まる空白の典型例は,欧文文字と和文の開き括弧との間に入る半角アキである.1.
もし両クラスタの間で\inhibitglue
が実行されていた場合(証としてwhatsit
ノードが自 動挿入される),未定義.2.
そうでなければ,「文字コードが𝑥の文字」とNp
との間に入るグルー/カーンと定める.𝑥はNq
から欧文境界B [NB]におけるそれと同じ方法で定めるが,'nox alchar'
か'alchar'
はNq
の中身の文字コードについて,「直後へのxkanjiskipの挿入」が禁止されている(つ まり,jaxspmode(or
alxspmode)
パラメタが2
以上).か否かで判断する.
■和文Aと箱・グルー・カーンの間
Nq
が和文Aで,Np
が箱・グルー・カーンのいずれかであっ た場合,両者の間に挿入されるJFM
グルーについては同じ処理である.しかし,そこでの行分割に 対する仕様が異なるので,ペナルティの挿入処理は若干異なったものとなっている.•
「右空白」については,以下に述べるBoundary-B [OB]により空白を決定しようと試みる.それが失敗した場合は,「右空白」は挿入されない.
•
禁則用ペナルティの処理は,後ろのクラスタNp
の種類によって異なる.なお,Np
.head
は無 意味であるから,「Np
.head
に対するprebreakpenaltyの値」は0
とみなされる.言い換えれば,𝑎 ∶= (
Nq
の文字に対するpostbreakpenaltyの値).箱
Np
が箱であった場合は,両クラスタの間での行分割は(明示的に両クラスタの間に\penalty10000
があった場合を除き)いつも許容される.そのため,ペナルティ処理は,後 に述べるP-allow [PA]がP-normal [PN]の代わりに用いられる.グルー
Np
がグルーの場合,ペナルティ処理はP-normal [PN]を用いる.カーン
Np
がカーンであった場合は,両クラスタの間での行分割は(明示的に両クラスタ の間にペナルティがあった場合を除き)許容されない.ペナルティ処理は,後に述べる P-suppress [PS]を使う.これらのP-normal [PN],P-allow [PA],P-suppress [PS]の違いは,
Nq
とNp
の間(以前の図だ と(a)
の部分)にペナルティが存在しない場合にのみ存在する.Boundary-B [OB] この処理は欧文境界B [NB]と同様であり,𝑥が次によって決まることのみが異 なる:
• Np
がグルーやカーンのときは,𝑥 ='glue'
.•
そうでない(Np
が箱)ときは,𝑥 ='jcharbdd'
.P-allow [PA]
Nq
とNp
の間の(a)
部分にペナルティがあれば,P-normal [PN]と同様に,それらの 各ノードにおいてペナルティ値を𝑎だけ増加させる.(a)
部分にペナルティが存在していない場合,LuaTEX-ja
はNq
とNp
の間の行分割を可能にし ようとする.そのために,以下のいずれかの場合に𝑎をもつpenalty node
を作って「右空白」の(もし未定義なら
Np
の)直前に挿入する:•
「右空白」がグルーでない(カーンか未定義)であるとき.•
𝑎 ≠ 0のときは,「右空白」がグルーであってもpenalty node
を作る.P-suppress [PS]
Nq
とNp
の間の(a)
部分にペナルティがあれば,P-normal [PN]と同様に,それ らの各ノードにおいてペナルティ値を𝑎だけ増加させる.(a)
部分にペナルティが存在していない場合,Nq
とNp
の間の行分割は元々不可能のはずだっ たのであるが,LuaTEX-ja
はそれをわざわざ行分割可能にはしない.そのため,「右空白」がglue
であれば,その直前に\penalty10000
を挿入する.■箱・グルー・カーンと和文Aの間
Np
が箱・グルー・カーンのいずれかで,Np
が和文Aであっ た場合は,すぐ上の(Nq
とNp
の順序が逆になっている)場合と同じである.•
「右空白」については,以下に述べるBoundary-A [OA]により空白を決定しようと試みる.それ が失敗した場合は,「右空白」は挿入されない.•
禁則用ペナルティの処理は,Nq
の種類によって異なる.Nq
.tail
は無意味なので,𝑎 ∶= (
Np
の文字に対するprebreakpenaltyの値).箱
Nq
が箱の場合は,P-allow [PA]を用いる.グルー
Nq
がグルーの場合は,P-normal [PN]を用いる.カーン
Nq
がカーンの場合は,P-suppress [PS]を用いる.Boundary-A [OA] この処理は欧文境界A [NA]と同様であり,𝑥が次によって決まることのみが異 なる:
• Nq
がグルーやカーンのときは,𝑥 ='glue'
.•
そうでない(Nq
が箱)ときは,𝑥 ='jcharbdd'
.■和文Aと和文Bの違い 先に述べたように,和文Bは
hbox
の中身の先頭(or
末尾)として出現 しているJAcharである.リスト内に直接ノードとして現れているJAchar(和文A)との違いは,•
和文B に対しては,JFM
の文字クラス指定から定まる空白(JFM由来 [M],Boundary-A [OA] など)の挿入は行われない.例えば,– 片方が和文A,もう片方が和文Bのクラスタの場合,Boundary-A [OA]またはBoundary-B [OB] の挿入を試み,それがダメならkanjiskip[K]の挿入を行う.
– 和文Bの
2
つのクラスタの間には,kanjiskip[K]が自動的に入る.•
和文Bと箱・グルー・カーンが隣接したとき(どちらが前かは関係ない),間にJFM
グルー・ペナルティの挿入は一切しない.
•
和文 B と和文 B,また和文 B と欧文とが隣接した時は,禁則用ペナルティ挿入処理は P-suppress [PS]が用いられる.•
和文Bの文字に対するprebreakpenalty,
postbreakpenaltyの値は使われず,0
として計算される.次が具体例である:
1 あ .\inhibitglue A\\
2 \hbox{あ .}A\\
3 あ .A
あ.
A
あ.A
あ.A
• 1
行目の\inhibitglue
は欧文境界B [NB]の処理のみを抑止するので,ピリオドと「A
」の間にはxkanjiskip(四分アキ)が入ることに注意.
• 2
行目のピリオドと「A
」の間においては,前者が和文Bとなる(hbox
の中身の末尾として登 場しているから)ので,そもそも欧文境界B [NB]の処理は行われない.よって,xkanjiskipが 入ることとなる.• 3
行目では,ピリオドの属するクラスタは和文Aである.これによって,ピリオドと「A
」の 間には欧文境界B [NB]由来の半角アキが入ることになる.15 ベースライン補正の方法 15.1 yoffset フィールド
yalbaselineshift 等のベースライン補正は,基本的には対象となっている
glyph node
のyoffset
フィールドの値を増減することによって実装されている.なお,
yoffset
の値は上方向への移動量 であるのに対し,yalbaselineshiftなどは下方向への移動量である.さて,
yoffset
の増減によって見かけのグリフ位置は上下に移動するが,仮想ボディの高さ ℎ,深さ𝑑については
表16.yoffsetand imaginary body
yoffset 10 pt 5 pt 0 −5pt −10pt 仮想ボディ
y
,
H y
,H y
,H y
,H y
,H
yoffset≥ 0のとき ℎ =
max
(height
+yoffset
, 0),
𝑑 =max
(depth
−yoffset
, 0),
yoffset< 0のとき ℎ =max
(height
+yoffset
, 0),
𝑑 =depth.
という仕様になっている.つまり,
yoffset
が負(グリフを下ける)の場合に深さは増加しない(表16参照).