心理学用BibTeXスタイルファイルのバグ(?)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

心理学用BibTeXスタイルファイルのバグ(?)

心理学学会の投稿規定に沿った形に整形してくれる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:-

コメントの投稿

お名前
コメント
編集キー
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。