summaryrefslogtreecommitdiff
path: root/macros/luatex/generic/luatexja/doc/luatexja-ruby.tex
blob: 7d5226e47c488367c707385a63997fbca25671f6 (plain)
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
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
%#! lualatex
%%% a test of ruby.
\documentclass[a4paper,10ptj]{ltjsarticle}
\usepackage[rgb]{xcolor}
\usepackage{enumitem,mleftright}
\usepackage{luatexja-otf,amsmath,bxghost}
\usepackage[no-math]{fontspec}
\usepackage[match]{luatexja-fontspec}
\usepackage[haranoaji]{luatexja-preset}\normalsize
\setmonojfont{HaranoAjiGothic-Regular.otf}
\usepackage{unicode-math}
\setmathfont{Latin Modern Math}

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

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

\usepackage{hyperref,bookmark,xcolor}
\hypersetup{%
	unicode,
	colorlinks,
	allbordercolors=1 1 1,
	allcolors=blue,
	pdftitle={luatexja-ruby.sty}
}

\def\Node#1#2{\,\vcenter{\hbox{\fboxsep=1pt\fbox{\vbox{\small\halign{\hfil##\hfil\cr
  #1\mathstrut\cr\noalign{\smallskip\hrule height.4pt\smallskip}\strut\<#2\cr}}}}}\,}
\def\LuaTeX{Lua\TeX}

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

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

\begin{document}

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

\maketitle

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

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

\tableofcontents

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

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

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

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

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

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

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

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

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

\item[mode] 進入処理のモードを表すbit vector.下位2\,bitは,\texttt{pre}や
\texttt{post}が負である場合にしか効力を発揮しない.既定値は$(0001)_2 = 1$.
\begin{description}
 \item[bit 0] 前後の\underline{文字への進入}を無効にするならば0,有効にするならば1.
 \item[bit 1] 前進入許容量$B$と後進入許容量$A$が異なった場合,
  そのまま処理する場合は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の自然数で指定する.
既定値は\ \verb+{1}{2}{1}+ である.
<left>はルビ文字の先頭までの空き量,<middle>はルビ文字間の空き量,<right>はルビ文字の末尾からの
空き量(の比)を表す.以下が例である.
\begin{LTXexample}[width=0.3\textwidth, preset=\Large]
\ltjruby[stretchruby=123,maxmargin=2]%
  {◯◯◯◯}{◆◆}
\end{LTXexample}
\item[stretch=\{<left>\}\{<middle>\}\{<right>\}]
行中形でルビ文字の方が長い場合,親文字の前・中・後に入れる空白の割合.
既定値は\ \verb+{1}{2}{1}+ である.それ以外の代表的な値としては,例えば次のようなものがある.
\begin{description}
\item[親文字均等割禁止] \verb+{1}{0}{1}+\ など<middle>を0にした値
\item[前突出禁止] \verb+{0}{1}{1}+
\item[後突出禁止] \verb+{1}{1}{0}+
\end{description}

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

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

\medskip
\item[size=<real>] ルビ文字の親文字に対する大きさ.既定値は0.5.
\item[intergap=<real>] ルビ文字と親文字との空きを親文字全角単位で指定.既定値は0.
\item[rubysmash=<bool>] ルビの高さを0にするか.既定値は偽.次が例である.
\begin{LTXexample}[width=0.3\textwidth, preset=\Large]
\ \vrule width 0pt height 2\zw depth 1\zw
\frame{\ltjruby[rubysmash=false]{本}{ほん}}\ 
\frame{\ltjruby[rubysmash=true]{本}{ほん}}\ 
\frame{\ltjruby[rubysmash=false,intergap=0.2]
  {本}{ほん}}\ 
\frame{\ltjruby[rubysmash=true,intergap=0.2]
  {本}{ほん}}\ 
\frame{\ltjruby[rubysmash=false,intergap=-1.5]
  {本}{ほん}}
\end{LTXexample}
\item[ybaseheight=<real>] 非負の値が指定された場合,
  \emph{縦組以外での}ルビの親文字の高さを全角高さの<real>倍と強制的に固定する.
  負の値が指定された場合は「固定しない」(すなわち,v0.3より前の挙動と同じになる).
  既定値は0.88.
