SBCL1.0.33用Portfile

SBCLの最新版をMacPortsを使ってインストールできるよう,Portfileを書き換えました.その際,+threads を指定したときのパッチを customize-target-features.lisp というファイルに当てるよう変更しました.テストは一部失敗するので省略しています.portディレクトリをまとめたものを以下に置いておきます.Snow LeopardLeopardの両方で確認しています.

本来はMacPortsに反映すべきなのでしょうけど,バグトラッキングシステム(trac)なるものを使ったことがないので…

(追記 2010-1-4) 1.0.33対応port

SBCLのportが(やっと)1.0.33に対応しましたので,上記portディレクトリの配布を停止します.今回のportでは,失敗するテストについては上手く避けるようなパッチを当てています.

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ではキャンバス毎に書き出しができますが,それぞれ異なるファイル名を付けようとすると以下のような作業が必要になります.

  1. 書き出しダイアログで書き出し先のファイル名を指定します.このときデフォルトの書き出し先が表示されるのですが,これが毎回同じ(オリジナルの.graffleファイルと同じ)名前になっています.したがってキャンバスを書き出す度にファイル名を指定し直さなければなりません.
  2. 書き出し先ファイルが既に存在していると,上書きを注意するダイアログが表示されます.このダイアログでは,上書きを実行したいときはポインティングデバイスを使ってボタンを押さなければなりません.

些細な作業ですが,図を手直ししつつ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の使用方法全般については次が参考になります.