OSDN Git Service

luatexja-ruby v0.6: added mode=100xx
[luatex-ja/luatexja.git] / doc / luatexja-ruby.tex
1 %#! lualatex
2 %%% a test of ruby.
3 \documentclass[a4paper,10ptj]{ltjsarticle}
4 \usepackage[rgb]{xcolor}
5 \usepackage{enumitem,mleftright,pict2e}
6 \usepackage{luatexja-otf,amsmath,bxghost}
7 \usepackage[no-math]{fontspec}
8 \usepackage[match]{luatexja-fontspec}
9 \usepackage[haranoaji]{luatexja-preset}\normalsize
10 \setmonojfont{HaranoAjiGothic-Regular.otf}
11 \usepackage{unicode-math}
12 \setmathfont{Latin Modern Math}
13 %\usepackage{lua-visual-debug}
14
15 \def\emph#1{\textbf{\textgt{#1}}}
16 \def\headfont{\normalfont\bfseries\gtfamily}
17 \def\cs#1{\eghostguarded{\texttt{\textbackslash#1}}}
18 \usepackage[textwidth=45\zw, lines=45, footskip=2\zh]{geometry}
19 \advance\leftmargini-1\zw\advance\leftmarginii-1\zw
20 \protected\def\Param#1{\eghostguarded{\underline{\smash{\textsf{\mdseries #1}}}}}
21
22 \usepackage{luatexja-ruby,showexpl,booktabs}
23 \definecolor{mygreen}{rgb}{0,0.5,0}
24 \lstset{
25   preset=\normalsize, basicstyle=\small\ttfamily, basewidth=0.5em,
26   explpreset={numberstyle=\tiny, numbers=left, numbersep=1em, columns=fixed},
27   morecomment=[l]{\%}, commentstyle=\color{mygreen}
28 }
29 \makeatletter\let\SX@Info=\relax\makeatother
30 \fboxsep=0mm
31
32 \usepackage{hyperref,bookmark,xcolor}
33 \hypersetup{%
34         unicode,
35         colorlinks,
36         allbordercolors=1 1 1,
37         allcolors=blue,
38         pdftitle={luatexja-ruby.sty}
39 }
40 \def\Node#1#2{\,\vcenter{\hbox{\fboxsep=1pt\fbox{\vbox{\small\halign{\hfil##\hfil\cr
41   #1\mathstrut\cr\noalign{\smallskip\hrule height.4pt\smallskip}\strut\<#2\cr}}}}}\,}
42 \def\LuaTeX{Lua\TeX}
43
44 % 三分ルビ用
45 \DeclareFontShape{JY3}{mc}{mc}{n}{<-> [0.92487] 
46   HaranoAjiMincho-Regular:extend=0.67;jfm=ujisc33}{}
47
48 %%%% \ltjruby 内に \texorpdfstring + | 除去を仕込む
49 \RequirePackage{xparse}
50 \makeatletter
51 \def\removevert#1{\if\noexpand#1|%
52     \expandafter\expandafter\expandafter\@firstofone\expandafter{%
53   \else\ifnum0=1}\fi#1%
54     \ifx#1\relax\expandafter\@gobble%
55     \else\expandafter\@firstofone
56     \fi{\expandafter\@firstofone
57   \fi
58   \removevert}}
59 \makeatother
60 \ExplSyntaxOn
61 \cs_set_eq:NN \myorigltjruby \ltjruby
62 \DeclareExpandableDocumentCommand {\ltjruby} { O{} m m } {%
63    \texorpdfstring {
64     \exp_not:n { \myorigltjruby[#1]{#2}{#3} }
65   } {
66     \removevert #2 \relax
67   }
68 }
69 \cs_set_eq:NN \ruby \ltjruby
70 \ExplSyntaxOff
71 %%%%
72
73 \makeatletter
74 \def\figureautorefname{図}
75 \def\HyRef@autoref#1#2{%
76   \begingroup
77     \Hy@safe@activestrue
78     \expandafter\HyRef@autosetref\csname r@#2\endcsname{#2}{#1}%
79   \endgroup\eghostguarded{}%" 欧文ゴースト
80 }
81
82 \title{\textsf{luatexja-ruby}パッケージ}
83 \author{\LuaTeX-jaプロジェクトチーム}
84 \date{\texttt{\csname ver@luatexja-ruby.sty\endcsname}(\today)}
85 \makeatletter
86 \def\mybox#1{\unskip\ {\Large \fboxrule=0.1mm\fboxsep=0mm\fcolorbox{cyan}{white}{\hbox{\<\ltjjachar#1\<}}}\ }
87
88 \begin{document}
89
90 \catcode`\<=13
91 \def<#1>{{\rmfamily\mdseries\itshape$\langle$#1\/$\rangle$}}
92 %\fontsize{13.19873}{15}\selectfont%
93
94 \maketitle
95
96 \begin{abstract}
97 \textsf{luatexja-ruby}パッケージは,\LuaTeX-jaの機能を利用してルビの組版処理を行う追加パッケージである.
98 \LuaTeX, \LuaTeX-jaの内部処理に割り込むことにより,熟語ルビ中の行分割や,
99 行頭形・行中形・行末形の自動検出,また進入許容量の自動設定などを可能とした.
100
101 v0.3より前とは親文字の高さの扱いが変わっている(\texttt{baseheight}キーを参照せよ)ほか,
102 \Param{rubypreintrusion}, \Param{rubypostintrusion}パラメータの初期値が変わっているので注意すること.
103 \end{abstract}
104
105 \tableofcontents
106
107 \newpage
108 \section{\ltjruby{利|用|方|法}{り|よう|ほう|ほう}}
109 パッケージ読み込みは,\verb+\usepackage{luatexja-ruby}+ で良く,
110 必要ならば自動的に\LuaTeX-ja本体を読み込む.
111 plain \LuaTeX でのロードはまだサポートしておらず,
112 \LaTeXe のみサポートしている.
113
114 \subsection{\ltjruby{用|語}{よう|ご}}
115 「進入(intrusion)」「突出(protrusion)」という用語は,
116 \href{http://zrbabbler.sp.land.to/pxrubrica.html}{\textsf{pxrubrica}パッケージ}%
117 での用法に準ずる.
118
119 \begin{quote}
120   進入あり:と\ltjruby{暁}{あかつき}の\\
121   進入なし:と\ltjruby[mode=0]{暁}{あかつき}の\\
122   突出あり:\ltjruby[stretch={1}{2}{1}]{聴衆}{ちようしゆう}\\
123   突出なし:\ltjruby[stretch={0}{2}{0}]{聴衆}{ちようしゆう}
124 \end{quote}
125
126 なお,本パッケージでは親文字と直前・直後の文字の間に0でない和文処理グルー
127 \footnote{JFMで指定されたグルーや,標準の和文間空白(\Param{kanjiskip}),標準の和欧文間空白(\Param{xkanjiskip}).}%
128 がくることも考慮しているため,「\emph{前後の文字への}\underline{進入(許容)量}」と「進入(許容)量」とは異なる可能性がある.
129 この文書では次のように称する:
130 \begin{description}
131   \item[\underline{文字進入量}] 前後の文字へルビ文字が実際にかかる長さ.常に下線を引くことにする.
132   \item[進入量] 前後の文字,およびそれとルビの間の和文処理グルーにかかる長さ
133 \end{description}
134 多くの場合,和文処理グルーは0以上の長さのため,進入量は\underline{文字進入量}以上である.
135
136 例えば次の例では,直前の文字「来」への\underline{前文字進入量}は0であるが,
137 前進入量は(和欧文間空白にかかる分まで含めるので)正である.
138 \begin{quote}
139   \Large
140   本来\ltjruby{foohoge}{\vrule ほげほげふがふが\vrule}においては……\\
141   本来foohogeにおいては……
142 \end{quote}
143
144 また,「親文字全角幅」「親文字全角高さ」という用語は,それぞれ親文字の和文フォントにおける
145 \cs{zw},~\cs{zh}命令で取得できる値を表す.多くの場合は両者は同じ値であるが,いつでもそうであるという保証はない.
146 「ルビ全角幅」「ルビ全角高さ」についても同様である.
147
148 \subsection{\ruby{命|令}{めい|れい}}
149 \label{ssec:ltjruby}
150 \paragraph{\cs{ltjruby}}
151 ルビ出力用命令の本体.\verb+\ruby+ という別名を定義している.
152 \begin{quote}
153 \ttfamily \textbackslash ltjruby[<option>]\{親|文|字\}\{おや|も|じ\}
154 \end{quote}
155 のように親文字→ルビの順序で指定する.
156 第2・第3引数内の「\verb+|+」はグループの区切りを表す.詳細は\ref{ssec:grp}\nobreak 小節を参照.
157
158 \medskip
159 <option>には以下の内容をkey-valueリストで指定可能である.
160 <real>は10進の実数値を表す.<bool>は真偽値\texttt{true}(真)か\texttt{false}(偽)であり,
161 値を省略したときには\texttt{true}の意味になる.
162
163 \begin{description}
164 \def\makelabel#1{\ttfamily\bfseries #1}
165 \item[pre=<real>] \underline{前文字進入許容量}をルビ全角単位で指定.
166 負の長さを指定した場合は,ルビの状況や直前の文字に応じた自動指定を意味する.
167 既定値は負(つまり,自動指定).
168
169 \item[post=<real>] 同様に,\underline{後文字進入許容量}を指定する.既定値は負(自動指定).
170
171 \item[mode] 進入処理のモードを表すbit vector.下位2\,bitは,\texttt{pre}や
172 \texttt{post}が負である場合にしか効力を発揮しない.既定値は$(00001)_2 = 1$.
173 \begin{description}
174  \item[bit 0] 前後の\underline{文字への進入}を無効にするならば0,有効にするならば1.
175  \item[bit 1] 前進入許容量$B$と後進入許容量$A$が異なった場合,
176   そのまま処理する場合は0,小さい方に揃えるならば1.
177  \item[bit 2--4] ルビ文字の突出量から実際の前・後進入量の計算方法を指定する.
178   詳しい計算方法については\ref{ssec:calc_intrusion}\nobreak 小節を参照.
179 \end{description}
180 \item[intrude\_jfmgk=<bool>] 進入量算出の際に,前後のJFMグルーの自然長を考慮するか否か.既定値は真.
181 \item[intrude\_kanjiskip=<bool>] 進入量算出の際に,ルビ前後に挿入される
182   標準の和文間空白(\Param{kanjiskip})の自然長を
183   考慮するか否か.既定値は真.
184 \item[intrude\_xkanjiskip=<bool>] 進入量算出の際に,ルビ前後に挿入される
185   標準の和欧文間空白(\Param{xkanjiskip})の自然長を考慮するか否か.既定値は真.
186 \item[stretchruby=\{<left>\}\{<middle>\}\{<right>\}] 親文字の合計長が
187 ルビ文字の合計長より長い時に,ルビ文字の前・間・後に入れる空白の割合であり,
188 それぞれ0--7の自然数で指定する.
189 既定値は\ \verb+{1}{2}{1}+ である.
190 <left>はルビ文字の先頭までの空き量,<middle>はルビ文字間の空き量,<right>はルビ文字の末尾からの
191 空き量(の比)を表す.以下が例である.
192 \begin{LTXexample}[width=0.3\textwidth, preset=\Large]
193 \ltjruby[stretchruby=123,maxmargin=2]%
194   {◯◯◯◯}{◆◆}
195 \end{LTXexample}
196 \item[stretch=\{<left>\}\{<middle>\}\{<right>\}]
197 行中形でルビ文字の方が長い場合,親文字の前・中・後に入れる空白の割合.
198 既定値は\ \verb+{1}{2}{1}+ である.それ以外の代表的な値としては,例えば次のようなものがある.
199 \begin{description}
200 \item[親文字均等割禁止] \verb+{1}{0}{1}+\ など<middle>を0にした値
201 \item[前突出禁止] \verb+{0}{1}{1}+
202 \item[後突出禁止] \verb+{1}{1}{0}+
203 \end{description}
204
205 \item[stretchbol=\{<left>\}\{<middle>\}\{<right>\}] 行頭形に対する\texttt{stretch}と同様の指定.
206 既定値は\ \verb+{0}{1}{1}+ である.
207 \item[stretcheol=\{<left>\}\{<middle>\}\{<right>\}] 行末形に対する\texttt{stretch}と同様の指定.
208 既定値は\ \verb+{1}{1}{0}+ である.
209
210 \item[maxmargin=<real>] 親文字の方がルビより長い時に,ルビの先頭と親文字の先頭,及び
211 ルビ末尾と親文字の末尾の間に許される最大の空白量.\textbf{親文字全角幅単位}で指定し,既定値は0.5.
212
213 \medskip
214 \item[size=<real>] ルビ文字の親文字に対する大きさ.既定値は0.5.
215 \item[intergap=<real>] ルビ文字と親文字との空きを親文字全角高さ単位で指定.既定値は0.
216 \item[rubysmash=<bool>] ルビの高さを0にするか.既定値は偽.次が例である.
217 \begin{LTXexample}[width=0.3\textwidth, preset=\Large]
218 \ \vrule width 0pt height 2\zw depth 1\zw
219 \frame{\ltjruby[rubysmash=false]{本}{ほん}}\ 
220 \frame{\ltjruby[rubysmash=true]{本}{ほん}}\ 
221 \frame{\ltjruby[rubysmash=false,intergap=0.2]
222   {本}{ほん}}\ 
223 \frame{\ltjruby[rubysmash=true,intergap=0.2]
224   {本}{ほん}}\ 
225 \frame{\ltjruby[rubysmash=false,intergap=-1.5]
226   {本}{ほん}}
227 \end{LTXexample}
228 \item[ybaseheight=<real>] 非負の値が指定された場合,
229   \emph{縦組以外での}親文字の高さを親文字全角高さの<real>倍と強制的に固定する.
230   負の値が指定された場合は「固定しない」(すなわち,v0.3より前の挙動と同じになる).
231   既定値は$0.88$.
232 \item[tbaseheight=<real>] \texttt{ybaseheight}と同様だが,こちらは\emph{縦組での}親文字の高さを指定する.
233   既定値は$0.5$.
234 \item[baseheight=<real>] \texttt{ybaseheight},\texttt{tbaseheight}を同時に指定したことと同義.
235   次の例や\autoref{fig:ruby_vertical}を参照.
236 \begin{LTXexample}[width=0.3\textwidth, preset=\Large]
237 \noindent
238 \ltjruby[baseheight=0.88]{本}{ほん}\ 
239 \ltjruby[baseheight=0.88]{dvi}{ディーヴィーアイ}\\
240 \ltjruby[baseheight=0.5]{本}{ほん}\ 
241 \ltjruby[baseheight=0.5]{dvi}{ディーヴィーアイ}\\
242 \ltjruby[baseheight=0]{本}{ほん}\ 
243 \ltjruby[baseheight=0]{dvi}{ディーヴィーアイ}\\
244 \ltjruby[baseheight=-1]{本}{ほん}\ 
245 \ltjruby[baseheight=-1]{dvi}{ディーヴィーアイ}
246 \end{LTXexample}
247 \item[yrubydepth=<real>] 非負の値が指定された場合,
248   \emph{縦組以外での}ルビの深さをルビ全角の<real>倍と強制的に固定する.
249   負の値が指定された場合は「固定しない」(すなわち,v0.52以前の挙動と同じになる).
250   既定値は$0.12$.
251 \item[trubydepth=<real>] \texttt{yrubydepth}と同様だが,こちらは\emph{縦組での}ルビの深さを指定する.
252   既定値は$0.5$.
253 \item[rubydepth=<real>] \texttt{yrubydepth},\texttt{trubydepth}を同時に指定したことと同義.
254   次の例や\autoref{fig:ruby_vertical}を参照.
255 \begin{LTXexample}[width=0.3\textwidth, preset=\Large]
256 \noindent
257 \ltjruby[rubydepth=0.12]{◆}{ほん}\ 
258 \ltjruby[rubydepth=0.12]{◆}{pdf}\ 
259 \ltjruby[rubydepth=0.12]{◆}{dvi}\\
260 \ltjruby[rubydepth=0]{◆}{ほん}\ 
261 \ltjruby[rubydepth=0]{◆}{pdf}\ 
262 \ltjruby[rubydepth=0]{◆}{dvi}\\
263 \ltjruby[rubydepth=-1]{◆}{ほん}\ 
264 \ltjruby[rubydepth=-1]{◆}{pdf}\
265 \ltjruby[rubydepth=-1]{◆}{dvi}
266 \end{LTXexample}
267
268 \begin{figure}[t]
269   {\centering\fontsize{48}{48}\selectfont\unitlength=\zw
270   \begin{picture}(7,2.5)(-0.5,-0.5)
271     \linethickness{0.4mm}
272     \put(0,0){\makebox(0,0)[l]{\smash{\hbox to 6.5\zw{親文字$\int_0^1 x\,dx$}}}}
273     \polygon(0,-.12)(0,0.88)(6.5,0.88)(6.5,-0.12)
274     \put(0,1.35){\makebox(0,0)[l]{\fontsize{24}{24}\selectfont\smash{\hbox to 13\zw{ルビ文字列◆◆◆◆◆◆◆◆}}}}
275     \polygon(0,1.2)(0,1.79)(6.5,1.79)(6.5,1.2)
276     \linethickness{0.125mm}
277     \put(-0.5,0){\line(1,0){7}}
278     \put(-0.5,1.35){\line(1,0){7}}
279     \put(-0.5,1.2){\line(1,0){0.5}}
280     \put(-0.5,0.88){\line(1,0){0.5}}
281     \put(-0.25,0){\vector(0,1){0.88}}
282     \put(-0.25,1.35){\vector(0,-1){0.15}}
283     \put(-0.25,0.44){\normalsize\makebox(0,0)[r]{$H$\,\,}}
284     \put(-0.25,1.45){\normalsize\makebox(0,0)[b]{$D$}}
285     \put(-0.125,0.88){\vector(0,1){0.32}}
286     \put(-0.125,1.04){\normalsize\makebox(0,0)[l]{\,\,$\mbox{\texttt{intergap}}\cdot p$}}
287   \end{picture}\par}
288
289   \normalsize\leftskip=0.5\dimexpr\textwidth-30\zw \rightskip=\leftskip
290   ここで$p$は親文字における全角高さ,$r$はルビ文字における全角高さであり,
291   \begin{gather*}
292   H=
293   \begin{cases}
294     \mbox{\texttt{[yt]baseheight}}\cdot p&\mbox{if\ $\mbox{\texttt{[yt]baseheight}}\ge 0$,}\\
295     \mbox{(自然高さ)}&\mbox{if\ $\mbox{\texttt{[yt]baseheight}}\string<0$,}
296   \end{cases}\\
297   D=
298   \begin{cases}
299     \mbox{\texttt{[yt]rubydepth}}\cdot r&\mbox{if\ $\mbox{\texttt{[yt]rubydepth}}\ge 0$,}\\
300     \mbox{(自然深さ)}&\mbox{if\ $\mbox{\texttt{[yt]rubydepth}}\string<0$.}
301   \end{cases}
302   \end{gather*}
303   \caption{ルビの垂直配置}\label{fig:ruby_vertical}
304 \end{figure}
305
306
307 \item[kenten=<command>]各文字につく圏点の出力命令を指定する.
308   既定値は「\verb+\textbullet+」である.
309
310 \item[fontcmd=<command>]ルビ用のフォント切り替え命令を指定する.
311 このキーの内容が実行された後に\ \verb+\fontsize...\selectfont+\ が実行されるので,
312 このキーの指定では最後に\ \verb+\selectfont+ を加える必要はない.
313
314 この \texttt{fontcmd} キーの内容は多くの回数実行される.
315 例えば,\textsf{luatexja-fontspec}パッケージを用いてOpenTypeフォントを用いる場合,
316 \begin{lstlisting}
317  fontcmd=\addjfontfeatures{Style=Ruby}
318 \end{lstlisting}
319 のようにしてルビ用字形を用いることが可能だが,現在の実装ではタイプセットに時間がかかるようになる.
320
321 \end{description}
322
323 \medskip
324 次の2つは,以上で説明した複数のオプションを一度に設定するためのものである.
325 普通はこの2\nobreak つのうちいずれかを設定するだけで足りるだろう.
326
327 \begin{description}
328 \def\makelabel#1{\ttfamily\bfseries #1}
329 \item[naka] 以下のオプションを同時に設定する.主に中付きルビを組むときに用いる.
330 \begin{verbatim}
331 mode=1, stretch={1}{2}{1}, stretchruby={1}{2}{1}
332 \end{verbatim}
333 \item[kata] 同様に,肩付きルビ用に,次を設定する.
334 \begin{verbatim}
335 mode=9, stretch={1}{2}{1}, stretchruby={0}{0}{1}
336 \end{verbatim}
337 \end{description}
338
339 \paragraph{\cs{ltjsetruby}\{<option>\}}
340 <option>の既定値を指定する.\textsf{luatexja-ruby}読み込み時の値は
341 各項目の所で既に説明してあるが,次のようになっている.
342 \begin{verbatim}
343   pre=-1, post=-1, mode=1,
344   stretchruby={1}{2}{1}, stretch = {1}{2}{1},
345   stretchbol={0}{1}{1}, stretcheol={1}{1}{0},
346   maxmargin=0.5, size=0.5, intergap=0, rubysmash=false,
347   kenten=\textbullet, fontcmd=\relax, ybaseheight=0.88, tbaseheight=0.5,
348   yrubydepth=0.12, trubydepth=0.5,
349   intrude_jfmgk, intrude_kanjiskip, intrude_xkanjiskip
350 \end{verbatim}
351
352 \paragraph{\cs{ltjsetparamater} に追加されるキー}
353 \begin{description}
354 \item[\Param{rubypreintrusion}\ttfamily =\{<chr\_code>, <pre\_int>\}]
355   文字<chr\_code> に,その\textbf{直後}のルビによって掛けられるルビ文字列の最大長
356   (つまり,\underline{前文字進入許容量})をルビ全角幅単位で指定.
357
358   \textbf{v0.5以降での変更点}:もし$-a$~($a>0$)を指定した場合は,実際の\underline{前文字進入許容量}は$a$となるが,
359   文字<chr\_code>の前のJFMグルーに進入が発生した場合には,\underline{前文字進入許容量}が0でなかった場合は,の後のJFMグルーにはルビの進入は発生しない.
360
361 \item[\Param{rubypostintrusion}\ttfamily =\{<chr\_code>, <post\_int>\}]
362   文字<chr\_code> に,その\textbf{直前}のルビによって掛けられるルビ文字列の最大長
363   (つまり,\underline{後文字進入許容量})をルビ全角幅単位で指定.
364
365   \textbf{v0.5以降での変更点}:もし$-a$~($a>0$)を指定した場合は,実際の\underline{後文字進入許容量}は$a$となるが,
366   実際の\underline{後文字進入量}が0でなかった場合は,文字<chr\_code>の後のJFMグルーにはルビの進入は発生しない.
367 \end{description}
368 以下の文字は\Param{rubypreintrusion},~\Param{rubypostintrusion}とも初期値は1である:
369 \begin{quote}
370  ひらがな(\texttt{U+3040}--\texttt{U+309F}),カタカナ(\texttt{U+30A0}--\texttt{U+30FF}),
371  仮名補助など(\texttt{U+1B000}--\texttt{U+1B16F}),\\
372  分離禁止文字
373  \@for\@tmp:=`\―,`\‥,`\…,`〳,`\〴,`\〵,"2014 \do{\mybox{\@tmp}}
374 \end{quote}
375 次に,以下の文字は\Param{rubypreintrusion},~\Param{rubypostintrusion}とも初期値は0.5である:
376 \begin{quote}
377  中点類\@for\@tmp:=`\・,`\:,`\; \do{\mybox{\@tmp}}
378 \end{quote}
379 また,以下の文字は\Param{rubypreintrusion}のみ初期値は$-1$である:
380 \begin{quote}
381   始め括弧類
382   \@for\@tmp:=`\‘,`\“,`\〈,`\《,`\「,`\『,`\【,`\〔,`\〖,`\〘,`\〝,`\(,`\[,`\{,`\⦅ \do{\mybox{\@tmp}}\unskip,
383   「文字コード$-1$の文字
384   \footnote{段落開始の\ \cs{parindent}分インデントを表す.
385     通常の\LuaTeX-jaにおける指定では「文字コード$-1$」は文中数式境界を表していることに注意.}」
386 \end{quote}
387 さらに,以下の文字は\Param{rubypostintrusion}のみ初期値は$-1$である:
388 \begin{quote}
389   閉じ括弧類
390   \@for\@tmp:=`\’,`\”,`\〉,`\》,`\」,`\』,`\】,`\〕,`\〗,`\〙,`\〟,`\),`\],`\},`\⦆ \do{\mybox{\@tmp}}\unskip,
391   句読点類\@for\@tmp:=`\、,`\,,`\。,`\. \do{\mybox{\@tmp}}
392 \end{quote}
393 \makeatother
394
395 以上で記述されていない\Param{rubypreintrusion},~\Param{rubypostintrusion}の初期値はすべて0である.
396
397
398 \paragraph{\cs{ltjkenten}}
399 圏点を出力する命令であり,
400 \begin{quote}
401  \ttfamily\cs{ltjkenten}[<option>]\{親文字\}
402 \end{quote}
403 のように使用する.複数文字に圏点をつける場合でも,\verb+\ltjruby+ のように「\texttt{|}」を使って
404 文字を区切る\textbf{必要はない}(\verb+\kenten+内では「\texttt{|}」は特別な意味を持たない)
405 ことに注意してほしい.
406
407 圏点として出力される文字は\texttt{kenten}キーによって指定し,
408 圏点自身の大きさは(ルビと同様に)\texttt{size}キーで指定する.
409
410 \subsection{グループの\ruby{指|定}{し|てい}}
411 \label{ssec:grp}
412 \begin{quote}
413 \ttfamily\cs{ltjruby}[<option>]\{親|文|字\}\{おや|も|じ\}
414 \end{quote}
415 のように,\verb+\ltjruby+\ の第2・第3引数内の「\verb+|+」はグループの区切りを表す.
416 グループの数は両者で一致しなければならず,
417 \verb+\ltjruby{紋章}{もん|しよう}+ のようには\emph{できない}.
418
419 1グループのみのルビ(単純グループルビ)はグループルビとして組まれる.そのため,
420 もしモノルビを使いたければ,面倒でも
421 \begin{LTXexample}[width=0.4\textwidth, preset=\Large]
422 の\ltjruby{紋}{もん}\ltjruby{章}{しよう}が
423 \end{LTXexample}
424 のように,複数回使用すること.
425 また,全てのグループにおいて「ルビ文字列の長さは親文字列以下」
426 \footnote{%
427   実際には\TeX での長さの計算誤差($2^{-16}$~ptの整数倍として計算していることによる)を考慮し,
428   親文字全角の$1/1000$だけルビ文字列が長くなることを許容している.
429 }であれば,
430 単純グループルビの並びとして扱われる.すなわち,次ページ冒頭の2行は全くの等価となる.
431 \begin{verbatim}
432 \ltjruby{普|通|車}{ふ|つう|しや}
433 \ltjruby{普}{ふ}\ltjruby{通}{つう}\ltjruby{車}{しや}
434 \end{verbatim}
435
436 複数グループかつ上記の条件を満たさない場合は,
437 所謂「可動グループルビ」であり,ルビの前後や各グループの切れ目で行分割が可能となる.
438 例えば
439 \begin{verbatim}
440 …の\ltjruby{表|現|力}{ひよう|げん|りよく}は…
441 \end{verbatim}
442 という入力からは得られる組版結果は,次のいずれかになる.
443 \begin{center}
444  \begin{tabular}{ll}
445  \toprule
446  改行なし(行中形)&\Large …の\ltjruby{表|現|力}{ひよう|げん|りよく}は…\\
447  直前で改行&\Large \vrule \ltjruby[stretch=011]{表|現|力}{ひよう|げん|りよく}は…\\
448 &\Large …の\ltjruby[stretch=110]{表}{ひよう}
449     \vrule\ltjruby[stretch=011]{現|力}{げん|りよく}は…\\
450 &\Large …の\ltjruby[stretch=110]{表|現}{ひよう|げん}
451     \vrule\ltjruby[stretch=011]{力}{りよく}は…\\
452  直後に改行&\Large …の\ltjruby[stretch=110]{表|現|力}{ひよう|げん|りよく}\vrule\\
453 \bottomrule
454  \end{tabular}
455 \end{center}
456 \begin{itemize}
457  \item これらの行分割によってペナルティは発生しない.
458  \item 上記の例で見られるように,
459 2ブロック以上をまとめて組むときは,全体を1つのグループルビのように組版する(JIS~X~4051と同様).
460 『日本語組版処理の要件』では,
461 附属書Fに「熟語の構成,さらにその熟語の前後にくる文字の種類を考慮して配置する方法」として
462 別の方法を解説しているが,こちらの方法は現時点ではサポートしていないので,
463 面倒でも手動で \texttt{pre}, \texttt{post} などを使って頑張って欲しい.
464  \item 実装方法の都合により,ルビの直前・直後・途中で2箇所以上の改行が起きる場合,例えば
465 \begin{center}
466  \Large …の\ltjruby[stretch=110]{表}{ひよう}
467     \vrule\ltjruby[stretch=010]{現|力}{げん|りよく}\vrule\qquad
468 \Large \vrule\ltjruby[stretch=010]{表|現}{ひよう|げん}
469     \vrule\ltjruby[stretch=011]{力}{りよく}は…\qquad
470 \Large \vrule\ltjruby[stretch=010]{表|現|力}{ひよう|げん|りよく}\vrule
471
472 \end{center}
473 などの組み方は\emph{想定していない}.
474 エラーが発生して止まることもあるし,エラーが発生しなくても正しく組まれない.
475 \end{itemize}
476
477 \paragraph{別名について}
478 \verb+\begin{document}+時に%
479 \begin{itemize}
480  \item \cs{ruby}がすでに定義されていない場合に限り,\cs{ruby}が\cs{ltjruby}の別名として定義される.
481  \item \cs{kenten}がすでに定義されていない場合に限り,\cs{kenten}が\cs{ltjkenten}の別名として定義される.
482 \end{itemize}
483
484 \section{\ruby{注|意|点}{ちゆう|い|てん}}
485 \paragraph{前後からのルビ文字のはみ出し1}
486 「日本語組版処理の要件」の図117\footnote{2020-08-11版での番号.2012-04-03版では図3.82.}のように,
487 前後からのルビ文字のはみ出しが繋がらないようにする処理が組み込まれている.
488 例えば,
489 \begin{LTXexample}[preset=\Large,width=0.3\textwidth]
490 \ltjruby{陵}{りよう}と\ltjruby{陵}{みささぎ}\\
491 \ltjruby{陵}{りよう}と\ltjruby[pre=1]{陵}{みささぎ}
492 \end{LTXexample} 
493 において,1行目右側の「\ltjruby{陵}{みささぎ}」のルビが前の「と」にかかる量は次のように決まる:
494 \begin{enumerate}
495 \item 1回目の実行では,行分割前に「\ltjruby{陵}{りよう}」の\underline{後文字進入量}は前もって知ることはでき
496       ない.そのため,「\ltjruby{陵}{りよう}」は行中形で組まれるものと想定し,
497 「\ltjruby{陵}{みささぎ}」の前文字進入許容量は
498 \[
499  \underbrace{0.5\,\mathrm{zw}}_{\text{元々の許容量}}
500 -\underbrace{0.25\,\mathrm{zw}}_{\text{前のルビの\underline{後文字進入量}(行中形)}}=0.25\,\mathrm{zw}
501 \]
502 となる.行分割後,「\ltjruby{陵}{りよう}」の実際の\underline{後文字進入量}は
503 <jobname>\texttt{.ltjruby}ファイルに記述される.
504 \item 2回目以降の実行では,<jobname>\texttt{.ltjruby}ファイルに保存された「\ltjruby{陵}{りよう}」の\underline{後文字進入量}
505 を用いて,「\ltjruby{陵}{みささぎ}」の\underline{前文字進入許容量}を次のように計算する:
506 \[
507  \underbrace{0.5\,\mathrm{zw}}_{\text{元々の許容量}}
508 -\underbrace{0.25\,\mathrm{zw}}_{\text{前のルビの\underline{後文字進入量}(from \texttt{.ltjruby})}}=0.25\,\mathrm{zw}.
509 \]
510 \end{enumerate}
511
512 <jobname>\texttt{.ltjruby}ファイルに保存する際,各 \verb+\ltjruby+ 命令の呼び出しを識別するキーが必要になるが,
513 そのキーとしては単純に「何個目の \verb+\ltjruby+ 命令か」である.
514
515 なお,以上の処理は,1行目と2行目を比較すれば分かるように,
516 「\ltjruby{陵}{みささぎ}」の\emph{\underline{前文字進入許容量}指定(\texttt{pre})が自動}になっている場合のみ
517 実施される.
518
519
520 \paragraph{前後からのルビ文字のはみ出し2}
521 また,本パッケージのv0.**以降では,「日本語組版処理の要件」にある
522 \begin{quote}
523   後ろにくる終わり括弧類,句点類若しくは読点類,又は前にくる始め括弧類には,
524   最大でルビ文字サイズの全角までルビ文字を掛けてもよい.
525   この場合,後ろにくる終わり括弧類,句点類若しくは読点類の後ろの空き量,
526   又は前にくる始め括弧類の前の空き量に掛けてはならない.
527 \end{quote}
528 という処理も組み込まれており,<jobname>\texttt{.ltjruby}に「前後の和文処理グルーに正の量だけ進入したか」という情報を
529 保存することによって実装されている.
530
531 \paragraph{段落末尾のルビ}
532 段落がルビで終わった場合,そのルビが行末形で組まれることはない.
533 これは,段落の「本当の」末尾には \verb+\penalty10000\parfillskip+ があるためで,
534 ルビ処理用に作った最後のグルー(\ref{ssec:impl}\nobreak 小節の説明では$g_2$)が消去されないことによる.
535
536 \verb+\parfillskip+ の長さ(や,場合によっては \verb+\rightskip+)を実測し,
537 それによって処理を変えるのも可能だが,そのようなことはしなかった.
538 段落がルビで終わることは普通ない(最低でも句点が続くだろう)と思うからである.
539
540 \paragraph{段落先頭のルビ}
541 同様に,段落先頭のルビは行頭形にはならない.
542 \texttt{pre}が負(つまり,自動指定)のとき,段落最初の \verb+\parindent+ 分への
543 進入は可能である.ここ\verb+\parindent+ 分のインデントへの\underline{進入許容量}は
544 「文字$-1$」に対する\Param{rubypreintrusion}(既定値は1,ルビ全角単位)と
545 \ \verb+\parindent+ の長さのうち小さい方である.
546 \begin{LTXexample}[preset=\Large,width=0.4\textwidth]
547 \parindent1\zw\noindent 012345\par
548 \ltjruby{陵}{みささぎ}は……\par
549 \ltjruby{承}{うけたまわ}り……\par
550 \parindent0.25\zw\ltjruby{陵}{みささぎ}は……
551 \end{LTXexample}
552
553 \paragraph{和文処理グルーの伸縮}
554 現バージョンでは,進入量調整に和文処理グルーを考慮させる,
555 \begin{quote}
556 \texttt{intrude\_jfmgk}, \texttt{intrude\_kanjiskip}, \texttt{intrude\_xkanjiskip}キー
557 \end{quote}
558 の値が\texttt{true}(真)で
559 あった状況でも,考慮されるのは\emph{自然長の値のみ}である.そのため,行の調整処理が発生した場合は
560 意図しない結果となる.
561
562 例えば,標準設定での中黒「・」の直後のルビからの中黒への進入許容量は
563 \begin{quote}
564   中黒「・」への\underline{前進入許容量}はルビ全角の半分で,
565   中黒本体の後の四分空きには進入可能
566 \end{quote}
567 となっている.そのため,下の例の1, 2行目ともルビの前進入量は0.5\,zwとなる.
568 しかし,2行目では詰め量の0.5\,zwがほとんど中黒周囲の四分空きで負担されるため,
569 実際には「中黒本体にほぼ0.5\,zwが進入する」という望ましくない結果が得られている.
570 \begin{LTXexample}[preset=\Large,width=0.4\textwidth]
571 \leavevmode\hbox{あ・\ltjruby{◆}{◆◆◆◆}漢字}\\
572 \hbox spread-0.5\zw{あ・\ltjruby{◆}{◆◆◆◆}漢字}
573 \end{LTXexample}
574
575 また,次の例では2行目では前後の\underline{文字進入量}がルビ1字分と等しくなっているが,
576 3行目のように1全角伸ばすという調整が行われた後は\underline{文字進入量}が不揃いになってしまっている.
577 これはもともと「\texttt{;}」には後側にのみ和欧文間空白が入ることと,3行目ではこの和欧文間空白が
578 伸びているためである.
579 \begin{LTXexample}[preset=\Large,width=0.4\textwidth]
580 \leavevmode\hbox{……に%
581   \ltjruby{\texttt{;}}{セミコロン}という……}\\
582 \hbox spread\zw{……に%
583   \ltjruby{\texttt{;}}{セミコロン}という……}
584 \end{LTXexample}
585
586 \newpage
587 \section{\ruby{実|装}{じつ|そう}について}
588
589 \subsection{進入量の計算}
590 \label{ssec:calc_intrusion}
591 ルビ文字を自然に組んだときの幅が親文字のそれより多い場合,
592 ルビの前後への進入量は次のように決定される.
593 \begin{enumerate}[label=\emph{Step~\arabic*},labelindent=0pt,itemindent=*,itemsep=\medskipamount]
594   \item \underline{前文字進入許容量}$B_0$,\underline{後進入文字許容量}$A_0$の算出.
595   
596   ルビ全角の長さを$r$とする.
597   \begin{enumerate}
598    \item \texttt{pre}の指定値が非負であった場合は,それに$r$を掛けたものを$B_0$とする.\\
599     そうでなかった場合は,「ルビの直前の文字」に対する
600     \Param{rubypreintrusion}の値に$r$を掛けたものを$B_0$とする
601     \footnote{%
602       なお,「ルビの直前の文字」が段落最初の\cs{parindent}分のインデントであった場合,
603       $B_0$を,「文字コード$-1$の文字」\Param{rubypreintrusion}の値に$r$を掛けた値と\cs{parindent}のうち
604       小さい方とする.
605     }.
606    \item \texttt{post}の指定値が非負であった場合は,それに$r$を掛けたものを$A_0$とする.\\
607     そうでなかった場合は,「ルビの直後の文字」に対する
608     \Param{rubypostintrusion}の値にルビ全角の値を掛けたものを$A_0$とする.
609    \item \texttt{mode}の最下位ビット(bit~0)が0であった場合は,$B_0\leftarrow 0$, $A\leftarrow 0$とする.
610    \item もし2つ前の文字がルビで,その直後(つまりいま処理しているルビから見れば直前)
611     の文字へ$a'$だけの進入があった場合,現在のルビについて$B_0←\min(0,B_0-a')$とする.
612   \end{enumerate}
613   \item 前進入許容量$B$,後進入許容量$A$の算出.
614   \begin{enumerate}
615     \item まず$B\leftarrow B_0$,\ \ $A\leftarrow A_0$とする.
616     \item ルビとその直前の文字の間に和文処理グルー$g$が挿入された場合,
617     \begin{itemize}
618       \item $g$がJFMグルーの場合は,\texttt{intrude\_jfmgk}が真の場合に,
619       \item $g$が標準の和文間空白(\Param{kanjiskip})の場合は,
620       \texttt{intrude\_kanjiskip}が真の場合に,
621       \item $g$が標準の和欧文間空白(\Param{xkanjiskip})の場合は,
622       \texttt{intrude\_xkanjiskip}が真の場合に,
623     \end{itemize}
624     それぞれ$g$の自然長を$B$に加算する.
625
626     ルビとその直後の文字との間に和文処理グルーが挿入された場合も同様である.
627     
628     \item \texttt{mode}の2番目のビット(bit~1)が0であった場合は,$B$,~$A\leftarrow \min(B,A)$とする.
629   \end{enumerate}
630   \item 実際の前進入量$b$,後進入量$a$の計算.
631   
632   ルビ文字の突出量を$x$,
633   親文字の文字数を$k+1$,親文字の前に入る空白量・間の空白量・後ろの空白量の比を$p:q:r$とする.
634   このとき,\texttt{mode}のbit 2--4の値によって$b$,~$a$を次のように算出する:
635 \begin{description}[labelindent=\zw]
636  \item[000] $b=\min(B, xp/(p+kq+r))$, \ $a=\min(A, xr/(p+kq+r))$
637  \item[001] $b=\min(B, x)$, \ $a=\min(A, \max(x-b,0))$
638  \item[010] $a=\min(A, x)$, \ $b=\min(B, \max(x-a,0))$
639  \item[011] $M=\min(B,A)$とおく.もし$x\le 2M$ならば$b=a=x/2$.そうでなければ
640 \[
641  b=\min\mleft(B, M + \frac{(x-2M)p}{p+kq+r}\mright),\quad 
642  a=\min\mleft(A, M + \frac{(x-2M)r}{p+kq+r}\mright).
643 \]
644  \item[100] $M=\min(B,A)$とおく.もし$x\le 2M$ならば$b=a=x/2$.そうでなければ
645 \[
646  b=\min(B, x-M),\quad a=\min(A,x-M)\quad \mbox{(どちらかは必ず$M$となる)}.
647 \]
648 \end{description}
649
650 大雑把に言うと,最初の「000」は「組んだ後に進入量を決定」する方針,
651 それ以外は「進入量を先に決定し,その後で組む」方針である.
652 組み方の具体例を実際に示す.例示のため,平仮名にはルビが1字まで,「立」にはルビを
653 0.5字分までかけてよいことにしている.
654 \begin{description}[labelindent=\zw]
655 \item[000]{\setkeys[ltj]{ruby}{mode=1}%
656 \ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
657 は\ltjruby{美}{うつく}しい
658   \quad は\ltjruby{聴衆}{ちようしゆう}と\quad
659 は\ltjruby{暁}{あかつき}立\quad
660 は\ltjruby{峠}{とうげ}立\quad
661 は\ltjruby{聴衆}{ちようしゆう}立\quad
662 は\ltjruby{聴衆}{ちようしゆう}達\par}
663 \item[001]{\setkeys[ltj]{ruby}{mode=5}%
664 \ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
665 は\ltjruby{美}{うつく}しい
666   \quad は\ltjruby{聴衆}{ちようしゆう}と\quad
667 は\ltjruby{暁}{あかつき}立\quad
668 は\ltjruby{峠}{とうげ}立\quad
669 は\ltjruby{聴衆}{ちようしゆう}立\quad
670 は\ltjruby{聴衆}{ちようしゆう}達\par}
671 \item[010]{%
672 \setkeys[ltj]{ruby}{mode=9}%
673 \ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
674 は\ltjruby{美}{うつく}しい
675   \quad は\ltjruby{聴衆}{ちようしゆう}と\quad
676 は\ltjruby{暁}{あかつき}立\quad
677 は\ltjruby{峠}{とうげ}立\quad
678 は\ltjruby{聴衆}{ちようしゆう}立\quad
679 は\ltjruby{聴衆}{ちようしゆう}達\par}
680 \item[011]{\setkeys[ltj]{ruby}{mode=13}%
681 \ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
682 は\ltjruby{美}{うつく}しい\quad
683 は\ltjruby{聴衆}{ちようしゆう}と\quad
684 は\ltjruby{暁}{あかつき}立\quad
685 は\ltjruby{峠}{とうげ}立\quad
686 は\ltjruby{聴衆}{ちようしゆう}立\quad
687 は\ltjruby{聴衆}{ちようしゆう}達\par}
688 \item[100]{\setkeys[ltj]{ruby}{mode=17}%
689 \ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}%
690 は\ltjruby{美}{うつく}しい\quad
691 は\ltjruby{聴衆}{ちようしゆう}と\quad
692 は\ltjruby{暁}{あかつき}立\quad
693 は\ltjruby{峠}{とうげ}立\quad
694 は\ltjruby{聴衆}{ちようしゆう}立\quad
695 は\ltjruby{聴衆}{ちようしゆう}達\par}
696 \end{description}
697 \end{enumerate}
698
699 \subsection{ノードの扱い}
700 \label{ssec:impl}
701 次の例で内部実装の大まかな方法を説明する.
702 \begin{LTXexample}[preset=\Large]
703 ……を\ltjruby{流|暢}{りゆう|ちよう}に……
704 \end{LTXexample}
705
706 \begin{enumerate}
707 \item \verb|\ltjruby|コマンド自体は,一旦次のnode listを値とするwhatsit~$W$を作って,
708 現在の水平リストへと挿入する(必要ならば\verb|\leavevmode|も実行):
709 \[
710  \Node{whatsit $w$}{value: 2}\longrightarrow 
711  \Node{hlist $s_1$}{「りゆう」}\longrightarrow
712  \Node{hlist $p_1$}{「流」}\longrightarrow
713  \Node{hlist $s_2$}{「ちよう」}\longrightarrow
714  \Node{hlist $p_2$}{「暢」}
715 \]
716 ここで,最初の$w$の値2は,ルビが2つのパーツ「\ltjruby{流}{りゆう}」「\ltjruby{暢}{ちよう}」からなっていることを
717 表している.この値を$\mathit{cmp}$とおこう.
718 $s_i$達の中の文字は既にルビの大きさである.
719 \item \LuaTeX-jaの和文処理グルー挿入処理において,
720 このwhatsit~$W$はまとめて
721 「先頭が『流』,最後が『暢』であるようなhboxを \verb|\unhbox| で展開したもの」と扱われる.
722 言い換えれば,ルビ部分を無視した単なる「流暢」という和文文字の並びとして扱われる\footnote{「流」「暢」の間のグルーは既に入っている,と扱われる.}.
723 次のサンプルを参照
724 \begin{LTXexample}[preset=\Large]
725 \leavevmode\hbox{.}A\\
726 %↑xkanjiskip 
727 \ltjruby{.}{}A
728 %↑2分
729 \end{LTXexample}
730 \item 和文処理グルーの挿入が終わった後で,可動グループルビのためのノードの挿入に入る.
731 \begin{enumerate}
732 \item $W$の前後に$2\mathit{cmp}+1=5$個のノードが挿入され,$W$の周辺は次のようなノード列になる.
733 \begin{align*}
734  (\text{other nodes})&\longrightarrow
735  \Node{glue $g_0$}{}\longrightarrow \Node{whatsit~$W$}{元からある}\longrightarrow \Node{rule $r_1$}{}
736 \\&\longrightarrow
737  \Node{glue $g_1$}{}\longrightarrow \Node{rule $r_2$}{}\longrightarrow 
738  \Node{glue $g_2$}{}\longrightarrow (\text{other nodes})
739 \end{align*}
740
741 \item このようにノードを挿入する目的は,\TeX の行分割処理自体に影響を加えずに可動グループルビ
742 を実現させることにある.
743 \begin{gather*}
744  (\text{other nodes})\longrightarrow
745  \Node{glue $g_0$}{}\longrightarrow \Node{whatsit~$W$}{元からある}\longrightarrow \Node{rule $r_1$}{}\\
746 \noalign{\hrulefill 行の境目\hrulefill}
747 \Node{rule $r_2$}{}\longrightarrow 
748  \Node{glue $g_2$}{}\longrightarrow (\text{other nodes})
749 \end{gather*}
750 のようになったとしたら,「\ltjruby{流}{りゆう}」「\ltjruby{暢}{ちよう}」の間で行分割が起きた,ということがわかり,
751 $g_i$,~$r_i$達のノードを適切に置き換えればよい(後で詳しく説明する).
752
753 \begin{figure}\centering\small
754 \begin{tabular}{cllll}
755 \toprule
756 \multicolumn{1}{c}{\bf ノード}&\multicolumn{1}{c}{\bf 組み方}&\multicolumn{1}{c}{\bf サンプル}%
757 &\multicolumn{1}{c}{\bf 対応するノード並び}\\
758 \midrule
759 $n_1$&行末1グループ&
760 \Large
761 \fbox{を}{\color{blue!50!black}\gt\ltjruby[pre=1,mode=5,stretch=110]{流}{りゆう}}\vrule
762 &
763 $g_0\rightarrow W\rightarrow r_1$\\
764 $n_2$&行末2グループ&
765 \Large
766 \fbox{を}{\color{blue!50!black}\gt\ltjruby[pre=1,mode=1,stretch=110]{流|暢}{りゆう|ちよう}}\vrule
767 &
768 $g_0\rightarrow W\rightarrow r_1\rightarrow g_2 \rightarrow r_2$\\
769 $n_3$&行頭1グループ&
770 \Large
771 \vrule{\color{blue!50!black}\gt\ltjruby[post=1,mode=1,stretch=011]{暢}{ちよう}}\fbox{に}
772 &
773 $r_2\rightarrow g_2$\\
774 $n_4$&行頭2グループ&
775 \Large
776 \vrule{\color{blue!50!black}\gt\ltjruby[post=1,mode=1,stretch=011]{流|暢}{りゆう|ちよう}}\fbox{に}
777 &
778 $W\rightarrow r_1\rightarrow g_2 \rightarrow r_2\rightarrow g_2$\\
779 $n_5$&行中&
780 \Large
781 \fbox{を}{\color{blue!50!black}\gt\ltjruby[post=0.5,pre=0.5,mode=1]{流|暢}{りゆう|ちよう}}\fbox{に}
782 &
783 $g_0\rightarrow W\rightarrow r_1\rightarrow g_2 \rightarrow r_2\rightarrow g_2$\\
784
785 \bottomrule
786 \end{tabular}
787 \caption{ルビの組み方と対応するノード並び}
788 \label{fig:node}
789 \end{figure}
790
791 \item なお,$r_i$達の高さ・深さは組み上がった後のそれである.
792 $g_i$,~$r_i$達の幅は,図\nobreak\ref{fig:node}に示したような対応に沿って算出する.
793 例えばこの場合,行中形$n_5$に対して
794 \[
795  g_0+r_1+g_2+r_2+g_2 = (3-0.25\times 2)\,\mathrm{zw}=2.5\,\mathrm{zw}
796 \]
797 という方程式が立つ(zwは親文字全角の幅,進入量込).
798 $n_1$から$n_5$まで計5本の方程式が立つが,これらはGau\ss の消去法で解くことができて
799 $g_i$,~$r_i$達の幅が求まる.
800 \item また,ルビ処理を統括しているwhatsit~$W$の値も
801 \[
802  \Node{whatsit $w$}{value: 2}\longrightarrow 
803  \Node{vlist $n_1$}{末1}\longrightarrow
804  \Node{vlist $n_2$}{末2}\longrightarrow
805  \Node{vlist $n_3$}{頭1}\longrightarrow
806  \Node{vlist $n_4$}{頭2}\longrightarrow
807  \Node{vlist $n_5$}{中}
808 \]
809 に置き換えておく.
810
811 \end{enumerate}
812
813 \item \LuaTeX の行分割処理を普通に行う.
814 \item 行分割の結果に従って,$g_i$,~$r_i$達を適切に置換する.
815
816 例えば行分割の結果
817 \begin{gather*}
818  (\text{other nodes})\longrightarrow
819  \Node{glue $g_0$}{}\longrightarrow \Node{whatsit~$W$}{元からある}\longrightarrow \Node{rule $r_1$}{}
820   \tag{行A}\\
821 \noalign{\hrulefill 行の境目\hrulefill}
822 \Node{rule $r_2$}{}\longrightarrow 
823  \Node{glue $g_2$}{}\longrightarrow (\text{other nodes})\tag{行B}
824 \end{gather*}
825 のようになったとしよう.
826 \begin{enumerate}
827 \item 処理は段落の上の行から順番に行われる.行Aの処理がまわってきたとしよう.
828
829 \item 行Aの先頭から順番に眺めていく.すると「whatsit~$W$由来」のノード,$g_0$,~$W$,~$r_1$が見つかり,
830 行Aはここで終わっている.
831
832 まず,行Aのhboxの中身からwhatsit~$W$を消去(リストから取り除くだけで,$W$のメモリを解放するわけではない)する.
833 $g_0$,~($W$,)~$r_1$というノードの並びは,「行末1グループ」$n_1$に対応しているので,
834 $g_0$,~$r_1$を行Aから除去・メモリ解放し,代わりに$n_1$を行Aの中身に追加する.
835
836 \item 次に行Bの処理にうつる.行Aでルビの処理は完了していない(2グループのルビなのにまだ1グループしか使っていない)ので,
837 「whatsit~$W$由来」のノードがいくつか行B内に残っているはずである.
838
839 案の定,$r_2$,~$g_2$というノード列が見つかった.これは「行頭1グループ」$n_3$に対応しているので,
840 $r_2$,~$g_2$を行Bから除去・メモリ解放し,代わりに$n_3$を行Bの中身に挿入する.
841
842 \item これで2グループとも使い切ったことになるので,
843 隔離しておいた$W$を,(使われなかった$n_2$,~$n_4$,~$n_5$などと共に)メモリ解放する.結果として
844 次のようになった:
845 \begin{gather*}
846  (\text{other nodes})\longrightarrow
847  \Node{vlist $n_1$}{末1}\tag{行A}\\
848 \noalign{\hrulefill 行の境目\hrulefill}
849 \Node{vlist $n_3$}{頭1}\longrightarrow (\text{other nodes})\tag{行B}
850 \end{gather*}
851 \end{enumerate}
852 \end{enumerate}
853
854 \newpage
855 \section{いくつかの例}
856 \def\rubytest{\ruby{黄金橋}{ゴールデンゲートブリッジ}\relax}
857
858 \setbox0=\vbox{\hsize=22\zw%
859 ああああ\rubytest いうえおかきくけこ
860 あ\rubytest いうえおかきくけこ
861 あ\rubytest いうえおかきくけこ
862 あ\rubytest いうえおかきくけこ
863 あ\rubytest いうえおかきくけこ
864 あ\rubytest いうえおかきくけこ}
865 %\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)}
866 \fbox{\box0}
867
868 \setbox0=\vbox{\hsize=30\zw\noindent
869 \texttt{baseheight=0.88}での例\\
870   ふぁいる\ruby[baseheight=0.88]{dvi}{ディーヴィーアイ}ファイル
871   \ruby[baseheight=0.88]{oo}{ほーげーふーが}漢字\\
872   ファイル\ruby[baseheight=0.88]{dvi}{ディーヴィーアイ}ふぁいる
873   \ruby[baseheight=0.88]{oo}{ほーげーふーが}漢字\\
874   ああ(\ruby{ほげ}{ふがふがふがふが})」\ruby{ほげ}{ふがふがふがふが}「
875   【\ruby{ほげ}{ふがふがふがふが}】\ruby{ほげ}{ふがふがふがふが}…
876 }
877 \fbox{\box0}
878
879 \def\rubytest{\ruby{国府津}{こうづ}\relax}
880 % グループルビ
881
882 \setbox0=\vbox{\hsize=18\zw%
883 あ\rubytest いうえおかきくけこ
884 あ\rubytest いうえおかきくけこ
885 あ\rubytest いうえおかきくけこ
886 あ\rubytest いうえおかきくけこ
887 あ\rubytest いうえおかきくけこ
888 あ\rubytest いうえおかきくけこ}
889 %\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)}
890 \fbox{\box0}
891
892 \def\rubytest{\ruby{●●|◆}{◆◆◆◆◆◆|●●●}\relax}
893 \setbox0=\vbox{\hsize=19\zw%
894 あ\rubytest いうえおかきくけこ
895 あ\rubytest いうえおかきくけこ
896 あ\rubytest いうえおかきくけこ
897 あ\rubytest いうえおかきくけこイ
898 あ\rubytest いうえおかきくけこ
899 あ\rubytest いうえおかきくけこウ
900 あ\rubytest いうえおかきくけこエ
901 あ\rubytest いうえおかきくけこ
902 あ\rubytest いうえおかきくけこ
903 あ\rubytest いうえおかきくけこ}
904 %\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)}
905 \fbox{\box0}
906
907 \def\rubytest{\ruby{●●|□}{◆◆◆|●●●}\relax}
908 \setbox0=\vbox{\hsize=19\zw%
909 あ\rubytest いうえおかきくけこ
910 あ\rubytest いうえおかきくけこ
911 あ\rubytest いうえおかきくけこ
912 あ\rubytest いうえおかきくけこイ
913 あ\rubytest いうえおかきくけこ
914 あ\rubytest いうえおかきくけこウ
915 あ\rubytest いうえおかきくけこエ
916 あ\rubytest いうえおかきくけこ
917 あ\rubytest いうえおかきくけこ
918 あ\rubytest いうえおかきくけこ}
919 %\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)}
920 \fbox{\box0}
921
922 \def\rubytest{\ruby{異|様}{い|よう}\relax}
923 \setbox0=\vbox{\hsize=19\zw%
924 あ\rubytest いうえくけ
925 あ\rubytest いうえくけこ
926 あ\rubytest いうえくけこ
927 あ\rubytest いうえくけこイ
928 あ\rubytest いうえおかきくけこ}
929 %\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)}
930 \fbox{\box0}
931
932 \def\rubytest{\ruby{□|■|□}{■■|□□□|■■}\relax}
933
934 \setbox0=\vbox{\hsize=23\zw%
935 あ\rubytest いうえおかきくけこうえおかきくけこ
936 あ\rubytest いうえおかきくけこうえおかきくけこ
937 あ\rubytest いう□おかきくけこうえおかきくけこ
938 あ\rubytest いう□おかきくけこうえおかきくけこ
939 あ\rubytest いう□おかきくけこうえおかきくけこ
940 あ\rubytest いうえおかきくけこ}
941 \fbox{\box0}
942
943 \begin{description}
944 \def\sample{又\ruby{承}{うけたまわ}る\quad \ruby{疎}{そ}\quad は\ruby{俄}{にわか}勉強
945   \quad 後\ruby{俄}{にわか}勉強\quad は\ruby{暁}{あかつき}に
946   は\ruby{俄}{にわか}に
947   \quad \ruby{休|憩|中}{きゆう|けい|ちゆう}かつ\ruby{視|聴|中}{し|ちよう|ちゆう}}
948 \item[標準] \sample
949 \item[肩つき] {\ltjsetruby{kata}\sample}
950 \end{description}
951
952 \newpage
953 \begin{LTXexample}[pos=t]
954 {\ltjsetruby{stretch=101}% 親文字均等割り禁止
955     \ruby{休|憩|中}{きゆう|けい|ちゆう}かつ\ruby{視|聴|中}{し|ちよう|ちゆう}%
956 }\quad
957 \textgt{\ruby{勉|強}{べん|きよう}と%
958     \ruby[fontcmd=\mcfamily]{勉|強}{べん|きよう}}\quad% ルビは明朝体
959 \ruby{コギト・エルゴ・スム}{Cogito ergo sum}\quad   % 欧文空白は伸長しない
960 \ruby[size=1]{Cogito ergo sum}{コギト・エルゴ・スム}% 欧文空白は伸長しない
961 \end{LTXexample}
962
963
964 \typeout{AAAAAA}
965 \setbox0=\vbox{\hsize20\zw
966   \ltjsetparameter{rubypreintrusion={`◆,1}}
967   \ltjsetparameter{rubypostintrusion={`◆,1}}
968   \def\TEST{\ruby{CD}{◆ンパクト・ディス◆}}
969   %\ltjsetparameter{xkanjiskip=.25\zw}
970   ◆◆◆\TEST ◆◆◆◆◆◆◆◆◆◆◆\TEST %
971   ◆◆◆◆◆◆\kern1\zw ◆◆◆◆◆◆◆◆◆\kern0.5\zw ◆◆◆◆◆◆◆◆◆◆◆◆◆◆\TEST ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
972
973   値とは\ruby{\texttt{;}}{セミコロン}で区切\\
974   ◆\ruby{A}{◆}◆\\◆\ruby{A}{◆◆}◆\\◆\ruby{A}{◆◆◆}◆\\◆\ruby{A}{◆◆◆◆}◆\\%
975   ◆\ruby{A}{◆◆◆◆◆}◆\\◆\ruby{A}{◆◆◆◆◆◆}◆\\◆A◆
976   
977   \makebox[10\zw][s]{値とは\ruby{\texttt{;}}{セミコロン}で区切}%
978
979   \ltjruby{痛}{いたみ}(\ltjruby{病}{びやう}あ
980
981   v0.53\ \ruby{コギト}{Cogito}
982   \ruby{コイト}{Coito}
983   \ruby{ノ}{no}
984   \ruby{ト}{TO}
985   \ruby{ヨ}{yo}
986   \ruby{ぢ}{dji}
987   \\
988   \ruby[intergap=-1.5]{ノ}{no}
989   \ruby[intergap=-1.5]{ト}{TO}
990   \ruby[intergap=-1.5]{ヨ}{yo}
991   \ruby[intergap=-1.5]{ぢ}{dji}
992            
993   v0.52\ \ruby[rubydepth=-1]{コギト}{Cogito}  % too high
994   \ruby[rubydepth=-1]{コイト}{Coito}  % too low
995   \ruby[rubydepth=-1]{ノ}{no}  % too low
996   \ruby[rubydepth=-1]{ト}{TO}  % too low
997   \ruby[rubydepth=-1]{ヨ}{yo}  % too high
998   \ruby[rubydepth=-1]{ぢ}{dji}  % too high
999   \\
1000   \ruby[intergap=-1.5,rubydepth=-1]{ノ}{no}  % too low
1001   \ruby[intergap=-1.5,rubydepth=-1]{ト}{TO}  % too low
1002   \ruby[intergap=-1.5,rubydepth=-1]{ヨ}{yo}  % too high
1003   \ruby[intergap=-1.5,rubydepth=-1]{ぢ}{dji}  % too high
1004
1005 }
1006 \fbox{\box0}
1007
1008 \newpage
1009 \section{『日本語組版処理の要件』20120403の例}
1010
1011 \newcommand*{\噂}{\CID{7642}}
1012 \newcommand*{\倦}{\CID{7674}}
1013 %================================== 横組
1014 \paragraph{3.3.1節}\ 
1015 \begin{LTXexample}[pos=t]
1016 \obeylines
1017 3.49 \ruby{君|子}{くん|し}は\ruby{和}{わ}して\ruby{同}{どう}ぜず
1018 3.50 \ruby{人}{ひと}に\ruby{誨}{おし}えて\ruby{\倦}{う}まず
1019 % モノルビ.面倒でも複数回の実行が必要
1020 3.51 \ruby{鬼}{き}\ruby{門}{もん}の\ruby{方}{ほう}\ruby{角}{がく}を%
1021      \ruby{凝}{ぎよう}\ruby{視}{し}する
1022 % 熟語ルビ
1023 3.52 \ruby{鬼|門}{き|もん}の\ruby{方|角}{ほう|がく}を\ruby{凝|視}{ぎよう|し}する
1024 3.53 \ruby{茅場町}{かやばちよう}\quad\ruby{茅|場}{かや|ば}\ruby{町}{ちよう}
1025 % 熟字訓
1026 3.54 \ruby{紫陽花}{あじさい}\quad\ruby{坩堝}{るつぼ}\quad\ruby{田舎}{いなか}
1027 % グループルビ
1028 3.55 \ruby{模型}{モデル}\quad\ruby{顧客}{クライアント}\quad%
1029      \ruby{境界面}{インターフエース}\quad\ruby{避難所}{アジール}
1030 3.56 \ruby{編集者}{editor}\quad \ruby{editor}{エデイター}
1031 \end{LTXexample}
1032
1033 \paragraph{3.3.3節}\ 
1034 \begin{LTXexample}[pos=t]
1035 \obeylines
1036 3.58 に\ruby{幟}{のぼり}を\quad に\ruby[kata]{幟}{のぼり}を\quad%
1037      \ruby{韋}{い}\ruby{編}{へん}\ruby{三}{さん}\ruby{絶}{ぜつ}
1038 % 三分ルビ.JY3/mc/mc は本文書のプリアンブルで独自に定義
1039 3.59 に\ruby[fontcmd=\kanjifamily{mc}\kanjiseries{mc}]{幟}{のぼり}を
1040 % ルビ文字を小さくする
1041 3.60 {\Large%
1042   \ruby{韋}{い}\ruby{編}{へん}\ruby{三}{さん}\ruby{絶}{ぜつ}\quad% 比較用
1043   \ltjsetruby{size=0.375}% 0.5 -> 0.375
1044   \ruby{韋}{い}\ruby{編}{へん}\ruby{三}{さん}\ruby{絶}{ぜつ}}
1045 \end{LTXexample}
1046
1047 \paragraph{3.3.4節}
1048 3.61図(両側ルビ)は未サポートにより省略
1049
1050 \newpage
1051 \paragraph{3.3.5節 モノルビ}\ 
1052 \begin{LTXexample}[pos=t]
1053 \obeylines
1054 3.62 の\ruby{葯}{やく}に
1055 3.63 版面の\ruby{地}{ち}に\quad 版面の\ruby[kata]{地}{ち}に
1056 % 横組肩つきはしないが,現状では縦組未サポートだし,仕方ないね
1057 3.65 の\ruby{砦}{とりで}に
1058 {\ltjsetruby{kata}%
1059 3.66上 の\ruby{旬}{しゆん}に\quad 後\ruby{旬}{しゆん}に
1060 3.66下 の\ruby{旬}{しゆん}又\quad 後\ruby{旬}{しゆん}又}
1061 \end{LTXexample}
1062
1063
1064 \paragraph{3.3.6節 グループルビ}\ 
1065 \begin{LTXexample}[pos=t]
1066 \obeylines
1067 3.67 は\ruby{冊子体}{コーデツクス}と
1068 3.68 \ruby{模型}{モデル}\quad \ruby{利用許諾}{ライセンス}
1069 % 両端を揃える流儀
1070 3.69 {\ltjsetruby{stretchruby=010}%
1071      \ruby{模型}{モデル}\quad \ruby{利用許諾}{ライセンス}}
1072 % ルビが極端に短い場合
1073 3.70 \ruby{なげきの聖母像}{ピエタ}\quad% ルビ全角まで許容
1074      \ruby[maxmargin=0.75]{なげきの聖母像}{ピエタ}\\% ルビ全角1.5倍まで
1075 % ルビが長い場合
1076 3.71 \ruby{顧客}{クライアント}\quad \ruby{境界面}{インターフエース}
1077 3.72 {\ltjsetruby{stretch=010, stretchbol=010, stretcheol=010}% はみ出さない流儀
1078      \ruby{顧客}{クライアント}\quad \ruby{境界面}{インターフエース}}
1079 \end{LTXexample} 
1080
1081 \newpage
1082 \paragraph{3.3.7節 熟語ルビ}\ 
1083 \begin{LTXexample}[pos=t]
1084 \obeylines
1085 3.73 \ruby{杞|憂}{き|ゆう}\quad \ruby{畏|怖}{い|ふ}\quad%
1086      \ruby[kata]{杞|憂}{き|ゆう}\quad \ruby[kata]{畏|怖}{い|ふ}
1087 3.74 の\ruby{流|儀}{りゆう|ぎ}を\quad   の\ruby{無|常}{む|じよう}を\quad%
1088      の\ruby{成|就}{じよう|じゆ}を\quad の\ruby{紋|章}{もん|しよう}を\quad%
1089      の\ruby{象|徴}{しよう|ちよう}を
1090 % 熟語の構成を考慮した方法は現行ではできない.
1091 % 行分割はできるのだが,「他の漢字にルビ全角までかかって良い」は難しい.
1092 3.75 {\ltjsetruby{kata}%
1093      の\ruby{流|儀}{りゆう|ぎ}を\quad   の\ruby{無|常}{む|じよう}を\quad%
1094      の\ruby{成|就}{じよう|じゆ}を\quad の\ruby{紋|章}{もん|しよう}を\quad%
1095      の\ruby{象|徴}{しよう|ちよう}を}
1096 % モノルビ配置.望ましくない
1097 3.76× の\ruby{流}{りゆう}\ruby{儀}{ぎ}を\quad の\ruby{無}{む}\ruby{常}{じよう}を\quad%
1098
1099 3.77  {\ltjsetruby{stretchbol=121, stretcheol=121}% 行頭・行末揃えず
1100      \hbox{\vrule\vbox{\hsize=10\zw\noindent\kern.75\zw
1101        あああああああの\ruby{流|儀}{りゆう|ぎ}がある.}\vrule}\quad%
1102      \hbox{\vrule\vbox{\hsize=5\zw ……等の\ruby{無|常}{む|じよう}を}\vrule}}
1103 \end{LTXexample} 
1104
1105 \paragraph{3.3.8節 ルビはみ出し}\ 
1106 \begin{LTXexample}[pos=t]
1107 \obeylines
1108 3.78 \ruby{人}{ひと}は\ruby{死}{し}して\ruby{名}{な}を\ruby{残}{のこ}す
1109 3.79 漢字の部首には\ruby{偏}{へん}・\ruby{冠}{かんむり}・\ruby{脚}{きやく}・%
1110      \ruby{旁}{つくり}がある
1111 3.79 漢字の部首には\ruby{偏}{へん},\ruby{冠}{かんむり},\ruby{脚}{きやく},%
1112      \ruby{旁}{つくり}がある
1113 \end{LTXexample}
1114 \begin{LTXexample}[pos=t]
1115 \obeylines
1116 3.79 この\ruby{\噂}{うわさ}の好きな人は\ruby{懐}{ふところ}ぐあいもよく、\ruby{檜}{ひのき}を
1117 3.80 漢字の部首には「\ruby{偏}{へん}」「\ruby{冠}{かんむり}」「\ruby{脚}{きやく}」%
1118 「\ruby{旁}{つくり}」がある
1119 3.80 この\ruby{\噂}{うわさ}好きな人は\ruby{懐}{ふところ}具合もよく、\ruby{檜}{ひのき}材を
1120 3.81× に\ruby{暁}{あかつき}の\kern-1\zw の\ruby{趣}{おもむき}を(良くない例)
1121 3.82 に\ruby{暁}{あかつき}の\ruby{趣}{おもむき}を
1122
1123 % 漢字・ひらがな・カタカナにルビを2分まで掛けても良い流儀
1124 {%
1125   \catcode`\<12%
1126   \makeatletter\count@="3040\loop\relax\ifnum \count@<"30FF%
1127   \ltjsetparameter{rubypreintrusion={\the\count@,0.5}, %
1128     rubypostintrusion={\the\count@,0.5}}%
1129   \advance\count@1 \repeat
1130   \ltjsetparameter{rubypostintrusion={`好,0.5}}
1131   \ltjsetparameter{rubypostintrusion={`具,0.5}}
1132   \ltjsetparameter{rubypostintrusion={`材,0.5}}
1133 3.83 この\ruby{\噂}{うわさ}の好きな人は\ruby{懐}{ふところ}ぐあいもよく、\ruby{檜}{ひのき}を
1134 3.83 この\ruby{\噂}{うわさ}好きな人は\ruby{懐}{ふところ}具合もよく、\ruby{檜}{ひのき}材を
1135 }
1136 % 平仮名にもルビを掛けない流儀
1137 {\catcode`\<12%
1138   \makeatletter\count@="3040\loop\relax\ifnum \count@<"30A0%
1139   \ltjsetparameter{rubypreintrusion={\the\count@,0}, %
1140     rubypostintrusion={\the\count@,0}}%
1141   \advance\count@1 \repeat
1142 3.84 この\ruby{\噂}{うわさ}の好きな人は\ruby{懐}{ふところ}ぐあいもよく、\ruby{檜}{ひのき}を
1143 3.84 この\ruby{\噂}{うわさ}好きな人は\ruby{懐}{ふところ}具合もよく、\ruby{檜}{ひのき}材を
1144 }
1145 \end{LTXexample}
1146 \begin{LTXexample}[pos=t]
1147 \obeylines
1148 3.85\ {\ltjsetruby{stretchbol=121, stretcheol=121}% 行頭・行末揃えず
1149 \hbox{\vrule\vbox{\hsize=15\zw
1150  \hskip9.5\zw……の\ruby{徑}{こみち}を……%
1151 \hskip9\zw……の\ruby{徑}{こみち}を……}\vrule}}
1152 3.86\ \hbox{\vrule\vbox{\hsize=15\zw
1153  \hskip10\zw……の\ruby{徑}{こみち}を……%
1154 \hskip9\zw……の\ruby{徑}{こみち}を……}\vrule}
1155 3.87\  \hbox{\vrule\vbox{\hsize=15\zw
1156  \hskip8\zw……共\ruby{飾り}{アクセサリー}等……%
1157 \hskip9\zw……共\ruby{飾り}{アクセサリー}等……}\vrule}
1158 \end{LTXexample}
1159
1160
1161 \paragraph{圏点の例(常用漢字表前書きより)}
1162 この表は,法令,公⽤⽂書,新聞,雑誌,放送など,⼀般の社会⽣活におい%
1163 て\kenten[kenten=﹅]{現代の国語を書き表す}場合の\kenten{漢字使⽤の⽬安を⽰す}ものである。
1164
1165 \subparagraph{「﹅」の大きさを親文字の0.33倍にした例}
1166 この表は,法令,公⽤⽂書,新聞,雑誌,放送など,⼀般の社会⽣活におい%
1167 て\kenten[size=0.33, kenten=﹅]{現代の国語を書き表す}場合の\kenten{漢字使⽤の⽬安を⽰す}ものである。
1168 \end{document}