SBCL1.0.33用Portfile
SBCLの最新版をMacPortsを使ってインストールできるよう,Portfileを書き換えました.その際,+threads を指定したときのパッチを customize-target-features.lisp というファイルに当てるよう変更しました.テストは一部失敗するので省略しています.portディレクトリをまとめたものを以下に置いておきます.Snow LeopardとLeopardの両方で確認しています.
http://files.me.com/wtakuo/qm8ixj(2010/1/4配布停止)
本来はMacPortsに反映すべきなのでしょうけど,バグトラッキングシステム(trac)なるものを使ったことがないので…
Snow Leopard で Common Lisp (SBCL編)
Snow Leopard に,MacPortsでまだ対応していない Common Lisp 処理系をインストールする方法についてメモしておきます.
1.0.29版バイナリのインストール
SBCL の公式サイトでは OS X に対応した 1.0.29 版のバイナリが配布されていますので,まずはこれをインストールします.この版は Snow Leopard でも一応動きます.デフォルトのインストール先は /usr/local になりますが,別の場所にしておきます.ここでは配布物の置き場所を /opt/src, インストール先を /opt/sbcl-1.0.29 とし,以下のコマンドを実行しました.必要なら適当に sudo を補ってください.初めてSBCLをインストールするのであれば環境変数 SBCL_HOME の除去は不要です.
mkdir -p /opt/src cd /opt/src wget http://prdownloads.sourceforge.net/sbcl/sbcl-1.0.29-x86-darwin-binary-r2.tar.bz2 tar xvjf ../tmp/sbcl-1.0.29-x86-darwin-binary-r2.tar.bz2 cd sbcl-1.0.29-x86-darwin unset SBCL_HOME INSTALL_ROOT=/opt/sbcl-1.0.29 sh install.sh
これで1.0.29版が使えるようになるはずです.環境変数 SBCL_HOME を以下のようにセットして実行します.
$ export SBCL_HOME=/opt/sbcl-1.0.29/lib/sbcl $ /opt/sbcl-1.0.29/bin/sbcl This is SBCL 1.0.29, an implementation of ANSI Common Lisp. More information about SBCL is available at <http://www.sbcl.org/>. SBCL is free software, provided as is, with absolutely no warranty. It is mostly in the public domain; some portions are provided under BSD-style licenses. See the CREDITS and COPYING files in the distribution for more information. *
CVS版のビルドとインストール
1.0.29版でもいいのですが,開発者メーリングリストをみると新しい方が10.6でのバグもなくてよさそうです.そこで次に最新版(CVS版)のソースコードを取得し,これを1.0.29版を使ってビルドします.インストール先は /opt/sbcl-cvs とし,以下のコマンド列でインストールしました.ここでは SBCL_HOME の除去が必要です.
cd /opt/src cvs -d:pserver:anonymous@sbcl.cvs.sourceforge.net:/cvsroot/sbcl login cvs -z3 -d:pserver:anonymous@sbcl.cvs.sourceforge.net:/cvsroot/sbcl co -P sbcl cd sbcl export SBCL_HOME=/opt/sbcl-1.0.29/lib/sbcl sh make.sh /opt/sbcl-1.0.29/bin/sbcl (cd tests && sh run-tests.sh) (cd doc/manual && make) unset SBCL_HOME INSTALL_ROOT=/opt/sbcl-cvs sh install.sh sh clean.sh
実は run-tests.sh でいくつか失敗が報告されますが,致命的なものではありません.実際にいくつかのプロジェクトで使っていますが,いまのところ問題はないようです.
以上でインストール終了です.環境変数 SBCL_HOME を /opt/sbcl-cvs/lib/sbcl にセットし,/opt/sbcl-cvs/bin をパスに入れておきます.念のためこれで再度CVS版のソースをビルドしてみましたが,問題なくできました.1.0.29版は不要ですので消去してもかまいません.
(追記) 1.0.33版が出ました
この記事を書いている間に1.0.33版のアナウンスがありました.
基本的には現時点でのCVS版と変りません.まだMac用のバイナリは用意されていないようですが,この記事同様に1.0.29を使ってビルドすることだできます.ソースコードはこちらからダウンロードできます.
この版に対応した MacPorts のPortファイルを作るのも難しくはないでしょう.
(追記) スレッドを使うための準備
書き忘れましたが,OSX-Intel 版のSBCLでスレッドを使うためには,以下のような内容の customize-target-features.lisp というファイルを配布ディレクトリのトップに置いてからビルドします.
(lambda (features) (when (and (member :darwin features) (or (member :x86 features) (member :x86-64 features))) (pushnew :mach-exception-handler features) (pushnew :sb-thread features) (pushnew :sb-lutex features) ) features)
MacPorts/pTeX 環境への mathabx フォントのインストール
mathabx というのはTeX用の数学記号フォント集で,AMSのパッケージにもない変わった記号が用意されています.Abadi & Cardelli のς-計算に出てくる変な矢印((mathabx.styを使うと \leftleftharpoons
というコマンドで出てきます.この記号だけなら,わざわざmathabxを入れなくても \leftharpoondown
の上に\leftharpoonup
を重ねてもいいのですが.))もこのフォント集に入っています.
このフォントをMacPortsで導入したpTeX環境で使えるようにしました.TeXのフォントの設定は久しぶりで,ファイルの置き場所や設定等いろいろ調べる必要があったため,その方法を忘れないように書いておきます.
フォントのソースファイルとマクロのインストール
mathabxフォントはCTANで配布されています.
ここからmathabz.zipをダウンロードします.この中の source と texinputs というフォルダの中身をそれぞれ適当なディレクトリにコピーし,最後にmktexlsrを実行します.私が行った作業をコマンドで書くと以下のようになります.
wget http://mirror.ctan.org/fonts/mathabx.zip unzip mathabx.zip cd mathabx sudo mkdir -p /opt/local/share/texmf-local/fonts/source/mathabx sudo mkdir -p /opt/local/share/texmf-local/tex/mathabx sudo cp source/* /opt/local/share/texmf-local/fonts/source/mathabx sudo cp texinputs/* /opt/local/share/texmf-local/tex/mathabx sudo mktexlsr
以上でとりあえずフォントは使えるようになりますが,このままではビットマップ(pk)フォントとして使う事になってしまいます.そこで次のようにしてType1フォントも使えるようにしておきます.
Type1フォントのインストール
MetafontのファイルがあればType1フォントを生成できるらしいのですが,愛知教育大学の堀田先生がmathabxのType1フォントを配布されていますので,今回それを使わせていただきました.堀田先生のサイトには本フォントに関して大変詳しい説明があり,参考になります.
上記サイトよりabxtype1.zipをダウンロードし,この中のmapフォルダおよびpfbフォルダの中身を適切な場所にコピーします.mktexlsrをした後,updmap-sysというコマンドでmapファイルを設定します.私が行った作業は以下の通りです.
wget http://auemath.aichi-edu.ac.jp/~khotta/ghost/abx/abxtype1.zip unzip abxtype1.zip cd abxtype1 sudo mkdir -p /opt/local/share/texmf-local/fonts/map/dvips/mathabx sudo mkdir -p /opt/local/share/texmf-local/fonts/type1/mathabx sudo cp map/* /opt/local/share/texmf-local/fonts/map/dvips/mathabx sudo cp pfb/* /opt/local/share/texmf-local/fonts/type1/mathabx sudo mktexlsr sudo updmap-sys Map=mathabx.map
これでmathabxのType1フォントが使えるようになりました.pdftex, dvips, dvipdfmx のいずれでもきれいに出力されます.
OmniGraffle用キャンバス書き出しスクリプト
私はLaTeXの文書に用いる図を OmniGraffle というMac OS X用のソフトウェアで作成しています.このソフトウェアにはおおむね満足していますが,キャンバスという機能を多用しているとEPSやPDFへの書き出し作業が少々面倒だと感じていました.その手間を解消するスクリプトをAppleScriptで書いてみたところ,かなり便利になったと感じたのでここに紹介します.
このスクリプトで何ができるのか
OmniGraffleではひとつのファイルに複数のキャンバスを作ることができます.キャンバスとは独立したページのようなもので,バージョン4のProfessional版で導入され,現行のバージョン5では通常版でも利用できるようになっています.
キャンバスには好きな名前を付けることができます.ここに "foo", "bar", "baz" という名前のついた3つのキャンバスをもつ fig.graffle というOmniGraffleファイルがあるとします.ここで紹介するスクリプトを使うと,各キャンバスの内容をそれぞれ fig_foo.pdf, fig_bar.pdf, fig_baz.pdf というファイルに1回の操作(メニューからスクリプトを選んで起動するだけ)で書き出すことができます.PDF以外の形式,例えばEPSやPNGで書き出すようにするのも容易です.
このスクリプトを作るまでは,書き出しの際に以下に説明するような手間がかかっていました.
キャンバスは便利だが,書き出しが面倒
キャンバスの利用方法にはいろいろあると思いますが,私は図ごとにキャンバスを作り,関連した複数の図を1つのファイルにまとめるようにしています.類似・関連した図を多用するとき,こうすることで編集作業が大変楽になります.特にキャンバス間でレイヤーを共有する機能(Professional版のみですが)は非常に便利で,教科書の原稿を書くときに重宝しました.
さて,各キャンバスに描いた図をLaTeX文書で使うためには,PDFやEPSなどのファイルとして図ごとに書き出す必要があります. OmniGraffleではキャンバス毎に書き出しができますが,それぞれ異なるファイル名を付けようとすると以下のような作業が必要になります.
- 書き出しダイアログで書き出し先のファイル名を指定します.このときデフォルトの書き出し先が表示されるのですが,これが毎回同じ(オリジナルの.graffleファイルと同じ)名前になっています.したがってキャンバスを書き出す度にファイル名を指定し直さなければなりません.
- 書き出し先ファイルが既に存在していると,上書きを注意するダイアログが表示されます.このダイアログでは,上書きを実行したいときはポインティングデバイスを使ってボタンを押さなければなりません.
些細な作業ですが,図を手直ししつつLaTeXにかけて様子を見たい場合,上の1,2を繰り返すことになりなかなか面倒です.以上を自動化することで,少しでも作業を楽にしたいと思ったのでした.
キャンバス書き出しスクリプト(その1)
このスクリプトを起動すると,OmniGraffleで現在選択しているキャンバスの内容をPDFで書き出します.fileExt の値を ".eps" や ".png" 等に変更すればそれぞれの形式で書き出します.ファイル名は.graffleファイルの名前とキャンバス名を "_" でつないだものになりますが,useDocName の値を false にするとキャンバス名のみになります.キャンバスには自分で好きな名前を付けることができるので,適切な名前を付けると良いでしょう.書き出し先は.graffleファイルと同じフォルダです.また,ファイルを上書きする際の確認ダイアログは出ません.
property fileExt : ".pdf" property useDocName : true property docNameSep : "_" on run tell application "OmniGraffle Professional 5" set doc to first document set dpath to path of doc as POSIX file as alias tell application "Finder" to set ofolder to POSIX path of (folder of dpath as alias) set prefix to mkPrefix(doc) of me set cname to name of canvas of first window as text set ofile to (ofolder & prefix & cname & fileExt) as POSIX file as text save doc in file ofile end tell end run on mkPrefix(doc) set prefix to "" if useDocName then set dname to name of doc if dname ends with ".graffle" then set dname to text 1 thru -9 of dname end if set prefix to dname & docNameSep end if return prefix end mkPrefix
キャンバス書き出しスクリプト(その2)
次のスクリプトは,ファイルに含まれる全キャンバスを一度に書き出すものです.書き出し先のファイル名などは上のスクリプトと同じです.
property fileExt : ".pdf" property useDocName : true property docNameSep : "_" on run tell application "OmniGraffle Professional 5" set currentCanvas to canvas of first window set doc to first document set dpath to path of doc as POSIX file as alias tell application "Finder" to set ofolder to POSIX path of (folder of dpath as alias) set prefix to mkPrefix(doc) of me repeat with cvs in canvases of doc set cname to name of cvs as text set ofile to (ofolder & prefix & cname & fileExt) as POSIX file as text set canvas of first window to cvs save doc in file ofile end repeat set canvas of first window to currentCanvas end tell end run on mkPrefix(doc) set prefix to "" if useDocName then set dname to name of doc if dname ends with ".graffle" then set dname to text 1 thru -9 of dname end if set prefix to dname & docNameSep end if return prefix end mkPrefix
おわりに
以上のスクリプトを書いたのは少し前なのですが,個人的にはそれ以来OmniGraffleでの作業が非常に楽になりました.キャンバスに名前を付けて,それを書き出し先のファイル名とすることを前提としているので,そうでない使い方には合わないと思います.私はこれらのスクリプトをスクリプトメニューから起動できるようにしています.QuickSilverからも起動できています.多少手直しが必要ですが,ドロップレットにしたり osascript コマンドで起動するようにしてもよいでしょう.
スクリプトの作成にあたり,次の記事を参考にさせていただきました.
AppleScriptの使用方法全般については次が参考になります.