序説
OpenTypeフォントの高度組版機能においてグリフの位置調整を行うのがGPOSである。GPOSは主にペアカーニングやダイアクリティカルマークを適切な位置に表示するために利用される。
GPOSの中には更に、筆記体の接続を実現するためのCursive Attachment Positioningというものがある。筆記体の接続と言う名前ではあるが、文字が水平に並ぶ英語などの筆記体のためのものではなく、ペルシア語やウルドゥー語で用いられるアラビア文字のナスタアリーク体などのために追加されたものだろう。ナスアリーク体では文字の塊ごとに文字が右上から右下に流れ、グリフの上下位置が一定しないために、この機能がないと適切な表示ができない(例などは参考サイト参照)。
特にウルドゥー語などではこれがないと標準的な組版もできない様な機能ではあるが、日本語や欧文では不要である。
それでも、グリフ間の位置調整ができれば便利だという気持ちもあるので、使えないか調べてみる。
Fontforgeによる設定方法
さて、Fontforgeでどのように利用するかを見ながら実際の動作を見ていく。
M+フォントのmplus-1p-regular.ttfを利用することにする。
まず、Fontforgeでmplus-1p-regular.ttfを開く。最初にASCII外のグリフを削除し、GSUB, GPOSについても既存のものを削除しておいた。
GPOS lookupとanchor classの作成
メインウィンドウのメニューから、エレメント→フォント情報を開く。
Lookupsタブ→GPOSタブを開き、Add Lookupをクリックする。
次に開くLookupウィンドウで、
- 種類: 「Cursive Position」を選択。
- 機能: 「curs」を選択。
- 用字系と言語は適切に。デフォルトで動くはず。
- Lookup Name: 適当に設定。デフォルトでも良い。
など設定し、OKをクリック。
すると今設定したlookupが追加されるので、追加したlookupを選択した状態で「Add Subtable」をクリック。
サブテーブルの名前を聞かれるダイアログが開くので適当に名前をつけて(デフォルトでよい)、OKをクリック。
するとAnchor Class Nameを設定するダイアログが開くのでクラスを追加していく。<New Anchor Class>をクリックするとスロットが追加されるので適当に名前を入力して(ここでは“cursive”)、OKを押す。
「フォント情報」ウィンドウをOKを押して閉じる。
これによってアンカークラスが追加されたので、アンカー点が設定できるようになる。
Anchor pointの設定
適当なグリフ(ここではa)をダブルクリックしアウトラインウィンドウを開く。
メニューから、点→アンカーを追加(あるいはアウトライン領域で右クリック→アンカーを追加)を選ぶ。
するとアンカー点の情報が表示されるので、先ほど追加したcursiveクラスを選び、「筆記体の始点」を選択、OKを押す。座標はこのダイアログで設定してもいいし、青い+字点をドラッグして移動することもできる。このダイアログは、青い+字点を右クリック→情報を得る、などから再度表示させることができる。
同様に筆記体の終点を追加する。前とほぼ一緒で、違いは「筆記体の終点」を選択するところだけである。
追加したのが上の画像である。始点を(0, 0)に、終点を(548, 0)に置いてみた。y座標が一緒でx座標の差分がグリフの幅に一致しているため、この状態だとcursを有効にしてもなにも変化しない、はずである。
試しにメトリックウィンドウを開いて確認してみる。
有効無効によって変化がない。同じアンカークラスに属するものについて、次のグリフの始点が前のグリフの終点に重なるように移動する、というのがアンカーポイントによる位置調整なので、当然の動作であるように思う。
さて、今度はcursive終点の位置を少し上側にずらしてみる。
今度は次にくるaはcursive終点の位置に移動するはずなので、やや上に上がって表示されるはずだ。メトリックウィンドウで試してみる。
期待通りである。
同様に別のグリフにも対してもアンカー点を追加していってみる。小文字には始点・終点を設定し、大文字には終点だけ設定してみる。コンマピリオドにも始点を設定してみる。
最終的に、TrueTypeアウトラインのフォントとして出力する。
ソフトウェア側の対応
さて、フォントが対応していてもフォントを扱う側のソフトウェアが対応していないと正しく表示できないのがフォントの世界である。この機能が必須であるウルドゥー語などを除いては機能を無効にしているなどといった可能性もある。
それでは、ソフトウェア側の対応を見ていく。OpenTypeタグ'curs'が有効にできればいいのであるが。なお以下、すべてWindows 10で動かした結果である。
Adobe InDesign CS6
Adobe InDesign CS6はダメっぽい。そもそも'curs'に対応する設定項目が見当たらない。他のAdobeソフトも対応は期待できなさそうな気がする。
Microsoft Word 2013
設定項目が見当たらないのでダメっぽい。
各種ブラウザ
CSS3でfont-feature-settingsプロパティが追加され、それによってOpenType featureが個別に有効を設定できる。期待できそう。
CSSだと、次のような設定をすることになる。
font-feature-settings: "curs";
これを実際にはフォント指定と組み合わせる。
Webフォントで表示させてみたのが次である。
各ブラウザの対応を見ていく。
Firefox (50.1.0)
Google Chrome (55.0.2883.87 m)
Microsoft Edge (25.10586.672.0)
EdgeやIEは
font-feature-settings: curs;
ではだめで、
font-feature-settings: 'curs';
のように(シングルでもダブルでもいいけど)クォーテーションでくくらないとちゃんと動かないみたい。
さて、最近のブラウザ正しく動いてるようである。しかし、滅茶苦茶不安になるな、これ……。
LaTeX
LaTeXは、fontspecパッケージによって、OpenType featuresを個別に設定することができる。
\setmainfont[Path=./,Extension=.ttf,RawFeature=+curs]{Acurstest} \newfontfamily\curstest[Path=./,Extension=.ttf,RawFeature=+curs]{Acurstest}
みたいにフォント設定時にRawFeature=+cursオプションを設定するか、あるいは、オプションを適用したいテキストの直前で
\addfontfeature{RawFeature=+curs}
と書いて指定する。
XeLaTeXとLuaLaTeXのみ検討する。なお以下はどちらもCygwinで導入したTeX Live 2016のものによる出力である。
XeLaTeX
U+2019を削除してしまったのでXeLaTeXではアポストロフィ'が豆腐になっている。
LuaLaTeX
どちらでも正しく動いているようであるが、aaaaa...の行が上と重ならないなど、行間の扱いがブラウザの場合と異なっているのがわかる。また、aaaaa...の行を見るに、XeLaTeXとLuaLaTeXでも行間の扱いが異なっているようである。どうなってるの…。
なお、XeLaTeXでは\begin{document}より前に\addfontfeatures{RawFeature=+curs}を書いても有効になったのだが、LuaLaTeXでは有効にならなかった。微妙に動作が異なるらしい。
まとめ
ソフトウェアの対応が悪い。使用できる環境が限られるので、万能ではない。先に使いたい環境で使えるかを確かめてからやらないといけなさそう。