Emacs.appでAsymptoteを使う

[ 備忘録 ] UNIXやGNU/LINUX上と違って、Mac OS X上で、しかも、独立アプリケーションになっている Carbon版Emacs.appでAsymptoteを使うためのメモ。

どの版のEmacsでもEmacs lispを読み込むことは同じ。Carbon版Emacs.appでは、アプリケーション本体(実は実行可能なディレクトリーなのだが)に様々なemacs lispを内包している。Emacs.appを右クリックして「内容を表示する」というのを選ぶと、ディレクトリーが開かれる。Emacs.app/Contents/Resources/ 以下にemacs lispがたくさん入っている。

Emacs.app/Contents/Resources/site-lisp/ 以下に asymptoteというディレクトリーを作り、そこに、/usr/local/share/asymptote/ (標準的なインストールの場合) 以下にある asy-mode.el と asy-keywords.el をコピーする。このフォルダーにはもう一つ asy-init.el というemacs lisp プログラムがあるのだが、それは、Emacs.app/Contents/Resources/site-lisp/site-start.d というディレクトリーにコピーする。これで、拡張子がasyのファイルを開くと、asymptoteのキーワードが色分けされて、見やすい。コンパイルもメニューから(メニューじゃなくても)実行できるのだが、何故かエラーが表示されてしまった。latexとdvipsの場所を明示的に指定しないとダメらしく、コンフィグレーションファイルである ~/.asy/config.asy に texpath=”latexが入っているフォルダーのパス”; と dvips=”こちらはdvips本体へのパス”; を書き込むように促される。パスは通っているし、TeXShopからは別段こんなことしないてもいいのになあと不思議ではあるが、ともかく指定した。これで、無事にコンパイル&プレビューできるようになった。

ということで、きちんと設定さえできれば Emacs はとても使いやすいのである。当然ではあるが。今のところ TeXShop では asymptoteのキーワード色分けが出来ないので、Emacsにしようかなあ。それにしてもTeXShopは便利さが中途半端だ。ファイルの拡張子に合せて、コンパイル・エンジンを自動で振り分けるくらいのことが出来ないんだからねえ。

Asymptoteの3D PDFをAdobe以外で表示する方法

Asymptoteの3DパッケージはPDFで出力するとAdobe Readerでは回転させたり,いろいろできる。これはPRCという3D拡張の為だが,Adobe以外でサポートしているものを知らない。Mac OS X標準のPreview.appでも表示できない。

結論から言うと,Asymptoteでコンパイルするときに,render=n (数値) というオプションを付けると良い。これで,1bp (big point = 1/72 inch) 当たり n ピクセルの解像度の画像が付く。それから,理由は不明だが,movie15.sty というLaTeXパッケージを入れとかないと3Dのコンパイル自体ができないので,ダウンロードしておく。LaTeXで使うってことはラベルの生成に使うのだと思う。

今のところ,render=10 (720dpi相当) であれこれコンパイルしているが,なかなかグッド。複雑な3Dだとコンパイルに少し時間が掛かる(MacBook Proで5秒ぐらい)が,まあ仕方ないか。

Asymptote 3DのPDFはPreview.appで表示されない

Asymptoteで3次元の絵を描く練習中。サンプルを参考にあれこれ試みているのだが,PDFで出力させると,Mac OS Xのプレビュー.appでは表示不能であることが多い。生成されたPDFをEmacsで開いて中身を見ると,Javascriptに似たプログラムコードが埋め込まれている。PDFはPostScriptのサブセットだが,こういうプログラムも許されているのかと,ちょっと驚いた。これが為にプレビューでは表示できないのであろうか。ちなみに,出力をJPEGにすれば,次のような画像になるので,コンパイル自体は問題なく行われているのだ。

Asymptote 3D sample

