%% Copyright 2022--2025 Yuanhao Chen
%
% 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 (at your option) any later version.
% The latest version of this license is in
%   http://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 Yuanhao Chen.
%
% This work consists of the files kanbun.sty, kanbun.lua,
% kanbun-example.tex and kanbun.tex.
% 
\documentclass[12pt]{ltxdockit}

\AfterTOCHead[toc]{\sffamily}
\makeatletter
  \def\@seccntformat#1{\protect\makebox[0pt][r]{\csname the#1\endcsname\hspace{\marglistsep}}}
\makeatother

\usepackage{fancyvrb}
\DefineShortVerb{\|}

\lstnewenvironment{example}[1][]
    {\lstset{
        basicstyle=\ja{\linespread{1}}\ttfamily,
        frame=single,
        columns=fullflexible,
        language=[LaTeX]TeX,
        moretexcs={
            Kanbun,
            EndKanbun,
            printkanbun,
            printkanbuncode,
            kanbunfont,
            furiokuri,
            multifuriokuri,
            ExplSyntaxOn,
            ExplSyntaxOff,
            kanjiunit,
            setkanbun,
        }
    }}
    {}

\usepackage{luatexja}
    \ltjdefcharrange{10}{"2E3A}
    \ltjdefcharrange{11}{"2039-"203A}
    \ltjsetparameter{jacharrange={-1, +2, +3, -4, -5, +6, +7, -8, +9, +10, -11}}
\usepackage[match]{luatexja-fontspec}
\en{\defaultfontfeatures{Numbers=OldStyle, Scale=MatchLowercase}}
\ja{\defaultfontfeatures{Scale=MatchLowercase}}
\defaultjfontfeatures{Scale=MatchLowercase, YokoFeatures={JFM=ja_JP/{kaiming,prop}, RawFeature={+pkna,+kern}}}
\usepackage[haranoaji]{luatexja-preset}
\setsansjfont{Sarasa Mono J}
\setmonojfont[Scale=MatchLowercase, YokoFeatures={JFM=prop, RawFeature={+kern}}]{Sarasa Mono J}
\setmainfont{Noto Serif}
\setsansfont{Noto Sans}
\setmonofont{Sarasa Mono J}

\ja{
    \parindent=1\zw
    \renewcommand{\baselinestretch}{1.2}
}

\usepackage{luatexja-ruby}
    \ltjsetruby{
        fontcmd=\addjfontfeature{
                YokoFeatures={RawFeature={-pkna,+ruby}},
                TateFeatures={RawFeature={-pkna,+ruby}},
            },
        mode=7,
    }

\usepackage[
    rubyfontcmd=\addjfontfeature{
            YokoFeatures={RawFeature={-pkna,+ruby}},
            TateFeatures={RawFeature={-pkna,+ruby}},
        },
]{kanbun}
\newcommand{\printkanbunblock}[2]{
    {
        \parindent=0pt
        \ja{\linespread{1}}
        \vspace*{1\zw}
        \hfill
        \vbox{
            \hsize=#1\zw
            {
                \tate
                \addjfontfeature{Scale=1}
                #2
            }
        }
        \hfill
        \vspace*{1\zw}
    }
}

\usepackage{bxtexlogo}
\usepackage{realscripts}
\usepackage{microtype}

\usepackage{wallpaper}

\Kanbun
以テ[二]羅(ら)蝶(てふ)ヲ[一]作ルガ[二]漢文訓読ヲ[一]用(ため)ノ包(ぱつけーぢ)
\EndKanbun
\title{\en{The \sty{kanbun} package}\ja{\sty{kanbun}パッケージ}}
\subtitle{\normalsize\normalfont\addjfontfeature{Scale=1}\printkanbun}
\author{
    \en{Yuanhao Chen (\ruby[rubysmash=true]{陳|元|鎬}{ちん|げん|こう})}
    \ja{
        \ruby[rubysmash=true]{陳|元|鎬}{ちん|げん|こう} (Yuanhao Chen) 
        \footnote{日本人ではないので、日本語ネイティヴの方がいらっしゃればマニュアルを書き直して下さると嬉しい。}
    }
}
\date{
    \en{\scshape 17 march 2025, v1.3}
    \ja{2025年3月17日, v1.3}
}


\begin{document}

\ThisCenterWallPaper{1}{kanbun-example.pdf}
\ExplSyntaxOn
\tl_set:Nn \kanbun_kumi { beta }
\ExplSyntaxOff
\maketitle
\ja{\renewcommand{\contentsname}{目次}}
\tableofcontents


\section{\en{Introduction}\ja{はじめに}}
\en{The \sty{kanbun} package, like other \emph{kanbun-kundoku} (漢文訓読) \LaTeX{} packages (such as \sty{gckanbun}), allows users to manually input macros for elements in a \emph{kanbun-kundoku} paragraph.}
\ja{\sty{kanbun}パッケージでは他の漢文訓読の\LaTeX{}パッケージ（例えば \sty{gckanbun}）と同じく、手動で漢文訓読の各要素に対応するマクロを入力できる。}

\en{More importantly, it accepts input with light markup in the ``\emph{kanbun} annotation'' form when used with \LuaLaTeX, which allows typesetting \emph{kanbun-kundoku} paragraphs efficiently\footnote{The idea comes from \href{https://phesoca.com/kanbun-html/}{漢文\textsc{html}} by UntPhesoca, which is a JavaScript and \textsc{css} implementation.}.}
\ja{更に重要なことには、 \LuaLaTeX{}で実行すれば、軽量マークアップの「漢文アノテーション」で容易く効率的に漢文訓読を組版することが可能となっている\footnote{JavaScriptやCSSによって実行するUntPhesocaの \href{https://phesoca.com/kanbun-html/}{漢文HTML} が参考となっていた。}。}


\section{\en{Basic example with \LuaLaTeX}\ja{\LuaLaTeX{}での簡単な実例}}
\en{As seen in the following example, typesetting a \emph{kanbun-kundoku} paragraph with the \sty{kanbun} package requires only light annotations --- it automatically transforms the annotated plain text into \LaTeX{} macros through Lua, rather than having users type in macros themselves.}
\ja{次の実例のとおり、 \sty{kanbun}パッケージを使えばただの軽量なアノテーションで漢文訓読を組版できる。手動でマクロを入力するではなく、プログラムが自動的にアノテーションのあるプレーンテキストをLuaで処理して\LaTeX{}マクロに変更する。}

\begin{example}
\documentclass{ltjtarticle}
\usepackage[kumi=aki, tateaki=1]{kanbun}
\begin{document}
\Kanbun
月落チ烏啼キテ霜満ツ[レ]天ニ，
江楓漁火対ス[二]愁眠ニ[一]。
姑(こ)蘇(そ)城外ノ寒山寺，
夜半ノ鐘声到ル[二]客船ニ[一]。
\EndKanbun
\printkanbun
\end{document}
\end{example}

\ExplSyntaxOn
\tl_set:Nn \kanbun_tateaki { 1 }
\tl_set:Nn \kanbun_kumi { aki }
\ExplSyntaxOff
\Kanbun
月落チ烏啼キテ霜満ツ[レ]天ニ，
江楓漁火対ス[二]愁眠ニ[一]。
姑(こ)蘇(そ)城外ノ寒山寺，
夜半ノ鐘声到ル[二]客船ニ[一]。
\EndKanbun

\allowbreak
\printkanbunblock{13}{\printkanbun}
\vspace{-1.5\zw}

\en{Note that if you want to use this functionality, you have to run this document with \LuaLaTeX.}
\ja{この機能を使う場合、必ず\LuaLaTeX{}で実行してください。}


\section{\en{Usage}\ja{使用方法}}

\subsection{\en{Package options}\ja{パッケージのオプション}}
\en{Load the package with}
\ja{パッケージの読み込みは次のようにしてよい：}
\nobreak
\begin{ltxsyntax}
    \cmditem{usepackage}\oprm{\en{\sty{kanbun} options}\ja{ \sty{kanbun}のオプション}}|{kanbun}|
\end{ltxsyntax}

\en{This package provides a variety of customisable features in \emph{kanbun-kundoku}.}
\ja{以下のオプションでさまざまな漢文訓読においてのパラメーターを設定できる。}

\begin{optionlist}
    \optitem[]{scale}{\prm{\en{ratio}\ja{比}}}
    \en{Sets the ratio of the size of \emph{kanji} to that of ruby texts. Default: \verb|2|.}
    \ja{ルビ文字のサイズに対する漢字のサイズの割合を設定する。初期値： \verb|2|。}
    
    \SaveVerb{fontcmd}|\addjfontfeatures{RawFeature={+trad}}|
    \optitem[]{fontcmd}{\prm{\en{font command}\ja{書体のコマンド}}}
    \en{Sets the font command to use for \emph{kanji}. If \sty{luatexja-fontspec} is loaded, it is set default to \UseVerb{fontcmd} to obtain traditional \emph{kanji} if applicable.}
    \ja{漢字の書体のコマンドを設定する。\sty{luatexja-fontspec}パッケージが読み込まれてある場合、 \UseVerb{fontcmd} に初期化されて、旧字体のグリフに変更する。}

    \SaveVerb{rubyfontcmd}|\addjfontfeatures{RawFeature={+ruby}}|
    \optitem[]{rubyfontcmd}{\prm{\en{font command}\ja{書体のコマンド}}}
    \en{Sets the font command to use for ruby texts. If \sty{luatexja-fontspec} is loaded, it is set default to \UseVerb{rubyfontcmd} to obtain ruby glyphs when applicable.}
    \ja{ルビ文字の書体のコマンドを設定する。\sty{luatexja-fontspec}パッケージが読み込まれてある場合、 \UseVerb{rubyfontcmd} に初期化されて、ルビグリフに変更する。}

    \SaveVerb{unit}|\kanbun_init_zw|
    \optitem[]{unit}{\prm{\en{length}\ja{長さ}}}
    \en{Sets the dimensions of \emph{kanji} (assuming it is a square). Default: \UseVerb{unit}, which is a length equal to \verb|1em|.}
    \ja{（正方形だと仮定して）漢字の寸法を設定する。初期値： \UseVerb{unit} （\verb|1em| に等しい長さ）。}

    \optitem[]{yokoaki}{\prm{\en{ratio}\ja{比}}}
    \en{Sets the horizontal space between \emph{kanji} with respect to the size of ruby texts. Default: \verb|2|.}
    \ja{ルビ文字のサイズに対するインテルの幅の割合を設定する。初期値： \verb|2|。}

    \optitem[]{tateaki}{\prm{\en{ratio}\ja{比}}}
    \en{Sets the vertical space between \emph{kanji} with respect to the size of ruby texts. Default: \verb|2|.}
    \ja{ルビ文字のサイズに対する漢字間のアキ量の割合を設定する。初期値： \verb|2|。}

    \optitem[]{okuriintrusion}{\prm{\en{ratio}\ja{比}}}
    \en{Sets the intrusion of \emph{okurigana} (how much \emph{okurigana} should be vertically tucked into the space of \emph{kanji}) with respect to the size of ruby texts, if that does not cause an overlap with \emph{furigana}. Default: \verb|1|.}
    \ja{ルビ文字のサイズに対する送仮名\ruby[pre=0.5,post=1]{進入量}{イントルージョン}（送仮名を上に突かせて漢字に掛ける長さ）の割合を設定する。初期値： \verb|1|。}

    \optitem[]{kumi}{\opt{aki}, \opt{beta}}
    \en{Sets whether to use \emph{aki-gumi} (typeset with uniform inter-character spacing) or \emph{beta-gumi} (typeset with no inter-character space between adjacent character frames). Or simply call \opt{aki} or \opt{beta} without \opt{kumi=}. Default: \opt{aki}. }
    \ja{アキ組を使うかベタ組を使うかを設定する。\opt{kumi=} を書かず、単に \opt{aki} か \opt{beta} かと書いてもよい。}
\end{optionlist}

\SaveVerb{kanbunprefix}|\kanbun_|
\en{After initialising the options, you can still change the option values through the command \cmd{setkanbun}. For example, to switch to \emph{beta-gumi}, you could use}
\ja{オプションを初期化する後でも、 \cmd{setkanbun} を使ってオプションを変更できる。例えば、ベタ組に再設定するには下記のコードを使う。}
\begin{example}
\setkanbun{beta}
\end{example}

\subsection[\en{Basic usage without \LuaLaTeX}\ja{\LuaLaTeX{}を使わない場合の基本使用}]{\en{Basic usage without \LuaLaTeX{} (not recommended)}\ja{\LuaLaTeX{}を使わない場合の基本使用（お薦めではない）}}
\en{When not using the advanced \emph{kanbun}-annotation functionality, it is possible to typeset \emph{kanbun} with any engine with \textsc{cjk} support, such as using \XeLaTeX{} with the \sty{xeCJK} package, or using \upLaTeX{} with \sty{utarticle} or other appropriate class. }
\ja{漢文アノテーションの機能を使わない場合、任意の CJK 支援のあるエンジンで漢文を組版できる。例えば\XeLaTeX{} を \sty{xeCJK} パッケージと一緒に使うか、 \upLaTeX{} を \sty{utarticle} クラス或いは他の適宜なクラスと一緒に使うか、どちらもよい。}

\begin{ltxsyntax}
    \cmditem{kanjiunit}\verb|{ |\cmd{furiokuri}\mprm{\en{right furigana}\ja{右の振仮名}}\mprm{\en{right okurigana}\ja{右の送仮名}}\verb| }|\vspace{-5pt}\\
    \mprm{\en{left (top) punctuation (e.g.~`「')}\ja{左（上）の句読点（“「”など）}}\\
    \mprm{\en{kanji}\ja{漢字}}\\
    \mprm{\en{other punctuation}\ja{他の句読点}}\\
    \mprm{\en{kaeriten}\ja{返点}}\\
    \verb|{ |\cmd{furiokuri}\mprm{\en{left furigana}\ja{左の振仮名}}\mprm{\en{left okurigana}\ja{左の送仮名}}\verb| }|

    \cmditem{kanbunfont}

    \en{Sets the font size of \emph{kanji}. Use when the \opt{unit} option is set different to the document's default font size.}
    \ja{漢字のサイズを設定する。\opt{unit} オプションと文書のデフォルト文字サイズが違う時に使う。}

    \en{Use \cmd{multifuriokuri} instead of \cmd{furiokuri} if you are putting \emph{furigana} to multiple kanji.}
    \ja{複数個の漢字に仮名を振れば、 \cmd{furiokuri} の代わりに \cmd{multifuriokuri} を使う。}

    \cmditem{multifuriokuri}\oprm{\en{length by which ruby is raised}\ja{ルビ文字を上げる長さ}}\mprm{\en{furigana}\ja{振仮名}}\mprm{\en{okurigana}\ja{送仮名}}
\end{ltxsyntax}

\en{For example, the code}
\ja{例えば、 \opt{tateaki} が \verb|1| に設定されている場合、下記のコードを使えば}
\begin{example}
% example text from https://phesoca.com/kanbun-html/
\kanbunfont
\kanjiunit{}{}{子}{}{}{}
\kanjiunit{\furiokuri{}{ク}}{}{曰}{，}{}{}
\kanjiunit{\furiokuri{}{ゾ}}{}{盍}{}{三}{\furiokuri{}{ル}}
\kanjiunit{}{}{各}{〻}{}{}
\kanjiunit{\furiokuri{}{ハ}}{}{言}{}{二}{}
\kanjiunit{\furiokuri{}{ノ}}{}{爾}{}{}{}
\kanjiunit{\furiokuri{}{ヲ}}{}{志}{。}{一}{}
\par
\end{example}
\en{outputs}
\ja{こう出力する：}

\printkanbunblock{6}{
\kanbunfont
\kanjiunit{}{}{子}{}{}{}
\kanjiunit{\furiokuri{}{ク}}{}{曰}{，}{}{}
\kanjiunit{\furiokuri{}{ゾ}}{}{盍}{}{三}{\furiokuri{}{ル}}
\kanjiunit{}{}{各}{〻}{}{}
\kanjiunit{\furiokuri{}{ハ}}{}{言}{}{二}{}
\kanjiunit{\furiokuri{}{ノ}}{}{爾}{}{}{}
\kanjiunit{\furiokuri{}{ヲ}}{}{志}{。}{一}{}
\par
}

\noindent
\en{with \opt{tateaki} set to \verb|1|.}

\subsection{\en{Usage with \LuaLaTeX}\ja{\LuaLaTeX{}での使用}}
\en{\emph{Kanbun} annotation uses the following brackets to mark different elements in \emph{kanbun-kundoku} (as described in \href{https://phesoca.com/kanbun-html/}{漢文\textsc{html}} by UntPhesoca). }
\ja{漢文アノテーションでは下記の括弧を以って漢文訓読においての各要素を示す（UntPhesocaの \href{https://phesoca.com/kanbun-html/}{漢文HTML} を参照されたい）。}
\begin{itemize}
    \item \verb|( )|: \en{\emph{furigana} (}振仮名\en{)}
    \item \verb|{ }|: \en{\emph{okurigana} (}送仮名\en{) (these brackets can be omitted)}\ja{（この括弧を省略してもよい）}
    \item \verb|‹ ›|: \en{\emph{furigana} (振仮名) of \emph{saidoku-moji} (再読文字)}\ja{再読文字の振仮名}
    \item \verb|« »|: \en{\emph{okurigana} (送仮名) of \emph{saidoku-moji} (再読文字)}\ja{再読文字の送仮名}
    \item \verb|[ ]|: \en{\emph{kaeriten} (}返点\en{)}
    \item \verb|‘ ’|: \en{multiple \emph{kanji}, potentially with \emph{tateten} inserted, as a ruby base; group ruby (グループルビ)}\ja{グループルビのベース。中に\ruby{竪|点}{たて|てん}を入れてもよい}
    \item \en{no annotation: \emph{kanji} (漢字) and punctuation}\ja{アノテーション無し：漢字と句読点}
\end{itemize}
\en{\emph{Tateten} (竪点) can be input with either \verb|―| (\verb|U+2015|), \verb|—| (\verb|U+2014|) or \verb|㆐| (\verb|U+3190|).}
\ja{\verb|―| (\verb|U+2015|) か \verb|—| (\verb|U+2014|) か \verb|㆐| (\verb|U+3190|) かで竪点を入力できる。}

\begin{ltxsyntax}
    \cmditem{Kanbun}\cmditem{EndKanbun}

    \en{Write the annotated \emph{kanbun} between the commands \cmd{Kanbun} and \cmd{EndKanbun}, and it will be processed and saved, ready to be used later.}
    \ja{アノテーションのある漢文を \cmd{Kanbun} と \cmd{EndKanbun} の間に書き込む。処理されて、保存されておいて、後で使用可能となる。}

    \cmditem{printkanbun}

    \en{Where you would like to use the most recently saved \emph{kanbun-kundoku} paragraph, use \cmd{printkanbun}. It automatically calls \cmd{kanbunfont} and \cmd{par} to set the font size and line spacing and make paragraphs.}
    \ja{最近保存された漢文訓読を使用するには、 \cmd{printkanbun} を使う。自動的に \cmd{kanbunfont} と \cmd{par} を挿入して寸法やインテルを設定し、段落を作成する。}

    \cmditem{printkanbuncode}

    \en{If you wish to make modifications on the result or to use the result with a non-\LuaTeX{} engine, it is possible to obtain the macros using \cmd{printkanbuncode} (prints in the terminal), and continue to work from there.}
    \ja{処理の結果を一部変更する、もしくは結果を\LuaTeX{}でないエンジンで使用するには、結果のマクロを \cmd{printkanbuncode} で入手して（端末に出力）、そこから作業を続けることが可能。}

    \cmditem{printkanbunnopar}

    \en{The no-paragraph counterpart of \cmd{printkanbun}, which does not invoke \cmd{kanbunfont}, and uses \verb|\\| instead of \cmd{par}.}
    \ja{\cmd{printkanbun} に対応する段落無しのバージョン。\cmd{kanbunfont}を使用せず、 \cmd{par} の代わりに \verb|\\| を使用する。}

    \cmditem{printkanbunnoparcode}

    \en{The no-paragraph counterpart of \cmd{printkanbuncode}.}
    \ja{\cmd{printkanbuncode} に対応する段落無しのバージョン。}
\end{ltxsyntax}

\en{You can always save \cmd{printkanbun} to a macro for use later and start a new annotated \emph{kanbun} block, as in the following example.}
\ja{次の実例のとおり、後で使えるように \cmd{printkanbun} をあるマクロに保存し、新しい漢文段落を書き込み始められる。}
\begin{example}
% example text from https://phesoca.com/kanbun-html/
\documentclass{ltjtarticle}
\usepackage[kumi=beta]{kanbun}

\Kanbun
此レ乃チ信(しん)之‘所―[三]以’(ゆゑん)為ル[二]陛下ノ禽(とりこ)ト[一]也。
\EndKanbun
\let\信\printkanbun

\Kanbun
孤之有ルハ[二]孔明[一]，猶ホ‹ごと›«キ»[二]魚之有ルガ[一レ]水也。
\EndKanbun
\let\孔明\printkanbun

\begin{document}
\孔明\par\bfseries\信
\end{document}
\end{example}

\Kanbun
此レ乃チ信(しん)之‘所―[三]以’(ゆゑん)為ル[二]陛下ノ禽(とりこ)ト[一]也。
\EndKanbun
\let\信\printkanbun

\Kanbun
孤之有ルハ[二]孔明[一]，猶ホ‹ごと›«キ»[二]魚之有ルガ[一レ]水也。
\EndKanbun
\let\孔明\printkanbun

\ExplSyntaxOn
\tl_set:Nn \kanbun_kumi { beta }
\ExplSyntaxOff
\printkanbunblock{16}{\孔明\par\bfseries\信}


\end{document}
