%% %% 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% }