+ function jfontdefX(g)
+ local t = token.get_next()
+ cstemp=token.csname_name(t)
+ global_flag = g and '\\global' or ''
+ tex.sprint(cat_lp, '\\expandafter\\font\\csname ', cstemp, '\\endcsname')
+ end
+
+ luatexbase.create_callback("luatexja.define_jfont", "data", function (ft, fn) return ft end)
+
+-- EXT
+ local identifiers = fonts.hashes.identifiers
+ function jfontdefY(dir)
+ jfm_dir = dir
+ local j = load_jfont_metric(dir)
+ local fn = font.id(cstemp)
+ local f = font_getfont(fn)
+ if not j then
+ ltjb.package_error('luatexja',
+ "bad JFM `" .. jfm_file_name .. "'",
+ 'The JFM file you specified is not valid JFM file.\n'..
+ 'So defining Japanese font is cancelled.')
+ tex.sprint(cat_lp, global_flag, '\\expandafter\\let\\csname ', cstemp,
+ '\\endcsname=\\relax')
+ return
+ end
+ update_jfm_cache(j, f.size)
+ local ad = identifiers[fn].parameters
+ local sz = metrics[j].size_cache[f.size]
+ local fmtable = { jfm = j, size = f.size, var = jfm_var,
+ zw = sz.zw, zh = sz.zh,
+ ascent = ad.ascender,
+ descent = ad.descender,
+ chars = sz.chars, char_type = sz.char_type,
+ kanjiskip = sz.kanjiskip, xkanjiskip = sz.xkanjiskip,
+ chars_cbcache = {},
+ }
+
+ fmtable = luatexbase.call_callback("luatexja.define_jfont", fmtable, fn)
+ font_metric_table[fn]=fmtable
+ tex.sprint(cat_lp, global_flag, '\\protected\\expandafter\\def\\csname ',
+ cstemp , '\\endcsname{\\ltj@cur'..
+ (dir == 'yoko' and 'j' or 't') .. 'fnt', fn, '\\relax}')
+ end
+end
+
+do
+ local get_dir_count = ltjd.get_dir_count
+ local dir_tate = luatexja.dir_table.dir_tate
+ local tex_get_attr = tex.getattribute
+ -- PUBLIC function
+ function get_zw()
+ local a = font_metric_table[
+ tex_get_attr((get_dir_count()==dir_tate) and attr_curtfnt or attr_curjfnt)]
+ return a and a.zw or 0
+ end
+ function get_zh()
+ local a = font_metric_table[
+ tex_get_attr((get_dir_count()==dir_tate) and attr_curtfnt or attr_curjfnt)]
+ return a and a.zw or 0
+ end
+end
+
+do
+ -- extract jfm_file_name and jfm_var
+ -- normalize position of 'jfm=' and 'jfmvar=' keys
+ local function extract_metric(name)
+ jfm_file_name = ''; jfm_var = ''
+ local tmp, index = name:sub(1, 5), 1
+ if tmp == 'file:' or tmp == 'name:' or tmp == 'psft:' then
+ index = 6
+ end
+ local p = name:find(":", index); index = p and (p+1) or index
+ while index do
+ local l = name:len()+1
+ local q = name:find(";", index+1) or l
+ if name:sub(index, index+3)=='jfm=' and q>index+4 then
+ jfm_file_name = name:sub(index+4, q-1)
+ if l~=q then
+ name = name:sub(1,index-1) .. name:sub(q+1)
+ else
+ name = name:sub(1,index-1)
+ index = nil
+ end
+ elseif name:sub(index, index+6)=='jfmvar=' and q>index+6 then
+ jfm_var = name:sub(index+7, q-1)
+ if l~=q then
+ name = name:sub(1,index-1) .. name:sub(q+1)
+ else
+ name = name:sub(1,index-1)
+ index = nil
+ end
+ else
+ index = (l~=q) and (q+1) or nil
+ end
+ end
+ if jfm_file_name~='' then
+ local l = name:sub(-1)
+ name = name
+ .. ((l==':' or l==';') and '' or ';')
+ .. 'jfm=' .. jfm_file_name
+ if jfm_var~='' then
+ name = name .. 'jfmvar=' .. jfm_var
+ end
+ end
+ return name
+ end
+
+ -- define_font callback
+ local otfl_fdr = fonts.definers.read
+ local ltjr_font_callback = ltjr.font_callback
+ function luatexja.font_callback(name, size, id)
+ local new_name = extract_metric(name)
+ local res = ltjr_font_callback(new_name, size, id, otfl_fdr)
+ luatexbase.call_callback('luatexja.define_font', res, new_name, size, id)
+ return res
+ end
+ luatexbase.create_callback('luatexja.define_font', 'simple', function (n) return n end)
+ luatexbase.add_to_callback('define_font',luatexja.font_callback,"luatexja.font_callback", 1)