%#! lualatex
%%% a test of ruby.
\documentclass[a4paper,10ptj]{ltjsarticle}
\usepackage[rgb]{xcolor}
\usepackage{enumitem,mleftright,pict2e}
\usepackage{luatexja-otf,amsmath,bxghost}
\usepackage[no-math]{fontspec}
\usepackage[match]{luatexja-fontspec}
\usepackage[haranoaji]{luatexja-preset}\normalsize
\setmonojfont{HaranoAjiGothic-Regular.otf}
\usepackage{unicode-math}
\setmathfont{Latin Modern Math}
%\usepackage{lua-visual-debug}

\def\emph#1{\textbf{\textgt{#1}}}
\def\headfont{\normalfont\bfseries\gtfamily}
\def\cs#1{\eghostguarded{\texttt{\textbackslash#1}}}
\usepackage[textwidth=45\zw, lines=45, footskip=2\zh]{geometry}
\advance\leftmargini-1\zw\advance\leftmarginii-1\zw
\protected\def\Param#1{\eghostguarded{\underline{\smash{\textsf{\mdseries #1}}}}}

\usepackage{luatexja-ruby,showexpl,booktabs}
\definecolor{mygreen}{rgb}{0,0.5,0}
\lstset{
  preset=\normalsize, basicstyle=\small\ttfamily, basewidth=0.5em,
  explpreset={numberstyle=\tiny, numbers=left, numbersep=1em, columns=fixed},
  morecomment=[l]{\%}, commentstyle=\color{mygreen}
}
\makeatletter\let\SX@Info=\relax\makeatother
\fboxsep=0mm

\usepackage{hyperref,bookmark,xcolor}
\hypersetup{%
	unicode,
	colorlinks,
	allbordercolors=1 1 1,
	allcolors=blue,
	pdftitle={luatexja-ruby.sty}
}
\def\Node#1#2{\,\vcenter{\hbox{\fboxsep=1pt\fbox{\vbox{\small\halign{\hfil##\hfil\cr
  #1\mathstrut\cr\noalign{\smallskip\hrule height.4pt\smallskip}\strut\<#2\cr}}}}}\,}
\def\LuaTeX{Lua\TeX}

% 三分ルビ用
\DeclareFontShape{JY3}{mc}{mc}{n}{<-> [0.92487] 
  HaranoAjiMincho-Regular:extend=0.67;jfm=ujisc33}{}

%%%% \ltjruby 内に \texorpdfstring + | 除去を仕込む
\RequirePackage{xparse}
\makeatletter
\def\removevert#1{\if\noexpand#1|%
    \expandafter\expandafter\expandafter\@firstofone\expandafter{%
  \else\ifnum0=1}\fi#1%
    \ifx#1\relax\expandafter\@gobble%
    \else\expandafter\@firstofone
    \fi{\expandafter\@firstofone
  \fi
  \removevert}}
