自己レスです.\vtop の処理と,組方向を格納する whatsit とが干渉しています.
チケット詳細に述べた 2 行では,「リストの先端に組方向を示す whatsit を挿入」する処理を 行なっています.一方,LuaTeX の \vtop の部分のコード (tex/packaging.w) は
/* Readjust the height and depth of |cur_box|, for \.{\\vtop} */
/* The height of a `\.{\\vtop}' box is inherited from the first item on its list,
if that item is an |hlist_node|, |vlist_node|, or |rule_node|; otherwise
the \.{\\vtop} height is zero.
*/
h = 0;
p = list_ptr(cur_box);
if (p != null)
if (type(p) <= rule_node)
h = height(p);
depth(cur_box) = depth(cur_box) - h + height(cur_box);
height(cur_box) = h;
となっており,これによって「\vtop によるボックスは常に高さ0」という状況を引き起こしてしまっています.
# whatsit の場所を \vtop 時だけ変えるという手がありますが,
# このようにどんどん場合分けを追加していくのは手に負えなくなりそうな気もしてきます.
もう一つ.
\vbox{\tate\leavevmode ...}
では,\tate で「現在のリストの組方向が縦組に変わった」ことを示す whatsit が
リスト先頭に追加されます.このため,次の \leavevmode において
\parskip グルーが追加されてしまいます.
whatsit で組方向を管理するのではなく, tex.nest.ptr を添字とし,配列 tex.nest[] と類似の方法で管理しようとしているのですが,うまくいきません.
問題になるのは,\hbox{}, \vbox{} などの中身のノードリストが空であるようなボックスです. 中身のノードが空のボックスに対しては,hpack_filter, vpack_filter, hyphenate といったコールバックが適用されないので, これらのコールバックだけでスタックを作ると
\yoko
\hbox{\tate}
\hbox{...} ←2行目の設定内容が引き継がれ,縦組扱いになってしまう
のような状況がおこってしまいます.
1379fbf6 で直したつもりです.結局前コメントに述べた tex.nest.ptr を利用した管理は諦め,次のようにしました.副作用が出ていなければ良いですが…….
ひとまず完了としておきます.
kitagawa_tfont ブランチで作業している縦組対応版では,ltj-direction.lua に
luatexbase.add_to_callback('vpack_filter', create_dir_whatsit_vbox, 'ltj.create_dir_whatsit', 1) luatexbase.add_to_callback('post_linebreak_filter', create_dir_whatsit_parbox, 'ltj.create_dir_whatsit', 10000)という記述がありますが,ここをコメントアウトするか否かによって 以下のソースで出力される \box1 の高さが異なってきます:%#!luajitlatex \documentclass{article} \usepackage{luatexja,multienum} \begin{document} \setbox1=\vbox{a% \begin{multienumerate}\mitemx{9}\end{multienumerate}} \showboxbreadth20 \showboxdepth1 \tracingonline1 \showbox1 \end{document}具体的には,2行の片方でも有効になっている場合は
となり,両方コメントアウトすると となります.また,multienumerate でなく普通の enumerate で行うと,両方有効になっていても
となりました.