texjporg / tex-jp-build

Minimum source repository to build Japanese TeX processing tools
23 stars 6 forks source link

upbibtexで名と姓の間のスペースが消える #109

Closed okumuralab closed 4 years ago

okumuralab commented 4 years ago

意図されない使い方かもしれませんが,test.textest.bib をそれぞれ

\documentclass{ltjsarticle}
\begin{document}
\nocite{*}
\bibliographystyle{jplain}
\bibliography{test}
\end{document}
@book{björk2020,
  author = "Tomas Björk",
  title = "Arbitrage Theory in Continuous Time",
  publisher = "Oxford University Press",
  year = 2020,
}

のようにして lualatex test; upbibtex test; lualatex test すると,著者名が TomasBjörk のようにくっついてしまいます。 名前が "Tomas Bjork" なら問題ないのでUnicodeがらみのバグではないかと考えました(jplainの問題なのかもしれません)。

aminophen commented 4 years ago

再現しました。

\bibliographystyle{jplain}\bibliographystyle{plain} に変えると upbibtex でも OK であることを元に確認してみると,jplain.bst の FUNCTION {format.names} における

    { s nameptr "{ff}{ll}" format.name$ is.kanji.str$
    {s nameptr "{ff}{ll}" format.name$ 't :=}
    {s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=}
      if$

is.kanji.str$ が真になっている(→ 日本語の姓名だと判断されている?)ことがわかりました。

aminophen commented 4 years ago

is.kanji.str$ で "ö" が和文文字であると判定されることが原因で,jplain.bst の「日本人の姓名の間にはスペースを入れない」を意図した上記コードが "Tomas Björk" を誤判定してしまうのだと思います。

upTeX でも \kcatcode に関して

(**) "Latin-1 Letters" (0xAA, 0xBA, 0xC0..0xD6, 0xD8..0xF6, 0xF8..0xFF), "Latin Extended-A" (0x100..0x17F) の文字はupTeX-1.23より、 また "Latin Extended-B" (0x180..0x24F), "Latin Extended Additional" (0x1E00..0x1EFF) の文字はupTeX-1.24より defaultを欧文(not_cjk)とする設定を行った。

となっているので,upBibTeX でも同様の設定ができると良いのではないでしょうか。

okumuralab commented 4 years ago

なるほど! 理解できました。ありがとうございます。

  author = {Tomas Bj{\"o}rk},

と書けば問題ないのですが,せっかくUnicode対応なので,\kcatcode 的なことができれば便利になりそうです(あるいは単に is.kanji.str$ が真となる範囲を漢字・仮名に絞ってもいいかもしれませんね)。

t-tk commented 4 years ago

ざっと眺めてみると、pbibtexの↓この辺りが is.kanji.str$に関係していそうです。 https://github.com/texjporg/tex-jp-build/blob/dbc65471fe7acbfbb3ae8eaf2300a832a2a19967/source/texk/web2c/ptexdir/pbibtex.ch#L588-L610

aminophen commented 4 years ago

↓この辺りが is.kanji.str$に関係していそうです。

仰る通りです。どうやら,文字列を「単なるバイト列」として読んで「128 以上が一度でも現れれば真」としてあるようですから,まずはこれを multibytelen に依拠して「文字コード」に変換し,それを和文か欧文か区別する関数を利用できれば良いことになりそうです。

aminophen commented 4 years ago

あまりよくわかっていませんが,upTeX の \kcatcode が 15 の文字を欧文扱いにするなら

[edit] 紛らわしいので,古いパッチは削除。

という感じでしょうか?(十分にはテストできていません)

aminophen commented 4 years ago
aminophen commented 4 years ago

前掲のパッチの誤りを修正しつつ,2種類の実装を作ってみました。upBibTeX の内部コードが uptex の場合のみだけの動作を変更しています。

候補1 → branch 'upbibtex-109'

upTeX で \kcatcode = 15 を欧文扱い,他は和文扱い。(欧文とみなされる文字が最少。)

候補2 → branch 'upbibtex-109-2'

upTeX で \kcatcode = 16, 17 を和文扱い,他は欧文扱い。(和文とみなされる文字が最少。)


「\kcatcode 的な設定機能」は実装していません(変更したい場合はあまり多くないと思いますし,インタフェースの考案が面倒なので)。候補2を

でテストしてみると以下の画像のようになります。

20201012-upbibtex-iskanji

候補1の場合は(画像は付けませんが)ギリシャ文字の人名がひっくり返ります。

t-tk commented 4 years ago

ハングルの人名は姓と名の間を分かち書きしない方が普通だと思います。例えば "문재인" とか "김정은" とか。 従って、和文扱いの方に入れていいと思います。 しかし、ハングルの地の文章では規則に従った分かち書きが適切な場合が多いと思います。 is.kanji.str$ の利用場面は人名以外にもあるのでしょうか。

キリル文字とギリシャ文字をどうするかは、「日本語+英語, レガシーエンコーディング」の範囲で仕様が決まっていたソフトウェアをUnicode化するときに常に悩ましい問題になる部分だと思っています。 今回については私は、pbibtex(及びupbibtexの従来版)との動作の差異が大きくなりますが、「互換性を捨ててキリル文字とギリシャ文字はラテン文字と同様にする」がよいと思っています。

「\kcatcode 的な設定機能」は、あれば便利でしょうけれどもそこまで頑張らなくてもいいように思います。 upbibtex の利用場面は pbibtexの機能の少々延長したところまでを想定していました。 多言語化に必要な機能などは検討してこなかった、というのが正直なところです。

しかし、upbibtex に期待される役割があるのであれば今後の拡張として考えても良いかも知れません。 upmendexでは多言語化やupLaTeX以外(XeLaTeX, LuaLaTeX)との連携も狙った仕様にしたつもりですが、upbibtexではそこまでしていません。現状の動作の一部は「仕様」ではなく、「未検討」「未実装」「想定なし」のように捉えて仕様拡張を考えていただいても結構です。

aminophen commented 4 years ago

「互換性を捨ててキリル文字とギリシャ文字はラテン文字と同様にする」がよいと思っています。 「\kcatcode 的な設定機能」は、あれば便利でしょうけれどもそこまで頑張らなくてもいいように思います。

私も @t-tk さんと同じ意見で,候補2をブラッシュアップしていきたいです。

ハングルの人名は姓と名の間を分かち書きしない方が普通だと思います。 従って、和文扱いの方に入れていいと思います。

そうなのですか。もしそういう慣習ならば \kcatcode = 19 のグループも真としましょう。

is.kanji.str$ の利用場面

jbtxbst.doc(pbibtex に付属の BST スタイル群のソースコード兼説明書)によると,主なのは

などです。「タイトルを \em で囲まない」は,私の上掲の画像でも「日本語 LaTeX2e ブック」が強調されていない所に反映されていますが,意図は「日本語文字に \em はそぐわない」だと推測します。

たった今気づいたのですが,今回の件(Latin-1 が is.kanji.str$ で真と判定される)は,jecon.bst(武田さん @ShiroTakeda 作;以前 #1 を forum で報告なさった方)のドキュメントでも

https://github.com/ShiroTakeda/jecon-bst/blob/8ff99bd50d8d8dc87bbd3cfbe6146b942193d421/unicode/jecon-unicode-lualatex.tex#L181-L190

と指摘されていました。どのような挙動が適切か,伺えると良いですね。

ShiroTakeda commented 4 years ago

リンク先の jecon.bst を作成している武田です。

もし修正していただけるとありがたいので、参考までに私の個人的な要望を書かせていただきます。

私の場合は

ということが希望なのですが、この場合でしたら単に is.kanji.str$ が「ò」,「ö」,「ç」のような欧文のユニコード文字も日本語認定してくれさえすれば十分です。

jecon.bst では日本語文献と英語文献で以下のような部分を場合わけをしています。

基本的に日本語の文献か、英語の文献かだけの場合分けなので、is.kanji.str$ が単純に日本語かそれ以外かを判定してくれればすみます(現状では is.kanji.str$ が「ò」などを日本語認定してしまうので、ちょっとトリッキーな処理をしています)。

日本語文献と英語文献の判定ですが、基本的には、著者名(author, editor)やタイトルに日本語が入っていれば日本語の文献と考えてもいいとは思います。

ただ、ちょっと例外があり、日本語の文献でも author だけは alphabet にしている文献があります。これはオライリーの邦訳書によくあり、例えば、以下の書籍です。

@Book{Boswell-2012,
  author       = {Boswell, Dustin and Foucher, Trevor},
  title        = {リーダブルコード ―より良いコードを書くためのシンプルで実践的
                  なテクニック (Theory in practice) },
  year         = 2012,
  publisher    = {オライリージャパン},
  translator   = {角, 征典},
  language     = {ja},
  yomi         = {ぼすうぇる}
}

このような文献の場合、author 部分だけは英語文献用の処理をする必要があるかもしれません。ですので、author 部分については他の部分とは別に is.kanji.str$ で判定をする必要があります。

以上は、「日本語文献 + 英語文献」のみを扱うケースの話でして、中国語、韓国語などの文字、ローマ字以外の文字などが入ってくる場合となると私自身も扱ったことがないため、どのようなルールが適切なのかちょっとわかりかねます...すみません。

aminophen commented 4 years ago

@ShiroTakeda お呼びだてしまったようですみません。コメントをありがとうございます。

jecon.bst では日本語文献と英語文献で以下のような部分を場合わけをしています。

参考になります。今回の変更案「is.kanji.str$ で欧文のユニコード文字(主に Latin-1)を偽と判定される(=欧文扱い)ようにしたい」による問題はなさそうだと理解しました。

候補3 → branch 'upbibtex-109-3'

upTeX で \kcatcode = 15, 18 を欧文扱い,他 (16, 17, 19) は和文扱い。

欧文扱い:

和文扱い:

20201013-upbibtex-iskanji

5a580f1 で追加したテストファイルの処理結果は上のとおりです。

t-tk commented 4 years ago

@ShiroTakeda さん、コメント有難うございます。実用されている方の声が聞けて助かります。

@aminophen さん、一つ質問です。記号類は和文扱い・欧文扱いのどちらになっていますか? pbibtex ですと「£」「§」「○」「●」などEUCで2バイト文字なので和文扱いになっていると思います。JIS第一水準ですが欧文の文脈で使われることも多く、いろいろなUnicode対応ソフトウェアによって和文扱い・欧文扱いの対応状況が別れていると思います。 is.kanji.str$では、文字列の中で漢字や仮名など明らかに和文の文字が一つでも入れば文字列全体が和文扱いになる、という動作なのだと理解していますが、それならば記号類は欧文扱いでよいように思います。

aminophen commented 4 years ago

記号類は和文扱い・欧文扱いのどちらになっていますか?

テストには入れておらず試していませんが,

参考:upTeX の内部コード uptex の時,ギリシャ文字とキリル文字は記号類と同じく 18 です。euc の時は,ギリシャ文字は6区なので 17,キリル文字は7区なので 18 となっています(pTeX 互換)。

aminophen commented 4 years ago

テストには入れておらず試していませんが,

試してみました。上記のとおり動作しておりました。upBibTeX の内部コード uptex の状態で

@book{fullwidth,
  author    = "Donald E. Knuth",
  title     = "1",
  publisher = "Addison-Wesley",
  year      = 1986,
}

@book{kigou,
  author    = "Tomas Björk",
  title     = "$£(!?)☃♪、。§○●",
  publisher = "Oxford University Press",
  year      = 2020,
}

を処理すると,前者(全角数字)は和文扱い,後者(記号たち)は欧文扱いされます。

t-tk commented 4 years ago

有難うございます。 branch 'upbibtex-109-3' の内容に賛成です。

少々重箱の隅の気もしますが、仕様としてどこまで決めておくかに触れておきます。 私の考えでは、仕様としては以下のように明示しておこうかと思います。

欧文扱い:

和文扱い (upTeXのkcatcode 16, 17, 19) :

今までに話題に挙がっていないスクリプト(ヘブライ文字、タイ文字、アラビア文字等々)は現状の動作で仕様を確定させるということではなく、仕様未定ということにしておきたいと思います。 それらはupTeXのdefaultはCJK記号と同じ分類でCJK扱いとしたものの、upTeXのdefaultの仕様としてどうするかを迷った部分(#43)でもあります。 upbibtex の場合はどちらが便利なのかは分からないもののis_kanji_str$ が偽になる方が便利な方が多そうな気はしていますし、いかにもkanjiの仲間になりそうにありません。 しかし、 分からないのは確かなので仕様としては将来の課題としておきたいと思います。 upTeXのkcatcodeのような切り替え機構を導入するなど、拡張の可能性もあると思います。

現在 upbibtex は upTeX 1.26 の一部として upBibTeX 0.99d-j0.33-u1.26 のような版数になっています。 TeX Live 2021に向けてupTeXの他の更新予定は現在ありません。 作って頂いたブランチを upTeX の一部として取り込ませていただき upTeX 1.27 としてリリースしたいと思いますがいかがでしょうか。

t-tk commented 4 years ago

追伸。 CJKでよく使われている記号類、特にレガシーエンコーディングで全角で使われてきた記号類も「和文扱いではない」ということを仕様として明示したほうがよいような気がしてきました。迷います。 Blocks.txt を検索してみると、ブロック名にCJKが含まれかつupTeXのCJK記号(kcatcode 18)になっているものは以下だと思います。

記号はUnicodeのあちこちに散らばっているのでJIS第一、二水準という線引きはおそらく難しいだろうと思っています。

aminophen commented 4 years ago

仕様としては以下のように明示しておこうかと思います。 今までに話題に挙がっていないスクリプト(ヘブライ文字、タイ文字、アラビア文字等々)は現状の動作で仕様を確定させるということではなく、仕様未定ということにしておきたいと思います。

了解です。

作って頂いたブランチを upTeX の一部として取り込ませていただき

取り込んでいただけるということであれば有り難いです。

TeX Live 2021に向けてupTeXの他の更新予定は現在ありません。

可能ならば \kchar の \jcharwidowpenalty (#103) をお願いいたします。

t-tk commented 4 years ago

テストしています。 @okumuralab さんの例をupLaTeXで使う場合は \detokenize{} を入れれば動きました。 欧文LaTeXのdefaultがUTF-8になった関係でこちらも楽になったようです。

可能ならば \kchar の \jcharwidowpenalty (#103) をお願いいたします。

こちらはせっかくパッチを頂いていますが作業が止まってしまっています。スミマセン。

testup.tex ::

\documentclass{ujarticle}
\usepackage[T1]{fontenc}
\begin{document}
\fontencoding{T1}\selectfont
upbibtexのテスト\cite{\detokenize{björk2020}}。
%upbibtexのテスト\cite{björk2020}。% これはNG
\bibliographystyle{jalpha}
\bibliography{test}
\end{document}

test.bib ::

@book{björk2020,
  author = "Tomas Björk",
  title = "Arbitrage Theory in Continuous Time",
  publisher = "Oxford University Press",
  year = 2020,
}

upbibtexの出力 testup.bbl ::

\newcommand{\noopsort}[1]{} \newcommand{\printfirst}[2]{#1}
  \newcommand{\singleletter}[1]{#1} \newcommand{\switchargs}[2]{#2#1}
\begin{thebibliography}{Bjö20}

\bibitem[Bjö20]{björk2020}
Tomas Björk.
\newblock {\em Arbitrage Theory in Continuous Time}.
\newblock Oxford University Press, 2020.

\end{thebibliography}
t-tk commented 4 years ago

01_uptex_doc_utf8.txt に記述予定。

◇ upbibtex の is.kanji.str$
upbibtex の is.kanji.str$ の返り値は以下に示すとおりとする。
以下に明示されていないブロックは現在falseが返る実装となっているが仕様としては未定義とする。
trueに変更した方が利便性が高い等の判断があった場合、将来の版で変更する可能性もある。

◎trueのブロック
upTeXのkcatcodeのデフォルト値が16,17,19のブロックは返り値をtrueとする。

◎falseのブロック
以下に示すブロックは返り値をfalseとする。
 ○Unicode blockに準拠
 (0x00)  0x0000.. 0x007F  <15>  Basic Latin
 (0x02)  0x0100.. 0x017F  <15>  Latin Extended-A
 (0x03)  0x0180.. 0x024F  <15>  Latin Extended-B
         0x0370.. 0x03FF  <18>  Greek and Coptic
         0x0400.. 0x04FF  <18>  Cyrillic
         0x0500.. 0x052F  <18>  Cyrillic Supplement
         0x1C80.. 0x1C8F  <18>  Cyrillic Extended-C
 (0x45)  0x1E00.. 0x1EFF  <15>  Latin Extended Additional
         0x1F00.. 0x1FFF  <18>  Greek Extended
         0x2C60.. 0x2C7F  <18>  Latin Extended-C
         0x2DE0.. 0x2DFF  <18>  Cyrillic Extended-A
         0x3000.. 0x303F  <18>  CJK Symbols and Punctuation
         0x3200.. 0x32FF  <18>  Enclosed CJK Letters and Months
         0x3300.. 0x33FF  <18>  CJK Compatibility
         0xA640.. 0xA69F  <18>  Cyrillic Extended-B
         0xA720.. 0xA7FF  <18>  Latin Extended-D
         0xAB30.. 0xAB6F  <18>  Latin Extended-E
         0xFE30.. 0xFE4F  <18>  CJK Compatibility Forms (全角英数、半角カナを除く)
 ○Unicode blockの例外
 (0x1FD) 0xAA, 0xBA, 0xC0..0xD6, 0xD8..0xF6, 0xF8..0xFF <15>  Latin-1 Letters
t-tk commented 4 years ago

upbibtex(内部コード -kanji-internal=uptex)の動作について、開発初期の頃はpbibtexとの完全互換に近づけることを志向していて「jalpha.bst 使用時に一部のエントリーでeuc動作と同等にならない問題がある。」という現象を問題だと認識していました。 しかし、今回の件でpbibtexとupbibtexの動作が少々異なっても構わないと考えることにしました。

@aminophen さんから頂いたコードは TeX Live svn にコミットしました(r56756)。 01_uptex_doc_utf8.txt の更新をして uptex-base を CTAN にリリースしたらここは閉じようと思います。

t-tk commented 4 years ago

uptex-base 2020-10-31をCTANに投稿しました。 ここは閉じます。