見出し画像

TeXとMetaPostと初等幾何的な何か#3

「投げ銭」スタイルのコンテンツです。気に入ったら投げ銭どうぞ。

***

さて、では具体的なqbGraphというスタイルファイルをご覧ください。

% 例えば 点Pの座標を(x,y)としたいときに,点の名前Pを用いたマクロ\qbPtPをP(x,y)で定義(\def)する。
% つまり自動で\def\qbPtP{P(x,y)}を実行するわけである。凄い。これなら,配列は要らないなあ。
% 結局 A(3,4)に対して、名前\def\qbPtA{A} x座標\def\qbxofPtA{3} y座標\def\qbyofPtA{4}
% の3つのマクロを自動的に作成する仕様に。
%
\def\qbPointDef#1(#2,#3){\def\tmpDummyname{qbPt#1}\@namedef\tmpDummyname{#1} \def\tmpDummyname{qbxofPt#1}\@expandtwoargs\@namedef\tmpDummyname{#2}\def\tmpDummyname{qbyofPt#1}\@expandtwoargs\@namedef\tmpDummyname{#3}}

% \qbxofPointDef(A,\tmpx) で、Aのx座標を\tmpxに定義するというサブルーティンタイプのマクロにすることにしました。

\def\qbxofPointDef(#1,#2){\def\tmpDummyname{qbxofPt#1}\qbdef{\@nameuse\tmpDummyname}{#2}}
\def\qbyofPointDef(#1,#2){\def\tmpDummyname{qbyofPt#1}\qbdef{\@nameuse\tmpDummyname}{#2}}
\def\qbxyofPointDef(#1,#2,#3){\qbxofPointDef({#1},{#2})\qbyofPointDef({#1},{#3})}
\def\qbxyofTwoPointDef(#1,#2,#3,#4,#5,#6){\qbxyofPointDef({#1},#3,#4)\qbxyofPointDef({#2},#5,#6)}

\def\qbGpoint#1{\qbxyofPointDef(#1,\tmpSx,\tmpSy) \qbPpoint(\tmpSx,\tmpSy)}

\def\qbGline#1#2{\qbxyofTwoPointDef(#1,#2,\tmpSx,\tmpSy,\tmpTx,\tmpTy) \qbPline(\tmpSx,\tmpSy)(\tmpTx,\tmpTy)}

​さて、これを見てすんなり判りますか?既に僕もよく判らなくなっていることに改めて気がつきました。あかんやん。

気を取り直して、少しだけ解説?してみましょう。@namedefと@nameuseという二つのTeXの作業用マクロを使っています。@expandtwoargsもTeX特有の作業用マクロなんですが、今となってはその効用が何だったのかよく覚えていません。

ちょっと自分で見てクラクラしています。よくこんなもんが動いたなあと。

・・・

ではPicture環境版のstyleファイルの解説の方は潔く諦めましょう。気を取り直して、MetaPost版では同じ部分がどのように書いてあるかを見てみます。

\def\qbPointDef#1(#2,#3){\sendMP{z.#1=(#2*w,#2*h);}}

\def\qbGpoint#1{\sendMP{draw z.#1 withpen pencircle scaled 2.4pt;}}

\def\qbGline#1#2{\sendMP{draw z.#1--z.#2;}}

どうですか?こちらはとてもあっさりしています。TeXというシステムの中の拡張機能としてのpicture環境での作業とは異なり、MetaPostという別のシステムへ\sendMP{...}というMePoTeXのマクロで丸投げしているので。とてもあっさりしています。

MetaPostのデータの型は沢山あるのですが、そのうちの一つの平面座標の型を利用しています。多くのプログラム言語同様MetaPostでも変数を使う際はそれがどういう型の変数かを先に宣言する事になっているのですが、座標型については,z.Aのように接頭詞的に「z.」を付けると自動的に座標型と判断して貰えるのです。そこで宣言抜きにz.#1=(#2*w,#3*h)とすれば,点#1の座標を表す変数z.#1にMetaPostの描画座標での点#1の座標(#2*w,#3*h)が代入されるという事になります。ここでのwとhは描画座標の縦横の単位長として用意された数値です。

そうすると、点を書く場合はdraw z.#1;で二点を結ぶ線分はdraw z.#1--z.#2で書く事ができるようになるので、あっさりしたマクロ定義で済むという事になります。

さて、TeXの作業用マクロを見てクラクラしてきたので今日はここまで。



ここから先は

3字

¥ 100

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