+ function luatexja.direction.remove_end_whatsit()
+ local h=tex.lists.page_head
+ if h and (not h.next) and
+ h.id==id_whatsit and h.subtype==sid_user and
+ h.user_id == DIR then
+ tex.lists.page_head = nil
+ node.free(h)
+ end
+ end
+end
+
+-- append_to_vlist filter: done in ltj-lineskip.lua
+
+-- finalize (executed just before \shipout)
+-- we supply correct pdfsavematrix nodes etc. inside dir_node
+do
+ local finalize_inner
+ local function finalize_dir_node(db,new_dir)
+ local b = getlist(db)
+ if getid(b)==id_whatsit and getsubtype(b)==sid_user
+ and getfield(b, 'user_id')==DIR then
+ local ob = b; b = node_remove(b,b); setfield(db, 'head', b);
+ node_free(ob)
+ end
+ finalize_inner(b)
+ local w = getfield(b, 'width')
+ local h = getfield(b, 'height')
+ local d = getfield(b, 'depth')
+ local dn_w = getfield(db, 'width')
+ local dn_h = getfield(db, 'height')
+ local dn_d = getfield(db, 'depth')
+ local db_head, db_tail
+ local t = dir_node_aux[get_box_dir(b, dir_yoko)%dir_math_mod][new_dir]
+ t = t and t[getid(b)]; if not t then return end
+ for _,v in ipairs(t) do
+ local cmd, arg, nn = v[1], v[2]
+ if cmd=='kern' then
+ nn = node_new(id_kern, 1)
+ setfield(nn, 'kern', arg(w, h, d, dn_w, dn_h, dn_d))
+ elseif cmd=='whatsit' then
+ nn = node_new(id_whatsit, arg)
+ elseif cmd=='rotate' then
+ nn = node_new(id_whatsit, sid_matrix)
+ setfield(nn, 'data', arg)
+ elseif cmd=='box' then
+ nn = b; setfield(b, 'next', nil)
+ setfield(nn, 'shift', arg(w, h, d, dn_w, dn_h, dn_d))
+ end
+ if db_head then
+ insert_after(db_head, db_tail, nn)
+ db_tail = nn
+ else
+ setfield(db, 'head', nn)
+ db_head, db_tail = nn, nn
+ end
+ end
+ end
+
+ tex.setattribute(attr_dir, dir_yoko)
+ local shipout_temp = node_new(id_hlist)
+ tex.setattribute(attr_dir, 0)
+
+ finalize_inner = function (box)
+ for n in traverse(getlist(box)) do
+ local nid = getid(n)
+ if (nid==id_hlist or nid==id_vlist) then
+ local ndir = get_box_dir(n, dir_yoko)
+ if ndir>=dir_node_auto then -- n is dir_node
+ finalize_dir_node(n, ndir%dir_math_mod)
+ else
+ finalize_inner(n)
+ end
+ end
+ end
+ end
+ local getbox = tex.getbox
+ 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"))
+ local a_dir = get_box_dir(a, dir_yoko)
+ if a_dir~=dir_yoko then
+ local b = create_dir_node(a, a_dir, dir_yoko, false)
+ setfield(b, 'head', a); a = b
+ end
+ setfield(shipout_temp, 'head', a)
+ finalize_inner(shipout_temp)
+ setbox('global', "AtBeginShipoutBox", copy(getlist(shipout_temp)))
+ setfield(shipout_temp, 'head',nil)
+ -- garbage collect
+ --local m = collectgarbage('count')
+ --if m>lua_mem_kb+20480 then
+ -- collectgarbage(); lua_mem_kb = collectgarbage('count')
+ --end
+ --print('Lua Memory Usage', lua_mem_kb)
+ end