0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81, 0xFF82, 0xFF83, 0xFF84,
0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89, 0xFF8A, 0xFF8B, 0xFF8C, 0xFF8D,
0xFF8E, 0xFF8F, 0xFF90, 0xFF91, 0xFF92, 0xFF93, 0xFF94, 0xFF95, 0xFF96,
- 0xFF97, 0xFF98, 0xFF99, 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F
+ 0xFF97, 0xFF98, 0xFF99, 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F,
+ "AJ1-516", "AJ1-517", "AJ1-518", "AJ1-519", "AJ1-520", "AJ1-521", "AJ1-522",
+ "AJ1-523", "AJ1-524", "AJ1-525", "AJ1-526", "AJ1-527", "AJ1-528", "AJ1-529",
+ "AJ1-530", "AJ1-531", "AJ1-532", "AJ1-533", "AJ1-534", "AJ1-535", "AJ1-536",
+ "AJ1-537", "AJ1-538", "AJ1-539", "AJ1-540", "AJ1-541", "AJ1-542", "AJ1-543",
+ "AJ1-544", "AJ1-545", "AJ1-546", "AJ1-547", "AJ1-548", "AJ1-549", "AJ1-550",
+ "AJ1-551", "AJ1-552", "AJ1-553", "AJ1-554", "AJ1-555", "AJ1-556", "AJ1-557",
+ "AJ1-558", "AJ1-559", "AJ1-560", "AJ1-561", "AJ1-562", "AJ1-563", "AJ1-564",
+ "AJ1-565", "AJ1-566", "AJ1-567", "AJ1-568", "AJ1-569", "AJ1-570", "AJ1-571",
+ "AJ1-572", "AJ1-573", "AJ1-574", "AJ1-575", "AJ1-576", "AJ1-577", "AJ1-578",
+ "AJ1-579", "AJ1-580", "AJ1-581", "AJ1-582", "AJ1-583", "AJ1-584", "AJ1-585",
+ "AJ1-586", "AJ1-587", "AJ1-588", "AJ1-589", "AJ1-590", "AJ1-591", "AJ1-592",
+ "AJ1-593", "AJ1-594", "AJ1-595", "AJ1-596", "AJ1-597", "AJ1-598",
},
align = 'left', left = 0.0, down = 0.0,
width = 0.5, height = 0.88, depth = 0.12, italic=0.0,
-------------------- Helper functions
+-- This function is called only for acquiring `special' characters.
local function find_char_class(c,m)
return m.chars[c] or 0
end
metrics[j].size_cache[sz].zh = round(metrics[j].zh*sz)
end
+luatexbase.create_callback("ltj.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("ltj.find_char_class", 0, m, c)
end
local function load_jfont_metric()
end
-- EXT
+luatexbase.create_callback("ltj.define_jfont", "data", function (ft, fn) return ft end)
+
function jfontdefY() -- for horizontal font
local j = load_jfont_metric()
local fn = font.id(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
update_jfm_cache(j, f.size)
+ local fmtable = { jfm = j, size = f.size, var = jfm_var }
+ fmtable = luatexbase.call_callback("ltj.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
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)
+ 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
local PROCESSED = 8
+local ltjf_font_metric_table = ltjf.font_metric_table
+local ltjf_find_char_class = ltjf.find_char_class
+
local conv_jchar_to_hbox_A
-- sty : 0 (display or text), 1 (script), >=2 (scriptscript)
r.char = p.char; r.font = f; r.subtype = 256
set_attr(r, attr_icflag, PROCESSED)
set_attr(r, attr_yablshift, 0)
- local class = ltjf.find_char_class(p.char, ltjf.font_metric_table[f].jfm)
+ local met = ltjf_font_metric_table[f]
+ local class = ltjf_find_char_class(p.char, met)
set_attr(r, attr_jchar_class, class)
- local met = ltjf.font_metric_table[f]
ltjw.char_data = ltjf.metrics[met.jfm].size_cache[met.size].char_type[class]
ltjw.head = r; ltjw.capsule_glyph(r, tex.mathdir , true);
q.head = ltjw.head; node_free(p); p=q;
local attr_yablshift = luatexbase.attributes['ltj@yablshift']
local attr_ykblshift = luatexbase.attributes['ltj@ykblshift']
+local ltjf_font_metric_table = ltjf.font_metric_table
+local ltjf_find_char_class = ltjf.find_char_class
+
+
-- Append a whatsit node to the list.
-- This whatsit node will be extracted to a glyph_node
function append_jglyph(char)
g.subtype = 0; g.char = p.value
v = has_attr(p, attr_curjfnt); g.font = v
set_attr(g, attr_jchar_class,
- ltjf.find_char_class(g.char, ltjf.font_metric_table[v].jfm))
+ ltjf_find_char_class(g.char, ltjf_font_metric_table[v]))
set_attr(g, attr_curjfnt, v)
v = has_attr(p, attr_yablshift)
if v then
'ltj.pre_linebreak_filter'))
+-- additional callbacks
+-- 以下は,LuaTeX-ja に用意された callback のサンプルになっている.
+-- JFM の文字クラスの指定の所で,"AJ1-xxx" 形式での指定を可能とした.
+-- これらの文字指定は,和文フォント定義ごとに,それぞれのフォントの
+-- CID <-> グリフ 対応状況による変換テーブルが用意される.
+
+-- フォント読み込み時に,CID
+local function cid_to_char(fmtable, fn)
+ local fi = fonts.ids[fn]
+ if fi.cidinfo and fi.cidinfo.ordering == "Japan1" then
+ fmtable.cid_char_type = {}
+ for i, v in pairs(ltjf.metrics[fmtable.jfm].chars) do
+ local j = string.match(i, "^AJ1%-([0-9]*)")
+ if j then
+ j = tonumber(fi.unicodes['Japan1.'..tostring(j)])
+ if j then
+ fmtable.cid_char_type[j] = v
+ end
+ end
+ end
+ end
+ return fmtable
+end
+luatexbase.add_to_callback("ltj.define_jfont",
+ cid_to_char, "ltj.otf.define_jfont", 1)
+-- 既に読み込まれているフォントに対しても,同じことをやらないといけない
+for fn, v in pairs(ltjf_font_metric_table) do
+ ltjf_font_metric_table[fn] = cid_to_char(fmtable, fn)
+end
+
+
+local function cid_set_char_class(arg, fmtable, char)
+ if arg~=0 then return arg
+ elseif fmtable.cid_char_type then
+ return fmtable.cid_char_type[char] or 0
+ else return 0
+ end
+end
+luatexbase.add_to_callback("ltj.find_char_class",
+ cid_set_char_class, "ltj.otf.find_char_class", 1)
+
-------------------- all done
-- EOF
local attr_yablshift = luatexbase.attributes['ltj@yablshift']
local attr_ykblshift = luatexbase.attributes['ltj@ykblshift']
-local lang_ja_token = token.create('ltj@japanese')
-local lang_ja = lang_ja_token[2]
+local ltjf_font_metric_table = ltjf.font_metric_table
+local ltjf_find_char_class = ltjf.find_char_class
------------------------------------------------------------------------
-- MAIN PROCESS STEP 1: replace fonts
if v then
p.font = v
set_attr(p, attr_jchar_class,
- ltjf.find_char_class(p.char, ltjf.font_metric_table[v].jfm))
+ ltjf_find_char_class(p.char, ltjf_font_metric_table[v]))
end
v = has_attr(p, attr_ykblshift)
if v then
{\bf(速報)}世界陸上\CID{20660},\ajLig{ボルト}がフライングで失格.
-\ajHankaku{半角カタカナひらがな} ←JFM の問題か,半角ひらがなが全角幅で出てしまう.
+\ajHankaku{半角カタカナひらがな} %←JFM の問題か,半角ひらがなが全角幅で出てしまう.
+←luatexja-otf.sty 内で,JFMの文法拡張を行いました.
+
+
+{\DeclareKanjiFamily{JY3}{hoge}{}
+\DeclareFontShape{JY3}{hoge}{m}{n}{<-> file:ipaexg.ttf:jfm=ujis}{}
+\fontfamily{hoge}\selectfont
+luatexja-otf.sty の下でも,TrueTypeフォントは正常に読めるよね?
+\verb+\CID+は正常に働かないと思うけど.}
\newpage