%%
%% kanruby.sty v.1.0
%% 2026/11/11 Hiromichi Honda
%% https://rakunet.org/
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
%% of this license or any later version.
%% The latest version of this license is in
%%   https://www.latex-project.org/lppl.txt
%% and version 1.3 or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.
%%
%% This work has the LPPL maintenance status 'maintained'.
%% 
%% The Current Maintainer of this work is Hiromichi Honda.
%%
%% This work consists of the files kanruby.(sty|mf|tfm), ukanruby.fd,
%% README.md, kanruby-doc.tex and some examples.
%%
\NeedsTeXFormat{LaTeX2e}%
\ProvidesPackage{kanruby}[2026/11/11 v1.0]%
\@ifundefined{iftdir}{\RequirePackage{plext}}{\relax}%
\newdimen\k@mbnl\newdimen\k@mbnw\newdimen\k@mbnt%
\newdimen\k@mbnr\newdimen\k@mbnd\newdimen\k@mbns\newdimen\k@mbnx%
\newdimen\kanwariskip%

%% The following explanation is provided exclusively in the Japanese language
%% as it is actually used.
%%
%% 同梱したkanruby.mf用コマンド集
%%
%% 漢文の訓点として最低限必要と思われるものを集めました。
%% でびさんのアドヴァイスに感謝いたします。
%%
\def\defk@mbnfnt#1#2{\def#1{\noautoxspacing{\usefont{U}{kanruby}{m}{n}%
 \iftdir\rensujiskip=0.085zw plus .025zw minus.025zw\rensuji{\symbol{#2}}%
 \else\symbol{#2}\fi}}}%
\defk@mbnfnt{\kanninoji}{33}%
\defk@mbnfnt{\kanre}{34}%
\defk@mbnfnt{\kanichire}{35}%
\defk@mbnfnt{\kanjore}{36}%
\defk@mbnfnt{\kankore}{37}%
\defk@mbnfnt{\kantenre}{38}%
\defk@mbnfnt{\kankagibegin}{39}%
\defk@mbnfnt{\kanKAGIbegin}{40}%
\defk@mbnfnt{\kankagiend}{41}%
\defk@mbnfnt{\kanKAGIend}{42}%
\defk@mbnfnt{\kankunoji}{43}%
\defk@mbnfnt{\kangunoji}{44}%
\defk@mbnfnt{\kanhyoi}{45}%
\defk@mbnfnt{\kanhyoii}{46}%
\defk@mbnfnt{\kanhyoiii}{47}%
\defk@mbnfnt{\kanhyoiv}{48}%
\defk@mbnfnt{\kanhyov}{49}%
\defk@mbnfnt{\kanyakui}{50}%
\defk@mbnfnt{\kanyakuii}{51}%
\defk@mbnfnt{\kanyakuiii}{52}%
\defk@mbnfnt{\kanyakuiv}{53}%
\defk@mbnfnt{\kanyakuv}{54}%
\defk@mbnfnt{\kanyakuvi}{55}%
\defk@mbnfnt{\kanyakuvii}{56}%
\defk@mbnfnt{\kanyakuviii}{57}%
\defk@mbnfnt{\kanyakuix}{58}%
\def\kanyakux{\let\k@mbnt=\@currsize モ\kanruby<3>[0][-.33]<1>{\k@mbnt ー}}%
\def\kanyakuxi{\let\k@mbnt=\@currsize 云\kanruby<3>[0][-.33]<1>{\k@mbnt ー}}%

%%
%% 漢文でよく使う記号
%%
\def\kanchusen{\kanruby<4>[1.05][.05]{--}}%
\def\kanchusenx{\hskip-\kanjiskip\hbox to \kanjiskip{\hfill--\hfill}}% 字間を調整した中線
\def\@kanwaku#1#2{\k@mbnw=\unitlength\unitlength=1zw\hskip\kanjiskip%
 \begin{picture}(1,1)(0,.475)\put(0,0){\framebox(1,1)[c]{\rensuji{#1}}}
 #2\end{picture}\hskip\kanjiskip\unitlength=\k@mbnw}%
\def\kanwaku#1{\@kanwaku{#1}{}}
\def\kanwakulu#1{\@kanwaku{#1}{\put(-.08,-.08){\circle{.2}}}}
\def\kanwakuLU#1{\@kanwaku{#1}{\put(-.07,-.07){\circle*{.2}}}}
\def\kanwakuld#1{\@kanwaku{#1}{\put(1.08,-.08){\circle{.2}}}}
\def\kanwakuLD#1{\@kanwaku{#1}{\put(1.07,-.07){\circle*{.2}}}}
\def\kanwakuru#1{\@kanwaku{#1}{\put(-.08,1.08){\circle{.2}}}}
\def\kanwakuRU#1{\@kanwaku{#1}{\put(-.07,1.07){\circle*{.2}}}}
\def\kanwakurd#1{\@kanwaku{#1}{\put(1.08,1.08){\circle{.2}}}}
\def\kanwakuRD#1{\@kanwaku{#1}{\put(1.07,1.07){\circle*{.2}}}}

%%
%% マクロの簡略表記
%%
\def\Kans#1#2#3#4{#1\kanruby<0>[-.1]{#2}\kanruby<0>[1]{#3}\kanruby<3>[1][-0.45]{#4}}
\def\Sais#1#2{\hskip-\kanjiskip\kanruby<2>[-.1]{#1}\kanruby<3>[1]{#2}}
\def\Kutos#1{\hskip-\kanjiskip\kanruby<1>[1][-0.65]{\scriptsize #1}}
\def\Kagibegins{\hskip-\kanjiskip\kanruby<1>[1.05][-0.65]{\scriptsize \kankagibegin}}
\def\Kagiends{\hskip-\kanjiskip\kanruby<3>[1.1][-0.5]{\scriptsize \kankagiend}}
\def\KAGIbegins{\hskip-\kanjiskip\kanruby<1>[1.05][-0.65]{\scriptsize \kanKAGIbegin}}
\def\KAGIends{\hskip-\kanjiskip\kanruby<3>[1.1][-0.5]{\scriptsize \kanKAGIend}}
\def\kansmall{\small\let\Kan=\Kans\let\Sai=\Sais\let\Kuto=\Kutos%
 \let\Kagibegin=\Kagibegins\let\Kagiend=\Kagiends\let\KAGIbegin=\KAGIbegins\let\KAGIend=\KAGIends}
\def\Kann#1#2#3#4{#1\kanruby<0>[0]{#2}\kanruby<0>[1]{#3}\kanruby<3>[1][-0.4]{#4}}
\def\Sain#1#2{\hskip-\kanjiskip\kanruby<2>[0]{#1}\kanruby<3>[1]{#2}}
\def\Kuton#1{\hskip-\kanjiskip\kanruby<1>[1][-0.6]{\footnotesize #1}}
\def\Kagibeginn{\hskip-\kanjiskip\kanruby<1>[1.05][-0.6]{\footnotesize \kankagibegin}}
\def\Kagiendn{\hskip-\kanjiskip\kanruby<3>[1.1][-0.5]{\footnotesize \kankagiend}}
\def\KAGIbeginn{\hskip-\kanjiskip\kanruby<1>[1.05][-0.6]{\footnotesize \kanKAGIbegin}}
\def\KAGIendn{\hskip-\kanjiskip\kanruby<3>[1.1][-0.5]{\footnotesize \kanKAGIend}}
\def\kannormalsize{\normalsize\let\Kan=\Kann\let\Sai=\Sain\let\Kuto=\Kuton%
 \let\Kagibegin=\Kagibeginn\let\Kagiend=\Kagiendn\let\KAGIbegin=\KAGIbeginn\let\KAGIend=\KAGIendn}
\def\kanlarge{\large\let\Kan=\Kann\let\Sai=\Sain\let\Kuto=\Kuton%
 \let\Kagibegin=\Kagibeginn\let\Kagiend=\Kagiendn\let\KAGIbegin=\KAGIbeginn\let\KAGIend=\KAGIendn}
\def\KutoL#1{\hskip-\kanjiskip\kanruby<1>[1][-0.55]{\small #1}}
\def\KagibeginL{\hskip-\kanjiskip\kanruby<1>[1.05][-0.55]{\footnotesize \kankagibegin}}
\def\KagiendL{\hskip-\kanjiskip\kanruby<3>[1.1][-0.4]{\footnotesize \kankagiend}}
\def\KagibeginL{\hskip-\kanjiskip\kanruby<1>[1.05][-0.55]{\footnotesize \kankagibegin}}
\def\KagiendL{\hskip-\kanjiskip\kanruby<3>[1.1][-0.4]{\footnotesize \kankagiend}}
\def\KAGIbeginL{\hskip-\kanjiskip\kanruby<1>[1.05][-0.55]{\footnotesize \kanKAGIbegin}}
\def\KAGIendL{\hskip-\kanjiskip\kanruby<3>[1.1][-0.4]{\footnotesize \kanKAGIend}}
\def\kanLarge{\Large\let\Kan=\Kann\let\Sai=\Sain\let\Kuto=\KutoL%
 \let\Kagibegin=\KagibeginL\let\Kagiend=\KagiendL\let\KAGIbegin=\KAGIbeginL\let\KAGIend=\KAGIendL}
\def\KutoLL#1{\hskip-\kanjiskip\kanruby<1>[1][-0.5]{\small #1}}
\def\KagibeginLL{\hskip-\kanjiskip\kanruby<1>[1.07][-0.45]{\footnotesize \kankagibegin}}
\def\KAGIbeginLL{\hskip-\kanjiskip\kanruby<1>[1.07][-0.45]{\footnotesize \kanKAGIbegin}}
\def\kanLARGE{\LARGE\let\Kan=\Kann\let\Sai=\Sain\let\Kuto=\KutoLL%
 \let\Kagibegin=\KagibeginLL\let\Kagiend=\KagiendL\let\KAGIbegin=\KAGIbeginLL\let\KAGIend=\KAGIendL}
\def\Kutoh#1{\hskip-\kanjiskip\kanruby<1>[1][-0.45]{\small #1}}
\def\Kagibeginh{\hskip-\kanjiskip\kanruby<1>[1.07][-0.4]{\small \kankagibegin}}
\def\Kagiendh{\hskip-\kanjiskip\kanruby<3>[1.1][-0.4]{\small \kankagiend}}
\def\KAGIbeginh{\hskip-\kanjiskip\kanruby<1>[1.07][-0.4]{\small \kanKAGIbegin}}
\def\KAGIendh{\hskip-\kanjiskip\kanruby<3>[1.1][-0.4]{\small \kanKAGIend}}
\def\kanhuge{\huge\let\Kan=\Kann\let\Sai=\Sain\let\Kuto=\Kutoh%
 \let\Kagibegin=\Kagibeginh\let\Kagiend=\Kagiendh\let\KAGIbegin=\KAGIbeginh\let\KAGIend=\KAGIendh}
\def\KanH#1#2#3#4{#1\kanruby<0>[0]{#2}\kanruby<0>[1]{#3}\kanruby<3>[1][-0.3]{#4}}
\def\KagiendH{\hskip-\kanjiskip\kanruby<3>[1.1][-0.35]{\small \kankagiend}}
\def\KAGIendH{\hskip-\kanjiskip\kanruby<3>[1.1][-0.35]{\small \kanKAGIend}}
\def\kanHuge{\Huge\let\Kan=\KanH\let\Sai=\Sain\let\Kuto=\Kutoh%
 \let\Kagibegin=\Kagibeginh\let\Kagiend=\KagiendH\let\KAGIbegin=\KAGIbeginh\let\KAGIend=\KAGIendH}
%% 訓点(#1:親字、#2:読み、#3:送りがな、#4:返り点)
\let\Kan=\Kann
%% 再読文字の訓点(#1:読み、#2:送りがな)
\let\Sai=\Sain
%% 句読点
\let\Kuto=\Kuton
%% 「」
\let\Kagibegin=\Kagibeginn
\let\Kagiend=\Kagiendn
\let\KAGIbegin=\KAGIbeginn
\let\KAGIend=\KAGIendn
\def\kanrubyon{\@ifnextchar[%
 {\@kanrubyon}{\@kanrubyon[0.5zw]}}
\def\@kanrubyon[#1]{%
 \setlength{\kanjiskip}{#1 plus.1pt minus.1pt}\ignorespaces}
\def\kanrubyoff{\setlength{\kanjiskip}{0zw plus.4pt minus.5pt}\ignorespaces}

%%
%% 直前の漢字に左右の注・ルビを振るマクロ
%%
%% Usage: \kanruby<制御>[字下げ][左右余白]<注の長さ>{注の本文}
%%
%%  制御 0:右(ディフォルト)        1:右(漢詩環境など\kanjiskipが必要なとき)
%%       2:左                      3:左(漢詩環境など\kanjiskipが必要なとき)
%%       4:中央(注本文の長さ進む)  5:中央(漢詩環境など\kanjiskipが必要なとき)
%%  字下げ: 直前の漢字の頭から何字分下げて始めるか(0がディフォルト)
%%  左右余白: 直前の漢字の頭から何字分下げて始めるか(.1がディフォルト)
%%  注の長さ: 注の長さを直前の漢字のサイズ何字分とするか(組んだ結果によるのがディフォルト)
%%
%% 謝辞: このマクロは藤田氏の「縦横文書術」（ピアソン・エデュケーション）
%% を参考にさせていただきました。感謝いたします。
%% このマクロはほぼ藤田氏のsfkanbunマクロなどと共に使用することが可能です。
%% また、bookwormさん、BBさんのアドヴァイスにも合わせて感謝します。
%%
%% 注意: 注の本文の文字サイズは\kanrubysizeで制御する
%%
\let\kanrubysize=\tiny
\def\kanruby{\@ifnextchar<%
 {\@kanruby}{\@kanruby<0>}}
\def\@kanruby<#1>{\@ifnextchar[%
 {\@@kanruby<#1>}{\@@kanruby<#1>[0]}}
\def\@@kanruby<#1>[#2]{\@ifnextchar[%
 {\@@@kanruby<#1>[#2]}{\@@@kanruby<#1>[#2][0]}}
\def\@@@kanruby<#1>[#2][#3]{\@ifnextchar<%
 {\@@@@kanruby<#1>[#2][#3]}{\@@@@kanruby<#1>[#2][#3]<0>}}
\def\@@@@kanruby<#1>[#2][#3]<#4>#5{%
 \k@mbns=\kanjiskip\kanjiskip=0zw plus.1pt minus.1pt%
 \k@mbnx=\xkanjiskip\xkanjiskip=\kanjiskip%
 \setlength{\k@mbnl}{#4zw}%
 \ifx#40\setbox0=\hbox{\kanrubysize #5}\else\setbox0=\hbox to \k@mbnl{\kanrubysize #5}\fi%
 \setlength{\k@mbnd}{#2zh}%
 \setlength{\k@mbnr}{#3zw}%
 \ifnum#1=4\else\advance\k@mbnr by 0.5zh\advance\k@mbnr by 0.5\ht0\advance\k@mbnr by 0.1zh\fi%
 \kern-1zw\kern\k@mbnd%
 \ifnum#1<2\hbox{\raise\k@mbnr\hbox{\copy0}}%
 \else\ifnum#1>3\hbox{\raise#3zw\hbox{\copy0}}%
 \else\hbox{\lower\k@mbnr\hbox{\copy0}}\fi\fi%
% \ifnum#1=4\kern-\wd0\else\kern-\wd0\fi\kern1zw\kern-\k@mbnd%
 \kern-\wd0\kern1zw\kern-\k@mbnd%
 \kanjiskip=\k@mbns\xkanjiskip=\k@mbnx%
 \ifodd#1\hskip\kanjiskip\fi\ignorespaces}

%%
%% 2行仕立ての割書き・割注を作るマクロ
%%
%% Usage: \kanwari<制御>[長さ]{1行目}{2行目}
%%
%%  制御 0:括弧なし(ディフォルト)  1:括弧つき
%%       2:初め括弧のみ            3:終り括弧のみ
%%  長さ: 注の長さを直前の漢字のサイズ何字分とするか(組んだ結果によるのがディフォルト)
%%
%% 注意: 割注の本文の文字サイズは\kanwarisizeで、改行幅は\kanwariskipで制御する
%%
\let\kanwarisize=\tiny
\kanwariskip=0pt
\def\kanwari{\@ifnextchar<%
 {\@kanwari}{\@kanwari<0>}}
\def\@kanwari<#1>{\@ifnextchar[%
 {\@@kanwari<#1>}{\@@kanwari<#1>[0]}}
\def\@@kanwari<#1>[#2]#3#4{%
 \leavevmode%
 \k@mbns=\kanjiskip\k@mbnx=\xkanjiskip\kanjiskip=\fill\xkanjiskip=\fill%
 \setlength{\k@mbnl}{#2zw}%
 \ifx#11\advance\k@mbnl by -1zw\hbox to.5zw{\hss\kern-.5zw（}\kern0pt\fi%
 \ifx#12\advance\k@mbnl by -.5zw\hbox to.5zw{\hss\kern-.5zw（}\kern0pt\fi%
 \ifx#13\advance\k@mbnl by -.5zw\fi%
 \setbox0=\hbox{\kanwarisize #3}\setbox1=\hbox{\kanwarisize #4}%
 \ifdim\wd0>\wd1\k@mbnw=\wd0\else\k@mbnw=\wd1\fi%
 \ifdim\k@mbnl<0.1zw\k@mbnl=\k@mbnw\fi%
 \begin{minipage}[c]{\k@mbnl}\kanwarisize
 \hbox to \k@mbnl{#3}\vskip\kanwariskip\hbox to \k@mbnl{#4}\end{minipage}%
 \ifx#11\kern0pt\hbox to.5zw{）\kern-.5zw\hss}\fi%
 \ifx#13\kern0pt\hbox to.5zw{）\kern-.5zw\hss}\fi%
 \kanjiskip=\k@mbns\xkanjiskip=\k@mbnx%
}
