X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=src%2Fpatches%2Flltjfont.sty;h=6c25efadc42f0e3d3cd0eb82417be6ccb5925491;hb=6710397082dd1c9793fedcd2429eda9b54d9efec;hp=79fee829212906622f44c1b3e7f22e4babda600f;hpb=d19b8e6f99673f6b49c2323c439340acbddb5880;p=luatex-ja%2Fluatexja.git diff --git a/src/patches/lltjfont.sty b/src/patches/lltjfont.sty index 79fee82..6c25efa 100644 --- a/src/patches/lltjfont.sty +++ b/src/patches/lltjfont.sty @@ -3,7 +3,7 @@ % \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{lltjfont}[2017/03/20 Patch to NFSS2 for LuaTeX-ja] +\ProvidesPackage{lltjfont}[2019/01/29 Patch to NFSS2 for LuaTeX-ja] \def\ltj@chardef@text@cmd#1{% \let\@ifdefinable\@@ifdefinable% @@ -61,30 +61,27 @@ \newbox\zstrutbox \def\strutbox{% \ifnum\ltjgetparameter{direction}=1 \dstrutbox % dtou - \else\ifnum\ltjgetparameter{direction}=3 \tstrutbox % tate - \else\ifnum\ltjgetparameter{direction}=11 \zstrutbox % utod - \else\ystrutbox % yoko - \fi\fi\fi + \else\ifnum\ltjgetparameter{direction}=4 \ystrutbox % yoko + \else\tstrutbox % tate and utod + \fi\fi } \def\strut{\relax \ifnum\ltjgetparameter{direction}=1 % dtou \ifmmode\copy\dstrutbox\else\unhcopy\dstrutbox\fi \else\ifnum\ltjgetparameter{direction}=4 % yoko \ifmmode\copy\ystrutbox\else\unhcopy\ystrutbox\fi - \else\ifnum\ltjgetparameter{direction}=3 % tate + \else % tate and utod \ifmmode\copy\tstrutbox\else\unhcopy\tstrutbox\fi - \else % utod - \ifmmode\copy\zstrutbox\else\unhcopy\zstrutbox\fi - \fi\fi\fi + \fi\fi } -\def\ystrut{\relax\hbox{\yoko +\def\ystrut{\relax\hbox{\ltj@@orig@yoko \ifmmode\copy\ystrutbox\else\unhcopy\ystrutbox\fi}} -\def\tstrut{\relax\hbox{\tate +\def\tstrut{\relax\hbox{\ltj@@orig@tate \ifmmode\copy\tstrutbox\else\unhcopy\tstrutbox\fi}} -\def\dstrut{\relax\hbox{\dtou +\def\dstrut{\relax\hbox{\ltj@@orig@dtou \ifmmode\copy\dstrutbox\else\unhcopy\dstrutbox\fi}} -\def\zstrut{\relax\hbox{\utod +\def\zstrut{\relax\hbox{\ltj@@orig@utod \ifmmode\copy\zstrutbox\else\unhcopy\zstrutbox\fi}} {% @@ -246,18 +243,24 @@ \gdef\f@baselineskip{#5pt}} \@onlypreamble\DeclareKanjiSubstitution \@onlypreamble\DeclareErrorKanjiFont + +\newif\ifltjselectfont@force@define \def\DeclareFixedFont#1#2#3#4#5#6{% \begingroup \math@fontsfalse \every@math@size{}% \fontsize{#6}\z@ \directlua{luatexja.jfont.is_kyenc('\luatexluaescapestring{#2}')}\ifin@% + \ltjselectfont@force@definetrue \usekanji{#2}{#3}{#4}{#5}% \global\let#1\getjfont + \ltjselectfont@force@definefalse \else \directlua{luatexja.jfont.is_ktenc('\luatexluaescapestring{#2}')}\ifin@% + \ltjselectfont@force@definetrue \usekanji{#2}{#3}{#4}{#5}% \global\let#1\gettfont + \ltjselectfont@force@definefalse \else \useroman{#2}{#3}{#4}{#5}% \global\expandafter\let\expandafter#1\the\font @@ -317,13 +320,39 @@ \expandafter\expandafter\expandafter\let \expandafter\expandafter\csname ltj@@orig@selectfont\endcsname\csname selectfont\space\endcsname \@EverySelectfont@Init +%\let\ltj@@font@info\@font@info +%\let\ltj@@font@warning\@font@warning \def\@EverySelectfont@Init{% \expandafter\let\csname selectfont\space \endcsname \ltj@@orig@selectfont \ltj@@EverySelectfont@Init } +\def\ltj@selectfont@tate{% + \let\k@encoding\ct@encoding + \xdef\font@name{\csname\curr@kfontshape/\f@size\endcsname}% + \pickup@tfont + \ifnum\ltjgetparameter{direction}=3 \font@name + \ltj@@does@alt@set{\curr@kfontshape}{% + % alt fonts の定義 + \directlua{luatexja.jfont.output_alt_font_cmd('t', '\luatexluaescapestring{\curr@kfontshape}')}% + % 定義した alt fonts のデータを \ltjdeclarealtfont に渡すのと同等の処理をする + \directlua{luatexja.jfont.pickup_alt_font_a('\f@size')}% + }% + \fi} +\def\ltj@selectfont@yoko{% + \let\k@encoding\cy@encoding + \xdef\font@name{\csname\curr@kfontshape/\f@size\endcsname}% + \pickup@jfont + \unless\ifnum\ltjgetparameter{direction}=3 \font@name + \ltj@@does@alt@set{\curr@kfontshape}{% + % alt fonts の定義 + \directlua{luatexja.jfont.output_alt_font_cmd('y', '\luatexluaescapestring{\curr@kfontshape}')}% + % 定義した alt fonts のデータを \ltjdeclarealtfont に渡すのと同等の処理をする + \directlua{luatexja.jfont.pickup_alt_font_a('\f@size')}% + }% + \fi} \def\ltj@selectfont@patch{% - \directlua{luatexja.base.start_time_measure('selectfont')}% - \let\tmp@error@fontshape\error@fontshape + \directlua{luatexja.base.start_time_measure('selectfont')}% + \let\tmp@error@fontshape\error@fontshape \let\error@fontshape\error@kfontshape \directlua{luatexja.jfont.is_kyenc('\luatexluaescapestring{\k@encoding}')}\ifin@% \let\cy@encoding\k@encoding @@ -336,33 +365,13 @@ \@latex@error{KANJI Encoding scheme `\k@encoding' unknown}\@eha \fi \fi -% - \let\k@encoding\ct@encoding - \xdef\font@name{\csname\curr@kfontshape/\f@size\endcsname}% - \pickup@tfont - \font@name - \ltj@@does@alt@set{\curr@kfontshape}% - % alt fonts の定義 - \directlua{luatexja.jfont.output_alt_font_cmd('t', '\luatexluaescapestring{\curr@kfontshape}')}% - % 定義した alt fonts のデータを \ltjdeclarealtfont に渡すのと同等の処理をする - \directlua{luatexja.jfont.pickup_alt_font_a('\f@size')}% - \fi -% - \let\k@encoding\cy@encoding - \xdef\font@name{\csname\curr@kfontshape/\f@size\endcsname}% - \pickup@jfont - \font@name - \ltj@@does@alt@set{\curr@kfontshape}% - % alt fonts の定義 - \directlua{luatexja.jfont.output_alt_font_cmd('y', '\luatexluaescapestring{\curr@kfontshape}')}% - % 定義した alt fonts のデータを \ltjdeclarealtfont に渡すのと同等の処理をする - \directlua{luatexja.jfont.pickup_alt_font_a('\f@size')}% - \fi + \global\let\ltj@afont@name=\font@name + \ltj@selectfont@tate\ltj@selectfont@yoko % \edef\tmp@item{{\k@encoding}}\expandafter\def\expandafter\k@encoding\tmp@item \kenc@update + \global\let\font@name=\ltj@afont@name \let\error@fontshape\tmp@error@fontshape -% \if@knjcmd \@knjcmdfalse \expandafter\ifx \csname rel@\k@encoding/\k@family/\k@series/\k@shape\endcsname\relax @@ -377,10 +386,29 @@ % 警告: 再び \selectfont を呼んでいる.無限ループの可能性あり \fi \fi + \global\let\font@name=\ltj@afont@name \directlua{luatexja.base.stop_time_measure('selectfont')}% } \EverySelectfont{\ltj@selectfont@patch} +\bgroup + \def\ltj@@dir@patch#1#2#3{% + \global\csletcs{ltj@@orig@#1}{#1}% + \protected\expandafter\xdef\csname #1\endcsname{% + \csname ltj@@orig@#1\endcsname + \unexpanded{\ifnum#3<\z@\let\ltj@@protect\protect\set@typeset@protect}% + \unexpanded{\global\let\ltj@afont@name=\font@name}% + \expandonce{\csname ltj@selectfont@#2\endcsname}% + \unexpanded{\global\let\font@name=\ltj@afont@name}% + \unexpanded{\let\protect\ltj@@protect\fi}% + }% + } + \ltj@@dir@patch{yoko}{yoko}{\ltj@curjfnt} + \ltj@@dir@patch{tate}{tate}{\ltj@curtfnt} + \ltj@@dir@patch{utod}{yoko}{\ltj@curjfnt} + \ltj@@dir@patch{dtou}{yoko}{\ltj@curjfnt} +\egroup + \def\KanjiEncodingPair#1#2{\@namedef{t@enc@#1}{#2}\@namedef{y@enc@#2}{#1}} \def\set@fontsize#1#2#3{% \@defaultunits\@tempdimb#2pt\relax\@nnil @@ -394,79 +422,55 @@ \baselineskip\f@linespread\baselineskip \normalbaselineskip\baselineskip \adjustbaseline - \setbox\ystrutbox\hbox{\yoko + \setbox\ystrutbox\hbox{\ltj@@orig@yoko \vrule\@width\z@ \@height.7\baselineskip \@depth.3\baselineskip}% - \setbox\dstrutbox\hbox{\dtou + \setbox\dstrutbox\hbox{\ltj@@orig@dtou \vrule\@width\z@ \@height.7\baselineskip \@depth.3\baselineskip}% - \setbox\tstrutbox\hbox{\tate + \setbox\tstrutbox\hbox{\ltj@@orig@tate \vrule\@width\z@ \@height.5\baselineskip \@depth.5\baselineskip}% - \setbox\zstrutbox\hbox{\utod + \setbox\zstrutbox\hbox{\ltj@@orig@utod \vrule\@width\z@ \@height.7\baselineskip \@depth.3\baselineskip}% \let\size@update\relax}} -\ifdefined\newluafunction - \newluafunction\ltj@@adjust@baseline@inner - \begingroup\catcode`\~=12 - \directlua{% - local nulltable = {} - local t = lua.get_functions_table() - local getfont, dir_tate = font.getfont, luatexja.dir_table.dir_tate - local fmt, get_attr = luatexja.jfont.font_metric_table, tex.getattribute - local setdimen, set_attr = tex.setdimen, tex.setattribute - local dir = luatexja.unary_pars.direction - t[\the\ltj@@adjust@baseline@inner] = function() - local ft = fmt[get_attr('ltj@curtfnt')] or nulltable - ft = ft and ft.char_type or nulltable - local fk = ft and ft[0] or nulltable - local ht, dp, wd = fk.height or 0, fk.depth or 0, - fk.width or ft.zw or 0 - local fm - = ((getfont(font.current()) or nulltable) - .characters or nulltable)[77] or nulltable %% 'M' - set_attr('ltj@tablshift', - 0.5*((fm.height or 0)- (fm.depth or 0) - ht+ dp)) - if dir() ~= dir_tate then - ft = fmt[get_attr('ltj@curjfnt')] or nulltable - ft = ft and ft.char_type or nulltable - fk = ft and ft[0] or nulltable - ht, dp, wd = fk.height or 0, fk.depth or 0, - fk.width or ft.zw or 0 - end - setdimen('cht', ht); setdimen('cdp', dp) - setdimen('cwd', wd); setdimen('chs', wd) - setdimen('cHT', ht+dp) +\newluafunction\ltj@@adjust@baseline@inner +\begingroup\catcode`\~=12 +\directlua{% + local nulltable = {} + local t = lua.get_functions_table() + local getfont, dir_tate = font.getfont, luatexja.dir_table.dir_tate + local fmt, get_attr = luatexja.jfont.font_metric_table, tex.getattribute + local getcount=tex.getcount + local setdimen, set_attr = tex.setdimen, tex.setattribute + local dir = luatexja.unary_pars.direction + t[\the\ltj@@adjust@baseline@inner] = function() + local ft = fmt[get_attr('ltj@curtfnt')] or nulltable + ft = ft.char_type or nulltable + local fk = ft[0] or nulltable + local ht, dp, wd = fk.height or 0, fk.depth or 0, + fk.width or ft.zw or 0 + local fm + = ((getfont(font.current()) or nulltable) + .characters or nulltable)[77] or nulltable %% 'M' + set_attr('ltj@tablshift', + tex.round(0.5*((fm.height or 0)- (fm.depth or 0) - ht+ dp))) + if dir() ~= dir_tate then + ft = fmt[get_attr('ltj@curjfnt')] or nulltable + ft = ft.char_type or nulltable + fk = ft[0] or nulltable + ht, dp, wd = fk.height or 0, fk.depth or 0, + fk.width or ft.zw or 0 end - }\endgroup - \def\adjustbaseline{\luafunction\ltj@@adjust@baseline@inner - \cvs\normalbaselineskip} -\else - \newbox\adjust@box - \newbox\adjust@box@aux - \newdimen\adjust@dimen - \def\adjustbaseline{% - \setbox\adjust@box\hbox{% - \ltj@ykblshift\z@\ltj@tkblshift\z@ 漢}% - \cht\ht\adjust@box - \cdp\dp\adjust@box - \cwd\wd\adjust@box - \cvs\normalbaselineskip - \chs\cwd - \cHT\cht \advance\cHT\cdp - \setbox\adjust@box@aux\hbox{\tate\ltj@tkblshift\z@ 漢}% - \setbox\adjust@box\hbox{\tate\ltj@tablshift\z@ M}% - \adjust@dimen\ht\adjust@box - \advance\adjust@dimen\dp\adjust@box - \advance\adjust@dimen-\ht\adjust@box@aux - \divide\adjust@dimen\tw@ - \advance\adjust@dimen0.5\dp\adjust@box@aux - \advance\adjust@dimen-\dp\adjust@box - \ltj@tablshift=\adjust@dimen - } -\fi + setdimen('cht', ht); setdimen('cdp', dp) + setdimen('cwd', wd); setdimen('chs', wd) + setdimen('cHT', ht+dp) + end +}\endgroup +\def\adjustbaseline{\luafunction\ltj@@adjust@baseline@inner + \cvs\normalbaselineskip} \DeclareRobustCommand\romanencoding[1]{% \expandafter\ifx\csname T@#1\endcsname\relax \@latex@error{Encoding scheme `#1' unknown}\@eha @@ -596,12 +600,12 @@ \romanshape{\shapedefault}% \selectfont\ignorespaces} \let\reset@font\normalfont -\DeclareRobustCommand\mcfamily - {\not@math@alphabet\mcfamily\mathmc - \kanjifamily\mcdefault\selectfont} -\DeclareRobustCommand\gtfamily - {\not@math@alphabet\gtfamily\mathgt - \kanjifamily\gtdefault\selectfont} +\DeclareRobustCommand\mcfamily{% + \unless\ifltj@disablejfam\not@math@alphabet\mcfamily\mathmc\fi + \kanjifamily\mcdefault\selectfont} +\DeclareRobustCommand\gtfamily{% + \unless\ifltj@disablejfam\not@math@alphabet\gtfamily\mathgt\fi + \kanjifamily\gtdefault\selectfont} \let\romanprocess@table\process@table \def\kanjiprocess@table{% \kanjiencoding{\kanjiencodingdefault}% @@ -626,43 +630,92 @@ \let\extract@afont\extract@font \def\pickup@jfont{% + \ifnum + \unless\ifnum\ltjgetparameter{direction}=3 1\else + \ifltjselectfont@force@define 1\else 0\fi\fi =1 % \expandafter \ifx \font@name \relax \let\extract@font\extract@jfont \define@newfont \let\extract@font\extract@afont \fi - \let\getjfont\font@name} + \let\getjfont\font@name + \else + \begingroup\escapechar\m@ne + \ifcsname ltj@@fontjfm/\expandafter\string\font@name\endcsname\else + \let\extract@font\extract@jfont@onlyjfm + \define@newfont + \let\extract@font\extract@afont + \fi + \endgroup + \csname ltj@@fontjfm/\expandafter\expandafter\expandafter\@gobble\expandafter\string\font@name\endcsname + \fi +} \def\pickup@tfont{% + \ifnum + \ifnum\ltjgetparameter{direction}=3 1\else + \ifltjselectfont@force@define 1\else 0\fi\fi =1 % \expandafter \ifx \font@name \relax \let\extract@font\extract@tfont \define@newfont \let\extract@font\extract@afont \fi - \let\gettfont\font@name} + \let\gettfont\font@name + \else + \begingroup\escapechar\m@ne + \ifcsname ltj@@fontjfm/\expandafter\string\font@name\endcsname\else + \let\extract@font\extract@tfont@onlyjfm + \define@newfont + \let\extract@font\extract@afont + \fi + \endgroup + \csname ltj@@fontjfm/\expandafter\expandafter\expandafter\@gobble\expandafter\string\font@name\endcsname + \fi +} % 異なる和文 enc/fam/ser/shape からは異なるフォント番号が振られるように % わざと「ゴミをつける」 \def\ltj@@patch@external@font#1 at{% - #1\directlua{luatexja.jfont.print_aftl_address()}\space at% + \directlua{ + local s = '\luatexluaescapestring{#1}' + local is_braced, is_quoted + if s:sub(1,1)=='{' and s:sub(-1)=='}' then is_braced=true; s=s:sub(2,-2) end + if s:sub(1,1)=='"' and s:sub(-1)=='"' then is_quoted=true; s=s:sub(2,-2) end + s=s..luatexja.jfont.print_aftl_address() + if is_braced then s='{'..s..'}' elseif is_quoted then s='"'..s..'"' end + %print(s, is_quoted, is_braced) + tex.sprint(-2, s)}% + \space at% } \def\extract@jfont{% - \get@external@font - \ltj@@does@alt@set{\f@encoding/\f@family/\f@series/\f@shape}% + \get@external@font + \ltj@@does@alt@set{\f@encoding/\f@family/\f@series/\f@shape}{% \edef\external@font{\expandafter\ltj@@patch@external@font\external@font}% - \fi - \expandafter\globaljfont\font@name\external@font\relax% ここで時間がかかる - \font@name%\global\zw=\zw\global\zh=\zh + }% + \expandafter\globaljfont\font@name\external@font\relax\font@name% ここで時間がかかる \csname \f@encoding+\f@family\endcsname \csname\curr@fontshape\endcsname} \def\extract@tfont{% - \get@external@font - \ltj@@does@alt@set{\f@encoding/\f@family/\f@series/\f@shape}% + \get@external@font + \ltj@@does@alt@set{\f@encoding/\f@family/\f@series/\f@shape}{% \edef\external@font{\expandafter\ltj@@patch@external@font\external@font}% - \fi - \expandafter\globaltfont\font@name\external@font\relax - \font@name%\global\zw=\zw\global\zh=\zh + }% + \expandafter\globaltfont\font@name\external@font\relax\font@name \csname \f@encoding+\f@family\endcsname \csname\curr@fontshape\endcsname} +\def\extract@jfont@onlyjfm{% + \get@external@font + \csxdef{ltj@@fontjfm/\expandafter\string\font@name}{% + \directlua{% + luatexja.jfont.load_jfmonly('\luatexluaescapestring{\external@font}', 'yoko') + }% + }} +\def\extract@tfont@onlyjfm{% + \get@external@font + \csxdef{ltj@@fontjfm/\expandafter\string\font@name}{% + \directlua{% + luatexja.jfont.load_jfmonly('\luatexluaescapestring{\external@font}', 'tate') + }% + }} \let\ltj@@al@do@subst@correction=\do@subst@correction \def\ltj@@ja@do@subst@correction{% @@ -682,6 +735,7 @@ \let\@@italiccorr=\/ %%%%%% Japanese font for math mode +\unless\ifltj@disablejfam % \M@ から その が和文用か調べる {\catcode`M=12% @@ -689,12 +743,15 @@ \let\ltj@@al@getanddefine@fonts=\getanddefine@fonts \def\ltj@@ja@getanddefine@fonts#1#2{% + \csletcs{if@ltj@tempif}{ifltjselectfont@force@define}% + \ltjselectfont@force@definetrue \xdef\font@name{\csname \string#2/\tf@size\endcsname}% \pickup@jfont\let\textfont@name\font@name \xdef\font@name{\csname \string#2/\sf@size\endcsname}% \pickup@jfont\let\scriptfont@name\font@name \xdef\font@name{\csname \string#2/\ssf@size\endcsname}% \pickup@jfont + \csletcs{ifltjselectfont@force@define}{if@ltj@tempif}% \edef\math@fonts{\math@fonts\ltj@setpar@global% \ltj@@set@stackfont#1,\textfont@name:{MJT}% \ltj@@set@stackfont#1,\scriptfont@name:{MJS}% @@ -715,6 +772,8 @@ \ifin@\jfam#2\relax\else\mathgroup#2\relax\fi \expandafter\math@egroup\fi}% +\fi + %%%%%% Alternate Japanese Fonts %%%% \DeclareAlternateKanjiFont % いつも global @@ -759,8 +818,8 @@ \directlua{luatexja.jfont.pickup_alt_font_b(\the\ltj@tempcntc,'\luatexluaescapestring{#2}')}% } -\def\ltj@@does@alt@set#1{% - \directlua{luatexja.jfont.does_alt_set'\luatexluaescapestring{#1}'}} +\def\ltj@@does@alt@set#1#2{% + \directlua{luatexja.jfont.does_alt_set'\luatexluaescapestring{#1}'}{#2}} %%%% patch \@text@composite because of {y,t}albaselineshift