summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/luatex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2012-09-04 23:02:12 +0000
committerKarl Berry <karl@freefriends.org>2012-09-04 23:02:12 +0000
commita0fb1a4d69667793af3cff54f71b5c01ad5434c1 (patch)
tree636b1fb2eb001114988f35e3f2c676b39db6d4f7 /Master/texmf-dist/tex/luatex
parenta3298cd2a9d5a805dea61e95b0077e73470ab270 (diff)
luatexja (4sep12)
git-svn-id: svn://tug.org/texlive/trunk@27593 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/luatex')
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/jfm-ujis.lua2
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-base.sty2
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-charrange.lua28
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-inputbuf.lua25
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua746
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-jfont.lua64
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-math.lua14
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-otf.lua9
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-pretreat.lua64
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-setwidth.lua105
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-stack.lua28
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/luatexja-core.sty34
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/luatexja.lua35
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/patches/lltjfont.sty9
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings-jpt.tex75
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings.sty68
16 files changed, 700 insertions, 608 deletions
diff --git a/Master/texmf-dist/tex/luatex/luatexja/jfm-ujis.lua b/Master/texmf-dist/tex/luatex/luatexja/jfm-ujis.lua
index 4b984c56aa1..d2cd13b6d91 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/jfm-ujis.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/jfm-ujis.lua
@@ -30,7 +30,7 @@ luatexja.jfont.define_jfm {
[2] = { -- 閉じ括弧類
chars = {
'’', '”', '、', '〉', '》', '」', '』', '】', '〕',
- '〗', '〙', '〟', ')', ',', ']', '}', '⦆'
+ '〗', '〙', '〟', ')', ',*', ']', '}', '⦆',
},
align = 'left', left = 0.0, down = 0.0,
width = 0.5, height = 0.88, depth = 0.12, italic=0.0,
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-base.sty b/Master/texmf-dist/tex/luatex/luatexja/ltj-base.sty
index a69fcb63e80..17f69a86878 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-base.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-base.sty
@@ -19,7 +19,7 @@
%%------------------ Tiny helpers
%% Registers
-\newcount\ltj@tempcnta
+%\newcount\ltj@tempcnta % defined at luatexja-core.sty
\newcount\ltj@tempcntb
\newcount\ltj@tempcntc
\newdimen\ltj@tempdima
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-charrange.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-charrange.lua
index 6d7f5c32023..d976cb3debd 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-charrange.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-charrange.lua
@@ -13,7 +13,15 @@ local err, warn, info, log = luatexbase.errwarinf(_NAME)
luatexja.load_module('base'); local ltjb = luatexja.base
local floor = math.floor
+local pow = math.pow
local has_attr = node.has_attribute
+local kcat_attr_table = {}
+local pow_table = {}
+for i = 0, 216 do
+ kcat_attr_table[i] = luatexbase.attributes['ltj@kcat'..floor(i/31)]
+ pow_table[i] = pow(2, i%31)
+end
+pow_table[217] = pow(2, 31)
-- jcr_table_main[chr_code] = index
-- index : internal 0, 1, 2, ..., 216 0: 'other'
@@ -54,27 +62,22 @@ function char_to_range(c) -- return the (external) range number
'So I changed this one to zero.'})
c=0
elseif c<0x80 then return -1
- else
- local i = jcr_table_main[c] or 0
- if i==0 then return 217 else return i end
- end
+ else return jcr_table_main[c] or 0 end
end
function get_range_setting(i) -- i: internal range number
- return floor(tex.getattribute(
- luatexbase.attributes['ltj@kcat'..floor(i/31)])
- /math.pow(2, i%31))%2
+ return floor(tex.getattribute(kcat_attr_table[i])/pow_table[i])%2
end
-- glyph_node p は和文文字か?
function is_ucs_in_japanese_char(p)
local c = p.char
- if c<0x80 then return false
+ if c<0x80 then
+ return false
else
local i=jcr_table_main[c]
return (floor(
- has_attr(p, luatexbase.attributes['ltj@kcat'..floor(i/31)])
- /math.pow(2, i%31))%2 ~= jcr_noncjk)
+ has_attr(p, kcat_attr_table[i])/pow_table[i])%2 ~= jcr_noncjk)
end
end
@@ -89,10 +92,9 @@ function toggle_char_range(g, i) -- i: external range number
local kc
if i>0 then kc=0 else kc=1; i=-i end
if i>216 then i=0 end
- local attr = luatexbase.attributes['ltj@kcat'..floor(i/31)]
+ local attr = kcat_attr_table[i]
local a = tex.getattribute(attr)
- local k = math.pow(2, i%31)
- tex.setattribute(g,attr,(floor(a/k/2)*2+kc)*k+a%k)
+ tex.setattribute(g,attr,(floor(a/pow_table[i+1])*2+kc)*pow_table[i]+a%pow_table[i])
end
end
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-inputbuf.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-inputbuf.lua
index 6032b5067bf..d23d21c8648 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-inputbuf.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-inputbuf.lua
@@ -15,6 +15,7 @@ luatexja.load_module('charrange'); local ltjc = luatexja.charrange
local node_new = node.new
local id_glyph = node.id('glyph')
local getcatcode = tex.getcatcode
+local ltjc_is_ucs_in_japanese_char = ltjc.is_ucs_in_japanese_char
--- the following function is modified from jafontspec.lua (by K. Maeda).
--- Instead of "%", we use U+FFFFF for suppressing spaces.
@@ -26,18 +27,20 @@ function add_comment(buffer)
end
if i>0 then
local c = utf.byte(buffer, i)
- local ct = getcatcode(c)
- local te = tex.endlinechar
- local ctl = (te ~= -1) and (getcatcode(te)==5) and (getcatcode(0xFFFFF)==14)
- -- Is the catcode of endline character is 5 (end-of-line)?
- -- Is the catcode of U+FFFFF (new comment char) is 14 (comment)?
- if ((ct==11) or (ct==12)) and ctl then
- local p = node_new(id_glyph)
- p.char = c
- if ltjc.is_ucs_in_japanese_char(p) then
- buffer = buffer .. string.char(0xF3,0xBF,0xBF,0xBF) -- U+FFFFF
+ if c>0x80 then
+ local ct = getcatcode(c)
+ local te = tex.endlinechar
+ local ctl = (te ~= -1) and (getcatcode(te)==5) and (getcatcode(0xFFFFF)==14)
+ -- Is the catcode of endline character is 5 (end-of-line)?
+ -- Is the catcode of U+FFFFF (new comment char) is 14 (comment)?
+ if ((ct==11) or (ct==12)) and ctl then
+ local p = node_new(id_glyph)
+ p.char = c
+ if ltjc_is_ucs_in_japanese_char(p) then
+ buffer = buffer .. string.char(0xF3,0xBF,0xBF,0xBF) -- U+FFFFF
+ end
+ node.free(p)
end
- node.free(p)
end
end
return buffer
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua
index be9515e57fa..fdf878eb919 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua
@@ -3,33 +3,30 @@
--
luatexbase.provides_module({
name = 'luatexja.jfmglue',
- date = '2012/04/25',
- version = '0.4',
+ date = '2012/07/19',
+ version = '0.5',
description = 'Insertion process of JFM glues and kanjiskip',
})
module('luatexja.jfmglue', package.seeall)
local err, warn, info, log = luatexbase.errwarinf(_NAME)
-luatexja.load_module('base'); local ltjb = luatexja.base
luatexja.load_module('stack'); local ltjs = luatexja.stack
luatexja.load_module('jfont'); local ltjf = luatexja.jfont
luatexja.load_module('pretreat'); local ltjp = luatexja.pretreat
-local node_type = node.type
-local node_new = node.new
-local node_remove = node.remove
-local node_prev = node.prev
-local node_next = node.next
-local node_copy = node.copy
-local node_tail = node.tail
-local node_free = node.free
local has_attr = node.has_attribute
local set_attr = node.set_attribute
-local node_insert_before = node.insert_before
-local node_insert_after = node.insert_after
+local insert_before = node.insert_before
+local node_next = node.next
local round = tex.round
-local table_insert = table.insert
-local uniq_id = 0 -- unique id
+local ltjs_fast_get_penalty_table = ltjs.fast_get_penalty_table
+local ltjf_font_metric_table = ltjf.font_metric_table
+local ltjf_find_char_class = ltjf.find_char_class
+local node_new = node.new
+local node_copy = node.copy
+
+local ligature_head = 1
+local ligature_tail = 2
local id_glyph = node.id('glyph')
local id_hlist = node.id('hlist')
@@ -67,31 +64,31 @@ local XKANJI_SKIP = 7
local PROCESSED = 8
local IC_PROCESSED = 9
local BOXBDD = 15
+local PROCESSED_BEGIN_FLAG = 16
local kanji_skip
local xkanji_skip
-local attr_jchar_class = luatexbase.attributes['ltj@charclass']
+local attr_orig_char = luatexbase.attributes['ltj@origchar']
local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
local attr_icflag = luatexbase.attributes['ltj@icflag']
local attr_autospc = luatexbase.attributes['ltj@autospc']
local attr_autoxspc = luatexbase.attributes['ltj@autoxspc']
-local attr_uniqid = luatexbase.attributes['ltj@uniqid']
local max_dimen = 1073741823
-local ltjs_get_penalty_table = ltjs.get_penalty_table
-local ltjs_get_skip_table = ltjs.get_skip_table
-local ltjf_find_char_class = ltjf.find_char_class
-local ltjf_font_metric_table = ltjf.font_metric_table
-local ltjf_metrics = ltjf.metrics
-local box_stack_level
-local par_indented -- is the paragraph indented?
+local function get_attr_icflag(p)
+ return (has_attr(p, attr_icflag) or 0)%PROCESSED_BEGIN_FLAG
+end
-------------------- Helper functions
+local function copy_attr(new, old)
+ -- 仕様が決まるまで off にしておく
+end
+
-- This function is called only for acquiring `special' characters.
local function fast_find_char_class(c,m)
- return m.chars[c] or 0
+ return m.size_cache.chars[c] or 0
end
local spec_zero_glue = node_new(id_glue_spec)
@@ -103,13 +100,13 @@ local function get_zero_spec()
end
local function skip_table_to_spec(n)
- local g = node_new(id_glue_spec)
- local st = ltjs_get_skip_table(n, box_stack_level)
+ local g, st = node_new(id_glue_spec), ltjs.fast_get_skip_table(n)
g.width = st.width; g.stretch = st.stretch; g.shrink = st.shrink
g.stretch_order = st.stretch_order; g.shrink_order = st.shrink_order
return g
end
+
-- penalty 値の計算
local function add_penalty(p,e)
if p.penalty>=10000 then
@@ -127,7 +124,7 @@ end
-- 「異なる JFM」の間の調整方法
diffmet_rule = math.two_average
function math.two_add(a,b) return a+b end
-function math.two_average(a,b) return (a+b)/2 end
+function math.two_average(a,b) return (a+b)*0.5 end
-------------------- idea
-- 2 node の間に glue/kern/penalty を挿入する.
@@ -162,8 +159,6 @@ function math.two_average(a,b) return (a+b)/2 end
-- *: jfm glue はここに入る
local head -- the head of current list
-local last -- the last node of current list
-local lp -- 外側での list 走査時のカーソル
local Np, Nq, Bp
local widow_Bp, widow_Np -- \jcharwidowpenalty 挿入位置管理用
@@ -183,13 +178,9 @@ local function check_box(box_ptr, box_end)
end
while p and p~=box_end do
local pid = p.id
- if pid==id_kern then
- if p.subtype==2 then
- p = node_next(node_next(node_next(p))); pid = p.id
- elseif has_attr(p, attr_icflag)==IC_PROCESSED then
- p = node_next(p); pid = p.id
- end
- end
+ if pid==id_kern and p.subtype==2 then
+ p = node_next(node_next(node_next(p))); pid = p.id -- p must be glyph_node
+ end
if pid==id_glyph then
repeat
if find_first_char then
@@ -198,16 +189,16 @@ local function check_box(box_ptr, box_end)
last_char = p; found_visible_node = true; p=node_next(p)
if (not p) or p==box_end then return found_visible_node end
until p.id~=id_glyph
- pid = p.id
+ pid = p.id -- p must be non-nil
end
- if pid==id_hlist then
- if has_attr(p, attr_icflag)==PACKED then
- for q in node.traverse_id(id_glyph, p.head) do
- if find_first_char then
- first_char = q; find_first_char = false
- end
- last_char = q; found_visible_node = true; break
+ if pid==id_kern and get_attr_icflag(p)==IC_PROCESSED then
+ p = node_next(p);
+ elseif pid==id_hlist then
+ if PACKED == get_attr_icflag(p) then
+ if find_first_char then
+ first_char = p.head; find_first_char = false
end
+ last_char = p.head; found_visible_node = true
else
if p.shift==0 then
if check_box(p.head, nil) then found_visible_node = true end
@@ -250,272 +241,251 @@ end
-------------------- Np の計算と情報取得
luatexbase.create_callback("luatexja.jfmglue.whatsit_getinfo", "data",
- function (Np, lp, Nq, box_stack_level)
- if Np.nuc then return Np
- else
- return Np -- your code
- end
- end)
+ function (Np, lp, Nq)
+ if Np.nuc then return Np
+ else
+ return Np -- your code
+ end
+ end)
luatexbase.create_callback("luatexja.jfmglue.whatsit_after", "data",
- function (stat, Nq, Np, box_stack_level) return false end)
+ function (stat, Nq, Np) return false end)
-- calc next Np
+do
+
local function set_attr_icflag_processed(p)
- local a = has_attr(p, attr_icflag) or 0
- if a<= ITALIC then
- set_attr(p, attr_uniqid, uniq_id)
+ if get_attr_icflag(p)<= ITALIC then
set_attr(p, attr_icflag, PROCESSED)
end
end
-local function check_next_ickern()
- if lp.id == id_kern and has_attr(lp, attr_icflag)==ITALIC then
- set_attr(lp, attr_icflag, IC_PROCESSED)
- set_attr(lp, attr_uniqid, uniq_id)
- Np.last = lp; lp = node_next(lp)
- else Np.last = Np.nuc end
+local function check_next_ickern(lp)
+ if lp.id == id_kern and ITALIC == get_attr_icflag(lp) then
+ set_attr(lp, attr_icflag, IC_PROCESSED)
+ Np.last = lp; return node_next(lp)
+ else
+ Np.last = Np.nuc; return lp
+ end
end
-local function calc_np_pbox()
- local uid = has_attr(lp, attr_uniqid)
+local function calc_np_pbox(lp, last)
Np.first = Np.first or lp; Np.id = id_pbox
- lpa = KINSOKU -- dummy=
- while lp~=last and lpa>=PACKED and lpa~=BOXBDD
- and has_attr(lp, attr_uniqid) == uid do
- Np.nuc = lp; set_attr(lp, attr_uniqid, uniq_id)
- lp = node_next(lp); lpa = has_attr(lp, attr_icflag) or 0
+ local lpa = KINSOKU -- dummy=
+ set_attr(lp, attr_icflag, get_attr_icflag(lp));
+ while lp~=last and lpa>=PACKED and lpa<BOXBDD do
+ Np.nuc = lp;
+ lp = node_next(lp); lpa = has_attr(lp, attr_icflag)
+ -- get_attr_icflag() ではいけない!
end
- check_next_ickern()
+ return check_next_ickern(lp)
end
+
local calc_np_auxtable = {
- [id_glyph] = function()
- Np.first = Np.first or lp
- if lp.font == has_attr(lp, attr_curjfnt) then
- Np.id = id_jglyph
- else
- Np.id = id_glyph
- end
- Np.nuc = lp; set_attr_icflag_processed(lp)
- lp = node_next(lp); check_next_ickern(); return true
+ [id_glyph] = function (lp)
+ Np.first, Np.nuc = (Np.first or lp), lp;
+ Np.id = (lp.font == has_attr(lp, attr_curjfnt)) and id_jglyph or id_glyph
+ --set_attr_icflag_processed(lp) treated in ltj-setwidth.lua
+ return true, check_next_ickern(node_next(lp));
end,
- [id_hlist] = function()
+ [id_hlist] = function(lp)
Np.first = Np.first or lp; Np.last = lp; Np.nuc = lp;
set_attr_icflag_processed(lp)
- if lp.shift~=0 then
- Np.id = id_box_like
- else
- Np.id = id_hlist
- end
- lp = node_next(lp); return true
+ Np.id = (lp.shift~=0) and id_box_like or id_hlist
+ return true, node_next(lp)
end,
- [id_vlist] = function()
- Np.first = Np.first or lp; Np.nuc = lp; Np.last = lp;
- Np.id = id_box_like; set_attr_icflag_processed(lp);
- lp = node_next(lp); return true
- end,
- [id_rule] = function()
- Np.first = Np.first or lp; Np.nuc = lp; Np.last = lp;
- Np.id = id_box_like; set_attr_icflag_processed(lp);
- lp = node_next(lp); return true
- end,
- [id_ins] = function()
- set_attr_icflag_processed(lp); lp = node_next(lp)
- return false
+ box_like = function(lp)
+ Np.first = Np.first or lp; Np.nuc = lp; Np.last = lp;
+ Np.id = id_box_like; set_attr_icflag_processed(lp);
+ return true, node_next(lp);
end,
- [id_mark] = function()
- set_attr_icflag_processed(lp); lp = node_next(lp)
- return false
- end,
- [id_adjust] = function()
- set_attr_icflag_processed(lp); lp = node_next(lp)
- return false
- end,
- [id_disc] = function()
- Np.first = Np.first or lp;
- Np.nuc = lp; set_attr_icflag_processed(lp);
- Np.last = lp; Np.id = id_disc; lp = node_next(lp); return true
- end,
- [id_whatsit] = function()
+ skip = function(lp)
+ set_attr_icflag_processed(lp); return false, node_next(lp)
+ end,
+ [id_whatsit] = function(lp)
if lp.subtype==sid_user then
if lp.user_id==30111 then
- local lq = node_next(lp)
- head = node_remove(head, lp); node_free(lp); lp = lq; ihb_flag = true
+ local lq = node_next(lp);
+ head = node.remove(head, lp); node.free(lp); ihb_flag = true
+ return false, lq;
else
set_attr_icflag_processed(lp)
- luatexbase.call_callback("luatexja.jfmglue.whatsit_getinfo"
- , Np, lp, Nq, box_stack_level)
- lp = node_next(lp)
+ luatexbase.call_callback("luatexja.jfmglue.whatsit_getinfo",
+ Np, lp, Nq)
if Np.nuc then
- Np.id = id_pbox_w; Np.first = Np.nuc; Np.last = Np.nuc; return true
+ Np.id = id_pbox_w; Np.first = Np.nuc; Np.last = Np.nuc;
+ return true, node_next(lp)
+ else
+ return false, node_next(lp)
end
end
else
- -- we do special treatment for these whatsit nodes.
- if lp.subtype == sid_start_link or lp.subtype == sid_start_thread then
- Np.first = lp
- elseif lp.subtype == sid_end_link or lp.subtype == sid_end_thread then
- Nq.last = lp; Np.first = nil
- end
- set_attr_icflag_processed(lp); lp = node_next(lp)
+ -- we do special treatment for these whatsit nodes.
+ if lp.subtype == sid_start_link or lp.subtype == sid_start_thread then
+ Np.first = lp
+ elseif lp.subtype == sid_end_link or lp.subtype == sid_end_thread then
+ Np.first, Nq.last = nil, lp;
+ end
+ set_attr_icflag_processed(lp); return false, node_next(lp)
end
- return false
end,
- [id_math] = function()
- Np.first = Np.first or lp; Np.nuc = lp;
+ [id_math] = function(lp)
+ Np.first, Np.nuc = (Np.first or lp), lp;
set_attr_icflag_processed(lp); lp = node_next(lp)
while lp.id~=id_math do
set_attr_icflag_processed(lp); lp = node_next(lp)
end
set_attr_icflag_processed(lp);
- Np.last = lp; Np.id = id_math; lp = node_next(lp);
- return true
+ Np.last, Np.id = lp, id_math;
+ return true, node_next(lp);
end,
- [id_glue] = function()
- Np.first = Np.first or lp; Np.nuc = lp; set_attr_icflag_processed(lp);
- Np.last = lp; Np.id = id_glue; lp = node_next(lp); return true
+ discglue = function(lp)
+ Np.first, Np.nuc, Np.last = (Np.first or lp), lp, lp;
+ Np.id = lp.id; set_attr_icflag_processed(lp); return true, node_next(lp)
end,
- [id_kern] = function()
+ [id_kern] = function(lp)
Np.first = Np.first or lp
if lp.subtype==2 then
set_attr_icflag_processed(lp); lp = node_next(lp)
set_attr_icflag_processed(lp); lp = node_next(lp)
set_attr_icflag_processed(lp); lp = node_next(lp)
set_attr_icflag_processed(lp); Np.nuc = lp
- if lp.font == has_attr(lp, attr_curjfnt) then
- Np.id = id_jglyph
- else
- Np.id = id_glyph
- end
- lp = node_next(lp); check_next_ickern();
+ Np.id = (lp.font == has_attr(lp, attr_curjfnt)) and id_jglyph or id_glyph
+ return true, check_next_ickern(node_next(lp));
else
Np.id = id_kern; set_attr_icflag_processed(lp);
- Np.last = lp; lp = node_next(lp)
+ Np.last = lp; return true, node_next(lp)
end
- return true
end,
- [id_penalty] = function()
+ [id_penalty] = function(lp)
Bp[#Bp+1] = lp; set_attr_icflag_processed(lp);
- lp = node_next(lp); return false
+ return false, node_next(lp)
end,
- [13] = function()
- Np.first = Np.first or lp; Np.nuc = lp; Np.last = lp;
- Np.id = id_box_like; set_attr_icflag_processed(lp);
- lp = node_next(lp); return true
- end,
}
-
-local function calc_np()
+calc_np_auxtable[id_vlist] = calc_np_auxtable.box_like
+calc_np_auxtable[id_rule] = calc_np_auxtable.box_like
+calc_np_auxtable[13] = calc_np_auxtable.box_like
+calc_np_auxtable[id_ins] = calc_np_auxtable.skip
+calc_np_auxtable[id_mark] = calc_np_auxtable.skip
+calc_np_auxtable[id_adjust] = calc_np_auxtable.skip
+calc_np_auxtable[id_disc] = calc_np_auxtable.discglue
+calc_np_auxtable[id_glue] = calc_np_auxtable.discglue
+
+local pairs = pairs
+function calc_np(lp, last)
+ local k
-- We assume lp = node_next(Np.last)
- local lpi, lpa, Nr
- Nr = Nq; for k in pairs(Nr) do Nr[k] = nil end
- Nq = Np; Np = Nr
- for k in pairs(Bp) do Bp[k] = nil end
- ihb_flag = false
+ Np, Nq, ihb_flag = Nq, Np, false
+ -- We clear `predefined' entries of Np before pairs() loop,
+ -- because using only pairs() loop is slower.
+ Np.post, Np.pre, Np.xspc = nil, nil, nil
+ Np.first, Np.id, Np.last, Np.lend, Np.met = nil, nil, nil, nil
+ Np.auto_kspc, Np.auto_xspc, Np.char, Np.class, Np.nuc = nil, nil, nil, nil, nil
+ for k in pairs(Np) do Np[k] = nil end
+
+ for k = 1,#Bp do Bp[k] = nil end
while lp ~= last do
- lpa = has_attr(lp, attr_icflag) or 0
+ local lpa = has_attr(lp, attr_icflag) or 0
+ -- unbox 由来ノードの検出
if lpa>=PACKED then
if lpa == BOXBDD then
- local lq = node_next(lp)
- head = node_remove(head, lp); node_free(lp); lp = lq
- else calc_np_pbox(); return
+ local lq = node_next(lp)
+ head = node.remove(head, lp); node.free(lp); lp = lq
+ else return calc_np_pbox(lp, last)
end -- id_pbox
- elseif calc_np_auxtable[lp.id]() then return end
+ else
+ k, lp = calc_np_auxtable[lp.id](lp)
+ if k then return lp end
+ end
end
- Np = nil; return
+ Np = nil; return lp
+end
+
end
+local calc_np = calc_np
-- extract informations from Np
-- We think that "Np is a Japanese character" if Np.met~=nil,
-- "Np is an alphabetic character" if Np.pre~=nil,
-- "Np is not a character" otherwise.
+do
-- 和文文字のデータを取得
-function set_np_xspc_jachar(Nx, x)
- local z = ltjf_font_metric_table[x.font]
- local c = x.char
- local cls = ltjf_find_char_class(c, z)
- local m = ltjf_metrics[z.jfm]
- set_attr(x, attr_jchar_class, cls)
- Nx.class = cls
- Nx.char = c
- Nx.size= z.size
- Nx.met = m
- Nx.var = z.var
- Nx.pre = ltjs_get_penalty_table('pre', c, 0, box_stack_level)
- Nx.post = ltjs_get_penalty_table('post', c, 0, box_stack_level)
- z = fast_find_char_class('lineend', m)
- local y = m.size_cache[Nx.size].char_type[Nx.class]
- if y.kern and y.kern[z] then
- Nx.lend = y.kern[z]
- else
- Nx.lend = 0
- end
- y = ltjs_get_penalty_table('xsp', c, 3, box_stack_level)
- Nx.xspc_before = (y%2==1)
- Nx.xspc_after = (y>=2)
- Nx.auto_kspc = (has_attr(x, attr_autospc)==1)
- Nx.auto_xspc = (has_attr(x, attr_autoxspc)==1)
-end
+ local attr_jchar_class = luatexbase.attributes['ltj@charclass']
+ function set_np_xspc_jachar(Nx, x)
+ local m = ltjf_font_metric_table[x.font]
+ local c = has_attr(x, attr_orig_char) or x.char
+ local cls = ltjf_find_char_class(x.char, m)
+ if c ~= x.char and cls==0 then cls = ltjf_find_char_class(-c, m) end
+ Nx.class = cls; set_attr(x, attr_jchar_class, cls)
+ Nx.lend = m.size_cache.char_type[cls].kern[fast_find_char_class('lineend', m)] or 0
+ Nx.met, Nx.var, Nx.char = m, m.var, c
+ Nx.pre = ltjs_fast_get_penalty_table('pre', c) or 0
+ Nx.post = ltjs_fast_get_penalty_table('post', c) or 0
+ Nx.xspc = ltjs_fast_get_penalty_table('xsp', c) or 3
+ Nx.auto_kspc, Nx.auto_xspc = (has_attr(x, attr_autospc)==1), (has_attr(x, attr_autoxspc)==1)
+ end
+ local set_np_xspc_jachar = set_np_xspc_jachar
-- 欧文文字のデータを取得
-local ligature_head = 1
-local ligature_tail = 2
-function set_np_xspc_alchar(Nx, c,x, lig)
- if c~=-1 then
- if lig == ligature_head then
- while x.components and x.subtype and math.floor(x.subtype/2)%2==1 do
- x = x.components; c = x.char
+ local floor = math.floor
+ function set_np_xspc_alchar(Nx, c,x, lig)
+ if c~=-1 then
+ if lig == ligature_head then
+ while x.components and x.subtype and math.floor(x.subtype*0.5)%2==1 do
+ x = x.components; c = x.char
+ end
+ else
+ while x.components and x.subtype and math.floor(x.subtype*0.5)%2==1 do
+ x = node.tail(x.components); c = x.char
+ end
end
+ Nx.pre = ltjs_fast_get_penalty_table('pre', c) or 0
+ Nx.post = ltjs_fast_get_penalty_table('post', c) or 0
+ Nx.char = 'jcharbdd'
else
- while x.components and x.subtype and math.floor(x.subtype/2)%2==1 do
- x = node_tail(x.components); c = x.char
- end
+ Nx.pre, Nx.post, Nx.char = 0, 0, -1
end
- Nx.pre = ltjs_get_penalty_table('pre', c, 0, box_stack_level)
- Nx.post = ltjs_get_penalty_table('post', c, 0, box_stack_level)
- Nx.char = 'jcharbdd'
- else
- Nx.pre = 0; Nx.post = 0; Nx.char = -1
+ Nx.met = nil
+ Nx.xspc = ltjs_fast_get_penalty_table('xsp', c) or 3
+ Nx.auto_xspc = (has_attr(x, attr_autoxspc)==1)
end
- Nx.met = nil
- local y = ltjs_get_penalty_table('xsp', c, 3, box_stack_level)
- Nx.xspc_before = (y%2==1)
- Nx.xspc_after = (y>=2)
- Nx.auto_xspc = (has_attr(x, attr_autoxspc)==1)
-end
+ local set_np_xspc_alchar = set_np_xspc_alchar
-- Np の情報取得メインルーチン
-local function extract_np()
- local x = Np.nuc;
- if Np.id == id_jglyph then set_np_xspc_jachar(Np, x)
- elseif Np.id == id_glyph then set_np_xspc_alchar(Np, x.char, x, ligature_head)
- elseif Np.id == id_hlist then Np.last_char = check_box_high(Np, x.head, nil)
- elseif Np.id == id_pbox then Np.last_char = check_box_high(Np, Np.first, node.next(Np.last))
- elseif Np.id == id_disc then Np.last_char = check_box_high(Np, x.replace, nil)
- elseif Np.id == id_math then set_np_xspc_alchar(Np, -1, x)
+ function extract_np()
+ local x, i = Np.nuc, Np.id;
+ if i == id_jglyph then return set_np_xspc_jachar(Np, x)
+ elseif i == id_glyph then return set_np_xspc_alchar(Np, x.char, x, ligature_head)
+ elseif i == id_hlist then Np.last_char = check_box_high(Np, x.head, nil)
+ elseif i == id_pbox then Np.last_char = check_box_high(Np, Np.first, node_next(Np.last))
+ elseif i == id_disc then Np.last_char = check_box_high(Np, x.replace, nil)
+ elseif i == id_math then return set_np_xspc_alchar(Np, -1, x)
+ end
end
-end
-
--- change the information for the next loop
--- (will be done if Nx is an alphabetic character or a hlist)
-function after_hlist(Nx)
- if Nx.last_char then
- if Nx.last_char.font == has_attr(Nx.last_char, attr_curjfnt) then
- set_np_xspc_jachar(Nx, Nx.last_char);
+
+ -- change the information for the next loop
+ -- (will be done if Nx is an alphabetic character or a hlist)
+ function after_hlist(Nx)
+ local s = Nx.last_char
+ if s then
+ if s.font == has_attr(s, attr_curjfnt) then
+ set_np_xspc_jachar(Nx, s)
+ else
+ set_np_xspc_alchar(Nx, s.char, s, ligature_tail)
+ end
else
- set_np_xspc_alchar(Nx, Nx.last_char.char,Nx.last_char, ligature_tail)
+ Nx.pre, Nx.met = nil, nil
end
- else
- Nx.pre = nil; Nx.met = nil
end
-end
+
+ function after_alchar(Nx)
+ local x = Nx.nuc
+ return set_np_xspc_alchar(Nx, x.char,x, ligature_tail)
+ end
-local function after_alchar(Nx)
- local x = Nx.nuc
- set_np_xspc_alchar(Nx, x.char,x, ligature_tail)
end
-
+local after_hlist, after_alchar, extract_np = after_hlist, after_alchar, extract_np
-------------------- 最下層の処理
@@ -524,11 +494,9 @@ local function lineend_fix(g)
Nq.lend = 0
elseif Nq.lend~=0 then
if not g then
- g = node_new(id_kern); g.subtype = 1; g.kern = -Nq.lend;
- set_attr(g, attr_icflag, LINEEND)
- set_attr(g, attr_uniqid, uniq_id)
- elseif g.id==id_kern then
- g.kern = g.kern - Nq.lend
+ g = node_new(id_kern); --copy_attr(g, Nq.nuc);
+ g.subtype = 1; g.kern = -Nq.lend;
+ set_attr(g, attr_icflag, LINEEND)
else
g.spec.width = g.spec.width - Nq.lend
end
@@ -541,15 +509,14 @@ local function handle_penalty_normal(post, pre, g)
local a = (pre or 0) + (post or 0)
if #Bp == 0 then
if (a~=0 and not(g and g.id==id_kern)) or Nq.lend~=0 then
- local p = node_new(id_penalty)
+ local p = node_new(id_penalty); --copy_attr(p, Nq.nuc)
if a<-10000 then a = -10000 elseif a>10000 then a = 10000 end
p.penalty = a
- head = node_insert_before(head, Np.first, p)
- table_insert(Bp, p);
- set_attr(p, attr_icflag, KINSOKU)
- set_attr(p, attr_uniqid, uniq_id)
+ head = insert_before(head, Np.first, p)
+ Bp[1]=p;
+ set_attr(p, attr_icflag, KINSOKU)
end
- else for i, v in pairs(Bp) do add_penalty(v,a) end
+ else for _, v in pairs(Bp) do add_penalty(v,a) end
end
end
@@ -557,15 +524,14 @@ local function handle_penalty_always(post, pre, g)
local a = (pre or 0) + (post or 0)
if #Bp == 0 then
if not (g and g.id==id_glue) or Nq.lend~=0 then
- local p = node_new(id_penalty)
+ local p = node_new(id_penalty); --copy_attr(p, Nq.nuc)
if a<-10000 then a = -10000 elseif a>10000 then a = 10000 end
p.penalty = a
- head = node_insert_before(head, Np.first, p)
- table_insert(Bp, p)
- set_attr(p, attr_icflag, KINSOKU)
- set_attr(p, attr_uniqid, uniq_id)
+ head = insert_before(head, Np.first, p)
+ Bp[1]=p
+ set_attr(p, attr_icflag, KINSOKU)
end
- else for i, v in pairs(Bp) do add_penalty(v,a) end
+ else for _, v in pairs(Bp) do add_penalty(v,a) end
end
end
@@ -573,35 +539,26 @@ local function handle_penalty_suppress(post, pre, g)
local a = (pre or 0) + (post or 0)
if #Bp == 0 then
if g and g.id==id_glue then
- local p = node_new(id_penalty)
- p.penalty = 10000; head = node_insert_before(head, Np.first, p)
- table_insert(Bp, p);
- set_attr(p, attr_icflag, KINSOKU)
- set_attr(p, attr_uniqid, uniq_id)
+ local p = node_new(id_penalty); --copy_attr(p, Nq.nuc)
+ p.penalty = 10000; head = insert_before(head, Np.first, p)
+ Bp[1]=p
+ set_attr(p, attr_icflag, KINSOKU)
end
- else for i, v in pairs(Bp) do add_penalty(v,a) end
+ else for _, v in pairs(Bp) do add_penalty(v,a) end
end
end
-- 和文文字間の JFM glue を node 化
local function new_jfm_glue(Nn, bc, ac)
-- bc, ac: char classes
- local g = nil
- local z = Nn.met.size_cache[Nn.size].char_type[bc]
- if z.glue and z.glue[ac] then
- local h = node_new(id_glue_spec)
- h.width = z.glue[ac][1]
- h.stretch = z.glue[ac][2]
- h.shrink = z.glue[ac][3]
- h.stretch_order=0; h.shrink_order=0
- g = node_new(id_glue)
- g.subtype = 0; g.spec = h
- elseif z.kern and z.kern[ac] then
- g = node_new(id_kern)
+ local z = Nn.met.size_cache.char_type[bc]
+ local g = z.glue[ac]
+ if g then
+ g = node_copy(g); g.spec = node.copy(g.spec);
+ elseif z.kern[ac] then
+ g = node_new(id_kern); --copy_attr(g, Nn.nuc)
g.subtype = 1; g.kern = z.kern[ac]
- end
- if g then
- set_attr(g, attr_icflag, FROM_JFM); set_attr(g, attr_uniqid, uniq_id)
+ set_attr(g, attr_icflag, FROM_JFM);
end
return g
end
@@ -609,40 +566,40 @@ end
-- Nq.last (kern w) .... (glue/kern g) Np.first
local function real_insert(w, g)
if w~=0 then
- local h = node_new(id_kern)
+ local h = node_new(id_kern); --copy_attr(h, Nq.nuc)
set_attr(h, attr_icflag, LINE_END)
- set_attr(h, attr_uniqid, uniq_id)
h.kern = w; h.subtype = 1
- head = node_insert_after(head, Nq.last, h)
+ head = node.insert_after(head, Nq.last, h)
end
if g then
- head = node_insert_before(head, Np.first, g)
+ head = insert_before(head, Np.first, g)
Np.first = g
end
end
+
-------------------- 和文文字間空白量の決定
-- get kanjiskip
-local function get_kanji_skip_from_jfm(Nn)
- local i = Nn.met.size_cache[Nn.size].kanjiskip
- if i then
- return { i[1], i[2], i[3] }
- else return nil
- end
+local get_kanjiskip
+
+local function get_kanjiskip_normal()
+ local g = node_new(id_glue); --copy_attr(g, Nq.nuc)
+ g.spec = (Np.auto_kspc or Nq.auto_kspc) and node_copy(kanji_skip) or get_zero_spec()
+ set_attr(g, attr_icflag, KANJI_SKIP)
+ return g
end
-local function get_kanjiskip()
- local g = node_new(id_glue)
+local function get_kanjiskip_jfm()
+ local g = node_new(id_glue); --copy_attr(g, Nq.nuc)
if Np.auto_kspc or Nq.auto_kspc then
- if kanji_skip.width == max_dimen then
local gx = node_new(id_glue_spec);
- gx.stretch_order = 0; gx.shrink_order = 0
- local bk = get_kanji_skip_from_jfm(Nq)
+ gx.stretch_order, gx.shrink_order = 0, 0
+ local bk = Nq.met.size_cache.kanjiskip
local ak
- if (Np.met==Nq.met) and (Nq.size==Np.size) and (Nq.var==Np.var) then
+ if (Np.met.size_cache==Nq.met.size_cache) and (Nq.var==Np.var) then
ak = nil
else
- ak = get_kanji_skip_from_jfm(Np)
+ ak = Np.met.size_cache.kanjiskip
end
if bk then
if ak then
@@ -654,15 +611,14 @@ local function get_kanjiskip()
end
elseif ak then
gx.width = ak[1]; gx.stretch = ak[2]; gx.shrink = ak[3]
- else node_free(gx); gx = get_zero_spec() -- fallback
+ else
+ gx.width, gx.stretch, gx.shrink = 0, 0, 0
end
g.spec = gx
- else g.spec=node_copy(kanji_skip); node_free(gx) end
else
- g.spec = get_zero_spec(); node_free(gx)
+ g.spec = get_zero_spec()
end
set_attr(g, attr_icflag, KANJI_SKIP)
- set_attr(g, attr_uniqid, uniq_id)
return g
end
@@ -677,26 +633,26 @@ local function calc_ja_ja_aux(gb,ga)
gb.spec.width = round(diffmet_rule(gb.spec.width, ga.spec.width))
gb.spec.stretch = round(diffmet_rule(gb.spec.stretch,ga.spec.shrink))
gb.spec.shrink = -round(diffmet_rule(-gb.spec.shrink, -ga.spec.shrink))
- node_free(ga)
+ node.free(ga)
return gb
elseif k == 'kernkern' then
-- 両方とも kern.
gb.kern = round(diffmet_rule(gb.kern, ga.kern))
- node_free(ga)
+ node.free(ga)
return gb
elseif k == 'kernglue' then
-- gb: kern, ga: glue
ga.spec.width = round(diffmet_rule(gb.kern,ga.spec.width))
ga.spec.stretch = round(diffmet_rule(ga.spec.stretch, 0))
ga.spec.shrink = -round(diffmet_rule(-ga.spec.shrink, 0))
- node_free(gb)
+ node.free(gb)
return ga
else
-- gb: glue, ga: kern
gb.spec.width = round(diffmet_rule(ga.kern, gb.spec.width))
gb.spec.stretch = round(diffmet_rule(gb.spec.stretch, 0))
gb.spec.shrink = -round(diffmet_rule(-gb.spec.shrink, 0))
- node_free(ga)
+ node.free(ga)
return gb
end
end
@@ -704,105 +660,101 @@ end
local function calc_ja_ja_glue()
if ihb_flag then return nil
- elseif (Nq.size==Np.size) and (Nq.met==Np.met) and (Nq.var==Np.var) then
+ elseif (Nq.met.size_cache==Np.met.size_cache) and (Nq.var==Np.var) then
return new_jfm_glue(Nq, Nq.class, Np.class)
else
- local g = new_jfm_glue(Nq, Nq.class,
- fast_find_char_class('diffmet',Nq.met))
- local h = new_jfm_glue(Np, fast_find_char_class('diffmet',Np.met),
- Np.class)
- return calc_ja_ja_aux(g,h)
+ return calc_ja_ja_aux(new_jfm_glue(Nq, Nq.class, fast_find_char_class('diffmet',Nq.met)),
+ new_jfm_glue(Np, fast_find_char_class('diffmet',Np.met), Np.class))
end
end
-------------------- 和欧文間空白量の決定
-- get xkanjiskip
-local function get_xkanji_skip_from_jfm(Nn)
- local i = Nn.met.size_cache[Nn.size].xkanjiskip
- if i then
- return { i[1], i[2], i[3] }
- else return nil
+local get_xkanjiskip
+local function get_xkanjiskip_normal(Nn)
+ local g = node_new(id_glue); --copy_attr(g, Nn.nuc)
+ local gx = node_new(id_glue_spec); g.spec = gx
+ if (Nq.xspc>=2) and (Np.xspc%2==1) and (Nq.auto_xspc or Np.auto_xspc) then
+ g.spec = node_copy(xkanji_skip)
+ else
+ g.spec = get_zero_spec()
end
+ set_attr(g, attr_icflag, XKANJI_SKIP)
+ return g
end
-local function get_xkanjiskip(Nn)
- local g = node_new(id_glue)
- if Nq.xspc_after and Np.xspc_before and (Nq.auto_xspc or Np.auto_xspc) then
- if xkanji_skip.width == max_dimen then
- local gx = node_new(id_glue_spec);
- gx.stretch_order = 0; gx.shrink_order = 0
- local bk = get_xkanji_skip_from_jfm(Nn)
- if bk then
- gx.width = bk[1]; gx.stretch = bk[2]; gx.shrink = bk[3]
- else node_free(gx); gx = get_zero_spec() -- fallback
- end
- g.spec = gx
- else g.spec=node_copy(xkanji_skip) end
+local function get_xkanjiskip_jfm(Nn)
+ local g = node_new(id_glue); --copy_attr(g, Nn.nuc)
+ if (Nq.xspc>=2) and (Np.xspc%2==1) and (Nq.auto_xspc or Np.auto_xspc) then
+ local gx = node_new(id_glue_spec);
+ gx.stretch_order, gx.shrink_order = 0, 0
+ local bk = Nn.met.size_cache.xkanjiskip
+ if bk then
+ gx.width = bk[1]; gx.stretch = bk[2]; gx.shrink = bk[3]
+ else
+ gx.width, gx.stretch, gx.shrink = 0, 0, 0
+ end
+ g.spec = gx
else
g.spec = get_zero_spec()
end
set_attr(g, attr_icflag, XKANJI_SKIP)
- set_attr(g, attr_uniqid, uniq_id)
return g
end
+
-------------------- 隣接した「塊」間の処理
local function get_OA_skip()
if not ihb_flag then
- local c = Nq.char or 'jcharbdd'
- return new_jfm_glue(Np, fast_find_char_class(c,Np.met), Np.class)
+ return new_jfm_glue(Np,
+ fast_find_char_class(((Nq.id == id_math and -1) or 'jcharbdd'), Np.met), Np.class)
else return nil
end
end
local function get_OB_skip()
if not ihb_flag then
- local c = Np.char or 'jcharbdd'
- return new_jfm_glue(Nq, Nq.class, fast_find_char_class(c,Nq.met))
+ return new_jfm_glue(Nq, Nq.class,
+ fast_find_char_class(((Np.id == id_math and -1) or'jcharbdd'), Nq.met))
else return nil
end
end
-- (anything) .. jachar
-local function handle_np_jachar()
- local g
+local function handle_np_jachar(mode)
if Nq.id==id_jglyph or ((Nq.id==id_pbox or Nq.id==id_pbox_w) and Nq.met) then
- g = calc_ja_ja_glue() or get_kanjiskip() -- M->K
- g = lineend_fix(g)
+ local g = lineend_fix(calc_ja_ja_glue() or get_kanjiskip()) -- M->K
handle_penalty_normal(Nq.post, Np.pre, g); real_insert(Nq.lend, g)
elseif Nq.met then -- Nq.id==id_hlist
- g = get_OA_skip() or get_kanjiskip() -- O_A->K
+ local g = get_OA_skip() or get_kanjiskip() -- O_A->K
handle_penalty_normal(0, Np.pre, g); real_insert(0, g)
elseif Nq.pre then
- g = get_OA_skip() or get_xkanjiskip(Np) -- O_A->X
+ local g = get_OA_skip() or get_xkanjiskip(Np) -- O_A->X
if Nq.id==id_hlist then Nq.post = 0 end
handle_penalty_normal(Nq.post, Np.pre, g); real_insert(0, g)
else
- g = get_OA_skip() -- O_A
+ local g = get_OA_skip() -- O_A
if Nq.id==id_glue then handle_penalty_normal(0, Np.pre, g)
elseif Nq.id==id_kern then handle_penalty_suppress(0, Np.pre, g)
else handle_penalty_always(0, Np.pre, g)
end
real_insert(0, g)
end
- -- \jcharwidowpenalty 挿入予定箇所更新
- if mode and ltjs_get_penalty_table('kcat', Np.char, 0, box_stack_level)%2~=1 then
- widow_Np.first = Np.first;
- local Bpr = widow_Bp; widow_Bp = Bp; Bp = Bpr
+ if mode and (ltjs_fast_get_penalty_table('kcat', Np.char) or 0)%2~=1 then
+ widow_Np.first, widow_Bp, Bp = Np.first, Bp, widow_Bp
end
end
+
-- jachar .. (anything)
local function handle_nq_jachar()
- local g
- if Np.pre then
+ if Np.pre then
if Np.id==id_hlist then Np.pre = 0 end
- g = get_OB_skip() or get_xkanjiskip(Nq) -- O_B->X
- g = lineend_fix(g)
+ local g = lineend_fix(get_OB_skip() or get_xkanjiskip(Nq)) -- O_B->X
handle_penalty_normal(Nq.post, Np.pre, g); real_insert(Nq.lend, g)
else
- g = get_OB_skip(); g = lineend_fix(g) -- O_B
+ local g = lineend_fix(get_OB_skip()) -- O_B
if Np.id==id_glue then handle_penalty_normal(Nq.post, 0, g)
elseif Np.id==id_kern then handle_penalty_suppress(Nq.post, 0, g)
else handle_penalty_always(Nq.post, 0, g)
@@ -811,27 +763,24 @@ local function handle_nq_jachar()
end
end
--- (anything) .. (和文文字で終わる hlist)
+-- (anything) .. (和文文字で始まる hlist)
local function handle_np_ja_hlist()
- local g
if Nq.id==id_jglyph or ((Nq.id==id_pbox or Nq.id == id_pbox_w) and Nq.met) then
- g = get_OB_skip() or get_kanjiskip() -- O_B->K
- g = lineend_fix(g)
+ local g = lineend_fix(get_OB_skip() or get_kanjiskip()) -- O_B->K
handle_penalty_normal(Nq.post, 0, g); real_insert(Nq.lend, g)
elseif Nq.met then -- Nq.id==id_hlist
- g = get_kanjiskip() -- K
+ local g = get_kanjiskip() -- K
handle_penalty_suppress(0, 0, g); real_insert(0, g)
elseif Nq.pre then
- g = get_xkanjiskip(Np) -- X
+ local g = get_xkanjiskip(Np) -- X
handle_penalty_suppress(0, 0, g); real_insert(0, g)
end
end
-- (和文文字で終わる hlist) .. (anything)
local function handle_nq_ja_hlist()
- local g = nil
if Np.pre then
- g = get_xkanjiskip(Nq) -- X
+ local g = get_xkanjiskip(Nq) -- X
handle_penalty_suppress(0, 0, g); real_insert(0, g)
end
end
@@ -842,29 +791,30 @@ local function adjust_nq()
elseif Nq.id==id_hlist or Nq.id==id_pbox or Nq.id==id_disc then after_hlist(Nq)
elseif Nq.id == id_pbox_w then
luatexbase.call_callback("luatexja.jfmglue.whatsit_after",
- false, Nq, Np, box_stack_level)
+ false, Nq, Np)
end
end
-------------------- 開始・終了時の処理
-- リスト末尾の処理
-local function handle_list_tail()
+local function handle_list_tail(mode)
adjust_nq(); Np = Nq
if mode then
-- the current list is to be line-breaked:
if Np.id == id_jglyph or (Np.id==id_pbox and Np.met) then
if Np.lend~=0 then
g = node_new(id_kern); g.subtype = 0; g.kern = Np.lend
- set_attr(g, attr_icflag, BOXBDD)
- node_insert_after(head, Np.last, g)
+ --copy_attr(g, Np.nuc);
+ set_attr(g, attr_icflag, BOXBDD)
+ node.insert_after(head, Np.last, g)
end
end
-- Insert \jcharwidowpenalty
Bp = widow_Bp; Np = widow_Np; Nq.lend = 0
if Np.first then
handle_penalty_normal(0,
- ltjs_get_penalty_table('jwp', 0, 0, box_stack_level))
+ ltjs_fast_get_penalty_table('jwp', 0) or 0)
end
else
-- the current list is the contents of a hbox
@@ -872,73 +822,71 @@ local function handle_list_tail()
local g = new_jfm_glue(Np, Np.class, fast_find_char_class('boxbdd',Np.met))
if g then
set_attr(g, attr_icflag, BOXBDD)
- head = node_insert_after(head, Np.last, g)
+ head = node.insert_after(head, Np.last, g)
end
end
end
end
-- リスト先頭の処理
-local function handle_list_head()
+local function handle_list_head(par_indented)
if Np.id == id_jglyph or (Np.id==id_pbox and Np.met) then
if not ihb_flag then
- local g
- if par_indented then
- g = new_jfm_glue(Np, fast_find_char_class('parbdd',Np.met), Np.class)
- else
- g = new_jfm_glue(Np, fast_find_char_class('boxbdd',Np.met), Np.class)
- end
+ local g = new_jfm_glue(Np, fast_find_char_class(par_indented, Np.met), Np.class)
if g then
set_attr(g, attr_icflag, BOXBDD)
if g.id==id_glue and #Bp==0 then
- local h = node_new(id_penalty)
+ local h = node_new(id_penalty); --copy_attr(h, Np.nuc)
h.penalty = 10000; set_attr(h, attr_icflag, BOXBDD)
end
- head = node_insert_before(head, Np.first, g)
+ head = insert_before(head, Np.first, g)
end
end
end
end
-- initialize
-local function init_var()
- uniq_id = uniq_id +1
- if uniq_id == 0x7FFFFFF then uniq_id = 0 end
- lp = head; Bp = {}; widow_Bp = {}; widow_Np = {first = nil}
- par_indented = false
- box_stack_level = ltjp.box_stack_level
+-- return value: (the initial cursor lp), (last node)
+local function init_var(mode)
+ Bp, widow_Bp, widow_Np = {}, {}, {first = nil}
kanji_skip=skip_table_to_spec('kanjiskip')
+ get_kanjiskip = (kanji_skip.width == max_dimen)
+ and get_kanjiskip_jfm or get_kanjiskip_normal
xkanji_skip=skip_table_to_spec('xkanjiskip')
+ get_xkanjiskip = (xkanji_skip.width == max_dimen)
+ and get_xkanjiskip_jfm or get_xkanjiskip_normal
Np = {
auto_kspc=nil, auto_xspc=nil, char=nil, class=nil,
first=nil, id=nil, last=nil, lend=0, met=nil, nuc=nil,
- post=nil, pre=nil, var=nil, xspc_after=nil, xspc_before=nil,
+ post=nil, pre=nil, xspc=nil,
}
Nq = {
auto_kspc=nil, auto_xspc=nil, char=nil, class=nil,
first=nil, id=nil, last=nil, lend=0, met=nil, nuc=nil,
- post=nil, pre=nil, var=nil, xspc_after=nil, xspc_before=nil,
+ post=nil, pre=nil, xspc=nil,
}
if mode then
-- the current list is to be line-breaked:
-- hbox from \parindent is skipped.
+ local lp, par_indented = head, 'boxbdd'
while lp and ((lp.id==id_whatsit and lp.subtype~=sid_user)
or ((lp.id==id_hlist) and (lp.subtype==3))) do
- if (lp.id==id_hlist) and (lp.subtype==3) then par_indented = true end
+ if (lp.id==id_hlist) and (lp.subtype==3) then par_indented = 'parbdd' end
lp=node_next(lp) end
- last=node.tail(head)
+ return lp, node.tail(head), par_indented
else
-- the current list is the contents of a hbox:
- -- insert a sentinelEG
- last=node.tail(head); local g = node_new(id_kern)
- node_insert_after(head, last, g); last = g
+ -- insert a sentinel
+ local g = node_new(id_kern)
+ node.insert_after(head, node.tail(head), g); last = g
+ return head, g, 'boxbdd'
end
end
-local function cleanup()
+local function cleanup(mode, last)
-- adjust attr_icflag for avoiding error
- tex.attribute[attr_icflag] = -(0x7FFFFFFF)
- node_free(kanji_skip); node_free(xkanji_skip)
+ tex.setattribute('global', attr_icflag, 0)
+ node.free(kanji_skip); node.free(xkanji_skip)
if mode then
local h = node_next(head)
if h.id == id_penalty and h.penalty == 10000 then
@@ -949,27 +897,31 @@ local function cleanup()
end
return head
else
- head = node_remove(head, last); node_free(last);-- remove the sentinel
+ head = node.remove(head, last); node.free(last);-- remove the sentinel
+ set_attr(head, attr_icflag,
+ get_attr_icflag(head) + PROCESSED_BEGIN_FLAG);
return head
end
end
-------------------- 外部から呼ばれる関数
-- main interface
-function main(ahead, amode)
+function main(ahead, mode)
if not ahead then return ahead end
- head = ahead; mode = amode; init_var(); calc_np()
+ head = ahead;
+ local lp, last, par_indented = init_var(mode);
+ lp = calc_np(lp, last)
if Np then
- extract_np(); handle_list_head()
+ extract_np(); handle_list_head(par_indented)
else
- return cleanup()
+ return cleanup(mode, last)
end
- calc_np()
+ lp = calc_np(lp, last)
while Np do
extract_np(); adjust_nq()
- -- 挿入部
+ -- 挿入部
if Np.id == id_jglyph then
- handle_np_jachar()
+ handle_np_jachar(mode)
elseif Np.met then
if Np.id==id_hlist then handle_np_ja_hlist()
else handle_np_jachar() end
@@ -977,10 +929,10 @@ function main(ahead, amode)
if Nq.id==id_hlist then handle_nq_ja_hlist()
else handle_nq_jachar() end
end
- calc_np()
+ lp = calc_np(lp, last)
end
- handle_list_tail()
- return cleanup()
+ handle_list_tail(mode)
+ return cleanup(mode, last)
end
-- \inhibitglue
@@ -999,24 +951,25 @@ function create_beginpar_node()
node.write(tn)
end
-local function whatsit_callback(Np, lp, Nq, bsl)
+do
+
+local function whatsit_callback(Np, lp, Nq)
if Np and Np.nuc then return Np
elseif Np and lp.user_id == 30114 then
Np.first = lp; Np.nuc = lp; Np.last = lp
Np.char = 'parbdd'
Np.met = nil
Np.pre = 0; Np.post = 0
- Np.xspc_before = false
- Np.xspc_after = false
+ Np.xspc = 0
Np.auto_xspc = false
return Np
end
end
-local function whatsit_after_callback(s, Nq, Np, bsl)
+local function whatsit_after_callback(s, Nq, Np)
if not s and Nq.nuc.user_id == 30114 then
local x, y = node.prev(Nq.nuc), Nq.nuc
Nq.first, Nq.nuc, Nq.last = x, x, x
- head = node_remove(head, y)
+ head = node.remove(head, y)
end
return s
end
@@ -1026,3 +979,4 @@ luatexbase.add_to_callback("luatexja.jfmglue.whatsit_getinfo", whatsit_callback,
luatexbase.add_to_callback("luatexja.jfmglue.whatsit_after", whatsit_after_callback,
"luatexja.beginpar.np_info_after", 1)
+end \ No newline at end of file
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-jfont.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-jfont.lua
index 2ca43daa0b7..e15563a0cef 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-jfont.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-jfont.lua
@@ -14,14 +14,18 @@ luatexja.load_module('charrange'); local ltjc = luatexja.charrange
local node_new = node.new
local has_attr = node.has_attribute
+local set_attr = node.set_attribute
local round = tex.round
local attr_icflag = luatexbase.attributes['ltj@icflag']
local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
local id_glyph = node.id('glyph')
local id_kern = node.id('kern')
+local id_glue_spec = node.id('glue_spec')
+local id_glue = node.id('glue')
local cat_lp = luatexbase.catcodetables['latex-package']
local ITALIC = 1
+local FROM_JFM = 4
------------------------------------------------------------------------
-- LOADING JFM
------------------------------------------------------------------------
@@ -56,6 +60,13 @@ function define_jfm(t)
real_char = true;
elseif type(w) == 'string' and utf.len(w)==1 then
real_char = true; w = utf.byte(w)
+ elseif type(w) == 'string' and utf.len(w)==2 and utf.sub(w,2) == '*' then
+ real_char = true; w = utf.byte(utf.sub(w,1,1))
+ if not t.chars[-w] then
+ t.chars[-w] = i
+ else
+ defjfm_res= nil; return
+ end
end
if not t.chars[w] then
t.chars[w] = i
@@ -82,17 +93,17 @@ function define_jfm(t)
if type(v.down)~='number' then
v.down = 0.0
end
- if type(v.align)=='nil' then
+ if type(v.align)~='string' then
v.align = 'left'
end
end
end
v.chars = nil
end
- if v.kern and v.glue then
- for j,w in pairs(v.glue) do
- if v.kern[j] then defjfm_res= nil; return end
- end
+ if not v.kern then v.kern = {} end
+ if not v.glue then v.glue = {} end
+ for j in pairs(v.glue) do
+ if v.kern[j] then defjfm_res= nil; return end
end
t.char_type[i] = v
t[i] = nil
@@ -111,8 +122,8 @@ local function mult_table(old,scale) -- modified from table.fastcopy
new[k] = mult_table(v,scale)
elseif type(v) == "number" then
new[k] = round(v*scale)
- else
- new[k] = v
+ else
+ new[k] = v
end
end
return new
@@ -121,12 +132,24 @@ end
local function update_jfm_cache(j,sz)
if metrics[j].size_cache[sz] then return end
- metrics[j].size_cache[sz] = {}
- metrics[j].size_cache[sz].char_type = mult_table(metrics[j].char_type, sz)
- metrics[j].size_cache[sz].kanjijskip = mult_table(metrics[j].kanjiskip, sz)
- metrics[j].size_cache[sz].xkanjiskip = mult_table(metrics[j].xkanjiskip,sz)
- metrics[j].size_cache[sz].zw = round(metrics[j].zw*sz)
- metrics[j].size_cache[sz].zh = round(metrics[j].zh*sz)
+ local t = {}
+ metrics[j].size_cache[sz] = t
+ t.chars = metrics[j].chars
+ t.char_type = mult_table(metrics[j].char_type, sz)
+ for i,v in pairs(t.char_type) do
+ if type(i) == 'number' then -- char_type
+ for k,w in pairs(v.glue) do
+ local g, h = node.new(id_glue), node_new(id_glue_spec); v.glue[k] = g
+ h.width, h.stretch, h.shrink = w[1], w[2], w[3]
+ h.stretch_order, h.shrink_order = 0, 0
+ g.subtype = 0; g.spec = h; set_attr(g, attr_icflag, FROM_JFM);
+ end
+ end
+ end
+ t.kanjiskip = mult_table(metrics[j].kanjiskip, sz)
+ t.xkanjiskip = mult_table(metrics[j].xkanjiskip,sz)
+ t.zw = round(metrics[j].zw*sz)
+ t.zh = round(metrics[j].zh*sz)
end
luatexbase.create_callback("luatexja.find_char_class", "data",
@@ -135,9 +158,9 @@ luatexbase.create_callback("luatexja.find_char_class", "data",
end)
function find_char_class(c,m)
--- c: character code, m: index in font_metric table
- if not metrics[m.jfm] then return 0 end
- return metrics[m.jfm].chars[c] or
+-- c: character code, m:
+ if not m then return 0 end
+ return m.size_cache.chars[c] or
luatexbase.call_callback("luatexja.find_char_class", 0, m, c)
end
@@ -193,7 +216,8 @@ function jfontdefY() -- for horizontal font
return
end
update_jfm_cache(j, f.size)
- local fmtable = { jfm = j, size = f.size, var = jfm_var }
+ local fmtable = { jfm = j, size = f.size, var = jfm_var,
+ size_cache = metrics[j].size_cache[f.size] }
fmtable = luatexbase.call_callback("luatexja.define_jfont", fmtable, fn)
font_metric_table[fn]=fmtable
tex.sprint(cat_lp, luatexja.is_global .. '\\protected\\expandafter\\def\\csname '
@@ -204,7 +228,7 @@ end
function load_zw()
local a = font_metric_table[tex.attribute[attr_curjfnt]]
if a then
- tex.setdimen('ltj@zw', metrics[a.jfm].size_cache[a.size].zw)
+ tex.setdimen('ltj@zw', a.size_cache.zw)
else
tex.setdimen('ltj@zw',0)
end
@@ -213,7 +237,7 @@ end
function load_zh()
local a = font_metric_table[tex.attribute[attr_curjfnt]]
if a then
- tex.setdimen('ltj@zh', metrics[a.jfm].size_cache[a.size].zh)
+ tex.setdimen('ltj@zh', a.size_cache.zh)
else
tex.setdimen('ltj@zh',0)
end
@@ -269,7 +293,7 @@ function append_italic()
f = has_attr(p, attr_curjfnt)
local j = font_metric_table[f]
local c = find_char_class(p.char, j)
- g.kern = metrics[j.jfm].size_cache[j.size].char_type[c].italic
+ g.kern = j.size_cache.char_type[c].italic
else
g.kern = font.fonts[f].characters[p.char].italic
end
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-math.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-math.lua
index 8252bac3432..fd77dc450d7 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-math.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-math.lua
@@ -3,8 +3,8 @@
--
luatexbase.provides_module({
name = 'luatexja.math',
- date = '2011/08/14',
- version = '0.1',
+ date = '2012/07/19',
+ version = '0.2',
description = 'Handling routines for Japanese characters in math mode',
})
module('luatexja.math', package.seeall)
@@ -20,6 +20,7 @@ local node_next = node.next
local node_free = node.free
local has_attr = node.has_attribute
local set_attr = node.set_attribute
+local tex_getcount = tex.getcount
local attr_jchar_class = luatexbase.attributes['ltj@charclass']
local attr_icflag = luatexbase.attributes['ltj@icflag']
@@ -102,18 +103,15 @@ function (p, sty)
if sty == 0 then mode = 'mjtext'
elseif sty == 1 then mode = 'mjscr'
end
- local f = ltjs.get_penalty_table(mode, fam, -1, tex.getcount('ltj@@stack'))
+ local f = ltjs.get_penalty_table(mode, fam, -1, tex_getcount('ltj@@stack'))
if f ~= -1 then
local q = node_new(id_sub_box)
local r = node_new(id_glyph); r.next = nil
r.char = p.char; r.font = f; r.subtype = 256
+ set_attr(r, attr_ykblshift, 0)
set_attr(r, attr_icflag, PROCESSED)
- set_attr(r, attr_yablshift, 0)
local met = ltjf_font_metric_table[f]
- local class = ltjf_find_char_class(p.char, met)
- set_attr(r, attr_jchar_class, class)
- ltjw.char_data = ltjf.metrics[met.jfm].size_cache[met.size].char_type[class]
- ltjw.head = r; ltjw.capsule_glyph(r, tex.mathdir , true, met, class);
+ ltjw.head = r; ltjw.capsule_glyph(r, tex.mathdir , true, met, ltjf_find_char_class(p.char, met));
q.head = ltjw.head; node_free(p); p=q;
end
end
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-otf.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-otf.lua
index 792c46a2701..71f974979e9 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-otf.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-otf.lua
@@ -66,15 +66,14 @@ function cid(key)
end
function extract(head)
- local p = head, v
+ local p = head
+ local v
while p do
if p.id==id_whatsit then
if p.subtype==sid_user and p.user_id==30113 then
local g = node_new(id_glyph)
g.subtype = 0; g.char = p.value
v = has_attr(p, attr_curjfnt); g.font = v
- set_attr(g, attr_jchar_class,
- ltjf_find_char_class(g.char, ltjf_font_metric_table[v]))
set_attr(g, attr_curjfnt, v)
v = has_attr(p, attr_yablshift)
if v then
@@ -113,7 +112,7 @@ local function cid_to_char(fmtable, fn)
local fi = fonts.ids[fn]
if fi.cidinfo and fi.cidinfo.ordering == "Japan1" then
fmtable.cid_char_type = {}
- for i, v in pairs(ltjf.metrics[fmtable.jfm].chars) do
+ for i, v in pairs(fmtable.size_cache.chars) do
local j = string.match(i, "^AJ1%-([0-9]*)")
if j then
j = tonumber(fi.unicodes['Japan1.'..tostring(j)])
@@ -135,7 +134,7 @@ end
local function cid_set_char_class(arg, fmtable, char)
if arg~=0 then return arg
- elseif fmtable.cid_char_type then
+ elseif fmtable.cid_char_type then
return fmtable.cid_char_type[char] or 0
else return 0
end
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-pretreat.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-pretreat.lua
index aa8ddf427b3..18a1df06e78 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-pretreat.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-pretreat.lua
@@ -3,8 +3,8 @@
--
luatexbase.provides_module({
name = 'luatexja.pretreat',
- date = '2011/06/27',
- version = '0.1',
+ date = '2012/07/19',
+ version = '0.2',
description = '',
})
module('luatexja.pretreat', package.seeall)
@@ -14,13 +14,15 @@ luatexja.load_module('charrange'); local ltjc = luatexja.charrange
luatexja.load_module('jfont'); local ltjf = luatexja.jfont
luatexja.load_module('stack'); local ltjs = luatexja.stack
+local floor = math.floor
local has_attr = node.has_attribute
local set_attr = node.set_attribute
-local unset_attr = node.unset_attribute
+local node_traverse = node.traverse
local node_type = node.type
local node_remove = node.remove
local node_next = node.next
local node_free = node.free
+local tex_getcount = tex.getcount
local id_glyph = node.id('glyph')
local id_math = node.id('math')
@@ -29,39 +31,33 @@ local sid_user = node.subtype('user_defined')
local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
local attr_icflag = luatexbase.attributes['ltj@icflag']
-local attr_yablshift = luatexbase.attributes['ltj@yablshift']
-local attr_ykblshift = luatexbase.attributes['ltj@ykblshift']
local ltjf_font_metric_table = ltjf.font_metric_table
+local ltjc_is_ucs_in_japanese_char = ltjc.is_ucs_in_japanese_char
+local attr_orig_char = luatexbase.attributes['ltj@origchar']
------------------------------------------------------------------------
-- MAIN PROCESS STEP 1: replace fonts
------------------------------------------------------------------------
-box_stack_level = 0
--- This is used in jfmglue.lua.
+local wt
local function suppress_hyphenate_ja(head)
- local non_math = true
- for p in node.traverse(head) do
- if p.id == id_glyph and non_math then
- local i = has_attr(p, attr_icflag) or 0
- if i==0 and ltjc.is_ucs_in_japanese_char(p) then
- local v = has_attr(p, attr_curjfnt)
- if v then
- p.font = v
- end
- v = has_attr(p, attr_ykblshift)
- if v then
- set_attr(p, attr_yablshift, v)
- else
- unset_attr(p, attr_yablshift)
- end
- if p.subtype%2==1 then p.subtype = p.subtype - 1 end
- -- p.lang=lang_ja
+ local non_math, p = true, head
+ wt = {}
+ while p do
+ if p.id == id_glyph then
+ if (has_attr(p, attr_icflag) or 0)<=0 and ltjc_is_ucs_in_japanese_char(p) then
+ p.font = has_attr(p, attr_curjfnt) or p.font
+ p.subtype = floor(p.subtype*0.5)*2
+ set_attr(p, attr_orig_char, p.char)
end
elseif p.id == id_math then
- non_math = (p.subtype ~= 0)
+ p = node_next(p) -- skip math on
+ while p and p.id~=id_math do p = node_next(p) end
+ elseif p.id == id_whatsit and p.subtype==sid_user and p.user_id==30112 then
+ wt[#wt+1] = p; head = node_remove(head, p)
end
+ p = node_next(p)
end
lang.hyphenate(head)
return head
@@ -69,21 +65,11 @@ end
-- mode: true iff this function is called from hpack_filter
function set_box_stack_level(head, mode)
- local box_set = false
- local p = head
- local cl = tex.currentgrouplevel + 1
- for p in node.traverse_id(id_whatsit, head) do
- if p.subtype==sid_user and p.user_id==30112 then
- local g = p
- if mode and g.value==cl then box_set = true end
- head, p = node_remove(head, g); node_free(g); break
- end
- end
- if box_set then
- box_stack_level = tex.getcount('ltj@@stack') + 1
- else
- box_stack_level = tex.getcount('ltj@@stack')
+ local box_set, cl = 0, tex.currentgrouplevel + 1
+ for _,p in pairs(wt) do
+ if mode and p.value==cl then box_set = 1 end; node_free(p)
end
+ ltjs.report_stack_level(tex_getcount('ltj@@stack') + box_set)
return head
end
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-setwidth.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-setwidth.lua
index 457ecd806ca..57db242c19f 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-setwidth.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-setwidth.lua
@@ -3,8 +3,8 @@
--
luatexbase.provides_module({
name = 'luatexja.setwidth',
- date = '2011/06/28',
- version = '0.1',
+ date = '2012/07/19',
+ version = '0.2',
description = '',
})
module('luatexja.setwidth', package.seeall)
@@ -23,6 +23,7 @@ local node_insert_before = node.insert_before
local node_insert_after = node.insert_after
local round = tex.round
+
local id_glyph = node.id('glyph')
local id_kern = node.id('kern')
local id_hlist = node.id('hlist')
@@ -33,20 +34,26 @@ local id_math = node.id('math')
local attr_jchar_class = luatexbase.attributes['ltj@charclass']
local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
local attr_yablshift = luatexbase.attributes['ltj@yablshift']
+local attr_ykblshift = luatexbase.attributes['ltj@ykblshift']
local attr_icflag = luatexbase.attributes['ltj@icflag']
-local attr_uniqid = luatexbase.attributes['ltj@uniqid']
local ltjf_font_metric_table = ltjf.font_metric_table
local PACKED = 2
+local PROCESSED = 8
+local IC_PROCESSED = 9
+local PROCESSED_BEGIN_FLAG = 16
-char_data = {}
-head = nil
-
--- return true if and only if p is a Japanese character node
-local function is_japanese_glyph_node(p)
- return p.font==has_attr(p, attr_curjfnt)
+do
+ local floor = math.floor
+ function get_pr_begin_flag(p)
+ return floor((has_attr(p, attr_icflag) or 0)
+ /PROCESSED_BEGIN_FLAG)*PROCESSED_BEGIN_FLAG
+ end
end
+local get_pr_begin_flag = get_pr_begin_flag
+
+head = nil
luatexbase.create_callback("luatexja.set_width", "data",
function (fstable, fmtable, jchar_class)
@@ -54,51 +61,37 @@ luatexbase.create_callback("luatexja.set_width", "data",
end)
local fshift = { down = 0, left = 0}
+
-- mode: true iff p will be always encapsuled by a hbox
function capsule_glyph(p, dir, mode, met, class)
- local h, box, q, fwidth
- if char_data.width ~= 'prop' then
- fwidth = char_data.width
- else fwidth = p.width end
- local fheight = char_data.height
- local fdepth = char_data.depth
+ local char_data = met.size_cache.char_type[class]
+ if not char_data then return node_next(p) end
+ local fwidth = (char_data.width ~= 'prop') and char_data.width or p.width
+ local fheight, fdepth = char_data.height, char_data.depth
fshift.down = char_data.down; fshift.left = char_data.left
fshift = luatexbase.call_callback("luatexja.set_width", fshift, met, class)
--- local ti =
- p.xoffset= p.xoffset - fshift.left
- if mode or p.width ~= fwidth or p.height ~= fheight or p.depth ~= fdepth then
- local y_shift = - p.yoffset + (has_attr(p,attr_yablshift) or 0)
- p.yoffset = -fshift.down
- head, q = node.remove(head, p)
- local total = fwidth - p.width
- if total == 0 then
- h = p; p.next = nil
- else
- h = node_new(id_kern); h.subtype = 0
- if char_data.align=='right' then
- h.kern = total; p.next = nil; h.next = p
- elseif char_data.align=='middle' then
- h.kern = round(total/2); p.next = h
- h = node_new(id_kern); h.subtype = 0
- h.kern = total - round(total/2); h.next = p
- else -- left
- h.kern = total; p.next = h; h = p
- end
- end
- box = node_new(id_hlist);
- box.width = fwidth; box.height = fheight; box.depth = fdepth
- box.glue_set = 0; box.glue_order = 0; box.head = h
- box.shift = y_shift; box.dir = dir or 'TLT'
- set_attr(box, attr_icflag, PACKED)
- set_attr(box, attr_uniqid, has_attr(p, attr_uniqid) or 0)
- if q then
- head = node_insert_before(head, q, box)
+ if (mode or p.width ~= fwidth or p.height ~= fheight or p.depth ~= fdepth) then
+ local y_shift, total = - p.yoffset + (has_attr(p,attr_ykblshift) or 0), fwidth - p.width
+ local q; head, q = node.remove(head, p)
+ p.yoffset, p.next = -fshift.down, nil
+ if total ~= 0 and char_data.align~='left' then
+ p.xoffset = p.xoffset - fshift.left
+ + (((char_data.align=='right') and total) or round(total*0.5))
else
- head = node_insert_after(head, node_tail(head), box)
+ p.xoffset = p.xoffset - fshift.left
end
+ local box = node_new(id_hlist);
+ box.width, box.height, box.depth = fwidth, fheight, fdepth
+ box.head, box.shift, box.dir = p, y_shift, (dir or 'TLT')
+ box.glue_set, box.glue_order = 0, 0
+ set_attr(box, attr_icflag, PACKED + get_pr_begin_flag(p))
+ head = q and node_insert_before(head, q, box)
+ or node_insert_after(head, node_tail(head), box)
return q
else
- p.yoffset = p.yoffset - (has_attr(p, attr_yablshift) or 0) - fshift.down
+ set_attr(p, attr_icflag, PROCESSED + get_pr_begin_flag(p))
+ p.xoffset = p.xoffset - fshift.left
+ p.yoffset = p.yoffset - (has_attr(p, attr_ykblshift) or 0) - fshift.down
return node_next(p)
end
end
@@ -107,17 +100,13 @@ function set_ja_width(ahead, dir)
local p = ahead; head = ahead
local m = false -- is in math mode?
while p do
- if p.id==id_glyph then
- if is_japanese_glyph_node(p) then
- local met = ltjf_font_metric_table[p.font]
- local class = has_attr(p, attr_jchar_class)
- char_data = ltjf.metrics[met.jfm].size_cache[met.size].char_type[class]
- if char_data then
- p = capsule_glyph(p, dir, false, met, class)
- else
- p = node_next(p)
- end
- else
+ if (p.id==id_glyph)
+ and ((has_attr(p, attr_icflag) or 0)%PROCESSED_BEGIN_FLAG)<=0 then
+ if p.font == has_attr(p, attr_curjfnt) then
+ p = capsule_glyph(p, dir, false, ltjf_font_metric_table[p.font],
+ has_attr(p, attr_jchar_class))
+ else
+ set_attr(p, attr_icflag, PROCESSED + get_pr_begin_flag(p))
p.yoffset = p.yoffset - (has_attr(p,attr_yablshift) or 0); p = node_next(p)
end
elseif p.id==id_math then
@@ -135,6 +124,6 @@ function set_ja_width(ahead, dir)
end
end
-- adjust attr_icflag
- tex.attribute[attr_icflag] = -(0x7FFFFFFF)
+ tex.setattribute('global', attr_icflag, 0)
return head
end
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-stack.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-stack.lua
index 88d2a67f8a6..c7f52c93fb6 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-stack.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-stack.lua
@@ -121,7 +121,7 @@ function set_stack_font(g,m,c,p)
charprop_stack_table[i][m] = {}
end
charprop_stack_table[i][m][c] = p
- if g=='global' then
+ if g=='global' then
for j,v in pairs(charprop_stack_table) do
if not charprop_stack_table[j][m] then charprop_stack_table[j][m] = {} end
charprop_stack_table[j][m][c] = p
@@ -153,17 +153,29 @@ function set_stack_skip(g,m,sp)
end
end
--- mode: nil iff it is called in callbacks
-function get_skip_table(m, idx)
- local i = charprop_stack_table[idx][m]
- return i or { width = 0, stretch = 0, shrink = 0,
- stretch_order = 0, shrink_order = 0 }
+-- These three functions are used in ltj-jfmglue.lua.
+local table_current_stack
+function report_stack_level(bsl)
+ table_current_stack = charprop_stack_table[bsl]
+end
+function fast_get_skip_table(m)
+ return table_current_stack[m]
+ or { width = 0, stretch = 0, shrink = 0, stretch_order = 0, shrink_order = 0 }
+end
+function fast_get_penalty_table(m,c)
+ local i = table_current_stack[m]
+ return (i and i[c])
end
+-- For other situations, use the following instead:
+function get_skip_table(m, idx)
+ return charprop_stack_table[idx][m]
+ or { width = 0, stretch = 0, shrink = 0, stretch_order = 0, shrink_order = 0 }
+end
function get_penalty_table(m,c,d, idx)
local i = charprop_stack_table[idx][m]
- if i then i=i[c] end
- return i or d
+ return (i and i[c]) or d
end
+
-- EOF
diff --git a/Master/texmf-dist/tex/luatex/luatexja/luatexja-core.sty b/Master/texmf-dist/tex/luatex/luatexja/luatexja-core.sty
index 2559aaf4b67..53ef07766c2 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/luatexja-core.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/luatexja-core.sty
@@ -134,13 +134,25 @@
%%%%%%%% Attributes for Japanese typesetting.
\newluatexattribute\ltj@curjfnt % index for ``current Japanese font''
\newluatexattribute\jfam % index for current jfam
-\newluatexattribute\ltj@uniqid % unique id of box/paragraph
\newluatexattribute\ltj@charclass %
+\newluatexattribute\ltj@origchar %
\newluatexattribute\ltj@yablshift % attribute for \yabaselineshift
\newluatexattribute\ltj@ykblshift % attribute for \ykbaselineshift
\newluatexattribute\ltj@autospc % attribute for autospacing
\newluatexattribute\ltj@autoxspc % attribute for autoxspacing
\newluatexattribute\ltj@icflag % attribute for italic correction
+\ltj@icflag=0 \ltj@origchar=0
+
+%%%%%%%% Attributes for character ranges
+\newcount\ltj@tempcnta
+\ltj@tempcnta=0
+\loop\ifnum\ltj@tempcnta<7
+ \expandafter\newluatexattribute%
+ \csname ltj@kcat\the\ltj@tempcnta\endcsname
+ \csname ltj@kcat\the\ltj@tempcnta\endcsname=0
+ \advance\ltj@tempcnta by1
+\repeat
+
%%%%%%%% Loading luatexja.lua
%% Quark tokens needed in ltj-base
@@ -173,15 +185,6 @@
\fi %</LaTeX>
-%%%%%%%% Attributes for character ranges
-\ltj@tempcnta=0
-\loop\ifnum\ltj@tempcnta<7
- \expandafter\newluatexattribute%
- \csname ltj@kcat\the\ltj@tempcnta\endcsname
- \csname ltj@kcat\the\ltj@tempcnta\endcsname=0
- \advance\ltj@tempcnta by1
-\repeat
-
%%%%%%%% \asluastring
\def\asluastring#1{'\luaescapestring{\detokenize{#1}}'}
@@ -203,9 +206,8 @@
\protected\def\ltj@reset@globaldefs{%
\directlua{luatexja.global_temp = tex.globaldefs; tex.globaldefs = 0}}
\protected\def\ltj@restore@globaldefs{\directlua{tex.globaldefs = luatexja.global_temp}}
-\let\new@everypar=\everypar
\protected\def\inhibitglue{\ifhmode\ltj@@ihb\fi}
-\def\ltj@@ihb{\directlua{luatexja.jfmglue.create_inhibitglue_node()}}
+\def\ltj@@ihb{\relax\directlua{luatexja.jfmglue.create_inhibitglue_node()}}
%%%%%%%% \yoko, \tate, \ifydir, \iftdir
%% At this moment, tategaki mode is not implemented;
@@ -257,7 +259,7 @@
\expandafter\ltj@@set@stackfont#1:{mjscr}}
\define@key[ltj]{japaram}{jascriptscriptfont}{%
\expandafter\ltj@@set@stackfont#1:{mjss}}
-\def\ltj@@set@stackfont#1,#2:#3{%
+\protected\def\ltj@@set@stackfont#1,#2:#3{%
\ltj@reset@globaldefs
\ltj@tempcnta=\ltj@curjfnt\ltj@curjfnt=-1 #2%
\ifnum\ltj@curjfnt=-1
@@ -364,9 +366,11 @@
\fi\next
}
-\protected\def\ltjsetparameter#1{%
+\protected\def\ltj@setpar@global{%
\ifnum\globaldefs>0\directlua{luatexja.isglobal='global'}\else\directlua{luatexja.isglobal=''}\fi
- \setkeys[ltj]{japaram}{#1}\ignorespaces}
+}
+\protected\def\ltjsetparameter#1{%
+ \ltj@setpar@global\setkeys[ltj]{japaram}{#1}\ignorespaces}
\protected\def\ltjglobalsetparameter#1{%
\ifnum\globaldefs<0\directlua{luatexja.isglobal=''}\else\directlua{luatexja.isglobal='global'}\fi
\setkeys[ltj]{japaram}{#1}\ignorespaces}
diff --git a/Master/texmf-dist/tex/luatex/luatexja/luatexja.lua b/Master/texmf-dist/tex/luatex/luatexja/luatexja.lua
index 7b608d50df4..98b0ae7dc5d 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/luatexja.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/luatexja.lua
@@ -86,6 +86,7 @@ local XKANJI_SKIP = 7
local PROCESSED = 8
local IC_PROCESSED = 9
local BOXBDD = 15
+local PROCESSED_BEGIN_FLAG = 16
-- Three aux. functions, bollowed from tex.web
@@ -120,7 +121,7 @@ local function print_glue(d,order)
return out
end
-local function print_spec(p)
+function print_spec(p)
local out=print_scaled(p.width)..'pt'
if p.stretch~=0 then
out=out..' plus '..print_glue(p.stretch,p.stretch_order)
@@ -131,8 +132,6 @@ local function print_spec(p)
return out
end
-function math.two_add(a,b) return a+b end
-function math.two_average(a,b) return (a+b)/2 end
---- table: charprop_stack_table [stack_level].{pre|post|xsp}[chr_code]
@@ -214,7 +213,7 @@ end
-- EXT: print \global if necessary
function luatexja.ext_print_global()
- if isglobal=='global' then tex.sprint(cat_lp, '\\global') end
+ if luatexja.isglobal=='global' then tex.sprint(cat_lp, '\\global') end
end
-- main process
@@ -242,16 +241,20 @@ luatexbase.add_to_callback('hpack_filter',
'luaotfload.hpack_filter') + 1)
-- debug
+local function get_attr_icflag(p)
+ return (has_attr(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG
+end
+
local debug_depth
local function debug_show_node_X(p,print_fn)
local k = debug_depth
local s
local pt=node_type(p.id)
- local base = debug_depth .. string.format('%X', has_attr(p,attr_icflag) or 0)
- .. ' ' .. tostring(p)
+ local base = debug_depth .. string.format('%X', get_attr_icflag(p))
+ .. ' ' .. pt .. ' ' .. tostring(p.subtype) .. ' '
if pt == 'glyph' then
- s = base .. ' ' .. utf.char(p.char) .. ' ' .. tostring(p.font)
+ s = base .. ' ' .. utf.char(p.char) .. ' ' .. tostring(p.font)
.. ' (' .. print_scaled(p.height) .. '+'
.. print_scaled(p.depth) .. ')x' .. print_scaled(p.width)
print_fn(s)
@@ -272,7 +275,7 @@ local function debug_show_node_X(p,print_fn)
for i = 2, p.glue_order do s = s .. 'l' end
end
end
- if has_attr(p, attr_icflag, PACKED) then
+ if get_attr_icflag(p) == PACKED then
s = s .. ' (packed)'
end
print_fn(s)
@@ -284,11 +287,11 @@ local function debug_show_node_X(p,print_fn)
debug_depth=k
elseif pt == 'glue' then
s = base .. ' ' .. print_spec(p.spec)
- if has_attr(p, attr_icflag)==FROM_JFM then
+ if get_attr_icflag(p)==FROM_JFM then
s = s .. ' (from JFM)'
- elseif has_attr(p, attr_icflag)==KANJI_SKIP then
+ elseif get_attr_icflag(p)==KANJI_SKIP then
s = s .. ' (kanjiskip)'
- elseif has_attr(p, attr_icflag)==XKANJI_SKIP then
+ elseif get_attr_icflag(p)==XKANJI_SKIP then
s = s .. ' (xkanjiskip)'
end
print_fn(s)
@@ -296,19 +299,19 @@ local function debug_show_node_X(p,print_fn)
s = base .. ' ' .. print_scaled(p.kern) .. 'pt'
if p.subtype==2 then
s = s .. ' (for accent)'
- elseif has_attr(p, attr_icflag)==IC_PROCESSED then
+ elseif get_attr_icflag(p)==IC_PROCESSED then
s = s .. ' (italic correction)'
- -- elseif has_attr(p, attr_icflag)==ITALIC then
+ -- elseif get_attr_icflag(p)==ITALIC then
-- s = s .. ' (italic correction)'
- elseif has_attr(p, attr_icflag)==FROM_JFM then
+ elseif get_attr_icflag(p)==FROM_JFM then
s = s .. ' (from JFM)'
- elseif has_attr(p, attr_icflag)==LINE_END then
+ elseif get_attr_icflag(p)==LINE_END then
s = s .. " (from 'lineend' in JFM)"
end
print_fn(s)
elseif pt == 'penalty' then
s = base .. ' ' .. tostring(p.penalty)
- if has_attr(p, attr_icflag)==KINSOKU then
+ if get_attr_icflag(p)==KINSOKU then
s = s .. ' (for kinsoku)'
end
print_fn(s)
diff --git a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjfont.sty b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjfont.sty
index de5e38e7c1d..e0d8ee84b1a 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjfont.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjfont.sty
@@ -621,10 +621,11 @@
\pickup@jfont\let\scriptfont@name\font@name
\xdef\font@name{\csname \string#2/\ssf@size\endcsname}%
\pickup@jfont
- \edef\math@fonts{\math@fonts\ltjsetparameter{%
- jatextfont={#1,\textfont@name},%
- jascriptfont={#1,\scriptfont@name},%
- jascriptscriptfont={#1,\font@name}}}%
+ \edef\math@fonts{\math@fonts\ltj@setpar@global%
+ \ltj@@set@stackfont#1,\textfont@name:{mjtext}%
+ \ltj@@set@stackfont#1,\scriptfont@name:{mjscr}%
+ \ltj@@set@stackfont#1,\font@name:{mjss}%
+ }%
}
\def\getanddefine@fonts#1#2{%
diff --git a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings-jpt.tex b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings-jpt.tex
index e5b4827ea49..505ea3882aa 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings-jpt.tex
+++ b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings-jpt.tex
@@ -963,4 +963,79 @@
\ltj@@listing@jpsetN{65280}{65376}{\lst@ProcessJALetter}
\ltj@@listing@jpsetN{65377}{65439}{\lst@ProcessJALetterHalf}
\ltj@@listing@jpsetN{65504}{65509}{\lst@ProcessJALetter}
+
+\message{Opening and Closing brackets}
+\@temptokena{}% DO NOT REMOVE THIS LINE
+
+\ltj@@listing@jpsetN@{`,}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`。}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`,}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`.}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`・}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`:}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`;}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`?}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`!}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`゛}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"212B
+\ltj@@listing@jpsetN@{`゜}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"212C
+\ltj@@listing@jpsetN@{`´}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"212D
+\ltj@@listing@jpsetN@{``}{\lst@ProcessJALetter@inhibit@postbreak}%\jis"212E
+\ltj@@listing@jpsetN@{`々}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"2139
+\ltj@@listing@jpsetN@{`…}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"2144
+\ltj@@listing@jpsetN@{`‥}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"2145
+\ltj@@listing@jpsetN@{`‘}{\lst@ProcessJALetter@inhibit@postbreak}%\jis"2146
+\ltj@@listing@jpsetN@{`’}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"2147
+\ltj@@listing@jpsetN@{`“}{\lst@ProcessJALetter@inhibit@postbreak}%\jis"2148
+\ltj@@listing@jpsetN@{`”}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"2149
+\ltj@@listing@jpsetN@{`)}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`(}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`}}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`{}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`]}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`[}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`〔}{\lst@ProcessJALetter@inhibit@postbreak}%\jis"214C
+\ltj@@listing@jpsetN@{`〕}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"214D
+\ltj@@listing@jpsetN@{`〈}{\lst@ProcessJALetter@inhibit@postbreak}%\jis"2152
+\ltj@@listing@jpsetN@{`〉}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"2153
+\ltj@@listing@jpsetN@{`《}{\lst@ProcessJALetter@inhibit@postbreak}%\jis"2154
+\ltj@@listing@jpsetN@{`》}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"2155
+\ltj@@listing@jpsetN@{`「}{\lst@ProcessJALetter@inhibit@postbreak}%\jis"2156
+\ltj@@listing@jpsetN@{`」}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"2157
+\ltj@@listing@jpsetN@{`『}{\lst@ProcessJALetter@inhibit@postbreak}%\jis"2158
+\ltj@@listing@jpsetN@{`』}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"2159
+\ltj@@listing@jpsetN@{`【}{\lst@ProcessJALetter@inhibit@postbreak}%\jis"215A
+\ltj@@listing@jpsetN@{`】}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"215B
+\ltj@@listing@jpsetN@{`ー}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`〳}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`〴}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`〵}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`〻}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`⦅}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`⦆}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`⦅}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`⦆}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`〘}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`〙}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`〖}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`〗}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`«}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`»}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`〝}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`〟}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`‼}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`⁇}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`⁈}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`⁉}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`¡}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`¿}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`ː}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`ª}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`º}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`¹}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`²}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`³}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`€}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`™}{\lst@ProcessJALetter@inhibit@prebreak}
+
+\ltj@@listing@jpset@after{other}% DO NOT REMOVE THIS LINE
\message{done.}
diff --git a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings.sty b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings.sty
index 5059ef9d53e..aa8c2bd3fda 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings.sty
@@ -17,33 +17,75 @@
\setcatcoderange{"20000}{"2FFFF}{13}}
% lowest level
+\def\lst@kanjitrue{\let\lst@ifkanji\iftrue}
+\def\lst@kanjifalse{\let\lst@ifkanji\iffalse}
+\lst@AddToHook{InitVars}{\lst@kanjifalse}
+
+\def\lst@AppendOther{%
+ \lst@ifletter\lst@Output\lst@letterfalse\fi\lst@kanjifalse
+ \futurelet\lst@lastother\lst@Append}
+\def\lst@AppendLetter{%
+ \lst@ifletter
+ \lst@ifkanji\lst@Output\lst@kanjifalse
+ \fi
+ \else
+ \lst@lettertrue\lst@ifkanji\lst@kanjifalse\else\lst@OutputOther\fi
+ \fi
+ \lst@Append}
+
\def\lst@ProcessJALetter{\lst@whitespacefalse \lst@AppendJALetter}
+\def\lst@ProcessJALetterHalf{\lst@whitespacefalse \lst@AppendJALetterHalf}
+\def\lst@ProcessJALetter@inhibit@prebreak{%
+ \lst@whitespacefalse \lst@AppendJALetter@inhibit@prebreak}
+\def\lst@ProcessJALetter@inhibit@postbreak{%
+ \lst@whitespacefalse \lst@AppendJALetter@inhibit@postbreak}
+
\def\lst@AppendJALetter{%
- \lst@ifletter \lst@Output\else\lst@OutputOther\fi\lst@lettertrue
+ \lst@ifletter
+ \lst@Output
+ \else
+ \lst@ifkanji\else\lst@OutputOther\fi\lst@lettertrue
+ \fi\lst@kanjitrue
\advance\lst@length\@ne\lst@Append}
-\def\lst@ProcessJALetterHalf{\lst@whitespacefalse \lst@AppendJALetterHalf}
\def\lst@AppendJALetterHalf{%
- \lst@ifletter \lst@Output\else\lst@OutputOther\fi\lst@lettertrue
+ \lst@ifletter
+ \lst@Output
+ \else
+ \lst@ifkanji\else\lst@OutputOther\fi\lst@lettertrue
+ \fi\lst@kanjitrue
\lst@Append}
+\def\lst@AppendJALetter@inhibit@prebreak{%
+ \lst@ifletter\else\lst@lettertrue\fi\lst@kanjitrue
+ \advance\lst@length\@ne\lst@Append}
+\def\lst@AppendJALetter@inhibit@postbreak{%
+ \lst@ifletter
+ \lst@Output
+ \else
+ \lst@ifkanji\else\lst@OutputOther\fi
+ \fi\lst@letterfalse\lst@kanjitrue
+ \advance\lst@length\@ne\lst@Append}
+
% loading lltjp-listing-jpt.tex
\def\ltj@@listing@jpset#1#2{% fast: #2-#1+1 must be a multiple of 16
\@tempcnta=#1 \@tempcntb=#2 \@temptokena{}%
\loop\relax\ifnum\@tempcnta<\@tempcntb\relax
\ltj@@listing@jpset@\global\advance\@tempcnta\sixt@@n\repeat
- \expandafter\edef\csname ltj@@listing@jpcmd@i#1\endcsname{\the\@temptokena}%
- \toks@\expandafter\expandafter\expandafter\expandafter%
- \expandafter\expandafter\expandafter{\expandafter\expandafter%
- \expandafter\the\expandafter\toks@\csname ltj@@listing@jpcmd@i#1\endcsname}%
+ \ltj@@listing@jpset@after{#1}
}
-\def\ltj@@listing@jpsetN#1#2#3{%
- \@tempcnta=#1 \@tempcntb=#2 \@temptokena{}%
+\def\ltj@@listing@jpsetN#1#2#3{% for (not large) range
+ \@tempcnta=#1 \@tempcntb=\numexpr 1+#2\relax \@temptokena{}%
\loop \global\advance\@tempcnta\@ne\ifnum\@tempcnta<\@tempcntb\relax
- \ltj@@listing@jpsetN@#3\repeat
+ \ltj@@listing@jpsetN@{\@tempcnta}{#3}\repeat
+ \ltj@@listing@jpset@after{#1}
+}
+
+\def\ltj@@listing@jpset@after#1{%
\expandafter\edef\csname ltj@@listing@jpcmd@i#1\endcsname{\the\@temptokena}%
\toks@\expandafter\expandafter\expandafter\expandafter%
\expandafter\expandafter\expandafter{\expandafter\expandafter%
\expandafter\the\expandafter\toks@\csname ltj@@listing@jpcmd@i#1\endcsname}%
+ \@temptokena{}%
}
\begingroup
@@ -87,9 +129,9 @@
\expandafter\expandafter\expandafter{\expandafter\expandafter%
\expandafter\the\expandafter\@temptokena\@temp}%
}
-\gdef\ltj@@listing@jpsetN@#1{{%
- \lccode`\~=\@tempcnta \lccode`\/=\@tempcnta
- \lowercase{\gdef\@temp{\gdef~{#1/}}}}%
+\gdef\ltj@@listing@jpsetN@#1#2{{%
+ \@tempcnta=#1 \lccode`\~=\@tempcnta \lccode`\/=\@tempcnta
+ \lowercase{\gdef\@temp{\gdef~{#2/}}}}%
\@temptokena\expandafter\expandafter\expandafter\expandafter%
\expandafter\expandafter\expandafter{\expandafter\expandafter%
\expandafter\the\expandafter\@temptokena\@temp}%