マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

ルビはじめました(PXrubrica パッケージ)(2)

前回の続き。

『日本語組版処理の要件』の 3.3 節の残りの部分の例を再現する。

  • ルビ文字を隣接する地の文の領域に進入させる場合、文字種(平仮名、片仮名、漢字、約物、等)によって進入の可否を変える必要があるが、その判断を自動で行うのは難しい(不確実性が上がる)ので、手動で行うことを前提とする。ルビ文字全角幅まで許す(<->)、半角幅まで許す((-))、許さない(|-|)の選択を、各ルビ命令単位で行える。場合によっては左右で異なる指定が必要なことに注意:この\ruby[<j|]{業態}{ぎよう|たい}等((この場合、熟語ルビは結局グループルビとして組まれる。親文字列とルビ文字列を中央揃えにするという性質は、進入の設定(<j|)に影響されないことに注意(「突出禁止設定(||)」は影響する)。結果的にルビ半角幅が左右に突出するが、左側のみが前の仮名に進入し、右側は空きを生じる。))
  • 附属書 F で述べられている「熟語の構成,さらにその熟語の前後にくる文字の種類を考慮して配置する」には対応していない。無論、「結果の出力形を(手動で)求めておいて、それと一致するようにオプションを決める」ことは可能であるが、それは私の掲げる目的には沿わない。現在の熟語ルビの処理方法は、JIS X 4051 で規定されている通りで、「対応のルビ文字列の方が長くなる親文字が 1 つでもあったら全体をグループルビに切り替える」(『要件』の図 130)となっている。そしてこの場合、(JIS X 4051 に反して)途中で行分割ができなくなるという欠点をもつ。
  • 上の出力例の一番最後では、「行頭・行末ではルビ文字列と親文字列の端を揃える」という様式を行っているが、これは実は、行頭・行末にあることを自動で検知しているのでなく、手動で「端を揃える」オプション(||-|)を入力している。先述の「前後の文字により進入の可否を決める」の話と異なり、「行頭・行末にあるか」は組版の結果を見ないと解らない(おまけに「端を揃える」オプションを入れると、それ自体のせいで位置が変わる可能性すらある)ので、この様式を行うのはあまり実用的でない。
  • 実は、TeX では「行頭・行末にあるか否か(あるいは行分割されたか否か)に応じて組み方を変える」という処理が本質的に難しい。「TeX Q & A」の qa:55529 から始めるスレッドを読むと解るが、一応そういう類の処理を行う機能はある*1が、日本語のルビ処理に関しては機能不足なのである。従って、現状では、「端を揃える」を行うのは難しい。熟語ルビの途中で行分割できないのも同じ理由である。((例えば、\ruby[j]{業態}{ぎよう|たい} はグループルビで組まれるが、〈業〉と〈態〉の間で分割することを許すと、その場合はモノルビの組み方になり、親文字とルビ文字の位置関係が変わる。))
  • しかし、同じスレッドの中で触れられているように、ある種のトリックや pdfTeX の拡張機能*2を用いて複数パス処理を行うという(難度の高い)方法を駆使すれば可能であるはずである。余裕があればこういう拡張を行っていきたい。
\documentclass{jsarticle}
\usepackage{otf}
\usepackage{plext}
\usepackage{pxrubrica}
\rubysetup{<j>} % 熟語ルビで、隣接文字に半角までかけるのを許可するのを既定とする
\rubyintergap{0.04} % ルビと親文字の間の空き(既定値は 0)
\begin{document}

\begin{center}
%======================================= 縦組
\begin{minipage}<t>{20zw}
%--------------------------------------- 3.3.8節
\rubysetup{<->} % ルビ全角までかけるのを許すのを既定値とする
\ruby{}{ひと}\ruby{}{}して\ruby{}{}\ruby{}{のこ}\par
漢字の部首には\ruby{}{へん}\ruby{}{かんむり}\ruby{}{きやく}\ruby{}{つくり}がある\par
漢字の部首には\ruby{}{へん}\ruby{}{かんむり}\ruby{}{きやく}\ruby{}{つくり}がある\par
\newcommand*{\噂}{\CID{7642}} % \CID{...} をマクロにすると { } が不要になる
この\ruby{\噂}{うわさ}の好きな人は\ruby{}{ふところ}ぐあいもよく、\ruby{}{ひのき}\par
漢字の部首には「\ruby{}{へん}」「\ruby{}{かんむり}」「\ruby{}{きやく}」「\ruby{}{つくり}」が\par
この\ruby[-|]{\噂}{うわさ}好きな人は\ruby[-|]{}{ふところ}具合もよく、\ruby[-|]{}{ひのき}材を\par
\rubysetup{(-)} % ルビ半角までかけるのを許すのを既定値とする
この\ruby{\噂}{うわさ}の好きな人は\ruby{}{ふところ}ぐあいもよく、\ruby{}{ひのき}\par
この\ruby{\噂}{うわさ}好きな人は\ruby{}{ふところ}具合もよく、\ruby{}{ひのき}材を\par
\rubysetup{<->} % ルビ全角までに戻す
\ruby{}{こみち}を34567890123456789
123456(8。)123456789\ruby{}{こみち}123……\par
{\gtfamily$\downarrow$ は少しインチキしています}\par
  % つまり予め行頭・行末に来ることを見越して入力を変えている
\ruby[||g|]{飾り}{アクセサリー}等5678901234567890
1234567890123456共\ruby[|g||]{飾り}{アクセサリー}123……\par
\end{minipage}
\end{center}

\end{document}

*1:「discretionary」と呼ばれる機能。例えば、「ドイツ語旧正書法では decken を分綴すると dek- + ken となる」といった処理はこの機能で実現できる。

*2:最近の e-pTeX にも実装されている……はず。