X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=src%2Fltj-jfmglue.lua;h=371c17f2e47898f2aa33c22f53778601bd8ad0d2;hb=ab23049deb6fb90ca689fdf4924b3783f08f8f2e;hp=d4e889fedead906c1ac232be28c9b56a1df71ca2;hpb=3ea927075879e0a8e966e76136052e3d384e0925;p=luatex-ja%2Fluatexja.git diff --git a/src/ltj-jfmglue.lua b/src/ltj-jfmglue.lua index d4e889f..371c17f 100644 --- a/src/ltj-jfmglue.lua +++ b/src/ltj-jfmglue.lua @@ -3,7 +3,7 @@ -- luatexbase.provides_module({ name = 'luatexja.jfmglue', - date = '2015/05/03', + date = '2016/03/31', description = 'Insertion process of JFM glues and kanjiskip', }) module('luatexja.jfmglue', package.seeall) @@ -16,35 +16,34 @@ luatexja.load_module('direction'); local ltjd = luatexja.direction luatexja.load_module('setwidth'); local ltjw = luatexja.setwidth local pairs = pairs -local Dnode = node.direct or node - local nullfunc = function(n) return n end -local to_node = (Dnode ~= node) and Dnode.tonode or nullfunc -local to_direct = (Dnode ~= node) and Dnode.todirect or nullfunc - -local setfield = (Dnode ~= node) and Dnode.setfield or function(n, i, c) n[i] = c end -local getfield = (Dnode ~= node) and Dnode.getfield or function(n, i) return n[i] end -local getid = (Dnode ~= node) and Dnode.getid or function(n) return n.id end -local getfont = (Dnode ~= node) and Dnode.getfont or function(n) return n.font end -local getlist = (Dnode ~= node) and Dnode.getlist or function(n) return n.head end -local getchar = (Dnode ~= node) and Dnode.getchar or function(n) return n.char end -local getsubtype = (Dnode ~= node) and Dnode.getsubtype or function(n) return n.subtype end - -local has_attr = Dnode.has_attribute -local set_attr = Dnode.set_attribute -local insert_before = Dnode.insert_before -local insert_after = Dnode.insert_after -local node_next = (Dnode ~= node) and Dnode.getnext or node.next +local to_node = node.direct.tonode +local to_direct = node.direct.todirect + +local setfield = node.direct.setfield +local setglue = luatexja.setglue +local getfield = node.direct.getfield +local getid = node.direct.getid +local getfont = node.direct.getfont +local getlist = node.direct.getlist +local getchar = node.direct.getchar +local getsubtype = node.direct.getsubtype + +local has_attr = node.direct.has_attribute +local set_attr = node.direct.set_attribute +local insert_before = node.direct.insert_before +local insert_after = node.direct.insert_after +local node_next = node.direct.getnext local round = tex.round local ltjd_make_dir_whatsit = ltjd.make_dir_whatsit local ltjf_font_metric_table = ltjf.font_metric_table local ltjf_find_char_class = ltjf.find_char_class -local node_new = Dnode.new -local node_copy = Dnode.copy -local node_remove = Dnode.remove -local node_tail = Dnode.tail -local node_free = Dnode.free -local node_end_of_math = Dnode.end_of_math +local node_new = node.direct.new +local node_copy = node.direct.copy +local node_remove = node.direct.remove +local node_tail = node.direct.tail +local node_free = node.direct.free +local node_end_of_math = node.direct.end_of_math local id_glyph = node.id('glyph') local id_hlist = node.id('hlist') @@ -60,7 +59,6 @@ local id_glue = node.id('glue') local id_kern = node.id('kern') local id_penalty = node.id('penalty') -local id_glue_spec = node.id('glue_spec') local id_jglyph = 512 -- Japanese character local id_box_like = 256 -- vbox, shifted hbox local id_pbox = 257 -- already processed nodes (by \unhbox) @@ -121,25 +119,10 @@ do end end -local zero_glue = node_new(id_glue) -spec_zero_glue = to_node(node_new(id_glue_spec)) - -- must be public, since mentioned from other sources -local spec_zero_glue = to_direct(spec_zero_glue) -setfield(spec_zero_glue, 'width', 0) -setfield(spec_zero_glue, 'stretch', 0) -setfield(spec_zero_glue, 'shrink', 0) -setfield(spec_zero_glue, 'stretch_order', 0) -setfield(spec_zero_glue, 'shrink_order', 0) -setfield(zero_glue, 'spec', spec_zero_glue) - -local function skip_table_to_spec(n) - local g, st = node_new(id_glue_spec), ltjs.fast_get_stack_skip(n) - setfield(g, 'width', st.width) - setfield(g, 'stretch', st.stretch) - setfield(g, 'shrink', st.shrink) - setfield(g, 'stretch_order', st.stretch_order) - setfield(g, 'shrink_order', st.shrink_order) - return g +local function skip_table_to_glue(n) + local g, st = node_new(id_glue), ltjs.fast_get_stack_skip(n) + setglue(g, st.width, st.stretch, st.shrink, st.stretch_order, st.shrink_order) + return g, (st.width==1073741823) end @@ -281,10 +264,10 @@ luatexbase.create_callback("luatexja.jfmglue.whatsit_after", "data", local calc_np do -local traverse = Dnode.traverse +local traverse = node.direct.traverse local function check_next_ickern(lp) - if lp and getid(lp) == id_kern and ITALIC == get_attr_icflag(lp) then - set_attr(lp, attr_icflag, IC_PROCESSED) + if lp and getid(lp) == id_kern and ( getsubtype(lp)==3 or ITALIC == get_attr_icflag(lp)) then + set_attr(lp, attr_icflag, IC_PROCESSED); Np.last = lp; return node_next(lp) else Np.last = Np.nuc; return lp @@ -296,9 +279,13 @@ local function calc_np_pbox(lp, last) Np.first = Np.first or lp; Np.id = id_pbox set_attr(lp, attr_icflag, get_attr_icflag(lp)); while lp ~=last and (lpa>=PACKED) and (lpa=85) and 3 or 0 local function calc_np_aux_glyph_common(lp) Np.nuc = lp Np.first= (Np.first or lp) if getfield(lp, 'lang') == lang_ja then Np.id = id_jglyph - local m, cls = set_np_xspc_jachar(Np, lp) + local m, mc, cls = set_np_xspc_jachar(Np, lp) local npi, npf - lp, head, npi, npf = capsule_glyph(lp, m, cls, head, tex_dir, lp) + lp, head, npi, npf = capsule_glyph(lp, m, mc[cls], head, tex_dir) Np.first = (Np.first~=Np.nuc) and Np.first or npf or npi Np.nuc = npi return true, check_next_ickern(lp); @@ -354,11 +342,15 @@ local function calc_np_aux_glyph_common(lp) if ls==2 then -- アクセント用の kern set_attr(lx, attr_icflag, PROCESSED) lx = node_next(lx) -- lx: アクセント本体 - setfield(lx, 'yoffset', getfield(lx, 'yoffset') - (has_attr(lx,attr_ablshift) or 0)) + if getid(lx)==id_glyph then + setfield(lx, 'yoffset', getfield(lx, 'yoffset') - (has_attr(lx,attr_ablshift) or 0)) + else -- アクセントは上下にシフトされている + setfield(lx, 'shift', getfield(lx, 'shift') + (has_attr(lx,attr_ablshift) or 0)) + end lx = node_next(node_next(lx)) elseif ls==0 then Np.last = lx - elseif (ls==1 and lai==ITALIC) then + elseif (ls==3) or (lai==ITALIC) then Np.last = lx; set_attr(lx, attr_icflag, IC_PROCESSED) else lp=lx; break @@ -370,7 +362,7 @@ local function calc_np_aux_glyph_common(lp) end local r if adj_depth>node_depth then - r = node_new(id_rule) + r = node_new(id_rule,rule_subtype) setfield(r, 'width', 0); setfield(r, 'height', 0) setfield(r, 'depth',adj_depth); setfield(r, 'dir', tex_dir) set_attr(r, attr_icflag, PROCESSED) @@ -490,6 +482,11 @@ local calc_np_auxtable = { if getsubtype(lp)==2 then Np.first = Np.first or lp set_attr(lp, attr_icflag, PROCESSED); lp = node_next(lp) + if getid(lp)==id_glyph then -- アクセント本体 + setfield(lp, 'yoffset', getfield(lp, 'yoffset') - (has_attr(lp,attr_ablshift) or 0)) + else -- アクセントは上下にシフトされている + setfield(lp, 'shift', getfield(lp, 'shift') + (has_attr(lp,attr_ablshift) or 0)) + end set_attr(lp, attr_icflag, PROCESSED); lp = node_next(lp) set_attr(lp, attr_icflag, PROCESSED); lp = node_next(lp) set_attr(lp, attr_icflag, PROCESSED); @@ -506,10 +503,17 @@ local calc_np_auxtable = { end, } calc_np_auxtable[id_rule] = calc_np_auxtable.box_like -calc_np_auxtable[13] = calc_np_auxtable.box_like +if status.luatex_version>=85 then + calc_np_auxtable[15] = calc_np_auxtable.box_like +else + calc_np_auxtable[13] = calc_np_auxtable.box_like +end calc_np_auxtable[id_ins] = calc_np_auxtable.skip calc_np_auxtable[id_mark] = calc_np_auxtable.skip calc_np_auxtable[id_adjust] = calc_np_auxtable.skip +if node.id('local_par') then + calc_np_auxtable[node.id('local_par')] = calc_np_auxtable.skip +end function calc_np(last, lp) local k @@ -525,7 +529,7 @@ function calc_np(last, lp) for k = 1,#Bp do Bp[k] = nil end while lp ~= last do local lpa = has_attr(lp, attr_icflag) or 0 - -- unbox 由来ノードの検出 + -- unbox 由来ノードの検出 if lpa>=PACKED then if lpa%PROCESSED_BEGIN_FLAG == BOXBDD then local lq = node_next(lp) @@ -567,6 +571,7 @@ do c = c or c_glyph local cls = slow_find_char_class(c, m, c_glyph) Nx.met, Nx.class, Nx.char = m, cls, c; + local mc = m.char_type; Nx.char_type = mc if cls~=0 then set_attr(x, attr_jchar_class, cls) end if c~=c_glyph then set_attr(x, attr_jchar_code, c) end Nx.pre = table_current_stack[PRE + c] or 0 @@ -574,12 +579,13 @@ do Nx.xspc = table_current_stack[XSP + c] or 3 Nx.kcat = table_current_stack[KCAT + c] or 0 Nx.auto_kspc, Nx.auto_xspc = (has_attr(x, attr_autospc)==1), (has_attr(x, attr_autoxspc)==1) - return m, cls + return m, mc, cls end function set_np_xspc_jachar_hbox(Nx, x) local m = ltjf_font_metric_table[getfont(x)] local c = has_attr(x, attr_jchar_code) or getchar(x) Nx.met, Nx.char = m, c; Nx.class = has_attr(x, attr_jchar_class) or 0; + local mc = m.char_type; Nx.char_type = mc Nx.pre = table_current_stack[PRE + c] or 0 Nx.post = table_current_stack[POST + c] or 0 Nx.xspc = table_current_stack[XSP + c] or 3 @@ -682,17 +688,17 @@ local function handle_penalty_suppress(post, pre, g) end -- 和文文字間の JFM glue を node 化 -local function new_jfm_glue(m, bc, ac) +local function new_jfm_glue(mc, bc, ac) -- bc, ac: char classes - local g = m.char_type[bc][ac] + local g = mc[bc][ac] if g then - if g[1] then + if g[1] then + return node_copy(g[1]), g.ratio, false, false, false + else local f = node_new(id_glue) set_attr(f, attr_icflag, g.priority) - setfield(f, 'spec', node_copy(g[2])) - return f, g.ratio, g.ksp_natural, g.ksp_stretch, g.ksp_shrink - else - return node_copy(g[2]), g.ratio, false, false, false + setglue(f, g.width, g.stretch, g.shrink) + return f, g.ratio, g.kanjiskip_natural, g.kanjiskip_stretch, g.kanjiskip_shrink end end return false, 0 @@ -733,14 +739,13 @@ do local k = 2*getid(gb) - getid(ga) if k == bg_ag then - local bs, as = getfield(gb, 'spec'), getfield(ga, 'spec') -- 両方とも glue. - setfield(bs, 'width', blend_diffmet( - getfield(bs, 'width'), getfield(as, 'width'), db, da)) - setfield(bs, 'stretch', blend_diffmet( - getfield(bs, 'stretch'), getfield(as, 'stretch'), db, da)) - setfield(bs, 'shrink', -blend_diffmet( - -getfield(bs, 'shrink'), -getfield(as, 'shrink'), db, da)) + setglue(gb, blend_diffmet( + getfield(gb, 'width'), getfield(ga, 'width'), db, da), + blend_diffmet( + getfield(gb, 'stretch'), getfield(ga, 'stretch'), db, da), + -blend_diffmet( + -getfield(gb, 'shrink'), -getfield(ga, 'shrink'), db, da)) node_free(ga) return gb elseif k == bk_ak then @@ -750,25 +755,23 @@ do node_free(ga) return gb elseif k == bk_ag then - local as = getfield(ga, 'spec') -- gb: kern, ga: glue - setfield(as, 'width', blend_diffmet( - getfield(gb, 'kern'), getfield(as, 'width'), db, da)) - setfield(as, 'stretch', blend_diffmet( - 0, getfield(as, 'stretch'), db, da)) - setfield(as, 'shrink', -blend_diffmet( - 0, -getfield(as, 'shrink'), db, da)) + setglue(ga, blend_diffmet( + getfield(gb, 'kern'), getfield(ga, 'width'), db, da), + blend_diffmet( + 0, getfield(ga, 'stretch'), db, da), + -blend_diffmet( + 0, -getfield(ga, 'shrink'), db, da)) node_free(gb) return ga, 0, 0, 0 else - local bs = getfield(gb, 'spec') -- gb: glue, ga: kern - setfield(bs, 'width', blend_diffmet( - getfield(bs, 'width'), getfield(ga, 'kern'), db, da)) - setfield(bs, 'stretch', blend_diffmet( - getfield(bs, 'stretch'), 0, db, da)) - setfield(bs, 'shrink', -blend_diffmet( - -getfield(bs, 'shrink'), 0, db, da)) + setglue(gb, blend_diffmet( + getfield(gb, 'width'), getfield(ga, 'kern'), db, da), + blend_diffmet( + getfield(gb, 'stretch'), 0, db, da), + -blend_diffmet( + -getfield(gb, 'shrink'), 0, db, da)) node_free(ga) return gb end @@ -784,29 +787,24 @@ do local KANJI_SKIP_JFM = luatexja.icflag_table.KANJI_SKIP_JFM get_kanjiskip_low = function(flag, qm, bn, bp, bh) - if flag or bn or bp or bh then + if flag or (qm.with_kanjiskip and (bn or bp or bh)) then if kanjiskip_jfm_flag then local g = node_new(id_glue); - local gx = node_new(id_glue_spec); - setfield(gx, 'stretch_order', 0); setfield(gx, 'shrink_order', 0) local bk = qm.kanjiskip or null_skip_table - setfield(gx, 'width', bn and bk[1] or 0) - setfield(gx, 'stretch', bp and bk[2] or 0) - setfield(gx, 'shrink', bh and bk[3] or 0) - setfield(g, 'spec', gx) + setglue(g, bn and (bn*bk[1]) or 0, + bp and (bp*bk[2]) or 0, + bh and (bh*bk[3]) or 0, 0, 0) set_attr(g, attr_icflag, KANJI_SKIP_JFM) return g elseif flag then return node_copy(kanji_skip) else local g = node_new(id_glue); - local gx = node_new(id_glue_spec); - setfield(gx, 'stretch_order', 0); setfield(gx, 'shrink_order', 0) - local ks = getfield(kanji_skip, 'spec') - setfield(gx, 'width', bn and getfield(ks, 'width') or 0) - setfield(gx, 'stretch', bp and getfield(ks, 'stretch') or 0) - setfield(gx, 'shrink', bh and getfield(ks, 'shrink') or 0) - setfield(g, 'spec', gx) + setglue(g, + bn and (bn*getfield(kanji_skip, 'width')) or 0, + bp and (bp*getfield(kanji_skip, 'stretch')) or 0, + bh and (bh*getfield(kanji_skip, 'shrink')) or 0, + 0, 0) set_attr(g, attr_icflag, KANJI_SKIP_JFM) return g end @@ -817,38 +815,39 @@ do if Np.auto_kspc or Nq.auto_kspc then local pm, qm = Np.met, Nq.met if (pm.char_type==qm.char_type) and (qm.var==pm.var) then - return get_kanjiskip_low(true, qm, true, true, true) + return get_kanjiskip_low(true, qm, 1, 1, 1) else - local gb = get_kanjiskip_low(true, qm, true, true, true) - local ga = get_kanjiskip_low(true, pm, true, true, true) + local gb = get_kanjiskip_low(true, qm, 1, 1, 1) + local ga = get_kanjiskip_low(true, pm, 1, 1, 1) return calc_ja_ja_aux(gb, ga, 0, 1) end else - local g = node_copy(zero_glue) - set_attr(g, attr_icflag, jfm_flag and KANJI_SKIP_JFM or KANJI_SKIP) + local g = node_new(id_glue) + set_attr(g, attr_icflag, kanjiskip_jfm_flag and KANJI_SKIP_JFM or KANJI_SKIP) return g end end calc_ja_ja_glue = function () local qm, pm = Nq.met, Np.met - if (qm.char_type==pm.char_type) and (qm.var==pm.var) then - local g, _, kn, kp, kh = new_jfm_glue(qm, Nq.class, Np.class) + local qmc, pmc = qm.char_type, pm.char_type + if (qmc==pmc) and (qm.var==pm.var) then + local g, _, kn, kp, kh = new_jfm_glue(qmc, Nq.class, Np.class) return g, (Np.auto_kspc or Nq.auto_kspc) and get_kanjiskip_low(false, qm, kn, kp, kh) else local npn, nqn = Np.nuc, Nq.nuc local gb, db, bn, bp, bh - = new_jfm_glue(qm, Nq.class, + = new_jfm_glue(qmc, Nq.class, slow_find_char_class(Np.char, qm, getchar(npn))) local ga, da, an, ap, ah - = new_jfm_glue(pm, + = new_jfm_glue(pmc, slow_find_char_class(Nq.char, pm, getchar(nqn)), Np.class) local g = calc_ja_ja_aux(gb, ga, db, da) local k - if (pm.char_type==qm.char_type) and (qm.var==pm.var) then + if (pmc==qmc) and (qm.var==pm.var) then gb = get_kanjiskip_low(false, qm, bn, bp, bh) ga = get_kanjiskip_low(false, pm, an, ap, ah) k = calc_ja_ja_aux(gb, ga, db, da) @@ -861,54 +860,78 @@ end -------------------- 和欧文間空白量の決定 -- get xkanjiskip -local get_xkanjiskip +local get_xkanjiskip, xkanjiskip_jfm_flag local get_xkanjiskip_normal, get_xkanjiskip_jfm do local XKANJI_SKIP = luatexja.icflag_table.XKANJI_SKIP local XKANJI_SKIP_JFM = luatexja.icflag_table.XKANJI_SKIP_JFM - get_xkanjiskip_normal = function () - if (Nq.xspc>=2) and (Np.xspc%2==1) and (Nq.auto_xspc or Np.auto_xspc) then - return node_copy(xkanji_skip) - else - local g = node_copy(zero_glue) - set_attr(g, attr_icflag, XKANJI_SKIP) - return g + + get_xkanjiskip_low = function(flag, qm, bn, bp, bh) + if flag or (qm.with_kanjiskip and (bn or bp or bh)) then + if xkanjiskip_jfm_flag then + local g = node_new(id_glue); + local bk = qm.xkanjiskip or null_skip_table + setglue(g, bn and bk[1] or 0, + bp and bk[2] or 0, + bh and bk[3] or 0, 0, 0) + set_attr(g, attr_icflag, XKANJI_SKIP_JFM) + return g + elseif flag then + return node_copy(xkanji_skip) + else + local g = node_new(id_glue); + setglue(g, + bn and (bn*getfield(xkanji_skip, 'width')) or 0, + bp and (bp*getfield(xkanji_skip, 'stretch')) or 0, + bh and (bh*getfield(xkanji_skip, 'shrink')) or 0, + 0, 0) + set_attr(g, attr_icflag, XKANJI_SKIP_JFM) + return g + end end end - get_xkanjiskip_jfm = function (Nn) - local g + + get_xkanjiskip = function(Nn) if (Nq.xspc>=2) and (Np.xspc%2==1) and (Nq.auto_xspc or Np.auto_xspc) then - g = node_new(id_glue) - local gx = node_new(id_glue_spec); - setfield(gx, 'stretch_order', 0); setfield(gx, 'shrink_order', 0) - local bk = Nn.met.xkanjiskip or null_skip_table - setfield(gx, 'width', bk[1]) - setfield(gx, 'stretch', bk[2]) - setfield(gx, 'shrink', bk[3]) - setfield(g, 'spec', gx) + return get_xkanjiskip_low(true, Nn.met, 1, 1, 1) else - g = node_copy(zero_glue) + local g = node_new(id_glue) + set_attr(g, attr_icflag, xkanjiskip_jfm_flag and XKANJI_SKIP_JFM or XKANJI_SKIP) + return g end - set_attr(g, attr_icflag, XKANJI_SKIP_JFM) - return g end end -------------------- 隣接した「塊」間の処理 -local function get_OA_skip() +local function get_OA_skip(is_kanji) local pm = Np.met local g, _, kn, kp, kh = new_jfm_glue( - pm, + pm.char_type, fast_find_char_class((Nq.id == id_math and -1 or 'jcharbdd'), pm), - Np.class, getfield(xkanji_skip,'spec')) - return g + Np.class) + local k + if is_kanji==0 then + k = (Np.auto_kspc or Nq.auto_kspc) and get_kanjiskip_low(false, pm, kn, kp, kh) + elseif is_kanji==1 then + k = ((Nq.xspc>=2) and (Np.xspc%2==1) and (Nq.auto_xspc or Np.auto_xspc)) + and get_xkanjiskip_low(false, pm, kn, kp, kh) + end + return g, k end -local function get_OB_skip() +local function get_OB_skip(is_kanji) local qm = Nq.met - return new_jfm_glue(qm, Nq.class, - fast_find_char_class((Np.id == id_math and -1 or'jcharbdd'), qm), - getfield(xkanji_skip,'spec')) + local g, _, kn, kp, kh = new_jfm_glue( + qm.char_type, Nq.class, + fast_find_char_class((Np.id == id_math and -1 or'jcharbdd'), qm)) + local k + if is_kanji==0 then + k = (Np.auto_kspc or Nq.auto_kspc) and get_kanjiskip_low(false, qm, kn, kp, kh) + elseif is_kanji==1 then + k = ((Nq.xspc>=2) and (Np.xspc%2==1) and (Nq.auto_xspc or Np.auto_xspc)) + and get_xkanjiskip_low(false, qm, kn, kp, kh) + end + return g, k end -- (anything) .. jachar @@ -917,17 +940,22 @@ local function handle_np_jachar(mode) if qid==id_jglyph or ((qid==id_pbox or qid==id_pbox_w) and Nq.met) then local g, k if non_ihb_flag then g, k = calc_ja_ja_glue() end -- M->K - if not g then g = get_kanjiskip(true) end + if not g then g = get_kanjiskip() end handle_penalty_normal(Nq.post, Np.pre, g); real_insert(g); real_insert(k) elseif Nq.met then -- qid==id_hlist - local g = non_ihb_flag and get_OA_skip(get_kanjiskip) or get_kanjiskip(true) -- O_A->K - handle_penalty_normal(0, Np.pre, g); real_insert(g) + local g, k + if non_ihb_flag then g, k = get_OA_skip(0) end -- O_A->K + if not g then g = get_kanjiskip() end + handle_penalty_normal(0, Np.pre, g); real_insert(g); real_insert(k) elseif Nq.pre then - local g = non_ihb_flag and get_OA_skip(get_kanjiskip) or get_xkanjiskip(Np) -- O_A->X - handle_penalty_normal((qid==id_hlist and 0 or Nq.post), Np.pre, g); real_insert(g) + local g, k + if non_ihb_flag then g, k = get_OA_skip(1) end -- O_A->X + if not g then g = get_xkanjiskip(Np) end + handle_penalty_normal((qid==id_hlist and 0 or Nq.post), Np.pre, g); + real_insert(g); real_insert(k) else - local g = non_ihb_flag and get_OA_skip() -- O_A + local g = non_ihb_flag and (get_OA_skip()) -- O_A if qid==id_glue then handle_penalty_normal(0, Np.pre, g) elseif qid==id_kern then handle_penalty_suppress(0, Np.pre, g) else handle_penalty_always(0, Np.pre, g) @@ -943,10 +971,10 @@ end -- jachar .. (anything) local function handle_nq_jachar() if Np.pre then - local g = non_ihb_flag and get_OB_skip() or get_xkanjiskip(Nq) -- O_B->X + local g = non_ihb_flag and get_OB_skip(1) or get_xkanjiskip(Nq) -- O_B->X handle_penalty_normal(Nq.post, (Np.id==id_hlist and 0 or Np.pre), g); real_insert(g) else - local g =non_ihb_flag and get_OB_skip() -- O_B + local g =non_ihb_flag and (get_OB_skip()) -- O_B if Np.id==id_glue then handle_penalty_normal(Nq.post, 0, g) elseif Np.id==id_kern then handle_penalty_suppress(Nq.post, 0, g) else handle_penalty_always(Nq.post, 0, g) @@ -959,10 +987,10 @@ end local function handle_np_ja_hlist() local qid = Nq.id if qid==id_jglyph or ((qid==id_pbox or Nq.id == id_pbox_w) and Nq.met) then - local g = non_ihb_flag and get_OB_skip() or get_kanjiskip(true) -- O_B->K + local g = non_ihb_flag and get_OB_skip(0) or get_kanjiskip() -- O_B->K handle_penalty_normal(Nq.post, 0, g); real_insert(g) elseif Nq.met then -- Nq.id==id_hlist - local g = get_kanjiskip(true) -- K + local g = get_kanjiskip() -- K handle_penalty_suppress(0, 0, g); real_insert(g) elseif Nq.pre then local g = get_xkanjiskip(Np) -- X @@ -1017,7 +1045,7 @@ local function handle_list_tail(mode) -- the current list is the contents of a hbox local npi, pm = Np.id, Np.met if npi == id_jglyph or (npi==id_pbox and pm) then - local g = new_jfm_glue(pm, Np.class, fast_find_char_class('boxbdd', pm)) + local g = new_jfm_glue(pm.char_type, Np.class, fast_find_char_class('boxbdd', pm)) if g then set_attr(g, attr_icflag, BOXBDD) head = insert_after(head, Np.last, g) @@ -1031,7 +1059,7 @@ local function handle_list_head(par_indented) local npi, pm = Np.id, Np.met if npi == id_jglyph or (npi==id_pbox and pm) then if non_ihb_flag then - local g = new_jfm_glue(pm, fast_find_char_class(par_indented, pm), Np.class) + local g = new_jfm_glue(pm.char_type, fast_find_char_class(par_indented, pm), Np.class) if g then set_attr(g, attr_icflag, BOXBDD) if getid(g)==id_glue and #Bp==0 then @@ -1048,6 +1076,7 @@ end -- return value: (the initial cursor lp), (last node) local init_var do + local id_local = node.id('local_par') local KANJI_SKIP = luatexja.icflag_table.KANJI_SKIP local XKANJI_SKIP = luatexja.icflag_table.XKANJI_SKIP local KSK = luatexja.stack_table_index.KSK @@ -1081,26 +1110,23 @@ do -- ithout this node, set_attr(kanji_skip, ...) somehow creates an "orphaned" attribute list. do - kanji_skip = node_new(id_glue); set_attr(kanji_skip, attr_icflag, KANJI_SKIP) - local s = skip_table_to_spec(KSK) - setfield(kanji_skip, 'spec', s) - kanjiskip_jfm_flag = (getfield(s, 'width') == 1073741823) + kanji_skip, kanjiskip_jfm_flag = skip_table_to_glue(KSK) + set_attr(kanji_skip, attr_icflag, KANJI_SKIP) end do - xkanji_skip = node_new(id_glue); set_attr(xkanji_skip, attr_icflag, XKANJI_SKIP) - local s = skip_table_to_spec(XSK) - setfield(xkanji_skip, 'spec', s) - get_xkanjiskip = (getfield(s, 'width') == 1073741823) - and get_xkanjiskip_jfm or get_xkanjiskip_normal + xkanji_skip, xkanjiskip_jfm_flag = skip_table_to_glue(XSK) + set_attr(xkanji_skip, attr_icflag, XKANJI_SKIP) end if mode then -- the current list is to be line-breaked: -- hbox from \parindent is skipped. local lp, par_indented, lpi, lps = head, 'boxbdd', getid(head), getsubtype(head) - while lp and ((lpi==id_whatsit and lps~=sid_user) - or ((lpi==id_hlist) and (lps==3))) do + while lp and + ((lpi==id_whatsit and lps~=sid_user) + or ((lpi==id_hlist) and (lps==3)) + or (lpi==id_local)) do if (lpi==id_hlist) and (lps==3) then Np.char, par_indented = 'parbdd', 'parbdd' Np.width = getfield(lp, 'width') @@ -1141,7 +1167,8 @@ function main(ahead, mode, dir) lp = calc_np(last, lp) if Np then handle_list_head(par_indented) - lp = calc_np(last,lp); while Np do + lp = calc_np(last,lp); + while Np do adjust_nq(); local pid, pm = Np.id, Np.met -- 挿入部 @@ -1165,8 +1192,8 @@ end do local IHB = luatexja.userid_table.IHB local BPAR = luatexja.userid_table.BPAR - local node_prev = (Dnode ~= node) and Dnode.getprev or node.prev - local node_write = Dnode.write + local node_prev = node.direct.getprev + local node_write = node.direct.write -- \inhibitglue function create_inhibitglue_node()