研究で必要な雑多な知識をごった煮で
プロフィール

termoshtt

Author:termoshtt
大学院生
専攻:流体物理学
Editor: vim
Language: C++,python

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--/--/-- --:-- スポンサー広告 TB(-) CM(-)
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を用いて並べかえはできるが、検索ができない。
近いうちに検索機能は実装予定です。


つかってくださいな。

2012/07/31 05:09 TeX TB(0) CM(0)
今度こそ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が生成される。
2012/06/03 03:05 TeX TB(0) CM(0)
前回までLuaの記事だったが、今回はpythonである。

pybtex


pybtexはpythonで書かれたbibtexクローンである。
つまり文献情報が書いてある.bibファイルを読みこみ、
TeXの\bibitemをつくる。

ただのクローンならこんな記事は書かない。
このpybtexはなんと、pythonから呼びだして使うことができるのだ!!
つまりpybtexさえあれば、自前でbibtexパーザを書かずとも
自由にpythonからbibtexソースを弄くることができるのだ。

これは文献管理用のスクリプトをpythonで簡単に書けることを意味する。
もうJabRefなんて使う必要はない、emacsからでもvimからでもzshからでも
pythonスクリプトを一つかけば解決である!

GoodReader for iPad


今回はpybtexを用いて、iPadのGoodReaderで論文を読むために、
bibtexから文献リストのHTMLを生成するスクリプトを作成する。

GoodReaderはiPhone/iPad用のドキュメントビューアである。
特にPDFの閲覧に関して秀でており、注釈を付けて保存できる機能がある。
またDropboxと同期して、ローカルにPDFを保存できるためオフラインでも使用可能である。

しかしながら、PDFの情報を一覧するような機能はついておらず、
PDFのタイトルで管理することもできるが、できればbibtexで管理している情報を用いて管理したい。

好都合なことにGoodReaderはHTMLを読むことができ、
さらに相対パスで指定されたPDFのリンクをそのまま開くことができる。
そこで、bibtexの情報を元にリンクを埋め込んだ論文一覧HTMLを作成し、
そのHTML上のjavascriptで検索機能を実装する。

因みに既存のbibtex -> HTMLコンバータも多数存在する。
BibTeX関連ツール - TeX Wiki:
今回はpybtexの練習と、PDFのリンクを付ける方法がわからなったので、一から作成した。

>> 作成編へ
2012/06/03 01:56 TeX TB(0) CM(0)
今回はMPlibについて。

LuaTeXの機能としてあげられている、MetaPostのサポート。
実際にはMPlibというMetaPostを外部ライブラリ化して、
Luaインターフェイスを追加したライブラリを通して行うらしい。

MetaPostとはTeXでよく使われるコマンド型の描画ツールです。
(奥村本、付録Fより)
METAFONTでグラフとかを書いてepsにできるようにしたものらしい。
多分有名な物なので、詳細は略。

LaTeXで使える描画ツールとしては
TeXWikiで紹介されているようにたくさんあるわけだが、
LuaTeXではMetaPostをそのまま使える様にすることを選んだ。

MPlibの開発に関していくつか資料を見つけた。
MPlib: MetaPost as a reusable component
MetaPost developments: MPlib project report
ようは現代的に、外部ライブラリ化してLuaからよびたかったらしい。
apiのリファレンスはこちら

と前置きはこんな感じ。使ってみる。
texliveでluatexが入っている環境ではluamplibは既にインストール済みだったので、
特にインストール作業はなし。

\documentclass{article}
\usepackage{luamplib}
\begin{document}
\begin{mplibcode}
prologues := 1;
beginfig(1);
draw (0,0)--(100,0)--(100,100)--(0,100)--cycle;
label("some text",(50,50));
endfig;
\end{mplibcode}
\end{document}

パッケージluamplibを使う様に指定して、
MetaPostのコードをmplibcode環境で囲めばいい。
この例では四角形のなかに"some text"と表示される。
そのままだと日本語は通らない。

Luaから使う場合。How to use mplib directly from lua?から拝借。

\documentclass{article}
\usepackage{luamplib}
\begin{document}
\directlua{dofile('test.lua')}
\directlua{ StartMP() }
\end{document}


local mpkpse = kpse.new("luatex", "mpost")

local function finder(name, mode, ftype)
if mode == "w" then
return name
else
return mpkpse:find_file(name,ftype)
end
end

function StartMP()
local mplib = require('mplib')
local mpx=mplib.new({find_file=finder,ini_version=true})
local result = mpx:execute('input plain;')
result=mpx:execute('beginfig(1); draw fullcircle scaled 20 withcolor red; endfig;')
local t,e,l = result.term,result.error,result.log
if result.status>0 then
tex.print([[Result of mplib execute is unsuccessfull.]])
else
if result.fig then
tex.sprint('Converted something: \\vrule\\vbox{\\hrule')
local converted=luamplib.convert(result)
tex.sprint('\\hrule}\\vrule')
else
tex.print([[No figure output.]])
tex.print([[Log:]])
tex.print(l)
end
end
mpx:finish()
end

