summaryrefslogtreecommitdiff
path: root/macros/luatex/generic/luatexja/src
diff options
context:
space:
mode:
Diffstat (limited to 'macros/luatex/generic/luatexja/src')
-rw-r--r--macros/luatex/generic/luatexja/src/addons/luatexja-otf.sty5
-rw-r--r--macros/luatex/generic/luatexja/src/jfm-CCT.lua6
-rw-r--r--macros/luatex/generic/luatexja/src/jfm-banjiao.lua4
-rw-r--r--macros/luatex/generic/luatexja/src/jfm-jis.lua4
-rw-r--r--macros/luatex/generic/luatexja/src/jfm-kaiming.lua6
-rw-r--r--macros/luatex/generic/luatexja/src/jfm-min.lua6
-rw-r--r--macros/luatex/generic/luatexja/src/jfm-quanjiao.lua4
-rw-r--r--macros/luatex/generic/luatexja/src/jfm-ujis.lua4
-rw-r--r--macros/luatex/generic/luatexja/src/jfm-ujisv.lua2
-rw-r--r--macros/luatex/generic/luatexja/src/lltjext.sty4
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-adjust.lua142
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-base.lua26
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-base.sty2
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-charrange.lua43
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-compat.lua35
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-debug.lua12
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-direction.lua454
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-inputbuf.lua6
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-jfmglue.lua268
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-jfont.lua92
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-kinsoku.tex2
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-lineskip.lua32
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-lotf_aux.lua18
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-math.lua84
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-otf.lua24
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-pretreat.lua63
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-rmlgbm.lua6
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-ruby.lua214
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-setwidth.lua94
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-stack.lua54
-rw-r--r--macros/luatex/generic/luatexja/src/ltjclasses.dtx10
-rw-r--r--macros/luatex/generic/luatexja/src/ltjsclasses.dtx17
-rw-r--r--macros/luatex/generic/luatexja/src/luatexja-core.sty82
-rw-r--r--macros/luatex/generic/luatexja/src/luatexja.lua104
-rw-r--r--macros/luatex/generic/luatexja/src/luatexja.sty2
-rw-r--r--macros/luatex/generic/luatexja/src/patches/lltjfont.sty1
-rw-r--r--macros/luatex/generic/luatexja/src/patches/lltjp-atbegshi.sty6
-rw-r--r--macros/luatex/generic/luatexja/src/patches/lltjp-everyshi.sty2
-rw-r--r--macros/luatex/generic/luatexja/src/patches/lltjp-tascmac.sty45
39 files changed, 1025 insertions, 960 deletions
diff --git a/macros/luatex/generic/luatexja/src/addons/luatexja-otf.sty b/macros/luatex/generic/luatexja/src/addons/luatexja-otf.sty
index 6ac200b7e6..37346b2fad 100644
--- a/macros/luatex/generic/luatexja/src/addons/luatexja-otf.sty
+++ b/macros/luatex/generic/luatexja/src/addons/luatexja-otf.sty
@@ -64,7 +64,7 @@
\expandafter\let\csname ifltj@in@latex\expandafter\endcsname
\csname iftrue\endcsname
\NeedsTeXFormat{LaTeX2e}
- \ProvidesPackage{luatexja-otf}[2019-09-26]
+ \ProvidesPackage{luatexja-otf}[2022-10-02]
\fi %</LaTeX>
% Load core module if not yet.
@@ -85,8 +85,7 @@
%! Main part of luatexja-otf
\RequireLuaTeXjaSubmodule{otf}
-\newcount\ltj@tempcnta
-
+%\newcount\ltj@tempcnta % defined at luatexja-core.sty
\protected\def\CID#1{\ifvmode\leavevmode\fi\ltj@tempcnta#1\relax\directlua{luatexja.otf.cid(\the\ltj@tempcnta)}\relax}
%% \UTF compatible with the OTF package for pLaTeX
diff --git a/macros/luatex/generic/luatexja/src/jfm-CCT.lua b/macros/luatex/generic/luatexja/src/jfm-CCT.lua
index c41f6da311..5d861ba761 100644
--- a/macros/luatex/generic/luatexja/src/jfm-CCT.lua
+++ b/macros/luatex/generic/luatexja/src/jfm-CCT.lua
@@ -13,7 +13,7 @@ luatexja.jfont.define_jfm {
[1] = { -- fw. opening punctuations
chars = {
- 0x2018, 0x201C, 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 0x3016,
+ 0x2018, 0x201C, 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 0x3016,
0x3018, 0x301D, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F
},
align = 'right', left = 0.0, down = 0.0,
@@ -25,9 +25,9 @@ luatexja.jfont.define_jfm {
[2] = { -- fw. closing/colon punctuations
chars = {
- 0x2019, 0x201D, 0x3001, 0x3009, 0x300B, 0x300D, 0x300F, 0x3011, 0x3015,
+ 0x2019, 0x201D, 0x3001, 0x3009, 0x300B, 0x300D, 0x300F, 0x3011, 0x3015,
0x3017, 0x3019, 0x301F, 0xFF09, 0xFF0C, 0xFF3D, 0xFF5D, 0xFF60,
- 0xFF1A, 0xFF1B
+ 0xFF1A, 0xFF1B
},
align = 'left', left = 0.0, down = 0.0,
width = 0.5, height = 0.88, depth = 0.12, italic=0.0,
diff --git a/macros/luatex/generic/luatexja/src/jfm-banjiao.lua b/macros/luatex/generic/luatexja/src/jfm-banjiao.lua
index 783e836ba2..b30d040548 100644
--- a/macros/luatex/generic/luatexja/src/jfm-banjiao.lua
+++ b/macros/luatex/generic/luatexja/src/jfm-banjiao.lua
@@ -13,7 +13,7 @@ luatexja.jfont.define_jfm {
[1] = { -- fw. opening punctuations
chars = {
- 0x2018, 0x201C, 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 0x3016,
+ 0x2018, 0x201C, 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 0x3016,
0x3018, 0x301D, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F
},
align = 'right', left = 0.0, down = 0.0,
@@ -25,7 +25,7 @@ luatexja.jfont.define_jfm {
[2] = { -- fw. closing/colon/dot punctuations, except 4 & 7
chars = {
- 0x2019, 0x201D, 0x3009, 0x300B, 0x300D, 0x300F, 0x3011, 0x3015,
+ 0x2019, 0x201D, 0x3009, 0x300B, 0x300D, 0x300F, 0x3011, 0x3015,
0x3017, 0x3019, 0x301F, 0xFF09, 0xFF0C, 0xFF3D, 0xFF5D, 0xFF60,
0xFF0E, 0xFF1A, 0xFF1B, 0xFF01, 0xFF1F
},
diff --git a/macros/luatex/generic/luatexja/src/jfm-jis.lua b/macros/luatex/generic/luatexja/src/jfm-jis.lua
index 642a2475e5..818e3abc80 100644
--- a/macros/luatex/generic/luatexja/src/jfm-jis.lua
+++ b/macros/luatex/generic/luatexja/src/jfm-jis.lua
@@ -21,7 +21,7 @@ luatexja.jfont.define_jfm {
[1] = { -- 開き括弧類
chars = {
- '‘', '“', '〈', '《', '「', '『', '【', '〔', '〖',
+ '‘', '“', '〈', '《', '「', '『', '【', '〔', '〖',
'〘', '〝', '(', '[', '{', '⦅'
},
align = 'right', left = 0.0, down = 0.0,
@@ -33,7 +33,7 @@ luatexja.jfont.define_jfm {
[2] = { -- 閉じ括弧類
chars = {
- '’', '”', '、', '〉', '》', '」', '』', '】', '〕',
+ '’', '”', '、', '〉', '》', '」', '』', '】', '〕',
'〗', '〙', '〟', ')', ',', ']', '}', '⦆'
},
align = 'left', left = 0.0, down = 0.0,
diff --git a/macros/luatex/generic/luatexja/src/jfm-kaiming.lua b/macros/luatex/generic/luatexja/src/jfm-kaiming.lua
index 63ac222311..a046488475 100644
--- a/macros/luatex/generic/luatexja/src/jfm-kaiming.lua
+++ b/macros/luatex/generic/luatexja/src/jfm-kaiming.lua
@@ -13,7 +13,7 @@ luatexja.jfont.define_jfm {
[1] = { -- fw. opening punctuations
chars = {
- 0x2018, 0x201C, 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 0x3016,
+ 0x2018, 0x201C, 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 0x3016,
0x3018, 0x301D, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F
},
align = 'right', left = 0.0, down = 0.0,
@@ -25,9 +25,9 @@ luatexja.jfont.define_jfm {
[2] = { -- fw. closing/colon/dot punctuations, except 4 & 7
chars = {
- 0x2019, 0x201D, 0x3009, 0x300B, 0x300D, 0x300F, 0x3011, 0x3015,
+ 0x2019, 0x201D, 0x3009, 0x300B, 0x300D, 0x300F, 0x3011, 0x3015,
0x3017, 0x3019, 0x301F, 0xFF09, 0xFF0C, 0xFF3D, 0xFF5D, 0xFF60,
- 0xFF0E, 0xFF1A, 0xFF1B
+ 0xFF0E, 0xFF1A, 0xFF1B
},
align = 'left', left = 0.0, down = 0.0,
width = 0.5, height = 0.88, depth = 0.12, italic=0.0,
diff --git a/macros/luatex/generic/luatexja/src/jfm-min.lua b/macros/luatex/generic/luatexja/src/jfm-min.lua
index b59b5329c4..e07b330039 100644
--- a/macros/luatex/generic/luatexja/src/jfm-min.lua
+++ b/macros/luatex/generic/luatexja/src/jfm-min.lua
@@ -68,8 +68,8 @@ luatexja.jfont.define_jfm {
[3] = {
chars = {
'∴', '♀', '♂', '〃', '々', 'ぁ', 'ぃ', 'ぅ', 'ぇ', 'ぉ', 'っ', 'ゃ', 'ゅ ',
- 'ょ', 'ゎ', 'ゕ', 'ゖ', 'ゞ', 'ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ッ', 'ャ', 'ュ', 'ョ',
- 'ヮ', 'ヵ', 'ヶ', 'ㇰ', 'ㇱ', 'ㇲ', 'ㇳ', 'ㇴ', 'ㇵ', 'ㇶ', 'ㇷ', 'ㇸ', 'ㇹ', 'ㇺ',
+ 'ょ', 'ゎ', 'ゕ', 'ゖ', 'ゞ', 'ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ッ', 'ャ', 'ュ', 'ョ',
+ 'ヮ', 'ヵ', 'ヶ', 'ㇰ', 'ㇱ', 'ㇲ', 'ㇳ', 'ㇴ', 'ㇵ', 'ㇶ', 'ㇷ', 'ㇸ', 'ㇹ', 'ㇺ',
'ㇻ', 'ㇼ', 'ㇽ', 'ㇾ', 'ㇿ', '$', '¢', '£'
},
align = 'middle', left = 0.0, down = 0.0,
@@ -207,7 +207,7 @@ luatexja.jfont.define_jfm {
},
[12] = {
chars = {
- 'ア', 'イ', 'ウ', 'オ', 'ケ', 'ゲ', 'サ', 'ザ', 'ソ', 'ゾ', 'チ', 'ヂ', 'ツ',
+ 'ア', 'イ', 'ウ', 'オ', 'ケ', 'ゲ', 'サ', 'ザ', 'ソ', 'ゾ', 'チ', 'ヂ', 'ツ',
'ヅ', 'ト', 'ド', 'ナ', 'フ', 'ブ', 'プ', 'ミ', 'メ', 'ラ', 'リ', 'ワ', 'ヲ'
},
align = 'left', left = 0.0, down = 0.0,
diff --git a/macros/luatex/generic/luatexja/src/jfm-quanjiao.lua b/macros/luatex/generic/luatexja/src/jfm-quanjiao.lua
index 20590b6a96..2718e1b715 100644
--- a/macros/luatex/generic/luatexja/src/jfm-quanjiao.lua
+++ b/macros/luatex/generic/luatexja/src/jfm-quanjiao.lua
@@ -13,7 +13,7 @@ luatexja.jfont.define_jfm {
[1] = { -- fw. opening punctuations
chars = {
- 0x2018, 0x201C, 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 0x3016,
+ 0x2018, 0x201C, 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 0x3016,
0x3018, 0x301D, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F
},
align = 'right', left = 0.0, down = 0.0,
@@ -25,7 +25,7 @@ luatexja.jfont.define_jfm {
[2] = { -- fw. closing/colon/dot punctuations, except 4 & 7
chars = {
- 0x2019, 0x201D, 0x3009, 0x300B, 0x300D, 0x300F, 0x3011, 0x3015,
+ 0x2019, 0x201D, 0x3009, 0x300B, 0x300D, 0x300F, 0x3011, 0x3015,
0x3017, 0x3019, 0x301F, 0xFF09, 0xFF0C, 0xFF3D, 0xFF5D, 0xFF60,
0xFF0E, 0xFF1A, 0xFF1B, 0xFF01, 0xFF1F
},
diff --git a/macros/luatex/generic/luatexja/src/jfm-ujis.lua b/macros/luatex/generic/luatexja/src/jfm-ujis.lua
index 08f567d20a..2b94eca6db 100644
--- a/macros/luatex/generic/luatexja/src/jfm-ujis.lua
+++ b/macros/luatex/generic/luatexja/src/jfm-ujis.lua
@@ -26,7 +26,7 @@ local t = {
[207] = { 0, 0, 0, kanjiskip_shrink=1 },
[8] = { 0, 0, 0, kanjiskip_shrink=1 },
},
- kern = { [307] = 0 },
+ kern = { [307] = 0 },
round_threshold = 0.01,
},
@@ -250,7 +250,7 @@ local t = {
[6] = { 0, 0, 0, kanjiskip_shrink=1 },
[8] = { 0, 0, 0, kanjiskip_shrink=1 },
},
- kern = { [307] = 0 },
+ kern = { [307] = 0 },
},
[107] = { -- 1/3 角
diff --git a/macros/luatex/generic/luatexja/src/jfm-ujisv.lua b/macros/luatex/generic/luatexja/src/jfm-ujisv.lua
index 2bfe670b9e..7e870046c5 100644
--- a/macros/luatex/generic/luatexja/src/jfm-ujisv.lua
+++ b/macros/luatex/generic/luatexja/src/jfm-ujisv.lua
@@ -26,7 +26,7 @@ local t = {
[207] = { 0, 0, 0, kanjiskip_shrink=1 },
[8] = { 0, 0, 0, kanjiskip_shrink=1 },
},
- kern = { [307] = 0 },
+ kern = { [307] = 0 },
round_threshold = 0.01,
},
diff --git a/macros/luatex/generic/luatexja/src/lltjext.sty b/macros/luatex/generic/luatexja/src/lltjext.sty
index 532e7a2934..a83c9305c9 100644
--- a/macros/luatex/generic/luatexja/src/lltjext.sty
+++ b/macros/luatex/generic/luatexja/src/lltjext.sty
@@ -3,7 +3,7 @@
%
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{lltjext}[2021-04-20 v1.2k-ltj-13 Macros for vertical writing]
+\ProvidesPackage{lltjext}[2022-08-24 v1.2k-ltj-14 Macros for vertical writing]
\RequirePackage{luatexja}
\newcount\ltj@ext@dir
\let\ltj@lltjext@orig@tabular=\tabular
@@ -511,6 +511,8 @@
\def\ltj@@pic@reset@blshift{%
\ltj@yablshift\z@\ltj@ykblshift\z@
\ltj@tablshift\z@\ltj@tkblshift\z@
+ %\unsetattribute\ltj@yablshift\unsetattribute\ltj@ykblshift
+ %\unsetattribute\ltj@tablshift\unsetattribute\ltj@tkblshift
}%
\def\@@picture<#1>(#2,#3)(#4,#5){%
\edef\ltj@@pic@save@blshift{%
diff --git a/macros/luatex/generic/luatexja/src/ltj-adjust.lua b/macros/luatex/generic/luatexja/src/ltj-adjust.lua
index 053b63ab1a..89ad7816d2 100644
--- a/macros/luatex/generic/luatexja/src/ltj-adjust.lua
+++ b/macros/luatex/generic/luatexja/src/ltj-adjust.lua
@@ -12,21 +12,29 @@ luatexja.adjust = luatexja.adjust or {}
local to_node = node.direct.tonode
local to_direct = node.direct.todirect
-local setfield = node.direct.setfield
-local setglue = luatexja.setglue
local getfield = node.direct.getfield
local getlist = node.direct.getlist
local getid = node.direct.getid
local getfont = node.direct.getfont
local getsubtype = node.direct.getsubtype
+local getlang = node.direct.getlang
+local getkern = node.direct.getkern
+local getshift = node.direct.getshift
+local getwidth = node.direct.getwidth
+local getdepth = node.direct.getdepth
+local setfield = node.direct.setfield
+local setpenalty = node.direct.setpenalty
+local setglue = node.direct.setglue
+local setkern = node.direct.setkern
+local setlist = node.direct.setlist
local node_traverse_id = node.direct.traverse_id
local node_new = node.direct.new
local node_next = node.direct.getnext
-local node_free = node.direct.free
+local node_free = node.direct.flush_node or node.direct.free
local node_prev = node.direct.getprev
local node_tail = node.direct.tail
-local has_attr = node.direct.has_attribute
+local get_attr = node.direct.get_attribute
local set_attr = node.direct.set_attribute
local insert_after = node.direct.insert_after
@@ -55,7 +63,7 @@ local get_attr_icflag
do
local PROCESSED_BEGIN_FLAG = luatexja.icflag_table.PROCESSED_BEGIN_FLAG
get_attr_icflag = function(p)
- return (has_attr(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG
+ return (get_attr(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG
end
end
@@ -73,7 +81,7 @@ do
for i=0,63 do tmp[#tmp+1] = { (i%8)-4, FROM_JFM+i } end
else -- stretch
for i=0,63 do tmp[#tmp+1] = { math.floor(i/8)-4, FROM_JFM+i } end
- end
+ end
local pt = priority_table[glue_sign]
tmp[#tmp+1] = { pt[2]/10, XKANJI_SKIP }
tmp[#tmp+1] = { pt[2]/10, XKANJI_SKIP_JFM }
@@ -111,13 +119,13 @@ function get_total_stretched(p)
for q in node_traverse_id(id_glue, ph) do
local a = getfield(q, 'stretch_order')
if a==0 then
- local b = at2pr_st[get_attr_icflag(q)];
+ local b = at2pr_st[get_attr_icflag(q)];
total_st[b] = total_st[b]+getfield(q, 'stretch')
end
total_st[a*65536] = total_st[a]+getfield(q, 'stretch')
local a = getfield(q, 'shrink_order')
if a==0 then
- local b = at2pr_sh[get_attr_icflag(q)];
+ local b = at2pr_sh[get_attr_icflag(q)];
total_sh[b] = total_sh[b]+getfield(q, 'shrink')
end
total_sh[a*65536] = total_sh[a]+getfield(q, 'shrink')
@@ -130,7 +138,7 @@ function get_total_stretched(p)
if not total_sh.order then
total_sh.order, total_sh[-65536] = -1,0.1 -- dummy
end
- return getfield(p,'width') - dimensions(ph)
+ return getwidth(p) - dimensions(ph)
end
end
@@ -152,7 +160,7 @@ local function aw_step1(p, total)
-- 無限大のグルーで処理が行われているときは処理中止.
return total, false
end
- if xi == id_glyph and getfield(x, 'lang')==lang_ja then
+ if xi == id_glyph and getlang(x)==lang_ja then
-- 和文文字
xc = x
elseif xi == id_hlist and get_attr_icflag(x) == PACKED then
@@ -163,8 +171,8 @@ local function aw_step1(p, total)
return total, false-- それ以外は対象外.
end
local eadt = ltjf_font_metric_table[getfont(xc)]
- .char_type[has_attr(xc, attr_jchar_class) or 0].end_adjust
- if not eadt then
+ .char_type[get_attr(xc, attr_jchar_class) or 0].end_adjust
+ if not eadt then
return total, false
end
local eadt_ratio = {}
@@ -176,8 +184,8 @@ local function aw_step1(p, total)
eadt_ratio[i] = {i, t/total_sh[65536*total_sh.order], t, v}
end
end
- table.sort(eadt_ratio,
- function (a,b)
+ table.sort(eadt_ratio,
+ function (a,b)
for i=2,4 do
local at, bt = abs(a[i]), abs(b[i])
if at~=bt then return at<bt end
@@ -186,7 +194,7 @@ local function aw_step1(p, total)
end)
if eadt[eadt_ratio[1][1]]~=0 then
local kn = node_new(id_kern, 1)
- setfield(kn, 'kern', eadt[eadt_ratio[1][1]]); set_attr(kn, attr_icflag, LINEEND)
+ setkern(kn, eadt[eadt_ratio[1][1]]); set_attr(kn, attr_icflag, LINEEND)
insert_after(head, x, kn)
return eadt_ratio[1][3], true
else
@@ -196,6 +204,7 @@ end
-- step 1 最終行用
local min, max = math.min, math.max
+local setsubtype = node.direct.setsubtype
local function aw_step1_last(p, total)
local head = getlist(p)
local x = node_tail(head); if not x then return total, false end
@@ -204,7 +213,7 @@ local function aw_step1_last(p, total)
if getid(pf) ~= id_glue or getsubtype(pf) ~= 15 then return total, false end
x = node_prev(node_prev(pf))
local xi, xc = getid(x)
- if xi == id_glyph and getfield(x, 'lang')==lang_ja then
+ if xi == id_glyph and getlang(x)==lang_ja then
-- 和文文字
xc = x
elseif xi == id_hlist and get_attr_icflag(x) == PACKED then
@@ -230,30 +239,30 @@ local function aw_step1_last(p, total)
end
end
local eadt = ltjf_font_metric_table[getfont(xc)]
- .char_type[has_attr(xc, attr_jchar_class) or 0].end_adjust
- if not eadt then
+ .char_type[get_attr(xc, attr_jchar_class) or 0].end_adjust
+ if not eadt then
return total, false
end
-- 続行条件2: min(eadt[1], 0)<= \parfillskip <= max(eadt[#eadt], 0)
- local pfw = getfield(pf, 'width')
- + (total>0 and getfield(pf, 'stretch') or -getfield(pf, 'shrink')) *getfield(p, 'glue_set')
+ local pfw = getwidth(pf)
+ + (total>0 and getfield(pf, 'stretch') or -getfield(pf, 'shrink')) *getfield(p, 'glue_set')
if pfw<min(0,eadt[1]) or max(0,eadt[#eadt])<pfw then return total, false end
-- \parfillskip を 0 にする
- total = total + getfield(pf, 'width')
+ total = total + getwidth(pf)
total_st.order, total_sh.order = 0, 0
- if getfield(pf, 'stretch_order')==0 then
- local i = at2pr_st[-1]
- total_st[0] = total_st[0] - getfield(pf, 'stretch')
- total_st[i] = total_st[i] - getfield(pf, 'stretch')
+ if getfield(pf, 'stretch_order')==0 then
+ local i = at2pr_st[-1]
+ total_st[0] = total_st[0] - getfield(pf, 'stretch')
+ total_st[i] = total_st[i] - getfield(pf, 'stretch')
total_st.order = (total_st[0]==0) and -1 or 0
end
- if getfield(pf, 'shrink_order')==0 then
- local i = at2pr_sh[-1]
- total_sh[0] = total_sh[0] - getfield(pf, 'shrink')
- total_sh[i] = total_sh[i] - getfield(pf, 'shrink')
+ if getfield(pf, 'shrink_order')==0 then
+ local i = at2pr_sh[-1]
+ total_sh[0] = total_sh[0] - getfield(pf, 'shrink')
+ total_sh[i] = total_sh[i] - getfield(pf, 'shrink')
total_sh.order = (total_sh[0]==0) and -1 or 0
end
- setfield(pf, 'subtype', 1); setglue(pf)
+ setsubtype(pf, 1); setglue(pf)
local eadt_ratio = {}
for i, v in ipairs(eadt) do
local t = total - v
@@ -263,8 +272,8 @@ local function aw_step1_last(p, total)
eadt_ratio[i] = {i, t/total_sh[65536*total_sh.order], t, v}
end
end
- table.sort(eadt_ratio,
- function (a,b)
+ table.sort(eadt_ratio,
+ function (a,b)
for i=2,4 do
local at, bt = abs(a[i]), abs(b[i])
if at~=bt then return at<bt end
@@ -273,7 +282,7 @@ local function aw_step1_last(p, total)
end)
if eadt[eadt_ratio[1][1]]~=0 then
local kn = node_new(id_kern, 1)
- setfield(kn, 'kern', eadt[eadt_ratio[1][1]]); set_attr(kn, attr_icflag, LINEEND)
+ setkern(kn, eadt[eadt_ratio[1][1]]); set_attr(kn, attr_icflag, LINEEND)
insert_after(head, x, kn)
return eadt_ratio[1][3], true
else
@@ -289,9 +298,9 @@ local node_hpack = node.direct.hpack
local function repack(p)
local orig_of, orig_hfuzz, orig_hbad = tex.overfullrule, tex.hfuzz, tex.hbadness
tex.overfullrule=0; tex.hfuzz=1073741823; tex.hbadness=10000
- local f = node_hpack(getlist(p), getfield(p, 'width'), 'exactly')
+ local f = node_hpack(getlist(p), getwidth(p), 'exactly')
tex.overfullrule=orig_of; tex.hfuzz=orig_hfuzz; tex.hbadness=orig_hbad
- setfield(f, 'head', nil)
+ setlist(f, nil)
setfield(p, 'glue_set', getfield(f, 'glue_set'))
setfield(p, 'glue_order', getfield(f, 'glue_order'))
setfield(p, 'glue_sign', getfield(f, 'glue_sign'))
@@ -328,14 +337,14 @@ function aw_step2(p, total, added_flag)
local id = (total>0) and 1 or 2
local res = total_stsh[id]
local pnum = priority_num[id]
- if total==0 or res.order > 0 then
+ if total==0 or res.order > 0 then
-- もともと伸縮の必要なしか,残りの伸縮量は無限大
if added_flag then return repack(p) end
end
total = abs(total)
for i = 1, pnum do
if total <= res[i] then
- local a = at2pr[id]
+ local a = at2pr[id]
for j = i+1,pnum do
clear_stretch(p, j, a, name)
end
@@ -353,32 +362,32 @@ do
local insert_before = node.direct.insert_before
local KINSOKU = luatexja.icflag_table.KINSOKU
insert_lineend_kern = function (head, nq, np, Bp)
- if nq.met then
+ if nq.met then
local eadt = nq.met.char_type[nq.class].end_adjust
if not eadt then return end
if eadt[1]~=0 then
local x = node_new(id_kern, 1)
- setfield(x, 'kern', eadt[1]); set_attr(x, attr_icflag, LINEEND)
+ setkern(x, eadt[1]); set_attr(x, attr_icflag, LINEEND)
insert_before(head, np.first, x)
end
local eadt_num = #eadt
for i=2,eadt_num do
local x = node_new(id_penalty)
- setfield(x, 'penalty', 0); set_attr(x, attr_icflag, KINSOKU)
+ setpenalty(x, 0); set_attr(x, attr_icflag, KINSOKU)
insert_before(head, np.first, x); Bp[#Bp+1] = x
local x = node_new(id_kern, 1)
- setfield(x, 'kern', eadt[i]-eadt[i-1]); set_attr(x, attr_icflag, LINEEND)
+ setkern(x, eadt[i]-eadt[i-1]); set_attr(x, attr_icflag, LINEEND)
insert_before(head, np.first, x)
end
if eadt_num>1 or eadt[1]~=0 then
local x = node_new(id_penalty)
- setfield(x, 'penalty', 0); set_attr(x, attr_icflag, KINSOKU)
+ setpenalty(x, 0); set_attr(x, attr_icflag, KINSOKU)
insert_before(head, np.first, x); Bp[#Bp+1] = x
local x = node_new(id_kern, 1)
- setfield(x, 'kern', -eadt[eadt_num]); set_attr(x, attr_icflag, LINEEND)
+ setkern(x, -eadt[eadt_num]); set_attr(x, attr_icflag, LINEEND)
insert_before(head, np.first, x)
local x = node_new(id_penalty)
- setfield(x, 'penalty', 10000); set_attr(x, attr_icflag, KINSOKU)
+ setpenalty(x, 10000); set_attr(x, attr_icflag, KINSOKU)
insert_before(head, np.first, x); Bp[#Bp+1] = x
end
end
@@ -389,7 +398,6 @@ local adjust_width
do
local myaw_step1, myaw_step2, myaw_step1_last
local dummy = function(p,t,n) return t, false end
- local ltjs_fast_get_stack_skip = ltjs.fast_get_stack_skip
function adjust_width(head)
if not head then return head end
local last_p
@@ -408,7 +416,7 @@ do
local function enable_cb(status_le, status_pr, status_lp, status_ls)
if (status_le>0 or status_pr>0) and (not is_reg) then
ltjb.add_to_callback('post_linebreak_filter',
- adjust_width, 'Adjust width',
+ adjust_width, 'Adjust width',
luatexbase.priority_in_callback('post_linebreak_filter', 'ltj.lineskip')-1)
is_reg = true
elseif is_reg and (status_le==0 and status_pr==0) then
@@ -493,28 +501,26 @@ luatexja.unary_pars.profile_hgap_factor = function(t)
return luatexja.adjust.profile_hgap_factor
end
do
- local insert = table.insert
+ local insert, texget = table.insert, tex.get
local rangedimensions, max = node.direct.rangedimensions, math.max
local function profile_inner(box, range, ind, vmirrored, adj)
- local w_acc, d_before = getfield(box,'shift'), 0
+ local w_acc, d_before = getshift(box), 0
local x = getlist(box); local xn = node_next(x)
while x do
local w, h, d
- if xn then w, h, d= rangedimensions(box,x,xn)
- else w, h, d= rangedimensions(box,x) end
+ if xn then w, h, d = rangedimensions(box,x,xn)
+ else w, h, d = rangedimensions(box,x) end
if vmirrored then h=d end
local w_new = w_acc + w
- if w>=0 then
- range:insert(ind, h, w_acc-adj, w_new)
- else
- range:insert(ind, h, w_new-adj, w_acc)
+ if w>=0 then range:insert(ind, h, w_acc-adj, w_new)
+ else range:insert(ind, h, w_new-adj, w_acc)
end
w_acc = w_new; x = xn; if x then xn = node_next(x) end
end
- end
+ end
function ltjl.p_profile(before, after, mirrored, bw)
- local range, tls
- = init_range(), luatexja.adjust.profile_hgap_factor*tex.get('lineskip', false)
+ local range, tls
+ = init_range(), luatexja.adjust.profile_hgap_factor*texget('lineskip', false)
profile_inner(before, range, 3, true, tls)
profile_inner(after, range, 4, mirrored, tls)
range = range:flatten()
@@ -527,8 +533,8 @@ do
if bw-h-d<lmin then lmin=bw-h-d end
end
if lmin==1/0 then lmin = bw end
- return lmin,
- bw - lmin - getfield(before, 'depth')
+ return lmin,
+ bw - lmin - getdepth(before)
- getfield(after, mirrored and 'depth' or 'height')
end
end
@@ -536,7 +542,7 @@ end
do
local ltja = luatexja.adjust
- local copy_glue = ltjl.copy_glue
+ local copy_glue, texget = ltjl.copy_glue, tex.get
local floor, max = math.floor, math.max
function ltjl.l_step(dist, g, adj, normal, bw, loc)
if loc=='alignment' then
@@ -544,7 +550,7 @@ do
end
if dist < tex.lineskiplimit then
local f = max(1, bw*ltja.step_factor)
- copy_glue(g, 'baselineskip', 1, normal - f * floor((dist-tex.get('lineskip', false))/f))
+ copy_glue(g, 'baselineskip', 1, normal - f * floor((dist-texget('lineskip', false))/f))
else
copy_glue(g, 'baselineskip', 2, normal)
end
@@ -556,13 +562,15 @@ do
local sid_user = node.subtype 'user_defined'
local node_remove = node.direct.remove
local node_write = node.direct.write
+ local getvalue = node.direct.getdata
+ local setvalue = node.direct.setdata
local GHOST_JACHAR = luatexbase.newuserwhatsitid('ghost of a jachar', 'luatexja')
luatexja.userid_table.GHOST_JACHAR = GHOST_JACHAR
function ltja.create_ghost_jachar_node(cl)
local tn = node_new(id_whatsit, sid_user)
setfield(tn, 'user_id', GHOST_JACHAR)
setfield(tn, 'type', 100)
- setfield(tn, 'value', cl)
+ setvalue(tn, cl)
node_write(tn)
end
local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
@@ -570,19 +578,21 @@ do
local dir_tate = luatexja.dir_table.dir_tate
local get_dir_count = ltjd.get_dir_count
local ltjf_font_metric_table = ltjf.font_metric_table
+ local has_attr = node.direct.has_attribute
local function get_current_metric(n)
- local fn = has_attr(n, (get_dir_count()==dir_tate) and attr_curtfnt or attr_curjfnt)
+ local fn = get_attr(n, (get_dir_count()==dir_tate) and attr_curtfnt or attr_curjfnt)
return fn and ltjf_font_metric_table[fn]
end
local function whatsit_callback(Np, lp, Nq)
if Np and Np.nuc then return Np
elseif Np and getfield(lp, 'user_id') == GHOST_JACHAR then
Np.first = lp; Np.nuc = lp; Np.last = lp; Np.class = 0
- if getfield(lp,'value')<2 then
+ if getvalue(lp)<2 then
if Nq and Nq.met then Np.met = Nq.met; else Np.met = get_current_metric(lp) end
Np.pre = 0; Np.post = 0; Np.xspc = 3
else Np.met, Np.pre = nil, nil; end
- Np.auto_kspc, Np.auto_xspc = (has_attr(lp, attr_autospc)==1), (has_attr(lp, attr_autoxspc)==1)
+ Np.auto_kspc, Np.auto_xspc
+ = not has_attr(lp, attr_autospc, 0), not has_attr(lp, attr_autoxspc, 0)
return Np
else return Np end
end
@@ -590,7 +600,7 @@ do
if not s and getfield(Nq.nuc, 'user_id') == GHOST_JACHAR then
local x, y = node_prev(Nq.nuc), Nq.nuc
Nq.first, Nq.nuc, Nq.last = x, x, x
- if getfield(y,'value')%2==0 then
+ if getvalue(y)%2==0 then
if Np and Nq.met then Nq.met = Np.met; else Nq.met = get_current_metric(y) end
Nq.pre = 0; Nq.post = 0; Nq.xspc = 3
else Nq.met, Nq.pre = nil, nil; end
diff --git a/macros/luatex/generic/luatexja/src/ltj-base.lua b/macros/luatex/generic/luatexja/src/ltj-base.lua
index ad5bb816a5..41caef5b4c 100644
--- a/macros/luatex/generic/luatexja/src/ltj-base.lua
+++ b/macros/luatex/generic/luatexja/src/ltj-base.lua
@@ -7,7 +7,7 @@ local node, table, tex, token = node, table, tex, token
local cat_lp = luatexbase.catcodetables['latex-package']
---------------------
+--------------------
local ltjb = {}
luatexja.base = ltjb
@@ -44,7 +44,7 @@ do
_error_set_message = function (msgcont, main, help)
err_main = message_cont(main, msgcont):gsub(BEL, LF)
err_help = (help and help~="") and into_lines(help)
- or {"Sorry, I don't know how to help in this situation.",
+ or {"Sorry, I don't know how to help in this situation.",
"Maybe you should try asking a human?" }
end
@@ -129,7 +129,7 @@ end
--- Extension to tex.print(). Each argument string may contain
-- newline characters, in which case the string is output (to
-- TeX input stream) as multiple lines.
--- @param ... (string) string to output
+-- @param ... (string) string to output
local function mprint(...)
local arg = {...}
local lines = {}
@@ -202,7 +202,7 @@ do
local function in_unicode(c, admit_math)
local low = admit_math and -1 or 0
if type(c)~='number' or c<low or c>0x10FFFF then
- local s = 'A character number must be between ' .. tostring(low)
+ local s = 'A character number must be between ' .. tostring(low)
.. ' and 0x10ffff.\n'
.. (admit_math and "(-1 is used for denoting `math boundary')\n" or '')
.. 'So I changed this one to zero.'
@@ -222,7 +222,7 @@ end
-- * return value: non-nil iff the cache is up-to-date
-- save_cache (filename, t): no return value
-- save_cache_luc (filename, t): no return value
--- save_cache always calls save_cache_luc.
+-- save_cache always calls save_cache_luc.
-- But sometimes we want to create only the precompiled cache,
-- when its 'text' version is already present in LuaTeX-ja distribution.
@@ -274,8 +274,8 @@ do
if s then
local sa = load(s)
local f = io.open(fullpath, 'wb')
- if f and sa then
- f:write(dump(sa, true))
+ if f and sa then
+ f:write(dump(sa, true))
texio.write('log', '(save cache: ' .. fullpath .. ')')
f:close()
end
@@ -307,17 +307,17 @@ do
break
end
end
- if (not result) or outdate(result) then
- return nil
- else
- return result
+ if (not result) or outdate(result) then
+ return nil
+ else
+ return result
end
end
-
+
local function load_cache(filename, outdate)
remove_file_if_exist(savepath .. '/' .. filename .. '.lua')
local r = load_cache_a(filename .. luc_suffix, outdate, false)
- if r then
+ if r then
return r
else
local r = load_cache_a(filename .. '.lua.gz', outdate, true)
diff --git a/macros/luatex/generic/luatexja/src/ltj-base.sty b/macros/luatex/generic/luatexja/src/ltj-base.sty
index d46b54a1fa..ba88ec9450 100644
--- a/macros/luatex/generic/luatexja/src/ltj-base.sty
+++ b/macros/luatex/generic/luatexja/src/ltj-base.sty
@@ -20,9 +20,9 @@
%% Registers
%\newcount\ltj@tempcnta % defined at luatexja-core.sty
+%\newcount\ltj@tempdima % defined at luatexja-core.sty
\newcount\ltj@tempcntb
\newcount\ltj@tempcntc
-\newdimen\ltj@tempdima
% \newskip\ltj@tempskipa unused
% \newtoks\ltj@temptoks unused
diff --git a/macros/luatex/generic/luatexja/src/ltj-charrange.lua b/macros/luatex/generic/luatexja/src/ltj-charrange.lua
index 46075b2166..074ba3ce05 100644
--- a/macros/luatex/generic/luatexja/src/ltj-charrange.lua
+++ b/macros/luatex/generic/luatexja/src/ltj-charrange.lua
@@ -3,17 +3,18 @@
--
luatexbase.provides_module({
name = 'luatexja.charrange',
- date = '2020-07-30',
+ date = '2022-08-19',
description = 'Handling the range of Japanese characters',
})
luatexja.charrange = {}
luatexja.load_module 'base'; local ltjb = luatexja.base
local getchar = node.direct.getchar
-local has_attr = node.direct.has_attribute
-local has_attr_node = node.has_attribute
+local get_attr = node.direct.get_attribute
+local get_attr_node = node.get_attribute
local tex_getattr = tex.getattribute
+local UNSET = -0x7FFFFFFF
local ATTR_RANGE = 7
luatexja.charrange.ATTR_RANGE = ATTR_RANGE
local jcr_cjk, jcr_noncjk = 0, 1
@@ -22,16 +23,22 @@ local kcat_attr_table = {}
local pow_table = {}
local fn_table = {} -- used in is_ucs_in_japanese_char_direct
local nfn_table = {} -- used in is_ucs_in_japanese_char_node
-for i = 0, 31*ATTR_RANGE-1 do
- local ka, pw = luatexbase.attributes['ltj@kcat'..floor(i/31)], 1/(2^(i%31))
- local jcr_noncjk = jcr_noncjk
- kcat_attr_table[i], pow_table[i] = ka, 2^(i%31)
- fn_table[i] = function(p) return floor(has_attr(p, ka)*pw)%2 ~= jcr_noncjk end
- nfn_table[i] = function(p) return floor(has_attr_node(p, ka)*pw)%2 ~= jcr_noncjk end
+do
+ local ka = luatexbase.attributes['ltj@kcat0']
+ for i = 0, 30 do
+ local pw = 2^i; kcat_attr_table[i], pow_table[i] = ka, pw
+ fn_table[i] = function(p) return get_attr(p, ka)&pw==0 end
+ nfn_table[i] = function(p) return get_attr_node(p, ka)&pw==0 end
+ end
+end
+for i = 31, 31*ATTR_RANGE-1 do
+ local ka, pw = luatexbase.attributes['ltj@kcat'..floor(i/31)], 2^(i%31)
+ kcat_attr_table[i], pow_table[i] = ka, pw
+ fn_table[i] = function(p) return (get_attr(p, ka) or 0)&pw==0 end
+ nfn_table[i] = function(p) return (get_attr_node(p, ka) or 0)&pw==0 end
end
fn_table[-1] = function() return false end -- for char --U+007F
nfn_table[-1] = function() return false end -- for char --U+007F
-pow_table[31*ATTR_RANGE] = 2^31
-- jcr_table_main[chr_code] = index
-- index : internal 0, 1, 2, ..., 216 0: 'other'
@@ -71,7 +78,8 @@ function luatexja.charrange.char_to_range(c) -- return the external range number
end
local function get_range_setting(i) -- i: internal range number
- return floor(tex_getattr(kcat_attr_table[i])/pow_table[i])%2
+ local a = tex_getattr(kcat_attr_table[i])
+ return (a==UNSET and 0 or a)&pow_table[i]
end
-- glyph_node p は和文文字か?
@@ -84,7 +92,7 @@ function luatexja.charrange.is_ucs_in_japanese_char_direct(p ,c)
end
function luatexja.charrange.is_japanese_char_curlist(c) -- assume that c>=0x80
- return get_range_setting(jcr_table_main[c])~= jcr_noncjk
+ return get_range_setting(jcr_table_main[c])==0
end
-- EXT
@@ -96,12 +104,11 @@ function luatexja.charrange.toggle_char_range(g, i) -- i: external range number
elseif i==0 then return
else
local kc
- if i>0 then kc=0 else kc=1; i=-i end
- if i>=31*ATTR_RANGE then i=0 end
- local attr = kcat_attr_table[i]
- local a = tex_getattr(attr)
- tex.setattribute(g, attr,
- (floor(a/pow_table[i+1])*2+kc)*pow_table[i]+a%pow_table[i])
+ if i>0 then kc=0 else kc=1; i=-i end; if i>=31*ATTR_RANGE then i=0 end
+ local attr, p = kcat_attr_table[i], pow_table[i]
+ local a = tex_getattr(attr); if a==UNSET then a=0 end
+ a = (a&~p)+kc*p; if a==0 and i>30 then a=UNSET end
+ tex.setattribute(g, attr, a)
end
end
diff --git a/macros/luatex/generic/luatexja/src/ltj-compat.lua b/macros/luatex/generic/luatexja/src/ltj-compat.lua
index dfb19ee2d0..25c9b880c2 100644
--- a/macros/luatex/generic/luatexja/src/ltj-compat.lua
+++ b/macros/luatex/generic/luatexja/src/ltj-compat.lua
@@ -4,7 +4,6 @@
luatexja.load_module 'base'; local ltjb = luatexja.base
luatexja.load_module 'stack'; local ltjs = luatexja.stack
-local stack_table_index = luatexja.stack_table_index
-- load jisx0208 table
local cache_ver = 3
@@ -18,20 +17,21 @@ end
-- \kuten, \jis, \euc, \sjis, \ucs, \kansuji
-local utfchar=utf.char
+local utfchar, floor = utf.char, math.floor
+local texwrite, getcount = tex.write, tex.getcount
+local cnt_stack = luatexbase.registernumber 'ltj@@stack'
+local KSJ = luatexja.stack_table_index.KSJ
+local get_stack_table = ltjs.get_stack_table
local function to_kansuji(num)
if not num then num=0; return
- elseif num<0 then
- num = -num; tex.write '-'
+ elseif num<0 then num = -num; texwrite '-'
end
local s = ""
repeat
- s = utfchar(
- ltjs.get_stack_table(luatexja.stack_table_index.KSJ + num%10,
- '', tex.getcount 'ltj@@stack')) .. s
- num=math.floor(num/10)
+ s = utfchar(get_stack_table(KSJ + num%10, '', getcount(cnt_stack))) .. s
+ num=num//10
until num==0
- tex.write(s)
+ texwrite(s)
end
local function error_invalid_charcode(i)
@@ -43,22 +43,22 @@ end
-- \ucs: 単なる identity
local function from_ucs(i)
if type(i)~='number' then error_invalid_charcode(i); i=0 end
- tex.write(i)
+ texwrite(i)
end
-- \kuten: 面区点 (それぞれで16進2桁を使用)=> Unicode 符号位置
local function from_kuten(i)
if type(i)~='number' then error_invalid_charcode(i); i=0 end
if (i%256==0)or(i%256>94) then
- tex.write '0'
- else
- tex.write(tostring(jisx0208.table_jisx0208_uptex[math.floor(i/256)*94+(i%256)-94] or 0))
+ texwrite '0'
+ else
+ texwrite(tostring(jisx0208.table_jisx0208_uptex[(i//256)*94+(i%256)-94] or 0))
end
end
-- \euc: EUC-JP による符号位置 => Unicode 符号位置
local function from_euc(i)
- if type(i)~='number' then
+ if type(i)~='number' then
error_invalid_charcode(i); i=0
elseif i>=0x10000 or i<0xa0a0 then
i=0
@@ -75,10 +75,9 @@ end
-- \sjis: Shift_JIS による符号位置 => Unicode 符号位置
local function from_sjis(i)
if (type(i)~='number') or i>=0x10000 or i<0 then
- error_invalid_charcode(i); tex.write '0'; return
+ error_invalid_charcode(i); texwrite '0'; return
end
- local c2 = math.floor(i/256)
- local c1 = i%256
+ local c2, c1 = i//256, i%256
local shift_jisx0213_s1a3_table = {
{ [false]= 1, [true]= 8},
{ [false]= 3, [true]= 4},
@@ -113,7 +112,7 @@ luatexja.binary_pars.kansujichar = function(c, t)
'So I changed this one to zero.')
c=0
end
- return ltjs.get_stack_table(stack_table_index.KSJ + c, 0, t)
+ return get_stack_table(KSJ + c, 0, t)
end
diff --git a/macros/luatex/generic/luatexja/src/ltj-debug.lua b/macros/luatex/generic/luatexja/src/ltj-debug.lua
index c337c014fe..912242615a 100644
--- a/macros/luatex/generic/luatexja/src/ltj-debug.lua
+++ b/macros/luatex/generic/luatexja/src/ltj-debug.lua
@@ -79,7 +79,7 @@ end
local function pformat(fmt, ...)
if type(fmt) == "string" then
return do_pformat(fmt, ...)
- else
+ else
return tosource(fmt)
end
end
@@ -105,7 +105,7 @@ do
end
local function print_measure()
- stop_time_measure('RUN')
+ stop_time_measure 'RUN'
local temp = {}
for i,v in pairs(time_stat) do
temp[#temp+1] = { i, v[1], v[2], v[2]/v[1] }
@@ -121,10 +121,10 @@ do
luatexja.base.start_time_measure = start_time_measure
luatexja.base.stop_time_measure = stop_time_measure
luatexbase.add_to_callback('stop_run', print_measure, 'luatexja.time_measure', 1)
- luatexbase.add_to_callback('pre_linebreak_filter',
- function(p)
- start_time_measure('tex_linebreak'); return p
- end,
+ luatexbase.add_to_callback('pre_linebreak_filter',
+ function(p)
+ start_time_measure 'tex_linebreak'; return p
+ end,
'measure_tex_linebreak', 20000)
end
end
diff --git a/macros/luatex/generic/luatexja/src/ltj-direction.lua b/macros/luatex/generic/luatexja/src/ltj-direction.lua
index 4a0ad3ab06..5321f232f4 100644
--- a/macros/luatex/generic/luatexja/src/ltj-direction.lua
+++ b/macros/luatex/generic/luatexja/src/ltj-direction.lua
@@ -9,25 +9,32 @@ luatexja.direction = {}
local attr_dir = luatexbase.attributes['ltj@dir']
local attr_icflag = luatexbase.attributes['ltj@icflag']
+local dnode = node.direct
local cat_lp = luatexbase.catcodetables['latex-package']
-local to_node = node.direct.tonode
-local to_direct = node.direct.todirect
-local has_attr = node.direct.has_attribute
-local set_attr = node.direct.set_attribute
-local insert_before = node.direct.insert_before
-local insert_after = node.direct.insert_after
-local getid = node.direct.getid
-local getsubtype = node.direct.getsubtype
-local getlist = node.direct.getlist
-local setfield = node.direct.setfield
-local getfield = node.direct.getfield
-local node_new = node.direct.new
-local node_tail = node.direct.tail
-local node_free = node.direct.free
-local node_remove = node.direct.remove
-local node_next = node.direct.getnext
-local traverse = node.direct.traverse
-local traverse_id = node.direct.traverse_id
+local to_node = dnode.tonode
+local to_direct = dnode.todirect
+local get_attr = dnode.get_attribute
+local set_attr = dnode.set_attribute
+local insert_before = dnode.insert_before
+local insert_after = dnode.insert_after
+local getid = dnode.getid
+local getsubtype = dnode.getsubtype
+local getlist = dnode.getlist
+local getfield = dnode.getfield
+local getwhd = dnode.getwhd
+local getvalue = node.direct.getdata
+local setfield = dnode.setfield
+local setwhd = dnode.setwhd
+local setnext = dnode.setnext
+local setlist = dnode.setlist
+local setvalue = node.direct.setdata
+
+local node_new = dnode.new
+local node_free = dnode.flush_node or dnode.free
+local node_remove = dnode.remove
+local node_next = dnode.getnext
+local traverse = dnode.traverse
+local traverse_id = dnode.traverse_id
local start_time_measure, stop_time_measure
= ltjb.start_time_measure, ltjb.stop_time_measure
local abs = math.abs
@@ -37,12 +44,11 @@ local id_hlist = node.id 'hlist'
local id_vlist = node.id 'vlist'
local id_whatsit = node.id 'whatsit'
local sid_save = node.subtype 'pdf_save'
-local sid_restore= node.subtype 'pdf_restore'
-local sid_matrix = node.subtype 'pdf_setmatrix'
local sid_user = node.subtype 'user_defined'
+local getnest = tex.getnest
local tex_nest = tex.nest
-local tex_getcount = tex.getcount
+local getcount = tex.getcount
local ensure_tex_attr = ltjb.ensure_tex_attr
local PROCESSED = luatexja.icflag_table.PROCESSED
local PROCESSED_BEGIN_FLAG = luatexja.icflag_table.PROCESSED_BEGIN_FLAG
@@ -56,21 +62,21 @@ local dir_math_mod = luatexja.dir_table.dir_math_mod
local dir_node_auto = luatexja.dir_table.dir_node_auto
local dir_node_manual = luatexja.dir_table.dir_node_manual
local function get_attr_icflag(p)
- return (has_attr(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG
+ return (get_attr(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG
end
local page_direction
--
local dir_pool
do
- local node_copy = node.direct.copy
+ local node_copy = dnode.copy
dir_pool = {}
for _,i in pairs({dir_tate, dir_yoko, dir_dtou, dir_utod}) do
local w = node_new(id_whatsit, sid_user)
- set_attr(w, attr_dir, i)
+ dnode.setattributelist(w, nil)
+ set_attr(w, attr_dir, i); set_attr(w, attr_icflag, 0)
setfield(w, 'user_id', DIR)
- setfield(w, 'type', 110)
- setfield(w, 'next', nil)
+ setfield(w, 'type', 110); setnext(w, nil)
dir_pool[i] = function () return node_copy(w) end
end
end
@@ -92,7 +98,7 @@ end
local get_dir_count, get_adjust_dir_count
do
- local node_attr = node.has_attribute
+ local node_attr = node.get_attribute
local function get_dir_count_inner(h)
if h then
if h.id==id_whatsit and h.subtype==sid_user and h.user_id==DIR then
@@ -107,7 +113,7 @@ do
end
function get_dir_count()
for i=tex_nest.ptr, 1, -1 do
- local h = tex_nest[i].head.next
+ local h = getnest(i).head.next
if h then
local t = get_dir_count_inner(h)
if t~=0 then return t end
@@ -117,7 +123,7 @@ do
end
function get_adjust_dir_count()
for i=tex_nest.ptr, 1, -1 do
- local v = tex_nest[i]
+ local v = getnest(i)
local h, m = v.head.next, v.mode
if abs(m)== ltjs.vmode and h then
local t = get_dir_count_inner(h)
@@ -171,21 +177,20 @@ do
local node_next_node, node_tail_node = node.next, node.tail
local insert_after_node = node.insert_after
function luatexja.direction.set_list_direction_hook(v)
- local lv = tex_nest.ptr -- must be >= 1
if not v then
v = get_dir_count()
- if abs(tex_nest[lv-1].mode) == ltjs.mmode and v == dir_tate then
+ if abs(getnest(tex_nest.ptr-1).mode) == ltjs.mmode and v == dir_tate then
v = dir_utod
end
elseif v=='adj' then
v = get_adjust_dir_count()
end
- local h = tex_nest[lv].head
+ local h = getnest().head
local hn = node.next(h)
hn = (hn and hn.id==id_local) and hn or h
local w = to_node(dir_pool[v]())
insert_after_node(h, hn, w)
- tex_nest[lv].tail = node_tail_node(w)
+ getnest().tail = node_tail_node(w)
ensure_tex_attr(attr_icflag, 0)
ensure_tex_attr(attr_dir, 0)
end
@@ -194,13 +199,13 @@ do
local lv = tex_nest.ptr
if not v then
v,name = get_dir_count(), nil
- if lv>=1 and abs(tex_nest[lv-1].mode) == ltjs.mmode and v == dir_tate then
+ if lv>=1 and abs(getnest(lv-1).mode) == ltjs.mmode and v == dir_tate then
v = dir_utod
end
elseif v=='adj' then
v,name = get_adjust_dir_count(), nil
end
- local current_nest = tex_nest[lv]
+ local current_nest = getnest()
if tex.currentgrouptype==6 then
ltjb.package_error(
'luatexja',
@@ -221,7 +226,7 @@ do
page_direction = v -- for first call of \yoko (in luatexja-core.sty)
else
if luatexja.debug then
- luatexja.ext_show_node_list(node.direct.tonode(h),'>> ', texio.write_nl)
+ luatexja.ext_show_node_list(dnode.tonode(h),'>> ', texio.write_nl)
end
ltjb.package_error(
'luatexja',
@@ -283,7 +288,8 @@ do
if hd then
for p in traverse_id(15, hd) do -- unset
if get_box_dir(p, 0)==0 then
- setfield(p, 'head', create_dir_whatsit(getlist(p), 'fin_row', ltjs.list_dir))
+ setfield(p, 'head', create_dir_whatsit(getfield(p, 'head'), 'fin_row', ltjs.list_dir))
+ -- We cannot use setlist and getlist, since they don't support unset_node
end
end
set_attr(hd, attr_icflag, PROCESSED_BEGIN_FLAG)
@@ -307,7 +313,7 @@ do
-- start 側は ltj-debug.lua に
local new_dir = ltjs.list_dir
for line in traverse_id(id_hlist, to_direct(h)) do
- setfield(line, 'head', create_dir_whatsit(getlist(line), gc, new_dir) )
+ setlist(line, create_dir_whatsit(getlist(line), gc, new_dir) )
end
ensure_tex_attr(attr_dir, 0)
return h
@@ -329,7 +335,7 @@ do
end
end
if hd==wh[1] then
- ltjs.list_dir = has_attr(hd, attr_dir)
+ ltjs.list_dir = get_attr(hd, attr_dir)
local x = node_next(hd)
while x and getid(x)==id_glue and getsubtype(x)==3 do
node_remove(hd,x); node_free(x); x = node_next(hd)
@@ -351,7 +357,7 @@ do
local n = node_next(hd)
local w = create_dir_whatsit(hd, gc, ltjs.list_dir)
-- move dir whatsit after hd
- setfield(hd, 'next', w); setfield(w, 'next', n);
+ setnext(hd, w); setnext(w, n)
return hd
else return create_dir_whatsit(hd, gc, ltjs.list_dir)
end
@@ -361,6 +367,10 @@ end
-- dir_node に包む方法を書いたテーブル
local dir_node_aux
do
+ local setkern = dnode.setkern
+ local setshift = dnode.setshift
+ local sid_restore= node.subtype 'pdf_restore'
+ local sid_matrix = node.subtype 'pdf_setmatrix'
local floor = math.floor
local get_h =function (w,h,d) return h end
local get_d =function (w,h,d) return d end
@@ -372,6 +382,21 @@ do
local get_w_neg =function (w,h,d) return -w end
local get_w =function (w,h,d) return w end
local zero = function() return 0 end
+ local function gen_kern(arg, b, w,h,d,dw,dh,dd)
+ local nn = node_new(id_kern)
+ setkern(nn, arg(w, h, d, dw, dh, dd)); return nn
+ end
+ local function gen_whatsit(arg)
+ return node_new(id_whatsit, arg)
+ end
+ local function gen_rotate(arg)
+ local nn = node_new(id_whatsit, sid_matrix)
+ setfield(nn, 'data', arg); return nn
+ end
+ local function gen_box(arg, b, w,h,d,dw,dh,dd)
+ local nn = b; setnext(b, nil)
+ setshift(nn, arg(w, h, d, dw, dh, dd)); return nn
+ end
dir_node_aux = {
[dir_yoko] = { -- yoko を
[dir_tate] = { -- tate 中で組む
@@ -379,20 +404,20 @@ do
height = get_w_half,
depth = get_w_half_rem,
[id_hlist] = {
- { 'whatsit', sid_save },
- { 'rotate', '0 1 -1 0' },
- { 'kern', function(w,h,d,nw,nh,nd) return -nd end },
- { 'box' , get_h},
- { 'kern', function(w,h,d,nw,nh,nd) return nd-w end },
- { 'whatsit', sid_restore },
+ { gen_whatsit, sid_save },
+ { gen_rotate, '0 1 -1 0' },
+ { gen_kern, function(w,h,d,nw,nh,nd) return -nd end },
+ { gen_box , get_h},
+ { gen_kern, function(w,h,d,nw,nh,nd) return nd-w end },
+ { gen_whatsit, sid_restore },
},
[id_vlist] = {
- { 'whatsit', sid_save },
- { 'rotate', '0 1 -1 0' },
- { 'kern' , zero },
- { 'box' , function(w,h,d,nw,nh,nd) return -nh-nd end },
- { 'kern', get_h_d_neg},
- { 'whatsit', sid_restore },
+ { gen_whatsit, sid_save },
+ { gen_rotate, '0 1 -1 0' },
+ { gen_kern , zero },
+ { gen_box , function(w,h,d,nw,nh,nd) return -nh-nd end },
+ { gen_kern, get_h_d_neg},
+ { gen_whatsit, sid_restore },
},
},
[dir_dtou] = { -- dtou 中で組む
@@ -400,19 +425,19 @@ do
height = get_w,
depth = zero,
[id_hlist] = {
- { 'whatsit', sid_save },
- { 'rotate', '0 -1 1 0' },
- { 'kern', function(w,h,d,nw,nh,nd) return -nh end },
- { 'box', get_d_neg },
- { 'kern', function(w,h,d,nw,nh,nd) return nh-w end },
- { 'whatsit', sid_restore },
+ { gen_whatsit, sid_save },
+ { gen_rotate, '0 -1 1 0' },
+ { gen_kern, function(w,h,d,nw,nh,nd) return -nh end },
+ { gen_box, get_d_neg },
+ { gen_kern, function(w,h,d,nw,nh,nd) return nh-w end },
+ { gen_whatsit, sid_restore },
},
[id_vlist] = {
- { 'whatsit', sid_save },
- { 'rotate', '0 -1 1 0' },
- { 'kern', get_h_d_neg },
- { 'box', zero },
- { 'whatsit', sid_restore },
+ { gen_whatsit, sid_save },
+ { gen_rotate, '0 -1 1 0' },
+ { gen_kern, get_h_d_neg },
+ { gen_box, zero },
+ { gen_whatsit, sid_restore },
},
},
},
@@ -422,19 +447,19 @@ do
height = get_w,
depth = zero,
[id_hlist] = {
- { 'whatsit', sid_save },
- { 'rotate', '0 -1 1 0' },
- { 'kern', function (w,h,d,nw,nh,nd) return -nh end },
- { 'box' , get_d_neg },
- { 'kern', function (w,h,d,nw,nh,nd) return nh-w end },
- { 'whatsit', sid_restore },
+ { gen_whatsit, sid_save },
+ { gen_rotate, '0 -1 1 0' },
+ { gen_kern, function (w,h,d,nw,nh,nd) return -nh end },
+ { gen_box , get_d_neg },
+ { gen_kern, function (w,h,d,nw,nh,nd) return nh-w end },
+ { gen_whatsit, sid_restore },
},
[id_vlist] = {
- { 'whatsit', sid_save },
- { 'rotate', '0 -1 1 0' },
- { 'kern', get_h_d_neg },
- { 'box', zero },
- { 'whatsit', sid_restore },
+ { gen_whatsit, sid_save },
+ { gen_rotate, '0 -1 1 0' },
+ { gen_kern, get_h_d_neg },
+ { gen_box, zero },
+ { gen_whatsit, sid_restore },
},
},
[dir_dtou] = { -- dtou 中で組む
@@ -442,18 +467,18 @@ do
height = get_d,
depth = get_h,
[id_hlist] = {
- { 'whatsit', sid_save },
- { 'rotate', '-1 0 0 -1' },
- { 'kern', get_w_neg },
- { 'box', function (w,h,d,nw,nh,nd) return h-nd end },
- { 'whatsit', sid_restore },
+ { gen_whatsit, sid_save },
+ { gen_rotate, '-1 0 0 -1' },
+ { gen_kern, get_w_neg },
+ { gen_box, function (w,h,d,nw,nh,nd) return h-nd end },
+ { gen_whatsit, sid_restore },
},
[id_vlist] = {
- { 'whatsit', sid_save },
- { 'rotate', '-1 0 0 -1' },
- { 'kern', get_h_d_neg },
- { 'box', get_w_neg },
- { 'whatsit', sid_restore },
+ { gen_whatsit, sid_save },
+ { gen_rotate, '-1 0 0 -1' },
+ { gen_kern, get_h_d_neg },
+ { gen_box, get_w_neg },
+ { gen_whatsit, sid_restore },
},
},
},
@@ -463,20 +488,20 @@ do
height = get_w,
depth = zero,
[id_hlist] = {
- { 'whatsit', sid_save },
- { 'rotate', '0 1 -1 0' },
- { 'kern', function (w,h,d,nw,nh,nd) return -nd end },
- { 'box', get_h },
- { 'kern', function (w,h,d,nw,nh,nd) return nd-w end },
- { 'whatsit', sid_restore },
+ { gen_whatsit, sid_save },
+ { gen_rotate, '0 1 -1 0' },
+ { gen_kern, function (w,h,d,nw,nh,nd) return -nd end },
+ { gen_box, get_h },
+ { gen_kern, function (w,h,d,nw,nh,nd) return nd-w end },
+ { gen_whatsit, sid_restore },
},
[id_vlist] = {
- { 'kern', zero },
- { 'whatsit', sid_save },
- { 'rotate', '0 1 -1 0' },
- { 'box', function (w,h,d,nw,nh,nd) return -nd-nh end },
- { 'kern', get_h_d_neg },
- { 'whatsit', sid_restore },
+ { gen_kern, zero },
+ { gen_whatsit, sid_save },
+ { gen_rotate, '0 1 -1 0' },
+ { gen_box, function (w,h,d,nw,nh,nd) return -nd-nh end },
+ { gen_kern, get_h_d_neg },
+ { gen_whatsit, sid_restore },
},
},
[dir_tate] = { -- tate 中で組む
@@ -484,19 +509,19 @@ do
height = get_d,
depth = get_h,
[id_hlist] = {
- { 'whatsit', sid_save },
- { 'rotate', '-1 0 0 -1' },
- { 'kern', get_w_neg },
- { 'box', function (w,h,d,nw,nh,nd) return h-nd end },
- { 'whatsit', sid_restore },
+ { gen_whatsit, sid_save },
+ { gen_rotate, '-1 0 0 -1' },
+ { gen_kern, get_w_neg },
+ { gen_box, function (w,h,d,nw,nh,nd) return h-nd end },
+ { gen_whatsit, sid_restore },
},
[id_vlist] = {
- { 'whatsit', sid_save },
- { 'rotate', ' -1 0 0 -1' },
- { 'kern', function (w,h,d,nw,nh,nd) return -nh-nd end },
- { 'box', get_w_neg },
- { 'kern', function (w,h,d,nw,nh,nd) return nh+nd-h-d end },
- { 'whatsit', sid_restore },
+ { gen_whatsit, sid_save },
+ { gen_rotate, ' -1 0 0 -1' },
+ { gen_kern, function (w,h,d,nw,nh,nd) return -nh-nd end },
+ { gen_box, get_w_neg },
+ { gen_kern, function (w,h,d,nw,nh,nd) return nh+nd-h-d end },
+ { gen_whatsit, sid_restore },
},
},
},
@@ -507,14 +532,13 @@ end
-- 2nd ret val はその DIR whatsit
function get_box_dir(b, default)
start_time_measure 'get_box_dir'
- local dir = has_attr(b, attr_dir) or 0
- local bh = getfield(b,'head')
- -- b は insert node となりうるので getlist() は使えない
+ local dir = get_attr(b, attr_dir) or 0
+ local bh = getfield(b, 'head') -- We cannot use getlist since b may be an unset_node.
local c
if bh~=0 then -- bh != nil
for bh in traverse_id(id_whatsit, bh) do
if getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR then
- c = bh; dir = (dir==0) and has_attr(bh, attr_dir) or dir
+ c = bh; dir = (dir==0) and get_attr(bh, attr_dir) or dir
end
end
end
@@ -523,12 +547,13 @@ function get_box_dir(b, default)
end
do
+ local ltj_tempcnta = luatexbase.registernumber 'ltj@tempcnta'
local getbox = tex.getbox
local dir_backup
function luatexja.direction.unbox_check_dir(is_copy)
start_time_measure 'box_primitive_hook'
local list_dir = get_dir_count()%dir_math_mod
- local b = getbox(tex_getcount 'ltj@tempcnta')
+ local b = getbox(getcount(ltj_tempcnta))
if b and getlist(to_direct(b)) then
local box_dir = get_box_dir(to_direct(b), dir_yoko)
if box_dir%dir_math_mod ~= list_dir then
@@ -548,7 +573,7 @@ do
local d = hd
nh, hd = node_remove(nh, hd)
if is_copy==true and (not dir_backup) then
- dir_backup = d; setfield(dir_backup, 'next', nil)
+ dir_backup = d; setnext(dir_backup, nil)
else
node_free(d)
end
@@ -556,7 +581,7 @@ do
hd = node_next(hd)
end
end
- setfield(bd, 'head', nh)
+ setlist(bd, nh)
end
end
if luatexja.global_temp and tex.globaldefs~=luatexja.global_temp then
@@ -565,12 +590,12 @@ do
stop_time_measure 'box_primitive_hook'
end
function luatexja.direction.uncopy_restore_whatsit()
- local b = getbox(tex_getcount 'ltj@tempcnta')
+ local b = getbox(getcount(ltj_tempcnta))
if b then
local bd = to_direct(b)
if dir_backup then
- setfield(dir_backup, 'next', getlist(bd))
- setfield(bd, 'head', dir_backup)
+ setnext(dir_backup, getlist(bd))
+ setlist(bd, dir_backup)
dir_backup = nil
end
end
@@ -587,23 +612,25 @@ local function unwrap_dir_node(b, head, box_dir)
if head then
nh = insert_before(head, b, bh)
nh, nb = node_remove(nh, b)
- setfield(b, 'next', nil)
- node_free(b)
+ setnext(b, nil); node_free(b)
end
local shift_old, b_dir, wh = nil, get_box_dir(bh, 0)
if wh then
- node.direct.flush_list(getfield(wh, 'value'))
- setfield(wh, 'value', nil)
+ dnode.flush_list(getvalue(wh)); setvalue(wh, nil)
end
return nh, nb, bh, b_dir
end
-- is_manual: 寸法変更に伴うものか?
-local function create_dir_node(b, b_dir, new_dir, is_manual)
+local create_dir_node
+do
+ local getdir = dnode.getdir
+ local setdir = dnode.setdir
+ local setshift = dnode.setshift
+
+create_dir_node = function(b, b_dir, new_dir, is_manual)
local info = dir_node_aux[b_dir%dir_math_mod][new_dir%dir_math_mod]
- local w = getfield(b, 'width')
- local h = getfield(b, 'height')
- local d = getfield(b, 'depth')
+ local w, h, d = getwhd(b)
local db = node_new(getid(b)) -- dir_node
set_attr(db, attr_dir,
new_dir + (is_manual and dir_node_manual or dir_node_auto))
@@ -611,13 +638,11 @@ local function create_dir_node(b, b_dir, new_dir, is_manual)
set_attr(b, attr_icflag, PROCESSED)
ensure_tex_attr(attr_dir, 0)
ensure_tex_attr(attr_icflag, 0)
- setfield(db, 'dir', getfield(b, 'dir'))
- setfield(db, 'shift', 0)
- setfield(db, 'width', info.width(w,h,d))
- setfield(db, 'height', info.height(w,h,d))
- setfield(db, 'depth', info.depth(w,h,d))
+ setdir(db, getdir(b)); setshift(db, 0)
+ setwhd(db, info.width(w,h,d), info.height(w,h,d), info.depth(w,h,d))
return db
end
+end
-- 異方向のボックスの処理
local make_dir_whatsit, process_dir_node
@@ -633,15 +658,14 @@ do
-- 既に b の中身にあるwhatsit
if (box_dir<dir_node_auto) and (not dn) then
bh = create_dir_whatsit(bh, 'make_dir_whatsit', dir_yoko)
- dn = bh; setfield(b, 'head', bh)
+ dn = bh; setlist(b, bh)
end
if box_dir%dir_math_mod==new_dir then
if box_dir>=dir_node_auto then
-- dir_node としてカプセル化されている
local _, dnc = get_box_dir(b, 0)
if dnc then -- free all other dir_node
- node.direct.flush_list(getfield(dnc, 'value'))
- setfield(dnc, 'value', nil)
+ dnode.flush_list(getvalue(dnc)); setvalue(dnc, nil)
end
set_attr(b, attr_dir, box_dir%dir_math_mod + dir_node_auto)
return head, node_next(b), b, true
@@ -663,25 +687,19 @@ do
end
box_dir = box_dir%dir_math_mod
local db
- local dnh = getfield(dn, 'value')
+ local dnh = getvalue(dn)
for x in traverse(dnh) do
- if has_attr(x, attr_dir)%dir_math_mod == new_dir then
- setfield(dn, 'value', to_node(node_remove(dnh, x)))
+ if get_attr(x, attr_dir)%dir_math_mod == new_dir then
+ setvalue(dn, to_node(node_remove(dnh, x)))
db=x; break
end
end
- node.direct.flush_list(getfield(dn, 'value'))
- setfield(dn, 'value', nil)
+ dnode.flush_list(getvalue(dn)); setvalue(dn, nil)
db = db or create_dir_node(b, box_dir, new_dir, false)
- local w = getfield(b, 'width')
- local h = getfield(b, 'height')
- local d = getfield(b, 'depth')
- local dn_w = getfield(db, 'width')
- local dn_h = getfield(db, 'height')
- local dn_d = getfield(db, 'depth')
+ local w, h, d = getwhd(b)
nh, nb = insert_before(head, b, db), nil
nh, nb = node_remove(nh, b)
- setfield(b, 'next', nil); setfield(db, 'head', b)
+ setnext(b, nil); setlist(db, b)
ret, flag = db, true
return nh, nb, ret, flag
end
@@ -701,13 +719,13 @@ do
end
-- lastbox
- local node_prev = (node.direct~=node) and node.direct.getprev or node.prev
+ local node_prev = dnode.getprev
local id_glue = node.id 'glue'
local function lastbox_hook()
start_time_measure 'box_primitive_hook'
- local bn = tex_nest[tex_nest.ptr].tail
+ local bn = getnest().tail
if bn then
- local b, head = to_direct(bn), to_direct(tex_nest[tex_nest.ptr].head)
+ local b, head = to_direct(bn), to_direct(getnest().head)
local bid = getid(b)
if bid==id_hlist or bid==id_vlist then
local p = getlist(b)
@@ -715,21 +733,20 @@ do
if p and getid(p)==id_glue and getsubtype(p)==12 then -- tabskip
local np = node_next(p); local npid = getid(np)
if npid==id_hlist or npid==id_vlist then
- setfield(b, 'head', create_dir_whatsit(p, 'align', get_box_dir(np, 0)))
+ setlist(b, create_dir_whatsit(p, 'align', get_box_dir(np, 0)))
end
end
local box_dir = get_box_dir(b, 0)
if box_dir>= dir_node_auto then -- unwrap dir_node
local p = node_prev(b)
local dummy1, dummy2, nb = unwrap_dir_node(b, nil, box_dir)
- setfield(p, 'next', nb); tex_nest[tex_nest.ptr].tail = to_node(nb)
- setfield(b, 'next', nil); setfield(b, 'head', nil)
+ setnext(p, nb); getnest().tail = to_node(nb)
+ setnext(b, nil); setlist(b, nil)
node_free(b); b = nb
end
local _, wh = get_box_dir(b, 0) -- clean dir_node attached to the box
if wh then
- node.direct.flush_list(getfield(wh, 'value'))
- setfield(wh, 'value', nil)
+ dnode.flush_list(getvalue(wh)); setvalue(wh, nil)
end
end
end
@@ -743,27 +760,25 @@ end
-- \wd, \ht, \dp の代わり
do
local getbox, setdimen = tex.getbox, tex.setdimen
+ local ltj_tempdima = luatexbase.registernumber 'ltj@tempdima'
local function get_box_dim_common(key, s, l_dir)
-- s: not dir_node.
local s_dir, wh = get_box_dir(s, dir_yoko)
s_dir = s_dir%dir_math_mod
if s_dir ~= l_dir then
local not_found = true
- for x in traverse(getfield(wh, 'value')) do
- if l_dir == has_attr(x, attr_dir)%dir_node_auto then
- setdimen('ltj@tempdima', getfield(x, key))
+ for x in traverse(getvalue(wh)) do
+ if l_dir == get_attr(x, attr_dir)%dir_node_auto then
+ setdimen(ltj_tempdima, getfield(x, key))
not_found = false; break
end
end
if not_found then
- local w = getfield(s, 'width')
- local h = getfield(s, 'height')
- local d = getfield(s, 'depth')
- setdimen('ltj@tempdima',
- dir_node_aux[s_dir][l_dir][key](w,h,d))
+ local w, h, d = getwhd(s)
+ setdimen(ltj_tempdima, dir_node_aux[s_dir][l_dir][key](w,h,d))
end
else
- setdimen('ltj@tempdima', getfield(s, key))
+ setdimen(ltj_tempdima, getfield(s, key))
end
end
local function get_box_dim(key, n)
@@ -776,12 +791,12 @@ do
if b_dir<dir_node_auto then
get_box_dim_common(key, s, l_dir)
elseif b_dir%dir_math_mod==l_dir then
- setdimen('ltj@tempdima', getfield(s, key))
+ setdimen(ltj_tempdima, getfield(s, key))
else
get_box_dim_common(key, getlist(s), l_dir)
end
else
- setdimen('ltj@tempdima', 0)
+ setdimen(ltj_tempdima, 0)
end
tex.sprint(cat_lp, '\\ltj@tempdima')
tex.globaldefs = gt
@@ -797,19 +812,18 @@ do
if s_dir ~= l_dir then
if not wh then
wh = create_dir_whatsit(getlist(s), 'set_box_dim', s_dir)
- setfield(s, 'head', wh)
+ setlist(s, wh)
end
local db
- local dnh = getfield(wh, 'value')
+ local dnh = getvalue(wh)
for x in traverse(dnh) do
- if has_attr(x, attr_dir)%dir_node_auto==l_dir then
+ if get_attr(x, attr_dir)%dir_node_auto==l_dir then
db = x; break
end
end
if not db then
db = create_dir_node(s, s_dir, l_dir, true)
- setfield(db, 'next', dnh)
- setfield(wh, 'value',to_node(db))
+ setnext(db, dnh); setvalue(wh, to_node(db))
end
setfield(db, key, scan_dimen())
return false
@@ -817,15 +831,12 @@ do
setfield(s, key, scan_dimen())
if wh then
-- change dimension of dir_nodes which are created "automatically"
- local bw, bh, bd
- = getfield(s,'width'), getfield(s, 'height'), getfield(s, 'depth')
- for x in traverse(getfield(wh, 'value')) do
- local x_dir = has_attr(x, attr_dir)
+ local bw, bh, bd = getwhd(s)
+ for x in traverse(getvalue(wh)) do
+ local x_dir = get_attr(x, attr_dir)
if x_dir<dir_node_manual then
local info = dir_node_aux[s_dir][x_dir%dir_node_auto]
- setfield(x, 'width', info.width(bw,bh,bd))
- setfield(x, 'height', info.height(bw,bh,bd))
- setfield(x, 'depth', info.depth(bw,bh,bd))
+ setwhd(x, info.width(bw,bh,bd), info.height(bw,bh,bd), info.depth(bw,bh,bd))
end
end
end
@@ -849,16 +860,12 @@ do
else
local sid, b = getid(s), getlist(s)
local info = dir_node_aux[get_box_dir(b,dir_yoko)%dir_math_mod][b_dir%dir_node_auto]
- local bw, bh, bd
- = getfield(b,'width'), getfield(b, 'height'), getfield(b, 'depth')
- local sw, sh, sd
- = getfield(s,'width'), getfield(s, 'height'), getfield(s, 'depth')
+ local bw, bh, bd = getwhd(b)
+ local sw, sh, sd = getwhd(s)
if set_box_dim_common(key, b, l_dir) and b_dir<dir_node_manual then
-- re-calculate dimension of s, if s is created "automatically"
if b_dir<dir_node_manual then
- setfield(s, 'width', info.width(bw,bh,bd))
- setfield(s, 'height', info.height(bw,bh,bd))
- setfield(s, 'depth', info.depth(bw,bh,bd))
+ setwhd(s, info.width(bw,bh,bd), info.height(bw,bh,bd), info.depth(bw,bh,bd))
end
end
end
@@ -889,7 +896,7 @@ do
end
do
- local getbox, setbox, copy_list = tex.getbox, tex.setbox, node.direct.copy_list
+ local getbox, setbox, copy_list = tex.getbox, tex.setbox, dnode.copy_list
-- raise, lower
function luatexja.direction.raise_box()
start_time_measure 'box_primitive_hook'
@@ -923,6 +930,7 @@ end
-- adjust
do
local id_adjust = node.id 'adjust'
+ local last_node = dnode.last_node
local scan_keyword = token.scan_keyword
function luatexja.direction.adjust_begin()
if scan_keyword 'pre' then tex.sprint(cat_lp, '\\ltj@@vadjust@pre')
@@ -931,7 +939,7 @@ do
function luatexja.direction.check_adjust_direction()
start_time_measure 'box_primitive_hook'
local list_dir = get_adjust_dir_count()
- local a = tex_nest[tex_nest.ptr].tail
+ local a = getnest().tail
local ad = to_direct(a)
if a and getid(ad)==id_adjust then
local adj_dir = get_box_dir(ad)
@@ -940,7 +948,7 @@ do
'luatexja',
'Direction Incompatible',
"\\vadjust's argument and outer vlist must have same direction.")
- node.direct.last_node()
+ node_free(last_node())
end
end
stop_time_measure 'box_primitive_hook'
@@ -954,13 +962,13 @@ do
function luatexja.direction.populate_insertion_dir_whatsit()
start_time_measure 'box_primitive_hook'
local list_dir = get_dir_count()
- local a = tex_nest[tex_nest.ptr].tail
+ local a = getnest().tail
local ad = to_direct(a)
if (not a) or getid(ad)~=id_ins then
a = node.tail(tex.lists.page_head); ad = to_direct(a)
end
if a and getid(ad)==id_ins then
- local h = getfield(ad, 'head')
+ local h = getlist(ad)
if getid(h)==id_whatsit and
getsubtype(h)==sid_user and getfield(h, 'user_id')==DIR then
local n = h; h = node_remove(h,h)
@@ -972,7 +980,7 @@ do
end
end
ensure_tex_attr(attr_dir, 0)
- setfield(ad, 'head', h)
+ setlist(ad, h)
end
stop_time_measure 'box_primitive_hook'
end
@@ -980,25 +988,32 @@ end
-- vsplit
do
- local split_dir_whatsit, split_dir_head
+ local split_dir_whatsit, split_dir_head, split_dir_at_2nd
local cat_lp = luatexbase.catcodetables['latex-package']
local sprint, scan_int, tex_getbox = tex.sprint, token.scan_int, tex.getbox
function luatexja.direction.vsplit()
local n = scan_int();
local p = to_direct(tex_getbox(n))
- split_dir_head = nil
+ if split_dir_head then node_free(split_dir_head); split_dir_head = nil end
+ if split_dir_whatsit then split_dir_watsit = nil end
if p then
local bh = getlist(p)
- if getid(bh)==id_whatsit and getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR
+ if getid(bh)==id_whatsit and getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR
and node_next(bh) then
- ltjs.list_dir = has_attr(bh, attr_dir)
- local q = node_next(p)
- setfield(p, 'head', node_remove(bh,bh,bh))
- split_dir_head = bh
+ ltjs.list_dir = get_attr(bh, attr_dir)
+ setlist(p, (node_remove(bh,bh)))
+ split_dir_head, split_dir_2nd = bh, false
+ else
+ local w = node_next(bh)
+ if getid(w)==id_whatsit and getsubtype(w)==sid_user and getfield(w, 'user_id')==DIR then
+ ltjs.list_dir = get_attr(w, attr_dir)
+ setlist(p, (node_remove(bh,w)))
+ split_dir_head, split_dir_2nd = w, true
+ end
end
end
sprint(cat_lp, '\\ltj@@orig@vsplit' .. tostring(n))
- end
+ end
local function dir_adjust_vpack(h, gc)
start_time_measure 'direction_vpack'
local hd = to_direct(h)
@@ -1008,15 +1023,17 @@ do
split_dir_whatsit = hd
elseif gc=='split_off' then
if split_dir_head then
- ltjs.list_dir = has_attr(split_dir_head, attr_dir)
- hd = insert_before(hd, hd, split_dir_head)
+ ltjs.list_dir = get_attr(split_dir_head, attr_dir)
+ if split_dir_2nd then hd = insert_after(hd, hd, split_dir_head)
+ else hd = insert_before(hd, hd, split_dir_head)
+ end
split_dir_head=nil
end
if split_dir_whatsit then
-- adjust direction of 'split_keep'
set_attr(split_dir_whatsit, attr_dir, ltjs.list_dir)
+ split_dir_whatsit=nil
end
- split_dir_whatsit=nil
elseif gc=='preamble' then
split_dir_whatsit=nil
else
@@ -1038,7 +1055,7 @@ do
local function dir_adjust_pre_output(h, gc)
return to_node(create_dir_whatsit_vbox(to_direct(h), gc))
end
- ltjb.add_to_callback('pre_output_filter', dir_adjust_pre_output,
+ ltjb.add_to_callback('pre_output_filter', dir_adjust_pre_output,
'ltj.direction', 10000)
end
@@ -1051,38 +1068,22 @@ do
local function finalize_dir_node(db,new_dir)
local b = getlist(db)
while b and ((getid(b)~=id_hlist) and (getid(b)~=id_vlist)) do
- local ob = b; b = node_remove(b,b); setfield(db, 'head', b);
+ local ob = b; b = node_remove(b,b); setlist(db, b);
node_free(ob)
end
finalize_inner(b)
- local w = getfield(b, 'width')
- local h = getfield(b, 'height')
- local d = getfield(b, 'depth')
- local dn_w = getfield(db, 'width')
- local dn_h = getfield(db, 'height')
- local dn_d = getfield(db, 'depth')
+ local w, h, d = getwhd(b)
+ local dw, dh, dd = getwhd(db)
local db_head, db_tail
local t = dir_node_aux[get_box_dir(b, dir_yoko)%dir_math_mod][new_dir]
t = t and t[getid(b)]; if not t then return end
for _,v in ipairs(t) do
- local cmd, arg, nn = v[1], v[2]
- if cmd=='kern' then
- nn = node_new(id_kern, 1)
- setfield(nn, 'kern', arg(w, h, d, dn_w, dn_h, dn_d))
- elseif cmd=='whatsit' then
- nn = node_new(id_whatsit, arg)
- elseif cmd=='rotate' then
- nn = node_new(id_whatsit, sid_matrix)
- setfield(nn, 'data', arg)
- elseif cmd=='box' then
- nn = b; setfield(b, 'next', nil)
- setfield(nn, 'shift', arg(w, h, d, dn_w, dn_h, dn_d))
- end
+ local nn = v[1](v[2], b, w, h, d, dw, dh, dd)
if db_head then
insert_after(db_head, db_tail, nn)
db_tail = nn
else
- setfield(db, 'head', nn)
+ setlist(db, nn)
db_head, db_tail = nn, nn
end
end
@@ -1090,6 +1091,7 @@ do
tex.setattribute(attr_dir, dir_yoko)
local shipout_temp = node_new(id_hlist)
+ dnode.setattributelist(shipout_temp, nil)
tex.setattribute(attr_dir, 0)
finalize_inner = function (box)
@@ -1105,17 +1107,17 @@ do
end
end
end
- local copy = node.direct.copy
+ local copy = dnode.copy
function luatexja.direction.shipout_lthook (head)
start_time_measure 'box_primitive_hook'
local a = to_direct(head)
local a_dir = get_box_dir(a, dir_yoko)
if a_dir~=dir_yoko then
local b = create_dir_node(a, a_dir, dir_yoko, false)
- setfield(b, 'head', a); a = b
+ setlist(b, a); a = b
end
- setfield(shipout_temp, 'head', a); finalize_inner(shipout_temp)
- a = copy(getlist(shipout_temp)); setfield(shipout_temp, 'head',nil)
+ setlist(shipout_temp, a); finalize_inner(shipout_temp)
+ a = copy(getlist(shipout_temp)); setlist(shipout_temp, nil)
stop_time_measure 'box_primitive_hook'
return to_node(a)
end
diff --git a/macros/luatex/generic/luatexja/src/ltj-inputbuf.lua b/macros/luatex/generic/luatexja/src/ltj-inputbuf.lua
index 7f39b9b8d7..dc6ec46a56 100644
--- a/macros/luatex/generic/luatexja/src/ltj-inputbuf.lua
+++ b/macros/luatex/generic/luatexja/src/ltj-inputbuf.lua
@@ -8,12 +8,10 @@ luatexja.load_module 'charrange'; local ltjc = luatexja.charrange
local utflen = utf.len
local utfbyte = utf.byte
local utfchar = utf.char
-local node_new = node.new
-local node_free = node.free
local id_glyph = node.id 'glyph'
local getcatcode, getcount = tex.getcatcode, tex.getcount
local ltjc_is_japanese_char_curlist = ltjc.is_japanese_char_curlist
-
+local cnt_lineend = luatexbase.registernumber 'ltjlineendcomment'
local substituter
do
local uchar = utf.char
@@ -71,7 +69,7 @@ local function add_comment(buffer)
if (te ~= -1) and (getcatcode(te)==5) then
local ct = getcatcode(c)
if (ct==11) or (ct==12) then
- local lec = getcount 'ltjlineendcomment'
+ local lec = getcount(cnt_lineend)
-- Is the catcode of \ltjlineendcomment (new comment char) is 14 (comment)?
if ltjc_is_japanese_char_curlist(c) and (getcatcode(lec)==14) then
stop_time_measure 'inputbuf'; return buffer .. utfchar(lec)
diff --git a/macros/luatex/generic/luatexja/src/ltj-jfmglue.lua b/macros/luatex/generic/luatexja/src/ltj-jfmglue.lua
index 3d046f0c01..ed7ab6daa8 100644
--- a/macros/luatex/generic/luatexja/src/ltj-jfmglue.lua
+++ b/macros/luatex/generic/luatexja/src/ltj-jfmglue.lua
@@ -3,7 +3,7 @@
--
luatexbase.provides_module({
name = 'luatexja.jfmglue',
- date = '2022-02-09',
+ date = '2022-08-29',
description = 'Insertion process of JFM glues, [x]kanjiskip and others',
})
luatexja.jfmglue = luatexja.jfmglue or {}
@@ -19,25 +19,32 @@ local pairs = pairs
--local to_node = node.direct.tonode
--local to_direct = node.direct.todirect
-local setfield = node.direct.setfield
-local setglue = luatexja.setglue
local getfield = node.direct.getfield
local getid = node.direct.getid
local getfont = node.direct.getfont
local getlist = node.direct.getlist
local getchar = node.direct.getchar
+local getglue = node.direct.getglue
local getsubtype = node.direct.getsubtype
+local getshift = node.direct.getshift
+local getwidth = node.direct.getwidth
+local getdepth = node.direct.getdepth
+local getpenalty = node.direct.getpenalty
+local setfield = node.direct.setfield
+local setglue = node.direct.setglue
+local setshift = node.direct.setshift
local if_lang_ja
do
local lang_ja = luatexja.lang_ja
local getlang = node.direct.getlang
-- glyph with font number 0 (\nullfont) is always considered an ALchar node
- if_lang_ja = getlang
- and function (n) return (getlang(n)==lang_ja)and(getfont(n)~=0) end
- or function (n) return (getfield(n,'lang')==lang_ja)and(getfont(n)~=0) end
+ if_lang_ja = function (n) return (getlang(n)==lang_ja)and(getfont(n)~=0) end
end
-
-local has_attr = node.direct.has_attribute
+local setpenalty = node.direct.setpenalty
+local setkern = node.direct.setkern
+local call_callback = luatexbase.call_callback
+
+local get_attr = node.direct.get_attribute
local set_attr = node.direct.set_attribute
local insert_before = node.direct.insert_before
local insert_after = node.direct.insert_after
@@ -48,7 +55,7 @@ local ltjf_find_char_class = ltjf.find_char_class
local node_new = luatexja.dnode_new
local node_copy = node.direct.copy
local node_tail = node.direct.tail
-local node_free = node.direct.free
+local node_free = node.direct.flush_node or node.direct.free
local node_remove = node.direct.remove
local node_inherit_attr = luatexja.node_inherit_attr
@@ -96,7 +103,7 @@ local set_np_xspc_jachar_hbox
local ltjs_orig_char_table = ltjs.orig_char_table
local function get_attr_icflag(p)
- return (has_attr(p, attr_icflag) or 0)%PROCESSED_BEGIN_FLAG
+ return (get_attr(p, attr_icflag) or 0)%PROCESSED_BEGIN_FLAG
end
-------------------- Helper functions
@@ -107,11 +114,12 @@ local function fast_find_char_class(c,m)
end
-- 文字クラスの決定
-local slow_find_char_class
+local slow_find_char_class, skip_table_to_glue
do
local start_time_measure = ltjb.start_time_measure
local stop_time_measure = ltjb.stop_time_measure
- slow_find_char_class = function (c, m, oc)
+ local fast_get_stack_skip = ltjs.fast_get_stack_skip
+ function slow_find_char_class (c, m, oc)
local cls = ltjf_find_char_class(oc, m)
if oc~=c and c and cls==0 then
return ltjf_find_char_class(c, m)
@@ -119,20 +127,17 @@ do
return cls
end
end
-end
-
-local function skip_table_to_glue(n)
- local g, st = node_new(id_glue), ltjs.fast_get_stack_skip(n)
- setglue(g, st.width, st.stretch, st.shrink, st.stretch_order, st.shrink_order)
- return g, (st.width==1073741823)
+ function skip_table_to_glue(n)
+ local g, st = node_new(id_glue), fast_get_stack_skip(n)
+ setglue(g, st[1], st[2], st[3], st[4], st[5])
+ return g, (st[1]==1073741823)
+ end
end
-- penalty 値の計算
local add_penalty
do
-local setpenalty = node.direct.setpenalty or function(n, a) setfield(n,'penalty',a) end
-local getpenalty = node.direct.getpenalty or function(n) return getfield(n,'penalty') end
function add_penalty(p,e)
local pp = getpenalty(p)
if (pp>-10000) and (pp<10000) then
@@ -206,7 +211,7 @@ local function check_box(box_ptr, box_end)
if find_first_char then first_char = s; find_first_char = false end
last_char = s; found_visible_node = true
else
- if getfield(p, 'shift')==0 then
+ if getshift(p)==0 then
last_char = nil
if check_box(getlist(p), nil) then found_visible_node = true end
find_first_char = false
@@ -264,13 +269,13 @@ luatexbase.create_callback("luatexja.jfmglue.whatsit_last_minute", "data",
function (stat, Nq, Np) return false end)
-- calc next Np
-local calc_np
+local calc_np
do -- 001 -----------------------------------------------
local traverse = node.direct.traverse
local function check_next_ickern(lp)
local lx = Np.nuc
- while lp and getid(lp) == id_kern and ( getsubtype(lp)==0 or
+ while lp and getid(lp) == id_kern and ( getsubtype(lp)==0 or
getsubtype(lp)==3 or ITALIC == get_attr_icflag(lp)) do
set_attr(lp, attr_icflag, IC_PROCESSED)
lx, lp = lp, node_next(lp)
@@ -295,7 +300,7 @@ local function calc_np_pbox(lp, last)
else
nc, lp = lp, node_next(lp)
end
- first, lpa = false, (lp and has_attr(lp, attr_icflag) or 0)
+ first, lpa = false, (lp and get_attr(lp, attr_icflag) or 0)
-- get_attr_icflag() ではいけない!
end
Np.nuc = nc
@@ -311,18 +316,20 @@ do -- 002 ---------------------------------------
local attr_jchar_class = luatexbase.attributes['ltj@charclass']
local attr_jchar_code = luatexbase.attributes['ltj@charcode']
local font_getfont = font.getfont
+ local setwhd = node.direct.setwhd
+ local setdir = node.direct.setdir
local function calc_np_notdef(lp)
if not font_getfont(getfont(lp)).characters[getchar(lp)] then
local ln = node_next(lp)
- if ltju.specified_feature(getfont(lp), 'notdef') and ln and getid(ln)==id_glyph then
+ if ltju.specified_feature(getfont(lp), 'notdef') and ln and getid(ln)==id_glyph then
set_attr(lp, attr_icflag, PROCESSED)
- set_attr(ln, attr_jchar_code, has_attr(lp, attr_jchar_code) or getchar(lp))
- set_attr(ln, attr_jchar_class, has_attr(lp, attr_jchar_class) or 0)
+ set_attr(ln, attr_jchar_code, get_attr(lp, attr_jchar_code) or getchar(lp))
+ set_attr(ln, attr_jchar_class, get_attr(lp, attr_jchar_class) or 0)
Np.nuc, lp = ln, ln
end
end
return lp
- end
+ end
function calc_np_aux_glyph_common(lp, acc_flag)
Np.nuc, Np.first = lp, (Np.first or lp)
if if_lang_ja(lp) then -- JAchar
@@ -341,9 +348,9 @@ function calc_np_aux_glyph_common(lp, acc_flag)
-- loop
local first_glyph, last_glyph = lp
set_attr(lp, attr_icflag, PROCESSED); Np.last = lp
- local y_adjust = has_attr(lp,attr_ablshift) or 0
- local node_depth = getfield(lp, 'depth') + min(y_adjust, 0)
- local adj_depth = (y_adjust>0) and (getfield(lp, 'depth') + y_adjust) or 0
+ local y_adjust = get_attr(lp,attr_ablshift) or 0
+ local node_depth = getdepth(lp) + min(y_adjust, 0)
+ local adj_depth = (y_adjust>0) and (getdepth(lp) + y_adjust) or 0
setfield(lp, 'yoffset', getfield(lp, 'yoffset') - y_adjust); lp = node_next(lp)
local lx=lp
while lx do
@@ -354,9 +361,9 @@ function calc_np_aux_glyph_common(lp, acc_flag)
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
- node_depth = max(getfield(lx, 'depth') + min(y_adjust, 0), node_depth)
- adj_depth = (y_adjust>0) and max(getfield(lx, 'depth') + y_adjust, adj_depth) or adj_depth
+ y_adjust = get_attr(lx,attr_ablshift) or 0
+ node_depth = max(getdepth(lx) + min(y_adjust, 0), node_depth)
+ adj_depth = (y_adjust>0) and max(getdepth(lx) + y_adjust, adj_depth) or adj_depth
setfield(lx, 'yoffset', getfield(lx, 'yoffset') - y_adjust); lx = node_next(lx)
elseif lid==id_kern then
local ls = getsubtype(lx)
@@ -364,9 +371,9 @@ function calc_np_aux_glyph_common(lp, acc_flag)
set_attr(lx, attr_icflag, PROCESSED)
lx = node_next(lx) -- lx: アクセント本体
if getid(lx)==id_glyph then
- setfield(lx, 'yoffset', getfield(lx, 'yoffset') - (has_attr(lx,attr_ablshift) or 0))
+ setfield(lx, 'yoffset', getfield(lx, 'yoffset') - (get_attr(lx,attr_ablshift) or 0))
else -- アクセントは上下にシフトされている
- setfield(lx, 'shift', getfield(lx, 'shift') + (has_attr(lx,attr_ablshift) or 0))
+ setshift(lx, getshift(lx) + (get_attr(lx,attr_ablshift) or 0))
end
set_attr(lx, attr_icflag, PROCESSED)
lx = node_next(lx); set_attr(lx, attr_icflag, PROCESSED)
@@ -385,8 +392,7 @@ function calc_np_aux_glyph_common(lp, acc_flag)
local r
if adj_depth>node_depth then
r = node_new(id_rule,3,first_glyph)
- setfield(r, 'width', 0); setfield(r, 'height', 0)
- setfield(r, 'depth',adj_depth); setfield(r, 'dir', tex_dir)
+ setwhd(r, 0, 0, adj_depth); setdir(r, tex_dir)
set_attr(r, attr_icflag, PROCESSED)
end
if last_glyph then
@@ -397,7 +403,7 @@ function calc_np_aux_glyph_common(lp, acc_flag)
Np.last_char = npn
if r then
local nf, nc = getfont(npn), getchar(npn)
- local ct = (font.getfont(nf) or font.fonts[nf] ).characters[nc]
+ local ct = (font_getfont(nf) or font.fonts[nf] ).characters[nc]
if not ct then -- variation selector
node_free(r)
elseif (ct.left_protruding or 0) == 0 then
@@ -429,6 +435,7 @@ 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 getvalue = node.direct.getdata
calc_np_auxtable = {
[id_glyph] = calc_np_aux_glyph_common,
[id_hlist] = function(lp)
@@ -436,7 +443,7 @@ calc_np_auxtable = {
head, lp, op, flag = ltjd_make_dir_whatsit(head, lp, list_dir, 'jfm hlist')
set_attr(op, attr_icflag, PROCESSED)
Np.first = Np.first or op; Np.last = op; Np.nuc = op;
- if (flag or getfield(op, 'shift')~=0) then
+ if (flag or getshift(op)~=0) then
Np.id = id_box_like
else
Np.id = id_hlist
@@ -461,7 +468,7 @@ calc_np_auxtable = {
if lps==sid_user then
if getfield(lp, 'user_id')==luatexja.userid_table.IHB then
local lq = node_next(lp);
- head = node_remove(head, lp); node_free(lp); non_ihb_flag = getfield(lp, 'value')~=1
+ head = node_remove(head, lp); node_free(lp); non_ihb_flag = getvalue(lp)~=1
return false, lq;
elseif getfield(lp, 'user_id')==luatexja.userid_table.JA_AL_BDD then
local lq = node_next(lp);
@@ -469,7 +476,7 @@ calc_np_auxtable = {
return false, lq;
else
set_attr(lp, attr_icflag, PROCESSED)
- luatexbase.call_callback("luatexja.jfmglue.whatsit_getinfo",
+ 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;
@@ -501,8 +508,8 @@ calc_np_auxtable = {
end,
[id_glue] = function(lp)
Np.first, Np.nuc, Np.last = (Np.first or lp), lp, lp;
- Np.id = getid(lp);
- local f = luatexbase.call_callback("luatexja.jfmglue.special_jaglue", lp)
+ Np.id = getid(lp);
+ local f = call_callback("luatexja.jfmglue.special_jaglue", lp)
if f then
set_attr(lp, attr_icflag, PROCESSED)
end
@@ -520,9 +527,9 @@ calc_np_auxtable = {
Np.first = Np.first or lp
set_attr(lp, attr_icflag, PROCESSED); lp = node_next(lp)
if getid(lp)==id_glyph then -- アクセント本体
- setfield(lp, 'yoffset', getfield(lp, 'yoffset') - (has_attr(lp,attr_ablshift) or 0))
+ setfield(lp, 'yoffset', getfield(lp, 'yoffset') - (get_attr(lp,attr_ablshift) or 0))
else -- アクセントは上下にシフトされている
- setfield(lp, 'shift', getfield(lp, 'shift') + (has_attr(lp,attr_ablshift) or 0))
+ setshift(lp, getshift(lp) + (get_attr(lp,attr_ablshift) or 0))
end
set_attr(lp, attr_icflag, PROCESSED); lp = node_next(lp)
set_attr(lp, attr_icflag, PROCESSED); lp = node_next(lp)
@@ -552,7 +559,7 @@ function calc_np(last, lp)
local k
-- We assume lp = node_next(Np.last)
if Nq and Nq.id==id_pbox_w then
- luatexbase.call_callback("luatexja.jfmglue.whatsit_last_minute", false, Nq, Np)
+ call_callback("luatexja.jfmglue.whatsit_last_minute", false, Nq, Np)
end
Np, Nq, non_ihb_flag = Nq, Np, true
-- We clear `predefined' entries of Np before pairs() loop,
@@ -560,13 +567,13 @@ function calc_np(last, lp)
Np.post, Np.pre, Np.xspc, Np.gk = nil, nil, nil, nil
Np.first, Np.id, Np.last, Np.met, Np.class= nil, nil, nil, nil
Np.auto_kspc, Np.auto_xspc, Np.char, Np.nuc = nil, nil, nil, nil
- -- auto_kspc, auto_xspc: normally true/false,
+ -- auto_kspc, auto_xspc: normally true/false,
-- but the number 0 when Np is ''the beginning of the box/paragraph''.
for k in pairs(Np) do Np[k] = nil end
for k = 1,#Bp do Bp[k] = nil end
while lp ~= last do
- local lpa = has_attr(lp, attr_icflag) or 0
+ local lpa = get_attr(lp, attr_icflag) or 0
-- unbox 由来ノードの検出
if (lpa>=PACKED) and (lpa%PROCESSED_BEGIN_FLAG<=BOXBDD) then
if lpa%PROCESSED_BEGIN_FLAG == BOXBDD then
@@ -598,6 +605,7 @@ do
local dir_tate = luatexja.dir_table.dir_tate
-- 和文文字のデータを取得
+ local has_attr = node.direct.has_attribute
local attr_jchar_class = luatexbase.attributes['ltj@charclass']
local attr_jchar_code = luatexbase.attributes['ltj@charcode']
local attr_autospc = luatexbase.attributes['ltj@autospc']
@@ -617,19 +625,21 @@ do
Nx.post = table_current_stack[POST + c] or 0
Nx.xspc = table_current_stack[XSP + c] or 3
Nx.kcat = table_current_stack[KCAT + c] or 0
- Nx.auto_kspc, Nx.auto_xspc = (has_attr(x, attr_autospc)==1), (has_attr(x, attr_autoxspc)==1)
+ Nx.auto_kspc, Nx.auto_xspc
+ = not has_attr(x, attr_autospc, 0), not has_attr(x, attr_autoxspc, 0)
return m, mc, cls
end
function set_np_xspc_jachar_hbox(Nx, x)
local m = ltjf_font_metric_table[getfont(x)]
- local c = has_attr(x, attr_jchar_code) or getchar(x)
- Nx.met, Nx.char = m, c; Nx.class = has_attr(x, attr_jchar_class) or 0;
+ local c = get_attr(x, attr_jchar_code) or getchar(x)
+ Nx.met, Nx.char = m, c; Nx.class = get_attr(x, attr_jchar_class) or 0;
local mc = m.char_type; Nx.char_type = mc
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
Nx.kcat = table_current_stack[KCAT + c] or 0
- Nx.auto_kspc, Nx.auto_xspc = (has_attr(x, attr_autospc)==1), (has_attr(x, attr_autoxspc)==1)
+ Nx.auto_kspc, Nx.auto_xspc
+ = not has_attr(x, attr_autospc, 0), not has_attr(x, attr_autoxspc, 0)
end
-- 欧文文字のデータを取得
@@ -652,7 +662,7 @@ do
end
Nx.met = nil
Nx.xspc = table_current_stack[XSP + c] or 3
- Nx.auto_xspc = (has_attr(x, attr_autoxspc)==1)
+ Nx.auto_xspc = not has_attr(x, attr_autoxspc, 0)
end
local set_np_xspc_alchar = set_np_xspc_alchar
-- change the information for the next loop
@@ -686,13 +696,13 @@ luatexbase.create_callback('luatexja.adjust_jfmglue', 'simple', function(n) retu
-- change penalties (or create a new penalty, if needed)
local function handle_penalty_normal(post, pre, g)
- luatexbase.call_callback('luatexja.adjust_jfmglue', head, Nq, Np, Bp)
+ call_callback('luatexja.adjust_jfmglue', head, Nq, Np, Bp)
local a = (pre or 0) + (post or 0)
if #Bp == 0 then
if (a~=0 and not(g and getid(g)==id_kern)) then
local p = node_new(id_penalty, nil, Nq.nuc, Np.nuc)
if a<-10000 then a = -10000 elseif a>10000 then a = 10000 end
- setfield(p, 'penalty', a); head = insert_before(head, Np.first, p)
+ setpenalty(p, a); head = insert_before(head, Np.first, p)
Bp[1]=p; set_attr(p, attr_icflag, KINSOKU)
end
else for _, v in pairs(Bp) do add_penalty(v,a) end
@@ -700,13 +710,13 @@ local function handle_penalty_normal(post, pre, g)
end
local function handle_penalty_always(post, pre, g)
- luatexbase.call_callback('luatexja.adjust_jfmglue', head, Nq, Np, Bp)
+ call_callback('luatexja.adjust_jfmglue', head, Nq, Np, Bp)
local a = (pre or 0) + (post or 0)
if #Bp == 0 then
if not (g and getid(g)==id_glue) or a~=0 then
local p = node_new(id_penalty, nil, Nq.nuc, Np.nuc)
if a<-10000 then a = -10000 elseif a>10000 then a = 10000 end
- setfield(p, 'penalty', a); head = insert_before(head, Np.first, p)
+ setpenalty(p, a); head = insert_before(head, Np.first, p)
Bp[1]=p; set_attr(p, attr_icflag, KINSOKU)
end
else for _, v in pairs(Bp) do add_penalty(v,a) end
@@ -714,14 +724,14 @@ local function handle_penalty_always(post, pre, g)
end
local function handle_penalty_suppress(post, pre, g)
- luatexbase.call_callback('luatexja.adjust_jfmglue', head, Nq, Np, Bp)
+ call_callback('luatexja.adjust_jfmglue', head, Nq, Np, Bp)
if #Bp == 0 then
if g and getid(g)==id_glue then
local p = node_new(id_penalty, nil, Nq.nuc, Np.nuc)
- setfield(p, 'penalty', 10000); head = insert_before(head, Np.first, p)
+ setpenalty(p, 10000); head = insert_before(head, Np.first, p)
Bp[1]=p; set_attr(p, attr_icflag, KINSOKU)
end
- else
+ else
local a = (pre or 0) + (post or 0)
for _, v in pairs(Bp) do add_penalty(v,a) end
end
@@ -733,7 +743,7 @@ local function handle_penalty_jwp()
if a~=0 then
local p = node_new(id_penalty, widow_Np.nuc)
if a<-10000 then a = -10000 elseif a>10000 then a = 10000 end
- setfield(p, 'penalty', a); head = insert_before(head, widow_Np.first, p)
+ setpenalty(p, a); head = insert_before(head, widow_Np.first, p)
widow_Bp[1]=p; set_attr(p, attr_icflag, KINSOKU)
end
else for _, v in pairs(widow_Bp) do add_penalty(v,a) end
@@ -746,13 +756,13 @@ local function new_jfm_glue(mc, bc, ac)
local g = mc[bc][ac]
if g then
if g[1] then
- local k = node_new(id_kern, 1); setfield(k, 'kern', g[1])
+ local k = node_new(id_kern, 1); setkern(k, g[1])
set_attr(k, attr_icflag, FROM_JFM)
return k, g.ratio, false, false, false
else
local f = node_new(id_glue)
set_attr(f, attr_icflag, g.priority)
- setglue(f, g.width, g.stretch, g.shrink)
+ setglue(f, g[2], g[3], g[4])
return f, g.ratio, g.kanjiskip_natural, g.kanjiskip_stretch, g.kanjiskip_shrink
end
end
@@ -779,6 +789,7 @@ do
local bg_ak = 2*id_glue - id_kern
local bk_ag = 2*id_kern - id_glue
local bk_ak = 2*id_kern - id_kern
+ local getkern = node.direct.getkern
local function blend_diffmet(b, a, rb, ra)
return round(luatexja.jfmglue.diffmet_rule((1-rb)*b+rb*a, (1-ra)*b+ra*a))
@@ -793,31 +804,30 @@ do
return round(r/2.^(64*ro)), ro
end
end
- local getglue = luatexja.getglue
calc_ja_ja_aux = function (gb, ga, db, da)
if luatexja.jfmglue.diffmet_rule ~= math.two_pleft and diffmet_rule ~= math.two_pright
and luatexja.jfmglue.diffmet_rule ~= math.two_paverage then
db, da = 0, 1
end
if not gb then
- if ga then gb = node_new(id_kern, 1); setfield(gb, 'kern', 0)
+ if ga then gb = node_new(id_kern, 1); setkern(gb, 0)
else return nil end
elseif not ga then
- ga = node_new(id_kern, 1); setfield(ga, 'kern', 0)
+ ga = node_new(id_kern, 1); setkern(ga, 0)
end
local gbw, gaw, gbst, gast, gbsto, gasto, gbsh, gash, gbsho, gasho
if getid(gb)==id_glue then
gbw, gbst, gbsh, gbsto, gbsho = getglue(gb)
else
- gbw = getfield(gb, 'kern')
+ gbw = getkern(gb)
end
if getid(ga)==id_glue then
gaw, gast, gash, gasto, gasho = getglue(ga)
else
- gaw = getfield(ga, 'kern')
+ gaw = getkern(ga)
end
if not (gbst or gast) then -- 両方とも kern
- setfield(gb, 'kern', blend_diffmet(gbw, gaw, db, da))
+ setkern(gb, blend_diffmet(gbw, gaw, db, da))
node_free(ga); return gb
else
local gr = gb
@@ -848,8 +858,8 @@ do
if kanjiskip_jfm_flag then
local g = node_new(id_glue);
local bk = qm.kanjiskip or null_skip_table
- setglue(g, bn and (bn*bk[1]) or 0,
- bp and (bp*bk[2]) or 0,
+ setglue(g, bn and (bn*bk[1]) or 0,
+ bp and (bp*bk[2]) or 0,
bh and (bh*bk[3]) or 0, 0, 0)
set_attr(g, attr_icflag, KANJI_SKIP_JFM)
return g
@@ -858,8 +868,8 @@ do
local st = bp and (bp*getfield(kanji_skip, 'stretch')) or 0
local sh = bh and (bh*getfield(kanji_skip, 'shrink')) or 0
setglue(g,
- bn and (bn*getfield(kanji_skip, 'width')) or 0,
- st, sh,
+ bn and (bn*getwidth(kanji_skip)) or 0,
+ st, sh,
(st==0) and 0 or getfield(kanji_skip, 'stretch_order'),
(sh==0) and 0 or getfield(kanji_skip, 'shrink_order'))
set_attr(g, attr_icflag, KANJI_SKIP_JFM)
@@ -867,9 +877,9 @@ do
end
end
end
-
+
get_kanjiskip = function()
- if Np.auto_kspc==0 or Nq.auto_kspc==0 then return nil
+ if Np.auto_kspc==0 or Nq.auto_kspc==0 then return nil
elseif Np.auto_kspc or Nq.auto_kspc then
local pm, qm = Np.met, Nq.met
if (pm.char_type==qm.char_type) and (qm.var==pm.var) then
@@ -877,15 +887,15 @@ do
else
local gb = get_kanjiskip_low(false, qm, 1, 1, 1)
if gb then
- return calc_ja_ja_aux(gb,
- get_kanjiskip_low(false, pm, 1, 1, 1) or node_copy(kanji_skip), 0, 1)
+ return calc_ja_ja_aux(gb,
+ get_kanjiskip_low(false, pm, 1, 1, 1) or node_copy(kanji_skip), 0, 1)
else
local ga = get_kanjiskip_low(false, pm, 1, 1, 1)
return (ga and calc_ja_ja_aux(node_copy(kanji_skip), ga, 0, 1))
or node_copy(kanji_skip)
end
end
- else
+ else
local g = node_new(id_glue)
set_attr(g, attr_icflag, kanjiskip_jfm_flag and KANJI_SKIP_JFM or KANJI_SKIP)
return g
@@ -900,11 +910,11 @@ do
return g, (Np.auto_kspc or Nq.auto_kspc) and get_kanjiskip_low(true, qm, kn, kp, kh)
else
local npn, nqn = Np.nuc, Nq.nuc
- local gb, db, bn, bp, bh
+ local gb, db, bn, bp, bh
= new_jfm_glue(qmc, Nq.class,
slow_find_char_class(Np.char,
qm, getchar(npn)))
- local ga, da, an, ap, ah
+ local ga, da, an, ap, ah
= new_jfm_glue(pmc,
slow_find_char_class(Nq.char,
pm, getchar(nqn)),
@@ -942,22 +952,23 @@ do
elseif flag then
return node_copy(xkanji_skip)
else
- local g = node_new(id_glue);
+ local g = node_new(id_glue)
+ local w, st, sh, sto, sho = getglue(xkanji_skip)
setglue(g,
- bn and (bn*getfield(xkanji_skip, 'width')) or 0,
- bp and (bp*getfield(xkanji_skip, 'stretch')) or 0,
- bh and (bh*getfield(xkanji_skip, 'shrink')) or 0,
- bp and getfield(xkanji_skip, 'stretch_order') or 0,
- bh and getfield(xkanji_skip, 'shrink_order') or 0)
+ bn and (bn*w) or 0,
+ bp and (bp*st) or 0,
+ bh and (bh*sh) or 0,
+ bp and sto or 0,
+ bh and sho or 0)
set_attr(g, attr_icflag, XKANJI_SKIP_JFM)
return g
end
end
end
-
+
get_xkanjiskip = function(Nn)
if Np.auto_xspc==0 or Nq.auto_xspc==0 then
- return nil
+ return nil
elseif (Nq.xspc>=2) and (Np.xspc%2==1) and (Nq.auto_xspc or Np.auto_xspc) then
return get_xkanjiskip_low(true, Nn.met, 1, 1, 1)
else
@@ -999,7 +1010,7 @@ local function get_OA_skip(insert_ksp)
local g, _, kn, kp, kh = new_jfm_glue(
pm.char_type,
fast_find_char_class(
- (((Nq.id==id_glue)or(Nq.id==id_kern)) and 'glue' or 'jcharbdd'), pm),
+ (((Nq.id==id_glue)or(Nq.id==id_kern)) and 'glue' or 'jcharbdd'), pm),
Np.class)
local k
if insert_ksp then
@@ -1027,7 +1038,7 @@ local function handle_np_jachar(mode)
local g, k
if non_ihb_flag then g, k = calc_ja_ja_glue() end -- M->K
if not g then g = get_kanjiskip() end
- handle_penalty_normal(Nq.post, Np.pre, g);
+ handle_penalty_normal(Nq.post, Np.pre, g);
real_insert(g); real_insert(k)
elseif Nq.met then -- qid==id_hlist
local g, k
@@ -1037,7 +1048,7 @@ local function handle_np_jachar(mode)
elseif Nq.pre then
local g, k; if non_ihb_flag then g, k = get_NA_skip() end -- N_A->X
if not g then g = get_xkanjiskip(Np) end
- handle_penalty_normal((qid==id_hlist and 0 or Nq.post), Np.pre, g);
+ handle_penalty_normal((qid==id_hlist and 0 or Nq.post), Np.pre, g);
real_insert(g); real_insert(k)
else
local g = non_ihb_flag and (get_OA_skip()) -- O_A
@@ -1102,11 +1113,11 @@ do
[id_hlist] = function() after_hlist(Nq) end,
[id_pbox] = function() after_hlist(Nq) end,
[id_disc] = function() after_hlist(Nq) end,
- [id_glue] = function()
- luatexbase.call_callback("luatexja.jfmglue.special_jaglue_after", Nq.nuc)
+ [id_glue] = function()
+ call_callback("luatexja.jfmglue.special_jaglue_after", Nq.nuc)
end,
[id_pbox_w]= function()
- local hh = luatexbase.call_callback("luatexja.jfmglue.whatsit_after", false, Nq, Np, head)
+ local hh = call_callback("luatexja.jfmglue.whatsit_after", false, Nq, Np, head)
-- hh: new head of false (nott processed)
if hh then head = hh end
end,
@@ -1130,7 +1141,7 @@ local function handle_list_tail(mode, last)
-- Insert \jcharwidowpenalty
if widow_Np.first then handle_penalty_jwp() end
else
- Np = Nq
+ Np = Nq
-- the current list is the contents of a hbox
local npi, pm = Np.id, Np.met
if npi == id_jglyph or (npi==id_pbox and pm) then
@@ -1153,7 +1164,7 @@ local function handle_list_head(par_indented)
set_attr(g, attr_icflag, BOXBDD)
if getid(g)==id_glue and #Bp==0 then
local h = node_new(id_penalty, nil, Np.nuc)
- setfield(h, 'penalty', 10000); set_attr(h, attr_icflag, BOXBDD)
+ setpenalty(h, 10000); set_attr(h, attr_icflag, BOXBDD)
end
head = insert_before(head, Np.first, g)
end
@@ -1178,7 +1189,7 @@ do
{}, {}, {first=nil},
{ auto_kspc=nil, auto_xspc=nil, char=nil, class=nil,
first=nil, id=nil, last=nil, met=nil, nuc=nil,
- post=nil, pre=nil, xspc=nil, gk=nil },
+ post=nil, pre=nil, xspc=nil, gk=nil },
{ auto_kspc=nil, auto_xspc=nil, char=nil, class=nil,
first=nil, id=nil, last=nil, met=nil, nuc=nil,
post=nil, pre=nil, xspc=nil, gk=nil },
@@ -1194,31 +1205,28 @@ do
local is_dir_tate = list_dir==dir_tate
capsule_glyph = is_dir_tate and ltjw.capsule_glyph_tate or ltjw.capsule_glyph_yoko
attr_ablshift = is_dir_tate and attr_tablshift or attr_yablshift
- local TEMP = node_new(id_glue)
- -- TEMP is a dummy node, which will be freed at the end of the callback.
- -- ithout this node, set_attr(kanji_skip, ...) somehow creates an "orphaned" attribute list.
-
+ local TEMP = node_new(id_glue)
+ -- TEMP is a dummy node, which will be freed at the end of the callback.
+ -- Without this node, set_attr(kanji_skip, ...) somehow creates an "orphaned" attribute list.
do
kanji_skip, kanjiskip_jfm_flag = skip_table_to_glue(KSK)
set_attr(kanji_skip, attr_icflag, KANJI_SKIP)
end
-
do
xkanji_skip, xkanjiskip_jfm_flag = skip_table_to_glue(XSK)
set_attr(xkanji_skip, attr_icflag, XKANJI_SKIP)
end
-
if mode then
-- the current list is to be line-breaked:
-- hbox from \parindent is skipped.
local lp, par_indented, lpi, lps = head, 'boxbdd', getid(head), getsubtype(head)
- while lp and
+ while lp and
((lpi==id_whatsit and lps~=sid_user)
or ((lpi==id_hlist) and (lps==3))
or (lpi==id_local)) do
if (lpi==id_hlist) and (lps==3) then
Np.char, par_indented = 'parbdd', 'parbdd'
- Np.width = getfield(lp, 'width')
+ Np.width = getwidth(lp)
end
lp=node_next(lp); lpi, lps = getid(lp), getsubtype(lp) end
return lp, node_tail(head), par_indented, TEMP
@@ -1240,7 +1248,7 @@ function luatexja.jfmglue.main(ahead, mode, dir)
lp = calc_np(last, lp)
if Np then
handle_list_head(par_indented)
- lp = calc_np(last,lp);
+ lp = calc_np(last,lp);
while Np do
adjust_nq();
local pid, pm = Np.id, Np.met
@@ -1260,25 +1268,26 @@ function luatexja.jfmglue.main(ahead, mode, dir)
end
-- adjust attr_icflag for avoiding error
if tex_getattr(attr_icflag)~=0 then ensure_tex_attr(attr_icflag, 0) end
- node_free(kanji_skip);
+ node_free(kanji_skip);
node_free(xkanji_skip); node_free(TEMP)
return head
end
end
do
- local IHB = luatexja.userid_table.IHB
+ 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
+ local setvalue = node.direct.setdata
-- \inhibitglue, \disinhibitglue
local function ihb_node(v)
local tn = node_new(id_whatsit, sid_user)
setfield(tn, 'user_id', IHB)
setfield(tn, 'type', 100)
- setfield(tn, 'value', v)
+ setvalue(tn, v)
node_write(tn)
end
function luatexja.jfmglue.create_inhibitglue_node()
@@ -1294,7 +1303,7 @@ do
local tn = node_new(id_whatsit, sid_user)
setfield(tn, 'user_id', BPAR)
setfield(tn, 'type', 100)
- setfield(tn, 'value', 1)
+ setvalue(tn, 1)
node_write(tn)
end
@@ -1303,7 +1312,7 @@ do
local tn = node_new(id_whatsit, sid_user)
setfield(tn, 'user_id', BOXB)
setfield(tn, 'type', 100)
- setfield(tn, 'value', 1)
+ setvalue(tn, 1)
node_write(tn)
end
@@ -1320,7 +1329,7 @@ do
end
Np.met = Nq.met; Np.pre = 0; Np.post = 0; Np.xspc = 0
Np.auto_xspc, Np.auto_kspc = 0, 0
- end
+ end
return Np
else
return Np
@@ -1374,38 +1383,42 @@ do
local attr_yablshift = luatexbase.attributes['ltj@yablshift']
local attr_tablshift = luatexbase.attributes['ltj@tablshift']
local getcount, abs, scan_keyword = tex.getcount, math.abs, token.scan_keyword
+ local getnest = tex.getnest
+ local tex_getattr = tex.getattribute
local get_current_jfont
+ local cnt_stack = luatexbase.registernumber 'ltj@@stack'
do
local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
local attr_curtfnt = luatexbase.attributes['ltj@curtfnt']
local dir_tate = luatexja.dir_table.dir_tate
- local get_dir_count = ltjd.get_dir_count
+ local get_dir_count = ltjd.get_dir_count
function get_current_jfont()
- return tex.getattribute((get_dir_count()==dir_tate) and attr_curtfnt or attr_curjfnt)
+ return tex_getattr((get_dir_count()==dir_tate) and attr_curtfnt or attr_curjfnt)
end
end
+ local get_stack_skip = ltjs.get_stack_skip
-- \insertxkanjiskip
-- SPECIAL_JAGLUE のノード:
-- * (X)KANJI_SKIP(_JFM): その場で値が決まっている
-- * PROCESSED_BEGIN_FLAG + (X)KANJI_SKIP: 段落終了時に決める
local function insert_k_skip_common(ind, name, ica, icb)
- if abs(tex.nest[tex.nest.ptr].mode) ~= ltjs.hmode then return end
+ if abs(getnest().mode) ~= ltjs.hmode then return end
local g = node_new(id_glue); set_attr(g, attr_icflag, SPECIAL_JAGLUE)
- local is_late = scan_keyword("late")
+ local is_late = scan_keyword 'late'
if not is_late then
- local st = ltjs.get_stack_skip(ind, getcount('ltj@@stack'))
- if st.width==1073741823 then
+ local st = get_stack_skip(ind, getcount(cnt_stack))
+ if st[1]==1073741823 then
local bk = ltjf_font_metric_table[get_current_jfont()][name]
if bk then
setglue(g, bk[1] or 0, bk[2] or 0, bk[3] or 0, 0, 0)
end
set_attr(g, attr_yablshift, icb); node_write(g); return
end
- setglue(g, st.width, st.stretch, st.shrink, st.stretch_order, st.shrink_order)
+ setglue(g, st[1], st[2], st[3], st[4], st[5])
set_attr(g, attr_yablshift, ica)
else
set_attr(g, attr_yablshift, PROCESSED_BEGIN_FLAG + ica)
- set_attr(g, attr_tablshift, get_current_jfont())
+ set_attr(g, attr_tablshift, get_current_jfont())
end
node_write(g)
end
@@ -1416,7 +1429,6 @@ do
insert_k_skip_common(KSK, "kanjiskip", KANJI_SKIP, KANJI_SKIP_JFM)
end
-- callback
- local getglue = luatexja.getglue
local function special_jaglue(lx)
local lxi = get_attr_icflag(lx)
if lxi==SPECIAL_JAGLUE then
@@ -1430,22 +1442,22 @@ do
if w~=1073741823 then
setglue(lx, w, st, sh, sto, sho); set_attr(lx, attr_icflag, lxi)
else
- local m = ltjf_font_metric_table[has_attr(lx, attr_tablshift)]
+ local m = ltjf_font_metric_table[get_attr(lx, attr_tablshift)]
setglue(lx, bk[1], bk[2], bk[3], 0, 0)
set_attr(lx, attr_icflag, lxi_jfm)
end
end
local function special_jaglue_after(lx)
if get_attr_icflag(lx)==SPECIAL_JAGLUE then
- lxi=has_attr(lx, attr_yablshift)
+ lxi=get_attr(lx, attr_yablshift)
if lxi>=PROCESSED_BEGIN_FLAG then
lxi = lxi%PROCESSED_BEGIN_FLAG
if lxi == KANJI_SKIP then
- special_jaglue_after_inner(lx, lxi, KANJI_SKIP_JFM, kanji_skip,
- ltjf_font_metric_table[has_attr(lx, attr_tablshift)].kanjiskip or null_skip_table)
+ special_jaglue_after_inner(lx, lxi, KANJI_SKIP_JFM, kanji_skip,
+ ltjf_font_metric_table[get_attr(lx, attr_tablshift)].kanjiskip or null_skip_table)
else -- lxi == XKANJI_SKIP
- special_jaglue_after_inner(lx, lxi, XKANJI_SKIP_JFM, xkanji_skip,
- ltjf_font_metric_table[has_attr(lx, attr_tablshift)].xkanjiskip or null_skip_table)
+ special_jaglue_after_inner(lx, lxi, XKANJI_SKIP_JFM, xkanji_skip,
+ ltjf_font_metric_table[get_attr(lx, attr_tablshift)].xkanjiskip or null_skip_table)
end
else
set_attr(lx, attr_icflag, lxi)
diff --git a/macros/luatex/generic/luatexja/src/ltj-jfont.lua b/macros/luatex/generic/luatexja/src/ltj-jfont.lua
index 70557c08a8..a14edd2b79 100644
--- a/macros/luatex/generic/luatexja/src/ltj-jfont.lua
+++ b/macros/luatex/generic/luatexja/src/ltj-jfont.lua
@@ -3,7 +3,7 @@
--
luatexbase.provides_module({
name = 'luatexja.jfont',
- date = '2021-11-06',
+ date = '2022-08-20',
description = 'Loader for Japanese fonts',
})
@@ -18,17 +18,18 @@ local getid = node.direct.getid
local to_direct = node.direct.todirect
local node_new = node.direct.new
-local node_free = node.direct.free
-local has_attr = node.direct.has_attribute
+local node_free = node.direct.flush_node or node.direct.free
+local get_attr = node.direct.get_attribute
local set_attr = node.direct.set_attribute
local round = tex.round
local font_getfont = font.getfont
+local setkern = node.direct.setkern
local attr_icflag = luatexbase.attributes['ltj@icflag']
local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
local attr_curtfnt = luatexbase.attributes['ltj@curtfnt']
-local id_glyph = node.id('glyph')
-local id_kern = node.id('kern')
+local id_glyph = node.id 'glyph'
+local id_kern = node.id 'kern'
local cat_lp = luatexbase.catcodetables['latex-package']
local FROM_JFM = luatexja.icflag_table.FROM_JFM
@@ -118,18 +119,18 @@ function luatexja.jfont.define_jfm(to)
v.end_adjust = nil
elseif #(v.end_adjust)==0 then
v.end_adjust = nil
- else
+ else
table.sort(v.end_adjust)
end
end
else
v.end_adjust = nil
- if v.end_stretch and v.end_stretch~=0.0 then
- v.end_adjust = (v.end_adjust or {})
+ if v.end_stretch and v.end_stretch~=0.0 then
+ v.end_adjust = (v.end_adjust or {})
v.end_adjust[#(v.end_adjust)+1] = v.end_stretch
end
- if v.end_shrink and v.end_ahrink~=0.0 then
- v.end_adjust = (v.end_adjust or {})
+ if v.end_shrink and v.end_ahrink~=0.0 then
+ v.end_adjust = (v.end_adjust or {})
v.end_adjust[#(v.end_adjust)+1] = -v.end_shrink
end
if v.end_adjust then v.end_adjust[#(v.end_adjust)+1] = 0.0 end
@@ -148,8 +149,8 @@ function luatexja.jfont.define_jfm(to)
elseif xp and type(xp)~='number' then
defjfm_res = nil
else
- xp = (xp or 0)*9+36
- if xp<0 or xp>=64 then defjfm_res=nil end
+ xp = (xp or 0)*9+36
+ if xp<0 or xp>=64 then defjfm_res=nil end
end
x.priority = xp
end
@@ -169,8 +170,8 @@ function luatexja.jfont.define_jfm(to)
end
end
if t.version<3 then
- -- In version 3, 'jcharbdd' is divided into
- -- 'alchar': ALchar (or math boundary)
+ -- In version 3, 'jcharbdd' is divided into
+ -- 'alchar': ALchar (or math boundary)
-- 'nox_alchar': ALchar (or math boundary), where xkanjiskip won't inserted
-- 'glue': glue/kern, 'jcharbdd': other cases (和文B, rule, ...)
t.chars.alchar = t.chars.jcharbdd
@@ -218,10 +219,9 @@ do
if type(i) == 'number' then -- char_type
for k,w in pairs(v.glue) do
v[k] = {
- nil,
+ nil, w[1], w[2], w[3],
ratio=w.ratio,
priority=FROM_JFM + w.priority,
- width = w[1], stretch = w[2], shrink = w[3],
kanjiskip_natural = w.kanjiskip_natural,
kanjiskip_stretch = w.kanjiskip_stretch,
kanjiskip_shrink = w.kanjiskip_shrink,
@@ -279,7 +279,6 @@ end
local load_jfont_metric, check_callback_order
local font_extra_info = {} -- defined later
do
- local cstemp
local global_flag -- true if \globaljfont, false if \jfont
load_jfont_metric = function()
if jfm_name=='' then
@@ -300,13 +299,10 @@ do
-- EXT
local utfbyte = utf.byte
- function luatexja.jfont.jfontdefX(g, dir, csname)
+ function luatexja.jfont.jfontdefX(g, dir)
jfm_dir, is_def_jfont = dir, true
- cstemp = csname:sub( (utfbyte(csname,1,1) == tex.escapechar) and 2 or 1, -1)
- cstemp = cstemp:sub(1, ((cstemp:sub(-1,-1)==' ') and (cstemp:len()>=2)) and -2 or -1)
global_flag = g and '\\global' or ''
- tex.sprint(cat_lp, '\\expandafter\\font\\csname ',
- (cstemp==' ') and '\\space' or cstemp, '\\endcsname')
+ tex.sprint(cat_lp, '\\expandafter\\font\\ltj@temp')
end
luatexbase.create_callback("luatexja.define_jfont", "data", function (ft, fn) return ft end)
@@ -315,15 +311,12 @@ do
local fastcopy=table.fastcopy
function luatexja.jfont.jfontdefY()
local j = load_jfont_metric(jfm_dir)
- local fn = font.id(cstemp)
- local f = font_getfont(fn)
+ local fn = token.get_next().mode; local f = font_getfont(fn)
if not j then
ltjb.package_error('luatexja', "bad JFM `" .. jfm_name .. "'",
'The JFM file you specified is not valid JFM file.\n'..
'So defining Japanese font is cancelled.')
- tex.sprint(cat_lp, global_flag, '\\expandafter\\let\\csname ',
- (cstemp==' ') and '\\space' or cstemp,
- '\\endcsname=\\relax')
+ tex.sprint(cat_lp, global_flag, '\\expandafter\\let\\ltj@temp\\relax')
return
end
if not f then return end
@@ -340,16 +333,15 @@ do
}
if auto_enable_vrt2 then
local vert_name = ltju.exist_feature(fn, 'vrt2') and 'vrt2' or 'vert'
- local rot = fmtable.rotation
+ local rot = fmtable.rotation
ltju.enable_feature(fn, vert_name)
ltju.loop_over_feat(f, {[vert_name]=true}, function (i,k) rot[i] = nil end)
end
fmtable = luatexbase.call_callback("luatexja.define_jfont", fmtable, fn)
font_metric_table[fn]=fmtable
- tex.sprint(cat_lp, global_flag, '\\protected\\expandafter\\def\\csname ',
- (cstemp==' ') and '\\space' or cstemp, '\\endcsname{\\ltj@cur'..
- (jfm_dir == 'yoko' and 'j' or 't') .. 'fnt', fn, '\\relax}')
+ tex.sprint(cat_lp, global_flag, '\\protected\\expandafter\\def\\ltj@temp',
+ '{\\ltj@cur'.. (jfm_dir == 'yoko' and 'j' or 't') .. 'fnt', fn, '\\relax}')
jfm_spec = nil
end
end
@@ -365,7 +357,7 @@ do
to_be_checked[i]=nil
if ltj_cb<lotf_cb then
local f = ltb.remove_from_callback(n,'luaotfload.letterspace')
- ltb.add_to_callback(n, f, 'luaotfload.letterspace',
+ ltb.add_to_callback(n, f, 'luaotfload.letterspace',
ltb.priority_in_callback(n, 'luaotfload.node_processor') + 1)
end
end
@@ -428,7 +420,7 @@ do
local parser=luaotfload.parsers.font_request
function is_feature_specified(s,fname)
local t = lpegmatch(parser,s); return t and t.features and t.features[fname]
- end
+ end
-- extract jfm_name, jfm_spec and jfm_var
-- normalize position of 'jfm=' and 'jfmvar=' keys
local function extract_jfm_spec(name)
@@ -461,7 +453,7 @@ do
jfm_ksp = (is_feature_specified(name,'ltjksp')~=false)
if jfm_dir == 'tate' then
vert_activated = (is_feature_specified(name,'vert')~=false) and (is_feature_specified(name,'vrt2')~=false)
- auto_enable_vrt2
+ auto_enable_vrt2
= (is_feature_specified(name,'vert')==nil) and (is_feature_specified(name,'vrt2')==nil)
else
vert_activated, auto_enable_vrt2 = nil, nil
@@ -797,7 +789,7 @@ do
local lo, hi = 1, #t
while lo < hi do
local mi = ceil((lo+hi)/2)
- if t[mi]<=i then lo=mi else hi=mi-1 end
+ if t[mi]<=i then lo=mi else hi=mi-1 end
end
return lo%2==1
end
@@ -844,14 +836,14 @@ do
local bname = tfmdata.psname or nameonly(tfmdata.filename)
if not font_extra_basename[bname] then
-- if the cache is present, read it
- --
+ --
local newtime = file_attributes(tfmdata.filename,"modification")
local v = "extra_" .. string.lower(bname)
local dest = load_cache(
v,
- function (t)
+ function (t)
return (t.lotf_version~=luaotfload.version)
- or (t.version~=cache_ver) or (t.modtime~=newtime)
+ or (t.version~=cache_ver) or (t.modtime~=newtime)
end
)
-- if the cache is not found or outdated, save the cache
@@ -885,7 +877,7 @@ do
dummytable.vorigin, dummytable.vheight = dtvo, dtvh
end
end
-
+
local function prepare_extra_data_font(id, res, name)
if type(res)=='table' and (res.psname or res.filename) then
if (res.embedding=='no') and (type(name)=='string') and (name:sub(1,5)=='psft:') then
@@ -938,19 +930,19 @@ do
[0x3014]=0xFE39, [0x3015]=0xFE3A, [0x3010]=0xFE3B, [0x3011]=0xFE3C,
[0x300A]=0xFE3D, [0x300B]=0xFE3E, [0x3008]=0xFE3F, [0x3009]=0xFE40,
[0x300C]=0xFE41, [0x300D]=0xFE42, [0x300E]=0xFE43, [0x300F]=0xFE44,
- [0xFF3B]=0xFE47, [0xFF3D]=0xFE48,
+ [0xFF3B]=0xFE47, [0xFF3D]=0xFE48,
}
local vert_jpotf_table, vert_feat = {}, {vert=true}
local utfbyte, utfsub = utf.byte, utf.sub
luatexja.jfont.register_vert_replace = function(t)
for i,v in pairs(t) do
- local ic = (type(i)=='number') and i or
+ local ic = (type(i)=='number') and i or
((type(i)=='string') and utfbyte(utfsub(i,1,1)) or nil)
if ic then
- vert_jpotf_table[ic] = (type(v)=='number') and v or
+ vert_jpotf_table[ic] = (type(v)=='number') and v or
((type(v)=='string') and utfbyte(utfsub(v,1,1)) or nil)
end
- end
+ end
end
luatexbase.add_to_callback(
@@ -1023,28 +1015,28 @@ do
local is_ucs_in_japanese_char = ltjc.is_ucs_in_japanese_char_direct
local ensure_tex_attr = ltjb.ensure_tex_attr
local node_write = node.direct.write
- local font = font
+ local fonts, getnest = font.fonts, tex.getnest
local new_ic_kern = function(g) return node_new(id_kern,3) end
local dir_tate = luatexja.dir_table.dir_tate
-- EXT: italic correction
function luatexja.jfont.append_italic()
- local p = to_direct(tex.nest[tex.nest.ptr].tail)
+ local p = to_direct(getnest().tail)
local TEMP = node_new(id_kern)
if p and getid(p)==id_glyph then
if is_ucs_in_japanese_char(p) then
local j = font_metric_table[
- has_attr(p, (get_dir_count()==dir_tate) and attr_curtfnt or attr_curjfnt)
+ get_attr(p, (get_dir_count()==dir_tate) and attr_curtfnt or attr_curjfnt)
]
local g = new_ic_kern()
- setfield(g, 'kern', j.char_type[find_char_class(getchar(p), j)].italic)
+ setkern(g, j.char_type[find_char_class(getchar(p), j)].italic)
node_write(g); ensure_tex_attr(attr_icflag, 0)
else
local f = getfont(p)
- local h = font_getfont(f) or font.fonts[f]
+ local h = font_getfont(f) or fonts[f]
if h then
- local g = new_ic_kern()
if h.characters[getchar(p)] and h.characters[getchar(p)].italic then
- setfield(g, 'kern', h.characters[getchar(p)].italic)
+ local g = new_ic_kern()
+ setkern(g, h.characters[getchar(p)].italic)
node_write(g); ensure_tex_attr(attr_icflag, 0)
end
end
diff --git a/macros/luatex/generic/luatexja/src/ltj-kinsoku.tex b/macros/luatex/generic/luatexja/src/ltj-kinsoku.tex
index 179e621054..e420750891 100644
--- a/macros/luatex/generic/luatexja/src/ltj-kinsoku.tex
+++ b/macros/luatex/generic/luatexja/src/ltj-kinsoku.tex
@@ -467,5 +467,5 @@
\directlua{%
local s = table.copy(luatexja.stack.charprop_stack_table[0])
- luatexja.base.save_cache('ltj-kinsoku_default', {s, version=3})
+ luatexja.base.save_cache('ltj-kinsoku_default', {s, version=4})
}
diff --git a/macros/luatex/generic/luatexja/src/ltj-lineskip.lua b/macros/luatex/generic/luatexja/src/ltj-lineskip.lua
index f8b97c144b..107ee804a8 100644
--- a/macros/luatex/generic/luatexja/src/ltj-lineskip.lua
+++ b/macros/luatex/generic/luatexja/src/ltj-lineskip.lua
@@ -6,24 +6,26 @@ luatexja.load_module 'direction'; local ltjd = luatexja.direction
luatexja.lineskip = luatexja.lineskip or {}
local to_direct = node.direct.todirect
+local to_node = node.direct.tonode
local ltjl = luatexja.lineskip
local id_glue = node.id 'glue'
local id_penalty = node.id 'penalty'
local id_hlist = node.id 'hlist'
-local setfield = node.direct.setfield
-local getfield = node.direct.getfield
local getlist = node.direct.getlist
local node_new = node.direct.new
local node_prev = node.direct.getprev
local node_next = node.direct.getnext
local getid = node.direct.getid
local getsubtype = node.direct.getsubtype
+local getdepth = node.direct.getdepth
+local getheight = node.direct.getheight
local texget = tex.get
local node_getglue = node.getglue
local setglue = node.direct.setglue
+local setsubtype = node.direct.setsubtype
local function copy_glue (new_glue, old_glue_name, subtype, new_w)
- setfield(new_glue, 'subtype', subtype)
+ setsubtype(new_glue, subtype)
local w,st,sp,sto,spo = texget(old_glue_name, true)
setglue(new_glue, new_w or w, st, sp, sto, spo)
end
@@ -57,11 +59,11 @@ local function adjust_glue(nh)
local p, n = node_prev(x), node_next(x)
if p then
local pid = getid(p)
- while (id_glue<=pid) and (pid<=id_penalty) and node_prev(p) do
+ while (id_glue<=pid) and (pid<=id_penalty) and node_prev(p) do
p = node_prev(p); pid = getid(p)
end
if pid==id_hlist and getid(n)==id_hlist then
- local normal = bw - getfield(p, 'depth') - getfield(n, 'height')
+ local normal = bw - getdepth(p) - getheight(n)
local lmin, adj = ltj_profiler(p, n, false, bw)
ltj_skip(lmin or normal, x, adj, normal, bw)
end
@@ -77,17 +79,20 @@ do
local p_dummy = ltjl.p_dummy
local make_dir_whatsit = luatexja.direction.make_dir_whatsit
local get_dir_count = luatexja.direction.get_dir_count
-local node_write = node.direct.write
+local getwhd = node.direct.getwhd
+local setnext = node.direct.setnext
+local getnest = tex.getnest
local function dir_adjust_append_vlist(b, loc, prev, mirrored)
local old_b = to_direct(b)
- local new_b = loc=='box' and
+ local new_b = loc=='box' and
make_dir_whatsit(old_b, old_b, get_dir_count(), 'append_vlist') or old_b
+ local _, ht, dp = getwhd(new_b)
if prev > -65536000 then
local bw = texget('baselineskip', false)
- local normal = bw - prev - getfield(new_b, mirrored and 'depth' or 'height')
+ local normal = bw - prev - (mirrored and dp or ht)
local lmin, adj = nil, 0
- local tail = to_direct(tex.nest[tex.nest.ptr].tail)
+ local tail = to_direct(getnest().tail)
if p_dummy~=ltj_profiler then
while tail and (id_glue<=getid(tail)) and (getid(tail)<=id_penalty) do
tail = node_prev(tail)
@@ -95,17 +100,16 @@ local function dir_adjust_append_vlist(b, loc, prev, mirrored)
end
if tail then
if getid(tail)==id_hlist and getid(new_b)==id_hlist then
- if getfield(tail, 'depth')==prev then
+ if getdepth(tail)==prev then
lmin, adj = ltj_profiler(tail, new_b, mirrored, bw)
end
end
end
local g = node_new(id_glue)
- ltj_skip(lmin or normal, g, adj, normal, bw, loc); node_write(g)
+ ltj_skip(lmin or normal, g, adj, normal, bw, loc)
+ setnext(g, new_b); return to_node(g), (mirrored and ht or dp)
+ else return to_node(new_b), (mirrored and ht or dp)
end
- node_write(new_b)
- tex.prevdepth = getfield(new_b, mirrored and 'height' or 'depth')
- return nil -- do nothing on tex side
end
ltjb.add_to_callback('append_to_vlist_filter', dir_adjust_append_vlist, 'ltj.lineskip', 10000)
end
diff --git a/macros/luatex/generic/luatexja/src/ltj-lotf_aux.lua b/macros/luatex/generic/luatexja/src/ltj-lotf_aux.lua
index bd3a602e64..cc2c613c40 100644
--- a/macros/luatex/generic/luatexja/src/ltj-lotf_aux.lua
+++ b/macros/luatex/generic/luatexja/src/ltj-lotf_aux.lua
@@ -18,7 +18,7 @@ function aux.exist_feature(id, name)
return provides_feature(id, t.properties.script, t.properties.language, name)
else return false
end
-end
+end
function aux.enable_feature(id, name)
local t = getfont(id)
@@ -57,7 +57,7 @@ local function get_asc_des(id)
elseif t.hb then -- HARF
local hbfont, u = t.hb.shared.font, t.hb.shared.upem
local h = hbfont:get_h_extents()
- if h and u then
+ if h and u then
a, d = h.ascender and h.ascender/u, h.descender and -h.descender/u
end
end
@@ -87,7 +87,7 @@ local function get_vmet_table(tfmdata, dest)
end
local rawdata = tfmdata.shared.rawdata
local ascender = rawdata.metadata.ascender or 0
- local default_vheight
+ local default_vheight
= rawdata.metadata.defaultvheight
or (rawdata.metadata.descender and (ascender+rawdata.metadata.descender) or units)
local units = tfmdata.units
@@ -135,10 +135,10 @@ local function loop_over_feat(id, feature_name, func, universal)
for _,i in pairs(t.resources.sequences) do
if i.order[1] and feature_name[i.order[1]] then
local f = i.features and i.features[i.order[1]]
- if i.type == 'gsub_single' and i.steps
+ if i.type == 'gsub_single' and i.steps
and f and (universal or (f[t.properties.script] and f[t.properties.script][t.properties.language])) then
for _,j in pairs(i.steps) do
- if type(j)=='table' then
+ if type(j)=='table' then
if type(j.coverage)=='table' then
for i,k in pairs(j.coverage) do
local s = func(i,k); if s then return s end
@@ -155,14 +155,14 @@ aux.loop_over_feat = loop_over_feat
local vert_vrt2 = { vert=true, vrt2=true }
function aux.replace_vert_variant(id, c)
- return loop_over_feat(id, vert_vrt2,
+ return loop_over_feat(id, vert_vrt2,
function (i,k) if i==c then return k end end)
or c
end
--for name, func in pairs(aux) do
--- if type(func)=="function" then
+-- if type(func)=="function" then
-- aux[name] = function(...)
-- print('LOTF_AUX', name, ...);
-- local a = func(...); print('RESULT', a); return a
@@ -174,8 +174,8 @@ local search
search = function (t, key, prefix)
if type(t)=="table" then
prefix = prefix or ''
- for i,v in pairs(t) do
- if i==key then print(prefix..'.'..i, v)
+ for i,v in pairs(t) do
+ if i==key then print(prefix..'.'..i, v)
else search(v,key,prefix..'.'..tostring(i)) end
end
end
diff --git a/macros/luatex/generic/luatexja/src/ltj-math.lua b/macros/luatex/generic/luatexja/src/ltj-math.lua
index 2a7c0444c7..a8664d7cf3 100644
--- a/macros/luatex/generic/luatexja/src/ltj-math.lua
+++ b/macros/luatex/generic/luatexja/src/ltj-math.lua
@@ -14,8 +14,17 @@ local getfield = node.direct.getfield
local getid = node.direct.getid
local getsubtype = node.direct.getsubtype
local getlist = node.direct.getlist
--- getlist cannot be used for sub_box nodes. Use instead λp. getfield(p, 'head')
local getchar = node.direct.getchar
+local getnucleus = node.direct.getnucleus
+local getsup = node.direct.getsup
+local getsub = node.direct.getsub
+local getshift = node.direct.getshift
+local setnext = node.direct.setnext
+local setnucleus = node.direct.setnucleus
+local setsup = node.direct.setsup
+local setsub = node.direct.setsub
+local setlist = node.direct.setlist
+local setshift = node.direct.setshift
local to_node = node.direct.tonode
local to_direct = node.direct.todirect
@@ -24,10 +33,11 @@ local node_traverse = node.direct.traverse
local node_new = node.direct.new
local node_next = node.direct.getnext
local node_remove = node.direct.remove
-local node_free = node.direct.free
-local has_attr = node.direct.has_attribute
+local node_free = node.direct.flush_node or node.direct.free
+local get_attr = node.direct.get_attribute
local set_attr = node.direct.set_attribute
-local tex_getcount = tex.getcount
+local getcount = tex.getcount
+local cnt_stack = luatexbase.registernumber 'ltj@@stack'
local attr_jchar_class = luatexbase.attributes['ltj@charclass']
local attr_dir = luatexbase.attributes['ltj@dir']
@@ -66,33 +76,34 @@ local list_dir
-- vcenter noad は軸に揃えるため,欧文ベースライン補正がかかる
local function conv_vcenter(sb)
- local h = getfield(sb, 'head'); local hd = getlist(h)
- if getid(hd)==id_whatsit and getsubtype(hd)==sid_user
+ local h = getlist(sb) ; local hd = getlist(h)
+ if getid(hd)==id_whatsit and getsubtype(hd)==sid_user
and getfield(hd, 'user_id')==DIR then
local d = node_next(hd)
- if getid(d)==id_vlist and has_attr(d, attr_dir)>=dir_node_auto then
- node_free(hd); setfield(h, 'head', nil); node_free(h)
- setfield(sb, 'head', d); set_attr(d, attr_icflag, 0)
+ if getid(d)==id_vlist and get_attr(d, attr_dir)>=dir_node_auto then
+ node_free(hd); setlist(h, nil); node_free(h)
+ setlist(sb, d); set_attr(d, attr_icflag, 0)
end
end
return sb
end
local cjhh_A
--- sty : 0 (display or text), 1 (script), >=2 (scriptscript)
+local max, min = math.max, math.min
+-- sty : -1 (display), 0 (text), 1 (script), >=2 (scriptscript)
local function conv_jchar_to_hbox(head, sty)
for p in node_traverse(head) do
local pid = getid(p)
if pid == id_simple or pid == id_accent then
if getsubtype(p)==12 then
- conv_vcenter(getfield(p, 'nucleus'))
+ conv_vcenter(getnucleus(p))
else
- setfield(p, 'nucleus', cjh_A(getfield(p, 'nucleus'), sty))
+ setnucleus(p, cjh_A(getnucleus(p), sty))
end
- setfield(p, 'sub', cjh_A(getfield(p, 'sub'), sty+1))
- setfield(p, 'sup', cjh_A(getfield(p, 'sup'), sty+1))
+ setsub(p, cjh_A(getsub(p), max(sty+1,1)))
+ setsup(p, cjh_A(getsup(p), max(sty+1,1)))
elseif pid == id_choice then
- setfield(p, 'display', cjh_A(getfield(p, 'display'), 0))
+ setfield(p, 'display', cjh_A(getfield(p, 'display'), -1))
setfield(p, 'text', cjh_A(getfield(p, 'text'), 0))
setfield(p, 'script', cjh_A(getfield(p, 'script'), 1))
setfield(p, 'scriptscript', cjh_A(getfield(p, 'scriptscript'), 2))
@@ -100,15 +111,17 @@ local function conv_jchar_to_hbox(head, sty)
setfield(p, 'num', cjh_A(getfield(p, 'num'), sty+1))
setfield(p, 'denom', cjh_A(getfield(p, 'denom'), sty+1))
elseif pid == id_radical then
- setfield(p, 'nucleus', cjh_A(getfield(p, 'nucleus'), sty))
- setfield(p, 'sub', cjh_A(getfield(p, 'sub'), sty+1))
- setfield(p, 'sup', cjh_A(getfield(p, 'sup'), sty+1))
+ setnucleus(p, cjh_A(getnucleus(p), sty))
+ setsub(p, cjh_A(getsub(p), max(sty+1,1)))
+ setsup(p, cjh_A(getsup(p), max(sty+1,1)))
if getfield(p, 'degree') then
- setfield(p, 'degree', cjh_A(getfield(p, 'degree'), sty + 1))
+ setfield(p, 'degree', cjh_A(getfield(p, 'degree'), 2))
end
elseif pid == id_style then
local ps = getfield(p, 'style')
- if ps == "display'" or ps == 'display' or ps == "text'" or ps == 'text' then
+ if ps == "display'" or ps == 'display' then
+ sty = -1
+ elseif ps == "text'" or ps == 'text' then
sty = 0
elseif ps == "script'" or ps == 'script' then
sty = 1
@@ -124,47 +137,48 @@ local MJS = luatexja.stack_table_index.MJS
local MJSS = luatexja.stack_table_index.MJSS
local capsule_glyph_math = ltjw.capsule_glyph_math
local is_ucs_in_japanese_char = ltjc.is_ucs_in_japanese_char_direct
+local setfont = node.direct.setfont
+local setchar = node.direct.setchar
cjh_A = function (p, sty)
if not p then return nil
else
local pid = getid(p)
if pid == id_sub_mlist then
- if getfield(p, 'head') then
- setfield(p, 'head', conv_jchar_to_hbox(getfield(p, 'head'), sty))
+ if getlist(p) then
+ setlist(p, conv_jchar_to_hbox(getlist(p), sty))
end
elseif pid == id_mchar then
- local pc, fam = getchar (p), has_attr(p, attr_jfam) or -1
+ local pc, fam = getchar (p), get_attr(p, attr_jfam) or -1
if (not is_math_letters[pc]) and is_ucs_in_japanese_char(p) and fam>=0 then
- local f = ltjs.get_stack_table(MJT + 0x100 * sty + fam, -1, tex_getcount('ltj@@stack'))
+ local f = ltjs.get_stack_table(MJT + 0x100 * min(max(sty,0),2) + fam, -1, getcount(cnt_stack))
if f ~= -1 then
local q = node_new(id_sub_box)
- local r = node_new(id_glyph); setfield(r, 'next', nil)
- setfield(r, 'char', pc); setfield(r, 'font', f); setfield(r, 'subtype', 256)
- local k = has_attr(r,attr_ykblshift) or 0; set_attr(r, attr_ykblshift, 0)
- -- ltj-setwidth 内で実際の位置補正はおこなうので,補正量を退避
+ local r = node_new(id_glyph, 256); setnext(r, nil); setfont(r, f, pc)
local met = ltjf_font_metric_table[f]
- r = capsule_glyph_math(r, met, met.char_type[ltjf_find_char_class(pc, met)]);
- setfield(q, 'head', r); node_free(p); p=q; set_attr(r, attr_yablshift, k)
+ r = capsule_glyph_math(
+ r, met, met.char_type[ltjf_find_char_class(pc, met)], sty)
+ setlist(q, r); node_free(p); p=q;
end
end
- elseif pid == id_sub_box and getfield(p, 'head') then
+ elseif pid == id_sub_box and getlist(p) then
-- \hbox で直に与えられた内容は上下位置を補正する必要はない
- local h = getfield(p, 'head'); h = ltjd_make_dir_whatsit(h, h, list_dir, 'math')
- setfield(p, 'head', h); set_attr(h, attr_icflag, PROCESSED)
+ local h = getlist(p); h = ltjd_make_dir_whatsit(h, h, list_dir, 'math')
+ setlist(p, h); setshift(h, getshift(h)-get_attr(h, attr_yablshift))
+ --set_attr(h, attr_icflag, PROCESSED)
end
end
return p
end
do
- local function mlist_callback_ltja(n)
+ local function mlist_callback_ltja(n, display_type)
local n = to_direct(n); list_dir = ltjd_get_dir_count()
if getid(n)==id_whatsit and getsubtype(n)==sid_user and getfield(n, 'user_id') == DIR then
local old_n = n; n = node_remove(n, n)
node_free(old_n); if not n then return nil end
end
- return to_node(conv_jchar_to_hbox(n, 0))
+ return to_node(conv_jchar_to_hbox(n, (display_type=='display') and -1 or 0))
end
-- LaTeX 2020-02-02 seems to have pre_mlist_to_hlist_filter callback
if luatexbase.callbacktypes['pre_mlist_to_hlist_filter'] then
diff --git a/macros/luatex/generic/luatexja/src/ltj-otf.lua b/macros/luatex/generic/luatexja/src/ltj-otf.lua
index 770749f9ea..11f68c6ba9 100644
--- a/macros/luatex/generic/luatexja/src/ltj-otf.lua
+++ b/macros/luatex/generic/luatexja/src/ltj-otf.lua
@@ -21,13 +21,19 @@ local getid = node.direct.getid
local getfont = node.direct.getfont
local getchar = node.direct.getchar
local getsubtype = node.direct.getsubtype
+local getvalue = node.direct.getdata
+local setchar = node.direct.setchar
+local setfont = node.direct.setfont
+local setlang = node.direct.setlang
+local setvalue = node.direct.setdata
+
local to_node = node.direct.tonode
local to_direct = node.direct.todirect
local node_new = node.direct.new
local node_remove = node.direct.remove
local node_next = node.direct.getnext
-local node_free = node.direct.free
-local has_attr = node.direct.has_attribute
+local node_free = node.direct.flush_node or node.direct.free
+local get_attr = node.direct.get_attribute
local set_attr = node.direct.set_attribute
local unset_attr = node.direct.unset_attribute
local node_insert_after = node.direct.insert_after
@@ -81,7 +87,7 @@ local function get_ucs_from_rmlgbm(c)
elseif v<0xF0000 then -- 素直に Unicode にマップ可能
return v
else -- privete use area
- local r, aj = nil, ltjr_cidfont_data["Adobe-Japan1"]
+ local r, aj = nil, ltjr_cidfont_data["Adobe-Japan1"]
-- 先に ltj_vert_table を見る
for i,w in pairs(aj.ltj_vert_table) do
if w==v then r=i; break end
@@ -116,7 +122,7 @@ end
local function append_jglyph(char)
local p = node_new(id_whatsit,sid_user)
setfield(p, 'user_id', OTF); setfield(p, 'type', 100)
- setfield(p, 'value', char); node_write(p)
+ setvalue(p, char); node_write(p)
end
local myutf
@@ -162,12 +168,10 @@ local function extract(head)
if getsubtype(p)==sid_user then
local puid = getfield(p, 'user_id')
if puid==OTF then
- local g = node_new(id_glyph)
- setfield(g, 'subtype', 0)
- setfield(g, 'char', getfield(p, 'value'))
- local v = has_attr(p, attr_curfnt); setfield(g, 'font', v)
- setfield(g, 'lang', lang_ja)
- set_attr(g, attr_kblshift, has_attr(p, attr_kblshift))
+ local g = node_new(id_glyph, 0)
+ setfont(g, get_attr(p, attr_curfnt), getvalue(p))
+ setlang(g, lang_ja)
+ set_attr(g, attr_kblshift, get_attr(p, attr_kblshift))
head = node_insert_after(head, p, g)
head = node_remove(head, p)
node_free(p); p = g
diff --git a/macros/luatex/generic/luatexja/src/ltj-pretreat.lua b/macros/luatex/generic/luatexja/src/ltj-pretreat.lua
index 073cc1ee39..508de5bb99 100644
--- a/macros/luatex/generic/luatexja/src/ltj-pretreat.lua
+++ b/macros/luatex/generic/luatexja/src/ltj-pretreat.lua
@@ -17,23 +17,24 @@ local getfont = node.direct.getfont
local getchar = node.direct.getchar
local getfield = node.direct.getfield
local getsubtype = node.direct.getsubtype
-local getlang = node.direct.getlang or function (n) return getfield(n,'lang') end
+local getlang = node.direct.getlang
local pairs = pairs
local floor = math.floor
+local get_attr = node.direct.get_attribute
local has_attr = node.direct.has_attribute
local set_attr = node.direct.set_attribute
local node_traverse = node.direct.traverse
local node_remove = node.direct.remove
local node_next = node.direct.getnext
-local node_free = node.direct.free
+local node_free = node.direct.flush_node or node.direct.free
local node_end_of_math = node.direct.end_of_math
-local tex_getcount = tex.getcount
+local getcount = tex.getcount
-local id_glyph = node.id('glyph')
-local id_math = node.id('math')
-local id_whatsit = node.id('whatsit')
-local sid_user = node.subtype('user_defined')
+local id_glyph = node.id 'glyph'
+local id_math = node.id 'math'
+local id_whatsit = node.id 'whatsit'
+local sid_user = node.subtype 'user_defined'
local attr_dir = luatexbase.attributes['ltj@dir']
local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
@@ -51,9 +52,9 @@ local PROCESSED_BEGIN_FLAG = luatexja.icflag_table.PROCESSED_BEGIN_FLAG
local dir_tate = luatexja.dir_table.dir_tate
local lang_ja = luatexja.lang_ja
-local setlang = node.direct.setlang or function(n,l) setfield(n,'lang',l) end
-local setfont = node.direct.setfont or function(n,l) setfield(n,'font',l) end
-local setchar = node.direct.setchar or function(n,l) setfield(n,'char',l) end
+local setlang = node.direct.setlang
+local setfont = node.direct.setfont
+local setchar = node.direct.setchar
------------------------------------------------------------------------
-- MAIN PROCESS STEP 1: replace fonts
@@ -72,8 +73,8 @@ do
if uid==STCK then
wt[#wt+1] = p; node_remove(head, p)
elseif uid==DIR then
- if has_attr(p, attr_icflag)<PROCESSED_BEGIN_FLAG then
- ltjs.list_dir = has_attr(p, attr_dir)
+ if get_attr(p, attr_icflag)<PROCESSED_BEGIN_FLAG then
+ ltjs.list_dir = get_attr(p, attr_dir)
else -- こっちのケースは通常使用では起こらない
wtd[#wtd+1] = p; node_remove(head, p)
end
@@ -82,13 +83,13 @@ do
return node_next(p)
end,
}
- setmetatable(suppress_hyphenate_ja_aux,
+ setmetatable(suppress_hyphenate_ja_aux,
{ __index = function() return node_next end, })
- local id_boundary = node.id('boundary')
+ local id_boundary = node.id 'boundary'
local node_new, insert_before = node.direct.new, node.direct.insert_before
- local setsubtype = node.direct.setsubtype or function(n,l) setfield(n,'subtype',l) end
+ local setsubtype = node.direct.setsubtype
local function suppress_hyphenate_ja (h)
- start_time_measure('ltj_hyphenate')
+ start_time_measure 'ltj_hyphenate'
head = to_direct(h)
for i = 1,#wt do wt[i]=nil end
for i = 1,#wtd do wtd[i]=nil end
@@ -109,7 +110,7 @@ do
setfield(b, 'type', 100); setfield(b, 'user_id', JA_AL_BDD);
insert_before(head, p, b)
end
- local pf = has_attr(p, attr_curjfnt)
+ local pf = get_attr(p, attr_curjfnt)
pf = (pf and pf>0 and pf) or getfont(p)
setfont(p, ltjf_replace_altfont(pf, pc))
setlang(p, lang_ja)
@@ -125,9 +126,9 @@ do
p = (suppress_hyphenate_ja_aux[pid])(p)
end
end
- stop_time_measure('ltj_hyphenate'); start_time_measure('tex_hyphenate')
+ stop_time_measure 'ltj_hyphenate'; start_time_measure 'tex_hyphenate'
lang.hyphenate(h, nil)
- stop_time_measure('tex_hyphenate')
+ stop_time_measure 'tex_hyphenate'
return h
end
@@ -135,24 +136,31 @@ do
end
-- mode: true iff this function is called from hpack_filter
+local set_box_stack_level
+do
local ltjs_report_stack_level = ltjs.report_stack_level
local ltjf_font_metric_table = ltjf.font_metric_table
local font_getfont = font.getfont
-local function set_box_stack_level(head, mode)
- local box_set, cl = 0, tex.currentgrouplevel + 1
+local traverse_id = node.direct.traverse_id
+local cnt_stack = luatexbase.registernumber 'ltj@@stack'
+local texget, getvalue = tex.get, node.direct.getdata
+function set_box_stack_level(head, mode)
+ local box_set = 0
if mode then
- for _,p in pairs(wt) do
- if getfield(p, 'value')==cl then box_set = 1 end; node_free(p)
+ local cl = (texget 'currentgrouplevel') + 1
+ for i=1,#wt do
+ local p = wt[i]
+ if getvalue(p)==cl then box_set = 1 end; node_free(p)
end
else
- for _,p in pairs(wt) do node_free(p) end
+ for i=1,#wt do node_free(wt[i]) end
end
- ltjs_report_stack_level(tex_getcount('ltj@@stack') + box_set)
+ ltjs_report_stack_level(getcount(cnt_stack) + box_set)
for _,p in pairs(wtd) do node_free(p) end
if ltjs.list_dir == dir_tate then
- for p in node.direct.traverse_id(id_glyph,to_direct(head)) do
+ for p in traverse_id(id_glyph,to_direct(head)) do
if has_attr(p, attr_icflag, 0) and getlang(p)==lang_ja then
- local nf = ltjf_replace_altfont( has_attr(p, attr_curtfnt) or getfont(p) , ltjs_orig_char_table[p])
+ local nf = ltjf_replace_altfont( get_attr(p, attr_curtfnt) or getfont(p) , ltjs_orig_char_table[p])
setfont(p, nf)
if ltjf_font_metric_table[nf].vert_activated then
local pc = getchar(p); pc = ltjf_font_metric_table[nf].vform[pc]
@@ -163,6 +171,7 @@ local function set_box_stack_level(head, mode)
end
return head
end
+end
-- CALLBACKS
ltjb.add_to_callback('hpack_filter',
diff --git a/macros/luatex/generic/luatexja/src/ltj-rmlgbm.lua b/macros/luatex/generic/luatexja/src/ltj-rmlgbm.lua
index 49f2018e4d..36fb7f7877 100644
--- a/macros/luatex/generic/luatexja/src/ltj-rmlgbm.lua
+++ b/macros/luatex/generic/luatexja/src/ltj-rmlgbm.lua
@@ -1,7 +1,7 @@
--
-- ltj-rmlgbm.lua
--
-luatexja.load_module('base'); local ltjb = luatexja.base
+luatexja.load_module 'base'; local ltjb = luatexja.base
local cidfont_data = {}
local cache_chars = {}
@@ -224,7 +224,7 @@ local cidf_vert_processor
do
local traverse_id, is_node = node.direct.traverse_id, node.is_node
local to_direct = node.direct.todirect
- local id_glyph = node.id('glyph')
+ local id_glyph = node.id 'glyph'
local getfont = node.direct.getfont
local getchar = node.direct.getchar
local setchar = node.direct.setchar
@@ -234,7 +234,7 @@ do
local fontdata = font_getfont(fnum)
if head and luatexja.jfont.font_metric_table[fnum] and luatexja.jfont.font_metric_table[fnum].vert_activated then
local vt = fontdata.ltj_vert_table
- local nh = is_node(head) and to_direct(head) or head
+ local nh = is_node(head) and to_direct(head) or head
for n in traverse_id(id_glyph, head) do
if getfont(n)==fnum then
local c = getchar(n); setchar(n, vt[c] or c)
diff --git a/macros/luatex/generic/luatexja/src/ltj-ruby.lua b/macros/luatex/generic/luatexja/src/ltj-ruby.lua
index 7fa7ea927e..047b53ab58 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 = '2022-06-25',
+ date = '2022-08-29',
description = 'Ruby annotation',
})
luatexja.ruby = {}
@@ -13,21 +13,38 @@ luatexja.load_module 'base'; local ltjb = luatexja.base
local to_node = node.direct.tonode
local to_direct = node.direct.todirect
-local setfield = node.direct.setfield
-local setglue = luatexja.setglue
local getfield = node.direct.getfield
local getid = node.direct.getid
local getfont = node.direct.getfont
local getlist = node.direct.getlist
local getchar = node.direct.getchar
local getsubtype = node.direct.getsubtype
+local getkern = node.direct.getkern
+local getwidth = node.direct.getwidth
+local getheight = node.direct.getheight
+local getdepth = node.direct.getdepth
+local getwhd = node.direct.getwhd
+local getvalue = node.direct.getdata
+local setfield = node.direct.setfield
+local setglue = node.direct.setglue
+local setkern = node.direct.setkern
+local setnext = node.direct.setnext
+local setshift = node.direct.setshift
+local setwidth = node.direct.setwidth
+local setheight = node.direct.setheight
+local setdepth = node.direct.setdepth
+local setwhd = node.direct.setwhd
+local setlist = node.direct.setlist
+local setvalue = node.direct.setdata
local node_new = node.direct.new
local node_remove = node.direct.remove
local node_next = node.direct.getnext
-local node_copy, node_free, node_tail = node.direct.copy, node.direct.free, node.direct.tail
-local has_attr, set_attr = node.direct.has_attribute, node.direct.set_attribute
+local node_copy, node_tail = node.direct.copy, node.direct.tail
+local node_free = node.direct.flush_node or node.direct.free
+local get_attr, set_attr = node.direct.get_attribute, node.direct.set_attribute
local insert_before, insert_after = node.direct.insert_before, node.direct.insert_after
+local hpack = node.direct.hpack
local id_hlist = node.id 'hlist'
local id_vlist = node.id 'vlist'
@@ -125,7 +142,7 @@ 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
+ if cache_handle then
cache_handle:write('local lrob=luatexja.ruby.old_break_info\n')
end
end
@@ -143,7 +160,7 @@ end
-- ルビ組版が行われている段落/hboxでの設定が使われる.
-- ルビ文字を格納しているボックスでの設定ではない!
local function get_attr_icflag(p)
- return (has_attr(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG
+ return (get_attr(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG
end
local concat
do
@@ -157,25 +174,22 @@ do
end
set_attr(nh, attr_icflag,
get_attr_icflag(nh) + PROCESSED_BEGIN_FLAG)
- setfield(node_tail(h), 'next', nh)
- setfield(f, 'head', nil); node_free(f)
- setfield(b, 'head', nil); node_free(b)
+ setnext(node_tail(h), nh)
+ setlist(f, nil); node_free(f)
+ setlist(b, nil); node_free(b)
local g = luatexja.jfmglue.main(h,false)
- return node.direct.hpack(g)
+ return hpack(g)
else
return f
end
elseif b then
return b
else
- local h = node_new(id_hlist)
- setfield(h, 'subtype', 0)
- setfield(h, 'width', 0)
- setfield(h, 'height', 0)
- setfield(h, 'depth', 0)
+ local h = node_new(id_hlist, 0)
+ setwhd(h, 0, 0, 0)
setfield(h, 'glue_set', 0)
setfield(h, 'glue_order', 0)
- setfield(h, 'head', nil)
+ setlist(h, nil)
return h
end
end
@@ -183,9 +197,7 @@ end
local function expand_3bits(num)
local t = {}; local a = num
- for i = 1, 10 do
- t[i] = a%8; a = floor(a/8)
- end
+ for i = 1, 10 do t[i], a = a%8, a//8 end
return t
end
----------------------------------------------------------------
@@ -205,23 +217,22 @@ do
-- pre, middle, post: 伸縮比率
-- prenw, postnw: 前後の自然長 (sp)
local h = getlist(box);
- local hh, hd = getfield(box, 'height'), getfield(box, 'depth')
+ local _, hh, hd = getwhd(box)
local hx = h
while hx do
- local hic = has_attr(hx, attr_icflag) or 0
+ local hic = get_attr(hx, attr_icflag) or 0
if (hic == KANJI_SKIP) or (hic == KANJI_SKIP_JFM)
or (hic == XKANJI_SKIP) or (hic == XKANJI_SKIP_JFM)
or ((hic<=FROM_JFM+63) and (hic>=FROM_JFM)) then
-- この 5 種類の空白をのばす
if getid(hx) == id_kern then
- local k = node_new(id_glue)
- setglue(k, getfield(hx, 'kern'), round(middle*65536), 0,
+ local k = node_new(id_glue, 0)
+ setglue(k, getkern(hx), round(middle*65536), 0,
2, 0)
- setfield(k, 'subtype', 0);
h = insert_after(h, hx, k);
h = node_remove(h, hx); node_free(hx); hx = k
else -- glue
- setglue(hx, getfield(hx, 'width'), round(middle*65536), 0,
+ setglue(hx, getwidth(hx), round(middle*65536), 0,
2, 0)
end
end
@@ -236,10 +247,9 @@ do
setglue(k, postnw, round(post*65536), 0, 2, 0)
insert_after(h, node_tail(h), k);
-- hpack
- setfield(box, 'head', nil); node_free(box)
- box = node.direct.hpack(h, new_width, 'exactly')
- setfield(box, 'height', hh)
- setfield(box, 'depth', hd)
+ setlist(box, nil); node_free(box)
+ box = hpack(h, new_width, 'exactly')
+ setheight(box, hh); setdepth(box, hd)
return box
end
end
@@ -255,9 +265,8 @@ local function texiface_low(rst, rtlr, rtlp)
local w = node_new(id_whatsit, sid_user)
setfield(w, 'type', 110); setfield(w, 'user_id', RUBY_PRE)
local wv = node_new(id_whatsit, sid_user)
- setfield(w, 'value', to_node(wv))
setfield(wv, 'type', 108)
- setfield(wv, 'value', rst); rst.count = floor(#rtlr)
+ setvalue(w, to_node(wv)); setvalue(wv, rst); rst.count = #rtlr
setfield(wv, 'user_id', RUBY_PRE) -- dummy
local n = wv
for i = 1, #rtlr do
@@ -280,7 +289,7 @@ function luatexja.ruby.texiface(rst, rtlr, rtlp)
else
local f, eps = true, rst.eps
for i = 1,#rtlr do
- if getfield(rtlr[i], 'width') > getfield(rtlp[i], 'width') + eps then
+ if getwidth(rtlr[i]) > getwidth(rtlp[i]) + eps then
f = false; break
end
end
@@ -304,12 +313,12 @@ end
-- r, p の中身のノードは再利用される
local function enlarge_parent(r, p, tmp_tbl, no_begin, no_end)
-- r: ルビ部分の格納された box,p: 同,親文字
- local rwidth = getfield(r, 'width')
- local sumprot = rwidth - getfield(p, 'width') -- >0
+ local rwidth = getwidth(r)
+ local sumprot = rwidth - getwidth(p) -- >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
- local intmode = floor(tmp_tbl.mode/4)%4
+ local intmode = (tmp_tbl.mode//4)%4
if no_begin then mapre = mapre + tmp_tbl.before_jfmgk end
if no_end then mapost = mapost + tmp_tbl.after_jfmgk end
if (tmp_tbl.mode%4 >=2) and (tmp_tbl.pre<0) and (tmp_tbl.post<0) then
@@ -332,18 +341,17 @@ local function enlarge_parent(r, p, tmp_tbl, no_begin, no_end)
if n < sumprot then
pre_intrusion = n/2; post_intrusion = n/2
else
- pre_intrusion = floor(sumprot/2); post_intrusion = sumprot - pre_intrusion
+ pre_intrusion = sumprot//2; post_intrusion = sumprot - pre_intrusion
end
p = enlarge(p, rwidth, ppre, pmid, ppost, pre_intrusion, post_intrusion)
pre_intrusion = min(mapre, pre_intrusion + round(ppre*getfield(p, 'glue_set')*65536))
post_intrusion = min(mapost, post_intrusion + round(ppost*getfield(p, 'glue_set')*65536))
end
- setfield(r, 'shift', -pre_intrusion)
+ setshift(r, -pre_intrusion)
local rwidth = rwidth - pre_intrusion - post_intrusion
- setfield(r, 'width', rwidth)
- setfield(p, 'width', rwidth)
+ setwidth(r, rwidth); setwidth(p, rwidth)
local ps = getlist(p)
- setfield(ps, 'width', getfield(ps, 'width') - pre_intrusion)
+ setwidth(ps, getwidth(ps) - pre_intrusion)
local orig_post_intrusion, post_jfmgk = post_intrusion, false
if no_end then
if orig_post_intrusion > tmp_tbl.after_jfmgk then
@@ -366,51 +374,50 @@ local function new_ruby_box(r, p, tmp_tbl, no_begin, no_end)
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(tmp_tbl.mode/0x100000); rsmash = (imode%2 ==1)
- imode = floor(imode/2); rpost = imode%8;
+ imode = tmp_tbl.mode//0x100000; rsmash = (imode%2 ==1)
+ imode = 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
+ if getwidth(r) > getwidth(p) then -- change the width of p
r, p, post_intrusion, post_jfmgk = enlarge_parent(r, p, tmp_tbl, no_begin, no_end)
- elseif getfield(r, 'width') < getfield(p, 'width') then -- change the width of r
- r = enlarge(r, getfield(p, 'width'), rpre, rmid, rpost, 0, 0)
+ elseif getwidth(r) < getwidth(p) then -- change the width of r
+ r = enlarge(r, getwidth(p), rpre, rmid, rpost, 0, 0)
post_intrusion = 0
local need_repack = false
-- margin が大きくなりすぎた時の処理
if round(rpre*getfield(r, 'glue_set')*65536) > max_margin then
local ps = getlist(r); need_repack = true
- setfield(ps, 'width', max_margin)
+ setwidth(ps, max_margin)
setfield(ps, 'stretch', 1) -- 全く伸縮しないのも困る
end
if round(rpost*getfield(r, 'glue_set')*65536) > max_margin then
local ps = node_tail(getlist(r)); need_repack = true
- setfield(ps, 'width', max_margin)
+ setwidth(ps, max_margin)
setfield(ps, 'stretch', 1) -- 全く伸縮しないのも困る
end
if need_repack then
local rt = r
- r = node.direct.hpack(getlist(r), getfield(r, 'width'), 'exactly')
- setfield(rt, 'head', nil); node_free(rt);
+ r = hpack(getlist(r), getwidth(r), 'exactly')
+ setlist(rt, nil); node_free(rt);
end
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', tmp_tbl.intergap)
+ setwhd(a, 0, 0, 0); setkern(k, tmp_tbl.intergap)
insert_after(r, r, a); insert_after(r, a, k);
- insert_after(r, k, p); setfield(p, 'next', nil)
- if tmp_tbl.rubydepth >= 0 then setfield(r, 'depth', tmp_tbl.rubydepth) end
- if tmp_tbl.baseheight >= 0 then setfield(p, 'height', tmp_tbl.baseheight) end
- a = node.direct.vpack(r); setfield(a, 'shift', 0)
+ insert_after(r, k, p); setnext(p, nil)
+ if tmp_tbl.rubydepth >= 0 then setdepth(r, tmp_tbl.rubydepth) end
+ if tmp_tbl.baseheight >= 0 then setheight(p, tmp_tbl.baseheight) end
+ a = node.direct.vpack(r); setshift(a, 0)
set_attr(a, attr_ruby, post_intrusion)
set_attr(a, attr_ruby_post_jfmgk, post_jfmgk and 1 or 0)
- if rsmash or getfield(a, 'height')<getfield(p, 'height') then
+ if rsmash or getheight(a)<getheight(p) then
local k = node_new(id_kern, 1)
- setfield(k, 'kern', -getfield(a, 'height')+getfield(p, 'height'))
- setfield(a, 'head', k); insert_before(r, r, k)
- setfield(a, 'height', getfield(p, 'height'))
+ setkern(k, -getheight(a)+getheight(p))
+ setlist(a, k); insert_before(r, r, k)
+ setheight(a, getheight(p))
end
- return a, getfield(r, 'width'), post_intrusion, post_jfmgk
+ return a, getwidth(r), post_intrusion, post_jfmgk
end
@@ -418,7 +425,7 @@ end
local post_intrusion_backup, post_jfmgk_backup
local max_allow_pre, max_allow_post
-
+local flush_list = node.direct.flush_list
-- 中付き熟語ルビ,cmp containers
-- 「文字の構成を考えた」やつはどうしよう
local function pre_low_cal_box(w, cmp)
@@ -428,8 +435,8 @@ local function pre_low_cal_box(w, cmp)
-- kf[i] : container 1--i からなる行末形
-- kf[cmp+i] : container i--cmp からなる行頭形
-- kf[2cmp+1] : 行中形
- local wv = getfield(w, 'value')
- local rst = getfield(wv, 'value')
+ local wv = getvalue(w)
+ local rst = getvalue(wv)
local mdt -- nt*: node temp
local coef = {} -- 連立一次方程式の拡大係数行列
local rtb = expand_3bits(rst.stretch)
@@ -473,8 +480,8 @@ local function pre_low_cal_box(w, cmp)
-- w.value の node list 更新.
local nt = wv
- node.direct.flush_list(node_next(wv))
- for i = 1, 2*cmp+1 do setfield(nt, 'next', kf[i]); nt = kf[i] end
+ flush_list(node_next(wv))
+ for i = 1, 2*cmp+1 do setnext(nt, kf[i]); nt = kf[i] end
if cmp==1 then solve_1(coef)
elseif cmp==2 then solve_2(coef)
@@ -506,10 +513,8 @@ local function pre_low_app_node(head, w, cmp, coef, ht, dp)
nt = w
for i = 1, cmp do
-- rule
- local nta = node_new(id_rule);
- setfield(nta, 'width', coef[i*2][2*cmp+2])
- setfield(nta, 'height', ht); setfield(nta, 'depth', dp)
- setfield(nta, 'subtype', 0)
+ local nta = node_new(id_rule, 0);
+ setwhd(nta, coef[i*2][2*cmp+2], ht, dp)
insert_after(head, nt, nta)
set_attr(nta, attr_ruby, 2*i+1)
-- glue
@@ -534,10 +539,10 @@ local function pre_high(ahead)
local n = first_whatsit(head)
while n do
if getsubtype(n) == sid_user and getfield(n, 'user_id') == RUBY_PRE then
- local nv = getfield(n, 'value')
- local rst = getfield(nv, 'value')
+ local nv = getvalue(n)
+ local rst = getvalue(nv)
max_allow_pre = rst.pre or 0
- local atr = has_attr(n, attr_ruby) or 0
+ local atr = get_attr(n, attr_ruby) or 0
if max_allow_pre < 0 then
-- 直前のルビで intrusion がおこる可能性あり.
-- 前 run のデータが残っていればそれを使用,
@@ -561,7 +566,7 @@ local function pre_high(ahead)
local coef = pre_low_cal_box(n, rst.count)
local s = node_tail(nv) --ルビ文字
head, n = pre_low_app_node(
- head, n, rst.count, coef, getfield(s, 'height'), getfield(s, 'depth')
+ head, n, rst.count, coef, getheight(s), getdepth(s)
)
else
n = first_whatsit(node_next(n))
@@ -578,7 +583,7 @@ luatexbase.add_to_callback('hpack_filter', pre_high, 'ltj.ruby.pre', 100)
local post_lown
do
local function write_aux(wv, num, bool)
- local id = has_attr(wv, attr_ruby_id)
+ local id = get_attr(wv, attr_ruby_id) or 0
if id>0 and cache_handle then
cache_handle:write(
'lrob[' .. tostring(id) .. ']=' .. num .. '\nlrob[' .. tostring(-id) .. ']=' .. tostring(bool) .. '\n')
@@ -588,35 +593,35 @@ do
post_lown = function (rs, rw, cmp, ch)
-- ch: the head of `current' hlist
if #rs ==0 or not rw then return ch end
- local hn = has_attr(rs[1], attr_ruby)
- local fn = has_attr(rs[#rs], attr_ruby)
- local wv = getfield(rw, 'value')
+ local hn = get_attr(rs[1], attr_ruby)
+ local fn = get_attr(rs[#rs], attr_ruby)
+ local wv = getvalue(rw)
if hn==1 then
if fn==2*cmp+2 then
local hn = node_tail(wv)
node_remove(wv, hn)
insert_after(ch, rs[1], hn)
set_attr(hn, attr_icflag, PROCESSED)
- write_aux(wv, has_attr(hn, attr_ruby), has_attr(hn, attr_ruby_post_jfmgk))-- 行中形
+ write_aux(wv, get_attr(hn, attr_ruby), get_attr(hn, attr_ruby_post_jfmgk))-- 行中形
else
local deg, hn = (fn-1)/2, wv
for i = 1, deg do hn = node_next(hn) end;
node_remove(wv, hn)
- setfield(hn, 'next', nil)
+ setnext(hn, nil)
insert_after(ch, rs[1], hn)
set_attr(hn, attr_icflag, PROCESSED)
- write_aux(wv, has_attr(hn, attr_ruby), has_attr(hn, attr_ruby_post_jfmgk))
+ write_aux(wv, get_attr(hn, attr_ruby), get_attr(hn, attr_ruby_post_jfmgk))
end
else
local deg, hn = max((hn-1)/2,2), wv
for i = 1, cmp+deg-1 do hn = node_next(hn) end
-- -1 is needed except the case hn = 3,
-- because a ending-line form is removed already from the list
- node_remove(wv, hn); setfield(hn, 'next', nil)
+ node_remove(wv, hn); setnext(hn, nil)
insert_after(ch, rs[1], hn)
set_attr(hn, attr_icflag, PROCESSED)
if fn == 2*cmp-1 then
- write_aux(wv, has_attr(hn, attr_ruby), has_attr(hn, attr_ruby_post_jfmgk))
+ write_aux(wv, get_attr(hn, attr_ruby), get_attr(hn, attr_ruby_post_jfmgk))
end
end
for i = 1,#rs do
@@ -629,11 +634,12 @@ do
end
end
+local traverse_id = node.direct.traverse_id
local function post_high_break(head)
local rs = {} -- rs: sequence of ruby_nodes,
local rw = nil -- rw: main whatsit
local cmp = -2 -- dummy
- for h in node.direct.traverse_id(id_hlist, to_direct(head)) do
+ for h in traverse_id(id_hlist, to_direct(head)) do
for i = 1, #rs do rs[i] = nil end
local ha = getlist(h)
while ha do
@@ -642,23 +648,23 @@ local function post_high_break(head)
or (hai == id_rule and getsubtype(ha)==0)
or (hai == id_whatsit and getsubtype(ha)==sid_user
and getfield(ha, 'user_id', RUBY_POST)))
- and has_attr(ha, attr_ruby) or 0
+ and get_attr(ha, attr_ruby) or 0
if i==0 then
ha = node_next(ha)
elseif i==1 then
- setfield(h, 'head', post_lown(rs, rw, cmp, getlist(h)))
+ setlist(h, post_lown(rs, rw, cmp, getlist(h)))
for i = 2, #rs do rs[i] = nil end -- rs[1] is set by the next statement
rs[1], rw = ha, nil; ha = node_next(ha)
elseif i==2 then
rw = ha
- cmp = getfield(getfield(rw, 'value'), 'value').count
+ cmp = getvalue(getvalue(rw)).count
local hb, hc = node_remove(getlist(h), rw)
- setfield(h, 'head', hb); ha = hc
+ setlist(h, hb); ha = hc
else -- i>=3
rs[#rs+1] = ha; ha = node_next(ha)
end
end
- setfield(h, 'head', post_lown(rs, rw, cmp, getlist(h)))
+ setlist(h, post_lown(rs, rw, cmp, getlist(h)))
end
return head
end
@@ -674,7 +680,7 @@ local function post_high_hbox(ahead)
or (hai == id_rule and getsubtype(ha)==0)
or (hai == id_whatsit and getsubtype(ha)==sid_user
and getfield(ha, 'user_id', RUBY_POST)))
- and has_attr(ha, attr_ruby) or 0
+ and get_attr(ha, attr_ruby) or 0
if i==0 then
ha = node_next(ha)
elseif i==1 then
@@ -683,7 +689,7 @@ local function post_high_hbox(ahead)
rs[1], rw = ha, nil; ha = node_next(ha)
elseif i==2 then
rw = ha
- cmp = getfield(getfield(rw, 'value'), 'value').count
+ cmp = getvalue(getvalue(rw)).count
head, ha = node_remove(head, rw)
else -- i >= 3
rs[#rs+1] = ha; ha = node_next(ha)
@@ -702,13 +708,13 @@ luatexbase.add_to_callback('hpack_filter', post_high_hbox, 'ltj.ruby.post_hbox',
do
local RIPRE = luatexja.stack_table_index.RIPRE
local RIPOST = luatexja.stack_table_index.RIPOST
- local abs = math.abs
+ local abs = math.abs
local function whatsit_callback(Np, lp, Nq)
if Np.nuc then return Np
elseif getfield(lp, 'user_id') == RUBY_PRE then
Np.first, Np.nuc, Np.last = lp, lp, lp
- local lpv = getfield(lp, 'value')
- local rst = getfield(lpv, 'value')
+ local lpv = getvalue(lp)
+ local rst = getvalue(lpv)
local x = node_next(node_next(lpv))
Np.last_char = luatexja.jfmglue.check_box_high(Np, getlist(x), nil)
if Nq.id ~=id_pbox_w then
@@ -759,8 +765,8 @@ do
local ic = get_attr_icflag(p)
if ic and (ic>FROM_JFM) and (ic<KANJI_SKIP) then ic = FROM_JFM end
if t.intrude_jfmgk[ic] then
- if getid(p)==id_kern then t[index] = t[index] + getfield(p, 'kern')
- else t[index] = t[index] + getfield(p, 'width') end
+ if getid(p)==id_kern then t[index] = t[index] + getkern(p)
+ else t[index] = t[index] + getwidth(p) end
end
end
local RIPOST = luatexja.stack_table_index.RIPOST
@@ -774,9 +780,9 @@ do
Np.first = last_glue
next_cluster_array[Nq.nuc] = last_glue -- ルビ処理用のグルー
end
- local nqnv = getfield(Nq.nuc, 'value')
- local rst = getfield(nqnv, 'value')
- if Nq.gk then
+ local nqnv = getvalue(Nq.nuc)
+ local rst = getvalue(nqnv)
+ if Nq.gk then
if type(Nq.gk)=="table" then
for _,v in ipairs(Nq.gk) do add_gk(rst, 'before_jfmgk', v) end
else add_gk(rst, 'before_jfmgk', Nq.gk) end
@@ -794,11 +800,11 @@ do
end
rst.post = p
end
- Np.prev_ruby = has_attr(getfield(Nq.nuc, 'value'), attr_ruby_id)
+ Np.prev_ruby = get_attr(getvalue(Nq.nuc), attr_ruby_id)
-- 前のクラスタがルビであったことのフラグ
else -- 直前が文字以外
- local nqnv = getfield(Nq.nuc, 'value')
- local rst = getfield(nqnv, 'value')
+ local nqnv = getvalue(Nq.nuc)
+ local rst = getvalue(nqnv)
if rst.post < 0 then -- auto
rst.post = 0
end
@@ -812,8 +818,8 @@ do
"luatexja.ruby.np_info_after", 1)
local function w (s, Nq, Np)
if not s and getfield(Nq.nuc, 'user_id') == RUBY_PRE then
- local rst = getfield(getfield(Nq.nuc, 'value'), 'value')
- if Np.gk then
+ local rst = getvalue(getvalue(Nq.nuc))
+ if Np.gk then
if type(Np.gk)=="table" then
for _,v in ipairs(Np.gk) do add_gk(rst, 'after_jfmgk', v) end
else add_gk(rst, 'after_jfmgk', Np.gk) end
diff --git a/macros/luatex/generic/luatexja/src/ltj-setwidth.lua b/macros/luatex/generic/luatexja/src/ltj-setwidth.lua
index 0e8e39f071..dd83d7e3d5 100644
--- a/macros/luatex/generic/luatexja/src/ltj-setwidth.lua
+++ b/macros/luatex/generic/luatexja/src/ltj-setwidth.lua
@@ -15,21 +15,23 @@ local getfont = node.direct.getfont
local getlist = node.direct.getlist
local getchar = node.direct.getchar
local getsubtype = node.direct.getsubtype
-local getwidth = node.direct.getwidth or function(n) return getfield(n,'width') end
-local getdepth = node.direct.getdepth or function(n) return getfield(n,'depth') end
-local getwhd = node.direct.getwhd or function(n)
- return getfield(n,'width'), getfield(n,'height'),getfield(n,'depth') end
+local getwidth = node.direct.getwidth
+local getshift = node.direct.getshift
+local getoffsets = node.direct.getoffsets
+local getheight = node.direct.getheight
+local getdepth = node.direct.getdepth
+local getwhd = node.direct.getwhd
-local setwhd = node.direct.setwhd or function(n,w,h,d)
- setfield(n,'width',w); setfield(n,'height',h); setfield(n,'depth',d) end
-local setchar = node.direct.setchar or function(n,c) setfield(n,'char',c) end
-local setnext = node.direct.setnext or function(n,c) setfield(n,'next',c) end
-local setdir = node.direct.setdir or function(n,c) setfield(n,'dir',c) end
-local setkern = node.direct.setkern or function(n,c) setfield(n,'kern',c) end
-local setoffsets = node.direct.setoffsets or function(n,x,y)
- setfield(n,'xoffset',x); setfield(n,'yoffset',y) end
-local getoffsets = node.direct.getoffsets or function(n)
- return getfield(n,'xoffset'), getfield(n,'yoffset') end
+local setwhd = node.direct.setwhd
+local setchar = node.direct.setchar
+local setnext = node.direct.setnext
+local setdir = node.direct.setdir
+local setkern = node.direct.setkern
+local setshift = node.direct.setshift
+local setoffsets = node.direct.setoffsets
+local setheight = node.direct.setheight
+local setdepth = node.direct.setdepth
+local setlist = node.direct.setlist
local node_traverse_id = node.direct.traverse_id
local node_traverse = node.direct.traverse
@@ -37,7 +39,7 @@ local node_copy = node.direct.copy
local node_remove = node.direct.remove
local node_tail = node.direct.tail
local node_next = node.direct.getnext
-local has_attr = node.direct.has_attribute
+local get_attr = node.direct.get_attribute
local set_attr = node.direct.set_attribute
local node_insert_before = node.direct.insert_before
local node_insert_after = node.direct.insert_after
@@ -56,6 +58,7 @@ local sid_restore = node.subtype 'pdf_restore'
local sid_matrix = node.subtype 'pdf_setmatrix'
local dir_tate = luatexja.dir_table.dir_tate
+local attr_yablshift = luatexbase.attributes['ltj@yablshift']
local attr_ykblshift = luatexbase.attributes['ltj@ykblshift']
local attr_tkblshift = luatexbase.attributes['ltj@tkblshift']
local attr_icflag = luatexbase.attributes['ltj@icflag']
@@ -71,7 +74,7 @@ do
local PROCESSED_BEGIN_FLAG = luatexja.icflag_table.PROCESSED_BEGIN_FLAG
local floor = math.floor
get_pr_begin_flag = function (p)
- local i = has_attr(p, attr_icflag) or 0
+ local i = get_attr(p, attr_icflag) or 0
return i - i%PROCESSED_BEGIN_FLAG
end
end
@@ -97,7 +100,7 @@ local function capsule_glyph_yoko(p, met, char_data, head, dir)
if not char_data then return node_next(p), head, p end
fshift.down = char_data.down; fshift.left = char_data.left
fshift = call_callback("luatexja.set_width", fshift, met, char_data)
- local kbl = has_attr(p, attr_ykblshift) or 0
+ local kbl = get_attr(p, attr_ykblshift) or 0
--
-- f*: whd specified in JFM
local pwidth, pheight,pdepth = getwhd(p)
@@ -142,8 +145,7 @@ local function capsule_glyph_yoko(p, met, char_data, head, dir)
setnext(p, nil)
local box = node_new(id_hlist, nil, p)
setwhd(box, fwidth, fheight, fdepth)
- setfield(box, 'head', p)
- setfield(box, 'shift', kbl)
+ setlist(box, p); setshift(box, kbl)
setdir(box, dir)
set_attr(box, attr_icflag, PACKED)
head = q and node_insert_before(head, q, box)
@@ -158,7 +160,7 @@ luatexja.setwidth.capsule_glyph_yoko = capsule_glyph_yoko
local function capsule_glyph_tate_rot(p, met, char_data, head, dir, asc)
fshift.down = char_data.down; fshift.left = char_data.left
fshift = call_callback("luatexja.set_width", fshift, met, char_data)
- local kbl = has_attr(p, attr_tkblshift) or 0
+ local kbl = get_attr(p, attr_tkblshift) or 0
-- f*: whd specified in JFM
local pwidth, pheight,pdepth = getwhd(p)
local fwidth = char_data.width or pwidth
@@ -172,8 +174,7 @@ local function capsule_glyph_tate_rot(p, met, char_data, head, dir, asc)
setnext(p, nil)
local box = node_new(id_hlist, nil, p)
setwhd(box, fwidth, fheight, fdepth)
- setfield(box, 'head', p)
- setfield(box, 'shift', kbl)
+ setlist(box, p); setshift(box, kbl)
setdir(box, dir)
set_attr(box, attr_icflag, PACKED)
head = q and node_insert_before(head, q, box)
@@ -192,8 +193,8 @@ local function capsule_glyph_tate(p, met, char_data, head, dir)
if met.rotation and met.vert_activated then
local f = font_getfont(pf)
local r, l = met.rotation[pc], f.properties and f.properties.language
- if ((r==true) or (type(r)=="table" and not r[l])) and (has_attr(p, attr_vert_ori) or 0)<=0 then
- return capsule_glyph_tate_rot(p, met, char_data, head, dir,
+ if ((r==true) or (type(r)=="table" and not r[l])) and (get_attr(p, attr_vert_ori) or 0)<=0 then
+ return capsule_glyph_tate_rot(p, met, char_data, head, dir,
0.5*(get_ascender(pf)-get_descender(pf)))
end
end
@@ -213,12 +214,11 @@ local function capsule_glyph_tate(p, met, char_data, head, dir)
fshift = call_callback("luatexja.set_width", fshift, met, char_data)
local fheight = char_data.height or 0
local fdepth = char_data.depth or 0
- local y_shift = xo + (has_attr(p,attr_tkblshift) or 0)
+ local y_shift = xo + (get_attr(p,attr_tkblshift) or 0)
local q
head, q = node_remove(head, p)
local box = node_new(id_hlist, nil, p)
- setwhd(box, fwidth, fheight, fdepth)
- setfield(box, 'shift', y_shift)
+ setwhd(box, fwidth, fheight, fdepth); setshift(box, y_shift)
setdir(box, dir)
-- print(yo, ascender, char_data.align, fwidth-pwidth)
setoffsets(p, -fshift.down,
@@ -230,7 +230,7 @@ local function capsule_glyph_tate(p, met, char_data, head, dir)
local k2 = node_new(id_kern, 1); setkern(k2, pwnh)
local k3 = node_new(id_kern, 1); setkern(k3, -getwidth(p)-pwnh)
local wr = node_new(id_whatsit, sid_restore)
- setfield(box, 'head', ws)
+ setlist(box, ws)
setnext(ws, wm); setnext(wm, k2);
setnext(k2, p); setnext(p, k3);
setnext(k3, wr);
@@ -243,26 +243,41 @@ local function capsule_glyph_tate(p, met, char_data, head, dir)
end
luatexja.setwidth.capsule_glyph_tate = capsule_glyph_tate
-local function capsule_glyph_math(p, met, char_data)
+do
+local font_getfont, famfont = font.getfont, node.family_font
+local cap_math_aux = {
+ [-1]=function() return 1 end, [0]=function() return 1 end,
+ [1]=function()
+ local sf, tf = famfont(2,1), famfont(2,0)
+ return font_getfont(sf).size/font_getfont(tf).size
+ end,
+ [2]=function()
+ local ssf, tf = famfont(2,2), famfont(2,0)
+ return font_getfont(ssf).size/font_getfont(tf).size
+ end
+}
+setmetatable(cap_math_aux, {__index=function(t,k) return t[2] end})
+local function capsule_glyph_math(p, met, char_data, sty)
if not char_data then return nil end
local fwidth, pwidth = char_data.width, getwidth(p)
fwidth = fwidth or pwidth
fshift.down = char_data.down; fshift.left = char_data.left
fshift = call_callback("luatexja.set_width", fshift, met, char_data)
local fheight, fdepth = char_data.height, char_data.depth
- local y_shift
- = - getfield(p, 'yoffset') + (has_attr(p,attr_ykblshift) or 0)
+ local y_shift = - getfield(p, 'yoffset')
+ + cap_math_aux[sty]()*
+ ((get_attr(p,attr_ykblshift) or 0) - (get_attr(p,attr_yablshift) or 0))
setfield(p, 'yoffset', -fshift.down)
setfield(p, 'xoffset', getfield(p, 'xoffset') + char_data.align*(fwidth-pwidth) - fshift.left)
local box = node_new(id_hlist, nil, p);
setwhd(box, fwidth, fheight, fdepth)
- setfield(box, 'head', p)
- setfield(box, 'shift', y_shift)
+ setlist(box, p); setshift(box, y_shift)
setdir(box, tex.mathdir)
set_attr(box, attr_icflag, PACKED)
return box
end
luatexja.setwidth.capsule_glyph_math = capsule_glyph_math
+end
-- 数式の位置補正
function luatexja.setwidth.apply_ashift_math(head, last, attr_ablshift)
@@ -270,19 +285,18 @@ function luatexja.setwidth.apply_ashift_math(head, last, attr_ablshift)
local pid = getid(p)
if p==last then
return
- elseif (has_attr(p, attr_icflag) or 0) ~= PROCESSED then
+ elseif (get_attr(p, attr_icflag) or 0) ~= PROCESSED then
if pid==id_hlist or pid==id_vlist then
- setfield(p, 'shift', getfield(p, 'shift') + (has_attr(p,attr_ablshift) or 0))
+ setshift(p, getshift(p) + (get_attr(p,attr_ablshift) or 0))
elseif pid==id_rule then
- local v = has_attr(p,attr_ablshift) or 0
- setfield(p, 'height', getfield(p, 'height')-v)
- setfield(p, 'depth', getdepth(p)+v)
+ local v = get_attr(p,attr_ablshift) or 0
+ setheight(p, getheight(p)-v); setdepth(p, getdepth(p)+v)
set_attr(p, attr_icflag, PROCESSED)
elseif pid==id_glyph then
-- 欧文文字; 和文文字は pid == id_hlist の場合で処理される
-- (see conv_jchar_to_hbox_A in ltj-math.lua)
setfield(p, 'yoffset',
- getfield(p, 'yoffset') - (has_attr(p,attr_ablshift) or 0))
+ getfield(p, 'yoffset') - (get_attr(p,attr_ablshift) or 0))
end
set_attr(p, attr_icflag, PROCESSED)
end
@@ -300,7 +314,7 @@ do
if not head then return end
local y_adjust, node_depth, adj_depth = 0, 0, 0
for lp in node_traverse_id(id_glyph, head) do
- y_adjust = has_attr(lp,attr_ablshift) or 0
+ y_adjust = get_attr(lp,attr_ablshift) or 0
local ld = getdepth(lp)
node_depth = max(ld + min(y_adjust, 0), node_depth)
adj_depth = (y_adjust>0) and max(ld + y_adjust, adj_depth) or adj_depth
diff --git a/macros/luatex/generic/luatexja/src/ltj-stack.lua b/macros/luatex/generic/luatexja/src/ltj-stack.lua
index a0cd2e286e..ca83781473 100644
--- a/macros/luatex/generic/luatexja/src/ltj-stack.lua
+++ b/macros/luatex/generic/luatexja/src/ltj-stack.lua
@@ -3,7 +3,7 @@
--
luatexbase.provides_module({
name = 'luatexja.stack',
- date = '2020-07-30',
+ date = '2022-08-20',
description = 'LuaTeX-ja stack system',
})
luatexja.stack = {}
@@ -20,28 +20,31 @@ local STCK = luatexja.userid_table.STCK
local fastcopy = table.fastcopy
local setcount, getcount = tex.setcount, tex.getcount
local scan_int, scan_keyword = token.scan_int, token.scan_keyword
+local getnest = tex.getnest
+local cnt_stack = luatexbase.registernumber 'ltj@@stack'
+local cnt_grplvl = luatexbase.registernumber 'ltj@@group@level'
ltjs.hmode = 0 -- dummy
-local charprop_stack_table={};
+local charprop_stack_table={}
ltjs.charprop_stack_table = charprop_stack_table
charprop_stack_table[0]={}
local function get_stack_level()
- local i = getcount 'ltj@@stack'
+ local i = getcount(cnt_stack)
local j = tex.currentgrouplevel
- if j > getcount 'ltj@@group@level' then
+ if j > getcount(cnt_grplvl) then
i = i+1 -- new stack level
local gd = tex.globaldefs
if gd~=0 then tex.globaldefs = 0 end
-- 'tex.globaldefs = 0' is local even if \globaldefs > 0.
- setcount('ltj@@group@level', j)
+ setcount(cnt_grplvl, j)
for k,v in pairs(charprop_stack_table) do -- clear the stack above i
if k>=i then charprop_stack_table[k]=nil end
end
charprop_stack_table[i] = fastcopy(charprop_stack_table[i-1])
- setcount('ltj@@stack', i)
+ setcount(cnt_stack, i)
if gd~=0 then tex.globaldefs = gd end
- if tex.nest[tex.nest.ptr].mode == -ltjs.hmode then -- rest. hmode のみ
+ if getnest().mode == -ltjs.hmode then -- rest. hmode のみ
local g = node_new(id_whatsit, sid_user)
g.user_id=STCK; g.type=100; g.value=j; node.write(g)
end
@@ -54,9 +57,7 @@ local function set_stack_table(m, p)
local i = get_stack_level()
charprop_stack_table[i][m] = p
if luatexja.isglobal=='global' then
- for j,v in pairs(charprop_stack_table) do
- charprop_stack_table[j][m] = p
- end
+ for j,v in pairs(charprop_stack_table) do v[m] = p end
end
end
ltjs.set_stack_table = set_stack_table
@@ -90,25 +91,22 @@ function ltjs.set_stack_font(m,c,p)
end
-- EXT: sp: glue_spec
+local getglue = node.getglue
function ltjs.set_stack_skip(m,sp)
local i = get_stack_level()
if not sp then return end
- if not charprop_stack_table[i][m] then
- charprop_stack_table[i][m] = {}
+ local w,st,sh,sto,sho = getglue(sp)
+ if charprop_stack_table[i][m] then
+ local c = charprop_stack_table[i][m]
+ c[1], c[2], c[3], c[4], c[5] = w, st, sh, sto, sho
+ else
+ charprop_stack_table[i][m] = { w,st,sh,sto,sho }
end
- charprop_stack_table[i][m].width = sp.width
- charprop_stack_table[i][m].stretch = sp.stretch
- charprop_stack_table[i][m].shrink = sp.shrink
- charprop_stack_table[i][m].stretch_order = sp.stretch_order
- charprop_stack_table[i][m].shrink_order = sp.shrink_order
if luatexja.isglobal=='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].width = sp.width
- charprop_stack_table[j][m].stretch = sp.stretch
- charprop_stack_table[j][m].shrink = sp.shrink
- charprop_stack_table[j][m].stretch_order = sp.stretch_order
- charprop_stack_table[j][m].shrink_order = sp.shrink_order
+ if not v[m] then v[m] = { true,true,true,true,true } end
+ local c = v[m]
+ c[1], c[2], c[3], c[4], c[5] = w, st, sh, sto, sho
end
end
end
@@ -119,23 +117,21 @@ local orig_char_table = {}
ltjs.orig_char_table = orig_char_table
ltjs.list_dir = nil -- dummy
ltjs.table_current_stack = nil -- dummy
+local dummy_skip_table = { 0,0,0,0,0 }
function ltjs.report_stack_level(bsl)
ltjs.table_current_stack = charprop_stack_table[bsl]
return bsl
end
function ltjs.fast_get_stack_skip(m)
- return ltjs.table_current_stack[m]
- or { width = 0, stretch = 0, shrink = 0, stretch_order = 0, shrink_order = 0 }
+ return ltjs.table_current_stack[m] or dummy_skip_table
end
-- For other situations, use the following instead:
function ltjs.get_stack_skip(m, idx)
- return charprop_stack_table[idx][m]
- or { width = 0, stretch = 0, shrink = 0, stretch_order = 0, shrink_order = 0 }
+ return charprop_stack_table[idx][m] or dummy_skip_table
end
function ltjs.get_stack_table(mc, d, idx)
- local i = charprop_stack_table[idx][mc]
- return i or d
+ return charprop_stack_table[idx][mc] or d
end
diff --git a/macros/luatex/generic/luatexja/src/ltjclasses.dtx b/macros/luatex/generic/luatexja/src/ltjclasses.dtx
index e2d4dd9a50..f05afe97c1 100644
--- a/macros/luatex/generic/luatexja/src/ltjclasses.dtx
+++ b/macros/luatex/generic/luatexja/src/ltjclasses.dtx
@@ -139,6 +139,7 @@
% (sync with ltsect.dtx 2020/07/27 v1.1e)}
% \changes{v1.8f-ltj-21}{2021-12-22}{余計なコメントの削除.}
% \changes{v1.8f-ltj-22}{2022-04-11}{kern featureが有効になっていたのを修正.}
+% \changes{v1.8f-ltj-23}{2022-09-12}{|\stockwidth|がカーネルで定義される可能性に対応.}
% \fi
%
% \iffalse
@@ -168,7 +169,7 @@
%<11pt&bk>\ProvidesFile{ltjtbk11.clo}
%<12pt&bk>\ProvidesFile{ltjtbk12.clo}
%</tate>
- [2022-04-11 v1.8f-ltj-22
+ [2022-09-12 v1.8f-ltj-23
%<article|report|book> Standard LuaLaTeX-ja class]
%<10pt|11pt|12pt> Standard LuaLaTeX-ja file (size option)]
%<*driver>
@@ -977,10 +978,13 @@
% [2017-01-17 LTJ] [lt]jsclassesに合わせ、トンボオプションが指定されているとき「だけ」|\stockwidth|、
% |\stockheight|を定義するようにしました。aminophenさん、ありがとうございます。
%
+% [2022-09-12 LTJ] \LaTeXe カーネルに|\stockwidth|、|\stockheight|が追加されるようですので、
+% クラスファイル側では未定義のときのみこれらの長さ変数を定義します。h20y6mさん、ありがとうございます。
+%
% \begin{macrocode}
\iftombow
- \newlength{\stockwidth}
- \newlength{\stockheight}
+ \ifdefined\stockwidth\else\newlength{\stockwidth}\fi
+ \ifdefined\stockheight\else\newlength{\stockheight}\fi
\setlength{\stockwidth}{\paperwidth}
\setlength{\stockheight}{\paperheight}
\advance \stockwidth 2in
diff --git a/macros/luatex/generic/luatexja/src/ltjsclasses.dtx b/macros/luatex/generic/luatexja/src/ltjsclasses.dtx
index e190617c15..a151210339 100644
--- a/macros/luatex/generic/luatexja/src/ltjsclasses.dtx
+++ b/macros/luatex/generic/luatexja/src/ltjsclasses.dtx
@@ -44,7 +44,7 @@
%<*driver>
\ProvidesFile{ltjsclasses.dtx}
%</driver>
- [2022/04/11 ltjsclasses ]
+ [2022/09/12 ltjsclasses ]
%<*driver>
\IfFileExists{luatex85.sty}{\RequirePackage{luatex85}}{}
\documentclass[disablejfam]{ltjsarticle}
@@ -808,13 +808,15 @@
\begingroup\catcode`\%=12\relax
\directlua{
local getdimen, mpt=tex.getdimen, tex.getdimen('jsc@mpt')/65536
+ local floor, cnt_dimen_at = math.floor, luatexbase.registernumber 'dimen@'
+ local print_scaled, sprint = luatexja.print_scaled, tex.sprint
local t = lua.get_functions_table()
t[\the\ltjs@@magnify@font@calc] = function()
- tex.sprint(-2,math.floor(0.5+mpt*getdimen('dimen@')))
+ sprint(-2,floor(0.5+mpt*getdimen(cnt_dimen_at)))
end
function luatexja.ltjs_unmagnify_fsize(a)
- local s = luatexja.print_scaled(math.floor(0.5+a/mpt*65536))
- tex.sprint(-2, (s:match('%.0$')) and s:sub(1,-3) or s )
+ local s = print_scaled(floor(0.5+a/mpt*65536))
+ sprint(-2, (s:match('%.0$')) and s:sub(1,-3) or s )
end
}
\endgroup
@@ -892,10 +894,13 @@
% [2017-01-11] トンボオプションが指定されているとき「だけ」|\stockwidth|,
% |\stockheight|を定義するようにしました。
%
+% [2022-09-12 LTJ] \LaTeXe カーネルに|\stockwidth|、|\stockheight|が追加されるようですので、
+% クラスファイル側では未定義のときのみこれらの長さ変数を定義します。h20y6mさん、ありがとうございます。
+%
% \begin{macrocode}
\iftombow
- \newlength{\stockwidth}
- \newlength{\stockheight}
+ \ifdefined\stockwidth\else\newlength{\stockwidth}\fi
+ \ifdefined\stockheight\else\newlength{\stockheight}\fi
\setlength{\stockwidth}{\paperwidth}
\setlength{\stockheight}{\paperheight}
\advance \stockwidth 2in
diff --git a/macros/luatex/generic/luatexja/src/luatexja-core.sty b/macros/luatex/generic/luatexja/src/luatexja-core.sty
index cc49fbd479..c1f8c2c622 100644
--- a/macros/luatex/generic/luatexja/src/luatexja-core.sty
+++ b/macros/luatex/generic/luatexja/src/luatexja-core.sty
@@ -65,7 +65,7 @@
\expandafter\let\csname ifltj@in@latex\expandafter\endcsname
\csname iftrue\endcsname
\NeedsTeXFormat{LaTeX2e}
- \ProvidesPackage{luatexja-core}[2022-01-12 Core of LuaTeX-ja]
+ \ProvidesPackage{luatexja-core}[2022-08-24 Core of LuaTeX-ja]
\fi %</LaTeX>
%% Load prerequisite packages.
@@ -97,10 +97,10 @@
\expandafter\endinput\fi\relax
%% Check LuaTeX version.
-\ifnum\luatexversion<100
+\ifnum\luatexversion<110
\@PackageError{luatexja-core}
{This LuaTeX engine is too old for this package;\MessageBreak
- at least 1.0.0 is needed}
+ at least 1.10.0 is needed}
{Package loading is aborted now.\MessageBreak}
\expandafter\endinput\fi\relax
@@ -125,10 +125,6 @@
\newdimen\ltj@dimen@jQ \ltj@dimen@jQ=0.25mm
\let\jQ=\ltj@dimen@jQ \let\jH=\jQ
-%%%%%%%% error message
-\def\ltj@defnum{0}
-\def\ltj@defdimen{0}
-
%%%%%%%% Attributes for Japanese typesetting.
\newattribute\ltj@icflag % attribute for italic correction
\newattribute\ltj@curjfnt % index for ``current horizontal Japanese font''
@@ -148,7 +144,6 @@
\newlanguage\ltj@@japanese
\ltj@dir\z@
\ltj@icflag\z@
-\ltj@charclass\z@
\ltj@curjfnt\m@ne
\ltj@curtfnt\m@ne
\ltj@yablshift\z@
@@ -156,15 +151,18 @@
\ltj@tablshift\z@
\ltj@tkblshift\z@
+\newcount\ltj@tempcnta\newdimen\ltj@tempdima
+\newcount\ltj@@stack \newcount\ltj@@group@level
+\ltj@@group@level\z@\ltj@@stack\z@
+
%%%%%%%% Attributes for character ranges
-\newcount\ltj@tempcnta
\ltj@tempcnta\z@
\loop\ifnum\ltj@tempcnta<7
\expandafter\newattribute%
\csname ltj@kcat\the\ltj@tempcnta\endcsname
- \csname ltj@kcat\the\ltj@tempcnta\endcsname=0
\advance\ltj@tempcnta\@ne
\repeat
+\csname ltj@kcat0\endcsname=\z@
%%%%%%%% Loading luatexja.lua
@@ -225,21 +223,21 @@
%%%%%%%% \jfont\CS={...:...;jfm=metric;...}, \globaljfont
\protected\def\jfont#1{%
- \afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(false, 'yoko','\luatexluaescapestring{\noexpand#1}')}}
+ \def\ltj@temp{#1}\afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(false, 'yoko')}}
\protected\def\globaljfont#1{%
- \afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(true, 'yoko','\luatexluaescapestring{\noexpand#1}')}}
+ \def\ltj@temp{#1}\afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(true, 'yoko')}}
\newluafunction\ltj@@jfont@inner
\directlua{
local t = lua.get_functions_table()
t[\the\ltj@@jfont@inner] = luatexja.jfont.jfontdefY
}
-\def\ltj@@jfont{\luafunction\ltj@@jfont@inner}
+\def\ltj@@jfont{\expandafter\expandafter\expandafter\luafunction\expandafter\ltj@@jfont@inner\ltj@temp}
%%%%%%%% \tfont\CS={...:...;jfm=metric;...}, \globaltfont
\protected\def\tfont#1{%
- \afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(false, 'tate','\luatexluaescapestring{\noexpand#1}')}}
+ \def\ltj@temp{#1}\afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(false, 'tate')}}
\protected\def\globaltfont#1{%
- \afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(true, 'tate','\luatexluaescapestring{\noexpand#1}')}}
+ \def\ltj@temp{#1}\afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(true, 'tate')}}
%%%%%%%% \zw, \zh
\newluafunction\ltj@zw@inner
@@ -264,17 +262,17 @@
\newluafunction\ltj@@ins@xk@inner
\newluafunction\ltj@@ins@k@inner
\directlua{
- local t = lua.get_functions_table()
+ local t, ltjj = lua.get_functions_table(), luatexja.jfmglue
t[\the\ltj@reset@globaldefs@inner]
= function() luatexja.global_temp = tex.globaldefs; tex.globaldefs = 0 end
t[\the\ltj@restore@globaldefs@inner]
= function() tex.globaldefs = luatexja.global_temp end
- t[\the\ltj@@disihb@inner] = luatexja.jfmglue.create_disinhibitglue_node
- t[\the\ltj@@ihb@inner] = luatexja.jfmglue.create_inhibitglue_node
- t[\the\ltj@@fakeparbegin@inner] = luatexja.jfmglue.create_beginpar_node
- t[\the\ltj@@fakeboxbdd@inner] = luatexja.jfmglue.create_boxbdd_node
- t[\the\ltj@@ins@xk@inner] = luatexja.jfmglue.insert_xk_skip
- t[\the\ltj@@ins@k@inner] = luatexja.jfmglue.insert_k_skip
+ t[\the\ltj@@disihb@inner] = ltjj.create_disinhibitglue_node
+ t[\the\ltj@@ihb@inner] = ltjj.create_inhibitglue_node
+ t[\the\ltj@@fakeparbegin@inner] = ltjj.create_beginpar_node
+ t[\the\ltj@@fakeboxbdd@inner] = ltjj.create_boxbdd_node
+ t[\the\ltj@@ins@xk@inner] = ltjj.insert_xk_skip
+ t[\the\ltj@@ins@k@inner] = ltjj.insert_k_skip
}
\protected\luadef\ltj@reset@globaldefs \ltj@reset@globaldefs@inner
\protected\luadef\ltj@restore@globaldefs\ltj@restore@globaldefs@inner
@@ -307,17 +305,14 @@
}
%%%%%%%% \ltjsetparameter
-\newcount\ltj@@stack \newcount\ltj@@group@level
-\ltj@@group@level\z@\ltj@@stack\z@
-
\setbox\z@\hbox{%
\directlua{% This value depends on the version of LuaTeX.
- luatexja.stack.hmode = -tex.nest[tex.nest.ptr].mode
+ luatexja.stack.hmode = -tex.getnest().mode
}%
}
\setbox\z@\vbox{%
\directlua{% This value depends on the version of LuaTeX.
- luatexja.stack.vmode = -tex.nest[tex.nest.ptr].mode
+ luatexja.stack.vmode = -tex.getnest().mode
}%
}
\setbox\z@\box\voidb@x
@@ -328,9 +323,6 @@
\define@key[ltj]{japaram}{postbreakpenalty}{\ltj@@set@stack{POST}{-10000}{10000}#1\relax}
\def\ltj@@set@stack#1#2#3{%
\directlua{luatexja.stack.set_stack_perchar(luatexja.stack_table_index.#1,#2,#3)}}
-%\def\ltj@@set@stack#1,#2:#3#4#5{%
-% \directlua{luatexja.stack.set_stack_perchar(luatexja.stack_table_index.#3,
-% \ltj@safe@num@or{nil}{#1},\ltj@safe@num@or{nil}{#2},#4,#5)}}
% jatextfont = {<char_code>, <font_cs>}
% only horizontal font is supported
@@ -357,18 +349,16 @@
% {y,t}{ja,al}baselineshift = <dimen>
% yjabaselineshift = <dimen>
-\define@key[ltj]{japaram}{yalbaselineshift}{%
- \directlua{tex.setattribute(luatexja.isglobal,
- luatexbase.attributes['ltj@yablshift'], token.scan_dimen())}#1\relax}
-\define@key[ltj]{japaram}{yjabaselineshift}{%
- \directlua{tex.setattribute(luatexja.isglobal,
- luatexbase.attributes['ltj@ykblshift'], token.scan_dimen())}#1\relax}
-\define@key[ltj]{japaram}{talbaselineshift}{%
- \directlua{tex.setattribute(luatexja.isglobal,
- luatexbase.attributes['ltj@tablshift'], token.scan_dimen())}#1\relax}
-\define@key[ltj]{japaram}{tjabaselineshift}{%
- \directlua{tex.setattribute(luatexja.isglobal,
- luatexbase.attributes['ltj@tkblshift'], token.scan_dimen())}#1\relax}
+\def\ltj@set@blshift@#1{\directlua{%
+ local n = token.scan_dimen()
+ tex.setattribute(luatexja.isglobal,
+ luatexbase.attributes['#1'], (n==0) and 0 or n)
+ %次期バージョンで ... and -0x7FFFFFFF or ... に変える
+}}
+\define@key[ltj]{japaram}{yalbaselineshift}{\ltj@set@blshift@{ltj@yablshift}#1\relax}
+\define@key[ltj]{japaram}{yjabaselineshift}{\ltj@set@blshift@{ltj@ykblshift}#1\relax}
+\define@key[ltj]{japaram}{talbaselineshift}{\ltj@set@blshift@{ltj@tablshift}#1\relax}
+\define@key[ltj]{japaram}{tjabaselineshift}{\ltj@set@blshift@{ltj@tkblshift}#1\relax}
% jaxspmode = {<char_code>, <mode>}
% mode: inhibit, preonly, postonly, allow
@@ -392,7 +382,7 @@
% autospacing = <bool> (default: true)
\define@boolkey[ltj]{japaram}{autospacing}[true]{%
\ifltj@japaram@autospacing
- \directlua{luatexja.ext_print_global()}\ltj@autospc\@ne
+ \directlua{luatexja.ext_print_global()}\unsetattribute\ltj@autospc
\else
\directlua{luatexja.ext_print_global()}\ltj@autospc\z@
\fi}
@@ -400,7 +390,7 @@
% autoxspacing = <bool> (default: true)
\define@boolkey[ltj]{japaram}{autoxspacing}[true]{%
\ifltj@japaram@autoxspacing
- \directlua{luatexja.ext_print_global()}\ltj@autoxspc\@ne
+ \directlua{luatexja.ext_print_global()}\unsetattribute\ltj@autoxspc
\else
\directlua{luatexja.ext_print_global()}\ltj@autoxspc\z@
\fi}
@@ -516,7 +506,7 @@
t[\the\ltj@alljachar@inner] = function()
font.current(get_attr(attr_curjfnt)); tex.language=lang_ja;
for i=0,6 do
- set_attr(luatexbase.attributes['ltj@kcat' .. floor(i)],0)
+ set_attr(luatexbase.attributes['ltj@kcat' .. floor(i)], 0)
end
end
}
@@ -646,7 +636,7 @@
\setbox\z@\hbox{%
\primitive\everymath{}%
$\directlua{% This value depends on the version of LuaTeX.
- luatexja.stack.mmode = -tex.nest[tex.nest.ptr].mode
+ luatexja.stack.mmode = -tex.getnest().mode
}$%
}
\setbox\z@\box\voidb@x
diff --git a/macros/luatex/generic/luatexja/src/luatexja.lua b/macros/luatex/generic/luatexja/src/luatexja.lua
index 8da4251882..e8f4053c40 100644
--- a/macros/luatex/generic/luatexja/src/luatexja.lua
+++ b/macros/luatex/generic/luatexja/src/luatexja.lua
@@ -39,21 +39,6 @@ do
return node_inherit_attr(node_new(id, subtype), b, a)
end
end
-do
- local setfield = node.direct.setfield
- luatexja.setglue = node.direct.setglue or
- function(g,w,st,sh,sto,sho)
- setfield(g,'width', w or 0); setfield(g,'stretch',st or 0); setfield(g,'shrink', sh or 0)
- setfield(g,'stretch_order',sto or 0)
- setfield(g,'shrink_order', sho or 0)
- end
- local getfield = node.direct.getfield
- luatexja.getglue = node.direct.getglue or
- function(g)
- return getfield(g,'width'), getfield(g,'stretch'), getfield(g,'shrink'),
- getfield(g,'stretch_order'), getfield(g,'shrink_order')
- end
-end
--- 以下は全ファイルで共有される定数
local icflag_table = {}
@@ -120,7 +105,7 @@ if tex.outputmode==0 then
'Use lua*tex instead dvilua*tex.')
end
load_module 'rmlgbm'; local ltjr = luatexja.rmlgbm -- must be 1st
-if luatexja_debug then load_module('debug') end
+if luatexja_debug then load_module 'debug' end
load_module 'lotf_aux'; local ltju = luatexja.lotf_aux
load_module 'charrange'; local ltjc = luatexja.charrange
load_module 'stack'; local ltjs = luatexja.stack
@@ -171,12 +156,12 @@ local function print_glue(d,order)
end
local 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)
+ local out=print_scaled(p.width or p[1])..'pt'
+ if (p.stretch or p[2])~=0 then
+ out=out..' plus '..print_glue(p.stretch or p[2], p.stretch_order or p[4])
end
- if p.shrink~=0 then
- out=out..' minus '..print_glue(p.shrink,p.shrink_order)
+ if (p.shrink or p[3])~=0 then
+ out=out..' minus '..print_glue(p.shrink or p[3], p.shrink_order or p[5])
end
return out
end
@@ -185,14 +170,16 @@ end
------------------------------------------------------------------------
-- CODE FOR GETTING/SETTING PARAMETERS
------------------------------------------------------------------------
+local getcount, texwrite = tex.getcount, tex.write
+local cnt_stack = luatexbase.registernumber 'ltj@@stack'
-- EXT: print parameters that don't need arguments
do
local tex_getattr = tex.getattribute
- local function getattr(a)
- local r = tex_getattr(a)
- return (r==-0x7FFFFFFF) and 0 or r
- end
+ local function getattr(a, d)
+ local r = tex_getattr(a); d = d or 0
+ return (r==-0x7FFFFFFF) and d or r
+ end
luatexja.unary_pars = {
yalbaselineshift = function(t)
return print_scaled(getattr('ltj@yablshift'))..'pt'
@@ -216,10 +203,10 @@ do
return ltjs.get_stack_table(stack_ind.JWP, 0, t)
end,
autospacing = function(t)
- return getattr('ltj@autospc')
+ return getattr('ltj@autospc', 1)
end,
autoxspacing = function(t)
- return getattr('ltj@autoxspc')
+ return getattr('ltj@autoxspc', 1)
end,
differentjfm = function(t)
local f, r = luatexja.jfmglue.diffmet_rule, '???'
@@ -235,7 +222,7 @@ do
end,
direction = function()
local v = ltjd.get_dir_count()
- if math.abs(tex.nest[tex.nest.ptr].mode) == ltjs.mmode and v == dir_table.dir_tate then
+ if math.abs(tex.getnest().mode) == ltjs.mmode and v == dir_table.dir_tate then
v = dir_table.dir_utod
end
return v
@@ -248,9 +235,9 @@ do
function luatexja.ext_get_parameter_unary()
local k= scan_arg()
if unary_pars[k] then
- tex.write(tostring(unary_pars[k](tex.getcount('ltj@@stack'))))
+ texwrite(tostring(unary_pars[k](getcount(cnt_stack))))
end
- ltjb.stop_time_measure('get_par')
+ ltjb.stop_time_measure 'get_par'
end
end
@@ -269,8 +256,8 @@ do
c=0 -- external range 217 == internal range 0
elseif c==31*ltjc.ATTR_RANGE then c=0
end
- -- 負の値は <U+0080 の文字の文字範囲,として出てくる.この時はいつも欧文文字なので 1 を返す
- return (c<0) and 1 or ltjc.get_range_setting(c)
+ -- 負の値は <U+0080 の文字の文字範囲,として出てくる.この時はいつも欧文文字なので 1 を返す
+ if c<0 then return 1 else return (ltjc.get_range_setting(c)==0) and 0 or 1 end
end,
prebreakpenalty = function(c, t)
return ltjs.get_stack_table(stack_ind.PRE + ltjb.in_unicode(c, true), 0, t)
@@ -303,9 +290,9 @@ do
binary_pars.alxspmode = binary_pars.jaxspmode
function luatexja.ext_get_parameter_binary(k, c)
if binary_pars[k] then
- tex.write(tostring(binary_pars[k](c,tex.getcount('ltj@@stack'))))
+ texwrite(tostring(binary_pars[k](c, getcount(cnt_stack))))
end
- ltjb.stop_time_measure('get_par')
+ ltjb.stop_time_measure 'get_par'
end
end
@@ -329,10 +316,10 @@ do
ensure_tex_attr(attr_icflag, 0)
if gc == 'fin_row' then return head
else
- start_time_measure('jfmglue')
+ start_time_measure 'jfmglue'
slide(head);
local p = ltjj.main(to_direct(head),mode, dir)
- stop_time_measure('jfmglue')
+ stop_time_measure 'jfmglue'
return to_node(p)
end
end
@@ -363,13 +350,14 @@ end
-- lastnodechar
do
- local id_glyph = node.id('glyph')
+ local getnest = tex.getnest
+ local id_glyph = node.id 'glyph'
function luatexja.pltx_composite_last_node_char()
- local n = tex.nest[tex.nest.ptr].tail
+ local n = getnest()
local r = '-1'
if n then
if n.id==id_glyph then
- while n.componetns and n.subtype and n.subtype%4 >= 2 do
+ while n.components and n.subtype and n.subtype%4 >= 2 do
n = node.tail(n)
end
r = tostring(n.char)
@@ -380,7 +368,7 @@ do
end
do
- local cache_ver = 3 -- must be same as ltj-kinsoku.tex
+ local cache_ver = 4 -- must be same as ltj-kinsoku.tex
local cache_outdate_fn = function (t) return t.version~=cache_ver end
local t = ltjs.charprop_stack_table
function luatexja.load_kinsoku()
@@ -401,29 +389,29 @@ do
local node_type = node.type
local node_next = node.next
-local has_attr = node.has_attribute
+local get_attr = node.get_attribute
-local id_penalty = node.id('penalty')
-local id_glyph = node.id('glyph')
-local id_glue = node.id('glue')
-local id_kern = node.id('kern')
-local id_hlist = node.id('hlist')
-local id_vlist = node.id('vlist')
-local id_rule = node.id('rule')
-local id_math = node.id('math')
-local id_whatsit = node.id('whatsit')
-local sid_user = node.subtype('user_defined')
+local id_penalty = node.id 'penalty'
+local id_glyph = node.id 'glyph'
+local id_glue = node.id 'glue'
+local id_kern = node.id 'kern'
+local id_hlist = node.id 'hlist'
+local id_vlist = node.id 'vlist'
+local id_rule = node.id 'rule'
+local id_math = node.id 'math'
+local id_whatsit = node.id 'whatsit'
+local sid_user = node.subtype 'user_defined'
local prefix, inner_depth
local utfchar = utf.char
local function debug_show_node_X(p,print_fn, limit, inner_depth)
local k = prefix
local s
- local pt, pic = node_type(p.id), (has_attr(p, attr_icflag) or 0) % icflag_table.PROCESSED_BEGIN_FLAG
+ local pt, pic = node_type(p.id), (get_attr(p, attr_icflag) or 0) % icflag_table.PROCESSED_BEGIN_FLAG
local base = prefix .. string.format('%X', pic) .. ' ' .. pt .. ' ' .. tostring(p.subtype) .. ' '
if pt == 'glyph' then
- s = base .. ' '
- .. (p.char<0xF0000 and utfchar(p.char) or '')
+ s = base .. ' '
+ .. (p.char<0xF0000 and utfchar(p.char) or '')
.. string.format(' (U+%X) ', p.char)
.. tostring(p.font) .. ' (' .. print_scaled(p.height) .. '+'
.. print_scaled(p.depth) .. ')x' .. print_scaled(p.width)
@@ -436,11 +424,11 @@ local function debug_show_node_X(p,print_fn, limit, inner_depth)
if pt=='ins' then
s = base .. '(' .. print_scaled(p.height) .. '+'
.. print_scaled(p.depth) .. ')'
- .. ', dir=' .. tostring(node.has_attribute(p, attr_dir))
+ .. ', dir=' .. tostring(node.get_attribute(p, attr_dir))
else
s = base .. '(' .. print_scaled(p.height) .. '+'
.. print_scaled(p.depth) .. ')x' .. print_scaled(p.width)
- .. ', dir=' .. tostring(node.has_attribute(p, attr_dir))
+ .. ', dir=' .. tostring(node.get_attribute(p, attr_dir))
end
if (p.shift or 0)~=0 then
s = s .. ', shifted ' .. print_scaled(p.shift)
@@ -468,7 +456,7 @@ local function debug_show_node_X(p,print_fn, limit, inner_depth)
elseif pt=='rule' then
s = base .. '(' .. print_scaled(p.height) .. '+'
.. print_scaled(p.depth) .. ')x' .. print_scaled(p.width)
- .. ', dir=' .. tostring(node.has_attribute(p, attr_dir))
+ .. ', dir=' .. tostring(node.get_attribute(p, attr_dir))
print_fn(s)
elseif pt=='disc' then
print_fn(s)
@@ -532,7 +520,7 @@ local function debug_show_node_X(p,print_fn, limit, inner_depth)
else
s = s .. ' userid:' .. t .. '(node list)'
if p.user_id==uid_table.DIR then
- s = s .. ' dir: ' .. tostring(node.has_attribute(p, attr_dir))
+ s = s .. ' dir: ' .. tostring(node.get_attribute(p, attr_dir))
end
print_fn(s)
local bid = inner_depth
diff --git a/macros/luatex/generic/luatexja/src/luatexja.sty b/macros/luatex/generic/luatexja/src/luatexja.sty
index 7353d8aa08..0772c0fe3e 100644
--- a/macros/luatex/generic/luatexja/src/luatexja.sty
+++ b/macros/luatex/generic/luatexja/src/luatexja.sty
@@ -27,7 +27,7 @@
\newif\ifltj@disablejfam
%%%% VERSION
-\def\LuaTeXjaversion{20220810.0}
+\def\LuaTeXjaversion{20221002.0}
%% Check if LaTeX is used.
\begingroup\expandafter\expandafter\expandafter\endgroup
diff --git a/macros/luatex/generic/luatexja/src/patches/lltjfont.sty b/macros/luatex/generic/luatexja/src/patches/lltjfont.sty
index 1e9abe047b..f1435f7152 100644
--- a/macros/luatex/generic/luatexja/src/patches/lltjfont.sty
+++ b/macros/luatex/generic/luatexja/src/patches/lltjfont.sty
@@ -557,6 +557,7 @@
{Use \string\KanjiEncodingPair, falling back to `\reserved@b'...}%
\expandafter\edef\reserved@a{\reserved@b}%
\fi}
+
\def\set@fontsize#1#2#3{%
\@defaultunits\@tempdimb#2pt\relax\@nnil
\edef\f@size{\strip@pt\@tempdimb}%
diff --git a/macros/luatex/generic/luatexja/src/patches/lltjp-atbegshi.sty b/macros/luatex/generic/luatexja/src/patches/lltjp-atbegshi.sty
index c766ec4685..12605ff11b 100644
--- a/macros/luatex/generic/luatexja/src/patches/lltjp-atbegshi.sty
+++ b/macros/luatex/generic/luatexja/src/patches/lltjp-atbegshi.sty
@@ -3,7 +3,7 @@
%
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{lltjp-atbegshi}[2021-04-29 Patching \string\shipout\space hooks for LuaTeX-ja]
+\ProvidesPackage{lltjp-atbegshi}[2022-08-12 Patching \string\shipout\space hooks for LuaTeX-ja]
% concept: execute all hooks inside yoko direction \vbox
@@ -37,6 +37,7 @@
% however, an infinite loop occurs if we uncomment the line below
% so we can't.
%\box_use:N \l__platex_shipout_dummy_box
+ \box_clear:N \l__platex_shipout_dummy_box
}
}
@@ -53,6 +54,7 @@
\vbox_set:Nn \l__platex_shipout_dummy_box {
\platex_direction_yoko: \__platex_original_shipout_execute_cont:
}
+ \box_clear:N \l__platex_shipout_dummy_box
}
}
\fi:
@@ -104,7 +106,7 @@
{\setbox8\vbox\bgroup\yoko\let\AtBegShi@OrgProtect\protect}
\pxabgs@patch@cmd\pxabgs@AtBegShi@Output
{\AtBeginShipoutOriginalShipout\box\AtBeginShipoutBox}%
- {\AtBeginShipoutOriginalShipout\box\AtBeginShipoutBox\egroup}
+ {\AtBeginShipoutOriginalShipout\box\AtBeginShipoutBox\egroup\setbox8\box\voidb@x}
\pxabgs@patch@cmd\pxabgs@AtBegShi@Output
{%
\begingroup
diff --git a/macros/luatex/generic/luatexja/src/patches/lltjp-everyshi.sty b/macros/luatex/generic/luatexja/src/patches/lltjp-everyshi.sty
index e9510e2487..c1c07441d4 100644
--- a/macros/luatex/generic/luatexja/src/patches/lltjp-everyshi.sty
+++ b/macros/luatex/generic/luatexja/src/patches/lltjp-everyshi.sty
@@ -12,7 +12,7 @@
\@EveryShipout@Hook
\@EveryShipout@AtNextHook
\global\setbox\luatexoutputbox=\box\luatexoutputbox
- }%
+ }\setbox8\box\voidb@x%
\gdef\@EveryShipout@AtNextHook{}%
\@EveryShipout@Org@Shipout\box\luatexoutputbox
}
diff --git a/macros/luatex/generic/luatexja/src/patches/lltjp-tascmac.sty b/macros/luatex/generic/luatexja/src/patches/lltjp-tascmac.sty
index 4d2d350553..af27cae8a0 100644
--- a/macros/luatex/generic/luatexja/src/patches/lltjp-tascmac.sty
+++ b/macros/luatex/generic/luatexja/src/patches/lltjp-tascmac.sty
@@ -1,13 +1,9 @@
%
% lltjp-tascmac.sty
% based on tascmac.sty [2016/04/15 v2.0b (community edition)]
-% \tbaselineshift=\z@ ==> \ltj@tablshift=\z@
-% \ybaselineshift=\z@ ==> \ltj@yablshift=\z@
-% \dimen...=\tbaselineshift ==> \dimen...=\ltj@tablshift sp
-% \dimen...=\ybaselineshift ==> \dimen...=\ltj@yablshift sp
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{lltjp-tascmac}[2020/12/24 Patch to (t)ascmac for LuaTeX-ja]
+\ProvidesPackage{lltjp-tascmac}[2022-08-24 Patch to (t)ascmac for LuaTeX-ja]
\RequirePackage{tascmac}
@@ -30,9 +26,13 @@
}
%% boxnote environment
+\def\ltj@backup@attr#1#2{\ifnum#1=-"7FFFFFFF #2\z@\else #2=#1sp\fi#1=0 }
+\def\ltj@restore@attr#1#2{#1#2}
+%\def\ltj@backup@attr#1#2{\ifnum#1=-"7FFFFFFF #2\z@\else #2=#1sp\fi\unsetattribute#1}
+%\def\ltj@restore@attr#1#2{\ifdim#2=\z@ \unsetattribute#1\else #1#2\fi}
\def\boxnote{\par\vspace{.3\baselineskip}%
- \@saveybaselineshift\ltj@yablshift sp\ltj@yablshift\z@
- \@savetbaselineshift\ltj@tablshift sp\ltj@tablshift\z@
+ \ltj@backup@attr\ltj@yablshift\@saveybaselineshift
+ \ltj@backup@attr\ltj@tablshift\@savetbaselineshift
\setbox\@nbox=\hbox{\@ascgrp\vrule width1.08pt depth35pt b\hss a\hss b}
\@whiledim \wd\@nbox<\hsize \do{
\setbox\@nbox=\hbox{\@ascgrp\unhbox\@nbox \hss a\hss b}}
@@ -40,12 +40,13 @@
\vrule width1.08pt depth35pt}%
\@bw=\wd\@nbox\advance\@bw -40pt
\begin{lrbox}{\@nbody}\begin{minipage}{\@bw}% (KN:1998/02/27)
- \ltj@yablshift\@saveybaselineshift \ltj@tablshift\@savetbaselineshift}%
+ \ltj@restore@attr\ltj@yablshift\@saveybaselineshift
+ \ltj@restore@attr\ltj@tablshift\@savetbaselineshift}%
%% screen environment
\def\screen{%
- \@saveybaselineshift\ltj@yablshift sp\ltj@yablshift\z@
- \@savetbaselineshift\ltj@tablshift sp\ltj@tablshift\z@
+ \ltj@backup@attr\ltj@yablshift\@saveybaselineshift
+ \ltj@backup@attr\ltj@tablshift\@savetbaselineshift
\@ifnextchar[{\@screen}{\@screen[0]}}
\def\@screen[#1]{\ifcase#1\def\@r{20}\def\@s{9.8pt}\def\@sx{10pt}\or
\def\@r{18}\def\@s{8.8pt}\def\@sx{9pt}\or
@@ -58,26 +59,29 @@
\def\@r{4}\def\@s{1.8pt}\def\@sx{2pt}\fi
\par\vspace{.3\baselineskip}\@scw\linewidth \advance\@scw -\@r pt
\setbox\scb@x=\hbox to\@scw\bgroup\begin{minipage}{\@scw}% (KN:1998/02/27)
- \ltj@yablshift\@saveybaselineshift \ltj@tablshift\@savetbaselineshift}%
+ \ltj@restore@attr\ltj@yablshift\@saveybaselineshift
+ \ltj@restore@attr\ltj@tablshift\@savetbaselineshift}%
%% itembox environment
\def\@itembox[#1]#2{%
- \@saveybaselineshift\ltj@yablshift sp\ltj@yablshift\z@
- \@savetbaselineshift\ltj@tablshift sp\ltj@tablshift\z@
+ \ltj@backup@attr\ltj@yablshift\@saveybaselineshift
+ \ltj@backup@attr\ltj@tablshift\@savetbaselineshift
\par\vspace{.3\baselineskip}%
\setbox\@iboxstr=\hbox{%
- \ltj@yablshift\@saveybaselineshift \ltj@tablshift\@savetbaselineshift #2}%
+ \ltj@restore@attr\ltj@yablshift\@saveybaselineshift
+ \ltj@restore@attr\ltj@tablshift\@savetbaselineshift #2}%
\@itemh\ht\@iboxstr\advance\@itemh\dp\@iboxstr
\vspace{.5\@itemh}\bgroup\@scw\linewidth
\advance\@scw-20pt\@iboxpos={#1}%
\setbox\scb@x=\hbox to\@scw\bgroup\begin{minipage}{\@scw}%
- \ltj@yablshift\@saveybaselineshift
- \ltj@tablshift\@savetbaselineshift
+ \ltj@restore@attr\ltj@yablshift\@saveybaselineshift
+ \ltj@restore@attr\ltj@tablshift\@savetbaselineshift
\vspace*{.5\@itemh}}%
%% \keytop
\def\@keytop[#1]#2{%
{\setbox0=\hbox{\shortstack{#2}}\ltj@yablshift\z@\ltj@tablshift\z@%
+ %\unsetattribute\ltj@yablshift\unsetattribute\ltj@tablshift%
\dimen0=\wd0\advance\dimen0 5pt\dimen1=\dp0\advance\dimen1 2.5pt%
\setbox\scscb@x=\hbox to\dimen0{%
\@scw\wd0\hfil\vtop{\offinterlineskip
@@ -92,6 +96,7 @@
%% \mask
\def\mask#1#2{{\setbox\@bwsp=\hbox{#1}%
+% \setbox0=\hbox{\unsetattribute\ltj@yablshift\unsetattribute\ltj@tablshift \@ascgrp#2}%
\setbox0=\hbox{\ltj@yablshift\z@\ltj@tablshift\z@ \@ascgrp#2}%
\dimen0=\wd\@bwsp\dimen1=\ht\@bwsp\advance\dimen1\dp\@bwsp\dimen2=-\dimen1
\setdim@{\dimen0}{\wd0}\setdim@{\dimen1}{\ht0}%
@@ -104,6 +109,7 @@
%% \maskbox
\def\Maskbox#1#2#3#4#5#6{{%
+% \setbox0=\hbox{\unsetattribute\ltj@yablshift\unsetattribute\ltj@tablshift \@ascgrp#3}%
\setbox0=\hbox{\ltj@yablshift\z@\ltj@tablshift\z@ \@ascgrp#3}%
\dimen0=#1\@setdim{\dimen0}{\wd0}\dimen1=#2\@setdim{\dimen1}{\ht0}%
\ifx#4c\skip0=0pt plus1fil\skip1=\skip0\fi
@@ -119,12 +125,13 @@
%% shadebox environment
\def\shadebox{\par\vspace{.3\baselineskip}%
- \@saveybaselineshift\ltj@yablshift sp\ltj@yablshift\z@
- \@savetbaselineshift\ltj@tablshift sp\ltj@tablshift\z@
+ \ltj@backup@attr\ltj@yablshift\@saveybaselineshift
+ \ltj@backup@attr\ltj@tablshift\@savetbaselineshift
\dimen0\linewidth \advance\dimen0-20pt
\advance\dimen0-2\fboxrule \advance\dimen0-\shaderule
\setbox\@tempboxa=\hbox\bgroup\minipage{\dimen0}%
- \ltj@yablshift\@saveybaselineshift \ltj@tablshift\@savetbaselineshift}
+ \ltj@restore@attr\ltj@yablshift\@saveybaselineshift
+ \ltj@restore@attr\ltj@tablshift\@savetbaselineshift}%
%% \yen
%