OSDN Git Service

ligature of JACHARs
[luatex-ja/luatexja.git] / src / luatexja.lua
index 1134195..422035e 100644 (file)
@@ -20,15 +20,26 @@ 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)
+do
+    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
+    local getfield = node.direct.getfield
+    luatexja.getglue = node.direct.getglue or
+    function(g)
+       return getfield(g,'width'),
+              getfield(g,'stretch'),
+              getfield(g,'shrink'),
+              getfield(g,'stretch_order'),
+              getfield(g,'shrink_order')
     end
+end
 
 --- 以下は全ファイルで共有される定数
 local icflag_table = {}
@@ -36,17 +47,18 @@ luatexja.icflag_table = icflag_table
 icflag_table.ITALIC          = 1
 icflag_table.PACKED          = 2
 icflag_table.KINSOKU         = 3
-icflag_table.FROM_JFM        = 6
+icflag_table.FROM_JFM        = 4
 -- FROM_JFM: 4, 5, 6, 7, 8 →優先度高(伸びやすく,縮みやすい)
 -- 6 が標準
-icflag_table.KANJI_SKIP      = 9
-icflag_table.KANJI_SKIP_JFM  = 10
-icflag_table.XKANJI_SKIP     = 11
-icflag_table.XKANJI_SKIP_JFM = 12
-icflag_table.PROCESSED       = 13
-icflag_table.IC_PROCESSED    = 14
-icflag_table.BOXBDD          = 15
-icflag_table.PROCESSED_BEGIN_FLAG = 128
+icflag_table.KANJI_SKIP      = 68 -- = 4+64
+icflag_table.KANJI_SKIP_JFM  = 69
+icflag_table.XKANJI_SKIP     = 70
+icflag_table.XKANJI_SKIP_JFM = 71
+icflag_table.LINEEND         = 72
+icflag_table.PROCESSED       = 73
+icflag_table.IC_PROCESSED    = 74
+icflag_table.BOXBDD          = 75
+icflag_table.PROCESSED_BEGIN_FLAG = 4096 -- sufficiently large power of 2
 
 local stack_table_index = {}
 luatexja.stack_table_index = stack_table_index
@@ -70,6 +82,7 @@ userid_table.IHB  = luatexbase.newuserwhatsitid('inhibitglue',  'luatexja') -- \
 userid_table.STCK = luatexbase.newuserwhatsitid('stack_marker', 'luatexja') -- スタック管理
 userid_table.BPAR = luatexbase.newuserwhatsitid('begin_par',    'luatexja') -- 「段落始め」
 userid_table.DIR  = luatexbase.newuserwhatsitid('direction',    'luatexja') -- 組方向
+userid_table.BOXB = luatexbase.newuserwhatsitid('box_boundary', 'luatexja') -- 「ボックス始め・終わり」
 
 local dir_table = {}
 luatexja.dir_table = dir_table
@@ -164,18 +177,23 @@ end
 
 -- EXT: print parameters that don't need arguments
 do
