OSDN Git Service

Improved \ltjsetwd etc.
authorHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Fri, 16 May 2014 05:04:50 +0000 (14:04 +0900)
committerHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Fri, 16 May 2014 13:27:39 +0000 (22:27 +0900)
また,主にデバッグ用途のために \dtou を追加した.

src/ltj-direction.lua
src/luatexja.lua
test/test12-ltjtarticle.pdf [new file with mode: 0644]
test/test12-ltjtarticle.tex [new file with mode: 0644]
test/test51-vtest.pdf
test/test51-vtest.tex

index 042470a..16350dd 100644 (file)
@@ -49,6 +49,7 @@ local STCK = luatexja.userid_table.STCK
 local DIR  = luatexja.userid_table.DIR
 local dir_tate = luatexja.dir_table.dir_tate
 local dir_yoko = luatexja.dir_table.dir_yoko
+local dir_dtou = luatexja.dir_table.dir_dtou
 
 
 local get_dir_count 
@@ -113,6 +114,8 @@ local function create_dir_whatsit(hd, gc, new_dir)
       return w
 end
 
+-- hpack_filter, vpack_filter, post_line_break_filter
+-- の結果を組方向を明示するため,先頭に dir_node を設置
 do
    local tex_getcount = tex.getcount
    local function create_dir_whatsit_hpack(h, gc)
@@ -165,18 +168,20 @@ do
 
 end
 
-
+-- dir_node に包む方法を書いたテーブル
 local dir_node_aux
 do
    local get_h =function (w,h,d) return h end
    local get_d =function (w,h,d) return d end
    local get_h_d =function (w,h,d) return h+d end
+   local get_h_d_neg =function (w,h,d) return -h-d end
    local get_h_neg =function (w,h,d) return -h end
    local get_d_neg =function (w,h,d) return -d end
    local get_w_half =function (w,h,d) return 0.5*w end
    local get_w_neg_half =function (w,h,d) return -0.5*w end
    local get_w_neg =function (w,h,d) return -w end
    local get_w =function (w,h,d) return w end
