last_glyph = lp; set_attr(lp, attr_icflag, PROCESSED); Np.last = lp
y_adjust = has_attr(lp,attr_ablshift) or 0
node_depth = max(getfield(lp, 'depth') + min(y_adjust, 0), node_depth)
- adj_depth = (y_adjust>0) and adj_depth or max(getfield(lp, 'depth') + y_adjust, adj_depth)
+ adj_depth = (y_adjust>0) and max(getfield(lp, 'depth') + y_adjust, adj_depth) or adj_depth
setfield(lp, 'yoffset', getfield(lp, 'yoffset') - y_adjust)
elseif lid==id_kern and getsubtype(lp)==2 then -- アクセント用の kern
set_attr(lp, attr_icflag, PROCESSED)
end
-- イタリック補正はあんまり使わない,と考えてループ継続条件に入れない.
end
- if last_glyph then
- Np.last_char = last_glyph
- if adj_depth>node_depth then
- local r = node_new(id_rule)
+ local r
+ if adj_depth>node_depth then
+ r = node_new(id_rule)
setfield(r, 'width', 0); setfield(r, 'height', 0)
setfield(r, 'depth',adj_depth); setfield(r, 'dir', tex_dir)
set_attr(r, attr_icflag, PROCESSED)
- insert_after(head, first_glyph, r)
- end
+ end
+ if last_glyph then
+ Np.last_char = last_glyph
+ if r then insert_after(head, first_glyph, r) end
else
local npn = Np.nuc
Np.last_char = npn
- if adj_depth>node_depth then
+ if r then
local nf, nc = getfont(npn), getchar(npn)
- local left_protru = (font.getfont(nf) or font.fonts[nf] ).characters[nc].left_protruding or 0
- -- lpcode が 0 なら,直前に補正用 rule を挿入する.
- -- なお,rpcode 判定ではうまくいかない(LuaTeX のバグ?)
- if left_protru ==0 then
- local r = node_new(id_rule)
- setfield(r, 'width', 0); setfield(r, 'height', 0)
- setfield(r, 'depth',adj_depth); setfield(r, 'dir', tex_dir)
- set_attr(r, attr_icflag, PROCESSED)
- head = insert_before(head, first_glyph, r)
+ local ct = (font.getfont(nf) or font.fonts[nf] ).characters[nc]
+ if (ct.left_protruding or 0) == 0 then
+ head = insert_before(head, npn, r)
Np.first = (Np.first==npn) and r or npn
+ elseif (ct.right_protruding or 0) == 0 then
+ insert_after(head, npn, r); Np.last, lp = r, r
else
ltjb.package_warning_no_line(
'luatexja',
- 'Check depth of ' .. tostring(npn) .. '(font=' .. nf
- .. ', char=' .. nc .. '), because its \\lpcode is ' .. tostring(left_protru))
+ 'Check depth of glyph node ' .. tostring(npn) .. '(font=' .. nf
+ .. ', char=' .. nc .. '), because its \\lpcode is ' .. tostring(ct.left_protruding)
+ .. ' and its \\rpcode is ' .. tostring(ct.right_protruding)
+ ); node_free(r)
end
end
end
local node_traverse = Dnode.traverse
local node_remove = Dnode.remove
local node_next = (Dnode ~= node) and Dnode.getnext or node.next
-local node_prev = (Dnode ~= node) and Dnode.getprev or node.prev
local node_free = Dnode.free
local node_end_of_math = Dnode.end_of_math
local tex_getcount = tex.getcount
local PROCESSED_BEGIN_FLAG = luatexja.icflag_table.PROCESSED_BEGIN_FLAG
local dir_tate = luatexja.dir_table.dir_tate
-
+local lang_ja = token.create('ltj@japanese')[2]
------------------------------------------------------------------------
-- MAIN PROCESS STEP 1: replace fonts
------------------------------------------------------------------------
local ltjd_get_dir_count = ltjd.get_dir_count
local start_time_measure, stop_time_measure
= ltjb.start_time_measure, ltjb.stop_time_measure
- local head, real_head
+ local head
local is_dir_tate
local suppress_hyphenate_ja_aux = {}
suppress_hyphenate_ja_aux[id_glyph] = function(p)
local pc = getchar(p)
local pf = ltjf_replace_altfont(has_attr(p, attr_curjfnt) or getfont(p), pc)
setfield(p, 'font', pf); set_attr(p, attr_curjfnt, pf)
- setfield(p, 'subtype', floor(getsubtype(p)*0.5)*2)
+ setfield(p, 'lang', lang_ja)
+ --setfield(p, 'subtype', floor(getsubtype(p)*0.5)*2)
set_attr(p, attr_orig_char, pc)
end
return p
return p
end
- local function suppress_hyphenate_ja (h)
+ local function suppress_hyphenate_ja (h,t)
start_time_measure('ltj_hyphenate')
- head = to_direct(h); real_head = node_next(head)
+ head = to_direct(h)
local p = head
for i = 1,#wt do wt[i]=nil end
for i = 1,#wtd do wtd[i]=nil end
ltjs.list_dir=ltjd_get_dir_count()
- while p do
- local flag
+ while p and p~=t do
local pfunc = suppress_hyphenate_ja_aux[getid(p)]
- if pfunc then p = pfunc(p) end
- p = node_next(p)
+ p = pfunc and node_next(pfunc(p)) or node_next(p)
end
stop_time_measure('ltj_hyphenate'); start_time_measure('tex_hyphenate')
- lang.hyphenate(h)
+ lang.hyphenate(h, t)
stop_time_measure('tex_hyphenate')
return h
end