OSDN Git Service

Implement \ltjgetparameter{kansujichar}{<num>}, and updated tests
authorHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Sat, 18 Jan 2014 08:31:04 +0000 (17:31 +0900)
committerHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Sat, 18 Jan 2014 08:31:04 +0000 (17:31 +0900)
15 files changed:
src/ltj-base.lua
src/ltj-charrange.lua
src/ltj-compat.lua
src/ltj-stack.lua
src/luatexja-compat.sty
src/luatexja-core.sty
src/luatexja.lua
test/test02-latex.pdf
test/test02-latex.tex
test/test03-after.pdf
test/test03-after.tex
test/test04-jfm.pdf
test/test04-jfm.tex
test/test06-offset.pdf
test/test06-offset.tex

index 5b0b7c0..495f185 100644 (file)
@@ -8,9 +8,13 @@ local node, table, tex, token = node, table, tex, token
 local cat_lp = luatexbase.catcodetables['latex-package']
 
 -------------------- 
+luatexja.base = {}
 
 local public_name = 'luatexja'
 local public_version = 'alpha'
+luatexja.base.public_name = public_name
+luatexja.base.public_version = public_version
+
 
 -------------------- Fully-expandable error messaging
 local _error_set_break, _error_set_message, _error_show
@@ -146,10 +150,9 @@ local function mprint(...)
    end
    return tex.print(unpack(lines))
 end
+luatexja.base.mprint = mprint
 
 -------------------- Handling of TeX values
-local to_dimen, to_skip, dump_skip 
-
 do
 
   local glue_spec_id = node.id("glue_spec")
@@ -167,7 +170,7 @@ do
   end
 
 --! ixbase.to_dimen() と同じ
-  to_dimen = function (val)
+  local function to_dimen(val)
     if val == nil then
       return 0
     elseif type(val) == "number" then
@@ -189,7 +192,7 @@ do
   end
 
 --! ixbase.to_skip() と同じ
-  to_skip = function (val)
+  local function to_skip(val)
     if type(val) == "userdata" then
       return val
     end
@@ -217,16 +220,19 @@ do
     return res
   end
 
-  dump_skip = function (s)
+  local function dump_skip(s)
     print(("%s+%s<%s>-%s<%s>"):format(
       s.width or 0, s.stretch or 0, s.stretch_order or 0,
       s.shrink or 0, s.shrink_order or 0))
   end
 
+  luatexja.base.to_dimen = to_dimen
+  luatexja.base.dump_skip = dump_skip
+  luatexja.base.to_skip = to_skip
 end
--------------------- Virtual table for LaTeX counters
-local counter
 
+-------------------- Virtual table for LaTeX counters
+-- not used in current LuaTeX-ja
 do
 --! ixbase.counter と同じ
   counter = {}
@@ -239,13 +245,12 @@ do
   function mt_counter.__newindex(tbl, key, val)
     tex.count['c@'..key] = val
   end
+  luatexja.base.counter = counter
 
 --! ixbase.length は tex.skip と全く同じなので不要.
 end
 
 -------------------- Number handling in TeX source
-local scan_brace, scan_number 
-
 do
 
   local tok_escape = token.create("ltj@@q@escape")
@@ -338,7 +343,7 @@ do
     ltb.add_to_callback("token_filter", proc, "ltj@grab@num", 1)
   end
 
-  scan_brace = function ()
+  local function scan_brace()
     scan_with(1, function()
       local next = token.get_next()
       if next[1] == 1 then
@@ -351,7 +356,7 @@ do
     end)
   end
 
-  scan_number = function ()
+  local function scan_number()
     scan_with(1, function()
       local next = get_expd_next()
       local res, ok = { tok_num }, false
@@ -386,9 +391,12 @@ do
     end)
   end
 
+  luatexja.base.scan_brace = scan_brace
+  luatexja.base.scan_number = scan_number
 end
+
 -------------------- TeX register allocation
-local const_number, count_number, attribute_number, dimen_number, skip_number
+-- not used in current LuaTeX-ja
 
 do
   local cmod_base_count = token.create('ltj@@count@zero')[2]