\makeatother
\ExplSyntaxOn
\cs_set_eq:NN \myorigltjruby \ltjruby
\DeclareExpandableDocumentCommand {\ltjruby} { O{} m m } {%
   \texorpdfstring {
    \exp_not:n { \myorigltjruby[#1]{#2}{#3} }
  } {
    \removevert #2 \relax
  }
}
\cs_set_eq:NN \ruby \ltjruby
\ExplSyntaxOff
%%%%

\makeatletter
\def\figureautorefname{図}
\def\HyRef@autoref#1#2{%
  \begingroup
    \Hy@safe@activestrue
    \expandafter\HyRef@autosetref\csname r@#2\endcsname{#2}{#1}%
  \endgroup\eghostguarded{}%" 欧文ゴースト
}

\title{\textsf{luatexja-ruby}パッケージ}
\author{\LuaTeX-jaプロジェクトチーム}
\date{\texttt{\csname ver@luatexja-ruby.sty\endcsname}（\today）}
\makeatletter
\def\mybox#1{\unskip\ {\Large \fboxrule=0.1mm\fboxsep=0mm\fcolorbox{cyan}{white}{\hbox{\<\ltjjachar#1\<}}}\ }

\begin{document}

\catcode`\<=13
\def<#1>{{\rmfamily\mdseries\itshape$\langle$#1\/$\rangle$}}
%\fontsize{13.19873}{15}\selectfont%

\maketitle

\begin{abstract}
\textsf{luatexja-ruby}パッケージは，\LuaTeX-jaの機能を利用してルビの組版処理を行う追加パッケージである．
\LuaTeX, \LuaTeX-jaの内部処理に割り込むことにより，熟語ルビ中の行分割や，
行頭形・行中形・行末形の自動検出，また進入許容量の自動設定などを可能とした．

v0.3より前とは親文字の高さの扱いが変わっている（\texttt{baseheight}キーを参照せよ）ほか，
\Param{rubypreintrusion}, \Param{rubypostintrusion}パラメータの初期値が変わっているので注意すること．
\end{abstract}

\tableofcontents

\newpage
\section{\ltjruby{利|用|方|法}{り|よう|ほう|ほう}}
パッケージ読み込みは，\verb+\usepackage{luatexja-ruby}+ で良く，
必要ならば自動的に\LuaTeX-ja本体を読み込む．
plain \LuaTeX でのロードはまだサポートしておらず，
\LaTeXe のみサポートしている．

\subsection{\ltjruby{用|語}{よう|ご}}
「進入(intrusion)」「突出(protrusion)」という用語は，
\href{http://zrbabbler.sp.land.to/pxrubrica.html}{\textsf{pxrubrica}パッケージ}%
での用法に準ずる．

\begin{quote}
  進入あり：と\ltjruby{暁}{あかつき}の\\
  進入なし：と\ltjruby[mode=0]{暁}{あかつき}の\\
  突出あり：\ltjruby[stretch={1}{2}{1}]{聴衆}{ちようしゆう}\\
  突出なし：\ltjruby[stretch={0}{2}{0}]{聴衆}{ちようしゆう}
\end{quote}

なお，本パッケージでは親文字と直前・直後の文字の間に0でない和文処理グルー
\footnote{JFMで指定されたグルーや，標準の和文間空白(\Param{kanjiskip})，標準の和欧文間空白(\Param{xkanjiskip})．}%
がくることも考慮しているため，「\emph{前後の文字への}\underline{進入（許容）量}」と「進入（許容）量」とは異なる可能性がある．
この文書では次のように称する：
\begin{description}
  \item[\underline{文字進入量}] 前後の文字へルビ文字が実際にかかる長さ．常に下線を引くことにする．
  \item[進入量] 前後の文字，およびそれとルビの間の和文処理グルーにかかる長さ
\end{description}
多くの場合，和文処理グルーは0以上の長さのため，進入量は\underline{文字進入量}以上である．

例えば次の例では，直前の文字「来」への\underline{前文字進入量}は0であるが，
前進入量は（和欧文間空白にかかる分まで含めるので）正である．
\begin{quote}
  \Large
  本来\ltjruby{foohoge}{\vrule ほげほげふがふが\vrule}においては……\\
  本来foohogeにおいては……
\end{quote}

また，「親文字全角幅」「親文字全角高さ」という用語は，それぞれ親文字の和文フォントにおける
\cs{zw},~\cs{zh}命令で取得できる値を表す．多くの場合は両者は同じ値であるが，いつでもそうであるという保証はない．
「ルビ全角幅」「ルビ全角高さ」についても同様である．

\subsection{\ruby{命|令}{めい|れい}}
\label{ssec:ltjruby}
\paragraph{\cs{ltjruby}}
ルビ出力用命令の本体．\verb+\ruby+ という別名を定義している．
\begin{quote}
\ttfamily \textbackslash ltjruby[<option>]\{親|文|字\}\{おや|も|じ\}
\end{quote}
のように親文字→ルビの順序で指定する．
第2・第3引数内の「\verb+|+」はグループの区切りを表す．詳細は\ref{ssec:grp}\nobreak 小節を参照．

\medskip
<option>には以下の内容をkey-valueリストで指定可能である．
<real>は10進の実数値を表す．<bool>は真偽値\texttt{true}（真）か\texttt{false}（偽）であり，
値を省略したときには\texttt{true}の意味になる．

\begin{description}
\def\makelabel#1{\ttfamily\bfseries #1}
\item[pre=<real>] \underline{前文字進入許容量}をルビ全角単位で指定．
負の長さを指定した場合は，ルビの状況や直前の文字に応じた自動指定を意味する．
既定値は負（つまり，自動指定）．

\item[post=<real>] 同様に，\underline{後文字進入許容量}を指定する．既定値は負（自動指定）．

\item[mode] 進入処理のモードを表すbit vector．下位2\,bitは，\texttt{pre}や
\texttt{post}が負である場合にしか効力を発揮しない．既定値は$(00001)_2 = 1$．
\begin{description}
 \item[bit 0] 前後の\underline{文字への進入}を無効にするならば0，有効にするならば1．
 \item[bit 1] 前進入許容量$B$と後進入許容量$A$が異なった場合，
  そのまま処理する場合は0，小さい方に揃えるならば1．
 \item[bit 2--4] ルビ文字の突出量から実際の前・後進入量の計算方法を指定する．
  詳しい計算方法については\ref{ssec:calc_intrusion}\nobreak 小節を参照．
\end{description}
\item[intrude\_jfmgk=<bool>] 進入量算出の際に，前後のJFMグルーの自然長を考慮するか否か．既定値は真．
\item[intrude\_kanjiskip=<bool>] 進入量算出の際に，ルビ前後に挿入される
  標準の和文間空白(\Param{kanjiskip})の自然長を
  考慮するか否か．既定値は真．
\item[intrude\_xkanjiskip=<bool>] 進入量算出の際に，ルビ前後に挿入される
  標準の和欧文間空白(\Param{xkanjiskip})の自然長を考慮するか否か．既定値は真．
\item[stretchruby=\{<left>\}\{<middle>\}\{<right>\}] 親文字の合計長が
ルビ文字の合計長より長い時に，ルビ文字の前・間・後に入れる空白の割合であり，
それぞれ0--7の自然数で指定する．
既定値は\ \verb+{1}{2}{1}+ である．
<left>はルビ文字の先頭までの空き量，<middle>はルビ文字間の空き量，<right>はルビ文字の末尾からの
空き量（の比）を表す．以下が例である．
\begin{LTXexample}[width=0.3\textwidth, preset=\Large]
\ltjruby[stretchruby=123,maxmargin=2]%
  {◯◯◯◯}{◆◆}
\end{LTXexample}
\item[stretch=\{<left>\}\{<middle>\}\{<right>\}]
行中形でルビ文字の方が長い場合，親文字の前・中・後に入れる空白の割合．
既定値は\ \verb+{1}{2}{1}+ である．それ以外の代表的な値としては，例えば次のようなものがある．
\begin{description}
\item[親文字均等割禁止] \verb+{1}{0}{1}+\ など<middle>を0にした値
\item[前突出禁止] \verb+{0}{1}{1}+
\item[後突出禁止] \verb+{1}{1}{0}+
\end{description}

\item[stretchbol=\{<left>\}\{<middle>\}\{<right>\}] 行頭形に対する\texttt{stretch}と同様の指定．
既定値は\ \verb+{0}{1}{1}+ である．
\item[stretcheol=\{<left>\}\{<middle>\}\{<right>\}] 行末形に対する\texttt{stretch}と同様の指定．
既定値は\ \verb+{1}{1}{0}+ である．

\item[maxmargin=<real>] 親文字の方がルビより長い時に，ルビの先頭と親文字の先頭，及び
ルビ末尾と親文字の末尾の間に許される最大の空白量．\textbf{親文字全角幅単位}で指定し，既定値は0.5．

\medskip
\item[size=<real>] ルビ文字の親文字に対する大きさ．既定値は0.5．
\item[intergap=<real>] ルビ文字と親文字との空きを親文字全角高さ単位で指定．既定値は0．
\item[rubysmash=<bool>] ルビの高さを0にするか．既定値は偽．次が例である．
\begin{LTXexample}[width=0.3\textwidth, preset=\Large]
\ \vrule width 0pt height 2\zw depth 1\zw
\frame{\ltjruby[rubysmash=false]{本}{ほん}}\ 
\frame{\ltjruby[rubysmash=true]{本}{ほん}}\ 
\frame{\ltjruby[rubysmash=false,intergap=0.2]
  {本}{ほん}}\ 
\frame{\ltjruby[rubysmash=true,intergap=0.2]
  {本}{ほん}}\ 
\frame{\ltjruby[rubysmash=false,intergap=-1.5]
  {本}{ほん}}
\end{LTXexample}
\item[ybaseheight=<real>] 非負の値が指定された場合，
  \emph{縦組以外での}親文字の高さを親文字全角高さの<real>倍と強制的に固定する．
  負の値が指定された場合は「固定しない」（すなわち，v0.3より前の挙動と同じになる）．
  既定値は$0.88$．
\item[tbaseheight=<real>] \texttt{ybaseheight}と同様だが，こちらは\emph{縦組での}親文字の高さを指定する．
  既定値は$0.5$．
\item[baseheight=<real>] \texttt{ybaseheight}，\texttt{tbaseheight}を同時に指定したことと同義．
  次の例や\autoref{fig:ruby_vertical}を参照．
\begin{LTXexample}[width=0.3\textwidth, preset=\Large]
\noindent
\ltjruby[baseheight=0.88]{本}{ほん}\ 
\ltjruby[baseheight=0.88]{dvi}{ディーヴィーアイ}\\
\ltjruby[baseheight=0.5]{本}{ほん}\ 
\ltjruby[baseheight=0.5]{dvi}{ディーヴィーアイ}\\
\ltjruby[baseheight=0]{本}{ほん}\ 
\ltjruby[baseheight=0]{dvi}{ディーヴィーアイ}\\
\ltjruby[baseheight=-1]{本}{ほん}\ 
\ltjruby[baseheight=-1]{dvi}{ディーヴィーアイ}
\end{LTXexample}
\item[yrubydepth=<real>] 非負の値が指定された場合，
  \emph{縦組以外での}ルビの深さをルビ全角の<real>倍と強制的に固定する．
  負の値が指定された場合は「固定しない」（すなわち，v0.52以前の挙動と同じになる）．
  既定値は$0.12$．
\item[trubydepth=<real>] \texttt{yrubydepth}と同様だが，こちらは\emph{縦組での}ルビの深さを指定する．
  既定値は$0.5$．
\item[rubydepth=<real>] \texttt{yrubydepth}，\texttt{trubydepth}を同時に指定したことと同義．
  次の例や\autoref{fig:ruby_vertical}を参照．
\begin{LTXexample}[width=0.3\textwidth, preset=\Large]
\noindent
\ltjruby[rubydepth=0.12]{◆}{ほん}\ 
\ltjruby[rubydepth=0.12]{◆}{pdf}\ 
\ltjruby[rubydepth=0.12]{◆}{dvi}\\
\ltjruby[rubydepth=0]{◆}{ほん}\ 
\ltjruby[rubydepth=0]{◆}{pdf}\ 
\ltjruby[rubydepth=0]{◆}{dvi}\\
\ltjruby[rubydepth=-1]{◆}{ほん}\ 
\ltjruby[rubydepth=-1]{◆}{pdf}\
\ltjruby[rubydepth=-1]{◆}{dvi}
\end{LTXexample}

\begin{figure}[t]
  {\centering\fontsize{48}{48}\selectfont\unitlength=\zw
  \begin{picture}(7,2.5)(-0.5,-0.5)
    \linethickness{0.4mm}
    \put(0,0){\makebox(0,0)[l]{\smash{\hbox to 6.5\zw{親文字$\int_0^1 x\,dx$}}}}
    \polygon(0,-.12)(0,0.88)(6.5,0.88)(6.5,-0.12)
    \put(0,1.35){\makebox(0,0)[l]{\fontsize{24}{24}\selectfont\smash{\hbox to 13\zw{ルビ文字列◆◆◆◆◆◆◆◆}}}}
    \polygon(0,1.2)(0,1.79)(6.5,1.79)(6.5,1.2)
    \linethickness{0.125mm}
    \put(-0.5,0){\line(1,0){7}}
    \put(-0.5,1.35){\line(1,0){7}}
    \put(-0.5,1.2){\line(1,0){0.5}}
    \put(-0.5,0.88){\line(1,0){0.5}}
    \put(-0.25,0){\vector(0,1){0.88}}
    \put(-0.25,1.35){\vector(0,-1){0.15}}
    \put(-0.25,0.44){\normalsize\makebox(0,0)[r]{$H$\,\,}}
    \put(-0.25,1.45){\normalsize\makebox(0,0)[b]{$D$}}
    \put(-0.125,0.88){\vector(0,1){0.32}}
    \put(-0.125,1.04){\normalsize\makebox(0,0)[l]{\,\,$\mbox{\texttt{intergap}}\cdot p$}}
  \end{picture}\par}

  \normalsize\leftskip=0.5\dimexpr\textwidth-30\zw \rightskip=\leftskip
  ここで$p$は親文字における全角高さ，$r$はルビ文字における全角高さであり，
  \begin{gather*}
  H=
  \begin{cases}
    \mbox{\texttt{[yt]baseheight}}\cdot p&\mbox{if\ $\mbox{\texttt{[yt]baseheight}}\ge 0$,}\\
    \mbox{（自然高さ）}&\mbox{if\ $\mbox{\texttt{[yt]baseheight}}\string<0$,}
  \end{cases}\\
  D=
  \begin{cases}
    \mbox{\texttt{[yt]rubydepth}}\cdot r&\mbox{if\ $\mbox{\texttt{[yt]rubydepth}}\ge 0$,}\\
    \mbox{（自然深さ）}&\mbox{if\ $\mbox{\texttt{[yt]rubydepth}}\string<0$.}
  \end{cases}
  \end{gather*}
  \caption{ルビの垂直配置}\label{fig:ruby_vertical}
\end{figure}


\item[kenten=<command>]各文字につく圏点の出力命令を指定する．
  既定値は「\verb+\textbullet+」である．

\item[fontcmd=<command>]ルビ用のフォント切り替え命令を指定する．
このキーの内容が実行された後に\ \verb+\fontsize...\selectfont+\ が実行されるので，
このキーの指定では最後に\ \verb+\selectfont+ を加える必要はない．

この \texttt{fontcmd} キーの内容は多くの回数実行される．
例えば，\textsf{luatexja-fontspec}パッケージを用いてOpenTypeフォントを用いる場合，
\begin{lstlisting}
 fontcmd=\addjfontfeatures{Style=Ruby}
\end{lstlisting}
のようにしてルビ用字形を用いることが可能だが，現在の実装ではタイプセットに時間がかかるようになる．

\end{description}

\medskip
次の2つは，以上で説明した複数のオプションを一度に設定するためのものである．
普通はこの2\nobreak つのうちいずれかを設定するだけで足りるだろう．

\begin{description}
\def\makelabel#1{\ttfamily\bfseries #1}
\item[naka] 以下のオプションを同時に設定する．主に中付きルビを組むときに用いる．
\begin{verbatim}
mode=1, stretch={1}{2}{1}, stretchruby={1}{2}{1}
\end{verbatim}
\item[kata] 同様に，肩付きルビ用に，次を設定する．
\begin{verbatim}
mode=9, stretch={1}{2}{1}, stretchruby={0}{0}{1}
\end{verbatim}
\end{description}

\paragraph{\cs{ltjsetruby}\{<option>\}}
<option>の既定値を指定する．\textsf{luatexja-ruby}読み込み時の値は
各項目の所で既に説明してあるが，次のようになっている．
\begin{verbatim}
  pre=-1, post=-1, mode=1,
  stretchruby={1}{2}{1}, stretch = {1}{2}{1},
  stretchbol={0}{1}{1}, stretcheol={1}{1}{0},
  maxmargin=0.5, size=0.5, intergap=0, rubysmash=false,
  kenten=\textbullet, fontcmd=\relax, ybaseheight=0.88, tbaseheight=0.5,
  yrubydepth=0.12, trubydepth=0.5,
  intrude_jfmgk, intrude_kanjiskip, intrude_xkanjiskip
\end{verbatim}

\paragraph{\cs{ltjsetparamater} に追加されるキー}
\begin{description}
\item[\Param{rubypreintrusion}\ttfamily =\{<chr\_code>, <pre\_int>\}]
  文字<chr\_code> に，その\textbf{直後}のルビによって掛けられるルビ文字列の最大長
  （つまり，\underline{前文字進入許容量}）をルビ全角幅単位で指定．

  \textbf{v0.5以降での変更点}：もし$-a$~($a>0$)を指定した場合は，実際の\underline{前文字進入許容量}は$a$となるが，
  文字<chr\_code>の前のJFMグルーに進入が発生した場合には，\underline{前文字進入許容量}が0でなかった場合は，の後のJFMグルーにはルビの進入は発生しない．

\item[\Param{rubypostintrusion}\ttfamily =\{<chr\_code>, <post\_int>\}]
  文字<chr\_code> に，その\textbf{直前}のルビによって掛けられるルビ文字列の最大長
  （つまり，\underline{後文字進入許容量}）をルビ全角幅単位で指定．

  \textbf{v0.5以降での変更点}：もし$-a$~($a>0$)を指定した場合は，実際の\underline{後文字進入許容量}は$a$となるが，
  実際の\underline{後文字進入量}が0でなかった場合は，文字<chr\_code>の後のJFMグルーにはルビの進入は発生しない．
\end{description}
以下の文字は\Param{rubypreintrusion},~\Param{rubypostintrusion}とも初期値は1である：
\begin{quote}
 ひらがな(\texttt{U+3040}--\texttt{U+309F})，カタカナ(\texttt{U+30A0}--\texttt{U+30FF})，
 仮名補助など(\texttt{U+1B000}--\texttt{U+1B16F})，\\
 分離禁止文字
 \@for\@tmp:=`\―,`\‥,`\…,`〳,`\〴,`\〵,"2014 \do{\mybox{\@tmp}}
\end{quote}
次に，以下の文字は\Param{rubypreintrusion},~\Param{rubypostintrusion}とも初期値は0.5である：
\begin{quote}
 中点類\@for\@tmp:=`\・,`\：,`\； \do{\mybox{\@tmp}}
\end{quote}
また，以下の文字は\Param{rubypreintrusion}のみ初期値は$-1$である：
\begin{quote}
  始め括弧類
  \@for\@tmp:=`\‘,`\“,`\〈,`\《,`\「,`\『,`\【,`\〔,`\〖,`\〘,`\〝,`\（,`\［,`\｛,`\｟ \do{\mybox{\@tmp}}\unskip，
  「文字コード$-1$の文字
  \footnote{段落開始の\ \cs{parindent}分インデントを表す．
    通常の\LuaTeX-jaにおける指定では「文字コード$-1$」は文中数式境界を表していることに注意．}」
\end{quote}
さらに，以下の文字は\Param{rubypostintrusion}のみ初期値は$-1$である：
\begin{quote}
  閉じ括弧類
  \@for\@tmp:=`\’,`\”,`\〉,`\》,`\」,`\』,`\】,`\〕,`\〗,`\〙,`\〟,`\）,`\］,`\｝,`\｠ \do{\mybox{\@tmp}}\unskip，
  句読点類\@for\@tmp:=`\、,`\，,`\。,`\． \do{\mybox{\@tmp}}
\end{quote}
\makeatother

以上で記述されていない\Param{rubypreintrusion},~\Param{rubypostintrusion}の初期値はすべて0である．


\paragraph{\cs{ltjkenten}}
圏点を出力する命令であり，
\begin{quote}
 \ttfamily\cs{ltjkenten}[<option>]\{親文字\}
\end{quote}
のように使用する．複数文字に圏点をつける場合でも，\verb+\ltjruby+ のように「\texttt{|}」を使って
文字を区切る\textbf{必要はない}（\verb+\kenten+内では「\texttt{|}」は特別な意味を持たない）
ことに注意してほしい．

圏点として出力される文字は\texttt{kenten}キーによって指定し，
圏点自身の大きさは（ルビと同様に）\texttt{size}キーで指定する．

\subsection{グループの\ruby{指|定}{し|てい}}
\label{ssec:grp}
\begin{quote}
\ttfamily\cs{ltjruby}[<option>]\{親|文|字\}\{おや|も|じ\}
\end{quote}
のように，\verb+\ltjruby+\ の第2・第3引数内の「\verb+|+」はグループの区切りを表す．
グループの数は両者で一致しなければならず，
\verb+\ltjruby{紋章}{もん|しよう}+ のようには\emph{できない}．

1グループのみのルビ（単純グループルビ）はグループルビとして組まれる．そのため，
もしモノルビを使いたければ，面倒でも
\begin{LTXexample}[width=0.4\textwidth, preset=\Large]
の\ltjruby{紋}{もん}\ltjruby{章}{しよう}が
\end{LTXexample}
のように，複数回使用すること．
また，全てのグループにおいて「ルビ文字列の長さは親文字列以下」
\footnote{%
  実際には\TeX での長さの計算誤差（$2^{-16}$~ptの整数倍として計算していることによる）を考慮し，
  親文字全角の$1/1000$だけルビ文字列が長くなることを許容している．
}であれば，
単純グループルビの並びとして扱われる．すなわち，次ページ冒頭の2行は全くの等価となる．
\begin{verbatim}
\ltjruby{普|通|車}{ふ|つう|しや}
\ltjruby{普}{ふ}\ltjruby{通}{つう}\ltjruby{車}{しや}
\end{verbatim}

複数グループかつ上記の条件を満たさない場合は，
所謂「可動グループルビ」であり，ルビの前後や各グループの切れ目で行分割が可能となる．
例えば
\begin{verbatim}
…の\ltjruby{表|現|力}{ひよう|げん|りよく}は…
\end{verbatim}
という入力からは得られる組版結果は，次のいずれかになる．
\begin{center}
 \begin{tabular}{ll}
 \toprule
 改行なし（行中形）&\Large …の\ltjruby{表|現|力}{ひよう|げん|りよく}は…\\
 直前で改行&\Large \vrule \ltjruby[stretch=011]{表|現|力}{ひよう|げん|りよく}は…\\
&\Large …の\ltjruby[stretch=110]{表}{ひよう}
    \vrule\ltjruby[stretch=011]{現|力}{げん|りよく}は…\\
&\Large …の\ltjruby[stretch=110]{表|現}{ひよう|げん}
    \vrule\ltjruby[stretch=011]{力}{りよく}は…\\
 直後に改行&\Large …の\ltjruby[stretch=110]{表|現|力}{ひよう|げん|りよく}\vrule\\
\bottomrule
 \end{tabular}
\end{center}
\begin{itemize}
 \item これらの行分割によってペナルティは発生しない．
 \item 上記の例で見られるように，
2ブロック以上をまとめて組むときは，全体を1つのグループルビのように組版する（JIS~X~4051と同様）．
『日本語組版処理の要件』では，
附属書Fに「熟語の構成，さらにその熟語の前後にくる文字の種類を考慮して配置する方法」として
別の方法を解説しているが，こちらの方法は現時点ではサポートしていないので，
面倒でも手動で \texttt{pre}, \texttt{post} などを使って頑張って欲しい．
 \item 実装方法の都合により，ルビの直前・直後・途中で2箇所以上の改行が起きる場合，例えば
\begin{center}
 \Large …の\ltjruby[stretch=110]{表}{ひよう}
    \vrule\ltjruby[stretch=010]{現|力}{げん|りよく}\vrule\qquad
\Large \vrule\ltjruby[stretch=010]{表|現}{ひよう|げん}
    \vrule\ltjruby[stretch=011]{力}{りよく}は…\qquad
\Large \vrule\ltjruby[stretch=010]{表|現|力}{ひよう|げん|りよく}\vrule

\end{center}
などの組み方は\emph{想定していない}．
エラーが発生して止まることもあるし，エラーが発生しなくても正しく組まれない．
\end{itemize}

\paragraph{別名について}
\verb+\begin{document}+時に%
\begin{itemize}
 \item \cs{ruby}がすでに定義されていない場合に限り，\cs{ruby}が\cs{ltjruby}の別名として定義される．
 \item \cs{kenten}がすでに定義されていない場合に限り，\cs{kenten}が\cs{ltjkenten}の別名として定義される．
\end{itemize}

\section{\ruby{注|意|点}{ちゆう|い|てん}}
\paragraph{前後からのルビ文字のはみ出し1}
「日本語組版処理の要件」の図117\footnote{2020-08-11版での番号．2012-04-03版では図3.82．}のように，
前後からのルビ文字のはみ出しが繋がらないようにする処理が組み込まれている．
例えば，
\begin{LTXexample}[preset=\Large,width=0.3\textwidth]
\ltjruby{陵}{りよう}と\ltjruby{陵}{みささぎ}\\
\ltjruby{陵}{りよう}と\ltjruby[pre=1]{陵}{みささぎ}
\end{LTXexample} 
において，1行目右側の「\ltjruby{陵}{みささぎ}」のルビが前の「と」にかかる量は次のように決まる：
\begin{enumerate}
\item 1回目の実行では，行分割前に「\ltjruby{陵}{りよう}」の\underline{後文字進入量}は前もって知ることはでき
      ない．そのため，「\ltjruby{陵}{りよう}」は行中形で組まれるものと想定し，
「\ltjruby{陵}{みささぎ}」の前文字進入許容量は
\[
 \underbrace{0.5\,\mathrm{zw}}_{\text{元々の許容量}}
-\underbrace{0.25\,\mathrm{zw}}_{\text{前のルビの\underline{後文字進入量}（行中形）}}=0.25\,\mathrm{zw}
\]
となる．行分割後，「\ltjruby{陵}{りよう}」の実際の\underline{後文字進入量}は
<jobname>\texttt{.ltjruby}ファイルに記述される．
\item 2回目以降の実行では，<jobname>\texttt{.ltjruby}ファイルに保存された「\ltjruby{陵}{りよう}」の\underline{後文字進入量}
を用いて，「\ltjruby{陵}{みささぎ}」の\underline{前文字進入許容量}を次のように計算する：
\[
 \underbrace{0.5\,\mathrm{zw}}_{\text{元々の許容量}}
-\underbrace{0.25\,\mathrm{zw}}_{\text{前のルビの\underline{後文字進入量}(from \texttt{.ltjruby})}}=0.25\,\mathrm{zw}.
\]
\end{enumerate}

<jobname>\texttt{.ltjruby}ファイルに保存する際，各 \verb+\ltjruby+ 命令の呼び出しを識別するキーが必要になるが，
そのキーとしては単純に「何個目の \verb+\ltjruby+ 命令か」である．

なお，以上の処理は，1行目と2行目を比較すれば分かるように，
「\ltjruby{陵}{みささぎ}」の\emph{\underline{前文字進入許容量}指定(\texttt{pre})が自動}になっている場合のみ
実施される．


\paragraph{前後からのルビ文字のはみ出し2}
また，本パッケージのv0.**以降では，「日本語組版処理の要件」にある
\begin{quote}
  後ろにくる終わり括弧類，句点類若しくは読点類，又は前にくる始め括弧類には，
  最大でルビ文字サイズの全角までルビ文字を掛けてもよい．
  この場合，後ろにくる終わり括弧類，句点類若しくは読点類の後ろの空き量，
  又は前にくる始め括弧類の前の空き量に掛けてはならない．
\end{quote}
という処理も組み込まれており，<jobname>\texttt{.ltjruby}に「前後の和文処理グルーに正の量だけ進入したか」という情報を
保存することによって実装されている．

\paragraph{段落末尾のルビ}
段落がルビで終わった場合，そのルビが行末形で組まれることはない．
これは，段落の「本当の」末尾には \verb+\penalty10000\parfillskip+ があるためで，
ルビ処理用に作った最後のグルー（\ref{ssec:impl}\nobreak 小節の説明では$g_2$）が消去されないことによる．

\verb+\parfillskip+ の長さ（や，場合によっては \verb+\rightskip+）を実測し，
それによって処理を変えるのも可能だが，そのようなことはしなかった．
段落がルビで終わることは普通ない（最低でも句点が続くだろう）と思うからである．

\paragraph{段落先頭のルビ}
同様に，段落先頭のルビは行頭形にはならない．
\texttt{pre}が負（つまり，自動指定）のとき，段落最初の \verb+\parindent+ 分への
進入は可能である．ここ\verb+\parindent+ 分のインデントへの\underline{進入許容量}は
「文字$-1$」に対する\Param{rubypreintrusion}（既定値は1，ルビ全角単位）と
\ \verb+\parindent+ の長さのうち小さい方である．
\begin{LTXexample}[preset=\Large,width=0.4\textwidth]
\parindent1\zw\noindent ０１２３４５\par
\ltjruby{陵}{みささぎ}は……\par
\ltjruby{承}{うけたまわ}り……\par
\parindent0.25\zw\ltjruby{陵}{みささぎ}は……
\end{LTXexample}

\paragraph{和文処理グルーの伸縮}
現バージョンでは，進入量調整に和文処理グルーを考慮させる，
\begin{quote}
\texttt{intrude\_jfmgk}, \texttt{intrude\_kanjiskip}, \texttt{intrude\_xkanjiskip}キー
\end{quote}
の値が\texttt{true}（真）で
あった状況でも，考慮されるのは\emph{自然長の値のみ}である．そのため，行の調整処理が発生した場合は
意図しない結果となる．

例えば，標準設定での中黒「・」の直後のルビからの中黒への進入許容量は
\begin{quote}
  中黒「・」への\underline{前進入許容量}はルビ全角の半分で，
  中黒本体の後の四分空きには進入可能
\end{quote}
となっている．そのため，下の例の1, 2行目ともルビの前進入量は0.5\,zwとなる．
しかし，2行目では詰め量の0.5\,zwがほとんど中黒周囲の四分空きで負担されるため，
実際には「中黒本体にほぼ0.5\,zwが進入する」という望ましくない結果が得られている．
\begin{LTXexample}[preset=\Large,width=0.4\textwidth]
\leavevmode\hbox{あ・\ltjruby{◆}{◆◆◆◆}漢字}\\
\hbox spread-0.5\zw{あ・\ltjruby{◆}{◆◆◆◆}漢字}
\end{LTXexample}

また，次の例では2行目では前後の\underline{文字進入量}がルビ1字分と等しくなっているが，
3行目のように1全角伸ばすという調整が行われた後は\underline{文字進入量}が不揃いになってしまっている．
これはもともと「\texttt{;}」には後側にのみ和欧文間空白が入ることと，3行目ではこの和欧文間空白が
伸びているためである．
\begin{LTXexample}[preset=\Large,width=0.4\textwidth]
\leavevmode\hbox{……に%
  \ltjruby{\texttt{;}}{セミコロン}という……}\\
\hbox spread\zw{……に%
  \ltjruby{\texttt{;}}{セミコロン}という……}
\end{LTXexample}

\newpage
\section{\ruby{実|装}{じつ|そう}について}

\subsection{進入量の計算}
\label{ssec:calc_intrusion}
ルビ文字を自然に組んだときの幅が親文字のそれより多い場合，
ルビの前後への進入量は次のように決定される．
\begin{enumerate}[label=\emph{Step~\arabic*},labelindent=0pt,itemindent=*,itemsep=\medskipamount]
  \item \underline{前文字進入許容量}$B_0$，\underline{後進入文字許容量}$A_0$の算出．
  
  ルビ全角の長さを$r$とする．
  \begin{enumerate}
   \item \texttt{pre}の指定値が非負であった場合は，それに$r$を掛けたものを$B_0$とする．\\
    そうでなかった場合は，「ルビの直前の文字」に対する
    \Param{rubypreintrusion}の値に$r$を掛けたものを$B_0$とする
    \footnote{%
      なお，「ルビの直前の文字」が段落最初の\cs{parindent}分のインデントであった場合，
      $B_0$を，「文字コード$-1$の文字」\Param{rubypreintrusion}の値に$r$を掛けた値と\cs{parindent}のうち
      小さい方とする．
    }．
   \item \texttt{post}の指定値が非負であった場合は，それに$r$を掛けたものを$A_0$とする．\\
    そうでなかった場合は，「ルビの直後の文字」に対する
    \Param{rubypostintrusion}の値にルビ全角の値を掛けたものを$A_0$とする．
   \item \texttt{mode}の最下位ビット(bit~0)が0であった場合は，$B_0\leftarrow 0$, $A\leftarrow 0$とする．
   \item もし2つ前の文字がルビで，その直後（つまりいま処理しているルビから見れば直前）
    の文字へ$a'$だけの進入があった場合，現在のルビについて$B_0←\min(0,B_0-a')$とする．
  \end{enumerate}
  \item 前進入許容量$B$，後進入許容量$A$の算出．
  \begin{enumerate}
    \item まず$B\leftarrow B_0$,\ \ $A\leftarrow A_0$とする．
    \item ルビとその直前の文字の間に和文処理グルー$g$が挿入された場合，
    \begin{itemize}
      \item $g$がJFMグルーの場合は，\texttt{intrude\_jfmgk}が真の場合に，
      \item $g$が標準の和文間空白(\Param{kanjiskip})の場合は，
      \texttt{intrude\_kanjiskip}が真の場合に，
      \item $g$が標準の和欧文間空白(\Param{xkanjiskip})の場合は，
      \texttt{intrude\_xkanjiskip}が真の場合に，
    \end{itemize}
    それぞれ$g$の自然長を$B$に加算する．

    ルビとその直後の文字との間に和文処理グルーが挿入された場合も同様である．
    
    \item \texttt{mode}の2番目のビット(bit~1)が0であった場合は，$B$,~$A\leftarrow \min(B,A)$とする．
  \end{enumerate}
  \item 実際の前進入量$b$，後進入量$a$の計算．
  
  ルビ文字の突出量を$x$，
  親文字の文字数を$k+1$，親文字の前に入る空白量・間の空白量・後ろの空白量の比を$p:q:r$とする．
  このとき，\texttt{mode}のbit 2--4の値によって$b$,~$a$を次のように算出する：
