• 検索結果がありません。

その他の場合

ドキュメント内 LuaTeX-jaパッケージ (ページ 86-90)

表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 上の表において, MK

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参照)

ドキュメント内 LuaTeX-jaパッケージ (ページ 86-90)