X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fpatches%2Flltjfont.sty;h=9be20e440c6bf2896eb5a21a6e6d115dfa4488e0;hb=6612dba2aa63fed27da3f2e0a56a734448eda3c7;hp=68cc36d76cd15b1463a69ec9635417033d605caa;hpb=0e92b88282f64c34260b3c11f6ee57507be8258f;p=luatex-ja%2Fluatexja.git diff --git a/src/patches/lltjfont.sty b/src/patches/lltjfont.sty index 68cc36d..9be20e4 100644 --- a/src/patches/lltjfont.sty +++ b/src/patches/lltjfont.sty @@ -3,8 +3,9 @@ % \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{lltjfont}[2018/10/08 Patch to NFSS2 for LuaTeX-ja] +\ProvidesPackage{lltjfont}[2020-05-17 Patch to NFSS2 for LuaTeX-ja] +%% patching \DeclareTextComposite \def\ltj@chardef@text@cmd#1{% \let\@ifdefinable\@@ifdefinable% \edef\ltj@chardef@text@cmd@name{\expandafter\@gobble\string#1}% @@ -23,13 +24,11 @@ \@dec@text@cmd\ltj@chardef@text@cmd#1{#2}#3\relax } -\ifdefined\UnicodeEncodingName - \let\ltj@temp@DeclareTextComposite=\DeclareTextComposite - \def\DeclareTextComposite#1#2#3#4{}% - \input{tuenc.def} - \let\DeclareTextComposite=\ltj@temp@DeclareTextComposite - \expandafter\patchcmd\csname TU\string\textasteriskcentered\endcsname{\char}{\ltjalchar}{}{} -\fi +\let\ltj@temp@DeclareTextComposite=\DeclareTextComposite +\def\DeclareTextComposite#1#2#3#4{}% +\input{tuenc.def} +\let\DeclareTextComposite=\ltj@temp@DeclareTextComposite +\expandafter\patchcmd\csname TU\string\textasteriskcentered\endcsname{\char}{\ltjalchar}{}{} \let\k@encoding\@empty @@ -65,7 +64,7 @@ \else\tstrutbox % tate and utod \fi\fi } -\def\strut{\relax +\DeclareRobustCommand\strut{\relax \ifnum\ltjgetparameter{direction}=1 % dtou \ifmmode\copy\dstrutbox\else\unhcopy\dstrutbox\fi \else\ifnum\ltjgetparameter{direction}=4 % yoko @@ -75,20 +74,49 @@ \fi\fi } -\def\ystrut{\relax\hbox{\ltj@@orig@yoko +\DeclareRobustCommand\ystrut{\relax\hbox{\ltj@@orig@yoko \ifmmode\copy\ystrutbox\else\unhcopy\ystrutbox\fi}} -\def\tstrut{\relax\hbox{\ltj@@orig@tate +\DeclareRobustCommand\tstrut{\relax\hbox{\ltj@@orig@tate \ifmmode\copy\tstrutbox\else\unhcopy\tstrutbox\fi}} -\def\dstrut{\relax\hbox{\ltj@@orig@dtou +\DeclareRobustCommand\dstrut{\relax\hbox{\ltj@@orig@dtou \ifmmode\copy\dstrutbox\else\unhcopy\dstrutbox\fi}} -\def\zstrut{\relax\hbox{\ltj@@orig@utod +\DeclareRobustCommand\zstrut{\relax\hbox{\ltj@@orig@utod \ifmmode\copy\zstrutbox\else\unhcopy\zstrutbox\fi}} -{% - \def\cdp@elt#1#2#3#4{% - \directlua{luatexja.jfont.add_fenc_list('\luatexluaescapestring{#1}')}}% - \cdp@list% + + +\newluafunction\ltj@@add@fenc@@inner +\newluafunction\ltj@@add@kyenc@@inner +\newluafunction\ltj@@add@ktenc@@inner +\newluafunction\ltj@@is@kyenc@@inner +\newluafunction\ltj@@is@ktenc@@inner +\newluafunction\ltj@@is@kenc@@inner +\newluafunction\ltj@@is@ffam@@inner +\newluafunction\ltj@@add@ffam@@inner +\newluafunction\ltj@@add@kfam@@inner +\directlua{% + local lf = lua.get_functions_table() + lf[\the\ltj@@add@fenc@@inner] = luatexja.jfont.add_fenc_list + lf[\the\ltj@@add@kyenc@@inner] = luatexja.jfont.add_kyenc_list + lf[\the\ltj@@add@ktenc@@inner] = luatexja.jfont.add_ktenc_list + lf[\the\ltj@@is@kyenc@@inner] = luatexja.jfont.is_kyenc + lf[\the\ltj@@is@ktenc@@inner] = luatexja.jfont.is_ktenc + lf[\the\ltj@@is@kenc@@inner] = luatexja.jfont.is_kenc + lf[\the\ltj@@is@ffam@@inner] = luatexja.jfont.is_ffam + lf[\the\ltj@@add@ffam@@inner] = luatexja.jfont.add_ffam + lf[\the\ltj@@add@kfam@@inner] = luatexja.jfont.add_kfam } +\luadef\ltj@@add@fenc \ltj@@add@fenc@@inner +\luadef\ltj@@add@kyenc\ltj@@add@kyenc@@inner +\luadef\ltj@@add@ktenc\ltj@@add@ktenc@@inner +\luadef\ltj@@is@kyenc \ltj@@is@kyenc@@inner +\luadef\ltj@@is@ktenc \ltj@@is@ktenc@@inner +\luadef\ltj@@is@kenc \ltj@@is@kenc@@inner +\luadef\ltj@@is@ffam \ltj@@is@ffam@@inner +\luadef\ltj@@add@ffam \ltj@@add@ffam@@inner +\luadef\ltj@@add@kfam \ltj@@add@kfam@@inner + +{\def\cdp@elt#1#2#3#4{\ltj@@add@fenc{#1}}\cdp@list} \def\DeclareFontEncoding{% \begingroup @@ -103,7 +131,7 @@ {\default@family}{\default@series}% {\default@shape}}% \expandafter\let\csname#1-cmd\endcsname\@changed@cmd - \directlua{luatexja.jfont.add_fenc_list('\luatexluaescapestring{#1}')}% + \ltj@@add@fenc{#1}% \else \@font@info{Redeclaring font encoding #1}% \fi @@ -134,7 +162,7 @@ {\default@k@family}{\default@k@series}% {\default@k@shape}}% \expandafter\let\csname#1-cmd\endcsname\@changed@kcmd - \directlua{luatexja.jfont.add_kyenc_list('\luatexluaescapestring{#1}')}% + \ltj@@add@kyenc{#1}% \else \@font@info{Redeclaring KANJI (yoko) font encoding #1}% \fi @@ -153,7 +181,7 @@ {\default@k@family}{\default@k@series}% {\default@k@shape}}% \expandafter\let\csname#1-cmd\endcsname\@changed@kcmd - \directlua{luatexja.jfont.add_ktenc_list('\luatexluaescapestring{#1}')}% + \ltj@@add@ktenc{#1}% \else \@font@info{Redeclaring KANJI (tate) font encoding #1}% \fi @@ -191,7 +219,7 @@ \@empty \else \reserved@a \fi - \directlua{luatexja.jfont.add_ffam('\luatexluaescapestring{#2}')}% + \ltj@@add@ffam{#2}% }% } \def\DeclareKanjiFamily#1#2#3{% @@ -204,7 +232,7 @@ \@empty \else \reserved@a \fi - \directlua{luatexja.jfont.add_kfam('\luatexluaescapestring{#2}')}% + \ltj@@add@kfam{#2}% }% } \def\DeclareKanjiSubstitution#1#2#3#4{% @@ -224,10 +252,23 @@ \cdp@list \xdef\cdp@list{\the\toks@}% \endgroup - \global\@namedef{D@#1}{\def\default@family{#2}% - \def\default@series{#3}% - \def\default@shape{#4}}% + \global\@namedef{D@#1}{\def\default@k@family{#2}% + \def\default@k@series{#3}% + \def\default@k@shape{#4}}% \fi} +\let\wrong@ja@fontshape\wrong@fontshape +\let\wrong@al@fontshape\wrong@fontshape +\patchcmd\wrong@ja@fontshape{\default@shape}{\default@k@shape}{}{} +\patchcmd\wrong@ja@fontshape{\default@series}{\default@k@series}{}{} +\patchcmd\wrong@ja@fontshape{\default@family}{\default@k@family}{}{} +\def\wrong@fontshape{% + \ltj@@is@kenc{\f@encoding}\ifin@% + \wrong@ja@fontshape + \else + \wrong@al@fontshape + \fi +} +\@onlypreamble\DeclareKanjiSubstitution \def\DeclareErrorKanjiFont#1#2#3#4#5{% \xdef\error@kfontshape{% \noexpand\expandafter\noexpand\split@name\noexpand\string @@ -236,25 +277,26 @@ \gdef\default@k@family{#2}% \gdef\default@k@series{#3}% \gdef\default@k@shape{#4}% - \global\let\k@family\default@k@family - \global\let\k@series\default@k@series - \global\let\k@shape\default@k@shape - \gdef\f@size{#5}% - \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@% + \ltj@@is@kyenc{#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@% + \ltj@@is@ktenc{#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 @@ -306,7 +348,7 @@ \fi } \newif\if@knjcmd -\def\userelfont{\@knjcmdtrue} +\DeclareRobustCommand\userelfont{\@knjcmdtrue} \RequirePackage{everysel} @@ -314,8 +356,8 @@ \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 +%\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 @@ -323,9 +365,6 @@ \def\ltj@selectfont@tate{% \let\k@encoding\ct@encoding \xdef\font@name{\csname\curr@kfontshape/\f@size\endcsname}% - \unless\ifnum\ltjgetparameter{direction}=3\relax - \let\@font@info\@gobble\let\@font@warning\@gobble - \fi \pickup@tfont \ifnum\ltjgetparameter{direction}=3 \font@name \ltj@@does@alt@set{\curr@kfontshape}{% @@ -334,15 +373,10 @@ % 定義した alt fonts のデータを \ltjdeclarealtfont に渡すのと同等の処理をする \directlua{luatexja.jfont.pickup_alt_font_a('\f@size')}% }% - \else - \let\@font@info\ltj@@font@info\let\@font@warning\ltj@@font@warning \fi} \def\ltj@selectfont@yoko{% \let\k@encoding\cy@encoding \xdef\font@name{\csname\curr@kfontshape/\f@size\endcsname}% - \ifnum\ltjgetparameter{direction}=3\relax - \let\@font@info\@gobble\let\@font@warning\@gobble - \fi \pickup@jfont \unless\ifnum\ltjgetparameter{direction}=3 \font@name \ltj@@does@alt@set{\curr@kfontshape}{% @@ -351,20 +385,20 @@ % 定義した alt fonts のデータを \ltjdeclarealtfont に渡すのと同等の処理をする \directlua{luatexja.jfont.pickup_alt_font_a('\f@size')}% }% - \else - \let\@font@info\ltj@@font@info\let\@font@warning\ltj@@font@warning \fi} \def\ltj@selectfont@patch{% - \directlua{luatexja.base.start_time_measure('selectfont')}% + \ltj@@start@time@measure{selectfont}% \let\tmp@error@fontshape\error@fontshape \let\error@fontshape\error@kfontshape - \directlua{luatexja.jfont.is_kyenc('\luatexluaescapestring{\k@encoding}')}\ifin@% + \ltj@@is@kyenc{\k@encoding}\ifin@% \let\cy@encoding\k@encoding + \ensure@KanjiEncodingPair{t}% \edef\ct@encoding{\csname t@enc@\k@encoding\endcsname}% \else - \directlua{luatexja.jfont.is_ktenc('\luatexluaescapestring{\k@encoding}')}\ifin@% - \let\ct@encoding\k@encoding - \edef\cy@encoding{\csname y@enc@\k@encoding\endcsname}% + \ltj@@is@ktenc{\k@encoding}\ifin@% + \let\ct@encoding\k@encoding + \ensure@KanjiEncodingPair{y}% + \edef\cy@encoding{\csname y@enc@\k@encoding\endcsname}% \else \@latex@error{KANJI Encoding scheme `\k@encoding' unknown}\@eha \fi @@ -391,27 +425,38 @@ \fi \fi \global\let\font@name=\ltj@afont@name - \directlua{luatexja.base.stop_time_measure('selectfont')}% + \ltj@@stop@time@measure{selectfont}% } \EverySelectfont{\ltj@selectfont@patch} \bgroup - \def\ltj@@dir@patch#1#2{% + \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{\let\ltj@@protect\protect\set@typeset@protect}% + \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}% + \unexpanded{\let\protect\ltj@@protect\fi}% }% } - \ltj@@dir@patch{yoko}{yoko}\ltj@@dir@patch{tate}{tate} - \ltj@@dir@patch{utod}{yoko}\ltj@@dir@patch{dtou}{yoko} + \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\ensure@KanjiEncodingPair#1{% + \edef\reserved@a{\csname #1@enc@\k@encoding\endcsname}% + \edef\reserved@b{\csname c#1@encoding\endcsname}% + \ifcat\relax\reserved@a + \@latex@error + {KANJI Encoding pair for `\k@encoding' undefined}% + {Use \string\KanjiEncodingPair, falling back to `\reserved@b'...}% + \expandafter\edef\reserved@a{\reserved@b}% + \fi} \def\set@fontsize#1#2#3{% \@defaultunits\@tempdimb#2pt\relax\@nnil \edef\f@size{\strip@pt\@tempdimb}% @@ -445,16 +490,13 @@ 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 dir = dir() - local ft = (dir==dir_tate - and fmt[get_attr('ltj@curtfnt')] or luatexja.jfont.tfont_jfmonly_result) - or nulltable - %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 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 @@ -462,10 +504,10 @@ .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 + 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 + 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 @@ -474,7 +516,7 @@ setdimen('cHT', ht+dp) end }\endgroup -\def\adjustbaseline{\luafunction\ltj@@adjust@baseline@inner +\DeclareRobustCommand\adjustbaseline{\luafunction\ltj@@adjust@baseline@inner \cvs\normalbaselineskip} \DeclareRobustCommand\romanencoding[1]{% \expandafter\ifx\csname T@#1\endcsname\relax @@ -501,19 +543,17 @@ \fi } \DeclareRobustCommand\fontencoding[1]{% - \directlua{luatexja.jfont.is_kyenc('\luatexluaescapestring{#1}')}\ifin@% - \kanjiencoding{#1}\else\romanencoding{#1}\fi} + \ltj@@is@kyenc{#1}\ifin@\kanjiencoding{#1}\else\romanencoding{#1}\fi} \def\@@kenc@update{% \default@KT \csname T@\k@encoding\endcsname \csname D@\k@encoding\endcsname \let\kenc@update\relax \let\ck@encoding\k@encoding - \edef\tmp@enc{'\luatexluaescapestring{\k@encoding}'}% - \directlua{luatexja.jfont.is_kyenc(\tmp@enc)}\ifin@% + \ltj@@is@kyenc{\k@encoding}\ifin@ \let\cy@encoding\k@encoding \else - \directlua{luatexja.jfont.is_ktenc(\tmp@enc)}\ifin@% + \ltj@@is@ktenc{\k@encoding}\ifin@ \let\ct@encoding\k@encoding \else \@latex@error{KANJI Encoding scheme `\k@encoding' unknown}\@eha @@ -547,27 +587,28 @@ \DeclareRobustCommand\kanjifamily[1]{\edef\k@family{#1}} \DeclareRobustCommand\fontfamily[1]{% \@notkfamfalse\@notffamfalse - \edef\tmp@item{'\luatexluaescapestring{#1}'}% % - \directlua{luatexja.jfont.search_kfam(\tmp@item, \@ltj@use@fd)}% + \directlua{luatexja.jfont.search_kfam()}{#1}{\@ltj@use@fd}% \ifin@\edef\k@family{#1}\else\@notkfamtrue\fi % % alphabetic fonts part - \directlua{luatexja.jfont.is_ffam(\tmp@item)}% + \ltj@@is@ffam{#1}% \ifin@\edef\f@family{#1}\else % checking is_stored_ffam is not sufficient, % since LuaTeX-ja doesn't know whats fonts are defined before LuaTeX-ja is loaded. \ifcsname \f@encoding+#1\endcsname % easy case - \directlua{luatexja.jfont.add_ffam(\tmp@item)}\edef\f@family{#1}% + \ltj@@add@ffam{#1}\edef\f@family{#1}% \else \@tempswafalse - \def\cdp@elt##1{\ifcsname ##1+#1\endcsname\@tempswatrue\fi}% - \directlua{luatexja.jfont.search_ffam_declared()}% + \def\cdp@elt##1{\ifcsname ##1+#1\endcsname% + \@tempswatrue\def\cdp@elt####1\relax{}% + \fi}% + \directlua{luatexja.jfont.search_ffam_declared()}\relax% \if@tempswz - \directlua{luatexja.jfont.add_ffam(\tmp@item)}\edef\f@family{#1}% + \ltj@@add@ffam{#1}\edef\f@family{#1}% \else % now we search Nffam_list and font definition files. - \directlua{luatexja.jfont.search_ffam_fd(\tmp@item)}% + \directlua{luatexja.jfont.search_ffam_fd()}{#1}% \ifin@\edef\f@family{#1}\else\@notffamtrue\fi \fi \fi @@ -577,40 +618,331 @@ \edef\k@family{#1}\edef\f@family{#1}% \fi\fi } + +\newcount\ltj@@latex@plv \ltj@@latex@plv=-1 +\ifdefined\@rmfamilyhook +%%%% LaTeX 2020-02-02 +\newif\if@shape@roman@kanji +%%%%%% 2020-02-02 patchlevel detection +\ifx\@forced@seriestrue\@undefined % 2020-02-02 pl0--2 + \@latex@error + {Please update LaTeX2e!^^J\space\space + At least LaTeX2e 2020-02-02 patch level 3 is required} + {LaTeX2e 2020-02-02 patch level 2 (and 4) has a bug.} +\else + \ltj@@latex@plv=300 + \unless\ifx\series@maybe@drop@one@m@x\@undefined % pl5 + develop + \ltj@@latex@plv=501 + \else\unless\ifx\series@maybe@drop@one@m\@undefined % patch level 5 + \ltj@@latex@plv=500 + \fi\fi +\fi +%%%%%% + +\def\merge@kanji@series#1{% + \expandafter\expandafter\expandafter + \merge@kanji@series@ + \csname series@\k@series @#1\endcsname + {#1}% + \@nil +} + +\ifnum\ltj@@latex@plv>500 % !!! pl5 + develop + \def\set@target@series@kanji#1{% + \edef\k@series{#1}% + \series@maybe@drop@one@m\k@series\k@series + } +\else\ifnum\ltj@@latex@plv>300 % !!! pl5 + \def\set@target@series@kanji#1{% + \edef\k@series{#1}% + \expandafter\series@maybe@drop@one@m\expandafter{\k@series}\k@series + } +\else % !!! pl 3, 4 + \def\set@target@series@kanji#1{% + \edef\k@series{#1}% + \edef\k@series{\expandafter\series@drop@one@m\k@series mm\series@drop@one@m}% + } +\fi\fi + +\def\merge@kanji@series@#1#2#3\@nil{% + \def\reserved@a{#3}% + \ifx\reserved@a\@empty + \set@target@series@kanji{#2}% + \else + \begingroup\let\f@encoding\k@encoding\let\f@family\k@family + \maybe@load@fontshape\endgroup + \edef\reserved@a{\k@encoding /\k@family /#1/\k@shape}% + \ifcsname \reserved@a \endcsname + \set@target@series@kanji{#1}% + \else + \ifcsname \k@encoding /\k@family /#2/\k@shape \endcsname + \set@target@series@kanji{#2}% + {\let\curr@fontshape\curr@kfontshape\@font@shape@subst@warning}% + \else + \set@target@series@kanji{#3}% + {\let\curr@fontshape\curr@kfontshape\@font@shape@subst@warning}% + \fi + \fi + \fi +} +\def\merge@kanji@shape#1{% + \expandafter\expandafter\expandafter + \merge@kanji@shape@ + \csname shape@\k@shape @#1\endcsname + {#1}% + \@nil +} +\def\merge@kanji@shape@#1#2#3\@nil{% + \def\reserved@a{#3}% + \ifx\reserved@a\@empty + \if@shape@roman@kanji + \set@safe@kanji@shape{#2}{}% + \else + \edef\k@shape{#2}% + \fi + \else + \begingroup\let\f@encoding\k@encoding\let\f@family\k@family + \maybe@load@fontshape\endgroup + \edef\reserved@a{\k@encoding /\k@family /\k@series/#1}% + \ifcsname \reserved@a\endcsname + \edef\k@shape{#1}% + \else + \ifcsname \k@encoding /\k@family /\k@series/#2\endcsname + \edef\k@shape{#2}% + {\let\curr@fontshape\curr@kfontshape\@font@shape@subst@warning}% + \else + \if@shape@roman@kanji + \set@safe@kanji@shape{#3}% + {{\let\curr@fontshape\curr@kfontshape\@font@shape@subst@warning}}% + \else + \edef\k@shape{#3}% + {\let\curr@fontshape\curr@kfontshape\@font@shape@subst@warning}% + \fi + \fi + \fi + \fi +} +\ifnum\ltj@@latex@plv=300 % !!! pl3, 4 + \DeclareRobustCommand\romanseries[1]{\merge@font@series{#1}} + \DeclareRobustCommand\kanjiseries[1]{\merge@kanji@series{#1}} + \DeclareRobustCommand\fontseries[1]{% + \merge@font@series{#1}\merge@kanji@series{#1}} + \DeclareRobustCommand\romanseriesforce[1]{\edef\f@series{#1}} + \DeclareRobustCommand\kanjiseriesforce[1]{\edef\k@series{#1}} + \DeclareRobustCommand\fontseriesforce[1]{% + \edef\f@series{#1}\edef\k@series{#1}} +\else % !!! pl 5 + \DeclareRobustCommand\romanseries[1]{\@forced@seriesfalse\merge@font@series{#1}} + \DeclareRobustCommand\kanjiseries[1]{\@forced@seriesfalse\merge@kanji@series{#1}} + \DeclareRobustCommand\fontseries[1]{% + \@forced@seriesfalse\merge@font@series{#1}\merge@kanji@series{#1}} + \DeclareRobustCommand\romanseriesforce[1]{\@forced@seriestrue\merge@font@series{#1}} + \DeclareRobustCommand\kanjiseriesforce[1]{\@forced@seriestrue\merge@kanji@series{#1}} + \DeclareRobustCommand\fontseriesforce[1]{% + \@forced@seriestrue\merge@font@series{#1}\merge@kanji@series{#1}} +\fi +\DeclareRobustCommand\romanshape[1]{\merge@font@shape{#1}} +\DeclareRobustCommand\kanjishape[1]{\merge@kanji@shape{#1}} +\DeclareRobustCommand\fontshape[1]{% + \@shape@roman@kanjitrue + \merge@font@shape{#1}\merge@kanji@shape{#1}% + \@shape@roman@kanjifalse +} +\DeclareRobustCommand\romanshapeforce[1]{\edef\f@shape{#1}} +\DeclareRobustCommand\kanjishapeforce[1]{\edef\k@shape{#1}} +\DeclareRobustCommand\fontshapeforce[1]{\set@safe@kanji@shape{#1}{}\romanshapeforce{#1}} +\DeclareRobustCommand\usekanji[4]{% + \kanjiencoding{#1}\edef\k@family{#2}\edef\k@series{#3}\edef\k@shape{#4}% + \selectfont\ignorespaces} +\DeclareRobustCommand\useroman[4]{% + \romanencoding{#1}\edef\f@family{#2}\edef\f@series{#3}\edef\f@shape{#4}% + \selectfont\ignorespaces} +%%%% LaTeX 2020-02-02 END +\else +%%%% LaTeX 2019-10-01 \DeclareRobustCommand\romanseries[1]{\edef\f@series{#1}} \DeclareRobustCommand\kanjiseries[1]{\edef\k@series{#1}} \DeclareRobustCommand\fontseries[1]{\kanjiseries{#1}\romanseries{#1}} \DeclareRobustCommand\romanshape[1]{\edef\f@shape{#1}} \DeclareRobustCommand\kanjishape[1]{\edef\k@shape{#1}} -\DeclareRobustCommand\fontshape[1]{\kanjishape{#1}\romanshape{#1}} -\def\usekanji#1#2#3#4{% +\DeclareRobustCommand\fontshape[1]{\set@safe@kanji@shape{#1}{}\romanshape{#1}} +\DeclareRobustCommand\usekanji[4]{% \kanjiencoding{#1}\kanjifamily{#2}\kanjiseries{#3}\kanjishape{#4}% \selectfont\ignorespaces} -\def\useroman#1#2#3#4{% +\DeclareRobustCommand\useroman[4]{% \romanencoding{#1}\romanfamily{#2}\romanseries{#3}\romanshape{#4}% \selectfont\ignorespaces} +%%%% LaTeX 2019-10-01 END +\fi +%%%% + +\def\set@safe@kanji@shape#1#2{% + \edef\reserved@b{\k@encoding /\k@family /\k@series/#1}% + \ifcsname \reserved@b\endcsname + \edef\k@shape{#1}% + #2% + \else + \@kanji@shape@nochange@info{\reserved@b}% + \fi +} +\def\@kanji@shape@nochange@info#1{% + \@font@info{Kanji font shape `#1' undefined\MessageBreak + No change}% +} + \protected\def\usefont#1#2#3#4{% - \directlua{luatexja.jfont.is_kenc('\luatexluaescapestring{#1}')}\ifin@% - \usekanji{#1}{#2}{#3}{#4}% + \ltj@@is@kenc{#1}\ifin@\usekanji{#1}{#2}{#3}{#4}% \else\useroman{#1}{#2}{#3}{#4}% \fi} \DeclareRobustCommand\normalfont{% - \kanjiencoding{\kanjiencodingdefault}% - \kanjifamily{\kanjifamilydefault}% - \kanjiseries{\kanjiseriesdefault}% - \kanjishape{\kanjishapedefault}% - \romanencoding{\encodingdefault}% - \romanfamily{\familydefault}% - \romanseries{\seriesdefault}% - \romanshape{\shapedefault}% - \selectfont\ignorespaces} + \useroman\encodingdefault\familydefault\seriesdefault\shapedefault + \usekanji\kanjiencodingdefault\kanjifamilydefault\kanjiseriesdefault\kanjishapedefault} \let\reset@font\normalfont + +\ifdefined\@rmfamilyhook +%%%% LaTeX 2020-02-02 +\let\prepare@family@series@update@kanji=\prepare@family@series@update +\patchcmd\prepare@family@series@update{\fontfamily}{\romanfamily}{}{} +\patchcmd\prepare@family@series@update@kanji{\fontfamily}{\kanjifamily}{}{} +\patchcmd\prepare@family@series@update@kanji{\update@series@target@value}{\update@series@target@value@kanji}{}{} +\patchcmd\prepare@family@series@update@kanji{\f@family}{\k@family}{}{} +\patchcmd\prepare@family@series@update@kanji{\@meta@family@list}{\@meta@family@list@kanji}{}{} +\patchcmd\prepare@family@series@update@kanji{\fontfamily}{\kanjifamily}{}{} +\patchcmd\prepare@family@series@update@kanji{\maybe@load@fontshape} + {\begingroup\let\f@encoding\k@encoding\let\f@family\k@family + \maybe@load@fontshape\endgroup}{}{} +\patchcmd\prepare@family@series@update@kanji{\f@series}{\k@series}{}{} +\patchcmd\prepare@family@series@update@kanji{\f@series}{\k@series}{}{} +\let\update@series@target@value@kanji=\update@series@target@value +\patchcmd\update@series@target@value@kanji{\f@family}{\k@family}{}{} +\patchcmd\update@series@target@value@kanji{\f@series}{\k@series}{}{} +\patchcmd\update@series@target@value@kanji{\f@series}{\k@series}{}{} +\patchcmd\update@series@target@value@kanji{\f@series}{\k@series}{}{} +\patchcmd\update@series@target@value@kanji{\f@series}{\k@series}{}{} +\def\@meta@family@list@kanji{\@elt{mc}\@elt{gt}\@elt{jtt}} + +\ifdefined\@setbfseriesdefaultshook % after 2020-04-07 + \g@addto@macro\@setbfseriesdefaultshook{% + \let\bfseries@mc\bfdef@ult + \let\bfseries@gt\bfdef@ult + \let\bfseries@jtt\bfdef@ult + } +\else % 2020-02-02 + \expandafter\patchcmd\csname bfseries \endcsname{% + \let\bfseries@rm\bfdef@ult + \let\bfseries@sf\bfdef@ult + \let\bfseries@tt\bfdef@ult + }{% + \let\bfseries@rm\bfdef@ult + \let\bfseries@sf\bfdef@ult + \let\bfseries@tt\bfdef@ult + \let\bfseries@mc\bfdef@ult + \let\bfseries@gt\bfdef@ult + \let\bfseries@jtt\bfdef@ult + }{}{} +\fi +\ifdefined\@setmdseriesdefaultshook % after 2020-04-07 + \g@addto@macro\@setmdseriesdefaultshook{% + \let\mdseries@mc\mddef@ult + \let\mdseries@gt\mddef@ult + \let\mdseries@jtt\mddef@ult + } +\else % 2020-02-02 + \expandafter\patchcmd\csname mdseries \endcsname{% + \let\mdseries@rm\mddef@ult + \let\mdseries@sf\mddef@ult + \let\mdseries@tt\mddef@ult + }{% + \let\mdseries@rm\mddef@ult + \let\mdseries@sf\mddef@ult + \let\mdseries@tt\mddef@ult + \let\mdseries@mc\mddef@ult + \let\mdseries@gt\mddef@ult + \let\mdseries@jtt\mddef@ult + }{}{} +\fi +\expandafter\patchcmd\csname bfseries \endcsname{% + \ifx\f@family\rmdef@ult \fontseries\bfseries@rm + \else\ifx\f@family\sfdef@ult \fontseries\bfseries@sf + \else\ifx\f@family\ttdef@ult \fontseries\bfseries@tt + \else \fontseries\bfdefault + \fi\fi\fi +}{% + \ifx\f@family\rmdef@ult \romanseries\bfseries@rm + \else\ifx\f@family\sfdef@ult \romanseries\bfseries@sf + \else\ifx\f@family\ttdef@ult \romanseries\bfseries@tt + \else \romanseries\bfdefault + \fi\fi\fi +}{}{} +\expandafter\patchcmd\csname mdseries \endcsname{% + \ifx\f@family\rmdef@ult \fontseries\mdseries@rm + \else\ifx\f@family\sfdef@ult \fontseries\mdseries@sf + \else\ifx\f@family\ttdef@ult \fontseries\mdseries@tt + \else \fontseries\mddefault + \fi\fi\fi +}{% + \ifx\f@family\rmdef@ult \romanseries\mdseries@rm + \else\ifx\f@family\sfdef@ult \romanseries\mdseries@sf + \else\ifx\f@family\ttdef@ult \romanseries\mdseries@tt + \else \romanseries\mddefault + \fi\fi\fi +}{}{} +\expandafter\patchcmd\csname bfseries \endcsname{\selectfont}% +{% + \ifx\k@family\mcdef@ult \kanjiseries\bfseries@mc + \else\ifx\k@family\gtdef@ult \kanjiseries\bfseries@gt + \else\ifx\k@family\jttdef@ult\kanjiseries\bfseries@jtt + \else \kanjiseries\bfdefault + \fi\fi\fi + \selectfont +}{}{} +\expandafter\patchcmd\csname mdseries \endcsname{\selectfont}% +{% + \ifx\k@family\mcdef@ult \kanjiseries\mdseries@mc + \else\ifx\k@family\gtdef@ult \kanjiseries\mdseries@gt + \else\ifx\k@family\jttdef@ult\kanjiseries\mdseries@jtt + \else \kanjiseries\mddefault + \fi\fi\fi + \selectfont +}{}{} +\ifdefined\@expandfontdefaultshook % 2020-04-07 + \g@addto@macro\@expandfontdefaultshook{% + \edef\mcdef@ult{\mcdefault}% + \edef\gtdef@ult{\gtdefault}% + \edef\jttdef@ult{\jttdefault}% + \edef\kanjidef@ult{\kanjifamilydefault}% + } +\else % 2020-02-02 + \appto\expand@font@defaults{% + \edef\mcdef@ult{\mcdefault}% + \edef\gtdef@ult{\gtdefault}% + \edef\jttdef@ult{\jttdefault}% + \edef\kanjidef@ult{\kanjifamilydefault}% + } +\fi +\appto\init@series@setup{% + \ifx\kanjidef@ult\mcdef@ult \mcfamily + \else\ifx\kanjidef@ult\gtdef@ult \gtfamily + \else\ifx\kanjidef@ult\jttdef@ult \jttfamily + \fi\fi\fi +} +\fi +\ifdefined\prepare@family@series@update@kanji\else +%%%% LaTeX 2019-10-01 +\def\prepare@family@series@update@kanji#1{\kanjifamily} +\fi + \DeclareRobustCommand\mcfamily{% \unless\ifltj@disablejfam\not@math@alphabet\mcfamily\mathmc\fi - \kanjifamily\mcdefault\selectfont} + \prepare@family@series@update@kanji{mc}\mcdefault + \selectfont} \DeclareRobustCommand\gtfamily{% \unless\ifltj@disablejfam\not@math@alphabet\gtfamily\mathgt\fi - \kanjifamily\gtdefault\selectfont} + \prepare@family@series@update@kanji{gt}\gtdefault + \selectfont} + + + \let\romanprocess@table\process@table \def\kanjiprocess@table{% \kanjiencoding{\kanjiencodingdefault}% @@ -627,58 +959,101 @@ %%%%%% LuaTeX-ja specific -% #1 の展開結果から encoding 部分をとりだし,それが和文用かどうかの結果を \ifin@ に代入 -\def\ltj@@IsFontJapanese#1{% - \directlua{luatexja.jfont.is_kenc(string.match( - '\luatexluaescapestring{#1}', '[^/]+'))}} - +% #1/#2 の展開結果から encoding 部分 (#1) をとりだし,それが和文用かどうかの結果を \ifin@ に代入 +\def\ltj@@IsFontJapanese#1/#2\relax{\ltj@@is@kenc{#1}} \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 - \unless\ifnum\ltjgetparameter{direction}=3\relax - \ltj@@does@alt@set{\f@encoding/\f@family/\f@series/\f@shape}{% - \edef\external@font{\expandafter\ltj@@patch@external@font\external@font}% - }% - \expandafter\globaljfont\font@name\external@font\relax\font@name% ここで時間がかかる - \fi + \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}% + }% + \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 - \ifnum\ltjgetparameter{direction}=3\relax - \ltj@@does@alt@set{\f@encoding/\f@family/\f@series/\f@shape}{% - \edef\external@font{\expandafter\ltj@@patch@external@font\external@font}% - }% - \expandafter\globaltfont\font@name\external@font\relax\font@name - \else - \directlua{% - luatexja.jfont.load_tfont_jfmonly('\luatexluaescapestring{\external@font}') - }% - \fi + \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}% + }% + \expandafter\globaltfont\font@name\external@font\relax\font@name \csname \f@encoding+\f@family\endcsname \csname\curr@fontshape\endcsname} +\newluafunction\ltj@@jfont@@jfmonly@@inner +\directlua{% + local lf = lua.get_functions_table() + lf[\the\ltj@@jfont@@jfmonly@@inner] = luatexja.jfont.load_jfmonly +} +\luadef\ltj@@jfont@@jfmonly \ltj@@jfont@@jfmonly@@inner +\def\extract@jfont@onlyjfm{% + \get@external@font + \csxdef{ltj@@fontjfm/\expandafter\string\font@name}{% + \ltj@@jfont@@jfmonly{\external@font}{yoko}% + }} +\def\extract@tfont@onlyjfm{% + \get@external@font + \csxdef{ltj@@fontjfm/\expandafter\string\font@name}{% + \ltj@@jfont@@jfmonly{\external@font}{tate}% + }} + \let\ltj@@al@do@subst@correction=\do@subst@correction \def\ltj@@ja@do@subst@correction{% \xdef\subst@correction{% @@ -688,7 +1063,7 @@ \aftergroup\subst@correction } \def\do@subst@correction{% - \ltj@@IsFontJapanese{\curr@fontshape}\ifin@% + \ltj@@is@kenc{\f@encoding}\ifin@% \ltj@@ja@do@subst@correction \else \ltj@@al@do@subst@correction @@ -701,16 +1076,19 @@ % \M@ から その が和文用か調べる {\catcode`M=12% -\gdef\ltj@@mathJapaneseFonts#1M#2#3\relax{\ltj@@IsFontJapanese{#3}}} +\gdef\ltj@@mathJapaneseFonts#1M#2#3/#4\relax{\ltj@@is@kenc{#3}}} \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}% @@ -719,7 +1097,7 @@ } \def\getanddefine@fonts#1#2{% - \ltj@tempcnta=#1\ltj@@IsFontJapanese{\string#2}% + \ltj@tempcnta=#1\expandafter\ltj@@IsFontJapanese\string#2/\relax% \ifin@\let\ltj@temp=\ltj@@ja@getanddefine@fonts% \else \let\ltj@temp=\ltj@@al@getanddefine@fonts\fi \ltj@temp{#1}{#2}% @@ -727,7 +1105,8 @@ \def\use@mathgroup#1#2{\relax\ifmmode \math@bgroup \expandafter\ifx\csname M@\f@encoding\endcsname#1\else - #1\fi\ltj@tempcnta=#2 \expandafter\ltj@@mathJapaneseFonts\string#1\relax% + #1\fi\ltj@tempcnta=#2 + \expandafter\ltj@@mathJapaneseFonts\string#1/\relax% \ifin@\jfam#2\relax\else\mathgroup#2\relax\fi \expandafter\math@egroup\fi}% @@ -763,6 +1142,12 @@ %%%% \ClearAlternateKanjiFont % いつも global +\newluafunction\ltj@@does@alt@set@@inner +\directlua{% + local lf = lua.get_functions_table() + lf[\the\ltj@@does@alt@set@@inner] = luatexja.jfont.does_alt_set +} +\def\ltj@@does@alt@set#1#2{\luafunction\ltj@@does@alt@set@@inner{#1}{#2}} \def\ClearAlternateKanjiFont#1#2#3#4{% \directlua{luatexja.jfont.clear_alt_font_latex('\luatexluaescapestring{#1/#2/#3/#4}')}} @@ -777,9 +1162,6 @@ \directlua{luatexja.jfont.pickup_alt_font_b(\the\ltj@tempcntc,'\luatexluaescapestring{#2}')}% } -\def\ltj@@does@alt@set#1#2{% - \directlua{luatexja.jfont.does_alt_set'\luatexluaescapestring{#1}'}{#2}} - %%%% patch \@text@composite because of {y,t}albaselineshift % %% \pltx@isletter from plfonts.dtx