OSDN Git Service

Japanese version of the manual (Section 4.3).
[luatex-ja/luatexja.git] / doc / sample1.tex
1 %#! time luatex sample1
2 \input s1sty.tex % style file
3
4 \overfullrule=0pt
5 \def\LaTeX{L\kern-.36em\setbox0=\hbox{T}\vbox to\ht0{\hbox{\sx A}\vss}\kern-.15em\TeX}
6 \font\mff=manfnt at 10pt
7 \def\mf{{\mff META{\rm\-}FONT}}
8 \def\textfontii{\the\textfont2 }
9 \def\AmS{{\textfontii A\kern-.1667em\lower.5ex\hbox{M}\kern-.125emS}}
10 \def\UPSILON{\char'7}%
11 \def\XyM{X\kern-.30em\smash{\raise.50ex\hbox{\UPSILON}}\kern-.30em{M}}%
12 \def\XyMTeX{\XyM\kern-.1em\TeX}%
13
14 % main matter
15 \centerline{\big Lua\TeX-jaパッケージ}\bigskip
16 \centerline{\large\the\year/\the\month/\the\day}\medskip
17
18 \bigskip
19
20 本パッケージは,(最低でもp\TeX と同等の水準の)日本語組版をLua\TeX 上で実現させることを
21 目標としたマクロである.まだまだ足りないところはあるが,とりあえず動くようになった?ので公開する. 
22 {\bf 本文章の更新は事実上停止しています.以降の更新は{\tt manual.dtx}と,そこから作られる{\tt man-en.pdf}, {\tt man-ja.pdf}で行います.}
23
24 \beginparagraph 特徴
25
26 \item 欧文フォント/和文フォントの外部独立管理.
27 \item 違う和文フォントでも「メトリックが同じ」なら,字間に空白を挿入する際には同じものとして扱う.
28 {\bf 例}: 「ほげほげ){\gt (ふがふが}」は以下の出力より得られた:
29 \begintt
30 ほげほげ){\gt (ふがふが}
31 \endtt
32 \item 欧文や和文のベースライン補正が可能.
33 \item p\TeX とある程度コマンド名が互換ではあるが,{\bf 内部動作についてはp\TeX との100\%互換は
34 目指していません{\small (p\TeX で不自然なところがあれば,積極的に改める)\inhibitglue}}.
35 \enditem
36
37 \beginparagraph 制限
38
39 \item 全体的にテスト不足です.
40 \item {\bf 現時点で\LaTeX での使用は殆ど考慮されていません.今は``plain Lua\TeX''で使ってください.}
41 \item |\accent|を和文文字に対して使うことはできません.
42 これは「フォントを後で置換する」という実装上,仕方のないことだと思われます.
43 {\small|\/|を試験的に日本語にも対応させました.
44 アクセントも,|make_accent|の処理をLuaコードで書けば可能だと思われます.}
45 \item 数式中の日本語は想定していません.|\hbox|か何かで囲ってください.
46 \item p\TeX にあった以下の機能はまだ実装していません.
47 \itemitem |\showmode|, |\jfam|.
48 \itemitem 縦組み関連一式.|\tate|, |\tfont|, |\tbaselineshift|, |\dtou|,$\,\ldots$
49
50 \enditem
51
52
53 \beginparagraph ファイル構成
54
55 \item {\tt src/}: 核となる\TeX ソースとLuaコードはこのディレクトリ内に入っている.
56 \itemitem \TeX 用スタイルファイル達
57 \itemT {\tt luatexja.sty}: 利用者はこのファイルを読み込む.
58 拡張子は{\tt sty}であるが,plain \TeX と\LaTeX 両方に対応させる方針である.
59 \itemT {\tt luatexja-core.sty}: 
60 \itemT {\tt luatexja-base.sty}: 
61 \itemT {\tt luatexja-cctbreg.sty}: 
62 \itemT {\tt luatexja-compat.sty}: p\TeX 互換用primitive(|\euc|, |\kansuji|)定義部.
63 \itemT {\tt luatexja-compat-ptex.sty}: 
64 \itemT {\tt luatexja-plain.sty}: 
65 \itemT {\tt luatexja-kinsoku.tex}: 禁則用ペナルティ等のパラメータを書いたファイル.
66 {\tt ukinsoku.tex} (in up\TeX-0.30) から自動生成されたもの.
67
68 \itemT {\tt mk-rmlgbm-data.tex}: {\tt luatexja-rmlgbm-data.lua}作成用スクリプト
69 {\small(小塚明朝を{\tt luaotfload}で読み込んだ時のキャッシュが必要)\inhibitglue}.
70
71 \itemitem \LaTeX 用スタイルファイル達
72 \itemT {\tt luatexja-latex.sty}: 
73 \itemT {\tt lltjdefs.sty}: 
74 \itemT {\tt lltjfont.sty}: 
75
76
77 \itemitem Luaコード達(旧フォーマット)
78 \itemT {\tt luatexja-core.lua}: コア部分に使われるLuaコード.
79 \itemT {\tt luatexja-rmlgbm-data.lua}: 非埋込和文フォント用のデータ(小塚明朝Pr6N R由来).
80 \itemT {\tt jfm-ujis.lua}: up\TeX-0.30の{\tt ujis.tfm}ベースのメトリックサンプル.
81 \itemT {\tt jfm-mono.lua}: 「全文字が全角幅」のメトリックサンプル.
82
83 \itemitem Luaコード達(新フォーマット,{\tt src/luatexja/}以下)
84
85 \itemT {\tt base.lua}
86 \itemT {\tt compat.lua}: p\TeX 互換用primitive(|\euc|, |\kansuji|)実装部.
87 \itemT {\tt jisx0208.lua}: |\euc|等で使うJIS~X~0208→Unicode変換表.
88 \itemT {\tt infomute.lua}
89 \itemT {\tt jfont.lua}: 和文フォント定義部のLuaコード.
90 \itemT {\tt rmlgbm.lua}: 非埋込和文フォント (Ryumin-Light etc.) 定義用コード.
91 \itemT {\tt jfmglue.lua}: 和文処理に伴う空白の挿入処理部.
92 \itemT {\tt math.lua}: 数式モード中の和文文字のフォント置換部分.
93 \itemT {\tt tangle.lua}
94 \itemT {\tt charrange.lua}: 「和文文字の範囲」管理部.
95 \itemT {\tt debug.lua}
96 \itemT {\tt inputbuf.lua}: 「和文文字直後の改行」処理用.
97 \itemT {\tt stack.lua}: Lua\TeX-ja スタック管理システム.
98 \enditem
99
100 \beginsection 使用方法
101
102 大雑把に言うと,plain \TeX の状況で,以下のようにするか,
103 \begintt
104 \input luatexja.sty               % ←マクロ本体を読み込み
105 \jfont\tenipam={file:ipam.ttf:jfm=ujis} at 13.5\jQ 
106 \tenipam\parindent=1\zw 
107
108 \rm\tenipam abcほげほげ)(あいう本文本文……
109 \endtt
110 \LaTeX において preamble 部で
111 \begintt
112 \usepackage{luatexja}
113 \endtt
114 と書けばよい.標準では非埋込の標準和文フォントRyumin-Light, GothicBBB-Mediumが使われる.
115
116 \beginparagraph 和文フォントの定義
117
118 Lua\TeX-jaでは,大雑把にいうと
119 和文フォントは「実際の字形」と「和文用のメトリック情報 (JFM)」の組である.
120 JFM は和文文字の幅や,和文文字間の空白の入り方などを規定するもの%
121 {\small (p\TeX におけるJFMファイルとほぼ同じ内容)}であり,
122 |jfm-<name>.lua|という名称のファイルにLuaコードの形で書かれている.
123
124 和文フォントを使うには,
125 \TeX の|\font| primitiveと同様の書式を持った次の命令を用いて和文フォントを定義する:
126
127 \begintt
128   \jfont<font>={<font_name>:<features>} <size>       % local に定義
129   \globaljfont<font>={<font_name>:<features>} <size> % global に定義
130 \endtt
131
132 \item {\bf <font_name> の指定について}\par\noindent
133 内部でluaotfloadパッケージを読み込んでいる.大きくわけて,以下の4種類がある.
134 このうち,前の2つはluaotfloadパッケージの機能である.
135 \itemitem |file:<file_name>|\par\noindent
136 TrueType/OpenTypeフォントをファイル名<file_name>で指定.
137 \itemitem |name:<font_name>|\par\noindent
138 システム内のフォント名を<font_name>に指定することも可能.
139 \itemitem |psft:<PSfont_name>|\par\noindent
140 PSフォント名<PSfont_name>を直接指定することもでき,
141 この場合はフォントは名前だけ(非埋込)となる.
142 例えば,本文章では,
143 \begintt
144 \jfont\tenmc={psft:Ryumin-Light:jfm=ujis} at 13.5\jQ
145 \jfont\tengt={psft:GothicBBB-Medium:jfm=ujis} at 13.5\jQ
146 \endtt
147 のような定義をし,標準和文フォントRyumin-Light, GothicBBB-Mediumを用いている.
148 %\itemitem |vf:<vfname>|
149
150 \item {\bf JFMの指定}:<features>欄に次を指定する.\par\noindent
151 \itemitem |jfm=<jfm_file>|: JFMとして|jfm-<jfm_file>.lua|を用いることを示す.必須.
152 \itemitem |jfmvar=<varkey>|\par\noindent
153 和文文字間の空白の挿入処理は,使用するJFMと,この<varkey>の値とのペアによって行われる.
154
155 \item luaotfload packageの他の機能,例えば各種のfeature,を用いてもよい:
156 \begintt
157 \jfont\tenipam={file:ipaexm.ttf:script=latn;+jp90;jfm=mt}
158 \endtt
159 なお,非埋込の場合は,GSUB/GPOSテーブルとして小塚明朝 Pr6N Rのものが用いられる
160 (|test01-noembed.pdf|を参照).
161 \enditem
162
163 \item 不良なJFMを用いた場合,エラーを返すとともに,<font>の意味は|\relax|となる.
164
165 \beginparagraph 「和文文字の範囲」の設定
166
167 \item |\defcharrange{<number>}{<char_range>}|: 文字範囲の新規定義/追加.
168 \itemitem <number>:  文字範囲の番号で,1--216の整数値で指定.
169 \itemitem <range>: 文字コードの範囲を|"100-"200, 800, 1701-|のように指定する.
170 \itemT ASCII codeの範囲 (|0x00|--|0x7F|) は指定できない.
171 \itemT 既に他の$n$番の文字範囲に使われている領域を指定した場合は,
172 その領域は$n$番の文字範囲からは除外される.即ち,後に定義した文字範囲の方が優先度が高い.
173 \itemitem 定義した文字範囲ごとに,「和文扱い」「欧文扱い」をlocalに指定できる.
174 % 216 = (31*7-1)
175
176 \item デフォルトでは,|U+0100|以降の文字は全部和文扱いであり,さらに文字範囲として,
177 \begintt
178   \defcharrange{1}{"80-"FF}
179   \ltjsetparameter{jacharrange={-1}}
180 \endtt
181 と指定している{\small(つまりLatin-1 Supplementの範囲は欧文扱い)\inhibitglue}.
182
183 %TODO: 「{\ltjsetparameter{jacharrange={1}}× (|U+00D7|)}」等,ISO 8859-1領域
184 %にマッピングされた文字の扱い.
185 %「{\ltjsetparameter{jacharrange={1}}¢ (|U+00A2|)}」はHalfwidth and
186 %Fullwidth Formsに全角形(\char"FFE0)があるから%"
187 %luaotfloadの置換処理に割り込めばよいが…….
188 \enditem
189
190
191 \beginparagraph 組版パラメタの調整
192
193 日本語組版用の各種パラメタの調整には,次の命令を用いる.
194 \begintt
195   \ltjsetparameter{<key>=<value>, ...}       % local に変更
196   \ltjglobalsetparameter{<key>=<value>, ...} % global に変更
197 \endtt
198
199 <key> に許される値は次の通りである.
200
201 \enum ★がついているものは,段落や水平ボックス構成時の値が全体に影響するものである.
202
203 \enum ◎がついているものは,自動的にglobalな代入となってしまうもの.
204
205 \item |prebreakpenalty={<chr_code>, <penalty>}|★\par\noindent
206 p\TeX の|\prebreakpenalty|に対応した設定項目である.
207 \itemitem <chr_code>: 文字コードを指定する.一旦補助カウンタに代入されるので,
208 16進法での数値の指定 (|"abcd|) や,%"
209 文字トークンによる指定 (|`あ|) も可能である.
210 \itemitem <penalty>: penalty の値を$-10000$から10000までの整数で指定する.
211
212 \item |postbreakpenalty={<chr_code>, <penalty>}|★\par\noindent
213 同様に,p\TeX の|\postbreakpenalty|に対応した設定項目である.
214 p\TeX では,同一文字に対して|\prebreakpenalty|, |\postbreakpenalty|の両方を定義する
215 ことはできなかったが,Lua\TeX-jaでは可能である.
216
217 \item |kcatcode={<chr_code>, <kind>}|★\par\noindent
218 文字コード<chr_code>の文字が和文文字扱いされている時,
219 「和文文字の種類」を|0|--|"7FFFFFFF|の自然数値<kind>で指定する.%"
220 \itemitem 最下位bitはウィドウ防止用penaltyの挿入処理に関係する.
221 \itemitem デフォルトでは,次の3つのUnicodeの範囲において,|kcatcode=1|としている.
222 \itemT |U+2000|--|U+206F| (General Punctuation)
223 \itemT |U+3000|--|U+303F| (CJK Symbols and Punctuation)
224 \itemT |U+FF00|--|U+FFEF| (Halfwidth and Fullwidth Forms)
225
226 \item |jaxspmode={<chr_code>, <mode>}|★\par\noindent
227 p\TeX の|\inhibitxspcode|に対応した設定項目である.<mode>で許される値は,
228 \itemitem |0|, |inhibit|: 前後の欧文文字との間の|xkanjiskip|自動挿入を禁止.
229 \itemitem |2|, |preonly|: 前の欧文文字との間の|xkanjiskip|自動挿入のみを許可.
230 \itemitem |1|, |postonly|: 後の欧文文字との間の|xkanjiskip|自動挿入のみを許可.
231 \itemitem |3|, |allow|: 前後の欧文文字との間の|xkanjiskip|自動挿入を許可.
232 \item |alxspmode={<chr_code>, <mode>}|★\par\noindent
233 同様に,p\TeX の|\xspcode|に対応した設定項目である.
234 <mode>で許される値は,
235 \itemitem |0|, |inhibit|: 前後の和文文字との間の|xkanjiskip|自動挿入を禁止.
236 \itemitem |1|, |preonly|: 前の和文文字との間の|xkanjiskip|自動挿入のみを許可.
237 \itemitem |2|, |postonly|: 後の和文文字との間の|xkanjiskip|自動挿入のみを許可.
238 \itemitem |3|, |allow|: 前後の和文文字との間の|xkanjiskip|自動挿入を許可.
239
240 \item |yalbaselineshift=<dimen>|:
241 p\TeX の|\ybaselineshift|に対応したものであり,
242 欧文文字のベースライン補正量をdimensionで指定する.
243 \itemitem 正の値を指定すると,その分だけ欧文文字は下にずれることとなる.
244 \itemitem 数式中では,boxやruleもこの量だけずれる\hfil\break
245 (よって,行中数式は全体が|yalbaselineshift|だけずれたように見える).
246 \item |yjabaselineshift=<dimen>|:
247 和文文字のベースライン補正量をdimensionで指定する.
248 p\TeX では「和文が主」という考えからか,常に和文文字のベースラインが基準であり,
249 欧文文字の方をずらすことになっていた.しかし,「欧文の中に和文をちょっと入れる」ような場合では,
250 逆に和文文字をずらす方が理にかなっているので,和文文字のベースラインもずらせるようにした.
251
252 また,この値を適切に調整することで,%
253 {\small 異なる文字サイズの文字を「上下中央揃え」で組む}ことも可能である.
254
255 \item |kanjiskip=<skip>|★\par\noindent
256 和文文字同士の間に入る空白量を指定.p\TeX の同名の命令と同様に,
257 基本的には段落/hbox終了時の値が,その段落/hbox全体に適用される. つまり,
258 \begintt
259 \ltjsetparameter{kanjiskip=3pt}あい%
260 {\ltjsetparameter{kanjiskip=10pt}うえ}}
261 \endtt
262 の組版結果は(段落終了時の値が$3\,{\rm pt}$のため),
263 $$
264  \hbox{\ltjsetparameter{kanjiskip=3pt}あい{\ltjsetparameter{kanjiskip=10pt}うえ}}
265 $$
266 となる.
267
268 但し,|kanjiskip|の自然長が$\hbox{|\maxdimen|}=16383.99998\,{\rm pt}$の場合は,
269 \itemitem (和文文字の間それぞれについて)JFMに指定されている
270 |kanjiskip|の値を採用する.
271 \itemitem 左側JFM,右側JFMのどちらかにおいて指定されていれば,そちらを使用する.
272 \itemitem どちらにおいても指定されていない場合は,0とみなす.
273
274 \item |xkanjiskip=<skip>|★\par\noindent
275 和文文字と欧文文字の間に入る空白量.p\TeX の同名の命令と同様.
276 これも,自然長が|\maxdimen|の場合は,JFMで指定された値を使う.
277
278
279 \item |jcharwidowpenalty=<penalty>|★\par\noindent
280 段落において「最後の1文字のみが次の行に」くることを
281 抑制するためのpenalty値.このpenaltyは,段落内にある,最後の「|kcatcode|の最下位bitが
282 1で{\bf ない}ような和文文字」の直前に挿入される.
283
284
285 \item |autospacing[=<bool>]|\par\noindent
286 和文文字間のglue(|kanjiskip|)の自動挿入をするかしないかを制御.
287 p\TeX では段落/hbox 単位での設定となったが,Lua\TeX-ja では
288 そうではなくなった.
289 挿入可能な箇所の両端のノードにおいて,片方でも
290 この値がfalseなら自動挿入は行われる.つまり,例えば
291 \begintt
292 あ\ltjsetparameter{autospacing=false}いう
293 \endtt
294 の場合,「あい」の間には|kanjiskip|が挿入され,「いう」の間には入らない.
295 \item |autoxspacing[=<bool>]|\par\noindent
296 和欧文間のglue(|xkanjiskip|)の自動挿入をするかしないかを制御.
297 その他は|autospacing|と同様.
298
299 \item |differentjfm=(large/small/average/both)|★◎\par\noindent
300 異なる$(\hbox{<jfm>}, \hbox{<varkey>})$である2つの和文文字の間の
301 glue/kernの計算方法を設定する.
302 左側文字由来,右側文字由来のものが両方存在した場合にのみ効力をもつ.
303 \itemitem {\tt large}: glue/kernの幅が両者のうち大きい方になるように定める.
304 \itemitem {\tt small}: 両者のうち小さい方.
305 \itemitem {\tt average}: 両者の相加平均.
306 \itemitem {\tt both}: 両者の合計値の幅をもつglue/kernを挿入する.
307 この指定は,JFM由来の|kanjiskip|の値が左右の和文文字で異なったときの
308 挙動にも適用される.
309
310 \item |jacharrange={<range_num>,<range_num>,...}|: 
311 $\lvert\hbox{<range_num>}\rvert$番の文字範囲の文字を和文扱いするか欧文扱いするかを設定する.
312 \itemitem $\lvert\hbox{<range_num>}\rvert>216$の場合,
313 「どの文字範囲にも属さない|U+0100|以降の文字」に
314 対しての処理を行う.
315 \itemitem 正値が指定されたら,$\lvert\hbox{<range_num>}\rvert$番の文字範囲は和文文字扱いとなる.
316 \itemitem 負値が指定されたら,$\lvert\hbox{<range_num>}\rvert$番の文字範囲は欧文文字扱いとなる.
317 \itemitem $\hbox{<range_num>}=0$の場合は,単に無視される.
318 \enditem
319
320 \beginparagraph 組版パラメタの取得
321
322 日本語組版用の各種パラメタの取得には,次の命令を用いる.
323 \begintt
324   \ltjgetparameter{<key>} or \ltjgetparameter{<key>}{<chr_code>}
325 \endtt
326 戻り値は全て「空白は|\catcode=10|,それ以外の文字は全て|\catcode=12|」の文字列である.
327
328 <key>に指定できる値は,説明がない限りは|\ltjsetparameter|で指定できる<key>と同じで,次の通りである,
329
330 \item |kanjiskip|, |xkanjiskip|, |yalbaselineshift|, |yjabaselineshift|, |jcharwidowpenalty|%
331 \par\noindent
332 それぞれ値を表現する文字列を返す.
333
334 \item |differentjfm|: 戻り値は{\tt large}, {\tt small}, {\tt average}, {\tt both}の
335 4つの文字列のいずれか.
336
337 \item |prebreakpenalty|, |postbreakpenalty|, |kcatcode|, |jaxspmode|, |alxspmode|
338 \par\noindent
339 これらは各文字コード別に設定される値であるので,文字コード<chr_code>を第2引数にとる.
340 指定されている整数値を表す文字列を返す.
341
342 \item |jacharrange|: 文字範囲の番号$n$を第2引数にとり,$n$番の文字範囲が
343 和文文字扱いされていれば|0|,欧文文字扱いされていれば|1|を返す.
344 $n\notin [1,216]$の場合は,「どの文字範囲にも属さない|U+0080|以降の文字」に対しての結果を返す(しかし,前に述べたデフォルトでの設定のため,実際には|U+0100|以降となる).
345
346 \item |chartorange|: 文字コード<chr_code>を第2引数にとり,それが属している文字範囲の番号を返す.
347 \itemitem <chr_code>がUnicodeの範囲外または|0x80|未満ならば,|-1|を返す.
348 \itemitem 上の場合以外で,<chr_code>の文字がどの文字範囲にも属さない場合は,|217|を返す.
349
350 \beginparagraph その他の命令
351
352 \item |\zw|, |\zh|: 現在の和文フォントの「幅」/「高さ」(メトリックにより指定)\hfil\break
353 今の版では,これは純粋なdimenレジスタではなくなっている.
354
355 \item dimen |\jQ|, |\jH|${}= 0.25\,{\rm mm}$.
356 \item |\inhibitglue|: 
357 指定箇所でのJFM由来のglue/kernの挿入を禁止する.
358 内部的には,|user_id|が30111のwhatsit nodeを作成している{\small(メトリック由来の
359 glue/kern挿入処理で役目を終え,削除される)\inhibitglue}.
360 \enditem
361
362 \beginsection JFMについて
363
364 Lua\TeX-jaで用いる和文用のメトリック情報は,次のようなLuaファイルである.
365 見本として,|jfm-ujis.lua|を入れてある.
366
367 \begintt
368 luatexja.jfont.define_jfm {
369    dir = 'yoko', zw = 1.0, zh = 1.0,
370    [0] = {
371       align = 'left', left = 0.0, down = 0.0,
372       width = 1.0, height = 0.88, depth = 0.12, italic=0.0,
373       glue = {
374          [1] = { 0.5 , 0.0, 0.5  },  [3] = { 0.25, 0.0, 0.25 }
375       }
376    }, ...
377   [1] = {
378       chars = {
379          0x2018, 0x201C, 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 
380          0x3016, 0x3018, 0x301D, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F
381       },
382       align = 'right', left = 0.0, down = 0.0, ...
383    }, ...
384    [5] = {
385       ..., 
386       glue = {
387          [1] = { 0.5 , 0.0, 0.5  },
388          [3] = { 0.25, 0.0, 0.25 }
389       },
390       kern = { [5] = 0.0 }
391    }, ...
392 }
393 \endtt
394
395 全体は,「関数|luatexja.jfont.define_jfm|にテーブルを引数として与える」という構造になっている.
396 以下に,テーブルの中身を述べる.
397 \item |dir|: 組方向を指定する.将来的にはいずれ縦組(|'tate'|)を実装したいが,
398 現時点では横組(|'yoko'|)のみの対応.
399 \item |zw|, |zh|: それぞれ|\zw|, |\zh|のフォントサイズに対する割合を記述する(必須).
400 通常は両方とも1.0となるだろう.
401 \item |kanjiskip|, |xkanjiskip|: それぞれ和文文字間グルー量,和欧文間グルー量を
402 \begintt
403 {<width>, <stretch>, <shrink>}
404 \endtt
405 という形で,フォントサイズ単位で指定する.
406 \item 数字のindex $i$を持った値:$i$番の文字クラスについての情報を記述する.
407 \itemitem |glue|: 現在の文字クラスの文字の後に挿入するglueを指定する.
408 この項目の内容は
409 \begintt
410 { [<j>] = { <width>, <stretch>, <shrink> }, ... }
411 \endtt
412 というテーブルであり,各要素は
413
414 {\par\medskip\advance\leftskip3\zw\noindent\rightskip2\zw
415 $i$番の文字クラスの文字と$j$番の文字クラスの文字の間に,
416 自然長<width>,伸び<stretch>, 縮み<shrink>(フォントサイズ基準)なる
417 glueを挿入
418 \par\medskip}
419
420 \noindent という意味である.
421
422 \itemitem |kern|: 現在の文字クラスの文字の後に挿入するkernを指定する.
423 この項目の内容も,
424 \begintt
425 { [<j>] = <width>, ... }
426 \endtt
427 というテーブルであり,各要素は
428
429 {\par\medskip\advance\leftskip3\zw\noindent\rightskip2\zw
430 $i$番の文字クラスの文字と$j$番の文字クラスの文字の間に,\hfil\break
431 幅<width>のkernを挿入
432 \par\medskip}
433
434 \noindent という意味である.
435
436 \itemitem |chars|: 文字クラスに属する「文字」達をリストの形|{...}|で記述する.
437 文字の指定には,Unicodeにおけるコード番号か,その文字1文字だけからなる文字列(|'字'|のように)
438 を用いる.
439 どの文字クラスにも属さなかった文字は,0番の文字クラスに属するとみなされる.
440 そのため,0番以外の文字クラスではこの項目は必須である.
441
442 また,このリストには,以下の「仮想的な文字」も指定可能である.
443 \itemT |'lineend'|: 行末.
444 この「文字」を0以外の文字クラスに設定することで,ぶら下げ組のような組版も可能になる.
445 \itemT |'boxbdd'|: 水平ボックスの先頭/末尾,段落の先頭/末尾.
446 \itemT |'jcharbdd'|: 和文文字達の連続とそれ以外のもの(例えば欧文文字)との境界.
447 \itemT |'diffmet'|: 異なるメトリックの和文文字間に入るglueの計算に使われる.
448 \enditem
449
450 \noindent {\bf 
451 以下の3項目は,文字クラスに属する文字が「仮想的な文字」達だけでない場合に必須.}
452
453 \itemitem |align|: |'left'|, |'middle'|, |'right'|のどれかを指定する.
454
455 例えば,開き括弧類は組版をする際には半角幅だが,TrueTypeフォント内では
456 左に半角空白が付け加わって全角幅となっていることが多い.そのような場合,
457 |align='right'|と指定することで,
458 「半角幅の領域に(右詰めで)フォントの実際の字形を入れる」といったことができる.
459
460 \itemitem |width|, |height|, |depth|, |italic|: 
461 それぞれ幅,高さ,深さ,そしてイタリック補正値をフォントサイズに対する割合で指定する.
462 例外として,|width='prop'|の場合には,その文字クラスは特に幅を定めず,
463 実際のフォントにおける文字幅そのままで出力する.
464
465 \itemitem |left|, |down|: それぞれ左右,上下方向のずらし量を指定する.
466 |align|項目のため,|left|はほとんどの場合0で良いだろう.
467
468 \enditem
469
470 \beginsection 互換用命令(書きかけ)
471
472 {\tt luatexja-compat.sty}を読み込むことで,次が追加.
473 \item |\euc|, |\jis|, |\sjis|, |\kuten|, |\ucs|: 
474 それぞれEUC-JP,ISO-2022-JP,Shift-JIS,区点コードからUnicodeへの変換を行う.
475 JIS~X~0208→Unicodeへの変換テーブルとしては,up\TeX-0.30で用いられているものを利用している.
476 \item |\kansuji|
477 \item |kansujichar={<num>, <char>}|~key in |\ltjsetparameter|.
478 \enditem
479
480
481 \beginsection 大まかな処理の流れ
482
483 Lua\TeX-jaパッケージでは,次のような流れで実際の処理を行っている.
484
485 \item {\bf 行末空白の削除: |process_input_buffer| callback}
486
487 通常,\TeX において改行は空白とほぼ同じ意味であり,
488 改行した箇所には自動的に空白が入るようになっている.
489 だが,日本語ではそのような振る舞いは不自然であり,p\TeX でも
490 「和文文字で行が終わった場合,改行文字は無視する」という
491 仕様になっている.
492
493 そこで,入力が和文文字で終わった場合,コメント文字を挿入することにより
494 この問題を解決する方法をとっている.{\small
495 この部分のコードは前田氏のjafontspecパッケージの部分から拝借したが,挿入する文字を|%|から
496 (通常使用されることはないと思われる)|U+FFFFF|へと変更している.}
497
498 しかし,現行Lua\TeX の仕様により,完全にp\TeX と同じというわけには
499 いかず,次のような動作になっている:
500 \itemitem 入力行の末尾が,正規表現で
501 \begintt
502 [:jchar:][\{\}]^*$
503 \endtt
504 となっている場合,即ち,{\bf catcodeが11 or 12の和文文字の後に,
505 グループ境界文字(catcodeが1 or 2の文字.通常は\hskip\ltjgetparameter{xkanjiskip}|{|%
506 \hskip\ltjgetparameter{xkanjiskip}や\hskip\ltjgetparameter{xkanjiskip}|}|%
507 \hskip\ltjgetparameter{xkanjiskip})が任意個続いて
508 行が終わっていた}場合,この行の入力にコメント文字を追加.
509 \itemitem 上の「和文文字」「グループ境界文字」の判定は,処理対象の入力行の前行末尾の時点の
510 設定値をもとに行う.そのため,行の途中でcatcodeの変更を行った場合などで,p\TeX と異なる挙動
511 を示す場合がある.
512
513 \item {\bf 和文フォントへの置換: |hyphenate| callback}
514
515 この段階の前では,和文文字であっても,それを内部で表している|glyph_node|~$p$は,
516 「|\tenrm あ|」のように,欧文フォントが指定されている状態になっている.しかし,
517 $p$は「現在の和文フォント」の番号もattribute |\ltj@curjfnt|として保持している.そのため,
518 この段階では,「和文文字が格納されている」|glyph_node|~$p$に対して,次を行う.
519
520 \itemitem $p$のフォントをattribute |\ltj@curjfnt|の値に置換.
521 \itemitem $p$の|language| fieldを|\ltj@japanese|の値に置換.
522 誤って和文文字間でハイフネーションがされてしまうのを防止するため.
523 \itemitem $p$の文字の文字クラスを計算し,その値をattribute |\ltj@charclass|に格納.
524 これにより,|jp90|等のfeatureによりグリフが置換されても,文字クラスの値は保たれる.
525
526 \item {\bf (luaotfloadパッケージによるグリフ置換等の処理はこの位置で)}
527
528 \item {\bf 和文処理グルーの挿入: |pre_linebreak_filter|, |hpack_filter| callbacks}
529
530 動作の詳細については,{\tt jfmglue.pdf}(未完)を参照.
531
532 \item {\bf ベースライン補正: |pre_linebreak_filter|, |hpack_filter| callbacks}
533
534 この段階では,(主として)欧文文字のベースラインをずらす作業を行う.幸いにして,
535 Lua\TeX で文字を表す|glyph_node|には|y_offset| fieldがあるので,作業は楽である.
536
537 補正量は,attribute |\ltj@yablshift|の値(先も書いた通り,sp単位)である.和文文字の
538 補正量は|\ltj@ykblshift|の値で指定されるが,以前の「和文フォントへの置換」処理において,
539 |\ltj@yablshift|へと値を移し変えているので,この段階では|\ltj@yablshift|の値のみを気にしている.
540
541 さて,実際に補正されるのは次の場合である:
542 \itemitem 文字 (|glyph_node|)
543 \itemitem ボックス・rule(文中数式内部).これによって,数式全体が下がったように見えるはず.
544
545 \item {\bf 和文文字の幅の補正: |pre_linebreak_filter|, |hpack_filter| callbacks}
546
547 例えば,括弧類は「フォント中では全角幅だが,組版では半角幅として扱う」ことが多いが,このように
548 文字幅を補正する処理を最後に行う.jafontspecパッケージのように,補正対象となる|glyph_node|~$p$%
549 を,しかるべき量のglueと共に|\hbox|にカプセル化して行っている.
550
551 \enditem 
552
553
554 \vfill\eject
555 \leftline{{\big 組版サンプル}\hfill
556 \noindent 出典: 日本語Wikipediaの「\TeX」の項,2011/3/10}
557
558 \bigskip
559 %% sample
560 {\bf\TeX}(読み方については、「読み方」の小節を参照)は数学者・計算機科学者である
561 ドナルド・クヌース (Donald~E. {\sc Knuth}) により作られた組版処理ソフトウェアである。
562
563 \beginsection 名称について
564
565 製作者であるクヌースによって以下のように要請されている。
566
567 \beginparagraph 表記法
568
569 正しくは“{\bf\TeX}”と表記するが、それができない場合には
570 “{\tt TeX}”と表記する(“{\tt TEX}”と表記するのは誤り)。
571
572 \beginparagraph 読み方
573
574 \TeX はギリシャ文字の T-E-X(タウ・イプシロン・カイ)であるから、「テックス」ではなく、
575 ギリシャ語読みの [tex](「テフ」)のように発音するのが正しい。
576 しかしそのような発音は難しいので、クヌースは「テック」と読んでも構わないとしている。
577 日本では「テフ」または「テック」という読み方が広まっている。
578
579 \beginsection 機能
580
581 \TeX はマークアップ言語処理系であり、チューリング完全性を備えた関数型言語でもある。
582 文章そのものと、文章の構造を指定する命令とが混在して記述されたテキストファイルを読み込み、
583 そこに書かれた命令に従って文章を組版して、組版結果を{\tt DVI}形式のファイルに書き出す。
584 {\tt DVI}形式というのは、装置に依存しない ({\bf d}e{\bf v}ice-{\bf i}ndependent) 中間形式である。
585
586 {\tt DVI}ファイルには紙面のどの位置にどの文字を配置するかといった情報が書き込まれている。
587 実際に紙に印刷したりディスプレイ上に表示したするためには、{\tt DVI}ファイルを解釈する
588 別のソフトウェアが用いられる。{\tt DVI}ファイルを扱うソフトウェアとして、各種のヴューワや
589 Post\-Scriptなど他のページ記述言語へのトランスレータ、プリンタドライバなどが利用されている。
590
591 組版処理については、行分割およびページ分割位置の判別、ハイフネーション、リガチャ、
592 およびカーニングなどを自動で処理でき、その自動処理の内容も種々のパラーメータを変更する
593 ことによりカスタマイズできる。数式組版についても、多くの機能が盛り込まれている。
594 \TeX が文字などを配置する精度は$25.4 / (72.27\times 2^{16})\,{\rm mm}$%
595 (約$5.363\,{\rm nm}$、$4{,}736{,}286.72\,{\rm dpi}$)である。
596
597 \TeX の扱う命令文の中には、組版に直接係わる命令文の他に、新しい命令文を定義するための
598 命令文もある。\TeX のこの機能を使って使用者が独自に作った命令文はマクロと呼ばれ、
599 こうした独自の改良をマクロパッケージと呼ばれる形で配布できる。
600
601 比較的よく知られている\TeX 上のマクロパッケージには、クヌース自身による plain \TeX、
602 一般的な文書記述に優れた\LaTeX\ ({\tt LaTeX})、数学的文書用の\AmS-\TeX などがある。
603 一般の使用者は、\TeX を直接使うよりも、\TeX に何らかのマクロパッケージを読み込ませたものを
604 使うことの方が多い。そのため、これらのマクロパッケージのことも“\TeX”と呼ぶ場合があるが、
605 本来は誤用である。
606
607 \TeX のマクロパッケージには、他にも次のようなものなどがある。
608
609 \item B{\sc ib}\TeX\ ({\tt BibTeX}) ……参考文献リストの作成に用いる。
610 \item S{\sc li}\TeX\ ({\tt SLiTeX}) ……プレゼンテーション用スライドの作成に用いる。
611 \item \AmS-\LaTeX\ ({\tt AMS-LaTeX}) ……
612 数学的な文書の記述に強い\AmS-\TeX の機能と\LaTeX の機能を併せ持つ。
613 \item \XyMTeX\ ({\tt XyMTeX}) ……化学構造式の描画に用いる。
614 \item MusiX\TeX\ ({\tt MusiXTeX}) ……楽譜の記述に用いる。
615 \enditem
616
617 \TeX とそれに関連するプログラム、および\TeX のマクロパッケージなどは CTAN({\bf C}omprehensive \TeX {\bf A}rchive {\bf N}etwork、
618 包括\TeX アーカイブネットワーク)からダウンロードできる。
619
620
621 \beginsection 数式の表示例
622
623 たとえば
624 \begintt
625 -b \pm \sqrt{b^{2} - 4ac} \over 2a
626 \endtt
627 は以下のように表示される。
628 $$
629 -b \pm \sqrt{b^{2} - 4ac} \over 2a
630 $$
631
632 また、
633 \begintt
634 f(a,b) = \int_{a}^{b}\frac{1 + x}{a + x^{2} + x^{3}}dx
635 \endtt
636 は以下のように表示される。
637 $$
638 f(a,b) = \int_{a}^{b}{1 + x \over a + x^{2} + x^{3}}dx
639 $$
640
641
642 \beginsection 生い立ち
643
644 \TeX は、クヌースが自身の著書{\it The Art of Computer Programming\/}を書いたときに、組版の汚さに憤慨し、
645 自分自身で心行くまで組版を制御するために作成したとされている。開発にあたって、伝統的な組版および
646 その関連技術に対する広範囲にわたる調査を行った。その調査結果を取り入れることで、\TeX は
647 商業品質の組版ができる柔軟で強力な組版システムになった。
648
649 \TeX はフリーソフトウェアであり、ソースコードも公開されていて、誰でも改良を加えることができる。
650 その改良版の配布も、\TeX と区別できるような別名を付けさえすれば許される。また、\TeX は非常に
651 バグが少ないソフトウェアとしても有名で、ジョーク好きのクヌースが、バグ発見者に対しては
652 前回のバグ発見者の2倍の懸賞金をかけるほどである。この賞金は小切手で払われるのだが、貰った人は
653 記念に取っておく人ばかりなので、結局クヌースの出費はほとんど無いという。
654
655 クヌースは\TeX のバージョン 3 を開発した際に、これ以上の機能拡張はしないことを宣言した。
656 その後は不具合の修正のみがなされ、バージョン番号は 3.14、3.141、3.1415、$\ldots$というように
657 付けられている。これは更新のたびに数字が円周率に近づいていくようになっていて、
658 クヌースの死の時点をもってバージョン$\pi$として、バージョンアップを打ち切るとのことである。
659
660 クヌースは\TeX の開発と同時に、\TeX で利用するフォントを作成するためのシステムである
661 \mf も開発した。こちらのバージョン番号は 2.71、2.718、2.7182、$\ldots$というように、
662 更新のたびに数字がネイピア数に近づいていくようになっている。さらにクヌースは\mf を使って、
663 \TeX の初期設定欧文フォントであるComputer Modernのデザインも行った。
664
665 \TeX および\mf は、これもクヌース自身によって提唱されている文芸的プログラミング\ 
666 (Literate Programming) を実現する{\tt WEB}というシステムでPascalへトランスレートされることを
667 前提に記述されている。しかし実際には{\tt WEB2C}でC言語に変換してコンパイルされ実行形式を
668 得ることが多い。
669
670 \beginsection \TeX の日本語化
671
672 日本語組版処理のできる日本語版の\TeX および\LaTeX には、アスキー・メディアワークスによるp\TeX\ 
673 ({\tt pTeX}) およびp\LaTeX\ ({\tt pLaTeX}) と、NTTの斉藤康己によるNTT J\TeX\ ({\tt NTT JTeX}) およびNTT J\LaTeX\
674 ({\tt NTT JLaTeX}) などがある。
675
676 \TeX の日本語対応において技術的に最も大きな課題は、複数バイト文字コードへの対応である。
677 p\TeX(および前身の日本語\TeX)は、JIS X 0208を文字集合とした文字コード(ISO-2022-JP、EUC-JP、
678 およびShift\_\thinspace JIS)を直接扱う。DVIフォーマットは元々16ビット以上の文字コードを格納できる仕様が
679 含まれていた。しかしオリジナルの英語版では使われていなかったため、既存プログラムの多くはp\TeX が
680 出力するDVIファイルを処理できない。またフォントに関係するファイルフォーマットが拡張されている。
681 これに対してNTT J\TeX は、複数の1バイト文字セットに分割することで対応している。例えば、
682 ひらがなとカタカナは内部的には別々の1バイト文字セットとして扱われる。このためにオリジナルの
683 英語版からの変更が小さく、移植も比較的容易である。ファイルフォーマットが同じなので英語版の
684 プログラムでDVIファイル等を処理することもできる。しかし後述するフォントのマッピングの問題が
685 あるため、実際には多くの使用者がNTT J\TeX 用に拡張されたプログラムを使っている。
686
687 使用する日本語用フォントについてはp\TeX が写研フォントの使用を、NTT J\TeX が大日本印刷フォントの
688 使用を前提としており、それぞれフォントメトリック情報(フォントの文字寸法の情報)をバンドルして
689 配布している。しかし有償であるこれらのフォントのグリフ情報を持っていなくても、画面表示や印刷の
690 際に使用者が利用できる他の日本語用フォントで代用することができる。つまり写研フォントや
691 大日本印刷フォントのフォントメトリック情報を用いて文字の位置を固定し、画面表示や印刷には
692 他の日本語用フォントを用いていることが可能である。このため日本語化された\TeX 関係プログラムの
693 ほとんどは、画面表示や印刷で実際に使うフォントを選択できるように、フォントのマッピング
694 (対応付け)を定義する機能を持っている。
695
696 歴史的には、アスキーが日本語\TeX の PC-9800 シリーズ対応版を販売したために個人の使用者を中心に
697 普及した。一方、NTT J\TeX は元の英語版プログラムからの変更が比較的小さいという利点を受けて、
698 UNIX®およびUNIX互換OSを使う大学や研究機関の関係者を中心に普及した。
699
700 しかし現在では次に挙げる理由から、日本語対応\TeX としてp\TeX が使われていることが多い。
701
702 \item UNIX®用、およびUNIX互換OS用の主な日本語対応\TeX 配布形態である
703 ptexliveやptetex3がp\TeX のみを採用している。
704 \item Microsoft Windows用の主な日本語対応\TeX 配布形態であるW32\TeX が
705 p\TeX を扱える(NTT J\TeX も扱える)。
706 \item p\TeX の扱い方を解説する文献の方が、NTT J\TeX のものに比べて、
707 出版物とWeb上文書の両方で多い。
708 \item p\TeX は縦組みにも対応しているが、NTT J\TeX は対応していない。
709 \enditem
710
711 \beginsection \TeX による組版の作業工程
712
713 \TeX を利用して組版を行うには、通常次のような作業工程を取る。
714
715 \enum テキストエディタなどを用いて、文章に組版用命令文を織り込んだソースファイルを作成する。
716 \enum OSのコマンドラインから “|tex FileName.tex|” などと入力して\TeX を起動し、
717   {\tt DVI}ファイルを生成させる。
718 \itemitem ソースファイルにエラーがあれば、修正して再度\TeX を起動する。
719 \enum {\tt DVI}ウェアとよばれる{\tt DVI}命令文を解するソフトウェアを用いて組版結果を表示し、確認する。
720 \itemitem {\tt DVI}ウェアにはxdvi/xdvikやdviout for Windowsなどの{\tt DVI}ヴューア、
721   Dvips(k)やdvipdfm/DVIPDFM$x$などのファイル形式変換ソフトウェアなどがある。
722 \itemitem {\tt DVI}ファイルを{\tt DVI}ヴューアで画面表示または印刷する、
723   あるいはPDFやPost\-Scriptに変換して画面表示または印刷することで、組版結果を確認する。
724 \itemitem 修正の必要があれば、ソースファイルを修正して再度{\tt DVI}ファイルを作成、確認する。
725 \enditem
726
727 この間、作業工程が変わるたびにそれぞれのプログラムを切り替えたり、
728 扱う文書が大きいと章ごとにソースファイルを分割して管理したりと、比較的煩雑な作業を伴う。
729 そのため、この工程に係わる各種のプログラムやソースファイルの管理を一元的に行う
730 \TeX 用の統合環境がいくつか作成されている。
731
732 \beginparagraph GUI環境と\TeX
733
734 GUIはPCの普及に一役買ったが、同時にGUIしか触ったことのないPC利用者が増加した。
735 そのような利用者が、コマンドラインでの操作を余儀なくされる\TeX を非常に扱いづらく
736 感じてしまうのは否めないことである。
737 このため、GUIに特化した\TeX 用統合環境もいくつか作成されている。
738 \end