diff options
author | Karl Berry <karl@freefriends.org> | 2020-08-02 21:06:17 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2020-08-02 21:06:17 +0000 |
commit | 7bed06e355778cdcfb932a75896b95e7f23e4b75 (patch) | |
tree | f45a1f7186cd1fa709c1b8e63e4133725e82af3b /Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua | |
parent | 4cdd4a7d96cd11bcba0ef269aeb917290eebce38 (diff) |
luatexja (2aug20)
git-svn-id: svn://tug.org/texlive/trunk@56029 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua')
-rw-r--r-- | Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua | 1002 |
1 files changed, 492 insertions, 510 deletions
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua index 7dd0dee9061..523397d804c 100644 --- a/Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua +++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua @@ -2,8 +2,8 @@ -- src/ltj-direction.lua -- -luatexja.load_module('base'); local ltjb = luatexja.base -luatexja.load_module('stack'); local ltjs = luatexja.stack +luatexja.load_module 'base'; local ltjb = luatexja.base +luatexja.load_module 'stack'; local ltjs = luatexja.stack luatexja.direction = {} local attr_dir = luatexbase.attributes['ltj@dir'] @@ -29,17 +29,17 @@ 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 + = ltjb.start_time_measure, ltjb.stop_time_measure local abs = math.abs -local id_kern = node.id('kern') -local id_hlist = node.id('hlist') -local id_vlist = node.id('vlist') -local id_whatsit = node.id('whatsit') -local sid_save = node.subtype('pdf_save') -local sid_restore = node.subtype('pdf_restore') -local sid_matrix = node.subtype('pdf_setmatrix') -local sid_user = node.subtype('user_defined') +local id_kern = node.id 'kern' +local id_hlist = node.id 'hlist' +local id_vlist = node.id 'vlist' +local id_whatsit = node.id 'whatsit' +local sid_save = node.subtype 'pdf_save' +local sid_restore= node.subtype 'pdf_restore' +local sid_matrix = node.subtype 'pdf_setmatrix' +local sid_user = node.subtype 'user_defined' local tex_nest = tex.nest local tex_getcount = tex.getcount @@ -94,35 +94,34 @@ local get_dir_count, get_adjust_dir_count do local function get_dir_count_inner(h) if h then - if h.id==id_whatsit and h.subtype==sid_user and h.user_id==DIR then - local ic = node.has_attribute(h, attr_icflag) or 0 - return (ic<PROCESSED_BEGIN_FLAG) - and (node.has_attribute(h,attr_dir)%dir_node_auto) or 0 - else - return 0 - end + if h.id==id_whatsit and h.subtype==sid_user and h.user_id==DIR then + return ((node.has_attribute(h, attr_icflag) or 0)<PROCESSED_BEGIN_FLAG) + and (node.has_attribute(h,attr_dir)%dir_node_auto) or 0 + else + return 0 + end else - return 0 + return 0 end end function get_dir_count() for i=tex_nest.ptr, 1, -1 do - local h = tex_nest[i].head.next - if h then - local t = get_dir_count_inner(h) - if t~=0 then return t end - end + local h = tex_nest[i].head.next + if h then + local t = get_dir_count_inner(h) + if t~=0 then return t end + end end return page_direction end function get_adjust_dir_count() for i=tex_nest.ptr, 1, -1 do local v = tex_nest[i] - local h, m = v.head.next, v.mode - if abs(m)== ltjs.vmode and h then - local t = get_dir_count_inner(h) - if t~=0 then return t end - end + local h, m = v.head.next, v.mode + if abs(m)== ltjs.vmode and h then + local t = get_dir_count_inner(h) + if t~=0 then return t end + end end return page_direction end @@ -138,35 +137,34 @@ do local node_traverse = node.traverse local STCK = luatexja.userid_table.STCK local IHB = luatexja.userid_table.IHB - local id_local = node.id('local_par') - local id_dir = node.id('dir') + local id_local = node.id 'local_par' + local id_dir = node.id 'dir' local function test_list(h, lv) if not h then - return 2 -- need to create dir_whatsit + return 2 -- need to create dir_whatsit else - local flag = 2 -- need to create dir_whatsit - local w - for p in node_traverse(h) do - if p.id==id_whatsit then - local ps = p.subtype - if ps==sid_user then - local uid= p.user_id - if uid==DIR then - flag = 1; w = w or p -- found - elseif not(uid==IHB or uid==STCK) then - flag = 0; break -- error - end - end - elseif p.id~=id_local and p.id~=id_dir then - flag = 0; break - end - end - if flag==1 then -- dir_whatsit already exists - return 1,w - else - return flag - end + local flag = 2 -- need to create dir_whatsit + local w + for p in node_traverse(h) do + if p.id==id_whatsit then + if p.subtype==sid_user then + local uid= p.user_id + if uid==DIR then + flag = 1; w = w or p -- found + elseif not(uid==IHB or uid==STCK) then + return 0 -- error + end + end + elseif p.id~=id_local and p.id~=id_dir then + return 0 -- error + end + end + if flag==1 then -- dir_whatsit already exists + return 1, w + else + return flag + end end end local node_next_node, node_tail_node = node.next, node.tail @@ -175,9 +173,9 @@ do local lv = tex_nest.ptr -- must be >= 1 if not v then v = get_dir_count() - if abs(tex_nest[lv-1].mode) == ltjs.mmode and v == dir_tate then - v = dir_utod - end + if abs(tex_nest[lv-1].mode) == ltjs.mmode and v == dir_tate then + v = dir_utod + end elseif v=='adj' then v = get_adjust_dir_count() end @@ -195,32 +193,32 @@ do local lv = tex_nest.ptr if not v then v,name = get_dir_count(), nil - if lv>=1 and abs(tex_nest[lv-1].mode) == ltjs.mmode and v == dir_tate then - v = dir_utod - end + if lv>=1 and abs(tex_nest[lv-1].mode) == ltjs.mmode and v == dir_tate then + v = dir_utod + end elseif v=='adj' then v,name = get_adjust_dir_count(), nil end local current_nest = tex_nest[lv] if tex.currentgrouptype==6 then - ltjb.package_error( + ltjb.package_error( 'luatexja', "You can't use `\\" .. name .. "' in an align", - "To change the direction in an align, \n" - .. "you shold use \\hbox or \\vbox.") + "To change the direction in an align, \n" + .. "you shold use \\hbox or \\vbox.") elseif current_nest.mode == ltjs.hmode or abs(current_nest.mode) == ltjs.mmode then - ltjb.package_error( + ltjb.package_error( 'luatexja', - "Improper `\\" .. name .. "'", - 'You cannot change the direction in unrestricted horizontal mode \n' - .. 'nor math modes.') + "Improper `\\" .. name .. "'", + 'You cannot change the direction in unrestricted horizontal mode \n' + .. 'nor math modes.') else - local h = (lv==0) and tex.lists.page_head or current_nest.head.next - local flag,w = test_list(h,lv) - if flag==0 then - if lv==0 and not page_direction then - page_direction = v -- for first call of \yoko (in luatexja-core.sty) - else + local h = (lv==0) and tex.lists.page_head or current_nest.head.next + local flag,w = test_list(h,lv) + if flag==0 then + if lv==0 and not page_direction then + page_direction = v -- for first call of \yoko (in luatexja-core.sty) + else if luatexja.debug then luatexja.ext_show_node_list(node.direct.tonode(h),'>> ', texio.write_nl) end @@ -228,21 +226,21 @@ do 'luatexja', "Use `\\" .. tostring(name) .. "' at top of list", 'Direction change command by LuaTeX-ja is available\n' - .. 'only when the current list is null.') - end - elseif flag==1 then - node_set_attr(w, attr_dir, v) - if lv==0 then page_direction = v end - elseif lv==0 then - page_direction = v - else -- flag == 2: need to create dir whatsit. - local h = current_nest.head - local hn = node.next(h) - hn = (hn and hn.id==id_local) and hn or h - local w = to_node(dir_pool[v]()) - insert_after_node(h,hn,w) - current_nest.tail = node_tail_node(w) - end + .. 'only when the current list is null.') + end + elseif flag==1 then + node_set_attr(w, attr_dir, v) + if lv==0 then page_direction = v end + elseif lv==0 then + page_direction = v + else -- flag == 2: need to create dir whatsit. + local h = current_nest.head + local hn = node.next(h) + hn = (hn and hn.id==id_local) and hn or h + local w = to_node(dir_pool[v]()) + insert_after_node(h,hn,w) + current_nest.tail = node_tail_node(w) + end ensure_tex_attr(attr_icflag, 0) end ensure_tex_attr(attr_dir, 0) @@ -253,13 +251,13 @@ end -- ボックスに dir whatsit を追加 local function create_dir_whatsit(hd, gc, new_dir) if getid(hd)==id_whatsit and - getsubtype(hd)==sid_user and getfield(hd, 'user_id')==DIR then + getsubtype(hd)==sid_user and getfield(hd, 'user_id')==DIR then set_attr(hd, attr_icflag, - get_attr_icflag(hd) + PROCESSED_BEGIN_FLAG) + get_attr_icflag(hd) + PROCESSED_BEGIN_FLAG) local n =node_next(hd) if n then - set_attr(n, attr_icflag, - get_attr_icflag(n) + PROCESSED_BEGIN_FLAG) + set_attr(n, attr_icflag, + get_attr_icflag(n) + PROCESSED_BEGIN_FLAG) end ensure_tex_attr(attr_icflag, 0) return hd @@ -268,7 +266,7 @@ local function create_dir_whatsit(hd, gc, new_dir) setfield(w, 'next', hd) set_attr(w, attr_icflag, PROCESSED_BEGIN_FLAG) set_attr(hd, attr_icflag, - get_attr_icflag(hd) + PROCESSED_BEGIN_FLAG) + get_attr_icflag(hd) + PROCESSED_BEGIN_FLAG) ensure_tex_attr(attr_icflag, 0) ensure_tex_attr(attr_dir, 0) return w @@ -282,81 +280,81 @@ do local function create_dir_whatsit_hpack(h, gc) local hd = to_direct(h) if gc=='fin_row' then - if hd then - for p in traverse_id(15, hd) do -- unset - if get_box_dir(p, 0)==0 then + if hd then + for p in traverse_id(15, hd) do -- unset + if get_box_dir(p, 0)==0 then setfield(p, 'head', create_dir_whatsit(getlist(p), 'fin_row', ltjs.list_dir)) end - end - set_attr(hd, attr_icflag, PROCESSED_BEGIN_FLAG) - ensure_tex_attr(attr_icflag, 0) - end - return h + end + set_attr(hd, attr_icflag, PROCESSED_BEGIN_FLAG) + ensure_tex_attr(attr_icflag, 0) + end + return h elseif gc == 'preamble' then else - adjust_badness(hd) - return to_node(create_dir_whatsit(hd, gc, ltjs.list_dir)) + adjust_badness(hd) + return to_node(create_dir_whatsit(hd, gc, ltjs.list_dir)) end end ltjb.add_to_callback('hpack_filter', - create_dir_whatsit_hpack, 'ltj.create_dir_whatsit', 10000) + create_dir_whatsit_hpack, 'ltj.create_dir_whatsit', 10000) end do local function create_dir_whatsit_parbox(h, gc) - stop_time_measure('tex_linebreak'); + stop_time_measure 'tex_linebreak'; -- start 側は ltj-debug.lua に local new_dir = ltjs.list_dir for line in traverse_id(id_hlist, to_direct(h)) do - setfield(line, 'head', create_dir_whatsit(getlist(line), gc, new_dir) ) + setfield(line, 'head', create_dir_whatsit(getlist(line), gc, new_dir) ) end ensure_tex_attr(attr_dir, 0) return h end ltjb.add_to_callback('post_linebreak_filter', - create_dir_whatsit_parbox, 'ltj.create_dir_whatsit', 10000) + create_dir_whatsit_parbox, 'ltj.create_dir_whatsit', 10000) end local create_dir_whatsit_vbox do local wh = {} - local id_glue, sid_parskip = node.id('glue'), 3 + local id_glue, sid_parskip = node.id 'glue', 3 create_dir_whatsit_vbox = function (hd, gc) ltjs.list_dir = get_dir_count() -- remove dir whatsit for x in traverse_id(id_whatsit, hd) do - if getsubtype(x)==sid_user and getfield(x, 'user_id')==DIR then - wh[#wh+1]=x - end + if getsubtype(x)==sid_user and getfield(x, 'user_id')==DIR then + wh[#wh+1]=x + end end if hd==wh[1] then - ltjs.list_dir =has_attr(hd,attr_dir) - local x = node_next(hd) - if getid(x)==id_glue and getsubtype(x)==sid_parskip then - node_remove(hd,x); node_free(x) - end + ltjs.list_dir =has_attr(hd,attr_dir) + local x = node_next(hd) + if getid(x)==id_glue and getsubtype(x)==sid_parskip then + node_remove(hd,x); node_free(x) + end end for i=1,#wh do - hd = node_remove(hd, wh[i]); node_free(wh[i]); wh[i] = nil + hd = node_remove(hd, wh[i]); node_free(wh[i]); wh[i] = nil end if gc=='fin_row' then -- gc == 'preamble' case is treated in dir_adjust_vpack - if hd then - set_attr(hd, attr_icflag, PROCESSED_BEGIN_FLAG) - ensure_tex_attr(attr_icflag, 0) - end - return hd + if hd then + set_attr(hd, attr_icflag, PROCESSED_BEGIN_FLAG) + ensure_tex_attr(attr_icflag, 0) + end + return hd else - local n =node_next(hd) - if gc=='vtop' then - local w = create_dir_whatsit(hd, gc, ltjs.list_dir) - -- move dir whatsit after hd - setfield(hd, 'next', w); setfield(w, 'next', n) - return hd - else - hd = create_dir_whatsit(hd, gc, ltjs.list_dir) - return hd - end + local n =node_next(hd) + if gc=='vtop' then + local w = create_dir_whatsit(hd, gc, ltjs.list_dir) + -- move dir whatsit after hd + setfield(hd, 'next', w); setfield(w, 'next', n) + return hd + else + hd = create_dir_whatsit(hd, gc, ltjs.list_dir) + return hd + end end end end @@ -377,131 +375,131 @@ do local zero = function() return 0 end dir_node_aux = { [dir_yoko] = { -- yoko を - [dir_tate] = { -- tate 中で組む - width = get_h_d, - height = get_w_half, - depth = get_w_half_rem, - [id_hlist] = { - { 'whatsit', sid_save }, - { 'rotate', '0 1 -1 0' }, - { 'kern', function(w,h,d,nw,nh,nd) return -nd end }, - { 'box' , get_h}, - { 'kern', function(w,h,d,nw,nh,nd) return nd-w end }, - { 'whatsit', sid_restore }, - }, - [id_vlist] = { - { 'whatsit', sid_save }, - { 'rotate', '0 1 -1 0' }, - { 'kern' , zero }, - { 'box' , function(w,h,d,nw,nh,nd) return -nh-nd end }, - { 'kern', get_h_d_neg}, - { 'whatsit', sid_restore }, - }, - }, - [dir_dtou] = { -- dtou 中で組む - width = get_h_d, - height = get_w, - depth = zero, - [id_hlist] = { - { 'whatsit', sid_save }, - { 'rotate', '0 -1 1 0' }, - { 'kern', function(w,h,d,nw,nh,nd) return -nh end }, - { 'box', get_d_neg }, - { 'kern', function(w,h,d,nw,nh,nd) return nh-w end }, - { 'whatsit', sid_restore }, - }, - [id_vlist] = { - { 'whatsit', sid_save }, - { 'rotate', '0 -1 1 0' }, - { 'kern', get_h_d_neg }, - { 'box', zero }, - { 'whatsit', sid_restore }, - }, - }, + [dir_tate] = { -- tate 中で組む + width = get_h_d, + height = get_w_half, + depth = get_w_half_rem, + [id_hlist] = { + { 'whatsit', sid_save }, + { 'rotate', '0 1 -1 0' }, + { 'kern', function(w,h,d,nw,nh,nd) return -nd end }, + { 'box' , get_h}, + { 'kern', function(w,h,d,nw,nh,nd) return nd-w end }, + { 'whatsit', sid_restore }, + }, + [id_vlist] = { + { 'whatsit', sid_save }, + { 'rotate', '0 1 -1 0' }, + { 'kern' , zero }, + { 'box' , function(w,h,d,nw,nh,nd) return -nh-nd end }, + { 'kern', get_h_d_neg}, + { 'whatsit', sid_restore }, + }, + }, + [dir_dtou] = { -- dtou 中で組む + width = get_h_d, + height = get_w, + depth = zero, + [id_hlist] = { + { 'whatsit', sid_save }, + { 'rotate', '0 -1 1 0' }, + { 'kern', function(w,h,d,nw,nh,nd) return -nh end }, + { 'box', get_d_neg }, + { 'kern', function(w,h,d,nw,nh,nd) return nh-w end }, + { 'whatsit', sid_restore }, + }, + [id_vlist] = { + { 'whatsit', sid_save }, + { 'rotate', '0 -1 1 0' }, + { 'kern', get_h_d_neg }, + { 'box', zero }, + { 'whatsit', sid_restore }, + }, + }, }, [dir_tate] = { -- tate を - [dir_yoko] = { -- yoko 中で組む - width = get_h_d, - height = get_w, - depth = zero, - [id_hlist] = { - { 'whatsit', sid_save }, - { 'rotate', '0 -1 1 0' }, - { 'kern', function (w,h,d,nw,nh,nd) return -nh end }, - { 'box' , get_d_neg }, - { 'kern', function (w,h,d,nw,nh,nd) return nh-w end }, - { 'whatsit', sid_restore }, - }, - [id_vlist] = { - { 'whatsit', sid_save }, - { 'rotate', '0 -1 1 0' }, - { 'kern', get_h_d_neg }, - { 'box', zero }, - { 'whatsit', sid_restore }, - }, - }, - [dir_dtou] = { -- dtou 中で組む - width = get_w, - height = get_d, - depth = get_h, - [id_hlist] = { - { 'whatsit', sid_save }, - { 'rotate', '-1 0 0 -1' }, - { 'kern', get_w_neg }, - { 'box', function (w,h,d,nw,nh,nd) return h-nd end }, - { 'whatsit', sid_restore }, - }, - [id_vlist] = { - { 'whatsit', sid_save }, - { 'rotate', '-1 0 0 -1' }, - { 'kern', get_h_d_neg }, - { 'box', get_w_neg }, - { 'whatsit', sid_restore }, - }, + [dir_yoko] = { -- yoko 中で組む + width = get_h_d, + height = get_w, + depth = zero, + [id_hlist] = { + { 'whatsit', sid_save }, + { 'rotate', '0 -1 1 0' }, + { 'kern', function (w,h,d,nw,nh,nd) return -nh end }, + { 'box' , get_d_neg }, + { 'kern', function (w,h,d,nw,nh,nd) return nh-w end }, + { 'whatsit', sid_restore }, + }, + [id_vlist] = { + { 'whatsit', sid_save }, + { 'rotate', '0 -1 1 0' }, + { 'kern', get_h_d_neg }, + { 'box', zero }, + { 'whatsit', sid_restore }, + }, + }, + [dir_dtou] = { -- dtou 中で組む + width = get_w, + height = get_d, + depth = get_h, + [id_hlist] = { + { 'whatsit', sid_save }, + { 'rotate', '-1 0 0 -1' }, + { 'kern', get_w_neg }, + { 'box', function (w,h,d,nw,nh,nd) return h-nd end }, + { 'whatsit', sid_restore }, + }, + [id_vlist] = { + { 'whatsit', sid_save }, + { 'rotate', '-1 0 0 -1' }, + { 'kern', get_h_d_neg }, + { 'box', get_w_neg }, + { 'whatsit', sid_restore }, + }, }, }, [dir_dtou] = { -- dtou を - [dir_yoko] = { -- yoko 中で組む - width = get_h_d, - height = get_w, - depth = zero, - [id_hlist] = { - { 'whatsit', sid_save }, - { 'rotate', '0 1 -1 0' }, - { 'kern', function (w,h,d,nw,nh,nd) return -nd end }, - { 'box', get_h }, - { 'kern', function (w,h,d,nw,nh,nd) return nd-w end }, - { 'whatsit', sid_restore }, - }, - [id_vlist] = { + [dir_yoko] = { -- yoko 中で組む + width = get_h_d, + height = get_w, + depth = zero, + [id_hlist] = { + { 'whatsit', sid_save }, + { 'rotate', '0 1 -1 0' }, + { 'kern', function (w,h,d,nw,nh,nd) return -nd end }, + { 'box', get_h }, + { 'kern', function (w,h,d,nw,nh,nd) return nd-w end }, + { 'whatsit', sid_restore }, + }, + [id_vlist] = { { 'kern', zero }, - { 'whatsit', sid_save }, - { 'rotate', '0 1 -1 0' }, - { 'box', function (w,h,d,nw,nh,nd) return -nd-nh end }, - { 'kern', get_h_d_neg }, - { 'whatsit', sid_restore }, - }, - }, - [dir_tate] = { -- tate 中で組む - width = get_w, - height = get_d, - depth = get_h, - [id_hlist] = { - { 'whatsit', sid_save }, - { 'rotate', '-1 0 0 -1' }, - { 'kern', get_w_neg }, - { 'box', function (w,h,d,nw,nh,nd) return h-nd end }, - { 'whatsit', sid_restore }, - }, - [id_vlist] = { - { 'whatsit', sid_save }, - { 'rotate', ' -1 0 0 -1' }, - { 'kern', function (w,h,d,nw,nh,nd) return -nh-nd end }, - { 'box', get_w_neg }, - { 'kern', function (w,h,d,nw,nh,nd) return nh+nd-h-d end }, - { 'whatsit', sid_restore }, - }, - }, + { 'whatsit', sid_save }, + { 'rotate', '0 1 -1 0' }, + { 'box', function (w,h,d,nw,nh,nd) return -nd-nh end }, + { 'kern', get_h_d_neg }, + { 'whatsit', sid_restore }, + }, + }, + [dir_tate] = { -- tate 中で組む + width = get_w, + height = get_d, + depth = get_h, + [id_hlist] = { + { 'whatsit', sid_save }, + { 'rotate', '-1 0 0 -1' }, + { 'kern', get_w_neg }, + { 'box', function (w,h,d,nw,nh,nd) return h-nd end }, + { 'whatsit', sid_restore }, + }, + [id_vlist] = { + { 'whatsit', sid_save }, + { 'rotate', ' -1 0 0 -1' }, + { 'kern', function (w,h,d,nw,nh,nd) return -nh-nd end }, + { 'box', get_w_neg }, + { 'kern', function (w,h,d,nw,nh,nd) return nh+nd-h-d end }, + { 'whatsit', sid_restore }, + }, + }, }, } end @@ -509,7 +507,7 @@ end -- 1st ret val: b の組方向 -- 2nd ret val はその DIR whatsit function get_box_dir(b, default) - start_time_measure('get_box_dir') + start_time_measure 'get_box_dir' local dir = has_attr(b, attr_dir) or 0 local bh = getfield(b,'head') -- b は insert node となりうるので getlist() は使えない @@ -517,20 +515,11 @@ function get_box_dir(b, default) if bh~=0 then -- bh != nil for bh in traverse_id(id_whatsit, bh) do if getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR then - c = bh - dir = (dir==0) and has_attr(bh, attr_dir) or dir + c = bh; dir = (dir==0) and has_attr(bh, attr_dir) or dir end end end - -- for i=1,2 do - -- if bh and getid(bh)==id_whatsit - -- and getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR then - -- c = bh - -- dir = (dir==0) and has_attr(bh, attr_dir) or dir - -- end - -- bh = node_next(bh) - -- end - stop_time_measure('get_box_dir') + stop_time_measure 'get_box_dir' return (dir==0 and default or dir), c end @@ -538,54 +527,53 @@ do local getbox = tex.getbox local dir_backup function luatexja.direction.unbox_check_dir(is_copy) - start_time_measure('box_primitive_hook') + start_time_measure 'box_primitive_hook' local list_dir = get_dir_count()%dir_math_mod - local b = getbox(tex_getcount('ltj@tempcnta')) + local b = getbox(tex_getcount 'ltj@tempcnta') if b and getlist(to_direct(b)) then - local box_dir = get_box_dir(to_direct(b), dir_yoko) - if box_dir%dir_math_mod ~= list_dir then - ltjb.package_error( - 'luatexja', - "Incompatible direction list can't be unboxed", - 'I refuse to unbox a box in differrent direction.') + local box_dir = get_box_dir(to_direct(b), dir_yoko) + if box_dir%dir_math_mod ~= list_dir then + ltjb.package_error( + 'luatexja', + "Incompatible direction list can't be unboxed", + 'I refuse to unbox a box in differrent direction.') tex.sprint(cat_lp, '\\@gobbletwo') - else - dir_backup = nil - local bd = to_direct(b) - local hd = getlist(bd) - local nh = hd - while hd do - if getid(hd)==id_whatsit and getsubtype(hd)==sid_user - and getfield(hd, 'user_id')==DIR then - local d = hd - nh, hd = node_remove(nh, hd) - if is_copy and (not dir_backup) then - dir_backup = d - setfield(dir_backup, 'next', nil) - else - node_free(d) - end - else - hd = node_next(hd) - end - end - setfield(bd, 'head', nh) - end + else + dir_backup = nil + local bd = to_direct(b) + local hd = getlist(bd) + local nh = hd + while hd do + if getid(hd)==id_whatsit and getsubtype(hd)==sid_user + and getfield(hd, 'user_id')==DIR then + local d = hd + nh, hd = node_remove(nh, hd) + if is_copy and (not dir_backup) then + dir_backup = d; setfield(dir_backup, 'next', nil) + else + node_free(d) + end + else + hd = node_next(hd) + end + end + setfield(bd, 'head', nh) + end end if luatexja.global_temp and tex.globaldefs~=luatexja.global_temp then - tex.globaldefs = luatexja.global_temp + tex.globaldefs = luatexja.global_temp end - stop_time_measure('box_primitive_hook') + stop_time_measure 'box_primitive_hook' end function luatexja.direction.uncopy_restore_whatsit() - local b = getbox(tex_getcount('ltj@tempcnta')) + local b = getbox(tex_getcount 'ltj@tempcnta') if b then - local bd = to_direct(b) - if dir_backup then - setfield(dir_backup, 'next', getlist(bd)) - setfield(bd, 'head', dir_backup) - dir_backup = nil - end + local bd = to_direct(b) + if dir_backup then + setfield(dir_backup, 'next', getlist(bd)) + setfield(bd, 'head', dir_backup) + dir_backup = nil + end end end end @@ -619,7 +607,7 @@ local function create_dir_node(b, b_dir, new_dir, is_manual) local d = getfield(b, 'depth') local db = node_new(getid(b)) -- dir_node set_attr(db, attr_dir, - new_dir + (is_manual and dir_node_manual or dir_node_auto)) + new_dir + (is_manual and dir_node_manual or dir_node_auto)) set_attr(db, attr_icflag, PROCESSED) set_attr(b, attr_icflag, PROCESSED) ensure_tex_attr(attr_dir, 0) @@ -645,108 +633,108 @@ do local box_dir, dn = get_box_dir(b, ltjs.list_dir) -- 既に b の中身にあるwhatsit if (box_dir<dir_node_auto) and (not dn) then - bh = create_dir_whatsit(bh, 'make_dir_whatsit', dir_yoko) - dn = bh; setfield(b, 'head', bh) + bh = create_dir_whatsit(bh, 'make_dir_whatsit', dir_yoko) + dn = bh; setfield(b, 'head', bh) end if box_dir%dir_math_mod==new_dir then - if box_dir>=dir_node_auto then - -- dir_node としてカプセル化されている - local _, dnc = get_box_dir(b, 0) - if dnc then -- free all other dir_node - 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) - return head, node_next(b), b, true - else - -- 組方向が一緒 (up to math dir) のボックスなので,何もしなくて良い - return head, node_next(b), b, false - end + if box_dir>=dir_node_auto then + -- dir_node としてカプセル化されている + local _, dnc = get_box_dir(b, 0) + if dnc then -- free all other dir_node + 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) + return head, node_next(b), b, true + else + -- 組方向が一緒 (up to math dir) のボックスなので,何もしなくて良い + return head, node_next(b), b, false + end else - -- 組方向を合わせる必要あり + -- 組方向を合わせる必要あり local nh, nb, ret, flag - if box_dir>= dir_node_auto then -- unwrap - local b_dir + if box_dir>= dir_node_auto then -- unwrap + local b_dir head, nb, b, b_dir = unwrap_dir_node(b, head, box_dir) - bh = getlist(b) - if b_dir%dir_math_mod==new_dir then - -- dir_node の中身が周囲の組方向とあっている - return head, nb, b, false - else box_dir = b_dir end - end - box_dir = box_dir%dir_math_mod - local db - local dnh = getfield(dn, 'value') - for x in traverse(dnh) do - if has_attr(x, attr_dir)%dir_math_mod == new_dir then - setfield(dn, 'value', to_node(node_remove(dnh, x))) - db=x; break - end - end - 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') - 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') - nh, nb = insert_before(head, b, db), nil - nh, nb = node_remove(nh, b) + bh = getlist(b) + if b_dir%dir_math_mod==new_dir then + -- dir_node の中身が周囲の組方向とあっている + return head, nb, b, false + else box_dir = b_dir end + end + box_dir = box_dir%dir_math_mod + local db + local dnh = getfield(dn, 'value') + for x in traverse(dnh) do + if has_attr(x, attr_dir)%dir_math_mod == new_dir then + setfield(dn, 'value', to_node(node_remove(dnh, x))) + db=x; break + end + end + 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') + 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') + nh, nb = insert_before(head, b, db), nil + nh, nb = node_remove(nh, b) setfield(b, 'next', nil); setfield(db, 'head', b) ret, flag = db, true - return nh, nb, ret, flag + return nh, nb, ret, flag end end process_dir_node = function (hd, gc) local x, new_dir = hd, ltjs.list_dir or dir_yoko while x do - local xid = getid(x) - if (xid==id_hlist and get_attr_icflag(x)~=PACKED) - or xid==id_vlist then - hd, x = make_dir_whatsit(hd, x, new_dir, 'process_dir_node:' .. gc) - else - x = node_next(x) - end + local xid = getid(x) + if (xid==id_hlist and get_attr_icflag(x)~=PACKED) + or xid==id_vlist then + hd, x = make_dir_whatsit(hd, x, new_dir, 'process_dir_node:' .. gc) + else + x = node_next(x) + end end return hd end -- lastbox local node_prev = (node.direct~=node) and node.direct.getprev or node.prev - local id_glue = node.id('glue') + local id_glue = node.id 'glue' local function lastbox_hook() - start_time_measure('box_primitive_hook') + start_time_measure 'box_primitive_hook' local bn = tex_nest[tex_nest.ptr].tail if bn then - local b, head = to_direct(bn), to_direct(tex_nest[tex_nest.ptr].head) - local bid = getid(b) - if bid==id_hlist or bid==id_vlist then + local b, head = to_direct(bn), to_direct(tex_nest[tex_nest.ptr].head) + local bid = getid(b) + if bid==id_hlist or bid==id_vlist then local p = getlist(b) - -- alignment の各行の中身が入ったボックス + -- alignment の各行の中身が入ったボックス if p and getid(p)==id_glue and getsubtype(p)==12 then -- tabskip - local np = node_next(p); local npid = getid(np) - if npid==id_hlist or npid==id_vlist then - setfield(b, 'head', create_dir_whatsit(p, 'align', get_box_dir(np, 0))) - end + local np = node_next(p); local npid = getid(np) + if npid==id_hlist or npid==id_vlist then + setfield(b, 'head', create_dir_whatsit(p, 'align', get_box_dir(np, 0))) + end + end + local box_dir = get_box_dir(b, 0) + if box_dir>= dir_node_auto then -- unwrap dir_node + local p = node_prev(b) + local dummy1, dummy2, nb = unwrap_dir_node(b, nil, box_dir) + setfield(p, 'next', nb); tex_nest[tex_nest.ptr].tail = to_node(nb) + setfield(b, 'next', nil); setfield(b, 'head', nil) + node_free(b); b = nb end - local box_dir = get_box_dir(b, 0) - if box_dir>= dir_node_auto then -- unwrap dir_node - local p = node_prev(b) - local dummy1, dummy2, nb = unwrap_dir_node(b, nil, box_dir) - setfield(p, 'next', nb); tex_nest[tex_nest.ptr].tail = to_node(nb) - setfield(b, 'next', nil); setfield(b, 'head', nil) - node_free(b); b = nb - end - local _, wh = get_box_dir(b, 0) -- clean dir_node attached to the box - if wh then - node.direct.flush_list(getfield('value', wh)) - setfield(wh, 'value', nil) - end - end + local _, wh = get_box_dir(b, 0) -- clean dir_node attached to the box + if wh then + node.direct.flush_list(getfield('value', wh)) + setfield(wh, 'value', nil) + end + end end - stop_time_measure('box_primitive_hook') + stop_time_measure 'box_primitive_hook' end luatexja.direction.make_dir_whatsit = make_dir_whatsit @@ -825,55 +813,55 @@ do setfield(wh, 'value',to_node(db)) end setfield(db, key, scan_dimen()) - return false + return false else setfield(s, key, scan_dimen()) - if wh then - -- change dimension of dir_nodes which are created "automatically" - local bw, bh, bd - = getfield(s,'width'), getfield(s, 'height'), getfield(s, 'depth') - for x in traverse(getfield(wh, 'value')) do - local x_dir = has_attr(x, attr_dir) - if x_dir<dir_node_manual then - local info = dir_node_aux[s_dir][x_dir%dir_node_auto] - setfield(x, 'width', info.width(bw,bh,bd)) - setfield(x, 'height', info.height(bw,bh,bd)) - setfield(x, 'depth', info.depth(bw,bh,bd)) - end - end - end - return true + if wh then + -- change dimension of dir_nodes which are created "automatically" + local bw, bh, bd + = getfield(s,'width'), getfield(s, 'height'), getfield(s, 'depth') + for x in traverse(getfield(wh, 'value')) do + local x_dir = has_attr(x, attr_dir) + if x_dir<dir_node_manual then + local info = dir_node_aux[s_dir][x_dir%dir_node_auto] + setfield(x, 'width', info.width(bw,bh,bd)) + setfield(x, 'height', info.height(bw,bh,bd)) + setfield(x, 'depth', info.depth(bw,bh,bd)) + end + end + end + return true end end local function set_box_dim(key) local s = getbox(scan_int()); scan_keyword('=') if s then - local l_dir = (get_dir_count())%dir_math_mod - s = to_direct(s) + local l_dir = (get_dir_count())%dir_math_mod + s = to_direct(s) local b_dir = get_box_dir(s,dir_yoko) if b_dir<dir_node_auto then set_box_dim_common(key, s, l_dir) - elseif b_dir%dir_math_mod == l_dir then - -- s is dir_node - setfield(s, key, scan_dimen()) - if b_dir<dir_node_manual then - set_attr(s, attr_dir, b_dir%dir_node_auto + dir_node_manual) - end + elseif b_dir%dir_math_mod == l_dir then + -- s is dir_node + setfield(s, key, scan_dimen()) + if b_dir<dir_node_manual then + set_attr(s, attr_dir, b_dir%dir_node_auto + dir_node_manual) + end else - local sid, b = getid(s), getlist(s) - local info = dir_node_aux[get_box_dir(b,dir_yoko)%dir_math_mod][b_dir%dir_node_auto] - local bw, bh, bd - = getfield(b,'width'), getfield(b, 'height'), getfield(b, 'depth') - local sw, sh, sd - = getfield(s,'width'), getfield(s, 'height'), getfield(s, 'depth') - if set_box_dim_common(key, b, l_dir) and b_dir<dir_node_manual then - -- re-calculate dimension of s, if s is created "automatically" - if b_dir<dir_node_manual then - setfield(s, 'width', info.width(bw,bh,bd)) - setfield(s, 'height', info.height(bw,bh,bd)) - setfield(s, 'depth', info.depth(bw,bh,bd)) - end - end + local sid, b = getid(s), getlist(s) + local info = dir_node_aux[get_box_dir(b,dir_yoko)%dir_math_mod][b_dir%dir_node_auto] + local bw, bh, bd + = getfield(b,'width'), getfield(b, 'height'), getfield(b, 'depth') + local sw, sh, sd + = getfield(s,'width'), getfield(s, 'height'), getfield(s, 'depth') + if set_box_dim_common(key, b, l_dir) and b_dir<dir_node_manual then + -- re-calculate dimension of s, if s is created "automatically" + if b_dir<dir_node_manual then + setfield(s, 'width', info.width(bw,bh,bd)) + setfield(s, 'height', info.height(bw,bh,bd)) + setfield(s, 'depth', info.depth(bw,bh,bd)) + end + end end end end @@ -888,11 +876,11 @@ do s = to_direct(s) local b_dir = get_box_dir(s, dir_yoko) if b_dir<dir_node_auto then - return b_dir + return b_dir else - local b_dir = get_box_dir( - node_next(node_next(node_next(getlist(s)))), dir_yoko) - return b_dir + local b_dir = get_box_dir( + node_next(node_next(node_next(getlist(s)))), dir_yoko) + return b_dir end else return 0 @@ -905,21 +893,21 @@ do 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') + start_time_measure 'box_primitive_hook' local list_dir = get_dir_count() - local s = getbox('ltj@afbox') + local s = getbox 'ltj@afbox' if s then - local sd = to_direct(s) - local box_dir = get_box_dir(sd, dir_yoko) - if box_dir%dir_math_mod ~= list_dir then - setbox( - 'ltj@afbox', - to_node(copy_list(make_dir_whatsit(sd, sd, list_dir, 'box_move'))) - -- copy_list しないとリストの整合性が崩れる……? - ) - end + local sd = to_direct(s) + local box_dir = get_box_dir(sd, dir_yoko) + if box_dir%dir_math_mod ~= list_dir then + setbox( + 'ltj@afbox', + to_node(copy_list(make_dir_whatsit(sd, sd, list_dir, 'box_move'))) + -- copy_list しないとリストの整合性が崩れる……? + ) + end end - stop_time_measure('box_primitive_hook') + stop_time_measure 'box_primitive_hook' end end @@ -929,61 +917,61 @@ do local function glyph_from_packed(h) local b = getlist(h) return (getid(b)==id_kern or (getid(b)==id_whatsit and getsubtype(b)==sid_save) ) - and node_next(node_next(node_next(b))) or b + and node_next(node_next(node_next(b))) or b end luatexja.direction.glyph_from_packed = glyph_from_packed end -- adjust do - local id_adjust = node.id('adjust') + local id_adjust = node.id 'adjust' function luatexja.direction.check_adjust_direction() - start_time_measure('box_primitive_hook') + start_time_measure 'box_primitive_hook' local list_dir = get_adjust_dir_count() local a = tex_nest[tex_nest.ptr].tail local ad = to_direct(a) if a and getid(ad)==id_adjust then - local adj_dir = get_box_dir(ad) - if list_dir~=adj_dir then - ltjb.package_error( - 'luatexja', - 'Direction Incompatible', - "\\vadjust's argument and outer vlist must have same direction.") - node.direct.last_node() - end + local adj_dir = get_box_dir(ad) + if list_dir~=adj_dir then + ltjb.package_error( + 'luatexja', + 'Direction Incompatible', + "\\vadjust's argument and outer vlist must have same direction.") + node.direct.last_node() + end end - stop_time_measure('box_primitive_hook') + stop_time_measure 'box_primitive_hook' end end -- insert do - local id_ins = node.id('ins') - local id_rule = node.id('rule') + local id_ins = node.id 'ins' + local id_rule = node.id 'rule' function luatexja.direction.populate_insertion_dir_whatsit() - start_time_measure('box_primitive_hook') + start_time_measure 'box_primitive_hook' local list_dir = get_dir_count() local a = tex_nest[tex_nest.ptr].tail local ad = to_direct(a) if (not a) or getid(ad)~=id_ins then - a = node.tail(tex.lists.page_head); ad = to_direct(a) + a = node.tail(tex.lists.page_head); ad = to_direct(a) end if a and getid(ad)==id_ins then - local h = getfield(ad, 'head') - if getid(h)==id_whatsit and - getsubtype(h)==sid_user and getfield(h, 'user_id')==DIR then - local n = h; h = node_remove(h,h) - node_free(n) - end - for box_rule in traverse(h) do - if getid(box_rule)<id_rule then - h = insert_before(h, box_rule, dir_pool[list_dir]()) - end - end - ensure_tex_attr(attr_dir, 0) - setfield(ad, 'head', h) + local h = getfield(ad, 'head') + if getid(h)==id_whatsit and + getsubtype(h)==sid_user and getfield(h, 'user_id')==DIR then + local n = h; h = node_remove(h,h) + node_free(n) + end + for box_rule in traverse(h) do + if getid(box_rule)<id_rule then + h = insert_before(h, box_rule, dir_pool[list_dir]()) + end + end + ensure_tex_attr(attr_dir, 0) + setfield(ad, 'head', h) end - stop_time_measure('box_primitive_hook') + stop_time_measure 'box_primitive_hook' end end @@ -997,50 +985,50 @@ do local p = to_direct(tex_getbox(n)) split_dir_head = nil if p then - local bh = getlist(p) - if getid(bh)==id_whatsit and getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR - and node_next(bh) then - ltjs.list_dir = has_attr(bh, attr_dir) - local q = node_next(p) - setfield(p, 'head', node_remove(bh,bh,bh)) - split_dir_head = bh - end + local bh = getlist(p) + if getid(bh)==id_whatsit and getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR + and node_next(bh) then + ltjs.list_dir = has_attr(bh, attr_dir) + local q = node_next(p) + setfield(p, 'head', node_remove(bh,bh,bh)) + split_dir_head = bh + end end sprint(cat_lp, '\\ltj@@orig@vsplit' .. tostring(n)) - end + end local function dir_adjust_vpack(h, gc) - start_time_measure('direction_vpack') + start_time_measure 'direction_vpack' local hd = to_direct(h) if gc=='split_keep' then - -- supply dir_whatsit - hd = create_dir_whatsit_vbox(hd, gc) - split_dir_whatsit = hd + -- supply dir_whatsit + hd = create_dir_whatsit_vbox(hd, gc) + split_dir_whatsit = hd elseif gc=='split_off' then - if split_dir_head then - ltjs.list_dir = has_attr(split_dir_head, attr_dir) - hd = insert_before(hd, hd, split_dir_head) - split_dir_head=nil - end - if split_dir_whatsit then - -- adjust direction of 'split_keep' - set_attr(split_dir_whatsit, attr_dir, ltjs.list_dir) - end - split_dir_whatsit=nil + if split_dir_head then + ltjs.list_dir = has_attr(split_dir_head, attr_dir) + hd = insert_before(hd, hd, split_dir_head) + split_dir_head=nil + end + if split_dir_whatsit then + -- adjust direction of 'split_keep' + set_attr(split_dir_whatsit, attr_dir, ltjs.list_dir) + end + split_dir_whatsit=nil elseif gc=='preamble' then - split_dir_whatsit=nil + split_dir_whatsit=nil else - adjust_badness(hd) - -- 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 + adjust_badness(hd) + -- 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') + stop_time_measure 'direction_vpack' return to_node(hd) end ltjb.add_to_callback('vpack_filter', - dir_adjust_vpack, - 'ltj.direction', 10000) + dir_adjust_vpack, + 'ltj.direction', 10000) end do @@ -1049,16 +1037,16 @@ do return to_node(create_dir_whatsit_vbox(to_direct(h), gc)) end ltjb.add_to_callback('pre_output_filter', - dir_adjust_pre_output, - 'ltj.direction', 10000) + dir_adjust_pre_output, + 'ltj.direction', 10000) 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.id==id_whatsit and h.subtype==sid_user and h.user_id == DIR then - tex.lists.page_head = nil - node.free(h) + tex.lists.page_head = nil + node.free(h) end end end @@ -1074,7 +1062,7 @@ do 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) + node_free(ob) end finalize_inner(b) local w = getfield(b, 'width') @@ -1105,7 +1093,7 @@ do db_tail = nn else setfield(db, 'head', nn) - db_head, db_tail = nn, nn + db_head, db_tail = nn, nn end end end @@ -1124,7 +1112,7 @@ do else finalize_inner(n) end - end + end end end local getbox = tex.getbox @@ -1141,11 +1129,5 @@ do 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 end |