\begin{description}[labelindent=\zw]
 \item[000] $b=\min(B, xp/(p+kq+r))$, \ $a=\min(A, xr/(p+kq+r))$
 \item[001] $b=\min(B, x)$, \ $a=\min(A, \max(x-b,0))$
 \item[010] $a=\min(A, x)$, \ $b=\min(B, \max(x-a,0))$
 \item[011] $M=\min(B,A)$とおく．もし$x\le 2M$ならば$b=a=x/2$．そうでなければ
\[
 b=\min\mleft(B, M + \frac{(x-2M)p}{p+kq+r}\mright),\quad 
 a=\min\mleft(A, M + \frac{(x-2M)r}{p+kq+r}\mright).
\]
 \item[100] $M=\min(B,A)$とおく．もし$x\le 2M$ならば$b=a=x/2$．そうでなければ
\[
 b=\min(B, x-M),\quad a=\min(A,x-M)\quad \mbox{（どちらかは必ず$M$となる）}.
\]
\end{description}

大雑把に言うと，最初の「000」は「組んだ後に進入量を決定」する方針，
それ以外は「進入量を先に決定し，その後で組む」方針である．
組み方の具体例を実際に示す．例示のため，平仮名にはルビが1字まで，「立」にはルビを
0.5字分までかけてよいことにしている．
\begin{description}[labelindent=\zw]
\item[000]{\setkeys[ltj]{ruby}{mode=1}%
\ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
は\ltjruby{美}{うつく}しい
  \quad は\ltjruby{聴衆}{ちようしゆう}と\quad
は\ltjruby{暁}{あかつき}立\quad
は\ltjruby{峠}{とうげ}立\quad
は\ltjruby{聴衆}{ちようしゆう}立\quad
は\ltjruby{聴衆}{ちようしゆう}達\par}
\item[001]{\setkeys[ltj]{ruby}{mode=5}%
\ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
は\ltjruby{美}{うつく}しい
  \quad は\ltjruby{聴衆}{ちようしゆう}と\quad
は\ltjruby{暁}{あかつき}立\quad
は\ltjruby{峠}{とうげ}立\quad
は\ltjruby{聴衆}{ちようしゆう}立\quad
は\ltjruby{聴衆}{ちようしゆう}達\par}
\item[010]{%
\setkeys[ltj]{ruby}{mode=9}%
\ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
は\ltjruby{美}{うつく}しい
  \quad は\ltjruby{聴衆}{ちようしゆう}と\quad
は\ltjruby{暁}{あかつき}立\quad
は\ltjruby{峠}{とうげ}立\quad
は\ltjruby{聴衆}{ちようしゆう}立\quad
は\ltjruby{聴衆}{ちようしゆう}達\par}
\item[011]{\setkeys[ltj]{ruby}{mode=13}%
\ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
は\ltjruby{美}{うつく}しい\quad
は\ltjruby{聴衆}{ちようしゆう}と\quad
は\ltjruby{暁}{あかつき}立\quad
は\ltjruby{峠}{とうげ}立\quad
は\ltjruby{聴衆}{ちようしゆう}立\quad
は\ltjruby{聴衆}{ちようしゆう}達\par}
\item[100]{\setkeys[ltj]{ruby}{mode=17}%
\ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
は\ltjruby{美}{うつく}しい\quad
は\ltjruby{聴衆}{ちようしゆう}と\quad
は\ltjruby{暁}{あかつき}立\quad
は\ltjruby{峠}{とうげ}立\quad
は\ltjruby{聴衆}{ちようしゆう}立\quad
は\ltjruby{聴衆}{ちようしゆう}達\par}
\end{description}
\end{enumerate}

