にせねこメモ

はてなダイアリーがUTF-8じゃないので移ってきました。

GPOSのCursive Attachment Positioningについて

序説

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をクリックする。
f:id:nixeneko:20170114153645p:plain


次に開くLookupウィンドウで、

  • 種類: 「Cursive Position」を選択。
  • 機能: 「curs」を選択。
  • 用字系と言語は適切に。デフォルトで動くはず。
  • Lookup Name: 適当に設定。デフォルトでも良い。

など設定し、OKをクリック。
f:id:nixeneko:20170114154120p:plain


すると今設定したlookupが追加されるので、追加したlookupを選択した状態で「Add Subtable」をクリック。
f:id:nixeneko:20170114154312p:plain


サブテーブルの名前を聞かれるダイアログが開くので適当に名前をつけて(デフォルトでよい)、OKをクリック。
するとAnchor Class Nameを設定するダイアログが開くのでクラスを追加していく。<New Anchor Class>をクリックするとスロットが追加されるので適当に名前を入力して(ここでは“cursive”)、OKを押す。
f:id:nixeneko:20170114154833p:plain


「フォント情報」ウィンドウをOKを押して閉じる。

これによってアンカークラスが追加されたので、アンカー点が設定できるようになる。

Anchor pointの設定

適当なグリフ(ここではa)をダブルクリックしアウトラインウィンドウを開く。
メニューから、点→アンカーを追加(あるいはアウトライン領域で右クリック→アンカーを追加)を選ぶ。
f:id:nixeneko:20170114155520p:plain


するとアンカー点の情報が表示されるので、先ほど追加したcursiveクラスを選び、「筆記体の始点」を選択、OKを押す。座標はこのダイアログで設定してもいいし、青い+字点をドラッグして移動することもできる。このダイアログは、青い+字点を右クリック→情報を得る、などから再度表示させることができる。
f:id:nixeneko:20170114155840p:plain


同様に筆記体の終点を追加する。前とほぼ一緒で、違いは「筆記体の終点」を選択するところだけである。

f:id:nixeneko:20170114162155p:plain
追加したのが上の画像である。始点を(0, 0)に、終点を(548, 0)に置いてみた。y座標が一緒でx座標の差分がグリフの幅に一致しているため、この状態だとcursを有効にしてもなにも変化しない、はずである。

試しにメトリックウィンドウを開いて確認してみる。
f:id:nixeneko:20170114162617p:plain
有効無効によって変化がない。同じアンカークラスに属するものについて、次のグリフの始点が前のグリフの終点に重なるように移動する、というのがアンカーポイントによる位置調整なので、当然の動作であるように思う。


さて、今度はcursive終点の位置を少し上側にずらしてみる。
f:id:nixeneko:20170114162929p:plain


今度は次にくるaはcursive終点の位置に移動するはずなので、やや上に上がって表示されるはずだ。メトリックウィンドウで試してみる。
f:id:nixeneko:20170114163134p:plain
期待通りである。

同様に別のグリフにも対してもアンカー点を追加していってみる。小文字には始点・終点を設定し、大文字には終点だけ設定してみる。コンマピリオドにも始点を設定してみる。

最終的に、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フォントで表示させてみたのが次である。

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

各ブラウザの対応を見ていく。

Firefox (50.1.0)

f:id:nixeneko:20170114174319p:plain

Google Chrome (55.0.2883.87 m)

f:id:nixeneko:20170114174308p:plain

Microsoft Edge (25.10586.672.0)

f:id:nixeneko:20170114175208p:plain
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

f:id:nixeneko:20170114202027p:plain
U+2019を削除してしまったのでXeLaTeXではアポストロフィ'が豆腐になっている。

LuaLaTeX

f:id:nixeneko:20170114202152p:plain

どちらでも正しく動いているようであるが、aaaaa...の行が上と重ならないなど、行間の扱いがブラウザの場合と異なっているのがわかる。また、aaaaa...の行を見るに、XeLaTeXとLuaLaTeXでも行間の扱いが異なっているようである。どうなってるの…。

なお、XeLaTeXでは\begin{document}より前に\addfontfeatures{RawFeature=+curs}を書いても有効になったのだが、LuaLaTeXでは有効にならなかった。微妙に動作が異なるらしい。

まとめ

ソフトウェアの対応が悪い。使用できる環境が限られるので、万能ではない。先に使いたい環境で使えるかを確かめてからやらないといけなさそう。

参考サイト