iPadで論文を読む

以前の記事でpybtexとjinja2を使った論文のリストの生成について書きました。 今回から何回かでそれを発展させて作ったiPadでつかえる論文管理webアプリについて紹介します。

https://github.com/termoshtt/articles

前回同様githubで公開してありますので、使ってもらえるとありがたいです。 つたない英語が読みにくい場合はここで質問してもらえると補足できます。

articles

このアプリはそもそもiPad、特にGoodReaderでの使用を目的として開発されています。 GoodReaderはpdfを読む分には申し分ないのですが、 ファイル名以上の論文の管理ができず、別個でpaper等のアプリを用いる必要がありました。 本アプリはこの点を解決し、GoodReader内部で論文を読む作業を閉じさせるために開発されています。

GoodReaderはHTML,Javascriptを読む事ができ、さらにGoodReader管理下のHTMLからは相対パスで pdfにリンクすることが可能です。 この機能を利用してこのアプリは論文の情報を一覧したHTMLのリストを作成し、リンクを埋め込みます。 さらにJavascriptを用いて検索を行なうことが可能です。

このようにHTMLで作成することにより、デスクトップ環境でも同じ様に使用する事が可能です。 (寧ろ現状ではデスクトップ環境の方が便利です)

構成

このアプリはHTMLとJavascriptから成るwebアプリとCGI部分から成ります。 上記の機能、即ち論文の一覧と検索機能を使用する場合はwebアプリ部分だけで十分ですので、 CGIを使用する必要はありません。 CGIは後述するタグ付けの機能を使用する際に必要となります。 ちなみにCGIpythonで書いています。

要件

このアプリを使用するには論文の情報を纏めているbibファイルがあり、 さらにpdfのファイル名がそのbibtexkeyに一致している必要があります。 これはJabRef等で用いられている規則です。 異る命名規則を用いている場合は自力で変換してください。 さらに変換を行うためにpythonが動作するデスクトップが必要です。 現在はLinuxでのみ動作します(Windows上でプログラム書いたことない)。

今回は以上、概略の説明までです。 次回以降でインストールの方法、タグ付けについて紹介します。

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

とすれば、

f:id:termoshtt:20130829051355p:plain

の様にuniteに表示され、 <CR>で対応するbibtexkeyがカーソルの位置に挿入されます。

vimでbibtexkeyを補完

論文をLaTeXで書く時、参考文献はbibtexで管理する。 \cite{some2012title}のように文献を追加するわけだが、 しかし、文献のbibtexキーを覚えている筈がない。 LaTeXvimで書く身としては、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

とします。 これで幾らでも文献を参考にできるぜ!

gnuplot for

gnuplot v4.6がでて半年くらいたつが、新機能まとめ的な記事を見掛けないので書いてみる。 今回はfor文について。 このブログ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)

2月ほど前の記事pybtexでbibtexをHTMLに変換(作成編):で作った bibtex -> html のコンバータをgithubに挙げたので宣伝してみる。 https://github.com/termoshtt/bib2paperlist https://github.com/termoshtt/articles (12/12/21修正) pybtex,jinja2のインストールは別途必須。 使用するにはpdfのファイル名がbibtexkeyに一致している必要がある。 JabRef等を使用している場合、一致させて管理していることが多いと思いこの仕様にした。 現状ではjqueryを用いて並べかえはできるが、検索ができない。 近いうちに検索機能は実装予定です。 つかってくださいな。

pybtexでbibtexをHTMLに変換(作成編)

今度こそpybtexを使ってみる。

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が生成される。