\subsection{ノードの扱い}
\label{ssec:impl}
次の例で内部実装の大まかな方法を説明する．
\begin{LTXexample}[preset=\Large]
……を\ltjruby{流|暢}{りゆう|ちよう}に……
\end{LTXexample}

\begin{enumerate}
\item \verb|\ltjruby|コマンド自体は，一旦次のnode listを値とするwhatsit~$W$を作って，
現在の水平リストへと挿入する（必要ならば\verb|\leavevmode|も実行）：
\[
 \Node{whatsit $w$}{value: 2}\longrightarrow 
 \Node{hlist $s_1$}{「りゆう」}\longrightarrow
 \Node{hlist $p_1$}{「流」}\longrightarrow
 \Node{hlist $s_2$}{「ちよう」}\longrightarrow
 \Node{hlist $p_2$}{「暢」}
\]
ここで，最初の$w$の値2は，ルビが2つのパーツ「\ltjruby{流}{りゆう}」「\ltjruby{暢}{ちよう}」からなっていることを
表している．この値を$\mathit{cmp}$とおこう．
$s_i$達の中の文字は既にルビの大きさである．
\item \LuaTeX-jaの和文処理グルー挿入処理において，
このwhatsit~$W$はまとめて
「先頭が『流』，最後が『暢』であるようなhboxを \verb|\unhbox| で展開したもの」と扱われる．
言い換えれば，ルビ部分を無視した単なる「流暢」という和文文字の並びとして扱われる\footnote{「流」「暢」の間のグルーは既に入っている，と扱われる．}．
次のサンプルを参照
\begin{LTXexample}[preset=\Large]
\leavevmode\hbox{．}A\\
%↑xkanjiskip 
\ltjruby{．}{}A
%↑2分
\end{LTXexample}
\item 和文処理グルーの挿入が終わった後で，可動グループルビのためのノードの挿入に入る．
\begin{enumerate}
\item $W$の前後に$2\mathit{cmp}+1=5$個のノードが挿入され，$W$の周辺は次のようなノード列になる．
\begin{align*}
 (\text{other nodes})&\longrightarrow
 \Node{glue $g_0$}{}\longrightarrow \Node{whatsit~$W$}{元からある}\longrightarrow \Node{rule $r_1$}{}
