83
65

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LaTeX 文書で“美しい日本の”ルビを使う ~pxrubrica パッケージ~

Last updated at Posted at 2014-12-24

これは「TeX & LaTeX Advent Caleandar 2014」の25日目の記事です。
(24日目は golden_luckyさん です。

とってもスゴイパッケージの紹介が相次いだ「TeX & LaTeXアドベントカレンダー」ですが、最終日の今日はチョットスゴイかもしれない(自作の)パッケージであるpxrubricaを紹介します。これはルビ(振り仮名)付きのテキストを出力する機能を提供するものです。

ルビ出力のためのパッケージは既に数多くのものが公開されているのですが、pxrubricaは以下の特徴を持っています。

  • 日本語組版における慣習を文書化したJIS X 4051や 「日本語組版処理の要件」(JLREQ) にある規定に沿った、 伝統的な様式でのルビの組版を実現します。
  • 実際のルビ組版で必要になる様々な調整について“パッケージの機能として”対応することを目指しています。つまり「ルビや親文字列に空白を混ぜ込んで辻褄を合わせる」等のバッドノウハウや、ユーザがパッケージを(TeXプログラミングで)“拡張する”必要性を排すべきと考えています。

TeX Live 2012以降であればpxrubricaパッケージは標準で含まれていてすぐに使えます。もし、pxrubrica.styがシステムに含まれていない場合は、CTANからパッケージを入手してインストールして下さい。

【追記2017-07-08】 1.3版[2017-04-27]で、圏点を付ける機能が追加されました。詳しくは以下の記事を参照してください。

パッケージの読込

通常通り\usepackageで読み込みます。オプションはありません。

\usepackage{pxrubrica}

基本編

ルビを振るための命令は\rubyで、書式は次の通りです。

\ruby[オプション]{親文字}{ルビ文字}

以下でこの命令の使い方を説明します。

\ruby命令には\jrubyという別名が用意されています。既に\rubyという命令が定義されていた場合(文書クラスが簡易的なルビ命令を提供している、或いは、LaTeX上でRuby言語を実行するパッケージを使っている:upside_down:等)はpxrubricaはそれを上書きしません。この場合は\jrubyを使ってください。

とにかく使ってみる

親文字(漢字)が1文字の場合は単純に親文字とルビ文字を引数に入れるだけです。

あれは\ruby{}{たか}ではなく\ruby{}{うぐいす}です。

image-pxrubrica-1.png

親文字が2文字以上ある場合は、各文字に対応するルビ部分列の境界に|を入れます。

\ruby{小鳩}{こ|ばと} \ruby{孔雀}{く|じゃく}
\ruby{七面鳥}{しち|めん|ちょう}

image-pxrubrica-2.png

「雲雀→ひばり」のように各漢字ではなく全体としてのみ読みが与えられる(熟字訓)ような場合は、オプションgを指定します。もちろんこの時はルビ文字引数に|は入れません。

\ruby[g]{雲雀}{ひばり} \ruby[g]{不如帰}{ほととぎす}

image-pxrubrica-3.png

モノルビ・グループルビ・熟語ルビ

ところで先の例の中で「孔雀」の出力に注目してください。次図の(A)のようになっていますが、これは(B)のようになるべきだと思った人もいるかも知れません。

image-pxrubrica-a1.png

しかし、伝統的な和文組版の慣習においては、(熟字訓でない)熟語のルビは(B)ではなく(A)のように出力します。「小鳩→こ|ばと」のように各漢字に対応する仮名が全て2文字以内の時は「各漢字の上に対応する仮名を出す」のですが、「孔雀→く|じゃく」の場合は、ルビの「じゃく」の幅が親文字1文字の幅に収まらないので、幅を合わせるために空きを入れる((B)のようにする)必要が出てきます。できるだけ空きは入れたくないので、実際には「空いている漢字の所にルビ仮名を移動する」という処置((A)のようにする)が行われるのです。このようなルビの振り方を「熟語ルビ」と呼びます。

敢えて(B)のように出力したい場合は、\rubyのオプションにmを指定します。このようなルビの振り方を「モノルビ」と呼びます。

\ruby[m]{孔雀}{く|じゃく} \ruby[m]{七面鳥}{しち|めん|ちょう}

image-pxrubrica-4.png

また、「雲雀→ひばり」の例のように親文字全体を塊として扱うルビの振り方(オプションg)を「グループルビ」と呼びます。

まとめると、pxrubricaの“基本モード”には次の3つがあります。

  • モノルビm): \ruby[m]{小鳩}{こ|ばと}
    image-pxrubrica-5.png

  • グループルビg): \ruby[g]{小鳩}{こばと}
    image-pxrubrica-6.png

  • 熟語ルビj): \ruby[j]{小鳩}{こ|ばと}
    image-pxrubrica-7.png

