tableunpack = table.unpack
------------------------------------------------------------------------
--- naming:
--- ext_... : called from \directlua{}
--- int_... : called from other Lua codes, but not from \directlua{}
--- (other) : only called from this file
-function luatexja.load_module(name)
- require('ltj-' .. name.. '.lua')
-end
-function luatexja.load_lua(fn)
+local function load_lua(fn)
local found = kpse.find_file(fn, 'tex')
if not found then
tex.error("LuaTeX-ja error: File `" .. fn .. "' not found")
dofile(found)
end
end
+luatexja.load_lua = load_lua
+function luatexja.load_module(name)
+ require('ltj-' .. name.. '.lua')
+end
-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)
+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 = {}
icflag_table.ITALIC = 1
icflag_table.PACKED = 2
icflag_table.KINSOKU = 3
-icflag_table.FROM_JFM = 6
+icflag_table.FROM_JFM = 4
-- FROM_JFM: 4, 5, 6, 7, 8 →優先度高(伸びやすく,縮みやすい)
-- 6 が標準
-icflag_table.KANJI_SKIP = 9
-icflag_table.KANJI_SKIP_JFM = 10
-icflag_table.XKANJI_SKIP = 11
-icflag_table.XKANJI_SKIP_JFM = 12
-icflag_table.PROCESSED = 13
-icflag_table.IC_PROCESSED = 14
-icflag_table.BOXBDD = 15
-icflag_table.PROCESSED_BEGIN_FLAG = 128
+icflag_table.KANJI_SKIP = 68 -- = 4+64
+icflag_table.KANJI_SKIP_JFM = 69
+icflag_table.XKANJI_SKIP = 70
+icflag_table.XKANJI_SKIP_JFM = 71
+icflag_table.LINEEND = 72
+icflag_table.PROCESSED = 73
+icflag_table.IC_PROCESSED = 74
+icflag_table.BOXBDD = 75
+icflag_table.PROCESSED_BEGIN_FLAG = 4096 -- sufficiently large power of 2
local stack_table_index = {}
luatexja.stack_table_index = stack_table_index
userid_table.STCK = luatexbase.newuserwhatsitid('stack_marker', 'luatexja') -- スタック管理
userid_table.BPAR = luatexbase.newuserwhatsitid('begin_par', 'luatexja') -- 「段落始め」
userid_table.DIR = luatexbase.newuserwhatsitid('direction', 'luatexja') -- 組方向
+userid_table.BOXB = luatexbase.newuserwhatsitid('box_boundary', 'luatexja') -- 「ボックス始め・終わり」
local dir_table = {}
luatexja.dir_table = dir_table
load_module('charrange'); local ltjc = luatexja.charrange
load_module('stack'); local ltjs = luatexja.stack
load_module('direction'); local ltjd = luatexja.direction -- +1 hlist +1 attr_list
+load_module('lineskip'); local ltjl = luatexja.lineskip -- +1 hlist +1 attr_list
load_module('jfont'); local ltjf = luatexja.jfont
load_module('inputbuf'); local ltji = luatexja.inputbuf
load_module('pretreat'); local ltjp = luatexja.pretreat
load_module('setwidth'); local ltjw = luatexja.setwidth
load_module('jfmglue'); local ltjj = luatexja.jfmglue -- +1 glue +1 gs +1 attr_list
load_module('math'); local ltjm = luatexja.math
-load_module('tangle'); local ltjb = luatexja.base
+load_module('base'); local ltjb = luatexja.base
local attr_jchar_class = luatexbase.attributes['ltj@charclass']
-- EXT: print parameters that don't need arguments
do
+ local tex_getattr = tex.getattribute
+ local function getattr(a)
+ local r = tex.getattribute(a)
+ return (r==-0x7FFFFFFF) and 0 or r
+ end
luatexja.unary_pars = {
yalbaselineshift = function(t)
- return print_scaled(tex.getattribute('ltj@yablshift'))..'pt'
+ return print_scaled(getattr('ltj@yablshift'))..'pt'
end,
yjabaselineshift = function(t)
- return print_scaled(tex.getattribute('ltj@ykblshift'))..'pt'
+ return print_scaled(getattr('ltj@ykblshift'))..'pt'
end,
talbaselineshift = function(t)
- return print_scaled(tex.getattribute('ltj@tablshift'))..'pt'
+ return print_scaled(getattr('ltj@tablshift'))..'pt'
end,
tjabaselineshift = function(t)
- return print_scaled(tex.getattribute('ltj@tkblshift'))..'pt'
+ return print_scaled(getattr('ltj@tkblshift'))..'pt'
end,
kanjiskip = function(t)
return print_spec(ltjs.get_stack_skip(stack_table_index.KSK, t))
return ltjs.get_stack_table(stack_table_index.JWP, 0, t)
end,
autospacing = function(t)
- return tex.getattribute('ltj@autospc')
+ return getattr('ltj@autospc')
end,
autoxspacing = function(t)
- return tex.getattribute('ltj@autoxspc')
+ return getattr('ltj@autoxspc')
end,
differentjfm = function(t)
local f, r = luatexja.jfmglue.diffmet_rule, '???'
do
luatexja.binary_pars = {
jacharrange = function(c, t)
- if type(c)~='number' or c<0 or c>31*ltjc.ATTR_RANGE then
- -- 0 はエラーにしない(隠し)
+ if type(c)~='number' or c<-1 or c>31*ltjc.ATTR_RANGE then
+ -- 0, -1 はエラーにしない(隠し)
ltjb.package_error('luatexja',
'invalid character range number (' .. tostring(c) .. ')',
'A character range number should be in the range 1..'
end
+-- lastnodechar
+do
+ local id_glyph = node.id('glyph')
+ function luatexja.pltx_composite_last_node_char()
+ local n = tex.nest[tex.nest.ptr].tail
+ local r = '-1'
+ if n then
+ if n.id==id_glyph then
+ while n.componetns and n.subtype and n.subtype%4 >= 2 do
+ n = node.tail(n)
+ end
+ r = tostring(n.char)
+ end
+ end
+ tex.sprint(r)
+ end
+end
+
-- debug
do
local base = prefix .. string.format('%X', get_attr_icflag(p))
.. ' ' .. pt .. ' ' .. tostring(p.subtype) .. ' '
if pt == 'glyph' then
- s = base .. ' ' .. utf.char(p.char) .. ' '
- .. tostring(p.font)
- .. ' (' .. print_scaled(p.height) .. '+'
+ s = base .. ' ' ..
+ (p.char>=0xF0000 and string.format('(U+%X)', p.char) or utf.char(p.char)) .. ' '
+ .. tostring(p.font) .. ' (' .. print_scaled(p.height) .. '+'
.. print_scaled(p.depth) .. ')x' .. print_scaled(p.width)
+ if p.xoffset~=0 or p.yoffset~=0 then
+ s = s .. ' off: (' .. print_scaled(p.xoffset)
+ .. ',' .. print_scaled(p.yoffset) .. ')'
+ end
print_fn(s)
elseif pt=='hlist' or pt=='vlist' or pt=='unset'or pt=='ins' then
if pt=='ins' then
s = s .. ' (for accent)'
elseif get_attr_icflag(p)==icflag_table.IC_PROCESSED then
s = s .. ' (italic correction)'
+ elseif get_attr_icflag(p)==icflag_table.LINEEND then
+ s = s .. ' (end-of-line)'
-- elseif get_attr_icflag(p)==ITALIC then
-- s = s .. ' (italic correction)'
elseif get_attr_icflag(p)>icflag_table.KINSOKU
elseif pt=='noad' then
s = base ; print_fn(s)
if p.nucleus then
- prefix = k .. 'N'; debug_show_node_X(p.nucleus, print_fn);
+ prefix = k .. 'N'; debug_show_node_X(p.nucleus, print_fn, limit);
end
if p.sup then
- prefix = k .. '^'; debug_show_node_X(p.sup, print_fn);
+ prefix = k .. '^'; debug_show_node_X(p.sup, print_fn, limit);
end
if p.sub then
- prefix = k .. '_'; debug_show_node_X(p.sub, print_fn);
+ prefix = k .. '_'; debug_show_node_X(p.sub, print_fn, limit);
end
prefix = k;
elseif pt=='math_char' then