OSDN Git Service

updated test22-ltjs-mag.{tex,sh} (check 'xreal' option in ltjsclasses)
[luatex-ja/luatexja.git] / src / ltj-jfmglue.lua
index 11f648b..11c59c6 100644 (file)
@@ -283,8 +283,8 @@ do
 
 local traverse = Dnode.traverse
 local function check_next_ickern(lp)
-   if lp and getid(lp) == id_kern and ITALIC == get_attr_icflag(lp) then
-      set_attr(lp, attr_icflag, IC_PROCESSED)
+  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);
       Np.last = lp; return node_next(lp)
    else
       Np.last = Np.nuc; return lp
@@ -296,9 +296,13 @@ local function calc_np_pbox(lp, last)
    Np.first = Np.first or lp; Np.id = id_pbox
    set_attr(lp, attr_icflag, get_attr_icflag(lp));
    while lp ~=last and (lpa>=PACKED) and (lpa<BOXBDD) do
-      if getid(lp)==id_hlist or getid(lp)==id_vlist then
+      local lpi = getid(lp)
+      if lpi==id_hlist or lpi==id_vlist then
         head, lp, nc = ltjd_make_dir_whatsit(head, lp, list_dir, 'jfm pbox')
         Np.first = first and nc or Np.first
+      elseif (lpi==id_rule) and (lpa==PACKED) then
+         lp = node_next(lp)
+        nc, lp = lp, node_next(lp)
       else
         nc, lp = lp, node_next(lp)
       end
@@ -314,6 +318,7 @@ end
 local ltjw_apply_ashift_math = ltjw.apply_ashift_math
 local ltjw_apply_ashift_disc = ltjw.apply_ashift_disc
 local min, max = math.min, math.max
+local rule_subtype = (status.luatex_version>=85) and 3 or 0
 local function calc_np_aux_glyph_common(lp)
    Np.nuc = lp
    Np.first= (Np.first or lp)
@@ -354,11 +359,15 @@ local function calc_np_aux_glyph_common(lp)
               if ls==2 then -- アクセント用の kern
                  set_attr(lx, attr_icflag, PROCESSED)
                  lx = node_next(lx) -- lx: アクセント本体
-                 setfield(lx, 'yoffset', getfield(lx, 'yoffset') - (has_attr(lx,attr_ablshift) or 0))
+                 if getid(lx)==id_glyph then
+                    setfield(lx, 'yoffset', getfield(lx, 'yoffset') - (has_attr(lx,attr_ablshift) or 0))
+                 else -- アクセントは上下にシフトされている
+                    setfield(lx, 'shift', getfield(lx, 'shift') + (has_attr(lx,attr_ablshift) or 0))
+                 end
                  lx = node_next(node_next(lx))
               elseif ls==0  then
                  Np.last = lx
-              elseif (ls==1 and lai==ITALIC) then
+              elseif (ls==3) or (lai==ITALIC) then
                  Np.last = lx; set_attr(lx, attr_icflag, IC_PROCESSED)
               else
                  lp=lx; break
@@ -370,7 +379,7 @@ local function calc_np_aux_glyph_common(lp)
       end
       local r
       if adj_depth>node_depth then
-           r = node_new(id_rule)
+           r = node_new(id_rule,rule_subtype)
            setfield(r, 'width', 0); setfield(r, 'height', 0)
            setfield(r, 'depth',adj_depth); setfield(r, 'dir', tex_dir)
            set_attr(r, attr_icflag, PROCESSED)
@@ -490,6 +499,11 @@ local calc_np_auxtable = {
       if getsubtype(lp)==2 then
         Np.first = Np.first or lp
         set_attr(lp, attr_icflag, PROCESSED); lp = node_next(lp)
+        if getid(lp)==id_glyph then -- アクセント本体
+           setfield(lp, 'yoffset', getfield(lp, 'yoffset') - (has_attr(lp,attr_ablshift) or 0))
+        else -- アクセントは上下にシフトされている
+           setfield(lp, 'shift', getfield(lp, 'shift') + (has_attr(lp,attr_ablshift) or 0))
+        end
         set_attr(lp, attr_icflag, PROCESSED); lp = node_next(lp)
         set_attr(lp, attr_icflag, PROCESSED); lp = node_next(lp)
         set_attr(lp, attr_icflag, PROCESSED);
@@ -506,10 +520,17 @@ local calc_np_auxtable = {
    end,
 }
 calc_np_auxtable[id_rule]   = calc_np_auxtable.box_like
-calc_np_auxtable[13]        = calc_np_auxtable.box_like
+if status.luatex_version>=85 then
+  calc_np_auxtable[15]        = calc_np_auxtable.box_like
+else
+  calc_np_auxtable[13]        = calc_np_auxtable.box_like
+end
 calc_np_auxtable[id_ins]    = calc_np_auxtable.skip
 calc_np_auxtable[id_mark]   = calc_np_auxtable.skip
 calc_np_auxtable[id_adjust] = calc_np_auxtable.skip
+if node.id('local_par') then
+   calc_np_auxtable[node.id('local_par')] = calc_np_auxtable.skip
+end
 
 function calc_np(last, lp)
    local k
@@ -525,7 +546,7 @@ function calc_np(last, lp)
    for k = 1,#Bp do Bp[k] = nil end
    while lp ~= last  do
       local lpa = has_attr(lp, attr_icflag) or 0
-       -- unbox 由来ノードの検出
+      -- unbox 由来ノードの検出
       if lpa>=PACKED then
          if lpa%PROCESSED_BEGIN_FLAG == BOXBDD then
            local lq = node_next(lp)
@@ -1085,6 +1106,7 @@ end
 -- return value: (the initial cursor lp), (last node)
 local init_var
 do
+   local id_local = node.id('local_par')
    local KANJI_SKIP   = luatexja.icflag_table.KANJI_SKIP
    local XKANJI_SKIP   = luatexja.icflag_table.XKANJI_SKIP
    local KSK  = luatexja.stack_table_index.KSK
@@ -1135,8 +1157,10 @@ do
         -- the current list is to be line-breaked:
         -- hbox from \parindent is skipped.
         local lp, par_indented, lpi, lps  = head, 'boxbdd', getid(head), getsubtype(head)
-        while lp and ((lpi==id_whatsit and lps~=sid_user)
-                      or ((lpi==id_hlist) and (lps==3))) do
+        while lp and 
+           ((lpi==id_whatsit and lps~=sid_user)
+              or ((lpi==id_hlist) and (lps==3))
+               or (lpi==id_local)) do
            if (lpi==id_hlist) and (lps==3) then
                Np.char, par_indented = 'parbdd', 'parbdd'
                Np.width = getfield(lp, 'width')
@@ -1177,7 +1201,8 @@ function main(ahead, mode, dir)
    lp = calc_np(last, lp)
    if Np then
       handle_list_head(par_indented)
-      lp = calc_np(last,lp); while Np do
+      lp = calc_np(last,lp); 
+      while Np do
         adjust_nq();
         local pid, pm = Np.id, Np.met
         -- 挿入部