OSDN Git Service

sync with jsclasses
[luatex-ja/luatexja.git] / src / ltj-adjust.lua
index 4e33528..6bbc080 100644 (file)
@@ -36,6 +36,7 @@ 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 id_penalty = node.id('penalty')
 local attr_icflag = luatexbase.attributes['ltj@icflag']
 local attr_jchar_class = luatexbase.attributes['ltj@charclass']
 local lang_ja = luatexja.lang_ja
@@ -73,18 +74,20 @@ end
 
 local total_stsh = {{},{}}
 local total_st, total_sh = total_stsh[1], total_stsh[2]
-local function get_total_stretched(p)
+local get_total_stretched
+do
+local dimensions = node.direct.dimensions
+function get_total_stretched(p)
 -- return value: <補正値(sp)>
-   local go, gf, gs
-     = getfield(p, 'glue_order'), getfield(p, 'glue_set'), getfield(p, 'glue_sign')
+   local ph = getlist(p)
+   if not ph then return 0 end
    for i,_ in pairs(total_st) do total_st[i]=nil; total_sh[i]=nil end
    for i=1,#priority_table do 
       total_st[priority_table[i]]=0; total_sh[priority_table[i]]=0; 
    end
    for i=0,4 do total_st[i*65536]=0; total_sh[i*65536]=0 end
-   total_st[-1]=0; total_sh[-1]=0;
-   local pf, pfw
-   for q in node_traverse_id(id_glue, getlist(p)) do
+   total_st[-1]=0; total_sh[-1]=0;   
+   for q in node_traverse_id(id_glue, ph) do
       local a = getfield(q, 'stretch_order')
       if a>0 then a=a*65536 else 
          total_st[0] = total_st[0]+getfield(q, 'stretch')
@@ -112,11 +115,8 @@ local function get_total_stretched(p)
    if not total_sh.order then
        total_sh.order, total_sh[-65536] = -1,0.1 -- dummy
    end
-   if gs==0 then
-      return 0
-   else 
-      return round((3-2*gs)*total_stsh[gs][go*65536]*gf)
-   end
+   return getfield(p,'width') - dimensions(ph)
+end
 end
 
 local function clear_stretch(p, ic, name)
@@ -154,6 +154,11 @@ local function aw_step1(p, total)
    -- x: \rightskip
    x = node_prev(x); if not x then return total, false end
    local xi, xc = getid(x)
+   -- x may be penalty
+   while xi==id_penalty do
+      x = node_prev(x); if not x then return total, false end
+      xi = getid(x)
+   end
    if (total>0 and total_st.order>0) or (total<0 and total_sh.order>0) then
        -- 無限大のグルーで処理が行われているときは処理中止.
        return total, false
@@ -200,7 +205,8 @@ local function aw_step1(p, total)
    end
 end
 
--- 行末用
+-- step 1 最終行用
+local min, max = math.min, math.max
 local function aw_step1_last(p, total)
    local head = getlist(p)
    local x = node_tail(head); if not x then return total, false end
@@ -239,10 +245,10 @@ local function aw_step1_last(p, total)
    if not eadt then 
       return total, false
    end
-   -- 続行条件2: eadt[1]<= \parfillskip <= eadt[#eadt]
+   -- 続行条件2: min(eadt[1], 0)<= \parfillskip <= max(eadt[#eadt], 0)
    local pfw = getfield(pf, 'width') 
      + (total>0 and getfield(pf, 'stretch') or -getfield(pf, 'shrink')) *getfield(p, 'glue_set') 
-   if pfw<eadt[1] or eadt[#eadt]<pfw then return total, false end
+   if pfw<min(0,eadt[1]) or max(0,eadt[#eadt])<pfw then return total, false end
    -- \parfillskip を 0 にする
    total = total + getfield(pf, 'width') 
    total_st.order, total_sh.order = 0, 0
@@ -312,7 +318,7 @@ local function aw_step2(p, total, added_flag)
         return
       end
    end
-   total = math.abs(total)
+   total = abs(total)
    if total <= res[-1] then -- 和文処理グルー以外で足りる
       for _,v in pairs(priority_table) do clear_stretch(p, v, name) end
       local f = node_hpack(getlist(p), getfield(p, 'width'), 'exactly')
@@ -342,10 +348,9 @@ local function aw_step2(p, total, added_flag)
    end
 end
 
-
+-- step 1': lineend=extended の場合(行分割時に考慮))
 local insert_lineend_kern
 do
-   local id_penalty = node.id('penalty')
    local insert_before = node.direct.insert_before
    local KINSOKU      = luatexja.icflag_table.KINSOKU
    function insert_lineend_kern(head, nq, np, Bp)
@@ -357,7 +362,8 @@ do
            setfield(x, 'kern', eadt[1]); set_attr(x, attr_icflag, LINEEND)
            insert_before(head, np.first, x)
         end
-        for i=2,#eadt do
+        local eadt_num = #eadt
+        for i=2,eadt_num do
            local x = node_new(id_penalty)
            setfield(x, 'penalty', 0); set_attr(x, attr_icflag, KINSOKU)
            insert_before(head, np.first, x); Bp[#Bp+1] = x
@@ -365,12 +371,12 @@ do
            setfield(x, 'kern', eadt[i]-eadt[i-1]); set_attr(x, attr_icflag, LINEEND)
            insert_before(head, np.first, x)
         end
-         if #eadt>1 or eadt[1]~=0 then
+         if eadt_num>1 or eadt[1]~=0 then
            local x = node_new(id_penalty)
            setfield(x, 'penalty', 0); set_attr(x, attr_icflag, KINSOKU)
            insert_before(head, np.first, x); Bp[#Bp+1] = x
            local x = node_new(id_kern, 1)
-           setfield(x, 'kern', -eadt[#eadt]); set_attr(x, attr_icflag, LINEEND)
+           setfield(x, 'kern', -eadt[eadt_num]); set_attr(x, attr_icflag, LINEEND)
            insert_before(head, np.first, x)
            local x = node_new(id_penalty)
            setfield(x, 'penalty', 10000); set_attr(x, attr_icflag, KINSOKU)
@@ -409,7 +415,6 @@ do
         luatexbase.remove_from_callback('post_linebreak_filter', 'Adjust width')
         is_reg = false
       end
-      myaw_step1 = dummy --(status%2>0) and aw_step1 or dummy
       if status_le==2 then
         if not luatexbase.in_callback('luatexja.adjust_jfmglue', 'luatexja.adjust') then
            luatexbase.add_to_callback('luatexja.adjust_jfmglue', insert_lineend_kern, 'luatexja.adjust')