Hatena::ブログ(Diary)

マクロツイーター このページをアンテナに追加 RSSフィード Twitter

2017-05-03

pxrubrica パッケージで圏点できる話

この記事では、pxrubrica パッケージの新しいやつの、圏点機能について解説する。ただし網羅的な解説ではないので、必要に応じてマニュアル*1も参照してほしい。

とにかく圏点してみよう

文字列\kenten という命令の引数にして実行すると、その文字列が圏点付きで出力される。既定では、圏点のマークは、横組は黒中点、縦組は黒ゴマ点になる。

{\TeX}\kenten{アレ}
f:id:zrbabbler:20170430084518p:image

ルビ用の命令が(\ruby とか \aruby とか)複数あるのに対して、圏点用の命令は \kenten だけである。*2

圏点のキホン

  • 圏点命令(\kenten)に s オプションを指定すると、標準の場合と逆に、横組で黒ゴマ点、縦組で黒中点が使われるようになる。

    {\TeX}\kenten[s]{アレ}
    f:id:zrbabbler:20170430084517p:image

    後述のように、標準の場合(これは p オプションに相当)と s オプション指定時に用いられる圏点マークは、ユーザの指定により変更できる。

  • 圏点は和文を対象とするものなので、圏点命令の引数のテキストは、原則として和文文字のみを含むことが望ましい。実際には欧文文字も含めることもできるが、その場合も圏点付きの文字は“和文文字のように振舞う”ためマトモな出力にならない。

    発想が\kenten{クヌース的}である。 % OK
    
    発想が\kenten{Knuth的}である。    % アレ
    
    f:id:zrbabbler:20170430084516p:image
  • 引数に japanese-otf パッケージの \CID 命令などの「命令により出力される文字」を含めたい場合は、ルビ命令と同様に、一文字と見なすべき範囲を { } で囲む。

    \kenten{{\CID{13706}}野家的な{\ajSnowman}}だ。
    
    f:id:zrbabbler:20170430084515p:image
  • 通常は約物句読点や括弧類)には圏点は付かない。一応、f オプション指定で約物にも圏点が付けられるが、圏点付きの文字は“約物として働かなくなる”ためマトモな出力にならない。

    \kenten{アレ(アレ)は、アレ(アレ)。}     % フツー
    
    \kenten[f]{アレ(アレ)は、アレ(アレ)。}  % アレ
    
    f:id:zrbabbler:20170430085126p:image

イロイロ圏点してみる

先述の通り、圏点マークは主(p オプション)と副(s オプション)の 2 種類を切り替えることができるが、この両方について、実際に出力される圏点マークを設定できる。例えば、(横組の)主の圏点マークを二重丸(◎)にする場合は以下のようにする。

\kentenmarkinyoko{bullseye}% 横組の主の圏点マークを変える
{\TeX}\kenten{超絶アレ}
f:id:zrbabbler:20170430085153p:image

以下の命令で圏点マークを設定できる。

  • \kentenmarkinyoko{マーク}: 横組の主の圏点マークを設定する。
  • \kentensubmarkinyoko{マーク}: 横組の副の圏点マークを設定する。
  • \kentenmarkintate{マーク}: 縦組の主の圏点マークを設定する。
  • \kentensubmarkintate{マーク}: 縦組の副の圏点マークを設定する。

これらの命令の引数には、以下に示す通りの圏点マークの名前を書く。

f:id:zrbabbler:20170430090815p:image:w240
  • これらの設定のうち、bullet*sesame* は特殊で、bullet* は中黒〈・〉、sesame* は読点〈、〉の字形を加工して当該の圏点を出力している。これらの設定はほとんど全ての日本語フォントで利用できる。パッケージの既定設定の“黒中点”と“黒ゴマ点”もこの bullet*sesame* のことである。
  • 残りの設定については、表に書かれた通りの Unicode 値の文字を出力する、という動作になる。従って、実際に用いられるフォントに当該の文字が含まれていないといけない。*3
  • ※を付けた設定は JIS X 0208 にない文字である。これらの設定を pLaTeX で利用するには japanese-otf パッケージを併用する必要がある。
もっと素敵な圏点を

圏点マークを名前で指定する代わりに、圏点マークの記述そのものを指定することもできる。これにより、創造性に満ちた多様な圏点を利用することが可能になる。スバラシイ(えっ)

