LaTeX の用語がわかりにくいのは、難しい言葉が多いからではありません。日常語と同じ顔をしていて、中身だけが違うからです。「パッケージ」は npm のパッケージではなく、「クラス」はオブジェクト指向のクラスではなく、「グルー」は接着剤ではありません。しかもこの用語集の主役——エンジンとフォーマット、クラスとパッケージ、箱とグルーとカーン——は、どれも実際に手元で確かめられます。たとえば pdflatex は pdftex へのシンボリックリンクにすぎず、latex も同じ pdftex を指しています。この用語集は、各項目を「新入りが必ず取り違えるところ」から説明していきます。
エンジンとフォーマットの違い — なぜ pdflatex は pdftex なのか
エンジンは実際に走るプログラム、フォーマットはそのプログラムにあらかじめ読み込ませたマクロの塊です。これは抽象論ではなく、ファイルシステムで確かめられます。TeX Live 2024 の bin を覗くと pdflatex は pdftex へのシンボリックリンクで、latex も同じ pdftex を指しています。同様に xelatex → xetex、lualatex → luahbtex、platex と uplatex はどちらも euptex。つまり「6 つの LaTeX コマンド」の実体は 4 つのバイナリしかありません。では latex と pdflatex の違いは何かというと、起動時に読み込む .fmt ファイル(あらかじめ処理済みのマクロを固めたもの)だけです。latex.fmt は 8,221,690 バイト、pdflatex.fmt は 8,221,444 バイト——246 バイト違うだけの、ほぼ同じものです。
# TeX Live 2024: six commands, four binaries
$ ls -l latex pdflatex xelatex lualatex platex uplatex
latex -> pdftex
pdflatex -> pdftex
xelatex -> xetex
lualatex -> luahbtex
platex -> euptex
uplatex -> euptex| 用語 | 意味と、取り違えやすい点 |
|---|---|
engine | 実行されるプログラム本体(tex・pdftex・xetex・luatex・euptex)。出力形式・フォント方式・文字コードの扱いを決めるのはここ |
format | あらかじめ読み込ませたマクロ体系(plain TeX・LaTeX・ConTeXt)。.fmt として固められる |
.fmt | フォーマットのダンプ。texmf-var/web2c/<エンジン名>/ 以下に置かれ、fmtutil が作る |
pdfLaTeX | エンジン pdftex + フォーマット LaTeX の組み合わせ。「pdfLaTeX というプログラム」は存在しない |
LaTeX2e | 1994 年以降の現行 LaTeX。単に「LaTeX」と言えば普通これを指す |
LaTeX3 | カーネルを書き直す長期プロジェクト。expl3 としてすでに現行 LaTeX に組み込まれ、多くのパッケージが使っている |
クラスとパッケージの違い — .cls と .sty は何が違うのか
クラスは文書が「何であるか」を決め、パッケージは文書に機能を「足す」——そして文書ひとつにクラスは 1 個だけ、パッケージは何個でも、というのが唯一にして最大の違いです。技術的には両方ともマクロを定義するテキストファイルで、.cls と .sty の中身に本質的な区別はありません。区別しているのは読み込み方だけで、\documentclass{article} が 1 回、\usepackage{...} が何度でも、という文法がその決まりを表しています。だから「二段組にしたい」がクラスの話(\documentclass[twocolumn])なのか、パッケージの話(multicol)なのかで迷ったときは、文書の種類が変わるのか、機能が増えるだけなのかで考えると当たります。なお .dtx はパッケージの原稿(ソースと文書が同居した形式)、.ins はそこから .sty を取り出す指示書です。
| 拡張子 | 中身と、いつ生まれるか |
|---|---|
.tex | 自分で書く原稿。ここだけがバージョン管理すべき「本体」 |
.cls | クラス。\documentclass で 1 つだけ読み込む |
.sty | パッケージ。\usepackage で何個でも読み込む |
.dtx / .ins | パッケージ作者側の原稿と、そこから .sty を生成する指示書 |
.aux | 相互参照・目次・引用のメモ。これがあるから 2 回組む必要がある |
.log | 実行の全記録。警告や Missing character はここにしか出ないことがある |
.bib / .bbl | 文献データベースと、そこから組み上がった文献リスト |
マクロ・トークン・カテゴリコード — TeX が文字を読む順番
TeX は文字をそのまま読むのではなく、1 文字ずつ「カテゴリコード」(catcode)という 0〜15 の役割番号を貼ってから扱います。\ は 0(命令の始まり)、{ は 1、} は 2、$ は 3、& は 4、# は 6、^ は 7、_ は 8、空白は 10、英字は 11(letter)、数字や記号は 12(other)、~ は 13(active)、% は 14(comment)。この番号を貼られた最小単位が トークンで、マクロとはトークン列に付けた名前にすぎません。ここが効いてくる場面がひとつあります。文書本文では @ の catcode は 12——つまり @ は普通の記号で、命令名の一部になれません。だから内部命令 \@ifnextchar のような名前は本文からは呼べず、呼びたければ \makeatletter で @ を一時的に 11 に変えます。パッケージ(.sty)の中では最初から 11 なので、この操作が要らない、というのが仕組みの全体です。
% Ask TeX for the catcode of a character; the answer lands in the log.
\showthe\catcode`\@ % > 12. (in the document body: "other")
\showthe\catcode`\A % > 11. (letter)
\showthe\catcode`\~ % > 13. (active)
\makeatletter
\showthe\catcode`\@ % > 11. (now a letter, so \@ifnextchar works)
\makeatother| 用語 | 意味と、取り違えやすい点 |
|---|---|
token | 文字 + カテゴリコードの組。TeX が扱う最小単位で、字面が同じでも catcode が違えば別物 |
catcode | 0〜15 の役割番号。\catcode で書き換えられ、verbatim はこれを使って命令を無効化している |
macro | トークン列に付けた名前。\newcommand で定義するのがこれ。関数ではなく置き換えなので、引数は評価されずそのまま貼り込まれる |
expansion | マクロを中身に置き換える処理。エラーが定義元ではなく展開先の行番号で出るのはこのため |
robust / fragile | 見出しや脚注のように内容が保存される場所(可動引数)で壊れない命令が robust、壊れるのが fragile。現代の LaTeX ではほとんどが robust 化されている |
箱・グルー・カーン — 組版の三つの部品
TeX から見た組み上がったページは、文字でも段落でもなく 箱(box)と、その隙間を埋めるグルー(glue)とカーン(kern) の三種類だけでできています。文字は幅・高さ・深さを持つ小さな箱で、行はそれを横に並べた箱(\hbox)、ページは行を縦に積んだ箱(\vbox)。箱と箱のあいだに入るのが グルー——伸び縮みできる空白です。単なる幅ではなく「自然な幅・伸びしろ・縮みしろ」の三つ組で、10pt の Computer Modern では単語間の空白は自然幅 3.33333pt、伸び 1.66666pt、縮み 1.11111pt。両端揃えができるのはこの伸縮のおかげで、TeX が「行の詰まり具合(badness)」を計算できるのもここです。対する カーン は伸び縮みしない固定の隙間で、しかも改行位置になれません。だから \hbox to 60pt{a\kern 10pt b} は幅を埋められず Underfull \hbox (badness 10000) を出しますが、伸びるグルーを入れた同じ箱は黙って収まります。
| 用語 | 意味と、取り違えやすい点 |
|---|---|
box | 幅・高さ・深さを持つ矩形。\hbox は横並び、\vbox は縦積み。深さ(ベースラインより下)を別に持つのが TeX の特徴 |
glue | 伸び縮みする空白。自然幅・伸び・縮みの三つ組。改行や改ページの候補地点にもなる |
kern | 固定幅の隙間。伸び縮みせず、改行位置にもならない。字詰め(\TeX の中の負のカーンなど)に使う |
badness | グルーをどれだけ無理に伸縮させたかの尺度。0〜10000 で、10000 が最悪。Underfull \hbox (badness 10000) はこの値 |
sp | scaled point。TeX 内部の最小単位で、1pt = 65536sp。すべての長さはこの整数で保持され、丸め誤差が積み上がらない |
DVI とは何か — 「装置非依存」がフォントを持たない理由
DVI(device-independent)は TeX が本来吐き出す出力形式で、「どの文字を、どのフォントで、どの座標に置くか」だけを書いた指示書です。フォントの輪郭そのものは入っていません。この差は実測すると劇的です。一行だけの同じ文書を TeX Live 2024 で組むと、latex が出す DVI は 300 バイト、pdflatex が出す PDF は 17,081 バイト——57 倍以上。DVI の中身を覗くと fntdef1 27: cmr10 とあり、フォントは名前で参照されているだけです。一方 PDF 側を pdffonts で見ると CMR10 が emb yes sub yes——輪郭が埋め込まれ、しかも使った字だけに間引かれています。だから DVI は単体では正しく表示できず、dvipdfmx や dvips にフォントを解決させて初めて配布物になります。逆に、この軽さと後段の自由さこそが、日本語の upLaTeX → dvipdfmx という経路が今も現役である理由でもあります。
| 用語 | 意味と、取り違えやすい点 |
|---|---|
DVI | device-independent。フォントを名前で参照するだけの中間形式。表示にも配布にも変換が要る |
PDF | 配布と印刷の最終形。フォントが埋め込まれ、しおり・リンク・メタデータも持てる |
PostScript | ページ記述言語。dvips で DVI から生成し、印刷所向けの入稿で今も使われる |
pt / bp | TeX の pt は英米式ポイントで 1in = 72.26999pt。PDF や PostScript の点は bp(big point)で 1bp = 1.00374pt。1 インチ 72 点なのは後者のほう |
MWE | minimal working example。問題を再現する最小の文書。質問するときに真っ先に求められる |
CTAN・TDS・texmf・kpathsea — ファイルはどこにあるのか
CTAN が世界の倉庫、TDS がその中の並べ方、texmf が手元に置かれた実物、kpathsea がそれを探す仕組み——この四つは一本の線でつながっています。CTAN(Comprehensive TeX Archive Network)に集められたパッケージは、TDS(TeX Directory Structure)という共通の配置規則に従って texmf ツリーへ展開されます。.sty は tex/latex/<パッケージ名>/、文書は doc/latex/<パッケージ名>/ という具合です。この規則があるから、どのディストリビューションでもファイルの居場所が同じになります。ただし TeX Live 2024 の texmf-dist には 276,953 件のファイルが並んでおり、毎回ディレクトリを走査していては話になりません。そこで kpathsea が ls-R という索引を先に読みます。パッケージを手で追加したのに見つからないときは、たいていこの索引が古いだけです(mktexlsr で作り直します)。どのファイルが実際に使われているかは kpsewhich article.cls で一発でわかります。
| 用語 | 意味と、取り違えやすい点 |
|---|---|
CTAN | パッケージの中央アーカイブ(ctan.org)。世界中のミラーに同期される |
TDS | TeX Directory Structure。texmf の中の並べ方を決めた規約。手動配置で迷ったらこれに従う |
texmf | 実際のファイルが入るツリー。複数あり、texmf-local が texmf-dist より優先される |
kpathsea / ls-R | ファイル探索ライブラリと、その索引。kpsewhich で問い合わせ、mktexlsr で索引を作り直す |
TeX Live / MiKTeX | 主要なディストリビューション。TeX Live は年 1 回まるごと更新、MiKTeX は不足パッケージを実行時に取りに行くのが持ち味 |
tlmgr | TeX Live のパッケージ管理コマンド。個々のパッケージ更新や追加インストールを行う |
和文組版の用語 — JFM・和欧文・禁則
日本語の TeX には、欧文だけを扱っていると出てこない語彙があります。中心にあるのは 和文と欧文をまったく別系統として扱うという設計です。pTeX 系のエンジンは、漢字・かなを 和文フォントで、ラテン文字を 欧文フォントで組み、その境目には自動で四分アキ(\xkanjiskip)を入れます。和文フォントの寸法を記述するのが JFM(Japanese Font Metric)で、ここには字幅だけでなく「約物どうしが並んだときにどれだけ詰めるか」まで書き込まれています。行頭に「、」が来ない、行末に「(」が来ない、といった規則が 禁則処理(きんそく)で、TeX ではペナルティ値としてこれを表現します。ルビ(振り仮名)と 縦組みも日本語固有の要求で、どちらもクラスやパッケージ側の仕事です。用語の実際の使い分けと設定方法は日本語組版のページ群が担当します。
| 用語 | 意味と、取り違えやすい点 |
|---|---|
JFM | Japanese Font Metric。和文フォントの寸法定義。字幅のほか、約物の詰め方の規則を含む |
pTeX / upTeX | 和文組版に対応した TeX エンジン。upTeX は内部を Unicode 化した後継 |
kinsoku | 禁則処理。行頭・行末に置いてはならない文字の規則。TeX ではペナルティ値で表す |
\xkanjiskip | 和文と欧文の境目に自動で入る空き。既定はおよそ四分アキで、値は変更できる |
ruby | 振り仮名。本文の上(縦組みでは右)に小さく添える読み。クラスやパッケージが提供する |