local traverse = Dnode.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
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<BOXBDD) do
- if getid(lp)==id_hlist or getid(lp)==id_vlist then
+ local lpi = getid(lp)
+ if lpi==id_hlist or lpi==id_vlist then
head, lp, nc = ltjd_make_dir_whatsit(head, lp, list_dir, 'jfm pbox')
Np.first = first and nc or Np.first
+ elseif (lpi==id_rule) and (lpa==PACKED) then
+ lp = node_next(lp)
+ nc, lp = lp, node_next(lp)
else
nc, lp = lp, node_next(lp)
end
local ltjw_apply_ashift_math = ltjw.apply_ashift_math
local ltjw_apply_ashift_disc = ltjw.apply_ashift_disc
local min, max = math.min, math.max
+local rule_subtype = (status.luatex_version>=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);
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
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)
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);
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
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)
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
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
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
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
+ return f, g.ratio, g.kanjiskip_natural, g.kanjiskip_stretch, g.kanjiskip_shrink
else
return node_copy(g[2]), g.ratio, false, false, false
end
local KANJI_SKIP_JFM = luatexja.icflag_table.KANJI_SKIP_JFM
get_kanjiskip_low = function(flag, qm, bn, bp, bh)
- if flag or (qm.ksp and (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);
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)
local XKANJI_SKIP_JFM = luatexja.icflag_table.XKANJI_SKIP_JFM
get_xkanjiskip_low = function(flag, qm, bn, bp, bh)
- if flag or (qm.ksp and (bn or bp or bh)) then
+ 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 gx = node_new(id_glue_spec);
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)
local k
local function get_OB_skip(is_kanji)
local qm = Nq.met
local g, _, kn, kp, kh = new_jfm_glue(
- qm, Nq.class,
+ 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
-- 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)
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
-- 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
-- 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')
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
-- 挿入部