X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=src%2Fltj-setwidth.lua;h=d92a4c667d65ab2f0c6d2f6e272bf2bf1daef4bf;hb=847312c712d721a0198c00563075948541ced2b7;hp=93c7b4907568e0214f89b38e4949129f0002fe55;hpb=0211bf6b5b8902e996c4406311baecca323d24e0;p=luatex-ja%2Fluatexja.git diff --git a/src/ltj-setwidth.lua b/src/ltj-setwidth.lua index 93c7b49..d92a4c6 100644 --- a/src/ltj-setwidth.lua +++ b/src/ltj-setwidth.lua @@ -37,14 +37,14 @@ 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 dir_tate = 3 -local dir_yoko = 4 -local DIR = luatexja.stack_table_index.DIR +local dir_tate = luatexja.dir_table.dir_tate local attr_jchar_class = luatexbase.attributes['ltj@charclass'] local attr_curjfnt = luatexbase.attributes['ltj@curjfnt'] local attr_yablshift = luatexbase.attributes['ltj@yablshift'] local attr_ykblshift = luatexbase.attributes['ltj@ykblshift'] +local attr_tablshift = luatexbase.attributes['ltj@tablshift'] +local attr_tkblshift = luatexbase.attributes['ltj@tkblshift'] local attr_icflag = luatexbase.attributes['ltj@icflag'] local ltjf_font_metric_table = ltjf.font_metric_table @@ -67,9 +67,9 @@ local head, dir local ltjw = {} --export luatexja.setwidth = ltjw -luatexbase.create_callback("luatexja.set_width", "data", - function (fstable, fmtable, jchar_class) - return fstable +luatexbase.create_callback("luatexja.set_width", "data", + function (fstable, fmtable, jchar_class) + return fstable end) local call_callback = luatexbase.call_callback @@ -97,14 +97,14 @@ local function capsule_glyph_yoko(p, met, class) setfield(box, 'head', p) setfield(box, 'shift', y_shift) setfield(box, 'dir', dir) - set_attr(box, attr_icflag, PACKED + get_pr_begin_flag(p)) - head = q and node_insert_before(head, q, box) + set_attr(box, attr_icflag, PACKED) + head = q and node_insert_before(head, q, box) or node_insert_after(head, node_tail(head), box) return q else - set_attr(p, attr_icflag, PROCESSED + get_pr_begin_flag(p)) + set_attr(p, attr_icflag, PROCESSED) setfield(p, 'xoffset', getfield(p, 'xoffset') - fshift.left) - setfield(p, 'yoffset', getfield(p, 'yoffset') + setfield(p, 'yoffset', getfield(p, 'yoffset') - (has_attr(p, attr_ykblshift) or 0) - fshift.down) return node_next(p) end @@ -118,41 +118,41 @@ local function capsule_glyph_tate(p, met, class) fshift.down = char_data.down; fshift.left = char_data.left fshift = call_callback("luatexja.set_width", fshift, met, class) local fheight, fdepth = char_data.height, char_data.depth - - setfield(p, 'char', ltjd.get_vert_glyph(getfont(p), getchar(p))) - local y_shift - = - getfield(p, 'yoffset') + (has_attr(p,attr_ykblshift) or 0) - local q - head, q = node_remove(head, p) - local box = node_new(id_hlist) - setfield(box, 'width', fwidth) - setfield(box, 'height', fheight) - setfield(box, 'depth', fdepth) - setfield(box, 'shift', y_shift) - setfield(box, 'dir', dir) + setfield(p, 'char', ltjd.get_vert_glyph(getfont(p), getchar(p))) - local k1 = node_new(id_kern) - setfield(k1, 'kern', - getfield(p, 'xoffset') + ascent - + char_data.align*(fwidth-pwidth) - fshift.left) - local ws = node_new(id_whatsit, sid_save) - local wm = node_new(id_whatsit, sid_matrix) - setfield(wm, 'data', '0 1 -1 0') - local k2 = node_new(id_kern) - setfield(k2, 'kern', -fshift.down - fdepth) - local k3 = node_new(id_kern) - setfield(k3, 'kern', - getfield(p, 'width') +fshift.down + fdepth) - local wr = node_new(id_whatsit, sid_restore) - setfield(box, 'head', k1); setfield(k1, 'next', ws) - setfield(ws, 'next', wm); setfield(wm, 'next', k2); - setfield(k2, 'next', p); setfield(p, 'next', k3); - setfield(k3, 'next', wr); - - set_attr(box, attr_icflag, PACKED + get_pr_begin_flag(p)) - head = q and node_insert_before(head, q, box) - or node_insert_after(head, node_tail(head), box) - return q + local y_shift + = - getfield(p, 'yoffset') + (has_attr(p,attr_tkblshift) or 0) + local q + head, q = node_remove(head, p) + local box = node_new(id_hlist) + setfield(box, 'width', fwidth) + setfield(box, 'height', fheight) + setfield(box, 'depth', fdepth) + setfield(box, 'shift', y_shift) + setfield(box, 'dir', dir) + + local k1 = node_new(id_kern) + setfield(k1, 'kern', + getfield(p, 'xoffset') + ascent + + char_data.align*(fwidth-pwidth) - fshift.left) + local ws = node_new(id_whatsit, sid_save) + local wm = node_new(id_whatsit, sid_matrix) + setfield(wm, 'data', '0 1 -1 0') + local k2 = node_new(id_kern) + setfield(k2, 'kern', -fshift.down - fdepth) + local k3 = node_new(id_kern) + setfield(k3, 'kern', - getfield(p, 'width') +fshift.down + fdepth) + local wr = node_new(id_whatsit, sid_restore) + setfield(box, 'head', k1); setfield(k1, 'next', ws) + setfield(ws, 'next', wm); setfield(wm, 'next', k2); + setfield(k2, 'next', p); setfield(p, 'next', k3); + setfield(k3, 'next', wr); + + set_attr(box, attr_icflag, PACKED) + head = q and node_insert_before(head, q, box) + or node_insert_after(head, node_tail(head), box) + return q end local function capsule_glyph_math(p, met, class) @@ -167,14 +167,14 @@ local function capsule_glyph_math(p, met, class) = - getfield(p, 'yoffset') + (has_attr(p,attr_ykblshift) or 0), char_data.align setfield(p, 'yoffset', -fshift.down) setfield(p, 'xoffset', getfield(p, 'xoffset') + char_data.align*(fwidth-pwidth) - fshift.left) - local box = node_new(id_hlist); + local box = node_new(id_hlist); setfield(box, 'width', fwidth) setfield(box, 'height', fheight) setfield(box, 'depth', fdepth) setfield(box, 'head', p) setfield(box, 'shift', y_shift) setfield(box, 'dir', tex.mathdir) - set_attr(box, attr_icflag, PACKED + get_pr_begin_flag(p)) + set_attr(box, attr_icflag, PACKED) return box end luatexja.setwidth.capsule_glyph_math = capsule_glyph_math @@ -182,20 +182,23 @@ luatexja.setwidth.capsule_glyph_math = capsule_glyph_math function luatexja.setwidth.set_ja_width(ahead, adir) local p = ahead; head = p; dir = adir or 'TLT' local m = false -- is in math mode? - local capsule_glyph = (ltjs.table_current_stack[DIR]==dir_yoko) - and capsule_glyph_yoko or capsule_glyph_tate + local is_dir_tate = ltjs.list_dir==dir_tate + local capsule_glyph = is_dir_tate and capsule_glyph_tate or capsule_glyph_yoko + local attr_ablshift = is_dir_tate and attr_tablshift or attr_yablshift while p do local pid = getid(p) - if (pid==id_glyph) + if (pid==id_glyph) and ((has_attr(p, attr_icflag) or 0)%PROCESSED_BEGIN_FLAG)<=0 then local pf = getfont(p) if pf == has_attr(p, attr_curjfnt) then - p = capsule_glyph(p, ltjf_font_metric_table[pf], + p = capsule_glyph(p, ltjf_font_metric_table[pf], has_attr(p, attr_jchar_class)) else - set_attr(p, attr_icflag, PROCESSED + get_pr_begin_flag(p)) + -- TODO: neg. offset does not increase depth + --local d = getfield(p, 'yoffset') - (has_attr(p,attr_ablshift) or 0) + set_attr(p, attr_icflag, PROCESSED) setfield(p, 'yoffset', - getfield(p, 'yoffset') - (has_attr(p,attr_yablshift) or 0)) + getfield(p, 'yoffset') - (has_attr(p,attr_ablshift) or 0)) p = node_next(p) end elseif pid==id_math then @@ -205,14 +208,14 @@ function luatexja.setwidth.set_ja_width(ahead, adir) -- 数式の位置補正 if pid==id_hlist or pid==id_vlist then if (has_attr(p, attr_icflag) or 0) ~= PROCESSED then - setfield(p, 'shift', getfield(p, 'shift') + (has_attr(p,attr_yablshift) or 0)) + setfield(p, 'shift', getfield(p, 'shift') + (has_attr(p,attr_ablshift) 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 setfield(p, 'height', getfield(p, 'height')-v) setfield(p, 'depth', getfield(p, 'depth')+v) - set_attr(p, attr_icflag, PROCESSED + get_pr_begin_flag(p)) + set_attr(p, attr_icflag, PROCESSED) end end end