マクロツイーター

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

pxrubrica のもっと新しいやつ(v1.3)

……がリリースされた。

W32TeX では既に反映されている。TeX Live については現在 pretest 期間中であるので、TeX Live 2017 の正式リリースの時点で一般ユーザに届くことになる。

本記事では、1.2 版での改修について述べる。

自動切替モノルビ・熟語ルビ

pxrubrica の 3 つの基本モードのうち、モノルビ(m)と熟語ルビ(j)はルビ文字列の方を親文字(漢字)ごとにグループ分け(|)を入れるが、グループルビはルビ文字列のグループ分けを入れない。

\ruby[m]{孔雀}{く|じゃく} % モノルビ
\ruby[j]{孔雀}{く|じゃく} % 熟語ルビ
\ruby[g]{朱鷺}{とき}      % グループルビ

つまり、「モノルビ・熟語ルビの何れかである」か「グループルビである」かの判断はルビ文字列引数の書き方を見れば行える。もちろん、親文字が一文字しかない場合は判断できないが、この場合はそもそもどのモードを用いても同じ出力になるので判断の必要がない。

% どれも同じ出力
\ruby[m]{}{ふくろう} % モノルビ
\ruby[j]{}{ふくろう} % 熟語ルビ
\ruby[g]{}{ふくろう} % グループルビ

そこで、「必要であればグループルビに自動的に切り替える」という機能をもつ基本モード指定を新設した。

  • 自動切替モノルビM)は普段はモノルビとして扱うが、ルビ文字列のグループが一つの場合はグループルビとして扱う。
  • 自動切替熟語ルビJ)は普段は熟語ルビとして扱うが、ルビ文字列のグループが一つの場合はグループルビとして扱う。
\ruby[M]{孔雀}{く|じゃく} % モノルビになる
\ruby[M]{朱鷺}{とき}      % グループルビになる
\ruby[J]{孔雀}{く|じゃく} % 熟語ルビになる
\ruby[J]{朱鷺}{とき}      % グループルビになる

※厳密にいうと、グループが一つであっても親文字が一文字の場合は、モノルビ・熟語ルビの方に帰着される。これはグループルビには種々の制限(肩付きにできない、等)があるため、同じ出力であるならグループルビ以外の方にした方が得だから、と判断したためである。

3 つの基本モードについて、最も基本的な使い方は「熟字訓*2のものはグループルビ、それ以外は熟語ルビ」でしょう。この使い方の場合、基本モードの既定値(\rubysetup)を自動切替熟語ルビ(J)にしておくと、個々のルビ命令で基本モードを指定する必要が全く無くなります。

% upLaTeX文書
\documentclass[uplatex,a4paper]{jsarticle}
\usepackage{pxrubrica}
\rubysetup{J}% 自動切替熟語ルビを既定にする
\begin{document}
% 基本モードの指定は不要
\ruby{孔雀}{く|じゃく}        %→熟語ルビ
\ruby{朱鷺}{とき}             %→グループルビ
\ruby{嘴広鸛}{はし|びろ|こう} %→熟語ルビ
\ruby{木菟}{みみずく}         %→グループルビ
\ruby{}{ふくろう}           %→熟語ルビ
\end{document}

両側ルビのモノルビ

pxrubrica では両側ルビ(親文字の上下に別のルビ文字列を付ける)が使えるが、従来の版では、基本モードとしてグループルビしか選択できなかった。新版ではモノルビも選択できるようになった。(熟語ルビは相変わらず不可。)

\truby[g]{習近平}{しゅうきんぺい}{シーチンピン}     % 熟語ルビ
\truby[m]{習近平}{しゅう|きん|ぺい}{シー|チン|ピン} % モノルビ
両側ルビの基本モードの既定値

従来は両側ルビでそもそもグループルビしか使えなかったため、\rubysetup による既定値に関わらず両側ルビの基本モードの既定値は常にグループルビ(g)であった。この「基本モード無指定の両側ルビがグループルビになる」という解釈が変更されるのは都合が悪い。従って、新版では既定値を次のように定める。

  • \rubysetup による既定値に関わらず、両側ルビの基本モードの既定値は常に自動切替モノルビ(M)とする。