@@ -396,34 +404,39 @@ do
   local cmod_base_dimen = token.create('ltj@@dimen@zero')[2]
   local cmod_base_skip = token.create('ltj@@skip@zero')[2]
 
-  const_number = function (name)
+  local function const_number(name)
     if name:sub(1, 1) == '\\' then name = name:sub(2) end
     return token.create(name)[2]
   end
 
-  count_number = function (name)
+  local function count_number(name)
     if name:sub(1, 1) == '\\' then name = name:sub(2) end
     return token.create(name)[2] - cmod_base_count
   end
 
-  attribute_number = function (name)
+  local function attribute_number(name)
     if name:sub(1, 1) == '\\' then name = name:sub(2) end
     return token.create(name)[2] - cmod_base_attr
   end
 
-  dimen_number = function (name)
+  local function dimen_number(name)
     if name:sub(1, 1) == '\\' then name = name:sub(2) end
     return token.create(name)[2] - cmod_base_dimen
   end
 
-  skip_number = function (name)
+  local function skip_number(name)
     if name:sub(1, 1) == '\\' then name = name:sub(2) end
     return token.create(name)[2] - cmod_base_skip
   end
 
+  luatexja.base.const_number = const_number
+  luatexja.base.count_number = count_number
+  luatexja.base.attribute_number = attribute_number
+  luatexja.base.dimen_number = dimen_number
+  luatexja.base.skip_number = skip_number
 end
--------------------- mock of debug logger
 
+-------------------- mock of debug logger
 if not debug or debug == _G.debug then
   local function no_op() end
   debug = no_op
@@ -441,7 +454,25 @@ local function get_cs(s)
    cstemp = token.csname_name(token.get_next())
    tex.sprint(cat_lp,'\\' .. s)
 end
+luatexja.base.get_cs = get_cs
 
+-------------------- common error message
+do
+   local function in_unicode(c, admit_math)
+      local low = admit_math and -1 or 0
+      if type(c)~='number' or c<low or c>0x10FFFF then
+        local s = 'A character number must be between ' .. tostring(low) 
+           .. ' and 0x10ffff.\n'
+           .. (admit_math and "(-1 is used for denoting `math boundary')\n" or '')
+           .. 'So I changed this one to zero.'
+        package_error('luatexja',
+                           'bad character code (' .. tostring(c) .. ')', s)
+        c=0
+      end
+      return c
+   end
+   luatexja.base.in_unicode = in_unicode
+end
 
 -------------------- cache management
 -- load_cache (filename, outdate)
@@ -457,8 +488,6 @@ end
 require('lualibs-lpeg') -- string.split
 require('lualibs-os')   -- os.type
 
-local load_cache, save_cache_luc, save_cache
-
 do
    local kpse_var_value = kpse.var_value
    local path, pathtmp = kpse_var_value("TEXMFVAR")
@@ -528,6 +557,7 @@ do
         return result 
       end
    end
+   
    load_cache = function (filename, outdate)
       local r = load_cache_a(filename ..  luc_suffix, outdate)
       if r then 
@@ -539,62 +569,36 @@ do
       end
    end
 
+   luatexja.base.load_cache = load_cache
+   luatexja.base.save_cache_luc = save_cache_luc
+   luatexja.base.save_cache = save_cache
 end
 
+luatexja.base._error_set_break = _error_set_break
+luatexja.base._error_set_message = _error_set_message
+luatexja.base._error_show = _error_show
+luatexja.base._generic_warn_info = _generic_warn_info
+
+luatexja.base.package_error = package_error
+luatexja.base.package_warning = package_warning
+luatexja.base.package_warning_no_line = package_warning_no_line
+luatexja.base.package_info = package_info
+luatexja.base.package_info_no_line = package_info_no_line
+
+luatexja.base.generic_error = generic_error
+luatexja.base.generic_warning = generic_warning
+luatexja.base.generic_warning_no_line = generic_warning_no_line
+luatexja.base.generic_info = generic_info
+luatexja.base.generic_info_no_line = generic_info_no_line
+
+luatexja.base.ltj_warning_no_line = ltj_warning_no_line
+luatexja.base.ltj_error = ltj_error
+
+luatexja.base.debug = debug
+luatexja.base.package_debug = package_debug
+luatexja.base.debug_logger = debug_logger
+luatexja.base.show_term = show_term
+luatexja.base.show_log = show_log
 
