diff options
Diffstat (limited to 'Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua')
-rw-r--r-- | Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua | 122 |
1 files changed, 66 insertions, 56 deletions
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua index b5f267c4bb1..c54842a86b6 100644 --- a/Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua +++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua @@ -10,26 +10,24 @@ local attr_dir = luatexbase.attributes['ltj@dir'] local attr_icflag = luatexbase.attributes['ltj@icflag'] local cat_lp = luatexbase.catcodetables['latex-package'] -local Dnode = node.direct or node -local nullfunc = function (n) return n end -local to_node = (Dnode ~= node) and Dnode.tonode or nullfunc -local to_direct = (Dnode ~= node) and Dnode.todirect or nullfunc -local has_attr = Dnode.has_attribute -local set_attr = Dnode.set_attribute -local insert_before = Dnode.insert_before -local insert_after = Dnode.insert_after -local getid = (Dnode ~= node) and Dnode.getid or function(n) return n.id end -local getsubtype = (Dnode ~= node) and Dnode.getsubtype or function(n) return n.subtype end -local getlist = (Dnode ~= node) and Dnode.getlist or function(n) return n.head end -local setfield = (Dnode ~= node) and Dnode.setfield or function(n, i, c) n[i] = c end -local getfield = (Dnode ~= node) and Dnode.getfield or function(n, i) return n[i] end -local node_new = Dnode.new -local node_tail = Dnode.tail -local node_free = Dnode.free -local node_remove = Dnode.remove -local node_next = (Dnode ~= node) and Dnode.getnext or node.next -local traverse = Dnode.traverse -local traverse_id = Dnode.traverse_id +local to_node = node.direct.tonode +local to_direct = node.direct.todirect +local has_attr = node.direct.has_attribute +local set_attr = node.direct.set_attribute +local insert_before = node.direct.insert_before +local insert_after = node.direct.insert_after +local getid = node.direct.getid +local getsubtype = node.direct.getsubtype +local getlist = node.direct.getlist +local setfield = node.direct.setfield +local getfield = node.direct.getfield +local node_new = node.direct.new +local node_tail = node.direct.tail +local node_free = node.direct.free +local node_remove = node.direct.remove +local node_next = node.direct.getnext +local traverse = node.direct.traverse +local traverse_id = node.direct.traverse_id local start_time_measure, stop_time_measure = ltjb.start_time_measure, ltjb.stop_time_measure local abs = math.abs @@ -65,7 +63,7 @@ local page_direction -- local dir_pool do - local node_copy = Dnode.copy + local node_copy = node.direct.copy dir_pool = {} for _,i in pairs({dir_tate, dir_yoko, dir_dtou, dir_utod}) do local w = node_new(id_whatsit, sid_user) @@ -140,7 +138,6 @@ do local node_traverse = node.traverse local STCK = luatexja.userid_table.STCK local IHB = luatexja.userid_table.IHB - local sid_local = node.subtype('local_par') local id_local = node.id('local_par') local function test_list(h, lv) @@ -159,8 +156,6 @@ do elseif not(uid==IHB or uid==STCK) then flag = 0; break -- error end - elseif ps~=sid_local then - flag = 0; break end elseif p.id~=id_local then flag = 0; break @@ -581,7 +576,7 @@ local function unwrap_dir_node(b, head, box_dir) end local shift_old, b_dir, wh = nil, get_box_dir(bh, 0) if wh then - Dnode.flush_list(getfield(wh, 'value')) + node.direct.flush_list(getfield(wh, 'value')) setfield(wh, 'value', nil) end return nh, nb, bh, b_dir @@ -626,7 +621,7 @@ do -- dir_node としてカプセル化されている local _, dnc = get_box_dir(b, 0) if dnc then -- free all other dir_node - Dnode.flush_list(getfield(dnc, 'value')) + node.direct.flush_list(getfield(dnc, 'value')) setfield(dnc, 'value', nil) end set_attr(b, attr_dir, box_dir%dir_math_mod + dir_node_auto) @@ -656,7 +651,7 @@ do db=x; break end end - Dnode.flush_list(getfield(dn, 'value')) + node.direct.flush_list(getfield(dn, 'value')) setfield(dn, 'value', nil) db = db or create_dir_node(b, box_dir, new_dir, false) local w = getfield(b, 'width') @@ -687,7 +682,7 @@ do end -- lastbox - local node_prev = (Dnode~=node) and Dnode.getprev or node.prev + local node_prev = (node.direct~=node) and node.direct.getprev or node.prev local function lastbox_hook() start_time_measure('box_primitive_hook') local bn = tex_nest[tex_nest.ptr].tail @@ -705,7 +700,7 @@ do end local _, wh = get_box_dir(b, 0) -- clean dir_node attached to the box if wh then - Dnode.flush_list(getfield('value', wh)) + node.direct.flush_list(getfield('value', wh)) setfield(wh, 'value', nil) end end @@ -766,8 +761,8 @@ do luatexja.direction.get_box_dim = get_box_dim -- return value: (changed dimen of box itself?) - local scan_dimen, scan_int = luatexja.token.scan_dimen, luatexja.token.scan_int - local scan_keyword = luatexja.token.scan_keyword + local scan_dimen, scan_int = token.scan_dimen, token.scan_int + local scan_keyword = token.scan_keyword local function set_box_dim_common(key, s, l_dir) local s_dir, wh = get_box_dir(s, dir_yoko) s_dir = s_dir%dir_math_mod @@ -866,7 +861,7 @@ do end do - local getbox, setbox, copy_list = tex.getbox, tex.setbox, Dnode.copy_list + local getbox, setbox, copy_list = tex.getbox, tex.setbox, node.direct.copy_list -- raise, lower function luatexja.direction.raise_box() start_time_measure('box_primitive_hook') @@ -913,7 +908,7 @@ do 'luatexja', 'Direction Incompatible', "\\vadjust's argument and outer vlist must have same direction.") - Dnode.last_node() + node.direct.last_node() end end stop_time_measure('box_primitive_hook') @@ -964,14 +959,6 @@ do ltjs.list_dir = has_attr(bh, attr_dir); break end end - -- local bh=hd - -- for i=1,2 do - -- if bh and getid(bh)==id_whatsit - -- and getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR then - -- ltjs.list_dir = has_attr(bh, attr_dir); break - -- end - -- bh = node_next(bh) - -- end if split_dir_whatsit then -- adjust direction of 'split_keep' set_attr(split_dir_whatsit, attr_dir, ltjs.list_dir) @@ -981,7 +968,9 @@ do split_dir_whatsit=nil else adjust_badness(hd) - hd = process_dir_node(create_dir_whatsit_vbox(hd, gc), gc) + -- hd = process_dir_node(create_dir_whatsit_vbox(hd, gc), gc) + -- done in append_to_vpack callback + hd = create_dir_whatsit_vbox(hd, gc) split_dir_whatsit=nil end stop_time_measure('direction_vpack') @@ -1012,23 +1001,44 @@ do end end --- buildpage filter +-- append_to_vlist filter do - local function dir_adjust_buildpage(info) - if info=='box' then - local head = to_direct(tex.lists.contrib_head) - if head then - head = make_dir_whatsit(head, - node_tail(head), - get_dir_count(), - 'buildpage') - tex.lists.contrib_head = to_node(head) + local id_glue = node.id('glue') + local getglue = node.direct.getglue or + function(g) + return getfield(g,'width'), getfield(g,'stretch'), getfield(g,'shrink'), + getfield(g,'stretch_order'), getfield(g,'shrink_order') + end +local setglue = luatexja.setglue + local function copy_glue (new_glue, old_glue, subtype, new_w) + setfield(new_glue, 'subtype', subtype) + local w,st,sp,sto,spo = getglue(to_direct(old_glue)) + setglue(new_glue, new_w or w, st, sp, sto, spo) + end + local node_write = node.direct.write + local function dir_adjust_append_vlist(b, loc, prev, mirrored) + local old_b = to_direct(b) + local new_b = loc=='box' and + make_dir_whatsit(old_b, old_b, get_dir_count(), 'append_vlist') or old_b + + if prev > -65536000 then + local d = tex.baselineskip.width - prev + - getfield(new_b, mirrored and 'depth' or 'height') + local g = node_new(id_glue) + if d < tex.lineskiplimit then + copy_glue(g, tex.lineskip, 1) + else + copy_glue(g, tex.baselineskip, 2, d); end + node_write(g) end + node_write(new_b) + tex.prevdepth = getfield(new_b, mirrored and 'height' or 'depth') + return nil -- do nothing on tex side end - ltjb.add_to_callback('buildpage_filter', - dir_adjust_buildpage, - 'ltj.direction', 10000) + ltjb.add_to_callback('append_to_vlist_filter', + dir_adjust_append_vlist, + 'ltj.direction', 10000) end -- finalize (executed just before \shipout) @@ -1088,7 +1098,7 @@ do end end local getbox = tex.getbox - local setbox, copy = Dnode.setbox, Dnode.copy + local setbox, copy = node.direct.setbox, node.direct.copy local lua_mem_kb = 0 function luatexja.direction.finalize() local a = to_direct(tex.getbox("AtBeginShipoutBox")) |