OSDN Git Service

Added "ltj.find_char_class" and "ltj.define_jfont" callbacks; otf.lua contains their...
authorHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Sat, 24 Sep 2011 12:21:40 +0000 (21:21 +0900)
committerHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Sat, 24 Sep 2011 12:21:40 +0000 (21:21 +0900)
src/jfm-ujis.lua
src/luatexja/jfmglue.lua
src/luatexja/jfont.lua
src/luatexja/math.lua
src/luatexja/otf.lua
src/luatexja/pretreat.lua
test/test04-jfm.pdf
test/test10-otf.pdf
test/test10-otf.tex

index 6c5ea0d..dd40509 100644 (file)
@@ -92,7 +92,19 @@ luatexja.jfont.define_jfm {
         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,      
index 045a83a..49b66e8 100644 (file)
@@ -78,6 +78,7 @@ local ltjf_metrics = ltjf.metrics
 
 -------------------- 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
index 323114b..782c2f7 100644 (file)
@@ -126,10 +126,16 @@ local function update_jfm_cache(j,sz)
    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()
@@ -168,6 +174,8 @@ function jfontdefX(g)
 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)
@@ -181,11 +189,10 @@ function jfontdefY() -- for horizontal font
              .. '\\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
@@ -258,7 +265,7 @@ function append_italic()
       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
index 6669512..f43050d 100644 (file)
@@ -42,6 +42,9 @@ local id_sub_mlist = node.id('sub_mlist')
 
 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)
@@ -102,9 +105,9 @@ function (p, sty)
            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;
index 0090c24..8ea65bb 100644 (file)
@@ -30,6 +30,10 @@ local attr_jchar_class = luatexbase.attributes['ltj@charclass']
 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)
@@ -67,7 +71,7 @@ function extract(head)
            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 
@@ -95,5 +99,46 @@ luatexbase.add_to_callback('pre_linebreak_filter',
                                   '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
index 7adeec9..7022307 100644 (file)
@@ -29,8 +29,8 @@ local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
 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
@@ -45,7 +45,7 @@ local function suppress_hyphenate_ja(head)
         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 
index 6b69515..fc02997 100644 (file)
Binary files a/test/test04-jfm.pdf and b/test/test04-jfm.pdf differ
index e148c8f..6e55a06 100644 (file)
Binary files a/test/test10-otf.pdf and b/test/test10-otf.pdf differ
index 0df2398..33aaa7e 100644 (file)
 
 {\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