OSDN Git Service

Fix a bug in ltj-adjust.lua
[luatex-ja/luatexja.git] / src / ltj-jfont.lua
index 7e4b3f1..12d6dd9 100644 (file)
@@ -48,10 +48,21 @@ font_metric_table={} -- [font number] -> jfm_name, jfm_var, size
 
 luatexbase.create_callback("luatexja.load_jfm", "data", function (ft, jn) return ft end)
 
-local jfm_file_name, jfm_var
+local jfm_file_name, jfm_var, jfm_ksp
 local defjfm_res
 local jfm_dir, is_def_jfont, is_vert_enabled
 
+local function norm_val(a)
+   if (not a) or (a==0.) then
+      return nil
+   elseif a==true then
+      return 1
+   else
+      return a
+   end
+end
+
+
 function define_jfm(t)
    local real_char -- Does current character class have the 'real' character?
    if t.dir~=jfm_dir then
@@ -112,9 +123,12 @@ function define_jfm(t)
         end
         v.kern = v.kern or {}; v.glue = v.glue or {}
         for j,x in pairs(v.glue) do
+           if v.kern[j] then defjfm_res= nil; return end
            x.ratio, x[5] = (x.ratio or (x[5] and 0.5*(1+x[5]) or 0.5)), nil
            x.priority, x[4] = (x.priority or x[4] or 0), nil
-           if v.kern[j] then defjfm_res= nil; return end
+           x.kanjiskip_natural = norm_val(x.kanjiskip_natural)
+           x.kanjiskip_stretch = norm_val(x.kanjiskip_stretch)
+           x.kanjiskip_shrink = norm_val(x.kanjiskip_shrink)
         end
         for j,x in pairs(v.kern) do
            if type(x)=='number' then
@@ -149,7 +163,6 @@ do
         return new
       else return nil end
    end
-
    update_jfm_cache = function (j,sz)
       if metrics[j].size_cache[sz] then return end
       --local TEMP = node_new(id_kern)
@@ -167,9 +180,9 @@ do
                  true, h, 
                  ratio=w.ratio/sz, 
                  priority=FROM_JFM + w.priority/sz,
-                 ksp_natural = w.ksp_natural,
-                 ksp_stretch = w.ksp_stretch,
-                 ksp_shrink = w.ksp_shrink,
+                 kanjiskip_natural = w.kanjiskip_natural and w.kanjiskip_natural/sz,
+                 kanjiskip_stretch = w.kanjiskip_stretch and w.kanjiskip_stretch/sz,
+                 kanjiskip_shrink =  w.kanjiskip_shrink  and w.kanjiskip_shrink/sz,
               }
               setfield(h, 'width', w[1])
               setfield(h, 'stretch', w[2])
@@ -283,6 +296,7 @@ do
       local ad = identifiers[fn].parameters
       local sz = metrics[j].size_cache[f.size]
       local fmtable = { jfm = j, size = f.size, var = jfm_var,
+                       with_kanjiskip = jfm_ksp, 
                        zw = sz.zw, zh = sz.zh,
                        ascent = ad.ascender,
                        descent = ad.descender,
@@ -321,7 +335,7 @@ do
    -- extract jfm_file_name and jfm_var
    -- normalize position of 'jfm=' and 'jfmvar=' keys
    local function extract_metric(name)
-      jfm_file_name = ''; jfm_var = ''
+      jfm_file_name = ''; jfm_var = ''; jfm_ksp = true
       local tmp, index = name:sub(1, 5), 1
       if tmp == 'file:' or tmp == 'name:' or tmp == 'psft:' then
         index = 6
@@ -359,8 +373,11 @@ do
            name = name .. 'jfmvar=' .. jfm_var
         end
       end
+      for x in string.gmatch (name, "[:;]([+%%-]?)ltjks") do
+        jfm_ksp = not (x=='-')
+      end
       if jfm_dir == 'tate' then
-        is_vert_enabled = (not name:match('-vert')) and (not  name:match('-vrt2'))
+        is_vert_enabled = (not name:match('[:;]%-vert')) and (not  name:match('[:;]%-vrt2'))
          if not name:match('vert') and not name:match('vrt2') then
             name = name .. ';vert;vrt2'
          end