プレビューがサポートしているような,もっと低レベルのPDFコマンドを生成してくれればなあと思うが,こういう時は,普段まったく使わない Adobe Reader の出番だ。さすが純正,きちんと表示される。Adobe Readerと言えば重たくて不評の代表格なのだが,きちんとフルセットのPDFをサポートしているからこそと思えば,多少の重たさは仕方がないのかも知れない。

しかし,こういう状況だと,Asymptoteを使ってPDFをTeXに埋め込むことに,若干の危険性を感じる。Adobe Readerを使えばよいのだが,そうでないと,画像の部分が真っ白になってしまうのだから。

TeXShopでAsymptoteを使う方法

TeXShopをAsymptote用の統合環境として使うことが出来るようだ。TeXShopだけで、AsymptoteをコンパイルしてTeXに取り込めば、シームレスな作業が出来て便利ではある。参考にしたのは、次のページ。

Asymptoteに関する覚え書き – パイ生地みたいにふくらんで。 – livedoor Wiki(ウィキ)

まずは、ターミナル(シェル)で次のように入力する。

  defaults write TeXShop OtherTeXExtensions -array-add "asy" 

次に、~/Library/TeXShop/Engines/Asymptote.engines というファイルを作り、中身を次のようにする。(中身は各々の環境によって変わると思う。)

#!/bin/tcsh

# パスの設定。必要に応じて。
# set path= ($path /usr/texbin /usr/local/bin)
set asy_source = $argv[1]:r
asy $asy_source.asy

ワタシの場合、asy がPDFを出力するように、~/.asy/config.asyに書き込んでいるから、このようにしているが、上記サイトの設定では、epsf を pdf に変換する処理を行っている。まあ、このあたりはそれぞれの環境に応じて適当に。

最後に、このファイルの属性を実行可能に変更する。以上で、TeXShopをasymptoteの統合環境として使うことが出来る。

asymptoteで描いた図版をTeXに取り込む

昨日ちょっと頑張って幾つか図版を描き、ようやくAsymptote (MetaPost後継の図版作成用プログラム言語) に慣れてきた。まだ、Shellから asy hogehoge.asy と入力しているのだが、図版が多くなると少々面倒。LaTeXに取り込むための asylatex というのもあるようだが、自家用には次の述べるようなものでも実用的だと思うので、メモ。

方法は簡単で、TeXの \write18 を使う。これは、引数をシェルに渡して実行させる。だから、それが可能なように –shell-escape オプションを付けてTeXを起動しなくてはならない。自分で作成した文書の場合は危険性はないからね。

画像を挿入する箇所の前に、
\write18{asy hogehoge.asy}
と書いておけば、シェルが起動されて hogehoge.pdf が出来る。これを取り込めばよい。

%\write18{asy hogehoge.asy}
\includegraphics{hogehoge.pdf}

と書いておいて、1行目は図版作成のときだけコメントをはずし、図版完成の後はコメントアウトしておけば、無駄に asy が起動されなくて効率がよい。

Mac OS X 10.6 に Asymptote をインストールする

やっと成功したので、備忘録として記録。

まずは何はなくとも、Asymptoteの本家サイトからソースコードをダウンロードする。現時点での最新バージョンは1.88、したがって、asymptote-1.88.src.tgz というファイルになる。約1.5MBほど。これを適当な場所で解凍する。ターミナルからだと、tar zxvf asymptote-1.88.src.tgz などとするのだが、ファインダーからダブルクリックしてもOK. asymptote-1.88 というフォルダーが出来る。

次に、本家サイトの左側フレームにある Documentation をクリックすると、右側フレームに説明書の目次が現れるので、セクション2.6 Compiling from UNIX source の項をクリックして説明を読む。Boehm garbage collector のソースをダウンロードするように指示されているので、そこのリンク(ファイルへの直リンクですね、これは)をクリックして、gc-7.1.tar.gz をダウンロードして、asymptote-1.88フォルダーに入れる。