% upLaTeX文書, UTF-8
\documentclass[uplatex,dvipdfmx,a4paper]{jsarticle}
\usepackage{pxrubrica}
\usepackage{bxcoloremoji}
\kentenmarkinyoko{}% 主マークはゆきだるま
\kentensubmarkinyoko{\coloremoji{🍣}}% 副マークはスシ絵文字
\begin{document}
それは\kenten{画期的}\kenten[s]{アイデア}だ!
\end{document}
f:id:zrbabbler:20170430192147p:image

圏点を設定するやつ

ルビ関係と同様の設定用命令が用意されている。

  • \kentensetup{オプション}オプションの既定値設定。
  • \kentenfontsetup{命令列}:圏点用のフォント切替命令を設定する。
  • \kentensizeratio{実数}:圏点サイズの親文字サイズに対する割合(既定 = 0.5)。
  • \kentenintergap{実数}:圏点と親文字の間の空き(親文字全角単位、既定 = 0)。

ルビ命令を圏点してみる

先述の通り、圏点命令の引数の中での LaTeX 命令の使用には制限があるのだが、pxrubrica のルビ命令は例外的にそのまま書くことができる。*4既定では、この場合、ルビと圏点の両方が出力される。*5

{\TeX}\kenten{\ruby[j|]{超絶}{ちょう|ぜつ}アレ}
f:id:zrbabbler:20170430192146p:image

ただし、\kentenrubycombination{ruby} という命令を実行することで、ルビだけ出力する設定に変更できる。

\kentenrubycombination{ruby}
{\TeX}\kenten{\ruby[j|]{超絶}{ちょう|ぜつ}アレ}
f:id:zrbabbler:20170430192145p:image

ルビ命令を圏点する注意

  • 「圏点を付ける領域」の境界でのルビの進入は、技術的制約のため実現できないので、無効になる。

    % 前進入'<'は効かない
    {\TeX}\kenten{\ruby[<j|]{超絶}{ちょう|ぜつ}アレ}
    f:id:zrbabbler:20170430192144p:image
  • ルビ命令の前後の禁則処理は、元々「失敗する場合もある」という扱いであったが、圏点命令の中では「失敗する可能性がこの上なく高い」ので、手動で補助設定を入れておく方が安全である。

    % 後補助設定'*'で分割禁止にする
    {\TeX}言語、\kenten{ダメ、\ruby[<j*>]{絶対}{ぜっ|たい}}
    
    f:id:zrbabbler:20170430192143p:image

*1:コマンド「texdoc pxrubrica」を実行すると開かれる。

*2:ただし、ルビ命令の \ruby に“衝突回避用”の別名 \jruby があるように、\kenten にも“衝突回避用”の別名 \jkenten が存在する。

*3:さらに、その字形が“正しい”字幅(標準和文フォントの場合は全角幅)を持っていないと正常に出力されない。

*4:この逆は不可。すなわち、ルビ命令の引数の中に圏点命令をそのまま書くことはできない。

*5:次にある例で、「隣接する圏点付き文字の上までルビを進入させるのは不適切なので、後側を進入禁止にしている」ことに注意。

2017-05-02

pxrubrica のもっと新しいやつ(続き)

前回に引き続いて、pxrubrica パッケージの新機能について解説する。

今回は 1.3 版における変更点についての話。

圏点できるようになった

文字列に圏点を付加するための命令 \kenten が追加された。例えば、“{\TeX}は\kenten{アレ}”で次の出力が得られる。

f:id:zrbabbler:20170430084518p:image

圏点機能の詳細ついては別の記事を参照されたい。

PDF 文字列できるようになった

従来の版では、hyperref パッケージを用いた場合の「PDF 文書情報の文字列」(PDF 文字列)の部分において、ルビ命令をそのまま入れることはできなかった(\texorpdfstring の介在が必要だった)。

% pLaTeX文書, 面倒なのでbxjsartile
\documentclass[platex,dvipdfmx,ja=standard]{bxjsarticle}
\usepackage{pxrubrica}
\usepackage[colorlinks]{hyperref}
\begin{document}
\section{\ruby[-:]{\TeX}{アレ}\ruby{言語}{げん|ご}、ダメゼッタイ}
\end{document}