\\&\longrightarrow
 \Node{glue $g_1$}{}\longrightarrow \Node{rule $r_2$}{}\longrightarrow 
 \Node{glue $g_2$}{}\longrightarrow (\text{other nodes})
\end{align*}

\item このようにノードを挿入する目的は，\TeX の行分割処理自体に影響を加えずに可動グループルビ
を実現させることにある．
\begin{gather*}
 (\text{other nodes})\longrightarrow
 \Node{glue $g_0$}{}\longrightarrow \Node{whatsit~$W$}{元からある}\longrightarrow \Node{rule $r_1$}{}\\
\noalign{\hrulefill 行の境目\hrulefill}
\Node{rule $r_2$}{}\longrightarrow 
 \Node{glue $g_2$}{}\longrightarrow (\text{other nodes})
\end{gather*}
のようになったとしたら，「\ltjruby{流}{りゆう}」「\ltjruby{暢}{ちよう}」の間で行分割が起きた，ということがわかり，
$g_i$,~$r_i$達のノードを適切に置き換えればよい（後で詳しく説明する）．

\begin{figure}\centering\small
\begin{tabular}{cllll}
\toprule
\multicolumn{1}{c}{\bf ノード}&\multicolumn{1}{c}{\bf 組み方}&\multicolumn{1}{c}{\bf サンプル}%
&\multicolumn{1}{c}{\bf 対応するノード並び}\\
\midrule
$n_1$&行末1グループ&
\Large
\fbox{を}{\color{blue!50!black}\gt\ltjruby[pre=1,mode=5,stretch=110]{流}{りゆう}}\vrule
&
$g_0\rightarrow W\rightarrow r_1$\\
$n_2$&行末2グループ&
\Large
\fbox{を}{\color{blue!50!black}\gt\ltjruby[pre=1,mode=1,stretch=110]{流|暢}{りゆう|ちよう}}\vrule
&
$g_0\rightarrow W\rightarrow r_1\rightarrow g_2 \rightarrow r_2$\\
$n_3$&行頭1グループ&
\Large
\vrule{\color{blue!50!black}\gt\ltjruby[post=1,mode=1,stretch=011]{暢}{ちよう}}\fbox{に}
&
$r_2\rightarrow g_2$\\
$n_4$&行頭2グループ&
\Large
\vrule{\color{blue!50!black}\gt\ltjruby[post=1,mode=1,stretch=011]{流|暢}{りゆう|ちよう}}\fbox{に}
&
$W\rightarrow r_1\rightarrow g_2 \rightarrow r_2\rightarrow g_2$\\
$n_5$&行中&
\Large
\fbox{を}{\color{blue!50!black}\gt\ltjruby[post=0.5,pre=0.5,mode=1]{流|暢}{りゆう|ちよう}}\fbox{に}
&
$g_0\rightarrow W\rightarrow r_1\rightarrow g_2 \rightarrow r_2\rightarrow g_2$\\

