• R/O
  • HTTP
  • SSH
  • HTTPS

luatexja: コミット

ソースコードの管理場所


コミットメタ情報

リビジョン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.

変更サマリ

差分

--- a/src/jfm-ujis.lua
+++ b/src/jfm-ujis.lua
@@ -92,7 +92,19 @@ luatexja.jfont.define_jfm {
9292 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81, 0xFF82, 0xFF83, 0xFF84,
9393 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89, 0xFF8A, 0xFF8B, 0xFF8C, 0xFF8D,
9494 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",
96108 },
97109 align = 'left', left = 0.0, down = 0.0,
98110 width = 0.5, height = 0.88, depth = 0.12, italic=0.0,
--- a/src/luatexja/jfmglue.lua
+++ b/src/luatexja/jfmglue.lua
@@ -78,6 +78,7 @@ local ltjf_metrics = ltjf.metrics
7878
7979 -------------------- Helper functions
8080
81+-- This function is called only for acquiring `special' characters.
8182 local function find_char_class(c,m)
8283 return m.chars[c] or 0
8384 end
--- a/src/luatexja/jfont.lua
+++ b/src/luatexja/jfont.lua
@@ -126,10 +126,16 @@ local function update_jfm_cache(j,sz)
126126 metrics[j].size_cache[sz].zh = round(metrics[j].zh*sz)
127127 end
128128
129+luatexbase.create_callback("ltj.find_char_class", "data",
130+ function (arg, fmtable, char)
131+ return 0
132+ end)
133+
129134 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)
133139 end
134140
135141 local function load_jfont_metric()
@@ -168,6 +174,8 @@ function jfontdefX(g)
168174 end
169175
170176 -- EXT
177+luatexbase.create_callback("ltj.define_jfont", "data", function (ft, fn) return ft end)
178+
171179 function jfontdefY() -- for horizontal font
172180 local j = load_jfont_metric()
173181 local fn = font.id(cstemp)
@@ -181,11 +189,10 @@ function jfontdefY() -- for horizontal font
181189 .. '\\endcsname=\\relax')
182190 return
183191 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
188192 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
189196 tex.sprint(cat_lp, ltj.is_global .. '\\protected\\expandafter\\def\\csname '
190197 .. cstemp .. '\\endcsname{\\ltj@curjfnt=' .. fn .. '\\relax}')
191198 end
@@ -258,7 +265,7 @@ function append_italic()
258265 if ltjc.is_ucs_in_japanese_char(p) then
259266 f = has_attr(p, attr_curjfnt)
260267 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)
262269 g.kern = metrics[j.jfm].size_cache[j.size].char_type[c].italic
263270 else
264271 g.kern = font.fonts[f].characters[p.char].italic
--- a/src/luatexja/math.lua
+++ b/src/luatexja/math.lua
@@ -42,6 +42,9 @@ local id_sub_mlist = node.id('sub_mlist')
4242
4343 local PROCESSED = 8
4444
45+local ltjf_font_metric_table = ltjf.font_metric_table
46+local ltjf_find_char_class = ltjf.find_char_class
47+
4548 local conv_jchar_to_hbox_A
4649
4750 -- sty : 0 (display or text), 1 (script), >=2 (scriptscript)
@@ -102,9 +105,9 @@ function (p, sty)
102105 r.char = p.char; r.font = f; r.subtype = 256
103106 set_attr(r, attr_icflag, PROCESSED)
104107 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)
106110 set_attr(r, attr_jchar_class, class)
107- local met = ltjf.font_metric_table[f]
108111 ltjw.char_data = ltjf.metrics[met.jfm].size_cache[met.size].char_type[class]
109112 ltjw.head = r; ltjw.capsule_glyph(r, tex.mathdir , true);
110113 q.head = ltjw.head; node_free(p); p=q;
--- a/src/luatexja/otf.lua
+++ b/src/luatexja/otf.lua
@@ -30,6 +30,10 @@ local attr_jchar_class = luatexbase.attributes['ltj@charclass']
3030 local attr_yablshift = luatexbase.attributes['ltj@yablshift']
3131 local attr_ykblshift = luatexbase.attributes['ltj@ykblshift']
3232
33+local ltjf_font_metric_table = ltjf.font_metric_table
34+local ltjf_find_char_class = ltjf.find_char_class
35+
36+
3337 -- Append a whatsit node to the list.
3438 -- This whatsit node will be extracted to a glyph_node
3539 function append_jglyph(char)
@@ -67,7 +71,7 @@ function extract(head)
6771 g.subtype = 0; g.char = p.value
6872 v = has_attr(p, attr_curjfnt); g.font = v
6973 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]))
7175 set_attr(g, attr_curjfnt, v)
7276 v = has_attr(p, attr_yablshift)
7377 if v then
@@ -95,5 +99,46 @@ luatexbase.add_to_callback('pre_linebreak_filter',
9599 'ltj.pre_linebreak_filter'))
96100
97101
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+
98143 -------------------- all done
99144 -- EOF
--- a/src/luatexja/pretreat.lua
+++ b/src/luatexja/pretreat.lua
@@ -29,8 +29,8 @@ local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
2929 local attr_yablshift = luatexbase.attributes['ltj@yablshift']
3030 local attr_ykblshift = luatexbase.attributes['ltj@ykblshift']
3131
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
3434
3535 ------------------------------------------------------------------------
3636 -- MAIN PROCESS STEP 1: replace fonts
@@ -45,7 +45,7 @@ local function suppress_hyphenate_ja(head)
4545 if v then
4646 p.font = v
4747 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]))
4949 end
5050 v = has_attr(p, attr_ykblshift)
5151 if v then
Binary files a/test/test04-jfm.pdf and b/test/test04-jfm.pdf differ
Binary files a/test/test10-otf.pdf and b/test/test10-otf.pdf differ
--- a/test/test10-otf.tex
+++ b/test/test10-otf.tex
@@ -40,7 +40,15 @@
4040
4141 {\bf(速報)}世界陸上\CID{20660},\ajLig{ボルト}がフライングで失格.
4242
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+は正常に働かないと思うけど.}
4452
4553 \newpage
4654
旧リポジトリブラウザで表示