X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=doc%2Fsample1.tex;h=b4e3f0ea4b2695d80f0f4f92ba9ef6069002a17b;hb=cfd3ad7961c4538d018120a9fa76fab9c157fce4;hp=34970a67c98516cd3f707c4ce27ad3e43f638193;hpb=223f533c15b0e1d641c1afd677d399a4914af7a9;p=luatex-ja%2Fluatexja.git diff --git a/doc/sample1.tex b/doc/sample1.tex index 34970a6..b4e3f0e 100644 --- a/doc/sample1.tex +++ b/doc/sample1.tex @@ -1,7 +1,6 @@ %#! time luatex sample1 \input s1sty.tex % style file -\message{BB} \overfullrule=0pt \def\LaTeX{L\kern-.36em\setbox0=\hbox{T}\vbox to\ht0{\hbox{\sx A}\vss}\kern-.15em\TeX} \font\mff=manfnt at 10pt @@ -17,13 +16,11 @@ \centerline{\big Lua\TeX-jaパッケージ}\bigskip \centerline{\large\the\year/\the\month/\the\day}\medskip -\message{AA} \bigskip 本パッケージは,(最低でもp\TeX と同等の水準の)日本語組版をLua\TeX 上で実現させることを 目標としたマクロである.まだまだ足りないところはあるが,とりあえず動くようになった?ので公開する. -%{\showboxdepth=10000\showboxbreadth=10000\tracingonline=1\scrollmode\showlists}\end \beginparagraph 特徴 @@ -43,12 +40,15 @@ \item {\bf 現時点で\LaTeX での使用は殆ど考慮されていません.今は``plain Lua\TeX''で使ってください.} \item |\accent|を和文文字に対して使うことはできません. これは「フォントを後で置換する」という実装上,仕方のないことだと思われます. +{\small|\/|を試験的に日本語にも対応させました. +アクセントも,|make_accent|の処理をLuaコードで書けば可能だと思われます.} \item 数式中の日本語は想定していません.|\hbox|か何かで囲ってください. \item p\TeX にあった以下の機能はまだ実装していません. \itemitem |\euc|, |\jis|, |\sjis|, |\kuten|といった,コード変換プリミティブ. \itemitem |\kansuji|, |\kansujichar|. -\itemitem |\showmode|, |\jfam|, |\jcharwidowpenalty|. +\itemitem |\showmode|, |\jfam|. \itemitem 縦組み関連一式.|\tate|, |\tfont|, |\tbaselineshift|, |\dtou|,$\,\ldots$ + \enditem @@ -61,6 +61,7 @@ {\bf 現時点で\LaTeX での使用は全く考慮されていない.} \item {\tt luatexja-core.lua}: コア部分に使われるLuaコード. \item {\tt luatexja-jfont.lua}: 和文フォント定義部のLuaコード. +\item {\tt luatexja-xkanji.lua}: |\[x]kanjiskip|自動挿入処理のLuaコード. \item {\tt luatexja-rmlgbm-data.lua}: 非埋込和文フォント用のデータ(小塚明朝Pr6N R由来). \item {\tt luatexja-rmlgbm.lua}: 非埋込和文フォント (Ryumin-Light etc.) 定義部. \item {\tt mk-rmlgbm-data.tex}: {\tt luatexja-rmlgbm-data.lua}作成用スクリプト @@ -94,8 +95,8 @@ JFM は和文文字の幅や,和文文字間の空白の入り方などを規 \TeX の|\font| primitiveと同様の書式を持った次の命令を用いて和文フォントを定義する: \begintt - \jfont={:} % local に定義 - \gjfont={:} % global に定義 + \jfont={:} % local に定義 + \globaljfont={:} % global に定義 \endtt @@ -146,15 +147,15 @@ PSフォント名を直接指定することもでき, \item デフォルトでは,|U+0100|以降の文字は全部和文扱いであり,さらに文字範囲として, \begintt \defcharrange{1}{"80-"FF} - \setjaparameter{jcharrange={-1}} + \ltjsetparameter{jacharrange={-1}} \endtt と指定している{\small(つまりLatin-1 Supplementの範囲は欧文扱い)\inhibitglue}. -TODO: 「{\setjaparameter{jcharrange={1}}× (|U+00D7|)}」等,ISO 8859-1領域 -にマッピングされた文字の扱い. -「{\setjaparameter{jcharrange={1}}¢ (|U+00A2|)}」はHalfwidth and -Fullwidth Formsに全角形(\char"FFE0)があるから%" -luaotfloadの置換処理に割り込めばよいが……. +%TODO: 「{\ltjsetparameter{jacharrange={1}}× (|U+00D7|)}」等,ISO 8859-1領域 +%にマッピングされた文字の扱い. +%「{\ltjsetparameter{jacharrange={1}}¢ (|U+00A2|)}」はHalfwidth and +%Fullwidth Formsに全角形(\char"FFE0)があるから%" +%luaotfloadの置換処理に割り込めばよいが……. \enditem @@ -162,8 +163,8 @@ luaotfloadの置換処理に割り込めばよいが……. 日本語組版用の各種パラメタの調整には,次の命令を用いる. \begintt - \setjaparameter{=, ...} % local に変更 - \globalsetjaparameter{=, ...} % global に変更 + \ltjsetparameter{=, ...} % local に変更 + \ltjglobalsetparameter{=, ...} % global に変更 \endtt に許される値は次の通りである. @@ -177,8 +178,7 @@ p\TeX の|\prebreakpenalty|に対応した設定項目である. \itemitem : 文字コードを指定する.一旦補助カウンタに代入されるので, 16進法での数値の指定 (|"abcd|) や,%" 文字トークンによる指定 (|`あ|) も可能である. -\itemitem : penalty の値を0から10000までの自然数で指定する -{\small(範囲外でも可能だが)\inhibitglue}. +\itemitem : penalty の値を$-10000$から10000までの整数で指定する. \item |postbreakpenalty={, }|★\par\noindent 同様に,p\TeX の|\postbreakpenalty|に対応した設定項目である. @@ -194,26 +194,27 @@ p\TeX では,同一文字に対して|\prebreakpenalty|, |\postbreakpenalty| \itemT |U+3000|--|U+303F| (CJK Symbols and Punctuation) \itemT |U+FF00|--|U+FFEF| (Halfwidth and Fullwidth Forms) -\item |cjkxspmode={, }|★\par\noindent +\item |jaxspmode={, }|★\par\noindent p\TeX の|\inhibitxspcode|に対応した設定項目である.で許される値は, -\itemitem |0|, |inhibit|: 前後の欧文文字との間の|\xkanjiskip|自動挿入を禁止. -\itemitem |2|, |preonly|: 前の欧文文字との間の|\xkanjiskip|自動挿入のみを許可. -\itemitem |1|, |postonly|: 後の欧文文字との間の|\xkanjiskip|自動挿入のみを許可. -\itemitem |3|, |allow|: 前後の欧文文字との間の|\xkanjiskip|自動挿入を許可. -\item |asciixspmode={, }|★\par\noindent +\itemitem |0|, |inhibit|: 前後の欧文文字との間の|xkanjiskip|自動挿入を禁止. +\itemitem |2|, |preonly|: 前の欧文文字との間の|xkanjiskip|自動挿入のみを許可. +\itemitem |1|, |postonly|: 後の欧文文字との間の|xkanjiskip|自動挿入のみを許可. +\itemitem |3|, |allow|: 前後の欧文文字との間の|xkanjiskip|自動挿入を許可. +\item |alxspmode={, }|★\par\noindent 同様に,p\TeX の|\xspcode|に対応した設定項目である. で許される値は, -\itemitem |0|, |inhibit|: 前後の和文文字との間の|\xkanjiskip|自動挿入を禁止. -\itemitem |1|, |preonly|: 前の和文文字との間の|\xkanjiskip|自動挿入のみを許可. -\itemitem |2|, |postonly|: 後の和文文字との間の|\xkanjiskip|自動挿入のみを許可. -\itemitem |3|, |allow|: 前後の和文文字との間の|\xkanjiskip|自動挿入を許可. - -\item |yabaselineshift=|: -p\TeX の|\yabaselineshift|に対応したものであり,欧文文字のベースライン補正量をdimensionで指定する. +\itemitem |0|, |inhibit|: 前後の和文文字との間の|xkanjiskip|自動挿入を禁止. +\itemitem |1|, |preonly|: 前の和文文字との間の|xkanjiskip|自動挿入のみを許可. +\itemitem |2|, |postonly|: 後の和文文字との間の|xkanjiskip|自動挿入のみを許可. +\itemitem |3|, |allow|: 前後の和文文字との間の|xkanjiskip|自動挿入を許可. + +\item |yalbaselineshift=|: +p\TeX の|\ybaselineshift|に対応したものであり, +欧文文字のベースライン補正量をdimensionで指定する. \itemitem 正の値を指定すると,その分だけ欧文文字は下にずれることとなる. \itemitem 数式中では,boxやruleもこの量だけずれる\hfil\break -(よって,行中数式は全体が|\yabaselineshift|だけずれたように見える). -\item |ykbaselineshift=|: +(よって,行中数式は全体が|yalbaselineshift|だけずれたように見える). +\item |yjabaselineshift=|: 和文文字のベースライン補正量をdimensionで指定する. p\TeX では「和文が主」という考えからか,常に和文文字のベースラインが基準であり, 欧文文字の方をずらすことになっていた.しかし,「欧文の中に和文をちょっと入れる」ような場合では, @@ -222,16 +223,49 @@ p\TeX では「和文が主」という考えからか,常に和文文字の また,この値を適切に調整することで,% {\small 異なる文字サイズの文字を「上下中央揃え」で組む}ことも可能である. -\item |kanjiskip=|★\inhibitglue: 後に述べる|\kanjiskip=|と同じ意味. -\item |xkanjiskip=|★\inhibitglue: 後に述べる|\xkanjiskip=|と同じ意味. -\item |jcharwidowpenalty=|★\inhibitglue: -後に述べる|\jcharwidowpenalty=|と同じ意味. -\item |autospacing[=]|★◎\par\noindent -%\item |autospacing[=]|★\par\noindent -和文文字間のglue(|\kanjiskip|)の自動挿入をするかしないかを制御. -\item |autoxspacing[=]|★◎\par\noindent -%\item |autoxspacing[=]|★\par\noindent -和欧文間のglue(|\xkanjiskip|)の自動挿入をするかしないかを制御. +\item |kanjiskip=|★\par\noindent +和文文字同士の間に入る空白量を指定.p\TeX の同名の命令と同様に, +基本的には段落/hbox終了時の値が,その段落/hbox全体に適用される. つまり, +\begintt +\ltjsetparameter{kanjiskip=3pt}あい% +{\ltjsetparameter{kanjiskip=10pt}うえ}} +\endtt +の組版結果は(段落終了時の値が$3\,{\rm pt}$のため), +$$ + \hbox{\ltjsetparameter{kanjiskip=3pt}あい{\ltjsetparameter{kanjiskip=10pt}うえ}} +$$ +となる. + +但し,|kanjiskip|の自然長が$\hbox{|\maxdimen|}=16383.99998\,{\rm pt}$の場合は, +\itemitem (和文文字の間それぞれについて)JFMに指定されている +|kanjiskip|の値を採用する. +\itemitem 左側JFM,右側JFMのどちらかにおいて指定されていれば,そちらを使用する. +\itemitem どちらにおいても指定されていない場合は,0とみなす. + +\item |xkanjiskip=|★\par\noindent +和文文字と欧文文字の間に入る空白量.p\TeX の同名の命令と同様. +これも,自然長が|\maxdimen|の場合は,JFMで指定された値を使う. + + +\item |jcharwidowpenalty=|★\par\noindent +段落において「最後の1文字のみが次の行に」くることを +抑制するためのpenalty値.このpenaltyは,段落内にある,最後の「|kcatcode|の最下位bitが +1で{\bf ない}ような和文文字」の直前に挿入される. + + +\item |autospacing[=]|\par\noindent +和文文字間のglue(|kanjiskip|)の自動挿入をするかしないかを制御. +p\TeX では段落/hbox 単位での設定となったが,Lua\TeX-ja では +そうではなくなった. +挿入可能な箇所の両端のノードにおいて,片方でも +この値がfalseなら自動挿入は行われる.つまり,例えば +\begintt +あ\ltjsetparameter{autospacing=false}いう +\endtt +の場合,「あい」の間には|kanjiskip|が挿入され,「いう」の間には入らない. +\item |autoxspacing[=]|\par\noindent +和欧文間のglue(|xkanjiskip|)の自動挿入をするかしないかを制御. +その他は|autospacing|と同様. \item |differentjfm=(large/small/average/both)|★◎\par\noindent 異なる$(\hbox{}, \hbox{})$である2つの和文文字の間の @@ -241,8 +275,10 @@ glue/kernの計算方法を設定する. \itemitem {\tt small}: 両者のうち小さい方. \itemitem {\tt average}: 両者の相加平均. \itemitem {\tt both}: 両者の合計値の幅をもつglue/kernを挿入する. +この指定は,JFM由来の|kanjiskip|の値が左右の和文文字で異なったときの +挙動にも適用される. -\item |jcharrange={,,...}|: +\item |jacharrange={,,...}|: $\lvert\hbox{}\rvert$番の文字範囲の文字を和文扱いするか欧文扱いするかを設定する. \itemitem $\lvert\hbox{}\rvert>216$の場合, 「どの文字範囲にも属さない|U+0100|以降の文字」に @@ -256,27 +292,27 @@ $\lvert\hbox{}\rvert$番の文字範囲の文字を和文扱いする 日本語組版用の各種パラメタの取得には,次の命令を用いる. \begintt - \getjaparameter{} or \getjaparameter{}{} + \ltjgetparameter{} or \ltjgetparameter{}{} \endtt 戻り値は全て「空白は|\catcode=10|,それ以外の文字は全て|\catcode=12|」の文字列である. -に指定できる値は,説明がない限りは|\setjaparameter|で指定できると同じで,次の通りである, +に指定できる値は,説明がない限りは|\ltjsetparameter|で指定できると同じで,次の通りである, -\item |kanjiskip|, |xkanjiskip|, |yabaselineshift|, |ykbaselineshift|, |jcharwidowpenalty|% +\item |kanjiskip|, |xkanjiskip|, |yalbaselineshift|, |yjabaselineshift|, |jcharwidowpenalty|% \par\noindent それぞれ値を表現する文字列を返す. \item |differentjfm|: 戻り値は{\tt large}, {\tt small}, {\tt average}, {\tt both}の 4つの文字列のいずれか. -\item |prebreakpenalty|, |postbreakpenalty|, |kcatcode|, |cjkxspmode|, |asciixspmode| +\item |prebreakpenalty|, |postbreakpenalty|, |kcatcode|, |jaxspmode|, |alxspmode| \par\noindent これらは各文字コード別に設定される値であるので,文字コードを第2引数にとる. 指定されている整数値を表す文字列を返す. -\item |jcharrange|: 文字範囲の番号$n$を第2引数にとり,$n$番の文字範囲が +\item |jacharrange|: 文字範囲の番号$n$を第2引数にとり,$n$番の文字範囲が 和文文字扱いされていれば|0|,欧文文字扱いされていれば|1|を返す. -$n\notin [1,216]$の場合は,「どの文字範囲にも属さない|U+0100|以降の文字」に対しての結果を返す. +$n\notin [1,216]$の場合は,「どの文字範囲にも属さない|U+0080|以降の文字」に対しての結果を返す(しかし,前に述べたデフォルトでの設定のため,実際には|U+0100|以降となる). \item |chartorange|: 文字コードを第2引数にとり,それが属している文字範囲の番号を返す. \itemitem がUnicodeの範囲外または|0x80|未満ならば,|-1|を返す. @@ -284,12 +320,6 @@ $n\notin [1,216]$の場合は,「どの文字範囲にも属さない|U+0100| \beginparagraph その他の命令 -\item skip |\kanjiskip|: 和文文字同士の間に入る空白量を指定.p\TeX の同名の命令と同様. -\item skip |\xkanjiskip|: 和文文字と欧文文字の間に入る空白量.p\TeX の同名の命令と同様. -\item count |\jcharwidowpenalty|: 段落において「最後の1文字のみが次の行に」くることを -抑制するためのpenalty値.このpenaltyは,段落内にある,最後の「|kcatcode|の最下位bitが -1で{\bf ない}ような和文文字」の直前に挿入される. - \item dimen |\zw|, |\zh|: 現在の和文フォントの「幅」/「高さ」(メトリックから指定) \item dimen |\jQ|, |\jH|${}= 0.25\,{\rm mm}$. \item |\inhibitglue|: @@ -300,45 +330,109 @@ glue/kern挿入処理で役目を終え,削除される)\inhibitglue}. \beginsection JFMについて -Lua\TeX-jaで用いる和文用のメトリック情報は,次のような構文で書かれたLuaファイルである. +Lua\TeX-jaで用いる和文用のメトリック情報は,次のようなLuaファイルである. 見本として,|jfm-ujis.lua|を入れてある. -\item |jfm.dir|: 組方向を指定する.将来的にはいずれ縦組(|'tate'|)を実装したいが, +\begintt +ltj.define_jfm { + dir = 'yoko', zw = 1.0, zh = 1.0, + [0] = { + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5 }, [3] = { 0.25, 0.0, 0.25 } + } + }, ... + [1] = { + chars = { + 0x2018, 0x201C, 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, + 0x3016, 0x3018, 0x301D, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F + }, + align = 'right', left = 0.0, down = 0.0, ... + }, ... + [5] = { + ..., + glue = { + [1] = { 0.5 , 0.0, 0.5 }, + [3] = { 0.25, 0.0, 0.25 } + }, + kern = { [5] = 0.0 } + }, ... +} +\endtt + +全体は,「関数|ltj.define_jfm|にテーブルを引数として与える」という構造になっている. +以下に,テーブルの中身を述べる. +\item |dir|: 組方向を指定する.将来的にはいずれ縦組(|'tate'|)を実装したいが, 現時点では横組(|'yoko'|)のみの対応. -\item |jfm.zw|, |jfm.zh|: それぞれ|\zw|, |\zh|のフォントサイズに対する割合を記述する. +\item |zw|, |zh|: それぞれ|\zw|, |\zh|のフォントサイズに対する割合を記述する(必須). 通常は両方とも1.0となるだろう. -\item |jfm.define_char_type(, )| +\item |kanjiskip|, |xkanjiskip|: それぞれ和文文字間グルー量,和欧文間グルー量を +\begintt +{, , } +\endtt +という形で,フォントサイズ単位で指定する. +\item 数字のindex $i$を持った値:$i$番の文字クラスについての情報を記述する. +\itemitem |glue|: 現在の文字クラスの文字の後に挿入するglueを指定する. +この項目の内容は +\begintt +{ [] = { , , }, ... } +\endtt +というテーブルであり,各要素は + +{\par\medskip\advance\leftskip3\zw\noindent\rightskip2\zw +$i$番の文字クラスの文字と$j$番の文字クラスの文字の間に, +自然長,伸び, 縮み(フォントサイズ基準)なる +glueを挿入 +\par\medskip} + +\noindent という意味である. -p\TeX 用{\tt JFM}で言うところの「文字クラス」を定義する. -\itemitem は文字クラスを表す1以上$\hbox{\tt0x800}=2048$未満の整数. -\itemitem には,に属する「文字」達のUnicodeにおけるコード番号を -リストの形|{...}|で記述する. +\itemitem |kern|: 現在の文字クラスの文字の後に挿入するkernを指定する. +この項目の内容も, +\begintt +{ [] = , ... } +\endtt +というテーブルであり,各要素は + +{\par\medskip\advance\leftskip3\zw\noindent\rightskip2\zw +$i$番の文字クラスの文字と$j$番の文字クラスの文字の間に,\hfil\break +幅のkernを挿入 +\par\medskip} + +\noindent という意味である. + +\itemitem |chars|: 文字クラスに属する「文字」達をリストの形|{...}|で記述する. +文字の指定には,Unicodeにおけるコード番号か,その文字1文字だけからなる文字列(|'字'|のように) +を用いる. +どの文字クラスにも属さなかった文字は,0番の文字クラスに属するとみなされる. +そのため,0番以外の文字クラスではこの項目は必須である. また,このリストには,以下の「仮想的な文字」も指定可能である. \itemT |'lineend'|: 行末. +この「文字」を0以外の文字クラスに設定することで,ぶら下げ組のような組版も可能になる. \itemT |'boxbdd'|: 水平ボックスの先頭/末尾,段落の先頭/末尾. \itemT |'jcharbdd'|: 和文文字達の連続とそれ以外のもの(例えば欧文文字)との境界. \itemT |'diffmet'|: 異なるメトリックの和文文字間に入るglueの計算に使われる. +\enditem -\item |jfm.define_type_dim(,,,,,,)| - -文字クラスごとに,文字の寸法のフォントサイズに対する割合を記述する. -\itemitem : 例えば開き括弧類は組版をする際には半角幅だが,TrueTypeフォント内では -左に半角空白が付け加わって全角幅となっていることが多い.このような場合,逆に -TrueTypeフォントを基準にすると,「左に半角幅ずらす」ことをしないといけない. -はその「左へのずらし量」を指定する. -\itemitem : 同様に,「下へのずらし量」を指定する. -\itemitem , , : それぞれ幅,高さ,深さ. -\itemitem : イタリック補正値(未実装). +\noindent {\bf +以下の3項目は,文字クラスに属する文字が「仮想的な文字」達だけでない場合に必須.} -\item |jfm.define_glue(, , , , )| +\itemitem |align|: |'left'|, |'middle'|, |'right'|のどれかを指定する. -文字クラスの文字との文字の間に,自然長,伸び, 縮み -(いずれもフォントサイズ基準)のglueを挿入する. +例えば,開き括弧類は組版をする際には半角幅だが,TrueTypeフォント内では +左に半角空白が付け加わって全角幅となっていることが多い.そのような場合, +|align='right'|と指定することで, +「半角幅の領域に(右詰めで)フォントの実際の字形を入れる」といったことができる. -\item |jfm.define_kern(, , )| +\itemitem |width|, |height|, |depth|, |italic|: +それぞれ幅,高さ,深さ,そしてイタリック補正値をフォントサイズに対する割合で指定する. +例外として,|width='prop'|の場合には,その文字クラスは特に幅を定めず, +実際のフォントにおける文字幅そのままで出力する. -文字クラスの文字との文字の間に,幅のkernを挿入. +\itemitem |left|, |down|: それぞれ左右,上下方向のずらし量を指定する. +|align|項目のため,|left|はほとんどの場合0で良いだろう. \enditem @@ -359,42 +453,56 @@ Lua\TeX-jaパッケージでは,次のような流れで実際の処理を行 この部分のコードは前田氏のjafontspecパッケージの部分から拝借したが,挿入する文字を|%|から (通常使用されることはないと思われる)|U+FFFFF|へと変更している. -\item {\bf 和文フォントへの置換: |hyphenate|, |hpack_filter| callbacks} +\item {\bf 和文フォントへの置換: |hyphenate| callback} この段階の前では,和文文字であっても,それを内部で表している|glyph_node|~$p$は, 「|\tenrm あ|」のように,欧文フォントが指定されている状態になっている.しかし, -$p$は「現在の和文フォント」の番号もattribute |\luatexja@curjfnt|として保持している.そのため, +$p$は「現在の和文フォント」の番号もattribute |\ltj@curjfnt|として保持している.そのため, この段階では,「和文文字が格納されている」|glyph_node|~$p$に対して,次を行う. -\itemitem $p$のフォントをattribute |\luatexja@curjfnt|の値に置換. -\itemitem $p$の|language| fieldを|\luatexja@japanese|の値に置換. +\itemitem $p$のフォントをattribute |\ltj@curjfnt|の値に置換. +\itemitem $p$の|language| fieldを|\ltj@japanese|の値に置換. 誤って和文文字間でハイフネーションがされてしまうのを防止するため. -\itemitem $p$の文字の文字クラスを計算し,その値をattribute |\luatexja@charclass|に格納. +\itemitem $p$の文字の文字クラスを計算し,その値をattribute |\ltj@charclass|に格納. これにより,|jp90|等のfeatureによりグリフが置換されても,文字クラスの値は保たれる. \item {\bf (luaotfloadパッケージによるグリフ置換等の処理はこの位置で)} -\item {\bf JFM由来glue/kernの挿入: |pre_linebreak_filter|, |hpack_filter|} +\item {\bf JFM由来glue/kernの挿入: |pre_linebreak_filter|, |hpack_filter| callbacks} -ここで,メトリックに由来する和文文字間のglue/kernを挿入する. -基本的には連続する和文文字間に挿入するが, +ここで,JFMに由来する和文文字間のglue/kernを挿入する. +基本的には連続する和文文字(を表すnode)間に挿入するが, \itemitem 水平ボックスの先頭/末尾,段落の先頭/末尾には「文字コード|'boxbdd'|の文字」があると 見做して空白を挿入する. \itemitem 和文文字とそうでないもの(欧文文字,ボックス等)の間に関しては, 和文文字でない方は「文字コード|'jcharbdd'|の文字」であると見做す. \itemitem フォントの異なる2つの和文文字においても, -両者のフォントのmetric keyとsizeが一致した場合は, +両者のフォントのJFMとsizeが一致した場合は, 挿入処理においては「同じフォント」であるかのように扱う. \itemitem そうでない場合は,両者の間に「文字コード|'diffmet'|の文字」があると見做して, 両和文文字からそれぞれglue/kern |gb|, |ga|を計算し,そこから実際に入るglue/kernを -計算している(|\setjaparameter|中の|differentjfm|キーを参照). +計算している(|\ltjsetparameter|中の|differentjfm|キーを参照). +\itemitem もうちょっと詳しく書くと,本処理前において,和文文字を表す +2つの連続した|glyph_node| $Q$, $P$の間には,次のnode達が挿入される: +$$ + \ldots,\ Q,\ (\hbox{|\kern|}\ w\,{\rm pt}),\ (\hbox{|\penalty|}\ p),\ +(\hbox{|\kern|}\ (k-w)\,{\rm pt}) +,\ P,\ \ldots +$$ +上に書いた全てのnodeが挿入されるとは限らず,また4つめのkernもglueに変わる可能性がある. +上に出てきた量の意味は次の通りである: +\itemT $w$: $Q$が行末にきたときに,行末からどれだけずらすかを指定した量. +\itemT $p$: $Q$の行末禁則用penaltyと$P$の行頭禁則用penaltyの合計値.ウィドウ防止用の +|\jcharwidowpenalty|が挿入される時は,値はここに加算される. +\itemT |\kern| $k$: 本来の$Q$と$P$の間に入る空き(glueであることも). +$w$のために自然長を補正している. -\item {\bf |\kanjiskip|, |\xkanjiskip|の挿入: |pre_linebreak_filter|, |hpack_filter|} +\item {\bf |kanjiskip|, |xkanjiskip|の挿入: |pre_linebreak_filter|, |hpack_filter| callbacks} p\TeX の|adjust_hlist| procedureとほぼ同様の処理を用いて, -和文間glue |\kanjiskip|や和欧文間glue |\xkanjiskip|を +和文間glue |kanjiskip|や和欧文間glue |xkanjiskip|を 挿入する. -\itemitem 数式境界 (|math_node|) との間に|\xkanjiskip|を自動挿入するかの決定は, +\itemitem 数式境界 (|math_node|) との間に|xkanjiskip|を自動挿入するかの決定は, p\TeX では数字{\tt 0}との間に挿入するかどうかで判定していたが,Lua\TeX-jaでは 「文字コード$-1$の文字」で判定している. \itemitem 合字の周囲の空白挿入については,構成要素の文字列を通じて判断している.例えば, @@ -402,20 +510,20 @@ p\TeX では数字{\tt 0}との間に挿入するかどうかで判定してい \itemT 「漢」と「ffi」間の空白挿入:「漢」と「f」間に入るかで判断 \itemT 「ffi」と「字」間の空白挿入:「i」と「字」間に入るかで判断 -\item {\bf ベースライン補正: |pre_linebreak_filter|, |hpack_filter|} +\item {\bf ベースライン補正: |pre_linebreak_filter|, |hpack_filter| callbacks} この段階では,(主として)欧文文字のベースラインをずらす作業を行う.幸いにして, Lua\TeX で文字を表す|glyph_node|には|y_offset| fieldがあるので,作業は楽である. -補正量は,attribute |\luatexja@yablshift|の値(先も書いた通り,sp単位)である.和文文字の -補正量は|\luatexja@ykblshift|の値で指定されるが,以前の「和文フォントへの置換」処理において, -|\luatexja@yablshift|へと値を移し変えているので,この段階では|\luatexja@yablshift|の値のみを気にしている. +補正量は,attribute |\ltj@yablshift|の値(先も書いた通り,sp単位)である.和文文字の +補正量は|\ltj@ykblshift|の値で指定されるが,以前の「和文フォントへの置換」処理において, +|\ltj@yablshift|へと値を移し変えているので,この段階では|\ltj@yablshift|の値のみを気にしている. さて,実際に補正されるのは次の場合である: \itemitem 文字 (|glyph_node|) \itemitem ボックス・rule(文中数式内部).これによって,数式全体が下がったように見えるはず. -\item {\bf 和文文字の幅の補正: |pre_linebreak_filter|, |hpack_filter|} +\item {\bf 和文文字の幅の補正: |pre_linebreak_filter|, |hpack_filter| callbacks} 例えば,括弧類は「フォント中では全角幅だが,組版では半角幅として扱う」ことが多いが,このように 文字幅を補正する処理を最後に行う.jafontspecパッケージのように,補正対象となる|glyph_node|~$p$%