summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua')
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua75
1 files changed, 57 insertions, 18 deletions
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua
index 3477b09c893..93e92ab5dec 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua
@@ -3,7 +3,7 @@
--
luatexbase.provides_module({
name = 'luatexja.jfmglue',
- date = '2016/04/03',
+ date = '2017/05/05',
description = 'Insertion process of JFM glues and kanjiskip',
})
module('luatexja.jfmglue', package.seeall)
@@ -28,22 +28,28 @@ local getfont = node.direct.getfont
local getlist = node.direct.getlist
local getchar = node.direct.getchar
local getsubtype = node.direct.getsubtype
-
+local if_lang_ja
+do
+ local lang_ja = luatexja.lang_ja
+ local getlang = node.direct.getlang
+ if_lang_ja = getlang
+ and function (n) return getlang(n)==lang_ja end
+ or function (n) return getfield(n,'lang')==lang_ja end
+end
+
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 node_next = node.direct.getnext
-local round = tex.round
local ltjd_make_dir_whatsit = ltjd.make_dir_whatsit
local ltjf_font_metric_table = ltjf.font_metric_table
local ltjf_find_char_class = ltjf.find_char_class
local node_new = node.direct.new
local node_copy = node.direct.copy
-local node_remove = node.direct.remove
local node_tail = node.direct.tail
local node_free = node.direct.free
-local node_end_of_math = node.direct.end_of_math
+local node_remove = node.direct.remove
local id_glyph = node.id('glyph')
local id_hlist = node.id('hlist')
@@ -64,12 +70,6 @@ local id_box_like = 256 -- vbox, shifted hbox
local id_pbox = 257 -- already processed nodes (by \unhbox)
local id_pbox_w = 258 -- cluster which consists of a whatsit
local sid_user = node.subtype('user_defined')
-local lang_ja = luatexja.lang_ja
-
-local sid_start_link = node.subtype('pdf_start_link')
-local sid_start_thread = node.subtype('pdf_start_thread')
-local sid_end_link = node.subtype('pdf_end_link')
-local sid_end_thread = node.subtype('pdf_end_thread')
local ITALIC = luatexja.icflag_table.ITALIC
local PACKED = luatexja.icflag_table.PACKED
@@ -235,7 +235,7 @@ function check_box_high(Nx, box_ptr, box_end)
local first_char = first_char
if first_char then
if getid(first_char)==id_glyph then
- if getfield(first_char, 'lang') == lang_ja then
+ if if_lang_ja(first_char) then
set_np_xspc_jachar_hbox(Nx, first_char)
else
set_np_xspc_alchar(Nx, getchar(first_char),first_char, 1)
@@ -304,7 +304,7 @@ local min, max = math.min, math.max
local function calc_np_aux_glyph_common(lp, acc_flag)
Np.nuc = lp
Np.first= (Np.first or lp)
- if getfield(lp, 'lang') == lang_ja then
+ if if_lang_ja(lp) then
Np.id = id_jglyph
local m, mc, cls = set_np_xspc_jachar(Np, lp)
local npi, npf
@@ -329,7 +329,7 @@ local function calc_np_aux_glyph_common(lp, acc_flag)
lp=lx; break
else
local lid = getid(lx)
- if lid==id_glyph and getfield(lx, 'lang') ~= lang_ja then
+ if lid==id_glyph and not if_lang_ja(lx) then
-- 欧文文字
last_glyph = lx; set_attr(lx, attr_icflag, PROCESSED); Np.last = lx
y_adjust = has_attr(lx,attr_ablshift) or 0
@@ -397,7 +397,12 @@ local function calc_np_aux_glyph_common(lp, acc_flag)
end
local calc_np_auxtable
do
+local node_end_of_math = node.direct.end_of_math
local dir_tate = luatexja.dir_table.dir_tate
+local sid_start_link = node.subtype('pdf_start_link')
+local sid_start_thread = node.subtype('pdf_start_thread')
+local sid_end_link = node.subtype('pdf_end_link')
+local sid_end_thread = node.subtype('pdf_end_thread')
calc_np_auxtable = {
[id_glyph] = calc_np_aux_glyph_common,
[id_hlist] = function(lp)
@@ -599,12 +604,11 @@ do
c = getchar(x)
Nx.pre = table_current_stack[PRE + c] or 0
Nx.post = table_current_stack[POST + c] or 0
- Nx.xspc = table_current_stack[XSP + c] or 3
else
Nx.pre, Nx.post = 0, 0
- Nx.xspc = table_current_stack[XSP - 1] or 3
end
Nx.met = nil
+ Nx.xspc = table_current_stack[XSP + c] or 3
Nx.auto_xspc = (has_attr(x, attr_autoxspc)==1)
end
local set_np_xspc_alchar = set_np_xspc_alchar
@@ -615,7 +619,7 @@ do
local s = Nx.last_char
if s then
if getid(s)==id_glyph then
- if getfield(s, 'lang') == lang_ja then
+ if if_lang_ja(s) then
set_np_xspc_jachar_hbox(Nx, s)
else
set_np_xspc_alchar(Nx, getchar(s), s, 2)
@@ -731,6 +735,7 @@ end
-------------------- 和文文字間空白量の決定
local calc_ja_ja_aux
do
+ local round = tex.round
local bg_ag = 2*id_glue - id_glue
local bg_ak = 2*id_glue - id_kern
local bk_ag = 2*id_kern - id_glue
@@ -1001,7 +1006,7 @@ end
-- (anything) .. (和文文字で始まる hlist)
local function handle_np_ja_hlist()
local qid = Nq.id
- if qid==id_jglyph or ((qid==id_pbox or Nq.id == id_pbox_w) and Nq.met) then
+ if qid==id_jglyph or ((qid==id_pbox or qid == id_pbox_w) and Nq.met) then
local g = non_ihb_flag and get_OB_skip(0) or get_kanjiskip() -- O_B->K
handle_penalty_normal(Nq.post, 0, g); real_insert(g)
elseif Nq.met then -- Nq.id==id_hlist
@@ -1205,6 +1210,7 @@ end
do
local IHB = luatexja.userid_table.IHB
local BPAR = luatexja.userid_table.BPAR
+ local BOXB = luatexja.userid_table.BOXB
local node_prev = node.direct.getprev
local node_write = node.direct.write
@@ -1227,11 +1233,32 @@ do
node_write(tn)
end
+ -- Node for indicating a head/end of a box
+ function create_boxbdd_node()
+ local tn = node_new(id_whatsit, sid_user)
+ setfield(tn, 'user_id', BOXB)
+ setfield(tn, 'type', 100)
+ setfield(tn, 'value', 1)
+ node_write(tn)
+ end
+
local function whatsit_callback(Np, lp, Nq)
if Np and Np.nuc then return Np
elseif Np and getfield(lp, 'user_id') == BPAR then
Np.first = lp; Np.nuc = lp; Np.last = lp
return Np
+ elseif Np and getfield(lp, 'user_id') == BOXB then
+ Np.first = lp; Np.nuc = lp; Np.last = lp
+ if Nq then
+ if Nq.met then
+ Np.class = fast_find_char_class('parbdd', Nq.met)
+ end
+ Np.met = Nq.met; Np.pre = 0; Np.post = 0; Np.xspc = 0
+ Np.auto_xspc = false
+ end
+ return Np
+ else
+ return Np
end
end
@@ -1247,6 +1274,18 @@ do
Nq.auto_xspc = false
end
head = node_remove(head, y)
+ node_free(y)
+ elseif not s and getfield(Nq.nuc, 'user_id') == BOXB then
+ local x, y = node_prev(Nq.nuc), Nq.nuc
+ Nq.first, Nq.nuc, Nq.last = x, x, x
+ if Np then
+ if Np.met then
+ Nq.class = fast_find_char_class('boxbdd', Np.met)
+ end
+ Nq.met = Np.met; Nq.pre = 0; Nq.post = 0; Nq.xspc = 0
+ Nq.auto_xspc = false
+ end
+ head = node_remove(head, y)
node_free(y)
end
return s