OSDN Git Service

removed \null
[luatex-ja/luatexja.git] / src / ltj-jfmglue.lua
index a51dacb..d33f032 100644 (file)
@@ -127,19 +127,24 @@ end
 
 
 -- penalty 値の計算
-local function add_penalty(p,e)
-   local pp = getfield(p, 'penalty')
-   if pp>=10000 then
-      if e<=-10000 then setfield(p, 'penalty', 0) end
-   elseif pp<=-10000 then
-      if e>=10000 then  setfield(p, 'penalty', 0) end
-   else
-      pp = pp + e
-      if pp>=10000 then      setfield(p, 'penalty', 10000)
-      elseif pp<=-10000 then setfield(p, 'penalty', -10000)
-      else                   setfield(p, 'penalty', pp) end
+local add_penalty
+do
+local setpenalty = node.direct.setpenalty or function(n, a) setfield(n,'penalty',a) end
+local getpenalty = node.direct.getpenalty or function(n) return getfield(n,'penalty') end
+function add_penalty(p,e)
+   local pp = getpenalty(p)
+   if (pp>-10000) and (pp<10000) then
+      if e>=10000 then       setpenalty(p, 10000)
+      elseif e<=-10000 then  setpenalty(p, -10000)
+      else
+         pp = pp + e
+         if pp>=10000 then      setpenalty(p, 10000)
+         elseif pp<=-10000 then setpenalty(p, -10000)
+        else                   setpenalty(p, pp) end
+      end
    end
 end
+end
 
 -- 「異なる JFM」の間の調整方法
 diffmet_rule = math.two_paverage
@@ -933,18 +938,40 @@ local function combine_spc(name)
    return (Np[name] or Nq[name]) and ((Np[name]~=0) and (Nq[name]~=0))
 end
 
+-- NA, NB: alchar or math
+local function get_NA_skip()
+   local pm = Np.met
+   local g, _, kn, kp, kh = new_jfm_glue(
+      pm.char_type,
+      fast_find_char_class(
+        (Nq.id == id_math and -1 or (Nq.xspc>=2 and 'alchar' or 'nox_alchar')), pm), 
+      Np.class)
+   local k = ((Nq.xspc>=2) and (Np.xspc%2==1) and combine_spc('auto_xspc'))
+       and get_xkanjiskip_low(false, pm, kn, kp, kh)
+   return g, k
+end
+local function get_NB_skip()
+   local qm = Nq.met
+   local g, _, kn, kp, kh = new_jfm_glue(
+      qm.char_type, Nq.class,
+      fast_find_char_class(
+        (Np.id == id_math and -1 or (Np.xspc%2==1 and 'alchar' or 'nox_alchar')), qm)
+    )
+   local k = ((Nq.xspc>=2) and (Np.xspc%2==1) and combine_spc('auto_xspc'))
+        and get_xkanjiskip_low(false, qm, kn, kp, kh)
+   return g, k
+end
+
 local function get_OA_skip(is_kanji)
    local pm = Np.met
    local g, _, kn, kp, kh = new_jfm_glue(
       pm.char_type,
-      fast_find_char_class((Nq.id == id_math and -1 or 'jcharbdd'), pm), 
+      fast_find_char_class(
+        (((Nq.id==id_glue)or(Nq.id==id_kern)) and 'glue' or 'jcharbdd'), pm), 
       Np.class)
    local k
    if is_kanji==0 then
       k = combine_spc('auto_kspc') and get_kanjiskip_low(false, pm, kn, kp, kh)
-   elseif is_kanji==1 then
-      k = ((Nq.xspc>=2) and (Np.xspc%2==1) and combine_spc('auto_xspc'))
-        and get_xkanjiskip_low(false, pm, kn, kp, kh)
    end
    return g, k
 end
@@ -952,13 +979,11 @@ local function get_OB_skip(is_kanji)
    local qm = Nq.met
    local g, _, kn, kp, kh = new_jfm_glue(
       qm.char_type, Nq.class,
-      fast_find_char_class((Np.id == id_math and -1 or'jcharbdd'), qm))
+      fast_find_char_class(
+        (((Np.id==id_glue)or(Np.id==id_kern)) and 'glue' or 'jcharbdd'), qm))
    local k
    if is_kanji==0 then
       k = combine_spc('auto_kspc') and get_kanjiskip_low(false, qm, kn, kp, kh)
-   elseif is_kanji==1 then
-      k = ((Nq.xspc>=2) and (Np.xspc%2==1) and combine_spc('auto_xspc'))
-        and get_xkanjiskip_low(false, qm, kn, kp, kh)
    end
    return g, k
 end
@@ -979,7 +1004,7 @@ local function handle_np_jachar(mode)
       handle_penalty_normal(0, Np.pre, g); real_insert(g); real_insert(k)
    elseif Nq.pre then
       local g, k
-      if non_ihb_flag then g, k = get_OA_skip(1) end -- O_A->X
+      if non_ihb_flag then g, k = get_NA_skip() end -- N_A->X
       if not g then g = get_xkanjiskip(Np) end
       handle_penalty_normal((qid==id_hlist and 0 or Nq.post), Np.pre, g); 
       real_insert(g); real_insert(k)
@@ -1000,7 +1025,7 @@ end
 -- jachar .. (anything)
 local function handle_nq_jachar()
     if Np.pre then
-      local g = non_ihb_flag and get_OB_skip(1) or get_xkanjiskip(Nq) -- O_B->X
+      local g = non_ihb_flag and get_NB_skip() or get_xkanjiskip(Nq) -- N_B->X
       handle_penalty_normal(Nq.post, (Np.id==id_hlist and 0 or Np.pre), g); real_insert(g)
    else
       local g =non_ihb_flag and  (get_OB_skip()) -- O_B