-luatexja.base = {
-   public_name = public_name, 
-   public_version = public_version, 
-   --
-   _error_set_break = _error_set_break, 
-   _error_set_message = _error_set_message, 
-   _error_show = _error_show, 
-   _generic_warn_info = _generic_warn_info, 
-   --
-   package_error = package_error, 
-   package_warning = package_warning, 
-   package_warning_no_line = package_warning_no_line, 
-   package_info = package_info, 
-   package_info_no_line = package_info_no_line, 
-   --
-   generic_error = generic_error, 
-   generic_warning = generic_warning, 
-   generic_warning_no_line = generic_warning_no_line, 
-   generic_info = generic_info, 
-   generic_info_no_line = generic_info_no_line, 
-   --
-   ltj_warning_no_line = ltj_warning_no_line, 
-   ltj_error = ltj_error, 
-   --
-   mprint = mprint, 
-   --
-   to_dimen = to_dimen, 
-   dump_skip = dump_skip, 
-   to_skip = to_skip, 
-   --
-   counter = counter, 
-   --
-   scan_brace = scan_brace, 
-   scan_number = scan_number, 
-   --
-   const_number = const_number, 
-   count_number = count_number, 
-   attribute_number = attribute_number, 
-   dimen_number = dimen_number, 
-   skip_number = skip_number, 
-   --
-   get_cs = get_cs, 
-   --
-   load_cache = load_cache, 
-   save_cache_luc = save_cache_luc, 
-   save_cache = save_cache, 
-   --
-   debug = debug, 
-   package_debug = package_debug, 
-   debug_logger = debug_logger, 
-   show_term = show_term, 
-   show_log = show_log, 
-   --
-}
 -------------------- all done
 -- EOF
index bc6fc4a..f913787 100644 (file)
@@ -58,13 +58,8 @@ function add_char_range(b,e,ind) -- ind: external range number
 end
 
 function char_to_range(c) -- return the external range number
-   if not c or c<0 or c>0x10FFFF then
-        ltjb.package_error('luatexja',
-                           'bad character code (' .. tostring(c) .. ')',
-                           'A character number must be between 0 and 0x10ffff.\n' ..
-                            'So I changed this one to zero.')
-        return -1
-   elseif c<0x80 then return -1
+   c=ltjb.in_unicode(c, false)
+   if c<0x80 then return -1
    else 
       local r = jcr_table_main[c] or 217
       return (r and r~=0) and r or 217 
index 6fe8e4f..98452de 100644 (file)
@@ -4,6 +4,7 @@
 
 luatexja.load_module('base');   local ltjb = luatexja.base
 luatexja.load_module('stack');  local ltjs = luatexja.stack
+local stack_table_index = luatexja.stack_table_index
 
 -- load jisx0208 table
 local cache_ver = 2
@@ -115,6 +116,18 @@ local function from_sjis(i)
   end
 end
 
+luatexja.binary_pars.kansujichar = function(c, t)
+   if type(c)~='number' or c<0 or c>9 then
+      ltjb.package_error('luatexja',
+                        'Invalid KANSUJI number (' .. tostring(c) .. ')',
+                        'A KANSUJI number should be in the range 0..9.\n'..
+                           'So I changed this one to zero.')
+      c=0
+   end
+   return ltjs.get_penalty_table(stack_table_index.KSJ + c, 0, t)
+end
+
+
 local t = {
    from_euc   = from_euc,
    from_kuten = from_kuten,
index 9602939..ed8ae07 100644 (file)
@@ -71,14 +71,8 @@ function set_stack_table(g,m,c,p,lb,ub)
                         tostring(ub) .. ".\n" ..
                      "I'm going to use 0 instead of that illegal code value.")
       p=0
