OSDN Git Service

Dnode -> node.direct, stopped to use 'spec'
authorHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Sun, 3 Apr 2016 04:31:10 +0000 (13:31 +0900)
committerHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Sun, 3 Apr 2016 04:31:10 +0000 (13:31 +0900)
This code does not work with LuaTeX r5903.
(bug in node.direce.setglue???)

src/addons/luatexja-adjust.sty
src/ltj-adjust.lua
src/ltj-adjust_85.lua [new file with mode: 0644]
src/ltj-jfmglue.lua
src/ltj-ruby.lua
src/luatexja.lua

index 1ba9cda..0e10c45 100644 (file)
@@ -64,7 +64,7 @@
   \expandafter\let\csname ifltj@in@latex\expandafter\endcsname
     \csname iftrue\endcsname
   \NeedsTeXFormat{LaTeX2e}
   \expandafter\let\csname ifltj@in@latex\expandafter\endcsname
     \csname iftrue\endcsname
   \NeedsTeXFormat{LaTeX2e}
-  \ProvidesPackage{luatexja-adjust}[2014/05/13]
+  \ProvidesPackage{luatexja-adjust}[2016/04/03]
 \fi                             %</LaTeX>
 
 % Load core module if not yet.
 \fi                             %</LaTeX>
 
 % Load core module if not yet.
 %%------------------
 
 %! Main part of luatexja-adjust
 %%------------------
 
 %! Main part of luatexja-adjust
-\RequireLuaTeXjaSubmodule{adjust}
+\ifnum\luatexversion>90
+  \RequireLuaTeXjaSubmodule{adjust}
+\else
+  \RequireLuaTeXjaSubmodule{adjust_85}
+\fi
 
 % enable/disable ``advanced'' line adjustment
 \protected\def\ltjdisableadjust{\directlua{luatexja.adjust.disable_cb()}}
 
 % enable/disable ``advanced'' line adjustment
 \protected\def\ltjdisableadjust{\directlua{luatexja.adjust.disable_cb()}}
index db85d8f..821099d 100644 (file)
@@ -1,5 +1,5 @@
 --
 --
--- luatexja/otf.lua
+-- ltj-adjust.lua
 --
 luatexja.load_module('jfont');     local ltjf = luatexja.jfont
 luatexja.load_module('jfmglue');   local ltjj = luatexja.jfmglue
 --
 luatexja.load_module('jfont');     local ltjf = luatexja.jfont
 luatexja.load_module('jfmglue');   local ltjj = luatexja.jfmglue
@@ -12,10 +12,7 @@ local to_direct = node.direct.todirect
 local setfield = node.direct.setfield
 local setglue = luatexja.setglue
 local getfield = node.direct.getfield
 local setfield = node.direct.setfield
 local setglue = luatexja.setglue
 local getfield = node.direct.getfield
-local is_zero_glue = node.direct.is_zero_glue or
-   function(g)
-      return (getfield(g,'width')==0)and (getfield(g,'stretch')==0)and(getfield(g,'shrink')==0)
-   end
+local is_zero_glue = node.direct.is_zero_glue
 local getlist = node.direct.getlist
 local getid = node.direct.getid
 local getfont = node.direct.getfont
 local getlist = node.direct.getlist
 local getid = node.direct.getid
 local getfont = node.direct.getfont
@@ -87,7 +84,6 @@ local function get_stretched(q, go, gs)
 end
 
 local res = {}
 end
 
 local res = {}
-local gs_used_line = {}
 local function get_total_stretched(p, line)
    local go, gf, gs
       = getfield(p, 'glue_order'), getfield(p, 'glue_set'), getfield(p, 'glue_sign')
 local function get_total_stretched(p, line)
    local go, gf, gs
       = getfield(p, 'glue_order'), getfield(p, 'glue_set'), getfield(p, 'glue_sign')
@@ -102,23 +98,6 @@ local function get_total_stretched(p, line)
       elseif ic == XKANJI_SKIP_JFM  then ic = XKANJI_SKIP
       end
       if   type(res[ic]) == 'number' then
       elseif ic == XKANJI_SKIP_JFM  then ic = XKANJI_SKIP
       end
       if   type(res[ic]) == 'number' then
-        -- kanjiskip, xkanjiskip は段落内で spec を共有しているが,
-        -- それはここでは望ましくないので,各 glue ごとに異なる spec を使う.
-        -- 本当は各行ごとに glue_spec を共有させたかったが,安直にやると
-        -- ref_count が 0 なので Double-free が発生する.どうする?
-        -- JFM グルーはそれぞれ異なる glue_spec を用いているので,問題ない.
-        if (ic == KANJI_SKIP or ic == XKANJI_SKIP) and getsubtype(q)==0 then
-           local qs = getfield(q, 'spec')
-           if is_zero_glue(q) then
-              if (gs_used_line[qs] or 0)<line  then
-                 setfield(q, 'spec', node_copy(qs))
-                 local f = node_new(id_glue); setfield(f, 'spec', qs); node_free(f)
-                 -- decrese qs's reference count
-              else
-                 gs_used_line[qs] = line
-              end
-           end
-        end
         res[ic], total = res[ic] + a, total + a
       else
         res[0], total = res[0]  + a, total + a
         res[ic], total = res[ic] + a, total + a
       else
         res[0], total = res[0]  + a, total + a