本格的な熟語ルビの処置の方法はJLREQの付録に詳しく書かれていますが、相当複雑です。なので、pxrubricaパッケージでは熟語ルビの処置についてJIS X 4051に規定する簡単な方法を採用しました。

“基本モード”の既定値は「熟語ルビとグループルビのうちの適切な方を自動判定1」となっています。つまり、敢えてモノルビを選択するのでない限り、モードオプションの指定は不要です。

ルビを前後の文字にかける(進入指定)

ルビ文字列の幅が親文字列の幅を超える場合に、空きを入れる必要をできるだけ省くために、ルビ付き文字の前後にある文字の上の領域にルビを“かける”(進入させる)ことが、日本語組版においてよく行われます。

どういう場合にどの程度ルビを前後に“かけて”よいのかの規則は、前後にある文字の種別に依存していて結構複雑です。例えば、仮名にはルビを1文字まで“かける”ことが許されますが、漢字の場合は「その漢字のルビであると誤って認識される」ことを防ぐためにルビの進入を禁止するのが普通です。また運用される規則にも色々バリエーションがあって、「カタカナは漢字と同じ扱いにする」とか「漢字であっても半角までは進入を許す」という規則が行われることもあります。

こういう事情があり、またそもそもTeXにおいて「命令の前後にある文字の種類」を確実に判定するのが難しいという理由もあって、pxrubricaでは、適切な進入の指定を自動判定することは避けて\ruby命令のオプションとして手動で指定する仕様にしています。進入の指定は「なし」「小(ルビ半角まで許可)」「大(ルビ全角まで許可)」の3つが選べます。

  • 進入なし|-|、既定): この\ruby[|-|]{鵲}{かささぎ}の
    image-pxrubrica-8.png

  • 進入小(-)): この\ruby[(-)]{鵲}{かささぎ}の
    image-pxrubrica-9.png

  • 進入大<->): この\ruby[<->]{鵲}{かささぎ}の
    image-pxrubrica-10.png

オプション文字列の書き方ですが、-の左にある文字(|(<)が「前への進入」、右にある文字(|)>)が「後への進入」の指定を表します。前と後で指定を変えることも可能です。

% 仮名にはかけるが漢字はダメ
この\ruby[<-|]{}{かささぎ}達の

image-pxrubrica-11.png

また、“基本モード”の指定(mgj)と進入の指定を同時に行う場合は、-の箇所をその文字に置き換えます。(詳細は「発展編」で扱います。)

% <-| でかつ g
この\ruby[<g|]{時鳥}{ほととぎす}達の

image-pxrubrica-b6.png

ルビと親文字の橋を揃える(突出指定)

先に述べた「進入指定」は「ルビと親文字の相対的な位置関係」には影響を与えません。なので、ルビの幅が親文字の幅を超える場合、進入指定が何であっても、ルビの文字列は親文字の両側にはみ出すことになります。しかし、行頭においては、ルビと親文字の左端を揃える(突出の抑止)ことが好まれる場合もあります。

ルビ付文字の前あるいは後で突出を止めたい場合は、そちら側の「進入指定」のオプション文字を||にします。つまり、「前は突出抑止(当然進出もなし)、後は進出大」としたいなら||->と指定します。(当然ですが、両側に突出禁止を指定することはできません。)

\fbox{\parbox{8zw}{%
\ruby[|->]{}{すずめ}とか。% 突出あり

インコとか。

\ruby[||->]{}{すずめ}とか。% 突出禁止
}}

image-pxrubrica-13.png

肩付きルビ

縦書きにおける、ルビが親文字より短い場合の配置方法について、「肩付き」(上端を揃える)、「中付き」(中央を揃える)の2つから選ぶことができます。オプション文字は、肩付きがh、中付きがcです。

