いろいろ
Seize the day.
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 になるという副作用があって,信学論投稿規定的には問題ないんだけど,厳密にはあまりよろしくない (この場合,著者姓名の途中で改行される危険性があって,それって英語でもやっぱり失礼なことらしいのだ).
というわけで,暇をみて何とかしようと思っています.が,スタック言語がわけわかめなので先は長そうです.副作用ありバージョンでよければありますので(ぉ,ご希望の方はご連絡を.
[ ツッコミ | permalink | trackback ]
[TrackBack URL: http://nao.s164.xrea.com/td/tb.rb/20061022]
[(注) スパム対策のため,言及リンクのないトラックバックは受け付けていません.]
[(注) スパム対策のため,言及リンクのないトラックバックは受け付けていません.]
本日のリンク元
検索
- bibtex ハイフン ×9 / ieice.bst ×5 / IEICE bibtex ×2 / tex 人名 空白 ×2 / tex bib ハイフン ×2 / IEICE bst ×2 / USE_DEFAULT ×2 / 失礼 途中 改行 氏名 ×2 / PDFX ハイフン ×1 / tex 人名 ×1 / TeX 人名 ×1 / bibtex 空白 名前 ×1 / キーワード不明 ×1 / 人名 途中 改行 ×1 / access ハイフン 改行 ×1 / access 改行される ハイフン ×1 / access 自動改行 ハイフン ×1 / 変数 ハイフン ×1 / bibtex string 信学論 ×1 / BibTeX ハイフン ×1 / bibtex hypen ×1 / うえハイフン ×1 / matlab 空白削除 ×1 / tex 改行 ハイフン ×1 / 人名 ハイフン ×1 / access ハイフンで改行される ×1 / ieice bst ×1 / tex bib 名前 ハイフン ×1 / BibTeX 名前 ハイフン ×1 / ハイフン 改行 access ×1 / tex ハイフン 表示 ×1 / bibtex ieice.bst ×1 / samba ハイフン ×1 / bibファイル ハイフン ×1 / ハイフン bibtex ×1 / bibtex ieice ×1 / bibtex 人名 ×1 / s nameptr ×1 / 人名 TeX ×1 / 依頼信 英語 ×1
以下の広告はサーバによって自動的に挿入されています.
Copyright © 2004-2006, nao. All rights reserved.





