local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
local id_glyph = node.id('glyph')
local id_kern = node.id('kern')
-
+local cat_lp = luatexbase.catcodetables['latex-package']
local ITALIC = 1
------------------------------------------------------------------------
-- LOADING JFM
metrics={} -- this table stores all metric informations
font_metric_table={} -- [font number] -> jfm_name, jfm_var, size
+luatexbase.create_callback("luatexja.load_jfm", "data", function (ft, jn) return ft end)
+
local jfm_file_name, jfm_var
local defjfm_res
if real_char then
if not (type(v.width)=='number' or v.width~='prop') then
defjfm_res= nil; return
- elseif type(v.height)~='number' or type(v.depth)~='number' then
- defjfm_res= nil; return
+ else
+ if type(v.height)~='number' then
+ v.height = 0.0
+ end
+ if type(v.depth)~='number' then
+ v.depth = 0.0
+ end
+ if type(v.italic)~='number' then
+ v.italic = 0.0
+ end
+ if type(v.left)~='number' then
+ v.left = 0.0
+ end
+ if type(v.down)~='number' then
+ v.down = 0.0
+ end
+ if type(v.align)=='nil' then
+ v.align = 'left'
+ end
end
end
v.chars = nil
t[i] = nil
end
end
- defjfm_res= t
+ t = luatexbase.call_callback("luatexja.load_jfm", t, jfm_file_name)
+ t.size_cache = {}
+ defjfm_res = t
+end
+
+local function mult_table(old,scale) -- modified from table.fastcopy
+ if old then
+ local new = { }
+ for k,v in next, old do
+ if type(v) == "table" then
+ new[k] = mult_table(v,scale)
+ elseif type(v) == "number" then
+ new[k] = round(v*scale)
+ else
+ new[k] = v
+ end
+ end
+ return new
+ else return nil end
end
+local function update_jfm_cache(j,sz)
+ if metrics[j].size_cache[sz] then return end
+ metrics[j].size_cache[sz] = {}
+ metrics[j].size_cache[sz].char_type = mult_table(metrics[j].char_type, sz)
+ metrics[j].size_cache[sz].kanjijskip = mult_table(metrics[j].kanjiskip, sz)
+ metrics[j].size_cache[sz].xkanjiskip = mult_table(metrics[j].xkanjiskip,sz)
+ metrics[j].size_cache[sz].zw = round(metrics[j].zw*sz)
+ metrics[j].size_cache[sz].zh = round(metrics[j].zh*sz)
+end
+
+luatexbase.create_callback("luatexja.find_char_class", "data",
+ function (arg, fmtable, char)
+ return 0
+ end)
+
function find_char_class(c,m)
--- c: character code, m
- if not metrics[m] then return 0 end
- return metrics[m].chars[c] or 0
+-- c: character code, m: index in font_metric table
+ if not metrics[m.jfm] then return 0 end
+ return metrics[m.jfm].chars[c] or
+ luatexbase.call_callback("luatexja.find_char_class", 0, m, c)
end
local function load_jfont_metric()
if jfm_file_name=='' then
ltjb.package_error('luatexja',
'no JFM specified',
- {'To load and define a Japanese font, a JFM must be specified.',
- "The JFM 'ujis' will be used for now."})
+ 'To load and define a Japanese font, a JFM must be specified.'..
+ "The JFM 'ujis' will be used for now.")
jfm_file_name='ujis'
end
for j,v in ipairs(metrics) do
local t = token.get_next()
cstemp=token.csname_name(t)
if g then ltj.is_global = '\\global' else ltj.is_global = '' end
- tex.sprint('\\expandafter\\font\\csname ' .. cstemp .. '\\endcsname')
+ tex.sprint(cat_lp, '\\expandafter\\font\\csname ' .. cstemp .. '\\endcsname')
end
+luatexbase.create_callback("luatexja.define_jfont", "data", function (ft, fn) return ft end)
+
-- EXT
function jfontdefY() -- for horizontal font
local j = load_jfont_metric()
"bad JFM `" .. jfm_file_name .. "'",
'The JFM file you specified is not valid JFM file.\n'..
'So defining Japanese font is cancelled.')
- tex.sprint(ltj.is_global .. '\\expandafter\\let\\csname '
- .. cstemp .. '\\endcsname=\\relax')
+ tex.sprint(cat_lp, ltj.is_global .. '\\expandafter\\let\\csname ' ..cstemp
+ .. '\\endcsname=\\relax')
return
end
- font_metric_table[fn]={}
- font_metric_table[fn].jfm=j
- font_metric_table[fn].size=f.size
- font_metric_table[fn].var=jfm_var
- tex.sprint(ltj.is_global .. '\\protected\\expandafter\\def\\csname '
- .. cstemp .. '\\endcsname'
- .. '{\\csname ltj@curjfnt\\endcsname=' .. fn
- .. ' \\zw=' .. round(f.size*metrics[j].zw) .. 'sp'
- .. '\\zh=' .. round(f.size*metrics[j].zh) .. 'sp\\relax}')
+ update_jfm_cache(j, f.size)
+ local fmtable = { jfm = j, size = f.size, var = jfm_var }
+ fmtable = luatexbase.call_callback("luatexja.define_jfont", fmtable, fn)
+ font_metric_table[fn]=fmtable
+ tex.sprint(cat_lp, ltj.is_global .. '\\protected\\expandafter\\def\\csname '
+ .. cstemp .. '\\endcsname{\\ltj@curjfnt=' .. fn .. '\\relax}')
+end
+
+-- zw, zh
+function load_zw()
+ local a = font_metric_table[tex.attribute[attr_curjfnt]]
+ if a then
+ tex.setdimen('ltj@zw', metrics[a.jfm].size_cache[a.size].zw)
+ else
+ tex.setdimen('ltj@zw',0)
+ end
+end
+
+function load_zh()
+ local a = font_metric_table[tex.attribute[attr_curjfnt]]
+ if a then
+ tex.setdimen('ltj@zh', metrics[a.jfm].size_cache[a.size].zh)
+ else
+ tex.setdimen('ltj@zh',0)
+ end
end
-- extract jfm_file_name and jfm_var
if ltjc.is_ucs_in_japanese_char(p) then
f = has_attr(p, attr_curjfnt)
local j = font_metric_table[f]
- local c = find_char_class(p.char, j.jfm)
- g.kern = round(j.size * metrics[j.jfm].char_type[c].italic)
+ local c = find_char_class(p.char, j)
+ g.kern = metrics[j.jfm].size_cache[j.size].char_type[c].italic
else
g.kern = font.fonts[f].characters[p.char].italic
end
node.write(g)
+ tex.attribute[attr_icflag] = -(0x7FFFFFFF)
end
end