横書きでは肩付きの指定(h)は無視され、常に中付き(c)が適用されます。(以下の例は縦書き出力のものです。)

  • 中付きc、既定): \ruby[h]{鵜}{う}
    image-pxrubrica-15.png

  • 肩付きh): \ruby[h]{鵜}{う}
    image-pxrubrica-14.png

「突出禁止」と「肩付き」は「前側を揃える」という点で類似した機能ですが、突出(および進入)の指定はルビが親文字より長い場合にのみ意味をもち、「肩付き」の指定はルビが親文字より短い場合にのみ働くという違いがあります。

ルビの文字サイズ

既定ではルビの文字サイズは親文字の半分になります。普通はこれでいいですが、サイズの大きい文字にルビを振る場合はルビのサイズを普通よりも小さくした方がバランスが良くなることがあります。

ルビの文字サイズを変更するには\rubysizeratio{サイズ}を実行します。サイズは親文字のサイズに対する相対値を小数で指定します。

\ruby[g]{不如帰}{ほととぎす} %既定の設定

% 大きい文字について, ルビの文字サイズを親文字の35%にする
{\rubysizeratio{0.35}%
\huge \ruby[g]{不如帰}{ほととぎす}}

image-pxrubrica-16.png
image-pxrubrica-17.png

グルーピング内で\rubysizeratioを実行した場合、その効力はグルーピングの中に限定されます。

“一文字”の範囲を明示する

pxrubricaの内部処理では、入力の文字列を「文字ごとに分割する」という処理を行っているため、ルビ命令の引数に入れられるのは単純な文字に限られます。従って、例えばjapanese-otfパッケージの\CID{....}のように「LaTeXの命令として表される文字」はそのままでは引数に入れることができません。

(失敗)
% "\CID{7683}"は"単純な文字"ではないのでダメ
\ruby{\CID{7683}}{こう|こく}

このような“文字”をルビ命令の中で使いたい場合は、一文字扱いする範囲を{}で囲む必要があります。

% (\usepackage{otf} した前提)
% <鵠>の異体字である"\CID{7683}"を親文字中に用いる
\ruby{{\CID{7683}}}{こう|こく}

image-pxrubrica-a3.png

〈鵠〉を直接書いた場合にどちらの字形が出力されるかは、様々な設定に依存します。

逆にいうと、{}で囲った中であれば任意の(インラインの)命令が使用可能です。これを利用してルビ文字列の一部に装飾(色付けや太字)を加えることができます。

% (\usepackage[deluxe]{otf} および \usepackage{color} した前提)
% "が"だけ太字かつ赤色にする
\ruby{大烏}{おお|{\color{red}\textbf{}}らす}

image-pxrubrica-c1.png

\'e等の欧文のアクセント付文字を使いたい場合も{}が有用です。ただし、欧文ではそもそも「単語中の文字の均等割り」は望ましくないため、単語全体を{}で囲む方が適切でしょう。