-   elseif type(c)~='number' or c<-1 or c>0x10ffff then
-      ltjb.package_error('luatexja',
-                        'bad character code (' .. tostring(c) .. ')',
-                        'A character number must be between -1 and 0x10ffff.\n' ..
-                        "(-1 is used for denoting `math boundary')\n" ..
-                        'So I changed this one to zero.')
-      c=0
    end
+   c = ltjb.in_unicode(c, true)
    charprop_stack_table[i][c+m] = p
   if g=='global' then
      for j,v in pairs(charprop_stack_table) do 
index 8d1d2d6..6b2185e 100644 (file)
 \ltjsetparameter{kansujichar={7,`七}}
 \ltjsetparameter{kansujichar={8,`八}}
 \ltjsetparameter{kansujichar={9,`九}}
+\ltj@@decl@array@param{kansujichar}
 
 \ifltj@in@latex
   \newcommand\printglossary{\@input@{\jobname.gls}}
index 706eabb..7fe22e4 100644 (file)
 }
 
 \protected\def\ltj@setpar@global{%
-  \ifnum\globaldefs>0\directlua{luatexja.isglobal='global'}\else\directlua{luatexja.isglobal=''}\fi
+  \ifnum\globaldefs>0\directlua{luatexja.isglobal='global'}%
+    \else\directlua{luatexja.isglobal=''}\fi
 }
 \protected\def\ltjsetparameter#1{%
   \ltj@setpar@global\setkeys[ltj]{japaram}{#1}\ignorespaces}
 \protected\def\ltjglobalsetparameter#1{%
-  \ifnum\globaldefs<0\directlua{luatexja.isglobal=''}\else\directlua{luatexja.isglobal='global'}\fi
+  \ifnum\globaldefs<0\directlua{luatexja.isglobal=''}%
+    \else\directlua{luatexja.isglobal='global'}\fi%
   \setkeys[ltj]{japaram}{#1}\ignorespaces}
 
 %%%%%%%% \ltjgetparameter
index ec27e8e..4677125 100644 (file)
@@ -171,7 +171,6 @@ do
 
    local unary_pars = luatexja.unary_pars
    function luatexja.ext_get_parameter_unary(k)
-      local t = tex.getcount('ltj@@stack')
       if unary_pars[k] then
         tex.write(tostring(unary_pars[k](tex.getcount('ltj@@stack'))))
       end
@@ -180,45 +179,48 @@ end
 
 
 -- EXT: print parameters that need arguments
-function luatexja.ext_get_parameter_binary(k,c)
-   local t = tex.getcount('ltj@@stack')
-   if type(c)~='number' then
-      ltjb.package_error('luatexja',
-                        'invalid the second argument (' .. tostring(c) .. ')',
-                        'I changed this one to zero.')
-      c=0
-   end
-   if k == 'jacharrange' then
-      if c<=0 or c>31*ltjc.ATTR_RANGE then 
-        ltjb.package_error('luatexja',
-                           'invalid character range number (' .. c .. ')',
-                           'A character range number should be in the range 1..'
-                               .. 31*ltjc.ATTR_RANGE .. ",\n"..
-                            'So I changed this one to ' .. 31*ltjc.ATTR_RANGE .. ".")
-        c=0 -- external range 217 == internal range 0
-      elseif c==31*ltjc.ATTR_RANGE then c=0
-      end
+do
+   luatexja.binary_pars = {
+      jacharrange = function(c, t)
+        if type(c)~='number' or c<0 or c>31*ltjc.ATTR_RANGE then
+           -- 0 はエラーにしない(隠し)
+           ltjb.package_error('luatexja',
+                              'invalid character range number (' .. tostring(c) .. ')',
+                              'A character range number should be in the range 1..'
+                                 .. 31*ltjc.ATTR_RANGE .. ",\n"..
+                                 'So I changed this one to ' .. 31*ltjc.ATTR_RANGE .. ".")
+           c=0 -- external range 217 == internal range 0
+        elseif c==31*ltjc.ATTR_RANGE then c=0
+        end
       -- 負の値は <U+0080 の文字の文字範囲,として出てくる.この時はいつも欧文文字なので 1 を返す
-      tex.write( (c<0) and 1 or ltjc.get_range_setting(c))
-   else
-      if c<0 or c>0x10FFFF then
-        ltjb.package_error('luatexja',
-                           'bad character code (' .. c .. ')',
-                           'A character number must be between -1 and 0x10ffff.\n'..
-                              "(-1 is used for denoting `math boundary')\n"..
-                              'So I changed this one to zero.')
-        c=0
-      end
-      if k == 'prebreakpenalty' then
-        tex.write(ltjs.get_penalty_table(stack_table_index.PRE + c, 0, t))
-      elseif k == 'postbreakpenalty' then
-        tex.write(ltjs.get_penalty_table(stack_table_index.POST+ c, 0, t))
-      elseif k == 'kcatcode' then
-        tex.write(ltjs.get_penalty_table(stack_table_index.KCAT+ c, 0, t))
-      elseif k == 'chartorange' then 
-        tex.write(ltjc.char_to_range(c))
-      elseif k == 'jaxspmode' or k == 'alxspmode' then
-        tex.write(ltjs.get_penalty_table(stack_table_index.XSP + c, 3, t))
+        return (c<0) and 1 or ltjc.get_range_setting(c)
+      end,
+      prebreakpenalty = function(c, t)
+        return ltjs.get_penalty_table(stack_table_index.PRE 
+                                         + ltjb.in_unicode(c, true), 0, t)
+      end,
+      postbreakpenalty = function(c, t)
+        return ltjs.get_penalty_table(stack_table_index.POST 
+                                         + ltjb.in_unicode(c, true), 0, t)
+      end,
+      kcatcode = function(c, t)
+        return ltjs.get_penalty_table(stack_table_index.KCAT 
+                                         + ltjb.in_unicode(c, false), 0, t)
+      end,
+      chartorange = function(c, t)
+        return ltjc.char_to_range(ltjb.in_unicode(c, false))
+      end,
+      jaxspmode = function(c, t)
+        return ltjs.get_penalty_table(stack_table_index.XSP
+                                         + ltjb.in_unicode(c, true), 3, t)
+      end,
+   }
+   local binary_pars = luatexja.binary_pars 
+
+   binary_pars.alxspmode = binary_pars.jaxspmode
+   function luatexja.ext_get_parameter_binary(k,c)
+      if binary_pars[k] then
+        tex.write(tostring(binary_pars[k](c,tex.getcount('ltj@@stack'))))
       end
    end
 end
