pbibtex と upbibtex の substring$ 命令の違い

pbibtex と upbibtex の substring$ 命令の違い

- Takeda Shiro の投稿
返信数: 4
武田と申します。

pbibtex と upbibtex で組込みの substring$ 関数の動作が異なります。substring$ は文字列の一部を抜き出す関数です。

例えば

"abcdef" #1 #2 substring$

であれば、文字列「abcdef」の1文字目から2文字分を抜き出します(つまり、"ab" を返します)。また、

"abcdef" #-1 #2 substring$

であれば、「abcdef」の最後の1文字目から2文字分を抜き出します("ef" を返します)。以下の文書の 6 ページに詳しい説明があります。

ftp://ftp.yzu.edu.tw/CTAN/biblio/pbibtex/base/jbtxhak.pdf


この substring$ 関数の引数として日本語の文字列を与えた場合に、pbibtex とupbibtex で結果が変わってしまいます。

例えば、pbibtex では

"あいうえお" #-1 #1 substring$

は「お」を返しますが、upbibtex では返ってくる文字列が文字化けしてしまいます。

もっと詳しい具体例を含んだファイルを添付しています。test_pbibtex.pdf が pbibtex を利用したケース、test_upbibtex.pdf が upbibtex を利用したケースです。run_bibtex.bat でコンパイルします。jplain_alt.bst は jplain.bst と同じですが、substring$ の動作を確認するための check.substring という関数を追加したものです。

私としては upbibtex で処理した場合でも、pbibtex と同じ出力になって欲しいです。

これが upbibtex の不具合なのか、それとも意図した動作なのかということも含め、どなたかこの問題についてわかる方はいらっしゃるでしょうか?

Takeda Shiro への返信

Re: pbibtex と upbibtex の substring$ 命令の違い

- aminophen の投稿
状況を整理します。

[1] 武田さんのバージョンは
This is upBibTeX, Version 0.99d-j0.33-u1.20 (utf8.uptex) (TeX Live 2016/W32TeX/dev)
である。これは内部コード utf8 がデフォルトになっている。

[2] TeX Live 2016 の最新版は
This is upBibTeX, Version 0.99d-j0.33-u1.21 (utf8.euc) (TeX Live 2017/dev)
である。これは内部 utf8 化の中にある不具合回避のため、内部コードが euc になっている。
(参考:forum:1886

私も upbibtex の内部 utf8 のときの substring$ が変だと以前感じたことがありました。しかしよくわからないので
放置していました。forum:1886 もそれに関連していたような記憶(あいまいですが…)があります。
aminophen への返信

Re: pbibtex と upbibtex の substring$ 命令の違い

- Takeda Shiro の投稿
アセトアミノフェンさん

武田です。

情報、ありがとうございます。

私はあべのりさんの TeX インストーラーでインストールした TeX 一式を利用していたのですが、試しに TeX Live 2016の

This is upBibTeX, Version 0.99d-j0.33-u1.21 (utf8.euc) (TeX Live 2016/W32TeX)

というバージョンの upbibtex を利用したところ、pbibtex と同様の出力になりました。ただ、forum:1886の説明にあるように、この場合「使える文字は当面JIS第1,2水準まで」ということになってしまうようですね。

もしforum:1886の問題と同じ原因ですと、内部コードの2バイト→可変バイト(EUC-JP → UTF-8)が不完全でした。まともに治すには時間が掛かりそうです」とのことですから、簡単には修正できないようですね。

upbibtex 自体が修正されない限り解決するのは難しいようですが、とりあえず原因がわかってよかったです。ありがとうございました。

Takeda Shiro への返信

Re: pbibtex と upbibtex の substring$ 命令の違い

- t tk の投稿
ようやく現象と原因を理解し、upbibtexを修正しTeX Live svn にコミット(r42954)しました。内部コードのdefaultもutf8に戻しました。
forum:1886 も同じ原因だったようで、正常終了するようになりました。

武田さんの情報↓が大変参考になりました。
ftp://ftp.yzu.edu.tw/CTAN/biblio/pbibtex/base/jbtxhak.pdf

substring$ の動作について
オリジナルのjbibtexと pbibtex, upbibtex --kanji-internal=euc では
漢字コードの1文字の間で切られないように開始位置,文字数(バイト数)の調整を行う.
調整は開始位置が漢字コードの1バイト目に一致していれば.開始位置はそのまま,
2バイト目であれば1 バイト目から取り出すように調整する.
終了位置が漢字コードの1バイト目であれば2バイト目まで取り出すように調整する.
したがって指定した長さより最大2バイト長い文字列となる.

となっていますが、upbibtex, upbibtex --kanji-internal=uptex では
漢字コードの1文字の間で切られないように開始位置,文字数(バイト数)の調整を行う.
調整は開始位置が漢字コードの1バイト目に一致していれば.開始位置はそのまま,
2~4バイト目であれば1 バイト目から取り出すように調整する.
終了位置が漢字コードの最終バイトでなければ最終バイトまで取り出すように調整する.
したがって指定した長さより最大6バイト長い文字列となる.
という風になります。

jbibtexでも substring$ は文字数をバイト単位で数えています。
EUC と UTF-8 では漢字や仮名のバイト数が異なるため、その分処理結果に差が出ています。
(ギリシャ文字、キリル文字ではバイト数が変わらないため同じ結果になる。)
私としては upbibtex で処理した場合でも、pbibtex と同じ出力になって欲しいです。
とありましたが、バイト数の差に伴う substring$ の出力結果の差が出た場合に支障はいかほどのものでしょうか?
ここも動作を揃えるためには今よりも大きな改造を伴うことになるため、ここまでにしたいと思っています。

t tk への返信

Re: pbibtex と upbibtex の substring$ 命令の違い

- Takeda Shiro の投稿
t tkさん

元の質問をしました武田です。

このフォーラムをしばらくチェックしていなかったため返信が遅くなり申しわけありません。

> とありましたが、バイト数の差に伴う substring$ の出力結果の差が出た場合に支障はいかほどのものでしょうか?
> ここも動作を揃えるためには今よりも大きな改造を伴うことになるため、ここまでにしたいと思っています。

私が自分で作成している bst ファイルでは、substring$ 命令を利用してかなり複雑な処理をしているため、pbibtex と upbibtex で動作が変わると問題が生じてしまうのですが、t tkさんの詳しい説明を読み、異なった文字コードを扱う際に全く同じ動作にするということが非常に難しいことがわかりましたので、別の方法で対処したいと思います。実際、問題といってもたいしたものではなくちょっと手間が増える程度ですので。

お忙しいところどうもありがとうございました。