% 中国語のピンインをルビに振る例 (企鵝=ペンギン)
% "q\`i"全体を1文字扱いする
\ruby{企鵝}{{q\`i}|{'\'e}}%
% これだと英字が均等割りされてしまう!
\ruby{企鵝}{q{\`i}|'{\'e}}

image-pxrubrica-c2.png

既定値の変更

これまでに取り上げたオプションのについて、その既定値は「自動切換熟語ルビ2、中付き、進出なし(つまり|cJ|相当)」となっています。\rubysetup{オプション文字列}命令でこの既定値を別の値に変えることができます。この命令の引数には、\rubyのオプションと同様の書式の“オプション文字列”を指定します。

% 既定値は"自動切換熟語ルビ, 進出なし"
これは\ruby{七面鳥}{しち|めん|ちょう}です。

{\rubysetup{<m>}% 既定を"モノルビ, 進出大"に変更
これは\ruby{七面鳥}{しち|めん|ちょう}かと思ったら、}%
% グループを出たので元の既定値に戻る
やっぱり\ruby{七面鳥}{しち|めん|ちょう}です。

image-pxrubrica-18.png

グルーピング内で\rubysetupを実行した場合、その効力はグルーピングの中に限定されます。

発展編

オプション文字列の構造

さてこれまで見てきたように、オプション文字列はちょっと癖のある書式になっています。\ruby命令ごとに異なるオプションを指定する必要性が高いため、できるだけ簡潔に書けるようにしているからです。

オプション文字列は次のように5つの部分から成り立っています。

(前進入設定)(前補助設定)(モード)(後補助設定)(後進入設定)
  • (前進入設定)|||(<の中の1つを指定するか、省略します。省略した場合は既定値が使われます。
  • (後進入設定)|||)>の中の1つを指定するか、省略します。省略した場合は既定値が使われます。
  • (モード)については任意の個数の値を指定できます。2つ以上指定したい場合はhm(肩付き、モノルビ)のように文字を並べます。全く指定しない(既定値を使う)場合はこの部分を-にします(省略するのではない)。今までに登場したモード指定にはmgjJchがあります。
  • (前補助設定)(後補助設定)(記事中にはまだ登場していません)は任意の個数の値を指定できます。複数の値は文字を並べて指定し、全く指定しない場合は省略します。

前進入設定と後進入設定の両方で|||が有効な文字になっていますが、「モード部分が無指定の場合は-とする(つまり空にならない)」という規則があるため区別ができるわけです(||-は前突出禁止、-||は後突出禁止)。前補助設定と後補助設定にも同じ文字がありますが、これも同様に区別できます。(ちなみに、有効な文字が重複するパターンはこれ以外にはありません。)

実際には曖昧にならない場合は-を省略できる(例えば<-<でもよい)のですが、将来のバージョンでオプションが追加された場合に曖昧になる可能性があるので避けた方がよいでしょう。ただし全ての“部分”を無指定にする(つまり既定値そのままを使う)場合はオプションを空文字列にしてもよく、またこの場合はオプション引数自体を省略できます(\ruby[-]...\ruby...)。

拡張肩付き

肩付き(モードh)を指定した場合、ルビが親文字よりも短い場合にのみ適用されますが、ルビの方が長い場合は中付き指定の時と同様に中央が揃います。“拡張肩付き”(モードH)を指定すると、ルビの方が長い場合でも頭が揃う出力になります。

\parbox<t>{3zw}{% 縦書きの例
% '鳥'は中付きになる
\ruby[hm]{鵞鳥}{が|ちょう}\\
% '鳥'も肩付きになる
\ruby[Hm]{鵞鳥}{が|ちょう}
}

image-pxrubrica-19.png

小書き文字の自動変換

(漢語の読み方を示す)ルビの文字列の中では、「小書きの仮名(ゃ ゅ ょ っ 等)は使わずに代わりに小書きでない仮名で書く(がちょう→がちよう)」という慣習があります。本来の読み(がちょう)で入力することを可能にするために「小書き文字の自動変換」の機能を用意しています。

  • 小書き文字変換有効(モードf): \ruby[fj]{鵞鳥}{が|ちょう}
    image-pxrubrica-20.png

  • 小書き文字変換無効(モードF、既定): \ruby[Fj]{鵞鳥}{が|ちょう}
    image-pxrubrica-20a.png

下側(左側)ルビ・両側ルビ

ルビを親文字の上側・下側(縦書きでは右側・左側)のどちらに付けるかを選択できます。

  • 上側(右側)配置(モードP、既定): \ruby[Pj]{閑古鳥}{かん|こ|どり}
    image-pxrubrica-21.png

  • 下側(左側)配置(モードS): \ruby[Sg]{閑古鳥}{かっこう}
    image-pxrubrica-22.png

また、\truby[オプション]{親文字}{上側ルビ}{下側ルビ}で両側ルビを出力できます。

\truby{閑古鳥}{かんこどり}{かっこう}

image-pxrubrica-23.png

両側ルビは常にグループルビとして扱われます。

欧文に対してルビを振る

親文字が欧文である場合は、\ruby(または\jruby)の代わりに\aruby命令を使ってください。命令の書式は\rubyと全く同じです。(両側ルビの\atruby命令もあります。)

% どうして君は黙らないのかね?
?`\aruby{Por}{ポル} \aruby{qu\'e}{} \aruby{no}{} %
\aruby{te}{} \aruby{callas}{カージャス}?

image-pxrubrica-24.png

欧文ルビは常にグループルビとして扱われます。

ルビ用のフォントを指定する

\rubyfontsetup{フォント命令}を実行すると、\ruby命令などでルビの文字列を出力するときに前もって引数に書いたフォント命令が実行されます。ルビは必ず(親文字がゴシック体でも)明朝体で出力したい、あるいはjapanese-otfパッケージにおけるルビ用仮名字形(\rubyfamily)に切り替えたい、という場合に使います。

% フォントをゴシックに変える
{\gtfamily \ruby[g]{文鳥}{ぶんちょう} %
% ルビだけ明朝体に変える
\rubyfontsetup{\mcfamily}\ruby[g]{明朝}{みんちょう}}

image-pxrubrica-a2.png

補助設定

pTeXエンジンの技術的制限のため、ルビ付文字列とその前後の文字の間の組版的な調整が上手くいかない場合があります。これを手動で補正するために​「補助設定」​の機能が用意されています。

“四分空き”の補充

日本語組版の慣習では、和文と欧文の間に小さな空き(“四分空き”)を挿入します。通常、pLaTeXでは四分空きは自動的に挿入されます。

祝鳥v0.88r1

image-pxrubrica-b1.png

ところがここで和文に\rubyでルビを付けると四分空きが消えてしまいます。

\ruby[g]{祝鳥}{のりてふ}v0.88r1

image-pxrubrica-b2.png

この場合、「後補助設定」(モード指定より後)として:を指定するとルビ付文字の後に四分空きが挿入されます。

\ruby[g:]{祝鳥}{のりてふ}v0.88r1

image-pxrubrica-b3.png

モード指定より前に:を入れるとルビ付文字の前に四分空きが入ります(前補助設定)。

“禁則処理”の補充

pLaTeXの通常の処理では適切な“禁則処理”(句読点が行頭に来るのを禁止する、等)が行われます。\rubyでルビを付けた文字についても、ほとんどの場合は禁則処理は正しく行われますが、込み入った場合については禁則処理が機能しないことがあります。

%(colorパッケージ使用)
\parbox{10zw}{% 行長を全角10文字にする
まるで、炭鉱の\textcolor{red}{\ruby[g]{金糸雀}{カナリア}}、
ではないか。
}

image-pxrubrica-b4.png

\textcolorだけ、あるいは\rubyだけの場合は正しく禁則処理が働きます。

この場合、「後補助設定」として*を指定するとルビ付文字の直後での行分割が禁止されます。

%(colorパッケージ使用)
\parbox{10zw}{% 行長を全角10文字にする
まるで、炭鉱の\textcolor{red}{\ruby[g*]{金糸雀}{カナリア}}、
ではないか。
}

image-pxrubrica-b5.png

段落先頭・末尾での進入許可

段落の先頭・末尾では、通常は進入が抑止されています。(これは、不注意でルビがテキストの領域をはみ出してしまうのを防止するためです。)

\rubysetup{<->}% 既定で進入を許可する
\begin{minipage}{10zw}\setlength{\parindent}{1zw}%段落下げ有り
\ruby[-|]{燕雀}{えん|じやく}\ruby[|-]{}{いづく}んぞ
\ruby{鴻鵠}{こう|こく}の志を知らんや。
\end{minipage}

image-pxrubrica-b7.png

上の例では、段落先頭にある「燕雀」のルビが進入しないため、結果的に「燕」の前に全角よりも大きな空きが生じています。「燕雀」のルビを前に進入させるには、「前補助設定」として!を指定します。

\rubysetup{<->}
\begin{minipage}{10zw}\setlength{\parindent}{1zw}
% 段落先頭だが進入する
\ruby[!-|]{燕雀}{えん|じやく}\ruby[|-]{}{いづく}んぞ
\ruby{鴻鵠}{こう|こく}の志を知らんや。
\end{minipage}

image-pxrubrica-b8.png

パッケージ機能一覧

パッケージで提供される命令の一覧(抜粋)。

  • \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パッケージで美しい日本のルビ組版を実践しましょう!:information_desk_person:

  1. 正確には「ルビ文字の中に|がある場合は熟語ルビ、ない場合はグループルビ」と見なされます。この規則だと\ruby{燕}{つばめ}のように親文字が1文字のものが常にグループルビ扱いになりますが、そもそも親文字が1文字の場合はモノルビ・グループルビ・熟語ルビのどのモードでも結果は同じになるため問題ありません。

  2. 先ほど“基本モード”の既定値は「熟語ルビとグループルビの間で自動切換」であると述べましたが、このモードのことを自動切換熟語ルビと呼びます。このモードを指定するオプション文字はJです。

83
65
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
83
65

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?