従来の両側ルビは常に単一グループで用いられていたはずで、それは従来通りグループルビと見なされる。またそもそも熟語ルビが選択できないため、両側ルビではルビ文字列のグループ数を見れば常に基本モードが判定できるので、既定を M としておけば基本モードを改めて指定する必要が無くなるわけである。

安全モード

1.0 版の pxrubrica は (u)pLaTeX のみをサポートしていたが、1.1 版において LuaLaTeX と XeLaTeX もサポートされるようになった。一方で、pdfLaTeX(+ CJK パッケージ)をサポートすることについては困難な技術的問題がある。ルビ命令の実装においては随所で「文字列を文字ごとに分解する」という処理が用いられる。ところが、pdfLaTeX では「TeX 言語レベルでの非 ASCII 文字のサポートがない」ため、この処理の実現が困難なのである。

しかし、様々な理由により、「機能が全く使えない」よりも「“まとも”でないが、それなりに機能が使える」方が好都合な場合もあるだろう。そこで「一部の機能が無効になるが、それなりに動く」ことを目的とした「安全モード」を新設した。エンジンが pdfTeX である場合は自動的に「安全モード」が適用される。

% 敢えてエンジン自動判定にする, 文字コードはUTF-8
\documentclass[autodetect-engine,dvi=dvipdfmx,ja=standard]{bxjsarticle}
\usepackage{pxrubrica}
\rubysetup{<jf>}% 進入大, 熟語ルビ, 小書き仮名変換
\begin{document}
\ruby{無邪気}{む|じゃ|き}で、% 熟語ルビ
かつ\ruby[g]{真面目}{まじめ}な、% グループルビ
\ruby{表彰状}{ひょう|しょう|じょう}% 熟語ルビ
\end{document}

これを upLaTeX でコンパイルする(つまり安全モードでない)と次の出力が得られる。

一方、pdfLaTeX でコンパイルすると、安全モードが適用されて次の出力が得られる。

安全モードではモノルビ・熟語ルビはサポートできない*3ので強制的にグループルビに変更される。あと、文字列の均等割りや小書き仮名自動変換が無効になっていることが判るだろう。一方で進入は安全モードでも機能している。

\ruby(no)safemode 命令

安全モードの使用は明示的に設定できる。

  • \rubysafemode: 安全モードを有効にする。
  • \rubynosafemode: 安全モードを無効にする。

安全モードが必要となる場面で最も一般的なのは pdfTeX を使う場合であろうが、その場合は安全モードは既定で有効になる。(u)pLaTeX 等のサポート対象内のエンジンでわざわざ安全モードを使う意味はまるで無いので、恐らくこれらの命令が使われる機会はほとんど無いと思われる。

※一種の“裏技”として、文字を全て { } で囲んでおくと pdfTeX で安全モード無効の設定が使える可能性がある。(もちろん確実ではない。)

% 文字コードはUTF-8
\documentclass[autodetect-engine,dvi=dvipdfmx,ja=standard]{bxjsarticle}
\usepackage{pxrubrica}
\rubysetup{<j>}
\rubynosafemode % 安全モードを敢えて無効にする
\begin{document}
\ruby{{}{}{}}{{}|{}{}|{}}% 熟語ルビ
\end{document}

その他

  • LuaTeX-ja の縦組に対応した。*4

*1:なぜか、CTAN でのバージョン情報(“Version”項)が「1.2」のままになっているのだが、実際には 1.3 版に更新されている。

*2:「朱鷺→とき」のように、各漢字ごとの読みがあるのではなく、熟語全体としてのみ読みがあるもの。

*3:モノルビ・熟語ルビは親文字一文字ごとの読みが指定されるので、親文字列の分解が必要となる。

*4:本来は 1.1 版の時点で対応しておくべきであったが、考慮が漏れていた。