X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=src%2Fluatexja-core.lua;h=673f581d8f2e198e1df6386b16ae644df2c41d6c;hb=2a89ff80358ba323dd8d07585322e346d320cbbf;hp=dff6d9902c824193b26340cc400da9f2fadbf8f5;hpb=9d2a9d28639dd9acc156abccbaab29772a923d27;p=luatex-ja%2Fluatexja.git diff --git a/src/luatexja-core.lua b/src/luatexja-core.lua index dff6d99..673f581 100644 --- a/src/luatexja-core.lua +++ b/src/luatexja-core.lua @@ -1,8 +1,14 @@ -local ltjb = luatexja.base -local ltjc = luatexja.charrange -local ltjs = luatexja.stack -local ltjj = luatexja.jfmglue -local ltjf = luatexja.jfont +require('lualibs') +require('luatexja.rmlgbm'); local ltjr = luatexja.rmlgbm -- must be 1st +require('luatexja.base'); local ltjb = luatexja.base +require('luatexja.charrange'); local ltjc = luatexja.charrange +require('luatexja.jfont'); local ltjf = luatexja.jfont +require('luatexja.inputbuf'); local ltji = luatexja.inputbuf +require('luatexja.jfmglue'); local ltjj = luatexja.jfmglue +require('luatexja.math'); local ltjm = luatexja.math +require('luatexja.pretreat'); local ltjp = luatexja.pretreat +require('luatexja.stack'); local ltjs = luatexja.stack +require('luatexja.setwidth'); local ltjw = luatexja.setwidth local node_type = node.type local node_new = node.new @@ -12,7 +18,6 @@ local has_attr = node.has_attribute local node_insert_before = node.insert_before local node_insert_after = node.insert_after local node_hpack = node.hpack -local round = tex.round local id_penalty = node.id('penalty') local id_glyph = node.id('glyph') @@ -30,6 +35,7 @@ local attr_jchar_class = luatexbase.attributes['ltj@charclass'] local attr_curjfnt = luatexbase.attributes['ltj@curjfnt'] local attr_yablshift = luatexbase.attributes['ltj@yablshift'] local attr_icflag = luatexbase.attributes['ltj@icflag'] +local cat_lp = luatexbase.catcodetables['latex-package'] local ITALIC = 1 local PACKED = 2 @@ -55,7 +61,7 @@ end -- Three aux. functions, bollowed from tex.web local unity=65536 -local function print_scaled(s) +function print_scaled(s) local out='' local delta=10 if s<0 then @@ -96,12 +102,6 @@ local function print_spec(p) return out end --- return true if and only if p is a Japanese character node -local function is_japanese_glyph_node(p) - return p and (p.id==id_glyph) - and (p.font==has_attr(p,attr_curjfnt)) -end - function math.two_add(a,b) return a+b end function math.two_average(a,b) return (a+b)/2 end @@ -178,94 +178,7 @@ end -- EXT: print \global if necessary function ltj.ext_print_global() - if ltj.isglobal=='global' then tex.sprint('\\global') end -end - - ------------------------------------------------------------------------- --- MAIN PROCESS STEP 4: width of japanese chars (prefix: main4) ------------------------------------------------------------------------- - --- TeX's \hss -local function main4_get_hss() - local hss = node_new(id_glue) - local fil_spec = node_new(id_glue_spec) - fil_spec.width = 0 - fil_spec.stretch = 65536 - fil_spec.stretch_order = 2 - fil_spec.shrink = 65536 - fil_spec.shrink_order = 2 - hss.spec = fil_spec - return hss -end - -local function main4_set_ja_width(head, dir) - local p = head - local met_tb, t, s, g, q, a, h - local m = false -- is in math mode? - while p do - local v=has_attr(p,attr_yablshift) or 0 - if p.id==id_glyph then - p.yoffset = p.yoffset-v - if is_japanese_glyph_node(p) then - met_tb = ltjf.font_metric_table[p.font] - t = ltjf.metrics[met_tb.jfm] - s = t.char_type[has_attr(p,attr_jchar_class)] - if s.width ~= 'prop' and - not(s.left==0.0 and s.down==0.0 and s.align=='left' - and round(s.width*met_tb.size)==p.width) then - -- must be encapsuled by a \hbox - head, q = node.remove(head, p) - local full_width = round(s.width*met_tb.size) - p.yoffset=p.yoffset-round(met_tb.size*s.down) - p.xoffset=p.xoffset-round(met_tb.size*s.left) - - -- The next if block sets h:=(head of a new list) - if s.align=='left' then - h = node_new(id_kern); h.subtype = 0 - h.kern = full_width - p.width - p.next = h; h = p - elseif s.align=='right' then - h = node_new(id_kern); h.subtype = 0 - h.kern = full_width - p.width - p.next = nil; h.next = p - elseif s.align=='middle' then - local total = full_width - p.width - h = node_new(id_kern); h.subtype = 0 - h.kern = round(total/2); p.next = h - h = node_new(id_kern); h.subtype = 0 - h.kern = total - round(total/2); h.next = p - end - g = node_new(id_hlist); g.width = full_width - g.height = round(met_tb.size*s.height) - g.depth = round(met_tb.size*s.depth) - g.glue_set = 0; g.glue_order = 0; g.head = h - g.shift = 0; g.dir = dir or 'TLT' - node.set_attribute(g, attr_icflag, PACKED) - if q then - head = node_insert_before(head, q, g) - else - head = node_insert_after(head, node.tail(head), g) - end - p = q - else p=node_next(p) - end - else p=node_next(p) - end - elseif p.id==id_math then - m=(p.subtype==0); p=node_next(p) - else - if m then - if p.id==id_hlist or p.id==id_vlist then - p.shift=p.shift+v - elseif p.id==id_rule then - p.height=p.height-v; p.depth=p.depth+v - end - end - p=node_next(p) - end - end -return head + if ltj.isglobal=='global' then tex.sprint(cat_lp, '\\global') end end -- main process @@ -273,7 +186,7 @@ end local function main_process(head, mode, dir) local p = head p = ltjj.main(p,mode) - p = main4_set_ja_width(p, dir) + p = ltjw.set_ja_width(p, dir) return p end @@ -303,12 +216,18 @@ function debug_show_node_X(p,print_fn) local s local pt=node_type(p.id) local base = debug_depth .. string.format('%X', has_attr(p,attr_icflag) or 0) - .. ' ' .. pt .. ' ' .. p.subtype + .. ' ' .. pt .. ' ' .. tostring(p.subtype ) if pt == 'glyph' then - print_fn(base, utf.char(p.char), 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) elseif pt=='hlist' then s = base .. '(' .. print_scaled(p.height) .. '+' .. print_scaled(p.depth) .. ')x' .. print_scaled(p.width) + if p.shift~=0 then + 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 @@ -368,6 +287,27 @@ function debug_show_node_X(p,print_fn) s = s .. node.subtype(p.subtype) 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); + end + if p.sup then + 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); + end + debug_depth = k; + elseif pt=='math_char' then + s = base .. ' fam: ' .. p.fam .. ' , char = ' .. utf.char(p.char) + print_fn(s) + elseif pt=='sub_box' then + print_fn(base) + if p.head then + debug_depth = k .. '.'; debug_show_node_X(p.head, print_fn); + end else print_fn(base) end