- MetaPost on the Web(TUG内のページ)
- MetaPost -- A user's manual(マニュアル,PDF直リンク)
- metapost覚書(Wayback Machine にあるアーカイブ)
- TeX&MetaPostであそぼう(MePoTeX はここで。実践的なチュートリアル(pdf)もある)
- MetaPost for Beginners(PDF直リンク,Hartmut Henkel氏によるスライド)
- 図を作成してTEXのレポートの質を上げよう(PDF直リンク,芝浦工業大学数理科学研究会による解説)
- MetaPost Previewr(ブラウザ上で使える MetaPost のエディタ&プレビュア)
TeXShop で mp ファイルに MetaPost をかけるとき、
beginfig の引数を 0 にしておくと「デバッグモード」となり
生成される ps ファイルを自動的に pdf ファイルに変換してプレビューしてくれる。
便利!
※最近のバージョンでは、ソースファイルの中で定義されたすべての図を
ひとまとめにした pdf ファイルをプレビュー用に出力するようになっているようだ。
★参考にしたサイト:http://macwiki.sourceforge.jp/wiki/index.php/TeXSh...
TeXShop はユーザが指示しない限りデフォルトのタイプセッタでソースをタイプセットしようとする
(拡張子による種類の判別は行わないようだ)。
つまり MetaPost のファイルを処理するためには、その都度メニューからタイプセッタとして MetaPost を選択してやる必要がある。
しかしその代わりに、ソースファイルの先頭に
%!TEX TS-program = MetaPostと書いておくと自動的に MetaPost で処理してくれる、という機能がある。
TeXと同様、% で始まる行は MetaPost でもコメント扱いなので、
この一行は TeXShop 以外の環境でのタイプセットに際して害はない。
※最新のバージョンの TeXShop では engine ファイルが内容・ファイル名ともに変更されているので
%!TEX TS-program = nv-metapostとする。
TeXShop に同梱されている "metapost.engine" を個人的に改変したもの。
これは MetaPost ソースファイルをコンパイルするためのスクリプトで、
- 各 beginfig() 〜 endfig ごとに、別個の PDF ファイルを生成する
- さらに、生成した PDF ファイルから(sips コマンドを使って)PNG ファイルを生成する
自分用の安直な改変なので、上記の処理に際するこまかいエラーチェックなどはしていない。すみません。
リンク先のファイル置場 からファイル mpvariant.engine をダウンロードし、
~/Library/TeXShop/Engines あたりに保存しておく。
MetaPost のソースファイルの先頭付近に
%!TEX TS-program = mpvariantと書き込んでおくと、コンパイルに mpvariant.engine のスクリプトが使われる。
MetaPost では btex 〜 etex によって囲まれた文字列を TeX で処理してラベルに利用出来るが、
この際に使われるのはデフォルトでは Plain TeX であるので、若干不便がある。
これを LaTeX による処理に変更するためには、ファイルの冒頭に
verbatimtex %&latex \documentclass{article} \begin{document} etex;といったおまじないを書いておけばよい。
プリアンブル部分でマクロを定義しておき、btex 〜 etex 内で利用することも出来る。
html などにおけるのと同じように色を16進6桁のカラーコードで指定するマクロがあると便利かもしれない。
たとえば
これで色見本のカラーコードが簡単に利用出来る。
たとえば
def withhexcolor expr t := withcolor (hex(substring (0,2) of t),hex(substring (2,4) of t),hex(substring (4,6) of t))/255 enddef;のように定義しておく。
fill fullcircle scaled 100 withhexcolor "ffff00";のように使う(この場合はカラーコード ffff00 の円を塗りつぶす)。
これで色見本のカラーコードが簡単に利用出来る。
汎用性のあるマクロの定義を集めたファイル(それを仮に mymacros.mp としよう)を作って
/usr/local/texlive/2009/texmf-dist/metapost/misc あたりに設置することにする。
mktexlsr (sudo /usr/texbin/mktexlsr) をするのを忘れないように。
利用するときは、mp ファイルの冒頭で "input mymacros" と命令すれば良い。
/usr/local/texlive/2009/texmf-dist/metapost/misc あたりに設置することにする。
mktexlsr (sudo /usr/texbin/mktexlsr) をするのを忘れないように。
利用するときは、mp ファイルの冒頭で "input mymacros" と命令すれば良い。
drawarrow コマンドで描かれる矢印の矢尻を変更するには、arrowhead コマンドの定義を書き換えれば良い。
たとえば
上がデフォルトの矢尻、下が修正後の矢尻。
下から2行目に含まれる point .3length q of q の中の係数 .3 を変更することで
矢尻の底の部分の「切り込みの深さ」が変化する。
たとえば
vardef arrowhead expr p := save q,e; path q; pair e; e = point length p of p; q = p shifted -e cutbefore makepath(pencircle scaled 2ahlength); (q rotated .5ahangle & reverse q rotated -.5ahangle -- point .3length q of q -- cycle) shifted e enddef;とすれば、これ以降の drawarrow 命令による矢印の矢尻が次の画像で示すような変更を受ける。
上がデフォルトの矢尻、下が修正後の矢尻。
下から2行目に含まれる point .3length q of q の中の係数 .3 を変更することで
矢尻の底の部分の「切り込みの深さ」が変化する。
プリアンブルなどで次のように定義(の書き換え)をする。
newinternal ahfill; boolean ahfill; ahfill=true; vardef arrowhead expr p = save q,e; path q; pair e; e = point length p of p; q = gobble(p shifted -e cutafter makepath(pencircle scaled 2ahlength)) cuttings; (q rotated .5ahangle & reverse q rotated -.5ahangle if ahfill: -- cycle fi) shifted e enddef; def _finarr text t = draw _apth t; if ahfill: filldraw else:draw fi arrowhead _apth t enddef; def _findarr text t = draw _apth t; if ahfill: filldraw else:draw fi arrowhead _apth withpen currentpen t; if ahfill: filldraw else:draw fi arrowhead reverse _apth withpen currentpen t enddef;本文中で
ahfill := false;を宣言してから drawarrow を使うと、矢尻の部分を塗りつぶさず → のような矢印になる。
Windows版はバイナリも配布されているが、それ以外の場合はソースファイルからコンパイルする必要がある。
ダウンロードした pstoedit-3.50.tar.gz を展開し、そこに移動してから
(1) ./configure
(2) make
(3) sudo make install
でOK。
※ Homebrew からインストールするほうが楽。
ダウンロードした pstoedit-3.50.tar.gz を展開し、そこに移動してから
(1) ./configure
(2) make
(3) sudo make install
でOK。
※ Homebrew からインストールするほうが楽。
brew install pstoedit
ターミナルでたとえば
pstoedit -f mpost neko.ps cat.mpとすれば、neko.ps という PostScript ファイルから cat.mp という MetaPost ファイルを生成する。
Mathematica で
M[x_] := N[Round[Re[x], 2^(-16)], 7] MPcurve[f_, a_, b_, n_] := Module[{u = (b - a)/n, s = "(\n(", p, q, k}, s = StringJoin[ {s, ToString[M[a]], ",", ToString[M[f[a]]], ")\n"} ]; Do[ q = a + k u; p = q - u; s = StringJoin[ {s, ".. controls (", ToString[M[p + u/3]], ",", ToString[M[f[p] + u/3 f'[p]]], ") and (", ToString[M[q - u/3]], ",", ToString[M[f[q] - u/3 f'[q]]], ")\n"} ]; s = StringJoin[ {s, "..(", ToString[M[q]], ",", ToString[M[f[q]]], ")\n"} ], {k, 1, n} ]; StringJoin[{s, ") scaled 1;"}] ] ParametricMPcurve[x_, y_, a_, b_, n_] := Module[{u = (b - a)/n, s = "(\n", p, q, k}, Do[ q = a + k u; p = q - u; s = StringJoin[ {s, "(", ToString[M[x[p]]], ",", ToString[M[y[p]]], ")\n"} ]; s = StringJoin[ {s, ".. controls (", ToString[M[x[p] + u/3 x'[p]]], ",", ToString[M[y[p] + u/3 y'[p]]], ") and (", ToString[M[x[q] - u/3 x'[q]]], ",", ToString[M[y[q] - u/3 y'[q]]], ")\n.. " } ], {k, 1, n} ]; s = If[ {x[a], y[a]} == {x[b], y[b]}, StringJoin[{s, "cycle"}], StringJoin[ {s, "(", ToString[M[x[b]]], ",", ToString[M[y[b]]], ")"} ] ]; StringJoin[{s, "\n) scaled 1;"}] ]という関数を定義しておく.
前者は関数 f(x) の区間 [a,b] 上でのグラフを近似的に表すパスを生成する.
後者はパラメタ曲線 (x(t), y(t)), a<=t<=b を近似的に表すパスを生成する.
(始点と終点が一致する場合には cycle を返す)
最後の引数 n は区間の分割数.大きいほど正確になる.
※以下の点を変更した:
・変数 k を局所化し忘れていたので,k を局所変数リストに加えた.
・数値を MetaPost 精度に丸める関数 M を定義して MPcurve などに組み込んだ.
たとえば
f[x_] := x^2 Exp[-x] MPcurve[f, -1, 4, 6]を実行すると
( (-1.,2.71828) .. controls (-0.722222,0.453047) and (-0.444444,0.151316) ..(-0.166667,0.0328156) .. controls (0.111111,-0.0856851) and (0.388889,0.101416) ..(0.666667,0.228185) .. controls (0.944444,0.354955) and (1.22222,0.455557) ..(1.5,0.502043) .. controls (1.77778,0.548528) and (2.05556,0.548909) ..(2.33333,0.527958) .. controls (2.61111,0.507008) and (2.88889,0.465859) ..(3.16667,0.422609) .. controls (3.44444,0.37936) and (3.72222,0.333752) ..(4.,0.29305) ) scaled 1;というパスが出力される.
またたとえば
x[t_] := Cos[3 t] y[t_] := Sin[2 t] ParametricMPcurve[x, y, 0, 2 Pi, 8]を実行すると
( (1.,0.) .. controls (1.,0.523599) and (-0.151746,1.) .. (-0.707107,1.) .. controls (-1.26247,1.) and (-0.785398,0.523599) .. (0.,0.) .. controls (0.785398,-0.523599) and (1.26247,-1.) .. (0.707107,-1.) .. controls (0.151746,-1.) and (-1.,-0.523599) .. (-1.,0.) .. controls (-1.,0.523599) and (0.151746,1.) .. (0.707107,1.) .. controls (1.26247,1.) and (0.785398,0.523599) .. (0.,0.) .. controls (-0.785398,-0.523599) and (-1.26247,-1.) .. (-0.707107,-1.) .. controls (-0.151746,-1.) and (1.,-0.523599) .. cycle ) scaled 1;というパスが出力される.
これらを「形式を選択してコピー>テキスト」によってコピーして,
MetaPost のソースファイルに貼り付けて利用する.
ベジエ曲線は3次のパラメタ曲線なので3次以下の関数のグラフは厳密に表現できる.
以下は区間 [p,q] 上の関数 ax^3+bx^2+cx+d のグラフを表すパスを返すマクロである.
vardef cubic(expr a,b,c,d)(expr p,q) := save f; vardef f(expr x,y) := (1/3[x,y], a*x*x*y+b*x*2/3[x,y]+c*1/3[x,y]+d) enddef; f(p,p) .. controls f(p,q) and f(q,p) .. f(q,q) enddef;
sin(pi*x) の区間 [0,2] 上のグラフを表すパス定数.パスの長さは 8.
制御点は「差のL^2ノルムが最小となる」ように選んである.
そこそこ良い近似になっていると思う.
path sinecurve; sinecurve = (0,0) .. controls (1/12,0.261825) and (1/6,0.523288) .. (1/4,1/sqrt(2)) .. controls (1/3,0.892866) and (5/12,1.00187) .. (1/2,1) .. controls (7/12,1.00187) and (2/3,0.892866) .. (3/4,1/sqrt(2)) .. controls (5/6,0.523288) and (11/12,0.261825) .. (1,0) .. controls (13/12,-0.261825) and (7/6,-0.523288) .. (5/4,-1/sqrt(2)) .. controls (4/3,-0.892866) and (17/12,-1.00187) .. (3/2,-1) .. controls (19/12,-1.00187) and (5/3,-0.892866) .. (7/4,-1/sqrt(2)) .. controls (11/6,-0.523288) and (23/12,-0.261825) .. (2,0);
斜線で閉じたパスを塗りつぶすための sfill, sfilldraw という二つの汎用マクロを定義する。
使い方は fill, filldraw に準じる。
vardef _Stripe(expr p,u,a) = image( save d,i,n; d = .5arclength(ulcorner p--lrcorner p); n = ceiling(d/u); for i=-n upto n: draw ((-d,i*u)--(d,i*u)) rotated a shifted center p; endfor clip currentpicture to p; ) enddef; def StripeOptions(text t)(text u) = def StripeParameters = t enddef; def StripeDrawOptions = u enddef; enddef; def sfill expr p = addto currentpicture also _Stripe(p,StripeParameters) StripeDrawOptions _op_ enddef; def sfilldraw expr p = addto currentpicture also image(sfill p; draw p;) enddef; StripeOptions(3,45)(withpen pencircle scaled .2);
最新コメント
2013-11-20
2013-11-15