Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[upTeX] \char, \kchar で作った仮名のwidow penalty #103

Closed
t-tk opened this issue May 31, 2020 · 10 comments
Closed

[upTeX] \char, \kchar で作った仮名のwidow penalty #103

t-tk opened this issue May 31, 2020 · 10 comments
Labels

Comments

@t-tk
Copy link
Collaborator

t-tk commented May 31, 2020

\UTFC{}, \UTFT{}, \UTFK{}の多書体化 t-tk/japanese-otf-uptex#4 に関連してテスト中に気付きました。
pTeX では仮名文字を\charで作った場合でもwidow penaltyが有効なのに対し、upTeX ではwidow penaltyが無効になってしまうようです。

少々長いですが、以下のコードが例です。
「す」を\char\kuten"0419に変えた場合でもpTeXではwidow penaltyが効きますが、upTeXでは効かなくなってしまいます。
「。」「.」を\char\kutenに変えた場合でも、その文字のpre break penaltyが有効なのはpTeX, upTeXに差はありません。(想定通り)
ついでに「。」「.」を\UTF{}に変えた場合、その文字のpre break penaltyが効かなくなってしまう現象は現状pTeX,upTeX共通で私の想定していたとおりです。

今まで気付いていませんでした。どうしましょうか。

% -*- coding: utf-8 -*-
\newif\ifuptexmode\uptexmodefalse
\ifnum\jis"2121="3000 \uptexmodetrue\fi

\documentclass[autodetect-engine]{article}
\usepackage{otf}

\textheight240mm
\topmargin-10mm
\pagestyle{empty}
\begin{document}
\parindent0pt
\kanjiskip=0zw plus .5zw minus -.05zw
\edef\bs{$\backslash$\kern0em}

\section{\bs jcharwidowpenalty=10000}
\jcharwidowpenalty=10000

\fbox{\parbox{33.5zw}{%
人の目の届かぬところに虫は潜み、
人の手の届かぬところに虫は棲みます。}}~UTF8

