home «前の日記(2006-10-19) 最新 次の日記(2006-10-24)»

いろいろ
Seize the day.

2004|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|07|09|10|

2006-10-22 [長年日記]

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

というわけで,暇をみて何とかしようと思っています.が,スタック言語がわけわかめなので先は長そうです.副作用ありバージョンでよければありますので(ぉ,ご希望の方はご連絡を.
このエントリーをはてなブックマークに追加 はてなブックマーク数 はてなブックマークコメント   このエントリーを livedoor クリップに追加 livedoor クリップ数 このエントリーを del.ici.ous に追加 このエントリーを buzzurl に追加 buzzurl クリップ数

お名前:
E-mail:
コメント:
[TrackBack URL: http://nao.s164.xrea.com/td/tb.rb/20061022]
[(注) スパム対策のため,言及リンクのないトラックバックは受け付けていません.]

以下の広告はサーバによって自動的に挿入されています.


Copyright © 2004-2006, nao. All rights reserved.