*MetaPost [#v0160eb8]

#contents

**はじめに [#q0dc30bf]

「この文章は角藤さんの
[[MetaPost の紹介 (PDF) [Internet Archive]:http://web.archive.org/web/20030318073200/http://www.fsci.fuk.kindai.ac.jp/~kakuto/win32-ptex/mpost.pdf]]
という文章に触発されて書いたものです。角藤さんに感謝いたします。」

↑この謝辞は、この文章が[[Wiki>../]]に移される前に[[奥村さん>http://cise.edu.mie-u.ac.jp/~okumura/]]が記したものです。この文章がWikiに移された後は不特定多数の方が加筆しているので、謝辞は妥当なものではなくなっているかもしれません。

MetaPostの日本語版については

-[[W32TeX]]
-[[tlptexliveリポジトリ:http://tutimura.ath.cx/ptexlive/?tlptexlive%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA]]

から入手可能です.

**MetaPost とは [#e4617397]

MetaPost は John Hobby が作った [[METAFONT]] 類似のソフトで,
METAFONT が gf 形式のフォントを出力するのに対して,
MetaPost は PostScript(EPS)形式のファイルを出力します。

1995年から AT&T ライセンス不要のフリーソフトになりました。

詳しくは作者 Hobby 自身による
[[MetaPost:http://cm.bell-labs.com/who/hobby/MetaPost.html]]
ページをご覧ください。
web2c 配布にも MetaPost のマニュアルが入っています。

[[Asymptote]] という MetaPost を発展させたベクトルグラフィック記述言語もあります。

-[[FusionForge: MetaPost: Project Home:https://foundry.supelec.fr/projects/metapost/]] (本家)

***ChangeLog [#q9da79df]
-[[FusionForge: MetaPost: SCM Repository:https://foundry.supelec.fr/scm/viewvc.php/trunk/?root=metapost]]
--[[log:https://foundry.supelec.fr/scm/viewvc.php/trunk/?root=metapost&view=log]]

**MetaPostプログラミング入門 [#p3fbc416]

***簡単な線画の作成 [#t3a63dd6]

まず簡単なMetaPostプログラムを作ってみましょう。

 beginfig(1);
 u=100;
 draw (u,0)--(2u,u)--(u,2u)--(0,u);
 endfig;
 end.

これは単に4点を3本の線分で結ぶだけです。

このファイルをたとえば test.mp
という名前で保存して,

 mpost test

と打ち込むと,beginfig(1); から endfig;
までに描かれた内容が test.1 というEPSファイルに出力されます。
Ghostscript などで確認してみてください。

もしさらに beginfig(2);……endfig;
が同じ test.mp に書かれていれば,その中身は test.2
に出力されます。
要するに beginfig() は拡張子を決めるだけですが,
拡張子は数字(番号)しか使えません。

上の例は単なる折れ線でした。閉じた図形にするには,

 draw (u,0)--(2u,u)--(u,2u)--(0,u)--cycle;

とします。さらに,滑らかな線で結ぶには,

 draw (u,0)..(2u,u)..(u,2u)..(0,u)..cycle;

とします。もちろん

 draw (u,0)--(2u,u)--(u,2u)..(0,u)..cycle;

のような使い方もできます。

塗りつぶしや色指定もできます。たとえば

 fill (u,0)..(2u,u)..(u,2u)..(0,u)..cycle withcolor red;

としてみてください。

*** 図に文字を挿入する [#j8ce9e55]

文字を入れることもできます。たとえば

 prologues:=1;
 defaultfont := "rptmr";
 defaultscale := 1.5;
 beginfig(1);
 u=100;
 fill (u,0)..(2u,u)..(u,2u)..(0,u)..cycle withcolor red;
 label("Red Ball", (u,u));
 endfig;
 end.

のようにすれば,点 (u,u) を中心とする位置に Red Ball と書かれます。
このように文字を入れる場合は,
PostScript フォントを指定し,
最初に prologues:=1; としておけば,
独立のEPSとして使えます。
ただし,
defaultfont := "rptmr";
のような命令でデフォールトのフォント名を標準的な PS
フォントに指定しておく必要があります(rptmr
は Times-Roman の TeX での名前です)。
そうでなければ cmr10 になってしまい,一般のプリンタでは出力できません。

>しかし Ghostscript では次のようにして cmr10 などを出力することができます:
GS_LIB という環境変数を CM Type1 フォントのある場所
(たとえば /usr/share/texlive/texmf-dist/fonts/type1/bluesky/cm)
に設定しておき(あるいはここにある pfb ファイルを /usr/share/ghostscript/fonts
にコピーしておき),Ghostscript のディレクトリの Fontmap
ファイルにたとえば
 /CMR10                                  (cmr10.pfb)     ;
 /CMMI10                                 (cmmi10.pfb)    ;
 /CMR7                                   (cmr7.pfb)      ;
 /CMMI7                                  (cmmi7.pfb)     ;
 /CMEX10                                 (cmex10.pfb)    ;
などのように書いておきます。
別の手として,cmr10.pfb などを CMR10 という名前で /Resource/Font
ディレクトリにコピーしておいてもいいでしょう。

***作成した図をTeX文章に取り込む [#ee4db6cc]

TeX/LaTeX の文書の中に組み込んで使う場合は,
逆に prologues:=1; は指定しません。
この場合,たとえば

 \documentclass{jsarticle}
 \usepackage[dvips]{graphicx}
 \begin{document}
 ……
 \begin{center}
 \includegraphics{test.1}
 \end{center}
 ……
 \end{document}

のようにして組み込み,

 platex test

として処理して

 dvips test -o test.ps

と打ち込むと test.ps というPostScriptファイルができますので,
Ghostscriptで見るか,PostScriptプリンタに送ります。

ここで

 \documentclass{article}
 \usepackage[dvips]{graphicx}
 \pagestyle{empty}
 \begin{document}
 \includegraphics{test.1}
 \end{document}

のように図だけを含むTeXファイルから dvi を作り,

 dvips -E test -o test.eps

のようにdvipsの -E オプションを使えば,
本物のEPSファイルになり,
TeX以外のアプリケーションに取り込むこともできます。

***TeXの機能を使って図に挿入する文字を組版する [#o948ef03]

上のような方法ではカーニングやリガチャは入りませんし,
数式を含ませることもできません。
ちゃんと組まれた文や数式を含ませるには,次のように label
中に btex …… etex で囲んで入れます。

 verbatimtex
 \documentclass{article}
 \begin{document}
 etex;
 beginfig(1);
 u=100;
 fill (u,0)..(2u,u)..(u,2u)..(0,u)..cycle withcolor red;
 label(btex Area is $\pi r^2$ etex, (u,u));
 endfig;
 end.

このように TeX や LaTeX の文書が含まれている場合は,
TeX または LaTeX を起動するコマンドをあらかじめ環境変数 TEX
で指定しておく必要があります。
たとえば上の例で LaTeX を起動するコマンドが latex なら,
Bシェルの類なら export TEX=latex,
Cシェルなら setenv TEX latex
としてから mpost test と打ち込みます。

なお、比較的新しい TeX 環境では、makempx が利口になっており、

 verbatimtex
 %&latex
 \documentclass{article}
 \begin{document}
 etex;
 beginfig(1);
 u=100;
 fill (u,0)..(2u,u)..(u,2u)..(0,u)..cycle withcolor red;
 label(btex Area is $\pi r^2$ etex, (u,u));
 endfig;
 end.

と書いておくだけで、自動的に latex を使ってくれます。ただしその場合の TEX
変数は、latex.fmt に対するエンジンでなければいけません。(最近のものでは
pdftex)。

***PSfragの利用 [#gd4ef62a]

日本語版MetaPostが利用できない場合は,次のようにして PSfrag で日本語を使うことができます。
さきほどの例で(prologues:=1; を指定しておき)

 \documentclass{jsarticle}
 \usepackage[dvips]{graphicx,psfrag}
 \begin{document}
 ……
 \begin{center}
 \psfrag{Red Ball}{赤いボール}
 \includegraphics{test.1}
 \end{center}
 ……
 \end{document}

のようにすれば,Red Ballの文字列が「赤いボール」に置き換わります。
ただし,日本語としてセンタリングされるわけではありませんので,
一般に位置がずれます。

***その他の注意点 [#ddd5a5aa]

Unix 版(web2c 版)では曲線 ..
でつなぐ場合の最大長はデフォルトでは 2000 点です。

**例 [#nda680a6]

もうちょっと数学のテスト問題に使えそうな例をあげておきます。

 verbatimtex
 %&latex
 \documentclass{article}
 \begin{document}
 etex;
 beginfig(1);
 u=1cm;
 drawarrow (-.5u,0)--(4u,0);
 drawarrow (0,-.5u)--(0,2u);
 pickup pencircle scaled 1pt;
 draw (0,0){up}
 for i=1 upto 8: ..(i/2,sqrt(i/2))*u endfor;
 label.lrt(btex $\sqrt{x}$ etex, (3,sqrt(3))*u);
 label.rt(btex $x$ etex, (4,0)*u);
 label.top(btex $y$ etex, (0,2)*u);
 label.llft(btex O etex, (0,0));
 endfig;
 end.



もっとたくさんの例が
[[Metapost : exemples:http://www.math.jussieu.fr/~zoonek/LaTeX/Metapost/metapost.html]]
というページにあります。

**おまけ [#nec162e2]

MetaPost を併用して[[等高線を描くプログラム:http://oku.edu.mie-u.ac.jp/~okumura/texfaq/contour.html]]
を作ってみました。

**関連アプリケーション [#o3813278]

MetaPostで作成した図をLaTeX文書に取り込むようなとき、図のソースをLaTeX文書に埋め込んで図の生成と取り込みを自動化するパッケージ[[MePoTeX>http://homepage2.nifty.com/domae/metapost/mepotex.html]]というものもあります。

**最新バージョンで追加された機能のいくつか [#ze022f07]

0.970 (beta) 以降で追加された新機能のいくつかを述べます。

 (1) filenametemplate
 filenametemplate "%j-%3c.mps";
 beginfig(1);
 ... ...
 endfig;

のようにすると、出力ファイル名は $(jobname)-001.mps のようになります。
バージョン1.2以降では filenametemplate もまだ使用できるようですが
無くなるかもしれません。
 outputtemplate:="%j-%3c.mps";
のほうがよいでしょう。構文の違いに気をつけてください。

 (2) cmyk color model:
 beginfig(1);
 draw fullcircle
 withcmykcolor (1,0,0,0);
 endfig;

 (3) greyscale color model
 beginfig(1);
 faded := 0.5;
 draw fullcircle withgreyscale faded;
 endfig;

 注: withgrayscale なる綴りは使えないので注意すること。

 (4) 標準 eps:

独立した eps を出力する機能が強化されています。 prologues := 2;
でフォントマップファイルに従ってフォント定義を完全に行います。
prologues := 3; では dvips のように type1 フォントのサブセットを
ダウンロードします。たとえば上に出てきた例で

 prologues:=3;
 defaultscale := 1.5;
 beginfig(1);
 u=100;
 fill (u,0)..(2u,u)..(u,2u)..(0,u)..cycle withcolor red;
 label("Red Ball", (u,u));
 endfig;
 end.

としておくと、必要な cm フォントがダウンロードされるので、通常のプリンタ
で印刷できる eps ができます。

 (5) font map:

デフォルトマップファイルは mpost.map ですが、ソース中で設定
することもできます:

 fontmapfile "+foo.map";

とすると、重複を無視して foo.map の内容を追加します。
  
 fontmapfile "=foo.map";

とすると、重複を置き換えて foo.map を追加します。

 fontmapfile "-foo.map";
      
とすると、foo.map 内の記述とマッチするエントリを全て削除します。

ファイルではなくて、具体的記述によって指定する方法もあります:

 fontmapline "+foo bar <baz.pfb";

とすると、重複を無視して この内容を追加します。

 fontmapline "=foo bar <baz.pfb";

とすると、重複を置き換えてこの内容を追加します。

 fontmapline "-foo bar <baz.pfb";

とすると、この内容と一致するものを削除します。

なお、新しい MetaPost では pool ファイル は無くなっています。
(MetaPost だけでなくて、全ての TeX エンジン、METAFONT でも
pool ファイルは無くなっています。) 1.501 から mem ファイルも無くなりました。

// ↓「最近」という時期によって変化する書き方ではなく、変わったところを明示して
// 「バージョンいくつ以降」とか「何年何月以降」のように、絶対的な書き方にできませんでしょうか。
// 最新のバージョン番号を書いていただくのは、確かに嘘ではなくて重要なことではありますが、
// 例えば MetaPost 1.205 でも svg のサーポートしているわけで、そういう意味では、
// そいうところまで更新していただくと情報が欠落していっているように思います。
// 単純に(気づいた時点での)新しいバージョン番号だけにします。
現在の MetaPost のバージョンは 1.504 です。

**参考サイト [#sa284452]
-[[MetaPost:http://www.sat.t.u-tokyo.ac.jp/~hideyuki/metapost/]]([[鈴木秀幸さん:http://www.sat.t.u-tokyo.ac.jp/~hideyuki/index-j.html]]による日本語MetaPost)
-[[MetaPost 覚書:http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/metapost/mpost.html]](小栗栖さんによるリファレンスマニュアル)
-[[TeX&MetaPostであそぼう:http://homepage2.nifty.com/domae/]](みなもさんによるMePoTeX 配布など)
-[[Function Grapher:http://www.tlhiv.org/mpgraph/]] WEB application by MetaPost