OSDN Git Service

updated doc
authorHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Sun, 22 Mar 2020 06:16:37 +0000 (15:16 +0900)
committerHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Sun, 22 Mar 2020 06:16:37 +0000 (15:16 +0900)
README
doc/luatexja.dtx
src/patches/#lltjfont.sty# [new file with mode: 0644]

diff --git a/README b/README
index 8e35b33..5a58b34 100644 (file)
--- a/README
+++ b/README
@@ -22,9 +22,10 @@ Installation
 
 0. Please make sure that your TeX distribution is up-to-date.
    This version of LuaTeX-ja requires
-    - LuaTeX 1.07.0 (or later)
+    - LuaTeX 1.10.0 (or later)
     - luaotfload (v3.1 or later recommended)
     - adobemapping (Adobe CMap files)
+    - LaTeX 2020-02-02 patch level 5 or later (if you want to use with LaTeX)
     - everysel package
     - etoolbox package
     - ltxcmds package
@@ -38,7 +39,7 @@ Installation
    One might be able to typeset documents without an error, but with
    some unwanted results.
 
-1. If you are using TeX Live 2019, you can install LuaTeX-ja via tlmgr.
+1. If you are using TeX Live 2020, you can install LuaTeX-ja via tlmgr.
 
 2. If you must/want to install manually:
 
index 280ccb3..ea10f0a 100644 (file)
@@ -648,7 +648,7 @@ and \emph{Japanese fonts} for fonts used in \textbf{JAchar}.
 %<en>The following packages are needed for the \LuaTeX-ja\ package.
 %<ja>\LuaTeX-jaパッケージの動作には次のパッケージ類が必要である.
 \begin{itemize}
