X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=src%2Fltj-direction.lua;h=0947f34f19d9caa6dc35ee5a30fb77d5a2f9c12b;hb=9239672f2650e60ba848bb9776c0fff31b74a048;hp=970a3f75972b5f2026f015075cfbb0f835030818;hpb=dffac9ed6d911ea72585d9935e8fe67337562f8c;p=luatex-ja%2Fluatexja.git diff --git a/src/ltj-direction.lua b/src/ltj-direction.lua index 970a3f7..0947f34 100644 --- a/src/ltj-direction.lua +++ b/src/ltj-direction.lua @@ -266,15 +266,22 @@ end -- hpack_filter, vpack_filter, post_line_break_filter -- の結果を組方向を明示するため,先頭に dir_node を設置 +local get_box_dir do local function create_dir_whatsit_hpack(h, gc) local hd = to_direct(h) - if gc=='fin_row' or gc == 'preamble' then + 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 + 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 + elseif gc == 'preamble' then else adjust_badness(hd) return to_node(create_dir_whatsit(hd, gc, ltjs.list_dir)) @@ -287,7 +294,7 @@ 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 @@ -490,7 +497,7 @@ end -- 1st ret val: b の組方向 -- 2nd ret val はその DIR whatsit -local function get_box_dir(b, default) +function get_box_dir(b, default) start_time_measure('get_box_dir') local dir = has_attr(b, attr_dir) or 0 local bh = getfield(b,'head') @@ -694,6 +701,7 @@ do -- lastbox local node_prev = (node.direct~=node) and node.direct.getprev or node.prev + local id_glue = node.id('glue') local function lastbox_hook() start_time_measure('box_primitive_hook') local bn = tex_nest[tex_nest.ptr].tail @@ -701,6 +709,14 @@ do 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 の各行の中身が入ったボックス + 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 + end local box_dir = get_box_dir(b, 0) if box_dir>= dir_node_auto then -- unwrap dir_node local p = node_prev(b) @@ -956,7 +972,25 @@ end -- vsplit do - local split_dir_whatsit + local split_dir_whatsit, split_dir_head + local cat_lp = luatexbase.catcodetables['latex-package'] + local sprint, scan_int, tex_getbox = tex.sprint, token.scan_int, tex.getbox + function luatexja.direction.vsplit() + local n = scan_int(); + 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 + end + sprint(cat_lp, '\\ltj@@orig@vsplit' .. tostring(n)) + end local function dir_adjust_vpack(h, gc) start_time_measure('direction_vpack') local hd = to_direct(h) @@ -965,10 +999,10 @@ do hd = create_dir_whatsit_vbox(hd, gc) split_dir_whatsit = hd elseif gc=='split_off' then - for bh in traverse_id(id_whatsit, hd) do - if getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR then - ltjs.list_dir = has_attr(bh, attr_dir); break - end + if split_dir_head then + 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' @@ -1070,7 +1104,7 @@ do [get_box_dir(b, dir_yoko)%dir_math_mod][new_dir][getid(b)]) do local cmd, arg, nn = v[1], v[2] if cmd=='kern' then - nn = node_new(id_kern) + 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)