BibTeX もしくは JBibTeX の Buffer Size を拡張する方法
BibTeX や JBibTeX の command である bibtex とjbibtex は、あまりに長い行の含まれる .bib を読み込むと死にます。なぜかというと、一度に読み込める行の長さが決めうちになっており、それを超えると処理できなくなるためです。
例えば MacPorts から入れた ptex @20110314 に含まれる JBibTeX 0.99c-j0.33 の場合、9000 文字を超えるような行を含む .bib を処理すると以下のような error で死んじゃいます。
This is JBibTeX, Version 0.99c-j0.33 (utf8.euc) (Web2C 7.5.4) The top-level auxiliary file: OkumuraCone.aux The style file: model1a-num-names.bst Database file #1: oxon.bib Sorry---you've exceeded BibTeX's buffer size 9000 zsh: segmentation fault jbibtex OkumuraCone
9000 文字を超えるほうが悪い気もするんですが、素粒子業界や宇宙業界だと author list がとんでもないことになっており、例えば今回の場合はこの論文の author list で死んだわけです。600 名以上います。
この 9000 という数字を自分で書き換えれば良いわけですが、ptex を自前で scratch から build するのも面倒なので、MacPorts を基本的には使ったまま対応します。以下、手順。
3. Build を中断する
依存関係のある package の install が済むと、ptex の build が開始されます。以下のように標準出力が出るはずです。
$ sudo port install ptex (中略) ---> Computing dependencies for ptex ---> Fetching archive for ptex ---> Attempting to fetch ptex-20110314_1+motif+utf8.darwin_11.x86_64.tbz2 from http://packages.macports.org/ptex ---> Fetching ptex ---> Verifying checksum(s) for ptex ---> Extracting ptex ---> Applying patches to ptex ---> Configuring ptex ---> Building ptex
これが出たら、すかさず Ctrl-Z で MacPorts を中断します。見逃さないようにしましょう。
4. bibtex.ch もしくは jbibtex.ch を修正する
MacPorts での ptex の build は、次の directory で実行されます。
/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_tex_pTeX/
さらにこの下に、次の directory が作成され、build に必要な source code が展開されています。
ptex/work/temp/tetex-src-3.0/texk/web2c/ptex/
この中に bibtex.ch と jbibtex.ch が置かれているので、これを修正します。自分の場合は日本語の文献なども BibDesk で管理しているので、jbibtex を修正しました。ptex @20110314 の場合、jbibtex.ch の 180 行目と 219 行目の数字を好きな大きさに変更します。以下が diff の結果です*1。
$ diff jbibtex.ch\~ jbibtex.ch 180c180 180c180 < @!buf_size=9000; {maximum number of characters in an input line (or string)} --- > @!buf_size=100000; {maximum number of characters in an input line (or string)} 219c219 < @!glob_str_size=3000; {maximum size of a |str_global_var|; --- > @!glob_str_size=100000; {maximum size of a |str_global_var|;
5. Build を再開する
最後に、Ctrl-Z で中断していた MacPorts の処理を、fg で再開します。新たに install された /opt/local/bin/jbibtex を実行すれば、数千人の author list にも対応できるはずです。
追記
pTeX から TeXLive 2014 に変更したら、jbibtex が無くなり pbibtex というのを使うようです。pbibtex でも長い著者リストの場合に問題が発生したので、/opt/local/etc/texmf/texmf.cnf を sudo で変更しました。具体的には、以下のように glob_str_size の値を増やします。
glob_str_size = 200000
これを反映させるために、
$ sudo fmtutil-sys --all
を実行します。
*1:kakuto さんのご指摘を受けて、変更箇所を追加 (2012/4/13)。