unite-bibtex
前回までに作成したunite.vimにおけるbibtexキーの補完機能。 単独で動作するようになりました
GitHub: termoshtt/unite-bibtex
基本Pythonで実装してあります(ファイルは.vimだけど)ので+python
が必要です。
またbibtexのIOにpybtexを使用しているので別途インストールが必要です。
sudo easy_install pybtex
でインストールできます。
主要ディストリでもパッケージは提供していないマイナーライブラリですが、
easy_install
はこういう時便利ですね。
easy_install
自体はFedoraではpython-setuptools
で提供されています。
未だにvundle使ってるので最近のneobundle等に疎く、 プラグインの追加方法は各自お願いします。 unite-buildを参考に作ったので、そんな感じで動く筈(汗
設定はbibファイルの位置を指定するだけで、
let g:unite_bibtex_bib_files=["~/papers/bib/all.bib"]
とすれば使えます。 複数bibファイルがある場合のためにリストにしてあります。
:Unite bibtex
とすれば、
の様にuniteに表示され、
<CR>
で対応するbibtexkeyがカーソルの位置に挿入されます。
vimでbibtexkeyを補完
論文をLaTeXで書く時、参考文献はbibtexで管理する。 \cite{some2012title}のように文献を追加するわけだが、 しかし、文献のbibtexキーを覚えている筈がない。 LaTeXもvimで書く身としては、unite.vimで補完したい。 というかそうでないとやってられない。 幸い文献管理アプリを自分で開発していたため、 unite.vimのsourceを作った。
articles
articlesは私の開発しているHTMLベースの文献管理アプリでgithubで公開している: https://github.com/termoshtt/articles。 これを使えばunite.vim/helm(emacs)で文献のbibtexkeyを挿入できる。 ちなみに機能豊富:
- incremental検索
- tagによる検索
- bibtex keyの自動取得(pdftotextを利用してdoiを抽出+dx.doi.orgからbibtex情報を取得)
さらに元々iPad/GoodReader上で使用できる。 日本語のREADME-jaもあります。
unite/bibtex
そんな事よりvimでの補完である。 articlesのインストールはREADME/README-ja参照のこと。 vimでbibtexキーを補完するにはunite.vimが必要です。 uniteにソースを追加するには.vimrc上で
let g:unite_bibtex_articles_directory = '/path/to/installed/dir/of/articles/'
source /path/to/installed/dir/of/articles/unite-bibtex.vim
とするだけでOKです。 補完を行う際は
:Unite bibtex
とします。 これで幾らでも文献を参考にできるぜ!
fc2 => hatena
fc2より移行しました。
半年間放置だったので、 月1で更新できるように頑張ります。
gnuplot for
do for [j=0:4]{
title sprintf("%dth data",j)
plot for [i=0:5] sprintf("data%d",j) index i title sprintf("%dth",i)
pause -1
}
実際に使っているのを少し改変してみた。
dataファイルdata0,data1,data2,data3,data4があり、
その各々に5ブロック分のデータが書いてある様な状況である。
偏微分方程式の時間発展とか計算する時によくある状況である。
順に説明していこう
sprintf
gnuplot中で数値を文字列に変換したいことはままある。 例えば上記の様にファイル名を生成したい時などである。 sprintfはCの関数と同様であり、char*に書きこむ変わりにその場に展開する。つまり plot sprintf("data%d",1)
が plot "data1"
と同じ挙動を示す。
plot for
これはv4.4で追加された機能だと思う(未確認、v4.4では動作確認済み) plot for [i=0:2] x**i
のように書くと
plot x**0 , x**1 , x**2
と同じ挙動が得られる。
do for
これはv4.6での新機能である。 もう特に説明の必要はないと思うが{}でくくられた命令をループ実行する。 {}を使った同様の構文がif/whileでも使えるらしい。 この辺りは次回にpybtexでbibtexをHTMLに変換(githubにup)
pybtexでbibtexをHTMLに変換(作成編)
pybtexのインストール
easy_installがつかえる:
easy_install pybtex
参考HP:
Pybtex! (公式) 開発版が利用可能
pybtex 0.16 : Python Package Index
bibtexソースの読み込み
pybtexからbibtexパーザを読み込みbibtexファイルを読みこむ
from pybtex.database.input import bibtex
parser = bibtex.Parser()
bib_data = parser.parse_file("some.bib")
bib_dataにパースした内容が含まれる。
bib_dataはentriesというbibtex keyをkeyとした辞書をメンバーにもつ。
entries = []
for key in bib_data.entries:
persons = bib_data.entries[key].persons[u'author']
authors = [unicode(au) for au in persons]
entry = { u"key" : key, u"author" : ",".join(authors)}
fields = bib_data.entries[key].fields
if u'title' in fields:
entry.update({ u"title" : fields[u'title'], })
if u'journal' in fields:
entry.update({ u"journal" : fields[u'journal'], })
if u'year' in fields:
entry.update({ u"year" : fields[u'year'], })
entries.append(entry)
辞書の各要素はさらにfield、personsなるメンバーをもつ。
タイトル、ジャーナル等の情報はfieldに含まれており、
著者の情報はpersons[u'author']に含まれる。
後者は独自のclassになっているが、unicode関数を用いて変換できるようである。
この辺の詳細はipythonを使って、逐次取得した変数を調べることで解析した。
__str__()をちゃんと実装していてくれて助かった。
HTML生成
CGIでよく用いられるtemplateエンジンjinja2を用いて上記entriesをHTMLに変換する。 ここは今回の主題でないので軽く述べる。
<!DOCTYPE html>
<html>
<body>
{% for entry in entries %}
<div>
<h4><a href='./pdf/{{entry["key"]}}.pdf'>{{entry["title"]}}</a></h4>
<ul>
<li>Author : {{entry["author"]}}</li>
<li>Journal: {{entry["journal"]}}</li>
<li>Published Year: {{entry["year"]}}</li>
</ul>
</div>
{% endfor %}
</body>
</html>
jinja2テンプレート内でpythonのfor文が使える。
from jinja2 import Template
template = Template(open(template_file).read())
html = template.render({u'entries':entries})
print html.encode("utf-8")
以上でリンクを含んだHTMLが生成される。