Ticket #33832

multienumerate の出力が縦組対応版でおかしい

Open Date: 2014-05-20 16:02 Last Update: 2014-06-09 10:41

Reporter:
Owner:
(None)
Type:
Status:
Closed
Component:
(None)
MileStone:
(None)
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
None
File:
None

Details

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行の片方でも有効になっている場合は

\vbox(38.74998+0.0)x345.0, direction TLT
(省略)
.\glue(\baselineskip) 12.0
となり,両方コメントアウトすると
\vbox(32.30554+0.0)x345.0, direction TLT
(省略)
.\glue(\baselineskip) 5.55556
となります.

また,multienumerate でなく普通の enumerate で行うと,両方有効になっていても

\vbox(32.30554+0.0)x345.0, direction TLT
(省略)
.\glue(\baselineskip) 5.55556
となりました.

Ticket History (3/7 Histories)

2014-05-20 16:02 Updated by: h7k
  • New Ticket "multienumerate の出力が縦組対応版でおかしい" created
2014-05-20 16:19 Updated by: h7k
Comment

自己レスです.\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 時だけ変えるという手がありますが,
# このようにどんどん場合分けを追加していくのは手に負えなくなりそうな気もしてきます.

2014-05-20 20:13 Updated by: h7k
Comment

もう一つ.

\vbox{\tate\leavevmode ...}
では,\tate で「現在のリストの組方向が縦組に変わった」ことを示す whatsit が リスト先頭に追加されます.このため,次の \leavevmode において \parskip グルーが追加されてしまいます.

2014-05-21 21:29 Updated by: h7k
Comment

whatsit で組方向を管理するのではなく, tex.nest.ptr を添字とし,配列 tex.nest[] と類似の方法で管理しようとしているのですが,うまくいきません.

問題になるのは,\hbox{}, \vbox{} などの中身のノードリストが空であるようなボックスです. 中身のノードが空のボックスに対しては,hpack_filter, vpack_filter, hyphenate といったコールバックが適用されないので, これらのコールバックだけでスタックを作ると

\yoko
\hbox{\tate}
\hbox{...} ←2行目の設定内容が引き継がれ,縦組扱いになってしまう
のような状況がおこってしまいます.

2014-05-22 06:17 Updated by: h7k
Comment

1379fbf6 で直したつもりです.結局前コメントに述べた tex.nest.ptr を利用した管理は諦め,次のようにしました.副作用が出ていなければ良いですが…….

  • 「現在の組方向」を格納する dir whatsit を,\vtop の場合は 2 番目に配置するようにした
  • (内部)垂直モードのリストの先頭部が,dir whatsit → parskip となっていた場合,parskip グルーも削除する.
2014-06-09 10:41 Updated by: h7k
Comment

ひとまず完了としておきます.

2014-06-09 10:41 Updated by: h7k
  • Status Update from Open to Closed
  • Ticket Close date is changed to 2014-06-09 10:41

Attachment File List

No attachments

Edit

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