%
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{lltjfont}[2019/08/21 Patch to NFSS2 for LuaTeX-ja]
+\ProvidesPackage{lltjfont}[2020-09-30 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}%
\@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
\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
{\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
{\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
{\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
\@empty
\else \reserved@a
\fi
- \directlua{luatexja.jfont.add_ffam('\luatexluaescapestring{#2}')}%
+ \ltj@@add@ffam{#2}%
}%
}
\def\DeclareKanjiFamily#1#2#3{%
\@empty
\else \reserved@a
\fi
- \directlua{luatexja.jfont.add_kfam('\luatexluaescapestring{#2}')}%
+ \ltj@@add@kfam{#2}%
}%
}
\def\DeclareKanjiSubstitution#1#2#3#4{%
\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{%
\math@fontsfalse
\every@math@size{}%
\fontsize{#6}\z@
- \directlua{luatexja.jfont.is_kyenc('\luatexluaescapestring{#2}')}\ifin@%
- \ltjselectfont@force@definetrue
+ \ltj@@is@kyenc{#2}\ifin@%
+ \ltjselectfont@force@definetrue
\usekanji{#2}{#3}{#4}{#5}%
\global\let#1\getjfont
- \ltjselectfont@force@definefalse
+ \ltjselectfont@force@definefalse
\else
- \directlua{luatexja.jfont.is_ktenc('\luatexluaescapestring{#2}')}\ifin@%
- \ltjselectfont@force@definetrue
+ \ltj@@is@ktenc{#2}\ifin@%
+ \ltjselectfont@force@definetrue
\usekanji{#2}{#3}{#4}{#5}%
\global\let#1\gettfont
- \ltjselectfont@force@definefalse
+ \ltjselectfont@force@definefalse
\else
\useroman{#2}{#3}{#4}{#5}%
\global\expandafter\let\expandafter#1\the\font
\fi
}
\newif\if@knjcmd
-\def\userelfont{\@knjcmdtrue}
+\DeclareRobustCommand\userelfont{\@knjcmdtrue}
\RequirePackage{everysel}
\xdef\font@name{\csname\curr@kfontshape/\f@size\endcsname}%
\pickup@jfont
\unless\ifnum\ltjgetparameter{direction}=3 \font@name
- \ltj@@does@alt@set{\curr@kfontshape}{%
+ \ltj@@does@alt@set{\curr@kfontshape}{%
% alt fonts の定義
\directlua{luatexja.jfont.output_alt_font_cmd('y', '\luatexluaescapestring{\curr@kfontshape}')}%
% 定義した alt fonts のデータを \ltjdeclarealtfont に渡すのと同等の処理をする
}%
\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
\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#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}%
- }%
- }
+ \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}
+ \global\let\ltj@@box@dirhook@orig=\ltj@@box@dirhook
+ \gdef\ltj@@box@dirhook{%
+ \ltj@@box@dirhook@orig
+ \ifnum\ltjgetparameter{direction}=11
+ \ifnum\ltj@curjfnt<\z@
+ \let\ltj@@protect\protect\set@typeset@protect
+ \global\let\ltj@afont@name=\font@name
+ \ltj@selectfont@yoko
+ \global\let\font@name=\ltj@afont@name
+ \let\protect\ltj@@protect
+ \fi
+ \fi
+ }
\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}%
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
\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
\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
\edef\k@family{#1}\edef\f@family{#1}%
\fi\fi
}
+
+\newcount\ltj@@latex@plv \ltj@@latex@plv=-1
+\ifltj@ltfilehook@avail % 2020-10-01
+ \ltj@@latex@plv=1000
+\else\ifdefined\@rmfamilyhook % 2020-02-02
+ \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
+\fi\fi
+
+%%%%%%
+\ifnum\ltj@@latex@plv>0
+%%%% LaTeX >= 2020-02-02
+\newif\if@shape@roman@kanji
+
+\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}}
+\DeclareRobustCommand\fontshape[1]{\set@safe@kanji@shape{#1}{}\romanshape{#1}}
\DeclareRobustCommand\usekanji[4]{%
\kanjiencoding{#1}\kanjifamily{#2}\kanjiseries{#3}\kanjishape{#4}%
\selectfont\ignorespaces}
\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}
+
+\ifnum 0\ifltj@ltfilehook@avail1\fi\ifdefined\@rmfamilyhook1\fi>0
+%%%% 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}}
+
+\def\@ltj@hook@series@default#1#2#3{%
+ \ifltj@ltfilehook@avail % 2020-10-01
+ \AddToHook{#1/defaults}{#2}%
+ \else\ifcsname @set#1defaultshook\endcsname %after 2020-04-07
+ \expandafter\g@addto@macro\csname @set#1defaultshook\endcsname{#2}%
+ \else % 2020-02-02
+ \expandafter\patchcmd\csname #1 \endcsname{#3}{#3#2}{}{}%
+ \fi\fi
+}
+\@ltj@hook@series@default{bfseries}{%
+ \let\bfseries@mc\bfdef@ult
+ \let\bfseries@gt\bfdef@ult
+ \let\bfseries@jtt\bfdef@ult
+}{%
+ \let\bfseries@rm\bfdef@ult
+ \let\bfseries@sf\bfdef@ult
+ \let\bfseries@tt\bfdef@ult
+}
+\@ltj@hook@series@default{mdseries}{%
+ \let\mdseries@mc\mddef@ult
+ \let\mdseries@gt\mddef@ult
+ \let\mdseries@jtt\mddef@ult
+}{%
+ \let\mdseries@rm\mddef@ult
+ \let\mdseries@sf\mddef@ult
+ \let\mdseries@tt\mddef@ult
+}
+\let\@ltj@hook@series@default\@undefined
+
+\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
+}{}{}
+
+\def\@ltj@hook@series#1#2{%
+ \ifltj@ltfilehook@avail % 2020-10-01
+ \AddToHook{#1}{#2}%
+ \else % 2020-02-02
+ \expandafter\patchcmd\csname #1 \endcsname{\selectfont}{#2\selectfont}{}{}%
+ \fi
+}
+\@ltj@hook@series{bfseries}{%
+ \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
+}
+\@ltj@hook@series{mdseries}{%
+ \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
+}
+\let\@ltj@hook@series\@undefined
+
+\def\@ltj@hook@efd#1#2{%
+ \ifltj@ltfilehook@avail % 2020-10-01
+ \AddToHook{expand@font@defaults}{#1}%
+ \else\ifdefined\@expandfontdefaultshook %after 2020-04-07
+ \g@addto@macro\@expandfontdefaultshook{#1#2}%
+ \else % 2020-02-02
+ \appto\expand@font@defaults{#1#2}%
+ \fi\fi
+}
+\@ltj@hook@efd{%
+ \edef\mcdef@ult{\mcdefault}%
+ \edef\gtdef@ult{\gtdefault}%
+ \edef\jttdef@ult{\jttdefault}%
+}{\edef\kanjidef@ult{\kanjifamilydefault}}
+\let\@ltj@hook@efd\@undefined
+
+\ifltj@ltfilehook@avail % 2020-10-01
+ \appto\init@series@setup{%
+ \ifx\kanjiseriesdefault\kanjiseriesdefault@kernel
+ \mdseries
+ \let\kanjiseriesdefault\k@series
+ \fi
+ }
+\else
+ \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
+
+\def\@ltj@hook@dfh#1{%
+ \ifltj@ltfilehook@avail % 2020-10-01
+ \AddToHook{normalfont}{#1}%
+ \else\ifdefined\@defaultfamilyhook
+ \g@addto@macro\@defaultfamilyhook{#1}%
+ \else % 2020-02-02
+ \expandafter\patchcmd\csname normalfont \endcsname{\selectfont}{#1\selectfont}{}{}%
+ \let\reset@font\normalfont
+ \fi\fi
+}
+\@ltj@hook@dfh{%
+ \kanjiencoding{\kanjiencodingdefault}%
+ \edef\k@family{\kanjifamilydefault}%
+ \edef\k@series{\kanjiseriesdefault}%
+ \edef\k@shape{\kanjishapedefault}%
+}
+\let\@ltj@hook@dfh\@undefined
+%%%% LaTeX >= 2020-02-02 END
+\else
+%%%% LaTeX 2019-10-01
\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
+%%%% LaTeX 2019-10-01 END
+\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}%
- \kanjifamily{\kanjifamilydefault}%
- \kanjiseries{\kanjiseriesdefault}%
- \kanjishape{\kanjishapedefault}%
+ \kanjiencoding\kanjiencodingdefault%
+ \edef\k@family{\kanjifamilydefault}%
+ \edef\k@series{\kanjiseriesdefault}%
+ \edef\k@shape{\kanjishapedefault}%
}
\def\process@table{%
\romanprocess@table
%%%%%% 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 %
+ \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
\fi
\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
+ \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 %
+ \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
\fi
\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
+ \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
}
% わざと「ゴミをつける」
\def\ltj@@patch@external@font#1 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)
+ 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
+ \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}%
}%
\csname \f@encoding+\f@family\endcsname
\csname\curr@fontshape\endcsname}
\def\extract@tfont{%
- \get@external@font
+ \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}{%
- \directlua{%
- luatexja.jfont.load_jfmonly('\luatexluaescapestring{\external@font}', 'yoko')
- }%
- }}
+ \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}{%
- \directlua{%
- luatexja.jfont.load_jfmonly('\luatexluaescapestring{\external@font}', 'tate')
- }%
- }}
+ \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{%
\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
% \M@<enc> から その <enc> が和文用か調べる
{\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{%
}
\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}%
\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}%
%%%%%% Alternate Japanese Fonts
%%%% \DeclareAlternateKanjiFont<Benc><Bfam><Bser><Bshape><Aenc><Afam><Aser><Ashape><range>
% いつも global
-\DeclareRobustCommand\DeclareAlternateKanjiFont[9]{%
+\def\DeclareAlternateKanjiFont#1#2#3#4#5#6#7#8#9{%
\edef\@temp{#9}%
\ifx\@temp\@empty\else
{\def\ltj@temp@bfont{#1/#2/#3/#4}\def\ltj@temp@afont{#5/#6/#7/#8}%
\the\ltj@tempcnta,\the\ltj@tempcntb,
'\luatexluaescapestring{\ltj@temp@afont}',
'\luatexluaescapestring{\ltj@temp@bfont}')}%
- }
+}
%%%% \ClearAlternateKanjiFont<Benc><Bfam><Bser><Bshape>
% いつも 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}')}}
\ltj@@getjfontnumber#1%
\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
-% \def\pltx@mark{\pltx@mark@}
-% \let\pltx@scanstop\relax
-% \long\def\pltx@cond#1\fi{%
-% #1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
-% \long\def\pltx@isletter#1{%
-% \expandafter\pltx@isletter@i#1\pltx@scanstop}
-% \long\def\pltx@isletter@i#1\pltx@scanstop{%
-% \pltx@cond\ifx\pltx@mark#1\pltx@mark\fi{\@firstoftwo}%
-% {\pltx@isletter@ii\pltx@scanstop#1\pltx@scanstop{}#1\pltx@mark}}
-% \long\def\pltx@isletter@ii#1\pltx@scanstop#{%
-% \pltx@cond\ifx\pltx@mark#1\pltx@mark\fi%
-% {\pltx@isletter@iii}{\pltx@isletter@iv}}
-% \long\def\pltx@isletter@iii#1\pltx@mark{\@secondoftwo}
-% \long\def\pltx@isletter@iv#1#2#3\pltx@mark{%
-% \pltx@cond\ifx\pltx@mark#3\pltx@mark\fi{%
-% \pltx@cond{\ifnum0\ifcat A\noexpand#21\fi\ifcat=\noexpand#21\fi>\z@}\fi
-% {\@firstoftwo}{\@secondoftwo}%
-% }{\@secondoftwo}}
-%
-% \def\@text@composite@x#1#2{%
-% \ifx#1\relax
-% #2%
-% \else\pltx@isletter{#1}{#1}{%
-% \begingroup
-% \setbox\z@\hbox\bgroup%
-% \ltj@yablshift\z@ \ltj@tablshift\z@
-% #1%
-% \@tempcntb\directlua{luatexja.pltx_composite_last_node_char()}%)
-% \xdef\pltx@composite@temp{\noexpand\@tempcntb=\the\@tempcntb\relax}%
-% \aftergroup\pltx@composite@temp
-% \egroup
-% \ifnum\ltjgetparameter{direction}=3 %
-% \@tempdima=\ltj@tablshift sp\else\@tempdima=\ltj@yablshift sp\fi
-% \ifnum\@tempcntb<\z@\@tempcnta\z@\else
-% \@tempcnta=\ltjgetparameter{jacharrange}{\ltjgetparameter{chartorange}{\@tempcntb}}\relax
-% \ifnum\@tempcnta=\z@\@tempdima\z@\fi
-% \fi
-% \ifnum\@tempcnta>\z@
-% \ifodd\ltjgetparameter{alxspmode}{\@tempcntb}\else\leavevmode\hbox{}\fi
-% \begingroup\mathsurround\z@$%
-% \hbox{\lower\@tempdima\box\z@}
-% $\endgroup%
-% \ifnum\ltjgetparameter{alxspmode}{\@tempcntb}<2\hbox{}\fi
-% \else
-% \ifdim\@tempdima=\z@{\ltj@yablshift\z@ \ltj@tablshift\z@#1}%
-% \else\lower\@tempdima\box\z@\fi
-% \fi
-% \endgroup}%
-% \fi
-% }
-
\endinput