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
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')
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)
-- 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
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
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
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')
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)
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
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)
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')