summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua')
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua122
1 files changed, 66 insertions, 56 deletions
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua
index b5f267c4bb1..c54842a86b6 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-direction.lua
@@ -10,26 +10,24 @@ local attr_dir = luatexbase.attributes['ltj@dir']
local attr_icflag = luatexbase.attributes['ltj@icflag']
local cat_lp = luatexbase.catcodetables['latex-package']
-local Dnode = node.direct or node
-local nullfunc = function (n) return n end
-local to_node = (Dnode ~= node) and Dnode.tonode or nullfunc
-local to_direct = (Dnode ~= node) and Dnode.todirect or nullfunc
-local has_attr = Dnode.has_attribute
-local set_attr = Dnode.set_attribute
-local insert_before = Dnode.insert_before
-local insert_after = Dnode.insert_after
-local getid = (Dnode ~= node) and Dnode.getid or function(n) return n.id end
-local getsubtype = (Dnode ~= node) and Dnode.getsubtype or function(n) return n.subtype end
-local getlist = (Dnode ~= node) and Dnode.getlist or function(n) return n.head end
-local setfield = (Dnode ~= node) and Dnode.setfield or function(n, i, c) n[i] = c end
-local getfield = (Dnode ~= node) and Dnode.getfield or function(n, i) return n[i] end
-local node_new = Dnode.new
-local node_tail = Dnode.tail
-local node_free = Dnode.free
-local node_remove = Dnode.remove
-local node_next = (Dnode ~= node) and Dnode.getnext or node.next
-local traverse = Dnode.traverse
-local traverse_id = Dnode.traverse_id
+local to_node = node.direct.tonode
+local to_direct = node.direct.todirect
+local has_attr = node.direct.has_attribute
+local set_attr = node.direct.set_attribute
+local insert_before = node.direct.insert_before
+local insert_after = node.direct.insert_after
+local getid = node.direct.getid
+local getsubtype = node.direct.getsubtype
+local getlist = node.direct.getlist
+local setfield = node.direct.setfield
+local getfield = node.direct.getfield
+local node_new = node.direct.new
+local node_tail = node.direct.tail
+local node_free = node.direct.free
+local node_remove = node.direct.remove
+local node_next = node.direct.getnext
+local traverse = node.direct.traverse
+local traverse_id = node.direct.traverse_id
local start_time_measure, stop_time_measure
= ltjb.start_time_measure, ltjb.stop_time_measure
local abs = math.abs
@@ -65,7 +63,7 @@ local page_direction
--
local dir_pool
do
- local node_copy = Dnode.copy
+ local node_copy = node.direct.copy
dir_pool = {}
for _,i in pairs({dir_tate, dir_yoko, dir_dtou, dir_utod}) do
local w = node_new(id_whatsit, sid_user)
@@ -140,7 +138,6 @@ do
local node_traverse = node.traverse
local STCK = luatexja.userid_table.STCK
local IHB = luatexja.userid_table.IHB
- local sid_local = node.subtype('local_par')
local id_local = node.id('local_par')
local function test_list(h, lv)
@@ -159,8 +156,6 @@ do
elseif not(uid==IHB or uid==STCK) then
flag = 0; break -- error
end
- elseif ps~=sid_local then
- flag = 0; break
end
elseif p.id~=id_local then
flag = 0; break
@@ -581,7 +576,7 @@ local function unwrap_dir_node(b, head, box_dir)
end
local shift_old, b_dir, wh = nil, get_box_dir(bh, 0)
if wh then
- Dnode.flush_list(getfield(wh, 'value'))
+ node.direct.flush_list(getfield(wh, 'value'))
setfield(wh, 'value', nil)
end
return nh, nb, bh, b_dir
@@ -626,7 +621,7 @@ do
-- dir_node としてカプセル化されている
local _, dnc = get_box_dir(b, 0)
if dnc then -- free all other dir_node
- Dnode.flush_list(getfield(dnc, 'value'))
+ node.direct.flush_list(getfield(dnc, 'value'))
setfield(dnc, 'value', nil)
end
set_attr(b, attr_dir, box_dir%dir_math_mod + dir_node_auto)
@@ -656,7 +651,7 @@ do
db=x; break
end
end
- Dnode.flush_list(getfield(dn, 'value'))
+ node.direct.flush_list(getfield(dn, 'value'))
setfield(dn, 'value', nil)
db = db or create_dir_node(b, box_dir, new_dir, false)
local w = getfield(b, 'width')
@@ -687,7 +682,7 @@ do
end
-- lastbox
- local node_prev = (Dnode~=node) and Dnode.getprev or node.prev
+ local node_prev = (node.direct~=node) and node.direct.getprev or node.prev
local function lastbox_hook()
start_time_measure('box_primitive_hook')
local bn = tex_nest[tex_nest.ptr].tail
@@ -705,7 +700,7 @@ do
end
local _, wh = get_box_dir(b, 0) -- clean dir_node attached to the box
if wh then
- Dnode.flush_list(getfield('value', wh))
+ node.direct.flush_list(getfield('value', wh))
setfield(wh, 'value', nil)
end
end
@@ -766,8 +761,8 @@ do
luatexja.direction.get_box_dim = get_box_dim
-- return value: (changed dimen of box itself?)
- local scan_dimen, scan_int = luatexja.token.scan_dimen, luatexja.token.scan_int
- local scan_keyword = luatexja.token.scan_keyword
+ local scan_dimen, scan_int = token.scan_dimen, token.scan_int
+ local scan_keyword = token.scan_keyword
local function set_box_dim_common(key, s, l_dir)
local s_dir, wh = get_box_dir(s, dir_yoko)
s_dir = s_dir%dir_math_mod
@@ -866,7 +861,7 @@ do
end
do
- local getbox, setbox, copy_list = tex.getbox, tex.setbox, Dnode.copy_list
+ local getbox, setbox, copy_list = tex.getbox, tex.setbox, node.direct.copy_list
-- raise, lower
function luatexja.direction.raise_box()
start_time_measure('box_primitive_hook')
@@ -913,7 +908,7 @@ do
'luatexja',
'Direction Incompatible',
"\\vadjust's argument and outer vlist must have same direction.")
- Dnode.last_node()
+ node.direct.last_node()
end
end
stop_time_measure('box_primitive_hook')
@@ -964,14 +959,6 @@ do
ltjs.list_dir = has_attr(bh, attr_dir); break
end
end
- -- local bh=hd
- -- for i=1,2 do
- -- if bh and getid(bh)==id_whatsit
- -- and getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR then
- -- ltjs.list_dir = has_attr(bh, attr_dir); break
- -- end
- -- bh = node_next(bh)
- -- end
if split_dir_whatsit then
-- adjust direction of 'split_keep'
set_attr(split_dir_whatsit, attr_dir, ltjs.list_dir)
@@ -981,7 +968,9 @@ do
split_dir_whatsit=nil
else
adjust_badness(hd)
- hd = process_dir_node(create_dir_whatsit_vbox(hd, gc), gc)
+ -- hd = process_dir_node(create_dir_whatsit_vbox(hd, gc), gc)
+ -- done in append_to_vpack callback
+ hd = create_dir_whatsit_vbox(hd, gc)
split_dir_whatsit=nil
end
stop_time_measure('direction_vpack')
@@ -1012,23 +1001,44 @@ do
end
end
--- buildpage filter
+-- append_to_vlist filter
do
- local function dir_adjust_buildpage(info)
- if info=='box' then
- local head = to_direct(tex.lists.contrib_head)
- if head then
- head = make_dir_whatsit(head,
- node_tail(head),
- get_dir_count(),
- 'buildpage')
- tex.lists.contrib_head = to_node(head)
+ local id_glue = node.id('glue')
+ local getglue = node.direct.getglue or
+ function(g)
+ return getfield(g,'width'), getfield(g,'stretch'), getfield(g,'shrink'),
+ getfield(g,'stretch_order'), getfield(g,'shrink_order')
+ end
+local setglue = luatexja.setglue
+ local function copy_glue (new_glue, old_glue, subtype, new_w)
+ setfield(new_glue, 'subtype', subtype)
+ local w,st,sp,sto,spo = getglue(to_direct(old_glue))
+ setglue(new_glue, new_w or w, st, sp, sto, spo)
+ end
+ local node_write = node.direct.write
+ local function dir_adjust_append_vlist(b, loc, prev, mirrored)
+ local old_b = to_direct(b)
+ local new_b = loc=='box' and
+ make_dir_whatsit(old_b, old_b, get_dir_count(), 'append_vlist') or old_b
+
+ if prev > -65536000 then
+ local d = tex.baselineskip.width - prev
+ - getfield(new_b, mirrored and 'depth' or 'height')
+ local g = node_new(id_glue)
+ if d < tex.lineskiplimit then
+ copy_glue(g, tex.lineskip, 1)
+ else
+ copy_glue(g, tex.baselineskip, 2, d);
end
+ node_write(g)
end
+ node_write(new_b)
+ tex.prevdepth = getfield(new_b, mirrored and 'height' or 'depth')
+ return nil -- do nothing on tex side
end
- ltjb.add_to_callback('buildpage_filter',
- dir_adjust_buildpage,
- 'ltj.direction', 10000)
+ ltjb.add_to_callback('append_to_vlist_filter',
+ dir_adjust_append_vlist,
+ 'ltj.direction', 10000)
end
-- finalize (executed just before \shipout)
@@ -1088,7 +1098,7 @@ do
end
end
local getbox = tex.getbox
- local setbox, copy = Dnode.setbox, Dnode.copy
+ local setbox, copy = node.direct.setbox, node.direct.copy
local lua_mem_kb = 0
function luatexja.direction.finalize()
local a = to_direct(tex.getbox("AtBeginShipoutBox"))