ウィキと言うものを使ってみようということで、まずは作るだけ作ってみるのです。



MetaPost関連のリンク集

Tips on TeXShop

デバッグモード(古いバージョン用の情報)


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
とする。

mpvariant.engine


TeXShop に同梱されている "metapost.engine" を個人的に改変したもの。
これは MetaPost ソースファイルをコンパイルするためのスクリプトで、
  • 各 beginfig() 〜 endfig ごとに、別個の PDF ファイルを生成する
  • さらに、生成した PDF ファイルから(sips コマンドを使って)PNG ファイルを生成する
ためのもの。
自分用の安直な改変なので、上記の処理に際するこまかいエラーチェックなどはしていない。すみません。
使い方

リンク先のファイル置場 からファイル mpvariant.engine をダウンロードし、
~/Library/TeXShop/Engines あたりに保存しておく。
MetaPost のソースファイルの先頭付近に
%!TEX TS-program = mpvariant
と書き込んでおくと、コンパイルに mpvariant.engine のスクリプトが使われる。

MetaPost tips

LaTeXを利用する


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" と命令すれば良い。

矢尻の変更

drawarrow コマンドで描かれる矢印の矢尻を変更するには、arrowhead コマンドの定義を書き換えれば良い。
たとえば
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 を変更することで
矢尻の底の部分の「切り込みの深さ」が変化する。

矢尻の変更2


プリアンブルなどで次のように定義(の書き換え)をする。
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 を使うと、矢尻の部分を塗りつぶさず → のような矢印になる。

pstoedit

これは何?

PostScript ファイルを色々な画像フォーマットに変更することが出来るソフトウェア。
MetaPost 形式への変換も出来る!
pstoedit のページ

インストール

Windows版はバイナリも配布されているが、それ以外の場合はソースファイルからコンパイルする必要がある。
ダウンロードした 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の利用)


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 のソースファイルに貼り付けて利用する.

MetaPostマクロ

3次関数のグラフ


ベジエ曲線は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);

Wiki内検索

Menu

ここは自由に編集できるエリアです。

メンバーのみ編集できます