\bottomrule
\end{tabular}
\caption{ルビの組み方と対応するノード並び}
\label{fig:node}
\end{figure}

\item なお，$r_i$達の高さ・深さは組み上がった後のそれである．
$g_i$,~$r_i$達の幅は，図\nobreak\ref{fig:node}に示したような対応に沿って算出する．
例えばこの場合，行中形$n_5$に対して
\[
 g_0+r_1+g_2+r_2+g_2 = (3-0.25\times 2)\,\mathrm{zw}=2.5\,\mathrm{zw}
\]
という方程式が立つ（zwは親文字全角の幅，進入量込）．
$n_1$から$n_5$まで計5本の方程式が立つが，これらはGau\ss の消去法で解くことができて
$g_i$,~$r_i$達の幅が求まる．
\item また，ルビ処理を統括しているwhatsit~$W$の値も
\[
 \Node{whatsit $w$}{value: 2}\longrightarrow 
 \Node{vlist $n_1$}{末1}\longrightarrow
 \Node{vlist $n_2$}{末2}\longrightarrow
 \Node{vlist $n_3$}{頭1}\longrightarrow
 \Node{vlist $n_4$}{頭2}\longrightarrow
 \Node{vlist $n_5$}{中}
\]
に置き換えておく．

\end{enumerate}

\item \LuaTeX の行分割処理を普通に行う．
\item 行分割の結果に従って，$g_i$,~$r_i$達を適切に置換する．

例えば行分割の結果
\begin{gather*}
 (\text{other nodes})\longrightarrow
 \Node{glue $g_0$}{}\longrightarrow \Node{whatsit~$W$}{元からある}\longrightarrow \Node{rule $r_1$}{}
  \tag{行A}\\
\noalign{\hrulefill 行の境目\hrulefill}
\Node{rule $r_2$}{}\longrightarrow 
 \Node{glue $g_2$}{}\longrightarrow (\text{other nodes})\tag{行B}
\end{gather*}
のようになったとしよう．
\begin{enumerate}
\item 処理は段落の上の行から順番に行われる．行Aの処理がまわってきたとしよう．

\item 行Aの先頭から順番に眺めていく．すると「whatsit~$W$由来」のノード，$g_0$,~$W$,~$r_1$が見つかり，
行Aはここで終わっている．

まず，行Aのhboxの中身からwhatsit~$W$を消去（リストから取り除くだけで，$W$のメモリを解放するわけではない）する．
$g_0$,~($W$,)~$r_1$というノードの並びは，「行末1グループ」$n_1$に対応しているので，
$g_0$,~$r_1$を行Aから除去・メモリ解放し，代わりに$n_1$を行Aの中身に追加する．

\item 次に行Bの処理にうつる．行Aでルビの処理は完了していない（2グループのルビなのにまだ1グループしか使っていない）ので，
「whatsit~$W$由来」のノードがいくつか行B内に残っているはずである．

案の定，$r_2$,~$g_2$というノード列が見つかった．これは「行頭1グループ」$n_3$に対応しているので，
$r_2$,~$g_2$を行Bから除去・メモリ解放し，代わりに$n_3$を行Bの中身に挿入する．

\item これで2グループとも使い切ったことになるので，
隔離しておいた$W$を，（使われなかった$n_2$,~$n_4$,~$n_5$などと共に）メモリ解放する．結果として
次のようになった：
\begin{gather*}
 (\text{other nodes})\longrightarrow
 \Node{vlist $n_1$}{末1}\tag{行A}\\
\noalign{\hrulefill 行の境目\hrulefill}
\Node{vlist $n_3$}{頭1}\longrightarrow (\text{other nodes})\tag{行B}
\end{gather*}
\end{enumerate}
\end{enumerate}

\newpage
\section{いくつかの例}
\def\rubytest{\ruby{黄金橋}{ゴールデンゲートブリッジ}\relax}

\setbox0=\vbox{\hsize=22\zw%
ああああ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこ}
%\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)}
\fbox{\box0}

