1 \documentclass[10ptj]{ltjsarticle}
2 \usepackage[width=40\zw, lines=40,centering]{geometry}
3 \usepackage{amsmath,luacode,xcolor}
7 local insert = table.insert
8 local rangedimensions, max = node.rangedimensions, math.max
9 function lineskip.p_profile(before, after)
12 local w_acc, d_before = 0, 0
13 local x = before.head; local xn = x.next
16 if xn then w, _, d= rangedimensions(before,x,xn)
17 else w, _, d= rangedimensions(before,x) end
19 d_before = d; t[w_acc] = t[w_acc] or {}
20 if t[w_acc][1] then t[w_acc][1]=max(t[w_acc][1],d)
21 else t[w_acc][1]=d end
24 x = xn; if x then xn = x.next end
28 local w_acc, h_before = 0, 0
29 local x = after.head; local xn = x.next
32 if xn then w, h = rangedimensions(after,x,xn)
33 else w, h = rangedimensions(after,x) end
35 h_before = h; t[w_acc] = t[w_acc] or {}
36 if t[w_acc][2] then t[w_acc][2]=max(t[w_acc][2],h)
37 else t[w_acc][2]=h end
40 x = xn; if x then xn = x.next end
44 for i,v in pairs(t) do insert(t2, { i, v[1], v[2] } ) end
45 table.sort(t2, function(a,b) return a[1]<b[1] end)
47 local bls = tex.baselineskip.width
48 local dmax, d, hmax, h, lmin = 0, 0, 0, 0, 1/0
49 for i,v in ipairs(t2) do
50 d, h = (v[2] or d), (v[3] or h)
51 if d>dmax then dmax=d end
52 if h>hmax then hmax=h end
53 if (bls-h-d)<lmin then lmin=bls-h-d end
55 if lmin==1/0 then lmin = 0 end
56 return lmin, bls - lmin - (before.depth+after.height)
59 function lineskip.p_dummy(before, after)
64 local setglue = node.setglue
65 local floor, min = math.floor, math.min
66 function lineskip.l_dummy(dist, g, adj, normal)
67 if dist < tex.lineskiplimit then
68 local ng = tex.lineskip; g.subtype=2
69 setglue(g, ng.width + adj, ng.stretch, ng.shrink, ng.stretch_order, ng.shrink_order)
71 local ng = tex.baselineskip; g.subtype=2
72 setglue(g, normal, ng.stretch, ng.shrink, ng.stretch_order, ng.shrink_order)
75 function lineskip.l_fixed(dist, g, adj, normal)
76 local ng = tex.baselineskip; local f = ng.width*lineskip.fixed_factor
77 if f==0 then return lineskip.l_dummy(dist, g, adj, normal) end
80 normal - f * floor((dist-lineskip.fixed_mindist)/f),
81 ng.stretch, ng.shrink, ng.stretch_order, ng.shrink_order)
85 local l_profiler, l_skip = lineskip.p_dummy, lineskip.l_dummy
86 function lineskip.setting(profiler, skip_method)
87 l_profiler = lineskip['p_'..tostring(profiler)] or lineskip.p_dummy
88 l_skip = lineskip['l_'..tostring(skip_method)] or lineskip.l_dummy
92 luatexbase.add_to_callback('post_linebreak_filter',
94 for x in node.traverse_id(12, h) do
95 if (x.subtype==1)or(x.subtype==2)then
96 local p, n = x.prev, x.next
98 while ((p.id==14)or(p.id==12)or(p.id==13)) and p.prev do p = p.prev end
99 if p.id==0 and n.id==0 then
100 local normal = tex.baselineskip.width - p.depth - n.height
101 local lmin, adj; lmin, adj = l_profiler(p,n)
102 l_skip(lmin or normal,x,adj, normal)
113 local to_direct, to_node = node.direct.todirect, node.direct.tonode
114 local make_dir_whatsit = luatexja.direction.make_dir_whatsit
115 local get_dir_count = luatexja.direction.get_dir_count
116 local function lineskip_append_vlist(b, loc, prev, mirrored)
117 local new_b = to_node(loc=='box' and
118 make_dir_whatsit(to_direct(b), to_direct(b), get_dir_count(), 'append_vlist')) or b
119 local tail = tex.nest[tex.nest.ptr].tail
120 if tail and tail.id==12 and tail.subtype==3 then
123 if tail and (prev > -65536000) then
124 local normal = tex.baselineskip.width - prev - new_b.height
125 local lmin, adj = nil, 0;
126 if tail.id==0 and new_b.id==0 then
127 if tail.depth==prev then lmin, adj = l_profiler(tail,new_b) end
129 local g = node.new(12); l_skip(lmin or normal, g, adj, normal)
133 tex.prevdepth = new_b.depth
134 return nil -- do nothing on tex side
136 luatexbase.remove_from_callback('append_to_vlist_filter','ltj.direction')
137 luatexja.base.add_to_callback('append_to_vlist_filter',
138 lineskip_append_vlist,
139 'line profile', 10000)
144 lineskip.fixed_mindist = tex.lineskip.width
145 lineskip.fixed_factor = 0.5
149 \def\R#1#2{\directlua{lineskip.setting('#1','#2')}%
150 \noindent\fbox{\parbox{25\zw}{%
151 \baselineskip14pt\noindent
152 \setbox2=\vtop{\noindent\hsize20\zw\textcolor{cyan!30!white}{%
153 □□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■
154 □□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■
155 □□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■
156 □□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■
157 □□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■
158 □□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■
159 □□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■
161 }}\dp2=0pt\rlap{\copy2}\par\vspace*{-\baselineskip}
163 \the\baselineskip あああああああああああああああ\\
164 あああああああああ$X_{X_{X_X}}$ああああああ\\
166 ……であるから$b=\dfrac1{X_2}$となる.\\
167 一方$\dfrac{A^A}{B_B}=21$なので……\\
168 ……であるから$b=\dfrac1{X_2}$となる.\\%\vadjust{あああああ$\dfrac34$}\\
169 一方$\dfrac{A^A}{B_B}=21$なので……
171 あいであるから$b=\dfrac1{X_2}$となる.新段落!\\
172 一方$\dfrac{A^A}{B_B}=21$なので……
175 うえであるから$b=\dfrac1{X_2}$prevdepth設定のため無効\\
176 一方$\dfrac{A^A}{B_B}=21$なので……