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 ("~") がデフォルトである.ただし,


If one of the valid |sep_char|s appears between tokens, we usually use it instead of a |space|.
となっている.ここで |sep_char| とは

things sometimes treated like |white_space|
であり,具体的には tie と hyphen ("-") を指す.つまり,tie と hyphen の場合は 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 になるという副作用があって,信学論投稿規定的には問題ないんだけど,厳密にはあまりよろしくない (この場合,著者姓名の途中で改行される危険性があって,それって英語でもやっぱり失礼なことらしいのだ).



というわけで,暇をみて何とかしようと思っています.が,スタック言語がわけわかめなので先は長そうです.副作用ありバージョンでよければありますので(ぉ,ご希望の方はご連絡を.