名前: ZR 日時: 2009-10-25 03:33:25 IPアドレス: 125.175.45.*
>>53890 本来、禁則処理を決めるのは \prebreakpenalty/\postbreakpenalty で \kcatcode は関係ないはずなので、この動作は妙です。 ということで調べてみました。 %test.tex>-------- \documentclass[uplatex]{jsarticle} \begin{document} \showboxdepth=100 \showboxbreadth=100 \tracingonline=1 \makeatletter % 幅を十分にして、\parbox の設定の \vbox を作る \setbox0=\vbox{\hsize=10zw \@parboxrestore ほげほげ($x=55$)\@@par} \showbox0 \kcatcode`0=17 \setbox0=\vbox{\hsize=10zw \@parboxrestore ほげほげ($x=55$)\@@par} \showbox0 \end{document} %EOF>-------- > \box0= \vbox(8.1372+1.1096)x84.14616, yoko direction .\hbox(8.1372+1.1096)x84.14616, glue set 4.2401fil ..\hbox(0.0+0.0)x0.0 ..\JY2/mc/m/n/10 ほ ..\JY2/mc/m/n/10 げ ..\JY2/mc/m/n/10 ほ ..\JY2/mc/m/n/10 げ ..\glue(refer from jfm) 4.62341 minus 4.62341 ..\JY2/mc/m/n/10 ( ..\penalty 10000(for kinsoku) ..\mathon ..\OML/cmm/m/it/10 x ..\glue(\thickmuskip) 2.77771 plus 2.77771 ..\OT1/cmr/m/n/10 = ..\penalty 500 ..\glue(\thickmuskip) 2.77771 plus 2.77771 ..\OT1/cmr/m/n/10 5 ..\OT1/cmr/m/n/10 5 ..\mathoff ..\penalty 10000(for kinsoku) ..\JY2/mc/m/n/10 ) ..\penalty 10000 ..\glue(\parfillskip) 0.0 plus 1.0fil ..\glue(\rightskip) 0.0 ! OK. l.11 \showbox0 ? > \box0= \vbox(8.1372+1.1096)x84.14616, yoko direction .\hbox(8.1372+1.1096)x84.14616, glue set 4.2401fil ..\hbox(0.0+0.0)x0.0 ..\JY2/mc/m/n/10 ほ ..\JY2/mc/m/n/10 げ ..\JY2/mc/m/n/10 ほ ..\JY2/mc/m/n/10 げ ..\glue(refer from jfm) 4.62341 minus 4.62341 ..\JY2/mc/m/n/10 ( ..\penalty 10000(for kinsoku) ..\mathon ..\OML/cmm/m/it/10 x ..\glue(\thickmuskip) 2.77771 plus 2.77771 ..\OT1/cmr/m/n/10 = ..\penalty 500 ..\glue(\thickmuskip) 2.77771 plus 2.77771 ..\OT1/cmr/m/n/10 5 ..\OT1/cmr/m/n/10 5 ..\penalty 500(for \jchrwidowpenalty) ..\glue(\kanjiskip) 0.0 plus 0.92473 minus 0.0924 ..\mathoff ..\penalty 10000(for kinsoku) ..\JY2/mc/m/n/10 ) ..\penalty 10000 ..\glue(\parfillskip) 0.0 plus 1.0fil ..\glue(\rightskip) 0.0 ! OK. l.17 \showbox0 <)>の kcatcode を 17 にすると、<)> の直前で 文字ウィドウ処理と禁則処理が同時に働いて、 結果的には <)> の直前には \jcharwidowpenalty (=500) しか 効かなくなっています。 文字ウィドウ処理は、段落最後の「句読点類」を除いた文字が 和文文字の時にその直前が対象となりますが、 pTex/upTeX ではこの「句読点類」の判定に kcatcode を使って いるようです。 # だから pTeX でも <)> の kcatcode が 18 以外なら # 全く同じことが起こる。 というわけで、結局、kcatcode を 18 にしたい文字と 18 以外にしたい文字が同じブロックに同居しているのが 悩ましいことになるのですが。 対処としては、\jcharwidowpenalty の値を大きくすることが 考えられます。ただ、元投稿に示されている例だと 10000 に しないと回避できないようです。果たしてこれでいいものか…。 # ちなみに、XeLaTeX の xeCJK パッケージではウィドウの場所 # での分割は完全に禁止しているようです。
この書き込みへの返事: