%#! time luatex sample1
\input s1sty.tex % style file

\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
\def\mf{{\mff META{\rm\-}FONT}}
\def\textfontii{\the\textfont2 }
\def\AmS{{\textfontii A\kern-.1667em\lower.5ex\hbox{M}\kern-.125emS}}
\def\UPSILON{\char'7}%
\def\XyM{X\kern-.30em\smash{\raise.50ex\hbox{\UPSILON}}\kern-.30em{M}}%
\def\XyMTeX{\XyM\kern-.1em\TeX}%

% main matter
\centerline{\big Lua\TeX-jaパッケージ}\bigskip
\centerline{\large\the\year/\the\month/\the\day}\medskip

\bigskip

本パッケージは，（最低でもp\TeX と同等の水準の）日本語組版をLua\TeX 上で実現させることを
目標としたマクロである．まだまだ足りないところはあるが，とりあえず動くようになった？ので公開する． 


\beginparagraph 特徴

\item 欧文フォント/和文フォントの外部独立管理．
\item 違う和文フォントでも「メトリックが同じ」なら，字間に空白を挿入する際には同じものとして扱う．
{\bf 例}: 「ほげほげ）{\gt （ふがふが}」は以下の出力より得られた:
\begintt
ほげほげ）{\gt （ふがふが}
\endtt
\item 欧文や和文のベースライン補正が可能．
\item p\TeX とある程度コマンド名が互換ではあるが，{\bf 内部動作についてはp\TeX との100\%互換は
目指していません{\small （p\TeX で不自然なところがあれば，積極的に改める）\inhibitglue}}．
\enditem

\beginparagraph 制限

\item 全体的にテスト不足です．
\item {\bf 現時点で\LaTeX での使用は殆ど考慮されていません．今は``plain Lua\TeX''で使ってください．}
\item |\accent|を和文文字に対して使うことはできません．
これは「フォントを後で置換する」という実装上，仕方のないことだと思われます．
{\small|\/|を試験的に日本語にも対応させました．
アクセントも，|make_accent|の処理をLuaコードで書けば可能だと思われます．}
\item 数式中の日本語は想定していません．|\hbox|か何かで囲ってください．
\item p\TeX にあった以下の機能はまだ実装していません．
\itemitem |\showmode|, |\jfam|.
\itemitem 縦組み関連一式．|\tate|, |\tfont|, |\tbaselineshift|, |\dtou|,$\,\ldots$

\enditem


\beginparagraph ファイル構成

\item {\tt src/}: 核となる\TeX ソースとLuaコードはこのディレクトリ内に入っている．
\itemitem \TeX 用スタイルファイル達
\itemT {\tt luatexja.sty}: 利用者はこのファイルを読み込む．
拡張子は{\tt sty}であるが，plain \TeX と\LaTeX 両方に対応させる方針である．しかし，
{\bf 現時点で\LaTeX での使用は考慮されていない．}
\itemT {\tt luatexja-core.sty}: 
\itemT {\tt luatexja-base.sty}: 
\itemT {\tt luatexja-cctbreg.sty}: 
\itemT {\tt luatexja-compat.sty}: p\TeX 互換用primitive（|\euc|, |\kansuji|）定義部．
\itemT {\tt luatexja-compat-ptex.sty}: 
\itemT {\tt luatexja-plain.sty}: 
\itemT {\tt luatexja-kinsoku.tex}: 禁則用ペナルティ等のパラメータを書いたファイル．
{\tt ukinsoku.tex} (in up\TeX-0.30) から自動生成されたもの．

\itemT {\tt mk-rmlgbm-data.tex}: {\tt luatexja-rmlgbm-data.lua}作成用スクリプト
{\small（小塚明朝を{\tt luaotfload}で読み込んだ時のキャッシュが必要）\inhibitglue}．

\itemitem Luaコード達（旧フォーマット）
\itemT {\tt luatexja-core.lua}: コア部分に使われるLuaコード．
\itemT {\tt luatexja-rmlgbm-data.lua}: 非埋込和文フォント用のデータ（小塚明朝Pr6N R由来）．
\itemT {\tt jfm-ujis.lua}: up\TeX-0.30の{\tt ujis.tfm}ベースのメトリックサンプル．
\itemT {\tt jfm-mono.lua}: 「全文字が全角幅」のメトリックサンプル．

\itemitem Luaコード達（新フォーマット，{\tt src/luatexja/}以下）

\itemT {\tt base.lua}
\itemT {\tt compat.lua}: p\TeX 互換用primitive（|\euc|, |\kansuji|）実装部．
\itemT {\tt jisx0208.lua}: |\euc|等で使うJIS~X~0208→Unicode変換表．
\itemT {\tt infomute.lua}
\itemT {\tt jfont.lua}: 和文フォント定義部のLuaコード．
\itemT {\tt rmlgbm.lua}: 非埋込和文フォント (Ryumin-Light etc.) 定義用コード．
\itemT {\tt jfmglue.lua}: 和文処理に伴う空白の挿入処理部．
\itemT {\tt tangle.lua}
\itemT {\tt charrange.lua}: 「和文文字の範囲」管理部．
\itemT {\tt debug.lua}
\itemT {\tt inputbuf.lua}: 「和文文字直後の改行」処理用．
\itemT {\tt stack.lua}: Lua\TeX-ja スタック管理システム．
\enditem

\beginsection 使用方法

大雑把に言うと，plain \TeX の状況で，以下のようにすればよい．
\begintt
\input luatexja.sty               % ←マクロ本体を読み込み
\jfont\tenipam={file:ipam.ttf:jfm=ujis} at 13.5\jQ 
\tenipam\parindent=1\zw 

\rm\tenipam abcほげほげ）（あいう本文本文……
\endtt

\beginparagraph 和文フォントの定義

Lua\TeX-jaでは，大雑把にいうと
和文フォントは「実際の字形」と「和文用のメトリック情報 (JFM)」の組である．
JFM は和文文字の幅や，和文文字間の空白の入り方などを規定するもの%
{\small （p\TeX におけるJFMファイルとほぼ同じ内容）}であり，
|jfm-<name>.lua|という名称のファイルにLuaコードの形で書かれている．

和文フォントを使うには，
\TeX の|\font| primitiveと同様の書式を持った次の命令を用いて和文フォントを定義する：

\begintt
  \jfont<font>={<font_name>:<features>} <size>       % local に定義
  \globaljfont<font>={<font_name>:<features>} <size> % global に定義
\endtt

\item {\bf <font_name> の指定について}\par\noindent
内部でluaotfloadパッケージを読み込んでいる．大きくわけて，以下の4種類がある．
このうち，前の2つはluaotfloadパッケージの機能である．
\itemitem |file:<file_name>|\par\noindent
TrueType/OpenTypeフォントをファイル名<file_name>で指定．
\itemitem |name:<font_name>|\par\noindent
システム内のフォント名を<font_name>に指定することも可能．
\itemitem |psft:<PSfont_name>|\par\noindent
PSフォント名<PSfont_name>を直接指定することもでき，
この場合はフォントは名前だけ（非埋込）となる．
例えば，本文章では，
\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:<vfname>|

\item {\bf JFMの指定}：<features>欄に次を指定する．\par\noindent
\itemitem |jfm=<jfm_file>|: JFMとして|jfm-<jfm_file>.lua|を用いることを示す．必須．
\itemitem |jfmvar=<varkey>|\par\noindent
和文文字間の空白の挿入処理は，使用するJFMと，この<varkey>の値とのペアによって行われる．

\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 不良なJFMを用いた場合，エラーを返すとともに，<font>の意味は|\relax|となる．

\beginparagraph 「和文文字の範囲」の設定

\item |\defcharrange{<number>}{<char_range>}|: 文字範囲の新規定義/追加．
\itemitem <number>:  文字範囲の番号で，1--216の整数値で指定．
\itemitem <range>: 文字コードの範囲を|"100-"200, 800, 1701-|のように指定する．
\itemT ASCII codeの範囲 (|0x00|--|0x7F|) は指定できない．
\itemT 既に他の$n$番の文字範囲に使われている領域を指定した場合は，
その領域は$n$番の文字範囲からは除外される．即ち，後に定義した文字範囲の方が優先度が高い．
\itemitem 定義した文字範囲ごとに，「和文扱い」「欧文扱い」をlocalに指定できる．
% 216 = (31*7-1)

\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 組版パラメタの調整

日本語組版用の各種パラメタの調整には，次の命令を用いる．
\begintt
  \ltjsetparameter{<key>=<value>, ...}       % local に変更
  \ltjglobalsetparameter{<key>=<value>, ...} % global に変更
\endtt

<key> に許される値は次の通りである．

\enum ★がついているものは，段落や水平ボックス構成時の値が全体に影響するものである．

\enum ◎がついているものは，自動的にglobalな代入となってしまうもの．

\item |prebreakpenalty={<chr_code>, <penalty>}|★\par\noindent
p\TeX の|\prebreakpenalty|に対応した設定項目である．
\itemitem <chr_code>: 文字コードを指定する．一旦補助カウンタに代入されるので，
16進法での数値の指定 (|"abcd|) や，%"
文字トークンによる指定 (|`あ|) も可能である．
\itemitem <penalty>: penalty の値を$-10000$から10000までの整数で指定する．

\item |postbreakpenalty={<chr_code>, <penalty>}|★\par\noindent
同様に，p\TeX の|\postbreakpenalty|に対応した設定項目である．
p\TeX では，同一文字に対して|\prebreakpenalty|, |\postbreakpenalty|の両方を定義する
ことはできなかったが，Lua\TeX-jaでは可能である．

\item |kcatcode={<chr_code>, <kind>}|★\par\noindent
文字コード<chr_code>の文字が和文文字扱いされている時，
「和文文字の種類」を|0|--|"7FFFFFFF|の自然数値<kind>で指定する．%"
\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={<chr_code>, <mode>}|★\par\noindent
p\TeX の|\inhibitxspcode|に対応した設定項目である．<mode>で許される値は，
\itemitem |0|, |inhibit|: 前後の欧文文字との間の|xkanjiskip|自動挿入を禁止．
\itemitem |2|, |preonly|: 前の欧文文字との間の|xkanjiskip|自動挿入のみを許可．
\itemitem |1|, |postonly|: 後の欧文文字との間の|xkanjiskip|自動挿入のみを許可．
\itemitem |3|, |allow|: 前後の欧文文字との間の|xkanjiskip|自動挿入を許可．
\item |alxspmode={<chr_code>, <mode>}|★\par\noindent
同様に，p\TeX の|\xspcode|に対応した設定項目である．
<mode>で許される値は，
\itemitem |0|, |inhibit|: 前後の和文文字との間の|xkanjiskip|自動挿入を禁止．
\itemitem |1|, |preonly|: 前の和文文字との間の|xkanjiskip|自動挿入のみを許可．
\itemitem |2|, |postonly|: 後の和文文字との間の|xkanjiskip|自動挿入のみを許可．
\itemitem |3|, |allow|: 前後の和文文字との間の|xkanjiskip|自動挿入を許可．

\item |yalbaselineshift=<dimen>|:
p\TeX の|\ybaselineshift|に対応したものであり，
欧文文字のベースライン補正量をdimensionで指定する．
\itemitem 正の値を指定すると，その分だけ欧文文字は下にずれることとなる．
\itemitem 数式中では，boxやruleもこの量だけずれる\hfil\break
（よって，行中数式は全体が|yalbaselineshift|だけずれたように見える）．
\item |yjabaselineshift=<dimen>|:
和文文字のベースライン補正量をdimensionで指定する．
p\TeX では「和文が主」という考えからか，常に和文文字のベースラインが基準であり，
欧文文字の方をずらすことになっていた．しかし，「欧文の中に和文をちょっと入れる」ような場合では，
逆に和文文字をずらす方が理にかなっているので，和文文字のベースラインもずらせるようにした．

また，この値を適切に調整することで，%
{\small 異なる文字サイズの文字を「上下中央揃え」で組む}ことも可能である．

\item |kanjiskip=<skip>|★\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=<skip>|★\par\noindent
和文文字と欧文文字の間に入る空白量．p\TeX の同名の命令と同様．
これも，自然長が|\maxdimen|の場合は，JFMで指定された値を使う．


\item |jcharwidowpenalty=<penalty>|★\par\noindent
段落において「最後の1文字のみが次の行に」くることを
抑制するためのpenalty値．このpenaltyは，段落内にある，最後の「|kcatcode|の最下位bitが
1で{\bf ない}ような和文文字」の直前に挿入される．


\item |autospacing[=<bool>]|\par\noindent
和文文字間のglue（|kanjiskip|）の自動挿入をするかしないかを制御．
p\TeX では段落/hbox 単位での設定となったが，Lua\TeX-ja では
そうではなくなった．
挿入可能な箇所の両端のノードにおいて，片方でも
この値がfalseなら自動挿入は行われる．つまり，例えば
\begintt
あ\ltjsetparameter{autospacing=false}いう
\endtt
の場合，「あい」の間には|kanjiskip|が挿入され，「いう」の間には入らない．
\item |autoxspacing[=<bool>]|\par\noindent
和欧文間のglue（|xkanjiskip|）の自動挿入をするかしないかを制御．
その他は|autospacing|と同様．

\item |differentjfm=(large/small/average/both)|★◎\par\noindent
異なる$(\hbox{<jfm>}, \hbox{<varkey>})$である2つの和文文字の間の
glue/kernの計算方法を設定する．
左側文字由来，右側文字由来のものが両方存在した場合にのみ効力をもつ．
\itemitem {\tt large}: glue/kernの幅が両者のうち大きい方になるように定める．
\itemitem {\tt small}: 両者のうち小さい方．
\itemitem {\tt average}: 両者の相加平均．
\itemitem {\tt both}: 両者の合計値の幅をもつglue/kernを挿入する．
この指定は，JFM由来の|kanjiskip|の値が左右の和文文字で異なったときの
挙動にも適用される．

\item |jacharrange={<range_num>,<range_num>,...}|: 
$\lvert\hbox{<range_num>}\rvert$番の文字範囲の文字を和文扱いするか欧文扱いするかを設定する．
\itemitem $\lvert\hbox{<range_num>}\rvert>216$の場合，
「どの文字範囲にも属さない|U+0100|以降の文字」に
対しての処理を行う．
\itemitem 正値が指定されたら，$\lvert\hbox{<range_num>}\rvert$番の文字範囲は和文文字扱いとなる．
\itemitem 負値が指定されたら，$\lvert\hbox{<range_num>}\rvert$番の文字範囲は欧文文字扱いとなる．
\itemitem $\hbox{<range_num>}=0$の場合は，単に無視される．
\enditem

\beginparagraph 組版パラメタの取得

日本語組版用の各種パラメタの取得には，次の命令を用いる．
\begintt
  \ltjgetparameter{<key>} or \ltjgetparameter{<key>}{<chr_code>}
\endtt
戻り値は全て「空白は|\catcode=10|，それ以外の文字は全て|\catcode=12|」の文字列である．

<key>に指定できる値は，説明がない限りは|\ltjsetparameter|で指定できる<key>と同じで，次の通りである，

\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
これらは各文字コード別に設定される値であるので，文字コード<chr_code>を第2引数にとる．
指定されている整数値を表す文字列を返す．

\item |jacharrange|: 文字範囲の番号$n$を第2引数にとり，$n$番の文字範囲が
和文文字扱いされていれば|0|，欧文文字扱いされていれば|1|を返す．
$n\notin [1,216]$の場合は，「どの文字範囲にも属さない|U+0080|以降の文字」に対しての結果を返す（しかし，前に述べたデフォルトでの設定のため，実際には|U+0100|以降となる）．

\item |chartorange|: 文字コード<chr_code>を第2引数にとり，それが属している文字範囲の番号を返す．
\itemitem <chr_code>がUnicodeの範囲外または|0x80|未満ならば，|-1|を返す．
\itemitem 上の場合以外で，<chr_code>の文字がどの文字範囲にも属さない場合は，|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

\beginsection JFMについて

Lua\TeX-jaで用いる和文用のメトリック情報は，次のようなLuaファイルである．
見本として，|jfm-ujis.lua|を入れてある．

\begintt
luatexja.jfont.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

全体は，「関数|luatexja.jfont.define_jfm|にテーブルを引数として与える」という構造になっている．
以下に，テーブルの中身を述べる．
\item |dir|: 組方向を指定する．将来的にはいずれ縦組（|'tate'|）を実装したいが，
現時点では横組（|'yoko'|）のみの対応．
\item |zw|, |zh|: それぞれ|\zw|, |\zh|のフォントサイズに対する割合を記述する（必須）．
通常は両方とも1.0となるだろう．
\item |kanjiskip|, |xkanjiskip|: それぞれ和文文字間グルー量，和欧文間グルー量を
\begintt
{<width>, <stretch>, <shrink>}
\endtt
という形で，フォントサイズ単位で指定する．
\item 数字のindex $i$を持った値：$i$番の文字クラスについての情報を記述する．
\itemitem |glue|: 現在の文字クラスの文字の後に挿入するglueを指定する．
この項目の内容は
\begintt
{ [<j>] = { <width>, <stretch>, <shrink> }, ... }
\endtt
というテーブルであり，各要素は

{\par\medskip\advance\leftskip3\zw\noindent\rightskip2\zw
$i$番の文字クラスの文字と$j$番の文字クラスの文字の間に，
自然長<width>，伸び<stretch>, 縮み<shrink>（フォントサイズ基準）なる
glueを挿入
\par\medskip}

\noindent という意味である．

\itemitem |kern|: 現在の文字クラスの文字の後に挿入するkernを指定する．
この項目の内容も，
\begintt
{ [<j>] = <width>, ... }
\endtt
というテーブルであり，各要素は

{\par\medskip\advance\leftskip3\zw\noindent\rightskip2\zw
$i$番の文字クラスの文字と$j$番の文字クラスの文字の間に，\hfil\break
幅<width>の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で良いだろう．

\enditem

\beginsection 互換用命令（書きかけ）

{\tt luatexja-compat.sty}を読み込むことで，次が追加．
\item |\euc|, |\jis|, |\sjis|, |\kuten|, |\ucs|: 
それぞれEUC-JP，ISO-2022-JP，Shift-JIS，区点コードからUnicodeへの変換を行う．
JIS~X~0208→Unicodeへの変換テーブルとしては，up\TeX-0.30で用いられているものを利用している．
\item |\kansuji|
\item |kansujichar={<num>, <char>}|~key in |\ltjsetparameter|.
\enditem


\beginsection 大まかな処理の流れ

Lua\TeX-jaパッケージでは，次のような流れで実際の処理を行っている．

\item {\bf 行末空白の削除: |process_input_buffer| callback}

通常，\TeX において改行は空白とほぼ同じ意味であり，
改行した箇所には自動的に空白が入るようになっている．
だが，日本語ではそのような振る舞いは不自然であり，p\TeX でも
「和文文字で行が終わった場合，改行文字は無視する」という
仕様になっている．

そこで，入力が和文文字で終わった場合，コメント文字を挿入することにより
この問題を解決する方法をとっている．{\small
この部分のコードは前田氏のjafontspecパッケージの部分から拝借したが，挿入する文字を|%|から
（通常使用されることはないと思われる）|U+FFFFF|へと変更している．}

しかし，現行Lua\TeX の仕様により，完全にp\TeX と同じというわけには
いかず，次のような動作になっている：
\itemitem 入力行の末尾が，正規表現で
\begintt
[:jchar:][\{\}]^*$
\endtt
となっている場合，即ち，{\bf catcodeが11 or 12の和文文字の後に，
グループ境界文字（catcodeが1 or 2の文字．通常は\hskip\ltjgetparameter{xkanjiskip}|{|%
\hskip\ltjgetparameter{xkanjiskip}や\hskip\ltjgetparameter{xkanjiskip}|}|%
\hskip\ltjgetparameter{xkanjiskip}）が任意個続いて
行が終わっていた}場合，この行の入力にコメント文字を追加．
\itemitem 上の「和文文字」「グループ境界文字」の判定は，処理対象の入力行の前行末尾の時点の
設定値をもとに行う．そのため，行の途中でcatcodeの変更を行った場合などで，p\TeX と異なる挙動
を示す場合がある．

\item {\bf 和文フォントへの置換: |hyphenate| callback}

この段階の前では，和文文字であっても，それを内部で表している|glyph_node|~$p$は，
「|\tenrm あ|」のように，欧文フォントが指定されている状態になっている．しかし，
$p$は「現在の和文フォント」の番号もattribute |\ltj@curjfnt|として保持している．そのため，
この段階では，「和文文字が格納されている」|glyph_node|~$p$に対して，次を行う．

\itemitem $p$のフォントをattribute |\ltj@curjfnt|の値に置換．
\itemitem $p$の|language| fieldを|\ltj@japanese|の値に置換．
誤って和文文字間でハイフネーションがされてしまうのを防止するため．
\itemitem $p$の文字の文字クラスを計算し，その値をattribute |\ltj@charclass|に格納．
これにより，|jp90|等のfeatureによりグリフが置換されても，文字クラスの値は保たれる．

\item {\bf （luaotfloadパッケージによるグリフ置換等の処理はこの位置で）}

\item {\bf 和文処理グルーの挿入: |pre_linebreak_filter|, |hpack_filter| callbacks}

動作の詳細については，{\tt jfmglue.pdf}（未完）を参照．

\item {\bf ベースライン補正: |pre_linebreak_filter|, |hpack_filter| callbacks}

この段階では，（主として）欧文文字のベースラインをずらす作業を行う．幸いにして，
Lua\TeX で文字を表す|glyph_node|には|y_offset| fieldがあるので，作業は楽である．

補正量は，attribute |\ltj@yablshift|の値（先も書いた通り，sp単位）である．和文文字の
補正量は|\ltj@ykblshift|の値で指定されるが，以前の「和文フォントへの置換」処理において，
|\ltj@yablshift|へと値を移し変えているので，この段階では|\ltj@yablshift|の値のみを気にしている．

さて，実際に補正されるのは次の場合である:
\itemitem 文字 (|glyph_node|)
\itemitem ボックス・rule（文中数式内部）．これによって，数式全体が下がったように見えるはず．

\item {\bf 和文文字の幅の補正: |pre_linebreak_filter|, |hpack_filter| callbacks}

例えば，括弧類は「フォント中では全角幅だが，組版では半角幅として扱う」ことが多いが，このように
文字幅を補正する処理を最後に行う．jafontspecパッケージのように，補正対象となる|glyph_node|~$p$%
を，しかるべき量のglueと共に|\hbox|にカプセル化して行っている．

\enditem 


\vfill\eject
\leftline{{\big 組版サンプル}\hfill
\noindent 出典: 日本語Wikipediaの「\TeX」の項，2011/3/10}

\bigskip
%% sample
{\bf\TeX}（読み方については、「読み方」の小節を参照）は数学者・計算機科学者である
ドナルド・クヌース (Donald~E. {\sc Knuth}) により作られた組版処理ソフトウェアである。

\beginsection 名称について

製作者であるクヌースによって以下のように要請されている。

\beginparagraph 表記法

正しくは“{\bf\TeX}”と表記するが、それができない場合には
“{\tt TeX}”と表記する（“{\tt TEX}”と表記するのは誤り）。

\beginparagraph 読み方

\TeX はギリシャ文字の T-E-X（タウ・イプシロン・カイ）であるから、「テックス」ではなく、
ギリシャ語読みの [tex]（「テフ」）のように発音するのが正しい。
しかしそのような発音は難しいので、クヌースは「テック」と読んでも構わないとしている。
日本では「テフ」または「テック」という読み方が広まっている。

\beginsection 機能

\TeX はマークアップ言語処理系であり、チューリング完全性を備えた関数型言語でもある。
文章そのものと、文章の構造を指定する命令とが混在して記述されたテキストファイルを読み込み、
そこに書かれた命令に従って文章を組版して、組版結果を{\tt DVI}形式のファイルに書き出す。
{\tt DVI}形式というのは、装置に依存しない ({\bf d}e{\bf v}ice-{\bf i}ndependent) 中間形式である。

{\tt DVI}ファイルには紙面のどの位置にどの文字を配置するかといった情報が書き込まれている。
実際に紙に印刷したりディスプレイ上に表示したするためには、{\tt DVI}ファイルを解釈する
別のソフトウェアが用いられる。{\tt DVI}ファイルを扱うソフトウェアとして、各種のヴューワや
Post\-Scriptなど他のページ記述言語へのトランスレータ、プリンタドライバなどが利用されている。

組版処理については、行分割およびページ分割位置の判別、ハイフネーション、リガチャ、
およびカーニングなどを自動で処理でき、その自動処理の内容も種々のパラーメータを変更する
ことによりカスタマイズできる。数式組版についても、多くの機能が盛り込まれている。
\TeX が文字などを配置する精度は$25.4 / (72.27\times 2^{16})\,{\rm mm}$%
（約$5.363\,{\rm nm}$、$4{,}736{,}286.72\,{\rm dpi}$）である。

\TeX の扱う命令文の中には、組版に直接係わる命令文の他に、新しい命令文を定義するための
命令文もある。\TeX のこの機能を使って使用者が独自に作った命令文はマクロと呼ばれ、
こうした独自の改良をマクロパッケージと呼ばれる形で配布できる。

比較的よく知られている\TeX 上のマクロパッケージには、クヌース自身による plain \TeX、
一般的な文書記述に優れた\LaTeX\ ({\tt LaTeX})、数学的文書用の\AmS-\TeX などがある。
一般の使用者は、\TeX を直接使うよりも、\TeX に何らかのマクロパッケージを読み込ませたものを
使うことの方が多い。そのため、これらのマクロパッケージのことも“\TeX”と呼ぶ場合があるが、
本来は誤用である。

\TeX のマクロパッケージには、他にも次のようなものなどがある。

\item B{\sc ib}\TeX\ ({\tt BibTeX}) ……参考文献リストの作成に用いる。
\item S{\sc li}\TeX\ ({\tt SLiTeX}) ……プレゼンテーション用スライドの作成に用いる。
\item \AmS-\LaTeX\ ({\tt AMS-LaTeX}) ……
数学的な文書の記述に強い\AmS-\TeX の機能と\LaTeX の機能を併せ持つ。
\item \XyMTeX\ ({\tt XyMTeX}) ……化学構造式の描画に用いる。
\item MusiX\TeX\ ({\tt MusiXTeX}) ……楽譜の記述に用いる。
\enditem

\TeX とそれに関連するプログラム、および\TeX のマクロパッケージなどは CTAN（{\bf C}omprehensive \TeX {\bf A}rchive {\bf N}etwork、
包括\TeX アーカイブネットワーク）からダウンロードできる。


\beginsection 数式の表示例

たとえば
\begintt
-b \pm \sqrt{b^{2} - 4ac} \over 2a
\endtt
は以下のように表示される。
$$
-b \pm \sqrt{b^{2} - 4ac} \over 2a
$$

また、
\begintt
f(a,b) = \int_{a}^{b}\frac{1 + x}{a + x^{2} + x^{3}}dx
\endtt
は以下のように表示される。
$$
f(a,b) = \int_{a}^{b}{1 + x \over a + x^{2} + x^{3}}dx
$$


\beginsection 生い立ち

\TeX は、クヌースが自身の著書{\it The Art of Computer Programming\/}を書いたときに、組版の汚さに憤慨し、
自分自身で心行くまで組版を制御するために作成したとされている。開発にあたって、伝統的な組版および
その関連技術に対する広範囲にわたる調査を行った。その調査結果を取り入れることで、\TeX は
商業品質の組版ができる柔軟で強力な組版システムになった。

\TeX はフリーソフトウェアであり、ソースコードも公開されていて、誰でも改良を加えることができる。
その改良版の配布も、\TeX と区別できるような別名を付けさえすれば許される。また、\TeX は非常に
バグが少ないソフトウェアとしても有名で、ジョーク好きのクヌースが、バグ発見者に対しては
前回のバグ発見者の2倍の懸賞金をかけるほどである。この賞金は小切手で払われるのだが、貰った人は
記念に取っておく人ばかりなので、結局クヌースの出費はほとんど無いという。

クヌースは\TeX のバージョン 3 を開発した際に、これ以上の機能拡張はしないことを宣言した。
その後は不具合の修正のみがなされ、バージョン番号は 3.14、3.141、3.1415、$\ldots$というように
付けられている。これは更新のたびに数字が円周率に近づいていくようになっていて、
クヌースの死の時点をもってバージョン$\pi$として、バージョンアップを打ち切るとのことである。

クヌースは\TeX の開発と同時に、\TeX で利用するフォントを作成するためのシステムである
\mf も開発した。こちらのバージョン番号は 2.71、2.718、2.7182、$\ldots$というように、
更新のたびに数字がネイピア数に近づいていくようになっている。さらにクヌースは\mf を使って、
\TeX の初期設定欧文フォントであるComputer Modernのデザインも行った。

\TeX および\mf は、これもクヌース自身によって提唱されている文芸的プログラミング\ 
(Literate Programming) を実現する{\tt WEB}というシステムでPascalへトランスレートされることを
前提に記述されている。しかし実際には{\tt WEB2C}でC言語に変換してコンパイルされ実行形式を
得ることが多い。

\beginsection \TeX の日本語化

日本語組版処理のできる日本語版の\TeX および\LaTeX には、アスキー・メディアワークスによるp\TeX\ 
({\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\_\thinspace JIS）を直接扱う。DVIフォーマットは元々16ビット以上の文字コードを格納できる仕様が
含まれていた。しかしオリジナルの英語版では使われていなかったため、既存プログラムの多くはp\TeX が
出力するDVIファイルを処理できない。またフォントに関係するファイルフォーマットが拡張されている。
これに対してNTT J\TeX は、複数の1バイト文字セットに分割することで対応している。例えば、
ひらがなとカタカナは内部的には別々の1バイト文字セットとして扱われる。このためにオリジナルの
英語版からの変更が小さく、移植も比較的容易である。ファイルフォーマットが同じなので英語版の
プログラムでDVIファイル等を処理することもできる。しかし後述するフォントのマッピングの問題が
あるため、実際には多くの使用者がNTT J\TeX 用に拡張されたプログラムを使っている。

使用する日本語用フォントについてはp\TeX が写研フォントの使用を、NTT J\TeX が大日本印刷フォントの
使用を前提としており、それぞれフォントメトリック情報（フォントの文字寸法の情報）をバンドルして
配布している。しかし有償であるこれらのフォントのグリフ情報を持っていなくても、画面表示や印刷の
際に使用者が利用できる他の日本語用フォントで代用することができる。つまり写研フォントや
大日本印刷フォントのフォントメトリック情報を用いて文字の位置を固定し、画面表示や印刷には
他の日本語用フォントを用いていることが可能である。このため日本語化された\TeX 関係プログラムの
ほとんどは、画面表示や印刷で実際に使うフォントを選択できるように、フォントのマッピング
（対応付け）を定義する機能を持っている。

歴史的には、アスキーが日本語\TeX の PC-9800 シリーズ対応版を販売したために個人の使用者を中心に
普及した。一方、NTT J\TeX は元の英語版プログラムからの変更が比較的小さいという利点を受けて、
UNIX®およびUNIX互換OSを使う大学や研究機関の関係者を中心に普及した。

しかし現在では次に挙げる理由から、日本語対応\TeX としてp\TeX が使われていることが多い。

\item UNIX®用、およびUNIX互換OS用の主な日本語対応\TeX 配布形態である
ptexliveやptetex3がp\TeX のみを採用している。
\item Microsoft Windows用の主な日本語対応\TeX 配布形態であるW32\TeX が
p\TeX を扱える（NTT J\TeX も扱える）。
\item p\TeX の扱い方を解説する文献の方が、NTT J\TeX のものに比べて、
出版物とWeb上文書の両方で多い。
\item p\TeX は縦組みにも対応しているが、NTT J\TeX は対応していない。
\enditem

\beginsection \TeX による組版の作業工程

\TeX を利用して組版を行うには、通常次のような作業工程を取る。

\enum テキストエディタなどを用いて、文章に組版用命令文を織り込んだソースファイルを作成する。
\enum OSのコマンドラインから “|tex FileName.tex|” などと入力して\TeX を起動し、
  {\tt DVI}ファイルを生成させる。
\itemitem ソースファイルにエラーがあれば、修正して再度\TeX を起動する。
\enum {\tt DVI}ウェアとよばれる{\tt DVI}命令文を解するソフトウェアを用いて組版結果を表示し、確認する。
\itemitem {\tt DVI}ウェアにはxdvi/xdvikやdviout for Windowsなどの{\tt DVI}ヴューア、
  Dvips(k)やdvipdfm/DVIPDFM$x$などのファイル形式変換ソフトウェアなどがある。
\itemitem {\tt DVI}ファイルを{\tt DVI}ヴューアで画面表示または印刷する、
  あるいはPDFやPost\-Scriptに変換して画面表示または印刷することで、組版結果を確認する。
\itemitem 修正の必要があれば、ソースファイルを修正して再度{\tt DVI}ファイルを作成、確認する。
\enditem

この間、作業工程が変わるたびにそれぞれのプログラムを切り替えたり、
扱う文書が大きいと章ごとにソースファイルを分割して管理したりと、比較的煩雑な作業を伴う。
そのため、この工程に係わる各種のプログラムやソースファイルの管理を一元的に行う
\TeX 用の統合環境がいくつか作成されている。

\beginparagraph GUI環境と\TeX

GUIはPCの普及に一役買ったが、同時にGUIしか触ったことのないPC利用者が増加した。
そのような利用者が、コマンドラインでの操作を余儀なくされる\TeX を非常に扱いづらく
感じてしまうのは否めないことである。
このため、GUIに特化した\TeX 用統合環境もいくつか作成されている。
\end