\setbox0=\vbox{\hsize=30\zw\noindent
\texttt{baseheight=0.88}での例\\
  ふぁいる\ruby[baseheight=0.88]{dvi}{ディーヴィーアイ}ファイル
  \ruby[baseheight=0.88]{oo}{ほーげーふーが}漢字\\
  ファイル\ruby[baseheight=0.88]{dvi}{ディーヴィーアイ}ふぁいる
  \ruby[baseheight=0.88]{oo}{ほーげーふーが}漢字\\
  ああ（\ruby{ほげ}{ふがふがふがふが}）」\ruby{ほげ}{ふがふがふがふが}「
  【\ruby{ほげ}{ふがふがふがふが}】\ruby{ほげ}{ふがふがふがふが}…
}
\fbox{\box0}

\def\rubytest{\ruby{国府津}{こうづ}\relax}
% グループルビ

\setbox0=\vbox{\hsize=18\zw%
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこ}
%\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)}
\fbox{\box0}

\def\rubytest{\ruby{●●|◆}{◆◆◆◆◆◆|●●●}\relax}
\setbox0=\vbox{\hsize=19\zw%
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこイ
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこウ
あ\rubytest いうえおかきくけこエ
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこ}
%\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)}
\fbox{\box0}

\def\rubytest{\ruby{●●|□}{◆◆◆|●●●}\relax}
\setbox0=\vbox{\hsize=19\zw%
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこイ
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこウ
あ\rubytest いうえおかきくけこエ
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこ
あ\rubytest いうえおかきくけこ}
%\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)}
\fbox{\box0}

\def\rubytest{\ruby{異|様}{い|よう}\relax}
\setbox0=\vbox{\hsize=19\zw%
あ\rubytest いうえくけ
あ\rubytest いうえくけこ
あ\rubytest いうえくけこ
あ\rubytest いうえくけこイ
あ\rubytest いうえおかきくけこ}
%\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)}
\fbox{\box0}

\def\rubytest{\ruby{□|■|□}{■■|□□□|■■}\relax}

\setbox0=\vbox{\hsize=23\zw%
あ\rubytest いうえおかきくけこうえおかきくけこ
あ\rubytest いうえおかきくけこうえおかきくけこ
あ\rubytest いう□おかきくけこうえおかきくけこ
あ\rubytest いう□おかきくけこうえおかきくけこ
あ\rubytest いう□おかきくけこうえおかきくけこ
あ\rubytest いうえおかきくけこ}
\fbox{\box0}

\begin{description}
\def\sample{又\ruby{承}{うけたまわ}る\quad \ruby{疎}{そ}\quad は\ruby{俄}{にわか}勉強
  \quad 後\ruby{俄}{にわか}勉強\quad は\ruby{暁}{あかつき}に
  は\ruby{俄}{にわか}に
  \quad \ruby{休|憩|中}{きゆう|けい|ちゆう}かつ\ruby{視|聴|中}{し|ちよう|ちゆう}}
\item[標準] \sample
\item[肩つき] {\ltjsetruby{kata}\sample}
\end{description}

\newpage
\begin{LTXexample}[pos=t]
{\ltjsetruby{stretch=101}% 親文字均等割り禁止
    \ruby{休|憩|中}{きゆう|けい|ちゆう}かつ\ruby{視|聴|中}{し|ちよう|ちゆう}%
}\quad
\textgt{\ruby{勉|強}{べん|きよう}と%
    \ruby[fontcmd=\mcfamily]{勉|強}{べん|きよう}}\quad% ルビは明朝体
\ruby{コギト・エルゴ・スム}{Cogito ergo sum}\quad   % 欧文空白は伸長しない
\ruby[size=1]{Cogito ergo sum}{コギト・エルゴ・スム}% 欧文空白は伸長しない
\end{LTXexample}


\typeout{AAAAAA}
\setbox0=\vbox{\hsize20\zw
  \ltjsetparameter{rubypreintrusion={`◆,1}}
  \ltjsetparameter{rubypostintrusion={`◆,1}}
  \def\TEST{\ruby{CD}{◆ンパクト・ディス◆}}
  %\ltjsetparameter{xkanjiskip=.25\zw}
  ◆◆◆\TEST ◆◆◆◆◆◆◆◆◆◆◆\TEST %
  ◆◆◆◆◆◆\kern1\zw ◆◆◆◆◆◆◆◆◆\kern0.5\zw ◆◆◆◆◆◆◆◆◆◆◆◆◆◆\TEST ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

  値とは\ruby{\texttt{;}}{セミコロン}で区切\\
  ◆\ruby{A}{◆}◆\\◆\ruby{A}{◆◆}◆\\◆\ruby{A}{◆◆◆}◆\\◆\ruby{A}{◆◆◆◆}◆\\%
  ◆\ruby{A}{◆◆◆◆◆}◆\\◆\ruby{A}{◆◆◆◆◆◆}◆\\◆A◆
  
  \makebox[10\zw][s]{値とは\ruby{\texttt{;}}{セミコロン}で区切}%

  \ltjruby{痛}{いたみ}（\ltjruby{病}{びやう}あ

  v0.53\ \ruby{コギト}{Cogito}
  \ruby{コイト}{Coito}
  \ruby{ノ}{no}
  \ruby{ト}{TO}
  \ruby{ヨ}{yo}
  \ruby{ぢ}{dji}
  \\
  \ruby[intergap=-1.5]{ノ}{no}
  \ruby[intergap=-1.5]{ト}{TO}
  \ruby[intergap=-1.5]{ヨ}{yo}
  \ruby[intergap=-1.5]{ぢ}{dji}
           
  v0.52\ \ruby[rubydepth=-1]{コギト}{Cogito}  % too high
  \ruby[rubydepth=-1]{コイト}{Coito}  % too low
  \ruby[rubydepth=-1]{ノ}{no}  % too low
  \ruby[rubydepth=-1]{ト}{TO}  % too low
  \ruby[rubydepth=-1]{ヨ}{yo}  % too high
  \ruby[rubydepth=-1]{ぢ}{dji}  % too high
  \\
  \ruby[intergap=-1.5,rubydepth=-1]{ノ}{no}  % too low
  \ruby[intergap=-1.5,rubydepth=-1]{ト}{TO}  % too low
  \ruby[intergap=-1.5,rubydepth=-1]{ヨ}{yo}  % too high
  \ruby[intergap=-1.5,rubydepth=-1]{ぢ}{dji}  % too high

}
\fbox{\box0}

\newpage
\section{『日本語組版処理の要件』20120403の例}

\newcommand*{\噂}{\CID{7642}}
\newcommand*{\倦}{\CID{7674}}
%================================== 横組
\paragraph{3.3.1節}\ 
\begin{LTXexample}[pos=t]
\obeylines
3.49 \ruby{君|子}{くん|し}は\ruby{和}{わ}して\ruby{同}{どう}ぜず
3.50 \ruby{人}{ひと}に\ruby{誨}{おし}えて\ruby{\倦}{う}まず
% モノルビ．面倒でも複数回の実行が必要
3.51 \ruby{鬼}{き}\ruby{門}{もん}の\ruby{方}{ほう}\ruby{角}{がく}を%
     \ruby{凝}{ぎよう}\ruby{視}{し}する
% 熟語ルビ
3.52 \ruby{鬼|門}{き|もん}の\ruby{方|角}{ほう|がく}を\ruby{凝|視}{ぎよう|し}する
3.53 \ruby{茅場町}{かやばちよう}\quad\ruby{茅|場}{かや|ば}\ruby{町}{ちよう}
% 熟字訓
3.54 \ruby{紫陽花}{あじさい}\quad\ruby{坩堝}{るつぼ}\quad\ruby{田舎}{いなか}
% グループルビ
3.55 \ruby{模型}{モデル}\quad\ruby{顧客}{クライアント}\quad%
     \ruby{境界面}{インターフエース}\quad\ruby{避難所}{アジール}
3.56 \ruby{編集者}{editor}\quad \ruby{editor}{エデイター}
\end{LTXexample}

\paragraph{3.3.3節}\ 
\begin{LTXexample}[pos=t]
\obeylines
3.58 に\ruby{幟}{のぼり}を\quad に\ruby[kata]{幟}{のぼり}を\quad%
     \ruby{韋}{い}\ruby{編}{へん}\ruby{三}{さん}\ruby{絶}{ぜつ}
% 三分ルビ．JY3/mc/mc は本文書のプリアンブルで独自に定義
3.59 に\ruby[fontcmd=\kanjifamily{mc}\kanjiseries{mc}]{幟}{のぼり}を
% ルビ文字を小さくする
3.60 {\Large%
  \ruby{韋}{い}\ruby{編}{へん}\ruby{三}{さん}\ruby{絶}{ぜつ}\quad% 比較用
  \ltjsetruby{size=0.375}% 0.5 -> 0.375
  \ruby{韋}{い}\ruby{編}{へん}\ruby{三}{さん}\ruby{絶}{ぜつ}}
