リビジョン | cdea265cb4616d3dddee47a20a7cc9a7bc6e47b0 (tree) |
---|---|
日時 | 2011-09-24 21:21:40 |
作者 | Hironori Kitagawa <h_kitagawa2001@yaho...> |
コミッター | Hironori Kitagawa |
Added "ltj.find_char_class" and "ltj.define_jfont" callbacks; otf.lua contains their example.
@@ -92,7 +92,19 @@ luatexja.jfont.define_jfm { | ||
92 | 92 | 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81, 0xFF82, 0xFF83, 0xFF84, |
93 | 93 | 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89, 0xFF8A, 0xFF8B, 0xFF8C, 0xFF8D, |
94 | 94 | 0xFF8E, 0xFF8F, 0xFF90, 0xFF91, 0xFF92, 0xFF93, 0xFF94, 0xFF95, 0xFF96, |
95 | - 0xFF97, 0xFF98, 0xFF99, 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F | |
95 | + 0xFF97, 0xFF98, 0xFF99, 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, | |
96 | + "AJ1-516", "AJ1-517", "AJ1-518", "AJ1-519", "AJ1-520", "AJ1-521", "AJ1-522", | |
97 | + "AJ1-523", "AJ1-524", "AJ1-525", "AJ1-526", "AJ1-527", "AJ1-528", "AJ1-529", | |
98 | + "AJ1-530", "AJ1-531", "AJ1-532", "AJ1-533", "AJ1-534", "AJ1-535", "AJ1-536", | |
99 | + "AJ1-537", "AJ1-538", "AJ1-539", "AJ1-540", "AJ1-541", "AJ1-542", "AJ1-543", | |
100 | + "AJ1-544", "AJ1-545", "AJ1-546", "AJ1-547", "AJ1-548", "AJ1-549", "AJ1-550", | |
101 | + "AJ1-551", "AJ1-552", "AJ1-553", "AJ1-554", "AJ1-555", "AJ1-556", "AJ1-557", | |
102 | + "AJ1-558", "AJ1-559", "AJ1-560", "AJ1-561", "AJ1-562", "AJ1-563", "AJ1-564", | |
103 | + "AJ1-565", "AJ1-566", "AJ1-567", "AJ1-568", "AJ1-569", "AJ1-570", "AJ1-571", | |
104 | + "AJ1-572", "AJ1-573", "AJ1-574", "AJ1-575", "AJ1-576", "AJ1-577", "AJ1-578", | |
105 | + "AJ1-579", "AJ1-580", "AJ1-581", "AJ1-582", "AJ1-583", "AJ1-584", "AJ1-585", | |
106 | + "AJ1-586", "AJ1-587", "AJ1-588", "AJ1-589", "AJ1-590", "AJ1-591", "AJ1-592", | |
107 | + "AJ1-593", "AJ1-594", "AJ1-595", "AJ1-596", "AJ1-597", "AJ1-598", | |
96 | 108 | }, |
97 | 109 | align = 'left', left = 0.0, down = 0.0, |
98 | 110 | width = 0.5, height = 0.88, depth = 0.12, italic=0.0, |
@@ -78,6 +78,7 @@ local ltjf_metrics = ltjf.metrics | ||
78 | 78 | |
79 | 79 | -------------------- Helper functions |
80 | 80 | |
81 | +-- This function is called only for acquiring `special' characters. | |
81 | 82 | local function find_char_class(c,m) |
82 | 83 | return m.chars[c] or 0 |
83 | 84 | end |
@@ -126,10 +126,16 @@ local function update_jfm_cache(j,sz) | ||
126 | 126 | metrics[j].size_cache[sz].zh = round(metrics[j].zh*sz) |
127 | 127 | end |
128 | 128 | |
129 | +luatexbase.create_callback("ltj.find_char_class", "data", | |
130 | + function (arg, fmtable, char) | |
131 | + return 0 | |
132 | + end) | |
133 | + | |
129 | 134 | function find_char_class(c,m) |
130 | --- c: character code, m | |
131 | - if not metrics[m] then return 0 end | |
132 | - return metrics[m].chars[c] or 0 | |
135 | +-- c: character code, m: index in font_metric table | |
136 | + if not metrics[m.jfm] then return 0 end | |
137 | + return metrics[m.jfm].chars[c] or | |
138 | + luatexbase.call_callback("ltj.find_char_class", 0, m, c) | |
133 | 139 | end |
134 | 140 | |
135 | 141 | local function load_jfont_metric() |
@@ -168,6 +174,8 @@ function jfontdefX(g) | ||
168 | 174 | end |
169 | 175 | |
170 | 176 | -- EXT |
177 | +luatexbase.create_callback("ltj.define_jfont", "data", function (ft, fn) return ft end) | |
178 | + | |
171 | 179 | function jfontdefY() -- for horizontal font |
172 | 180 | local j = load_jfont_metric() |
173 | 181 | local fn = font.id(cstemp) |
@@ -181,11 +189,10 @@ function jfontdefY() -- for horizontal font | ||
181 | 189 | .. '\\endcsname=\\relax') |
182 | 190 | return |
183 | 191 | end |
184 | - font_metric_table[fn]={} | |
185 | - font_metric_table[fn].jfm=j | |
186 | - font_metric_table[fn].size=f.size | |
187 | - font_metric_table[fn].var=jfm_var | |
188 | 192 | update_jfm_cache(j, f.size) |
193 | + local fmtable = { jfm = j, size = f.size, var = jfm_var } | |
194 | + fmtable = luatexbase.call_callback("ltj.define_jfont", fmtable, fn) | |
195 | + font_metric_table[fn]=fmtable | |
189 | 196 | tex.sprint(cat_lp, ltj.is_global .. '\\protected\\expandafter\\def\\csname ' |
190 | 197 | .. cstemp .. '\\endcsname{\\ltj@curjfnt=' .. fn .. '\\relax}') |
191 | 198 | end |
@@ -258,7 +265,7 @@ function append_italic() | ||
258 | 265 | if ltjc.is_ucs_in_japanese_char(p) then |
259 | 266 | f = has_attr(p, attr_curjfnt) |
260 | 267 | local j = font_metric_table[f] |
261 | - local c = find_char_class(p.char, j.jfm) | |
268 | + local c = find_char_class(p.char, j) | |
262 | 269 | g.kern = metrics[j.jfm].size_cache[j.size].char_type[c].italic |
263 | 270 | else |
264 | 271 | g.kern = font.fonts[f].characters[p.char].italic |
@@ -42,6 +42,9 @@ local id_sub_mlist = node.id('sub_mlist') | ||
42 | 42 | |
43 | 43 | local PROCESSED = 8 |
44 | 44 | |
45 | +local ltjf_font_metric_table = ltjf.font_metric_table | |
46 | +local ltjf_find_char_class = ltjf.find_char_class | |
47 | + | |
45 | 48 | local conv_jchar_to_hbox_A |
46 | 49 | |
47 | 50 | -- sty : 0 (display or text), 1 (script), >=2 (scriptscript) |
@@ -102,9 +105,9 @@ function (p, sty) | ||
102 | 105 | r.char = p.char; r.font = f; r.subtype = 256 |
103 | 106 | set_attr(r, attr_icflag, PROCESSED) |
104 | 107 | set_attr(r, attr_yablshift, 0) |
105 | - local class = ltjf.find_char_class(p.char, ltjf.font_metric_table[f].jfm) | |
108 | + local met = ltjf_font_metric_table[f] | |
109 | + local class = ltjf_find_char_class(p.char, met) | |
106 | 110 | set_attr(r, attr_jchar_class, class) |
107 | - local met = ltjf.font_metric_table[f] | |
108 | 111 | ltjw.char_data = ltjf.metrics[met.jfm].size_cache[met.size].char_type[class] |
109 | 112 | ltjw.head = r; ltjw.capsule_glyph(r, tex.mathdir , true); |
110 | 113 | q.head = ltjw.head; node_free(p); p=q; |
@@ -30,6 +30,10 @@ local attr_jchar_class = luatexbase.attributes['ltj@charclass'] | ||
30 | 30 | local attr_yablshift = luatexbase.attributes['ltj@yablshift'] |
31 | 31 | local attr_ykblshift = luatexbase.attributes['ltj@ykblshift'] |
32 | 32 | |
33 | +local ltjf_font_metric_table = ltjf.font_metric_table | |
34 | +local ltjf_find_char_class = ltjf.find_char_class | |
35 | + | |
36 | + | |
33 | 37 | -- Append a whatsit node to the list. |
34 | 38 | -- This whatsit node will be extracted to a glyph_node |
35 | 39 | function append_jglyph(char) |
@@ -67,7 +71,7 @@ function extract(head) | ||
67 | 71 | g.subtype = 0; g.char = p.value |
68 | 72 | v = has_attr(p, attr_curjfnt); g.font = v |
69 | 73 | set_attr(g, attr_jchar_class, |
70 | - ltjf.find_char_class(g.char, ltjf.font_metric_table[v].jfm)) | |
74 | + ltjf_find_char_class(g.char, ltjf_font_metric_table[v])) | |
71 | 75 | set_attr(g, attr_curjfnt, v) |
72 | 76 | v = has_attr(p, attr_yablshift) |
73 | 77 | if v then |
@@ -95,5 +99,46 @@ luatexbase.add_to_callback('pre_linebreak_filter', | ||
95 | 99 | 'ltj.pre_linebreak_filter')) |
96 | 100 | |
97 | 101 | |
102 | +-- additional callbacks | |
103 | +-- 以下は,LuaTeX-ja に用意された callback のサンプルになっている. | |
104 | +-- JFM の文字クラスの指定の所で,"AJ1-xxx" 形式での指定を可能とした. | |
105 | +-- これらの文字指定は,和文フォント定義ごとに,それぞれのフォントの | |
106 | +-- CID <-> グリフ 対応状況による変換テーブルが用意される. | |
107 | + | |
108 | +-- フォント読み込み時に,CID | |
109 | +local function cid_to_char(fmtable, fn) | |
110 | + local fi = fonts.ids[fn] | |
111 | + if fi.cidinfo and fi.cidinfo.ordering == "Japan1" then | |
112 | + fmtable.cid_char_type = {} | |
113 | + for i, v in pairs(ltjf.metrics[fmtable.jfm].chars) do | |
114 | + local j = string.match(i, "^AJ1%-([0-9]*)") | |
115 | + if j then | |
116 | + j = tonumber(fi.unicodes['Japan1.'..tostring(j)]) | |
117 | + if j then | |
118 | + fmtable.cid_char_type[j] = v | |
119 | + end | |
120 | + end | |
121 | + end | |
122 | + end | |
123 | + return fmtable | |
124 | +end | |
125 | +luatexbase.add_to_callback("ltj.define_jfont", | |
126 | + cid_to_char, "ltj.otf.define_jfont", 1) | |
127 | +-- 既に読み込まれているフォントに対しても,同じことをやらないといけない | |
128 | +for fn, v in pairs(ltjf_font_metric_table) do | |
129 | + ltjf_font_metric_table[fn] = cid_to_char(fmtable, fn) | |
130 | +end | |
131 | + | |
132 | + | |
133 | +local function cid_set_char_class(arg, fmtable, char) | |
134 | + if arg~=0 then return arg | |
135 | + elseif fmtable.cid_char_type then | |
136 | + return fmtable.cid_char_type[char] or 0 | |
137 | + else return 0 | |
138 | + end | |
139 | +end | |
140 | +luatexbase.add_to_callback("ltj.find_char_class", | |
141 | + cid_set_char_class, "ltj.otf.find_char_class", 1) | |
142 | + | |
98 | 143 | -------------------- all done |
99 | 144 | -- EOF |
@@ -29,8 +29,8 @@ local attr_curjfnt = luatexbase.attributes['ltj@curjfnt'] | ||
29 | 29 | local attr_yablshift = luatexbase.attributes['ltj@yablshift'] |
30 | 30 | local attr_ykblshift = luatexbase.attributes['ltj@ykblshift'] |
31 | 31 | |
32 | -local lang_ja_token = token.create('ltj@japanese') | |
33 | -local lang_ja = lang_ja_token[2] | |
32 | +local ltjf_font_metric_table = ltjf.font_metric_table | |
33 | +local ltjf_find_char_class = ltjf.find_char_class | |
34 | 34 | |
35 | 35 | ------------------------------------------------------------------------ |
36 | 36 | -- MAIN PROCESS STEP 1: replace fonts |
@@ -45,7 +45,7 @@ local function suppress_hyphenate_ja(head) | ||
45 | 45 | if v then |
46 | 46 | p.font = v |
47 | 47 | set_attr(p, attr_jchar_class, |
48 | - ltjf.find_char_class(p.char, ltjf.font_metric_table[v].jfm)) | |
48 | + ltjf_find_char_class(p.char, ltjf_font_metric_table[v])) | |
49 | 49 | end |
50 | 50 | v = has_attr(p, attr_ykblshift) |
51 | 51 | if v then |
@@ -40,7 +40,15 @@ | ||
40 | 40 | |
41 | 41 | {\bf(速報)}世界陸上\CID{20660},\ajLig{ボルト}がフライングで失格. |
42 | 42 | |
43 | -\ajHankaku{半角カタカナひらがな} ←JFM の問題か,半角ひらがなが全角幅で出てしまう. | |
43 | +\ajHankaku{半角カタカナひらがな} %←JFM の問題か,半角ひらがなが全角幅で出てしまう. | |
44 | +←luatexja-otf.sty 内で,JFMの文法拡張を行いました. | |
45 | + | |
46 | + | |
47 | +{\DeclareKanjiFamily{JY3}{hoge}{} | |
48 | +\DeclareFontShape{JY3}{hoge}{m}{n}{<-> file:ipaexg.ttf:jfm=ujis}{} | |
49 | +\fontfamily{hoge}\selectfont | |
50 | +luatexja-otf.sty の下でも,TrueTypeフォントは正常に読めるよね? | |
51 | +\verb+\CID+は正常に働かないと思うけど.} | |
44 | 52 | |
45 | 53 | \newpage |
46 | 54 |