-%#! luajitlatex
+%#! lualatex
%%% a test of ruby.
-\documentclass[a4paper,10pt]{ltjsarticle}
-\usepackage{luatexja-otf,amsmath}
+\documentclass[a4paper,10ptj]{ltjsarticle}
+\usepackage[rgb]{xcolor}
+\usepackage{enumitem,mleftright}
+\usepackage{luatexja-otf,amsmath,bxghost}
+\usepackage[no-math]{fontspec}
\usepackage[match]{luatexja-fontspec}
-\usepackage[kozuka-pr6n]{luatexja-preset}\normalsize
+\usepackage[haranoaji]{luatexja-preset}\normalsize
+\setmonojfont{HaranoAjiGothic-Regular.otf}
+\usepackage{unicode-math}
+\setmathfont{Latin Modern Math}
+
\def\emph#1{\textbf{\textgt{#1}}}
\def\headfont{\normalfont\bfseries\gtfamily}
-\setmonojfont{KozGoPr6N-Regular.otf}
-
-\usepackage[textwidth=45\zw, lines=45, footskip=6mm]{geometry}
+\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
}
\def\Node#1#2{\,\vcenter{\hbox{\fboxsep=1pt\fbox{\vbox{\small\halign{\hfil##\hfil\cr
- #1\mathstrut\cr\noalign{\hrule height.4pt}\strut#2\cr}}}}\,}}
+ #1\mathstrut\cr\noalign{\smallskip\hrule height.4pt\smallskip}\strut\<#2\cr}}}}}\,}
\def\LuaTeX{Lua\TeX}
% 三分ルビ用
\DeclareFontShape{JY3}{mc}{mc}{n}{<-> [0.92487]
- KozMinPr6N-Regular:extend=0.67;jfm=ujisc33}{}
+ HaranoAjiMincho-Regular:extend=0.67;jfm=ujisc33}{}
+
+\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\<}}}\ }
-\title{\texttt{luatexja-ruby.sty}}
\begin{document}
+
\catcode`\<=13
-\def<#1>{{\normalfont\rm\itshape$\langle$#1\/$\rangle$}}
+\def<#1>{{\rmfamily\mdseries\itshape$\langle$#1\/$\rangle$}}
%\fontsize{13.19873}{15}\selectfont%
\maketitle
\begin{abstract}
-\texttt{luatexja-ruby.sty} は,\LuaTeX-jaの機能を利用してルビの組版処理を行う追加パッケージである.
+\textsf{luatexja-ruby}パッケージは,\LuaTeX-jaの機能を利用してルビの組版処理を行う追加パッケージである.
\LuaTeX, \LuaTeX-jaの内部処理に割り込むことにより,熟語ルビ中の行分割や,
行頭形・行中形・行末形の自動検出,また進入許容量の自動設定などを可能とした.
+
+v0.3より前とは親文字の高さの扱いが変わっている(\texttt{baseheight}キーを参照せよ)ほか,
+\Param{rubypreintrusion}, \Param{rubypostintrusion}パラメータの初期値が変わっているので注意すること.
\end{abstract}
\tableofcontents
\subsection{\ltjruby{用|語}{よう|ご}}
「進入(intrusion)」「突出(protrusion)」という用語は,
-\href{http://zrbabbler.sp.land.to/pxrubrica.html}{\texttt{pxrubrica}\ パッケージ}%
+\href{http://zrbabbler.sp.land.to/pxrubrica.html}{\textsf{pxrubrica}パッケージ}%
での用法に準ずる.
-\begin{quotation}
-進入あり:と\ltjruby{暁}{あかつき}の
-
-進入なし:{\setkeys[ltj]{ruby}{mode=0}と\ltjruby{暁}{あかつき}の}
+\begin{quote}
+ 進入あり:と\ltjruby{暁}{あかつき}の\\
+ 進入なし:と\ltjruby[mode=0]{暁}{あかつき}の\\
+ 突出あり:\ltjruby[stretch={1}{2}{1}]{聴衆}{ちようしゆう}\\
+ 突出なし:\ltjruby[stretch={0}{2}{0}]{聴衆}{ちようしゆう}
+\end{quote}
-突出あり:{\setkeys[ltj]{ruby}{stretch={1}{2}{1}}\ltjruby{聴衆}{ちようしゆう}}
+なお,本パッケージでは親文字と直前・直後の文字の間に0でない和文処理グルー
+\footnote{JFMで指定されたグルーや,標準の和文間空白(\Param{kanjiskip}),標準の和欧文間空白(\Param{xkanjiskip}).}%
+がくることも考慮しているため,「\emph{前後の文字への}\underline{進入(許容)量}」と「進入(許容)量」とは異なる可能性がある.
+この文書では次のように称する:
+\begin{description}
+ \item[\underline{文字進入量}] 前後の文字へルビ文字が実際にかかる長さ.常に下線を引くことにする.
+ \item[進入量] 前後の文字,およびそれとルビの間の和文処理グルーにかかる長さ
+\end{description}
+多くの場合,和文処理グルーは0以上の長さのため,進入量は\underline{文字進入量}以上である.
-突出なし:{\setkeys[ltj]{ruby}{stretch={0}{2}{0}}\ltjruby{聴衆}{ちようしゆう}}
-\end{quotation}
+例えば次の例では,直前の文字「来」への\underline{前文字進入量}は0であるが,
+前進入量は(和欧文間空白にかかる分まで含めるので)正である.
+\begin{quote}
+ \Large
+ 本来\ltjruby{foohoge}{\vrule ほげほげふがふが\vrule}においては……\\
+ 本来foohogeにおいては……
+\end{quote}
\subsection{\ruby{命|令}{めい|れい}}
-\paragraph{\tt\textbackslash ltjruby}
+\paragraph{\cs{ltjruby}}
ルビ出力用命令の本体.\verb+\ruby+ という別名を定義している.
\begin{quote}
-\tt \textbackslash ltjruby[<option>]\{親|文|字\}\{おや|も|じ\}
+\ttfamily \textbackslash ltjruby[<option>]\{親|文|字\}\{おや|も|じ\}
\end{quote}
-のように使用する.
+のように親文字→ルビの順序で指定する.
第2・第3引数内の「\verb+|+」はグループの区切りを表す.詳細は\ref{ssec:grp}\nobreak 小節を参照.
-<option>には以下の内容をkey-valueリストで指定可能である:
+\medskip
+<option>には以下の内容をkey-valueリストで指定可能である.
+<real>は10進の実数値を表す.<bool>は真偽値\texttt{true}(真)か\texttt{false}(偽)であり,
+値を省略したときには\texttt{true}の意味になる.
+
\begin{description}
-\def\makelabel#1{\tt#1}
-\item[pre=<real>] 前進入許容量をルビ全角単位で指定.
+\def\makelabel#1{\ttfamily\bfseries #1}
+\item[pre=<real>] \underline{前文字進入許容量}をルビ全角単位で指定.
負の長さを指定した場合は,ルビの状況や直前の文字に応じた自動指定を意味する.
既定値は負(つまり,自動指定).
-\item[post=<real>] 同様に,後進入許容量を指定する.既定値は負(自動指定).
+\item[post=<real>] 同様に,\underline{後文字進入許容量}を指定する.既定値は負(自動指定).
\item[mode] 進入処理のモードを表すbit vector.下位2\,bitは,\texttt{pre}や
\texttt{post}が負である場合にしか効力を発揮しない.既定値は$(0001)_2 = 1$.
\begin{description}
- \item[bit 0] 進入を無効にするならば0,有効にするならば1.
+ \item[bit 0] 前後の\underline{文字への進入}を無効にするならば0,有効にするならば1.
\item[bit 1] 前進入許容量$B$と後進入許容量$A$が異なった場合,
-そのまま処理する場合は0,小さい方に揃えるならば1.
- \item[bit 2--3] ルビ文字の突出量$x$から実際の前進入量$b$,後進入量$a$の計算方法を指定する.
-親文字の文字数が$k+1$,親文字の前に入る空白量・間の空白量・後ろの空白量の比が$p:q:r$のとき,
-\begin{description}
- \item[00] $b=\min\{B, xp/[p+kq+r]\}$, \ $a=\min\{A, xr/[p+kq+r]\}$
- \item[01] $b=\min(B, x)$, \ $a=\min[A, \max(x-b,0)]$
- \item[10] $a=\min(A, x)$, \ $b=\min[B, \max(x-a,0)]$
- \item[11] $M=\min(B,A)$とおく.もし$x\le 2M$ならば$b=a=x/2$.そうでなければ
-\[
- b=\min\left(B, M + \frac{(x-2M)p}{p+kp+r}\right),\qquad
- a=\min\left(A, M + \frac{(x-2M)r}{p+kp+r}\right)
-\]
-\end{description}
-
-組み方の具体例を実際に示す.例示のため,平仮名にはルビが1字まで,「立」にはルビを
-0.5字分までかけてよいことにしている.
-\begin{description}
-\item[00]{\setkeys[ltj]{ruby}{mode=1}%
-\ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
-は\ltjruby{美}{うつく}しい
- \quad は\ltjruby{聴衆}{ちようしゆう}と\quad
-は\ltjruby{暁}{あかつき}立\quad
-は\ltjruby{聴衆}{ちようしゆう}立\par}
-\item[01]{\setkeys[ltj]{ruby}{mode=5}%
-\ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
-は\ltjruby{美}{うつく}しい
- \quad は\ltjruby{聴衆}{ちようしゆう}と\quad
-は\ltjruby{暁}{あかつき}立\quad
-は\ltjruby{聴衆}{ちようしゆう}立\par}
-\item[10]{\setkeys[ltj]{ruby}{mode=9}%
-\ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
-は\ltjruby{美}{うつく}しい
- \quad は\ltjruby{聴衆}{ちようしゆう}と\quad
-は\ltjruby{暁}{あかつき}立\quad
-は\ltjruby{聴衆}{ちようしゆう}立\par}
-\item[11]{\setkeys[ltj]{ruby}{mode=13}%
-\ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
-は\ltjruby{美}{うつく}しい\quad
-は\ltjruby{聴衆}{ちようしゆう}と\quad
-は\ltjruby{暁}{あかつき}立\quad
-は\ltjruby{聴衆}{ちようしゆう}立\par}
-\end{description}
-
+ そのまま処理する場合は0,小さい方に揃えるならば1.
+ \item[bit 2--3] ルビ文字の突出量から実際の前・後進入量の計算方法を指定する.
+ 詳しい計算方法については\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の自然数で指定する.
\item[後突出禁止] \verb+{1}{1}{0}+
\end{description}
-\item[stretchbol=\{<left>\}\{<middle>\}\{<right>\}] è¡\8cé å½¢ã\80\9c.
+\item[stretchbol=\{<left>\}\{<middle>\}\{<right>\}] è¡\8cé å½¢ã\81«å¯¾ã\81\99ã\82\8b\texttt{stretch}ã\81¨å\90\8cæ§\98ã\81®æ\8c\87å®\9a.
既定値は\ \verb+{0}{1}{1}+ である.
-\item[stretcheol=\{<left>\}\{<middle>\}\{<right>\}] è¡\8cæ\9c«å½¢ã\80\9c.
+\item[stretcheol=\{<left>\}\{<middle>\}\{<right>\}] è¡\8cæ\9c«å½¢ã\81«å¯¾ã\81\99ã\82\8b\texttt{stretch}ã\81¨å\90\8cæ§\98ã\81®æ\8c\87å®\9a.
既定値は\ \verb+{1}{1}{0}+ である.
\item[maxmargin=<real>] 親文字の方がルビより長い時に,ルビの先頭と親文字の先頭,及び
\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}を同時に指定したことと同義.
+\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[kenten=<command>]各文字につく圏点の出力命令を指定する.既定値は「\verb+\ltjalchar`•+」
-であり,\texttt{U+2022} (Bullet)を\textbf{ALchar}として出力することを指定している.
+\item[kenten=<command>]各文字につく圏点の出力命令を指定する.
+ 既定値は「\verb+\textbullet+」である.
\item[fontcmd=<command>]ルビ用のフォント切り替え命令を指定する.
このキーの内容が実行された後に\ \verb+\fontsize...\selectfont+\ が実行されるので,
このキーの指定では最後に\ \verb+\selectfont+ を加える必要はない.
この \texttt{fontcmd} キーの内容は多くの回数実行される.
-例えば,\texttt{luatexja-fontspec}パッケージを用いてOpenTypeフォントを用いる場合,
+例えば,\textsf{luatexja-fontspec}パッケージを用いてOpenTypeフォントを用いる場合,
\begin{lstlisting}
fontcmd=\addjfontfeatures{Style=Ruby}
\end{lstlisting}
\medskip
次の2つは,以上で説明した複数のオプションを一度に設定するためのものである.
-普通はこの2つのうちいずれかを設定するだけで足りるだろう.
+普通はこの2\nobreak つのうちいずれかを設定するだけで足りるだろう.
\begin{description}
-\def\makelabel#1{\tt#1}
+\def\makelabel#1{\ttfamily\bfseries #1}
\item[naka] 以下のオプションを同時に設定する.主に中付きルビを組むときに用いる.
\begin{verbatim}
mode=1, stretch={1}{2}{1}, stretchruby={1}{2}{1}
\end{verbatim}
\end{description}
-\paragraph{\tt\textbackslash ltjsetruby\{<option>\}}
-<option>の既定値を指定する.\texttt{luatexja-ruby} 読み込み時の値は
+\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=\ltjalchar`•, fontcmd=\relax
+ kenten=\textbullet, fontcmd=\relax, ybaseheight=0.88, tbaseheight=0.5,
+ intrude_jfmgk, intrude_kanjiskip, intrude_xkanjiskip
\end{verbatim}
-\paragraph{\texttt{\textbackslash ltjsetparamater} に追加されるキー}
+\paragraph{\cs{ltjsetparamater} に追加されるキー}
\begin{description}
-\item[\textsf{\mdseries rubypreintrusion}\tt =\{<chr\_code>, <pre\_int>\}]
-文字<chr\_code> に,その\textbf{直後}のルビによって掛けられるルビ文字列の最大長をルビ全角単位で指定.
-\item[\textsf{\mdseries rubypostintrusion}\tt =\{<chr\_code>, <post\_int>\}]
-文字<chr\_code> に,その\textbf{直前}のルビによって掛けられるルビ文字列の最大長をルビ全角単位で指定.
+\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}
-既定値は,\textsf{rubypreintrusion},~\textsf{rubypostintrusion}とも
-以下の文字に対しては1,その他の文字については0である:
+以下の文字は\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}
- 平仮名(\texttt{U+3040}--\texttt{U+309F}),カギ括弧「」,読点「,」「、」,中黒「・」
+ 閉じ括弧類
+ \@for\@tmp:=`\’,`\”,`\〉,`\》,`\」,`\』,`\】,`\〕,`\〗,`\〙,`\〟,`\),`\],`\},`\⦆ \do{\mybox{\@tmp}}\unskip,
+ 句読点類\@for\@tmp:=`\、,`\,,`\。,`\. \do{\mybox{\@tmp}}
\end{quote}
-また,ここでは「文字コード$-1$の文字」は,「段落開始の \verb+\parindent+」を表す%
-\footnote{通常の\LuaTeX-jaにおける指定では文中数式境界を表していることに注意.}.
-この「文字」に対する\textsf{rubypreintrusion}の値も1である.
+\makeatother
+
+以上で記述されていない\Param{rubypreintrusion},~\Param{rubypostintrusion}の初期値はすべて0である.
-\paragraph{\texttt{\textbackslash ltjkenten}}
+
+\paragraph{\cs{ltjkenten}}
圏点を出力する命令で,\verb+\kenten+ という別名を定義している.
\begin{quote}
- \tt \textbackslash ltjkenten[<option>]\{親文字\}
+ \ttfamily\cs{ltjkenten}[<option>]\{親文字\}
\end{quote}
のように使用する.複数文字に圏点をつける場合でも,\verb+\ltjruby+ のように「\texttt{|}」を使って
-文字を区切る\textbf{必要はない}ことに注意してほしい.
+文字を区切る\textbf{必要はない}(\verb+\kenten+内では「\texttt{|}」は特別な意味を持たない)
+ことに注意してほしい.
-圏点として出力される文字は \texttt{kenten} キーによって指定し,
-圏点自身の大きさは(ルビと同様に)\texttt{size} キーで指定する.
+圏点として出力される文字は\texttt{kenten}キーによって指定し,
+圏点自身の大きさは(ルビと同様に)\texttt{size}キーで指定する.
\subsection{グループの\ruby{指|定}{し|てい}}
\label{ssec:grp}
\begin{quote}
-\tt \textbackslash ltjruby[<option>]\{親|文|字\}\{おや|も|じ\}
+\ttfamily\cs{ltjruby}[<option>]\{親|文|字\}\{おや|も|じ\}
\end{quote}
のように,\verb+\ltjruby+\ の第2・第3引数内の「\verb+|+」はグループの区切りを表す.
グループの数は両者で一致しなければならず,
\ltjruby{普}{ふ}\ltjruby{通}{つう}\ltjruby{車}{しや}
\end{verbatim}
-\newpage
複数グループかつ上記の条件を満たさない場合は,
所謂「可動グループルビ」であり,ルビの前後や各グループの切れ目で行分割が可能となる.
例えば
面倒でも手動で \texttt{pre}, \texttt{post} などを使って頑張って欲しい.
\item 実装方法の都合により,ルビの直前・直後・途中で2箇所以上の改行が起きる場合,例えば
\begin{center}
- \begin{tabular}{lll}
- \toprule
\Large …の\ltjruby[stretch=110]{表}{ひよう}
- \vrule\ltjruby[stretch=010]{現|力}{げん|りよく}\vrule&
+ \vrule\ltjruby[stretch=010]{現|力}{げん|りよく}\vrule\qquad
\Large \vrule\ltjruby[stretch=010]{表|現}{ひよう|げん}
- \vrule\ltjruby[stretch=011]{力}{りよく}は…&
-\Large \vrule\ltjruby[stretch=010]{表|現|力}{ひよう|げん|りよく}\vrule\\
-\bottomrule
- \end{tabular}
+ \vrule\ltjruby[stretch=011]{力}{りよく}は…\qquad
+\Large \vrule\ltjruby[stretch=010]{表|現|力}{ひよう|げん|りよく}\vrule
+
\end{center}
などの組み方は\emph{想定していない}.
+エラーが発生して止まることもあるし,エラーが発生しなくても正しく組まれない.
\end{itemize}
-\newpage
\section{\ruby{注|意|点}{ちゆう|い|てん}}
-\begin{description}
-\item[ルビ文字のはみ出し]
-「日本語組版処理の要件」の図3.82のように,
-ルビ文字のはみ出しが繋がらないようにする処理について述べる.
+\paragraph{前後からのルビ文字のはみ出し1}
+「日本語組版処理の要件」の図117\footnote{2020-08-11版での番号.2012-04-03版では図3.82.}のように,
+前後からのルビ文字のはみ出しが繋がらないようにする処理が組み込まれている.
例えば,
\begin{LTXexample}[preset=\Large,width=0.3\textwidth]
\end{LTXexample}
において,1行目右側の「\ltjruby{陵}{みささぎ}」のルビが前の「と」にかかる量は次のように決まる:
\begin{enumerate}
-\item 1回目の実行では,行分割前に「\ltjruby{陵}{りよう}」の後側進入量は前もって知ることはでき
- ã\81ªã\81\84ï¼\8eã\81ªã\81®ã\81§ï¼\8cã\80\8c\ltjruby{é\99µ}{ã\82\8aã\82\88ã\81\86}ã\80\8dã\81¯è¡\8cä¸å½¢ã\81§çµ\84ã\81¾ã\82\8cã\82\8bã\82\82ã\81®ã\81¨ã\81\97ã\81¦
-「\ltjruby{陵}{みささぎ}」前側進入許容量は
+\item 1回目の実行では,行分割前に「\ltjruby{陵}{りよう}」の\underline{後文字進入量}は前もって知ることはでき
+ ã\81ªã\81\84ï¼\8eã\81\9dã\81®ã\81\9fã\82\81ï¼\8cã\80\8c\ltjruby{é\99µ}{ã\82\8aã\82\88ã\81\86}ã\80\8dã\81¯è¡\8cä¸å½¢ã\81§çµ\84ã\81¾ã\82\8cã\82\8bã\82\82ã\81®ã\81¨æ\83³å®\9aã\81\97ï¼\8c
+「\ltjruby{陵}{みささぎ}」の前文字進入許容量は
\[
\underbrace{0.5\,\mathrm{zw}}_{\text{元々の許容量}}
--\underbrace{0.25\,\mathrm{zw}}_{\text{前のルビの後側進入量(行中形)}}=0.25\,\mathrm{zw}
+-\underbrace{0.25\,\mathrm{zw}}_{\text{前のルビの\underline{後文字進入量}(行中形)}}=0.25\,\mathrm{zw}
\]
-となる.行分割後,「\ltjruby{陵}{りよう}」の実際の後側進入量は
-auxファイルに記述される.
-\item 2回目以降の実行では,auxファイルに保存された「\ltjruby{陵}{りよう}」の後側進入量
-を用いて,「\ltjruby{陵}{みささぎ}」前側進入許容量を次のように計算する:
+となる.行分割後,「\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{前のルビの後側進入量 (from aux)}}=0.25\,\mathrm{zw}.
+-\underbrace{0.25\,\mathrm{zw}}_{\text{前のルビの\underline{後文字進入量}(from \texttt{.ltjruby})}}=0.25\,\mathrm{zw}.
\]
\end{enumerate}
-auxファイルに保存する際,各 \verb+\ltjruby+ 命令の呼び出しを識別するキーが必要になるが,
+
+<jobname>\texttt{.ltjruby}ファイルに保存する際,各 \verb+\ltjruby+ 命令の呼び出しを識別するキーが必要になるが,
そのキーとしては単純に「何個目の \verb+\ltjruby+ 命令か」である.
なお,以上の処理は,1行目と2行目を比較すれば分かるように,
-「\ltjruby{陵}{みささぎ}」の\emph{前進入許容量指定(\texttt{pre})が自動}になっている場合のみ
+「\ltjruby{陵}{みささぎ}」の\emph{\underline{前文字進入許容量}指定(\texttt{pre})が自動}になっている場合のみ
実施される.
-\item[段落末尾のルビ]
+
+\paragraph{前後からのルビ文字のはみ出し2}
+また,本パッケージのv0.**以降では,「日本語組版処理の要件」にある
+\begin{quote}
+ 後ろにくる終わり括弧類,句点類若しくは読点類,又は前にくる始め括弧類には,
+ 最大でルビ文字サイズの全角までルビ文字を掛けてもよい.
+ この場合,後ろにくる終わり括弧類,句点類若しくは読点類の後ろの空き量,
+ 又は前にくる始め括弧類の前の空き量に掛けてはならない.
+\end{quote}
+という処理も組み込まれており,<jobname>\texttt{.ltjruby}に「前後の和文処理グルーに正の量だけ進入したか」という情報を
+保存することによって実装されている.
+
+\paragraph{段落末尾のルビ}
段落がルビで終わった場合,そのルビが行末形で組まれることはない.
これは,段落の「本当の」末尾には \verb+\penalty10000\parfillskip+ があるためで,
-ルビ処理用に作った最後のグルー(\ref{sec:impl}\nobreak 節の説明では$g_2$)が消去されないことによる.
+ルビ処理用に作った最後のグルー(\ref{ssec:impl}\nobreak 小節の説明では$g_2$)が消去されないことによる.
\verb+\parfillskip+ の長さ(や,場合によっては \verb+\rightskip+)を実測し,
それによって処理を変えるのも可能だが,そのようなことはしなかった.
段落がルビで終わることは普通ない(最低でも句点が続くだろう)と思うからである.
-
-
-\item[段落先頭のルビ]
+\paragraph{段落先頭のルビ}
同様に,段落先頭のルビは行頭形にはならない.
-\texttt{pre}が負(つまり,自動指定)のとき,段落最初の \verb+\parindent+ 部分への
-進入は可能である.\verb+\parindent+ 部分への進入許容量は
-「文字$-1$」に対する\textsf{rubypreintrusion}(既定値は1,ルビ全角単位)と
+\texttt{pre}が負(つまり,自動指定)のとき,段落最初の \verb+\parindent+ 分への
+進入は可能である.ここ\verb+\parindent+ 分のインデントへの\underline{進入許容量}は
+「文字$-1$」に対する\Param{rubypreintrusion}(既定値は1,ルビ全角単位)と
\ \verb+\parindent+ の長さのうち小さい方である.
\begin{LTXexample}[preset=\Large,width=0.4\textwidth]
\parindent1\zw\noindent 012345\par
\parindent0.25\zw\ltjruby{陵}{みささぎ}は……
\end{LTXexample}
+\paragraph{和文処理グルーの伸縮}
+現バージョンでは,進入量調整に和文処理グルーを考慮させる,
+\begin{quote}
+\texttt{intrude\_jfmgk}, \texttt{intrude\_kanjiskip}, \texttt{intrude\_xkanjiskip}キー
+\end{quote}
+の値が\texttt{true}(真)で
+あった状況でも,考慮されるのは\emph{自然長の値のみ}である.そのため,行の調整処理が発生した場合は
+意図しない結果となる.
-\end{description}
+例えば,標準設定での中黒「・」の直後のルビからの中黒への進入許容量は
+\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{実|装}{じつ|そう}について}
-\label{sec:impl}
-次の例で実装の大まかな方法を説明する.
+\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,~3の値によって$b$,~$a$を次のように算出する:
+\begin{description}[labelindent=\zw]
+ \item[00] $b=\min(B, xp/(p+kq+r))$, \ $a=\min(A, xr/(p+kq+r))$
+ \item[01] $b=\min(B, x)$, \ $a=\min(A, \max(x-b,0))$
+ \item[10] $a=\min(A, x)$, \ $b=\min(B, \max(x-a,0))$
+ \item[11] $M=\min(B,A)$とおく.もし$x\le 2M$ならば$b=a=x/2$.そうでなければ
+\[
+ b=\min\mleft(B, M + \frac{(x-2M)p}{p+kq+r}\mright),\qquad
+ a=\min\mleft(A, M + \frac{(x-2M)r}{p+kq+r}\mright).
+\]
+\end{description}
+
+組み方の具体例を実際に示す.例示のため,平仮名にはルビが1字まで,「立」にはルビを
+0.5字分までかけてよいことにしている.
+\begin{description}[labelindent=\zw]
+\item[00]{\setkeys[ltj]{ruby}{mode=1}%
+\ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
+は\ltjruby{美}{うつく}しい
+ \quad は\ltjruby{聴衆}{ちようしゆう}と\quad
+は\ltjruby{暁}{あかつき}立\quad
+は\ltjruby{峠}{とうげ}立\quad
+は\ltjruby{聴衆}{ちようしゆう}立\par}
+\item[01]{\setkeys[ltj]{ruby}{mode=5}%
+\ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
+は\ltjruby{美}{うつく}しい
+ \quad は\ltjruby{聴衆}{ちようしゆう}と\quad
+は\ltjruby{暁}{あかつき}立\quad
+は\ltjruby{峠}{とうげ}立\quad
+は\ltjruby{聴衆}{ちようしゆう}立\par}
+\item[10]{%
+\setkeys[ltj]{ruby}{mode=9}%
+\ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
+は\ltjruby{美}{うつく}しい
+ \quad は\ltjruby{聴衆}{ちようしゆう}と\quad
+は\ltjruby{暁}{あかつき}立\quad
+は\ltjruby{峠}{とうげ}立\quad
+は\ltjruby{聴衆}{ちようしゆう}立\par}
+\item[11]{\setkeys[ltj]{ruby}{mode=13}%
+\ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
+は\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}
$g_i$,~$r_i$達の幅は,図\nobreak\ref{fig:node}に示したような対応に沿って算出する.
例えばこの場合,行中形$n_5$に対して
\[
- g_0+r_1+g_2+r_2+g_2 = 3\,\mathrm{zw}-(0.25\,\mathrm{zw}\times 2)=2.5\,\mathrm{zw}
+ 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 の消去法で解くことができて
%\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}
% グループルビ
\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{;}}{セミコロン}で区切}%
+}
+\fbox{\box0}
+
\newpage
\section{『日本語組版処理の要件』20120403の例}
3.50 \ruby{人}{ひと}に\ruby{誨}{おし}えて\ruby{\倦}{う}まず
% モノルビ.面倒でも複数回の実行が必要
3.51 \ruby{鬼}{き}\ruby{門}{もん}の\ruby{方}{ほう}\ruby{角}{がく}を%
- \ruby{å\87\9d}{ã\81\8eã\82\87う}\ruby{視}{し}する
+ \ruby{å\87\9d}{ã\81\8eã\82\88う}\ruby{視}{し}する
% 熟語ルビ
3.52 \ruby{鬼|門}{き|もん}の\ruby{方|角}{ほう|がく}を\ruby{凝|視}{ぎよう|し}する
3.53 \ruby{茅場町}{かやばちよう}\quad\ruby{茅|場}{かや|ば}\ruby{町}{ちよう}
\ruby{模型}{モデル}\quad \ruby{利用許諾}{ライセンス}}
% ルビが極端に短い場合
3.70 \ruby{なげきの聖母像}{ピエタ}\quad% ルビ全角まで許容
- \ruby[maxmargin=0.75]{なげきの聖母像}{ピエタ}% ルビ全角1.5倍まで
+ \ruby[maxmargin=0.75]{なげきの聖母像}{ピエタ}\\% ルビ全角1.5倍まで
% ルビが長い場合
3.71 \ruby{顧客}{クライアント}\quad \ruby{境界面}{インターフエース}
3.72 {\ltjsetruby{stretch=010, stretchbol=010, stretcheol=010}% はみ出さない流儀
% モノルビ配置.望ましくない
3.76× の\ruby{流}{りゆう}\ruby{儀}{ぎ}を\quad の\ruby{無}{む}\ruby{常}{じよう}を\quad%
-要調整 3.77\ {\ltjsetruby{stretchbol=121, stretcheol=121}% 行頭・行末揃えず
- \hbox{\vrule\vbox{\hsize=10\zw ああああああああの%
- \ruby{流|儀}{りゆう|ぎ}がある.}\vrule}\textbf{←なぜ改行できない}\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}
\begin{LTXexample}[pos=t]
\obeylines
3.78 \ruby{人}{ひと}は\ruby{死}{し}して\ruby{名}{な}を\ruby{残}{のこ}す
-% 現在の自動設定の仕様では「脚」の前が四分だけ「要件」の例より空く
3.79 漢字の部首には\ruby{偏}{へん}・\ruby{冠}{かんむり}・\ruby{脚}{きやく}・%
\ruby{旁}{つくり}がある
3.79 漢字の部首には\ruby{偏}{へん},\ruby{冠}{かんむり},\ruby{脚}{きやく},%
\end{LTXexample}
\begin{LTXexample}[pos=t]
\obeylines
-% もちろん手動で進入量を指定すれば話は別
-3.79 漢字の部首には\ruby{偏}{へん}・\ruby{冠}{かんむり}・\ruby[pre=1]{脚}{きやく}・%
- \ruby{旁}{つくり}がある
-3.79 漢字の部首には\ruby{偏}{へん},\ruby{冠}{かんむり},\ruby[pre=1]{脚}{きやく},%
- \ruby{旁}{つくり}がある
3.79 この\ruby{\噂}{うわさ}の好きな人は\ruby{懐}{ふところ}ぐあいもよく、\ruby{檜}{ひのき}を
3.80 漢字の部首には「\ruby{偏}{へん}」「\ruby{冠}{かんむり}」「\ruby{脚}{きやく}」%
「\ruby{旁}{つくり}」がある
3.80 この\ruby{\噂}{うわさ}好きな人は\ruby{懐}{ふところ}具合もよく、\ruby{檜}{ひのき}材を
-3.81× に\ruby{暁}{あかつき}の\kern-1\zw の\ruby{趣}{おもむき}を
+3.81× に\ruby{暁}{あかつき}の\kern-1\zw の\ruby{趣}{おもむき}を(良くない例)
3.82 に\ruby{暁}{あかつき}の\ruby{趣}{おもむき}を
-% 漢字にルビを2分まで掛けても良い流儀
+% æ¼¢å\97ã\83»ã\81²ã\82\89ã\81\8cã\81ªã\83»ã\82«ã\82¿ã\82«ã\83\8aã\81«ã\83«ã\83\93ã\82\922å\88\86ã\81¾ã\81§æ\8e\9bã\81\91ã\81¦ã\82\82è\89¯ã\81\84æµ\81å\84\80
{%
+ \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}}