X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=src%2Fltj-jfmglue.lua;h=2d11a4793948f8df9f5bbdd40604b38d0d85e0cd;hb=f078ac2f7998a102c7ec765e725f2269eed9f872;hp=531a5c75433fb9a9871e0cd4176c3d6f67073923;hpb=786434b34a66995d5dedaedaf12c5c922cc263d6;p=luatex-ja%2Fluatexja.git diff --git a/src/ltj-jfmglue.lua b/src/ltj-jfmglue.lua index 531a5c7..2d11a47 100644 --- a/src/ltj-jfmglue.lua +++ b/src/ltj-jfmglue.lua @@ -3,11 +3,10 @@ -- luatexbase.provides_module({ name = 'luatexja.jfmglue', - date = '2017/05/05', - description = 'Insertion process of JFM glues and kanjiskip', + date = '2019/07/26', + description = 'Insertion process of JFM glues, [x]kanjiskip and others', }) -module('luatexja.jfmglue', package.seeall) -local err, warn, info, log = luatexbase .errwarinf(_NAME) +luatexja.jfmglue = luatexja.jfmglue or {} luatexja.load_module('base'); local ltjb = luatexja.base luatexja.load_module('stack'); local ltjs = luatexja.stack @@ -16,9 +15,8 @@ luatexja.load_module('direction'); local ltjd = luatexja.direction luatexja.load_module('setwidth'); local ltjw = luatexja.setwidth local pairs = pairs -local nullfunc = function(n) return n end -local to_node = node.direct.tonode -local to_direct = node.direct.todirect +--local to_node = node.direct.tonode +--local to_direct = node.direct.todirect local setfield = node.direct.setfield local setglue = luatexja.setglue @@ -88,7 +86,7 @@ local list_dir local capsule_glyph local tex_dir local attr_ablshift -local set_np_xspc_jachar +local set_np_xspc_jachar, set_np_xspc_alchar local set_np_xspc_jachar_hbox local ltjs_orig_char_table = ltjs.orig_char_table @@ -127,22 +125,27 @@ end -- penalty 値の計算 -local function add_penalty(p,e) - local pp = getfield(p, 'penalty') - if pp>=10000 then - if e<=-10000 then setfield(p, 'penalty', 0) end - elseif pp<=-10000 then - if e>=10000 then setfield(p, 'penalty', 0) end - else - pp = pp + e - if pp>=10000 then setfield(p, 'penalty', 10000) - elseif pp<=-10000 then setfield(p, 'penalty', -10000) - else setfield(p, 'penalty', pp) end +local add_penalty +do +local setpenalty = node.direct.setpenalty or function(n, a) setfield(n,'penalty',a) end +local getpenalty = node.direct.getpenalty or function(n) return getfield(n,'penalty') end +function add_penalty(p,e) + local pp = getpenalty(p) + if (pp>-10000) and (pp<10000) then + if e>=10000 then setpenalty(p, 10000) + elseif e<=-10000 then setpenalty(p, -10000) + else + pp = pp + e + if pp>=10000 then setpenalty(p, 10000) + elseif pp<=-10000 then setpenalty(p, -10000) + else setpenalty(p, pp) end + end end end +end -- 「異なる JFM」の間の調整方法 -diffmet_rule = math.two_paverage +luatexja.jfmglue.diffmet_rule = math.two_paverage function math.two_add(a,b) return a+b end function math.two_average(a,b) return (a+b)*0.5 end function math.two_paverage(a,b) return (a+b)/2 end @@ -160,6 +163,7 @@ local non_ihb_flag -- JFM グルー挿入抑止用 flag -------------------- hlist 内の文字の検索 local first_char, last_char, find_first_char +local check_box_high do local ltjd_glyph_from_packed = ltjd.glyph_from_packed local function check_box(box_ptr, box_end) @@ -230,7 +234,7 @@ local function check_box(box_ptr, box_end) return found_visible_node end -function check_box_high(Nx, box_ptr, box_end) +check_box_high = function (Nx, box_ptr, box_end) first_char = nil; last_char = nil; find_first_char = true if check_box(box_ptr, box_end) then local first_char = first_char @@ -263,30 +267,33 @@ luatexbase.create_callback("luatexja.jfmglue.whatsit_after", "data", -- calc next Np local calc_np -do +do -- 001 ----------------------------------------------- local traverse = node.direct.traverse local function check_next_ickern(lp) - 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 + local lx = Np.nuc + while lp and getid(lp) == id_kern and ( getsubtype(lp)==0 or + getsubtype(lp)==3 or ITALIC == get_attr_icflag(lp)) do + set_attr(lp, attr_icflag, IC_PROCESSED); + lx, lp = lp, node_next(lp) end + Np.last = lx; return lp end local function calc_np_pbox(lp, last) - local first, lpa, nc = (not Np.first), KINSOKU, nil + local first, nc = (not Np.first), nil + --local lpa = get_attr_icflag(lp)==PACKED and PACKED or KINSOKU -- KINSOKU: dummy + local lpa = get_attr_icflag(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=2 do - x = f(xc); xc, xs = getfield(x, 'components'), getsubtype(x) + x = f(xc); + if getid(x)==id_disc then x, xc, xs = nil, getfield(x,'replace'), 2 + else xc, xs = getcomponents(x), getsubtype(x) end end - c = getchar(x) + c = x and getchar(x) or c Nx.pre = table_current_stack[PRE + c] or 0 Nx.post = table_current_stack[POST + c] or 0 else @@ -642,7 +675,7 @@ end -------------------- 最下層の処理 -luatexbase.create_callback('luatexja.adjust_jfmglue', 'simple', nullfunc) +luatexbase.create_callback('luatexja.adjust_jfmglue', 'simple', function(n) return n end) -- change penalties (or create a new penalty, if needed) local function handle_penalty_normal(post, pre, g) @@ -716,7 +749,7 @@ local function new_jfm_glue(mc, bc, ac) return node_copy(g[1]), g.ratio, false, false, false else local f = node_new(id_glue) - set_attr(f, attr_icflag, g.priority) + set_attr(f, attr_icflag, g.priority) setglue(f, g.width, g.stretch, g.shrink) return f, g.ratio, g.kanjiskip_natural, g.kanjiskip_stretch, g.kanjiskip_shrink end @@ -743,11 +776,11 @@ do local bk_ak = 2*id_kern - id_kern local function blend_diffmet(b, a, rb, ra) - return round(diffmet_rule((1-rb)*b+rb*a, (1-ra)*b+ra*a)) + return round(luatexja.jfmglue.diffmet_rule((1-rb)*b+rb*a, (1-ra)*b+ra*a)) end calc_ja_ja_aux = function (gb, ga, db, da) - if diffmet_rule ~= math.two_pleft and diffmet_rule ~= math.two_pright - and diffmet_rule ~= math.two_paverage then + if luatexja.jfmglue.diffmet_rule ~= math.two_pleft and diffmet_rule ~= math.two_pright + and luatexja.jfmglue.diffmet_rule ~= math.two_paverage then db, da = 0, 1 end if not gb then @@ -802,6 +835,7 @@ end local null_skip_table = {0, 0, 0} -- get kanjiskip local get_kanjiskip, kanjiskip_jfm_flag +local get_kanjiskip_low local calc_ja_ja_glue do local KANJI_SKIP = luatexja.icflag_table.KANJI_SKIP @@ -885,6 +919,7 @@ end -- get xkanjiskip local get_xkanjiskip, xkanjiskip_jfm_flag local get_xkanjiskip_normal, get_xkanjiskip_jfm +local get_xkanjiskip_low do local XKANJI_SKIP = luatexja.icflag_table.XKANJI_SKIP local XKANJI_SKIP_JFM = luatexja.icflag_table.XKANJI_SKIP_JFM @@ -1057,6 +1092,7 @@ end -- Nq が前側のクラスタとなることによる修正 +local adjust_nq do local adjust_nq_aux = { [id_glyph] = function() after_alchar(Nq) end, -- after_alchar(Nq) @@ -1069,7 +1105,7 @@ do end, } - function adjust_nq() + adjust_nq=function() local x = adjust_nq_aux[Nq.id] if x then x() end end @@ -1207,7 +1243,7 @@ end -------------------- 外部から呼ばれる関数 -- main interface -function main(ahead, mode, dir) +function luatexja.jfmglue.main(ahead, mode, dir) if not ahead then return ahead end --luatexja.ext_show_node_list(to_node(ahead ), '>B ', print) --print() @@ -1248,7 +1284,7 @@ do local node_write = node.direct.write -- \inhibitglue - function create_inhibitglue_node() + function luatexja.jfmglue.create_inhibitglue_node() local tn = node_new(id_whatsit, sid_user) setfield(tn, 'user_id', IHB) setfield(tn, 'type', 100) @@ -1258,7 +1294,7 @@ do -- Node for indicating beginning of a paragraph -- (for ltjsclasses) - function create_beginpar_node() + function luatexja.jfmglue.create_beginpar_node() local tn = node_new(id_whatsit, sid_user) setfield(tn, 'user_id', BPAR) setfield(tn, 'type', 100) @@ -1267,7 +1303,7 @@ do end -- Node for indicating a head/end of a box - function create_boxbdd_node() + function luatexja.jfmglue.create_boxbdd_node() local tn = node_new(id_whatsit, sid_user) setfield(tn, 'user_id', BOXB) setfield(tn, 'type', 100) @@ -1330,3 +1366,6 @@ do "luatexja.beginpar.np_info_after", 1) end + +luatexja.jfmglue.after_hlist = after_hlist +luatexja.jfmglue.check_box_high = check_box_high