+   local zero = function() return 0 end
    dir_node_aux = {
       [dir_yoko] = { -- yoko を 
         [dir_tate] = { -- tate 中で組む
@@ -184,20 +189,37 @@ do
            height = get_w_half,
            depth  = get_w_half,
            [id_hlist] = {
-              { 'kern', get_h },
               { 'whatsit', sid_save },
               { 'rotate', '0 1 -1 0' },
               { 'kern', get_w_neg_half },
-              { 'box' },
+              { 'box' , get_h },
               { 'kern', get_w_neg_half },
               { 'whatsit', sid_restore },
            },
            [id_vlist] = {
-              { 'kern', get_w},
               { 'whatsit', sid_save },
               { 'rotate', '0 1 -1 0' },
+              { 'box' , get_w_neg },
+              { 'kern', get_h_d_neg},
+              { 'whatsit', sid_restore },
+           },
+        },
+        [dir_dtou] = { -- dtou 中で組む
+           width  = get_h_d,
+           height = get_w,
+           depth  = zero,
+           [id_hlist] = {
+              { 'whatsit', sid_save },
+              { 'rotate', '0 -1 1 0' },
+              { 'kern', get_w_neg },
+              { 'box', get_d_neg },
+              { 'whatsit', sid_restore },
+           },
+           [id_vlist] = {
+              { 'whatsit', sid_save },
+              { 'rotate', '0 -1 1 0' },
+              { 'kern', get_h_d_neg },
               { 'box' },
-              { 'kern', get_h_neg},
               { 'whatsit', sid_restore },
            },
         },
@@ -206,7 +228,7 @@ do
         [dir_yoko] = { -- yoko 中で組む
            width  = get_h_d,
            height = get_w,
-           depth  = function() return 0 end,
+           depth  = zero,
            [id_hlist] = {
               { 'kern', get_d },
               { 'whatsit', sid_save },
@@ -224,12 +246,75 @@ do
               { 'whatsit', sid_restore },
            },
         },
+        [dir_dtou] = { -- dtou 中で組む
+           width  = get_w,
+           height = get_d,
+           depth  = get_h,
+           [id_hlist] = {
+              { 'whatsit', sid_save },
+              { 'rotate', '-1 0 0 -1' },
+              { 'kern', get_w_neg },
+              { 'box' },
+              { 'whatsit', sid_restore },
+           },
+           [id_vlist] = {
+              { 'whatsit', sid_save },
+              { 'rotate', '-1 0 0 -1' },
+              { 'kern', get_h_d_neg },
+              { 'box', get_w_neg },
+              { 'whatsit', sid_restore },
+           },
+         },
+      },
+      [dir_dtou] = { -- dtou を
+        [dir_yoko] = { -- yoko 中で組む
+           width  = get_h_d,
+           height = zero,
+           depth  = get_w,
+           [id_hlist] = {
+              { 'kern', get_h },
+              { 'whatsit', sid_save },
+              { 'rotate', '0 1 -1 0' },
+               { 'kern', get_w_neg },
+              { 'box' },
+              { 'whatsit', sid_restore },
+           },
+           [id_vlist] = {
+               { 'kern', get_w },
+              { 'whatsit', sid_save },
+              { 'rotate', '0 1 -1 0' },
+              { 'box' },
+              { 'kern', get_h_neg },
+              { 'kern', get_d_neg },
+              { 'whatsit', sid_restore },
+           },
+        },
+        [dir_tate] = { -- tate 中で組む
+           width  = get_w,
+           height = get_d,
+           depth  = get_h,
+           [id_hlist] = {
+              { 'whatsit', sid_save },
+              { 'rotate', '-1 0 0 -1' },
+              { 'kern', get_w_neg },
+              { 'box' },
+              { 'whatsit', sid_restore },
+           },
+           [id_vlist] = {-- TODO
+              { 'whatsit', sid_save },
+              { 'rotate', ' -1 0 0 -1' },
+              { 'kern', get_h_d_neg }, 
+              { 'box', get_w_neg },
+              { 'whatsit', sid_restore },
+           },
+        },
       },
    }
 end
 
+-- b に DIR whatsit があればその内容を attr_dir にうつす (1st ret val)
+-- 2nd ret val はその DIR whatsit
 local function get_box_dir(b, default)
-   -- b に DIR whatsit があればその内容を attr_dir にうつす (1st ret val)
    local dir = has_attr(b, attr_dir) or 0
    local bh = getlist(b)
    local c
@@ -245,6 +330,8 @@ local function get_box_dir(b, default)
    return (dir==0 and default or dir), c
 end
 
+-- dir_node に包まれている「本来の中身」を取り出し,
+-- dir_node 自体は DIR whatsit にカプセル化する
 local function unwrap_dir_node(b, head)
    -- head: nil or nil-nil
    -- if head is non-nil, return values are (new head), (next of b), (contents)
@@ -258,8 +345,9 @@ local function unwrap_dir_node(b, head)
    end
    setfield(b, 'list', nil); Dnode.flush_list(bh)
    local d, wh = get_box_dir(bc, 0)
-   if not wh then 
+   if not wh then
       wh = create_dir_whatsit(getlist(bc), 'unwrap', d)
+      setfield(bc, 'head', wh)
    end
    local h = getfield(wh, 'value')
    if h then setfield(b, 'next', h) end
@@ -267,58 +355,24 @@ local function unwrap_dir_node(b, head)
    return nh, nb, bc
 end
 
