%%
%% This is file 'pxufont.sty'.
%%
%% Copyright (c) 2017-2023 Takayuki YATO (aka. "ZR")
%%   GitHub:   https://github.com/zr-tex8r
%%   Twitter:  @zr_tex8r
%%
%% This package is distributed under the MIT License.
%%

%% package declaration
\NeedsTeXFormat{pLaTeX2e}
\ProvidesPackage{pxufont}[2023/07/07 v0.7]
\def\pxuf@pkgname{pxufont}
%
\providecommand\bxDebug[1]{}

%--------------------------------------- general

%% packages
\RequirePackage{ifuptex}

%% unique tokens
\def\pxuf@end{\pxuf@end@}
\def\pxuf@mt{\pxuf@mt@}

%% switch 'pxuf@use@ruby'
\newif\ifpxuf@use@ruby
\ifx t\pxufontUseRubyFont
  \pxuf@use@rubytrue
\fi

%% \pxuf@split{<at>}{<target>}
\def\pxuf@split#1#2{%
  \edef\pxuf@tmpx{{#1}{#2}}%
  \expandafter\pxuf@split@a\pxuf@tmpx}
\def\pxuf@split@a#1#2{%
  \def\pxuf@tmpx##1#1##2\pxuf@end{\pxuf@split@b{##1}{##2}}%
  \pxuf@tmpx#2\pxuf@mt#1\pxuf@end}
\def\pxuf@split@b#1#2{%
  \let\pxuf@pre\relax \let\pxuf@post\relax
  \ifx\pxuf@end#2\pxuf@end\else
    \pxuf@split@c#2\pxuf@end{#1}%
  \fi}