これをコンパイルすると次のような警告が発生し、生成される PDF 文書のしおりの内容が残念なことになっていた。

Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref)                removing `\begingroup' on input line 6.
f:id:zrbabbler:20170502050336p:image

新版では、PDF 文字列において、ルビ命令は「親文字のみを出力する」動作に切り替わる。同様に圏点命令も「親文字のみを出力する」動作になる。このため、PDF 文字列組版結果の両方がマトモになる。

% pLaTeX文書
\documentclass[platex,dvipdfmx,ja=standard]{bxjsarticle}
\usepackage{pxrubrica}
\usepackage[colorlinks]{hyperref}
\begin{document}
\section{\ruby[-:]{\TeX}{アレ}\ruby{言語}{げん|ご}\kenten{ダメゼッタイ}}
\end{document}
f:id:zrbabbler:20170502050335p:image

2017-04-29

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

……がリリースされた。

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

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

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

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

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

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

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

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

  • 自動切替モノルビ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}
f:id:zrbabbler:20170429175151p:image

両側ルビのモノルビ

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

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

従来は両側ルビでそもそもグループルビしか使えなかったため、\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 でコンパイルする(つまり安全モードでない)と次の出力が得られる。

f:id:zrbabbler:20170429175843p:image

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

f:id:zrbabbler:20170429180239p:image

安全モードではモノルビ・熟語ルビはサポートできない*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 版の時点で対応しておくべきであったが、考慮が漏れていた。

2017-04-12

PXrubrica の新しいやつ(v1.1)

W32TeXTeX Live では既に更新されている。

バグがチョット減った

前側の禁則が破れていた

pxrubrica の仕様としては、ルビ付文字列前後の禁則処理は「大抵は上手くいく」*1ことになっている。ところが、以前の実装では前側の禁則処理が全く機能していなかった。(自分が pTeX の禁則ペナルティの挿入処理について誤解をしていたのが原因。)

% pLaTeX文書
\documentclass[a4paper]{jsarticle}
\usepackage{pxrubrica}
\begin{document}
\parbox{15zw}{% 行長を全角15文字分に
こうして、世の中にまた一つの
「\ruby[g]{ネ申}{かみ}Excel」が
誕生したのである。}
\end{document}

旧版の出力)

f:id:zrbabbler:20170412054234p:image

新版ではこれが修正されて、禁則が保たれるようになる。

(新版の出力)

f:id:zrbabbler:20170412054233p:image
両側ルビと小書き文字変換の組合せがアレだった

両側ルビ(\truby)で小書き文字変換を有効(基本モード f)にした場合、下側(縦組では左側)のルビで小書き文字変換が効いていなかった。

% pLaTeX文書
\documentclass[a4paper]{jsarticle}
\usepackage{pxrubrica}
\begin{document}
例えば
% 'f'指定で"かっこう"→"かつこう"となる
\truby[f]{閑古鳥}{かっこう}{かんこどり}とか
% だけど下側ルビには効かなかった…
\truby[f]{閑古鳥}{かんこどり}{かっこう}とか。
\end{document}

旧版の出力)

f:id:zrbabbler:20170412054232p:image

新版ではちゃんと両方のルビに小書き文字変換が適用される。

(新版の出力)

f:id:zrbabbler:20170412054231p:image
欧文ゴースト処理がサッパリ使えなかった

以前の記事でチョット触れたように、pxrubrica では既定ではゴースト処理を利用しないが、\userubyjghostゴースト処理を利用する設定に切り替えることができる。(ゴースト処理の使用・不使用は一長一短がある。)

\userubyjghost は和文ルビを対象とするものだが、同様に欧文ルビ(\aruby)についても(欧文の)ゴースト処理を有効にする \rubyuseaghost という命令がある。ところが、実際にこの設定を使うと、\aruby で常にエラーが起こってしまい、全く使い物にならなかった。

% pLaTeX文書
\documentclass[a4paper]{jsarticle}
\usepackage{pxrubrica}
\rubyuseaghost % 欧文ゴースト処理を有効化, したいが…
\begin{document}
求む、\aruby{\TeX}{アレ}とか
\aruby{Ti\emph{k}Z}{ヒャッハー}に詳しい人。
\end{document}
<code>! Undefined control sequence.
\pxrr@aprologue -&gt;\ifpxrr@aghost \pxrr@aghost 
                                              \fi \begingroup \pxrr@abodytru...
l.5 求む、\aruby
                {\TeX}{アレ}とか
? 

新版では欧文ゴースト処理が使えるようになる。

(新版の出力)

f:id:zrbabbler:20170412054230p:image

ちなみに、ゴースト処理を用いない場合、特に欧文ルビの場合は、前後の文字と辻褄を合わせるための補助設定を自分で行う必要がある。(既定では、前後ともに行分割禁止で空き挿入無しとなる。*2

% '.'は空白無しで行分割許可
% ':'は和欧文間空白入りで行分割許可
求む、\aruby[.-:]{\TeX}{アレ}とか
\aruby[:-:]{Ti\emph{k}Z}{ヒャッハー}に詳しい人。

従って、「欧文ルビだけ(進入しないことにして)ゴースト処理を有効にする」という判断が妥当な場合もあるだろう。

LuaLaTeX・XeLaTeX できるようになった

これまで pxrubrica は(少なくとも公式には)pLaTeX と upLaTeX のみをサポートしていたが、新版では LuaLaTeX・XeLaTeX もサポートされる。特に、LuaLaTeX + LuaTeX-ja および XeLaTeX + xeCJK の環境では、全ての機能が利用できるはずである。*3

% XeLaTeX文書, 文字コードUTF-8
\documentclass[xelatex,ja=standard,a5paper]{bxjsarticle}
\usepackage{pxrubrica}
% Lohit Fonts: https://pagure.io/lohit
\newfontfamily{\fTaml}[Script=Tamil]{Lohit-Tamil.ttf}
\begin{document}
% やっぱり「XeLaTeXで日本語」は面倒くさいね
\noindent\mbox{}%
「わー、このカレー、すごく\ruby{}{かれ}ぇー」\\
「何だ、その\ruby{}{こけ}\ruby{}{}した
ような古いギャグは」\\
「まあ。でも、よく考えてみると、『辛い』という言葉は
英語の\aruby[:-:]{curry}{カリー}が日本に入ってくる
ずっと前からあるわけだよな」\\
「だから何?{}\\
「もしかして、日本語の起源は英語なのかも!{}\\
「何だ、また唐突に……。大体、英語のcurry自体が
元々はどこかインドの言葉だろ。何せカレーだから。
えーと……、ウィキペによると、元はタミル語\aruby[:-]{\fTaml கறி}{カリ}、らしい」\\
「わかった!{} 日本語はタミル語だ!{}\end{document}
\Entry{latha.ttf}
\Entry{vijaya.ttf}
f:id:zrbabbler:20170412060311p:image

PXchfon の新しいやつ(v0.9)

W32TeXTeX Live では既に更新されている。

directunicode* オプション

これの仕様については、以前の記事で既に開設した。

upLaTeX + pxchfon パッケージの環境で、directunicode* オプションを指定すると、“Source Hans Serif”(源ノ明朝)などの“AI0 なフォント”が使えるようになる。ただし副作用もあるので、その使用には注意が必要である。

\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[directunicode*,noalphabet]{pxchfon}% directunicode* した
% "AI0なフォント"が使える
\setminchofont{SourceHanSerif-Regular.otf}
\setgothicfont{SourceHanSans-Regular.otf}
\begin{dpcument}
{\TeX}\textsf{アレ}\end{document}

非推奨のプリセット名で警告

0.5 版以前で使われていた幾つかのプリセット名は従来既に非推奨の扱いになっていたが、0.9 版以降ではこれらを用いると警告が出るようになる(わーい)。

以下で、非推奨のプリセット名を、その代替法と一緒に挙げる。

※これらのオプションは将来の 1.0 版において廃止予定である。

*1:複雑な場合には禁則が破れることがあり、その場合がユーザが補助設定“*”を補う必要がある。

*2:この仕様の根拠は、「和文ルビでは前後に普通の和文文字がある状態を既定とする」のに合わせて「欧文ルビでは前後に普通の欧文文字がある状態を既定とする」と定めたからである。また、「不適切に行分割が発生する」よりも「不適切に行分割が抑止される」方がまだ“安全”である、という考えもある。

*3:日本語組版用パッケージを利用しない場合、例えば「和欧文間空白」などの概念がそもそも存在しないことになるため、「和欧文間空白を自動挿入する」という機能は働かなくなる。

*4:今頃「拡張子 .otf の IPA フォント」(確かバージョン 1 の一部がソレであったと思う)を使っている人はいないだろう。

2017-04-09

pxchfon の directunicode について語ってみる

pxchfon パッケージには「directunicode」という機能が存在する。これは「フォントにあるはずの文字が出力できない」という問題を(部分的に)解決するためのもので、正しく使うことができれば強力な機能である。その反面、種々の事情のために仕様が極めて複雑であり、非常に把握しづらいものとなっている。この記事では、directunicode 機能について少し詳しく解説する。

※基本的に upLaTeX を前提にして解説する。必要に応じて pLaTeX についての補足を入れる。

※アタリマエであるが、フォントがサポートしていない文字は、何をどうしても出力できない。

※改めて念を押しておくが、upTeX の Unicode 直接出力にしても、japanese-otf パッケージ(OTF パッケージ)にしても、対象となるのは和文(扱いの)文字のみである。また“自分で TFM や VF を作る”ことをしない限りは、全角幅*1のグリフしか利用できない。本記事ではその状況を前提とする。

なぜ directunicode なのか

directunicode 機能は次の 2 つの問題に対する解決策となる。

  1. 「upLaTeX で Unicode できない」問題
  2. 「upLaTeX で AI0 フォントできない」問題
「upLaTeX で Unicode できない」問題

この問題については以前の記事で解説した。

大雑把にいうと、次のような問題である。

  • フォントに字形が存在する Unicode 文字であっても、以下のような理由で、upLaTeX の標準和文フォントや japanese-otf の \UTF 命令で出力できない。
    • Adobe-Japan1(AJ1)のグリフ集合にない文字である.
    • BMP 外の文字である。
  • 具体的にどの文字が使える・使えないかについては次の記事を参照してほしい。とにかく複雑である。
  • japanese-otf についての話は pLaTeX でもそのまま当てはまる。
\documentclass[uplatex,a4paper]{jsarticle}
\usepackage{otf}
\begin{dpcument}

まず🍣より始めよ。% ダメ

まず\UTF{1F363}より始めよ。% ダメ

\end{document}
「upLaTeX で AI0 フォントできない」問題

OpenType フォント*2の中には“CID-keyed”という形式のものがある。CID-keyed な日本語フォントは通常は Adobe-Japan1(AJ1)のグリフエンコーディング*3に従っている。ところが最近は、AJ1 でない独自のグリフエンコーディング(これを「Adobe-Identity0(AI0)」と呼ぶ*4)をもつ日本語 OpenType が登場している。例えば、Adobeフリーフォント「Source Han Sans(源ノ角ゴシック)」や macOS(Sierra 以降)付属の「游明朝体」などである。*5upLaTeX の標準和文フォントや japanese-otf の和文フォントは「CID-keyed な日本語フォントは AJ1 に従う」ことを仮定しているため、“AI0 なフォント”は使えないのである。

\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[noalphabet]{pxchfon}
% "AI0なフォント"は使えない
\setminchofont{SourceHanSerif-Regular.otf}% ダメ
\setgothicfont{SourceHanSans-Regular.otf}% ダメ
\begin{dpcument}
{\TeX}\textsf{アレ}\end{document}

directunicode で何かできるか

directunicode とは「特定のフォントのグリフアクセスの方法を“AJ1 経由”から“Unicode 直接”に切り替える」ことを指す。これ以上の詳細については煩雑になるため省略するが、とにかく、フォントを“Unicode 直接”に切り替えると先に示したような問題が起こらなくなるわけである。

※“Unicode 直接”を指定できるのは“TeX において Unicode で扱われている”フォントに限られる。つまり、pTeX の標準和文フォント(これは“JIS で扱われる”フォントである)や japanese-otf の \CID 命令のフォントは“Unicode 直接”を指定できない。

directunicode オプション

pxchfon のパッケージオプションdirectunicode を指定すると、japanese-otf の \UTFフォントに対して“Unicode 直接”が指定される。これにより、\UTF での入力に関しては「AJ1 にないので Unicode できない」問題が解決する。ただし「BMP にないので Unicode できない」問題は残る。*6

\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[directunicode,noalphabet]{pxchfon}% directunicode した!
\setminchofont{SomeFont.ttf}% ちゃんと使えるやつ
\begin{document}

% これは元々OK(AJ1にある)
ゆきだるま☃! % OK
ゆきだるま\UTF{2603}% OK

% AJ1になくても \UTF なら使えるゆきだるま\UTF{26C7}% OK

% AJ1にもBMPにもないのはダメ
スシ\UTF{1F363}% ダメ

% 直接入力には効果無しゆきだるま⛇! % ダメ
スシ🍣! % ダメ

\end{document}

ちなみに、「AI0 できない」問題の方にも効果はあるが、例えば directunicode を指定した上で \setgothicfont で AI0 なフォントを割り当てたとすると、「ゴシックでは \UTF 入力しかできない」ことになるので、あまり実用的ではないかも知れない。

Unicode 直接”方式の副作用

Unicode 直接”に切り替えると使える文字の範囲が拡がるが、イロイロな副作用がある。

  • 90JIS/2004JIS 字形の切替の機能(pxchfon の prefer2004jis、japanese-otf の jis2004)が無効になる。
  • 縦組時に、縦組用字形への切替(〈「〉→〈﹁〉)が効かなくなる。
    • ただし、縦組用字形をもつ文字の多くは約物であり、\UTF約物の出力には元々不適であることにも注意すべき。
  • 自分も完全に把握しているわけでないので、他に何かあるかも知れない。

directunicode の効力を \UTF だけに留めているのはこの副作用を勘案したためである。

\diruni 命令

しかし、directunicode の効果が \UTF にしか及ばないのは不便でもある。この問題を解決するのが \diruni 命令である。これを実行すると、以降の Unicode 直接入力で全ての Unicode 文字が使えるようになる。*7

\diruni は“宣言型命令”で、(\rmfamily 等と同様に)適用範囲をグループに入れて用いる。\diruni に対応する引数型命令の \textdiruni も存在する。

\diruni の効力は非常に強力で、本当に全ての Unicode 文字が使用できる。

\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[directunicode,noalphabet]{pxchfon}
\setminchofont{SomeFont.ttf}
\begin{document}

まず{\diruni 🍣}より始めよ。 % OK
まず\textdiruni{🍣}より始めよ。 % OK

\end{document}

その反面、副作用も強力であり、“Unicode 直接”の通常の副作用に加えて、以下の現象が発生する。

  • 文字が完全にベタ組になる。つまり約物組版が異常になる。

従って、\diruni適用範囲を明確に決めて使うべきである。

directunicode* オプション

最新版(0.9 版)の pxchfon パッケージ(恐らく近日中に TeX Live で使えるようになる)では、directunicode* というオプションが導入された。これは、\UTFフォントに加えて、upLaTeX の標準和文フォントUnicode 直接入力)にも“Unicode 直接”を適用するというものである。

この機能は、どちらかというと、「AI0 できない」問題の解決のためのものである。すなわち、directunicode* を指定しておくと、“AI0 なフォント”を \set〜font で割り当てて普通に使うことができる。

\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[directunicode*,noalphabet]{pxchfon}% directunicode* した
% "AI0なフォント"が使える
\setminchofont{SourceHanSerif-Regular.otf}
\setgothicfont{SourceHanSans-Regular.otf}
\begin{dpcument}
{\TeX}\textsf{アレ}\end{document}

Unicode 直接入力の「Unicode できない」問題については、使える文字の範囲が多少拡大される。例えば AJ1 にない BMP の漢字が使えるようになる。(\UTF 入力については directunicode と同じ。)

補足:pLaTeX の場合は

pLaTeX の直接入力に対するフォントは“JIS で扱われる”ため、directunicode 機能の適用対象外である。\UTF 入力のフォントについては upLaTeX と全く同じ結果になる。

まとめ

pxchfon の directunicode 機能は……ヤヤコシイ。


例の記事に倣って、表にまとめてみた。

  • A: AJ1 のグリフに対応する文字
  • B: A ではないが、A が属するブロックの 1 つにある文字
  • C: A でも B でもない文字
分類BMPBMP副作用AI0なフォント
ABCABC
🈓🉆🍣
デフォルト
Unicode 直接入力××××不可
\UTF 入力××××不可
directunicode 指定時】
Unicode 直接入力××××不可
\UTF 入力××
\diruni 適用
directunicode* 指定時】
Unicode 直接入力××
\UTF 入力××
\diruni 適用

“※”の部分は状況により異なる。具体的には、直接入力に対応する論理フォントTFM)が例の記事の表の (i)、(ii)、(iii) の何れであるかにより決まる。

*1半角カナは例外的に半角幅。これは「物理フォントにおいて全角幅・半角幅」の意味である。

*2:TrueType グリフのものも含める。なお、TrueType グリフの OpenType フォントは CID-keyed ではない。

*3:よく解らない人は、取りあえず「“CID-keyed”(という形式)な OpenType フォントは“グリフエンコーディング”(という何か)を持っている」と考えておけばよい。

*4:AJ1 はある特定のグリフエンコーディングを表す識別子であるが、AI0 は「フォントがそれ独自のグリフエンコーディングをもつ」ことを表す識別子である。

*5:なお、ここで例に挙げたフォントは「OpenType Collection(OTC)形式」であることでも有名であるが、これとグリフエンコーディングの話は無関係である。

*6:つまり、\UTF の対応範囲が「AJ1 にあるもの」から「AJ1 または BMP にあるもの」に拡大される。

*7:なお、directunicode(または後述の directunicode*)を指定しない場合は \diruni 命令は使えない。