%%
%% This is file 'bxghost-lib.sty'.
%%
%% Copyright 2019-2023 Takuto Asakura (wtsnjp)
%%   GitHub:   https://github.com/wtsnjp
%%   Twitter:  @wtsnjp
%%
%% This package is distributed under the MIT License.
%%

%% package declaration
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{bxghost-lib}[2023/02/26 v0.5.1]

%% preparations
\def\bxqgg@pkgname{bxghost}
\def\bxqgg@warn{\PackageWarningNoLine\bxqgg@pkgname}

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

%% \bxqgg@engine : engine type
\def\bxqgg@next#1#2{%
  \edef\bxqgg@tmpa{\string#1}\edef\bxqgg@tmpb{\meaning#1}%
  \ifx\bxqgg@tmpa\bxqgg@tmpb #2\fi}
\chardef\bxqgg@engine=0 % other TeX
\bxqgg@next\kanjiskip{%
  \ifnum\jis"2121="3000
    \chardef\bxqgg@engine=2 % upTeX
  \else
    \chardef\bxqgg@engine=1 % pTeX
  \fi}
\bxqgg@next\luatexversion{\chardef\bxqgg@engine=3 }% LuaTeX
\bxqgg@next\XeTeXversion {\chardef\bxqgg@engine=4 }% XeTeX

%--------------------------------------- not supported engine

\ifnum\bxqgg@engine=\z@
  \bxqgg@warn{This engine is not supported, sorry}
  \expandafter\endinput
\fi

%--------------------------------------- load LuaTeX-ja

\ifnum\bxqgg@engine=\thr@@
  \RequirePackage{luatexja}
  \@ifpackageloaded{luatexja-adjust}{}{%
    \RequirePackage{luatexja-adjust}\ltjdisableadjust}
\fi

%--------------------------------------- eghostguarded

% use an arbitrary font available in T1 encoding
\font\bxqgg@TI=ec-lmr10 at 1.23456pt
\chardef\bxqgg@cwm=23 % compwordmark (in T1)

% allow xkanjiskip around
% Note: for XeTeX, xeCJK will handle nicely. We have nothing to do :)
\ifcase\bxqgg@engine
\or  % pTeX
  \xspcode\bxqgg@cwm=3\relax
\or  % upTeX
  \xspcode\bxqgg@cwm=3\relax
\or  % LuaTeX
  \ltjsetparameter{alxspmode={\bxqgg@cwm,3}}
\fi

%%<*> \eghostguarded{<text>}
\newcommand*\eghostguarded{%
  \ifmmode \expandafter\@firstofone
  \else \expandafter\bxqgg@eghostguarded@a
  \fi
}
\def\bxqgg@eghostguarded@a#1{%
  \bxqgg@eghost #1\bxqgg@eghost}
\def\bxqgg@eghost{\bgroup
  \bxqgg@TI\bxqgg@cwm\egroup}

%--------------------------------------- jghostguarded

%% \bxqgg@fwsp: a zenkaku space (U+3000)
\begingroup
  \ifnum\bxqgg@engine<\thr@@  % (u)pTeX
    \kansujichar\@ne=\jis"2121\relax
    \xdef\bxqgg@fwsp{\kansuji\@ne}
  \else  % others
    \lccode`\Z="3000\relax
    \lowercase{\xdef\bxqgg@fwsp{Z}}
  \fi
\endgroup

% make sure to use a font whose zenkaku space is class zero
\let\bxqgg@jafont\relax

\ifcase\bxqgg@engine
\or  % pTeX
  \DeclareFontFamily{JY1}{bxqgg}{}
  \DeclareFontFamily{JT1}{bxqgg}{}
  \DeclareFontShape{JY1}{bxqgg}{m}{n}{<->s*[0.961]jis}{}
  \DeclareFontShape{JT1}{bxqgg}{m}{n}{<->s*[0.961]tmin10}{}
  \def\bxqgg@jafont{\usekanji{\k@encoding}{bxqgg}{m}{n}}
\or  % upTeX
  \DeclareFontFamily{JY2}{bxqgg}{}
  \DeclareFontFamily{JT2}{bxqgg}{}
  \DeclareFontShape{JY2}{bxqgg}{m}{n}{<->s*[0.92469]upjisr-h}{}
  \DeclareFontShape{JT2}{bxqgg}{m}{n}{<->s*[0.92469]upjisr-v}{}
  \def\bxqgg@jafont{\usekanji{\k@encoding}{bxqgg}{m}{n}}
\fi

%% \bxqgg@kern@m@ne@zw: a negative zenkaku width kern
\ifnum\bxqgg@engine<\thr@@
  % (u)pTeX knows the unit `zw'
  \def\bxqgg@kern@m@ne@zw{\kern-1zw\relax}
\else
  % for other engines, we use \zw instead
  \def\bxqgg@kern@m@ne@zw{\kern-1\zw\relax}
\fi

%%<*> \jghostguarded{<text>}
\newcommand*\jghostguarded{%
  \ifmmode \expandafter\@firstofone
  \else \expandafter\bxqgg@jghostguarded@a
  \fi
}
\edef\bxqgg@jghostguarded@a#1{%
  \bgroup
    \noexpand\bxqgg@jafont
    \bxqgg@fwsp\bxqgg@kern@m@ne@zw
  \egroup
  #1%
  \bgroup
    \noexpand\bxqgg@jafont
    \bxqgg@kern@m@ne@zw\bxqgg@fwsp
  \egroup
}

% better definition for LuaTeX-ja (20220211.0 or later)
\ifnum\bxqgg@engine=\thr@@  % LuaTeX
  \ifx\ltjghostbeforejachar\@undefined\else
    \def\bxqgg@jghostguarded@a#1{%
      \ltjghostbeforejachar #1\ltjghostafterjachar
    }
  \fi
\fi

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