diff options
author | Karl Berry <karl@freefriends.org> | 2017-05-05 22:50:45 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2017-05-05 22:50:45 +0000 |
commit | a99860c7820133400dc5b3c3e7e165627f2c6298 (patch) | |
tree | 2aeec817f4184ab0e11145731771dbff492c89cd /Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua | |
parent | af94f399b2a355396d222eb693423beb6294a683 (diff) |
luatexja (5may17)
git-svn-id: svn://tug.org/texlive/trunk@44217 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua')
-rw-r--r-- | Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua | 75 |
1 files changed, 57 insertions, 18 deletions
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua index 3477b09c893..93e92ab5dec 100644 --- a/Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua +++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua @@ -3,7 +3,7 @@ -- luatexbase.provides_module({ name = 'luatexja.jfmglue', - date = '2016/04/03', + date = '2017/05/05', description = 'Insertion process of JFM glues and kanjiskip', }) module('luatexja.jfmglue', package.seeall) @@ -28,22 +28,28 @@ local getfont = node.direct.getfont local getlist = node.direct.getlist local getchar = node.direct.getchar local getsubtype = node.direct.getsubtype - +local if_lang_ja +do + local lang_ja = luatexja.lang_ja + local getlang = node.direct.getlang + if_lang_ja = getlang + and function (n) return getlang(n)==lang_ja end + or function (n) return getfield(n,'lang')==lang_ja end +end + 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 = 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 node_remove = node.direct.remove local id_glyph = node.id('glyph') local id_hlist = node.id('hlist') @@ -64,12 +70,6 @@ local id_box_like = 256 -- vbox, shifted hbox local id_pbox = 257 -- already processed nodes (by \unhbox) local id_pbox_w = 258 -- cluster which consists of a whatsit local sid_user = node.subtype('user_defined') -local lang_ja = luatexja.lang_ja - -local sid_start_link = node.subtype('pdf_start_link') -local sid_start_thread = node.subtype('pdf_start_thread') -local sid_end_link = node.subtype('pdf_end_link') -local sid_end_thread = node.subtype('pdf_end_thread') local ITALIC = luatexja.icflag_table.ITALIC local PACKED = luatexja.icflag_table.PACKED @@ -235,7 +235,7 @@ function check_box_high(Nx, box_ptr, box_end) local first_char = first_char if first_char then if getid(first_char)==id_glyph then - if getfield(first_char, 'lang') == lang_ja then + if if_lang_ja(first_char) then set_np_xspc_jachar_hbox(Nx, first_char) else set_np_xspc_alchar(Nx, getchar(first_char),first_char, 1) @@ -304,7 +304,7 @@ local min, max = math.min, math.max local function calc_np_aux_glyph_common(lp, acc_flag) Np.nuc = lp Np.first= (Np.first or lp) - if getfield(lp, 'lang') == lang_ja then + if if_lang_ja(lp) then Np.id = id_jglyph local m, mc, cls = set_np_xspc_jachar(Np, lp) local npi, npf @@ -329,7 +329,7 @@ local function calc_np_aux_glyph_common(lp, acc_flag) lp=lx; break else local lid = getid(lx) - if lid==id_glyph and getfield(lx, 'lang') ~= lang_ja then + if lid==id_glyph and not if_lang_ja(lx) then -- 欧文文字 last_glyph = lx; set_attr(lx, attr_icflag, PROCESSED); Np.last = lx y_adjust = has_attr(lx,attr_ablshift) or 0 @@ -397,7 +397,12 @@ local function calc_np_aux_glyph_common(lp, acc_flag) end local calc_np_auxtable do +local node_end_of_math = node.direct.end_of_math local dir_tate = luatexja.dir_table.dir_tate +local sid_start_link = node.subtype('pdf_start_link') +local sid_start_thread = node.subtype('pdf_start_thread') +local sid_end_link = node.subtype('pdf_end_link') +local sid_end_thread = node.subtype('pdf_end_thread') calc_np_auxtable = { [id_glyph] = calc_np_aux_glyph_common, [id_hlist] = function(lp) @@ -599,12 +604,11 @@ do c = getchar(x) 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 else Nx.pre, Nx.post = 0, 0 - Nx.xspc = table_current_stack[XSP - 1] or 3 end Nx.met = nil + Nx.xspc = table_current_stack[XSP + c] or 3 Nx.auto_xspc = (has_attr(x, attr_autoxspc)==1) end local set_np_xspc_alchar = set_np_xspc_alchar @@ -615,7 +619,7 @@ do local s = Nx.last_char if s then if getid(s)==id_glyph then - if getfield(s, 'lang') == lang_ja then + if if_lang_ja(s) then set_np_xspc_jachar_hbox(Nx, s) else set_np_xspc_alchar(Nx, getchar(s), s, 2) @@ -731,6 +735,7 @@ end -------------------- 和文文字間空白量の決定 local calc_ja_ja_aux do + local round = tex.round local bg_ag = 2*id_glue - id_glue local bg_ak = 2*id_glue - id_kern local bk_ag = 2*id_kern - id_glue @@ -1001,7 +1006,7 @@ end -- (anything) .. (和文文字で始まる hlist) 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 + if qid==id_jglyph or ((qid==id_pbox or qid == id_pbox_w) and Nq.met) then 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 @@ -1205,6 +1210,7 @@ end do local IHB = luatexja.userid_table.IHB local BPAR = luatexja.userid_table.BPAR + local BOXB = luatexja.userid_table.BOXB local node_prev = node.direct.getprev local node_write = node.direct.write @@ -1227,11 +1233,32 @@ do node_write(tn) end + -- Node for indicating a head/end of a box + function create_boxbdd_node() + local tn = node_new(id_whatsit, sid_user) + setfield(tn, 'user_id', BOXB) + setfield(tn, 'type', 100) + setfield(tn, 'value', 1) + node_write(tn) + end + local function whatsit_callback(Np, lp, Nq) if Np and Np.nuc then return Np elseif Np and getfield(lp, 'user_id') == BPAR then Np.first = lp; Np.nuc = lp; Np.last = lp return Np + elseif Np and getfield(lp, 'user_id') == BOXB then + Np.first = lp; Np.nuc = lp; Np.last = lp + if Nq then + if Nq.met then + Np.class = fast_find_char_class('parbdd', Nq.met) + end + Np.met = Nq.met; Np.pre = 0; Np.post = 0; Np.xspc = 0 + Np.auto_xspc = false + end + return Np + else + return Np end end @@ -1247,6 +1274,18 @@ do Nq.auto_xspc = false end head = node_remove(head, y) + node_free(y) + elseif not s and getfield(Nq.nuc, 'user_id') == BOXB then + local x, y = node_prev(Nq.nuc), Nq.nuc + Nq.first, Nq.nuc, Nq.last = x, x, x + if Np then + if Np.met then + Nq.class = fast_find_char_class('boxbdd', Np.met) + end + Nq.met = Np.met; Nq.pre = 0; Nq.post = 0; Nq.xspc = 0 + Nq.auto_xspc = false + end + head = node_remove(head, y) node_free(y) end return s |