-\item \href{http://www.luatex.org/}{\LuaTeX}\ 1.07.0 (or later)
+\item \href{http://www.luatex.org/}{\LuaTeX}\ 1.10.0 (or later)
 \item recent \href{https://github.com/latex3/luaotfload}{\Pkg{luaotfload}} (v3.1 or later recommended)
 \item \Pkg{adobemapping} (Adobe cmap and pdfmapping files)
 \item \LaTeX\ 2020-02-02 patch level 5 or later (if you want to use \LuaTeX-ja with \LaTeXe)
@@ -1291,27 +1291,6 @@ For \LaTeXe, \LuaTeX-ja adopted most of the font selection system of \pLaTeXe\ (
 %<*ja>
 \LaTeX で用いる際には,\pLaTeXe\ (\texttt{plfonts.dtx})用のフォント選択機構の大部分を流用している.
 %</ja>
-\begin{itemize}
-%<*en>
-\item \cs{fontfamily}, \cs{fontseries}, and~\cs{fontshape} try to change
-      attributes of Japanese fonts, as well as those of alphabetic fonts.
-      Of course, \cs{selectfont} is needed to select current text fonts.
-
-      \textbf{Remark in \LaTeX~2020-02-02 or later}:
-      \cs{fontshape} always changes current alphabetic font shape,
-      but it does \emph{not} change current Japanese font shape if
-      the target shape is unavailable for current Japanese encoding/family/series.
-      For the detail, see Subsection~\ref{ssec:nfsspat}.
-%</en>
-%<*ja>
-\item \cs{fontfamily}, \cs{fontseries}, \cs{fontshape} は欧文・和文フォント両方の属性を変更しようとする.
-      もちろん,それらを実際に反映させるには手動で \cs{selectfont} を実行する必要がある.
-
-      \emph{\LaTeX\ 2020-02-02以降での注意}:
-      \cs{fontshape\{<shape>\}}は常に欧文フォントのシェイプを設定するが,
-      もしも現在の和文フォントファミリ・シリーズで要求されたシェイプが利用不能だった場合には,和文フォントのシェイプは変更しない.
-      詳細は\ref{ssec:nfsspat}節を参照すること.
-%</ja>
 
 %<*en>
 \begin{center}\small
@@ -1324,7 +1303,7 @@ Alphabetic fonts
 Japanese fonts
 &\cs{kanjiencoding}&\cs{kanjifamily}&\cs{kanjiseries}&\cs{kanjishape}
 &\cs{usekanji}\\
-both&---&--&\cs{fontseries}&\cs{fontshape}&---\\
+both&---&--&\cs{fontseries}&\cs{fontshape}$^*$&---\\
 auto select&\cs{fontencoding}&\cs{fontfamily}&---&---&\cs{usefont}\\
 \bottomrule
 \end{tabular}
@@ -1341,15 +1320,35 @@ auto select&\cs{fontencoding}&\cs{fontfamily}&---&---&\cs{usefont}\\
 \emph{和文}
 &\cs{kanjiencoding}&\cs{kanjifamily}&\cs{kanjiseries}&\cs{kanjishape}
 &\cs{usekanji}\\
-\emph{両方}&---&--&\cs{fontseries}&\cs{fontshape}&---\\
+\emph{両方}&---&--&\cs{fontseries}&\cs{fontshape}$^*$&---\\
 \emph{自動選択}&\cs{fontencoding}&\cs{fontfamily}&---&---&\cs{usefont}\\
 \bottomrule
 \end{tabular}
 \end{center}
 %</ja>
 
+\begin{itemize}
+%<*en>
+\item \cs{fontfamily}, \cs{fontseries}, and~\cs{fontshape} try to change
+      attributes of Japanese fonts, as well as those of alphabetic fonts.
+      Of course, \cs{selectfont} is needed to select current text fonts.
+
+      Note that \cs{fontshape} always changes current alphabetic font shape,
+      but it does \emph{not} change current Japanese font shape if
+      the target shape is unavailable for current Japanese encoding/family/series.
+      For the detail, see Subsection~\ref{ssec:nfsspat}.
+%</en>
+%<*ja>
+\item \cs{fontfamily}, \cs{fontseries}, \cs{fontshape} は欧文・和文フォント両方の属性を変更しようとする.
+      もちろん,それらを実際に反映させるには手動で \cs{selectfont} を実行する必要がある.
+
+      なお,\cs{fontshape\{<shape>\}}は常に欧文フォントのシェイプを設定するが,
+      もしも現在の和文フォントファミリ・シリーズで要求されたシェイプが利用不能だった場合には,和文フォントのシェイプは変更しない.
+      詳細は\ref{ssec:nfsspat}節を参照すること.
+%</ja>
+
 %<*en>
-      \verb+\fontencoding{+<encoding>\verb+}+ changes the encoding of alphabetic fonts
+\item \verb+\fontencoding{+<encoding>\verb+}+ changes the encoding of alphabetic fonts
       or Japanese fonts depending on the argument. For example,
       \verb+\fontencoding{JY3}+ changes the encoding of Japanese fonts to
       \texttt{JY3}, and \verb+\fontencoding{T1}+ changes the encoding of
@@ -1359,7 +1358,7 @@ auto select&\cs{fontencoding}&\cs{fontfamily}&---&---&\cs{usefont}\\
       For the detail, see Subsection~\ref{ssec:nfsspat}.
 %</en>
 %<*ja>
-      ここで,\cs{fontencoding\{<encoding>\}}は,引数により和文側か欧文
+\item  ここで,\cs{fontencoding\{<encoding>\}}は,引数により和文側か欧文
       側かのどちらかのエンコーディングを変更する.例えば,
       \verb+\fontencoding{JY3}+ は和文フォントのエンコーディングを
       \texttt{JY3}に変更し,\verb+\fontencoding{T1}+ は欧文フォント側を
@@ -6501,8 +6500,8 @@ However, this leads a lot of \LaTeX\ font warning like
 when \cs{itshape} is called,
 because almost all Japanese fonts only have shape ``\texttt{n}'', and \cs{itshape} calls \cs{fontshape}.
 
-\LuaTeX-ja~********.0 (with \LaTeX\ 2020-02-02 or~later) change the behavior. Namely,
-\cs{fontshape\{<shape>\}}\cs{fontshapeforce\{<shape>\}} change current Japanese font shape, only if
+\LuaTeX-ja~********.0 change the behavior. Namely,
+\cs{fontshape\{<shape>\}}~and~\cs{fontshapeforce\{<shape>\}} change current Japanese font shape, only if
 the required shape (according to shape changing rules) or <shape> is avaliable in current Japanese font family/series.
 When this is not the case, an info such as
 \begin{verbatim}
@@ -6537,7 +6536,7 @@ is issued instead of a warning.
 \item[\cs{kanjishape}\{<shape>\}\textrm{, }\cs{kanjishapeforce}\{<shape>\}]
 %<*en>
 \cs{kanjishape\{<shape>\}} changes current Japanese font shape according to shape change rules, and
-\cs{kanjishape\{<shape>\}} changes current Japanese font shape to <shape>, regardless of the rules.
+\cs{kanjishapeforce\{<shape>\}} changes current Japanese font shape to <shape>, regardless of the rules.
 Hence \cs{kanjishape\{it\}} produces a warning
 \begin{verbatim}
     Font shape `JY3/mc/m/it' undefined
@@ -6553,9 +6552,9 @@ which is not produced by \cs{fontshape\{it\}}.
 \begin{figure}[!tb]
 \begin{LTXexample}[pos=b]
 \DeclareKanjiFamily{JY3}{edm}{}
-\DeclareFontShape{JY3}{edm}{m}{n}   {<-> s*KozMinPr6N-Regular:jfm=ujis;}{}
-\DeclareFontShape{JY3}{edm}{m}{fb}  {<-> s*KozGoPr6N-Regular:jfm=ujis}{}
-\DeclareFontShape{JY3}{edm}{m}{fb2} {<-> s*KozGoPr6N-Medium:jfm=ujis}{}
+\DeclareFontShape{JY3}{edm}{m}{n}   {<-> s*KozMinPr6N-Regular:jfm=ujis}{}
+\DeclareFontShape{JY3}{edm}{m}{fb}  {<-> s*KozGoPr6N-Regular:jfm=ujis;color=003FFF}{}
+\DeclareFontShape{JY3}{edm}{m}{fb2} {<-> s*KozGoPr6N-Regular:jfm=ujis;color=FF1900}{}
 \DeclareAlternateKanjiFont{JY3}{edm}{m}{n}{JY3}{edm}{m}{fb}{ "4E00-"67FF,{-2}-{-2}}
 \DeclareAlternateKanjiFont{JY3}{edm}{m}{n}{JY3}{edm}{m}{fb2}{"6800-"9FFF}
 {\kanjifamily{edm}\selectfont
@@ -6935,11 +6934,11 @@ will not be embedded in the output PDF file. See Subsection~\ref{ssec:psft}.
 \begin{figure}[!tb]
 \begin{LTXexample}[width=0.25\textwidth]
 \jfontspec[
-  YokoFeatures={FakeBold=3}, TateFeatures={FakeBold=6},
+  YokoFeatures={Color=FF1900}, TateFeatures={Color=003FFF},
   TateFont=KozGoPr6N-Regular
 ]{KozMinPr6N-Regular}
 \hbox{\yoko 横組のテスト}\hbox{\tate 縦組のテスト}
-\addjfontfeatures{FakeBold=0}
+\addjfontfeatures{Color=00AF00}
 \hbox{\yoko 横組}\hbox{\tate 縦組}
 \end{LTXexample}
 %<ja>\caption{\texttt{TateFeatures} 等の使用例}
@@ -6985,9 +6984,9 @@ A demonstrarion is shown in \autoref{fig:yokotate-fontspec}.
 \begin{LTXexample}[pos=b]
 \jfontspec[
   AltFont={
-    {Range="4E00-"67FF, Font=KozGoPr6N-Medium},
-    {Range="6800-"9EFF, FakeBold=4},
-    {Range="3040-"306F, Font=KozGoPr6N-Regular},
+    {Range="4E00-"67FF, Font=KozGoPr6N-Regular, Color=003FFF},
+    {Range="6800-"9EFF, Color=FF1900},
+    {Range="3040-"306F, Font=KozGoPr6N-Regular, Color=35A16B},
   }
 ]{KozMinPr6N-Regular}
 日本国民は、正当に選挙された国会における代表者を通じて行動し、われらとわれらの子孫のために、
@@ -7049,7 +7048,7 @@ For example,
 \begin{lstlisting}
 AltFont = {
   { Font=HogeraMin-Light, BoldFont=HogeraMin-Bold,
-    Range="3000-"30FF, BoldFeatures={FakeBold=1} }
+    Range="3000-"30FF, BoldFeatures={Color=FF1900} }
 }
 \end{lstlisting}
 does \emph{not} work. Instead, one have to write
@@ -7058,7 +7057,7 @@ UprightFeatures = {
   AltFont = { { Font=HogeraMin-Light, Range="3000-"30FF, } },
 },
 BoldFeatures = {
-  AltFont =  { { Font=HogeraMin-Bold, Range="3000-"30FF, FakeBold=1 } },
+  AltFont =  { { Font=HogeraMin-Bold, Range="3000-"30FF, Color=FF1900 } },
 }
 \end{lstlisting}
 
@@ -7081,7 +7080,7 @@ has no effect, because a color specification is already done in
 \begin{lstlisting}
 AltFont = {
   { Font=HogeraMin-Light, BoldFont=HogeraMin-Bold,
-    Range="3000-"30FF, BoldFeatures={FakeBold=1} }
+    Range="3000-"30FF, BoldFeatures={Color=FF1900} }
 }
 \end{lstlisting}
 のように指定することは出来ず,
@@ -7090,7 +7089,7 @@ UprightFeatures = {
   AltFont = { { Font=HogeraMin-Light, Range="3000-"30FF, } },
 },
 BoldFeatures = {
-  AltFont =  { { Font=HogeraMin-Bold, Range="3000-"30FF, FakeBold=1 } },
+  AltFont =  { { Font=HogeraMin-Bold, Range="3000-"30FF, Color=FF1900 } },
 }
 \end{lstlisting}
 のように指定しなければならない.
diff --git a/src/patches/#lltjfont.sty# b/src/patches/#lltjfont.sty#
new file mode 100644 (file)
index 0000000..32ac165
--- /dev/null
@@ -0,0 +1,1099 @@
+%
+% lltjfont.sty: derived from plfonts.dtx in pLaTeX.
+%
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{lltjfont}[2020/03/15 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}%
+  \afterassignment\ltj@chardef@text@cmd@\ltj@tempcnta
+}
+\def\ltj@chardef@text@cmd@{%
+  \ifnum\ltj@tempcnta>"7F
+    \expandafter\edef\csname \ltj@chardef@text@cmd@name\endcsname{%
+      \noexpand\ltjalchar\the\ltj@tempcnta\space
+    }%
+  \else
+    \expandafter\chardef\csname \ltj@chardef@text@cmd@name\endcsname\ltj@tempcnta
+  \fi
+}
+\def\DeclareTextSymbol#1#2#3{%
+  \@dec@text@cmd\ltj@chardef@text@cmd#1{#2}#3\relax
+}
+
+\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
+\let\ck@encoding\@empty
+% LuaTeX-ja uses JY3 and JT3 encodings.
+\def\cy@encoding{JY3}\def\ct@encoding{JT3}
+
+\let\k@family\@empty
+\let\k@series\@empty
+\let\k@shape\@empty
+\def\curr@kfontshape{\k@encoding/\k@family/\k@series/\k@shape}
+\def\rel@fontshape{\f@encoding/\f@family/\f@series/\f@shape}
+\ifdefined\Cht\else\newdimen\Cht\fi
+\ifdefined\cht\else\newdimen\cht\fi
+\ifdefined\Cdp\else\newdimen\Cdp\fi
+\ifdefined\cdp\else\newdimen\cdp\fi
+\ifdefined\Cwd\else\newdimen\Cwd\fi
+\ifdefined\cwd\else\newdimen\cwd\fi
+\ifdefined\Cvs\else\newdimen\Cvs\fi
+\ifdefined\cvs\else\newdimen\cvs\fi
+\ifdefined\Chs\else\newdimen\Chs\fi
+\ifdefined\chs\else\newdimen\chs\fi
+\ifdefined\cHT\else\newdimen\cHT\fi
+%\let\afont\font
+
+\let\ystrutbox\strutbox
+\newbox\dstrutbox
+\newbox\tstrutbox
+\newbox\zstrutbox
+\def\strutbox{%
+  \ifnum\ltjgetparameter{direction}=1 \dstrutbox       % dtou
+  \else\ifnum\ltjgetparameter{direction}=4 \ystrutbox  % yoko
+  \else\tstrutbox  % tate and utod
+  \fi\fi
+}
+\DeclareRobustCommand\strut{\relax
+  \ifnum\ltjgetparameter{direction}=1 % dtou
+    \ifmmode\copy\dstrutbox\else\unhcopy\dstrutbox\fi
+  \else\ifnum\ltjgetparameter{direction}=4 % yoko
+    \ifmmode\copy\ystrutbox\else\unhcopy\ystrutbox\fi
+  \else % tate and utod
+    \ifmmode\copy\tstrutbox\else\unhcopy\tstrutbox\fi
+  \fi\fi
+}
+
+\DeclareRobustCommand\ystrut{\relax\hbox{\ltj@@orig@yoko
+   \ifmmode\copy\ystrutbox\else\unhcopy\ystrutbox\fi}}
+\DeclareRobustCommand\tstrut{\relax\hbox{\ltj@@orig@tate
+   \ifmmode\copy\tstrutbox\else\unhcopy\tstrutbox\fi}}
+\DeclareRobustCommand\dstrut{\relax\hbox{\ltj@@orig@dtou
+   \ifmmode\copy\dstrutbox\else\unhcopy\dstrutbox\fi}}
+\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%
+}
+
+\def\DeclareFontEncoding{%
+  \begingroup
+  \nfss@catcodes
+  \expandafter\endgroup
+  \DeclareFontEncoding@}
+\def\DeclareFontEncoding@#1#2#3{%
+  \expandafter
+  \ifx\csname T@#1\endcsname\relax
+     \def\cdp@elt{\noexpand\cdp@elt}%
+     \xdef\cdp@list{\cdp@list\cdp@elt{#1}%
+                    {\default@family}{\default@series}%
+                    {\default@shape}}%
+     \expandafter\let\csname#1-cmd\endcsname\@changed@cmd
+     \directlua{luatexja.jfont.add_fenc_list('\luatexluaescapestring{#1}')}%
+  \else
+     \@font@info{Redeclaring font encoding #1}%
+  \fi
+  \global\@namedef{T@#1}{#2}%
+  \global\@namedef{M@#1}{\default@M#3}%
+  \xdef\LastDeclaredEncoding{#1}%
+  }
+\def\DeclareKanjiEncoding#1{%
+  \@latex@warning{%
+     The \string\DeclareKanjiEncoding\space is obsoleted command.  Please use
+     \MessageBreak
+     the \string\DeclareTateKanjiEncoding\space for `Tate-kumi' encoding, and
+     \MessageBreak
+     the \string\DeclareYokoKanjiEncoding\space for `Yoko-kumi' encoding.
+     \MessageBreak
+     I treat the `#1' encoding as `Yoko-kumi'.}
+  \DeclareYokoKanjiEncoding{#1}%
+}
+\def\DeclareYokoKanjiEncoding{%
+  \begingroup
+  \nfss@catcodes
+  \expandafter\endgroup
+  \DeclareYokoKanjiEncoding@}
+\def\DeclareYokoKanjiEncoding@#1#2#3{%
+  \expandafter\ifx\csname T@#1\endcsname\relax
+    \def\cdp@elt{\noexpand\cdp@elt}%
+    \xdef\cdp@list{\cdp@list\cdp@elt{#1}%
+                    {\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}')}%
+  \else
+    \@font@info{Redeclaring KANJI (yoko) font encoding #1}%
+  \fi
+  \global\@namedef{T@#1}{#2}%
+  \global\@namedef{M@#1}{\default@KM#3}%
+  }
+\def\DeclareTateKanjiEncoding{%
+  \begingroup
+  \nfss@catcodes
+  \expandafter\endgroup
+  \DeclareTateKanjiEncoding@}
+\def\DeclareTateKanjiEncoding@#1#2#3{%
+  \expandafter\ifx\csname T@#1\endcsname\relax
+    \def\cdp@elt{\noexpand\cdp@elt}%
+    \xdef\cdp@list{\cdp@list\cdp@elt{#1}%
+                    {\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}')}%
+  \else
+    \@font@info{Redeclaring KANJI (tate) font encoding #1}%
+  \fi
+  \global\@namedef{T@#1}{#2}%
+  \global\@namedef{M@#1}{\default@KM#3}%
+  }
+\@onlypreamble\DeclareKanjiEncoding
+\@onlypreamble\DeclareYokoKanjiEncoding
+\@onlypreamble\DeclareYokoKanjiEncoding@
+\@onlypreamble\DeclareTateKanjiEncoding
+\@onlypreamble\DeclareTateKanjiEncoding@
+\def\DeclareKanjiEncodingDefaults#1#2{%
+  \ifx\relax#1\else
+    \ifx\default@KT\@empty\else
+      \@font@info{Overwriting KANJI encoding scheme text defaults}%
+    \fi
+    \gdef\default@KT{#1}%
+  \fi
+  \ifx\relax#2\else
+    \ifx\default@KM\@empty\else
+      \@font@info{Overwriting KANJI encoding scheme math defaults}%
+    \fi
+    \gdef\default@KM{#2}%
+  \fi}
+\let\default@KT\@empty
+\let\default@KM\@empty
+\@onlypreamble\DeclareKanjiEncodingDefaults
+\def\DeclareFontFamily#1#2#3{%
+ \@ifundefined{T@#1}%
+    {\@latex@error{Encoding scheme `#1' unknown}\@eha}%
+    {\def\reserved@a{#3}%
+     \global
+     \expandafter\let\csname #1+#2\expandafter\endcsname
+            \ifx \reserved@a\@empty
+              \@empty
+            \else \reserved@a
+            \fi
+     \directlua{luatexja.jfont.add_ffam('\luatexluaescapestring{#2}')}%
+    }%
+}
+\def\DeclareKanjiFamily#1#2#3{%
+ \@ifundefined{T@#1}%
+    {\@latex@error{KANJI Encoding scheme `#1' unknown}\@eha}%
+    {\def\reserved@a{#3}%
+     \global
+     \expandafter\let\csname #1+#2\expandafter\endcsname
+            \ifx \reserved@a\@empty
+              \@empty
+            \else \reserved@a
+            \fi
+     \directlua{luatexja.jfont.add_kfam('\luatexluaescapestring{#2}')}%
+     }%
+}
+\def\DeclareKanjiSubstitution#1#2#3#4{%
+  \expandafter\ifx\csname T@#1\endcsname\relax
+    \@latex@error{KANJI Encoding scheme `#1' unknown}\@eha
+  \else
+    \begingroup
+       \def\reserved@a{#1}%
+       \toks@{}%
+       \def\cdp@elt##1##2##3##4{%
+         \def\reserved@b{##1}%
+         \ifx\reserved@a\reserved@b
+           \addto@hook\toks@{\cdp@elt{#1}{#2}{#3}{#4}}%
+         \else
+           \addto@hook\toks@{\cdp@elt{##1}{##2}{##3}{##4}}%
+         \fi}%
+       \cdp@list
+       \xdef\cdp@list{\the\toks@}%
+    \endgroup
+    \global\@namedef{D@#1}{\def\default@family{#2}%
+                           \def\default@series{#3}%
+                           \def\default@shape{#4}}%
+  \fi}
+\@onlypreamble\DeclareKanjiSubstitution
+\def\DeclareErrorKanjiFont#1#2#3#4#5{%
+   \xdef\error@kfontshape{%
+      \noexpand\expandafter\noexpand\split@name\noexpand\string
+      \expandafter\noexpand\csname#1/#2/#3/#4/#5\endcsname
+      \noexpand\@nil}%
+   \gdef\default@k@family{#2}%
+   \gdef\default@k@series{#3}%
+   \gdef\default@k@shape{#4}%
+   }
+\@onlypreamble\DeclareErrorKanjiFont
+
+\newif\ifltjselectfont@force@define
+\def\DeclareFixedFont#1#2#3#4#5#6{%
+   \begingroup
+      \math@fontsfalse
+      \every@math@size{}%
+      \fontsize{#6}\z@
+      \directlua{luatexja.jfont.is_kyenc('\luatexluaescapestring{#2}')}\ifin@%
+           \ltjselectfont@force@definetrue
+        \usekanji{#2}{#3}{#4}{#5}%
+        \global\let#1\getjfont
+           \ltjselectfont@force@definefalse
+      \else
+        \directlua{luatexja.jfont.is_ktenc('\luatexluaescapestring{#2}')}\ifin@%
+             \ltjselectfont@force@definetrue
+          \usekanji{#2}{#3}{#4}{#5}%
+          \global\let#1\gettfont
+             \ltjselectfont@force@definefalse
+        \else
+          \useroman{#2}{#3}{#4}{#5}%
+          \global\expandafter\let\expandafter#1\the\font
+        \fi
+      \fi
+   \endgroup
+  }
+\def\DLMfontsw@standard#1#2#3{#1{#2{#3}}}
+\def\reDeclareMathAlphabet#1#2#3{%
+  \ifdefined#2
+    \@temptokena\expandafter{#2}%
+  \else
+    \@temptokena{#2}%
+  \fi
+  \ifdefined#3
+    \toks0\expandafter{#3}%
+  \else
+    \toks0{#3}%
+  \fi
+  \long\protected\edef#1{%
+    \noexpand\DLMfontsw@standard{\the\@temptokena}{\the\toks0}}%
+}
+\@onlypreamble\reDeclareMathAlphabet
+\def\all@shape{all}%
+\def\DeclareRelationFont#1#2#3#4#5#6#7#8{%
+  \def\rel@shape{#4}%
+  \ifx\rel@shape\@empty
+     \global
+     \expandafter\def\csname rel@#1/#2/#3/all\endcsname{%
+       \romanencoding{#5}\romanfamily{#6}%
+       \romanseries{#7}}%
+  \else
+     \global
+     \expandafter\def\csname rel@#1/#2/#3/#4\endcsname{%
+       \romanencoding{#5}\romanfamily{#6}%
+       \romanseries{#7}\romanshape{#8}}%
+  \fi
+}
+\def\SetRelationFont#1#2#3#4#5#6#7#8{%
+  \def\rel@shape{#4}%
+  \ifx\rel@shape\@empty
+     \expandafter\def\csname rel@#1/#2/#3/all\endcsname{%
+       \romanencoding{#5}\romanfamily{#6}%
+       \romanseries{#7}}%
+  \else
+     \expandafter\def\csname rel@#1/#2/#3/#4\endcsname{%
+       \romanencoding{#5}\romanfamily{#6}%
+       \romanseries{#7}\romanshape{#8}}%
+  \fi
+}
+\newif\if@knjcmd
+\DeclareRobustCommand\userelfont{\@knjcmdtrue}
+
+
+\RequirePackage{everysel}
+\let\ltj@@EverySelectfont@Init=\@EverySelectfont@Init
+\expandafter\expandafter\expandafter\let
+\expandafter\expandafter\csname ltj@@orig@selectfont\endcsname\csname selectfont\space\endcsname
+\@EverySelectfont@Init
+%\let\ltj@@font@info\@font@info
+%\let\ltj@@font@warning\@font@warning
+\def\@EverySelectfont@Init{%
+  \expandafter\let\csname selectfont\space \endcsname \ltj@@orig@selectfont
+  \ltj@@EverySelectfont@Init
+}
+\def\ltj@selectfont@tate{%
+  \let\k@encoding\ct@encoding
+  \xdef\font@name{\csname\curr@kfontshape/\f@size\endcsname}%
+  \pickup@tfont
+  \ifnum\ltjgetparameter{direction}=3 \font@name
+    \ltj@@does@alt@set{\curr@kfontshape}{%
+      % alt fonts の定義
+      \directlua{luatexja.jfont.output_alt_font_cmd('t', '\luatexluaescapestring{\curr@kfontshape}')}%
+      % 定義した alt fonts のデータを \ltjdeclarealtfont に渡すのと同等の処理をする
+      \directlua{luatexja.jfont.pickup_alt_font_a('\f@size')}%
+    }%
+  \fi}
+\def\ltj@selectfont@yoko{%
+  \let\k@encoding\cy@encoding
+  \xdef\font@name{\csname\curr@kfontshape/\f@size\endcsname}%
+  \pickup@jfont
+  \unless\ifnum\ltjgetparameter{direction}=3 \font@name
+        \ltj@@does@alt@set{\curr@kfontshape}{%
+      % alt fonts の定義
+      \directlua{luatexja.jfont.output_alt_font_cmd('y', '\luatexluaescapestring{\curr@kfontshape}')}%
+      % 定義した alt fonts のデータを \ltjdeclarealtfont に渡すのと同等の処理をする
+      \directlua{luatexja.jfont.pickup_alt_font_a('\f@size')}%
+    }%
+  \fi}
+\def\ltj@selectfont@patch{%
+  \directlua{luatexja.base.start_time_measure('selectfont')}%
+  \let\tmp@error@fontshape\error@fontshape
+  \let\error@fontshape\error@kfontshape
+  \directlua{luatexja.jfont.is_kyenc('\luatexluaescapestring{\k@encoding}')}\ifin@%
+    \let\cy@encoding\k@encoding
+    \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}%
+    \else
+      \@latex@error{KANJI Encoding scheme `\k@encoding' unknown}\@eha
+    \fi
+  \fi
+  \global\let\ltj@afont@name=\font@name
+  \ltj@selectfont@tate\ltj@selectfont@yoko
+%
+  \edef\tmp@item{{\k@encoding}}\expandafter\def\expandafter\k@encoding\tmp@item
+  \kenc@update
+  \global\let\font@name=\ltj@afont@name
+  \let\error@fontshape\tmp@error@fontshape
+  \if@knjcmd \@knjcmdfalse
+    \expandafter\ifx
+    \csname rel@\k@encoding/\k@family/\k@series/\k@shape\endcsname\relax
+      \expandafter\ifx
+         \csname rel@\k@encoding/\k@family/\k@series/all\endcsname\relax
+      \else
+         \csname rel@\k@encoding/\k@family/\k@series/all\endcsname\selectfont
+         % 警告: 再び \selectfont を呼んでいる.無限ループの可能性あり
+      \fi
+    \else
+       \csname rel@\k@encoding/\k@family/\k@series/\k@shape\endcsname\selectfont
+       % 警告: 再び \selectfont を呼んでいる.無限ループの可能性あり
+    \fi
+  \fi
+  \global\let\font@name=\ltj@afont@name
+  \directlua{luatexja.base.stop_time_measure('selectfont')}%
+}
+\EverySelectfont{\ltj@selectfont@patch}
+
+\bgroup
+  \def\ltj@@dir@patch#1#2#3{%
+    \global\csletcs{ltj@@orig@#1}{#1}%
+       \protected\expandafter\xdef\csname #1\endcsname{%
+         \csname ltj@@orig@#1\endcsname
+      \unexpanded{\ifnum#3<\z@\let\ltj@@protect\protect\set@typeset@protect}%
+      \unexpanded{\global\let\ltj@afont@name=\font@name}%
+         \expandonce{\csname ltj@selectfont@#2\endcsname}%
+      \unexpanded{\global\let\font@name=\ltj@afont@name}%
+      \unexpanded{\let\protect\ltj@@protect\fi}%
+       }%
+  }
+  \ltj@@dir@patch{yoko}{yoko}{\ltj@curjfnt}
+  \ltj@@dir@patch{tate}{tate}{\ltj@curtfnt}
+  \ltj@@dir@patch{utod}{yoko}{\ltj@curjfnt}
+  \ltj@@dir@patch{dtou}{yoko}{\ltj@curjfnt}
+\egroup
+
+\def\KanjiEncodingPair#1#2{\@namedef{t@enc@#1}{#2}\@namedef{y@enc@#2}{#1}}
+\def\set@fontsize#1#2#3{%
+    \@defaultunits\@tempdimb#2pt\relax\@nnil
+    \edef\f@size{\strip@pt\@tempdimb}%
+    \@defaultunits\@tempskipa#3pt\relax\@nnil
+    \edef\f@baselineskip{\the\@tempskipa}%
+    \edef\f@linespread{#1}%
+    \let\baselinestretch\f@linespread
+    \def\size@update{%
+      \baselineskip\f@baselineskip\relax
+      \baselineskip\f@linespread\baselineskip
+      \normalbaselineskip\baselineskip
+      \adjustbaseline
+      \setbox\ystrutbox\hbox{\ltj@@orig@yoko
+          \vrule\@width\z@
+                \@height.7\baselineskip \@depth.3\baselineskip}%
+      \setbox\dstrutbox\hbox{\ltj@@orig@dtou
+          \vrule\@width\z@
+                \@height.7\baselineskip \@depth.3\baselineskip}%
+      \setbox\tstrutbox\hbox{\ltj@@orig@tate
+          \vrule\@width\z@
+                \@height.5\baselineskip \@depth.5\baselineskip}%
+      \setbox\zstrutbox\hbox{\ltj@@orig@utod
+          \vrule\@width\z@
+                \@height.7\baselineskip \@depth.3\baselineskip}%
+     \let\size@update\relax}}
+
+\newluafunction\ltj@@adjust@baseline@inner
+\begingroup\catcode`\~=12
+\directlua{%
+  local nulltable = {}
+  local t = lua.get_functions_table()
+  local getfont, dir_tate = font.getfont, luatexja.dir_table.dir_tate
+  local fmt, get_attr = luatexja.jfont.font_metric_table, tex.getattribute
+  local getcount=tex.getcount
+  local setdimen, set_attr = tex.setdimen, tex.setattribute
+  local dir = luatexja.unary_pars.direction
+  t[\the\ltj@@adjust@baseline@inner] = function()
+    local ft = fmt[get_attr('ltj@curtfnt')] or nulltable
+    ft = ft.char_type or nulltable
+    local fk = ft[0] or nulltable
+    local ht, dp, wd = fk.height or 0, fk.depth or 0,
+                       fk.width or ft.zw or 0
+    local fm 
+      = ((getfont(font.current()) or nulltable)
+        .characters or nulltable)[77] or nulltable %% 'M'
+    set_attr('ltj@tablshift',
+      tex.round(0.5*((fm.height or 0)- (fm.depth or 0) - ht+ dp)))
+    if dir() ~= dir_tate then
+      ft = fmt[get_attr('ltj@curjfnt')] or nulltable
+      ft = ft.char_type or nulltable
+      fk = ft[0] or nulltable
+      ht, dp, wd = fk.height or 0, fk.depth or 0,
+                   fk.width or ft.zw or 0
+    end
+    setdimen('cht', ht); setdimen('cdp', dp)
+    setdimen('cwd', wd); setdimen('chs', wd)
+    setdimen('cHT', ht+dp)
+  end
+}\endgroup
+\DeclareRobustCommand\adjustbaseline{\luafunction\ltj@@adjust@baseline@inner
+   \cvs\normalbaselineskip}
+\DeclareRobustCommand\romanencoding[1]{%
+    \expandafter\ifx\csname T@#1\endcsname\relax
+      \@latex@error{Encoding scheme `#1' unknown}\@eha
+    \else
+      \edef\f@encoding{#1}%
+      \ifx\cf@encoding\f@encoding
+        \let\enc@update\relax
+      \else
+        \let\enc@update\@@enc@update
+      \fi
+    \fi
+}
+\DeclareRobustCommand\kanjiencoding[1]{%
+    \expandafter\ifx\csname T@#1\endcsname\relax
+      \@latex@error{KANJI Encoding scheme `#1' unknown}\@eha
+    \else
+      \edef\k@encoding{#1}%
+      \ifx\ck@encoding\k@encoding
+         \let\kenc@update\relax
+      \else
+         \let\kenc@update\@@kenc@update
+      \fi
+    \fi
+}
+\DeclareRobustCommand\fontencoding[1]{%
+  \directlua{luatexja.jfont.is_kyenc('\luatexluaescapestring{#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@%
+    \let\cy@encoding\k@encoding
+  \else
+    \directlua{luatexja.jfont.is_ktenc(\tmp@enc)}\ifin@%
+      \let\ct@encoding\k@encoding
+    \else
+      \@latex@error{KANJI Encoding scheme `\k@encoding' unknown}\@eha
+    \fi
+  \fi
+}
+\let\kenc@update\relax
+\def\@changed@kcmd#1#2{%
+   \ifx\protect\@typeset@protect
+      \@inmathwarn#1%
+      \expandafter\ifx\csname\ck@encoding\string#1\endcsname\relax
+         \expandafter\ifx\csname ?\string#1\endcsname\relax
+            \expandafter\def\csname ?\string#1\endcsname{%
+               \TextSymbolUnavailable#1%
+            }%
+         \fi
+         \global\expandafter\let
+               \csname\cf@encoding \string#1\expandafter\endcsname
+               \csname ?\string#1\endcsname
+      \fi
+      \csname\ck@encoding\string#1%
+         \expandafter\endcsname
+   \else
+      \noexpand#1%
+   \fi}
+\newif\if@notkfam
+\newif\if@notffam
+\newif\if@tempswz
+\def\@ltj@use@fd{true}
+\DeclareRobustCommand\romanfamily[1]{\edef\f@family{#1}}
+\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)}%
+  \ifin@\edef\k@family{#1}\else\@notkfamtrue\fi
+  %
+  % alphabetic fonts part
+  \directlua{luatexja.jfont.is_ffam(\tmp@item)}%
+  \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}%
+    \else
+      \@tempswafalse
+      \def\cdp@elt##1{\ifcsname ##1+#1\endcsname\@tempswatrue\fi}%
+      \directlua{luatexja.jfont.search_ffam_declared()}%
+      \if@tempswz
+        \directlua{luatexja.jfont.add_ffam(\tmp@item)}\edef\f@family{#1}%
+      \else
+        % now we search Nffam_list and font definition files.
+        \directlua{luatexja.jfont.search_ffam_fd(\tmp@item)}%
+        \ifin@\edef\f@family{#1}\else\@notffamtrue\fi
+      \fi
+    \fi
+  \fi
+  %
+  \if@notkfam\if@notffam
+    \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
+}
+\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
+    \@font@info{Kanji font shape \reserved@b' undefined\MessageBreak
+                No change}%
+  \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\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
+%%%%
+\protected\def\usefont#1#2#3#4{%
+  \directlua{luatexja.jfont.is_kenc('\luatexluaescapestring{#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}
+% 
+\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}}
+\DeclareRobustCommand\bfseries{%
+  \not@math@alphabet\bfseries\mathbf
+  \expand@font@defaults
+  \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
+  \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
+}
+\DeclareRobustCommand\mdseries{%
+  \not@math@alphabet\mdseries\relax
+  \expand@font@defaults
+  \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
+  \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
+}
+\appto\expand@font@defaults{%
+  \edef\mcdef@ult{\mcdefault}%
+  \edef\gtdef@ult{\gtdefault}%
+  \edef\jttdef@ult{\jttdefault}%
+  \edef\kanjidef@ult{\kanjifamilydefault}%
+}
+\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
+  \prepare@family@series@update@kanji{mc}\mcdefault
+  \selectfont}
+\DeclareRobustCommand\gtfamily{%
+  \unless\ifltj@disablejfam\not@math@alphabet\gtfamily\mathgt\fi
+  \prepare@family@series@update@kanji{gt}\gtdefault
+  \selectfont}
+
+
+
+\let\romanprocess@table\process@table
+\def\kanjiprocess@table{%
+  \kanjiencoding{\kanjiencodingdefault}%
+  \kanjifamily{\kanjifamilydefault}%
+  \kanjiseries{\kanjiseriesdefault}%
+  \kanjishape{\kanjishapedefault}%
+}
+\def\process@table{%
+  \romanprocess@table
+  \kanjiprocess@table
+}
+\@onlypreamble\romanprocess@table
+\@onlypreamble\kanjiprocess@table
+
+%%%%%% LuaTeX-ja specific
+
+% #1 の展開結果から encoding 部分をとりだし,それが和文用かどうかの結果を \ifin@ に代入
+\def\ltj@@IsFontJapanese#1{%
+  \directlua{luatexja.jfont.is_kenc(string.match(
+      '\luatexluaescapestring{#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
+  \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
+  \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{%
+  \directlua{
+       local s = '\luatexluaescapestring{#1}'
+       local is_braced, is_quoted
+       if s:sub(1,1)=='{' and s:sub(-1)=='}' then is_braced=true; s=s:sub(2,-2) end
+       if s:sub(1,1)=='"' and s:sub(-1)=='"' then is_quoted=true; s=s:sub(2,-2) end
+       s=s..luatexja.jfont.print_aftl_address()
+       if is_braced then s='{'..s..'}' elseif is_quoted then s='"'..s..'"' end
+       %print(s, is_quoted, is_braced)
+    tex.sprint(-2, s)}%
+  \space at%
+}
+\def\extract@jfont{%
+       \get@external@font
+    \ltj@@does@alt@set{\f@encoding/\f@family/\f@series/\f@shape}{%
+      \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
+    \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}
+\def\extract@jfont@onlyjfm{%
+       \get@external@font
+       \csxdef{ltj@@fontjfm/\expandafter\string\font@name}{%
+         \directlua{%
+               luatexja.jfont.load_jfmonly('\luatexluaescapestring{\external@font}', 'yoko')
+         }%
+       }}
+\def\extract@tfont@onlyjfm{%
+       \get@external@font
+       \csxdef{ltj@@fontjfm/\expandafter\string\font@name}{%
+         \directlua{%
+               luatexja.jfont.load_jfmonly('\luatexluaescapestring{\external@font}', 'tate')
+         }%
+       }}
+
+\let\ltj@@al@do@subst@correction=\do@subst@correction
+\def\ltj@@ja@do@subst@correction{%
+    \xdef\subst@correction{%
+      \font@name
+      \global\expandafter\let\csname \curr@fontshape/\f@size\endcsname\font@name%
+      \relax}%
+    \aftergroup\subst@correction
+}
+\def\do@subst@correction{%
+   \directlua{luatexja.jfont.is_kenc('\luatexluaescapestring{\f@encoding}')}\ifin@%
+     \ltj@@ja@do@subst@correction
+   \else
+     \ltj@@al@do@subst@correction
+   \fi
+}
+\let\@@italiccorr=\/
+
+%%%%%% Japanese font for math mode
+\unless\ifltj@disablejfam
+
+% \M@<enc> から その <enc> が和文用か調べる
+{\catcode`M=12%
+\gdef\ltj@@mathJapaneseFonts#1M#2#3\relax{\ltj@@IsFontJapanese{#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}%
+    \ltj@@set@stackfont#1,\font@name:{MJSS}%
+  }%
+}
+
+\def\getanddefine@fonts#1#2{%
+  \ltj@tempcnta=#1\ltj@@IsFontJapanese{\string#2}%
+  \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%
+    \ifin@\jfam#2\relax\else\mathgroup#2\relax\fi
+  \expandafter\math@egroup\fi}%
+
+\fi
+
+%%%%%% Alternate Japanese Fonts
+%%%% \DeclareAlternateKanjiFont<Benc><Bfam><Bser><Bshape><Aenc><Afam><Aser><Ashape><range>
+% いつも global
+\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}%
+     \expandafter\ltj@@altfont@latex#9,,}\ignorespaces
+  \fi}
+\def\ltj@@altfont@latex#1,{\def\ltj@temp{#1}%
+  \ifx\ltj@temp\empty\let\@next=\relax\else
+  \ltj@@altfont@latexA{#1}\let\@next=\ltj@@altfont@latex\fi\@next}
+\def\ltj@@altfont@latexA#1{\ltj@@altfont@latexB#1--\@nil}
+\def\ltj@@altfont@latexB#1-#2-#3\@nil{\def\ltj@temp{#3}%
+  \ifx\ltj@temp\empty
+    \ltj@tempcnta=#1\relax\ltj@tempcntb=\ltj@tempcnta
+  \else
+    \def\ltj@temp{#1}%
+    \ifx\ltj@temp\empty\ltj@tempcnta='200\else\ltj@tempcnta=#1\fi\relax
+    \def\ltj@temp{#2}%
+    \ifx\ltj@temp\empty\ltj@tempcntb="10FFFF\else\ltj@tempcntb=#2\fi\relax%"
+  \fi
+  \directlua{luatexja.jfont.set_alt_font_latex(
+    \the\ltj@tempcnta,\the\ltj@tempcntb,
+    '\luatexluaescapestring{\ltj@temp@afont}',
+    '\luatexluaescapestring{\ltj@temp@bfont}')}%
+  }
+
+%%%% \ClearAlternateKanjiFont<Benc><Bfam><Bser><Bshape>
+% いつも global
+\def\ClearAlternateKanjiFont#1#2#3#4{%
+   \directlua{luatexja.jfont.clear_alt_font_latex('\luatexluaescapestring{#1/#2/#3/#4}')}}
+
+\def\ltj@pickup@altfont@auxy#1{%
+  \begingroup\edef\font@name{\csname #1/\f@size\endcsname}\pickup@jfont\endgroup%
+}
+\def\ltj@pickup@altfont@auxt#1{%
+  \begingroup\edef\font@name{\csname #1/\f@size\endcsname}\pickup@tfont\endgroup%
+}
+\def\ltj@pickup@altfont@copy#1#2{%
+  \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