OSDN Git Service

310b6a0481ae1a7212295b85a9ce3b69790e65c7
[luatex-ja/luatexja.git] / doc / sample1.tex
1 %#! time luatex sample1
2 \input s1sty.tex % style file
3
4 \message{BB}
5 \overfullrule=0pt
6 \def\LaTeX{L\kern-.36em\setbox0=\hbox{T}\vbox to\ht0{\hbox{\sevenrm A}\vss}\kern-.15em\TeX}
7 \xkanjiskip=0.25\zw plus .10\zw minus .10\zw
8 \font\mff=manfnt at 10pt
9 \def\mf{{\mff META{\rm\-}FONT}}
10 \def\textfontii{\the\textfont2 }
11 \def\AmS{{\textfontii A\kern-.1667em\lower.5ex\hbox{M}\kern-.125emS}}
12 \def\UPSILON{\char'7}%
13 \def\XyM{X\kern-.30em\smash{\raise.50ex\hbox{\UPSILON}}\kern-.30em{M}}%
14 \def\XyMTeX{\XyM\kern-.1em\TeX}%
15
16
17 % main matter
18 \centerline{\big Lua\TeX-jaパッケージ}\bigskip
19 \centerline{\large\the\year/\the\month/\the\day}\medskip
20
21 \message{AA}
22 \bigskip
23
24 本パッケージは,(最低でもp\TeX と同等の水準の)日本語組版をLua\TeX 上で実現させることを
25 目標としたマクロである.まだまだ足りないところはあるが,とりあえず動くようになった?ので公開する. 
26
27 %{\showboxdepth=10000\showboxbreadth=10000\tracingonline=1\scrollmode\showlists}\end
28
29 \beginparagraph 特徴
30
31 \item 欧文フォント/和文フォントの内部独立管理.
32 \item 違う和文フォントでも「メトリックが同じ」なら,字間に空白を挿入する際には同じものとして扱う.
33 {\bf 例}: 「ほげほげ){\gt (ふがふが}」は以下の出力より得られた:
34 \begintt
35 ほげほげ){\gt (ふがふが}
36 \endtt
37 \item 欧文や和文のベースライン補正が可能.
38 \item p\TeX とある程度コマンド名が互換.
39 \enditem
40
41 \beginparagraph 制限
42
43 \item 全体的にテスト不足です.
44 \item 合字の前後の和欧文間空白の挿入処理は適当{\small(合字でない場合の処理をそのまま流用)\inhibitglue}.
45 \item {\bf 現時点で\LaTeX での使用は殆ど考慮されていません.``plain Lua\TeX''で使ってください.}
46 \item |\accent|を和文文字に対して使うことはできません.これは「フォントを後で置換する」という実装上,
47 仕方のないことだと思われます.
48 \item 数式中の日本語は想定していません.|\hbox|か何かで囲ってください.
49 \item p\TeX にあった以下の機能はまだ実装していません.
50 \itemitem |\euc|, |\jis|, |\sjis|, |\kuten|といった,コード変換プリミティブ.
51 \itemitem |\kansuji|, |\kansujichar|.
52 \itemitem |\showmode|, |\jfam|, |\jcharwidowpenalty|.
53 \itemitem 縦組み関連一式.|\tate|, |\tfont|, |\tbaselineshift|, |\dtou|,$\,\ldots$
54 \enditem
55
56
57 \beginparagraph ファイル構成
58
59
60 \item {\tt luatexja-core.sty}: 
61 コア部分.拡張子は{\tt sty}であるが,この単一のファイルでplain \TeX と\LaTeX 両方に
62 対応するように設計する方針である.しかし,
63 {\bf 現時点で\LaTeX での使用は全く考慮されていない.}
64 \item {\tt luatexja-core.lua}: コア部分に使われるLuaコード.
65 \item {\tt luatexja-jfont.lua}: 和文フォント定義部のLuaコード.
66 \item {\tt luatexja-rmlgbm.lua}: 非埋込和文フォント (Ryumin-Light etc.) 定義部.
67 \item {\tt luatexja-ucs2aj16.lua}: UnicodeとCIDの対応表({\tt UniJIS-UTF32-H}由来).
68 \item {\tt mk\_lua.py}: {\tt luatexja-ucs2aj16.lua}作成用Pythonスクリプト.
69
70 \item {\tt luatexja-kinsoku.tex}: 禁則用ペナルティ等のパラメータを書いたファイル.
71 下のファイルによって{\tt ukinsoku.tex} (in up\TeX-0.30) から自動生成されたもの.
72 \item {\tt luatexja-kinsoku\_make.tex}: 上の{\tt luatexja-kinsoku.tex}製作用ファイル.
73 \item {\tt luatj-ujis.lua}: up\TeX-0.30の{\tt ujis.tfm}ベースのメトリックサンプル.
74 \item {\tt luatj-mono.lua}: 「全文字が全角幅」のメトリックサンプル.
75 \enditem
76
77 \beginsection 使用方法
78
79 大雑把に言うと,plain \TeX の状況で,以下のようにすればよい.
80 \begintt
81 \input luatexja-core.sty               % ←マクロ本体を読み込み
82 \loadjfontmetric{mt}{ujis}             % ←メトリックの読み込み
83 \jfont\tenipam={file:ipam.ttf:jfm=mt}at13.5\jQ 
84 \tenipam\parindent=1\zw 
85 \yabaselineshift=32768                 % (例)32768 sp =  0.5 pt
86
87 \rm abcほげほげ)(あいう本文本文……
88 \endtt
89
90 \beginsection 実装解説
91
92 \beginparagraph attributes, dimensions,$\,\ldots$
93
94 以下はLua\TeX-jaパッケージ内で使用するattributeやその他の種類のレジスタである.
95 上4つは内部処理用なので利用者が意識することはない.それ以外は,p\TeX に類似の名前の
96 primitiveがあることから,意味は容易にわかるだろう:
97
98 \item attribute |\luatexja@curjfnt|: 現在の和文フォント番号
99
100 p\TeX では内部のグローバル変数で「現在の横組/縦組和文フォント」をそれぞれ保持していたが,
101 当然ながら欧文用\TeX ではそのようなことはそのままではできない.
102 node~$p$が保持しているattribute |\luatexja@curjfnt|の値$k$は,
103 「もし$p$の中身が和文文字であれば,そのフォントは$k$番の番号のフォントである」という意味をもつ.
104
105 \item attribute |\luatexja@charclass|: (和文文字の)文字クラス
106
107 \item attribute |\luatexja@icflag|: この属性をもつkernはイタリック補正由来である
108
109 p\TeX では,|\kern|由来のkernと,イタリック補正由来のkernを内部で区別していた.しかし,
110 欧文用の\TeX ではそのような区別はなく,Lua\TeX においても区別がないようである.
111
112 \item language |\luatexja@japanese|: 「日本語」に対応する|\language|番号
113
114 \item attribute |\yabaselineshift|: 欧文文字ベースラインの補正量.
115 \itemitem {\bf sp$\fam\bffam {}=2^{-16}\,{\bf pt}$単位の整数値}で指定.
116 正の値を指定すると,その分だけ欧文文字は下にずれる.
117 \itemitem 数式中では,boxやruleもこの量だけずれる\hfil\break
118 (よって,行中数式は全体が|\yabaselineshift|だけずれたように見える).
119 \item attribute |\ykbaselineshift|: 和文文字ベースラインの補正量.
120
121 p\TeX では「和文が主」という考えからか,常に和文文字のベースラインが基準であり,
122 欧文文字の方をずらすことになっていた.しかし,「欧文の中に和文をちょっと入れる」ような場合では,
123 逆に和文文字をずらす方が理にかなっているので,和文文字のベースラインもずらせるようにした.
124
125 また,これを用いることで%
126 {\small 異なる文字サイズの文字を「上下中央揃え」で組む}ことも可能.
127 \item skip |\kanjiskip|: 和文文字同士の間に入る空白量.
128 \item skip |\xkanjiskip|: 和文文字と欧文文字の間に入る空白量.
129 \item dimen |\zw|, |\zh|: 現在の和文フォントの「幅」/「高さ」(メトリックから指定)
130 \item dimen |\jQ|, |\jH|${}= 0.25\,{\rm mm}$
131 \enditem
132
133
134 \beginparagraph 和文フォントの定義
135
136 Lua\TeX-jaでは,大雑把にいうと
137 和文フォントは「実際の字形」と「和文用のメトリック情報」の組である.
138 \item メトリック情報は,和文文字の幅や,和文文字間の空白の入り方などを規定する.
139 p\TeX における{\tt JFM}ファイルのようなものと考えてよい.
140 \enditem
141
142 このため,和文フォントを使うには,以下のような手順が必要である.
143
144 \enum |\loadjfontmetric{<key>}{<file>}|
145
146 Luaソース|luatj-<file>.lua|に書かれたメトリック情報を読み込む.
147 内部では<key>というキーで参照されることとなる.同じkeyで2回以上読み込むことはできないが,
148 同じメトリック情報に異なるキーをつけることは差し支えない.
149
150 \enum |\jfont<font>={<fontname>:jfm=<key>} [at <size>/scaled <scale>]|
151
152 \TeX の|\font| primitiveと同様の書式を持った|\jfont|命令を用いて和文フォントを定義する.
153 少し正確に言うと,制御綴<font>の意味を,「$\hbox{|\luatexja@curjfnt|}\leftarrow v$」というように
154 変更する.
155
156 \itemitem 内部でluaotfloadパッケージを読み込んでいる.そのため,
157 <fontname>の部分は |file:ipam.ttf| 等のように,TrueType/OpenTypeフォントを指定することが可能.
158
159 \itemitem 但し,<fontname>が|psft:<ps-font>|であった場合は,
160 <ps-font>で指定された名前の和文フォント(非埋込)となる.
161 例えば,本文章では,
162 \begintt
163 \jfont\tenipam={psft:Ryumin-Light:jfm=mt} at 13.5\jQ
164 \jfont\tenipag={psft:GothicBBB-Medium:jfm=mt} at 13.5\jQ
165 \endtt
166 のような定義をし,標準和文フォントRyumin-Light, GothicBBB-Mediumを用いている.
167 \itemitem luaotfload packageの他の機能,例えば各種のfeature,を用いてもよい.例えば,次のように:
168 \begintt
169 \jfont\tenipam={file:ipaexm.ttf:script=latn;+jp90;jfm=mt}
170 \endtt
171
172
173 \enditem
174
175 \beginparagraph その他命令類
176
177 \item |\(set/get)inhibitxspcode{<code>}{<num>}|, \hfil\break
178 |\(set/get)xspcode{<code>}{<num>}|,\hfil\break
179 |\(set/get)prebreakpenalty{<code>}{<num>}|,\hfil\break
180 |\(set/get)postbreakpenalty{<code>}{<num>}|
181
182 これらはp\TeX の(|set|/|get|を抜かした)命令と意味は概ね同じであるが,以下の点が異なる.
183
184 \itemitem 同じ文字コードについて|\prebreakpenalty|, |\postbreakpenalty|を両方指定することが
185 可能.
186 \itemitem |\(set/get)xspcode|(欧文文字用)は|\(set/get)inhibitxspcode|(和文文字用)の別名であり,
187 \begintt
188 \setxspcode{12289}{1}  \setinhibitxspcode{12289}{1}
189 \endtt
190 は全く同じ意味である.|\setxspcode|, |\setinhibitxspcode|の第2引数の意味は異なるが,
191 両者の意味は文字コードにより判断している.
192
193 \item |\inhibitglue|: 指定箇所での和文フォントメトリック由来のglue/kernの挿入を禁止する.
194 内部的には,|user_id|が30111のwhatsit nodeを作成している{\small(メトリック由来の
195 glue/kern挿入処理で役目を終え,削除される)\inhibitglue}.
196 \enditem
197
198
199 \beginparagraph 大まかな処理の流れ
200
201 Lua\TeX-jaパッケージでは,次のような流れで処理を行う.
202
203 \item 行末空白の削除: |process_input_buffer| callback
204
205 通常,\TeX において改行は空白とほぼ同じ意味であり,
206 改行した箇所には自動的に空白が入るようになっている.
207 だが,日本語ではそのような振る舞いは不自然であり,p\TeX でも
208 「和文文字で行が終わった場合,改行文字は無視する」という
209 使用になっている.
210
211 そこで,入力が和文文字で終わった場合,コメント文字を挿入することにより
212 この問題を解決する方法をとっている.
213 この部分のコードは前田氏のjafontspecパッケージの部分から拝借したが,挿入する文字を|%|から
214 (通常使用されることはないと思われる)|U+FFFFF|へと変更している.
215
216 \item 和文フォントへの置換: |hyphenate|, |hpack_filter| callbacks
217
218 この段階の前では,和文文字であっても,それを内部で表している|glyph_node|~$p$は,
219 「|\temrm あ|」のように,欧文フォントが指定されている状態になっている.しかし,
220 $p$は「現在の和文フォント」の番号もattribute |\luatexja@curjfnt|として保持している.そのため,
221 この段階では,「和文文字が格納されている」|glyph_node|~$p$に対して,次を行う.
222
223 \itemitem $p$のフォントをattribute |\luatexja@curjfnt|の値に置換.
224 \itemitem $p$の|language| fieldを|\luatexja@japanese|の値に置換.
225 誤って和文文字間でハイフネーションがされてしまうのを防止するため.
226 \itemitem $p$の文字の文字クラスを計算し,その値をattribute |\luatexja@charclass|に格納.
227 これにより,|jp90|等のfeatureによりグリフが置換されても,文字クラスの値は保たれる.
228
229 \item (luaotfloadパッケージによるグリフ置換等の処理はこの位置で行われる)
230
231 \item メトリック由来glue/kernの挿入: |pre_linebreak_filter|, |hpack_filter|
232
233 ここで,メトリックに由来する和文文字間のglue/kernを挿入する.
234 基本的には連続する和文文字間に挿入するが,
235 \itemitem 水平ボックスの先頭/末尾,段落の先頭/末尾には「文字コード|'boxbdd'|の文字」があると
236 見做して空白を挿入する.
237 \itemitem 和文文字とそうでないもの(欧文文字,ボックス等)の間に関しては,
238 和文文字でない方は「文字コード|'jcharbdd'|の文字」であると見做す.
239 \itemitem フォントの異なる2つの和文文字においても,
240 両者のフォントのmetric keyとsizeが一致した場合は,
241 挿入処理においては「同じフォント」であるかのように扱う.
242 \itemitem  そうでない場合は,両者の間に「文字コード|'diffmet'|の文字」があると見做して,
243 両和文文字からそれぞれglue/kern |gb|, |ga|を計算し,そこから実際に入るglue/kernを,
244 関数|ltj.calc_between_two_jchar_aux|で計算している:
245 \itemT |gb|, |ga|の片方がglue,もう片方がkernの場合は,glue側のみ挿入.
246 \itemT そうでないときは,両者の平均値の空白を挿入する.
247
248 \item |\kanjiskip|, |\xkanjiskip|の挿入: |pre_linebreak_filter|, |hpack_filter|
249
250 p\TeX の|adjust_hlist| procedureとほぼ同様の処理を用いて,
251 和文間glue |\kanjiskip|や和欧文間glue |\xkanjiskip|を
252 挿入する.
253 \itemitem p\TeX と同様に,これらの自動挿入は(box/段落ごとに)
254 |\[no]auto[x]spacing|を用いて制御できる.
255 \itemitem 数式境界 (|math_node|) との間に|\xkanjiskip|を自動挿入するかの決定は,
256 p\TeX では数字{\tt 0}との間に挿入するかどうかで判定していたが,Lua\TeX-jaでは
257 「文字コード|'math'|の文字」で判定している.
258
259
260 \item ベースライン補正: |pre_linebreak_filter|, |hpack_filter|
261
262 この段階では,(主として)欧文文字のベースラインをずらす作業を行う.幸いにして,
263 Lua\TeX で文字を表す|glyph_node|には|y_offset| fieldがあるので,作業は楽である.
264
265 補正量は,attribute |\luatexja@yablshift|の値(先も書いた通り,sp単位)である.和文文字の
266 補正量は|\luatexja@ykblshift|の値で指定されるが,以前の「和文フォントへの置換」処理において,
267 |\luatexja@yablshift|へと値を移し変えているので,この段階では|\luatexja@yablshift|の値のみを気にしている.
268
269
270 さて,実際に補正されるのは次の場合である:
271 \itemitem 文字 (|glyph_node|)
272 \itemitem ボックス・rule(文中数式内部).これによって,数式全体が下がったように見えるはず.
273
274 \item 和文文字の幅の補正: |pre_linebreak_filter|, |hpack_filter|
275
276 例えば,括弧類は「フォント中では全角幅だが,組版では半角幅として扱う」ことが多いが,このように
277 文字幅を補正する処理を最後に行う.jafontspecパッケージのように,補正対象となる|glyph_node|~$p$%
278 を,しかるべき量のglueと共に|\hbox|にカプセル化して行っている.
279
280 \enditem 
281
282 \beginparagraph 和文フォントメトリックについて
283
284 Lua\TeX-jaで用いる和文用のメトリック情報は,次のような構文で書かれたLuaファイルである.
285 見本として,|luatj-ujis.lua|を入れてある.
286
287 \item |jfm.dir|: 組方向を指定する.将来的にはいずれ縦組(|'tate'|)を実装したいが,
288 現時点では横組(|'yoko'|)のみの対応.
289 \item |jfm.zw|, |jfm.zh|: それぞれ|\zw|, |\zh|のフォントサイズに対する割合を記述する.
290 通常は両方とも1.0となるだろう.
291 \item |jfm.define_char_type(<class>, <chars>)|
292
293 p\TeX 用{\tt JFM}で言うところの「文字クラス」を定義する.
294 \itemitem <class>は文字クラスを表す1以上$\hbox{\tt0x800}=2048$未満の整数.
295 \itemitem <chars>には,<class>に属する「文字」達のUnicodeにおけるコード番号を
296 リストの形|{...}|で記述する.
297
298 また,このリストには,以下の「仮想的な文字」も指定可能である.
299 \itemT |'boxbdd'|: 水平ボックスの先頭/末尾,段落の先頭/末尾.
300 \itemT |'jcharbdd'|: 和文文字達の連続の境界.
301 \itemT |'diffmet'|: 異なるメトリックの和文文字間に入るglueの計算に使われる.
302
303 \item |jfm.define_type_dim(<class>,<left>,<down>,<width>,<height>,<depth>,<italic>)|
304
305 文字クラス<class>ごとに,文字の寸法のフォントサイズに対する割合を記述する.
306 \itemitem <left>: 例えば開き括弧類は組版をする際には半角幅だが,TrueTypeフォント内では
307 左に半角空白が付け加わって全角幅となっていることが多い.このような場合,逆に
308 TrueTypeフォントを基準にすると,「左に半角幅ずらす」ことをしないといけない.
309 <left>はその「左へのずらし量」を指定する.
310 \itemitem <down>: 同様に,「下へのずらし量」を指定する.
311 \itemitem <width>, <height>, <depth>: それぞれ幅,高さ,深さ.
312 \itemitem <italic>: イタリック補正値(未実装).
313
314 \item |jfm.define_glue(<bclass>, <aclass>, <width>, <stretch>, <shrink>)|
315
316 文字クラス<bclass>の文字と<aclass>の文字の間に,自然長<width>,伸び<stretch>, 縮み<shrink>
317 (いずれもフォントサイズ基準)のglueを挿入する.
318
319 \item |jfm.define_kern(<bclass>, <aclass>, <width>)|
320
321 文字クラス<bclass>の文字と<aclass>の文字の間に,幅<width>のkernを挿入.
322
323 \enditem
324
325
326
327 \vfill\eject
328 \leftline{{\big 組版サンプル}\hfill
329 \noindent 出典: 日本語Wikipediaの「\TeX」の項,2011/3/10}
330
331 \bigskip
332 %% sample
333 \TeX(読み方については、「読み方」の小節を参照)は数学者・計算機科学者である
334 ドナルド・クヌース (Donald~E. Knuth) により作られた組版処理ソフトウェアである。
335
336 \beginsection 名称について
337
338 製作者であるクヌースによって以下のように要請されている。
339
340 \beginparagraph 表記法
341
342 正しくは“\TeX”と表記するが、それができない場合には
343 “{\tt TeX}”と表記する(“{\tt TEX}”と表記するのは誤り)。
344
345 \beginparagraph 読み方
346
347 \TeX はギリシャ文字の T-E-X(タウ・イプシロン・カイ)であるから、「テックス」ではなく、
348 ギリシャ語読みの [tex](「テフ」)のように発音するのが正しい。
349 しかしそのような発音は難しいので、クヌースは「テック」と読んでも構わないとしている。
350 日本では「テフ」または「テック」という読み方が広まっている。
351
352 \beginsection 機能
353
354 \TeX はマークアップ言語処理系であり、チューリング完全性を備えた関数型言語でもある。
355 文章そのものと、文章の構造を指定する命令とが混在して記述されたテキストファイルを読み込み、
356 そこに書かれた命令に従って文章を組版して、組版結果を{\tt DVI}形式のファイルに書き出す。
357 {\tt DVI}形式というのは、装置に依存しない (device-independent) 中間形式である。
358
359 {\tt DVI}ファイルには紙面のどの位置にどの文字を配置するかといった情報が書き込まれている。
360 実際に紙に印刷したりディスプレイ上に表示したするためには、{\tt DVI}ファイルを解釈する
361 別のソフトウェアが用いられる。{\tt DVI}ファイルを扱うソフトウェアとして、各種のヴューワや
362 Post\-Scriptなど他のページ記述言語へのトランスレータ、プリンタドライバなどが利用されている。
363
364 組版処理については、行分割およびページ分割位置の判別、ハイフネーション、リガチャ、
365 およびカーニングなどを自動で処理でき、その自動処理の内容も種々のパラーメータを変更する
366 ことによりカスタマイズできる。数式組版についても、多くの機能が盛り込まれている。
367 \TeX が文字などを配置する精度は$25.4 / (72.27\times 2^{16})\,{\rm mm}$%
368 (約$5.363\,{\rm nm}$、$4{,}736{,}286.72\,{\rm dpi}$)である。
369
370 \TeX の扱う命令文の中には、組版に直接係わる命令文の他に、新しい命令文を定義するための
371 命令文もある。\TeX のこの機能を使って使用者が独自に作った命令文はマクロと呼ばれ、
372 こうした独自の改良をマクロパッケージと呼ばれる形で配布できる。
373
374 比較的よく知られている\TeX 上のマクロパッケージには、クヌース自身による plain \TeX、
375 一般的な文書記述に優れた\LaTeX\ ({\tt LaTeX})、数学的文書用の\AmS-\TeX などがある。
376 一般の使用者は、\TeX を直接使うよりも、\TeX に何らかのマクロパッケージを読み込ませたものを
377 使うことの方が多い。そのため、これらのマクロパッケージのことも “\TeX” と呼ぶ場合があるが、
378 本来は誤用である。
379
380 \TeX のマクロパッケージには、他にも次のようなものなどがある。
381
382 \item B{\sc ib}\TeX\ ({\tt BibTeX}) ……参考文献リストの作成に用いる。
383 \item S{\sc li}\TeX\ ({\tt SLiTeX}) ……プレゼンテーション用スライドの作成に用いる。
384 \item \AmS-\LaTeX\ ({\tt AMS-LaTeX}) ……
385 数学的な文書の記述に強い\AmS-\TeX の機能と\LaTeX の機能を併せ持つ。
386 \item \XyMTeX\ ({\tt XyMTeX}) ……化学構造式の描画に用いる。
387 \item MusiX\TeX\ ({\tt MusiXTeX}) ……楽譜の記述に用いる。
388 \enditem
389
390 \TeX とそれに関連するプログラム、および\TeX のマクロパッケージなどは CTAN(Comprehensive TeX Archive Network、
391 包括 TeX アーカイブネットワーク)からダウンロードできる。
392
393
394 \beginsection 数式の表示例
395
396 たとえば
397 \begintt
398 -b \pm \sqrt{b^{2} - 4ac} \over 2a
399 \endtt
400 は以下のように表示される。
401 $$
402 -b \pm \sqrt{b^{2} - 4ac} \over 2a
403 $$
404
405 また、
406 \begintt
407 f(a,b) = \int_{a}^{b}\frac{1 + x}{a + x^{2} + x^{3}}dx
408 \endtt
409 は以下のように表示される。
410 $$
411 f(a,b) = \int_{a}^{b}{1 + x \over a + x^{2} + x^{3}}dx
412 $$
413
414
415 \beginsection 生い立ち
416
417 \TeX は、クヌースが自身の著書The Art of Computer Programmingを書いたときに、組版の汚さに憤慨し、
418 自分自身で心行くまで組版を制御するために作成したとされている。開発にあたって、伝統的な組版および
419 その関連技術に対する広範囲にわたる調査を行った。その調査結果を取り入れることで、\TeX は
420 商業品質の組版ができる柔軟で強力な組版システムになった。
421
422 \TeX はフリーソフトウェアであり、ソースコードも公開されていて、誰でも改良を加えることができる。
423 その改良版の配布も、\TeX と区別できるような別名を付けさえすれば許される。また、\TeX は非常に
424 バグが少ないソフトウェアとしても有名で、ジョーク好きのクヌースが、バグ発見者に対しては
425 前回のバグ発見者の2倍の懸賞金をかけるほどである。この賞金は小切手で払われるのだが、貰った人は
426 記念に取っておく人ばかりなので、結局クヌースの出費はほとんど無いという。
427
428 クヌースは\TeX のバージョン 3 を開発した際に、これ以上の機能拡張はしないことを宣言した。
429 その後は不具合の修正のみがなされ、バージョン番号は 3.14、3.141、3.1415、$\ldots$というように
430 付けられている。これは更新のたびに数字が円周率に近づいていくようになっていて、
431 クヌースの死の時点をもってバージョン$\pi$として、バージョンアップを打ち切るとのことである。
432
433 クヌースは\TeX の開発と同時に、\TeX で利用するフォントを作成するためのシステムである
434 \mf も開発した。こちらのバージョン番号は 2.71、2.718、2.7182、$\ldots$というように、
435 更新のたびに数字がネイピア数に近づいていくようになっている。さらにクヌースは\mf を使って、
436 \TeX の初期設定欧文フォントであるComputer Modernのデザインも行った。
437
438 \TeX および\mf は、これもクヌース自身によって提唱されている文芸的プログラミング\ 
439 (Literate Programming) を実現する{\tt WEB}というシステムでPascalへトランスレートされることを
440 前提に記述されている。しかし実際には{\tt WEB2C}でC言語に変換してコンパイルされ実行形式を
441 得ることが多い。
442
443 \beginsection \TeX の日本語化
444
445 日本語組版処理のできる日本語版の\TeX および\LaTeX には、アスキー・メディアワークスによるp\TeX\ 
446 (pTeX) およびp\LaTeX\ (pLaTeX) と、NTTの斉藤康己によるNTT J\TeX\ (NTT JTeX) およびNTT J\LaTeX\
447 (NTT JLaTeX) などがある。
448
449 \TeX の日本語対応において技術的に最も大きな課題は、複数バイト文字コードへの対応である。
450 p\TeX(および前身の日本語\TeX)は、JIS X 0208を文字集合とした文字コード(ISO-2022-JP、EUC-JP、
451 およびShift\_JIS)を直接扱う。DVIフォーマットは元々16ビット以上の文字コードを格納できる仕様が
452 含まれていた。しかしオリジナルの英語版では使われていなかったため、既存プログラムの多くはp\TeX が
453 出力するDVIファイルを処理できない。またフォントに関係するファイルフォーマットが拡張されている。
454 これに対してNTT J\TeX は、複数の1バイト文字セットに分割することで対応している。例えば、
455 ひらがなとカタカナは内部的には別々の1バイト文字セットとして扱われる。このためにオリジナルの
456 英語版からの変更が小さく、移植も比較的容易である。ファイルフォーマットが同じなので英語版の
457 プログラムでDVIファイル等を処理することもできる。しかし後述するフォントのマッピングの問題が
458 あるため、実際には多くの使用者がNTT J\TeX 用に拡張されたプログラムを使っている。
459
460 使用する日本語用フォントについてはp\TeX が写研フォントの使用を、NTT J\TeX が大日本印刷フォントの
461 使用を前提としており、それぞれフォントメトリック情報(フォントの文字寸法の情報)をバンドルして
462 配布している。しかし有償であるこれらのフォントのグリフ情報を持っていなくても、画面表示や印刷の
463 際に使用者が利用できる他の日本語用フォントで代用することができる。つまり写研フォントや
464 大日本印刷フォントのフォントメトリック情報を用いて文字の位置を固定し、画面表示や印刷には
465 他の日本語用フォントを用いていることが可能である。このため日本語化された\TeX 関係プログラムの
466 ほとんどは、画面表示や印刷で実際に使うフォントを選択できるように、フォントのマッピング
467 (対応付け)を定義する機能を持っている。
468
469 歴史的には、アスキーが日本語\TeX の PC-9800 シリーズ対応版を販売したために個人の使用者を中心に
470 普及した。一方、NTT J\TeX は元の英語版プログラムからの変更が比較的小さいという利点を受けて、
471 UNIX®およびUNIX互換OSを使う大学や研究機関の関係者を中心に普及した。
472
473 しかし現在では次に挙げる理由から、日本語対応\TeX としてp\TeX が使われていることが多い。
474
475 \item UNIX®用、およびUNIX互換OS用の主な日本語対応\TeX 配布形態である
476 ptexliveやptetex3がp\TeX のみを採用している。
477 \item Microsoft Windows用の主な日本語対応\TeX 配布形態であるW32\TeX が
478 p\TeX を扱える(NTT J\TeX も扱える)。
479 \item p\TeX の扱い方を解説する文献の方が、NTT J\TeX のものに比べて、
480 出版物とWeb上文書の両方で多い。
481 \item p\TeX は縦組みにも対応しているが、NTT J\TeX は対応していない。
482 \enditem
483
484 \beginsection \TeX による組版の作業工程
485
486 \TeX を利用して組版を行うには、通常次のような作業工程を取る。
487
488 \enum テキストエディタなどを用いて、文章に組版用命令文を織り込んだソースファイルを作成する。
489 \enum OSのコマンドラインから “|tex FileName.tex|” などと入力して\TeX を起動し、
490   {\tt DVI}ファイルを生成させる。
491 \itemitem ソースファイルにエラーがあれば、修正して再度\TeX を起動する。
492 \enum {\tt DVI}ウェアとよばれる{\tt DVI}命令文を解するソフトウェアを用いて組版結果を表示し、確認する。
493 \itemitem {\tt DVI}ウェアにはxdvi/xdvikやdviout for Windowsなどの{\tt DVI}ヴューア、
494   Dvips(k)やdvipdfm/DVIPDFM$x$などのファイル形式変換ソフトウェアなどがある。
495 \itemitem {\tt DVI}ファイルを{\tt DVI}ヴューアで画面表示または印刷する、
496   あるいはPDFやPost\-Scriptに変換して画面表示または印刷することで、組版結果を確認する。
497 \itemitem 修正の必要があれば、ソースファイルを修正して再度{\tt DVI}ファイルを作成、確認する。
498 \enditem
499
500 この間、作業工程が変わるたびにそれぞれのプログラムを切り替えたり、
501 扱う文書が大きいと章ごとにソースファイルを分割して管理したりと、比較的煩雑な作業を伴う。
502 そのため、この工程に係わる各種のプログラムやソースファイルの管理を一元的に行う
503 \TeX 用の統合環境がいくつか作成されている。
504
505 \beginparagraph GUI環境と\TeX
506
507 GUIはPCの普及に一役買ったが、同時にGUIしか触ったことのないPC利用者が増加した。
508 そのような利用者が、コマンドラインでの操作を余儀なくされる\TeX を非常に扱いづらく
509 感じてしまうのは否めないことである。
510 このため、GUIに特化した\TeX 用統合環境もいくつか作成されている。
511 \end