OSDN Git Service

test27-lineprofile.tex: 行間計算方法のテスト
authorHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Sun, 22 Jul 2018 08:17:47 +0000 (17:17 +0900)
committerHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Sun, 22 Jul 2018 08:17:47 +0000 (17:17 +0900)
test/test27-lineprofile.tex [new file with mode: 0644]

diff --git a/test/test27-lineprofile.tex b/test/test27-lineprofile.tex
new file mode 100644 (file)
index 0000000..471a6bb
--- /dev/null
@@ -0,0 +1,150 @@
+\documentclass[10ptj]{ltjsarticle}
+\usepackage[width=40\zw, lines=40,centering]{geometry}
+\usepackage{amsmath,luacode,xcolor}
+\begin{luacode}
+  lineskip = {}
+do
+  local insert = table.insert
+  local rangedimensions, max = node.rangedimensions, math.max
+  function lineskip.p_profile(before, after)
+    local t = {}
+    do
+      local w_acc, d_before = 0, 0
+      local x = before.head; local xn = x.next
+      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 = x.next end
+      end
+    end
+    do
+      local w_acc, h_before = 0, 0
+      local x = after.head; local xn = x.next
+      while x do
+        local w, h
+        if xn then w, h = rangedimensions(after,x,xn)
+        else w, h = rangedimensions(after,x) 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 = x.next 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 bls = tex.baselineskip.width
+      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 (bls-h-d)<lmin then lmin=bls-h-d end
+        --print(v[1], d, h, bls-h-d)
+      end
+      return lmin, bls - lmin - (before.depth+after.height)
+    end
+  end
+  function lineskip.p_dummy(before, after)
+    local bls = tex.baselineskip.width
+    return nil, 0
+  end
+end
+do
+  local setglue = node.setglue
+  local floor, min = math.floor, math.min
+  function lineskip.l_dummy(dist, g, adj, normal)
+    if dist < tex.lineskiplimit then
+      local ng = tex.lineskip; g.subtype=2
+      setglue(g, ng.width + adj, ng.stretch, ng.shrink, ng.stretch_order, ng.shrink_order)
+    else
+      local ng = tex.baselineskip; g.subtype=2
+      setglue(g, normal, ng.stretch, ng.shrink, ng.stretch_order, ng.shrink_order)
+    end
+  end
+  function lineskip.l_fixed(dist, g, adj, normal)
+    local ng = tex.baselineskip; local f = ng.width*lineskip.fixed_factor
+    g.subtype=2
+    setglue(g,
+      normal - f * floor((dist-lineskip.fixed_mindist)/f),
+      ng.stretch, ng.shrink, ng.stretch_order, ng.shrink_order)
+  end
+end
+
+  local l_profiler, l_skip = lineskip.p_dummy, lineskip.l_dummy
+  function lineskip.setting(profiler, skip_method)
+    l_profiler = lineskip['p_'..tostring(profiler)] or lineskip.p_dummy
+    l_skip = lineskip['l_'..tostring(skip_method)] or lineskip.l_dummy
+  end
+  
+  luatexbase.add_to_callback('post_linebreak_filter',
+    function(h)
+      for x in node.traverse_id(12, h) do
+        if (x.subtype==1)or(x.subtype==2)then
+          local p, n = x.prev, x.next
+          if p then 
+            while ((p.id==14)or(p.id==12)or(p.id==13)) and p.prev do p = p.prev end
+            if p.id==0 and n.id==0 then
+              local normal = tex.baselineskip.width - p.depth - n.height
+              local lmin, adj; lmin, adj = l_profiler(p,n)
+              l_skip(lmin or normal,x,adj, normal)
+              print(p.depth, x.width, n.height, p.depth+x.width+n.height)
+            end
+          end
+        end
+      end
+      return true
+    end, 'test', 10000
+  )
+\end{luacode}
+\begin{document}
+\directlua{%
+  lineskip.fixed_mindist = tex.lineskip.width
+  lineskip.fixed_factor = 0.5
+}
+
+
+\def\R#1#2{\directlua{lineskip.setting('#1','#2')}%
+\noindent\fbox{\parbox{25\zw}{%
+\baselineskip14pt\noindent
+\setbox2=\vtop{\noindent\hsize20\zw\textcolor{cyan!30!white}{%
+ □□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■
+ □□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■
+ □□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■
+ □□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■
+ □□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■
+ □□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■
+ □□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■
+ □□□□■□□□□■□□□□■□□□□■
+}}\dp2=0pt\rlap{\copy2}\par\vspace*{-\baselineskip}
+\textbf{#1, #2}\\
+\the\baselineskip あああああああああああああああ\\
+あああああああああ$X_{X_{X_X}}$ああああああ\\
+ああああああああああああああああああ\\
+……であるから$b=\dfrac1{X_2}$となる.\\
+一方$\dfrac{A^A}{B_B}=21$なので……\\
+……であるから$b=\dfrac1{X_2}$となる.\vadjust{あああああ$\dfrac34$}\\
+一方$\dfrac{A^A}{B_B}=21$なので……
+
+……であるから$b=\dfrac1{X_2}$となる.\\
+一方$\dfrac{A^A}{B_B}=21$なので……
+}}\par}
+
+
+\R{null}{null}
+\R{profile}{null}
+\R{null}{fixed}
+\R{profile}{fixed}
+
+\end{document}