2007年10月07日(日曜日)

メタポスト・プレビュー用のシェルスクリプト [ MetaPost, UNIX, プログラミング ]

前回は tsch で叩き台を作ったが、これからはbashでスクリプトを書くことにした。基本的に、TeXShopから呼び出す使い方がほとんどなので、それを想定して作成。Pathは通っているので省略し、エラー処理ではないが、ちょっとだけ if ... then ... else ... fi 構文を使ってみた。if文はCに似ているが、if (条件式) ではなく、if (条件文) であることに注意! 条件文を実行したステータスで判断するらしい。[.....] で括った部分は条件式に見えるが、実は testコマンドで実行させた結果を返しているということらしいのである。

苦労(?)したのは、ファイル名から拡張子を取り除くとか言った、文字列処理の部分。こういう所は、言語によって書き方が様々。bashの場合は、${string%hoge} と書けば、後方から最短マッチで$stringからhogeの部分を除去する。あ!しまった。この書き方じゃまずいことに、たった今気付いた。これでは、ファイル名の途中に「.mp」が含まれていると、そこを除去してしまう。まあ、そんなファイル名(sample.mpost とか)は使わないだろうが、それでもバグには違いない。末尾の「.mp」に限って除去するにはどうすれば良いのだろうか。

#!/bin/bash
#
# 使い方(Usage)
# mp2pdf foo.mp
#
# 0) 拡張子が mp でなければ何もせずに終了する。
# 1) 拡張子が mp のときは、jmpost を起動する。
#    jmpost により foo.1, foo.2, etc. の画像(PostScript file)が作られる。
# 2) foo.0 が存在すれば、それをプレビューするために、
#    foo.ps に複製し、ps2pdfにより、foo.pdf を作る。

# 必要ならば、パスを通す。
# ファイル名の設定 # infile=foo.mp のとき、basename=foo, fig_zero=foo.0, fig_ps=foo.ps # infile="$1" basename=${infile%.mp} # infile の末尾に .mp があれば、それを除去した文字列になる(バグあり) fig_zero="$basename.0" fig_ps="$basename.ps" fig_pdf="$basename.pdf"
if [ $basename = $infile ] ## 一致するのは、ファイル名が .mp で終わらないとき then echo "拡張子が mp ではありません" exit fi
echo "MetaPost(日本語版) を起動します" jmpost $infile if [ -f $fig_zero ]; then ## foo.0 が存在する場合 echo "$fig_zero からプレビュー画像 $fig_pdf を作成します" cp $fig_zero $fig_ps pstopdf $fig_ps else echo "プレビュー画像はありません" fi

投稿者 sukarabe : 12:35 | この記事の固定URI | コメント (5) | トラックバック (0)

2007年09月30日(日曜日)

MetaPost難民、とりあえずの避難所 [ MetaPost, プログラミング ]

こういう時、普段からUNIXでEmacs生活をしていれば、こんな苦労はないだろうに、と思う。まあ、しかし、似非UNIX環境のMac OS Xではあるが、なんとかはなるようだった。

調べたところ、TeXShop (エディター付きの統合環境) から種々のUNIXコマンドやApple Scriptが実行できるようになっていた。メニューのマクロというところに、Claus Gerhardtさん作成のApplescriptがあり、これを参考にすれば、自分に必要なバッチ処理ができると思う。別な方法として、タイプセット(コンパイル)エンジンを追加するということもできるようだ。ヘルプファイルを読んで行くと、例として XeTeXとXeLaTeX (これらはTeXをマルチリンガル対応に拡張したもので、例えば日本語とアラビア語を混在させることが可能らしい・・・)という組版プログラムをTeXShopから使うための方法が書いてある。~/Library/TeXShop/Engines というディレクトリーに .engine という拡張子をもつ実行可能なファイルがあれば、それがタイプセットメニューに表示され、TeXShopから実行できる。実行可能なファイルって、要するにUNIXのシェル・スクリプト(あるいはPerlとかでも)で良いわけだ。shellのプログラムとか書いたことないから、皆目見当つかないのだが、見よう見まねで叩き台を作ってみた。

#!/bin/tcsh
set path= ($path /usr/local/teTeX/bin/powerpc-apple-darwin-current /usr/local/bin)
jmpost "$1"
cp "$1:r".0 "$1:r"
pstopdf "$1:r"

見本がtcshを使っていたし、うちは何故かbashじゃなくてtcshがデフォルトになっているので、そのままにしたが、調べたら、bashとcsh系ではいろいろ違うみたいだなあ。Pathは通っているので、書かなくても良いと思ったが、とりあえずサンプルからコピー。これを呼び出すときには、foo.mp というメタポスト・プログラムを書いているので、そのファイル名が渡される。それが $1 という変数になる。つまり、$1 = foo.mp ということね。これを日本語化したMetaPostで処理するために、jmpost を起動させる。出力として、foo.1, foo.2, ... などと画像ファイルが出来上がる。拡張子がないが、ポストスクリプトファイル。TeXShop での流儀に合わせて、番号0の画像をデバッグ用として表示させる。この為には、foo.0というPSファイルをfoo.pdfに変換する必要がある。$1 が foo.mp のとき、拡張子を取り去った foo という文字列を取り出すには、tcshでは "$1:r" とすれば良いらしい。こういうのを全然知らないから苦労するんだよなあ、初心者は。すると、foo.0 は "$1:r".0 となるから、これをfooという名前で複製してから、pstopdf でPSからPDFに変換する。結果として、画像番号0 のファイルが foo.pdf になる。このファイルがあると、TeXShopは自動的にこれを開くようだった。あとは、このスクリプトを jMetaPost.engine という名前で保存し、chmod 755 とかで実行可能にして、作業終了。

