-end
-
-local new_ks, new_xs
-local function get_total_stretched(p)
- local go, gf, gs = p.glue_order, p.glue_set, p.glue_sign
- local res = {
- [0] = 0,
- glue_set = gf, name = (gs==1) and 'stretch' or 'shrink'
- }
- for i=1,#priority_table do res[priority_table[i]]=0 end
- if go ~= 0 then return nil end
- if gs ~= 1 and gs ~= 2 then return res end
- local head = p.head
- q = p.head
- --luatexja.ext_show_node_list(p.head, '>>> ', print)
- while q do
- if q.id==id_glue then
- local a, ic = get_stretched(q, go, gs), get_attr_icflag(q)
- if type(res[ic]) == 'number' then
- -- kanjiskip, xkanjiskip は段落内で spec を共有しているが,
- -- それはここでは望ましくないので,
- -- 各行ごとに異なる spec を使うようにする.
- -- しかしここでは面倒なので,各 glue ごとに別の spec を使っている.
- -- ぜひなんとかしたい!
- -- JFM グルーはそれぞれ異なる glue_spec を用いているので,問題ない.
- res[ic] = res[ic] + a
- if ic == KANJI_SKIP then
- if q.spec ~= spec_zero_glue then
- if not new_ks then
- local ts; q.spec, ts = node_copy(q.spec), q.spec
- new_ks, q.spec = node.copy(q), ts
- end
- local g = node.copy(new_ks)
- node.insert_before(head, q, g);
- head = node.remove(head, q); node.free(q); q = g
- end
- elseif ic == XKANJI_SKIP then
- if q.spec ~= spec_zero_glue then
- if not new_xs then
- local ts; q.spec, ts = node_copy(q.spec), q.spec
- new_xs, q.spec = node.copy(q), ts
- end
- local g =node.copy(new_xs)
- node.insert_before(head, q, g);
- head = node.remove(head, q); node.free(q); q = g
- end
- end
- else
- res[0] = res[0] + a
- 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;
+ for q in node_traverse_id(id_glue, getlist(p)) do
+ local a = getfield(q, 'stretch_order')
+ if a>0 then a=a*65536 else
+ total_st[0] = total_st[0]+getfield(q, 'stretch')
+ a = get_attr_icflag(q)
+ if a == KANJI_SKIP_JFM then a = KANJI_SKIP
+ elseif a == XKANJI_SKIP_JFM then a = XKANJI_SKIP
+ elseif type(total_st[a])~='number' then a = -1 end
+ end
+ total_st[a] = total_st[a]+getfield(q, 'stretch')
+ local a = getfield(q, 'shrink_order')
+ if a>0 then a=a*65536 else
+ total_sh[0] = total_sh[0]+getfield(q, 'shrink')
+ a = get_attr_icflag(q)
+ if a == KANJI_SKIP_JFM then a = KANJI_SKIP
+ elseif a == XKANJI_SKIP_JFM then a = XKANJI_SKIP
+ elseif type(total_sh[a])~='number' then a = -1 end