コンパイルの際、latexを使ってマニュアルのPDFなども作成するようなので、TeXシステムも事前にインストールしておく。というか、asymptoteをインストールしようと思う人なら、TeXは普通入っていますよね。もっとも、texinfo形式だったりするので、texinfoが組版できないとエラーを吐くかも。マニュアルは別途ダウンロードできるから、それでも大丈夫かな。ああ、そうだ、開発環境が入っているのが大前提。XCodeが入ってなければ、最新のものを入れておく。

さて、LINUXなどでは以上で準備完了だが、Mac OS X の場合、readline ライブラリーを別途用意する必要がある。GNU readline の最新版をダウンロードして、解凍し、そのフォルダーの中で、./configure して、makeして、sudo make install する。そうすると、/usr/local/lib/ 以下に readline がインストールされる。

Mac OS 10.6 Snow Leopard の場合は、更にもうひと手間必要。ここ のやりとりをざっと読む。英語だけど。先にダウンロードしたガーベージ・コレクター gc-7.1 が Snow Leopard では上手くコンパイルできないらしい。原因はSnow Leopard側のようだが、応急処置として、gc-7.1 にパッチを当てる。gc-7.1.tar.gz を解凍して、ucontext.h をインクルードしているファイルを探す。ターミナルでこの階層に入り、grep -n ucontext.h *.c とすると分かるが、mach_dep.cの163行目と、os_dep.cの2755行目の2カ所ある。2カ所のucontext.hを sys/ucontext.h と変更する。単にコメントアウトしても良いらしい。変更したファイルを保存して、元のように圧縮する。念のため、元々のファイルを gc-7.1-original.tar.gz などと名前を変えて、変更したファイルが入っているgc-7.1 というフォルダーをgc-7.1.tar.gz という名前で圧縮する。ターミナルから、tar -zcf gc-7.1.tar.gz gc-7.1/ とすればよい。

以上でやっと準備完了。asymptote-1.88フォルダーにおいて、まずは、./configure LDFLAGS=-L/usr/local/lib/ とする。これで、先にインストールしたGNU readline ライブラリーが読み込まれるはず。続いて、make として、エラーが無いことを祈りながら待つ(笑)。いやあ、何度エラー出したことか。その度に make distclean して最初からやり直したもんね。エラーが無ければ、sudo make install でインストールされる。

Asymptoteの練習 No.0002 「2直線の交点」

お絵描きソフト Asymptote の練習、2回目。毎回テーマを決めて、比較的シンプルな例題で練習していこうと思う。今回は、線分を引くことと、2直線の交点を求めること。ところで、AsymptoteはMetaPostから whatever という便利な変数を引き継がなかったらしい。理由は分からないが。したがって、暗黙裡に連立1次方程式を立てることができない。(明示的に未知数を与えれば連立系を解かせることはできるらしいが、まだやっていない。ま、そのうちにね。) その代わり、普段使いそうなことはライブラリーで定義済みである。ということで、2直線の交点を求めるには、extension という関数を使う。

Asymptoteの練習 No.0002 「2直線の交点」

/*
  Asymptoteの練習 No.0002 「2直線の交点」
  t0002.asy
 */

size(8cm,0);

pair A=(0,0), B=(2,2);
pair C=(0,2), D=(3,0);

pair E=extension(A,B,C,D); // E=直線ABと直線CDの交点

path l1=A--B; // パス l1=直線AB
path l2=C--D;

draw(l1^^l2);           // ^^ はパスを結合する
dot("E",E,1.5N,red);    // ラベルはN(=North)方向、1.5倍の位置。赤(red)で描く。
dot("$A$",A,dir(B--A)); // ラベルの位置はB--Aなるパスの方角(dir)
dot("$B$",B,dir(A--B));
dot("$C$",C,dir(D--C));
dot("$D$",D,dir(C--D));