\end{LTXexample}

\paragraph{3.3.4節}
3.61図（両側ルビ）は未サポートにより省略

\newpage
\paragraph{3.3.5節 モノルビ}\ 
\begin{LTXexample}[pos=t]
\obeylines
3.62 の\ruby{葯}{やく}に
3.63 版面の\ruby{地}{ち}に\quad 版面の\ruby[kata]{地}{ち}に
% 横組肩つきはしないが，現状では縦組未サポートだし，仕方ないね
3.65 の\ruby{砦}{とりで}に
{\ltjsetruby{kata}%
3.66上 の\ruby{旬}{しゆん}に\quad 後\ruby{旬}{しゆん}に
3.66下 の\ruby{旬}{しゆん}又\quad 後\ruby{旬}{しゆん}又}
\end{LTXexample}


\paragraph{3.3.6節 グループルビ}\ 
\begin{LTXexample}[pos=t]
\obeylines
3.67 は\ruby{冊子体}{コーデツクス}と
3.68 \ruby{模型}{モデル}\quad \ruby{利用許諾}{ライセンス}
% 両端を揃える流儀
3.69 {\ltjsetruby{stretchruby=010}%
     \ruby{模型}{モデル}\quad \ruby{利用許諾}{ライセンス}}
% ルビが極端に短い場合
3.70 \ruby{なげきの聖母像}{ピエタ}\quad% ルビ全角まで許容
     \ruby[maxmargin=0.75]{なげきの聖母像}{ピエタ}\\% ルビ全角1.5倍まで
% ルビが長い場合
3.71 \ruby{顧客}{クライアント}\quad \ruby{境界面}{インターフエース}
3.72 {\ltjsetruby{stretch=010, stretchbol=010, stretcheol=010}% はみ出さない流儀
     \ruby{顧客}{クライアント}\quad \ruby{境界面}{インターフエース}}
\end{LTXexample} 

\newpage
\paragraph{3.3.7節 熟語ルビ}\ 
\begin{LTXexample}[pos=t]
\obeylines
3.73 \ruby{杞|憂}{き|ゆう}\quad \ruby{畏|怖}{い|ふ}\quad%
     \ruby[kata]{杞|憂}{き|ゆう}\quad \ruby[kata]{畏|怖}{い|ふ}
3.74 の\ruby{流|儀}{りゆう|ぎ}を\quad   の\ruby{無|常}{む|じよう}を\quad%
     の\ruby{成|就}{じよう|じゆ}を\quad の\ruby{紋|章}{もん|しよう}を\quad%
     の\ruby{象|徴}{しよう|ちよう}を
% 熟語の構成を考慮した方法は現行ではできない．
% 行分割はできるのだが，「他の漢字にルビ全角までかかって良い」は難しい．
3.75 {\ltjsetruby{kata}%
     の\ruby{流|儀}{りゆう|ぎ}を\quad   の\ruby{無|常}{む|じよう}を\quad%
     の\ruby{成|就}{じよう|じゆ}を\quad の\ruby{紋|章}{もん|しよう}を\quad%
     の\ruby{象|徴}{しよう|ちよう}を}
% モノルビ配置．望ましくない
3.76× の\ruby{流}{りゆう}\ruby{儀}{ぎ}を\quad の\ruby{無}{む}\ruby{常}{じよう}を\quad%

3.77  {\ltjsetruby{stretchbol=121, stretcheol=121}% 行頭・行末揃えず
     \hbox{\vrule\vbox{\hsize=10\zw\noindent\kern.75\zw
       あああああああの\ruby{流|儀}{りゆう|ぎ}がある．}\vrule}\quad%
     \hbox{\vrule\vbox{\hsize=5\zw ……等の\ruby{無|常}{む|じよう}を}\vrule}}
\end{LTXexample} 

\paragraph{3.3.8節 ルビはみ出し}\ 
\begin{LTXexample}[pos=t]
\obeylines
3.78 \ruby{人}{ひと}は\ruby{死}{し}して\ruby{名}{な}を\ruby{残}{のこ}す
3.79 漢字の部首には\ruby{偏}{へん}・\ruby{冠}{かんむり}・\ruby{脚}{きやく}・%
     \ruby{旁}{つくり}がある
3.79 漢字の部首には\ruby{偏}{へん}，\ruby{冠}{かんむり}，\ruby{脚}{きやく}，%
     \ruby{旁}{つくり}がある
\end{LTXexample}
\begin{LTXexample}[pos=t]
\obeylines
3.79 この\ruby{\噂}{うわさ}の好きな人は\ruby{懐}{ふところ}ぐあいもよく、\ruby{檜}{ひのき}を
3.80 漢字の部首には「\ruby{偏}{へん}」「\ruby{冠}{かんむり}」「\ruby{脚}{きやく}」%
「\ruby{旁}{つくり}」がある
3.80 この\ruby{\噂}{うわさ}好きな人は\ruby{懐}{ふところ}具合もよく、\ruby{檜}{ひのき}材を
3.81× に\ruby{暁}{あかつき}の\kern-1\zw の\ruby{趣}{おもむき}を（良くない例）
3.82 に\ruby{暁}{あかつき}の\ruby{趣}{おもむき}を

% 漢字・ひらがな・カタカナにルビを2分まで掛けても良い流儀
{%
  \catcode`\<12%
  \makeatletter\count@="3040\loop\relax\ifnum \count@<"30FF%
  \ltjsetparameter{rubypreintrusion={\the\count@,0.5}, %
    rubypostintrusion={\the\count@,0.5}}%
  \advance\count@1 \repeat
  \ltjsetparameter{rubypostintrusion={`好,0.5}}
  \ltjsetparameter{rubypostintrusion={`具,0.5}}
  \ltjsetparameter{rubypostintrusion={`材,0.5}}
3.83 この\ruby{\噂}{うわさ}の好きな人は\ruby{懐}{ふところ}ぐあいもよく、\ruby{檜}{ひのき}を
3.83 この\ruby{\噂}{うわさ}好きな人は\ruby{懐}{ふところ}具合もよく、\ruby{檜}{ひのき}材を
}
% 平仮名にもルビを掛けない流儀
{\catcode`\<12%
  \makeatletter\count@="3040\loop\relax\ifnum \count@<"30A0%
  \ltjsetparameter{rubypreintrusion={\the\count@,0}, %
    rubypostintrusion={\the\count@,0}}%
  \advance\count@1 \repeat
3.84 この\ruby{\噂}{うわさ}の好きな人は\ruby{懐}{ふところ}ぐあいもよく、\ruby{檜}{ひのき}を
3.84 この\ruby{\噂}{うわさ}好きな人は\ruby{懐}{ふところ}具合もよく、\ruby{檜}{ひのき}材を
}
\end{LTXexample}
\begin{LTXexample}[pos=t]
\obeylines
3.85\ {\ltjsetruby{stretchbol=121, stretcheol=121}% 行頭・行末揃えず
\hbox{\vrule\vbox{\hsize=15\zw
　\hskip9.5\zw……の\ruby{徑}{こみち}を……%
\hskip9\zw……の\ruby{徑}{こみち}を……}\vrule}}
3.86\ \hbox{\vrule\vbox{\hsize=15\zw
　\hskip10\zw……の\ruby{徑}{こみち}を……%
\hskip9\zw……の\ruby{徑}{こみち}を……}\vrule}
3.87\  \hbox{\vrule\vbox{\hsize=15\zw
　\hskip8\zw……共\ruby{飾り}{アクセサリー}等……%
\hskip9\zw……共\ruby{飾り}{アクセサリー}等……}\vrule}
\end{LTXexample}


\paragraph{圏点の例（常用漢字表前書きより）}
この表は，法令，公⽤⽂書，新聞，雑誌，放送など，⼀般の社会⽣活におい%
て\kenten[kenten=﹅]{現代の国語を書き表す}場合の\kenten{漢字使⽤の⽬安を⽰す}ものである。

\subparagraph{「﹅」の大きさを親文字の0.33倍にした例}
この表は，法令，公⽤⽂書，新聞，雑誌，放送など，⼀般の社会⽣活におい%
て\kenten[size=0.33, kenten=﹅]{現代の国語を書き表す}場合の\kenten{漢字使⽤の⽬安を⽰す}ものである。
\end{document}
