2015年5月15日

RubyBTeX

BibTeXの.bstをRuby言語でおきかえる実装としてRubyBTeXというのがあるようだ.ちょっと遊んでみた.

使い方は普通のBibTeXと同様.つまり,まずソースを用意し.

\documentclass{jsarticle}
\begin{document}
\cite{jtexbook}
\bibliographystyle{plain}
\bibliography{texbook}
\end{document}
コンパイルする.
platex test.tex
ruby rubybtex test
platex test.tex
platex test.tex
dvipdfmx test.dvi
これで出来るようだ.ちなみにtexbook.bibはTeX Wikiからもってきたもので,Shift_JISで保存してある.またkpathseaは動かないので,texbook.bibはカレントディレクトリにおいてある必要がある.

UTF-8だとinvalid byte sequence in windows-31Jと言われたので,

ruby -Eutf-8 rubybtex test
としてみたら動いた.

が,これだけではもちろん面白くないというか普通にbibtex叩けばいいだけなので,スタイルを少しいじってみる.上で指定したplainは既に用意されていて,plain_bst.rbというファイルが実体.おおまかには次のように書くようだ.

require_relative 'rubybsup.rb'
$entrytypes = ["article","book"]
$styles['article'] = "(:[:author:].:)(:\n\\newblock [:title:]:).(:\n\\newblock {\\em [:journal:]}:)(:, [:volnumpage:]:)(:, [:year:]:).(: [:note:].:)"
$styles['book'] = "(:[:book_author:].:)(:\n\\newblock {\\em [:title:]}.:)(:[:volume:]:)(:, [:chapterpages:]:)(:\n\\newblock[:numberseries:]:)(: [:publisher:]:)(:[:address:]:)(:[:edition:]:)(:, [:year:]:)(:[:note:]:)."

class Formatter
    include NameFormatter
    def f_author
        author = $db[$cite]['author'];
        if author == nil then return nil; end
        name,number = format_names(author,'(:[:ff||~:] :)(:[:vv||~:]:)(:[:ll||:]:)(:, [:jj||:]:)',[' and ',' and '])
        return name
    end
    def f_title
        return $db[$cite]['title'];
    end
    
    def f_journal
        return $db[$cite]['journal']
    end
    (他色々)
    def widestlabel
        return $cites.size.to_s
    end
    
    def sort
        p $cites;
        $cites.sort!{|a,b|
            $db[a]["author"] <=> $db[b]["author"]
        }
        p $cites;
    end
end

ええと,面倒になって色々適当ですごめんなさい.$entrytypeに文献の種類を配列で,$stylesでざっとしたstyleを指定するようだ.細かな挙動はFormatterクラス内で定義する.$stylesは(:A[:B:]C:)という形のが基本.これはFormatterクラス内のf_Bを呼び出し,戻り値がnilならば空文字列に,そうでなければA(f_Bの戻り値)Cに化ける.styles内で\bibitemの出力はする必要無くて,勝手にやってくれる.ただし\bibitem{ラベル名}で固定なので,alpha_bst.rbみたいなのは実装できない模様…….

Formatterクラスで定義しなければならないのは,stylesに現れているf_***と,widestlabel/sort.sortはそのままで,文献一覧の並び替えをする.widestlabelは\begin{thebibiliography}{*ここ*}を指定する.関数内では,次が参照可能.データベースの項目の呼称はbiblatexのそれにあわせる.

  • $db:データベース.$db[エントリキー][フィールドキー]でアクセス可能.
  • $cites:引用されている文献のエントリーキー一覧.
  • $cite:(f_***だけかな?)今処理している文献のエントリーキー

0 件のコメント:

コメントを投稿

コメントの追加にはサードパーティーCookieの許可が必要です