これは「TeX & LaTeX Advent Caleandar 2014」の25日目の記事です。
(24日目は golden_luckyさん です。
とってもスゴイパッケージの紹介が相次いだ“TeX & LaTeX アドベントカレンダー”ですが、最終日の今日はチョットスゴイかもしれない(自作の)パッケージである pxrubrica を紹介します。これはルビ(振り仮名)付きのテキストを出力する機能を提供するものです。
ルビ出力のためのパッケージは既に数多くのものが公開されているのですが、pxrubrica は以下の特徴を持っています。
- 日本語組版における慣習を文書化した JIS X 4051 や 「日本語組版処理の要件」(JLREQ) にある規定に沿った、 伝統的な様式でのルビの組版を実現します。
- 実際のルビ組版で必要になる様々な調整について“パッケージの機能として”対応することを目指しています。つまり「ルビや親文字列に空白を混ぜ込んで辻褄を合わせる」等のバッドノウハウや、ユーザがパッケージを(TeXプログラミングで)“拡張する”必要性を排すべきと考えています。
TeX Live 2012以降(あるいは比較的新しい W32TeX)であれば pxrubrica パッケージは標準で含まれていてすぐに使えます。もし、pxrubrica.sty がシステムに含まれていない場合は、CTANからパッケージを入手してインストールして下さい。
※[追記2017-07-08] 1.3版[2017-04-27]で、圏点を付ける機能が追加されました。詳しくは以下の記事を参照してください。
パッケージの読込
通常通り \usepackage
で読み込みます。オプションはありません。
\usepackage{pxrubrica}
基本編
ルビを振るための命令は \ruby
で、書式は次の通りです。
\ruby[オプション]{親文字}{ルビ文字}
以下でこの命令の使い方を説明します。
※ \ruby
命令には \jruby
という別名が用意されています。既に \ruby
という命令が定義されていた場合(文書クラスが簡易的なルビ命令を提供している、或いは、LaTeX 上で Ruby 言語を実行するパッケージを使っている ;-) 等)は pxrubrica はそれを上書きしません。この場合は \jruby
を使ってください。
とにかく使ってみる
親文字(漢字)が1文字の場合は単純に親文字とルビ文字を引数に入れるだけです。
あれは\ruby{鷹}{たか}ではなく\ruby{鶯}{うぐいす}です。
親文字が2文字以上ある場合は、各文字に対応するルビ部分列の境界に |
を入れます。
\ruby{小鳩}{こ|ばと} \ruby{孔雀}{く|じゃく}
\ruby{七面鳥}{しち|めん|ちょう}
「雲雀→ひばり」のように各漢字ではなく全体としてのみ読みが与えられる(熟字訓)ような場合は、オプション g
を指定します。もちろんこの時はルビ文字引数に |
は入れません。
\ruby[g]{雲雀}{ひばり} \ruby[g]{不如帰}{ほととぎす}
モノルビ・グループルビ・熟語ルビ
ところで先の例の中で「孔雀」の出力に注目してください。次図の (A) のようになっていますが、これは (B) のようになるべきだと思った人もいるかも知れません。
しかし、伝統的な和文組版の慣習においては、(熟字訓でない)熟語のルビは (B) ではなく (A) のように出力します。「小鳩→こ|ばと」のように各漢字に対応する仮名が全て2文字以内の時は「各漢字の上に対応する仮名を出す」のですが、「孔雀→く|じゃく」の場合は、ルビの「じゃく」の幅が親文字1文字の幅に収まらないので、幅を合わせるために空きを入れる((B) のようにする)必要が出てきます。できるだけ空きは入れたくないので、実際には、「空いている漢字の所にルビ仮名を移動する」という処置((A) のようにする)が行われるのです。このようなルビの振り方を「熟語ルビ」と呼びます。
敢えて (B) のように出力したい場合は、\ruby
のオプションに m
を指定します。このようなルビの振り方を「モノルビ」と呼びます。
\ruby[m]{孔雀}{く|じゃく} \ruby[m]{七面鳥}{しち|めん|ちょう}
また、「雲雀→ひばり」の例のように親文字全体を塊として扱うルビの振り方(オプション g
)を「グループルビ」と呼びます。
まとめると、pxrubrica の“基本モード”には次の3つがあります。このうち、熟語ルビ(オプション j
)が既定となっています。
※本格的な熟語ルビの処置の方法はJLREQの付録に詳しく書かれていますが、相当複雑です。なので、pxrubrica パッケージでは熟語ルビの処置について JIS X 4051 に規定する簡単な方法を採用しました。
ルビを前後の文字にかける(進入指定)
ルビ文字列の幅が親文字列の幅を超える場合に、空きを入れる必要をできるだけ省くために、ルビ付き文字の前後にある文字の(上の)領域にルビを“かける”(進入させる)ことが、日本語組版においてよく行われます。
どういう場合にどの程度ルビを前後に“かけて”よいのかの規則は、前後にある文字の種別に依存していて結構複雑です。例えば、仮名にはルビを1文字まで“かける”ことが許されますが、漢字の場合は「その漢字のルビであると誤って認識される」ことを防ぐためにルビの進入を禁止するのが普通です。また運用される規則にも色々バリエーションがあって、「カタカナは漢字と同じ扱いにする」とか「漢字であっても半角までは進入を許す」という規則が行われることもあります。
こういう事情があり、またそもそもTeXにおいて「命令の前後にある文字の種類」を確実に判定するのが難しいという理由もあって、pxrubrica では、適切な進入の指定を自動判定することは避けて \ruby
命令のオプションとして手動で指定する仕様にしています。進入の指定は「なし」「小(ルビ半角まで許可)」「大(ルビ全角まで許可)」の3つが選べます。
オプション文字列の書き方ですが、-
の左にある文字(|
(
<
)が「前への進入」、右にある文字(|
)
>
)が「後への進入」の指定を表します。前と後で指定を変えることも可能です。
% 仮名にはかけるが漢字はダメ
この\ruby[<-|]{鵲}{かささぎ}達の
また、“基本モード”の指定(m
g
j
)と進入の指定を同時に行う場合は、-
の箇所をその文字に置き換えます。(詳細は「発展編」で扱います。)
% <-| でかつ g
この\ruby[<g|]{時鳥}{ほととぎす}達の
ルビと親文字の橋を揃える(突出指定)
先に述べた「進入指定」は「ルビと親文字の相対的な位置関係」には影響を与えません。なので、ルビの幅が親文字の幅を超える場合、進入指定が何であっても、ルビの文字列は親文字の両側にはみ出すことになります。しかし、行頭においては、ルビと親文字の左端を揃える(突出の抑止)ことが好まれる場合もあります。
ルビ付文字の前あるいは後で突出を止めたい場合は、そちら側の「進入指定」のオプション文字を ||
にします。つまり、「前は突出抑止(当然進出もなし)、後は進出大」としたいなら ||->
と指定します。(当然ですが、両側に突出禁止を指定することはできません。)
\fbox{\parbox{8zw}{%
\ruby[|->]{雀}{すずめ}とか。% 突出あり
インコとか。
\ruby[||->]{雀}{すずめ}とか。% 突出禁止
}}
肩付きルビ
縦書きにおける、ルビが親文字より短い場合の配置方法について、「肩付き」(上端を揃える)、「中付き」(中央を揃える)の2つから選ぶことができます。オプション文字は、肩付きが h
、中付きが c
です。
※「突出禁止」と「肩付き」は「前側を揃える」という点で類似した機能ですが、突出(および進入)の指定はルビが親文字より長い場合にのみ意味をもち、「肩付き」の指定はルビが親文字より短い場合にのみ働くという違いがあります。
※横書きでは肩付きの指定(h
)は無視され、常に中付き(c
)が適用されます。(例は縦書き出力のものです。)
ルビの文字サイズ
既定ではルビの文字サイズは親文字の半分になります。普通はこれでいいですが、サイズの大きい文字にルビを振る場合はルビのサイズを普通よりも小さくした方がバランスが良くなることがあります。
ルビの文字サイズを変更するには \rubysizeratio{サイズ}
を実行します。サイズは親文字のサイズに対する相対値を小数で指定します。
\ruby[g]{不如帰}{ほととぎす} %既定の設定
% 大きい文字について, ルビの文字サイズを親文字の35%にする
{\rubysizeratio{0.35}%
\huge \ruby[g]{不如帰}{ほととぎす}}
※ グルーピング内で \rubysizeratio
を実行した場合、その効力はグルーピングの中に限定されます。
“一文字”の範囲を明示する
pxrubrica の内部処理では、与えられた文字列を「文字ごとに分割する」という処理を行っています。このため、例えば OTF パッケージの \CID{....}
のように“LaTeXの命令として表される文字”はそのままでは引数に入れることができません。
このような“文字”をルビ命令の中で使いたい場合は、一文字扱いする範囲を{}
で囲む必要があります。
% (OTFパッケージ読込の前提)
% <鵠>の特定の異体字を用いる
\ruby{鴻{\CID{7683}}}{こう|こく}
※〈鵠〉を直接書いた場合にどちらの字形が出力されるかは、様々な設定に依存します。
既定値の変更
これまでに取り上げたオプションのについて、その既定値は「熟語ルビ、中付き、進出なし(つまり |cj|
相当)」となっています。\rubysetup{オプション文字列}
命令をこの既定値を別の値に変えることができます。この命令の引数には、\ruby
のオプションと同様の書式の“オプション文字列”を指定します。
% 既定値は"熟語ルビ, 進出なし"
これは\ruby{七面鳥}{しち|めん|ちょう}です。
{\rubysetup{<m>}% 既定を"モノルビ, 進出大"に変更
これは\ruby{七面鳥}{しち|めん|ちょう}かと思ったら、}%
% グループを出たので元の既定値に戻る
やっぱり\ruby{七面鳥}{しち|めん|ちょう}です。
※ グルーピング内で \rubysetup
を実行した場合、その効力はグルーピングの中に限定されます。
発展編
オプション文字列の構造
さてこれまで見てきたように、オプション文字列はちょっと癖のある書式になっています。\ruby
命令ごとに異なるオプションを指定する必要性が高いため、できるだけ簡潔に書けるようにしているからです。
オプション文字列は次のように5つの部分から成り立っています。
(前進入設定)(前補助設定)(モード)(後補助設定)(後進入設定)
-
(前進入設定)
は||
,|
,(
,<
の中の1つを指定するか、省略します。省略した場合は既定値が使われます。 -
(後進入設定)
は||
,|
,)
,>
の中の1つを指定するか、省略します。省略した場合は既定値が使われます。 -
(モード)
については任意の個数の値を指定できます。2つ以上指定したい場合はhm
(肩付き、モノルビ)のように文字を並べます。全く指定しない(既定値を使う)場合はこの部分を-
にします(省略するのではない)。今までに登場したモード指定にはm
,g
,j
,c
,h
があります。 -
(前補助設定)
と(後補助設定)
(記事中にはまだ登場していません)は任意の個数の値を指定できます。複数の値は文字を並べて指定し、全く指定しない場合は省略します。
前進入設定と後進入設定の両方で |
と ||
が有効な文字になっていますが、「モード部分が無指定の場合は -
とする(つまり空にならない)」という規則があるため区別ができるわけです(||-
は前突出禁止、-||
は後突出禁止)。前補助設定と後補助設定にも同じ文字がありますが、これも同様に区別できます。(ちなみに、有効な文字が重複するパターンはこれ以外にはありません。)
実際には曖昧にならない場合は -
を省略できる(例えば <-
は <
でもよい)のですが、将来のバージョンでオプションが追加された場合に曖昧になる可能性があるので避けた方がよいでしょう。ただし全ての“部分”を無指定にする(つまり既定値そのままを使う)場合はオプションを空文字列にしてもよく、またこの場合はオプション引数自体を省略できます(\ruby[-]...
→ \ruby...
)。
拡張肩付き
肩付き(モード h
)を指定した場合、ルビが親文字よりも短い場合にのみ適用されますが、ルビの方が長い場合は中付き指定の時と同様に中央が揃います。“拡張肩付き”(モード H
)を指定すると、ルビの方が長い場合でも頭が揃う出力になります。
\parbox<t>{3zw}{% 縦書きの例
% '鳥'は中付きになる
\ruby[hm]{鵞鳥}{が|ちょう}\\
% '鳥'も肩付きになる
\ruby[Hm]{鵞鳥}{が|ちょう}
}
小書き文字の自動変換
(漢語の読み方を示す)ルビの文字列の中では、「小書きの仮名(ゃ ゅ ょ っ 等)は使わずに代わりに小書きでない仮名で書く(がちょう → がちよう)」という慣習があります。本来の読み(がちょう)で入力することを可能にするために「小書き文字の自動変換」の機能を用意しています。
下側(左側)ルビ・両側ルビ
ルビを親文字の上側・下側(縦書きでは右側・左側)のどちらに付けるかを選択できます。
また、\truby[オプション]{親文字}{上側ルビ}{下側ルビ}
で両側ルビを出力できます。
\truby{閑古鳥}{かんこどり}{かっこう}
※両側ルビは常にグループルビとして扱われます。
欧文に対してルビを振る
親文字が欧文である場合は、\ruby
(または \jruby
)の代わりに \aruby
命令を使ってください。命令の書式は \ruby
と全く同じです。(両側ルビの \atruby
命令もあります。)
% どうして君は黙らないのかね?
?`\aruby{Por}{ポル} \aruby{qu\'e}{ケ} \aruby{no}{ノ} %
\aruby{te}{テ} \aruby{callas}{カージャス}?
※欧文ルビは常にグループルビとして扱われます。
ルビ用のフォントを指定する
\rubyfontsetup{フォント命令}
を実行すると、\ruby
命令などでルビの文字列を出力するときに前もって引数に書いた フォント命令
が実行されます。ルビは必ず(親文字がゴシック体でも)明朝体で出力したい、あるいは japanese-otf パッケージにおけるルビ用仮名字形(\rubyfamily
)に切り替えたい、という場合に使います。
% フォントをゴシックに変える
{\gtfamily \ruby[g]{文鳥}{ぶんちょう} %
% ルビだけ明朝体に変える
\rubyfontsetup{\mcfamily}\ruby[g]{明朝}{みんちょう}}
補助設定
pTeXエンジンの技術的制限のため、ルビ付文字列とその前後の文字の間の組版的な調整が上手くいかない場合があります。これを手動で補正するために「補助設定」の機能が用意されています。
“四分空き”の補充
日本語組版の慣習では、和文と欧文の間に小さな空き(“四分空き”)を挿入します。通常、pLaTeXでは四分空きは自動的に挿入されます。
祝鳥v0.88r1
ところがここで和文に \ruby
でルビを付けると四分空きが消えてしまいます。
\ruby[g]{祝鳥}{のりてふ}v0.88r1
この場合、「後補助設定」(モード指定より後)として :
を指定するとルビ付文字の後に四分空きが挿入されます。
\ruby[g:]{祝鳥}{のりてふ}v0.88r1
※モード指定より前に:
を入れるとルビ付文字の前に四分空きが入ります(前補助設定)。
“禁則処理”の補充
pLaTeXの通常の処理では適切な“禁則処理”(句読点が行頭に来るのを禁止する、等)が行われます。\ruby
でルビを付けた文字についても、ほとんどの場合は禁則処理は正しく行われますが、込み入った場合については禁則処理が機能しないことがあります。
%(colorパッケージ使用)
\parbox{10zw}{% 行長を全角10文字にする
まるで、炭鉱の\textcolor{red}{\ruby[g]{金糸雀}{カナリア}}、
ではないか。
}
※ \textcolor
だけ、あるいは \ruby
だけの場合は正しく禁則処理が働きます。
この場合、「後補助設定」として *
を指定するとルビ付文字の直後での行分割が禁止されます。
%(colorパッケージ使用)
\parbox{10zw}{% 行長を全角10文字にする
まるで、炭鉱の\textcolor{red}{\ruby[g*]{金糸雀}{カナリア}}、
ではないか。
}
段落先頭・末尾での進入許可
段落の先頭・末尾では、通常は進入が抑止されています。(これは、不注意でルビがテキストの領域をはみ出してしまうのを防止するためです。)
\rubysetup{<->}% 既定で進入を許可する
\begin{minipage}{10zw}\setlength{\parindent}{1zw}%段落下げ有り
\ruby[-|]{燕雀}{えん|じやく}\ruby[|-]{安}{いづく}んぞ
\ruby{鴻鵠}{こう|こく}の志を知らんや。
\end{minipage}
上の例では、段落先頭にある「燕雀」のルビが進入しないため、結果的に「燕」の前に全角よりも大きな空きが生じています。「燕雀」のルビを前に進入させるには、「前補助設定」として !
を指定します。
\rubysetup{<->}
\begin{minipage}{10zw}\setlength{\parindent}{1zw}
% 段落先頭だが進入する
\ruby[!-|]{燕雀}{えん|じやく}\ruby[|-]{安}{いづく}んぞ
\ruby{鴻鵠}{こう|こく}の志を知らんや。
\end{minipage}
パッケージ機能一覧
パッケージで提供される命令の一覧(抜粋)。
-
\ruby[オプション]{親文字}{ルビ文字}
: 和文にルビを付ける。 -
\aruby[オプション]{親文字}{ルビ文字}
: 欧文にルビを付ける。 -
\truby[オプション]{親文字}{上側ルビ}{下側ルビ}
: : 和文に両側ルビを付ける。 -
\atruby[オプション]{親文字}{上側ルビ}{下側ルビ}
: : 欧文に両側ルビを付ける。 -
\jruby
:\ruby
の別名。 -
\rubysetup{オプション}
: オプションの既定値を変更する。 -
\rubyfontsetup{フォント命令}
: ルビ用のフォントの設定。 -
\rubybigintrusion{進入量}
: 進入“大”の時の進入量(ルビ全角単位、既定値 = 1) -
\rubysmallintrusion{進入量}
: 進入“小”の時の進入量(ルビ全角単位、既定値 = 0.5) -
\rubyintergap{空き量}
: ルビと親文字の間の空き(親文字全角単位、既定値 = 0)
オプション文字列は次のように5つの部分から成ります。
(前進入設定)(前補助設定)(モード)(後補助設定)(後進入設定)
〔前進入設定〕
文字 | 意味 |
---|---|
ǀǀ |
前突出禁止 |
ǀ |
前進入無し |
( |
前進入小 |
< |
前進入大 |
〔後進入設定〕
文字 | 意味 |
---|---|
ǀǀ |
後突出禁止 |
ǀ |
後進入無し |
) |
後進入小 |
> |
後進入大 |
〔前補助設定/後補助設定〕
文字 | 意味 |
---|---|
: |
和欧文間空白挿入 |
. |
空白挿入無し |
* |
行分割禁止 |
! |
段落冒頭(末尾)で進入許可 |
〔モード〕
文字 | 意味 | 備考 |
---|---|---|
- |
(無指定 ) | |
c |
中付き | <center |
h |
肩付き | <head |
H |
拡張肩付き | |
m |
モノルビ | <mono |
g |
グループルビ | <group |
j |
熟語ルビ | <jukugo |
P |
上側(右側)配置 | <primary |
S |
下側(左側)配置 | <secondary |
e |
親文字均等割り有効 | <even-space |
E |
親文字均等割り無効 | |
f |
小書き文字変換有効 | <full-size |
F |
小書き文字変換無効 |
まとめ
LaTeXでルビを振る必要が生じた場合も心配は要りません! TeX言語もバッドノウハウも要りません! pxrubrica パッケージで美しい日本のルビ組版を実践しましょう!