\def\pxuf@split@c#1\pxuf@mt#2\pxuf@end#3{%
  \def\pxuf@pre{#3}\def\pxuf@post{#1}}

%% switch 'pxuf@otf@used'
\newif\ifpxuf@otf@used
\@ifpackageloaded{otf}{%
  \pxuf@otf@usedtrue
}{%else
  \AtBeginDocument{%
    \@ifpackageloaded{otf}{%
      \PackageError\pxuf@pkgname
       {You must load this package after 'otf'}\@ehc
    }{}}%
}

%% \pxuf@JY/\pxuf@JT
\ifnativeupTeX
\def\pxuf@JY{JY2}\def\pxuf@JT{JT2}
\else
\def\pxuf@JY{JY1}\def\pxuf@JT{JT1}
\fi

%% \pxuf@edef@detokenized\CS{<body>}
\def\pxuf@edef@detokenized#1{%
  \def\pxuf@tmpx{%
    \expandafter\pxuf@edef@detokenized@a\meaning#1\pxuf@end#1}%
  \afterassignment\pxuf@tmpx\edef#1}
\def\pxuf@edef@detokenized@a#1>#2\pxuf@end#3{%
  \def#3{#2}}

%--------------------------------------- general
\begingroup

%% variables
% \pxuf@scale
% \pxuf@tfm

%% \pxuf@reset@size
\def\pxuf@reset@size{10}
\ifdim\f@size\p@=10\p@\else
  \edef\pxuf@reset@size{\pxuf@reset@size,\f@size}
\fi
\ifx\jsc@JYn\@undefined\else %jsclasses
  \begingroup
    \footnotesize \xdef\@gtempa{\f@size}
  \endgroup
  \edef\pxuf@reset@size{\pxuf@reset@size,\@gtempa}
\fi
\bxDebug{ufont:reset@size=\pxuf@reset@size}

%% \pxuf@parse@spec{E/F/S/S}
% Sets \pxuf@scale and \pxuf@tfm.
\def\pxuf@parse@spec#1{%
  \let\pxuf@scale\relax \let\pxuf@tfm\relax
  \expandafter\expandafter\expandafter\pxuf@parse@spec@a
      \csname#1\endcsname}%
\def\pxuf@parse@spec@a#1{%
\bxDebug{ufont:\string#1}%
  \expandafter\pxuf@parse@spec@b\string#1<-><$}
\def\pxuf@parse@spec@b#1<->#2<#3${%
  \pxuf@parse@spec@c#2**$}% #2=font-info for <->
\def\pxuf@parse@spec@c#1*#2*#3${%
  \ifx\pxuf@mt#3\pxuf@mt % no * in font-info
    \pxuf@parse@spec@d#1*$% #1=x-fontarg
  \else \def\pxuf@tmpb{#1}% #1=size-func
    \ifx\pxuf@tmpb\pxuf@@s \let\pxuf@tmpb\@empty \fi
    \ifx\pxuf@tmpb\@empty
      \pxuf@parse@spec@d#2*$% #2=x-fontarg
    \fi
  \fi}
\def\pxuf@parse@spec@d#1#2${%
  \ifx*#1% then no-op
  \else\ifx[#1\pxuf@parse@spec@e#2$%
  \else \pxuf@parse@spec@e1]#1#2$%
  \fi\fi}
\def\pxuf@parse@spec@e#1]#2*#3${%
  \def\pxuf@scale{#1}\def\pxuf@tfm{#2}%
  \pxuf@change@tfm}
\pxuf@edef@detokenized\pxuf@@s{s}

%% \pxuf@change@tfm
\pxuf@edef@detokenized\pxuf@tmpa{exp/ruby/nml}
\def\pxuf@tmpb#1/#2/#3\pxuf@end{%
  \def\pxuf@change@tfm{%
    \pxuf@change@tfm@a{#1}{#3}%
    \ifpxuf@use@ruby\else
      \pxuf@change@tfm@a{#2}{#3}
    \fi}
}\expandafter\pxuf@tmpb\pxuf@tmpa\pxuf@end
\def\pxuf@change@tfm@a#1#2{%
  \pxuf@split{#1}\pxuf@tfm\ifx\pxuf@pre\relax\else
    \edef\pxuf@tfm{\pxuf@pre#2\pxuf@post}%
  \fi}

%% \pxuf@process@one
\def\pxuf@process@one#1#2#3#4#5{%
\bxDebug{ufont:process(#1;#2/#3/#4/#5)}%
  \pxuf@parse@spec{#2/#3/#4/#5}%
  \ifx\pxuf@tfm\relax\else
\bxDebug{ufont:spec=\pxuf@scale:\pxuf@tfm}%
    \DeclareFontShape{#2}{#3}{#4}{#5}{<->%
        \ifdim\pxuf@scale\p@=\p@\else s*[\pxuf@scale]\fi
        zu-\pxuf@tfm}{}%
    \if t#1%
      \@for\pxuf@tmpa:=\pxuf@reset@size\do{%
        \global\expandafter\let\csname#2/#3/#4/#5/\pxuf@tmpa
            \endcsname\relax}%
    \fi
  \fi}

%% process
\ifpxuf@otf@used
  \@for\pxuf@w:={\pxuf@JY,\pxuf@JT}\do{%
    \@for\pxuf@x:={hmc,hgt,mg,ruby,rubyg,rubymg}\do{%
      \@for\pxuf@y:={l,m,b,bx,eb}\do{%
        \expandafter\ifx\csname\pxuf@w/\pxuf@x/\pxuf@y/n\endcsname\relax\else
          \expandafter\let\csname pxuf@DF/\pxuf@w/\pxuf@x\endcsname=t%
          \pxuf@process@one{t}\pxuf@w\pxuf@x\pxuf@y{n}%
        \fi}}}
  \@for\pxuf@w:={\pxuf@JY,\pxuf@JT}\do{%
    \@for\pxuf@x:={cidj,cidjg,cidjmg}\do{%
      \@for\pxuf@y:={l,m,b,bx,eb}\do{%
        \expandafter\ifx\csname\pxuf@w/\pxuf@x/\pxuf@y/0\endcsname\relax\else
          \@tfor\pxuf@z:=-012345\do{%
            \pxuf@process@one{f}\pxuf@w\pxuf@x\pxuf@y\pxuf@z}%
        \fi}}}
\fi
\ifnativeupTeX\else
  \@for\pxuf@w:={\pxuf@JY,\pxuf@JT}\do{%
    \@for\pxuf@x:={\mcdefault,\gtdefault,mc,gt}\do{%
      \expandafter\ifx\csname pxuf@DF/\pxuf@w/\pxuf@x\endcsname\relax
        \expandafter\ifx\csname\pxuf@w/\pxuf@x/m/n\endcsname\relax\else
          \expandafter\let\csname pxuf@DF/\pxuf@w/\pxuf@x\endcsname=t%
          \pxuf@process@one{t}\pxuf@w\pxuf@x{m}{n}%
        \fi
      \fi}}
\fi

\endgroup
%--------------------------------------- all done
\endinput
%% EOF