心理学用BibTeXスタイルファイルのバグ(?)
- 2008-12-21
- カテゴリ: その他のプログラミング
- タグ: Tips Tex LaTeX
心理学学会の投稿規定に沿った形に整形してくれるBibTeXスタイルファイルに、beta_jecon2nonote.bstというものがある。Googleで検索しても開発者のサイトにしかヒットしないから、あまり使っている人は多くないのかな?
卒論を書くのにすごく愛用しているんだけど、先日バグ(?)らしきものを見つけたので、ちょっとブログで公開してみる。開発者にメールで伝えるべきか迷っているけど、バグなのか使い方が間違っているのかがいまいちわからないから躊躇しているところ。
詳細は続きで。
@book
エントリーを使うとエラーが出る
問題は、bibファイルに@book
として定義したエントリーを本文中で\cite
するとエラーが飛ぶ点。
例えば、↓のような内容のbibファイルを用意して、
% test.bib @book{petty1986, title = "Communication and Persuasion: Central and Peripheral Routes to Attitude Change", author = "Petty, R.E. and Cacioppo, J.T.", publisher = "Springer-Verlag", address = "New York", year = 1986 }
↓のような内容のTeX文書をコンパイルしようとすると、
\documentclass{jsbook} \usepackage{natbib} \begin{document} \citet{petty1986} \bibliographystyle{beta_jecon2nonote} \bibliography{test} \end{document}
↓のようなエラーが出ます。
$ platex test This is pTeX, Version 3.1415926-p3.1.10 (sjis) (Web2C 7.5.6) (略) $ jbibtex test This is JBibTeX, Version 0.99c-j0.33 (sjis.euc) (Web2C 7.5.6) The top-level auxiliary file: test.aux The style file: beta_jecon2nonote.bst Database file #1: test.bib You can't pop an empty literal stack for entry petty1986 while executing---line 8767 of file beta_jecon2nonote.bst (There was 1 error message)
@book
エントリーを使わずに@article
エントリーとかだけだったらこのエラーは出ないっぽい。で、実際のところこのエラーが出力されても問題なく.bblファイルが出力されるから、もう一度platexを呼んでやれば問題なくTeX文書のビルドには成功したりする。
問題はOmakeを使ってビルドを自動化していたときで、jbibtexがエラーコードを吐いてしまうせいで、そこで処理が止まってしまう。実に不便。
ということで、
何とかエラーを回避できないかどうかをいろいろと調べてみた。重要なエラーメッセージは↓のような感じなので、
You can't pop an empty literal stack for entry petty1986 while executing---line 8767 of file beta_jecon2nonote.bst
まずはbeta_jecon2nonote.bstの8767行目を見に行く。
が、beta_jecon2nonote.bstは4396行目までしかないorz
仕方がないので、beta_jecon2nonote.bstの改造元になっているjecon.bstとdiffで比較したりしながら原因を探ってみる。エラーメッセージでは「空のスタックからポップしようとしてるよ!」みたいなことを言っているので、ポップ関数が二重に呼ばれているんじゃないかとあたりをつけてみたり、@book
関連の処理を中心に眺めてみたりしながら。
という感じで探してみて怪しいなと思ったのが2857行目と2865行目で、@book
を整形する関数内でfin.entry
という関数が2回呼ばれているところ。改変元のjecon.bstでは一回しか呼ばれていないし、@book
以外の@article
とか@booklet
とかでも一回ずつしか呼ばれていない。
ということで、片方のfin.entry
をコメントアウトしてみたら、
$ jbibtex test This is JBibTeX, Version 0.99c-j0.33 (sjis.euc) (Web2C 7.5.6) The top-level auxiliary file: test.aux The style file: beta_jecon2nonote.bst Database file #1: test.bib
エラーが消えたー!わーい!Omakeも問題なく使えるようになったぞー!
まとめ
- おそらくは、
fin.entry
関数内で呼ばれているwrite$
関数がスタックをポップしているのではないかと推測するけど、BibTeXの文法が全くわからないので詳細は不明。 - 2857行目の
fin.entry
と2865行目のfin.entry
とのどっちをコメントアウトするべきなのかが全くわからないけれど、とりあえずどっちをコメントアウトしてもエラーは消せるっぽい。 fin.entry
をコメントアウトすることでどんな副作用があるのかが全くわからないから不安だけど、BibTeXの文法が全くわからないからどうしようもない。とりあえず、今のところ目視でチェックしてみて、大きな問題はなさそうだったから、このままで行く。- BibTeXの文法ってどこ見ればわかるんだろ?調べても全然わからない。
関連記事
トラックバック URL
- http://liosk.blog103.fc2.com/tb.php/173-b8357075
トラックバック
コメント
-
バグ報告を頂きありがとうございます。私は,まったくTeXに精通しておりませんので,多々,不可思議なコードになっていると思います。御報告を基に,一度,精査してみます。
- 2009-01-26
- by 奥村泰之
- id:-