X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=src%2Fltj-setwidth.lua;h=a3e9f23bf1c3475b735d42aa5c2459608a79e434;hb=88095aa926339d1b02d6d609b08b6aad6cefeb6c;hp=d20bb15fefe2ccfae91b48deecdbc33200cfe259;hpb=5bb70ef57e9fd117aea6bd8f76e800fce285d1c7;p=luatex-ja%2Fluatexja.git diff --git a/src/ltj-setwidth.lua b/src/ltj-setwidth.lua index d20bb15..a3e9f23 100644 --- a/src/ltj-setwidth.lua +++ b/src/ltj-setwidth.lua @@ -3,7 +3,7 @@ -- luatexbase.provides_module({ name = 'luatexja.setwidth', - date = '2013/03/14', + date = '2013/12/05', description = '', }) module('luatexja.setwidth', package.seeall) @@ -37,10 +37,10 @@ local attr_icflag = luatexbase.attributes['ltj@icflag'] local ltjf_font_metric_table = ltjf.font_metric_table -local PACKED = 2 -local PROCESSED = 11 -local IC_PROCESSED = 12 -local PROCESSED_BEGIN_FLAG = 32 +local PACKED = luatexja.icflag_table.PACKED +local PROCESSED = luatexja.icflag_table.PROCESSED +local IC_PROCESSED = luatexja.icflag_table.IC_PROCESSED +local PROCESSED_BEGIN_FLAG = luatexja.icflag_table.PROCESSED_BEGIN_FLAG do local floor = math.floor @@ -51,7 +51,7 @@ do end local get_pr_begin_flag = get_pr_begin_flag -head = nil +head = nil; luatexbase.create_callback("luatexja.set_width", "data", function (fstable, fmtable, jchar_class) @@ -66,15 +66,17 @@ function capsule_glyph(p, dir, mode, met, class) if not char_data then return node_next(p) end local fwidth, pwidth = char_data.width, p.width fwidth = (fwidth ~= 'prop') and fwidth or pwidth - local fheight, fdepth = char_data.height, char_data.depth fshift.down = char_data.down; fshift.left = char_data.left fshift = luatexbase.call_callback("luatexja.set_width", fshift, met, class) + local fheight, fdepth = char_data.height, char_data.depth + fheight = (fheight ~= 'prop') and fheight or p.height + fdepth = (fdepth ~= 'prop') and fdepth or p.depth if (mode or pwidth ~= fwidth or p.height ~= fheight or p.depth ~= fdepth) then local y_shift, ca = - p.yoffset + (has_attr(p,attr_ykblshift) or 0), char_data.align local q; head, q = node.remove(head, p) p.yoffset, p.next = -fshift.down, nil - if total ~= 0 and ca~='left' then + if ca~='left' then p.xoffset = p.xoffset - fshift.left + (((ca=='right') and fwidth - pwidth) or round((fwidth - pwidth)*0.5)) else @@ -100,9 +102,10 @@ function set_ja_width(ahead, dir) local p = ahead; head = ahead local m = false -- is in math mode? while p do - if (p.id==id_glyph) + local pid = p.id + if (pid==id_glyph) and ((has_attr(p, attr_icflag) or 0)%PROCESSED_BEGIN_FLAG)<=0 then - local pf = p.font + local pf = p.font if pf == has_attr(p, attr_curjfnt) then p = capsule_glyph(p, dir, false, ltjf_font_metric_table[pf], has_attr(p, attr_jchar_class)) @@ -114,11 +117,17 @@ function set_ja_width(ahead, dir) m = (p.subtype==0); p = node_next(p) else if m then - if p.id==id_hlist or p.id==id_vlist then - p.shift = p.shift + (has_attr(p,attr_yablshift) or 0) - elseif p.id==id_rule then - local v = has_attr(p,attr_yablshift) or 0 - p.height = p.height - v; p.depth = p.depth + v + -- 数式の位置補正 + if pid==id_hlist or pid==id_vlist then + if (has_attr(p, attr_icflag) or 0) ~= PROCESSED then + p.shift = p.shift + (has_attr(p,attr_yablshift) or 0) + end + elseif pid==id_rule then + if (has_attr(p, attr_icflag) or 0) ~= PROCESSED then + local v = has_attr(p,attr_yablshift) or 0 + p.height = p.height - v; p.depth = p.depth + v + set_attr(p, attr_icflag, PROCESSED + get_pr_begin_flag(p)) + end end end p = node_next(p)