- local xk = ltjf_font_metric_table --
- [xc.font].size_cache.char_type[has_attr(xc, attr_jchar_class) or 0]
- ['end_' .. res.name] or 0
- --print(res.name, total, xk, unicode.utf8.char(xc.char))
-
- if xk>0 and total>=xk then
- --print("ADDED")
- total = total - xk
- local kn = node.new(id_kern)
- kn.kern = (res.name=='shrink' and -1 or 1) * xk
- set_attr(kn, attr_icflag, FROM_JFM)
- node.insert_after(p.head, x, kn)
- return true
- else return false
+ local xkst = ltjf_font_metric_table[getfont(xc)]
+ .char_type[has_attr(xc, attr_jchar_class) or 0]['end_stretch'] or 0
+ local xksh = ltjf_font_metric_table[getfont(xc)]
+ .char_type[has_attr(xc, attr_jchar_class) or 0]['end_shrink'] or 0
+ local xkni = ltjf_font_metric_table[getfont(xc)]
+ .char_type[has_attr(xc, attr_jchar_class) or 0]['end_natural_inhibit']
+
+ print(total, xkst, xksh, ntr)
+ if total>=xkst and xkst>0 then
+ local kn = node_new(id_kern)
+ setfield(kn, 'kern', xkst); set_attr(kn, attr_icflag, FROM_JFM)
+ insert_after(head, x, kn)
+ return total - xkst, true
+ elseif total<=-xksh and xksh<0 then
+ local kn = node_new(id_kern)
+ setfield(kn, 'kern', -xksh); set_attr(kn, attr_icflag, FROM_JFM)
+ insert_after(head, x, kn)
+ return total + xksh, true
+ else --
+ local str = -(total-xkst)/total_sh[65536*total_sh.order] -- end_stretch を入れたときの glue_set (shrink)
+ local shr = (xksh+total)/total_st[65536*total_st.order] -- end_shrink を入れたときの glue_set (stretch)
+ print(xkni, str, ntr, shr)
+ if xkni then
+ if str<shr then
+ local kn = node_new(id_kern)
+ setfield(kn, 'kern', xkst); set_attr(kn, attr_icflag, FROM_JFM)
+ insert_after(head, x, kn)
+ return total- xkst, true
+ else
+ local kn = node_new(id_kern)
+ setfield(kn, 'kern', -xksh); set_attr(kn, attr_icflag, FROM_JFM)
+ insert_after(head, x, kn)
+ return total + xksh, true
+ end
+ else
+ return total, false
+ end