[41] OpenType Layout >>48, >>40 (OTL) >>40 の機能 (フィーチャー, フォント機能) は、 OpenType フォントを使って各用字系、言語の適切な文字のレンダリングを行うためのグリフ置換や位置調整を行うもので、 そのための情報が各フォントに格納されています。
[43] OpenType Layout における機能は組版的な能力各種を表すものと説明されています。 >>37
[44] 機能は正しい文字のレンダリングに必須となるものもあれば、 利用者 (著者) の要望に応じてオプションで適用できるものもあります。
[45] 機能を活性化すると、 グリフを条件に応じて他のグリフに置き換えたり、 グリフの位置を調整したりします。 その規則はフォント依存であり、フォント内にそのための情報が入っています。
[47] 機能は低水準の操作とされており >>37、 必ずしもそれだけで正しい文字のレンダリングができるわけではなく、 事前に shaping が必要になります。
[22] 各機能はタグで識別されます。
OpenType では表, 用字系, 言語などでタグが使われています
[8]
OpenType フォントでは
GSUB
表 (グリフの置換),
GPOS
表 (グリフの位置の調整)
に情報が格納されています。
[71]
OpenType フォントでは、
BASE
表 (基線)
にも情報を格納できます。
[49]
なお、 OpenType Layout としては他に
JSTF
, GDEF
各表があります。
[52]
GSUB
表や
GPOS
表では用字系と言語系の組に対して適用される機能を指定できます。
[72]
GSUB
と GPOS
は、
用字系 → 言語系 → 機能 → lookup
という構造になっています >>73, >>76。
用字系と言語系が決まると、
それに対して適用可能な機能の一覧を取得できます。
[53]
GSUB
と GPOS
それぞれ、
用字系と言語系の組に対して高々1つの機能は必須と指定でき、
その他は任意となります。
>>51
[55] この「必須」をどう処理するべきかは定かではありません。例えば未知の機能タグのとき、 どう処理するのが適切なのか不明です。
[56] 「必須」は高々1つしか指定できません。1つの機能に複数の lookup を指定できるので機能性に制約はない >>51 と説明されています。仕様書のこの説明は謎で、 意味的に別の機能でも制約回避のために適当な機能タグでまとめてしまえということなのでしょうか。
[57] 実際のフォントでは言語系的に必須そうなものでもすべてを任意扱いにしていることが多いみたいです。 相互運用性を考えるとフォントごとにまちまちな「必須」で適当に機能が選ばれることを期待するより、 実装側で用字系と言語系 (と shaping engine の判断) に応じて適切な機能を有効にするべきなのでしょう。
[74]
GSUB
, GPOS
の各機能は、
それぞれ必ず適用するべきもの、
ある条件下で適用するべきもの、
著者が任意選択で適用できるもの、
と決められています。
[61]
GSUB
, GPOS
の各機能は、
それぞれまったく個別に適用するのではなく、
いくつかまとめて実行できます。
表中の lookup の配置によりフォント開発者は相互作用を制御できます
>>51。
[62] しかしすべての機能が一度にまとめて処理されるとは限りません。 全体的な処理のどの段階でどの機能を処理するかは OpenType 仕様としては決められていません。 >>51
[64] 実際上どうなっているのかは shaping 参照。
[75] 適用するべき機能を決定した後、 Feature Variation 表がある場合には、 それに従って適宜調整します。 >>73, >>76
[66] 機能は、 機能引数群表を指定させることができます。 機能により必須とも、任意ともできます。 >>65
[67]
GSUB
表や
GPOS
表の機能表には
featureParamsOffset
欄があります。
欄の値は機能表の先頭からの Offset です。
>>65
[68]
機能において機能引数群表が定義されていない場合や、
定義されていても使用しない場合には、
NULL
としなければなりません。
>>65
[70]
必須なのに NULL
が指定された場合や、
定義されていないのに非 NULL
が指定された場合に実装がどう処理するべきかは不明です。
[42] 機能は OpenType 仕様書内の登録簿で規定されています >>6。
abvf
GSUB
1afrc
blwf
GSUB
4c2pc
GSUB
1font-variant-caps: all-petite-caps
c2sc
GSUB
1font-variant-caps: all-small-caps
calt
GSUB
6font-variant-ligatures: contextual
case
GSUB
1, GPOS
1ccmp
GSUB
2, 4cfar
chws
GPOS
2, 8cjct
clig
GSUB
font-variant-ligatures: common-ligatures
cpct
cpsp
cswh
font-variant-alternates: swash(...)
cv01
... cv99
GSUB
1, 3font-variant-alternates: character-variant(...)
dist
dlig
GSUB
4font-variant-ligatures: discretionary-ligatures
falt
fin2
fin3
flac
frac
GSUB
1, 4font-variant-numeric: diagonal-fractions
fwid
GSUB
1, GPOS
1font-variant-east-asian: full-width
half
haln
halt
GPOS
1text-spacing
hist
GSUB
1font-variant-alternates: historical-forms
hlig
hngl
hojo
jalt
jp78
GSUB
1, 3font-variant-east-asian: jis78
jp83
GSUB
1font-variant-east-asian: jis83
jp90
GSUB
1font-variant-east-asian: jis90
jp04
GSUB
1font-variant-east-asian: jis04
kern
GPOS
2, 8font-kerning: normal
横書き系lfbd
liga
GSUB
4font-variant-ligatures: common-ligatures
ljmo
lnum
GSUB
1font-variant-numeric: lining-nums
ltra
GSUB
1ltrm
との使い分けがあります。
ltrm
GSUB
1ltrm
との使い分けがあります。
med2
mgrk
mset
nalt
GSUB
1, 3font-variant-alternates: annotation(...)
onum
GSUB
1font-variant-numeric: oldstyle-nums
opbd
ordn
GSUB
4, 6font-variant-numeric: ordinal
ornm
font-variant-alternates: ornaments(...)
pcap
pkna
pnum
GSUB
1font-variant-numeric: proportional-nums
pref
GSUB
4pres
GSUB
4, 5pstf
GSUB
4psts
GSUB
4qwid
rand
rclt
rkrf
rtbd
rtla
GSUB
1rtlm
との使い分けがあります。
rtlm
GSUB
1rtla
との使い分けがあります。
ruby
GSUB
1font-variant-east-asian: ruby
rvrn
salt
GSUB
1, 3font-variant-alternates: stylistic(...)
sinf
size
smcp
GSUB
1font-variant-caps: small-caps
,
font-variant-caps: all-small-caps
smpl
ss01
... ss20
GSUB
1font-variant-alternates: styleset(...)
ssty
GSUB
3stch
swsh
font-variant-alternates: swash(...)
titl
tjmo
tnam
tnum
trad
GSUB
1, 3font-variant-east-asian: traditional
twid
unic
font-variant-caps: unicase
valt
text-spacing
vchw
vhal
GPOS
1vjmo
vkrn
GPOS
2, 8font-kerning: normal
縦書き系vpal
GPOS
1vkrn
を有効にするとき、
有効にしなければなりません。vrt2
GSUB
1vrtr
zero
GSUB
1font-variant-numeric: slashed-zero
[38] 登録簿は期待される用法を書いているものの、 応用は他の仕様書や用途に応じて適宜仕立てして構わないとされています。 >>37
[15]
仕様書の登録簿の説明は実装に必要な情報が何も書かれていなかったり、
実装方法がわからないことが書かれていたり (GSUB
の結果文字コードが変わるから新旧とも覚えておけとか)
やばいのが多い...
[16] 似たようなものが違って説明されていて一貫性がないのが、 意図的なのかどうか判断つかないとか。
[17]
いろいろな機能が他の機能や利用者との相互作用で「override」
したりされたりすると説明されているのだが、
それが処理全体のどの段階で何をどうすることが意図されているのか判断しかねるのが多い。
例えば A の GSUB
が B の GSUB
を override するとして、
A と B が適用されたとき実装はどうするのが正解なのか。
フォントはどう作るのが正しいのか。
B が先にグリフを置換していたら override もなにも A
の適用の前提がなくなる可能性がある。
実装は B を抑制するべきなのか。
フォントは B の出力が A の入力に来ることを想定するべきなのか。
[32] CSS Fonts は一応 OpenType に限定しない形でフォントの特性の記述とその利用の方法を規定しつつも、 OpenType の機能との対応関係を示しています。 特性は OpenType の機能にほぼ対応するよう設計されていて、 将来の新しいフォント技術はそれを踏襲するよう要請しています。
[33] そのような建付けにした上で、 CSS としての各機能の説明やフォント開発者に対する推奨が仕様書で説明されています。 実質的に OpenType の機能の利用方法を補足説明するものとして利用できます。
font-feature-settings
(CSS)[29]
CSS では
font-feature-settings
プロパティーで適用する機能を指定できます。
>>30
[1] しっぽり明朝|商用・同人誌利用可能フリーフォント, , https://fontdasu.com/shippori-mincho/
GSUB
ss01
- ss02
(引数なし),
aalt ccmp dlig frac fwid hwid jp78 jp83 liga nlck ordn salt sups vert vkna vrt2
GPOS
abvm mark mkmk palt vpal
[2] GPOSのCursive Attachment Positioningについて - にせねこメモ, https://nixeneko.hatenablog.com/entry/2017/01/14/200258
[3] OpenTypeフォントで万年カレンダーをつくる - にせねこメモ, https://nixeneko.hatenablog.com/entry/2017/02/13/000000
(lookupType
1 substFormat
2,
lookupType
4 substFormat
1,
lookupType
6 substFormat
3)
(lookupType
1 substFormat
1)
GSUB
"
" (0x20
× 4), calt
, ccmp
, dlig
, fina
, frac
, init
, isol
, liga
, lnum
, locl
, medi
, vert
, vkna
, vrt2
, zero
(lookup 1 - 1, 1 - 2, 4 - 1, 6 - 2, 6 - 3)
GSUB
aalt
, ccmp
, frac
, fwid
, hwid
, ital
, jp78
, liga
, ordn
, sups
, trad
, vert
, vkna
, vrt2
(1, 2; 3, 1; 2, 1; 4, 1; 6, 3; 1, 1)
GSUB
:
aalt
, ccmp
, fwid
, hwid
, jp04
, jp78
, jp83
, jp90
, liga
, palt
, pwid
, salt
, ss01
, ss02
, ss03
, ss05
, ss06
, ss07
, ss11
, ss12
, ss20
, trad
, vert
, vkna
, vrt2
(1, 2; 3, 1; 4, 1; 1, 1)
GSUB
:
aalt
, ccmp
, dlig
, fwid
, hist
, hwid
, jp78
, jp83
, jp90
, liga
, locl
, nlck
, pwid
, vert
, vrt2
(1, 2; 3, 1; 4, 1; 1, 1)
GPOS
:
halt
, kern
, palt
, vhal
, vkrn
, vpal
(1, 1; 2, 1; 2, 2; 1, 2)
GSUB
:
aalt
, ccmp
, dlig
, expt
, frac
, fwid
, hojo
, hwid
, jp78
, jp83
, jp90
, liga
, nalt
, nlck
, numr
, ruby
, sups
, trad
, vert
, vrt2
, zero
(1, 2; 3, 1; 4, 1; 1, 1)
[25]
>>24 ruby
で「、」「。」の点が中央に移動します。
果たしてそれがルビに適したグリフと言えるのかは疑問。
GSUB
:
(空白4つ), abvf
, abvs
, akhn
, blwf
, blws
, ccmp
, clig
, half
, init
, liga
, nukt
, pref
, pstf
, psts
, rlig
, rphf
, vatu
(4, 1; 2, 1; 1, 2; 6, 3; 1, 1)
GPOS
:
abvm
, blwm
, mkmk
(4, 1; 6, 1)
GSUB
:
c2sc
, case
, ccmp
, cv01
, cv02
, cv03
, dnom
, frac
, liga
, locl
, numr
, onum
, pnum
, smcp
, ss01
, ss02
, subs
, sups
(7, 1 (1, 1); 7, 1 (1, 2); 7, 1 (2, 1); 7, 1 (4, 1); 7, 1 (6, 3))
GPOS
:
kern
, mark
, mkmk
(4, 1; 6, 1; 9, 1 (2, 1); 9, 1 (2, 2))
GSUB
:
dtls
, onum
, salt
, ssty
(1, 1; 1, 2; 3, 1)
[31] Iosevka, https://be5invis.github.io/Iosevka/
- 和文の句読点や括弧が連続したときのアキを自動調整するフォント。
- GPOSのchws/vchwで自動調整します。
[82] 西暦表記を元号による表記にするフォント: mottainaiDTP, http://mottainaidtp.seesaa.net/article/425166883.html
[83] 3桁ごとにカンマが発生するフォント: mottainaiDTP, http://mottainaidtp.seesaa.net/article/395328634.html
[85]
BabelStone Han
liga
,
calt
[86] UnifrakturMaguntia, a Unicode Fraktur Font, , https://unifraktur.sourceforge.net/maguntia.html
[19]
GSUB
lookup が適用された結果、直接または間接に、元の入力に戻ることもあります。
[40] OpenType glyph processing (part 1) - Typography | Microsoft Docs, alib-ms, https://docs.microsoft.com/ja-jp/typography/develop/processing-part1#opentype-fonts
[50] pango で縦書きとその能力, , https://cat-in-136.github.io/2016/04/pango-view-vertical-writing.html
[77] CSS での OpenType 機能の構文, https://helpx.adobe.com/jp/fonts/using/open-type-syntax.html
横書き時、欧文用の三点リーダが使われてしまうことがある問題に対処しました。
源ノ角ゴシックのfeatureファイル(フォントの設定ファイル)では、「三点リーダがラテン・ギリシア・キリル文字とともに使われる時、グリフを既定の…(ボックス真ん中に点)から欧文用の...(ベースライン付近に点)に切り替える、ただし日本語環境ではこの切り替えをしない」という設定になっているのですが、Windowsではこれがうまく機能せず、日本語の文書でも欧文用の...になってしまうことがしばしばありましたため、この切り替え機能自体を無効化しました。