急に長くなったが、基本的には
require('mplib")で読み込み、
mpx = mplib.new(...)でMetaPostのインタプリタを用意し、
result = mpx:execute('...')でMetaPostを図に変換している。
あとはエラー処理のコードと、
mplib.newの引数に渡すfind_file関数を用意している。
この関数がないと動かない。
これはapiリファレンスにデフォルトでローカルのファイルしか探さないから
と書いてあるが、だからなぜ使えないかわからなかった(苦)。

kpseとはLuaTeXのパッケージの一つで、
公式のリファレンスにのっているのでそちらを参考に。


普通に使う分にはmplibcode環境で大体事足りそうなので、
とりあえず使えるようになったことにして、まとめた事にする。
日本語の対応の関連は日本語対応版のjmpostあたりの話をそのうち探ってみることにする。

2012/01/03 01:00 TeX TB(0) CM(0)
今回はLuaTeXの機能を使ったパッケージを作成する。

LuaTeX用のパッケージを作るということはLuaが使えるということである。
これはだいぶ喜ばしい事だろう、多分。
というのも、普通のplatex用のパッケージもろくに作った事ないので、
嬉しさがピンとこない。

それはさておき、Luaの機能を使ってパッケージが作れる。
Luaにあって、TeX単体では難しい作業ということで、
今回は.csvファイルから表を作成するパッケージを作る事にする。
\csvToTable{"filename.csv"}と書くと、
filename.csvを読み込んで、tabular環境の表を作ってくれる関数をつくる。
TeX単体でできるとかできないとかは不明。
とりあえず奥村先生の本にはのってない。

Luaには標準のfile ioが備わっているので簡単にできるはずである。
csvをパースするのはLuaの公式HPから拝借する

function fromCSV (s)
-- 公式のHPより拝借
s = s .. ',' -- ending comma
local t = {} -- table to collect fields
local fieldstart = 1
repeat
-- next field is quoted? (start with `"'?)
if string.find(s, '^"', fieldstart) then
local a, c
local i = fieldstart
repeat
-- find closing quote
a, i, c = string.find(s, '"("?)', i+1)
until c ~= '"' -- quote not followed by quote?
if not i then error('unmatched "') end
local f = string.sub(s, fieldstart+1, i-1)
table.insert(t, (string.gsub(f, '""', '"')))
fieldstart = string.find(s, ',', i) + 1
else -- unquoted; find next comma
local nexti = string.find(s, ',', fieldstart)
table.insert(t, string.sub(s, fieldstart, nexti-1))
fieldstart = nexti + 1
end
until fieldstart > string.len(s)
return t
end

これでコンマで区切られたデータを分割できる。
次にファイルを読み込んで各行を上の関数に渡す関数を作る。
file ioに関してはこのあたりが詳しい。

function readCSV(filename)
local f = assert(io.open(filename,'r'))
data = {}
count = 1
while true do
line = f:read("*line")
if line == nil then break end
list = fromCSV(line)
data[count] = list
count = count + 1
end
return data
end

これでファイルを読み込んで、csvをパースする所までできた。
Luaの基本的な機能だけでごくごく簡単な作業だ。

さていよいよパースしたデータから表を作成する

function csvToSimpleTable(filename)
data = readCSV(filename)
-- とりあえず先頭のdataの要素にあわせておく
local len = #data[1]
local tab = '{'
for i = 1,len do
tab = tab .. "r"
end
tab = tab .. '}'
tex.print("\\begin{tabular}" .. tab)
for i,list in ipairs(data) do
local line = ""
for j,val in ipairs(list) do
if line == "" then
line = val
else
line = line .. '&' .. val
end
end
tex.print(line .. '\\\\')
end
tex.print("\\end{tabular}")
end

LuaからTeXの入力を行うにはtex.print(...)を用いる。
Luaでは文字列の合成は..で行うことと、#dataがデータの個数
(pythonでいえばlen(data))になっていること、
LaTeXの文字列をエスケープする必要がある事に注意すれば、
そう変なことはしていない。

これでLuaの方は完成である。
TeXの方は.dtxと.insファイルを作る。
これについては次回まとめる事にする。
特にLuaTeX用に工夫すべき点は、上記の関数の書いてある.luaをどこで読み込むかで、
.dtxの上の方でのように書くといいと思う。

%\directlua{dofile('csvReader.lua')}

あとは普通に

\newcommand\csvToSimpleTable[1]{\directlua{csvToSimpleTable(#1)}}

のように定義すれば使える。

>>4に続く。
2011/12/04 04:55 TeX TB(0) CM(2)
検索フォーム
ブロとも申請フォーム
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。