今日は、初めてのShell スクリプトということもあり、エラー処理とかは全然出来てないが、それは後日に。

投稿者 sukarabe : 02:50 | この記事の固定URI | コメント (2) | トラックバック (0)

2007年09月29日(土曜日)

メタポスト難民 [ MetaPost ]

お絵かきプログラム言語 MetaPost の学習中であるが、まだ決定版の環境がなく、困っている。最初は MePoTeX というTeXからMetaPostを呼び出すマクロを利用していた。これはこれで便利だが、MePoTeX特有のマクロとかに慣れてしまうことは、純粋なMetaPostの学習にはマイナスな面がある。ということで、MetaPostを直接起動させたいのだが、どのエディターを使ったものか。こういう時、UNIXならEmacsに決まっているのだが・・・。TeXの編集に使っているTeXShopという統合環境型エディターでMetaPostも使えることが分かったが、やってみると、コンパイルエラーのたびに変なテンポラリーファイルに変わってしまうという良く分からない事態になり、使用中止。mi(ミミカキエディター)のMetaPostモードは、コンパイルさせようとすると、Apple Script がエラーを吐く。orz... どうなっているんだ?

ということで、やむを得ずコンパイルはターミナルから行うことにした。昔は当たり前にやっていたことだが、久し振りだとめんどくさいなあ。ああ、もうコマンドラインには戻れないのかあ。おまけに、ディレクトリーの名前に日本語を使っていると、??????????と表示されてしまう。orz...

要は昔に戻れば良いわけだ。自分のホームの直下に Documents があるので、その下に mp フォルダーを作り、練習用のファイルは samples フォルダーにまとめることにした。ファイル名も日本語を使わずに、短めに。

投稿者 sukarabe : 14:35 | この記事の固定URI | コメント (4) | トラックバック (0)

2007年09月22日(土曜日)

メタポストでお絵かき [ MetaPost ]

もう20年ぐらい前にちょっとだけかじったことのあるMetaFontだが,その変種であるMetaPostの勉強を始めようかと思う。これはPostScriptの画像を作成するプログラムなのだが,イラストレータなどと違って,座標などを計算して表示するのが特徴。連立方程式を解くシステムが組み込まれているようで,関係式を列挙するだけで,点の座標を自動的に計算してくれる。これは便利だ。要するに「PostScriptお絵かき専用のプログラム言語」なのである。Donald KnuthがTeXで使うためのタイプフェース(活字)を作成するために作ったプログラムがMetaFontなのだが,弟子のJohn Hobbyが出力がPostScriptになるように修正を加えたお絵かきソフトがMetaPostというわけだった。

まだまだマクロとか使いこなせていないが,繰り返し処理ぐらいはできるようになった。メモとして日記に記録しておこう。TeXと違って,日本語の情報ならびに入門書の類が少ないのがつらいところ。

テオドロスと無理数

三辺が1, 1, ルート2の直角三角形から始めて,高さが1の直角三角形を次々に作っていったものが,この図。斜辺の長さは順にルート2,ルート3,等となる。ルート17まで描いてあるが,もう一つ三角形を描くと最初の三角形と重なってしまう。テオドロスはそれでルート17で止めたということだった。不思議なのは,これがルートnが無理数であることと関係ありそうななさそうな話なのである。テオドロスはルートnが無理数であることを順に証明して行って,ルート17で止めたという話なのである。何故にルート17で止めたのか,それがこの図と関係あるとかないとか。うーん,良く分からないなあ。

いずれにしても,由緒ある(?)図なのである。プログラムは以下の通り。工夫のかけらもないコードでちょっと恥ずかしいが。

u:=2cm; uu:=3mm;
pair za[],zb[],zc[];
z0=(0,0); z1=(u,0);
for i=1 step 1 until 16:
 z[i+1]-z[i] = u*(unitvector z[i] rotated 90);
 za[i]-z[i] = -uu*(unitvector z[i]);
 zb[i]-z[i] = uu*(unitvector z[i] rotated 90);
 zc[i]-za[i]=zb[i]-z[i];
 draw z[0]--z[i]--z[i+1] withpen pencircle scaled 1bp;
 draw za[i]--zc[i]--zb[i];
endfor
draw z0--z17 withpen pencircle scaled 1bp;

投稿者 sukarabe : 06:58 | この記事の固定URI | コメント (0) | トラックバック (0)