LuaTeX のソースコードを調べてみました.
case hbox_group:
/* When the right brace occurs at the end of an \.{\\hbox} or \.{\\vbox} or
\.{\\vtop} construction, the |package| routine comes into action. We might
also have to finish a paragraph that hasn't ended. */
package(0);
のようになっている(handle_right_brace in maincontrol.w).
void package(int c) {
(略)
unsave();
save_ptr -= 4;
if (cur_list.mode_field == -hmode) {
cur_box = filtered_hpack(cur_list.head_field,
cur_list.tail_field, saved_value(1),
saved_level(1), grp, saved_level(2));
subtype(cur_box) = HLIST_SUBTYPE_HBOX;
} (略)
のようになっている(packaging.w).
一方,pTeX では,[X] (\xkanjiskip) 挿入処理を行う adjust_hlist (luatexja-xkanji.lua に対応)は, packaging() の前に実行される(§1097):
hbox_group: begin adjust_hlist(head,false); package(0); end;そのため,adjust_hlist では「ボックス内の \[x]kanjiskip の値」を簡単に取得することができる.
これを踏まえると,良さそうな解決策として,
があります(採用すれば,pTeX と同じように文法の \kanjiskip, \xkanjiskip, \jcharwidowpenalty 命令は廃止). ひとまずは,自分用のブランチにこの方針で書いてみようと思います.
チケットの詳細で書かれていることって,
\input luatexja-core.sty
\kanjiskip=1pt
\hbox{\kanjiskip=10pt あい\kanjiskip=5pt うえ}
\end
という状態のとき,
あ<5pt>い<5pt>う<5pt>えとなって欲しいということでしょうか?
あ<5pt>い<5pt>う<5pt>え となって欲しいということでしょうか?
はい.私はこれを望んでいました. しかし今の実装では,
あ<1pt>い<1pt>う<1pt>え
となります.
# \kanjiskip を段落ごとの設定としてではない実装,例えば上の例ならば
# あ<10pt>い<5pt>う<5pt>え
#という組版結果を与えるという実装もありうるかもしれませんが…….
1pt が透過してしまうのはおかしい気がしますね. 段落内ではどんな方法でも変更できなくなってしまうので.
あ<5pt>い<5pt>う<5pt>え
となってほしいか
あ<10pt>い<5pt>う<5pt>えとなってほしいかは,仕様をきちんと書けばどちらでもいいと思います.
「\kanjiskip は段落またはボックスの中で共通とし,各段落またはボックスの中で一番最後に設定されたものが適用される.段落やボックスごとに変更してもよい.境界での扱いは……(いま決めてる最中ですね)」 という仕様なら
あ<5pt>い<5pt>う<5pt>えが採択されるのが自然です.
\[x]kanjiskip, \jcharwidowpenalty も,TeX のレジスタとしてではなく, prebreakpenalty 等で用いている,LuaTeX-ja 自前のスタックを用いて管理する.
この方法もを簡単でないような気もします. 今の実装では「現在のスタックレベル」を count レジスタで管理しているので,
{\count200=9801 ... } \count200=1701{ ... \count200=2893}★
↑この★の時点で,グループ終了時の値 (\count200=2893) を知るには?
という,ほぼ同じ問題が残ることになります.
単純に「★の位置での値を見て,1段上のスタックレベルのデータを見る」では, さらに前の \count200=9801 を見るかもしれませんし.
単純に「★の位置での値を見て,1段上のスタックレベルのデータを見る」では,さらに前の \count200=9801 を見るかもしれませんし.
これってどんな場合でしょうか。 例えば:
{\count200=1111 A{BC \cound200=2222 D E} \hbox{FG H}★}
という場合? それとも先のコメントのソースでも「場合によっては」起こり得る?
必要な値(kanjiskip の値/グループレベルの値/スタックレベルの値/そのほか何か)を attribute にしてボックス内のノードに記憶させるという手はありませんかね…。
commit d8c894d779cacc0a30982ff081b9547bc9f06237 (branch: kitagawa_test) で直したつもりです.
# 自信が無いし,まだ master には commit しないので,完了にはしないでおきます.
commit d8c894d779cacc0a30982ff081b9547bc9f06237 (branch: kitagawa_test) で直したつもりです.
master に commit されているので,ひとまず完了としておきます. 修正が完全でなかった場合は,再び open しましょう.
段落/hbox 内に \kanjiskip 等を挿入する処理において, 「box の終了時の \kanjiskip の値」が参照されるのが望ましいのに,実際には box の外の値が参照されています(おそらく初期段階から混入).
簡単な例として,次のソースがあります:
\input luatexja-core.sty \kanjiskip=1pt \hbox{\kanjiskip=10pt あいう} \end