-
--- \wd, \ht, \dp の代わり
-do
-   local getbox = tex.getbox
-   local function get_box_dim(key, n)
-      local gt = tex.globaldefs; tex.globaldefs = 0
-      local s = getbox(n)
-      if s then
-        s = to_direct(s)
-        local s_dir, wh = get_box_dir(s, dir_yoko)
-        local l_dir = get_dir_count()
-        if s_dir ~= l_dir then
-           local not_found = true
-           for x in traverse(getfield(wh, 'value')) do
-              if l_dir == -has_attr(x, attr_dir) then
-                 tex.setdimen('ltj@tempdima', getfield(x, key))
-                 not_found = false; break
-              end
-           end
-           if not_found then
-              local w = getfield(s, 'width')
-              local h = getfield(s, 'height')
-              local d = getfield(s, 'depth')
-              tex.setdimen('ltj@tempdima', dir_node_aux[s_dir][l_dir][key](w,h,d))
-           end
-        else
-           tex.setdimen('ltj@tempdima', getfield(s, key))
-        end
-      else
-           tex.setdimen('ltj@tempdima', 0)
-      end
-        tex.globaldefs = gt
-   end
-   luatexja.direction.get_box_dim = get_box_dim
-   local function set_box_dim(key)
-      local n = tex.getcount('ltj@tempcnta')
-      local s = getbox(n)
-      if s then
-        s = to_direct(s)
-        local s_dir, wh = get_box_dir(s, dir_yoko)
-        local l_dir = get_dir_count()
-        if s_dir ~= l_dir then
-           print('setting ' .. key .. ' of different direction box is not supported')
-           -- TODO
-        else
-           setfield(s, key, tex.getdimen('ltj@tempdima'))
-        end
-      end
-   end
-   luatexja.direction.set_box_dim = set_box_dim
+local function create_dir_node(b, b_dir, new_dir)
+   local info = dir_node_aux[b_dir][new_dir]
+   local w = getfield(b, 'width')
+   local h = getfield(b, 'height')
+   local d = getfield(b, 'depth')
+   local db = node_new(getid(b))
+   set_attr(db, attr_dir, -new_dir)
+   set_attr(db, attr_icflag, PROCESSED)
+   set_attr(b, attr_icflag, PROCESSED)
+   setfield(db, 'dir', getfield(b, 'dir'))
+   setfield(db, 'shift', 0)
+   setfield(db, 'width',  info.width(w,h,d))
+   setfield(db, 'height', info.height(w,h,d))
+   setfield(db, 'depth',  info.depth(w,h,d))
+   return db
 end
 
+-- 異方向のボックスの処理
 local make_dir_whatsit
 do
    make_dir_whatsit = function (head, b, new_dir, origin)
@@ -326,7 +380,6 @@ do
       -- origin: コール元 (for debug)
       -- return value: (new head), (next of b), (new b), (is_b_dir_node)
       -- (new b): b か dir_node に被せられた b
-      local box_dir = has_attr(b, attr_dir) or 0
       local bh = getlist(b)
       local box_dir, dn =  get_box_dir(b, ltjs.list_dir)
       -- 既に b の中身にあるwhatsit
@@ -335,45 +388,43 @@ do
       elseif  -box_dir == new_dir  then
         return head, node_next(b), b, true
       else
