local cat_lp = luatexbase.catcodetables['latex-package']
--------------------
+luatexja.base = {}
local public_name = 'luatexja'
local public_version = 'alpha'
+luatexja.base.public_name = public_name
+luatexja.base.public_version = public_version
+
-------------------- Fully-expandable error messaging
local _error_set_break, _error_set_message, _error_show
end
return tex.print(unpack(lines))
end
+luatexja.base.mprint = mprint
-------------------- Handling of TeX values
-local to_dimen, to_skip, dump_skip
-
do
local glue_spec_id = node.id("glue_spec")
end
--! ixbase.to_dimen() と同じ
- to_dimen = function (val)
+ local function to_dimen(val)
if val == nil then
return 0
elseif type(val) == "number" then
end
--! ixbase.to_skip() と同じ
- to_skip = function (val)
+ local function to_skip(val)
if type(val) == "userdata" then
return val
end
return res
end
- dump_skip = function (s)
+ local function dump_skip(s)
print(("%s+%s<%s>-%s<%s>"):format(
s.width or 0, s.stretch or 0, s.stretch_order or 0,
s.shrink or 0, s.shrink_order or 0))
end
+ luatexja.base.to_dimen = to_dimen
+ luatexja.base.dump_skip = dump_skip
+ luatexja.base.to_skip = to_skip
end
--------------------- Virtual table for LaTeX counters
-local counter
+-------------------- Virtual table for LaTeX counters
+-- not used in current LuaTeX-ja
do
--! ixbase.counter と同じ
counter = {}
function mt_counter.__newindex(tbl, key, val)
tex.count['c@'..key] = val
end
+ luatexja.base.counter = counter
--! ixbase.length は tex.skip と全く同じなので不要.
end
-------------------- Number handling in TeX source
-local scan_brace, scan_number
-
do
local tok_escape = token.create("ltj@@q@escape")
ltb.add_to_callback("token_filter", proc, "ltj@grab@num", 1)
end
- scan_brace = function ()
+ local function scan_brace()
scan_with(1, function()
local next = token.get_next()
if next[1] == 1 then
end)
end
- scan_number = function ()
+ local function scan_number()
scan_with(1, function()
local next = get_expd_next()
local res, ok = { tok_num }, false
end)
end
+ luatexja.base.scan_brace = scan_brace
+ luatexja.base.scan_number = scan_number
end
+
-------------------- TeX register allocation
-local const_number, count_number, attribute_number, dimen_number, skip_number
+-- not used in current LuaTeX-ja
do
local cmod_base_count = token.create('ltj@@count@zero')[2]
local cmod_base_dimen = token.create('ltj@@dimen@zero')[2]
local cmod_base_skip = token.create('ltj@@skip@zero')[2]
- const_number = function (name)
+ local function const_number(name)
if name:sub(1, 1) == '\\' then name = name:sub(2) end
return token.create(name)[2]
end
- count_number = function (name)
+ local function count_number(name)
if name:sub(1, 1) == '\\' then name = name:sub(2) end
return token.create(name)[2] - cmod_base_count
end
- attribute_number = function (name)
+ local function attribute_number(name)
if name:sub(1, 1) == '\\' then name = name:sub(2) end
return token.create(name)[2] - cmod_base_attr
end
- dimen_number = function (name)
+ local function dimen_number(name)
if name:sub(1, 1) == '\\' then name = name:sub(2) end
return token.create(name)[2] - cmod_base_dimen
end
- skip_number = function (name)
+ local function skip_number(name)
if name:sub(1, 1) == '\\' then name = name:sub(2) end
return token.create(name)[2] - cmod_base_skip
end
+ luatexja.base.const_number = const_number
+ luatexja.base.count_number = count_number
+ luatexja.base.attribute_number = attribute_number
+ luatexja.base.dimen_number = dimen_number
+ luatexja.base.skip_number = skip_number
end
--------------------- mock of debug logger
+-------------------- mock of debug logger
if not debug or debug == _G.debug then
local function no_op() end
debug = no_op
cstemp = token.csname_name(token.get_next())
tex.sprint(cat_lp,'\\' .. s)
end
+luatexja.base.get_cs = get_cs
+-------------------- common error message
+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)
+ .. ' and 0x10ffff.\n'
+ .. (admit_math and "(-1 is used for denoting `math boundary')\n" or '')
+ .. 'So I changed this one to zero.'
+ package_error('luatexja',
+ 'bad character code (' .. tostring(c) .. ')', s)
+ c=0
+ end
+ return c
+ end
+ luatexja.base.in_unicode = in_unicode
+end
-------------------- cache management
-- load_cache (filename, outdate)
require('lualibs-lpeg') -- string.split
require('lualibs-os') -- os.type
-local load_cache, save_cache_luc, save_cache
-
do
local kpse_var_value = kpse.var_value
local path, pathtmp = kpse_var_value("TEXMFVAR")
return result
end
end
+
load_cache = function (filename, outdate)
local r = load_cache_a(filename .. luc_suffix, outdate)
if r then
end
end
+ luatexja.base.load_cache = load_cache
+ luatexja.base.save_cache_luc = save_cache_luc
+ luatexja.base.save_cache = save_cache
end
+luatexja.base._error_set_break = _error_set_break
+luatexja.base._error_set_message = _error_set_message
+luatexja.base._error_show = _error_show
+luatexja.base._generic_warn_info = _generic_warn_info
+
+luatexja.base.package_error = package_error
+luatexja.base.package_warning = package_warning
+luatexja.base.package_warning_no_line = package_warning_no_line
+luatexja.base.package_info = package_info
+luatexja.base.package_info_no_line = package_info_no_line
+
+luatexja.base.generic_error = generic_error
+luatexja.base.generic_warning = generic_warning
+luatexja.base.generic_warning_no_line = generic_warning_no_line
+luatexja.base.generic_info = generic_info
+luatexja.base.generic_info_no_line = generic_info_no_line
+
+luatexja.base.ltj_warning_no_line = ltj_warning_no_line
+luatexja.base.ltj_error = ltj_error
+
+luatexja.base.debug = debug
+luatexja.base.package_debug = package_debug
+luatexja.base.debug_logger = debug_logger
+luatexja.base.show_term = show_term
+luatexja.base.show_log = show_log
-luatexja.base = {
- public_name = public_name,
- public_version = public_version,
- --
- _error_set_break = _error_set_break,
- _error_set_message = _error_set_message,
- _error_show = _error_show,
- _generic_warn_info = _generic_warn_info,
- --
- package_error = package_error,
- package_warning = package_warning,
- package_warning_no_line = package_warning_no_line,
- package_info = package_info,
- package_info_no_line = package_info_no_line,
- --
- generic_error = generic_error,
- generic_warning = generic_warning,
- generic_warning_no_line = generic_warning_no_line,
- generic_info = generic_info,
- generic_info_no_line = generic_info_no_line,
- --
- ltj_warning_no_line = ltj_warning_no_line,
- ltj_error = ltj_error,
- --
- mprint = mprint,
- --
- to_dimen = to_dimen,
- dump_skip = dump_skip,
- to_skip = to_skip,
- --
- counter = counter,
- --
- scan_brace = scan_brace,
- scan_number = scan_number,
- --
- const_number = const_number,
- count_number = count_number,
- attribute_number = attribute_number,
- dimen_number = dimen_number,
- skip_number = skip_number,
- --
- get_cs = get_cs,
- --
- load_cache = load_cache,
- save_cache_luc = save_cache_luc,
- save_cache = save_cache,
- --
- debug = debug,
- package_debug = package_debug,
- debug_logger = debug_logger,
- show_term = show_term,
- show_log = show_log,
- --
-}
-------------------- all done
-- EOF
end
function char_to_range(c) -- return the external range number
- if not c or c<0 or c>0x10FFFF then
- ltjb.package_error('luatexja',
- 'bad character code (' .. tostring(c) .. ')',
- 'A character number must be between 0 and 0x10ffff.\n' ..
- 'So I changed this one to zero.')
- return -1
- elseif c<0x80 then return -1
+ c=ltjb.in_unicode(c, false)
+ if c<0x80 then return -1
else
local r = jcr_table_main[c] or 217
return (r and r~=0) and r or 217
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 = 2
end
end
+luatexja.binary_pars.kansujichar = function(c, t)
+ if type(c)~='number' or c<0 or c>9 then
+ ltjb.package_error('luatexja',
+ 'Invalid KANSUJI number (' .. tostring(c) .. ')',
+ 'A KANSUJI number should be in the range 0..9.\n'..
+ 'So I changed this one to zero.')
+ c=0
+ end
+ return ltjs.get_penalty_table(stack_table_index.KSJ + c, 0, t)
+end
+
+
local t = {
from_euc = from_euc,
from_kuten = from_kuten,
tostring(ub) .. ".\n" ..
"I'm going to use 0 instead of that illegal code value.")
p=0
- elseif type(c)~='number' or c<-1 or c>0x10ffff then
- ltjb.package_error('luatexja',
- 'bad character code (' .. tostring(c) .. ')',
- 'A character number must be between -1 and 0x10ffff.\n' ..
- "(-1 is used for denoting `math boundary')\n" ..
- 'So I changed this one to zero.')
- c=0
end
+ c = ltjb.in_unicode(c, true)
charprop_stack_table[i][c+m] = p
if g=='global' then
for j,v in pairs(charprop_stack_table) do
\ltjsetparameter{kansujichar={7,`七}}
\ltjsetparameter{kansujichar={8,`八}}
\ltjsetparameter{kansujichar={9,`九}}
+\ltj@@decl@array@param{kansujichar}
\ifltj@in@latex
\newcommand\printglossary{\@input@{\jobname.gls}}
}
\protected\def\ltj@setpar@global{%
- \ifnum\globaldefs>0\directlua{luatexja.isglobal='global'}\else\directlua{luatexja.isglobal=''}\fi
+ \ifnum\globaldefs>0\directlua{luatexja.isglobal='global'}%
+ \else\directlua{luatexja.isglobal=''}\fi
}
\protected\def\ltjsetparameter#1{%
\ltj@setpar@global\setkeys[ltj]{japaram}{#1}\ignorespaces}
\protected\def\ltjglobalsetparameter#1{%
- \ifnum\globaldefs<0\directlua{luatexja.isglobal=''}\else\directlua{luatexja.isglobal='global'}\fi
+ \ifnum\globaldefs<0\directlua{luatexja.isglobal=''}%
+ \else\directlua{luatexja.isglobal='global'}\fi%
\setkeys[ltj]{japaram}{#1}\ignorespaces}
%%%%%%%% \ltjgetparameter
local unary_pars = luatexja.unary_pars
function luatexja.ext_get_parameter_unary(k)
- local t = tex.getcount('ltj@@stack')
if unary_pars[k] then
tex.write(tostring(unary_pars[k](tex.getcount('ltj@@stack'))))
end
-- EXT: print parameters that need arguments
-function luatexja.ext_get_parameter_binary(k,c)
- local t = tex.getcount('ltj@@stack')
- if type(c)~='number' then
- ltjb.package_error('luatexja',
- 'invalid the second argument (' .. tostring(c) .. ')',
- 'I changed this one to zero.')
- c=0
- end
- if k == 'jacharrange' then
- if c<=0 or c>31*ltjc.ATTR_RANGE then
- ltjb.package_error('luatexja',
- 'invalid character range number (' .. c .. ')',
- 'A character range number should be in the range 1..'
- .. 31*ltjc.ATTR_RANGE .. ",\n"..
- 'So I changed this one to ' .. 31*ltjc.ATTR_RANGE .. ".")
- c=0 -- external range 217 == internal range 0
- elseif c==31*ltjc.ATTR_RANGE then c=0
- end
+do
+ luatexja.binary_pars = {
+ jacharrange = function(c, t)
+ if type(c)~='number' or c<0 or c>31*ltjc.ATTR_RANGE then
+ -- 0 はエラーにしない(隠し)
+ ltjb.package_error('luatexja',
+ 'invalid character range number (' .. tostring(c) .. ')',
+ 'A character range number should be in the range 1..'
+ .. 31*ltjc.ATTR_RANGE .. ",\n"..
+ 'So I changed this one to ' .. 31*ltjc.ATTR_RANGE .. ".")
+ c=0 -- external range 217 == internal range 0
+ elseif c==31*ltjc.ATTR_RANGE then c=0
+ end
-- 負の値は <U+0080 の文字の文字範囲,として出てくる.この時はいつも欧文文字なので 1 を返す
- tex.write( (c<0) and 1 or ltjc.get_range_setting(c))
- else
- if c<0 or c>0x10FFFF then
- ltjb.package_error('luatexja',
- 'bad character code (' .. c .. ')',
- 'A character number must be between -1 and 0x10ffff.\n'..
- "(-1 is used for denoting `math boundary')\n"..
- 'So I changed this one to zero.')
- c=0
- end
- if k == 'prebreakpenalty' then
- tex.write(ltjs.get_penalty_table(stack_table_index.PRE + c, 0, t))
- elseif k == 'postbreakpenalty' then
- tex.write(ltjs.get_penalty_table(stack_table_index.POST+ c, 0, t))
- elseif k == 'kcatcode' then
- tex.write(ltjs.get_penalty_table(stack_table_index.KCAT+ c, 0, t))
- elseif k == 'chartorange' then
- tex.write(ltjc.char_to_range(c))
- elseif k == 'jaxspmode' or k == 'alxspmode' then
- tex.write(ltjs.get_penalty_table(stack_table_index.XSP + c, 3, t))
+ return (c<0) and 1 or ltjc.get_range_setting(c)
+ end,
+ prebreakpenalty = function(c, t)
+ return ltjs.get_penalty_table(stack_table_index.PRE
+ + ltjb.in_unicode(c, true), 0, t)
+ end,
+ postbreakpenalty = function(c, t)
+ return ltjs.get_penalty_table(stack_table_index.POST
+ + ltjb.in_unicode(c, true), 0, t)
+ end,
+ kcatcode = function(c, t)
+ return ltjs.get_penalty_table(stack_table_index.KCAT
+ + ltjb.in_unicode(c, false), 0, t)
+ end,
+ chartorange = function(c, t)
+ return ltjc.char_to_range(ltjb.in_unicode(c, false))
+ end,
+ jaxspmode = function(c, t)
+ return ltjs.get_penalty_table(stack_table_index.XSP
+ + ltjb.in_unicode(c, true), 3, t)
+ end,
+ }
+ local binary_pars = luatexja.binary_pars
+
+ 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'))))
end
end
end
\DeclareFontShape{JY3}{mc}{x}{n}{<-> s*[0.962216]
psft:Ryumin-Light:extend=1.5;jfm=ujisx50}{}
\DeclareFontShape{JY3}{gt}{m}{sl}{<-> s*[0.962216]
- file:ipag.ttf:slant=0.25;jfm=ujiso25}{}
+ file:ipam.ttf:slant=0.25;jfm=ujiso25}{}
\DeclareFontShape{JY3}{gt}{x}{n}{<-> s*[0.962216]
file:ipag.ttf:extend=1.5;jfm=ujisx50}{}
\ltjsetparameter{yalbaselineshift=3pt}
\dimen255=\yabls\relax\the\dimen255
+\char\ltjgetparameter{kansujichar}{0}
+\char\ltjgetparameter{kansujichar}{1}
+\char\ltjgetparameter{kansujichar}{2}
+\char\ltjgetparameter{kansujichar}{3}
+\char\ltjgetparameter{kansujichar}{4}
+\char\ltjgetparameter{kansujichar}{5}
+\char\ltjgetparameter{kansujichar}{6}
+\char\ltjgetparameter{kansujichar}{7}
+\char\ltjgetparameter{kansujichar}{8}
+\char\ltjgetparameter{kansujichar}{9}
+
\medskip
{\tengt ■compat: kansuji}
\kansuji{1}\
{\tengt ■globaldefs}
abc\ltjgetparameter{yalbaselineshift}
-{\globaldefs1\ltjsetparameter{yalbaselineshift=2pt}}% global (by \globaldefs)
+{\globaldefs1 \ltjsetparameter{yalbaselineshift=2pt}}% global (by \globaldefs)
\ltjgetparameter{yalbaselineshift}
{\ltjglobalsetparameter{yalbaselineshift=1pt}}% global (explicit)
\ltjgetparameter{yalbaselineshift}
-{\ltjglobalsetparameter{yalbaselineshift=4pt}}% local
+{\ltjsetparameter{yalbaselineshift=4pt}}% local
+\ltjgetparameter{yalbaselineshift}
+{\globaldefs-4 \ltjglobalsetparameter{yalbaselineshift=-5pt}}% local (by \globaldefs)
\ltjgetparameter{yalbaselineshift}
+a
\end
\ltjgetparameter{jacharrange}{2}
\head{文字コード→文字範囲}
+\ltjgetparameter{chartorange}{`A} % must be 6
\ltjgetparameter{chartorange}{`い} % must be 6
\ltjgetparameter{chartorange}{`§} % must be 8
\ltjgetparameter{chartorange}{"F7} % must be 9
\ltjgetparameter{chartorange}{-1} % must be error "
+\ltjgetparameter{chartorange}{"CFFFF} % must be 217"
\medskip
\ltjsetparameter{jacharrange={-217}}
-ほとんど欧文扱い.2番は別(「あ」)
+あ\char"CFFFFあ
+\ltjgetparameter{jacharrange}{\ltjgetparameter{chartorange}{"CFFFF}}←CFFFF欧文扱い
\ltjsetparameter{jacharrange={218}}
-和文扱いにもどる
+あ\char"CFFFFあ
+\ltjgetparameter{jacharrange}{\ltjgetparameter{chartorange}{"CFFFF}}←CFFFF和文扱い
\head{Ticket \#25121}
\setbox0=\hbox{\ltjsetparameter{kanjiskip=-5pt}
$Aあ\kern2pt\vrule width 0.4pt height 10pt depth 10pt
\kern-2pt\vrule width 4pt height 0.4pt depth 0pt
\hbox{\vrule width 20pt height 0.4pt depth 0pt\kern-20pt Bい}$
- \vrule width 20pt height 0.4pt depth 0pt\par
+ \vrule width 20pt height 0.4pt depth 0pt
}
\baselineskip=40pt
-\R{ 0pt}{ 0pt}\D
-\R{ 0pt}{10pt}\D
-\R{10pt}{ 0pt}\D
-\R{10pt}{ 5pt}\D
+\R{ 0pt}{ 0pt}\D\par
+\R{ 0pt}{10pt}\D\par
+\R{10pt}{ 0pt}\D\par
+\R{ 0pt}{10pt}\D\hfil\break
+\setbox0=\hbox{\D}\vrule width 20pt height 0.4pt depth 0pt
+\ltjsetparameter{yalbaselineshift=-10pt}
+abc\unhcopy0\vrule width 20pt height 0.4pt depth 0pt\par
+
+
\end