見出し画像

奥義かどうかは判らないけれど(その2)

#MetaPost は元々 #TeX の為なフォントを記述する為の言語である #MetaFont の様式を元にした #PostScript 形式の画像を容易に設定し実体化して画像を作成する言語。例えば次のソースとその結果。

%!TEX TS-program = lualatex
¥documentclass[report,fleqn,a4paper]{ltjsbook}%
¥usepackage{luamplib}%
¥begin{document}%
¥noindent¥hfill
¥begin{mplibcode}
beginfig(1);
for i=-2 upto 7:draw ((i,-2)--(i,7)) scaled 3mm withcolor 0.5*(blue+0.5green)+0.5white;endfor;
for i=-2 upto 7:draw ((-2,i)--(7,i)) scaled 3mm withcolor 0.5*(blue+0.5green)+0.5white;endfor;
z.O=(0,0);z.A=(2,3);z.B=(3,1);
draw (z.O--z.A) scaled 3mm;
draw (z.O) scaled 3mm withpen pencircle scaled 1mm;
draw (z.A) scaled 3mm withpen pencircle scaled 1mm;
draw (z.B) scaled 3mm withpen pencircle scaled 1mm;
endfig;
¥end{mplibcode}
¥hfill
%
¥def¥tmpPoint #1{draw (z.#1) scaled 3mm withpen pencircle scaled 1mm;}
¥def¥tmpPoints #1#2.{¥tmpPoint #1¥ifx#2¥empty¥else¥tmpPoints #2.¥fi}
¥def¥tmpLattice(#1,#2)(#3,#4)[#5]{%
for i=#1 upto #3:draw ((i,#2)--(i,#4)) scaled #5 withcolor 0.5*(blue+0.5green)+0.5white;endfor;
for i=#2 upto #4:draw ((#1,i)--(#3,i)) scaled #5 withcolor 0.5*(blue+0.5green)+0.5white;endfor;
}%
%
¥begin{mplibcode}
beginfig(1);
¥tmpLattice(-2,-2)(7,7)[3mm]
z.O=(0,0);z.A=(2,3);z.B=(3,1);
z.A-z.O=z.C-z.B;
draw (z.O--z.A) scaled 3mm;draw (z.C--z.B) scaled 3mm;
¥tmpPoints OABC.
endfig;
¥end{mplibcode}
¥hfill~
%
¥begin{mplibcode}
beginfig(1);
¥tmpLattice(-2,-2)(7,7)[3mm]
z.O=(0,0);z.A=(2,3);z.B=(3,1);
numeric k,l;
z.D=k*2(z.A-z.O)=2z.B+l*(z.A-3z.B);
draw (z.O--z.A) scaled 3mm;draw (z.D--z.B) scaled 3mm;
¥tmpPoints OABD.
endfig;
¥end{mplibcode}
¥hfill~
%
¥end{document}%

 図が3つあります。それぞれbeginfig(1);<MetaPostコード>endfig;の形で書いてあります。それらの前に書かれた ¥noindent¥hfill は #TeX の命令で,インデント(字下げ)無しにしてという¥noindent と水平方向(horizontal)に適当に空間を埋めて(fill)という¥hfillが書き込まれてます。そういうわけで,3つの図の左と間と右端に適当に均等な空間が空いているわけです。

 今回は薄青白い格子とそこに幾つかの点と線が黒で描かれています。これらの点は座標で与えられるのですが,z.O=(0,0);z.A=(2,3);z.B=(3,1);が其れに当たる箇所です。見ればわかるとは思いますが,z.何某 と書くと自動的にx座標とy座標を持つ点オブジェクトとなります。x,yに対して複素数のz=x+yiという感じです。実際複素数のような計算もできます...がその話はまた別稿で紹介します。今回はそれよりも次の2つ目の図のコードにある

z.A-z.O=z.C-z.B;

です。えっ?ってなりませんか。z.Cって何って。

 z.O,z.A,z.Bはそれぞれ具体的に与えられていますが,z.Cにはそれはない。その代わり上の式がある。これでz.Cが決まるわけです。ベクトルの平行移動というか,座標の方程式というか,そういう感じです。

 素敵な事にこのような等式(方程式?)を書く事で,MetaPostがその等式を満たすような未定義な点の座標や変数の値を決めてくれる。謂わば「方程式を解いてくれる」という仕様です。ベクトルでいうとOAとBCが同じになるように点Cを決めて図ではOAとBCを描いています。

draw (z.O--z.A) scaled 3mm;

がその描くところですが,見ての通りです。scaled は座標を図にする際に基本的な長さを指定するという話です。省くととても細かい事になります。

 3つ目の図では方程式が次のようになっています。

numeric k,l;
z.D=k*(z.A-z.O)=2z.B+l*(z.A-3z.B);

解読できるでしょうか。Dという点は,OAをk倍した座標であり,Bの2倍にAから3Bを引いたベクトル(Bの3倍の位置からAに向かう方向)のl倍を加えたものでもある,そんな点。つまり,直線OAとBの2倍の点を通りBの3倍の位置からAに向かう方向の直線の交点をDとしているというわけです。図を見て確認して見てください。

 つまりこのような仕様にする事で,作図で新しい点を交点で与えるような指定が容易に実現できるようになっているというわけです。

 折角なので上で表示したLuaLaTeXのソースというか文書というかコードというかTeXファイルを置きましょう。ついでにそのTypeOutでできるpdfも。


この記事が気に入ったらサポートをしてみませんか?