summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/spac-ver.lua
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2018-02-23 23:32:32 +0100
committerContext Git Mirror Bot <phg42.2a@gmail.com>2018-02-23 23:32:32 +0100
commit661fb34ced40815e1e5e9073de9c8475127da094 (patch)
treee37efb780017271ef7d9d3b79673d6093b228c23 /tex/context/base/mkiv/spac-ver.lua
parent8e51addbcecd962280c24a77de9ec1f6724e7a65 (diff)
downloadcontext-661fb34ced40815e1e5e9073de9c8475127da094.tar.gz
2018-02-23 22:19:00
Diffstat (limited to 'tex/context/base/mkiv/spac-ver.lua')
-rw-r--r--tex/context/base/mkiv/spac-ver.lua197
1 files changed, 126 insertions, 71 deletions
diff --git a/tex/context/base/mkiv/spac-ver.lua b/tex/context/base/mkiv/spac-ver.lua
index aee61adf9..3d263dafd 100644
--- a/tex/context/base/mkiv/spac-ver.lua
+++ b/tex/context/base/mkiv/spac-ver.lua
@@ -171,6 +171,7 @@ local new_rule = nodepool.rule
local nodecodes = nodes.nodecodes
local skipcodes = nodes.skipcodes
+local penaltycodes = nodes.penaltycodes
local penalty_code = nodecodes.penalty
local kern_code = nodecodes.kern
@@ -180,16 +181,19 @@ local hlist_code = nodecodes.hlist
local vlist_code = nodecodes.vlist
local localpar_code = nodecodes.localpar
-local userskip_code = skipcodes.userskip
-local lineskip_code = skipcodes.lineskip
-local baselineskip_code = skipcodes.baselineskip
-local parskip_code = skipcodes.parskip
+local linebreak_code = penaltycodes.linebreakpenalty
+
+local userskip_code = skipcodes.userskip
+local lineskip_code = skipcodes.lineskip
+local baselineskip_code = skipcodes.baselineskip
+local parskip_code = skipcodes.parskip
+local topskip_code = skipcodes.topskip
+local splittopskip_code = skipcodes.splittopskip
+
local abovedisplayskip_code = skipcodes.abovedisplayskip
local belowdisplayskip_code = skipcodes.belowdisplayskip
local abovedisplayshortskip_code = skipcodes.abovedisplayshortskip
local belowdisplayshortskip_code = skipcodes.belowdisplayshortskip
-local topskip_code = skipcodes.topskip
-local splittopskip_code = skipcodes.splittopskip
local vspacing = builders.vspacing or { }
builders.vspacing = vspacing
@@ -1249,8 +1253,6 @@ end
-- topskip
-- splittopskip
-local experiment = true directives.register("vspacing.experiment",function(v) experiment = v end)
-
local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also pass tail
if trace then
reset_tracing(head)
@@ -1558,7 +1560,7 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also
glue_order, glue_data = 0, nil
elseif sc == disable or sc == enable then
local next = getnext(current)
- if not experiment or next then
+ if next then
ignore_following = sc == disable
if trace then
trace_skip(sc == disable and "disable" or "enable",sc,so,sp,current)
@@ -1569,7 +1571,7 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also
end
elseif sc == together then
local next = getnext(current)
- if not experiment or next then
+ if next then
keep_together = true
if trace then
trace_skip("together",sc,so,sp,current)
@@ -1580,7 +1582,7 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also
end
elseif sc == nowhite then
local next = getnext(current)
- if not experiment or next then
+ if next then
ignore_whitespace = true
head, current = remove_node(head, current, true)
else
@@ -2015,34 +2017,108 @@ end
do
- local outer = texnest[0]
- local reset = true
- local trace = false
- local report = logs.reporter("vspacing")
-
- directives.register("vspacing.resetprevdepth",function(v) reset = v end)
- trackers.register ("vspacing.resetprevdepth",function(v) trace = v end)
+ local outer = texnest[0]
+ local enabled = true
+ local count = true
+ local trace = false
+ local report = logs.reporter("vspacing")
+
+ trackers.register("vspacing.synchronizepage",function(v)
+ trace = v
+ end)
+
+ directives.register("vspacing.synchronizepage",function(v)
+ if v == true or v == "count" then
+ enabled = true
+ count = true
+ elseif v == "first" then
+ enabled = true
+ count = false
+ else
+ enabled = false
+ count = false
+ end
+ end)
+
+ -- hm, check the old one
+
+ -- function vspacing.synchronizepage()
+ -- if enabled then
+ -- local head = texlists.hold_head
+ -- local skip = 0
+ -- while head and head.id == insert_code do
+ -- head = head.next
+ -- skip = skip + 1
+ -- end
+ -- if head then
+ -- outer.prevdepth = 0
+ -- end
+ -- if trace then
+ -- report("prevdepth %s at page %i, skipped %i, value %p",
+ -- head and "reset" or "kept",texgetcount("realpageno"),skip,outer.prevdepth)
+ -- end
+ -- end
+ -- end
- -- use getid and getnext
+ local ignoredepth = -65536000
- function vspacing.resetprevdepth()
- if reset then
- local head = texlists.hold_head
+ function vspacing.synchronizepage()
+ if enabled then
+ local newdepth = outer.prevdepth
+ local olddepth = newdepth
+ local oldlines = outer.prevgraf
+ local newlines = 0
+ local boxfound = false
+ local head = texlists.contrib_head
if head then
- head = tonut(head)
- local skip = 0
- while head and getid(head) == insert_code do
- head = getnext(head)
- skip = skip + 1
- end
- if head then
- outer.prevdepth = 0
- end
- if trace then
- report("prevdepth %s at page %i, skipped %i, value %p",
- head and "reset" or "kept",texgetcount("realpageno"),skip,outer.prevdepth)
+ local tail = find_node_tail(tonut(head))
+ while tail do
+ local id = getid(tail)
+ if id == hlist_code then
+ if not boxfound then
+ newdepth = getdepth(tail)
+ boxfound = true
+ end
+ newlines = newlines + 1
+ if not count then
+ break
+ end
+ elseif id == vlist_code then
+ if not boxfound then
+ newdepth = getdepth(tail)
+ boxfound = true
+ end
+ break
+ elseif id == glue_code then
+ local subtype = getsubtype(tail)
+ if not (subtype == baselineskip_code or subtype == lineskip_code) then
+ break
+ elseif boxfound and not count then
+ break
+ end
+ elseif id == penalty_code then
+ if boxfound and not count then
+ break
+ end
+ else
+ -- ins, mark, kern, rule, boundary, whatsit
+ break
+ end
+ tail = getprev(tail)
end
end
+ if boxfound then
+ -- what if newdepth ...
+ else
+ texset("prevdepth",ignoredepth)
+ outer.prevdepth = ignoredepth
+ end
+ texset("prevgraf", newlines)
+ outer.prevgraf = newlines
+ if trace then
+ report("page %i, prevdepth %p (last depth %p), prevgraf %i (from %i), %sboxes",
+ texgetcount("realpageno"),olddepth,newdepth,oldlines,newlines,boxfound and "" or "no ")
+ end
end
end
@@ -2050,27 +2126,6 @@ do
trackers.register("vspacing.forcestrutdepth",function(v) trace = v end)
--- function vspacing.forcestrutdepth(n,depth,trace_mode)
--- local box = texgetbox(n)
--- if box then
--- box = tonut(box)
--- local dp = getdepth(box)
--- if dp < depth then
--- local head = getlist(box)
--- if head then
--- local tail = find_node_tail(head)
--- if tail and getid(tail) == hlist_code then
--- setdepth(tail,depth)
--- outer.prevdepth = depth
--- if trace or trace_mode > 0 then
--- nuts.setvisual(tail,"depth")
--- end
--- end
--- end
--- end
--- end
--- end
-
function vspacing.forcestrutdepth(n,depth,trace_mode)
local box = texgetbox(n)
if box then
@@ -2106,8 +2161,8 @@ do
}
implement {
- name = "resetprevdepth",
- actions = vspacing.resetprevdepth,
+ name = "synchronizepage",
+ actions = vspacing.synchronizepage,
scope = "private"
}
@@ -2160,20 +2215,20 @@ do
arguments = { "string", "string" }
}
- local remove_node = nodes.remove
- local find_node_tail = nodes.tail
-
- interfaces.implement {
- name = "fakenextstrutline",
- actions = function()
- local head = texlists.page_head
- if head then
- local head = remove_node(head,find_node_tail(head),true)
- texlists.page_head = head
- buildpage()
- end
- end
- }
+ -- local remove_node = nodes.remove
+ -- local find_node_tail = nodes.tail
+ --
+ -- interfaces.implement {
+ -- name = "fakenextstrutline",
+ -- actions = function()
+ -- local head = texlists.page_head
+ -- if head then
+ -- local head = remove_node(head,find_node_tail(head),true)
+ -- texlists.page_head = head
+ -- buildpage()
+ -- end
+ -- end
+ -- }
interfaces.implement {
name = "removelastline",