X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=src%2Fluatexja-core.sty;h=ba13695352b1da54cc9a4bf5a691c94d04d5bec5;hb=f078ac2f7998a102c7ec765e725f2269eed9f872;hp=cfad949ec584b260ef075f6464bb9fe99fe9fa12;hpb=226621d9c6cf5ed22f7a52fd8c5a31903d20c34b;p=luatex-ja%2Fluatexja.git diff --git a/src/luatexja-core.sty b/src/luatexja-core.sty index cfad949..ba13695 100644 --- a/src/luatexja-core.sty +++ b/src/luatexja-core.sty @@ -65,7 +65,7 @@ \expandafter\let\csname ifltj@in@latex\expandafter\endcsname \csname iftrue\endcsname \NeedsTeXFormat{LaTeX2e} - \ProvidesPackage{luatexja-core}[2015/05/03 Core of LuaTeX-ja] + \ProvidesPackage{luatexja-core}[2017/11/12 Core of LuaTeX-ja] \fi % %% Load prerequisite packages. @@ -73,13 +73,17 @@ \newif\ifltj@everyhook@avail\ltj@everyhook@availfalse %! 外部パッケージは普通の \endlinechar で読まないと危険. \ifltj@in@latex %<*LaTeX> - \RequirePackage{luaotfload} [2013/12/31] % v2.3 + \RequirePackage{luatexbase} + \RequirePackage{luaotfload} \RequirePackage{ltxcmds} [2011/11/09] % v1.22 \RequirePackage{pdftexcmds} [2011/11/29] % v0.20 \RequirePackage{xkeyval} [2012/10/14] % v2.6b \RequirePackage{atbegshi} + \RequirePackage{etoolbox} + \AtBeginShipoutInit \IfFileExists{everyhook.sty}{\RequirePackage{everyhook}\ltj@everyhook@availtrue}{} \else %<*!LaTeX> + \input luatexbase.sty \input luaotfload.sty \input ltxcmds.sty \input pdftexcmds.sty @@ -92,33 +96,31 @@ %% Check if LuaTeX is used \ltx@LocalExpandAfter\ifx\csname directlua\endcsname\relax % Loading is silently aborted, since the notice of the wrong - % engine is aldready shown in otfluaload. + % engine is already shown in luaotfload. \ltj@core@AtEnd \expandafter\endinput\fi\relax %% Check LuaTeX version. -\ifnum\luatexversion<74 +\ifnum\luatexversion<100 \@PackageError{luatexja-core} {This LuaTeX engine is too old for this package;\MessageBreak - at least beta-0.74.0 is needed} + at least 1.0.0 is needed} {Package loading is aborted now.\MessageBreak} \expandafter\endinput\fi\relax -%! なお、luatexbase-compat の説明に従うと、LuaTeX 拡張プリミティブは -%! plain/LaTeX の両方で \luatex 付の名前(\directlua はそのまま) -%! で使えると考えてよい。 - %% \LuaTeXjaAvailable %! 環境検査にパスした時に定義される. \let\LuaTeXjaAvailable=t % %%------------------ \endlinechar=13 -%! この中に master の luatexja-core.sty の内容を挿入する + %! ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ % LuaTeX-ja core TeX source -\catcode"FFFFF=14 %" +\newcount\ltjlineendcomment +\ltjlineendcomment="FFFFF +\catcode\ltjlineendcomment=14 %" \def\ltj@loaded{hoge} @@ -132,25 +134,24 @@ \def\ltj@defdimen{0} %%%%%%%% Attributes for Japanese typesetting. -\newluatexattribute\ltj@icflag % attribute for italic correction -\newluatexattribute\ltj@curjfnt % index for ``current horizontal Japanese font'' -\newluatexattribute\ltj@curtfnt % index for ``current vertical Japanese font'' -\newluatexattribute\ltj@origchar % -\newluatexattribute\ltj@charclass % -\newluatexattribute\ltj@charcode % -\newluatexattribute\ltj@autospc % attribute for autospacing -\newluatexattribute\ltj@autoxspc % attribute for autoxspacing -\newluatexattribute\ltj@yablshift % attribute for yalbaselineshift -\newluatexattribute\ltj@ykblshift % attribute for yjabaselineshift -\newluatexattribute\ltj@tablshift % attribute for talbaselineshift -\newluatexattribute\ltj@tkblshift % attribute for tjabaselineshift -\newluatexattribute\jfam % index for current jfam - -\newluatexattribute\ltj@dir +\newattribute\ltj@icflag % attribute for italic correction +\newattribute\ltj@curjfnt % index for ``current horizontal Japanese font'' +\newattribute\ltj@curtfnt % index for ``current vertical Japanese font'' +\newattribute\ltj@charclass % +\newattribute\ltj@charcode % +\newattribute\ltj@autospc % attribute for autospacing +\newattribute\ltj@autoxspc % attribute for autoxspacing +\newattribute\ltj@yablshift % attribute for yalbaselineshift +\newattribute\ltj@ykblshift % attribute for yjabaselineshift +\newattribute\ltj@tablshift % attribute for talbaselineshift +\newattribute\ltj@tkblshift % attribute for tjabaselineshift +\newattribute\jfam % index for current jfam +\newattribute\ltj@vert@ori % <=0: UAX#50, >0: always upright + +\newattribute\ltj@dir \newlanguage\ltj@@japanese \ltj@dir\z@ \ltj@icflag\z@ -\ltj@origchar\z@ \ltj@charclass\z@ \ltj@curjfnt\m@ne \ltj@curtfnt\m@ne @@ -159,7 +160,7 @@ \newcount\ltj@tempcnta \ltj@tempcnta\z@ \loop\ifnum\ltj@tempcnta<7 - \expandafter\newluatexattribute% + \expandafter\newattribute% \csname ltj@kcat\the\ltj@tempcnta\endcsname \csname ltj@kcat\the\ltj@tempcnta\endcsname=0 \advance\ltj@tempcnta\@ne @@ -184,13 +185,12 @@ \def\RequireLuaTeXjaSubmodule#1{% \@ifnextchar[{\ltj@requirelua@submod{#1}}{\ltj@requirelua@submod{#1}[]}} \def\ltj@requirelua@submod#1[#2]{% - \directlua{luatexja.load_module( - "\luatexluaescapestring{#1}")}} + \directlua{luatexja.load_module("\luatexluaescapestring{#1}")}} %%%%%%%% Load all sub-packages. \ifltj@in@latex %<*LaTeX> - \RequirePackage{ltj-base} [2013/05/14] + \RequirePackage{ltj-base} \else %<*!LaTeX> \input ltj-base.sty % \fi % @@ -199,32 +199,64 @@ \def\asluastring#1{'\luatexluaescapestring{\detokenize{#1}}'} %%%%%%%% Redefine \/ -\protected\def\/{\relax\directlua{luatexja.jfont.append_italic()}} +\newluafunction\ltj@@italic@inner +\directlua{ + local t = lua.get_functions_table() + t[\the\ltj@@italic@inner] = luatexja.jfont.append_italic +} +\protected\def\/{\relax\luafunction\ltj@@italic@inner} %%%%%%%% \jfont\CS={...:...;jfm=metric;...}, \globaljfont \protected\def\jfont#1{% \afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(false, 'yoko','\luatexluaescapestring{\noexpand#1}')}} \protected\def\globaljfont#1{% \afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(true, 'yoko','\luatexluaescapestring{\noexpand#1}')}} -\def\ltj@@jfont{\directlua{luatexja.jfont.jfontdefY()}} +\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} %%%%%%%% \tfont\CS={...:...;jfm=metric;...}, \globaltfont \protected\def\tfont#1{% - \afterassignment\ltj@@tfont\directlua{luatexja.jfont.jfontdefX(false, 'tate','\luatexluaescapestring{\noexpand#1}')}} + \afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(false, 'tate','\luatexluaescapestring{\noexpand#1}')}} \protected\def\globaltfont#1{% - \afterassignment\ltj@@tfont\directlua{luatexja.jfont.jfontdefX(true, 'tate','\luatexluaescapestring{\noexpand#1}')}} -\def\ltj@@tfont{\directlua{luatexja.jfont.jfontdefY()}} + \afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(true, 'tate','\luatexluaescapestring{\noexpand#1}')}} %%%%%%%% \zw, \zh -\protected\def\zw{\directlua{tex.setdimen('ltj@zw', luatexja.jfont.get_zw())}\ltj@zw} -\protected\def\zh{\directlua{tex.setdimen('ltj@zh', luatexja.jfont.get_zh())}\ltj@zh} +\newluafunction\ltj@zw@inner +\newluafunction\ltj@zh@inner +\directlua{ + local t, setdimen, ltjf = lua.get_functions_table(), tex.setdimen, luatexja.jfont + t[\the\ltj@zw@inner] = function() setdimen('ltj@zw', ltjf.get_zw()) end + t[\the\ltj@zh@inner] = function() setdimen('ltj@zh', ltjf.get_zh()) end +} +\protected\def\zw{\luafunction\ltj@zw@inner\ltj@zw} +\protected\def\zh{\luafunction\ltj@zh@inner\ltj@zh} %%%%%%%% \inhibitglue -\protected\def\ltj@reset@globaldefs{% - \directlua{luatexja.global_temp = tex.globaldefs; tex.globaldefs = 0}} -\protected\def\ltj@restore@globaldefs{\directlua{tex.globaldefs = luatexja.global_temp}\relax} -\protected\def\inhibitglue{\ifhmode\ltj@@ihb\fi} -\def\ltj@@ihb{\relax\directlua{luatexja.jfmglue.create_inhibitglue_node()}} +\newluafunction\ltj@reset@globaldefs@inner +\newluafunction\ltj@restore@globaldefs@inner +\newluafunction\ltj@@ihb@inner +\newluafunction\ltj@@fakeparbegin@inner +\newluafunction\ltj@@fakeboxbdd@inner +\directlua{ + local t = lua.get_functions_table() + 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@@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 +} +\protected\def\ltj@reset@globaldefs{\luafunction\ltj@reset@globaldefs@inner} +\protected\def\ltj@restore@globaldefs{\luafunction\ltj@restore@globaldefs@inner} +\protected\def\inhibitglue{\ifhmode\relax\luafunction\ltj@@ihb@inner\fi} +\protected\def\ltjfakeparbegin{\ifhmode\relax\luafunction\ltj@@fakeparbegin@inner\fi} +\protected\def\ltjfakeboxbdd{\ifhmode\relax\luafunction\ltj@@fakeboxbdd@inner\fi} + %%%%%%%% \ltjdefcharrange{100-200,3000-,5000,...} \protected\def\ltjdefcharrange#1#2{% @@ -299,16 +331,16 @@ % yjabaselineshift = \define@key[ltj]{japaram}{yalbaselineshift}{% \directlua{tex.setattribute(luatexja.isglobal, - luatexbase.attributes['ltj@yablshift'], luatexja.token.scan_dimen())}#1\relax} + luatexbase.attributes['ltj@yablshift'], token.scan_dimen())}#1\relax} \define@key[ltj]{japaram}{yjabaselineshift}{% \directlua{tex.setattribute(luatexja.isglobal, - luatexbase.attributes['ltj@ykblshift'], luatexja.token.scan_dimen())}#1\relax} + luatexbase.attributes['ltj@ykblshift'], token.scan_dimen())}#1\relax} \define@key[ltj]{japaram}{talbaselineshift}{% \directlua{tex.setattribute(luatexja.isglobal, - luatexbase.attributes['ltj@tablshift'], luatexja.token.scan_dimen())}#1\relax} + luatexbase.attributes['ltj@tablshift'], token.scan_dimen())}#1\relax} \define@key[ltj]{japaram}{tjabaselineshift}{% \directlua{tex.setattribute(luatexja.isglobal, - luatexbase.attributes['ltj@tkblshift'], luatexja.token.scan_dimen())}#1\relax} + luatexbase.attributes['ltj@tkblshift'], token.scan_dimen())}#1\relax} % jaxspmode = {, } % mode: inhibit, preonly, postonly, allow @@ -346,18 +378,22 @@ \fi} % [x]]kanjiskip = - \define@key[ltj]{japaram}{kanjiskip}{\ltjsetkanjiskip#1} - \define@key[ltj]{japaram}{xkanjiskip}{\ltjsetxkanjiskip#1} - \protected\def\ltjsetkanjiskip{% % SKIP - \directlua{% - local d = luatexja.token.scan_glue() - luatexja.stack.set_stack_skip(luatexja.stack_table_index.KSK, d); node.free(d) - }} - \protected\def\ltjsetxkanjiskip{% % SKIP - \directlua{% - local d = luatexja.token.scan_glue() - luatexja.stack.set_stack_skip(luatexja.stack_table_index.XSK, d); node.free(d) - }} +\define@key[ltj]{japaram}{kanjiskip}{\ltjsetkanjiskip#1} +\define@key[ltj]{japaram}{xkanjiskip}{\ltjsetxkanjiskip#1} +\newluafunction\ltjsetkanjiskip@inner +\newluafunction\ltjsetxkanjiskip@inner +\directlua{ + local t, scan_glue = lua.get_functions_table(), token.scan_glue + local sss, sti = luatexja.stack.set_stack_skip, luatexja.stack_table_index + t[\the\ltjsetkanjiskip@inner] = function() + local d = scan_glue(); sss(sti.KSK, d); node.free(d) + end + t[\the\ltjsetxkanjiskip@inner] = function() + local d = scan_glue(); sss(sti.XSK, d); node.free(d) + end +} +\protected\def\ltjsetkanjiskip{\luafunction\ltjsetkanjiskip@inner} +\protected\def\ltjsetxkanjiskip{\luafunction\ltjsetxkanjiskip@inner} % jcharwidowpenalty = \define@key[ltj]{japaram}{jcharwidowpenalty}{% %COUNT @@ -385,10 +421,10 @@ \define@key[ltj]{japaram}{jacharrange}{\expandafter\ltj@@scrange#1,,} \def\ltj@@scrange#1,{% \edef\ltj@temp{#1}% - \ifx\ltj@temp\empty\let\next=\relax\else\let\next=\ltj@@scrange + \ifx\ltj@temp\empty\let\ltj@@next=\relax\else\let\ltj@@next=\ltj@@scrange \directlua{luatexja.charrange.toggle_char_range(% luatexja.is_global,\ltj@safe@num@or{nil}{#1})}% - \fi\next + \fi\ltj@@next } \protected\def\ltj@setpar@global{% @@ -440,14 +476,20 @@ %%%%%%%% \ltjalchar, \ltjjachar \let\ltj@@origchar=\char -\protected\def\ltj@alljachar{\relax - \csname ltj@kcat0\endcsname\z@ - \csname ltj@kcat1\endcsname\z@ - \csname ltj@kcat2\endcsname\z@ - \csname ltj@kcat3\endcsname\z@ - \csname ltj@kcat4\endcsname\z@ - \csname ltj@kcat5\endcsname\z@ - \csname ltj@kcat6\endcsname\z@} +\newluafunction\ltj@alljachar@inner +\directlua{ + local t, set_attr = lua.get_functions_table(), tex.setattribute + local get_attr, floor = tex.getattribute, math.floor + local attr_curjfnt = luatexbase.attributes['ltj@curjfnt'] + local lang_ja = luatexja.lang_ja + 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) + end + end +} +\protected\def\ltj@alljachar{\luafunction\ltj@alljachar@inner} \protected\def\ltj@allalchar{\relax \csname ltj@kcat0\endcsname="7FFFFFFF %" \csname ltj@kcat1\endcsname="7FFFFFFF %" @@ -464,10 +506,10 @@ %%%%%%%% \ltjsetmathletter, \ltjunsetmathletter \protected\def\ltjsetmathletter#1{% - \directlua{luatexja.math.is_math_letters[luatexja.token.scan_int()]=true}#1\relax + \directlua{luatexja.math.is_math_letters[token.scan_int()]=true}#1\relax } \protected\def\ltjunsetmathletter#1{% - \directlua{luatexja.math.is_math_letters[luatexja.token.scan_int()]=false}#1\relax + \directlua{luatexja.math.is_math_letters[token.scan_int()]=false}#1\relax } %%%%%%%% \ltjdeclarealtfont{100-200,3000-,5000,...} @@ -537,7 +579,7 @@ \let\orig@insert=\insert \protected\def\insert{\begingroup\afterassignment\ltj@@insert@A\ltj@tempcnta} \protected\def\ltj@@insert@A{\orig@insert\ltj@tempcnta\bgroup - \aftergroup\ltj@@insert@B\let\next} + \aftergroup\ltj@@insert@B\let\ltj@@next} \protected\def\ltj@@insert@B{\directlua{luatexja.direction.populate_insertion_dir_whatsit()}\endgroup} %%%% vadjust @@ -545,50 +587,56 @@ \protected\def\vadjust{% \ltj@@orig@vadjust\bgroup \directlua{luatexja.direction.set_list_direction_hook('adj')}% - \aftergroup\ltj@@vadjust@check@dir\let\next} + \aftergroup\ltj@@vadjust@check@dir\let\ltj@@next} \protected\def\ltj@@vadjust@check@dir{% \directlua{luatexja.direction.check_adjust_direction()}% } %%%% \hbox, \vbox, \vtop \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.nest[tex.nest.ptr].mode }$% } \setbox\z@\box\voidb@x \ifltj@everyhook@avail% using everyhook package - \PushPreHook{hbox}{% - \directlua{luatexja.direction.set_list_direction_hook()}% - \aftergroup\ltj@@reset@badness - } - \PushPreHook{vbox}{% - \directlua{luatexja.direction.set_list_direction_hook()}% - \aftergroup\ltj@@reset@badness + \newluafunction\ltj@@box@dirhook + \directlua{ + local t, ltjd = lua.get_functions_table(), luatexja.direction + t[\the\ltj@@box@dirhook] + = function() ltjd.set_list_direction_hook() end } + \PushPreHook{hbox}{\luafunction\ltj@@box@dirhook\aftergroup\ltj@@reset@badness} + \PushPreHook{vbox}{\luafunction\ltj@@box@dirhook\aftergroup\ltj@@reset@badness} \else \let\ltj@@everyhbox=\everyhbox\let\ltj@@everyvbox=\everyvbox \newtoks\ltj@@i@everyhbox\newtoks\ltj@@i@everyvbox \let\everyhbox=\ltj@@i@everyhbox\let\everyvbox=\ltj@@i@everyvbox - \ltj@@everyhbox{% - \directlua{luatexja.direction.set_list_direction_hook()}% - \aftergroup\ltj@@reset@badness - \the\ltj@@i@everyhbox} - \ltj@@everyvbox{% - \directlua{luatexja.direction.set_list_direction_hook()}% - \aftergroup\ltj@@reset@badness - \the\ltj@@i@everyvbox} + \newluafunction\ltj@@box@dirhook + \directlua{ + local t, ltjd = lua.get_functions_table(), luatexja.direction + t[\the\ltj@@box@dirhook] + = function() ltjd.set_list_direction_hook() end + } + \ltj@@everyhbox{\luafunction\ltj@@box@dirhook + \aftergroup\ltj@@reset@badness\the\ltj@@i@everyhbox} + \ltj@@everyvbox{\luafunction\ltj@@box@dirhook + \aftergroup\ltj@@reset@badness\the\ltj@@i@everyvbox} \fi -\protected\def\ltj@@reset@badness{% - \directlua{% +\newluafunction\ltj@@reset@badness@inner +\directlua{ + local t = lua.get_functions_table() + t[\the\ltj@@reset@badness@inner] = function() if luatexja.global_temp then tex.hbadness= tex.hbadness or luatexja.hbadness_temp tex.vbadness= tex.vbadness or luatexja.vbadness_temp tex.globaldefs= luatexja.global_temp or tex.globaldefs end - }% -} + end} +\protected\def\ltj@@reset@badness{\luafunction\ltj@@reset@badness@inner} + \AtBeginShipout{\directlua{luatexja.direction.finalize()}} %%%% \raise, \lower, \moveleft, \moveright @@ -613,6 +661,9 @@ \ltj@@orig@moveleft\the\ltj@tempdima\noexpand\box\ltj@afbox }\ltj@afterbox\ltj@@moveleft@a} +%%%%\vsplit +\let\ltj@@orig@vsplit=\vsplit +\protected\def\vsplit{\directlua{luatexja.direction.vsplit()}} %%%% \vcenter \let\ltj@@orig@vcenter=\vcenter \protected\def\vcenter{\ltj@afterbox\ltj@@vcenter\vbox} @@ -654,11 +705,11 @@ %%%%%%%% \ltjgetwd etc. \def\ltj@@getwd{% - \directlua{luatexja.direction.get_box_dim('width', luatexja.token.scan_int())}} + \directlua{luatexja.direction.get_box_dim('width', token.scan_int())}} \def\ltj@@getht{% - \directlua{luatexja.direction.get_box_dim('height', luatexja.token.scan_int())}} + \directlua{luatexja.direction.get_box_dim('height', token.scan_int())}} \def\ltj@@getdp{% - \directlua{luatexja.direction.get_box_dim('depth', luatexja.token.scan_int())}} + \directlua{luatexja.direction.get_box_dim('depth', token.scan_int())}} \let\ltjgetwd=\ltj@@getwd\let\ltjgetht=\ltj@@getht\let\ltjgetdp=\ltj@@getdp %%%%%%%% \ltjsetwd= etc. @@ -666,18 +717,19 @@ \protected\def\ltjsetht{\directlua{luatexja.direction.set_box_dim('height')}} \protected\def\ltjsetdp{\directlua{luatexja.direction.set_box_dim('depth')}} + %%------------------ Load module for the format \ifltj@in@latex %<*LaTeX> - \RequirePackage{ltj-latex}[2013/05/14] + \RequirePackage{ltj-latex} \else\ifltj@in@plain %<*plain> \input ltj-plain.sty % \fi\fi % -\newluatexcatcodetable\ltj@temp@cctb +\newcatcodetable\ltj@temp@cctb \def\ltj@overwrite@catcodetable#1{% \setluatexcatcodetable\ltj@temp@cctb{\luatexcatcodetable#1}% - \setluatexcatcodetable#1{\luatexcatcodetable\ltj@temp@cctb\catcode"FFFFF=14}%" + \setluatexcatcodetable#1{\luatexcatcodetable\ltj@temp@cctb\catcode\ltjlineendcomment=14}%" } \ltj@overwrite@catcodetable\CatcodeTableLaTeX \ltj@overwrite@catcodetable\CatcodeTableLaTeXAtLetter