ieice.bst ではハイフン付人名がうまく表示できません
ieice.bst のバグ報告です orz
ユーザの方からメールでご要望を頂いた.ieice.bst では例えば "Donald Ervin Knuth" を "D.E. Knuth" と表示するようにしている.しかし,ハイフン付の人名,例えば "Pierre-Simon Laplace" の場合も "P.S. Laplace" になってしまう,"P.-S. Laplace" になってほしい,という趣旨のものであった.
気付いていない方も多いかもしれないが,というか私自身が指摘されるまで気付かなかったのだが(激ぉ,BibTeX のデフォルトでは "P.-S. Laplace" になる.これが ieice.bst では機能していない.ということです.これは ieice.bst のバグです.大変申し訳ありません.ユーザの皆様,何卒ご承知おきのうえ,注意してお使い下さいますよう,お願い致します.
で,このハイフン機能を復活させるのは,そんなに難しくないだろう,と思ったら甘かった.結論から言うと,現時点ではバグフィックス版をリリースするに至っていない.重ね重ね申し訳ありません.
以下,解読作業.
まず,bibtex.web を眺めると,氏名のデリミタについては tie ("~") がデフォルトである.ただし,
となっている.ここで |sep_char| とは
If one of the valid |sep_char|s appears between tokens, we usually use it instead of a |space|.
であり,具体的には tie と hyphen ("-") を指す.つまり,tie と hyphen の場合は space の代わりにデリミタとして使われるらしい.
things sometimes treated like |white_space|
ただし,これは boolean 変数 use_default が true の場合である.もし,bst ファイルの名前のフォーマット nameptr で,inter-token string なデリミタが "{}" によって指定されていた場合,use_default は false となる.
if (str_pool[sp_ptr] = left_brace) then {find the inter-token string} begin use_default := false; incr(sp_brace_level); incr(sp_ptr); sp_xptr1 := sp_ptr; skip_stuff_at_sp_brace_level_greater_than_one; sp_xptr2 := sp_ptr - 1; end;
この結果,
begin if (use_default) then begin if (not double_letter) then append_ex_buf_char_and_check (period); if (lex_class[name_sep_char[cur_token]] = sep_char) then append_ex_buf_char_and_check (name_sep_char[cur_token]) else if ((cur_token = last_token-1) or (not enough_text_chars (long_token))) then append_ex_buf_char_and_check (tie) else append_ex_buf_char_and_check (space); end else begin if (ex_buf_length+(sp_xptr2-sp_xptr1) > buf_size) then buffer_overflow; sp_ptr := sp_xptr1; while (sp_ptr < sp_xptr2) do begin append_ex_buf_char (str_pool[sp_ptr]); incr(sp_ptr); end end;
となり,sep_char まわりの処理は一切行われず,デリミタは {} で指定されたものに置き換わる.
さて,ieice.bst ではまさにこの inter-token string を使ってデリミタを指定していた.すなわち,
{s nameptr "{f{.}.~}{vv~}{ll}{, jj}" format.name$ 't :=}
として first name のデリミタを "." にすることで,"D. E. Knuth" の余計な空白を取り除いて "D.E. Knuth" にしていたのである.しかし,こうすることによって sep_char まわりの処理が全てオフになってしまっていたのであった.
つーわけで,空白削除とハイフン処理を同時に達成するのは,bst ファイルを小手先でいじった程度では解決しないことがわかった.申し訳ない.そういうわけで,手動で何とかして下さいすみません,という趣旨の返信をお送りして,ご了承いただいた.
…しかしだ.
inter-token string に頼るからできないのであって,bst ファイルのスタック言語でがりがりと文字列処理をやらせれば,何とかなるのではないかと思っている.実際,色々やってるうちに,それっぽい動きをするようなコードができてきた.ただ,今のバージョンでは tie が全て space になるという副作用があって,信学論投稿規定的には問題ないんだけど,厳密にはあまりよろしくない (この場合,著者姓名の途中で改行される危険性があって,それって英語でもやっぱり失礼なことらしいのだ).
というわけで,暇をみて何とかしようと思っています.が,スタック言語がわけわかめなので先は長そうです.副作用ありバージョンでよければありますので(ぉ,ご希望の方はご連絡を.