index d210e89..b9988b9 100644 (file)
Binary files a/test/test02-latex.pdf and b/test/test02-latex.pdf differ
index 763e8b8..ccb446f 100644 (file)
@@ -50,7 +50,7 @@
 \DeclareFontShape{JY3}{mc}{x}{n}{<-> s*[0.962216] 
   psft:Ryumin-Light:extend=1.5;jfm=ujisx50}{}
 \DeclareFontShape{JY3}{gt}{m}{sl}{<-> s*[0.962216] 
-  file:ipag.ttf:slant=0.25;jfm=ujiso25}{}
+  file:ipam.ttf:slant=0.25;jfm=ujiso25}{}
 \DeclareFontShape{JY3}{gt}{x}{n}{<-> s*[0.962216] 
   file:ipag.ttf:extend=1.5;jfm=ujisx50}{}
 
index 5427f74..93adf3d 100644 (file)
Binary files a/test/test03-after.pdf and b/test/test03-after.pdf differ
index 2c4eb77..9906eb8 100644 (file)
@@ -78,6 +78,17 @@ xspmode
 \ltjsetparameter{yalbaselineshift=3pt}
 \dimen255=\yabls\relax\the\dimen255
 
+\char\ltjgetparameter{kansujichar}{0}
+\char\ltjgetparameter{kansujichar}{1}
+\char\ltjgetparameter{kansujichar}{2}
+\char\ltjgetparameter{kansujichar}{3}
+\char\ltjgetparameter{kansujichar}{4}
+\char\ltjgetparameter{kansujichar}{5}
+\char\ltjgetparameter{kansujichar}{6}
+\char\ltjgetparameter{kansujichar}{7}
+\char\ltjgetparameter{kansujichar}{8}
+\char\ltjgetparameter{kansujichar}{9}
+
 \medskip
 {\tengt ■compat: kansuji}
 \kansuji{1}\ 
