Anything-BibTeX を作りました

bibtex を選択し参照の形で挿入する Anything 情報源 Anything-BibTeX を作りました。
Emacs に標準添付の RefTeX を利用しています。
この記事は Emacs Advent Calendar jp: 2011 : ATND の 27日目の記事です。

そもそも bibtex ってなにさ

論文などを執筆する際には、参考文献が重要になります。参考文献の書き方は学会などによって異なりますが、文献のタイトルや筆者、発表された学会など記入する項目は大体同じです。
そこで文献の情報を一つのファイルに集めておき、tex で論文を執筆する際に書式を設定することでファイルから参考文献を自動生成する bibtex というツール(および文献情報の書式)が使われるようになりました。
RefTeX は tex ファイルの作成を支援するマイナーモードで、参考文献のほか図や数式に対する参照の入力を補助してくれます。

使ってみる

gist で公開しています。
Anything-RefTeX を導入する際には、auto-install.el を利用して

(auto-install-from-url "https://raw.github.com/gist/1523216/b8060f8c0792988e862a42f27a18e1d4d35d965d/anything-bibtex.el")

load-path の指すディレクトリに anything-bibtex.el を置いたら

(require 'anything-bibtex)

で情報源が追加されます。

Emacs Lisp の変数 reftex-default-bibliography が設定されているか、
\bibliography コマンドが使われている tex ファイルのバッファで利用できます。
M-x anything-call-source などからお試しください。

\bibliography コマンドが使われている tex ファイルのバッファで anything-bibtex を呼び出すと、始めに正規表現を要求されます。

対象となっている bib ファイルから正規表現にマッチした文献情報が抜き出され、anything で選択できるようになります。
候補はそれぞれ文献情報をひくためのキー、著者や発表した年などの情報、文献のタイトルが含まれています。

これらの中から選択すると、対応した文献情報を参照する tex コマンドが埋め込まれます。

感想

なんだか大袈裟な小見出しになってしまいましたが、太古の昔から言われている「再利用性」とかの話です。
今回 Anything 情報源を作るにあたって、始めは適当なデータを返してくれる関数を探してそれを使えばいいやと思っていました。しかしいざコードを見てみると、

  • 状況に合わせて適切なデータを作る→それをバッファに書き込む
  • 入力をミニバッファから受け取って→それを元にデータを作る

といった関数が多く、なかなか適当な関数が見つかりませんでした(下に挙げる未実装の機能はこの理由から妥協した結果であるものもあります)。
副作用は別の関数で実行し、入力を引数として受け取ってデータを作り返すというように分割してあると、Anything や auto-complete などで利用しやすく便利になるのではないでしょうか。

今後の課題

より効率の良い/簡潔に書ける関数やイディオムがありそうなので、それらを取り入れ改善したいです。

  • marmalade への登録

今流行りの package.el からも使えるよう marmalade にも登録してみたかったのですが、うまくいきませんでした。
Add Package をクリックするとログイン状態に関わらずログイン名とパスワードを要求され、そこでログインに成功してもトップの画面に飛ばされてしまいます。
また marmalade.el をサーバーの url を設定して使ってみたところ、ログイン時に返ってきたトークンをうまく解釈できなかったようで失敗してしまいました。
今回は時間もないので諦めましたが、また後日改めて挑戦しようと思います。

  • 区切り文字の修正

連想リストを anything 情報源としてバッファに書き出し、選択された文字列から連想リストを復元できるようリストの内容をセミコロン ; で区切っています。
これは文献情報によっては問題になりそうです。
連想リストへ復元できるようにするうまい方法があれば修正したいと思います。

  • 機能追加
    • tex ファイル内の文献情報 thebibliography の利用

bibtex は文献情報を tex ファイルとは別のファイルに集めると前述しましたが、tex ファイルに文献情報を直接書くこともできます。
今回は後者の場合に対応していません。

  • RefTeX の設定を利用

今回は書式の設定など RefTeX の柔軟な機能を利用できていない最低限の実装となっています。

  • 複数候補

RefTeX では複数の候補を選択できます。persistent-action で頑張ればできそうな気もしますが、そういう用途で使うものではないようにも見えます。

RefTeX の実装に従って最初に正規表現で候補を絞っていますが、バッファから候補を探して選ぶのではなく Anything を使うのだから、これは不要かと思います。