if ltj.isglobal=='global' then tex.sprint('\\global') end
end
-
- ------------------------------------------------------------------------
- -- MAIN PROCESS STEP 1: replace fonts (prefix: main1)
- ------------------------------------------------------------------------
- ltj.box_stack_level = 0
- -- This is used in Step 2 (JFM glue/kern) and Step 3 (\[x]kanjiskip).
-
- local function main1_suppress_hyphenate_ja(head)
- for p in node.traverse_id(id_glyph, head) do
- if ltjc.is_ucs_in_japanese_char(p) then
- local v = has_attr(p, attr_curjfnt)
- if v then
- p.font = v
- node.set_attribute(p, attr_jchar_class,
- ljfm_find_char_class(p.char, ltj.font_metric_table[v].jfm))
- end
- v = has_attr(p, attr_ykblshift)
- if v then
- node.set_attribute(p, attr_yablshift, v)
- else
- node.unset_attribute(p, attr_yablshift)
- end
- if p.subtype%2==1 then p.subtype = p.subtype - 1 end
- p.lang=lang_ja
- end
- end
- lang.hyphenate(head)
- return head
- end
-
- -- mode: true iff this function is called from hpack_filter
- local function main1_set_box_stack_level(head, mode)
- local box_set = false
- local p = head
- local cl = tex.currentgrouplevel + 1
- while p do
- if p.id==id_whatsit and p.subtype==sid_user and p.user_id==30112 then
- local g = p
- if mode and g.value==cl then box_set = true end
- head, p = node.remove(head, g)
- else p = node_next(p)
- end
- end
- if box_set then
- ltj.box_stack_level = tex.getcount('ltj@@stack') + 1
- else
- ltj.box_stack_level = tex.getcount('ltj@@stack')
- end
- if not head then -- prevent that the list is null
- head = node_new(id_kern); head.kern = 0; head.subtype = 1
- end
- return head
- end
-
- -- CALLBACKS
- luatexbase.add_to_callback('hpack_filter',
- function (head)
- return main1_set_box_stack_level(head, true)
- end,'ltj.hpack_filter_pre',1)
- luatexbase.add_to_callback('pre_linebreak_filter',
- function (head)
- return main1_set_box_stack_level(head, false)
- end,'ltj.pre_linebreak_filter_pre',1)
- luatexbase.add_to_callback('hyphenate',
- function (head,tail)
- return main1_suppress_hyphenate_ja(head)
- end,'ltj.hyphenate')
-
-
- ------------------------------------------------------------------------
- -- 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)
- 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 = ltj.font_metric_table[p.font]
- t = ltj.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)
- p.next = nil
- p.yoffset=round(p.yoffset-met_tb.size*s.down)
- p.xoffset=round(p.xoffset-met_tb.size*s.left)
- if s.align=='middle' or s.align=='right' then
- h = node_insert_before(p, p, main4_get_hss())
- else h=p end
- if s.align=='middle' or s.align=='left' then
- node_insert_after(h, p, main4_get_hss())
- end
- g = node_hpack(h, round(met_tb.size*s.width), 'exactly')
- g.height = round(met_tb.size*s.height)
- g.depth = round(met_tb.size*s.depth)
- 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
- end
--
-- main process
-- mode = true iff main_process is called from pre_linebreak_filter
- local function main_process(head, mode)
+ local function main_process(head, mode, dir)
local p = head
- p = ltj.int_insert_jfm_glue(p,mode)
- p = ltj.int_insert_kanji_skip(p)
- p = main4_set_ja_width(p)
+ p = ltjj.main(p,mode)
+ p = ltjw.set_ja_width(p, dir)
return p
end