summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/luatex/luatexja/ltj-adjust.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/luatex/luatexja/ltj-adjust.lua')
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-adjust.lua95
1 files changed, 90 insertions, 5 deletions
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-adjust.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-adjust.lua
index 7131bbc7b77..d9bd77a3ea8 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-adjust.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-adjust.lua
@@ -1,10 +1,12 @@
--
-- ltj-adjust.lua
--
+luatexja.load_module('base'); local ltjb = luatexja.base
luatexja.load_module('jfont'); local ltjf = luatexja.jfont
luatexja.load_module('jfmglue'); local ltjj = luatexja.jfmglue
luatexja.load_module('stack'); local ltjs = luatexja.stack
luatexja.load_module('direction'); local ltjd = luatexja.direction
+luatexja.load_module('lineskip'); local ltjl = luatexja.lineskip
luatexja.adjust = luatexja.adjust or {}
local to_node = node.direct.tonode
@@ -401,10 +403,11 @@ do
return to_node(head)
end
local is_reg = false
- function enable_cb(status_le, status_pr)
+ function enable_cb(status_le, status_pr, status_lp, status_ls)
if (status_le>0 or status_pr>0) and (not is_reg) then
- luatexbase.add_to_callback('post_linebreak_filter',
- adjust_width, 'Adjust width', 100)
+ ltjb.add_to_callback('post_linebreak_filter',
+ adjust_width, 'Adjust width',
+ luatexbase.priority_in_callback('post_linebreak_filter', 'ltj.lineskip')-1)
is_reg = true
elseif is_reg and (status_le==0 and status_pr==0) then
luatexbase.remove_from_callback('post_linebreak_filter', 'Adjust width')
@@ -412,7 +415,7 @@ do
end
if status_le==2 then
if not luatexbase.in_callback('luatexja.adjust_jfmglue', 'luatexja.adjust') then
- luatexbase.add_to_callback('luatexja.adjust_jfmglue', insert_lineend_kern, 'luatexja.adjust')
+ ltjb.add_to_callback('luatexja.adjust_jfmglue', insert_lineend_kern, 'luatexja.adjust')
end
myaw_step1, myaw_step1_last = dummy, aw_step1_last
else
@@ -426,9 +429,13 @@ do
end
end
myaw_step2 = (status_pr>0) and aw_step2 or aw_step2_dummy
+ luatexja.lineskip.setting(
+ status_lp>0 and 'profile' or 'dummy',
+ status_ls>0 and 'step' or 'dummy'
+ )
end
function disable_cb() -- only for compatibility
- enable_cs(0)
+ enable_cs(0,0,0,0)
end
luatexja.adjust.enable_cb=enable_cb
luatexja.adjust.disable_cb=disable_cb
@@ -437,3 +444,81 @@ end
luatexja.unary_pars.adjust = function(t)
return is_reg and 1 or 0
end
+
+-- -----------------------------------
+luatexja.adjust.step_factor = 0.5
+do
+ local insert = table.insert
+ local rangedimensions, max = node.direct.rangedimensions, math.max
+ function ltjl.p_profile(before, after, mirrored, bw)
+ local t = {}
+ do
+ local w_acc, d_before = 0, 0
+ local x = getlist(before); local xn = node_next(x)
+ while x do
+ local w, d
+ if xn then w, _, d= rangedimensions(before,x,xn)
+ else w, _, d= rangedimensions(before,x) end
+ if d~=d_before then
+ d_before = d; t[w_acc] = t[w_acc] or {}
+ if t[w_acc][1] then t[w_acc][1]=max(t[w_acc][1],d)
+ else t[w_acc][1]=d end
+ end
+ w_acc = w_acc + w
+ x = xn; if x then xn = node_next(x) end
+ end
+ end
+ do
+ local w_acc, h_before = 0, 0
+ local x = getlist(after); local xn = node_next(x)
+ while x do
+ local w, h, d
+ if xn then w, h, d = rangedimensions(after,x,xn)
+ else w, h,d = rangedimensions(after,x) end
+ if mirrored then h=d end
+ if h~=h_before then
+ h_before = h; t[w_acc] = t[w_acc] or {}
+ if t[w_acc][2] then t[w_acc][2]=max(t[w_acc][2],h)
+ else t[w_acc][2]=h end
+ end
+ w_acc = w_acc + w
+ x = xn; if x then xn = node_next(x) end
+ end
+ end
+ local t2 = {}
+ for i,v in pairs(t) do insert(t2, { i, v[1], v[2] } ) end
+ table.sort(t2, function(a,b) return a[1]<b[1] end)
+ do
+ local dmax, d, hmax, h, lmin = 0, 0, 0, 0, 1/0
+ for i,v in ipairs(t2) do
+ d, h = (v[2] or d), (v[3] or h)
+ if d>dmax then dmax=d end
+ if h>hmax then hmax=h end
+ if (bw-h-d)<lmin then lmin=bw-h-d end
+ end
+ if lmin==1/0 then lmin = bw end
+ return lmin,
+ bw - lmin - getfield(before, 'depth')
+ - getfield(after, mirrored and 'depth' or 'height')
+ end
+ end
+end
+
+do
+ local ltja = luatexja.adjust
+ local copy_glue = ltjl.copy_glue
+ local floor, max = math.floor, math.max
+ function ltjl.l_step(dist, g, adj, normal, bw, loc)
+ if loc=='alignment' then
+ return ltjl.l_dummy(dist, g, adj, normal, bw, loc)
+ end
+ if dist < tex.lineskiplimit then
+ local f = max(1, bw*ltja.step_factor)
+ copy_glue(g, tex.baselineskip, 1, normal - f * floor((dist-tex.lineskip.width)/f))
+ else
+ copy_glue(g, tex.baselineskip, 2, normal)
+ end
+ end
+end
+
+