\fbox{\parbox{33.5zw}{%
人の目の届かぬところに虫は潜み、
人の手の届かぬところに虫は棲みます\char\kuten"0103}}~\bs char\bs kuten

\fbox{\parbox{33.5zw}{%
人の目の届かぬところに虫は潜み、
人の手の届かぬところに虫は棲みます\UTF{3002}}}~\bs UTF\{\}

\ifuptexmode
\fbox{\parbox{33.5zw}{%
人の目の届かぬところに虫は潜み、
人の手の届かぬところに虫は棲みます\kchar"3002}}~\bs kchar
\fi

\fbox{\parbox{33.5zw}{%
人の目の届かぬところに虫は潜み,
人の手の届かぬところに虫は棲みます.}}~UTF8

\fbox{\parbox{33.5zw}{%
人の目の届かぬところに虫は潜み、
人の手の届かぬところに虫は棲みます\char\kuten"0105}}~\bs char\bs kuten

\fbox{\parbox{33.5zw}{%
人の目の届かぬところに虫は潜み、
人の手の届かぬところに虫は棲みます\UTF{FF0E}}}~\bs UTF\{\}

\ifuptexmode
\fbox{\parbox{33.5zw}{%
人の目の届かぬところに虫は潜み、
人の手の届かぬところに虫は棲みます\kchar"FF0E}}~\bs kchar
\fi

\section{す → \bs char\bs kuten}

\fbox{\parbox{33.5zw}{%
人の目の届かぬところに虫は潜み、
人の手の届かぬところに虫は棲みま\char\kuten"0419。}}~UTF8

\fbox{\parbox{33.5zw}{%
人の目の届かぬところに虫は潜み、
人の手の届かぬところに虫は棲みま\char\kuten"0419\char\kuten"0103}}~\bs char\bs kuten

\fbox{\parbox{33.5zw}{%
人の目の届かぬところに虫は潜み、
人の手の届かぬところに虫は棲みま\char\kuten"0419\UTF{3002}}}~\bs UTF\{\}

\ifuptexmode
\fbox{\parbox{33.5zw}{%
人の目の届かぬところに虫は潜み、
人の手の届かぬところに虫は棲みま\char\kuten"0419\kchar"3002}}~\bs kchar
\fi

\fbox{\parbox{33.5zw}{%
人の目の届かぬところに虫は潜み,
人の手の届かぬところに虫は棲みま\char\kuten"0419.}}~UTF8

\fbox{\parbox{33.5zw}{%
人の目の届かぬところに虫は潜み、
人の手の届かぬところに虫は棲みま\char\kuten"0419\char\kuten"0105}}~\bs char\bs kuten

\fbox{\parbox{33.5zw}{%
人の目の届かぬところに虫は潜み、
人の手の届かぬところに虫は棲みま\char\kuten"0419\UTF{FF0E}}}~\bs UTF\{\}

\ifuptexmode
\fbox{\parbox{33.5zw}{%
人の目の届かぬところに虫は潜み、
人の手の届かぬところに虫は棲みま\char\kuten"0419\kchar"FF0E}}~\bs kchar
\fi

\end{document}

テスト版数

e-pTeX 3.14159265-p3.8.3-191112-2.6 (utf8.euc) (Web2C 2021/dev)
e-upTeX 3.14159265-p3.8.3-u1.26-191112-2.6 (utf8.uptex) (Web2C 2021/dev)
@h-kitagawa
Copy link
Member

h-kitagawa commented May 31, 2020

ノードの中身を見て調べたのですが,和文文字を表す 2 つの char_node p, link(p) に対して,次のようになっています.

  • 「す」→ info(link(p))=0"10003059 (\kcatcode"3019=16)
  • 「す」→ info(link(p))=0"11003059 (\kcatcode"3019=17)
  • 「す」→ info(link(p))=0"12003059 (\kcatcode"3019=18)
  • 「す」→ info(link(p))=0"13003059 (\kcatcode"3019=19)
  • 「\char"3059」→ info(link(p))=0"36003059
  • 「\kchar"3059」→ info(link(p))=0"12003059

よく分かっていませんが,「info(link(p)) には文字コードに kcatcode*2^24 の値を加えている」という挙動にしては \char のときの値が変ですし,そもそもノードになった状態で \kcatcode の値を格納する必要はあるのでしょうか?

[5/31 12:40 edit] \jcharwdowpenalty の挿入対象か否かを見分ける手段が \kcatcode しかないというのであれば,確かにノード中に \kcatcode の情報を入れるしかないですね(ボックス終了時の \kcatcode で判断,というのも変な気がしますし).失礼しました.

@h-kitagawa
Copy link
Member

「\char"3059」→ info(link(p))=0"36003059

前後の命令によっては info(link(p))=0"12003059, 0"4a003059 になったりもするようです.おそらくは main_loop_j+1 の

fast_get_avail(main_p); info(main_p):=KANJI(cur_chr)+cur_cmd*max_cjk_val;

の cur_cmd の値が \kcatcode になっていない?

@h-kitagawa
Copy link
Member

67b221c で,文字ノードを現在のリストに追加する際に \kcatcode の値を kcat_code(kcatcodekey(cur_chr)) で再評価するようにしました.

@t-tk t-tk added the bug label May 31, 2020
@h-kitagawa
Copy link
Member

67b221c でうまくいった……と思ったのですが,(e-pTeX の \Ucharcat で作るのが簡便な)リスト終了時と違う \kcatcode をもつ和文文字トークンへの考慮を忘れていました.「cur_cmd の範囲が kanji..hangul の範囲内ならそのまま,そうでなければノード作成時に \kcatcode 再評価」でも試していますが,どうも cur_cmd の値が安定しません.

@t-tk
Copy link
Collaborator Author

t-tk commented Jun 7, 2020

@h-kitagawa さん、ご検討ありがとうございます。
私はまだいただいたコミットを試せていません。

「cur_cmd の範囲が kanji..hangul の範囲内ならそのまま,そうでなければノード作成時に \kcatcode 再評価」

もしかして噛み合っていないかもしれませんが、私の考えた案は以下です。

\kchar もしくは \charの0x100以上の場合、(1)「UTF-8の普通の文字のときと同様、kcat_code(kcatcodekey(cur_chr)) が kanji..hangul の範囲内なら kcatcode kanji..hangul を付与」、(2)「 kcat_code(kcatcodekey(cur_chr)) が not_cjk の場合、kcatcode other_kcharを付与」

和文文字を表す 2 つの char_node p, link(p) に対して,次のようになるようにする。

  • 「す」→ info(link(p))=0"10003059 (\kcatcode"3019=16) kanji
  • 「す」→ info(link(p))=0"11003059 (\kcatcode"3019=17) kana
  • 「す」→ info(link(p))=0"12003059 (\kcatcode"3019=18) other_kchar
  • 「す」→ info(link(p))=0"13003059 (\kcatcode"3019=19) hangul
  • 「\char"3059」→ info(link(p))=0"11003059 (\kcatcode"3019=17) kana
  • 「\kchar"3059」→ info(link(p))=0"11003059 (\kcatcode"3019=17) kana

@h-kitagawa
Copy link
Member

\kchar もしくは \charの0x100以上の場合、
(1)「UTF-8の普通の文字のときと同様、kcat_code(kcatcodekey(cur_chr)) が kanji..hangul の範囲内なら kcatcode kanji..hangul を付与」、
(2)「 kcat_code(kcatcodekey(cur_chr)) が not_cjk の場合、kcatcode other_kcharを付与」

この方針で良いと思います.
3d88303 で試していますが,そのようになっているはずです(cur_cmd を書き換えるという荒業をやっているのが不安ですが).

@aminophen
Copy link
Member

#120 のオフトピで話題になっている「将来的に upTeX で pTeX を代用する」を実現するために,『pTeX で出来るが upTeX で出来ないこと』は出来る限り潰しましょう。

この kcatcode / jcharwidowpenalty の件はその一つですね。

@t-tk
Copy link
Collaborator Author

t-tk commented Dec 9, 2022

2年以上対応せず済みませんでした。
手元で動かして確認しました。
3d88303@h-kitagawa さんのパッチをそのままマージさせて頂きたいと思います。

t-tk added a commit that referenced this issue Dec 9, 2022
@t-tk
Copy link
Collaborator Author

t-tk commented Dec 9, 2022

コミットしました。r65228
ここは閉じます。

@t-tk
Copy link
Collaborator Author

t-tk commented Jan 1, 2025

北川さんによる 3d88303 に含まれるテストファイルを利用し、CI で動くテストを追加しました。

t-tk added a commit to t-tk/tex-jp-build that referenced this issue Jan 2, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants