summaryrefslogtreecommitdiff
path: root/macros/luatex/generic/luatexja/src/ltj-ruby.lua
diff options
context:
space:
mode:
Diffstat (limited to 'macros/luatex/generic/luatexja/src/ltj-ruby.lua')
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-ruby.lua78
1 files changed, 55 insertions, 23 deletions
diff --git a/macros/luatex/generic/luatexja/src/ltj-ruby.lua b/macros/luatex/generic/luatexja/src/ltj-ruby.lua
index 865e301f30..e2cb40d925 100644
--- a/macros/luatex/generic/luatexja/src/ltj-ruby.lua
+++ b/macros/luatex/generic/luatexja/src/ltj-ruby.lua
@@ -3,7 +3,7 @@
--
luatexbase.provides_module({
name = 'luatexja.ruby',
- date = '2020-07-30',
+ date = '2020-10-05',
description = 'Ruby annotation',
})
luatexja.ruby = {}
@@ -50,6 +50,7 @@ local attr_ruby_stretch = luatexbase.attributes['ltj@kcat2']
local attr_ruby_mode = luatexbase.attributes['ltj@kcat3']
local attr_ruby_id = luatexbase.attributes['ltj@kcat4'] -- uniq id
local attr_ruby_intergap = luatexbase.attributes['ltj@kcat5']
+local attr_ruby_baseheight= luatexbase.attributes['ltj@kcat6']
local attr_ruby = luatexbase.attributes['ltj@rubyattr']
-- ルビ内部処理用,以下のようにノードによって使われ方が異なる
-- * (whatsit) では JAglue 処理時に,
@@ -128,6 +129,9 @@ function luatexja.ruby.read_old_break_info()
local real_file = kpse.find_file(fname)
if real_file then dofile(real_file) end
cache_handle = io.open(fname, 'w')
+ if cache_handle then
+ cache_handle:write('local lrob=luatexja.ruby.old_break_info\n')
+ end
end
end
local make_uniq_id
@@ -142,12 +146,12 @@ end
-- concatenation of boxes: reusing nodes
-- ルビ組版が行われている段落/hboxでの設定が使われる.
-- ルビ文字を格納しているボックスでの設定ではない!
+local function get_attr_icflag(p)
+ return (has_attr(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG
+end
local concat
do
local node_prev = node.direct.getprev
- local function get_attr_icflag(p)
- return (has_attr(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG
- end
function concat(f, b)
if f then
if b then
@@ -264,6 +268,7 @@ local function texiface_low(rst, rtlr, rtlp)
set_attr(wv, attr_ruby_maxprep, rst.pre)
set_attr(wv, attr_ruby_maxpostp, rst.post)
set_attr(wv, attr_ruby_intergap, rst.intergap)
+ set_attr(wv, attr_ruby_baseheight, rst.baseheight)
set_attr(wv, attr_ruby_stretch, rst.stretch)
set_attr(wv, attr_ruby_mode, rst.mode)
local n = wv
@@ -309,11 +314,13 @@ end
----------------------------------------------------------------
-- r, p の中身のノードは再利用される
-local function enlarge_parent(r, p, ppre, pmid, ppost, mapre, mapost, intmode)
+local function enlarge_parent(r, p, tmp_tbl, intmode)
-- r: ルビ部分の格納された box,p: 同,親文字
local rwidth = getfield(r, 'width')
local sumprot = rwidth - getfield(p, 'width') -- >0
local pre_intrusion, post_intrusion
+ local ppre, pmid, ppost = tmp_tbl.ppre, tmp_tbl.pmid, tmp_tbl.ppost
+ local mapre, mapost = tmp_tbl.mapre, tmp_tbl.mapost
if intmode == 0 then -- とりあえず組んでから決める
p = enlarge(p, rwidth, ppre, pmid, ppost, 0, 0)
pre_intrusion = min(mapre, round(ppre*getfield(p, 'glue_set')*65536))
@@ -349,17 +356,19 @@ end
-- ルビボックスの生成(単一グループ)
-- returned value: <new box>, <ruby width>, <post_intrusion>
local max_margin
-local function new_ruby_box(r, p, ppre, pmid, ppost,
- mapre, mapost, imode, rgap)
+local function new_ruby_box(r, p, tmp_tbl)
local post_intrusion = 0
- local intmode = imode%4
+ local imode
+ local ppre, pmid, ppost = tmp_tbl.ppre, tmp_tbl.pmid, tmp_tbl.ppost
+ local mapre, mapost = tmp_tbl.mapre, tmp_tbl.mapost
local rpre, rmid, rpost, rsmash
- imode = floor(imode/262144); rsmash = (imode%2 ==1)
+ imode = floor(tmp_tbl.imode/0x100000); rsmash = (imode%2 ==1)
imode = floor(imode/2); rpost = imode%8;
imode = (imode-rpost)/8; rmid = imode%8;
imode = (imode-rmid)/8; rpre = imode%8
if getfield(r, 'width') > getfield(p, 'width') then -- change the width of p
- r, p, post_intrusion = enlarge_parent(r, p, ppre, pmid, ppost, mapre, mapost, intmode)
+ r, p, post_intrusion = enlarge_parent(r, p, tmp_tbl,
+ floor(tmp_tbl.imode/4)%4)
elseif getfield(r, 'width') < getfield(p, 'width') then -- change the width of r
r = enlarge(r, getfield(p, 'width'), rpre, rmid, rpost, 0, 0)
post_intrusion = 0
@@ -383,9 +392,10 @@ local function new_ruby_box(r, p, ppre, pmid, ppost,
end
local a, k = node_new(id_rule), node_new(id_kern, 1)
setfield(a, 'width', 0); setfield(a, 'height', 0)
- setfield(a, 'depth', 0); setfield(k, 'kern', rgap)
+ setfield(a, 'depth', 0); setfield(k, 'kern', tmp_tbl.rgap)
insert_after(r, r, a); insert_after(r, a, k);
insert_after(r, k, p); setfield(p, 'next', nil)
+ if tmp_tbl.bheight >= 0 then setfield(p, 'height', tmp_tbl.bheight) end
a = node.direct.vpack(r); setfield(a, 'shift', 0)
set_attr(a, attr_ruby, post_intrusion)
if rsmash or getfield(a, 'height')<getfield(p, 'height') then
@@ -406,7 +416,10 @@ local max_allow_pre, max_allow_post
-- 中付き熟語ルビ,cmp containers
-- 「文字の構成を考えた」やつはどうしよう
-local function pre_low_cal_box(w, cmp)
+local pre_low_cal_box
+do
+local tmp_tbl = {}
+pre_low_cal_box = function (w, cmp)
local rb = {}
local pb = {}
local kf = {}
@@ -417,11 +430,14 @@ local function pre_low_cal_box(w, cmp)
local mdt -- nt*: node temp
local coef = {} -- 連立一次方程式の拡大係数行列
local rtb = expand_3bits(has_attr(wv, attr_ruby_stretch))
- local rgap = has_attr(wv, attr_ruby_intergap)
- local intmode = floor(has_attr(wv, attr_ruby_mode)/4)
+ tmp_tbl.rgap = has_attr(wv, attr_ruby_intergap)
+ tmp_tbl.imode = has_attr(wv, attr_ruby_mode)
+ tmp_tbl.bheight = has_attr(wv, attr_ruby_baseheight)
-- node list 展開・行末形の計算
local nt, nta, ntb = wv, nil, nil -- nt*: node temp
+ tmp_tbl.ppre, tmp_tbl.pmid, tmp_tbl.ppost = rtb[6], rtb[5], rtb[4]
+ tmp_tbl.mapre, tmp_tbl.mapost = max_allow_pre, 0
for i = 1, cmp do
nt = node_next(nt); rb[i] = nt; nta = concat(nta, node_copy(nt))
nt = node_next(nt); pb[i] = nt; ntb = concat(ntb, node_copy(nt))
@@ -429,30 +445,31 @@ local function pre_low_cal_box(w, cmp)
for j = 1, 2*i do coef[i][j] = 1 end
for j = 2*i+1, 2*cmp+1 do coef[i][j] = 0 end
kf[i], coef[i][2*cmp+2]
- = new_ruby_box(node_copy(nta), node_copy(ntb),
- rtb[6], rtb[5], rtb[4], max_allow_pre, 0, intmode, rgap)
+ = new_ruby_box(node_copy(nta), node_copy(ntb), tmp_tbl)
end
node_free(nta); node_free(ntb)
-- 行頭形の計算
local nta, ntb = nil, nil
+ tmp_tbl.ppre, tmp_tbl.pmid, tmp_tbl.ppost = rtb[9], rtb[8], rtb[7]
+ tmp_tbl.mapre, tmp_tbl.mapost = 0, max_allow_post
for i = cmp,1,-1 do
coef[cmp+i] = {}
for j = 1, 2*i-1 do coef[cmp+i][j] = 0 end
for j = 2*i, 2*cmp+1 do coef[cmp+i][j] = 1 end
nta = concat(node_copy(rb[i]), nta); ntb = concat(node_copy(pb[i]), ntb)
kf[cmp+i], coef[cmp+i][2*cmp+2]
- = new_ruby_box(node_copy(nta), node_copy(ntb),
- rtb[9], rtb[8], rtb[7], 0, max_allow_post, intmode, rgap)
+ = new_ruby_box(node_copy(nta), node_copy(ntb), tmp_tbl)
end
-- ここで,nta, ntb には全 container を連結した box が入っているので
-- それを使って行中形を計算する.
coef[2*cmp+1] = {}
for j = 1, 2*cmp+1 do coef[2*cmp+1][j] = 1 end
+ tmp_tbl.ppre, tmp_tbl.pmid, tmp_tbl.ppost = rtb[3], rtb[2], rtb[1]
+ tmp_tbl.mapre, tmp_tbl.mapost = max_allow_pre, max_allow_post
kf[2*cmp+1], coef[2*cmp+1][2*cmp+2], post_intrusion_backup
- = new_ruby_box(nta, ntb, rtb[3], rtb[2], rtb[1],
- max_allow_pre, max_allow_post, intmode, rgap)
+ = new_ruby_box(nta, ntb, tmp_tbl)
-- w.value の node list 更新.
local nt = wv
@@ -466,6 +483,7 @@ local function pre_low_cal_box(w, cmp)
end
return coef
end
+end
local first_whatsit
do
@@ -558,9 +576,7 @@ do
local id = has_attr(wv, attr_ruby_id)
if id>0 and cache_handle then
cache_handle:write(
- 'luatexja.ruby.old_break_info['
- .. tostring(id) .. ']=' .. num
- .. '\n')
+ 'lrob[' .. tostring(id) .. ']=' .. num .. '\n')
end
end
@@ -736,6 +752,11 @@ do
insert_before(Nq.nuc, Np.first, last_glue)
Np.first = last_glue
next_cluster_array[Nq.nuc] = last_glue -- ルビ処理用のグルー
+-- if Nq.gk then
+-- if type(Nq.gk)=="table" then
+-- for _,v in ipairs(Nq.gk) do luatexja.ext_show_node(node.direct.tonode(v), 'BBt> ', print) end
+-- else luatexja.ext_show_node(node.direct.tonode(Nq.gk), 'BBB> ', print) end
+-- end
end
local nqnv = getfield(Nq.nuc, 'value')
local x = node_next(node_next(nqnv))
@@ -779,4 +800,15 @@ do
luatexbase.add_to_callback("luatexja.jfmglue.whatsit_after", whatsit_after_callback,
"luatexja.ruby.np_info_after", 1)
end
+if false then -- いまは off
+ local function w (s, Nq, Np)
+ if Np.gk then
+ if type(Np.gk)=="table" then
+ for _,v in ipairs(Np.gk) do luatexja.ext_show_node(node.direct.tonode(v), 'AAt> ', print) end
+ else luatexja.ext_show_node(node.direct.tonode(Np.gk), 'AAA> ', print) end
+ end
+ end
+ luatexbase.add_to_callback("luatexja.jfmglue.whatsit_last_minute", w,
+ "luatexja.ruby.np_info_last_minute", 1)
+end