\item[tbaseheight=<real>] \texttt{ybaseheight}と同様だが,こちらは\emph{縦組での}ルビの親文字の高さを指定する.
  既定値は0.5.
\item[baseheight=<real>] \texttt{ybaseheight},\texttt{tbaseheight}を同時に指定したことと同義.
\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+\textbullet+」である.

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

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


\end{description}

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

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

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

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

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

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

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

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


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

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

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

1グループのみのルビ(単純グループルビ)はグループルビとして組まれる.そのため,
もしモノルビを使いたければ,面倒でも
\begin{LTXexample}[width=0.4\textwidth, preset=\Large]
の\ltjruby{紋}{もん}\ltjruby{章}{しよう}が
\end{LTXexample}
のように,複数回使用すること.
また,全てのグループにおいて「ルビ文字列の長さは親文字列以下」であれば,
単純グループルビの並びとして扱われる.すなわち,次の2行は全くの等価となる.
\begin{verbatim}
\ltjruby{普|通|車}{ふ|つう|しや}
\ltjruby{普}{ふ}\ltjruby{通}{つう}\ltjruby{車}{しや}
\end{verbatim}

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

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


\section{\ruby{注|意|点}{ちゆう|い|てん}}
\paragraph{前後からのルビ文字のはみ出し1}
「日本語組版処理の要件」の図117\footnote{2020-08-11版での番号.2012-04-03版では図3.82.}のように,
前後からのルビ文字のはみ出しが繋がらないようにする処理が組み込まれている.

例えば,
\begin{LTXexample}[preset=\Large,width=0.3\textwidth]
\ltjruby{陵}{りよう}と\ltjruby{陵}{みささぎ}\\
\ltjruby{陵}{りよう}と\ltjruby[pre=1]{陵}{みささぎ}
\end{LTXexample} 
において,1行目右側の「\ltjruby{陵}{みささぎ}」のルビが前の「と」にかかる量は次のように決まる:
\begin{enumerate}
\item 1回目の実行では,行分割前に「\ltjruby{陵}{りよう}」の\underline{後文字進入量}は前もって知ることはでき
      ない.そのため,「\ltjruby{陵}{りよう}」は行中形で組まれるものと想定し,
「\ltjruby{陵}{みささぎ}」の前文字進入許容量は
\[
 \underbrace{0.5\,\mathrm{zw}}_{\text{元々の許容量}}
-\underbrace{0.25\,\mathrm{zw}}_{\text{前のルビの\underline{後文字進入量}(行中形)}}=0.25\,\mathrm{zw}
\]
となる.行分割後,「\ltjruby{陵}{りよう}」の実際の\underline{後文字進入量}は
<jobname>\texttt{.ltjruby}ファイルに記述される.
\item 2回目以降の実行では,<jobname>\texttt{.ltjruby}ファイルに保存された「\ltjruby{陵}{りよう}」の\underline{後文字進入量}
を用いて,「\ltjruby{陵}{みささぎ}」の\underline{前文字進入許容量}を次のように計算する:
\[
 \underbrace{0.5\,\mathrm{zw}}_{\text{元々の許容量}}
-\underbrace{0.25\,\mathrm{zw}}_{\text{前のルビの\underline{後文字進入量}(from \texttt{.ltjruby})}}=0.25\,\mathrm{zw}.
\]
\end{enumerate}

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

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


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

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

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

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

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

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

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

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

    ルビとその直後の文字との間に和文処理グルーが挿入された場合も同様である.
    
    \item \texttt{mode}の2番目のビット(bit~1)が0であった場合は,$B$,~$A\leftarrow \min(B,A)$とする.
  \end{enumerate}
  \item 実際の前進入量$b$,後進入量$a$の計算.
  
  ルビ文字の突出量を$x$,
  親文字の文字数を$k+1$,親文字の前に入る空白量・間の空白量・後ろの空白量の比を$p:q:r$とする.
  このとき,\texttt{mode}のbit 2,~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}

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

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

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

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

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

\end{enumerate}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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


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

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