OSDN Git Service

small bugfix
authorHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Thu, 2 Jan 2014 05:04:11 +0000 (14:04 +0900)
committerHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Thu, 2 Jan 2014 05:04:11 +0000 (14:04 +0900)
 - first call of \adjustbaseline is moved to lltjfont.sty
 - If Japanese font \ALT does not have a character <c>, then
     \ltjdeclarealtfont \BASE \ALT {<c>}
   does not replace <c> in \BASE to <c> in \ALT.

src/ltj-jfont.lua
src/ltj-pretreat.lua
src/luatexja.lua
src/patches/lltjdefs.sty
src/patches/lltjfont.sty

index ed6da52..197546d 100644 (file)
@@ -3,7 +3,7 @@
 --
 luatexbase.provides_module({
   name = 'luatexja.jfont',
-  date = '2013/12/31',
+  date = '2014/01/02',
   description = 'Loader for Japanese fonts',
 })
 module('luatexja.jfont', package.seeall)
@@ -324,15 +324,16 @@ function set_alt_font(b,e,ind,bfnt)
    if bfnt==ind then ind = nil end -- ind == bfnt の場合はテーブルから削除
    if not alt_font_table[bfnt] then alt_font_table[bfnt]={} end
    local t = alt_font_table[bfnt]
+   local ac = getfont(ind).characters
    if e>=0 then -- character range
       for i=b, e do
-        t[i]=ind
+        if ac[i]then  t[i]=ind end
       end
    else
       b, e = -e, -b
       local tx = font_metric_table[bfnt].chars
       for i,v in pairs(tx) do
-        if b<=v and v<=e then t[i]=ind end
+        if b<=v and v<=e and ac[i] then t[i]=ind end
       end
    end
 end
@@ -345,20 +346,14 @@ function clear_alt_font(bfnt)
    end
 end
 
------- callback
-function replace_altfont(head)
-   for p in node.traverse_id(id_glyph, head) do
-      local pf = p.font
-      if p.font == (has_attr(p, attr_curjfnt) or 0) then
-         if alt_font_table[pf] and alt_font_table[pf][p.char] then
-            local n = alt_font_table[pf][p.char]
-            if n then 
-               p.font = n; set_attr(p, attr_curjfnt, n)
-            end
-         end
-      end
+------ used in ltjp.suppress_hyphenate_ja callback
+function replace_altfont(pf, pc)
+   if alt_font_table[pf] and alt_font_table[pf][pc] then
+      print('replace antfont: ', pf, '--> ', alt_font_table[pf][pc] or pf)
+      return alt_font_table[pf][pc] or pf
+   else
+      return pf
    end
-   return head
 end
 
 ------ for LaTeX interface
@@ -448,26 +443,28 @@ do
       end
    end
 
-   local function pickup_alt_font_class(class, afnt_num)
+   local function pickup_alt_font_class(class, afnt_num, afnt_chars)
       local t  = alt_font_table[alt_font_base_num] 
       local tx = font_metric_table[alt_font_base_num].chars
       for i,v in pairs(tx) do
-        if v==class then t[i]=afnt_num end
+        if v==class and afnt_chars[i] then t[i]=afnt_num end
       end
    end
 
 -- EXT
    function pickup_alt_font_b(afnt_num, afnt_base)
       local t = alt_font_table[alt_font_base_num] 
+      print(afnt_num, getfont(afnt_num))
+      local ac = getfont(afnt_num).characters
       if not t then t = {}; alt_font_table[alt_font_base_num] = t end
       for i,v in pairs(alt_font_table_latex[alt_font_base]) do
         if i == afnt_base then
            for j,_ in pairs(v) do
               if j>=0 then 
-                 t[j]=afnt_num
+                 if ac[j] then t[j]=afnt_num end
               else  -- -n (n>=1) means that the character class n,
                     -- which is defined in the JFM 
-                 pickup_alt_font_class(-j, afnt_num) 
+                 pickup_alt_font_class(-j, afnt_num, ac
               end
            end
            return
@@ -475,7 +472,6 @@ do
       end
    end
 
-
 end
 
 
index 6f72256..d4aa60d 100644 (file)
@@ -4,6 +4,7 @@
 
 luatexja.load_module('charrange'); local ltjc = luatexja.charrange
 luatexja.load_module('stack');     local ltjs = luatexja.stack
+luatexja.load_module('jfont');     local ltjf = luatexja.jfont
 
 local floor = math.floor
 local has_attr = node.has_attribute
@@ -24,6 +25,7 @@ local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
 local attr_icflag = luatexbase.attributes['ltj@icflag']
 
 local ltjc_is_ucs_in_japanese_char = ltjc.is_ucs_in_japanese_char
+local ltjf_replace_altfont = ltjf.replace_altfont
 local attr_orig_char = luatexbase.attributes['ltj@origchar']
 local STCK = luatexja.userid_table.STCK
 
@@ -39,9 +41,12 @@ local function suppress_hyphenate_ja(head)
       local pid = p.id
       if pid == id_glyph then
         if (has_attr(p, attr_icflag) or 0)<=0 and ltjc_is_ucs_in_japanese_char(p) then
-           p.font = has_attr(p, attr_curjfnt) or p.font
+           local pc = p.char
+           local pf = ltjf_replace_altfont(has_attr(p, attr_curjfnt) or p.font, pc)
+           print (p, utf.char(p.char), p.font, has_attr(p, attr_curjfnt), pf)
+           p.font = pf;  set_attr(p, attr_curjfnt, pf)
            p.subtype = floor(p.subtype*0.5)*2
-           set_attr(p, attr_orig_char, p.char)
+           set_attr(p, attr_orig_char, pc)
         end
       elseif pid == id_math then 
         p = node_next(p) -- skip math on
index 7833878..c6ccda5 100644 (file)
@@ -246,17 +246,6 @@ do
                                      'luaotfload.node_processor') + 1)
 end
 
--- hyphenate
-do
-   local replace_altfont = ltjf.replace_altfont
-   luatexbase.add_to_callback(
-      'hyphenate', 
-      function (head,tail)
-        return replace_altfont(head)
-      end,'ltj.replace_altfont',
-      luatexbase.priority_in_callback('hyphenate', 'ltj.hyphenate')+1)
-end
-
 -- define_font
 do
    local otfl_fdr = fonts.definers.read
index 03f4aaf..f9182c5 100644 (file)
@@ -31,7 +31,8 @@
 \DeclareFontShape{JY3}{gt}{bx}{n}{<-> ssub*gt/m/n}{}
 
 %fontencoding{JT3}\selectfont
-\fontencoding{JY3}\selectfont
+\fontencoding{JY3}\selectfont\adjustbaseline
+
 \DeclareTextFontCommand{\textmc}{\mcfamily}
 \DeclareTextFontCommand{\textgt}{\gtfamily}
 \DeclareOldFontCommand{\mc}{\normalfont\mcfamily}{}
index 91ad8a7..46e1ec3 100644 (file)
     \romanseries{\seriesdefault}%
     \romanshape{\shapedefault}%
     \selectfont\ignorespaces}
-\adjustbaseline
 \let\reset@font\normalfont
 \DeclareRobustCommand\mcfamily
         {\not@math@alphabet\mcfamily\mathmc