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 を基本的には使ったまま対応します。以下、手順。

1. MacPorts から ptex を Uninstall する

まずは ptex を uninstall します。

$ sudo port uninstall ptex

2. MacPorts から ptex を Install する

次に、ptex を install し直します。

$ sudo port install ptex

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)。