1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
|
%#! luajitlatex
%%% a test of ruby.
\documentclass[a4paper,10pt]{ltjsarticle}
\usepackage{luatexja-otf,amsmath}
\usepackage[match]{luatexja-fontspec}
\usepackage[kozuka-pr6n]{luatexja-preset}\normalsize
\def\emph#1{\textbf{\textgt{#1}}}
\def\headfont{\normalfont\bfseries\gtfamily}
\setmonojfont{KozGoPr6N-Regular.otf}
\usepackage[textwidth=45\zw, lines=45, footskip=6mm]{geometry}
\advance\leftmargini-1\zw\advance\leftmarginii-1\zw
\usepackage{luatexja-ruby,showexpl,booktabs}
\lstset{
preset=\normalsize, basicstyle=\small\ttfamily, basewidth=0.5em,
explpreset={numberstyle=\tiny, numbers=left, numbersep=1em, columns=fixed},
}
\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{\hrule height.4pt}\strut#2\cr}}}}\,}}
\def\LuaTeX{Lua\TeX}
% 三分ルビ用
\DeclareFontShape{JY3}{mc}{mc}{n}{<-> [0.92487]
KozMinPr6N-Regular:extend=0.67;jfm=ujisc33}{}
\title{\texttt{luatexja-ruby.sty}}
\begin{document}
\catcode`\<=13
\def<#1>{{\normalfont\rm\itshape$\langle$#1\/$\rangle$}}
%\fontsize{13.19873}{15}\selectfont%
\maketitle
\begin{abstract}
\texttt{luatexja-ruby.sty} は,\LuaTeX-jaの機能を利用してルビの組版処理を行う追加パッケージである.
\LuaTeX, \LuaTeX-jaの内部処理に割り込むことにより,熟語ルビ中の行分割や,
行頭形・行中形・行末形の自動検出,また進入許容量の自動設定などを可能とした.
\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}{\texttt{pxrubrica}\ パッケージ}%
での用法に準ずる.
\begin{quotation}
進入あり:と\ltjruby{暁}{あかつき}の
進入なし:{\setkeys[ltj]{ruby}{mode=0}と\ltjruby{暁}{あかつき}の}
突出あり:{\setkeys[ltj]{ruby}{stretch={1}{2}{1}}\ltjruby{聴衆}{ちようしゆう}}
突出なし:{\setkeys[ltj]{ruby}{stretch={0}{2}{0}}\ltjruby{聴衆}{ちようしゆう}}
\end{quotation}
\subsection{\ruby{命|令}{めい|れい}}
\paragraph{\tt\textbackslash ltjruby}
ルビ出力用命令の本体.\verb+\ruby+ という別名を定義している.
\begin{quote}
\tt \textbackslash ltjruby[<option>]\{親|文|字\}\{おや|も|じ\}
\end{quote}
のように使用する.
第2・第3引数内の「\verb+|+」はグループの区切りを表す.詳細は\ref{ssec:grp}\nobreak 小節を参照.
<option>には以下の内容をkey-valueリストで指定可能である:
\begin{description}
\def\makelabel#1{\tt#1}
\item[pre=<real>] 前進入許容量をルビ全角単位で指定.
負の長さを指定した場合は,ルビの状況や直前の文字に応じた自動指定を意味する.
既定値は負(つまり,自動指定).
\item[post=<real>] 同様に,後進入許容量を指定する.既定値は負(自動指定).
\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$が異なった場合,
そのまま処理する場合は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}
\end{description}
\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>\}] 行頭形〜.
既定値は\ \verb+{0}{1}{1}+ である.
\item[stretcheol=\{<left>\}\{<middle>\}\{<right>\}] 行末形〜.
既定値は\ \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[kenten=<command>]各文字につく圏点の出力命令を指定する.既定値は「\verb+\ltjalchar`•+」
であり,\texttt{U+2022} (Bullet)を\textbf{ALchar}として出力することを指定している.
\item[fontcmd=<command>]ルビ用のフォント切り替え命令を指定する.
このキーの内容が実行された後に\ \verb+\fontsize...\selectfont+\ が実行されるので,
このキーの指定では最後に\ \verb+\selectfont+ を加える必要はない.
この \texttt{fontcmd} キーの内容は多くの回数実行される.
例えば,\texttt{luatexja-fontspec}パッケージを用いてOpenTypeフォントを用いる場合,
\begin{lstlisting}
fontcmd=\addjfontfeatures{Style=Ruby}
\end{lstlisting}
のようにしてルビ用字形を用いることが可能だが,現在の実装ではタイプセットに時間がかかるようになる.
\end{description}
\medskip
次の2つは,以上で説明した複数のオプションを一度に設定するためのものである.
普通はこの2つのうちいずれかを設定するだけで足りるだろう.
\begin{description}
\def\makelabel#1{\tt#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{\tt\textbackslash ltjsetruby\{<option>\}}
<option>の既定値を指定する.\texttt{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
\end{verbatim}
\paragraph{\texttt{\textbackslash 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{直前}のルビによって掛けられるルビ文字列の最大長をルビ全角単位で指定.
\end{description}
既定値は,\textsf{rubypreintrusion},~\textsf{rubypostintrusion}とも
以下の文字に対しては1,その他の文字については0である:
\begin{quote}
平仮名(\texttt{U+3040}--\texttt{U+309F}),カギ括弧「」,読点「,」「、」,中黒「・」
\end{quote}
また,ここでは「文字コード$-1$の文字」は,「段落開始の \verb+\parindent+」を表す%
\footnote{通常の\LuaTeX-jaにおける指定では文中数式境界を表していることに注意.}.
この「文字」に対する\textsf{rubypreintrusion}の値も1である.
\paragraph{\texttt{\textbackslash ltjkenten}}
圏点を出力する命令で,\verb+\kenten+ という別名を定義している.
\begin{quote}
\tt \textbackslash ltjkenten[<option>]\{親文字\}
\end{quote}
のように使用する.複数文字に圏点をつける場合でも,\verb+\ltjruby+ のように「\texttt{|}」を使って
文字を区切る\textbf{必要はない}ことに注意してほしい.
圏点として出力される文字は \texttt{kenten} キーによって指定し,
圏点自身の大きさは(ルビと同様に)\texttt{size} キーで指定する.
\subsection{グループの\ruby{指|定}{し|てい}}
\label{ssec:grp}
\begin{quote}
\tt \textbackslash 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}
のように,複数回使用すること.
また,全てのグループにおいて「ルビ文字列の長さは親文字列以下」であれば,
単純グループルビの並びとして扱われる.すなわち,次の2行は全くの等価となる.
\begin{verbatim}
\ltjruby{普|通|車}{ふ|つう|しや}
\ltjruby{普}{ふ}\ltjruby{通}{つう}\ltjruby{車}{しや}
\end{verbatim}
\newpage
複数グループかつ上記の条件を満たさない場合は,
所謂「可動グループルビ」であり,ルビの前後や各グループの切れ目で行分割が可能となる.
例えば
\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}
\begin{tabular}{lll}
\toprule
\Large …の\ltjruby[stretch=110]{表}{ひよう}
\vrule\ltjruby[stretch=010]{現|力}{げん|りよく}\vrule&
\Large \vrule\ltjruby[stretch=010]{表|現}{ひよう|げん}
\vrule\ltjruby[stretch=011]{力}{りよく}は…&
\Large \vrule\ltjruby[stretch=010]{表|現|力}{ひよう|げん|りよく}\vrule\\
\bottomrule
\end{tabular}
\end{center}
などの組み方は\emph{想定していない}.
\end{itemize}
\newpage
\section{\ruby{注|意|点}{ちゆう|い|てん}}
\begin{description}
\item[ルビ文字のはみ出し]
「日本語組版処理の要件」の図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{陵}{りよう}」の後側進入量は前もって知ることはでき
ない.なので,「\ltjruby{陵}{りよう}」は行中形で組まれるものとして
「\ltjruby{陵}{みささぎ}」前側進入許容量は
\[
\underbrace{0.5\,\mathrm{zw}}_{\text{元々の許容量}}
-\underbrace{0.25\,\mathrm{zw}}_{\text{前のルビの後側進入量(行中形)}}=0.25\,\mathrm{zw}
\]
となる.行分割後,「\ltjruby{陵}{りよう}」の実際の後側進入量は
auxファイルに記述される.
\item 2回目以降の実行では,auxファイルに保存された「\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+ 命令の呼び出しを識別するキーが必要になるが,
そのキーとしては単純に「何個目の \verb+\ltjruby+ 命令か」である.
なお,以上の処理は,1行目と2行目を比較すれば分かるように,
「\ltjruby{陵}{みささぎ}」の\emph{前進入許容量指定(\texttt{pre})が自動}になっている場合のみ
実施される.
\item[段落末尾のルビ]
段落がルビで終わった場合,そのルビが行末形で組まれることはない.
これは,段落の「本当の」末尾には \verb+\penalty10000\parfillskip+ があるためで,
ルビ処理用に作った最後のグルー(\ref{sec:impl}\nobreak 節の説明では$g_2$)が消去されないことによる.
\verb+\parfillskip+ の長さ(や,場合によっては \verb+\rightskip+)を実測し,
それによって処理を変えるのも可能だが,そのようなことはしなかった.
段落がルビで終わることは普通ない(最低でも句点が続くだろう)と思うからである.
\item[段落先頭のルビ]
同様に,段落先頭のルビは行頭形にはならない.
\texttt{pre}が負(つまり,自動指定)のとき,段落最初の \verb+\parindent+ 部分への
進入は可能である.\verb+\parindent+ 部分への進入許容量は
「文字$-1$」に対する\textsf{rubypreintrusion}(既定値は1,ルビ全角単位)と
\ \verb+\parindent+ の長さのうち小さい方である.
\begin{LTXexample}[preset=\Large,width=0.4\textwidth]
\parindent1\zw\noindent 012345\par
\ltjruby{陵}{みささぎ}は……\par
\ltjruby{承}{うけたまわ}り……\par
\parindent0.25\zw\ltjruby{陵}{みささぎ}は……
\end{LTXexample}
\end{description}
\newpage
\section{\ruby{実|装}{じつ|そう}について}
\label{sec: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\,\mathrm{zw}-(0.25\,\mathrm{zw}\times 2)=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}
\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}
\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 ああああああああの%
\ruby{流|儀}{りゆう|ぎ}がある.}\vrule}\textbf{←なぜ改行できない}\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[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.82 に\ruby{暁}{あかつき}の\ruby{趣}{おもむき}を
% 漢字にルビを2分まで掛けても良い流儀
{%
\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}
|