-        local nh, nb, ret, flag
-        if box_dir < 0 then
-           -- b itself is a dir node; just unwrap
-           nh, nb, ret = unwrap_dir_node(b,head)
-           flag = false
-        else
-           local bid = getid(b)
-           local db = node_new(bid) -- dir node
-           nh, nb =  insert_before(head, b, db), nil
-           nh, nb = node_remove(nh, b)
-           local w = getfield(b, 'width')
-           local h = getfield(b, 'height')
-           local d = getfield(b, 'depth')
-           local info = dir_node_aux[box_dir][new_dir]
-           set_attr(db, attr_dir, -new_dir)
-           set_attr(b, attr_icflag, PROCESSED)
-           set_attr(db, attr_icflag, PROCESSED)
-           setfield(db, 'dir', getfield(b, 'dir'))
-           setfield(db, 'shift', 0)
-           setfield(db, 'width',  info.width(w,h,d))
-           setfield(db, 'height', info.height(w,h,d))
-           setfield(db, 'depth',  info.depth(w,h,d))
-           local db_head, db_tail  = nil
-           for _,v in ipairs(info[bid]) do
-              local cmd, arg, nn = v[1], v[2]
-              if cmd=='kern' then
-                 nn = node_new(id_kern)
-                 setfield(nn, 'kern', arg(w, h, d))
-              elseif cmd=='whatsit' then
-                 nn = node_new(id_whatsit, arg)
-              elseif cmd=='rotate' then
-                 nn = node_new(id_whatsit, sid_matrix)
-                 setfield(nn, 'data', arg)
-              elseif cmd=='box' then
-                 nn = b; setfield(b, 'next', nil)
-              end
-              if db_head then
-                 insert_after(db_head, db_tail, nn)
-                 db_tail = nn
+         local nh, nb, ret, flag
+        if box_dir < 0 then -- unwrap
+            nh, nb, ret = unwrap_dir_node(b,head)
+            flag = false
+         else
+            local db
+            local dnh = getfield(dn, 'value')
+            for x in traverse(dnh) do
+               if has_attr(x, attr_dir) == -new_dir then
+                  setfield(dn, 'value', to_node(node_remove(dnh, x)))
+                  db=x; break
+               end
+            end
+            db = db or create_dir_node(b, box_dir, new_dir)
+            local w = getfield(b, 'width')
+            local h = getfield(b, 'height')
+            local d = getfield(b, 'depth')
+            nh, nb =  insert_before(head, b, db), nil
+            nh, nb = node_remove(nh, b)
+            local db_head, db_tail  = nil
+            for _,v in ipairs(dir_node_aux[box_dir][new_dir][getid(b)]) do
+               local cmd, arg, nn = v[1], v[2]
+               if cmd=='kern' then
+                  nn = node_new(id_kern)
+                  setfield(nn, 'kern', arg(w, h, d))
+               elseif cmd=='whatsit' then
+                  nn = node_new(id_whatsit, arg)
+               elseif cmd=='rotate' then
+                  nn = node_new(id_whatsit, sid_matrix)
+                  setfield(nn, 'data', arg)
+               elseif cmd=='box' then
+                  nn = b; setfield(b, 'next', nil)
+                  if arg then setfield(nn, 'shift', arg(w,h,d)) end
+               end
+               if db_head then
+                  insert_after(db_head, db_tail, nn)
+                  db_tail = nn
               else
                  db_head, db_tail = nn, nn
               end
@@ -405,6 +456,100 @@ do
                              process_dir_node, 'ltj.dir_whatsit', 10001)
 end
 
