OSDN Git Service

luatexja-ruby.sty: added/renamed several keys.
[luatex-ja/luatexja.git] / luatexja-ruby.tex
1 %#! luajitlatex
2 %%% a test of ruby.
3 \documentclass[a4paper,10pt]{ltjsarticle}
4 \usepackage{luatexja-otf,amsmath}
5 \usepackage{unicode-math}
6 \usepackage[textwidth=45\zw]{geometry}
7 \usepackage[kozuka-pr6n]{luatexja-preset}
8 \setmathfont{XITS Math}
9 \setmainfont[Ligatures=TeX]{TeX Gyre Termes}
10 \setsansfont[Ligatures=TeX]{TeX Gyre Heros}
11 \setmonofont[Ligatures=TeX]{LMMono10-Regular}
12 \usepackage{luatexja-ruby,showexpl,booktabs}
13 \lstset{preset=\Large,basicstyle=\ttfamily}
14 \fboxsep=0mm
15
16 \usepackage[unicode]{hyperref}
17 \def\kata{\ltjsetruby{kata}} 
18 % 肩つきルビ用簡易設定.グループルビでは使用しないこと
19 \def\notalign{\setkeys[ltj]{ruby}{stretchhead = {1}{2}{1}, stretchend = {1}{2}{1}}}
20 % 行頭・行末で揃えない
21
22 \def\Node#1#2{\,\vcenter{\hbox{\fboxsep=1pt\fbox{\vbox{\small\halign{\hfil##\hfil\cr
23   #1\mathstrut\cr\noalign{\hrule height.4pt}\strut#2\cr}}}}\,}}
24 \def\LuaTeX{Lua\TeX}
25
26 % 三分ルビ用
27 \DeclareFontShape{JY3}{mc}{mc}{n}{<-> [0.92487] 
28   psft:Ryumin-Light:extend=0.67;jfm=ujisc33}{}
29
30 \title{\texttt{luatexja-ruby.sty}}
31 \begin{document}
32 \catcode`\<=13
33 \def<#1>{{\normalfont\rm\itshape$\langle$#1\/$\rangle$}}
34 %\fontsize{13.19873}{15}\selectfont%
35
36 \maketitle
37
38 \begin{abstract}
39 \texttt{luatexja-ruby.sty} は,\LuaTeX-jaの機能を利用してルビの組版処理を行う追加パッケージである.
40 \LuaTeX, \LuaTeX-jaの内部処理に割り込むことにより,熟語ルビ中の行分割や,
41 行頭形・行中形・行末形の自動検出,また進入許容量の自動設定などを可能とした.
42 \end{abstract}
43
44 \tableofcontents
45
46 \newpage
47 \section{使い方}
48 パッケージ読み込みは,\verb+\usepackage{luatexja-ruby}+ で良く,
49 必要ならば自動的に\LuaTeX-ja本体を読み込む.
50 plain \LuaTeX でのロードはまだサポートしておらず,
51 \LaTeXe のみサポートしている.
52
53 \subsection{用語}
54 「進入(intrusion)」「突出(protrusion)」という用語は,ZRさんによるpxrubricaパッケージでの用法に準ずる.
55
56 \begin{quotation}
57 進入あり:と\ltjruby{暁}{あかつき}の
58
59 進入なし:{\setkeys[ltj]{ruby}{mode=0}と\ltjruby{暁}{あかつき}の}
60
61 突出あり:{\setkeys[ltj]{ruby}{stretch={1}{2}{1}}\ltjruby{聴衆}{ちようしゆう}}
62
63 突出なし:{\setkeys[ltj]{ruby}{stretch={0}{2}{0}}\ltjruby{聴衆}{ちようしゆう}}
64 \end{quotation}
65
66 \subsection{命令}
67 \paragraph{\tt\textbackslash ltjruby}
68 ルビ出力用命令の本体.\verb+\ruby+ という別名を定義している.
69 \begin{quote}
70 \tt \textbackslash ltjruby[<option>]\{親|文|字\}\{おや|も|じ\}
71 \end{quote}
72 のように使用する.
73
74 第2・第3引数内の「\verb+|+」はグループの区切りを表す.グループの数は両者で一致しなければならず,
75 \verb+\ltjruby{紋章}{もん|しよう}+ のようにはできない.
76 \begin{itemize}
77 \item 1グループのみのルビ(単純グループルビ)はグループルビとして組まれる.そのため,
78 もしモノルビを使いたければ,面倒でも
79 \begin{LTXexample}[width=0.4\textwidth]
80 の\ltjruby{紋}{もん}\ltjruby{章}{しよう}が
81 \end{LTXexample}
82 のように,複数回使用すること.
83 \item 全てのグループにおいて「ルビ文字列の長さは親文字列以下」であれば,
84 単純グループルビの並びとして扱われる.すなわち,次の2行は全くの等価となる.
85 \begin{verbatim}
86 \ltjruby{普|通|車}{ふ|つう|しや}
87 \ltjruby{普}{ふ}\ltjruby{通}{つう}\ltjruby{車}{しや}
88 \end{verbatim}
89 \item 複数グループかつ上記の条件を満たさない場合は,
90 所謂「可動グループルビ」であり,グループの切れ目で改行が可能となる.
91 例えば
92 \begin{verbatim}
93 …の\ltjruby{表|現|力}{ひよう|げん|りよく}は…
94 \end{verbatim}
95 という入力からは得られる組版結果は,次のいずれかになる.
96 \begin{center}
97  \begin{tabular}{ll}
98  \toprule
99  改行なし(行中形)&\Large …の\ltjruby{表|現|力}{ひよう|げん|りよく}は…\\
100  直前で改行&\Large \vrule \ltjruby[stretch=011]{表|現|力}{ひよう|げん|りよく}は…\\
101 &\Large …の\ltjruby[stretch=110]{表}{ひよう}
102     \vrule\ltjruby[stretch=011]{現|力}{げん|りよく}は…\\
103 &\Large …の\ltjruby[stretch=110]{表|現}{ひよう|げん}
104     \vrule\ltjruby[stretch=011]{力}{りよく}は…\\
105  直後に改行&\Large …の\ltjruby[stretch=110]{表|現|力}{ひよう|げん|りよく}\vrule\\
106 \bottomrule
107  \end{tabular}
108 \end{center}
109
110 上記の例で見られるように,
111 2ブロック以上をまとめて組むときは,全体を1つのグループルビのように組版する(JIS~X~4051と同様).
112 「日本語組版処理の要件」では,
113 附属書Fに「熟語の構成,さらにその熟語の前後にくる文字の種類を考慮して配置する方法」として
114 別の方法を解説しているが,こちらの方法は現時点ではサポートしていないので,
115 面倒でも手動で \texttt{pre}, \texttt{post} などを使って頑張って欲しい.
116 \end{itemize}
117
118
119 さて,<option>には以下の内容をkey-valueリストで指定可能である:
120 \begin{description}
121 \def\makelabel#1{\tt#1}
122 \item[pre=<real>] 前進入許容量をルビ全角単位で指定.
123 負の長さを指定した場合は,ルビの状況や直前の文字に応じた自動指定を意味する.
124 既定値は負(つまり,自動指定).
125
126 \item[post=<real>] 同様に,後進入許容量を指定する.既定値は負(自動指定).
127
128 \item[mode] 進入処理のモードを表すbit vector.下位2\,bitは,\texttt{pre}や
129 \texttt{post}が負である場合にしか効力を発揮しない.既定値は$(0001)_2 = 1$.
130 \begin{description}
131  \item[bit 0] 進入を無効にするならば0,有効にするならば1.
132  \item[bit 1] 前進入許容量$B$と後進入許容量$A$が異なった場合,
133 そのまま処理する場合は0,小さい方に揃えるならば1.
134  \item[bit 2--3] ルビ文字の突出量$x$から実際の前進入量$b$,後進入量$a$の計算方法を指定する.
135 親文字の文字数が$k+1$,親文字の前に入る空白量・間の空白量・後ろの空白量の比が$p:q:r$のとき,
136 \begin{description}
137  \item[00] $b=\min\{B, xp/[p+kq+r]\}$, \ $a=\min\{A, xr/[p+kq+r]\}$
138  \item[01] $b=\min(B, x)$, \ $a=\min[A, \max(x-b,0)]$
139  \item[10] $a=\min(A, x)$, \ $b=\min[B, \max(x-a,0)]$
140  \item[11] $M=\min(B,A)$とおく.もし$x\le 2M$ならば$b=a=x/2$.そうでなければ
141 \[
142  b=\min\left(B, M + \frac{(x-2M)p}{p+kp+r}\right),\qquad 
143  a=\min\left(A, M + \frac{(x-2M)r}{p+kp+r}\right)
144 \]
145 \end{description}
146
147 組み方の具体例を実際に示す.例示のため,平仮名にはルビが1字まで,「立」にはルビを
148 0.5字分までかけてよいことにしている.
149 \begin{description}
150 \item[00]{\setkeys[ltj]{ruby}{mode=1}%
151 \ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
152 は\ltjruby{美}{うつく}しい
153   \quad は\ltjruby{聴衆}{ちようしゆう}と\quad
154 は\ltjruby{暁}{あかつき}立\quad
155 は\ltjruby{聴衆}{ちようしゆう}立\par}
156 \item[01]{\setkeys[ltj]{ruby}{mode=5}%
157 \ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
158 は\ltjruby{美}{うつく}しい
159   \quad は\ltjruby{聴衆}{ちようしゆう}と\quad
160 は\ltjruby{暁}{あかつき}立\quad
161 は\ltjruby{聴衆}{ちようしゆう}立\par}
162 \item[10]{\setkeys[ltj]{ruby}{mode=9}%
163 \ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
164 は\ltjruby{美}{うつく}しい
165   \quad は\ltjruby{聴衆}{ちようしゆう}と\quad
166 は\ltjruby{暁}{あかつき}立\quad
167 は\ltjruby{聴衆}{ちようしゆう}立\par}
168 \item[11]{\setkeys[ltj]{ruby}{mode=13}%
169 \ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
170 は\ltjruby{美}{うつく}しい\quad
171 は\ltjruby{聴衆}{ちようしゆう}と\quad
172 は\ltjruby{暁}{あかつき}立\quad
173 は\ltjruby{聴衆}{ちようしゆう}立\par}
174 \end{description} 
175
176 \end{description}
177 \item[stretchruby=\{<left>\}\{<middle>\}\{<right>\}] 親文字の合計長が
178 ルビ文字の合計長より長い時に,ルビ文字間に入れる空白の割合であり,それぞれ0--7の自然数で指定する.
179 既定値は\ \verb+{1}{2}{1}+ である.
180 <left>はルビ文字の先頭までの空き量,<middle>はルビ文字間の空き量,<right>はルビ文字の末尾からの
181 空き量(の比)を表す.以下が例である.
182 \begin{LTXexample}[width=0.3\textwidth]
183 \ltjruby[stretchruby=123,maxmargin=2]%
184   {◯◯◯◯}{◆◆}
185 \end{LTXexample}
186 \item[stretch=\{<left>\}\{<middle>\}\{<right>\}]
187 行中形でルビ文字の方が長い場合,親文字の前・中・後に入れる空白の割合.
188 既定値は\ \verb+{1}{2}{1}+ である.
189 「親文字均等割禁止」を行う場合は,<middle>を0にした値,例えば\ 
190 \verb+{1}{0}{1}+ を指定することになる.
191
192 \item[stretchhead=\{<left>\}\{<middle>\}\{<right>\}] 行頭形〜.
193 既定値は\ \verb+{0}{1}{1}+ である.
194 \item[stretchend=\{<left>\}\{<middle>\}\{<right>\}] 行末形〜.
195 既定値は\ \verb+{1}{1}{0}+ である.
196
197 \item[maxmargin=<real>] 親文字の方がルビより長い時に,ルビの先頭と親文字の先頭,及び
198 ルビ末尾と親文字の末尾の間に許される最大の空白量.\textbf{親文字全角単位}で指定し,既定値は0.5.
199
200 \medskip
201 \item[size=<real>] ルビ文字の親文字に対する大きさ.既定値は0.5.
202 \item[intergap=<real>] ルビ文字と親文字との空きを親文字全角単位で指定.既定値は0.
203 \item[rubysmash=<bool>] ルビの高さを0にするか.既定値は偽.次が例である.
204 \begin{LTXexample}[width=0.3\textwidth]
205 \ \vrule width 0pt height 2\zw depth 1\zw
206 \frame{\ltjruby[rubysmash=false]{本}{ほん}}\ 
207 \frame{\ltjruby[rubysmash=true]{本}{ほん}}\ 
208 \frame{\ltjruby[rubysmash=false,intergap=0.2]
209   {本}{ほん}}\ 
210 \frame{\ltjruby[rubysmash=true,intergap=0.2]
211   {本}{ほん}}\ 
212 \frame{\ltjruby[rubysmash=false,intergap=-1.5]
213   {本}{ほん}}
214 \end{LTXexample}
215
216
217 \item[kenten=<command>]各文字につく圏点の出力命令を指定する.既定値は「\verb+\ltjalchar`•+」
218 であり,\texttt{U+2022} (Bullet)を\textbf{ALchar}として出力することを指定している.
219 \item[fontcmd=<command>]ルビ用のフォント切り替え命令を指定する.
220
221 \end{description}
222
223 \medskip
224 次の2つは,以上で説明した複数のオプションを一度に設定するためのものである.
225 普通はこの2つのうちいずれかを設定するだけで足りるだろう.
226
227 \begin{description}
228 \def\makelabel#1{\tt#1}
229 \item[naka] 以下のオプションを同時に設定する.主に中付きルビを組むときに用いる.
230 \begin{verbatim}
231 mode=1, stretch={1}{2}{1}, stretchruby={1}{2}{1}
232 \end{verbatim}
233 \item[kata] 同様に,肩付きルビ用に,次を設定する.
234 \begin{verbatim}
235 mode=9, stretch={1}{2}{1}, stretchruby={0}{0}{1}
236 \end{verbatim}
237 \end{description}
238
239 \paragraph{\tt\textbackslash ltjsetruby\{<option>\}}
240 <option>の既定値を指定する.\texttt{luatexja-ruby} 読み込み時の値は
241 各項目の所で既に説明してあるが,
242 \begin{verbatim}
243   pre = -1, post = -1, mode = 1, 
244   stretchruby={1}{2}{1}, stretch = {1}{2}{1},
245   stretchhead = {0}{1}{1}, stretchend = {1}{1}{0},
246   maxmargin=0.5, size = 0.5, intergap=0, rubysmash = true, 
247   kenten=\ltjalchar`•, fontcmd=\relax
248 \end{verbatim}
249 であり,中付きルビで組まれることになっている.
250
251 \paragraph{\texttt{\textbackslash ltjsetparamater} に追加されるキー}
252 \begin{description}
253 \item[\textsf{rubypreintrusion}\tt =\{<chr\_code>, <pre\_int>\}]
254 文字<chr\_code> に,その\textbf{直後}のルビによって掛けられるルビ文字列の最大長をルビ全角単位で指定.
255 \item[\textsf{rubypostintrusion}\tt =\{<chr\_code>, <post\_int>\}]
256 文字<chr\_code> に,その\textbf{直前}のルビによって掛けられるルビ文字列の最大長をルビ全角単位で指定.
257 \end{description}
258 既定値は,\textsf{rubypreintrusion},~\textsf{rubypostintrusion}とも
259 以下の文字に対しては1,その他の文字については0である:
260 \begin{quote}
261  平仮名(\texttt{U+3040}--\texttt{U+309F}),カギ括弧「」,読点「,」「、」,中黒「・」
262 \end{quote}
263
264 \paragraph{\texttt{\textbackslash ltjkenten}}
265 圏点を出力する命令で,\verb+\kenten+ という別名を定義している.
266 \begin{quote}
267  \tt \textbackslash ltjkenten[<option>]{親文字}
268 \end{quote}
269 のように使用する.複数文字に圏点をつける場合でも,\verb+\ltjruby+ のように「\texttt{|}」を使って
270 文字を区切る\textbf{必要はない}ことに注意してほしい.
271
272 圏点として出力される文字は \texttt{kenten} キーによって指定し,
273 圏点自身の大きさは(ルビと同様に)\texttt{size} キーで指定する.
274
275 \newpage
276
277 \section{注意点}
278 \begin{description}
279 \item[ルビ文字のはみ出し]
280 「日本語組版処理の要件」の図3.82のように,
281 ルビ文字のはみ出しが繋がらないようにする処理について述べる:例えば,
282 \begin{center}\Large
283 \ltjsetparameter{rubypreintrusion={`◆,1}, 
284   rubypostintrusion={`◆,1}}
285 \ltjruby{陵}{りよう}◆\ltjruby{陵}{みささぎ}
286 \end{center}
287 において,後者の「\ltjruby{陵}{みささぎ}」のルビが前の「◆」にかかる量は次のように決まる:
288 \begin{enumerate}
289 \item 1回目の実行では,行分割前に「\ltjruby{陵}{りよう}」の後側進入量は前もって知ることはでき
290       ない.なので,「\ltjruby{陵}{りよう}」は行中形で組まれるものとして
291 「\ltjruby{陵}{みささぎ}」前側進入許容量は
292 \[
293  \underbrace{0.5\,\mathrm{zw}}_{\text{元々の許容量}}
294 -\underbrace{0.25\,\mathrm{zw}}_{\text{前のルビの後側進入量(行中形)}}=0.25\,\mathrm{zw}
295 \]
296 となる.なお,行分割後,「\ltjruby{陵}{りよう}」が実際に組まれた時に使われた後側進入量は
297 auxファイルに記述される.
298 \item 2回目以降の実行では,auxファイルに保存された「\ltjruby{陵}{りよう}」の後側進入量
299 を用いて,「\ltjruby{陵}{みささぎ}」前側進入許容量を
300 \[
301  \underbrace{0.5\,\mathrm{zw}}_{\text{元々の許容量}}
302 -\underbrace{0.25\,\mathrm{zw}}_{\text{前のルビの後側進入量 (from aux)}}=0.25\,\mathrm{zw}
303 \]
304 と計算する.
305 \end{enumerate}
306 auxファイルに保存する際,各 \verb+\ltjruby+ 命令の呼び出しを識別するキーが必要になるが,
307 そのキーとしては単純に「何個目の \verb+\ltjruby+ 命令か」である.
308
309 \item[可動グループルビの制限] 
310 実装方法の都合上,ルビの直前・直後・途中で2箇所以上の改行が起きる場合
311 (以下のパーツの組み方が出てくる)に対応できない.
312 \begin{center}\small
313 \begin{tabular}{ll}
314 \toprule
315 \multicolumn{1}{c}{\sf 組み方}&\multicolumn{1}{c}{\sf サンプル}\\
316 \midrule
317 単独1&
318 \huge
319 \vrule{\color{blue}\gt\ltjruby[]{流}{りゆう}}\vrule\\
320 単独2&
321 \huge
322 \vrule{\color{blue}\gt\ltjruby[]{暢}{ちよう}}\vrule\\
323 単独$(1+2)$&
324 \huge
325 \vrule{\color{blue}\gt\ltjruby[stretch=010]{流|暢}{りゆう|ちよう}}\vrule\\
326 \bottomrule
327 \end{tabular}
328 \end{center}
329
330 \newpage
331 \item[段落末尾のルビ]\ 
332 \begin{itemize}
333 \item 段落がルビで終わった場合,そのルビが行末形で組まれることはない.
334 これは,段落の「本当の」末尾には \verb+\penalty10000\parfillskip+ があるためで,
335 ルビ処理用に作った最後のグルー(下の説明では$g_2$)が消去されないことによる.
336
337 \verb+\parfillskip+ の長さ(や,場合によっては \verb+\rightskip+)を実測し,
338 それによって処理を変えるのも可能だが,そのようなことはしなかった.
339 段落がルビで終わることは普通ない(最低でも句点が続くだろう)と思うからである.
340 \end{itemize} 
341
342 \item[段落先頭のルビ]
343 同様に,段落先頭のルビは行頭形にはならず,また
344 \texttt{pre}が負(つまり,自動指定)のときは段落最初のインデント部分への進入は行わない.
345 \begin{LTXexample}
346 \parindent1\zw\noindent 012345\par
347 \ltjruby{陵}{みささぎ}は……\par
348 \ltjruby[pre=1]{陵}{みささぎ}は……
349 % 手動で指定するのはOK
350 \end{LTXexample}
351
352
353 \end{description}
354
355 \section{実装の大まかな方法}
356 次の例で説明する.
357 \begin{LTXexample}
358 ……を\ltjruby{流|暢}{りゆう|ちよう}に……
359 \end{LTXexample}
360
361 \begin{enumerate}
362 \item \verb|\ltjruby|コマンド自体は,一旦次のnode listを値とするwhatsit~$W$を作って,
363 現在の水平リストへと挿入する(必要ならば\verb|\leavevmode|も実行):
364 \[
365  \Node{whatsit $w$}{value: 2}\longrightarrow 
366  \Node{hlist $s_1$}{「りゆう」}\longrightarrow
367  \Node{hlist $p_1$}{「流」}\longrightarrow
368  \Node{hlist $s_2$}{「ちよう」}\longrightarrow
369  \Node{hlist $p_2$}{「暢」}
370 \]
371 ここで,最初の$w$の値2は,ルビが2つのパーツ「\ltjruby{流}{りゆう}」「\ltjruby{暢}{ちよう}」からなっていることを
372 表している.この値を$\mathit{cmp}$とおこう.
373 $s_i$達の中の文字は既にルビの大きさである.
374 \item \LuaTeX-jaの和文処理グルー挿入処理において,
375 このwhatsit~$W$はまとめて
376 「先頭が『流』,最後が『暢』であるようなhboxを \verb|\unhbox| で展開したもの」と扱われる.
377 言い換えれば,ルビ部分を無視した単なる「流暢」という和文文字の並びとして扱われる\footnote{「流」「暢」の間のグルーは既に入っている,と扱われる.}.
378 次のサンプルを参照
379 \begin{LTXexample}
380 \leavevmode\hbox{.}A\\
381 %↑xkanjiskip 
382 \ltjruby{.}{}A
383 %↑2分
384 \end{LTXexample}
385 \item 和文処理グルーの挿入が終わった後で,可動グループルビのためのノードの挿入に入る.
386 \begin{enumerate}
387 \item $W$の前後に$2\mathit{cmp}+1=5$個のノードが挿入され,$W$の周辺は次のようなノード列になる.
388 \begin{align*}
389  (\text{other nodes})&\longrightarrow
390  \Node{glue $g_0$}{}\longrightarrow \Node{whatsit~$W$}{元からある}\longrightarrow \Node{rule $r_1$}{}
391 \\&\longrightarrow
392  \Node{glue $g_1$}{}\longrightarrow \Node{rule $r_2$}{}\longrightarrow 
393  \Node{glue $g_2$}{}\longrightarrow (\text{other nodes})
394 \end{align*}
395
396 \item このようにノードを挿入する目的は,\TeX の行分割処理自体に影響を加えずに可動グループルビ
397 を実現させることにある.
398 \begin{gather*}
399  (\text{other nodes})\longrightarrow
400  \Node{glue $g_0$}{}\longrightarrow \Node{whatsit~$W$}{元からある}\longrightarrow \Node{rule $r_1$}{}\\
401 \noalign{\hrulefill 行の境目\hrulefill}
402 \Node{rule $r_2$}{}\longrightarrow 
403  \Node{glue $g_2$}{}\longrightarrow (\text{other nodes})
404 \end{gather*}
405 のようになったとしたら,「\ltjruby{流}{りゆう}」「\ltjruby{暢}{ちよう}」の間で行分割が起きた,ということがわかり,
406 $g_i$,~$r_i$達のノードを適切に置き換えればよい(後で詳しく説明する).
407
408 \item なお,$r_i$達の高さ・深さは組み上がった後のそれである.
409 $g_i$,~$r_i$達の幅は,以下の対応に沿って算出する.
410
411 \begin{center}\small
412 \begin{tabular}{cllll}
413 \toprule
414 \multicolumn{1}{c}{\sf node名}&\multicolumn{1}{c}{\sf 組み方}&\multicolumn{1}{c}{\sf サンプル}%
415 &\multicolumn{1}{c}{\sf 対応するノード並び}\\
416 \midrule
417 $n_1$&行末1グループ&
418 \Large
419 \fbox{を}{\color{blue}\gt\ltjruby[pre=1,mode=5,stretch=110]{流}{りゆう}}\vrule
420 &
421 $g_0\rightarrow W\rightarrow r_1$\\
422 $n_2$&行末2グループ&
423 \Large
424 \fbox{を}{\color{blue}\gt\ltjruby[pre=1,mode=1,stretch=110]{流|暢}{りゆう|ちよう}}\vrule
425 &
426 $g_0\rightarrow W\rightarrow r_1\rightarrow g_2 \rightarrow r_2$\\
427 $n_3$&行頭1グループ&
428 \Large
429 \vrule{\color{blue}\gt\ltjruby[post=1,mode=1,stretch=011]{暢}{ちよう}}\fbox{に}
430 &
431 $r_2\rightarrow g_2$\\
432 $n_4$&行頭2グループ&
433 \Large
434 \vrule{\color{blue}\gt\ltjruby[post=1,mode=1,stretch=011]{流|暢}{りゆう|ちよう}}\fbox{に}
435 &
436 $W\rightarrow r_1\rightarrow g_2 \rightarrow r_2\rightarrow g_2$\\
437 $n_5$&行中&
438 \Large
439 \fbox{を}{\color{blue}\gt\ltjruby[post=0.5,pre=0.5,mode=1]{流|暢}{りゆう|ちよう}}\fbox{に}
440 &
441 $g_0\rightarrow W\rightarrow r_1\rightarrow g_2 \rightarrow r_2\rightarrow g_2$\\
442
443 \bottomrule
444 \end{tabular}
445 \end{center}
446
447 \medskip
448
449 例えばこの場合,$n_5$に対して
450 \[
451  g_0+r_1+g_2+r_2+g_2 = 3\,\mathrm{zw}-(0.25\,\mathrm{zw}\times 2)=2.5\,\mathrm{zw}
452 \]
453 という方程式が立つ(zwは親文字全角の幅,進入量込).
454 $n_1$から$n_5$まで計5本の方程式が立つが,これらはGau\ss の消去法で解くことができて
455 $g_i$,~$r_i$達の幅が求まる.
456 \item また,ルビ処理を統括しているwhatsit~$W$の値も
457 \[
458  \Node{whatsit $w$}{value: 2}\longrightarrow 
459  \Node{vlist $n_1$}{末1}\longrightarrow
460  \Node{vlist $n_2$}{末2}\longrightarrow
461  \Node{vlist $n_3$}{頭1}\longrightarrow
462  \Node{vlist $n_4$}{頭2}\longrightarrow
463  \Node{vlist $n_5$}{中}
464 \]
465 に置き換えておく.
466
467 \end{enumerate}
468
469 \item \LuaTeX の行分割処理を普通に行う.
470 \item 行分割の結果に従って,$g_i$,~$r_i$達を適切に置換する.
471
472 例えば行分割の結果
473 \begin{gather*}
474  (\text{other nodes})\longrightarrow
475  \Node{glue $g_0$}{}\longrightarrow \Node{whatsit~$W$}{元からある}\longrightarrow \Node{rule $r_1$}{}
476   \tag{行A}\\
477 \noalign{\hrulefill 行の境目\hrulefill}
478 \Node{rule $r_2$}{}\longrightarrow 
479  \Node{glue $g_2$}{}\longrightarrow (\text{other nodes})\tag{行B}
480 \end{gather*}
481 のようになったとしよう.
482 \begin{enumerate}
483 \item 処理は段落の上の行から順番に行われる.行Aの処理がまわってきたとしよう.
484
485 \item 行Aの先頭から順番に眺めていく.すると「whatsit~$W$由来」のノード,$g_0$,~$W$,~$r_1$が見つかり,
486 行Aはここで終わっている.
487
488 まず,行Aのhboxの中身からwhatsit~$W$を消去(リストから取り除くだけで,$W$のメモリを解放するわけではない)する.
489 $g_0$,~($W$,)~$r_1$というノードの並びは,「行末1グループ」$n_1$に対応しているので,
490 $g_0$,~$r_1$を行Aから除去・メモリ解放し,代わりに$n_1$を行Aの中身に追加する.
491
492 \item 次に行Bの処理にうつる.行Aでルビの処理は完了していない(2パーツのルビなのにまだ1パーツ目しか使っていないからである)ので,
493 「whatsit~$W$由来」のノードがいくつか残っているはずである.
494
495 案の定,$r_2$,~$g_2$というノード列が見つかった.これは「行頭1グループ」$n_3$に対応しているので,
496 $r_2$,~$g_2$を行Bから除去・メモリ解放し,代わりに$n_3$を行Bの中身に挿入する.
497
498 \item これで2パーツとも使い切ったことになるので,
499 隔離しておいた$W$を,(使われなかった$n_2$,~$n_4$,~$n_5$などと共に)メモリ解放する.結果として
500 次のようになった:
501 \begin{gather*}
502  (\text{other nodes})\longrightarrow
503  \Node{vlist $n_1$}{末1}\tag{行A}\\
504 \noalign{\hrulefill 行の境目\hrulefill}
505 \Node{vlist $n_3$}{頭1}\longrightarrow (\text{other nodes})\tag{行B}
506 \end{gather*}
507 \end{enumerate}
508 \end{enumerate}
509
510 \newpage
511 \section{いくつかの例}
512 \def\ltjrubytest{\ltjruby{黄金橋}{ゴールデンゲートブリッジ}\relax}
513
514 \setbox0=\vbox{\hsize=22\zw%
515 ああああ\ltjrubytest いうえおかきくけこ
516 あ\ltjrubytest いうえおかきくけこ
517 あ\ltjrubytest いうえおかきくけこ
518 あ\ltjrubytest いうえおかきくけこ
519 あ\ltjrubytest いうえおかきくけこ
520 あ\ltjrubytest いうえおかきくけこ}
521 %\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)}
522 \fbox{\box0}
523
524 \def\ltjrubytest{\ltjruby{国府津}{こうづ}\relax}
525 % グループルビ
526
527 \setbox0=\vbox{\hsize=18\zw%
528 あ\ltjrubytest いうえおかきくけこ
529 あ\ltjrubytest いうえおかきくけこ
530 あ\ltjrubytest いうえおかきくけこ
531 あ\ltjrubytest いうえおかきくけこ
532 あ\ltjrubytest いうえおかきくけこ
533 あ\ltjrubytest いうえおかきくけこ}
534 %\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)}
535 \fbox{\box0}
536
537 \def\ltjrubytest{\ltjruby{●●|◆}{◆◆◆◆◆◆|●●●}\relax}
538 \setbox0=\vbox{\hsize=19\zw%
539 あ\ltjrubytest いうえおかきくけこ
540 あ\ltjrubytest いうえおかきくけこ
541 あ\ltjrubytest いうえおかきくけこ
542 あ\ltjrubytest いうえおかきくけこイ
543 あ\ltjrubytest いうえおかきくけこ
544 あ\ltjrubytest いうえおかきくけこウ
545 あ\ltjrubytest いうえおかきくけこエ
546 あ\ltjrubytest いうえおかきくけこ
547 あ\ltjrubytest いうえおかきくけこ
548 あ\ltjrubytest いうえおかきくけこ}
549 %\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)}
550 \fbox{\box0}
551
552 \def\ltjrubytest{\ltjruby{●●|□}{◆◆◆|●●●}\relax}
553 \setbox0=\vbox{\hsize=19\zw%
554 あ\ltjrubytest いうえおかきくけこ
555 あ\ltjrubytest いうえおかきくけこ
556 あ\ltjrubytest いうえおかきくけこ
557 あ\ltjrubytest いうえおかきくけこイ
558 あ\ltjrubytest いうえおかきくけこ
559 あ\ltjrubytest いうえおかきくけこウ
560 あ\ltjrubytest いうえおかきくけこエ
561 あ\ltjrubytest いうえおかきくけこ
562 あ\ltjrubytest いうえおかきくけこ
563 あ\ltjrubytest いうえおかきくけこ}
564 %\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)}
565 \fbox{\box0}
566
567 \def\ltjrubytest{\ltjruby{異|様}{い|よう}\relax}
568 \setbox0=\vbox{\hsize=19\zw%
569 あ\ltjrubytest いうえくけ
570 あ\ltjrubytest いうえくけこ
571 あ\ltjrubytest いうえくけこ
572 あ\ltjrubytest いうえくけこイ
573 あ\ltjrubytest いうえおかきくけこ}
574 %\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)}
575 \fbox{\box0}
576
577 \def\ltjrubytest{\ltjruby{□|■|□}{■■|□□□|■■}\relax}
578
579 \setbox0=\vbox{\hsize=23\zw%
580 あ\ltjrubytest いうえおかきくけこうえおかきくけこ
581 あ\ltjrubytest いうえおかきくけこうえおかきくけこ
582 あ\ltjrubytest いう□おかきくけこうえおかきくけこ
583 あ\ltjrubytest いう□おかきくけこうえおかきくけこ
584 あ\ltjrubytest いう□おかきくけこうえおかきくけこ
585 あ\ltjrubytest いうえおかきくけこ}
586 \fbox{\box0}
587
588 \begin{description}
589 \def\sample{又\ltjruby{承}{うけたまわ}る\quad \ltjruby{疎}{そ}\quad は\ltjruby{俄}{にわか}勉強
590   \quad 後\ltjruby{俄}{にわか}勉強\quad は\ltjruby{暁}{あかつき}に
591   は\ltjruby{俄}{にわか}に
592   \quad \ltjruby{休|憩|中}{きゆう|けい|ちゆう}かつ\ltjruby{視|聴|中}{し|ちよう|ちゆう}}
593 \item[標準] \sample
594 \item[肩つき] {\kata\sample}
595 \item[親文字均等割禁止] {\ltjsetruby{stretch=101}\sample}
596 \end{description}
597
598 \textgt{\ltjruby{勉|強}{べん|きよう}\ltjruby[fontcmd=\mcfamily]{勉|強}{べん|きよう}}
599
600 \newpage
601 \section{「日本語組版処理の要件」20120403の例}
602
603 \obeylines\newcommand*{\噂}{\CID{7642}}
604 %================================== 横組
605 \paragraph{3.3.1節}\ \par
606 3.49 \ltjruby{君|子}{くん|し}は\ltjruby{和}{わ}して\ltjruby{同}{どう}ぜず
607 3.50 \ltjruby{人}{ひと}に\ltjruby{誨}{おし}えて\ltjruby{倦}{う}まず\par% 中付き
608 3.51 \ltjruby{鬼}{き}\ltjruby{門}{もん}の\ltjruby{方}{ほう}\ltjruby{角}{がく}を% モノ中付き
609 \ltjruby{凝}{ぎょう}\ltjruby{視}{し}する
610 3.52 \ltjruby{鬼|門}{き|もん}の\ltjruby{方|角}{ほう|がく}を% 熟語(グループ扱い)
611 \ltjruby{凝|視}{ぎよう|し}する
612 3.53 \ltjruby{茅場町}{かやばちよう}\quad\ltjruby{茅場}{かやば}\ltjruby{町}{ちよう}\par% 複合語
613 % 3.53右の説明はこれでいいのか?
614 3.54 \ltjruby{紫陽花}{あじさい}\quad\ltjruby{坩堝}{るつぼ}\quad\ltjruby{田舎}{いなか}\par% 熟字訓 
615 3.55 \ltjruby{模型}{モデル}\quad\ltjruby{顧客}{クライアント}\quad% カタカナルビ
616 \ltjruby{境界面}{インターフエース}\quad\ltjruby{避難所}{アジール}
617 3.56 \ltjruby{編集者}{editor}\quad \ltjruby{editor}{エディター}% 欧文
618
619 \paragraph{3.3.3節}\ \par
620 3.58 に\ltjruby{幟}{のぼり}を\quad{\kata に\ltjruby{幟}{のぼり}を}%
621   \quad \ltjruby{韋}{い}\ltjruby{編}{へん}\ltjruby{三}{さん}\ltjruby{絶}{ぜつ}
622 3.59 に\ltjruby{幟}{\kanjiseries{mc}\selectfont のぼり}を
623 3.60 \ltjruby{韋}{い}\ltjruby{編}{へん}\ltjruby{三}{さん}\ltjruby{絶}{ぜつ}\quad%
624 {\setkeys[ltj]{ruby}{size=0.4}% 文字サイズ変更
625   \ltjruby{韋}{い}\ltjruby{編}{へん}\ltjruby{三}{さん}\ltjruby{絶}{ぜつ}}
626
627 \paragraph{3.3.4節}\ \par
628 3.61図(両側ルビ)はまだ未サポートにより省略
629
630 \paragraph{3.3.5節 モノルビ}\ \par
631 3.62 の\ltjruby{葯}{やく}に
632 3.63 版面の\ltjruby{地}{ち}に\quad{\kata 版面の\ltjruby{地}{ち}に}
633 3.64× {\kata 版面の\ltjruby{地}{ち}に}(まだ縦組み未サポート)\par% 横組み肩つき
634 3.65 の\ltjruby{砦}{とりで}に\quad{\kata の\ltjruby{砦}{とりで}に}
635 {\kata 3.66上 の\ltjruby{旬}{しゆん}に\quad 後\ltjruby{旬}{しゆん}に
636 3.66下 の\ltjruby{旬}{しゆん}又\quad 後\ltjruby{旬}{しゆん}又\par}
637
638
639 \paragraph{3.3.6節 グループルビ}\ \par
640 3.67 は\ltjruby{冊子体}{コーデツクス}と
641 3.68 \ltjruby{模型}{モデル}\quad \ltjruby{利用許諾}{ライセンス}
642 3.69 {\setkeys[ltj]{ruby}{stretchruby=010}% 両端を揃える流儀
643   \ltjruby{模型}{モデル}\quad \ltjruby{利用許諾}{ライセンス}}
644 3.70 \ltjruby{なげきの聖母像}{ピエタ}←自動調整
645 3.71 \ltjruby{顧客}{クライアント}\quad \ltjruby{境界面}{インターフエース}
646 3.72 {\setkeys[ltj]{ruby}{stretch=010, stretchhead = 010, stretchend = 010}% はみ出さない流儀
647   \ltjruby{顧客}{クライアント}\quad \ltjruby{境界面}{インターフエース}}
648
649
650 \paragraph{3.3.7節 熟語ルビ}\ \par
651 3.73左 \ltjruby{杞|憂}{き|ゆう}\quad \ltjruby{畏|怖}{い|ふ}
652 3.73右 {\kata\ltjruby{杞|憂}{き|ゆう}\quad \ltjruby{畏|怖}{い|ふ}}
653 3.74 の\ltjruby{流|儀}{りゆう|ぎ}を\quad の\ltjruby{無|常}{む|じよう}を\quad%
654 の\ltjruby{成|就}{じよう|じゆ}を\quad
655 3.74 の\ltjruby{紋|章}{もん|しよう}を\quad の\ltjruby{象|徴}{しよう|ちよう}を
656
657 3.75 {\kata の\ltjruby{流|儀}{りゆう|ぎ}を\quad の\ltjruby{無|常}{む|じよう}を\quad%
658 の\ltjruby{成|就}{じよう|じゆ}を\quad 
659 3.75 の\ltjruby{紋|章}{もん|しよう}を\quad の\ltjruby{象|徴}{しよう|ちよう}を}
660
661 3.76× の\ltjruby{流}{りゆう}\ltjruby{儀}{ぎ}を\quad の\ltjruby{無}{む}\ltjruby{常}{じよう}を\quad%
662
663 要調整 3.77\ {\notalign%この図では揃えない
664 \hbox{\vrule\vbox{\hsize=10\zw あああああああの%
665   \ltjruby{流|儀}{りゆう|ぎ}がある.}\vrule}\quad%
666 \textbf{←ルビ中で改行するには?}
667 \hbox{\vrule\vbox{\hsize=5\zw ……の\ltjruby{無|常}{む|じよう}を}\vrule}}
668
669 \paragraph{3.3.8節 ルビはみ出し}\ \par
670 3.78 \ltjruby{人}{ひと}は\ltjruby{死}{し}して\ltjruby{名}{な}を\ltjruby{残}{のこ}す\par% ベタ
671 要調整3.79 漢字の部首には\ltjruby{偏}{へん}・\ltjruby{冠}{かんむり}・\ltjruby{脚}{きやく}・%
672 \ltjruby{旁}{つくり}がある
673 要調整3.79 漢字の部首には\ltjruby{偏}{へん},\ltjruby{冠}{かんむり},\ltjruby{脚}{きやく},%
674 \ltjruby{旁}{つくり}がある
675 3.79 この\ltjruby{\噂}{うわさ}の好きな人は%
676 \ltjruby{懐}{ふところ}ぐあいもよく、\ltjruby{檜}{ひのき}を
677 3.80 漢字の部首には「\ltjruby{偏}{へん}」「\ltjruby{冠}{かんむり}」「\ltjruby{脚}{きやく}」%
678 「\ltjruby{旁}{つくり}」がある
679 3.80 この\ltjruby{\噂}{うわさ}好きな人は\ltjruby{懐}{ふところ}具合もよく、\ltjruby{檜}{ひのき}材を
680 3.81× に\ltjruby{暁}{あかつき}の\kern-1\zw の\ltjruby{趣}{おもむき}を
681 3.82 に\ltjruby{暁}{あかつき}の\ltjruby{趣}{おもむき}を
682 {%
683   \ltjsetparameter{rubypostintrusion={`好,0.5}}
684   \ltjsetparameter{rubypostintrusion={`具,0.5}}
685   \ltjsetparameter{rubypostintrusion={`材,0.5}}
686 3,83 この\ltjruby{\噂}{うわさ}の好きな人は\ltjruby{懐}{ふところ}ぐあいもよく、\ltjruby{檜}{ひのき}を
687 3.83 この\ltjruby{\噂}{うわさ}好きな人は\ltjruby{懐}{ふところ}具合もよく、\ltjruby{檜}{ひのき}材を
688 }
689 {\catcode`\<12%
690   \makeatletter\count@="3040\loop\relax\ifnum \count@<"30A0%
691   \ltjsetparameter{rubypreintrusion={\the\count@,0}, %
692     rubypostintrusion={\the\count@,0}}%
693   \advance\count@1 \repeat
694 3.84 この\ltjruby{\噂}{うわさ}の好きな人は\ltjruby{懐}{ふところ}ぐあいもよく、\ltjruby{檜}{ひのき}を
695 3.84 この\ltjruby{\噂}{うわさ}好きな人は\ltjruby{懐}{ふところ}具合もよく、\ltjruby{檜}{ひのき}材を
696 }
697 要調整3.85\ {\notalign%この図では揃えない
698 \hbox{\vrule\vbox{\hsize=15\zw% なぜ行末形にならない!
699 あああああああああああああの\ltjruby{徑}{こみち}\penalty-1000をあああああああ%
700 あああああああああああああああああいの\ltjruby{徑}{こみち}ああ}\vrule}}%
701 \textbf{なぜ行末形にならない}
702
703 3.86\ %
704 \hbox{\vrule\vbox{\hsize=15\zw
705 ああああああああああああの\ltjruby{徑}{こみち}をあああああああ%
706 あああああああ\ltjruby{徑}{こみち}を}\vrule}
707
708 3.87\ %
709 \hbox{\vrule\vbox{\hsize=15\zw%
710 ああああああああああああの\ltjruby{飾り}{アクセサリー}等あああああああ%
711 あああああああああああああああ共\ltjruby{飾り}{アクセサリー}あ.}\vrule}
712
713
714 \paragraph{圏点の例(常用漢字表前書きより)}
715 この表は,法令,公⽤⽂書,新聞,雑誌,放送など,⼀般の社会⽣活におい%
716 て\kenten[kenten=﹅]{現代の国語を書き表す}場合の\kenten{漢字使⽤の⽬安を⽰す}ものである。
717
718 \newpage
719 {\Large 以下は要調整}
720
721 \paragraph{F.1--2節}\ \par
722
723 F.01 {\kata\ltjruby{治|癒}{ち|ゆ}\quad\ltjruby{模|索}{も|さく}\quad%
724 \ltjruby{遷|移}{せん|い}\quad\ltjruby{混|沌}{こん|とん}}
725 F.01中 \ltjruby{治|癒}{ち|ゆ}\quad\ltjruby{模|索}{も|さく}\quad%
726 \ltjruby{遷|移}{せん|い}\quad\ltjruby{混|沌}{こん|とん}
727
728 F.02 \ltjruby{橋|頭|堡}{きよう|とう|ほ}
729
730 F.03 {\kata\ltjruby{凝|視}{ぎよう|し}\quad\ltjruby{調|理|師}{ちよう|り|し}\quad%
731 \ltjruby{思|春|期}{し|しゆん|き}\quad\ltjruby{管|状|花}{かん|じよう|か}\quad%
732 \ltjruby{蒸|気|船}{じよう|き|せん}}
733 F.03 \ltjruby{凝|視}{ぎよう|し}\quad\ltjruby{調|理|師}{ちよう|り|し}\quad%
734 \ltjruby{思|春|期}{し|しゆん|き}\quad\ltjruby{管|状|花}{かん|じよう|か}\quad%
735 \ltjruby{蒸|気|船}{じよう|き|せん}
736
737 F.04 {\kata\ltjruby{未|熟}{み|じゆく}\quad\ltjruby{法|華|経}{ほ|け|きよう}\quad%
738 \ltjruby{顕|微|鏡}{けん|び|きよう}\quad\ltjruby{課|徴|金}{か|ちよう|きん}\quad%
739 \ltjruby{古|戦|場}{こ|せん|じよう}}
740 F.04 \ltjruby{未|熟}{み|じゆく}\quad\ltjruby{法|華|経}{ほ|け|きよう}\quad%
741 \ltjruby{顕|微|鏡}{けん|び|きよう}\quad\ltjruby{課|徴|金}{か|ちよう|きん}\quad%
742 \ltjruby{古|戦|場}{こ|せん|じよう}
743
744 F.05 の\ltjruby{峻|別}{しゆん|べつ}は
745
746 F.06以降は未チェック
747
748 \end{document}