OSDN Git Service

updated package date
[luatex-ja/luatexja.git] / src / patches / lltjfont.sty
index 2e18a8c..9be20e4 100644 (file)
@@ -3,8 +3,9 @@
 %
 
 \NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{lltjfont}[2020/01/12 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}%
   \@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@%
+      \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
     }%
   \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}
 
 \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}%
     \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
   \fi\fi
 }
 
-\ifdefined\fontseriesforce
+\newcount\ltj@@latex@plv \ltj@@latex@plv=-1
+\ifdefined\@rmfamilyhook
 %%%% LaTeX 2020-02-02
-\DeclareRobustCommand\romanseriesforce[1]{\edef\f@series{#1}}
-\DeclareRobustCommand\kanjiseriesforce[1]{\edef\k@series{#1}}
-\DeclareRobustCommand\fontseriesforce[1]{\kanjiseries{#1}\romanseries{#1}}
-\DeclareRobustCommand\romanshapeforce[1]{\edef\f@shape{#1}}
-\DeclareRobustCommand\kanjishapeforce[1]{\edef\k@shape{#1}}
-\DeclareRobustCommand\fontshapeforce[1]{\kanjishape{#1}\romanshape{#1}}
+\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@font@kanji@series#1{%
+\def\merge@kanji@series#1{%
   \expandafter\expandafter\expandafter
-  \merge@font@kanji@series@
+  \merge@kanji@series@
     \csname series@\k@series @#1\endcsname
     {#1}%
     \@nil
 }
-\def\set@target@kanji@series#1{%
-    \edef\k@series{#1}%
-    \edef\k@series{\expandafter\series@drop@one@m\k@series mm\series@drop@one@m}%
-}
-\def\merge@font@kanji@series@#1#2#3\@nil{%
-  \def\@reserveda{#3}%
-  \ifx\@reserveda\@empty
-    \set@target@kanji@series{#2}%
+
+\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\@reserveda{\k@encoding /\k@family /#1/\k@shape}%
-     \ifcsname \@reserveda \endcsname
-       \set@target@kanji@series{#1}%
+    \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@kanji@series{#2}%
-         \@font@shape@subst@warning
+         \set@target@series@kanji{#2}%
+         {\let\curr@fontshape\curr@kfontshape\@font@shape@subst@warning}%
        \else
-         \set@target@kanji@series{#3}%
-         \@font@shape@subst@warning
+         \set@target@series@kanji{#3}%
+         {\let\curr@fontshape\curr@kfontshape\@font@shape@subst@warning}%
        \fi
     \fi
   \fi
 }
-\def\merge@font@kanji@shape#1{%
+\def\merge@kanji@shape#1{%
   \expandafter\expandafter\expandafter
-  \merge@font@kanji@shape@
+  \merge@kanji@shape@
     \csname shape@\k@shape @#1\endcsname
     {#1}%
     \@nil
 }
-\def\merge@font@kanji@shape@#1#2#3\@nil{%
-  \def\@reserveda{#3}%
-  \ifx\@reserveda\@empty
-    \edef\k@shape{#2}%
+\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
-    \maybe@load@fontshape
-    \edef\@reserveda{\k@encoding /\k@family /\k@series/#1}%
-     \ifcsname \@reserveda\endcsname
+    \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}%
-         \@font@shape@subst@warning
+         {\let\curr@fontshape\curr@kfontshape\@font@shape@subst@warning}%
        \else
-         \edef\k@shape{#3}%
-         \@font@shape@subst@warning
+         \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
 }
-\DeclareRobustCommand\romanseries[1]{\merge@font@series{#1}}
-\DeclareRobustCommand\kanjiseries[1]{\merge@font@kanji@series{#1}}
-\DeclareRobustCommand\fontseries[1]{%
-   \merge@font@series{#1}\merge@font@kanji@series{#1}}
+\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@font@kanji@shape{#1}}
+\DeclareRobustCommand\kanjishape[1]{\merge@kanji@shape{#1}}
 \DeclareRobustCommand\fontshape[1]{%
-   \merge@font@shape{#1}\merge@font@kanji@shape{#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\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}}
-\fi
-%%%%
+\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}
 \DeclareRobustCommand\normalfont{%
     \useroman\encodingdefault\familydefault\seriesdefault\shapedefault
-    \usekanji\kanjiencodingdefault\kanjifamilydefault\kanjiseriesdefault\kanjishapedefault
-    \ignorespaces}
+    \usekanji\kanjiencodingdefault\kanjifamilydefault\kanjiseriesdefault\kanjishapedefault}
 \let\reset@font\normalfont
 
-\ifdefined\fontseriesforce
+\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{\f@series}{\k@series}{}{}
+\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}{}{}
-\appto\@meta@family@list{\@elt{mc}\@elt{gt}\@elt{jtt}}
-\DeclareRobustCommand\bfseries{%
-  \not@math@alphabet\bfseries\mathbf
-  \expand@font@defaults
-  \romanseries{%
-    \ifx\f@family\rmdef@ult      \bfseries@rm
-    \else\ifx\f@family\sfdef@ult \bfseries@sf
-    \else\ifx\f@family\ttdef@ult \bfseries@tt
-    \else                        \bfdefault
-    \fi\fi\fi
-  }%
-  \kanjiseries{%
-    \ifx\k@family\mcdef@ult      \bfseries@mc
-    \else\ifx\k@family\gtdef@ult \bfseries@gt
-    \else\ifx\k@family\jttdef@ult\bfseries@jtt
-    \else                        \bfdefault
-    \fi\fi\fi
-  }%
- \selectfont
-}
-\DeclareRobustCommand\mdseries{%
-  \not@math@alphabet\mdseries\relax
-  \expand@font@defaults
-  \romanseries{%
-    \ifx\f@family\rmdef@ult      \mdseries@rm
-    \else\ifx\f@family\sfdef@ult \mdseries@sf
-    \else\ifx\f@family\ttdef@ult \mdseries@tt
-    \else                        \mddefault
-    \fi\fi\fi
-  }%
-  \kanjiseries{%
-    \ifx\k@family\mcdef@ult      \mdseries@mc
-    \else\ifx\k@family\gtdef@ult \mdseries@gt
-    \else\ifx\k@family\jttdef@ult\mdseries@jtt
-    \else                        \mddefault
-    \fi\fi\fi
-  }%
+\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
-}
-\appto\expand@font@defaults{%
-  \edef\mcdef@ult{\mcdefault}%
-  \edef\gtdef@ult{\gtdefault}%
-  \edef\jttdef@ult{\jttdefault}%
-  \edef\kanjidef@ult{\kanjifamilydefault}%
-}
+}{}{}
+\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
 }
-\else
+\fi
+\ifdefined\prepare@family@series@update@kanji\else
 %%%% LaTeX 2019-10-01
 \def\prepare@family@series@update@kanji#1{\kanjifamily}
 \fi
 
 %%%%%% 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{%
     \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')
-         }%
+          \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')
-         }%
+          \ltj@@jfont@@jfmonly{\external@font}{tate}%
        }}
 
 \let\ltj@@al@do@subst@correction=\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}%
 
 
 %%%% \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}')}}
 
   \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