+-- \wd, \ht, \dp の代わり
+do
+   local getbox = tex.getbox
+   local function get_box_dim_common(key, s, l_dir)
+      local s_dir, wh = get_box_dir(s, dir_yoko)
+      if s_dir ~= l_dir then
+         local not_found = true
+         for x in traverse(getfield(wh, 'value')) do
+            if l_dir == -has_attr(x, attr_dir) then
+               tex.setdimen('ltj@tempdima', getfield(x, key))
+               not_found = false; break
+            end
+         end
+         if not_found then
+            local w = getfield(s, 'width')
+            local h = getfield(s, 'height')
+            local d = getfield(s, 'depth')
+            tex.setdimen('ltj@tempdima', 
+                         dir_node_aux[s_dir][l_dir][key](w,h,d))
+         end
+      else
+         tex.setdimen('ltj@tempdima', getfield(s, key))
+      end
+   end
+   local function get_box_dim(key, n)
+      local gt = tex.globaldefs; tex.globaldefs = 0
+      local s = getbox(n)
+      if s then
+         local l_dir = get_dir_count()
+         s = to_direct(s)
+         local b_dir = has_attr(s, attr_dir) or 0
+         if b_dir>=0 then
+            get_box_dim_common(key, s, l_dir)
+         elseif b_dir==-l_dir then -- dir_node case 1
+            tex.setdimen('ltj@tempdima', getfield(s, key))
+         else
+            get_box_dim_common(
+               key, 
+               node_next(node_next(node_next(node_next(getlist(s))))),
+               l_dir)
+         end
+      else
+         tex.setdimen('ltj@tempdima', 0)
+      end
+      tex.globaldefs = gt
+   end
+   luatexja.direction.get_box_dim = get_box_dim
+
+   local function set_box_dim_common(key, s, l_dir)
+      local s_dir, wh = get_box_dir(s, dir_yoko)
+      if s_dir ~= l_dir then
+         if not wh then
+            wh = create_dir_whatsit(getlist(s), 'set_box_dim', s_dir)
+            setfield(s, 'head', wh)
+         end
+         local db
+         local dnh = getfield(wh, 'value')
+         for x in traverse(dnh) do
+            if has_attr(x, attr_dir)==-l_dir then
+               db = x; break
+            end
+         end
+         if not db then
+            db = create_dir_node(s, s_dir, l_dir)
+            setfield(db, 'next', dnh)
+            setfield(wh, 'value',to_node(db))
+         end
+         setfield(db, key, tex.getdimen('ltj@tempdima'))
+      else
+         setfield(s, key, tex.getdimen('ltj@tempdima'))
+      end
+   end
+   local function set_box_dim(key)
+      local n = tex.getcount('ltj@tempcnta')
+      local s = getbox(n)
+      if s then
+        local l_dir = get_dir_count()
+        s = to_direct(s)
+         local b_dir = has_attr(s, attr_dir) or 0
+         if b_dir>=0 then
+            set_box_dim_common(key, s, l_dir)
+            elseif b_dir == -l_dir then
+               setfield(s, key, tex.getdimen('ltj@tempdima'))
+         else
+            set_box_dim_common(
+               key, 
+               node_next(node_next(node_next(node_next(getlist(s))))),
+               l_dir)
+         end
+      end
+   end
+   luatexja.direction.set_box_dim = set_box_dim
+end
+
 -- 縦書き用字形への変換テーブル
 local font_vert_table = {} -- key: fontnumber
 do
index 129fe26..c22e64a 100644 (file)
@@ -63,6 +63,7 @@ userid_table.DNODE= luatexbase.newuserwhatsitid('dir_node',    'luatexja')  -- d
 
 local dir_table = {}
 luatexja.dir_table = dir_table
+dir_table.dir_dtou = 1
 dir_table.dir_tate = 3
 dir_table.dir_yoko = 4
 