@@ -107,10 +118,13 @@ xspmode
 {\tengt ■globaldefs}
 
 abc\ltjgetparameter{yalbaselineshift}
-{\globaldefs1\ltjsetparameter{yalbaselineshift=2pt}}% global (by \globaldefs)
+{\globaldefs1 \ltjsetparameter{yalbaselineshift=2pt}}% global (by \globaldefs)
 \ltjgetparameter{yalbaselineshift}
 {\ltjglobalsetparameter{yalbaselineshift=1pt}}% global (explicit)
 \ltjgetparameter{yalbaselineshift}
-{\ltjglobalsetparameter{yalbaselineshift=4pt}}% local
+{\ltjsetparameter{yalbaselineshift=4pt}}% local
+\ltjgetparameter{yalbaselineshift}
+{\globaldefs-4 \ltjglobalsetparameter{yalbaselineshift=-5pt}}% local (by \globaldefs)
 \ltjgetparameter{yalbaselineshift}
+a
 \end
index fb07521..d809df6 100644 (file)
Binary files a/test/test04-jfm.pdf and b/test/test04-jfm.pdf differ
index 6886bfa..4355a66 100644 (file)
 \ltjgetparameter{jacharrange}{2}
 
 \head{文字コード→文字範囲}
+\ltjgetparameter{chartorange}{`A} % must be 6
 \ltjgetparameter{chartorange}{`い} % must be 6
 \ltjgetparameter{chartorange}{`§} % must be 8
 \ltjgetparameter{chartorange}{"F7} % must be 9
 \ltjgetparameter{chartorange}{-1}  % must be error "
+\ltjgetparameter{chartorange}{"CFFFF}  % must be 217"
 
 \medskip
 \ltjsetparameter{jacharrange={-217}}
-ほとんど欧文扱い.2番は別(「あ」)
+あ\char"CFFFFあ
+\ltjgetparameter{jacharrange}{\ltjgetparameter{chartorange}{"CFFFF}}←CFFFF欧文扱い
 \ltjsetparameter{jacharrange={218}}
-和文扱いにもどる
+あ\char"CFFFFあ
+\ltjgetparameter{jacharrange}{\ltjgetparameter{chartorange}{"CFFFF}}←CFFFF和文扱い
 
 \head{Ticket \#25121}
 \setbox0=\hbox{\ltjsetparameter{kanjiskip=-5pt}
index 3f82a39..ce6835f 100644 (file)
Binary files a/test/test06-offset.pdf and b/test/test06-offset.pdf differ
index e386c15..26d66bf 100644 (file)
   $Aあ\kern2pt\vrule width 0.4pt height 10pt depth 10pt
     \kern-2pt\vrule width 4pt height 0.4pt depth 0pt
     \hbox{\vrule width 20pt height 0.4pt depth 0pt\kern-20pt Bい}$
-  \vrule width 20pt height 0.4pt depth 0pt\par
+  \vrule width 20pt height 0.4pt depth 0pt
 }
 \baselineskip=40pt
 
-\R{ 0pt}{ 0pt}\D
-\R{ 0pt}{10pt}\D
-\R{10pt}{ 0pt}\D
-\R{10pt}{ 5pt}\D
+\R{ 0pt}{ 0pt}\D\par
+\R{ 0pt}{10pt}\D\par
+\R{10pt}{ 0pt}\D\par
+\R{ 0pt}{10pt}\D\hfil\break
+\setbox0=\hbox{\D}\vrule width 20pt height 0.4pt depth 0pt
+\ltjsetparameter{yalbaselineshift=-10pt}
+abc\unhcopy0\vrule width 20pt height 0.4pt depth 0pt\par
+
+
 
 \end