+   local tex_getattr = tex.getattribute
+   local function getattr(a)
+      local r = tex.getattribute(a)
+      return (r==-0x7FFFFFFF) and 0 or r
+   end 
    luatexja.unary_pars = {
       yalbaselineshift = function(t)
-        return print_scaled(tex.getattribute('ltj@yablshift'))..'pt'
+        return print_scaled(getattr('ltj@yablshift'))..'pt'
       end,
       yjabaselineshift = function(t)
-        return print_scaled(tex.getattribute('ltj@ykblshift'))..'pt'
+        return print_scaled(getattr('ltj@ykblshift'))..'pt'
       end,
       talbaselineshift = function(t)
-        return print_scaled(tex.getattribute('ltj@tablshift'))..'pt'
+        return print_scaled(getattr('ltj@tablshift'))..'pt'
       end,
       tjabaselineshift = function(t)
-        return print_scaled(tex.getattribute('ltj@tkblshift'))..'pt'
+        return print_scaled(getattr('ltj@tkblshift'))..'pt'
       end,
       kanjiskip = function(t)
         return print_spec(ltjs.get_stack_skip(stack_table_index.KSK, t))
@@ -187,10 +205,10 @@ do
         return ltjs.get_stack_table(stack_table_index.JWP, 0, t)
       end,
       autospacing = function(t)
-        return tex.getattribute('ltj@autospc')
+        return getattr('ltj@autospc')
       end,
       autoxspacing = function(t)
-        return tex.getattribute('ltj@autoxspc')
+        return getattr('ltj@autoxspc')
       end,
       differentjfm = function(t)
         local f, r = luatexja.jfmglue.diffmet_rule, '???'
@@ -228,8 +246,8 @@ end
 do
    luatexja.binary_pars = {
       jacharrange = function(c, t)
-        if type(c)~='number' or c<0 or c>31*ltjc.ATTR_RANGE then
-           -- 0 はエラーにしない(隠し)
+        if type(c)~='number' or c<-1 or c>31*ltjc.ATTR_RANGE then
+           -- 0, -1 はエラーにしない(隠し)
            ltjb.package_error('luatexja',
                               'invalid character range number (' .. tostring(c) .. ')',
                               'A character range number should be in the range 1..'
@@ -342,6 +360,24 @@ function luatexja.ext_cleanup()
 end
 
 
+-- lastnodechar
+do
+   local id_glyph = node.id('glyph')
+   function luatexja.pltx_composite_last_node_char()
+      local n = tex.nest[tex.nest.ptr].tail
+      local r = '-1'
+      if n then
+        if n.id==id_glyph then
+           while n.componetns and  n.subtype and n.subtype%4 >= 2 do
+              n = node.tail(n)
+           end
+           r = tostring(n.char)
+        end
+      end
+      tex.sprint(r)
+   end
+end
+
 -- debug
 
 do
@@ -374,10 +410,14 @@ local function debug_show_node_X(p,print_fn, limit)
    local base = prefix .. string.format('%X', get_attr_icflag(p))
    .. ' ' .. pt .. ' ' .. tostring(p.subtype) .. ' '
    if pt == 'glyph' then
-      s = base .. ' ' .. utf.char(p.char) .. ' '
-         .. tostring(p.font)
-         .. ' (' .. print_scaled(p.height) .. '+'
+      s = base .. ' ' .. 
+         (p.char>=0xF0000 and string.format('(U+%X)', p.char) or utf.char(p.char)) .. ' '
+         .. tostring(p.font) .. ' (' .. print_scaled(p.height) .. '+'
          .. print_scaled(p.depth) .. ')x' .. print_scaled(p.width)
+      if p.xoffset~=0 or p.yoffset~=0 then
+         s = s .. ' off: (' .. print_scaled(p.xoffset)
+               .. ',' .. print_scaled(p.yoffset) .. ')'
+      end
       print_fn(s)
    elseif pt=='hlist' or pt=='vlist' or pt=='unset'or pt=='ins' then
       if pt=='ins' then
@@ -441,6 +481,8 @@ local function debug_show_node_X(p,print_fn, limit)
         s = s .. ' (for accent)'
       elseif get_attr_icflag(p)==icflag_table.IC_PROCESSED then
         s = s .. ' (italic correction)'
+      elseif get_attr_icflag(p)==icflag_table.LINEEND then
+        s = s .. ' (end-of-line)'
          -- elseif get_attr_icflag(p)==ITALIC then
          --    s = s .. ' (italic correction)'
       elseif get_attr_icflag(p)>icflag_table.KINSOKU
@@ -493,13 +535,13 @@ local function debug_show_node_X(p,print_fn, limit)
    elseif pt=='noad' then
       s = base ; print_fn(s)
       if p.nucleus then
-         prefix = k .. 'N'; debug_show_node_X(p.nucleus, print_fn);
+         prefix = k .. 'N'; debug_show_node_X(p.nucleus, print_fn, limit);
       end
       if p.sup then
-         prefix = k .. '^'; debug_show_node_X(p.sup, print_fn);
+         prefix = k .. '^'; debug_show_node_X(p.sup, print_fn, limit);
       end
       if p.sub then
-         prefix = k .. '_'; debug_show_node_X(p.sub, print_fn);
+         prefix = k .. '_'; debug_show_node_X(p.sub, print_fn, limit);
       end
       prefix = k;
    elseif pt=='math_char' then