@@ -132,33 +111,21 @@ local function clear_stretch(p, ic, name)
       local f = get_attr_icflag(q)
       if (f == ic) or ((ic ==KANJI_SKIP) and (f == KANJI_SKIP_JFM))
           or ((ic ==XKANJI_SKIP) and (f == XKANJI_SKIP_JFM)) then
       local f = get_attr_icflag(q)
       if (f == ic) or ((ic ==KANJI_SKIP) and (f == KANJI_SKIP_JFM))
           or ((ic ==XKANJI_SKIP) and (f == XKANJI_SKIP_JFM)) then
-         local qs = getfield(q, 'spec')
-         if getfield(qs, 'writable') then
-            setfield(qs, name..'_order', 0)
-            setfield(qs, name, 0)
-         end
+         setfield(q, name..'_order', 0)
+         setfield(q, name, 0)
       end
    end
 end
 
       end
    end
 end
 
-local set_stretch_table = {}
 local function set_stretch(p, after, before, ic, name)
    if before > 0 then
       local ratio = after/before
 local function set_stretch(p, after, before, ic, name)
    if before > 0 then
       local ratio = after/before
-      for i,_ in pairs(set_stretch_table) do
-         set_stretch_table[i] = nil
-      end
       for q in node_traverse_id(id_glue, getlist(p)) do
         local f = get_attr_icflag(q)
          if (f == ic) or ((ic ==KANJI_SKIP) and (f == KANJI_SKIP_JFM))
           or ((ic ==XKANJI_SKIP) and (f == XKANJI_SKIP_JFM)) then
       for q in node_traverse_id(id_glue, getlist(p)) do
         local f = get_attr_icflag(q)
          if (f == ic) or ((ic ==KANJI_SKIP) and (f == KANJI_SKIP_JFM))
           or ((ic ==XKANJI_SKIP) and (f == XKANJI_SKIP_JFM)) then
