X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=src%2Fluatexja-core.sty;h=6e8ce432072c24679a8315f5b6a13517da0a1d81;hb=88f77f07b3417cf5e16878b9b3490a1de430e6fe;hp=d0a4a47fe437e47eada46d77cfc2d89ec1ea5fe2;hpb=c492b207170487ece36a80e1d0bc4e418fe99af9;p=luatex-ja%2Fluatexja.git diff --git a/src/luatexja-core.sty b/src/luatexja-core.sty index d0a4a47..6e8ce43 100644 --- a/src/luatexja-core.sty +++ b/src/luatexja-core.sty @@ -65,24 +65,27 @@ \expandafter\let\csname ifltj@in@latex\expandafter\endcsname \csname iftrue\endcsname \NeedsTeXFormat{LaTeX2e} - \ProvidesPackage{luatexja-core}[2014/02/01 Core of LuaTeX-ja] + \ProvidesPackage{luatexja-core}[2014/09/24 Core of LuaTeX-ja] \fi % %% Load prerequisite packages. \endlinechar=13 % +%%% \newif\ifltj@everyhook@avail\ltj@everyhook@availfalse %! 外部パッケージは普通の \endlinechar で読まないと危険. \ifltj@in@latex %<*LaTeX> \RequirePackage{luaotfload} [2013/05/10] % v2.2 - \RequirePackage{infwarerr} [2010/04/08] % v1.3 \RequirePackage{ltxcmds} [2011/11/09] % v1.22 \RequirePackage{pdftexcmds} [2011/11/29] % v0.20 \RequirePackage{xkeyval} [2012/10/14] % v2.6b + \RequirePackage{atbegshi} +%%% \IfFileExists{everyhook.sty}{\RequirePackage{everyhook}\ltj@everyhook@availtrue}{} \else %<*!LaTeX> \input luaotfload.sty - \input infwarerr.sty \input ltxcmds.sty \input pdftexcmds.sty \input xkeyval + \input atbegshi.sty + \AtBeginShipoutInit \fi % \endlinechar=-1 % @@ -101,11 +104,6 @@ {Package loading is aborted now.\MessageBreak} \expandafter\endinput\fi\relax - \@PackageInfoNoLine{luatexja-core} - {using\space% - \directlua{if node.direct==node then tex.write('traditional node') - else tex.write('DIRECT') end} node access model} - %! なお、luatexbase-compat の説明に従うと、LuaTeX 拡張プリミティブは %! plain/LaTeX の両方で \luatex 付の名前(\directlua はそのまま) %! で使えると考えてよい。 @@ -135,18 +133,26 @@ %%%%%%%% Attributes for Japanese typesetting. \newluatexattribute\ltj@icflag % attribute for italic correction -\newluatexattribute\ltj@curjfnt % index for ``current Japanese font'' -\newluatexattribute\ltj@origchar % +\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@autospc % attribute for autospacing \newluatexattribute\ltj@autoxspc % attribute for autoxspacing -\newluatexattribute\ltj@yablshift % attribute for \yabaselineshift -\newluatexattribute\ltj@ykblshift % attribute for \ykbaselineshift +\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 +\newlanguage\ltj@@japanese +\ltj@dir=0 \ltj@icflag=0 \ltj@origchar=0 \ltj@charclass=0 \ltj@curjfnt=-1 +\ltj@curtfnt=-1 %%%%%%%% Attributes for character ranges \newcount\ltj@tempcnta @@ -194,11 +200,20 @@ \protected\def\/{\relax\directlua{luatexja.jfont.append_italic()}} %%%%%%%% \jfont\CS={...:...;jfm=metric;...}, \globaljfont -\protected\def\jfont{\afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(false)}} +\protected\def\jfont{% + \afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(false, 'yoko')}} \protected\def\globaljfont{% - \afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(true)}} + \afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(true, 'yoko')}} \def\ltj@@jfont{\directlua{luatexja.jfont.jfontdefY()}} +%%%%%%%% \tfont\CS={...:...;jfm=metric;...}, \globaltfont +\protected\def\tfont{% + \afterassignment\ltj@@tfont\directlua{luatexja.jfont.jfontdefX(false, 'tate')}} +\protected\def\globaltfont{% + \afterassignment\ltj@@tfont\directlua{luatexja.jfont.jfontdefX(true, 'tate')}} +\def\ltj@@tfont{\directlua{luatexja.jfont.jfontdefY()}} + + %%%%%%%% \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} @@ -206,18 +221,10 @@ %%%%%%%% \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}} +\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()}} -%%%%%%%% \yoko, \tate, \ifydir, \iftdir -%% At this moment, tategaki mode is not implemented; -%% there is only yokogaki mode now. -\let\yoko\relax -\let\tate\relax -\newif\ifydir\ydirtrue -\newif\iftdir\tdirfalse - %%%%%%%% \ltjdefcharrange{100-200,3000-,5000,...} \protected\def\ltjdefcharrange#1#2{% {\ltj@tempcntc=#1 \expandafter\ltj@@dcrange#2,,}\ignorespaces} @@ -247,6 +254,11 @@ luatexja.stack.hmode = -tex.nest[tex.nest.ptr].mode }% } +\setbox0\vbox{% + \directlua{% This value depends on the version of LuaTeX. + luatexja.stack.vmode = -tex.nest[tex.nest.ptr].mode + }% +} % prebreakpenalty = {, } \define@key[ltj]{japaram}{kcatcode}{% @@ -260,6 +272,7 @@ \ltj@safe@num@or{nil}{#1},\ltj@safe@num@or{nil}{#2},#4,#5)}} % jatextfont = {, } +% only horizontal font is supported \define@key[ltj]{japaram}{jatextfont}{% \expandafter\ltj@@set@stackfont#1:{MJT}} \define@key[ltj]{japaram}{jascriptfont}{% @@ -291,6 +304,16 @@ \directlua{tex.setattribute(luatexja.isglobal, luatexbase.attributes['ltj@ykblshift'], \ltj@safe@dimen@or\ltj@defdimen{#1})}} +% talbaselineshift = +% tjabaselineshift = +\define@key[ltj]{japaram}{talbaselineshift}{% + \directlua{tex.setattribute(luatexja.isglobal, + luatexbase.attributes['ltj@tablshift'], + \ltj@safe@dimen@or\ltj@defdimen{#1})}} +\define@key[ltj]{japaram}{tjabaselineshift}{% + \directlua{tex.setattribute(luatexja.isglobal, + luatexbase.attributes['ltj@tkblshift'], + \ltj@safe@dimen@or\ltj@defdimen{#1})}} % jaxspmode = {, } % mode: inhibit, preonly, postonly, allow @@ -339,16 +362,19 @@ \fi} % [x]]kanjiskip = -\define@key[ltj]{japaram}{kanjiskip}{% % SKIP +\define@key[ltj]{japaram}{kanjiskip}{\ltjsetkanjiskip{#1}} +\define@key[ltj]{japaram}{xkanjiskip}{\ltjsetxkanjiskip{#1}} +\protected\def\ltjsetkanjiskip#1{% % SKIP \directlua{% local d = \ltj@safe@glue{#1} luatexja.stack.set_stack_skip(luatexja.stack_table_index.KSK, d); node.free(d) -}} -\define@key[ltj]{japaram}{xkanjiskip}{% % SKIP +}\ignorespaces} +\protected\def\ltjsetxkanjiskip#1{% % SKIP \directlua{% local d = \ltj@safe@glue{#1} luatexja.stack.set_stack_skip(luatexja.stack_table_index.XSK, d); node.free(d) -}} +}\ignorespaces} + % jcharwidowpenalty = \define@key[ltj]{japaram}{jcharwidowpenalty}{% %COUNT @@ -387,11 +413,17 @@ \else\directlua{luatexja.isglobal=''}\fi } \protected\def\ltjsetparameter#1{% - \ltj@setpar@global\setkeys[ltj]{japaram}{#1}\ignorespaces} + \directlua{luatexja.base.start_time_measure('set_par')}% + \ltj@setpar@global\setkeys[ltj]{japaram}{#1}% + \directlua{luatexja.base.stop_time_measure('set_par')}% + \ignorespaces} \protected\def\ltjglobalsetparameter#1{% \relax\ifnum\globaldefs<0\directlua{luatexja.isglobal=''}% \else\directlua{luatexja.isglobal='global'}\fi% - \setkeys[ltj]{japaram}{#1}\ignorespaces} + \directlua{luatexja.base.start_time_measure('set_par')}% + \setkeys[ltj]{japaram}{#1}% + \directlua{luatexja.base.stop_time_measure('set_par')}% + \ignorespaces} %%%%%%%% \ltjgetparameter \def\ltj@@decl@array@param#1{% @@ -404,7 +436,10 @@ \ltj@@decl@array@param{kcatcode} \ltj@@decl@array@param{jacharrange} \ltj@@decl@array@param{chartorange} +\ltj@@decl@array@param{boxdir} \def\ltjgetparameter#1{% + \directlua{luatexja.base.start_time_measure('get_par')}% + % stop call is moved in luatexja.lua \ifcsname ltj@@array@param/#1\endcsname \expandafter\ltx@firstoftwo \else @@ -414,7 +449,8 @@ {\ltj@@getparam@one{#1}}% } \def\ltj@@getparam@one#1{% - \directlua{luatexja.ext_get_parameter_unary('#1')}}% + \directlua{luatexja.ext_get_parameter_unary('#1')}% +}% \def\ltj@@getparam@two#1#2{% \directlua{luatexja.ext_get_parameter_binary('#1', \ltj@safe@num@or{nil}{#2})}% } @@ -456,18 +492,18 @@ %%%%%%%% \ltjdeclarealtfont{100-200,3000-,5000,...} % の 第 3 引数の文字達は で組む % いつも global -\def\ltj@@getjfontnumber#1{% result in \ltj@tempcntc +\def\ltj@@getjfontnumber#1{% result in \ltj@tempcntc \ltj@reset@globaldefs - \begingroup\ltj@curjfnt=-1\relax - #1\directlua{luatexja.__temp = \the\ltj@curjfnt}\endgroup + \begingroup\ltj@curjfnt=-1 \ltj@curtfnt=-1\relax + #1\directlua{luatexja.__temp = -(\the\ltj@curjfnt)*(\the\ltj@curtfnt)}\endgroup \ltj@tempcntc=\directlua{tex.sprint(luatexja.__temp)}\relax \ifnum\ltj@tempcntc=-1 \@PackageError{luatexja-core}% {\string#1 is not a control sequence that represents \MessageBreak - a Japanese font}{I'll use the current Japanese font instead.^^J}% + a Japanese font}{I'll use the current horizontal Japanese font instead.^^J}% \ltj@tempcntc=\ltj@curjfnt \fi\ltj@restore@globaldefs} - + \protected\def\ltjdeclarealtfont#1#2#3{% {\ltj@@getjfontnumber#1\@tempcnta=\ltj@tempcntc% \@tempcnta: 基底フォント \ltj@@getjfontnumber#2% @@ -497,6 +533,192 @@ \directlua{luatexja.jfont.clear_alt_font(\the\ltj@tempcntc)}}\ignorespaces} +%%%%%%%% \yoko, \tate,\dtou +\protected\def\tate{% + \directlua{luatexja.direction.set_list_direction(3, 'tate')}% +} +\protected\def\yoko{% + \directlua{luatexja.direction.set_list_direction(4, 'yoko')}% +} +\protected\def\dtou{% + \directlua{luatexja.direction.set_list_direction(1, 'dtou')}% +} +\protected\def\utod{% 「縦数式ディレクション」 + \directlua{luatexja.direction.set_list_direction(11, 'utod')}% +} +\define@key[ltj]{japaram}{direction}{%% always local + \directlua{luatexja.direction.set_list_direction(1, 'ltjsetparameter')}% +} + +\yoko + +%%%% insert +\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} +\protected\def\ltj@@insert@B{\directlua{luatexja.direction.populate_insertion_dir_whatsit()}\endgroup} + +%%%% vadjust +\let\ltj@@orig@vadjust=\vadjust +\protected\def\vadjust{% + \ltj@@orig@vadjust\bgroup + \directlua{luatexja.direction.set_list_direction_hook('adj')}% + \aftergroup\ltj@@vadjust@check@dir\let\next} +\protected\def\ltj@@vadjust@check@dir{% + \directlua{luatexja.direction.check_adjust_direction()}% +} + +%%%% \hbox, \vbox, \vtop +\setbox0\hbox{% + $\directlua{% This value depends on the version of LuaTeX. + luatexja.stack.mmode = -tex.nest[tex.nest.ptr].mode + }$% +} +% \ifltj@everyhook@avail +% \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 +% } +% \else +% {\catcode`\!=0\catcode`\\=12 +% !@PackageWarningNoLine{luatexja-core}{% +% I will use \everyhbox and \everyvbox directly !MessageBreak +% for supporting multiple directions, !MessageBreak +% since everyhook.sty is not available}} +% \everyhbox{% +% \directlua{luatexja.direction.set_list_direction_hook()}% +% \aftergroup\ltj@@reset@badness +% } +% \everyvbox{% +% \directlua{luatexja.direction.set_list_direction_hook()}% +% \aftergroup\ltj@@reset@badness +% } +% \fi + +\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} + +\protected\def\ltj@@reset@badness{% + \directlua{% + 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 + }% +} +\AtBeginShipout{\directlua{luatexja.direction.finalize()}} + +%%%% \raise, \lower, \moveleft, \moveright +\let\ltj@@orig@raise=\raise +\let\ltj@@orig@lower=\lower +\protected\def\raise{\ltj@reset@globaldefs\afterassignment\ltj@@raise\ltj@tempdima} +\protected\def\lower{\ltj@reset@globaldefs\afterassignment\ltj@@raise\ltj@tempdima-} +\protected\def\ltj@@raise{% + \ltj@restore@globaldefs + \edef\ltj@@raise@a{% + \noexpand\directlua{luatexja.direction.raise_box()}% + \ltj@@orig@raise\the\ltj@tempdima\noexpand\box\ltj@afbox + }\ltj@afterbox\ltj@@raise@a} +\let\ltj@@orig@moveleft=\moveleft +\let\ltj@@orig@moveright=\moveright +\protected\def\moveleft{\ltj@reset@globaldefs\afterassignment\ltj@@moveleft\ltj@tempdima} +\protected\def\moveright{\ltj@reset@globaldefs\afterassignment\ltj@@moveleft\ltj@tempdima-} +\protected\def\ltj@@moveleft{% + \ltj@restore@globaldefs + \edef\ltj@@moveleft@a{% + \noexpand\directlua{luatexja.direction.raise_box()}% + \ltj@@orig@moveleft\the\ltj@tempdima\noexpand\box\ltj@afbox + }\ltj@afterbox\ltj@@moveleft@a} + +%%%% \vcenter +\let\ltj@@orig@vcenter=\vcenter +\protected\def\vcenter{\ltj@afterbox\ltj@@vcenter\vbox} +\protected\def\ltj@@vcenter{% + \directlua{luatexja.direction.raise_box()}% + \ltj@@orig@vcenter{\box\ltj@afbox}% +} + +%%%% \unhbox and \unvbox +\long\def \@gobbletwo #1#2{} +\let\ltj@@orig@unhbox=\unhbox +\let\ltj@@orig@unvbox=\unvbox +\protected\def\unhbox{\ltj@reset@globaldefs\afterassignment\ltj@@unhbox\ltj@tempcnta} +\protected\def\unvbox{\ltj@reset@globaldefs\afterassignment\ltj@@unvbox\ltj@tempcnta} +\protected\def\ltj@@unhbox{% + \directlua{luatexja.direction.unbox_check_dir()}% + \ltj@@orig@unhbox\ltj@tempcnta} +\protected\def\ltj@@unvbox{% + \directlua{luatexja.direction.unbox_check_dir()}% + \ltj@@orig@unvbox\ltj@tempcnta} +\let\ltj@@orig@unhcopy=\unhcopy +\let\ltj@@orig@unvcopy=\unvcopy +\protected\def\unhcopy{\ltj@reset@globaldefs\afterassignment\ltj@@unhcopy\ltj@tempcnta} +\protected\def\unvcopy{\ltj@reset@globaldefs\afterassignment\ltj@@unvcopy\ltj@tempcnta} +\protected\def\ltj@@unhcopy{% + \directlua{luatexja.direction.unbox_check_dir(true)}% + \ltj@@orig@unhcopy\ltj@tempcnta + \directlua{luatexja.direction.uncopy_restore_whatsit()}} +\protected\def\ltj@@unvcopy{% + \directlua{luatexja.direction.unbox_check_dir(true)}% + \ltj@@orig@unvcopy\ltj@tempcnta + \directlua{luatexja.direction.uncopy_restore_whatsit()}} + + +%%%% lastbox +\let\ltj@@orig@lastbox=\lastbox +\protected\def\lastbox{% + \directlua{luatexja.direction.lastbox_hook()}\ltj@@orig@lastbox +} + +%%%%%%%% \ltjgetwd etc. +\def\ltj@@getwd#1{% + \directlua{luatexja.direction.get_box_dim('width', \the\numexpr#1\relax)}% + \ltj@tempdima% +} +\def\ltj@@getht#1{% + \directlua{luatexja.direction.get_box_dim('height', \the\numexpr#1\relax)}% + \ltj@tempdima% +} +\def\ltj@@getdp#1{% + \directlua{luatexja.direction.get_box_dim('depth', \the\numexpr#1\relax)}% + \ltj@tempdima% +} +\let\ltjgetwd=\ltj@@getwd\let\ltjgetht=\ltj@@getht\let\ltjgetdp=\ltj@@getdp + +%%%%%%%% \ltjsetwd= etc. +\protected\def\ltjsetwd{\begingroup + \ltj@reset@globaldefs\afterassignment\ltj@@setwd@a\ltj@tempcnta} +\def\ltj@@setwd@a{\afterassignment\ltj@@setwd@b\ltj@tempdima} +\def\ltj@@setwd@b{% + \directlua{luatexja.direction.set_box_dim('width')}% + \ltj@restore@globaldefs\endgroup} +\protected\def\ltjsetht{\begingroup + \ltj@reset@globaldefs\afterassignment\ltj@@setht@a\ltj@tempcnta} +\def\ltj@@setht@a{\afterassignment\ltj@@setht@b\ltj@tempdima} +\def\ltj@@setht@b{% + \directlua{luatexja.direction.set_box_dim('height')}% + \ltj@restore@globaldefs\endgroup} +\protected\def\ltjsetdp{\begingroup + \ltj@reset@globaldefs\afterassignment\ltj@@setdp@a\ltj@tempcnta} +\def\ltj@@setdp@a{\afterassignment\ltj@@setdp@b\ltj@tempdima} +\def\ltj@@setdp@b{% + \directlua{luatexja.direction.set_box_dim('depth')}% + \ltj@restore@globaldefs\endgroup} + + %%------------------ Load module for the format \ifltj@in@latex %<*LaTeX> @@ -508,12 +730,13 @@ \newluatexcatcodetable\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"FFFFF=14}%" } \ltj@overwrite@catcodetable\CatcodeTableLaTeX \ltj@overwrite@catcodetable\CatcodeTableLaTeXAtLetter \ltj@overwrite@catcodetable\CatcodeTableExpl + %%------------------ all done \ltj@core@AtEnd \endinput