OSDN Git Service

優先度付き調整処理のテスト (test17-priority.tex)
[luatex-ja/luatexja.git] / src / luatexja.lua
index e8812f9..1aa5c89 100644 (file)
@@ -8,14 +8,29 @@ require('lualibs')
 --    ext_... : called from \directlua{}
 --    int_... : called from other Lua codes, but not from \directlua{}
 --    (other)     : only called from this file
-
+function luatexja.error(s,t)
+   tex.error('LuaTeX-ja error: ' .. s ,t) 
+end
+function luatexja.load_module(name)
+   if not package.loaded['luatexja.' .. name] then
+      local fn = 'ltj-' .. name .. '.lua'
+      local found = kpse.find_file(fn, 'tex')
+      if not found then
+        luatexja.error("File `" .. fn .. "' not found", 
+                       {'This file ' .. fn .. ' is required for LuaTeX-ja.', 'Please check your installation.'})
+      else 
+        texio.write('(' .. found .. ')\n')
+        dofile(found)
+      end
+   end
+end
 function luatexja.load_lua(fn)
    local found = kpse.find_file(fn, 'tex')
    if not found then
       error("File `" .. fn .. "' not found")
    else 
-      texio.write('(' .. found .. ')')
-      require(found)
+      texio.write('(' .. found .. ')\n')
+      dofile(found)
    end
 end
 
@@ -71,6 +86,7 @@ local XKANJI_SKIP = 7
 local PROCESSED = 8
 local IC_PROCESSED = 9
 local BOXBDD = 15
+local PROCESSED_BEGIN_FLAG = 16
 
 
 -- Three aux. functions, bollowed from tex.web
@@ -105,7 +121,7 @@ local function print_glue(d,order)
    return out
 end
 
-local function print_spec(p)
+function print_spec(p)
    local out=print_scaled(p.width)..'pt'
    if p.stretch~=0 then
       out=out..' plus '..print_glue(p.stretch,p.stretch_order)
@@ -116,8 +132,6 @@ local function print_spec(p)
 return out
 end
 
-function math.two_add(a,b) return a+b end
-function math.two_average(a,b) return (a+b)/2 end
 
 ---- table: charprop_stack_table [stack_level].{pre|post|xsp}[chr_code]
 
@@ -159,15 +173,22 @@ end
 
 -- EXT: print parameters that need arguments
 function luatexja.ext_get_parameter_binary(k,c)
+   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>216 then 
+      if c>216 then 
         ltjb.package_error('luatexja',
                            'invalid character range number (' .. c .. ')',
                            'A character range number should be in the range 0..216,\n'..
                             'So I changed this one to zero.')
         c=0
       end
-      tex.write(ltjc.get_range_setting(c))
+      -- 負の値は <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',
@@ -193,7 +214,7 @@ end
 
 -- EXT: print \global if necessary
 function luatexja.ext_print_global()
-  if isglobal=='global' then tex.sprint(cat_lp, '\\global') end
+   if luatexja.isglobal=='global' then tex.sprint(cat_lp, '\\global') end
 end
 
 -- main process
@@ -201,7 +222,7 @@ end
 local function main_process(head, mode, dir)
    local p = head
    p = ltjj.main(p,mode)
-   p = ltjw.set_ja_width(p, dir)
+   if p then p = ltjw.set_ja_width(p, dir) end
    return p
 end
 
@@ -221,17 +242,20 @@ luatexbase.add_to_callback('hpack_filter',
                                   'luaotfload.hpack_filter') + 1)
 
 -- debug
