その他の描画系(PSTricks / Asymptote ほか)

「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 は pdflatexlualatexxelatex のどれでも、外部プログラムなしに、追加のコンパイル段階なしに動きます。このページで扱う四つは、どれかの条件を必ず一つは崩します。PSTricks は pdfLaTeX で直接は動かず、Asymptote は外部バイナリと三段階のコンパイルを要求し、MetaPost は LuaLaTeX か専用プログラムを前提とし、Xy-pic は動くけれども 2013 年で更新が止まっています。それでも他の系を知る価値があるのは、既存文書の保守本格的な 3DConTeXt のような特定のエコシステム という三つの事情があるからです。

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 です。線種・矢じり・色は角括弧のオプションでまとめて指定します。

latex
\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 で動くことを確認しました。

terminal
# 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] が標準的な機能一式を有効にします。

latex
\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 ほどの asympostmf と並んでおり、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 に任せます。

terminal
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
asymptote
// 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 経由)だけ です。

document.tex
% 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 のペンで描いて、水平・垂直の直径を一本ずつ引きます。fullcirclepencirclescaled はいずれも MetaPost の組み込み語彙です。エコシステムで重要なのが MetaFun という高機能フォーマットで、組版システム ConTeXt はこれを介して MetaPost を深く統合しています。ConTeXt を使うなら MetaPost が中心的な作図手段になり、LaTeX 主体なら、ふだんは TikZ、METAFONT 由来の曲線記述が欲しいときに MetaPost、という位置づけになります。

四系の比較 —— どれをいつ選ぶか

出力経路とエンジンで並べると、選択の基準が見えてきます。既存文書の保守 ならその文書が使っている系をそのまま読み書きできるようにし、3D の図 が要るなら Asymptote、ConTeXt を使うなら MetaPost(MetaFun)、新規の可換図式 なら Xy-pic ではなく tikz-cd。そしてこのどれにも当てはまらない大多数の作図は、外部ツールも特殊な出力経路も要らない TikZ で済ませるのがいちばん手堅い判断です。

出力経路・エンジン外部ツール強み・主な用途
PSTrickslatex → 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)で更新停止
Asymptotelatex/pdflatex → asy → もう一度 latex。または単体の .asyasy は TeX Live に同梱。latexmk で自動化できる本格的な 2D・3D。座標軸付きの立体や曲面。SVG・WebGL・3D PDF まで出力
MetaPostmpost.mp を処理。または LuaLaTeX + luamplibmplibcodeLuaLaTeX 経由なら不要(mplib が LuaTeX に内蔵)METAFONT 由来の曲線と方程式による座標。ConTeXt(MetaFun)の中心