pdfTeX(ピーディーエフ・テフ)は、DVI を経由せずに PDF を直接出力する TeX エンジンです。pdflatex の正体であり、世界でもっとも広く使われてきた TeX 処理系。最大の特徴は、行頭・行末の文字を版面の外へわずかにはみ出させる マージン・カーニング と、文字幅をごく僅かに伸縮させる フォント拡張 という「マイクロタイポグラフィ」で、これが pdfTeX を組版品質の面で特別な存在にしています。
pdfTeX とは
クヌースのオリジナルの TeX は DVI(device independent)という中間形式を吐き出すだけで、それを別のプログラムで PostScript や PDF に変換していました。pdfTeX はこの流れを一段省き、TeX のページ組版エンジンから 直接 PDF を生成 します。1990 年代後半、ベトナム出身の ハン・テ・タン(Hàn Thế Thành) が、チェコのマサリク大学での博士論文の一部として開発しました。最初の公開は 1996 年です。
注意したいのは、pdfTeX は フォーマットではなくエンジン だということです。エンジンは処理する実行ファイル、フォーマットは命令の体系(LaTeX や Plain TeX)。pdfTeX エンジンの上に LaTeX フォーマットを載せたものが pdfLaTeX(コマンド名 pdflatex)で、Plain TeX を載せたものが pdftex です。「pdfLaTeX で書いている」と言うとき、内部で動いているエンジンが pdfTeX です。
pdfTeX は e-TeX 拡張 を取り込んでいます。e-TeX は \protected や \unexpanded、追加レジスタ、右から左への組版補助など、TeX のマクロ機能を拡張する一連の機能群で、現代の LaTeX が前提としているものです。歴史的には e-TeX 入りの pdfTeX が pdfetex として配布され、TeX Live 2004 から既定エンジンになりました。今日の pdflatex は、この e-TeX 入り pdfTeX だと考えて差し支えありません。
PDF を出すか、DVI を出すか
既定では PDF を直接出力しますが、pdfTeX は DVI も出力できます。切り替えは \pdfoutput という整数パラメータで行い、\pdfoutput=1(正の値)なら PDF、\pdfoutput=0 なら従来どおり DVI を吐きます。\pdfoutput=0 のときの DVI は、原則としてオリジナル TeX の出力と同じものになります。
この値は文書のごく先頭、\documentclass より前のプリアンブル段階で設定する必要があります(途中で PDF と DVI を切り替えることはできません)。PSTricks のように PostScript の特殊命令に依存するパッケージを使うと、DVI→PS→PDF の経路が必要になる場面があり、そのときは \pdfoutput=0 が役立ちます。
% Force DVI output even when run via pdflatex
\pdfoutput=0
\documentclass{article}
\begin{document}
This run produces a .dvi file, not a .pdf.
\end{document}マイクロタイポグラフィ
pdfTeX を語るうえで外せないのが マイクロタイポグラフィ です。これはハン・テ・タンの博士論文「Micro-typographic extensions to the TeX typesetting system」そのもののテーマで、版面の縁を整え、行内の空きを均すための微調整を、TeX の行分割アルゴリズムに組み込みました。発想の源は、ヘルマン・ツァップと ペーター・カロウ が開発した hz-program にあります。
一つ目は 文字の突き出し(character protrusion)、別名 マージン・カーニング です。ピリオドやカンマ、ハイフン、約物などを版面の縁からほんの少し外へはみ出させると、機械的にそろえただけでは凸凹に見える右端・左端が、視覚的にまっすぐ見えるようになります。これは「ぶら下げ約物(hanging punctuation)」を一般化したものです。
二つ目は フォント拡張(font expansion)、すなわち hz アルゴリズムです。各文字を 目に見えないほど僅かに 横に伸縮させた字形を使うことで、単語間の空きをより均一にできます。pdfTeX はこの伸縮の余地を行分割の段階で考慮に入れ、より良い改行位置を選びます。結果として、語間が間延びした行(俗にいう「川」)が減り、段落全体の濃度が均一になります。
これらは生のプリミティブで制御できます。突き出しは \pdfprotrudechars(0=無効, 1=有効, 2=幅計算にも反映)と、文字ごとの突き出し量を与える \lpcode(左端)・\rpcode(右端)。フォント拡張は \pdfadjustspacing(=2 で伸縮を行分割に組み込む)と、伸縮しやすさを文字ごとに与える \efcode。ただし実務でこれらを直接いじることはまずありません。
実務では、これらを束ねて面倒を見てくれる microtype パッケージ を読み込むだけです。\usepackage{microtype} の一行で、突き出しとフォント拡張が適切なデフォルトで有効になります。
\documentclass{article}
\usepackage{microtype} % protrusion + expansion, sensible defaults
\begin{document}
With microtype loaded, pdfTeX nudges punctuation into the
margins and flexes glyph widths a hair, so justified text
looks noticeably more even.
\end{document}PDF 機能と画像取り込み
PDF を直接生成するエンジンなので、PDF の機能へ手が届くプリミティブが揃っています。生の PDF 描画演算子を流し込む \pdfliteral、PDF オブジェクトを直接作る \pdfobj、注釈(リンクやフォーム部品など)を置く \pdfannot がその代表です。ハイパーリンクやしおり(ブックマーク)は、これらの仕組みの上に hyperref パッケージ が構築しています。
文書全体に関わるものとしては、タイトルや著者などのメタデータを書き込む \pdfinfo、出力 PDF の圧縮レベルを決める \pdfcompresslevel、各ページに属性を付ける \pdfpageattr などがあります。
\pdfinfo{
/Title (My Report)
/Author (A. Author)
}
\pdfcompresslevel=9
% draw a thin rule with a raw PDF operator
\pdfliteral{0 0 m 100 0 l 0.4 w S}画像も直接扱えます。pdfTeX は PNG・JPEG・PDF を中間変換なしに取り込めるのが強みで(一方 EPS は事前に PDF へ変換する必要があります)、低レベルでは \pdfximage が画像を読み込みます。とはいえ、ふだんは graphicx パッケージの \includegraphics を使えばよく、内部で適切なプリミティブが呼ばれます。
| プリミティブ | 役割 |
|---|---|
\pdfliteral | 生の PDF 描画演算子を挿入 |
\pdfobj / \pdfannot | PDF オブジェクト・注釈を直接生成 |
\pdfinfo | タイトル・著者などメタデータを書く |
\pdfcompresslevel | 出力 PDF の圧縮率(0–9) |
\pdfximage | PNG / JPEG / PDF 画像を取り込む |
\pdfpageattr | 各ページに PDF 属性を付与 |
限界と、乗り換えどき
強力な一方で、pdfTeX には今となっては古さを感じる制約があります。最大のものは 8 ビットエンジン であること。XeTeX や LuaTeX のように Unicode をそのまま入力として扱う仕組みを持たず、UTF-8 の日本語などを直接組むことは想定していません(欧文では inputenc/fontenc で補ってきました)。
フォントの扱いも限定的です。寸法情報は TFM(TeX Font Metric)に依存し、実際の字形は Type1 や TrueType をマップファイル経由で埋め込みます。OS にインストールされた OpenType フォントを名前で直接指定する ことはできません。さらに、組版中にプログラムを走らせる Lua のような拡張言語も持ちません。
だからこそ、システムフォントを使いたい / Unicode で多言語を組みたい という要求が、人々を XeTeX や LuaTeX へ向かわせます。日本語を新規に始めるなら、これらのエンジン(日本語なら upLaTeX か LuaLaTeX)が現実的な選択です。
なお pdfTeX 自体は、現在では 安定し、ほぼ凍結された保守モード にあります。バグ修正は続きますが、新機能の開発はほぼ LuaTeX(Lua を組み込んだ pdfTeX の発展形)に移りました。それでも英語・欧文中心の文書では、pdfTeX は今なお高速で堅実、もっとも枯れた選択肢であり続けています。
受け継がれたプリミティブ
pdfTeX が導入した数多くの \pdf... プリミティブは、後続のエンジンに引き継がれ、事実上の標準になりました。マイクロタイポグラフィの機能は XeTeX や LuaTeX にも取り込まれています。
ただし LuaTeX では、肥大化した \pdf... 名前空間が整理され、多くが **\pdfextension・\pdfvariable・\pdffeedback** という少数の窓口にまとめ直されました。たとえば \pdfliteral は \pdfextension literal に、\pdfoutput は \outputmode に置き換わっています。pdfTeX 時代の知識はおおむね通用しますが、新エンジンでは綴りが変わっている、と覚えておくとよいでしょう。