Tíquete #25121

和文組版処理で,「hbox の直後」の \kanjiskip の値を参照している

: 2011-05-09 22:50 Última Atualização: 2011-06-12 21:01

Relator:
Dono:
Tipo:
Estado:
Fechado
Componente:
(Nenhum)
Marcos:
(Nenhum)
Prioridade:
5 - Medium
Gravidade:
5 - Medium
Resolução:
Fixed
Arquivo:
Nenhum

Details

段落/hbox 内に \kanjiskip 等を挿入する処理において, 「box の終了時の \kanjiskip の値」が参照されるのが望ましいのに,実際には box の外の値が参照されています(おそらく初期段階から混入).

簡単な例として,次のソースがあります:

\input luatexja-core.sty
\kanjiskip=1pt
\hbox{\kanjiskip=10pt あいう}
\end

Ticket History (3/9 Histories)

2011-05-09 22:50 Updated by: h7k
  • New Ticket "和文組版処理で,「hbox の直後」の \kanjiskip の値を参照している" created
2011-05-10 14:23 Updated by: h7k
Comentário

LuaTeX のソースコードを調べてみました.

  • \hbox{ ... } のグループ閉じの処理では,
    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).
  • package() は,ボックスの中身であるリストを,1つの hbox にまとめる処理であり,
    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).
  • hpack_filter による割り込みが入るのは filtered_hpack() のところであるから, hpack_filter 内で tex.getcount 等を用いて取得した値はボックスの外での値である.

一方,pTeX では,[X] (\xkanjiskip) 挿入処理を行う adjust_hlist (luatexja-xkanji.lua に対応)は, packaging() の前に実行される(§1097):

hbox_group: begin adjust_hlist(head,false); package(0);
  end;
そのため,adjust_hlist では「ボックス内の \[x]kanjiskip の値」を簡単に取得することができる.


これを踏まえると,良さそうな解決策として,

\[x]kanjiskip, \jcharwidowpenalty も,TeX のレジスタとしてではなく, prebreakpenalty 等で用いている,LuaTeX-ja 自前のスタックを用いて管理する.

があります(採用すれば,pTeX と同じように文法の \kanjiskip, \xkanjiskip, \jcharwidowpenalty 命令は廃止). ひとまずは,自分用のブランチにこの方針で書いてみようと思います.

2011-05-10 19:04 Updated by: kuroky
Comentário

チケットの詳細で書かれていることって,

\input luatexja-core.sty
\kanjiskip=1pt
\hbox{\kanjiskip=10pt あい\kanjiskip=5pt うえ}
\end
という状態のとき,
あ<5pt>い<5pt>う<5pt>え
となって欲しいということでしょうか?

2011-05-10 19:12 Updated by: h7k
Comentário

あ<5pt>い<5pt>う<5pt>え となって欲しいということでしょうか?

はい.私はこれを望んでいました. しかし今の実装では,

あ<1pt>い<1pt>う<1pt>え

となります.

# \kanjiskip を段落ごとの設定としてではない実装,例えば上の例ならば
# あ<10pt>い<5pt>う<5pt>え
#という組版結果を与えるという実装もありうるかもしれませんが…….

2011-05-10 19:19 Updated by: kuroky
Comentário

1pt が透過してしまうのはおかしい気がしますね. 段落内ではどんな方法でも変更できなくなってしまうので.

あ<5pt>い<5pt>う<5pt>え

となってほしいか

あ<10pt>い<5pt>う<5pt>え
となってほしいかは,仕様をきちんと書けばどちらでもいいと思います.

「\kanjiskip は段落またはボックスの中で共通とし,各段落またはボックスの中で一番最後に設定されたものが適用される.段落やボックスごとに変更してもよい.境界での扱いは……(いま決めてる最中ですね)」 という仕様なら

あ<5pt>い<5pt>う<5pt>え
が採択されるのが自然です.

2011-05-10 20:24 Updated by: h7k
Comentário

\[x]kanjiskip, \jcharwidowpenalty も,TeX のレジスタとしてではなく, prebreakpenalty 等で用いている,LuaTeX-ja 自前のスタックを用いて管理する.

この方法もを簡単でないような気もします. 今の実装では「現在のスタックレベル」を count レジスタで管理しているので,

グループが終了した後,さっきまでいたグループの終了時のスタックレベル/count レジスタの値を知るにはどうすればよいか?
{\count200=9801 ... } \count200=1701{ ... \count200=2893}★ 
↑この★の時点で,グループ終了時の値 (\count200=2893) を知るには?

という,ほぼ同じ問題が残ることになります.

単純に「★の位置での値を見て,1段上のスタックレベルのデータを見る」では, さらに前の \count200=9801 を見るかもしれませんし.

2011-05-10 22:57 Updated by: zrbabbler
Comentário

単純に「★の位置での値を見て,1段上のスタックレベルのデータを見る」では,さらに前の \count200=9801 を見るかもしれませんし.

これってどんな場合でしょうか。 例えば:

{\count200=1111 A{BC \cound200=2222 D E} \hbox{FG H}★}

という場合? それとも先のコメントのソースでも「場合によっては」起こり得る?

必要な値(kanjiskip の値/グループレベルの値/スタックレベルの値/そのほか何か)を attribute にしてボックス内のノードに記憶させるという手はありませんかね…。

2011-05-11 10:46 Updated by: h7k
  • Resolução Update from Nenhum to Fixed
Comentário

commit d8c894d779cacc0a30982ff081b9547bc9f06237 (branch: kitagawa_test) で直したつもりです.
# 自信が無いし,まだ master には commit しないので,完了にはしないでおきます.

2011-06-12 21:01 Updated by: h7k
  • Estado Update from Aberto to Fechado
  • Ticket Close date is changed to 2011-06-12 21:01
Comentário

commit d8c894d779cacc0a30982ff081b9547bc9f06237 (branch: kitagawa_test) で直したつもりです.

master に commit されているので,ひとまず完了としておきます. 修正が完全でなかった場合は,再び open しましょう.

Attachment File List

No attachments

Editar

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login