線分は別々に引いても良いが、パスの結合というのを試してみた。それから、ラベルの位置指定に注目。東西南北などの他に、ラベルを貼る方角が指定できる。それもダイナミックに。例えば dir(B–A) と指定すれば、ベクトルBA の方角にラベルが貼られる。さらに面白いには、方角の前に実数を書くと、その分だけラベルまでの距離が引き伸ばされるのである。なるほどね! :mrgreen: なんとなく実装の方式が想像できるというものだ。というか、極めて論理的かつ柔軟な仕様と言える。素晴らしい!

Asymptoteの練習No.0001「3つの同心円」

ともかくも、試してみなくては習得できまい。ということで、配布されているサンプルや、いろんなサイトで見つけたサンプルなどを参考にしつつ、自分で理解できるところから始めることにしよう。

最初の練習は、円と、円上の点の表示。MetaPostと同様に、点(pair)や曲線(path)を前もって定義しておいてから、
それを表示すればよい。点の表示には、 dot(....) を用いるとよいようだ。ラベルの位置をオプションで選べる。NEはNorth Eastの位置ってこと。

Asymptoteの練習 No. 0001 「3つの同心円」

/*
 Asymptoteの練習No.0001「3つの同心円」
 t0001_3circles.asy
*/

size(8cm,0);
import math;

real r1=1.5;
real r2=sqrt(7);
real r3=4;
pair O=0;

path c1=circle(O,r1);
path c2=circle(O,r2);
path c3=circle(O,r3);

draw(c1,magenta);
draw(c2,green);
draw(c3,green);

real th=pi/5;

pair A=(r1*cos(th),r1*sin(th));
pair B=(r2*cos(2*th),r2*sin(2*th));
pair C=(r3*cos(3*th),r3*sin(3*th));

dot("$O$",O,S,red);
dot("$A$",A,red);
dot("$B$",B,NE,red);
dot("$C$",C,N,red);

主な変数型は、real (実数)、pair (点=複素数)、path (曲線)の3つ。細かい文法とかは気にせず、というか、多くはMetaPostと同様だから、どんどん書いてみよう。MetaPostよりも、普通のプログラム言語に近いように感じる。この例では、円上の点を三角関数でパラメーター表示しているが、角度を変化させると、3つの点が一斉に変わるので面白い。

ラベルの表示には TeX が呼び出されているようだ。ここの呼び出しを日本語TeXにしたり、数式フォントを変更したりもできるようだが、まあ、それは後で考えよう。とりあえずは、Asymptoteに慣れることが先決。

UbuntuにAsymptoteをインストール

お絵描きプログラムであるAsymptoteをUbuntuにインストールした。これは、MetaPostの亜種というか改良版であり、文法などはMetaPostから引き継いで、その上でMetaPostをさらに使いやすくしたものらしい。MetaPostに慣れつつあるので、ちょっと気になったこともあり、インストールしてみた。

最初は、Synaptic パッケージ・マネージャーからUbuntu用にコンパイルされたものを入れてみたのだが、これが1.4というちょっと古いバージョン。3D関係のライブラリーを使うとエラーが出るとかで、最新の1.86を入れるべく、ソースからのコンパイルを試みた。ポイントは、ガーベージ・コレクション用のライブラリーを別途ダウンロードすることと、ドキュメント関係の作成のために TeX一式を入れておくこと。最初、コンパイル完了直前になって、texindexがないというエラーであえなく沈没。apt-get install texinfo と、texinfoをインストールして再度試みて成功。

ということで、手順をメモ。

$ wget http://downloads.sourceforge.net/asymptote/asymptote-1.86.src.tgz
$ gunzip asymptote-1.86.src.tgz
$ tar -xf asymptote-1.86.src.tar
$ cd asymptote-1.86/
$ wget http://www.hpl.hp.com/personal/Hans_Boehm/gc/gc_source/gc-7.1.tar.gz
$ ./configure
$ make all
$ sudo make install
$ hash -r