OSDN Git Service

Dnode -> node.direct (WIP)
authorHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Sun, 3 Apr 2016 01:13:19 +0000 (10:13 +0900)
committerHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Sun, 3 Apr 2016 01:13:19 +0000 (10:13 +0900)
doc/luatexja.dtx
src/ltj-adjust.lua
src/ltj-jfmglue.lua
src/ltj-jfont.lua
src/ltj-setwidth.lua
src/luatexja-core.sty
src/luatexja.lua

index 2ee6bd9..e325ee7 100644 (file)
@@ -602,17 +602,17 @@ and \emph{Japanese fonts} for fonts used in \textbf{JAchar}.
 %<en>The following packages are needed for the \LuaTeX-ja\ package.
 %<ja>\LuaTeX-jaパッケージの動作には次のパッケージ類が必要である.
 \begin{itemize}
-\item \LuaTeX\ beta-0.80.0 (or later)
-\item \Pkg{luaotfload} v2.5 (or later)
+\item \LuaTeX\ beta-0.85.0 (or later)
+\item \Pkg{luaotfload} v2.6 (or later)
 \item \Pkg{adobemapping} (Adobe cmap and pdfmapping files)
 \item \Pkg{everysel} (if you want to use \LuaTeX-ja with \LaTeXe)
 \item \Pkg{fontspec} v2.4
 %<en>\item \emph{IPAex fonts} (\url{http://ipafont.ipa.go.jp/})
 %<ja>\item \emph{IPAexフォント(\url{http://ipafont.ipa.go.jp/})}
 \end{itemize}
-%<en>In summary, this version of \LuaTeX-ja no longer supports \TeX~Live~2014 (or older version).
+%<en>In summary, this version of \LuaTeX-ja no longer supports \TeX~Live~2015 (or older version).
 %<*ja>
-要約すると,本バージョンの\LuaTeX-jaは\TeX~Live~2014以前では動作しない\footnote{%
+要約すると,本バージョンの\LuaTeX-jaは\TeX~Live~2015以前では動作しない\footnote{%
   もっとも,自分で\LuaTeX のバイナリをSubversionリポジトリからビルドしていれば話は別である.
 }.
 %</ja>
index 84f75b9..db85d8f 100644 (file)
@@ -1,55 +1,48 @@
 --
 -- luatexja/otf.lua
 --
-luatexbase.provides_module({
-  name = 'luatexja.adjust',
-  date = '2014/09/30',
-  description = 'Advanced line adjustment for LuaTeX-ja',
-})
-module('luatexja.adjust', package.seeall)
-
 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 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 to_node = node.direct.tonode
+local to_direct = node.direct.todirect
 
-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 getlist = (Dnode ~= node) and Dnode.getlist or function(n) return n.head 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 getsubtype = (Dnode ~= node) and Dnode.getsubtype or function(n) return n.subtype end
+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 = Dnode.traverse_id
-local node_new = Dnode.new
-local node_copy = Dnode.copy
-local node_hpack = Dnode.hpack
-local node_next = (Dnode ~= node) and Dnode.getnext or node.next
-local node_free = Dnode.free
-local node_prev = (Dnode ~= node) and Dnode.getprev or node.prev
-local node_tail = Dnode.tail
-local has_attr = Dnode.has_attribute
-local set_attr = Dnode.set_attribute
-local insert_after = Dnode.insert_after
+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_glue_spec = node.id('glue_spec')
 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 spec_zero_glue = ltjj.spec_zero_glue
 local round, pairs = tex.round, pairs
 
 local PACKED       = luatexja.icflag_table.PACKED
@@ -80,16 +73,14 @@ end
 -- box 内で伸縮された glue の合計値を計算
 
 local function get_stretched(q, go, gs)
-   local qs = getfield(q, 'spec')
-   if not getfield(qs, 'writable') then return 0 end
    if gs == 1 then -- stretching
-      if getfield(qs, 'stretch_order') == go then
-        return getfield(qs, 'stretch')
+      if getfield(q, 'stretch_order') == go then
+        return getfield(q, 'stretch')
       else return 0
       end
    else -- shrinking
-      if getfield(qs, 'shrink_order') == go then
-        return getfield(qs, 'shrink')
+      if getfield(q, 'shrink_order') == go then
+        return getfield(q, 'shrink')
       else return 0
       end
    end
@@ -118,7 +109,7 @@ local function get_total_stretched(p, line)
         -- JFM グルーはそれぞれ異なる glue_spec を用いているので,問題ない.
         if (ic == KANJI_SKIP or ic == XKANJI_SKIP) and getsubtype(q)==0 then
            local qs = getfield(q, 'spec')
-           if qs ~= spec_zero_glue then
+           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)
@@ -166,7 +157,7 @@ local function set_stretch(p, after, before, ic, name)
                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(qs, name, getfield(qs, name)*ratio)
+               setfield(q, name, getfield(qs, name)*ratio)
                set_stretch_table[#set_stretch_table+1] = qs
             end
          end
@@ -278,15 +269,16 @@ local function adjust_width(head)
 end
 
 do
+   luatexja.adjust = luatexja.adjust or {}
    local is_reg = false
-   function enable_cb()
+   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 disable_cb()
+   function luatexja.adjust.disable_cb()
       if is_reg then
         luatexbase.remove_from_callback('post_linebreak_filter', 'Adjust width')
         is_reg = false
index 9a638e3..371c17f 100644 (file)
@@ -16,35 +16,34 @@ luatexja.load_module('direction'); local ltjd = luatexja.direction
 luatexja.load_module('setwidth');      local ltjw = luatexja.setwidth
 local pairs = pairs
 
-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 has_attr = Dnode.has_attribute
-local set_attr = Dnode.set_attribute
-local insert_before = Dnode.insert_before
-local insert_after = Dnode.insert_after
-local node_next = (Dnode ~= node) and Dnode.getnext or node.next
+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 has_attr = node.direct.has_attribute
+local set_attr = node.direct.set_attribute
+local insert_before = node.direct.insert_before
+local insert_after = node.direct.insert_after
+local node_next = node.direct.getnext
 local round = tex.round
 local ltjd_make_dir_whatsit = ltjd.make_dir_whatsit
 local ltjf_font_metric_table = ltjf.font_metric_table
 local ltjf_find_char_class = ltjf.find_char_class
-local node_new = Dnode.new
-local node_copy = Dnode.copy
-local node_remove = Dnode.remove
-local node_tail = Dnode.tail
-local node_free = Dnode.free
-local node_end_of_math = Dnode.end_of_math
+local node_new = node.direct.new
+local node_copy = node.direct.copy
+local node_remove = node.direct.remove
+local node_tail = node.direct.tail
+local node_free = node.direct.free
+local node_end_of_math = node.direct.end_of_math
 
 local id_glyph = node.id('glyph')
 local id_hlist = node.id('hlist')
@@ -60,7 +59,6 @@ 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 id_jglyph    = 512 -- Japanese character
 local id_box_like  = 256 -- vbox, shifted hbox
 local id_pbox      = 257 -- already processed nodes (by \unhbox)
@@ -121,25 +119,10 @@ do
    end
 end
 
-local zero_glue = node_new(id_glue)
-spec_zero_glue = to_node(node_new(id_glue_spec))
-  -- must be public, since mentioned from other sources
-local spec_zero_glue = to_direct(spec_zero_glue)
-setfield(spec_zero_glue, 'width', 0)
-setfield(spec_zero_glue, 'stretch', 0)
-setfield(spec_zero_glue, 'shrink', 0)
-setfield(spec_zero_glue, 'stretch_order', 0)
-setfield(spec_zero_glue, 'shrink_order', 0)
-setfield(zero_glue, 'spec', spec_zero_glue)
-
-local function skip_table_to_spec(n)
-   local g, st = node_new(id_glue_spec), ltjs.fast_get_stack_skip(n)
-   setfield(g, 'width', st.width)
-   setfield(g, 'stretch', st.stretch)
-   setfield(g, 'shrink', st.shrink)
-   setfield(g, 'stretch_order', st.stretch_order)
-   setfield(g, 'shrink_order', st.shrink_order)
-   return g
+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)
+   return g, (st.width==1073741823)
 end
 
 
@@ -281,7 +264,7 @@ luatexbase.create_callback("luatexja.jfmglue.whatsit_after", "data",
 local calc_np 
 do
 
-local traverse = Dnode.traverse
+local traverse = node.direct.traverse
 local function check_next_ickern(lp)
   if lp and getid(lp) == id_kern and ( getsubtype(lp)==3 or ITALIC == get_attr_icflag(lp)) then
       set_attr(lp, attr_icflag, IC_PROCESSED);
@@ -709,13 +692,13 @@ local function new_jfm_glue(mc, bc, ac)
 -- bc, ac: char classes
    local g = mc[bc][ac]
    if g then
-      if g[1] then
+       if g[1] then
+          return node_copy(g[1]), g.ratio, false, false, false
+       else
         local f = node_new(id_glue)
         set_attr(f, attr_icflag, g.priority)
-        setfield(f, 'spec', node_copy(g[2]))
+        setglue(f, g.width, g.stretch, g.shrink)
         return f, g.ratio, g.kanjiskip_natural, g.kanjiskip_stretch, g.kanjiskip_shrink
-      else
-        return node_copy(g[2]), g.ratio, false, false, false
       end
    end
    return false, 0
@@ -756,14 +739,13 @@ do
 
       local k = 2*getid(gb) - getid(ga)
       if k == bg_ag then
-        local bs, as = getfield(gb, 'spec'), getfield(ga, 'spec')
         -- 両方とも glue.
-        setfield(bs, 'width', blend_diffmet(
-                    getfield(bs, 'width'), getfield(as, 'width'), db, da))
-        setfield(bs, 'stretch', blend_diffmet(
-                    getfield(bs, 'stretch'), getfield(as, 'stretch'), db, da))
-        setfield(bs, 'shrink', -blend_diffmet(
-                    -getfield(bs, 'shrink'), -getfield(as, 'shrink'), db, da))
+        setglue(gb, blend_diffmet(
+                       getfield(gb, 'width'), getfield(ga, 'width'), db, da),
+                    blend_diffmet(
+                       getfield(gb, 'stretch'), getfield(ga, 'stretch'), db, da),
+                    -blend_diffmet(
+                    -getfield(gb, 'shrink'), -getfield(ga, 'shrink'), db, da))
         node_free(ga)
         return gb
       elseif k == bk_ak then
@@ -773,25 +755,23 @@ do
         node_free(ga)
         return gb
       elseif k == bk_ag then
-        local as = getfield(ga, 'spec')
         -- gb: kern, ga: glue
-        setfield(as, 'width', blend_diffmet(
-                    getfield(gb, 'kern'), getfield(as, 'width'), db, da))
-        setfield(as, 'stretch', blend_diffmet(
-                    0, getfield(as, 'stretch'), db, da))
-        setfield(as, 'shrink', -blend_diffmet(
-                    0, -getfield(as, 'shrink'), db, da))
+        setglue(ga, blend_diffmet(
+                       getfield(gb, 'kern'), getfield(ga, 'width'), db, da),
+                    blend_diffmet(
+                       0, getfield(ga, 'stretch'), db, da),
+                    -blend_diffmet(
+                       0, -getfield(ga, 'shrink'), db, da))
         node_free(gb)
         return ga, 0, 0, 0
       else
-        local bs = getfield(gb, 'spec')
         -- gb: glue, ga: kern
-        setfield(bs, 'width', blend_diffmet(
-                    getfield(bs, 'width'), getfield(ga, 'kern'), db, da))
-        setfield(bs, 'stretch', blend_diffmet(
-                    getfield(bs, 'stretch'), 0, db, da))
-        setfield(bs, 'shrink', -blend_diffmet(
-                    -getfield(bs, 'shrink'), 0, db, da))
+        setglue(gb, blend_diffmet(
+                       getfield(gb, 'width'), getfield(ga, 'kern'), db, da),
+                    blend_diffmet(
+                       getfield(gb, 'stretch'), 0, db, da),
+                    -blend_diffmet(
+                       -getfield(gb, 'shrink'), 0, db, da))
         node_free(ga)
         return gb
       end
@@ -810,26 +790,21 @@ do
       if flag or (qm.with_kanjiskip and (bn or bp or bh)) then
         if kanjiskip_jfm_flag then
            local g = node_new(id_glue);
-           local gx = node_new(id_glue_spec);
-           setfield(gx, 'stretch_order', 0); setfield(gx, 'shrink_order', 0)
            local bk = qm.kanjiskip or null_skip_table
-           setfield(gx, 'width', bn and (bn*bk[1]) or 0)
-           setfield(gx, 'stretch', bp and (bp*bk[2]) or 0)
-           setfield(gx, 'shrink', bh and (bh*bk[3]) or 0)
-           setfield(g, 'spec', gx)
+           setglue(g, bn and (bn*bk[1]) or 0, 
+                      bp and (bp*bk[2]) or 0, 
+                      bh and (bh*bk[3]) or 0, 0, 0)
            set_attr(g, attr_icflag, KANJI_SKIP_JFM)
            return g
         elseif flag then
            return node_copy(kanji_skip)
         else
            local g = node_new(id_glue);
-           local gx = node_new(id_glue_spec);
-           setfield(gx, 'stretch_order', 0); setfield(gx, 'shrink_order', 0)
-           local ks = getfield(kanji_skip, 'spec')
-           setfield(gx, 'width', bn and (bn*getfield(ks, 'width')) or 0)
-           setfield(gx, 'stretch', bp and (bp*getfield(ks, 'stretch')) or 0)
-           setfield(gx, 'shrink', bh and (bh*getfield(ks, 'shrink')) or 0)
-           setfield(g, 'spec', gx)
+           setglue(g,
+              bn and (bn*getfield(kanji_skip, 'width')) or 0,
+              bp and (bp*getfield(kanji_skip, 'stretch')) or 0,
+              bh and (bh*getfield(kanji_skip, 'shrink')) or 0,
+              0, 0)
            set_attr(g, attr_icflag, KANJI_SKIP_JFM)
            return g
         end
@@ -847,7 +822,7 @@ do
            return calc_ja_ja_aux(gb, ga, 0, 1)
         end
       else
-        local g = node_copy(zero_glue)
+        local g = node_new(id_glue)
         set_attr(g, attr_icflag, kanjiskip_jfm_flag and KANJI_SKIP_JFM or KANJI_SKIP)
         return g
       end
@@ -895,26 +870,21 @@ do
       if flag or (qm.with_kanjiskip and (bn or bp or bh)) then
         if xkanjiskip_jfm_flag then
            local g = node_new(id_glue);
-           local gx = node_new(id_glue_spec);
-           setfield(gx, 'stretch_order', 0); setfield(gx, 'shrink_order', 0)
            local bk = qm.xkanjiskip or null_skip_table
-           setfield(gx, 'width', bn and bk[1] or 0)
-           setfield(gx, 'stretch', bp and bk[2] or 0)
-           setfield(gx, 'shrink', bh and bk[3] or 0)
-           setfield(g, 'spec', gx)
+           setglue(g, bn and bk[1] or 0,
+                      bp and bk[2] or 0,
+                      bh and bk[3] or 0, 0, 0)
            set_attr(g, attr_icflag, XKANJI_SKIP_JFM)
            return g
         elseif flag then
            return node_copy(xkanji_skip)
         else
            local g = node_new(id_glue);
-           local gx = node_new(id_glue_spec);
-           setfield(gx, 'stretch_order', 0); setfield(gx, 'shrink_order', 0)
-           local ks = getfield(xkanji_skip, 'spec')
-           setfield(gx, 'width', bn and getfield(ks, 'width') or 0)
-           setfield(gx, 'stretch', bp and getfield(ks, 'stretch') or 0)
-           setfield(gx, 'shrink', bh and getfield(ks, 'shrink') or 0)
-           setfield(g, 'spec', gx)
+           setglue(g,
+              bn and (bn*getfield(xkanji_skip, 'width')) or 0,
+              bp and (bp*getfield(xkanji_skip, 'stretch')) or 0,
+              bh and (bh*getfield(xkanji_skip, 'shrink')) or 0,
+              0, 0)
            set_attr(g, attr_icflag, XKANJI_SKIP_JFM)
            return g
         end
@@ -925,7 +895,7 @@ do
       if (Nq.xspc>=2) and (Np.xspc%2==1) and (Nq.auto_xspc or Np.auto_xspc) then
         return get_xkanjiskip_low(true, Nn.met, 1, 1, 1)
       else
-        local g = node_copy(zero_glue)
+        local g = node_new(id_glue)
         set_attr(g, attr_icflag, xkanjiskip_jfm_flag and XKANJI_SKIP_JFM or XKANJI_SKIP)
         return g
       end
@@ -1140,17 +1110,13 @@ do
       -- ithout this node, set_attr(kanji_skip, ...) somehow creates an "orphaned"  attribute list.
 
       do
-        kanji_skip = node_new(id_glue); set_attr(kanji_skip, attr_icflag, KANJI_SKIP)
-        local s = skip_table_to_spec(KSK)
-        setfield(kanji_skip, 'spec', s)
-        kanjiskip_jfm_flag = (getfield(s, 'width') == 1073741823)
+         kanji_skip, kanjiskip_jfm_flag = skip_table_to_glue(KSK)
+         set_attr(kanji_skip, attr_icflag, KANJI_SKIP)
       end
 
       do
-        xkanji_skip = node_new(id_glue); set_attr(xkanji_skip, attr_icflag, XKANJI_SKIP)
-        local s = skip_table_to_spec(XSK)
-        setfield(xkanji_skip, 'spec', s)
-        xkanjiskip_jfm_flag = (getfield(s, 'width') == 1073741823)
+         xkanji_skip, xkanjiskip_jfm_flag = skip_table_to_glue(XSK)
+         set_attr(xkanji_skip, attr_icflag, XKANJI_SKIP)
       end
 
       if mode then
@@ -1226,8 +1192,8 @@ end
 do
    local IHB  = luatexja.userid_table.IHB
    local BPAR = luatexja.userid_table.BPAR
-   local node_prev = (Dnode ~= node) and Dnode.getprev or node.prev
-   local node_write = Dnode.write
+   local node_prev = node.direct.getprev
+   local node_write = node.direct.write
 
    -- \inhibitglue
    function create_inhibitglue_node()
index 879d0b8..b193ee8 100644 (file)
@@ -34,8 +34,6 @@ local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
 local attr_curtfnt = luatexbase.attributes['ltj@curtfnt']
 local id_glyph = node.id('glyph')
 local id_kern = node.id('kern')
-local id_glue_spec = node.id('glue_spec')
-local id_glue = node.id('glue')
 local cat_lp = luatexbase.catcodetables['latex-package']
 local FROM_JFM     = luatexja.icflag_table.FROM_JFM
 local tokenlib = luatexja.token
@@ -165,27 +163,22 @@ do
            ((v.align=='right') and 1 or 0.5)
         if type(i) == 'number' then -- char_type
            for k,w in pairs(v.glue) do
-              local h = node_new(id_glue_spec)
               v[k] = {
-                 true, h,
+                 nil,
                  ratio=w.ratio/sz,
                  priority=FROM_JFM + w.priority/sz,
+                 width = w[1], stretch = w[2], shrink = w[3],
                  kanjiskip_natural = w.kanjiskip_natural and w.kanjiskip_natural/sz,
                  kanjiskip_stretch = w.kanjiskip_stretch and w.kanjiskip_stretch/sz,
                  kanjiskip_shrink =  w.kanjiskip_shrink  and w.kanjiskip_shrink/sz,
               }
-              setfield(h, 'width', w[1])
-              setfield(h, 'stretch', w[2])
-              setfield(h, 'shrink', w[3])
-              setfield(h, 'stretch_order', 0)
-              setfield(h, 'shrink_order', 0)
            end
            for k,w in pairs(v.kern) do
               local g = node_new(id_kern)
               setfield(g, 'kern', w[1])
               setfield(g, 'subtype', 1)
               set_attr(g, attr_icflag, FROM_JFM)
-              v[k] = {false, g, ratio=w[2]/sz}
+              v[k] = {g, ratio=w[2]/sz}
            end
         end
         v.glue, v.kern = nil, nil
@@ -661,14 +654,13 @@ do
               for k,w in pairs(v) do
                  if type(k)=='number' then
                     --if w[1] then gs = gs + 1 else ke = ke + 1 end
-                    node_free(w[2])
+                    if w[1] then node_free(w[1]) end
                  end
               end
            end
            n.size_cache[i]=nil
         end
       end
-      --print('glue spec: ', gs, 'kern: ', ke)
    end
 end
 
index e18e3a1..aed10da 100644 (file)
@@ -7,26 +7,25 @@ luatexja.load_module('stack');     local ltjs = luatexja.stack
 luatexja.load_module('jfont');     local ltjf = luatexja.jfont
 luatexja.load_module('direction'); local ltjd = luatexja.direction
 
-local Dnode = node.direct or node
-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 setfield = node.direct.setfield
+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_traverse_id = Dnode.traverse_id
-local node_traverse = Dnode.traverse
-local node_new = Dnode.new
-local node_copy = Dnode.copy
-local node_remove = Dnode.remove
-local node_tail = Dnode.tail
-local node_next = (Dnode ~= node) and Dnode.getnext or node.next
-local has_attr = Dnode.has_attribute
-local set_attr = Dnode.set_attribute
-local node_insert_before = Dnode.insert_before
-local node_insert_after = Dnode.insert_after
+local node_traverse_id = node.direct.traverse_id
+local node_traverse = node.direct.traverse
+local node_new = node.direct.new
+local node_copy = node.direct.copy
+local node_remove = node.direct.remove
+local node_tail = node.direct.tail
+local node_next = node.direct.getnext or node.next
+local has_attr = node.direct.has_attribute
+local set_attr = node.direct.set_attribute
+local node_insert_before = node.direct.insert_before
+local node_insert_after = node.direct.insert_after
 local round = tex.round
 
 local id_glyph = node.id('glyph')
index 5784b1b..20eeded 100644 (file)
 \expandafter\endinput\fi\relax
 
 %% Check LuaTeX version.
-\ifnum\luatexversion<74
+\ifnum\luatexversion<85
   \@PackageError{luatexja-core}
     {This LuaTeX engine is too old for this package;\MessageBreak
-     at least beta-0.74.0 is needed}
+     at least beta-0.85.0 is needed}
     {Package loading is aborted now.\MessageBreak}
 \expandafter\endinput\fi\relax
 
-%! なお、luatexbase-compat の説明に従うと、LuaTeX 拡張プリミティブは
-%! plain/LaTeX の両方で \luatex 付の名前(\directlua はそのまま)
-%! で使えると考えてよい。
-
 %% \LuaTeXjaAvailable
 %! 環境検査にパスした時に定義される.
 \let\LuaTeXjaAvailable=t %
index 9f3bd36..ec5f902 100644 (file)
@@ -20,6 +20,16 @@ function luatexja.load_lua(fn)
    end
 end
 
+local setfield = node.direct.setfield
+luatexja.setglue = node.direct.setglue or
+    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,'stretch_order',sto or 0)
+      setfield(g,'shrink_order', sho or 0)
+    end
+
 -- check token library
 if newtoken then
    luatexja.token = newtoken
@@ -292,10 +302,9 @@ end
 do
    local start_time_measure, stop_time_measure
       = ltjb.start_time_measure, ltjb.stop_time_measure
-   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 to_node = node.direct.tonode
+   local to_direct = node.direct.todirect
    local ensure_tex_attr = ltjb.ensure_tex_attr
 
    -- mode = true iff main_process is called from pre_linebreak_filter
@@ -353,7 +362,6 @@ local has_attr = node.has_attribute
 
 local id_penalty = node.id('penalty')
 local id_glyph = node.id('glyph')
-local id_glue_spec = node.id('glue_spec')
 local id_glue = node.id('glue')
 local id_kern = node.id('kern')
 local id_hlist = node.id('hlist')
@@ -423,7 +431,7 @@ local function debug_show_node_X(p,print_fn, limit)
         .. ', dir=' .. tostring(node.has_attribute(p, attr_dir))
       print_fn(s)
    elseif pt == 'glue' then
-      s = base .. ' ' ..  print_spec(p.spec)
+      s = base .. ' ' ..  print_spec(p)
       if get_attr_icflag(p)>icflag_table.KINSOKU
          and get_attr_icflag(p)<icflag_table.KANJI_SKIP then
          s = s .. ' (from JFM: priority ' .. get_attr_icflag(p)-icflag_table.FROM_JFM .. ')'