+local function get_attr_icflag(p)
+   return (has_attr(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG
+end
+
 local debug_depth
 
 local function debug_show_node_X(p,print_fn)
    local k = debug_depth
    local s
    local pt=node_type(p.id)
-   local base = debug_depth .. string.format('%X', has_attr(p,attr_icflag) or 0)
-   .. ' ' .. string.format('%X', has_attr(p, attr_uniqid) or 0)
-   .. ' ' .. node.type(p.id) .. ' ' ..  tostring(p.subtype )
+   local base = debug_depth .. string.format('%X', get_attr_icflag(p))
+   .. ' ' .. pt .. ' ' .. tostring(p.subtype) .. ' '
    if pt == 'glyph' then
-      s = base .. ' ' .. utf.char(p.char) .. ' ' .. tostring(p.font)
+      s = base .. ' ' .. utf.char(p.char) .. ' '  .. tostring(p.font)
          .. ' (' .. print_scaled(p.height) .. '+' 
          .. print_scaled(p.depth) .. ')x' .. print_scaled(p.width)
       print_fn(s)
@@ -239,36 +263,36 @@ local function debug_show_node_X(p,print_fn)
       s = base .. '(' .. print_scaled(p.height) .. '+' 
          .. print_scaled(p.depth) .. ')x' .. print_scaled(p.width) .. p.dir
       if p.shift~=0 then
-        s = s .. ', shifted ' .. print_scaled(p.shift)
+         s = s .. ', shifted ' .. print_scaled(p.shift)
       end
       if p.glue_sign >= 1 then 
-        s = s .. ' glue set '
-        if p.glue_sign == 2 then s = s .. '-' end
-        s = s .. tostring(floor(p.glue_set*10000)/10000)
-        if p.glue_order == 0 then 
-           s = s .. 'pt' 
-        else 
-           s = s .. 'fi'
-           for i = 2,  p.glue_order do s = s .. 'l' end
-        end
+         s = s .. ' glue set '
+         if p.glue_sign == 2 then s = s .. '-' end
+         s = s .. tostring(floor(p.glue_set*10000)/10000)
+         if p.glue_order == 0 then 
+            s = s .. 'pt' 
+         else 
+            s = s .. 'fi'
+            for i = 2,  p.glue_order do s = s .. 'l' end
+         end
       end
-      if has_attr(p, attr_icflag, PACKED) then
-        s = s .. ' (packed)'
+      if get_attr_icflag(p) == PACKED then
+         s = s .. ' (packed)'
       end
       print_fn(s)
       local q = p.head
       debug_depth=debug_depth.. '.'
       while q do 
-        debug_show_node_X(q, print_fn); q = node_next(q)
+         debug_show_node_X(q, print_fn); q = node_next(q)
       end
       debug_depth=k
    elseif pt == 'glue' then
       s = base .. ' ' ..  print_spec(p.spec)
-      if has_attr(p, attr_icflag)==FROM_JFM then
-           s = s .. ' (from JFM)'
-      elseif has_attr(p, attr_icflag)==KANJI_SKIP then
+      if get_attr_icflag(p)==FROM_JFM then
+         s = s .. ' (from JFM)'
+      elseif get_attr_icflag(p)==KANJI_SKIP then
         s = s .. ' (kanjiskip)'
-      elseif has_attr(p, attr_icflag)==XKANJI_SKIP then
+      elseif get_attr_icflag(p)==XKANJI_SKIP then
         s = s .. ' (xkanjiskip)'
       end
       print_fn(s)
@@ -276,19 +300,19 @@ local function debug_show_node_X(p,print_fn)
       s = base .. ' ' .. print_scaled(p.kern) .. 'pt'
       if p.subtype==2 then
         s = s .. ' (for accent)'
-      elseif has_attr(p, attr_icflag)==IC_PROCESSED then
+      elseif get_attr_icflag(p)==IC_PROCESSED then
         s = s .. ' (italic correction)'
-      -- elseif has_attr(p, attr_icflag)==ITALIC then
-      --    s = s .. ' (italic correction)'
-      elseif has_attr(p, attr_icflag)==FROM_JFM then
+         -- elseif get_attr_icflag(p)==ITALIC then
+         --    s = s .. ' (italic correction)'
+      elseif get_attr_icflag(p)==FROM_JFM then
         s = s .. ' (from JFM)'
-      elseif has_attr(p, attr_icflag)==LINE_END then
+      elseif get_attr_icflag(p)==LINE_END then
         s = s .. " (from 'lineend' in JFM)"
       end
       print_fn(s)
    elseif pt == 'penalty' then
       s = base .. ' ' .. tostring(p.penalty)
-      if has_attr(p, attr_icflag)==KINSOKU then
+      if get_attr_icflag(p)==KINSOKU then
         s = s .. ' (for kinsoku)'
       end
       print_fn(s)
@@ -297,24 +321,31 @@ local function debug_show_node_X(p,print_fn)
       if p.subtype==sid_user then
          if p.type ~= 110 then 
             s = s .. ' user_id: ' .. p.user_id .. ' ' .. p.value
+            print_fn(s)
          else
             s = s .. ' user_id: ' .. p.user_id .. ' (node list)'
+            print_fn(s)
+            local q = p.value
+            debug_depth=debug_depth.. '.'
+            while q do 
+               debug_show_node_X(q, print_fn); q = node_next(q)
+            end
+            debug_depth=k
          end
       else
-        s = s .. node.subtype(p.subtype)
+         s = s .. node.subtype(p.subtype); print_fn(s)
       end
-      print_fn(s)
    -------- math node --------
    elseif pt=='noad' then
       s = base ; print_fn(s)
       if p.nucleus then
-        debug_depth = k .. 'N'; debug_show_node_X(p.nucleus, print_fn); 
+         debug_depth = k .. 'N'; debug_show_node_X(p.nucleus, print_fn); 
       end
       if p.sup then
-        debug_depth = k .. '^'; debug_show_node_X(p.sup, print_fn); 
+         debug_depth = k .. '^'; debug_show_node_X(p.sup, print_fn); 
       end
       if p.sub then
-        debug_depth = k .. '_'; debug_show_node_X(p.sub, print_fn); 
+         debug_depth = k .. '_'; debug_show_node_X(p.sub, print_fn); 
       end
       debug_depth = k;
    elseif pt=='math_char' then
@@ -323,7 +354,7 @@ local function debug_show_node_X(p,print_fn)
    elseif pt=='sub_box' then
       print_fn(base)
       if p.head then
-        debug_depth = k .. '.'; debug_show_node_X(p.head, print_fn); 
+         debug_depth = k .. '.'; debug_show_node_X(p.head, print_fn); 
       end
    else
       print_fn(base)
@@ -334,7 +365,7 @@ function luatexja.ext_show_node_list(head,depth,print_fn)
    debug_depth = depth
    if head then
       while head do
-        debug_show_node_X(head, print_fn); head = node_next(head)
+         debug_show_node_X(head, print_fn); head = node_next(head)
       end
    else
       print_fn(debug_depth .. ' (null list)')