奥義かどうかは判らないけれど(その5)
さて,1日2日サボりました。
#MetaPost の不思議だけど面白いところは実は #MetaFont 由来なところが多いのだなぁと再確認して,そうなると #MetaFont も解説せなあかんのかもと思いつつも #MetaFont に取り組んだことないしなぁと思うてモヤモヤしてましたが...。そんなわけで,何が素敵かがサクッと見える図を扉にしました。ちゃんと見えるように再掲しましょう。
ソースはこの下に置きますが,段組や数式やベクトルの太字表記で,#TeX のパッケージが増えて,図も見易いように #pen の太さを変えたり色付きにしたので #withcolor で描いたり,あと矢印がデフォルトだと気に食わないので #arrowhead を定義し直したりと少し煩雑なソースになっています。適当に読み飛ばしてください。そうそう #amsmath というアメリカ数学(AMS)のパッケージも入れてますね。
%!TEX TS-program = lualatex
¥documentclass[report,fleqn,a4paper]{ltjsbook}%
¥usepackage{amsmath}% ----------------------- AMSの数式楽ちんパッケージ
¥usepackage{bm}% ---------------------------- ベクトル用太字イタリック用
¥usepackage{luamplib}% ---------------------- メイン?なLuaでMetaPostなライブラリ
¥usepackage{multicol}% ---------------------- 段組用のパッケージ
¥everymplib{beginfig(1);}% ------------------ mplibcode環境でのお約束の「はじめ」と
¥everyendmplib{endfig;}% -------------------- mplibcode環境でのお約束の「おわり」
%
% ------------------------------------------- 格子を描くマクロ
¥def¥mpTemp(#1,#2)(#3,#4)[#5,#6][#7]{%
for i=#1 upto #3:draw ((i,#2)--(i,#4)) xscaled #5 yscaled #6 withcolor #7;endfor;
for i=#2 upto #4:draw ((#1,i)--(#3,i)) xscaled #5 yscaled #6 withcolor #7;endfor;
}% ------------------------------------------ mplibcode環境内で使うけどTeXのマクロ
% ------------------------------------------- MetaPostの矢印を好みに変えるマクロ
¥def¥mpGarrowChg{%
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 .7length q of q -- cycle) shifted e
enddef;
}% ------------------------------------------ mplibcode環境内で使うけどTeXのマクロ
%
¥begin{document}% --------------------------- ここからがドキュメントの本体
%
¥begin{multicols}{3}% ----------------------- 多段組(multicols)を始める。||||
~¥vspace{-2.4¥zh}% -------------------------- いきなり align だと改行?が入るので
% 垂直(Vertical)な空き(Space)を
% 日本語の高さの2.4倍戻して(-)ます。
¥begin{align}% ------------------------------ 数式を整えて書くAMSの環境のはじめ
¥left¥{¥ ¥begin{aligned}% ------------------- 数式環境内で数式環境を使うパターン
¥bm{a}+¥bm{b}+2¥bm{c}&=¥begin{pmatrix}3¥¥2¥end{pmatrix}% ¥bm{}が太字イタリック
¥nonumber¥¥% -------------------------------- pmatrix は行列用。今回は縦ベクトル
¥bm{a}-¥bm{b}-¥bm{c}&=¥begin{pmatrix}2¥¥-1¥end{pmatrix}% nonumber は式番号抜き
¥nonumber¥¥
¥bm{b}-¥bm{c}&=¥begin{pmatrix}2¥¥0¥end{pmatrix}
¥nonumber%¥¥% ------------------------------- ¥left¥{で左の中括弧。
¥end{aligned}¥right.% ----------------------- ¥right.は¥leftとセットで必要な...
¥end{align}% -------------------------------- 数式を整えて書くAMSの環境のはじめ
%
¥noindent% ---------------------------------- インデント抜きで
¥begin{mplibcode}% -------------------------- MetaPost 直書きcode「始める」
pair a,b,c;% ------------------------------ pair:2実数の組変数,平面の座標やベクトル
a+b+2c=(3,2);%
a-b-c=(2,-1);% ---------------------------- 連立方程式で3つのベクトルを定義してる!!
b+c=(0,2);%
¥mpTemp(-2,-2)(7,7)[3mm,3mm][0.5*(blue+0.5green)+0.5white]% 格子を描くマクロ
¥mpGarrowChg% ----------------------------- 矢印(drawaarowで使われる)変更マクロ
pickup pencircle scaled 1.2mm;% ----------- ペン先を円で半径は1.2mmで描く指定
draw (0,0) scaled 3mm withcolor 0.4white;% 原点を灰色で(描画座標のスケールは3mm)
draw a scaled 3mm withcolor 0.4white;% ---- aを灰色で
draw b scaled 3mm withcolor 0.4white;
draw c scaled 3mm withcolor 0.4white;
pickup pencircle scaled 0.4mm;% ----------- ペン先を円で半径は0.4mmで描く指定
drawarrow ((0,0)--a) scaled 3mm withcolor white;%+0.6red;% 矢線を白で抜く
drawarrow ((0,0)--b) scaled 3mm withcolor white;%+0.6green;
drawarrow ((0,0)--c) scaled 3mm withcolor white;%+0.6blue;
pickup pencircle scaled 0.2mm;
drawarrow ((0,0)--a) scaled 3mm withcolor 0.4white+0.6red;% 矢線を薄い赤で描く
drawarrow ((0,0)--b) scaled 3mm withcolor 0.4white+0.6green;
drawarrow ((0,0)--c) scaled 3mm withcolor 0.4white+0.6blue;
¥end{mplibcode}% ---------------------------- MetaPost 直書きcode「終わる」
¥hfill~¥par% -------------------------------- (horizonta)右に
¥end{multicols}% ---------------------------- 多段組(multicols)を終わる。||||
%
¥end{document}
大して解説する気がないので,ソースにコメントというか簡単な説明を流し入れておきました。判るような分からないような説明です。TeXではコメント?は % を打った後に続けます。行数を稼ぐ(省エネする?)為にコマンドの後に % ---------(対応が判るように「----」で繋いで)として書き加えてます。どう見ても五月蝿いので,気にしない方が良いかも。
注目は次の部分です。
pair a,b,c;% ------------------------------ pair:2実数の組変数,平面の座標やベクトル
a+b+2c=(3,2);%
a-b-c=(2,-1);% ---------------------------- 連立方程式で3つのベクトルを定義してる!!
b+c=(0,2);%
2実数の組変数(pair)であるa,b,cを謂わば「変数の宣言」をして用意して,次はその3つのベクトルが満たして欲しい(誰が欲しいのか)連立方程式を提示すれば(それが解けることは前提だと思うのですが...)a,b,cを勝手に #MetaPost が解いてくれて,具体的に使えるようになっているというところでしょう。
でこれって何が良いのか。なぜこんな実装にしたのか。そりゃまぁ図を描く為にはあれば便利だなぁという...その辺りを次は書けると良いなぁ。
この記事が気に入ったらサポートをしてみませんか?