%#! luajitlatex
%%% a test of ruby.
-\documentclass[b5paper,10pt]{ltjsarticle}
-\usepackage{luatexja-otf,amsmath,fontspec}
+\documentclass[a4paper,10pt]{ltjsarticle}
+\usepackage{luatexja-otf,amsmath}
\usepackage{unicode-math}
+\usepackage[textwidth=45\zw]{geometry}
+\usepackage[kozuka-pr6n]{luatexja-preset}
\setmathfont{XITS Math}
\setmainfont[Ligatures=TeX]{TeX Gyre Termes}
\setsansfont[Ligatures=TeX]{TeX Gyre Heros}
\setmonofont[Ligatures=TeX]{LMMono10-Regular}
\usepackage{luatexja-ruby,showexpl,booktabs}
-\lstset{preset=\huge,basicstyle=\ttfamily}
+\lstset{preset=\Large,basicstyle=\ttfamily}
\fboxsep=0mm
+\usepackage[unicode]{hyperref}
\def\kata{\ltjsetruby{kata}}
% 肩つきルビ用簡易設定.グループルビでは使用しないこと
\def\notalign{\setkeys[ltj]{ruby}{stretchhead = {1}{2}{1}, stretchend = {1}{2}{1}}}
\maketitle
+\begin{abstract}
\texttt{luatexja-ruby.sty} は,\LuaTeX-jaの機能を利用してルビの組版処理を行う追加パッケージである.
+\LuaTeX, \LuaTeX-jaの内部処理に割り込むことにより,熟語ルビ中の行分割や,
+行頭形・行中形・行末形の自動検出,また進入許容量の自動設定などを可能とした.
+\end{abstract}
+
+\tableofcontents
+
+\newpage
\section{使い方}
-パッケージ読み込みは,\verb+\usepackage{luatexja-ruby}+ で良い.
+パッケージ読み込みは,\verb+\usepackage{luatexja-ruby}+ で良く,
+必要ならば自動的に\LuaTeX-ja本体を読み込む.
plain \LuaTeX でのロードはまだサポートしておらず,
-\LaTeXe のみサポート.
+\LaTeXe のみサポートしている.
\subsection{用語}
「進入(intrusion)」「突出(protrusion)」という用語は,ZRさんによるpxrubricaパッケージでの用法に準ずる.
\end{tabular}
\end{center}
+上記の例で見られるように,
2ブロック以上をまとめて組むときは,全体を1つのグループルビのように組版する(JIS~X~4051と同様).
-ã\80\8eæ\97¥æ\9c¬èª\9eçµ\84ç\89\88å\87¦ç\90\86ã\81®è¦\81件ã\80\8fでは,
+ã\80\8cæ\97¥æ\9c¬èª\9eçµ\84ç\89\88å\87¦ç\90\86ã\81®è¦\81件ã\80\8dでは,
附属書Fに「熟語の構成,さらにその熟語の前後にくる文字の種類を考慮して配置する方法」として
-å\88¥ã\81®æ\96¹æ³\95ã\82\92解説ã\81\97ã\81¦ã\81\84ã\82\8bã\81\8cï¼\8cã\81\93ã\81¡ã\82\89ã\81®æ\96¹æ³\95ã\81¯ç\8f¾æ\99\82ç\82¹ã\81§ã\81¯ã\82µã\83\9dã\83¼ã\83\88ã\81\97ã\81ªã\81\84ï¼\8e
-
+å\88¥ã\81®æ\96¹æ³\95ã\82\92解説ã\81\97ã\81¦ã\81\84ã\82\8bã\81\8cï¼\8cã\81\93ã\81¡ã\82\89ã\81®æ\96¹æ³\95ã\81¯ç\8f¾æ\99\82ç\82¹ã\81§ã\81¯ã\82µã\83\9dã\83¼ã\83\88ã\81\97ã\81¦ã\81\84ã\81ªã\81\84ã\81®ã\81§ï¼\8c
+面倒でも手動で \texttt{pre}, \texttt{post} などを使って頑張って欲しい.
\end{itemize}
さて,<option>には以下の内容をkey-valueリストで指定可能である:
\begin{description}
\def\makelabel#1{\tt#1}
-\item[intrusionpre=<real>] 前進入許容量をルビ全角単位で指定.
+\item[pre=<real>] 前進入許容量をルビ全角単位で指定.
負の長さを指定した場合は,ルビの状況や直前の文字に応じた自動指定を意味する.
-デフォルト値は負(つまり,自動指定).
+既定値は負(つまり,自動指定).
-\item[intrusionpost=<real>] 同様に,後進入許容量を指定する.デフォルト値は負(つまり,自動指定).
+\item[post=<real>] 同様に,後進入許容量を指定する.既定値は負(自動指定).
-\item[mode] 進入処理のモードを表すbit vector.下位2\,bitは,\texttt{intrusionpre}や
-\texttt{intrusionpost}が負であるの場合にしか効力を発揮しない.デフォルト値は$0001_2 = 1$.
+\item[mode] 進入処理のモードを表すbit vector.下位2\,bitは,\texttt{pre}や
+\texttt{post}が負である場合にしか効力を発揮しない.既定値は$(0001)_2 = 1$.
\begin{description}
\item[bit 0] 進入を無効にするならば0,有効にするならば1.
\item[bit 1] 前進入許容量$B$と後進入許容量$A$が異なった場合,
\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, \frac x2 + \frac{(x-2M)p}{p+kp+r}\right),\qquad
- a=\min\left(A, \frac x2 + \frac{(x-2M)r}{p+kp+r}\right)
+ 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}
\end{description}
\item[stretchruby=\{<left>\}\{<middle>\}\{<right>\}] 親文字の合計長が
ルビ文字の合計長より長い時に,ルビ文字間に入れる空白の割合であり,それぞれ0--7の自然数で指定する.
-デフォルト値は\ \verb+{1}{2}{1}+ である.
-
+既定値は\ \verb+{1}{2}{1}+ である.
<left>はルビ文字の先頭までの空き量,<middle>はルビ文字間の空き量,<right>はルビ文字の末尾からの
空き量(の比)を表す.以下が例である.
\begin{LTXexample}[width=0.3\textwidth]
-\Large
\ltjruby[stretchruby=123,maxmargin=2]%
{◯◯◯◯}{◆◆}
\end{LTXexample}
\item[stretch=\{<left>\}\{<middle>\}\{<right>\}]
行中形でルビ文字の方が長い場合,親文字の前・中・後に入れる空白の割合.
-デフォルト値は\ \verb+{1}{2}{1}+ である.
+既定値は\ \verb+{1}{2}{1}+ である.
+「親文字均等割禁止」を行う場合は,<middle>を0にした値,例えば\
+\verb+{1}{0}{1}+ を指定することになる.
+
\item[stretchhead=\{<left>\}\{<middle>\}\{<right>\}] 行頭形〜.
-デフォルト値は\ \verb+{0}{1}{1}+ である.
+既定値は\ \verb+{0}{1}{1}+ である.
\item[stretchend=\{<left>\}\{<middle>\}\{<right>\}] 行末形〜.
-デフォルト値は\ \verb+{1}{1}{0}+ である.
+既定値は\ \verb+{1}{1}{0}+ である.
\item[maxmargin=<real>] 親文字の方がルビより長い時に,ルビの先頭と親文字の先頭,及び
-ルビ末尾と親文字の末尾の間に許される最大の空白量.\emph{親文字全角単位}で指定し,デフォルト値は0.5.
-\item[rubysize=<real>] ルビ文字の親文字に対する大きさ.デフォルト値は0.5.
+ルビ末尾と親文字の末尾の間に許される最大の空白量.\textbf{親文字全角単位}で指定し,既定値は0.5.
+
+\medskip
+\item[size=<real>] ルビ文字の親文字に対する大きさ.既定値は0.5.
+\item[intergap=<real>] ルビ文字と親文字との空きを親文字全角単位で指定.既定値は0.
+\item[rubysmash=<bool>] ルビの高さを0にするか.既定値は偽.次が例である.
+\begin{LTXexample}[width=0.3\textwidth]
+\ \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[kenten=<command>]各文字につく圏点の出力命令を指定する.既定値は「\verb+\ltjalchar`•+」
+であり,\texttt{U+2022} (Bullet)を\textbf{ALchar}として出力することを指定している.
+\item[fontcmd=<command>]ルビ用のフォント切り替え命令を指定する.
+
+\end{description}
\medskip
+次の2つは,以上で説明した複数のオプションを一度に設定するためのものである.
+普通はこの2つのうちいずれかを設定するだけで足りるだろう.
+
+\begin{description}
+\def\makelabel#1{\tt#1}
\item[naka] 以下のオプションを同時に設定する.主に中付きルビを組むときに用いる.
\begin{verbatim}
-mode=1, stretch=121, stretchruby=121
+mode=1, stretch={1}{2}{1}, stretchruby={1}{2}{1}
\end{verbatim}
-\item[kata] 同様に,肩付きルビ用に \verb+mode=9, stretch=121, stretchruby=001+ を設定.
-\item[ekata] pxrubricaパッケージで言う「拡張肩付き」用に,次を設定する.
+\item[kata] 同様に,肩付きルビ用に,次を設定する.
\begin{verbatim}
-intrusionpre=0, mode=1, stretch=001, stretchruby=001
+mode=9, stretch={1}{2}{1}, stretchruby={0}{0}{1}
\end{verbatim}
\end{description}
+
\paragraph{\tt\textbackslash ltjsetruby\{<option>\}}
-<option>の規定値を指定する.デフォルト値は各項目の所で既に説明してあるが,
+<option>の既定値を指定する.\texttt{luatexja-ruby} 読み込み時の値は
+各項目の所で既に説明してあるが,
\begin{verbatim}
-stretchruby={1}{2}{1}, stretch = {1}{2}{1},
-stretchhead = {0}{1}{1}, stretchend = {1}{1}{0},
-intrusionpre = -1, intrusionpost = -1, maxmargin=0.5,
-mode = 1, rubysize = 0.5, kenten=\ltjalchar`•
+ pre = -1, post = -1, mode = 1,
+ stretchruby={1}{2}{1}, stretch = {1}{2}{1},
+ stretchhead = {0}{1}{1}, stretchend = {1}{1}{0},
+ maxmargin=0.5, size = 0.5, intergap=0, rubysmash = true,
+ kenten=\ltjalchar`•, fontcmd=\relax
\end{verbatim}
-である.
+ã\81§ã\81\82ã\82\8aï¼\8cä¸ä»\98ã\81\8dã\83«ã\83\93ã\81§çµ\84ã\81¾ã\82\8cã\82\8bã\81\93ã\81¨ã\81«ã\81ªã\81£ã\81¦ã\81\84ã\82\8bï¼\8e
\paragraph{\texttt{\textbackslash ltjsetparamater} に追加されるキー}
\begin{description}
\item[\textsf{rubypreintrusion}\tt =\{<chr\_code>, <pre\_int>\}]
-文字<chr\_code> に,その\emph{直後}のルビによって掛けられるルビ文字列の最大長をルビ全角単位で指定.
+文字<chr\_code> に,その\textbf{直後}のルビによって掛けられるルビ文字列の最大長をルビ全角単位で指定.
\item[\textsf{rubypostintrusion}\tt =\{<chr\_code>, <post\_int>\}]
-文字<chr\_code> に,その\emph{直後}のルビによって掛けられるルビ文字列の最大長をルビ全角単位で指定.
-\end{description}
-デフォルト値は,\textsf{rubypreintrusion},~\textsf{rubypostintrusion}とも
+文字<chr\_code> に,その\textbf{直前}のルビによって掛けられるルビ文字列の最大長をルビ全角単位で指定.
+\end{description}
+既定値は,\textsf{rubypreintrusion},~\textsf{rubypostintrusion}とも
以下の文字に対しては1,その他の文字については0である:
\begin{quote}
平仮名(\texttt{U+3040}--\texttt{U+309F}),カギ括弧「」,読点「,」「、」,中黒「・」
\end{quote}
+\paragraph{\texttt{\textbackslash ltjkenten}}
+圏点を出力する命令で,\verb+\kenten+ という別名を定義している.
+\begin{quote}
+ \tt \textbackslash ltjkenten[<option>]{親文字}
+\end{quote}
+のように使用する.複数文字に圏点をつける場合でも,\verb+\ltjruby+ のように「\texttt{|}」を使って
+文字を区切る\textbf{必要はない}ことに注意してほしい.
+
+圏点として出力される文字は \texttt{kenten} キーによって指定し,
+圏点自身の大きさは(ルビと同様に)\texttt{size} キーで指定する.
+
+\newpage
+
\section{注意点}
-\begin{itemize}
-\item ルビ文字のはみ出しが繋がらないようにする処理(図3.82)には注意.
-例えば,
+\begin{description}
+\item[ルビ文字のはみ出し]
+「日本語組版処理の要件」の図3.82のように,
+ルビ文字のはみ出しが繋がらないようにする処理について述べる:例えば,
\begin{center}\Large
\ltjsetparameter{rubypreintrusion={`◆,1},
rubypostintrusion={`◆,1}}
「\ltjruby{陵}{みささぎ}」前側進入許容量は
\[
\underbrace{0.5\,\mathrm{zw}}_{\text{元々の許容量}}
--\underbrace{0.25\,\mathrm{zw}}_{\text{前のルビの後側進入量}}=0.25\,\mathrm{zw}
+-\underbrace{0.25\,\mathrm{zw}}_{\text{前のルビの後側進入量(行中形)}}=0.25\,\mathrm{zw}
\]
となる.なお,行分割後,「\ltjruby{陵}{りよう}」が実際に組まれた時に使われた後側進入量は
auxファイルに記述される.
\item 2回目以降の実行では,auxファイルに保存された「\ltjruby{陵}{りよう}」の後側進入量
-を用いて,「\ltjruby{陵}{みささぎ}」前側進入許容量を計算する.
+を用いて,「\ltjruby{陵}{みささぎ}」前側進入許容量を
+\[
+ \underbrace{0.5\,\mathrm{zw}}_{\text{元々の許容量}}
+-\underbrace{0.25\,\mathrm{zw}}_{\text{前のルビの後側進入量 (from aux)}}=0.25\,\mathrm{zw}
+\]
+と計算する.
\end{enumerate}
-なお,auxファイルに保存する際,各 \verb+\ltjruby+ 命令の呼び出しを識別するキーが必要になるが,
+auxファイルに保存する際,各 \verb+\ltjruby+ 命令の呼び出しを識別するキーが必要になるが,
そのキーとしては単純に「何個目の \verb+\ltjruby+ 命令か」である.
-\item 実装方法の都合上,ルビの直前・直後・途中で2箇所以上の改行が起きる場合
+\item[可動グループルビの制限]
+実装方法の都合上,ルビの直前・直後・途中で2箇所以上の改行が起きる場合
(以下のパーツの組み方が出てくる)に対応できない.
\begin{center}\small
\begin{tabular}{ll}
\end{tabular}
\end{center}
+\newpage
+\item[段落末尾のルビ]\
+\begin{itemize}
\item 段落がルビで終わった場合,そのルビが行末形で組まれることはない.
これは,段落の「本当の」末尾には \verb+\penalty10000\parfillskip+ があるためで,
ルビ処理用に作った最後のグルー(下の説明では$g_2$)が消去されないことによる.
\verb+\parfillskip+ の長さ(や,場合によっては \verb+\rightskip+)を実測し,
それによって処理を変えるのも可能だが,そのようなことはしなかった.
段落がルビで終わることは普通ない(最低でも句点が続くだろう)と思うからである.
-\end{itemize}
+\end{itemize}
+
+\item[段落先頭のルビ]
+同様に,段落先頭のルビは行頭形にはならず,また
+\texttt{pre}が負(つまり,自動指定)のときは段落最初のインデント部分への進入は行わない.
+\begin{LTXexample}
+\parindent1\zw\noindent 012345\par
+\ltjruby{陵}{みささぎ}は……\par
+\ltjruby[pre=1]{陵}{みささぎ}は……
+% 手動で指定するのはOK
+\end{LTXexample}
+
+
+\end{description}
\section{実装の大まかな方法}
次の例で説明する.
&\multicolumn{1}{c}{\sf 対応するノード並び}\\
\midrule
$n_1$&行末1グループ&
-\huge
-\fbox{を}{\color{blue}\gt\ltjruby[intrusionpre=1,mode=5,stretch=110]{流}{りゆう}}\vrule
+\Large
+\fbox{を}{\color{blue}\gt\ltjruby[pre=1,mode=5,stretch=110]{流}{りゆう}}\vrule
&
$g_0\rightarrow W\rightarrow r_1$\\
$n_2$&行末2グループ&
-\huge
-\fbox{を}{\color{blue}\gt\ltjruby[intrusionpre=1,mode=1,stretch=110]{流|暢}{りゆう|ちよう}}\vrule
+\Large
+\fbox{を}{\color{blue}\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グループ&
-\huge
-\vrule{\color{blue}\gt\ltjruby[intrusionpost=1,mode=1,stretch=011]{暢}{ちよう}}\fbox{に}
+\Large
+\vrule{\color{blue}\gt\ltjruby[post=1,mode=1,stretch=011]{暢}{ちよう}}\fbox{に}
&
$r_2\rightarrow g_2$\\
$n_4$&行頭2グループ&
-\huge
-\vrule{\color{blue}\gt\ltjruby[intrusionpost=1,mode=1,stretch=011]{流|暢}{りゆう|ちよう}}\fbox{に}
+\Large
+\vrule{\color{blue}\gt\ltjruby[post=1,mode=1,stretch=011]{流|暢}{りゆう|ちよう}}\fbox{に}
&
$W\rightarrow r_1\rightarrow g_2 \rightarrow r_2\rightarrow g_2$\\
$n_5$&行中&
-\huge
-\fbox{を}{\color{blue}\gt\ltjruby[intrusionpost=0.5,intrusionpre=0.5,mode=1]{流|暢}{りゆう|ちよう}}\fbox{に}
+\Large
+\fbox{を}{\color{blue}\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$\\
\end{enumerate}
\end{enumerate}
-
+\newpage
\section{いくつかの例}
\def\ltjrubytest{\ltjruby{黄金橋}{ゴールデンゲートブリッジ}\relax}
\def\ltjrubytest{\ltjruby{異|様}{い|よう}\relax}
\setbox0=\vbox{\hsize=19\zw%
-あ\ltjrubytest いうえくけこ
+あ\ltjrubytest いうえくけ
あ\ltjrubytest いうえくけこ
あ\ltjrubytest いうえくけこ
あ\ltjrubytest いうえくけこイ
\begin{description}
\def\sample{又\ltjruby{承}{うけたまわ}る\quad \ltjruby{疎}{そ}\quad は\ltjruby{俄}{にわか}勉強
- \quad 後\ltjruby{俄}{にわか}勉強\quad は\ltjruby{暁}{あかつき}に}
+ \quad 後\ltjruby{俄}{にわか}勉強\quad は\ltjruby{暁}{あかつき}に
+ は\ltjruby{俄}{にわか}に
+ \quad \ltjruby{休|憩|中}{きゆう|けい|ちゆう}かつ\ltjruby{視|聴|中}{し|ちよう|ちゆう}}
\item[標準] \sample
\item[肩つき] {\kata\sample}
-\item[拡張肩つき]{\ltjsetruby{ekata}\sample}
+\item[親文字均等割禁止] {\ltjsetruby{stretch=101}\sample}
\end{description}
+\textgt{\ltjruby{勉|強}{べん|きよう}\ltjruby[fontcmd=\mcfamily]{勉|強}{べん|きよう}}
\newpage
-\section{jlreq 20120403の例}
+\section{「日本語組版処理の要件」20120403の例}
\obeylines\newcommand*{\噂}{\CID{7642}}
%================================== 横組
\quad \ltjruby{韋}{い}\ltjruby{編}{へん}\ltjruby{三}{さん}\ltjruby{絶}{ぜつ}
3.59 に\ltjruby{幟}{\kanjiseries{mc}\selectfont のぼり}を
3.60 \ltjruby{韋}{い}\ltjruby{編}{へん}\ltjruby{三}{さん}\ltjruby{絶}{ぜつ}\quad%
-{\setkeys[ltj]{ruby}{rubysize=0.4}% 文字サイズ変更
+{\setkeys[ltj]{ruby}{size=0.4}% 文字サイズ変更
\ltjruby{韋}{い}\ltjruby{編}{へん}\ltjruby{三}{さん}\ltjruby{絶}{ぜつ}}
\paragraph{3.3.4節}\ \par
要調整 3.77\ {\notalign%この図では揃えない
\hbox{\vrule\vbox{\hsize=10\zw あああああああの%
\ltjruby{流|儀}{りゆう|ぎ}がある.}\vrule}\quad%
-% ↑どうすれば改行されるのだろう
+\textbf{←ルビ中で改行するには?}
\hbox{\vrule\vbox{\hsize=5\zw ……の\ltjruby{無|常}{む|じよう}を}\vrule}}
\paragraph{3.3.8節 ルビはみ出し}\ \par
3.80 漢字の部首には「\ltjruby{偏}{へん}」「\ltjruby{冠}{かんむり}」「\ltjruby{脚}{きやく}」%
「\ltjruby{旁}{つくり}」がある
3.80 この\ltjruby{\噂}{うわさ}好きな人は\ltjruby{懐}{ふところ}具合もよく、\ltjruby{檜}{ひのき}材を
-要調整3.81× に\ltjruby{暁}{あかつき}の\kern-1\zw の\ltjruby{趣}{おもむき}を
+3.81× に\ltjruby{暁}{あかつき}の\kern-1\zw の\ltjruby{趣}{おもむき}を
3.82 に\ltjruby{暁}{あかつき}の\ltjruby{趣}{おもむき}を
{%
\ltjsetparameter{rubypostintrusion={`好,0.5}}
要調整3.85\ {\notalign%この図では揃えない
\hbox{\vrule\vbox{\hsize=15\zw% なぜ行末形にならない!
あああああああああああああの\ltjruby{徑}{こみち}\penalty-1000をあああああああ%
-あああああああああああああああああいの\ltjruby{徑}{こみち}ああ}\vrule}}
+あああああああああああああああああいの\ltjruby{徑}{こみち}ああ}\vrule}}%
+\textbf{なぜ行末形にならない}
3.86\ %
\hbox{\vrule\vbox{\hsize=15\zw
\paragraph{圏点の例(常用漢字表前書きより)}
- \ltjgetparameter{chartorange}{`﹅}%
-\ltjgetparameter{jacharrange}{6}
-この表は,法令,公⽤⽂書,新聞,雑誌,放送など,⼀般の社会⽣活におい
+この表は,法令,公⽤⽂書,新聞,雑誌,放送など,⼀般の社会⽣活におい%
て\kenten[kenten=﹅]{現代の国語を書き表す}場合の\kenten{漢字使⽤の⽬安を⽰す}ものである。
-
\newpage
-{\Large 要調整}
+{\Large 以下は要調整}
\paragraph{F.1--2節}\ \par
% LaTeX only!
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{luatexja-ruby}[2014/02/06 v0.1]
+\ProvidesPackage{luatexja-ruby}[2014/03/19 v0.2]
\RequirePackage{luatexja}
%%------------------
%% intrusion 量強制固定(bit 0, bit 1 より優先,負数で「自動」)
%% attr は sp 単位だが,ユーザーはルビ全角単位で指定する
%% attr_ruby_maxprep, attr_ruby_maxpostp
-\ltj@@rkeydef{intrusionpre}
-\ltj@@rkeydef{intrusionpost}
+\ltj@@rkeydef{pre}
+\ltj@@rkeydef{post}
%% 親文字伸長の際の比,{0}{1}{1} などと0--7 の数 3 つで指定
%% attr_ruby_stretch (head left,middle,right)(end)(middle) 27-bits
\ltj@@rkeydef{stretchhead} % 行頭形
%% attr_ruby_maxmargin
%% attr は sp 単位だが,ユーザーは親文字全角単位で指定
\ltj@@rkeydef{maxmargin}
+%% ルビと親文字の垂直方向の空き
+%% attr_ruby_intergap
+%% attr は sp 単位だが,ユーザーは親文字全角単位で指定
+\ltj@@rkeydef{intergap}
\ltj@@rkeydef{kenten}%% 圏点文字
+\ltj@@rkeydef{fontcmd}%% フォント
+\define@boolkey[ltj]{ruby}{rubysmash}[true]{}
-\savekeys[ltj]{ruby}{%
- mode, intrusionpre, intrusionpost,
- stretchhead, stretchend, stretch, stretchruby,
- maxmargin, rubysize, kenten,
-}
%%%%%%%% setkeys の別名
\protected\def\ltjsetruby{\setkeys[ltj]{ruby}}
% ここからは ruby マクロ内でなんとかされる事項
%% ルビと親文字の大きさの比
-\ltj@@rkeydef{rubysize}
+\ltj@@rkeydef{size}
% 中つき用簡易設定.
-\define@key[ltj]{ruby}{kata}[none]{\setkeys[ltj]{ruby}{mode=1, stretch=121, stretchruby=121}}
+\define@key[ltj]{ruby}{naka}[none]{\setkeys[ltj]{ruby}{mode=1, stretch=121, stretchruby=121}}
% 肩つき用簡易設定.
\define@key[ltj]{ruby}{kata}[none]{\setkeys[ltj]{ruby}{mode=9, stretch=121, stretchruby=001}}
-% 拡張肩つき用簡易設定.
-\define@key[ltj]{ruby}{ekata}[none]{\setkeys[ltj]{ruby}{%
- intrusionpre=0, mode=1, stretch=001,stretchruby=001}}
%%%%%%%% 補助関数
\string{
rubyzw = \ltj@safe@dimen{#1},
maxmargin = \ltj@safe@dimen{\ltj@@rubyip@maxmargin\zw},
- intrusionpre = \ltj@safe@dimen{\ltj@@rubyip@intrusionpre#1},
- intrusionpost = \ltj@safe@dimen{\ltj@@rubyip@intrusionpost#1},
+ pre = \ltj@safe@dimen{\ltj@@rubyip@pre#1},
+ post = \ltj@safe@dimen{\ltj@@rubyip@post#1},
+ intergap = \ltj@safe@dimen{\ltj@@rubyip@intergap\zw},
stretch
= 262144 * \expandafter\ltj@@ruby@cts\ltj@@rubyip@stretchhead
+ 512 * \expandafter\ltj@@ruby@cts\ltj@@rubyip@stretchend
+ \expandafter\ltj@@ruby@cts\ltj@@rubyip@stretch,
mode
= 2097152 * \expandafter\ltj@@ruby@cts\ltj@@rubyip@stretchruby
- + \ltj@safe@num{\ltj@@rubyip@mode},
+ + \ltj@safe@num{\ltj@@rubyip@mode}
+ + 1048576 * \ifltj@ruby@rubysmash1\else0\fi
\string}
}
+%%%
+%%% 1098765432109876543210976543210
+%%% |st_ruby|! |--| ← mode
\def\ltj@@ruby@cts#1#2#3{%
((\ltj@safe@num{#1}) * 64 + (\ltj@safe@num{#2}) * 8 + \ltj@safe@num{#3})%
}
\def\ltj@@ruby[#1]#2#3{{% #1: option #2: 親文字群,#3: ルビ文字列群,共に| 区切り
\setkeys[ltj]{ruby}{#1}%
\directlua{ruby_tmplist_r = \string{\string}; ruby_tmplist_p = \string{\string}}%
- \leavevmode\dimen0=\f@size pt\dimen1=\ltj@@rubyip@rubysize\dimen0%
+ \leavevmode\dimen0=\f@size pt\dimen1=\ltj@@rubyip@size\dimen0%
% 引数展開,テーブルにセット
\pxrr@decompbar{#2}{\let\ltj@@ruby@mark\ltj@@ruby@sp\pxrr@res}%
\pxrr@decompbar{#3}{\let\ltj@@ruby@mark\ltj@@ruby@sr\pxrr@res}%
- {\fontsize{\ltj@@rubyip@rubysize\dimen0}\z@\selectfont\global\dimen1=\zw}%
+ {\fontsize{\ltj@@rubyip@size\dimen0}\z@\selectfont\ltj@@rubyip@fontcmd\global\dimen1=\zw}%
\directlua{%
luatexja.ruby.texiface(\ltj@@ruby@create@table{\dimen1},
ruby_tmplist_r, ruby_tmplist_p)}%
}}
\def\ltj@@ruby@sr#1{%
- \setbox0=\hbox{\fontsize{\dimen1}\z@\selectfont#1}%
+ \setbox0=\hbox{\fontsize{\dimen1}\z@\ltj@@rubyip@fontcmd\selectfont#1}%
\directlua{table.insert(ruby_tmplist_r, luatexja.ruby.cpbox())}%
}
\def\ltj@@ruby@sp#1{%
rubypostintrusion={`・,1}}
\setkeys[ltj]{ruby}{
+ pre = -1, post = -1, mode = 1,
stretchruby={1}{2}{1}, stretch = {1}{2}{1},
stretchhead = {0}{1}{1}, stretchend = {1}{1}{0},
- intrusionpre = -1, intrusionpost = -1, maxmargin=0.5,
- mode = 1, rubysize = 0.5, kenten=\ltjalchar`•
+ maxmargin=0.5, size = 0.5, intergap=0, rubysmash = false,
+ kenten=\ltjalchar`•, fontcmd=\relax
}
\endinput
\ No newline at end of file
--
luatexbase.provides_module({
name = 'luatexja.ruby',
- date = '2014/02/06',
+ date = '2014/03/19',
description = 'Ruby',
})
module('luatexja.ruby', package.seeall)
local attr_ruby_stretch = luatexbase.attributes['ltj@kcat2']
local attr_ruby_mode = luatexbase.attributes['ltj@kcat3']
local attr_ruby_id = luatexbase.attributes['ltj@kcat4'] -- uniq id
+local attr_ruby_intergap = luatexbase.attributes['ltj@kcat5']
local attr_ruby = luatexbase.attributes['ltj@rubyattr']
-- ルビ内部処理用,以下のようにノードによって使われ方が異なる
-- * (whatsit) では JAglue 処理時に,
setfield(wv, 'value', floor(#rtlr))
set_attr(wv, attr_ruby, rst.rubyzw)
set_attr(wv, attr_ruby_maxmargin, rst.maxmargin)
- set_attr(wv, attr_ruby_maxprep, rst.intrusionpre)
- set_attr(wv, attr_ruby_maxpostp, rst.intrusionpost)
+ set_attr(wv, attr_ruby_maxprep, rst.pre)
+ set_attr(wv, attr_ruby_maxpostp, rst.post)
+ set_attr(wv, attr_ruby_intergap, rst.intergap)
set_attr(wv, attr_ruby_stretch, rst.stretch)
set_attr(wv, attr_ruby_mode, rst.mode)
local n = wv
-- returned value: <new box>, <ruby width>, <post_intrusion>
local max_margin
local function new_ruby_box(r, p, ppre, pmid, ppost,
- rpre, rmid, rpost, mapre, mapost, intmode)
+ mapre, mapost, imode, rgap)
local post_intrusion = 0
+ local intmode = imode%4
+ local rpre, rmid, rpost, rsmash
+ imode = floor(imode/262144); rsmash = (imode%2 ==1)
+ imode = floor(imode/2); rpost = imode%8;
+ imode = (imode-rpost)/8; rmid = imode%8;
+ imode = (imode-rmid)/8; rpre = imode%8
if getfield(r, 'width') > getfield(p, 'width') then -- change the width of p
r, p, post_intrusion = enlarge_parent(r, p, ppre, pmid, ppost, mapre, mapost, intmode)
elseif getfield(r, 'width') < getfield(p, 'width') then -- change the width of r
setfield(rt, 'head', nil); node_free(rt);
end
end
- local a = node_new(id_rule)
- setfield(a, 'width', 0)
- setfield(a, 'height', 0)
- setfield(a, 'depth', 0)
- insert_after(r, r, a); insert_after(r, a, p)
- setfield(p, 'next', nil)
- a = Dnode.vpack(r)
- setfield(a, 'shift', 0)
+ local a, k = node_new(id_rule), node_new(id_kern)
+ setfield(a, 'width', 0); setfield(a, 'height', 0)
+ setfield(a, 'depth', 0); setfield(k, 'kern', rgap)
+ insert_after(r, r, a); insert_after(r, a, k);
+ insert_after(r, k, p); setfield(p, 'next', nil)
+ a = Dnode.vpack(r); setfield(a, 'shift', 0)
set_attr(a, attr_ruby, post_intrusion)
+ if rsmash or getfield(a, 'height')<getfield(p, 'height') then
+ local k = node_new(id_kern)
+ setfield(k, 'kern', -getfield(a, 'height')+getfield(p, 'height'))
+ setfield(a, 'head', k); insert_before(r, r, k)
+ setfield(a, 'height', getfield(p, 'height'))
+ end
+
return a, getfield(r, 'width'), post_intrusion
end
local mdt -- nt*: node temp
local coef = {} -- 連立一次方程式の拡大係数行列
local rtb = expand_3bits(has_attr(wv, attr_ruby_stretch))
- local rtc = expand_3bits(has_attr(wv, attr_ruby_mode))
- local intmode = floor(has_attr(wv, attr_ruby_mode)/4)%4
+ local rgap = has_attr(wv, attr_ruby_intergap)
+ local intmode = floor(has_attr(wv, attr_ruby_mode)/4)
-- node list 展開・行末形の計算
local nt, nta, ntb = wv, nil, nil -- nt*: node temp
for j = 2*i+1, 2*cmp+1 do coef[i][j] = 0 end
kf[i], coef[i][2*cmp+2]
= new_ruby_box(node_copy(nta), node_copy(ntb),
- rtb[6], rtb[5], rtb[4], rtc[10], rtc[9], rtc[8],
- max_allow_pre, 0, intmode)
+ rtb[6], rtb[5], rtb[4], max_allow_pre, 0, intmode, rgap)
end
node_free(nta); node_free(ntb)
nta = concat(node_copy(rb[i]), nta); ntb = concat(node_copy(pb[i]), ntb)
kf[cmp+i], coef[cmp+i][2*cmp+2]
= new_ruby_box(node_copy(nta), node_copy(ntb),
- rtb[9], rtb[8], rtb[7], rtc[10], rtc[9], rtc[8],
- 0, max_allow_post, intmode)
+ rtb[9], rtb[8], rtb[7], 0, max_allow_post, intmode, rgap)
end
-- ここで,nta, ntb には全 container を連結した box が入っているので
coef[2*cmp+1] = {}
for j = 1, 2*cmp+1 do coef[2*cmp+1][j] = 1 end
kf[2*cmp+1], coef[2*cmp+1][2*cmp+2], post_intrusion_backup
- = new_ruby_box(nta, ntb,
- rtb[3], rtb[2], rtb[1], rtc[10], rtc[9], rtc[8],
- max_allow_pre, max_allow_post, intmode)
+ = new_ruby_box(nta, ntb, rtb[3], rtb[2], rtb[1],
+ max_allow_pre, max_allow_post, intmode, rgap)
-- w.value の node list 更新.
local nt = wv
set_attr(nt, attr_ruby, 2*i+2)
insert_after(head, nta, nt)
end
- tex.setattribute(attr_ruby, -0x7FFFFFFF)
+ tex.setattribute('global', attr_ruby, -0x7FFFFFFF)
setfield(w, 'user_id', RUBY_POST)
return head, first_whatsit(node_next(nt))
end