-            local qs, do_flag = getfield(q, 'spec'), true
-            for i=1,#set_stretch_table do
-               if set_stretch_table[i]==qs then do_flag = false end
-            end
-            if getfield(qs, 'writable') and getfield(qs, name..'_order')==0 and do_flag then
-               setfield(q, name, getfield(qs, name)*ratio)
-               set_stretch_table[#set_stretch_table+1] = qs
+            if getfield(q, name..'_order')==0 then
+               setfield(q, name, getfield(q, name)*ratio)
             end
          end
       end
             end
          end
       end
@@ -262,9 +229,6 @@ local function adjust_width(head)
          aw_step2(p, res, total, aw_step1(p, res, total))
       end
    end
          aw_step2(p, res, total, aw_step1(p, res, total))
       end
    end
-   for i,_ in pairs(gs_used_line) do
-      gs_used_line[i]  = nil
-   end
    return to_node(head)
 end
 
    return to_node(head)
 end
 
diff --git a/src/ltj-adjust_85.lua b/src/ltj-adjust_85.lua
new file mode 100644 (file)
index 0000000..db85d8f
--- /dev/null
@@ -0,0 +1,291 @@
+--
+-- luatexja/otf.lua
+--
+luatexja.load_module('jfont');     local ltjf = luatexja.jfont
+luatexja.load_module('jfmglue');   local ltjj = luatexja.jfmglue
+luatexja.load_module('stack');     local ltjs = luatexja.stack
+luatexja.load_module('direction'); local ltjd = luatexja.direction
+
+local to_node = node.direct.tonode
+local to_direct = node.direct.todirect
+
+local setfield = node.direct.setfield
+local setglue = luatexja.setglue
+local getfield = node.direct.getfield
+local is_zero_glue = node.direct.is_zero_glue or
+   function(g)
+      return (getfield(g,'width')==0)and (getfield(g,'stretch')==0)and(getfield(g,'shrink')==0)
+   end
+local getlist = node.direct.getlist
+local getid = node.direct.getid
+local getfont = node.direct.getfont
+local getsubtype = node.direct.getsubtype
+
+local node_traverse_id = node.direct.traverse_id
+local node_new = node.direct.new
+local node_copy = node.direct.copy
+local node_hpack = node.direct.hpack
+local node_next = node.direct.getnext
+local node_free = node.direct.free
+local node_prev = node.direct.getprev
+local node_tail = node.direct.tail
+local has_attr = node.direct.has_attribute
+local set_attr = node.direct.set_attribute
+local insert_after = node.direct.insert_after
+
+local id_glyph = node.id('glyph')
+local id_kern = node.id('kern')
+local id_hlist = node.id('hlist')
+local id_glue  = node.id('glue')
+local id_whatsit = node.id('whatsit')
+local attr_icflag = luatexbase.attributes['ltj@icflag']
+local attr_jchar_class = luatexbase.attributes['ltj@charclass']
+local lang_ja = luatexja.lang_ja
+
+local ltjf_font_metric_table = ltjf.font_metric_table
+local round, pairs = tex.round, pairs
+
+local PACKED       = luatexja.icflag_table.PACKED
+local FROM_JFM     = luatexja.icflag_table.FROM_JFM
+local KANJI_SKIP   = luatexja.icflag_table.KANJI_SKIP
+local KANJI_SKIP_JFM = luatexja.icflag_table.KANJI_SKIP_JFM
+local XKANJI_SKIP  = luatexja.icflag_table.XKANJI_SKIP
+local XKANJI_SKIP_JFM  = luatexja.icflag_table.XKANJI_SKIP_JFM
+
+local priority_table = {
+   FROM_JFM + 2,
+   FROM_JFM + 1,
+   FROM_JFM,
+   FROM_JFM - 1,
+   FROM_JFM - 2,
+   XKANJI_SKIP,
+   KANJI_SKIP
+}
+
+local get_attr_icflag
+do
+   local PROCESSED_BEGIN_FLAG = luatexja.icflag_table.PROCESSED_BEGIN_FLAG
+   get_attr_icflag = function(p)
+      return (has_attr(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG
+   end
+end
+
+-- box 内で伸縮された glue の合計値を計算
+
+local function get_stretched(q, go, gs)
+   if gs == 1 then -- stretching
+      if getfield(q, 'stretch_order') == go then
+        return getfield(q, 'stretch')
+      else return 0
+      end
+   else -- shrinking
+      if getfield(q, 'shrink_order') == go then
+        return getfield(q, 'shrink')
+      else return 0
+      end
+   end
+end
+
+local res = {}
+local gs_used_line = {}
+local function get_total_stretched(p, line)
+   local go, gf, gs
+      = getfield(p, 'glue_order'), getfield(p, 'glue_set'), getfield(p, 'glue_sign')
+   if go ~= 0 then return nil end
+   res[0], res.glue_set, res.name = 0, gf, (gs==1) and 'stretch' or 'shrink'
+   for i=1,#priority_table do res[priority_table[i]]=0 end
+   if gs ~= 1 and gs ~= 2 then return res, 0 end
+   local total = 0
+   for q in node_traverse_id(id_glue, getlist(p)) do
+      local a, ic = get_stretched(q, go, gs), get_attr_icflag(q)
+      if ic == KANJI_SKIP_JFM  then ic = KANJI_SKIP
+      elseif ic == XKANJI_SKIP_JFM  then ic = XKANJI_SKIP
+      end
+      if   type(res[ic]) == 'number' then
+        -- kanjiskip, xkanjiskip は段落内で spec を共有しているが,
+        -- それはここでは望ましくないので,各 glue ごとに異なる spec を使う.
+        -- 本当は各行ごとに glue_spec を共有させたかったが,安直にやると
+        -- ref_count が 0 なので Double-free が発生する.どうする?
+        -- JFM グルーはそれぞれ異なる glue_spec を用いているので,問題ない.
+        if (ic == KANJI_SKIP or ic == XKANJI_SKIP) and getsubtype(q)==0 then
+           local qs = getfield(q, 'spec')
+           if is_zero_glue(q) then
+              if (gs_used_line[qs] or 0)<line  then
+                 setfield(q, 'spec', node_copy(qs))
+                 local f = node_new(id_glue); setfield(f, 'spec', qs); node_free(f)
+                 -- decrese qs's reference count
+              else
+                 gs_used_line[qs] = line
+              end
+           end
+        end
+        res[ic], total = res[ic] + a, total + a
+      else
+        res[0], total = res[0]  + a, total + a
+      end
+   end
+   return res, total
+end
+
+local function clear_stretch(p, ic, name)
+   for q in node_traverse_id(id_glue, getlist(p)) do
+      local f = get_attr_icflag(q)
+      if (f == ic) or ((ic ==KANJI_SKIP) and (f == KANJI_SKIP_JFM))
+          or ((ic ==XKANJI_SKIP) and (f == XKANJI_SKIP_JFM)) then
+         local qs = getfield(q, 'spec')
+         if getfield(qs, 'writable') then
+            setfield(qs, name..'_order', 0)
+            setfield(qs, name, 0)
+         end
+      end
+   end
+end
+
+local set_stretch_table = {}
+local function set_stretch(p, after, before, ic, name)
+   if before > 0 then
+      local ratio = after/before
+      for i,_ in pairs(set_stretch_table) do
+         set_stretch_table[i] = nil
+      end
+      for q in node_traverse_id(id_glue, getlist(p)) do
+        local f = get_attr_icflag(q)
+         if (f == ic) or ((ic ==KANJI_SKIP) and (f == KANJI_SKIP_JFM))
+          or ((ic ==XKANJI_SKIP) and (f == XKANJI_SKIP_JFM)) then
+            local qs, do_flag = getfield(q, 'spec'), true
+            for i=1,#set_stretch_table do
+               if set_stretch_table[i]==qs then do_flag = false end
+            end
+            if getfield(qs, 'writable') and getfield(qs, name..'_order')==0 and do_flag then
+               setfield(q, name, getfield(qs, name)*ratio)
+               set_stretch_table[#set_stretch_table+1] = qs
+            end
+         end
+      end
+   end
+end
+
+-- step 1: 行末に kern を挿入(句読点,中点用)
+local ltjd_glyph_from_packed = ltjd.glyph_from_packed
+local function aw_step1(p, res, total)
+   local head = getlist(p)
+   local x = node_tail(head); if not x then return false end
+   -- x: \rightskip
+   x = node_prev(x); if not x then return false end
+   local xi, xc = getid(x)
+   if xi == id_glue and getsubtype(x) == 15 then
+      -- 段落最終行のときは,\penalty10000 \parfillskip が入るので,
+      -- その前の node が本来の末尾文字となる
+      x = node_prev(node_prev(x)); xi = getid(x)
+   end
+   -- local xi = getid(x)
+   -- while (get_attr_icflag(x) == PACKED)
+   --    and  ((xi == id_penalty) or (xi == id_kern) or (xi == id_kern)) do
+   --       x = node_prev(x); xi = getid(x)
+   -- end
+   if xi == id_glyph and getfield(x, 'lang')==lang_ja then
+      -- 和文文字
+      xc = x
+   elseif xi == id_hlist and get_attr_icflag(x) == PACKED then
+      -- packed JAchar
+      xc = ltjd_glyph_from_packed(x)
+      while getid(xc) == id_whatsit do xc = node_next(xc) end -- これはなんのために?
+   else
+     return false-- それ以外は対象外.
+   end
+   local xk = ltjf_font_metric_table[getfont(xc)]
+     .char_type[has_attr(xc, attr_jchar_class) or 0]['end_' .. res.name] or 0
+
+   if xk>0 and total>=xk then
+      total = total - xk
+      local kn = node_new(id_kern)
+      setfield(kn, 'kern', (res.name=='shrink' and -1 or 1) * xk)
+      set_attr(kn, attr_icflag, FROM_JFM)
+      insert_after(head, x, kn)
+      return true
+   else return false
+   end
+end
+
+-- step 2: 行中の glue を変える
+local function aw_step2(p, res, total, added_flag)
+   if total == 0 then -- もともと伸縮の必要なし
+      if added_flag then -- 行末に kern 追加したので,それによる補正
+        local f = node_hpack(getlist(p), getfield(p, 'width'), 'exactly')
+        setfield(f, 'head', nil)
+        setfield(p, 'glue_set', getfield(f, 'glue_set'))
+        setfield(p, 'glue_order', getfield(f, 'glue_order'))
+        setfield(p, 'glue_sign', getfield(f, 'glue_sign'))
+        node_free(f)
+        return
+      end
+   elseif total <= res[0] then -- 和文処理グルー以外で足りる
+      for _,v in pairs(priority_table) do clear_stretch(p, v, res.name) end
+      local f = node_hpack(getlist(p), getfield(p, 'width'), 'exactly')
+      setfield(f, 'head', nil)
+      setfield(p, 'glue_set', getfield(f, 'glue_set'))
+      setfield(p, 'glue_order', getfield(f, 'glue_order'))
+      setfield(p, 'glue_sign', getfield(f, 'glue_sign'))
+      node_free(f)
+   else
+      total = total - res[0]
+      for i = 1, #priority_table do
+         local v = priority_table[i]
+         if total <= res[v] then
+            for j = i+1,#priority_table do
+               clear_stretch(p, priority_table[j], res.name)
+            end
+            set_stretch(p, total, res[v], v, res.name); break
+         end
+         total = total - res[v]
+      end
+      local f = node_hpack(getlist(p), getfield(p, 'width'), 'exactly')
+      setfield(f, 'head', nil)
+      setfield(p, 'glue_set', getfield(f, 'glue_set'))
+      setfield(p, 'glue_order', getfield(f, 'glue_order'))
+      setfield(p, 'glue_sign', getfield(f, 'glue_sign'))
+      node_free(f)
+   end
+end
+
+
+local ltjs_fast_get_stack_skip = ltjs.fast_get_stack_skip
+local function adjust_width(head)
+   if not head then return head end
+   local line = 1
+   for p in node_traverse_id(id_hlist, to_direct(head)) do
+      line = line + 1
+      local res, total = get_total_stretched(p, line)
+        -- this is the same table as the table which is def'd in l. 92
+      if res and res.glue_set<1 then
+        total = round(total * res.glue_set)
+         aw_step2(p, res, total, aw_step1(p, res, total))
+      end
+   end
+   for i,_ in pairs(gs_used_line) do
+      gs_used_line[i]  = nil
+   end
+   return to_node(head)
+end
+
+do
+   luatexja.adjust = luatexja.adjust or {}
+   local is_reg = false
+   function luatexja.adjust.enable_cb()
+      if not is_reg then
+        luatexbase.add_to_callback('post_linebreak_filter',
+                                   adjust_width, 'Adjust width', 100)
+        is_reg = true
+      end
+   end
+   function luatexja.adjust.disable_cb()
+      if is_reg then
+        luatexbase.remove_from_callback('post_linebreak_filter', 'Adjust width')
+        is_reg = false
+      end
+   end
+end
+
+luatexja.unary_pars.adjust = function(t)
+   return is_reg and 1 or 0
+end
index 371c17f..569ae2b 100644 (file)
@@ -122,6 +122,7 @@ end
 local function skip_table_to_glue(n)
    local g, st = node_new(id_glue), ltjs.fast_get_stack_skip(n)
    setglue(g, st.width, st.stretch, st.shrink, st.stretch_order, st.shrink_order)
 local function skip_table_to_glue(n)
    local g, st = node_new(id_glue), ltjs.fast_get_stack_skip(n)
    setglue(g, st.width, st.stretch, st.shrink, st.stretch_order, st.shrink_order)
+   luatexja.ext_show_node(to_node(g), 'sg ',print) 
    return g, (st.width==1073741823)
 end
 
    return g, (st.width==1073741823)
 end
 
@@ -815,7 +816,7 @@ do
       if Np.auto_kspc or Nq.auto_kspc then
         local pm, qm = Np.met, Nq.met
         if (pm.char_type==qm.char_type) and (qm.var==pm.var) then
       if Np.auto_kspc or Nq.auto_kspc then
         local pm, qm = Np.met, Nq.met
         if (pm.char_type==qm.char_type) and (qm.var==pm.var) then
-           return get_kanjiskip_low(true, qm, 1, 1, 1)
+            return get_kanjiskip_low(true, qm, 1, 1, 1)
         else
            local gb = get_kanjiskip_low(true, qm, 1, 1, 1)
            local ga = get_kanjiskip_low(true, pm, 1, 1, 1)
         else
            local gb = get_kanjiskip_low(true, qm, 1, 1, 1)
            local ga = get_kanjiskip_low(true, pm, 1, 1, 1)
index da638f5..bf57c77 100644 (file)
@@ -11,25 +11,24 @@ local err, warn, info, log = luatexbase.errwarinf(_NAME)
 
 luatexja.load_module('stack');     local ltjs = luatexja.stack
 
 
 luatexja.load_module('stack');     local ltjs = luatexja.stack
 
-local Dnode = node.direct or node
-local nullfunc = function(n) return n end
-local to_node = (Dnode ~= node) and Dnode.tonode or nullfunc
-local to_direct = (Dnode ~= node) and Dnode.todirect or nullfunc
-
-local setfield = (Dnode ~= node) and Dnode.setfield or function(n, i, c) n[i] = c end
-local getfield = (Dnode ~= node) and Dnode.getfield or function(n, i) return n[i] end
-local getid = (Dnode ~= node) and Dnode.getid or function(n) return n.id end
-local getfont = (Dnode ~= node) and Dnode.getfont or function(n) return n.font end
-local getlist = (Dnode ~= node) and Dnode.getlist or function(n) return n.head end
-local getchar = (Dnode ~= node) and Dnode.getchar or function(n) return n.char end
-local getsubtype = (Dnode ~= node) and Dnode.getsubtype or function(n) return n.subtype end
-
-local node_new = Dnode.new
-local node_remove = Dnode.remove
-local node_next = (Dnode ~= node) and Dnode.getnext or node.next
-local node_copy, node_free, node_tail = Dnode.copy, Dnode.free, Dnode.tail
-local has_attr, set_attr = Dnode.has_attribute, Dnode.set_attribute
-local insert_before, insert_after = Dnode.insert_before, Dnode.insert_after
+local to_node =  node.direct.tonode
+local to_direct =  node.direct.todirect
+
+local setfield =  node.direct.setfield
+local setglue = luatexja.setglue
+local getfield =  node.direct.getfield
+local getid =  node.direct.getid
+local getfont =  node.direct.getfont
+local getlist =  node.direct.getlist
+local getchar =  node.direct.getchar
+local getsubtype =  node.direct.getsubtype
+
+local node_new = node.direct.new
+local node_remove = node.direct.remove
+local node_next =  node.direct.getnext
+local node_copy, node_free, node_tail = node.direct.copy, node.direct.free, node.direct.tail
+local has_attr, set_attr = node.direct.has_attribute, node.direct.set_attribute
+local insert_before, insert_after = node.direct.insert_before, node.direct.insert_after
 
 local id_hlist = node.id('hlist')
 local id_vlist = node.id('vlist')
 
 local id_hlist = node.id('hlist')
 local id_vlist = node.id('vlist')
@@ -38,7 +37,6 @@ local id_whatsit = node.id('whatsit')
 local id_glue = node.id('glue')
 local id_kern = node.id('kern')
 local id_penalty = node.id('penalty')
 local id_glue = node.id('glue')
 local id_kern = node.id('kern')
 local id_penalty = node.id('penalty')
-local id_glue_spec = node.id('glue_spec')
 local sid_user = node.subtype('user_defined')
 local ltjs_get_stack_table = luatexja.stack.get_stack_table
 local id_pbox_w = 258 -- cluster which consists of a whatsit
 local sid_user = node.subtype('user_defined')
 local ltjs_get_stack_table = luatexja.stack.get_stack_table
 local id_pbox_w = 258 -- cluster which consists of a whatsit
@@ -74,13 +72,11 @@ local RUBY_POST = luatexja.userid_table.RUBY_POST
 ----------------------------------------------------------------
 -- TeX interface 0
 ----------------------------------------------------------------
 ----------------------------------------------------------------
 -- TeX interface 0
 ----------------------------------------------------------------
-if Dnode ~= node then
-   function cpbox() return node_copy(Dnode.getbox(0)) end
-else
-   function cpbox() return node.copy(tex.box[0]) end
+do
+   local getbox = node.direct.getbox
+   function cpbox() return node_copy(getbox(0)) end
 end
 
 end
 
-
 ----------------------------------------------------------------
 -- 補助関数群 1
 ----------------------------------------------------------------
 ----------------------------------------------------------------
 -- 補助関数群 1
 ----------------------------------------------------------------
@@ -147,7 +143,7 @@ end
 -- ルビ文字を格納しているボックスでの設定ではない!
 local concat
 do
 -- ルビ文字を格納しているボックスでの設定ではない!
 local concat
 do
-   local node_prev = (Dnode ~= node) and Dnode.getprev or node.prev
+   local node_prev = node.direct.getprev
    function concat(f, b)
       if f then
         if b then
    function concat(f, b)
       if f then
         if b then
@@ -159,7 +155,7 @@ do
            setfield(f, 'head', nil); node_free(f)
            setfield(b, 'head', nil); node_free(b)
            local g = luatexja.jfmglue.main(h,false)
            setfield(f, 'head', nil); node_free(f)
            setfield(b, 'head', nil); node_free(b)
            local g = luatexja.jfmglue.main(h,false)
-           return Dnode.hpack(g)
+           return node.direct.hpack(g)
         else
            return f
         end
         else
            return f
         end
@@ -213,47 +209,29 @@ do
            -- この 5 種類の空白をのばす
               if getid(hx) == id_kern then
                  local k = node_new(id_glue)
            -- この 5 種類の空白をのばす
               if getid(hx) == id_kern then
                  local k = node_new(id_glue)
-                 local ks = node_new(id_glue_spec)
-                 setfield(ks, 'width', getfield(hx, 'kern'))
-                 setfield(ks, 'stretch_order', 2)
-                 setfield(ks, 'stretch', round(middle*65536))
-                 setfield(ks, 'shrink_order', 0); setfield(ks, 'shrink', 0)
-                 setfield(k, 'subtype', 0); setfield(k, 'spec', ks)
+                 setglue(k, getfield(hx, 'kern'), round(middle*65536), 0,
+                            2, 0)
+                 setfield(k, 'subtype', 0);
                  h = insert_after(h, hx, k);
                  h = node_remove(h, hx); node_free(hx); hx = k
               else -- glue
                  h = insert_after(h, hx, k);
                  h = node_remove(h, hx); node_free(hx); hx = k
               else -- glue
-                 local old_spec = getfield(hx, 'spec')
-                 local ks = node_copy(old_spec)
-                 setfield(ks, 'stretch_order', 2)
-                 setfield(ks, 'stretch', round(middle*65536))
-                 setfield(ks, 'shrink_order', 0); setfield(ks, 'shrink', 0)
-                 setfield(hx, 'spec', ks)
-                 -- decrease old_spec's reference count
-                 local b = node_new(id_glue)
-                 setfield(b, 'spec', old_spec); node_free(b)
+                 setglue(hx, getfield(hx, 'width'), round(middle*65536), 0,
+                            2, 0)
               end
         end
         hx = node_next(hx)
       end
       -- 先頭の空白を挿入
       local k = node_new(id_glue);
               end
         end
         hx = node_next(hx)
       end
       -- 先頭の空白を挿入
       local k = node_new(id_glue);
-      local ks = node_new(id_glue_spec)
-      setfield(ks, 'width', prenw)
-      setfield(ks, 'stretch_order', 2); setfield(ks, 'stretch', round(pre*65536))
-      setfield(ks, 'shrink_order', 0); setfield(ks, 'shrink', 0)
-      setfield(k, 'subtype', 0); setfield(k, 'spec', ks)
+      setglue(k, prenw, round(pre*65536), 0, 2, 0)
       h = insert_before(h, h, k);
       -- 末尾の空白を挿入
       local k = node_new(id_glue);
       h = insert_before(h, h, k);
       -- 末尾の空白を挿入
       local k = node_new(id_glue);
-      local ks = node_new(id_glue_spec);
-      setfield(ks, 'width', postnw)
-      setfield(ks, 'stretch_order', 2); setfield(ks, 'stretch', round(post*65536))
-      setfield(ks, 'shrink_order', 0); setfield(ks, 'shrink', 0)
-      setfield(k, 'subtype', 0);setfield(k, 'spec', ks)
+      setglue(k, postnw, round(post*65536), 0, 2, 0)
       insert_after(h, node_tail(h), k);
       -- hpack
       setfield(box, 'head', nil); node_free(box)
       insert_after(h, node_tail(h), k);
       -- hpack
       setfield(box, 'head', nil); node_free(box)
-      box = Dnode.hpack(h, new_width, 'exactly')
+      box = node.direct.hpack(h, new_width, 'exactly')
       setfield(box, 'height', hh)
       setfield(box, 'depth', hd)
       return box
       setfield(box, 'height', hh)
       setfield(box, 'depth', hd)
       return box
@@ -287,7 +265,7 @@ local function texiface_low(rst, rtlr, rtlp)
       _, n = insert_after(wv, n, rtlp[i])
    end
    -- w.value: (whatsit) .. r1 .. p1 .. r2 .. p2
       _, n = insert_after(wv, n, rtlp[i])
    end
    -- w.value: (whatsit) .. r1 .. p1 .. r2 .. p2
-   Dnode.write(w); return w,wv
+   node.direct.write(w); return w,wv
 end
 
 -- rst: table
 end
 
 -- rst: table
@@ -356,7 +334,7 @@ local function enlarge_parent(r, p, ppre, pmid, ppost, mapre, mapost, intmode)
    local rwidth = rwidth - pre_intrusion - post_intrusion
    setfield(r, 'width', rwidth)
    setfield(p, 'width', rwidth)
    local rwidth = rwidth - pre_intrusion - post_intrusion
    setfield(r, 'width', rwidth)
    setfield(p, 'width', rwidth)
-   local ps = getfield(getlist(p), 'spec')
+   local ps = getlist(p)
    setfield(ps, 'width', getfield(ps, 'width') - pre_intrusion)
    return r, p, post_intrusion
 end
    setfield(ps, 'width', getfield(ps, 'width') - pre_intrusion)
    return r, p, post_intrusion
 end
@@ -381,18 +359,18 @@ local function new_ruby_box(r, p, ppre, pmid, ppost,
       local need_repack = false
       -- margin が大きくなりすぎた時の処理
       if round(rpre*getfield(r, 'glue_set')*65536) > max_margin then
       local need_repack = false
       -- margin が大きくなりすぎた時の処理
       if round(rpre*getfield(r, 'glue_set')*65536) > max_margin then
-        local ps = getfield(getlist(r), 'spec'); need_repack = true
+        local ps = getlist(r); need_repack = true
         setfield(ps, 'width', max_margin)
          setfield(ps, 'stretch', 1) -- 全く伸縮しないのも困る
       end
       if round(rpost*getfield(r, 'glue_set')*65536) > max_margin then
         setfield(ps, 'width', max_margin)
          setfield(ps, 'stretch', 1) -- 全く伸縮しないのも困る
       end
       if round(rpost*getfield(r, 'glue_set')*65536) > max_margin then
-        local ps = getfield(node_tail(getlist(r)), 'spec'); need_repack = true
+        local ps = node_tail(getlist(r)); need_repack = true
         setfield(ps, 'width', max_margin)
          setfield(ps, 'stretch', 1) -- 全く伸縮しないのも困る
       end
       if need_repack then
         local rt = r
         setfield(ps, 'width', max_margin)
          setfield(ps, 'stretch', 1) -- 全く伸縮しないのも困る
       end
       if need_repack then
         local rt = r
-        r = Dnode.hpack(getlist(r), getfield(r, 'width'), 'exactly')
+        r = node.direct.hpack(getlist(r), getfield(r, 'width'), 'exactly')
         setfield(rt, 'head', nil); node_free(rt);
       end
    end
         setfield(rt, 'head', nil); node_free(rt);
       end
    end
@@ -401,7 +379,7 @@ local function new_ruby_box(r, p, ppre, pmid, ppost,
    setfield(a, 'depth', 0); setfield(k, 'kern', rgap)
    insert_after(r, r, a); insert_after(r, a, k);
    insert_after(r, k, p); setfield(p, 'next', nil)
    setfield(a, 'depth', 0); setfield(k, 'kern', rgap)
    insert_after(r, r, a); insert_after(r, a, k);
    insert_after(r, k, p); setfield(p, 'next', nil)
-   a = Dnode.vpack(r); setfield(a, 'shift', 0)
+   a = node.direct.vpack(r); setfield(a, 'shift', 0)
    set_attr(a, attr_ruby, post_intrusion)
    if rsmash or getfield(a, 'height')<getfield(p, 'height') then
       local k = node_new(id_kern)
    set_attr(a, attr_ruby, post_intrusion)
    if rsmash or getfield(a, 'height')<getfield(p, 'height') then
       local k = node_new(id_kern)
@@ -471,7 +449,7 @@ local function pre_low_cal_box(w, cmp)
 
    -- w.value の node list 更新.
    local nt = wv
 
    -- w.value の node list 更新.
    local nt = wv
-   Dnode.flush_list(node_next(wv))
+   node.direct.flush_list(node_next(wv))
    for i = 1, 2*cmp+1 do setfield(nt, 'next', kf[i]); nt = kf[i]  end
 
    if cmp==1 then     solve_1(coef)
    for i = 1, 2*cmp+1 do setfield(nt, 'next', kf[i]); nt = kf[i]  end
 
    if cmp==1 then     solve_1(coef)
@@ -484,7 +462,7 @@ end
 
 local first_whatsit
 do
 
 local first_whatsit
 do
-   local traverse_id = Dnode.traverse_id
+   local traverse_id = node.direct.traverse_id
    function first_whatsit(n) -- n 以後で最初の whatsit
       for h in traverse_id(id_whatsit, n) do
          return h
    function first_whatsit(n) -- n 以後で最初の whatsit
       for h in traverse_id(id_whatsit, n) do
          return h
@@ -497,11 +475,8 @@ local next_cluster_array = {}
 -- ノード追加
 local function pre_low_app_node(head, w, cmp, coef, ht, dp)
    -- メインの node list 更新
 -- ノード追加
 local function pre_low_app_node(head, w, cmp, coef, ht, dp)
    -- メインの node list 更新
-   local nt, ntb = node_new(id_glue), node_new(id_glue_spec)
-   setfield(ntb, 'width', coef[1][2*cmp+2])
-   setfield(ntb, 'stretch_order', 0); setfield(ntb, 'stretch', 0)
-   setfield(ntb, 'shrink_order', 0); setfield(ntb, 'shrink', 0)
-   setfield(nt, 'subtype', 0); setfield(nt, 'spec', ntb)
+   local nt = node_new(id_glue)
+   setglue(nt, coef[1][2*cmp+2], 0, 0, 0, 0)
    set_attr(nt, attr_ruby, 1); set_attr(w, attr_ruby, 2)
    head = insert_before(head, w, nt)
    nt = w
    set_attr(nt, attr_ruby, 1); set_attr(w, attr_ruby, 2)
    head = insert_before(head, w, nt)
    nt = w
@@ -514,16 +489,12 @@ local function pre_low_app_node(head, w, cmp, coef, ht, dp)
       insert_after(head, nt, nta)
       set_attr(nta, attr_ruby, 2*i+1)
       -- glue
       insert_after(head, nt, nta)
       set_attr(nta, attr_ruby, 2*i+1)
       -- glue
-       local ntb = node_new(id_glue_spec);
-      setfield(ntb, 'width', coef[i*2+1][2*cmp+2])
-      setfield(ntb, 'stretch_order', 0); setfield(ntb, 'stretch', 0)
-      setfield(ntb, 'shrink_order', 0); setfield(ntb, 'shrink', 0)
       if i~=cmp or not next_cluster_array[w] then
         nt = node_new(id_glue); insert_after(head, nta, nt)
       else
         nt = next_cluster_array[w]
       end
       if i~=cmp or not next_cluster_array[w] then
         nt = node_new(id_glue); insert_after(head, nta, nt)
       else
         nt = next_cluster_array[w]
       end
-      setfield(nt, 'subtype', 0); setfield(nt, 'spec', ntb)
+      setglue(nt, coef[i*2+1][2*cmp+2], 0, 0, 0, 0)
       set_attr(nt, attr_ruby, 2*i+2)
    end
    tex.setattribute('global', attr_ruby, -0x7FFFFFFF)
       set_attr(nt, attr_ruby, 2*i+2)
    end
    tex.setattribute('global', attr_ruby, -0x7FFFFFFF)
@@ -634,7 +605,7 @@ local function post_high_break(head)
    local rs = {}   -- rs: sequence of ruby_nodes,
    local rw = nil  -- rw: main whatsit
    local cmp = -2  -- dummy
    local rs = {}   -- rs: sequence of ruby_nodes,
    local rw = nil  -- rw: main whatsit
    local cmp = -2  -- dummy
-   for h in Dnode.traverse_id(id_hlist, to_direct(head)) do
+   for h in node.direct.traverse_id(id_hlist, to_direct(head)) do
       for i = 1, #rs do rs[i] = nil end
       local ha = getlist(h)
       while ha do
       for i = 1, #rs do rs[i] = nil end
       local ha = getlist(h)
       while ha do
index ec5f902..d90fa55 100644 (file)
@@ -22,7 +22,7 @@ end
 
 local setfield = node.direct.setfield
 luatexja.setglue = node.direct.setglue or
 
 local setfield = node.direct.setfield
 luatexja.setglue = node.direct.setglue or
-    function(g,w,st,sh,sto,sho)
+   function(g,w,st,sh,sto,sho)
       setfield(g,'width', w or 0)
       setfield(g,'stretch',st or 0)
       setfield(g,'shrink', sh or 0)
       setfield(g,'width', w or 0)
       setfield(g,'stretch',st or 0)
       setfield(g,'shrink', sh or 0)