diff --git a/test/test12-ltjtarticle.pdf b/test/test12-ltjtarticle.pdf
new file mode 100644 (file)
index 0000000..8fcb2ad
Binary files /dev/null and b/test/test12-ltjtarticle.pdf differ
diff --git a/test/test12-ltjtarticle.tex b/test/test12-ltjtarticle.tex
new file mode 100644 (file)
index 0000000..bb7739a
--- /dev/null
@@ -0,0 +1,44 @@
+%#!lualatex
+\documentclass{ltjtarticle}
+\usepackage[margin=20mm]{geometry}
+
+\makeatletter
+\newif\ifnot@advanceline
+\newskip\rensujiskip
+\rensujiskip=0.25\chs plus.25\zw minus.25\zw
+\DeclareRobustCommand\rensuji{%
+  \@ifstar{\not@advancelinetrue\@rensuji}{\@rensuji}}
+\def\@rensuji{\@ifnextchar[{\@@rensuji}{\@@rensuji[c]}}
+\def\@@rensuji[#1]#2{\ifydir\hbox{#2}\else
+  \hskip\rensujiskip
+  \ifvmode\leavevmode\fi
+  \ifnot@advanceline\not@advancelinefalse\else
+    \setbox\z@\hbox{\yoko#2}%
+    \@tempdima\ht\z@ \advance\@tempdima\dp\z@
+    \if #1c\relax\vrule\@width\z@ \@height.5\@tempdima \@depth.5\@tempdima
+    \else\if #1r\relax\vrule\@width\z@\@height\z@ \@depth\@tempdima
+    \else\vrule\@width\z@ \@height\@tempdima \@depth\z@
+    \fi\fi
+  \fi
+  \if #1c\relax\hbox to1zw{\yoko\hss#2\hss}%
+  \else\if #1r\relax\vbox{\hbox to1zw{\yoko\hss#2}}%
+  \else\vtop{\hbox to1zw{\yoko#2\hss}}%
+  \fi\fi
+  \hskip\rensujiskip
+\fi}
+\let\Rensuji\rensuji
+\let\prensuji\rensuji
+
+\begin{document}
+酵素(こうそ)とは、生体で起こる化学反応に対して触媒として機能する分子である。酵素によって触媒される反応を“酵素的”反応という。
+
+酵素は生物が物質を消化する段階から吸収・輸送・代謝・排泄に至るまでのあらゆる過程に関与しており、生体が物質をj変化させて利用するのに欠かせない。したがって、酵素は生化学研究における一大分野であり、早い段階から研究対象になっている。
+
+多くの酵素は生体内で作り出されるタンパク質を基にして構成されている。したがって、生体内での生成や分布の特性、熱や pH によって変性して活性を失う(失活)といった特性などは、他のタンパク質と同様である。
+
+生体を機関に例えると、核酸塩基配列が表すゲノムが設計図に相当するのに対して、生体内における酵素は組立て工具に相当する。酵素の特徴である作用する物質(基質)をえり好みする性質(基質特異性)と目的の反応だけを進行させる性質(反応選択性)などによって、生命維持に必要なさまざまな化学変化を起こさせるのである。
+
+古来から人類は発酵という形で酵素を利用してきた。今日では、酵素の利用は食品製造だけにとどまらず、化学工業製品の製造や日用品の機能向上など、広い分野に応用されている。医療においても、酵素量を検査して診断したり、酵素作用を調節する治療薬を用いるなど、酵素が深く関っている。
+
+
+\end{document}
\ No newline at end of file
index d92a08e..9b94069 100644 (file)
Binary files a/test/test51-vtest.pdf and b/test/test51-vtest.pdf differ
index 77ba553..a325f59 100644 (file)
 
 \tentgt
 
+\def\H{\vrule width 2pt height 10pt depth 0pt%
+\vrule width 4pt height 0pt depth 4pt}
+
+\message{^^JTATE, DTOU IN YOKO (HMODE))^^J}
 \hbox{\yoko
-横水平Hxy\hbox{\yoko 横水平Hxy}かき◆
-\hbox{\tate 縦水平Hxy}◆おおおお
-\vbox{\yoko\hsize=30mm 横垂直Hxyああああああああああ}かき◆
-\vbox{\tate\hsize=30mm  縦垂直Hxy\hfill ああ\break ああああああああ}◆ああああ
+  横水平\H\vrule\hbox{\yoko 横水平\H }\vrule かき◆
+  \vrule\hbox{\tate 縦水平\H }◆おおおお\vrule
+  \vbox{\yoko\hsize=30mm 横垂直\H ああああああああああ\hfill\H}かき◆%
+  \vrule
+  \vbox{\tate\hsize=30mm 縦垂直\H ああああああああああ\hfill\H}%
+  \vrule ◆ああああ
+}
+\hbox{\yoko\vrule
+  横水平\H\vrule\hbox{\dtou 下水平\H }\vrule ◆おおおお
+  \H\vrule
+  \vbox{\dtou\hsize=30mm 下垂直\H ああああああああああ\hfill\H}%
+  \vrule かき◆
 }
 \vfill\eject
+
+\message{^^JYOKO, DTOU IN TATE (HMODE)^^J}
+\leavevmode
+\hbox{\tate
+縦水平\H\vrule \hbox{\yoko 横水平\H }\vrule かき◆\vrule
+\hbox{\tate 縦水平\H }\vrule◆おおおお\H\vrule
+\vbox{\yoko\hsize=30mm 横垂直\H ああああああああああ\hfill\H}\vrule
+かき◆\H\vrule
+\vbox{\tate\hsize=30mm 縦垂直\H ああああああああああ\hfill\H}\vrule
+◆ああああ}
 \hbox{\tate
-縦水平Hxy\hbox{\yoko 横水平Hxy}かき◆
-\hbox{\tate 縦水平Hxy}◆おおおお
-\vbox{\yoko\hsize=30mm 横垂直Hxyああああああああああ}かき◆
-\vbox{\tate\hsize=30mm  縦垂直Hxy\hfill ああ\break ああああああああ}◆ああああ}
+縦水平\H\vrule\hbox{\dtou 下水平\H }\vrule ◆おおおお\H\vrule
+\vbox{\dtou\hsize=30mm 下垂直\H ああああああああああ\hfill\H}%
+\vrule\H ◆ああああ}
+
+\vfill\eject
+
+\message{^^JYOKO, TATE IN DTOU (HMODE)^^J}
+\leavevmode
+\hbox{\dtou
+下水平\H\vrule\hbox{\yoko 横水平\H }\vrule かき◆\H\vrule
+\hbox{\tate 縦水平\H }\vrule ◆おおおお\H\vrule
+\vbox{\yoko\hsize=30mm 横垂直\H ああああああああああ\hfill\H}%
+\vrule かき◆あおう\H\vrule
+\vbox{\tate\hsize=30mm 縦垂直\H ああああああああああ\hfill\H}%
+\vrule ◆ああああ
+}
+\hbox{\dtou
+下水平\H\vrule\hbox{\dtou 下水平\H }\vrule◆おおおお\vrule
+\vbox{\dtou\hsize=30mm 下垂直\H ああああああああああ\hfill\H}%
+\vrule ◆ああああ}
 
 
 \vfill\eject
 
 
+\message{^^JTATE, DTOU IN YOKO (VMODE)^^J}
 \setbox0=\vbox{\yoko\hsize=100mm
-横垂直Hxy\hbox{\yoko 横水平Hxy}かき◆
+横垂直\H\vrule \hbox{\yoko 横水平\H }\vrule\H かき◆
 これは,意味のないサンプルテキストです.
-\hbox{\tate 縦水平Hxy}◆おおおお
+\vrule\hbox{\tate 縦水平\H }\vrule\H おおおお
+これは,意味のないサンプルテキストです.\vrule
+\vbox{\yoko\hsize=50mm 横垂直\H ああああああああああ%
+  あああああああああ\hfill\H}%
+\vrule\H かき◆
+これは,意味のないサンプルテキストです.\vrule
+\vbox{\tate\hsize=50mm 縦垂直\H ああああああああああ%
+  あああああああああ\hfill\H}%
+\vrule\H ◆ああああ
+これは,意味のないサンプルテキストです.\vrule
+\hbox{\dtou 下水平\H }\vrule\H おおおお
 これは,意味のないサンプルテキストです.
-\vbox{\yoko\hsize=50mm 横垂直Hxyあああああああああああああああああああ}かき◆
-これは,意味のないサンプルテキストです.
-\vbox{\tate\hsize=50mm 縦垂直Hxyあああああああああああああああああああ}◆ああああ
-これは,意味のないサンプルテキスト\hbox{\tate 縦水平Hxy}◆おおおおです.
+\vrule\vbox{\dtou\hsize=50mm 縦垂直\H ああああああああああ%
+  あああああああああ\hfill\H}%
+\vrule\H これは,意味のないサンプルテキストです.
 }
 \copy0
-%{\showboxbreadth10000\showboxdepth10000
-%\showbox0}
-
 \vfill\eject
+
+\message{^^JYOKO, DTOU IN TATE (VMODE)^^J}
 \vbox{\tate\hsize=100mm
-◆◆◆Hxy\hbox{\yoko 横水平Hxy}かき◆
+縦垂直\H\vrule\hbox{\yoko 横水平\H }\vrule\H かき◆
+これは,意味のないサンプルテキストです.
+\vrule\hbox{\tate 縦水平\H }\vrule\H おおおお
+これは,意味のないサンプルテキストです.\vrule
+\vbox{\yoko\hsize=50mm 横垂直\H ああああああああああ%
+  あああああああああ\hfill\H}%
+\vrule\H かき◆
+これは,意味のないサンプルテキストです.\vrule
+\vbox{\tate\hsize=50mm 縦垂直\H ああああああああああ%
+  あああああああああ\hfill\H}%
+\vrule\H ◆ああああ
+これは,意味のないサンプルテキストです.\vrule
+\hbox{\dtou 下水平\H }\vrule\H おおおお
 これは,意味のないサンプルテキストです.
-\hbox{\tate 縦水平Hxy}◆おおおお
+\vrule\vbox{\dtou\hsize=50mm 縦垂直\H ああああああああああ%
+  あああああああああ\hfill\H}%
+\vrule\H これは,意味のないサンプルテキストです.
+}
+\vfill\eject
+
+\message{^^JYOKO, TATE IN DTOU (VMODE)^^J}
+\vbox{\dtou\hsize=100mm
+下垂直\H\vrule\hbox{\yoko 横水平\H }\vrule\H かき◆
 これは,意味のないサンプルテキストです.
-\vbox{\yoko\hsize=50mm 横垂直Hxyあああああああああああああああああああ}かき◆
+\vrule\hbox{\tate 縦水平\H }\vrule\H おおおお
+これは,意味のないサンプルテキストです.\vrule
+\vbox{\yoko\hsize=50mm 横垂直\H ああああああああああ%
+  あああああああああ\hfill\H}%
+\vrule\H かき◆
+これは,意味のないサンプルテキストです.\vrule
+\vbox{\tate\hsize=50mm 縦垂直\H ああああああああああ%
+  あああああああああ\hfill\H}%
+\vrule\H ◆ああああ
+これは,意味のないサンプルテキストです.\vrule
+\hbox{\dtou 下水平\H }\vrule\H おおおお
 これは,意味のないサンプルテキストです.
-\vbox{\tate\hsize=50mm  縦垂直Hxyあああああああああああああああああああ}◆ああああ
-これは,意味のないサンプルテキスト\hbox{\tate 縦水平Hxy}◆おおおお
-です.
+\vrule\vbox{\dtou\hsize=50mm 縦垂直\H ああああああああああ%
+  あああああああああ\hfill\H}%
+\vrule\H これは,意味のないサンプルテキストです.
 }
 
 
@@ -204,8 +281,8 @@ abc&かきくけこ&xyz\cr}}%
 \setbox1=\hbox{\yoko\box0}
 \unhcopy1
 \setbox1=\lastbox %% box1: dir_node
-\dp1=100pt
-\setbox2=\hbox{\tate \copy1}%% unwrap
+\ltjsetdp1=100pt
+\setbox2=\hbox{\tate \ltjsetdp1=42pt\copy1}%% unwrap
 
 {\obeylines\tentt
 \directlua{luatexja.ext_show_node_list(tex.box[2], 'A> ', tex.print)}}
@@ -214,7 +291,6 @@ abc&かきくけこ&xyz\cr}}%
 {\obeylines\tentt
 \directlua{luatexja.ext_show_node_list(tex.box[1], 'B> ', tex.print)}}
 
-\the\ltjgetdp{1}
-
+\the\ltjgetdp{1}\hbox{\tate \the\ltjgetdp{1}}
 \end