X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=doc%2Fsample1.tex;h=b4e3f0ea4b2695d80f0f4f92ba9ef6069002a17b;hb=cfd3ad7961c4538d018120a9fa76fab9c157fce4;hp=310b6a0481ae1a7212295b85a9ce3b69790e65c7;hpb=c12bb8fc84f0606732d9fe7d51a0b4a090b533c1;p=luatex-ja%2Fluatexja.git diff --git a/doc/sample1.tex b/doc/sample1.tex index 310b6a0..b4e3f0e 100644 --- a/doc/sample1.tex +++ b/doc/sample1.tex @@ -1,10 +1,8 @@ %#! time luatex sample1 \input s1sty.tex % style file -\message{BB} \overfullrule=0pt -\def\LaTeX{L\kern-.36em\setbox0=\hbox{T}\vbox to\ht0{\hbox{\sevenrm A}\vss}\kern-.15em\TeX} -\xkanjiskip=0.25\zw plus .10\zw minus .10\zw +\def\LaTeX{L\kern-.36em\setbox0=\hbox{T}\vbox to\ht0{\hbox{\sx A}\vss}\kern-.15em\TeX} \font\mff=manfnt at 10pt \def\mf{{\mff META{\rm\-}FONT}} \def\textfontii{\the\textfont2 } @@ -18,17 +16,15 @@ \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 特徴 -\item 欧文フォント/和文フォントの内部独立管理. +\item 欧文フォント/和文フォントの外部独立管理. \item 違う和文フォントでも「メトリックが同じ」なら,字間に空白を挿入する際には同じものとして扱う. {\bf 例}: 「ほげほげ){\gt (ふがふが}」は以下の出力より得られた: \begintt @@ -41,16 +37,18 @@ \beginparagraph 制限 \item 全体的にテスト不足です. -\item 合字の前後の和欧文間空白の挿入処理は適当{\small(合字でない場合の処理をそのまま流用)\inhibitglue}. -\item {\bf 現時点で\LaTeX での使用は殆ど考慮されていません.``plain Lua\TeX''で使ってください.} -\item |\accent|を和文文字に対して使うことはできません.これは「フォントを後で置換する」という実装上, -仕方のないことだと思われます. +\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 @@ -63,15 +61,15 @@ {\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 luatexja-ucs2aj16.lua}: UnicodeとCIDの対応表({\tt UniJIS-UTF32-H}由来). -\item {\tt mk\_lua.py}: {\tt luatexja-ucs2aj16.lua}作成用Pythonスクリプト. - +\item {\tt mk-rmlgbm-data.tex}: {\tt luatexja-rmlgbm-data.lua}作成用スクリプト +{\small(小塚明朝を{\tt luaotfload}で読み込んだ時のキャッシュが必要)\inhibitglue}. \item {\tt luatexja-kinsoku.tex}: 禁則用ペナルティ等のパラメータを書いたファイル. 下のファイルによって{\tt ukinsoku.tex} (in up\TeX-0.30) から自動生成されたもの. -\item {\tt luatexja-kinsoku\_make.tex}: 上の{\tt luatexja-kinsoku.tex}製作用ファイル. -\item {\tt luatj-ujis.lua}: up\TeX-0.30の{\tt ujis.tfm}ベースのメトリックサンプル. -\item {\tt luatj-mono.lua}: 「全文字が全角幅」のメトリックサンプル. +\item {\tt jfm-ujis.lua}: up\TeX-0.30の{\tt ujis.tfm}ベースのメトリックサンプル. +\item {\tt jfm-mono.lua}: 「全文字が全角幅」のメトリックサンプル. \enditem \beginsection 使用方法 @@ -79,128 +77,370 @@ 大雑把に言うと,plain \TeX の状況で,以下のようにすればよい. \begintt \input luatexja-core.sty % ←マクロ本体を読み込み -\loadjfontmetric{mt}{ujis} % ←メトリックの読み込み -\jfont\tenipam={file:ipam.ttf:jfm=mt}at13.5\jQ +\jfont\tenipam={file:ipam.ttf:jfm=ujis} at 13.5\jQ \tenipam\parindent=1\zw -\yabaselineshift=32768 % (例)32768 sp = 0.5 pt -\rm abcほげほげ)(あいう本文本文…… +\rm\tenipam abcほげほげ)(あいう本文本文…… \endtt -\beginsection 実装解説 +\beginparagraph 和文フォントの定義 -\beginparagraph attributes, dimensions,$\,\ldots$ +Lua\TeX-jaでは,大雑把にいうと +和文フォントは「実際の字形」と「和文用のメトリック情報 (JFM)」の組である. +JFM は和文文字の幅や,和文文字間の空白の入り方などを規定するもの% +{\small (p\TeX におけるJFMファイルとほぼ同じ内容)}であり, +|jfm-.lua|という名称のファイルにLuaコードの形で書かれている. -以下はLua\TeX-jaパッケージ内で使用するattributeやその他の種類のレジスタである. -上4つは内部処理用なので利用者が意識することはない.それ以外は,p\TeX に類似の名前の -primitiveがあることから,意味は容易にわかるだろう: +和文フォントを使うには, +\TeX の|\font| primitiveと同様の書式を持った次の命令を用いて和文フォントを定義する: -\item attribute |\luatexja@curjfnt|: 現在の和文フォント番号 +\begintt + \jfont={:} % local に定義 + \globaljfont={:} % global に定義 +\endtt -p\TeX では内部のグローバル変数で「現在の横組/縦組和文フォント」をそれぞれ保持していたが, -当然ながら欧文用\TeX ではそのようなことはそのままではできない. -node~$p$が保持しているattribute |\luatexja@curjfnt|の値$k$は, -「もし$p$の中身が和文文字であれば,そのフォントは$k$番の番号のフォントである」という意味をもつ. -\item attribute |\luatexja@charclass|: (和文文字の)文字クラス +\item {\bf の指定について}\par\noindent +内部でluaotfloadパッケージを読み込んでいる.大きくわけて,以下の4種類がある. +このうち,前の2つはluaotfloadパッケージの機能である. +\itemitem |file:|\par\noindent +TrueType/OpenTypeフォントをファイル名で指定. +\itemitem |name:|\par\noindent +システム内のフォント名をに指定することも可能. +\itemitem |psft:|\par\noindent +PSフォント名を直接指定することもでき, +この場合はフォントは名前だけ(非埋込)となる. +例えば,本文章では, +\begintt +\jfont\tenmc={psft:Ryumin-Light:jfm=ujis} at 13.5\jQ +\jfont\tengt={psft:GothicBBB-Medium:jfm=ujis} at 13.5\jQ +\endtt +のような定義をし,標準和文フォントRyumin-Light, GothicBBB-Mediumを用いている. +%\itemitem |vf:| -\item attribute |\luatexja@icflag|: この属性をもつkernはイタリック補正由来である +\item {\bf JFMの指定}:欄に次を指定する.\par\noindent +\itemitem |jfm=|: JFMとして|jfm-.lua|を用いることを示す.必須. +\itemitem |jfmvar=|\par\noindent +和文文字間の空白の挿入処理は,使用するJFMと,このの値とのペアによって行われる. -p\TeX では,|\kern|由来のkernと,イタリック補正由来のkernを内部で区別していた.しかし, -欧文用の\TeX ではそのような区別はなく,Lua\TeX においても区別がないようである. +\item luaotfload packageの他の機能,例えば各種のfeature,を用いてもよい: +\begintt +\jfont\tenipam={file:ipaexm.ttf:script=latn;+jp90;jfm=mt} +\endtt +なお,非埋込の場合は,GSUB/GPOSテーブルとして小塚明朝 Pr6N Rのものが用いられる +(|test01-noembed.pdf|を参照). +\enditem -\item language |\luatexja@japanese|: 「日本語」に対応する|\language|番号 +\item 不良なJFMを用いた場合,エラーを返すとともに,の意味は|\relax|となる. -\item attribute |\yabaselineshift|: 欧文文字ベースラインの補正量. -\itemitem {\bf sp$\fam\bffam {}=2^{-16}\,{\bf pt}$単位の整数値}で指定. -正の値を指定すると,その分だけ欧文文字は下にずれる. -\itemitem 数式中では,boxやruleもこの量だけずれる\hfil\break -(よって,行中数式は全体が|\yabaselineshift|だけずれたように見える). -\item attribute |\ykbaselineshift|: 和文文字ベースラインの補正量. +\beginparagraph 「和文文字の範囲」の設定 -p\TeX では「和文が主」という考えからか,常に和文文字のベースラインが基準であり, -欧文文字の方をずらすことになっていた.しかし,「欧文の中に和文をちょっと入れる」ような場合では, -逆に和文文字をずらす方が理にかなっているので,和文文字のベースラインもずらせるようにした. +\item |\defcharrange{}{}|: 文字範囲の新規定義/追加. +\itemitem : 文字範囲の番号で,1--216の整数値で指定. +\itemitem : 文字コードの範囲を|"100-"200, 800, 1701-|のように指定する. +\itemT ASCII codeの範囲 (|0x00|--|0x7F|) は指定できない. +\itemT 既に他の$n$番の文字範囲に使われている領域を指定した場合は, +その領域は$n$番の文字範囲からは除外される.即ち,後に定義した文字範囲の方が優先度が高い. +\itemitem 定義した文字範囲ごとに,「和文扱い」「欧文扱い」をlocalに指定できる. +% 216 = (31*7-1) -また,これを用いることで% -{\small 異なる文字サイズの文字を「上下中央揃え」で組む}ことも可能. -\item skip |\kanjiskip|: 和文文字同士の間に入る空白量. -\item skip |\xkanjiskip|: 和文文字と欧文文字の間に入る空白量. -\item dimen |\zw|, |\zh|: 現在の和文フォントの「幅」/「高さ」(メトリックから指定) -\item dimen |\jQ|, |\jH|${}= 0.25\,{\rm mm}$ +\item デフォルトでは,|U+0100|以降の文字は全部和文扱いであり,さらに文字範囲として, +\begintt + \defcharrange{1}{"80-"FF} + \ltjsetparameter{jacharrange={-1}} +\endtt +と指定している{\small(つまりLatin-1 Supplementの範囲は欧文扱い)\inhibitglue}. + +%TODO: 「{\ltjsetparameter{jacharrange={1}}× (|U+00D7|)}」等,ISO 8859-1領域 +%にマッピングされた文字の扱い. +%「{\ltjsetparameter{jacharrange={1}}¢ (|U+00A2|)}」はHalfwidth and +%Fullwidth Formsに全角形(\char"FFE0)があるから%" +%luaotfloadの置換処理に割り込めばよいが……. \enditem -\beginparagraph 和文フォントの定義 +\beginparagraph 組版パラメタの調整 -Lua\TeX-jaでは,大雑把にいうと -和文フォントは「実際の字形」と「和文用のメトリック情報」の組である. -\item メトリック情報は,和文文字の幅や,和文文字間の空白の入り方などを規定する. -p\TeX における{\tt JFM}ファイルのようなものと考えてよい. -\enditem +日本語組版用の各種パラメタの調整には,次の命令を用いる. +\begintt + \ltjsetparameter{=, ...} % local に変更 + \ltjglobalsetparameter{=, ...} % global に変更 +\endtt -このため,和文フォントを使うには,以下のような手順が必要である. + に許される値は次の通りである. + +\enum ★がついているものは,段落や水平ボックス構成時の値が全体に影響するものである. + +\enum ◎がついているものは,自動的にglobalな代入となってしまうもの. + +\item |prebreakpenalty={, }|★\par\noindent +p\TeX の|\prebreakpenalty|に対応した設定項目である. +\itemitem : 文字コードを指定する.一旦補助カウンタに代入されるので, +16進法での数値の指定 (|"abcd|) や,%" +文字トークンによる指定 (|`あ|) も可能である. +\itemitem : penalty の値を$-10000$から10000までの整数で指定する. + +\item |postbreakpenalty={, }|★\par\noindent +同様に,p\TeX の|\postbreakpenalty|に対応した設定項目である. +p\TeX では,同一文字に対して|\prebreakpenalty|, |\postbreakpenalty|の両方を定義する +ことはできなかったが,Lua\TeX-jaでは可能である. + +\item |kcatcode={, }|★\par\noindent +文字コードの文字が和文文字扱いされている時, +「和文文字の種類」を|0|--|"7FFFFFFF|の自然数値で指定する.%" +\itemitem 最下位bitはウィドウ防止用penaltyの挿入処理に関係する. +\itemitem デフォルトでは,次の3つのUnicodeの範囲において,|kcatcode=1|としている. +\itemT |U+2000|--|U+206F| (General Punctuation) +\itemT |U+3000|--|U+303F| (CJK Symbols and Punctuation) +\itemT |U+FF00|--|U+FFEF| (Halfwidth and Fullwidth Forms) + +\item |jaxspmode={, }|★\par\noindent +p\TeX の|\inhibitxspcode|に対応した設定項目である.で許される値は, +\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 |yalbaselineshift=|: +p\TeX の|\ybaselineshift|に対応したものであり, +欧文文字のベースライン補正量をdimensionで指定する. +\itemitem 正の値を指定すると,その分だけ欧文文字は下にずれることとなる. +\itemitem 数式中では,boxやruleもこの量だけずれる\hfil\break +(よって,行中数式は全体が|yalbaselineshift|だけずれたように見える). +\item |yjabaselineshift=|: +和文文字のベースライン補正量をdimensionで指定する. +p\TeX では「和文が主」という考えからか,常に和文文字のベースラインが基準であり, +欧文文字の方をずらすことになっていた.しかし,「欧文の中に和文をちょっと入れる」ような場合では, +逆に和文文字をずらす方が理にかなっているので,和文文字のベースラインもずらせるようにした. -\enum |\loadjfontmetric{}{}| +また,この値を適切に調整することで,% +{\small 異なる文字サイズの文字を「上下中央揃え」で組む}ことも可能である. -Luaソース|luatj-.lua|に書かれたメトリック情報を読み込む. -内部ではというキーで参照されることとなる.同じkeyで2回以上読み込むことはできないが, -同じメトリック情報に異なるキーをつけることは差し支えない. +\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}うえ}} +$$ +となる. -\enum |\jfont={:jfm=} [at /scaled ]| +但し,|kanjiskip|の自然長が$\hbox{|\maxdimen|}=16383.99998\,{\rm pt}$の場合は, +\itemitem (和文文字の間それぞれについて)JFMに指定されている +|kanjiskip|の値を採用する. +\itemitem 左側JFM,右側JFMのどちらかにおいて指定されていれば,そちらを使用する. +\itemitem どちらにおいても指定されていない場合は,0とみなす. -\TeX の|\font| primitiveと同様の書式を持った|\jfont|命令を用いて和文フォントを定義する. -少し正確に言うと,制御綴の意味を,「$\hbox{|\luatexja@curjfnt|}\leftarrow v$」というように -変更する. +\item |xkanjiskip=|★\par\noindent +和文文字と欧文文字の間に入る空白量.p\TeX の同名の命令と同様. +これも,自然長が|\maxdimen|の場合は,JFMで指定された値を使う. -\itemitem 内部でluaotfloadパッケージを読み込んでいる.そのため, -の部分は |file:ipam.ttf| 等のように,TrueType/OpenTypeフォントを指定することが可能. -\itemitem 但し,が|psft:|であった場合は, -で指定された名前の和文フォント(非埋込)となる. -例えば,本文章では, +\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 -\jfont\tenipam={psft:Ryumin-Light:jfm=mt} at 13.5\jQ -\jfont\tenipag={psft:GothicBBB-Medium:jfm=mt} at 13.5\jQ +あ\ltjsetparameter{autospacing=false}いう \endtt -のような定義をし,標準和文フォントRyumin-Light, GothicBBB-Mediumを用いている. -\itemitem luaotfload packageの他の機能,例えば各種のfeature,を用いてもよい.例えば,次のように: +の場合,「あい」の間には|kanjiskip|が挿入され,「いう」の間には入らない. +\item |autoxspacing[=]|\par\noindent +和欧文間のglue(|xkanjiskip|)の自動挿入をするかしないかを制御. +その他は|autospacing|と同様. + +\item |differentjfm=(large/small/average/both)|★◎\par\noindent +異なる$(\hbox{}, \hbox{})$である2つの和文文字の間の +glue/kernの計算方法を設定する. +左側文字由来,右側文字由来のものが両方存在した場合にのみ効力をもつ. +\itemitem {\tt large}: glue/kernの幅が両者のうち大きい方になるように定める. +\itemitem {\tt small}: 両者のうち小さい方. +\itemitem {\tt average}: 両者の相加平均. +\itemitem {\tt both}: 両者の合計値の幅をもつglue/kernを挿入する. +この指定は,JFM由来の|kanjiskip|の値が左右の和文文字で異なったときの +挙動にも適用される. + +\item |jacharrange={,,...}|: +$\lvert\hbox{}\rvert$番の文字範囲の文字を和文扱いするか欧文扱いするかを設定する. +\itemitem $\lvert\hbox{}\rvert>216$の場合, +「どの文字範囲にも属さない|U+0100|以降の文字」に +対しての処理を行う. +\itemitem 正値が指定されたら,$\lvert\hbox{}\rvert$番の文字範囲は和文文字扱いとなる. +\itemitem 負値が指定されたら,$\lvert\hbox{}\rvert$番の文字範囲は欧文文字扱いとなる. +\itemitem $\hbox{}=0$の場合は,単に無視される. +\enditem + +\beginparagraph 組版パラメタの取得 + +日本語組版用の各種パラメタの取得には,次の命令を用いる. \begintt -\jfont\tenipam={file:ipaexm.ttf:script=latn;+jp90;jfm=mt} + \ltjgetparameter{} or \ltjgetparameter{}{} \endtt +戻り値は全て「空白は|\catcode=10|,それ以外の文字は全て|\catcode=12|」の文字列である. + +に指定できる値は,説明がない限りは|\ltjsetparameter|で指定できると同じで,次の通りである, +\item |kanjiskip|, |xkanjiskip|, |yalbaselineshift|, |yjabaselineshift|, |jcharwidowpenalty|% +\par\noindent +それぞれ値を表現する文字列を返す. +\item |differentjfm|: 戻り値は{\tt large}, {\tt small}, {\tt average}, {\tt both}の +4つの文字列のいずれか. + +\item |prebreakpenalty|, |postbreakpenalty|, |kcatcode|, |jaxspmode|, |alxspmode| +\par\noindent +これらは各文字コード別に設定される値であるので,文字コードを第2引数にとる. +指定されている整数値を表す文字列を返す. + +\item |jacharrange|: 文字範囲の番号$n$を第2引数にとり,$n$番の文字範囲が +和文文字扱いされていれば|0|,欧文文字扱いされていれば|1|を返す. +$n\notin [1,216]$の場合は,「どの文字範囲にも属さない|U+0080|以降の文字」に対しての結果を返す(しかし,前に述べたデフォルトでの設定のため,実際には|U+0100|以降となる). + +\item |chartorange|: 文字コードを第2引数にとり,それが属している文字範囲の番号を返す. +\itemitem がUnicodeの範囲外または|0x80|未満ならば,|-1|を返す. +\itemitem 上の場合以外で,の文字がどの文字範囲にも属さない場合は,|217|を返す. + +\beginparagraph その他の命令 + +\item dimen |\zw|, |\zh|: 現在の和文フォントの「幅」/「高さ」(メトリックから指定) +\item dimen |\jQ|, |\jH|${}= 0.25\,{\rm mm}$. +\item |\inhibitglue|: +指定箇所でのJFM由来のglue/kernの挿入を禁止する. +内部的には,|user_id|が30111のwhatsit nodeを作成している{\small(メトリック由来の +glue/kern挿入処理で役目を終え,削除される)\inhibitglue}. \enditem -\beginparagraph その他命令類 +\beginsection JFMについて -\item |\(set/get)inhibitxspcode{}{}|, \hfil\break -|\(set/get)xspcode{}{}|,\hfil\break -|\(set/get)prebreakpenalty{}{}|,\hfil\break -|\(set/get)postbreakpenalty{}{}| +Lua\TeX-jaで用いる和文用のメトリック情報は,次のようなLuaファイルである. +見本として,|jfm-ujis.lua|を入れてある. -これらはp\TeX の(|set|/|get|を抜かした)命令と意味は概ね同じであるが,以下の点が異なる. +\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 -\itemitem 同じ文字コードについて|\prebreakpenalty|, |\postbreakpenalty|を両方指定することが -可能. -\itemitem |\(set/get)xspcode|(欧文文字用)は|\(set/get)inhibitxspcode|(和文文字用)の別名であり, +全体は,「関数|ltj.define_jfm|にテーブルを引数として与える」という構造になっている. +以下に,テーブルの中身を述べる. +\item |dir|: 組方向を指定する.将来的にはいずれ縦組(|'tate'|)を実装したいが, +現時点では横組(|'yoko'|)のみの対応. +\item |zw|, |zh|: それぞれ|\zw|, |\zh|のフォントサイズに対する割合を記述する(必須). +通常は両方とも1.0となるだろう. +\item |kanjiskip|, |xkanjiskip|: それぞれ和文文字間グルー量,和欧文間グルー量を \begintt -\setxspcode{12289}{1} \setinhibitxspcode{12289}{1} +{, , } \endtt -は全く同じ意味である.|\setxspcode|, |\setinhibitxspcode|の第2引数の意味は異なるが, -両者の意味は文字コードにより判断している. +という形で,フォントサイズ単位で指定する. +\item 数字のindex $i$を持った値:$i$番の文字クラスについての情報を記述する. +\itemitem |glue|: 現在の文字クラスの文字の後に挿入するglueを指定する. +この項目の内容は +\begintt +{ [] = { , , }, ... } +\endtt +というテーブルであり,各要素は -\item |\inhibitglue|: 指定箇所での和文フォントメトリック由来のglue/kernの挿入を禁止する. -内部的には,|user_id|が30111のwhatsit nodeを作成している{\small(メトリック由来の -glue/kern挿入処理で役目を終え,削除される)\inhibitglue}. +{\par\medskip\advance\leftskip3\zw\noindent\rightskip2\zw +$i$番の文字クラスの文字と$j$番の文字クラスの文字の間に, +自然長,伸び, 縮み(フォントサイズ基準)なる +glueを挿入 +\par\medskip} + +\noindent という意味である. + +\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 +\noindent {\bf +以下の3項目は,文字クラスに属する文字が「仮想的な文字」達だけでない場合に必須.} + +\itemitem |align|: |'left'|, |'middle'|, |'right'|のどれかを指定する. + +例えば,開き括弧類は組版をする際には半角幅だが,TrueTypeフォント内では +左に半角空白が付け加わって全角幅となっていることが多い.そのような場合, +|align='right'|と指定することで, +「半角幅の領域に(右詰めで)フォントの実際の字形を入れる」といったことができる. + +\itemitem |width|, |height|, |depth|, |italic|: +それぞれ幅,高さ,深さ,そしてイタリック補正値をフォントサイズに対する割合で指定する. +例外として,|width='prop'|の場合には,その文字クラスは特に幅を定めず, +実際のフォントにおける文字幅そのままで出力する. + +\itemitem |left|, |down|: それぞれ左右,上下方向のずらし量を指定する. +|align|項目のため,|left|はほとんどの場合0で良いだろう. -\beginparagraph 大まかな処理の流れ +\enditem + +\beginsection 大まかな処理の流れ -Lua\TeX-jaパッケージでは,次のような流れで処理を行う. +Lua\TeX-jaパッケージでは,次のような流れで実際の処理を行っている. -\item 行末空白の削除: |process_input_buffer| callback +\item {\bf 行末空白の削除: |process_input_buffer| callback} 通常,\TeX において改行は空白とほぼ同じ意味であり, 改行した箇所には自動的に空白が入るようになっている. @@ -213,65 +453,77 @@ Lua\TeX-jaパッケージでは,次のような流れで処理を行う. この部分のコードは前田氏のjafontspecパッケージの部分から拝借したが,挿入する文字を|%|から (通常使用されることはないと思われる)|U+FFFFF|へと変更している. -\item 和文フォントへの置換: |hyphenate|, |hpack_filter| callbacks +\item {\bf 和文フォントへの置換: |hyphenate| callback} この段階の前では,和文文字であっても,それを内部で表している|glyph_node|~$p$は, -「|\temrm あ|」のように,欧文フォントが指定されている状態になっている.しかし, -$p$は「現在の和文フォント」の番号もattribute |\luatexja@curjfnt|として保持している.そのため, +「|\tenrm あ|」のように,欧文フォントが指定されている状態になっている.しかし, +$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 (luaotfloadパッケージによるグリフ置換等の処理はこの位置で行われる) +\item {\bf (luaotfloadパッケージによるグリフ置換等の処理はこの位置で)} -\item メトリック由来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を, -関数|ltj.calc_between_two_jchar_aux|で計算している: -\itemT |gb|, |ga|の片方がglue,もう片方がkernの場合は,glue側のみ挿入. -\itemT そうでないときは,両者の平均値の空白を挿入する. +両和文文字からそれぞれglue/kern |gb|, |ga|を計算し,そこから実際に入るglue/kernを +計算している(|\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 |\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 p\TeX と同様に,これらの自動挿入は(box/段落ごとに) -|\[no]auto[x]spacing|を用いて制御できる. -\itemitem 数式境界 (|math_node|) との間に|\xkanjiskip|を自動挿入するかの決定は, +\itemitem 数式境界 (|math_node|) との間に|xkanjiskip|を自動挿入するかの決定は, p\TeX では数字{\tt 0}との間に挿入するかどうかで判定していたが,Lua\TeX-jaでは -「文字コード|'math'|の文字」で判定している. +「文字コード$-1$の文字」で判定している. +\itemitem 合字の周囲の空白挿入については,構成要素の文字列を通じて判断している.例えば, +「漢ffi字」という文字列に対して, +\itemT 「漢」と「ffi」間の空白挿入:「漢」と「f」間に入るかで判断 +\itemT 「ffi」と「字」間の空白挿入:「i」と「字」間に入るかで判断 - -\item ベースライン補正: |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 和文文字の幅の補正: |pre_linebreak_filter|, |hpack_filter| +\item {\bf 和文文字の幅の補正: |pre_linebreak_filter|, |hpack_filter| callbacks} 例えば,括弧類は「フォント中では全角幅だが,組版では半角幅として扱う」ことが多いが,このように 文字幅を補正する処理を最後に行う.jafontspecパッケージのように,補正対象となる|glyph_node|~$p$% @@ -279,50 +531,6 @@ Lua\TeX で文字を表す|glyph_node|には|y_offset| fieldがあるので, \enditem -\beginparagraph 和文フォントメトリックについて - -Lua\TeX-jaで用いる和文用のメトリック情報は,次のような構文で書かれたLuaファイルである. -見本として,|luatj-ujis.lua|を入れてある. - -\item |jfm.dir|: 組方向を指定する.将来的にはいずれ縦組(|'tate'|)を実装したいが, -現時点では横組(|'yoko'|)のみの対応. -\item |jfm.zw|, |jfm.zh|: それぞれ|\zw|, |\zh|のフォントサイズに対する割合を記述する. -通常は両方とも1.0となるだろう. -\item |jfm.define_char_type(, )| - -p\TeX 用{\tt JFM}で言うところの「文字クラス」を定義する. -\itemitem は文字クラスを表す1以上$\hbox{\tt0x800}=2048$未満の整数. -\itemitem には,に属する「文字」達のUnicodeにおけるコード番号を -リストの形|{...}|で記述する. - -また,このリストには,以下の「仮想的な文字」も指定可能である. -\itemT |'boxbdd'|: 水平ボックスの先頭/末尾,段落の先頭/末尾. -\itemT |'jcharbdd'|: 和文文字達の連続の境界. -\itemT |'diffmet'|: 異なるメトリックの和文文字間に入るglueの計算に使われる. - -\item |jfm.define_type_dim(,,,,,,)| - -文字クラスごとに,文字の寸法のフォントサイズに対する割合を記述する. -\itemitem : 例えば開き括弧類は組版をする際には半角幅だが,TrueTypeフォント内では -左に半角空白が付け加わって全角幅となっていることが多い.このような場合,逆に -TrueTypeフォントを基準にすると,「左に半角幅ずらす」ことをしないといけない. -はその「左へのずらし量」を指定する. -\itemitem : 同様に,「下へのずらし量」を指定する. -\itemitem , , : それぞれ幅,高さ,深さ. -\itemitem : イタリック補正値(未実装). - -\item |jfm.define_glue(, , , , )| - -文字クラスの文字との文字の間に,自然長,伸び, 縮み -(いずれもフォントサイズ基準)のglueを挿入する. - -\item |jfm.define_kern(, , )| - -文字クラスの文字との文字の間に,幅のkernを挿入. - -\enditem - - \vfill\eject \leftline{{\big 組版サンプル}\hfill @@ -330,8 +538,8 @@ TrueTypeフォントを基準にすると,「左に半角幅ずらす」こと \bigskip %% sample -\TeX(読み方については、「読み方」の小節を参照)は数学者・計算機科学者である -ドナルド・クヌース (Donald~E. Knuth) により作られた組版処理ソフトウェアである。 +{\bf\TeX}(読み方については、「読み方」の小節を参照)は数学者・計算機科学者である +ドナルド・クヌース (Donald~E. {\sc Knuth}) により作られた組版処理ソフトウェアである。 \beginsection 名称について @@ -339,7 +547,7 @@ TrueTypeフォントを基準にすると,「左に半角幅ずらす」こと \beginparagraph 表記法 -正しくは“\TeX”と表記するが、それができない場合には +正しくは“{\bf\TeX}”と表記するが、それができない場合には “{\tt TeX}”と表記する(“{\tt TEX}”と表記するのは誤り)。 \beginparagraph 読み方 @@ -354,7 +562,7 @@ TrueTypeフォントを基準にすると,「左に半角幅ずらす」こと \TeX はマークアップ言語処理系であり、チューリング完全性を備えた関数型言語でもある。 文章そのものと、文章の構造を指定する命令とが混在して記述されたテキストファイルを読み込み、 そこに書かれた命令に従って文章を組版して、組版結果を{\tt DVI}形式のファイルに書き出す。 -{\tt DVI}形式というのは、装置に依存しない (device-independent) 中間形式である。 +{\tt DVI}形式というのは、装置に依存しない ({\bf d}e{\bf v}ice-{\bf i}ndependent) 中間形式である。 {\tt DVI}ファイルには紙面のどの位置にどの文字を配置するかといった情報が書き込まれている。 実際に紙に印刷したりディスプレイ上に表示したするためには、{\tt DVI}ファイルを解釈する @@ -374,7 +582,7 @@ Post\-Scriptなど他のページ記述言語へのトランスレータ、プ 比較的よく知られている\TeX 上のマクロパッケージには、クヌース自身による plain \TeX、 一般的な文書記述に優れた\LaTeX\ ({\tt LaTeX})、数学的文書用の\AmS-\TeX などがある。 一般の使用者は、\TeX を直接使うよりも、\TeX に何らかのマクロパッケージを読み込ませたものを -使うことの方が多い。そのため、これらのマクロパッケージのことも “\TeX” と呼ぶ場合があるが、 +使うことの方が多い。そのため、これらのマクロパッケージのことも“\TeX”と呼ぶ場合があるが、 本来は誤用である。 \TeX のマクロパッケージには、他にも次のようなものなどがある。 @@ -387,8 +595,8 @@ Post\-Scriptなど他のページ記述言語へのトランスレータ、プ \item MusiX\TeX\ ({\tt MusiXTeX}) ……楽譜の記述に用いる。 \enditem -\TeX とそれに関連するプログラム、および\TeX のマクロパッケージなどは CTAN(Comprehensive TeX Archive Network、 -包括 TeX アーカイブネットワーク)からダウンロードできる。 +\TeX とそれに関連するプログラム、および\TeX のマクロパッケージなどは CTAN({\bf C}omprehensive \TeX {\bf A}rchive {\bf N}etwork、 +包括\TeX アーカイブネットワーク)からダウンロードできる。 \beginsection 数式の表示例 @@ -414,7 +622,7 @@ $$ \beginsection 生い立ち -\TeX は、クヌースが自身の著書The Art of Computer Programmingを書いたときに、組版の汚さに憤慨し、 +\TeX は、クヌースが自身の著書{\it The Art of Computer Programming\/}を書いたときに、組版の汚さに憤慨し、 自分自身で心行くまで組版を制御するために作成したとされている。開発にあたって、伝統的な組版および その関連技術に対する広範囲にわたる調査を行った。その調査結果を取り入れることで、\TeX は 商業品質の組版ができる柔軟で強力な組版システムになった。 @@ -443,12 +651,12 @@ $$ \beginsection \TeX の日本語化 日本語組版処理のできる日本語版の\TeX および\LaTeX には、アスキー・メディアワークスによるp\TeX\ -(pTeX) およびp\LaTeX\ (pLaTeX) と、NTTの斉藤康己によるNTT J\TeX\ (NTT JTeX) およびNTT J\LaTeX\ -(NTT JLaTeX) などがある。 +({\tt pTeX}) およびp\LaTeX\ ({\tt pLaTeX}) と、NTTの斉藤康己によるNTT J\TeX\ ({\tt NTT JTeX}) およびNTT J\LaTeX\ +({\tt NTT JLaTeX}) などがある。 \TeX の日本語対応において技術的に最も大きな課題は、複数バイト文字コードへの対応である。 p\TeX(および前身の日本語\TeX)は、JIS X 0208を文字集合とした文字コード(ISO-2022-JP、EUC-JP、 -およびShift\_JIS)を直接扱う。DVIフォーマットは元々16ビット以上の文字コードを格納できる仕様が +およびShift\_\thinspace JIS)を直接扱う。DVIフォーマットは元々16ビット以上の文字コードを格納できる仕様が 含まれていた。しかしオリジナルの英語版では使われていなかったため、既存プログラムの多くはp\TeX が 出力するDVIファイルを処理できない。またフォントに関係するファイルフォーマットが拡張されている。 これに対してNTT J\TeX は、複数の1バイト文字セットに分割することで対応している。例えば、