--
luatexbase.provides_module({
name = 'luatexja.adjust',
- date = '2012/09/27',
- version = '0.1',
+ date = '2013/03/14',
description = 'Advanced line adjustment for LuaTeX-ja',
})
module('luatexja.adjust', package.seeall)
local ltjf_font_metric_table = ltjf.font_metric_table
local spec_zero_glue = ltjj.spec_zero_glue
-local PACKED = 2
-local FROM_JFM = 6
-local KANJI_SKIP = 9
-local XKANJI_SKIP = 10
+local PACKED = luatexja.icflag_table.PACKED
+local FROM_JFM = luatexja.icflag_table.FROM_JFM
+local KANJI_SKIP = luatexja.icflag_table.KANJI_SKIP
+local XKANJI_SKIP = luatexja.icflag_table.XKANJI_SKIP
local priority_table = {
FROM_JFM + 2,
end
end
+-- local new_ks, new_xs
local function get_total_stretched(p)
local go, gf, gs = p.glue_order, p.glue_set, p.glue_sign
- local new_ks, new_xs
local res = {
[0] = 0,
glue_set = gf, name = (gs==1) and 'stretch' or 'shrink'
local a, ic = get_stretched(q, go, gs), get_attr_icflag(q)
if type(res[ic]) == 'number' then
-- kanjiskip, xkanjiskip は段落内で spec を共有しているが,
- -- それはここでは望ましくないので,
- -- 各行ごとに異なる spec を使うようにする.
- -- しかしここでは面倒なので,各 glue ごとに別の spec を使っている.
- -- ぜひなんとかしたい!
+ -- それはここでは望ましくないので,各 glue ごとに異なる spec を使う.
-- JFM グルーはそれぞれ異なる glue_spec を用いているので,問題ない.
res[ic] = res[ic] + a
- if ic == KANJI_SKIP then
+ if ic == KANJI_SKIP or ic == XKANJI_SKIP then
if q.spec ~= spec_zero_glue then
- if not new_ks then
- local ts; q.spec, ts = node_copy(q.spec), q.spec
- new_ks, q.spec = node.copy(q), ts
- end
- local g = node.copy(new_ks)
- node.insert_before(head, q, g);
- head = node.remove(head, q); node.free(q); q = g
- end
- elseif ic == XKANJI_SKIP then
- if q.spec ~= spec_zero_glue then
- if not new_xs then
- local ts; q.spec, ts = node_copy(q.spec), q.spec
- new_xs, q.spec = node.copy(q), ts
- end
- local g =node.copy(new_xs)
+ local ts, g;
+ q.spec, ts = node_copy(q.spec), q.spec
+ g = node.copy(q); q.spec = ts
node.insert_before(head, q, g);
head = node.remove(head, q); node.free(q); q = g
end
end
q = node_next(q)
end
- if new_ks then node_free(new_ks); new_ks = nil end
- if new_xs then node_free(new_xs); new_xs = nil end
return res
end
end
end
+local set_stretch_table = {}
local function set_stretch(p, after, before, ic, name)
if before > 0 then
--print (ic, before, after)
local ratio = after/before
+ for i,_ in pairs(set_stretch_table) do
+ set_stretch_table[i] = nil
+ end
for q in node.traverse_id(id_glue, p.head) do
if get_attr_icflag(q) == ic then
- local qs = q.spec
- if qs.writable and qs[name..'_order'] == 0 then
- qs[name] = qs[name]*ratio
+ local qs, do_flag = q.spec, true
+ for i=1,#set_stretch_table do
+ if set_stretch_table[i]==qs then do_flag = false end
+ end
+ if qs.writable and qs[name..'_order'] == 0 and do_flag then
+ qs[name] = qs[name]*ratio;
+ set_stretch_table[#set_stretch_table+1] = qs
end
end
end
return false-- それ以外は対象外.
end
local xk = ltjf_font_metric_table --
- [xc.font].size_cache.char_type[has_attr(xc, attr_jchar_class) or 0]
+ [xc.font].char_type[has_attr(xc, attr_jchar_class) or 0]
['end_' .. res.name] or 0
--print(res.name, total, xk, unicode.utf8.char(xc.char))