「PSTricks は過去の道具、TikZ は現役」——よく聞く整理ですが、TeX Live 2024 の中身を見ると話が逆さまになります。同梱の PSTricks は 2024 年 2 月 2 日付の v3.19c で、いまも新版が出ています。一方、可換図式の定番として名高い Xy-pic が最後に更新されたのは 2013 年 10 月 6 日で、コンパイルのたびにその日付を自分でログに書きます。このページでは LaTeX で TikZ 以外に使える四つの描画系——PostScript を呼ぶ PSTricks、図式の古参 Xy-pic、独立した言語である Asymptote、METAFONT の血を引く MetaPost——を、それぞれの 出力経路 を軸に見ていきます。選択を分けるのは表現力よりも、どのエンジンでどう組めるかだからです。
新しく描き始めるなら、やはり TikZ でよいのか
はい、ほぼ確実に TikZ です。理由は機能ではなく 摩擦のなさ にあります。TikZ は pdflatex・lualatex・xelatex のどれでも、外部プログラムなしに、追加のコンパイル段階なしに動きます。このページで扱う四つは、どれかの条件を必ず一つは崩します。PSTricks は pdfLaTeX で直接は動かず、Asymptote は外部バイナリと三段階のコンパイルを要求し、MetaPost は LuaLaTeX か専用プログラムを前提とし、Xy-pic は動くけれども 2013 年で更新が止まっています。それでも他の系を知る価値があるのは、既存文書の保守、本格的な 3D、ConTeXt のような特定のエコシステム という三つの事情があるからです。
PSTricks —— 30 年ものの、いまも更新されている系
PSTricks は、PostScript の描画機能を TeX/LaTeX のソースから直接呼び出すマクロ群です。pstricks.tex の先頭に並ぶ著作権表示が、この系の履歴をそのまま語っています——Timothy Van Zandt(1993, 1994, 1999)、Denis Girou(2000–2003)、そして Herbert Voß(2004 年以降)。三代にわたって受け継がれ、TeX Live 2024 に入っている版は v3.19c、日付は 2024 年 2 月 2 日です。「古い」のは設計思想であって、保守状況ではありません。
文法は名前から働きが読める部類です。\psline は線(折れ線)、\pscircle は円、\psframe は長方形。座標は丸括弧で \psline(0,0)(3,2) のように与え、円は中心と半径を \pscircle(2,2){1} と書きます。図全体は pspicture 環境 に入れ、開くときに左下と右上の座標を \begin{pspicture}(0,0)(4,3) のように渡します。任意のものを座標に置くのが \rput、角度や寄せを足したいときは \uput です。線種・矢じり・色は角括弧のオプションでまとめて指定します。
\begin{pspicture}(0,0)(4,3)
\psframe(0,0)(4,3)
\psline[linewidth=1pt]{->}(0,0)(3,2)
\pscircle(2,1.5){1}
\rput(2,1.5){$O$}
\end{pspicture}この図は幅 4・高さ 3 の枠を引き、原点から (3,2) へ矢印付きの線分を伸ばし、中心 (2,1.5)・半径 1 の円を重ね、円の中心に O を置きます。派生パッケージも豊富で、pst-plot(関数プロット)、pst-node(ノードと結線)、pst-3dplot(3D)などが揃っています。表現力の点では今でも十分に強力です。問題は次節の一点に集約されます。
PSTricks を pdfLaTeX で組むと出るエラーと、その回避策
最初の描画命令のところで ! Undefined control sequence. が出ます。TeX Live 2024 で \usepackage{pstricks} した文書を pdflatex に通すと、\psframe の行でこう止まりました——"! Undefined control sequence. \c@lor@to@ps ->\PSTricks _Not_Configured_For_This_Format"。展開の途中で \PSTricks_Not_Configured_For_This_Format という、わざと未定義にしてある目印のトークン が現れているわけで、「このフォーマットには対応していない」と名前で叫んでいます。厄介なのは、nonstopmode だとこのエラーを何十回も出しながら PDF は最後まで出る ことです——図だけが抜け落ちた PDF が。
原因は出力の仕組みそのものにあります。PSTricks は描画を PostScript の \special——DVI に埋め込む特殊命令——として書き出す設計で、PDF を直接吐く pdflatex にはその受け皿がありません。逃げ道は三つ、いずれも実際に TeX Live 2024 で動くことを確認しました。
# route 1: the classic DVI path
latex figure.tex
dvips figure.dvi -o figure.ps
ps2pdf figure.ps
# route 2: stay in pdflatex, let auto-pst-pdf shell out
pdflatex --shell-escape figure.tex
# route 3: just use xelatex - no extra package needed
xelatex figure.tex経路 1 は古典で、いちばん確実です。latex で DVI を作り、dvips で PostScript にし、ps2pdf(Ghostscript)で PDF にします。ここで一つ実測の注意——Ghostscript 10.03.0 は途中で "WARNING: Transparency operations ignored - need to use -dALLOWPSTRANSPARENCY" を出しました。PSTricks の透明度(opacity 系)が 黙って落ちる という意味なので、半透明の塗りを使っているなら結果を必ず目で確認してください。
経路 2 は、pdflatex の流れを保ったまま auto-pst-pdf に裏方を任せる方法です。仕組みは素朴で、pdflatex の実行中に auto-pst-pdf が もう一つの LaTeX を子プロセスとして起動し、PSTricks 部分だけを PostScript 経由で 文書名-pics.pdf にレンダリングして、それを取り込みます。実際に走らせるとログに "auto-pst-pdf: Auxiliary LaTeX compilation" と出て、その裏で経路 1 が回っているのが見えます。外部プロセスを起動する以上 --shell-escape が必須で、付け忘れると "! Package auto-pst-pdf Error: auto-pst-pdf will not work!" と、ずいぶんはっきり叱られます。PNG や JPEG を同じ文書に混ぜたいときは、この経路が有力です。
経路 3 がいちばん意外で、いちばん簡単です。ソースを 1 文字も変えずに xelatex に通すだけで通ります。追加のパッケージを入れる必要はありません——TeX Live 2024 の PSTricks 本体が tex/generic/pstricks/config/xdvipdfmx.cfg という設定を同梱していて、XeLaTeX で走ったときに自動で読み込まれるからです(実際、ログにそのファイル名が出ます)。XeLaTeX は内部で DVI 系の中間形式を経由するため、PostScript の \special が素直に流せるのです。もし文書全体をすでに XeLaTeX で組んでいるなら、PSTricks の「回避策」は存在しない、と言ってしまってよいでしょう。
Xy-pic と \xymatrix —— いまも動く、2013 年で止まった系
Xy-pic(パッケージ名 xy)は、グラフや図式を組むための汎用パッケージで、plain TeX・LaTeX・AMS-LaTeX のいずれでも動きます。特別な出力経路は要りません——pdflatex でそのまま通ります。面白いのは、コンパイルするたびに自分の素性をログに書くところで、TeX Live 2024 では " Xy-pic version 3.8.9 <2013/10/06>" と出ます。xy.tex の著作権表示は 1991 年から 2013 年まで、Kristoffer H. Rose ほか。20 年以上使われ、そして 10 年以上更新されていない、ということが 1 行に凝縮されています。
実務でよく使われるのは、可換図式 のための \xymatrix です。図を行列のように組むモードで、tabular と同じく要素を & で横に区切り、\\ で行を改めます。対象どうしを結ぶ矢印は \ar で描き、行き先を方向キーで与えます——[r] が右、[l] が左、[u] が上、[d] が下、[rd] のように連ねると右下の隣です。矢印のラベルは数式の添字の記法を流用し、^ で矢印の上(進行方向から見て左)、_ で下(右)に置かれます。読み込みは \usepackage[all]{xy} が定番で、[all] が標準的な機能一式を有効にします。
\usepackage[all]{xy}
% ...
\[
\xymatrix{
A \ar[r]^{f} \ar[d]_{\alpha} & B \ar[d]^{\beta} \\
C \ar[r]_{g} & D
}
\]これは四隅に A・B・C・D を置いた可換正方形で、上辺に右向きの f、左辺に下向きの α、右辺に下向きの β、下辺に右向きの g が入ります。図式そのものが数学の一部なので、別行立ての数式環境の中に置いています。新しく可換図式を描くなら、いまは TikZ ベースの tikz-cd が現代的な選択です——曲線や凝った矢じり、多段の複雑な図式が扱いやすく、エラーメッセージも読めます。本節の知識は、すでに Xy-pic で書かれた原稿を読み書きするため に価値があります。両者の比較は可換図式のページの担当です。
Asymptote —— コンパイラが TeX Live に同梱されている言語
外部プログラムが要る、と聞くと身構えますが、Asymptote の asy は TeX Live に入っています。TeX Live 2024 のバイナリディレクトリを覗くと、45 MB ほどの asy が mpost や mf と並んでおり、asy --version は "Asymptote version 2.88" と、有効なオプションとして "V3D 3D vector graphics output" を返します。つまり TeX Live を入れた時点で、別途の入手作業なしに Asymptote が使えます。これは前ページで見た gnuplot(TeX Live には含まれず、自分で入れる必要がある)との決定的な違いです。
Asymptote は TeX のマクロではなく、独立したベクタグラフィックスの言語 です。C++ 風の構文を持ち、変数・関数・ループ・型を備えた本格的なプログラミング言語として図を書きます。設計上の狙いも面白くて、公式マニュアルは Asymptote を MetaPost に触発された言語として位置づけつつ、より整った C++ 風の構文を掲げています。とりわけ変わっているのが寸法の決め方で、size(6cm) のような 全体の大きさの指定と、ラベルや矢じりのような伸縮しない要素の寸法 が衝突するとき、Asymptote は 単体法(線形計画法) を使ってその制約を解きます。図の大きさを決めるのに線形計画を回す作図言語は、そう多くありません。
LaTeX に埋め込むには \usepackage{asymptote} を読み込み、図のコードを asy 環境 に書きます。仕組み上、コンパイルは 三段階 です。TeX Live 2024 で実際に走らせると、こうなりました。まず pdflatex を通すと asy 環境の中身が 文書名-1.asy として書き出され、同時に "Package asymptote Warning: file ... not found on input line 11." という警告が出ます——まだ図が無いのだから当然です。次に asy 文書名-1.asy を走らせると 文書名-1.pdf ができ、もう一度 pdflatex を通すと、その PDF が取り込まれます。この三段階を手で回すのは面倒なので、実務では latexmk に任せます。
pdflatex document # writes document-1.asy
asy document-1.asy # produces document-1.pdf
pdflatex document # includes it
# or, in one go:
latexmk -pdf document// a standalone .asy file, run with: asy figure.asy
import three;
size(6cm);
draw(unitcube);
draw(O--X, red, Arrow3);
draw(O--Y, green, Arrow3);
draw(O--Z, blue, Arrow3);このコードは three モジュール(3D 機能)を読み込み、単位立方体を描き、原点から x・y・z の各軸方向へ赤・緑・青の三次元矢印を引きます。図は文書に埋め込まず、このように 独立した .asy ファイル として書いて asy figure.asy で単体実行することもでき、PDF・EPS のほか SVG や WebGL、PDF に埋め込める 3D 形式など多彩な出力が選べます。ラベルの組版には TeX を使うので、図中の数式は本文と同じ書体になります。座標軸付きの立体や曲面のような 本格的な 3D で、Asymptote は TikZ より素直に書けます。対話的に描いて .asy ソースを書き出す GUI フロントエンド xasy も付属します。
MetaPost —— LuaLaTeX なら外部プログラムなしで書ける
MetaPost は、クヌースの METAFONT(フォントを記述するための言語)を John Hobby が改作し、出力を PostScript にしたものです。METAFONT 譲りの、点と方向から滑らかな曲線を解いて引く記法(Hobby のアルゴリズム)を持ち、座標を 方程式として宣言的に 書けるのが特徴です。古典的な使い方は独立した言語としてで、専用プログラム mpost に .mp ファイルを渡して EPS を得ます。
ところが現代の LaTeX では、この外部呼び出しが要りません。luamplib パッケージを読み込むと、mplibcode 環境 の中に MetaPost をそのまま書けます。LuaTeX には MetaPost のエンジンが mplib ライブラリ として組み込まれているので、mpost を別途起動する必要も --shell-escape も不要です。TeX Live 2024 で下の例を lualatex に通したところ、外部プロセスを一つも呼ばずに一発で PDF が出ました。このページで扱う四系のうち、追加の外部ツールを一切要求しないのは MetaPost(LuaLaTeX 経由)だけ です。
% compile with lualatex
\documentclass{article}
\usepackage{luamplib}
\begin{document}
\begin{mplibcode}
beginfig(1);
draw fullcircle scaled 2cm withpen pencircle scaled 1pt;
draw (-1cm,0)--(1cm,0);
draw (0,-1cm)--(0,1cm);
endfig;
\end{mplibcode}
\end{document}mplibcode の中身は純粋な MetaPost です。beginfig(1) … endfig が一つの図を区切り、単位円を直径 2cm に拡大した円を太さ 1pt のペンで描いて、水平・垂直の直径を一本ずつ引きます。fullcircle・pencircle・scaled はいずれも MetaPost の組み込み語彙です。エコシステムで重要なのが MetaFun という高機能フォーマットで、組版システム ConTeXt はこれを介して MetaPost を深く統合しています。ConTeXt を使うなら MetaPost が中心的な作図手段になり、LaTeX 主体なら、ふだんは TikZ、METAFONT 由来の曲線記述が欲しいときに MetaPost、という位置づけになります。
四系の比較 —— どれをいつ選ぶか
出力経路とエンジンで並べると、選択の基準が見えてきます。既存文書の保守 ならその文書が使っている系をそのまま読み書きできるようにし、3D の図 が要るなら Asymptote、ConTeXt を使うなら MetaPost(MetaFun)、新規の可換図式 なら Xy-pic ではなく tikz-cd。そしてこのどれにも当てはまらない大多数の作図は、外部ツールも特殊な出力経路も要らない TikZ で済ませるのがいちばん手堅い判断です。
| 系 | 出力経路・エンジン | 外部ツール | 強み・主な用途 |
|---|---|---|---|
PSTricks | latex → dvips → ps2pdf、または auto-pst-pdf 付き pdfLaTeX、または XeLaTeX 単独 | dvips と Ghostscript。auto-pst-pdf 経路は --shell-escape も必要 | PostScript の高品質な塗りと効果。既存文書が多い。v3.19c(2024)と保守は現役 |
Xy-pic | ふつうの LaTeX で動く。特別な経路は不要 | 不要 | 可換図式の古参。現代は tikz-cd が代替。3.8.9(2013)で更新停止 |
Asymptote | latex/pdflatex → asy → もう一度 latex。または単体の .asy | asy は TeX Live に同梱。latexmk で自動化できる | 本格的な 2D・3D。座標軸付きの立体や曲面。SVG・WebGL・3D PDF まで出力 |
MetaPost | mpost で .mp を処理。または LuaLaTeX + luamplib の mplibcode | LuaLaTeX 経由なら不要(mplib が LuaTeX に内蔵) | METAFONT 由来の曲線と方程式による座標。ConTeXt(MetaFun)の中心 |