[41] 
[DFN[OpenType Layout]] [SRC[>>48, >>40]] ([DFN[OTL]]) [SRC[>>40]]
の[DFN[[RUBYB[[RUBY[機][き]][RUBY[能][のう]]][feature(s)]]]]
([DFN[フィーチャー]], [DFN[[RUBYB[フォント[RUBY[機][き]][RUBY[能][のう]]][font feature(s)]]]])
は、
[[OpenType]] [[フォント]]を使って各[[用字系]]、[[言語]]の適切な[[文字のレンダリング]]を行うための[[グリフ]]置換や位置調整を行うもので、
そのための情報が各[[フォント]]に格納されています。

* 仕様書

[REFS[
- 
[36] [[OpenType]]
--
[37] 
[CITE@ja-jp[[[OpenType]] specification overview (OpenType 1.9) - Typography | Microsoft Docs]], [[PeterCon]], [TIME[2022-08-26T12:08:49.000Z]] <https://docs.microsoft.com/ja-jp/typography/opentype/spec/overview>
--
[48] 
[CITE@ja-jp[Advanced typographic tables - OpenType Layout (OpenType 1.9) - Typography | [[Microsoft]] Docs]], [[PeterCon]], [TIME[2022-08-28T01:15:24.000Z]] <https://docs.microsoft.com/ja-jp/typography/opentype/spec/ttochap1>
--
[51] 
[CITE@ja-jp[OpenType layout common table formats (OpenType 1.9) - Typography | [[Microsoft]] Docs]], [[PeterCon]], [TIME[2022-08-29T13:35:23.000Z]] <https://docs.microsoft.com/ja-jp/typography/opentype/spec/chapter2#scripts-and-languages>
--
[65] 
[CITE@ja-jp[OpenType layout common table formats (OpenType 1.9) - Typography | [[Microsoft]] Docs]], [[PeterCon]], [TIME[2022-08-30T11:03:50.000Z]] <https://docs.microsoft.com/ja-jp/typography/opentype/spec/chapter2#feature-table>
--
[73] 
[CITE@ja-jp[[[GPOS]] — Glyph Positioning Table (OpenType 1.9) - Typography | Microsoft Docs]], [[PeterCon]], [TIME[2022-09-07T06:10:12.000Z]] <https://docs.microsoft.com/ja-jp/typography/opentype/spec/gpos>
--
[76] 
[CITE@ja-jp[[[GSUB]] — Glyph Substitution Table (OpenType 1.9) - Typography | Microsoft Docs]], [[PeterCon]], [TIME[2022-09-08T05:38:36.000Z]] <https://docs.microsoft.com/ja-jp/typography/opentype/spec/gsub>
--
[6] [CITE@en-us[[[Feature tags]] (OpenType 1.9) - Typography | Microsoft Docs]], [[PeterCon]], [TIME[2022-08-16T05:49:42.000Z]] <https://docs.microsoft.com/en-us/typography/opentype/spec/featuretags>
-
[30] [CITE@en[CSS Fonts Module Level 4]], [TIME[2022-08-21T12:18:41.000Z]], [TIME[2022-08-25T09:40:20.454Z]] <https://drafts.csswg.org/css-fonts/#font-rend-props>
-
[34] 
[CITE@en[CSS Writing Modes Level 4]], [TIME[2022-08-25T06:08:27.000Z]], [TIME[2022-08-25T11:34:21.977Z]] <https://drafts.csswg.org/css-writing-modes-4/#vertical-font-features>
-
[35] [CITE@en[CSS Text Module Level 4]], [TIME[2022-08-25T06:07:18.000Z]], [TIME[2022-08-25T11:37:55.867Z]] <https://drafts.csswg.org/css-text-4/#fullwidth-collapsing>

]REFS]


* 意味

[43] 
[[OpenType Layout]] 
における[[機能][フォント機能]]は[RUBYB[[[組版]]的な能力][typographic capability]]各種を表すものと説明されています。
[SRC[>>37]]

[98] 
[[機能][フォント機能]]は、
[[フォント]]中の[[グリフ]]をある[[用字系]]や[[言語]]で[RUBYB[文章][text]]を layout
するためどのように使うかの情報を提供するものです。
[SRC[>>6]]

[EG[

[99] 
例えば[[アラビア文字]]の[[フォント]]では initial glyph form ([[語頭形]]の[[グリフ]])
に置換する[[機能][フォント機能]]を持つかもしれませんし、
[[漢字]]の[[フォント]]では[[グリフ]]を垂直に位置付けする ([[縦書き]]の)
ための[[機能][フォント機能]]を持つかもしれません。
[SRC[>>6]]

]EG]

[44] 
[[機能][フォント機能]]は正しい[[文字のレンダリング]]に必須となるものもあれば、
[[利用者]] ([[著者]]) の要望に応じてオプションで適用できるものもあります。

[45] 
[[機能][フォント機能]]を[RUBYB[活性化][activate]]すると、
[[グリフ]]を条件に応じて他の[[グリフ]]に置き換えたり、
[[グリフ]]の位置を調整したりします。
その規則は[[フォント]]依存であり、[[フォント]]内にそのための情報が入っています。

[EG[
[46] 例えば2つの[[文字]]の[[字間]]を調整する [CODE[kern]] ([[カーニング]])
は、
[[フォント]]ごとの[[グリフ]]次第で調整量が異なってきますので、
どの[[グリフ]]をどう調整するかを [CODE[GPOS]] [[表]]に格納します。
]EG]

[47] 
[[機能][フォント機能]]は[RUBYB[低水準][low-level]]の操作とされており [SRC[>>37]]、
必ずしもそれだけで正しい[[文字のレンダリング]]ができるわけではなく、
事前に [[shaping]] が必要になります。


* 機能タグ

[22] 各[[機能][フォント機能]]は[[タグ][OpenTypeタグ]] ([DFN[[RUBYB[機能タグ][feature tag]]]]) で識別されます。
[SRC[>>6]]

[100] 
[[OpenType]] では[[表]], [[用字系]], [[言語]]などで[[タグ][OpenTypeタグ]]が使われています
[SEE[ [[OpenTypeタグ]] ]]
が、
それらとは別の[[名前空間]]っぽいです。

[101] 
慣習として、登録されている[[機能タグ]]はすべて[[小文字]]を使っています。
[SRC[>>6]]
実際には[[数字]]も使われているので、これは[[大文字]]を使わないという意味のようです。
[[英数字]]以外は使われていません。

[102] 
4つの[[ASCII大文字]]の[[機能タグ]]は、
[RUBYB[事業者空間][vendor space]]として[RUBYB[予約][reserved]]されています。
[RUBYB[フォント事業者][font vendor]]は、
[RUBYB[私的][private]]な[[機能]]の識別のためにこれを使うことが[RUBYB[できます][may]]。
私的な機能の[[相互運用性]]は保証されません。
[SRC[>>6]]


-*-*-

[112] 
[[Microsoft]] は、[[フォント開発者]]が登録済みの[[機能][フォント機能]]の機能を実装するときは登録済みの[[機能タグ]]を使うことを[RUBYB[推奨][encourage]]しつつも、
[[フォント開発者]]が自身で[[機能][フォント機能]]を定義し登録することも[RUBYB[認めています][may]]。
[SRC[>>6]]
[SEE[ [[OpenTypeタグ]] ]]

[113] 
登録申請する[[機能][フォント機能]]は、
[[機能タグ]]によって明確に識別される[RUBYB[単一の機能性][single function]]を持たなければ[RUBYB[なりません][must]]。
[SRC[>>6]]

[114] 
機能性は、[RUBYB[最低の有用性の水準][lowest useful level]]において定義される[RUBYB[べき][should]]で、
登録済みの他の[[機能][フォント機能]]と[RUBYB[明らかに異なら][distinctly different]]なければ[RUBYB[なりません][must]]。
[SRC[>>6]]

[115] 
実装詳細を提供する[RUBYB[必要はありません][do not have to]]。
[SRC[>>6]]


[116] 
実際に登録者として 
[[Microsoft]],
[[Apple]],
[[Adobe]]
その他があります。


* 文脈

[8] 
[[OpenType]] [[フォント]]では
[CODE[GSUB]] [[表][OpenType表]] ([[グリフ]]の置換),
[CODE[GPOS]] [[表][OpenType表]] ([[グリフ]]の位置の調整)
に情報が格納されています。

[71] 
[[OpenType]] [[フォント]]では、
[CODE[BASE][BASE (OpenType)]] [[表][OpenType表]] ([[基線]])
にも情報を格納できます。

[49] 
なお、 [[OpenType Layout]] としては他に
[CODE[JSTF]], [CODE[GDEF]] 各[[表]]があります。

* 機能の選択

[52] 
[CODE[GSUB]] [[表][OpenType表]]や
[CODE[GPOS]] [[表][OpenType表]]では[[用字系]]と[[言語系]]の組に対して適用される[[機能][フォント機能]]を指定できます。

[72] 
[CODE[GSUB]] と [CODE[GPOS]] は、
[[用字系]] → [[言語系]] → [[機能][フォント機能]] → [[lookup]]
という構造になっています [SRC[>>73, >>76]]。
[[用字系]]と[[言語系]]が決まると、
それに対して適用可能な[[機能][フォント機能]]の一覧を取得できます。
[SEE[ 用字系と言語系の一致判定については[[用字系]], [[言語系]] ]]


-*-*-

[53] 
[CODE[GSUB]] と [CODE[GPOS]] それぞれ、
[[用字系]]と[[言語系]]の組に対して高々1つの[[機能][フォント機能]]は必須と指定でき、
その他は任意となります。
[SRC[>>51]]

[EG[
[54] 
例えば[[キリル文字]][[用字系]]において[[セルビア語]][[言語系]]で[[ロシア語]][[言語系]]と違って表示したいときに、それを必須とできます。
[SRC[>>51]]
]EG]

[55] 
この「必須」をどう処理するべきかは定かではありません。例えば未知の[[機能タグ]]のとき、
どう処理するのが適切なのか不明です。

;; [58] 
[[機能タグ]]に依存する挙動というのはなくて、 [[lookup]] 
に挙動が書かれているのを束ねたのが[[機能][フォント機能]]なので、
未知の[[機能タグ]]でも適用してしまって構わないのでしょうか?

[56] 
「必須」は高々1つしか指定できません。1つの[[機能][フォント機能]]に複数の
[[lookup]] を指定できるので機能性に制約はない [SRC[>>51]]
と説明されています。[[仕様書]]のこの説明は謎で、
意味的に別の[[機能][フォント機能]]でも制約回避のために適当な[[機能タグ]]でまとめてしまえということなのでしょうか。

[57] 実際の[[フォント]]では[[言語系]]的に必須そうなものでもすべてを任意扱いにしていることが多いみたいです。
[[相互運用性]]を考えると[[フォント]]ごとにまちまちな「必須」で適当に[[機能][フォント機能]]が選ばれることを期待するより、
実装側で[[用字系]]と[[言語系]] (と [[shaping engine]] の判断) に応じて適切な[[機能][フォント機能]]を有効にするべきなのでしょう。

-*-*-

[74] 
[CODE[GSUB]], [CODE[GPOS]] の各[[機能][フォント機能]]は、
それぞれ必ず適用するべきもの、
ある条件下で適用するべきもの、
[[著者]]が任意選択で適用できるもの、
と決められています。
[SEE[ 各機能の項 ]]

[61] 
[CODE[GSUB]], [CODE[GPOS]] の各[[機能][フォント機能]]は、
それぞれまったく個別に適用するのではなく、
いくつかまとめて実行できます。
[[表][OpenType表]]中の [[lookup]] の配置により[[フォント]]開発者は相互作用を制御できます
[SRC[>>51]]。
[SEE[ [[lookup]] ]]

[62] 
しかしすべての[[機能][フォント機能]]が一度にまとめて処理されるとは限りません。
[[全体的な処理][文字のレンダリング]]のどの段階でどの[[機能][フォント機能]]を処理するかは
[[OpenType]] 仕様としては決められていません。
[SRC[>>51]]

;; [63] それでは[[相互運用可能]]な[[フォント]]が作れない気がするのですが...
困ったものです。

[64] 
実際上どうなっているのかは [[shaping]] 参照。

-*-*-

[75] 
適用するべき[[機能][フォント機能]]を決定した後、
[[Feature Variation]]
[[表][OpenType表]]がある場合には、
それに従って適宜調整します。
[SRC[>>73, >>76]]

-*-*-

[109] 
[[機能][フォント機能]]によっては [[lookup]] の種別の[RUBYB[提案][[suggested]]が説明に含まれています。
しかしこれは[RUBYB[推奨、提案][recommendations or suggestions]]に過ぎません。
[[lookup]] をどのように使って[[機能][フォント機能]]を実装するかは、
[[プラットフォーム]]、[[応用]]、[[フォント]]、[[フォント開発者]]によって違って[RUBYB[構いません][may]]。
[SRC[>>6]]

[110] 
従って[[フォント]]の実装はすべての[[機能][フォント機能]]とすべての [[lookup]] の種別の組み合わせがあり得ると想定する必要があります。
実際には実用に供されている実装の多くは問題なく対応できるようですが、
[[フォント]]を読み書きする[[ライブラリー]]の類の中には [[lookup]] の種別によっては対処できないものもあるようです。


* 処理

[60] 
全体的な処理の流れは[[文字のレンダリング]], [[shaping]] 参照。

[59] 
[CODE[GSUB]], [CODE[GPOS]] の処理方法は各項参照。
[SEE[ [[GSUB]], [[GPOS]], [[lookup]] ]] 

-*-*-

[103] 
[CITE[OpenType]] 仕様書の[[機能タグ]]の登録簿には、各[[機能][フォント機能]]の説明があります。

[105] 
しかし、[[グリフ]]の置換や位置付けを適切に実装するために[RUBYB[必要][required]]なすべての情報を提供していない[RUBYB[ことがあります][might]]。
[SRC[>>6]]

[106] 
また、[[フォント]]の [CODE[GSUB]] や [CODE[GPOS]] にも text processing において[[機能][フォント機能]]をいつどこに適用するべきかの情報が含まれていないことがあります。

[107] 
多くの場合には text processing client は追加のデータが必要となります。
[SRC[>>6]]

[108] 
すべてに於いて text processing client は[[機能][フォント機能]]の適用、[RUBYB[結合][combining]]、[RUBYB[仲裁][arbitrating]]を経て結果をレンダリングすることに責任を有します。
[SRC[>>6]]

[EG[

[104] 
例えば[[語頭形]]を表す [CODE[init]] について、 [CODE[GSUB]] にはそれをいつどこに適用するかの情報がありません。
[[アラビア文字]]の文章に於いては character context と joining 特性に基づき
connected letter group 
の始まりを特定し、どの[[グリフ]]に [CODE[init]] [[機能][フォント機能]]を適用して
initial glyph form に変更するかを text processing client は決めなければなりません。
[SRC[>>6]]

]EG]

[111] 
[[機能][フォント機能]]におっては text layout software 
が[[機能][フォント機能]]とどう相互作用することが[RUBYB[期待][expected]]されるか、
[[機能][フォント機能]]固有の詳細を説明しているものもあります。
[SRC[>>6]]

* 機能引数

[66] 
[[機能][フォント機能]]は、
[DFN[[RUBYB[[RUBY[機][き]][RUBY[能][のう]][RUBY[引][ひき]][RUBY[数][すう]][RUBY[群][ぐん]]][Feature Parameters]][[表][OpenType表]]]]を指定させることができます。
[[機能][フォント機能]]により必須とも、任意ともできます。
[SRC[>>65]]

[67] 
[CODE[GSUB]] [[表][OpenType表]]や
[CODE[GPOS]] [[表][OpenType表]]の[[機能][フォント機能]][[表]]には
[DFN[[F[[CODE[featureParamsOffset]]]]]]
[[欄]]があります。
[[欄]]の値は[[機能]][[表][OpenType表]]の先頭からの [[Offset]] です。
[SRC[>>65]]

[68] 
[[機能][フォント機能]]において[[機能引数群]][[表]]が定義されていない場合や、
定義されていても使用しない場合には、
[CODE[NULL]]
としなければ[RUBYB[なりません][must]]。
[SRC[>>65]]

[70] 
必須なのに [CODE[NULL]] が指定された場合や、
定義されていないのに非 [CODE[NULL]] が指定された場合に実装がどう処理するべきかは不明です。

[69] 
[[機能引数群]][[表]]の共通の内容は定められておらず、
[[機能][フォント機能]]によって異なります。

* 機能の一覧

[42] 
[[機能][フォント機能]]は [[OpenType]] [[仕様書]]内の[[登録簿]]で規定されています
[SRC[>>6]]。

[FIG(table)[ [14] [[フォント機能]]

:tag:[[機能タグ]]
:name: Friendly name [SRC[>>6]]
:usage: 主たる用法
:default: 既定の状態
:desc: 説明
:params: 引数
:css:[[CSS]]

:tag: [CODE[aalt]]
:name:Access All Alternates
:usage: [CODE[GSUB]] [N[1]], [N[3]]
:desc:
[[利用者]]が手動で選択できる代替の[[グリフ]]の候補(群)です。
:default: 無効

:tag: [CODE[abvf]]
:name:Above-base Forms
:usage: [CODE[GSUB]] [N[1]]
:default: 自動
:desc:
[[above-base form]] を置き換えます。

:tag: [CODE[abvm]]
:name:Above-base Mark Positioning
:usage: [CODE[GPOS]] [N[4]], [N[5]]
:default: 自動
:desc:
[[基底]]グリフ上の[[マーク]]の位置を調整します。

:tag: [CODE[abvs]]
:name:Above-base Substitutions
:usage: [CODE[GSUB]] [N[4]]
:default: 自動
:desc:
[[基底]]グリフとその上の[[マーク]]の[[合字]]に置き換えます。

:tag:[CODE[afrc]]
:name:Alternative Fractions
:desc:
[[分数]]形に置き換えます。
:default:無効
:css:
[CODE[[[font-variant-numeric]]: [[stacked-fractions]]]]

:tag: [CODE[akhn]]
:name:Akhand
:usage: [CODE[GSUB]] [N[4]]
:default: 自動
:desc:
[[Akhand]] を[[合字]]に置き換えます。


:tag: [CODE[blwf]]
:name:Below-base Forms
:usage: [CODE[GSUB]] [N[4]]
:default: 自動
:desc:
[[below-base form]] を置き換えます。

:tag: [CODE[blwm]]
:name:Below-base Mark Positioning
:usage: [CODE[GPOS]] [N[4]], [N[5]]
:default: 自動
:desc:
[[基底]]グリフ下の[[マーク]]の位置を調整します。

:tag: [CODE[blws]]
:name:Below-base Substitutions
:usage: [CODE[GSUB]] [N[4]]
:default: 自動
:desc:
[[基底]]グリフとその下の[[マーク]]の[[合字]]に置き換えます。

:tag: [CODE[c2pc]]
:name:Petite Capitals From Capitals
:desc:
[[大文字]]を [[petite capital]] に置き換えます。
:default: 無効
:usage: [CODE[GSUB]] [N[1]]
:css:
[CODE[[[font-variant-caps]]: [[all-petite-caps]]]]

:tag: [CODE[c2sc]]
:name:Small Capitals From Capitals
:desc:
[[大文字]]を [[small capital]] に置き換えます。
:default: 無効
:usage: [CODE[GSUB]] [N[1]]
:css:
[CODE[[[font-variant-caps]]: [[all-small-caps]]]]

:tag: [CODE[calt]]
:name:Contextual Alternates
:usage: [CODE[GSUB]] [N[6]]
:default: 有効
:desc:
文脈に応じて[[グリフ]]を置き換えます。
:css:
[CODE[[[font-variant-ligatures]]: [[contextual]]]]

:tag: [CODE[case]]
:name:Case-Sensitive Forms
:usage: [CODE[GSUB]] [N[1]], [CODE[GPOS]] [N[1]]
:desc:
[[oldstyle figure]] を [[lining figures]] に置き換えまたは位置調整します。
[[句読点]]を[[大文字]]に合わせたものに置き換えまたは位置調整します。
:default: 無効

:tag: [CODE[ccmp]]
:name:Glyph Composition/Decomposition
:usage: [CODE[GSUB]] [N[2]], [N[4]]
:default: 有効
:desc:
[[フォント]]構成の便宜により[[グリフ]]を分解したり合成したりします。
:css:有効

:tag: [CODE[cfar]]
:name:Conjunct Form After Ro
:desc:
@@

:tag: [CODE[chws]]
:name:Contextual Half-width Spacing
:usage: [CODE[GPOS]] [N[2]], [N[8]]
:default:
[[CJK]] の advanced layout に対応していないなら、
[[CJK]] [[横書き]]のとき、有効
:desc:
[[全角]]幅の[[グリフ]]を[[半角]]幅に変更します。

:tag: [CODE[cjct]]
:name:Conjunct Forms
:desc:
@@

:tag: [CODE[clig]]
:name:Contextual Ligatures
:usage: [CODE[GSUB] [ASIS[[N[8]]]]
:default: 有効
:desc:
文脈依存の[[合字]]に置き換えます。
:css:
[CODE[[[font-variant-ligatures]]: [[common-ligatures]]]]

:tag:[CODE[cpct]]
:name:Centered CJK Punctuation
:desc:
中央寄せの[[句読点]]に置き換えます。
:default:無効

:tag:[CODE[cpsp]]
:name:Capital Spacing
:default:(有効)
:desc:
[[大文字]]語用に[[字間]]を調整します。

:tag:[CODE[cswh]]
:name:Contextual Swash
:desc:
@@
:css:
[CODE[[[font-variant-alternates]]: [[swash]]([VAR[...]])]]

:tag: [CODE[curs]]
:name:Cursive Positioning
:usage: [CODE[GPOS]] [N[3]]
:default: 有効
:desc:
[[続け字]]の接続位置を調整します。

:tag: [CODE[cv01]] ... [CODE[cv99]]
:name:Character Variant 1 ... Character Variant 99
:desc:
[[異体字]][[グリフ]]に置き換えます。
:default:
無効
:usage: [CODE[GSUB]] [N[1]], [N[3]]
:params:
名前, [[異体字]]の[[Unicodeスカラー値]]
:css:
[CODE[[[font-variant-alternates]]: [[character-variant]]([VAR[...]])]]

:tag: [CODE[dist]]
:name:Distances
:desc:
@@

:tag: [CODE[dlig]]
:name:Discretionary Ligatures
:usage: [CODE[GSUB]] [N[4]]
:desc:
[[利用者]]の判断により[[合字]]に置き換えます。
:default: 無効
:css:
[CODE[[[font-variant-ligatures]]: [[discretionary-ligatures]]]]

:tag:[CODE[dnom]]
:name:Denominators
:usage:[CODE[GSUB]] [N[1]]
:default:自動
:desc:
[[斜線]]の後の[[数字]]を[[分母]]用に置き換えます。

:tag: [CODE[dtls]]
:name:Dotless Forms
:default:自動
:usage:[CODE[GSUB]] [N[1]]
:desc:
[[i]] や [[j]] の無点形に置き換えます。

:tag: [CODE[expt]]
:name:Expert Forms
:usage: [CODE[GSUB]] [N[1]]
:desc:
[[漢字]]を expert form に置き換えます。
:default:
任意

:tag:[CODE[falt]]
:name:Final Glyph on Line Alternates
:desc:
@@

:tag:[CODE[fin2]]
:name:Terminal Form #2
:desc:
@@

:tag:[CODE[fin3]]
:name:Terminal Form #3
:desc:
@@

:tag: [CODE[fina]]
:name:Terminal Forms
:default: 自動
:desc:
[[語末形]]に置き換えます。
:usage: [CODE[GSUB]] [N[1]], [N[5]], [N[6]], [N[8]]

:tag:[CODE[flac]]
:name:Flattened ascent forms
:desc:
@@

:tag: [CODE[frac]]
:name:Fractions
:default: 無効
:desc:
[[分数]]に置き換えます。
:usage: [CODE[GSUB]] [N[1]], [N[4]]
:css:
[CODE[[[font-variant-numeric]]: [[diagonal-fractions]]]]

:tag: [CODE[fwid]]
:name:Full Widths
:default: 無効
:desc:
[[全角]]の[[グリフ]]に置き換えます。
[[欧州]]フォントでは 0.6em の固定幅グリフに置き換えます。
:usage: [CODE[GSUB]] [N[1]], [CODE[GPOS]] [N[1]]
:css:[CODE[[[font-variant-east-asian]]: [[full-width]]]]


:tag:[CODE[half]]
:name:Half Forms
:desc:
@@

:tag:[CODE[haln]]
:name:Halant Forms
:desc:
@@

:tag: [CODE[halt]]
:name:Alternate Half Widths
:usage: [CODE[GPOS]] [N[1]]
:default:
[[CJK]] の advanced layout に対応していないなら、
[[CJK]] [[横書き]]のとき、有効
:desc:
[[全角]]幅の[[グリフ]]を[[半角]]幅に調整します。
:css:[CODE[text-spacing]]

:tag: [CODE[hist]]
:name:Historical Forms
:usage: [CODE[GSUB]] [N[1]]
:desc:
歴史的な[[字形]]に置き換えます。
:default: 無効
:css:
[CODE[[[font-variant-alternates]]: [[historical-forms]]]]

:tag: [CODE[hkna]]
:name:Horizontal Kana Alternates
:usage: [CODE[GSUB]] [N[1]]
:desc:
[[横書き]]用の[[仮名]]の[[グリフ]]に置き換えます。
:default:
無効

:tag:[CODE[hlig]]
:name:Historical Ligatures
:desc:
@@
:css:
[CODE[[[font-variant-ligatures]]: [[historical-ligatures]]]]

:tag:[CODE[hngl]]
:name:Hangul
:desc:
@@

:tag: [CODE[hojo]]
:name:Hojo Kanji Forms (JIS X 0212-1990 Kanji Forms)
:default: 無効
:desc:
[[JIS X 0212]] の[[字形]]に置き換えます。

:tag: [CODE[hwid]]
:name:Half Widths
:default: 無効
:desc:
[[半角]]の[[グリフ]]に置き換えます。
:usage: [CODE[GSUB]] [N[1]], [CODE[GPOS]] [N[1]]
:css:[CODE[[[text-combine-upright]]]]

:tag: [CODE[init]]
:name:Initial Forms
:default: 自動
:desc:
[[語頭形]]に置き換えます。
:usage: [CODE[GSUB]] [N[1]], [N[5]], [N[6]], [N[8]]

:tag: [CODE[isol]]
:name:Isolated Forms
:default: 自動
:desc:
[[孤立形]]に置き換えます。
:usage: [CODE[GSUB]] [N[1]], [N[5]], [N[6]], [N[8]]

:tag: [CODE[ital]]
:name:Italics
:default: 
[[イタリック]]指定時に有効
:desc:
[[イタリック]]の[[グリフ]]に置き換えます。
:usage: [CODE[GSUB]] [N[1]]

:tag:[CODE[jalt]]
:name:Justification Alternates
:desc:
@@

:tag: [CODE[jp78]]
:name:JIS78 Forms
:usage: [CODE[GSUB]] [N[1]], [N[3]]
:desc:
[[利用者]]が手動で選択できる [[JIS X 0208:1978]] 字形(群)です。
:default: 無効
:css:[CODE[[[font-variant-east-asian]]: [[jis78]]]]

:tag: [CODE[jp83]]
:name:JIS83 Forms
:usage: [CODE[GSUB]] [N[1]]
:desc:
[[JIS X 0208:1983]] の[[字形]]に置き換えます。
:default: 無効
:css:[CODE[[[font-variant-east-asian]]: [[jis83]]]]

:tag: [CODE[jp90]]
:name:JIS90 Forms
:usage: [CODE[GSUB]] [N[1]]
:desc:
[[JIS X 0208:1990]] の[[字形]]に置き換えます。
:default: 無効
:css:[CODE[[[font-variant-east-asian]]: [[jis90]]]]

:tag: [CODE[jp04]]
:name:JIS2004 Forms
:usage: [CODE[GSUB]] [N[1]]
:desc:
[[JIS X 0213:2004]] の[[字形]]に置き換えます。
:default: 無効
:css:[CODE[[[font-variant-east-asian]]: [[jis04]]]]

:tag: [CODE[kern]]
:name:Kerning
:usage: [CODE[GPOS]] [N[2]], [N[8]]
:desc:
[[水平]]の[[カーニング]], すなわち隣接[[グリフ]]との位置関係を調整します。
:default:
[[横書き]]なら有効。
[[利用者]]が無効化や手動調整できてもよい。
:css:
[CODE[[[font-kerning]]: normal]]
[[横書き]]系


:tag:[CODE[lfbd]]
:name:Left Bounds
:desc:
@@

:tag: [CODE[liga]]
:name:Standard Ligatures
:usage: [CODE[GSUB]] [N[4]]
:desc:
通常使う[[合字]]に置き換えます。
:default: 有効
:css:
[CODE[[[font-variant-ligatures]]: [[common-ligatures]]]]

:tag:[CODE[ljmo]]
:name:Leading Jamo Forms
:desc:
@@

:tag: [CODE[lnum]]
:name:Lining Figures
:usage: [CODE[GSUB]] [N[1]]
:desc:
[[lining figure]] ([[大文字]]に合う[[数字]]) に置き換えます。
:default: 無効
:css:
[CODE[[[font-variant-numeric]]: [[lining-nums]]]]

:tag: [CODE[locl]]
:name:Localized Forms
:usage: [CODE[GSUB]] [N[1]]
:desc:
地方に適した形に置き換えます。
:default: 有効、
言語設定等によります。
:css:有効

:tag:[CODE[ltra]]
:name:Left-to-right glyph alternates
:usage: [CODE[GSUB]] [N[1]]
:desc:
[[左横書き]]用[[グリフ]]に置き換えます。
[CODE[ltrm]] との使い分けがあります。
[SEE[ [[書字方向依存グリフ]] ]]
:default: 自動

:tag:[CODE[ltrm]]
:name:Left-to-right mirrored forms
:usage: [CODE[GSUB]] [N[1]]
:desc:
[[左横書き]]用[[グリフ]]に置き換えます。
[CODE[ltrm]] との使い分けがあります。
[SEE[ [[書字方向依存グリフ]] ]]
:default: 自動

:tag: [CODE[mark]]
:name:Mark Positioning
:default: 有効
:desc:
[[基底]]グリフに対して[[マーク]]の位置を調整します。
:usage:
[CODE[GSUB]] [N[4]], [N[5]]
:css:有効

:tag:[CODE[med2]]
:name:Medial Forms #2
:desc:
@@

:tag: [CODE[medi]]
:name:Medial Forms
:default: 自動
:desc:
[[語中形]]に置き換えます。
:usage: [CODE[GSUB]] [N[1]], [N[5]], [N[6]], [N[8]]

:tag:[CODE[mgrk]]
:name:Mathematical Greek
:desc:
@@

:tag: [CODE[mkmk]]
:name:Mark to Mark Positioning
:default: 有効
:desc:
[[マーク]]グリフに対して[[マーク]]の位置を調整します。
:usage:
[CODE[GSUB]] [N[6]]
:css:有効

:tag:[CODE[mset]]
:desc:
@@

:tag:[CODE[nalt]]
:name:Alternate Annotation Forms
:usage:[CODE[GSUB]] [N[1]], [N[3]]
:default:無効
:desc:
[[囲み文字]]に置き換えます。
:css:
[CODE[[[font-variant-alternates]]: [[annotation]]([VAR[...]])]]

:tag: [CODE[nlck]]
:name:NLC Kanji Forms
:usage: [CODE[GSUB]] [N[1]]
:desc:
[CITE[[[表外漢字字体表]]]]の[[字形]]に置き換えます。
:default: 無効

:tag: [CODE[nukt]]
:name:Nukta Forms
:usage: [CODE[GSUB]] [N[4]]
:desc:
[[nukta]] 系に置き換えます。
:default: 自動

:tag: [CODE[numr]]
:name:Numerators
:usage: [CODE[GSUB]] [N[1]]
:desc:
[[斜線]]とその前の[[数字]]を[[分数]]用に置き換えます。
:default: 自動

:tag:[CODE[onum]]
:name:Oldstyle Figures
:default:無効
:usage:[CODE[GSUB]] [N[1]]
:desc:
[[数字]]を [[oldstlyle]] に置き換えます。
:css:
[CODE[[[font-variant-numeric]]: [[oldstyle-nums]]]]

:tag:[CODE[opbd]]
:name:Optical Bounds
:desc:
@@

:tag: [CODE[ordn]]
:name:Ordinals
:usage: [CODE[GSUB]] [N[4]], [N[6]]
:desc:
[[アルファベット]]の[[グリフ]]を[[序数標識]]に置き換えます。
:default: 無効
:css:
[CODE[[[font-variant-numeric]]: [[ordinal]]]]

:tag:[CODE[ornm]]
:name:Ornaments
:desc:
@@
:css:
[CODE[[[font-variant-alternates]]: [[ornaments]]([VAR[...]])]]

:tag: [CODE[palt]]
:name:Proportional Alternate Widths
:usage: [CODE[GPOS]] [N[1]]
:desc:
[[グリフ]]幅を可変幅用に調整します。
:default: 無効

:tag:[CODE[pcap]]
:name:Petite Capitals
:desc:
@@
:css:
[CODE[[[font-variant-caps]]: [[petite-caps]]]],
[CODE[[[font-variant-caps]]: [[all-petite-caps]]]]

:tag:[CODE[pkna]]
:name:Proportional Kana
:desc:
@@

:tag:[CODE[pnum]]
:name:Proportional Figures
:default: 無効
:usage: [CODE[GSUB]] [N[1]]
:desc:
[[数字]]を可変幅のものに置き換えます。
:css:
[CODE[[[font-variant-numeric]]: [[proportional-nums]]]]

:tag: [CODE[pref]]
:name:Pre-base Forms
:usage: [CODE[GSUB]] [N[4]]
:default: 自動
:desc:
[[pre-base form]] を置き換えます。

:tag: [CODE[pres]]
:name:Pre-base Substitutions
:usage: [CODE[GSUB]] [N[4]], [N[5]]
:default: 自動
:desc:
[[pre-base form]] に置き換えます。

:tag: [CODE[pstf]]
:name:Post-base Forms
:usage: [CODE[GSUB]] [N[4]]
:default: 自動
:desc:
[[post-base form]] を置き換えます。

:tag: [CODE[psts]]
:name:Post-base Substitutions
:usage: [CODE[GSUB]] [N[4]]
:default: 自動
:desc:
[[post-base form]] に置き換えます。

:tag: [CODE[pwid]]
:name:Proportional Widths
:usage: [CODE[GSUB]] [N[1]]
:desc:
可変幅の[[グリフ]]に置き換えます。
:default:
市場に合わせて有効でも無効でもよい

:tag:[CODE[qwid]]
:name:Quarter Widths
:desc:
@@
:css:[CODE[[[font-variant-east-asian]]: [[proportional-width]]]],
[CODE[[[text-combine-upright]]]]


:tag:[CODE[rand]]
:name:Randomize
:desc:
@@

:tag:[CODE[rclt]]
:name:Required Contextual Alternates
:desc:
@@

:tag:[CODE[rkrf]]
:name:Rakar Forms
:desc:
@@

:tag: [CODE[rlig]]
:name:Required Ligatures
:usage: [CODE[GSUB]] [N[4]]
:desc:
必須の[[合字]]に置き換えます。
:default:自動
:css:有効

:tag: [CODE[rphf]]
:name:Reph Form
:usage: [CODE[GSUB]] [N[4]]
:desc: [[reph]] 系に置き換えます。
:default: 自動

:tag:[CODE[rtbd]]
:name:Right Bounds
:desc:
@@

:tag: [CODE[rtla]]
:name:Right-to-left alternates
:usage: [CODE[GSUB]] [N[1]]
:desc:
[[右横書き]]用[[グリフ]]に置き換えます。
[CODE[rtlm]] との使い分けがあります。
[SEE[ [[書字方向依存グリフ]] ]]
:default: 自動

:tag: [CODE[rtlm]]
:name:Right-to-left mirrored forms
:usage: [CODE[GSUB]] [N[1]]
:desc:
[[右横書き]]用[[グリフ]]に置き換えます。
[CODE[rtla]] との使い分けがあります。
[SEE[ [[書字方向依存グリフ]] ]]
:default: 自動

:tag: [CODE[ruby]]
:name:Ruby Notation Forms
:usage: [CODE[GSUB]] [N[1]]
:desc:
[[ルビ]]用の[[グリフ]]に置き換えます。
:default: 無効
:css:[CODE[[[font-variant-east-asian]]: [[ruby]]]]

:tag:[CODE[rvrn]]
:name:Required Variation Alternates
:desc:
@@

:tag: [CODE[salt]]
:name:Stylistic Alternates
:usage: [CODE[GSUB]] [N[1]], [N[3]]
:desc:
[[利用者]]が手動で選択できる別様式の[[グリフ]]の候補(群)です。
:default: 無効
:css:
[CODE[[[font-variant-alternates]]: [[stylistic]]([VAR[...]])]]

:tag:[CODE[sinf]]
:name:Scientific Inferiors
:desc:
@@

:tag:[CODE[size]]
:name:Optical size
:desc:
@@
:params: ○

:tag:[CODE[smcp]]
:name:Small Capitals
:usage: [CODE[GSUB]] [N[1]]
:default:無効
:desc:
[[小文字]]を [[small capital]] に置き換えます。
:css:
[CODE[[[font-variant-caps]]: [[small-caps]]]],
[CODE[[[font-variant-caps]]: [[all-small-caps]]]]


:tag:[CODE[smpl]]
:name:Simplified Forms
:desc:
@@
:css:[CODE[[[font-variant-east-asian]]: [[simplified]]]]

:tag: [CODE[ss01]] ... [CODE[ss20]]
:name:Stylistic Set 1 ... Stylistic Set 20
:usage: [CODE[GSUB]] [N[1]]
:desc:
別様式の[[グリフ]]に置き換えます。
:default: 無効
:params: [[利用者]]向けの名前
:css:
[CODE[[[font-variant-alternates]]: [[styleset]]([VAR[...]])]]

:tag:[CODE[ssty]]
:name:Math script style alternates
:default: 自動
:usage: [CODE[GSUB]] [N[3]]
:desc:
[[数式]] [[subscript]], [[superscript]] 用[[グリフ]]に置き換えます。
:params:水準 (?)

:tag:[CODE[stch]]
:name:Stretching Glyph Decomposition
:desc:
@@

:tag: [CODE[subs]]
:name:Subscript
:usage: [CODE[GSUB]] [N[1]], [N[2]]
:desc:
[[下付き]]の[[グリフ]]に置き換えます。
:default: 無効
:css:[CODE[[[font-variant-position]]: [[sub]]]]

:tag: [CODE[sups]]
:name:Superscript
:usage: [CODE[GSUB]] [N[1]]
:desc:
[[上付き]]の[[グリフ]]に置き換えます。
:default:
無効
:css:[CODE[[[font-variant-position]]: [[super]]]]

:tag:[CODE[swsh]]
:name:Swash
:desc:
@@
:css:
[CODE[[[font-variant-alternates]]: [[swash]]([VAR[...]])]]

:tag:[CODE[titl]]
:name:Titling
:desc:
@@
:css:
[CODE[[[font-variant-caps]]: [[titling-caps]]]]

:tag:[CODE[tjmo]]
:name:Trailing Jamo Forms
:desc:
@@

:tag:[CODE[tnam]]
:name:Traditional Name Forms
:desc:
@@

:tag:[CODE[tnum]]
:name:Tabular Figures
:desc:
@@
:css:
[CODE[[[font-variant-numeric]]: [[tabular-nums]]]]

:tag: [CODE[trad]]
:name:Traditional Forms
:usage: [CODE[GSUB]] [N[1]], [N[3]]
:desc:
[[中文]]や[[日本語]]の伝統的[[字形]]に置き換えます。
:default:
無効
:css:[CODE[[[font-variant-east-asian]]: [[traditional]]]]

:tag:[CODE[twid]]
:name:Third Widths
:desc:
@@
:css:[CODE[[[text-combine-upright]]]]

:tag:[CODE[unic]]
:name:Unicase
:desc:
@@
:css:
[CODE[[[font-variant-caps]]: [[unicase]]]]

:tag:[CODE[valt]]
:name:Alternate Vertical Metrics
:desc:
@@
:css:[CODE[text-spacing]]

:tag: [CODE[vatu]]
:name:Vattu Variants
:usage: [CODE[GSUB]] [N[4]]
:desc:
[[vattu]] 系に置き換えます。
:default: 自動

:tag:[CODE[vchw]]
:name:Vertical Contextual Half-width Spacing
:desc:
@@

:tag: [CODE[vert]]
:name:Vertical Alternates
:usage: [CODE[GSUB]] [N[1]]
:desc:
[[縦書き]]用の[[グリフ]]に置き換えます。
:default:
[[縦書き]]のとき有効
:css:[[縦書き]]系

:tag: [CODE[vhal]]
:name:Alternate Vertical Half Metrics
:usage: [CODE[GPOS]] [N[1]]
:desc:
[[全角]]の高さの[[グリフ]]を[[半角]]の高さに調整します。
:default:
無効、
[[JLREQ]] [[応用]]等は適宜適用して良い。

:tag:[CODE[vjmo]]
:name:Vowel Jamo Forms
:desc:
@@

:tag: [CODE[vkna]]
:name:Vertical Kana Alternates
:usage: [CODE[GSUB]] [N[1]]
:desc:
[[縦書き]]用の[[仮名]]の[[グリフ]]に置き換えます。
:default:
無効


:tag: [CODE[vkrn]]
:name:Vertical Kerning
:usage: [CODE[GPOS]] [N[2]], [N[8]]
:desc:
[[垂直]]の[[カーニング]], すなわち隣接[[グリフ]]との位置関係を調整します。
:default:
[[縦書き]]なら有効。
[[利用者]]が無効化や手動調整できてもよい。
:css:
[CODE[[[font-kerning]]: normal]]
[[縦書き]]系


:tag: [CODE[vpal]]
:name:Proportional Alternate Vertical Metrics
:usage: [CODE[GPOS]] [N[1]]
:desc:
文字高さ可変での表示用に位置調整します。
:default: 無効。
[CODE[vkrn]] を有効にするとき、
有効にしなければなりません。

:tag: [CODE[vrt2]]
:name:Vertical Alternates and Rotation
:usage: [CODE[GSUB]] [N[1]]
:desc:
[[縦書き]]用の[[グリフ]]に置き換えます。
[[横書き]]文字は[[回転][回転 (書字方向)]]済の[[グリフ]]に置き換えます。
:default:
[[縦書き]]のとき有効
:css:不使用

:tag:[CODE[vrtr]]
:name:Vertical Alternates for Rotation
:desc:
@@
:css:[[sideways typesetting]]

:tag: [CODE[zero]]
:name:Slashed Zero
:usage: [CODE[GSUB]] [N[1]]
:desc:
[[0]] を[[斜線]]付きの[[グリフ]]に置き換えます。
:default:
無効
:css:
[CODE[[[font-variant-numeric]]: [[slashed-zero]]]]

]FIG]

[38] 
登録簿は期待される用法を書いているものの、
[[応用]]は他の仕様書や用途に応じて適宜[[仕立て]]して構わないとされています。
[SRC[>>37]]

;; [39] つまり[[相互運用性]]は最初からぶん投げられています...

[15] 
仕様書の登録簿の説明は実装に必要な情報が何も書かれていなかったり、
実装方法がわからないことが書かれていたり ([CODE[GSUB]]
の結果[[文字コード]]が変わるから新旧とも覚えておけとか)
やばいのが多い...

[16] 
似たようなものが違って説明されていて一貫性がないのが、
意図的なのかどうか判断つかないとか。

[17] 
いろいろな[[機能]]が他の[[機能]]や[[利用者]]との相互作用で「override」
したりされたりすると説明されているのだが、
それが処理全体のどの段階で何をどうすることが意図されているのか判断しかねるのが多い。
例えば A の [CODE[GSUB]] が B の [CODE[GSUB]] を override するとして、
A と B が適用されたとき実装はどうするのが正解なのか。
[[フォント]]はどう作るのが正しいのか。
B が先に[[グリフ]]を置換していたら override もなにも A 
の適用の前提がなくなる可能性がある。
実装は B を抑制するべきなのか。
フォントは B の出力が A の入力に来ることを想定するべきなのか。

[32] 
[CITE[[[CSS Fonts]]]]
は一応
[[OpenType]]
に限定しない形で[[フォント]]の[[特性]]の記述とその利用の方法を規定しつつも、
[[OpenType]]
の[[機能][フォント機能]]との対応関係を示しています。
[[特性]]は 
[[OpenType]]
の[[機能][フォント機能]]にほぼ対応するよう設計されていて、
将来の新しい[[フォント]]技術はそれを踏襲するよう要請しています。

[33] 
そのような建付けにした上で、 [[CSS]] 
としての各機能の説明や[[フォント]]開発者に対する推奨が[[仕様書]]で説明されています。
実質的に [[OpenType]] の[[機能][フォント機能]]の利用方法を補足説明するものとして利用できます。


* [CODE[font-feature-settings]] (CSS)

[29] 
[[CSS]] では 
[DFN[[CODE[font-feature-settings]]]] 
[[プロパティー]]で適用する[[機能][フォント機能]]を指定できます。
[SRC[>>30]]

* フォントの実例

[1] 
[CITE@ja[しっぽり明朝|商用・同人誌利用可能フリーフォント]], [TIME[2021-11-13T12:36:19.000Z]], [TIME[2022-08-14T13:51:23.467Z]] <https://fontdasu.com/shippori-mincho/>

[CODE[GSUB]]
[CODE[ss01]] - [CODE[ss02]] (引数なし),
aalt ccmp dlig frac fwid hwid jp78 jp83 liga nlck ordn salt sups vert vkna vrt2 

[CODE[GPOS]]
abvm mark mkmk palt vpal


[2] [CITE@ja[GPOSのCursive Attachment Positioningについて - にせねこメモ]], [TIME[2022-08-14T15:11:14.000Z]] <https://nixeneko.hatenablog.com/entry/2017/01/14/200258>

[CODE[GPOS]] [CODE[curs]]

[3] [CITE@ja[OpenTypeフォントで万年カレンダーをつくる - にせねこメモ]], [TIME[2022-08-14T15:16:17.000Z]] <https://nixeneko.hatenablog.com/entry/2017/02/13/000000>

[CODE[liga]], [CODE[mkmk]]

[4] [CITE[[[BabelStone Han]]]]

[CODE[GSUB]] [CODE[ccmp]],
[CODE[GSUB]] [CODE[calt]]

([CODE[lookupType]] 1 [CODE[substFormat]] 2,
[CODE[lookupType]] 4 [CODE[substFormat]] 1,
[CODE[lookupType]] 6 [CODE[substFormat]] 3)

[CODE[GPOS]] [CODE[chws]], [CODE[kern]] (2, 2)

[5] [CITE[[[花園明朝]]]]

[CODE[GSUB]] [CODE[aalt]]

([CODE[lookupType]] 1 [CODE[substFormat]] 1)


[7] 
[CITE[[[Nishiki-teki]]]]

[CODE[GSUB]]
"[CODE[    ]]" ([CODE[0x20]] × 4), [CODE[calt]], [CODE[ccmp]], [CODE[dlig]], [CODE[fina]], [CODE[frac]], [CODE[init]], [CODE[isol]], [CODE[liga]], [CODE[lnum]], [CODE[locl]], [CODE[medi]], [CODE[vert]], [CODE[vkna]], [CODE[vrt2]], [CODE[zero]]

(lookup 
1 - 1,
1 - 2,
4 - 1,
6 - 2,
6 - 3)


[CODE[GPOS]]
[CODE[kern]], [CODE[mark]], [CODE[mkmk]]


[18] 
[[全字庫フォント]]
[CITE[TW-Sung]]

[CODE[GSUB]] [CODE[vert]], [CODE[rtla]]

[CODE[GPOS]] [[表]]はあるが中身空


[20] 
[CITE[Honoka Shin Mincho L]]

[CODE[GSUB]]	
[CODE[aalt]], [CODE[ccmp]], [CODE[frac]], [CODE[fwid]], [CODE[hwid]], [CODE[ital]], [CODE[jp78]], [CODE[liga]], [CODE[ordn]], [CODE[sups]], [CODE[trad]], [CODE[vert]], [CODE[vkna]], [CODE[vrt2]]
([N[1]], [N[2]]; [N[3]], [N[1]]; [N[2]], [N[1]]; [N[4]], [N[1]]; [N[6]], [N[3]]; [N[1]], [N[1]])

[CODE[GPOS]]
[CODE[kern]]
([N[2]], [N[1]]; [N[2]], [N[2]])


[21] 
[CITE[Kikai Chokoku JIS Medium]]

[CODE[GSUB]]:	
[CODE[aalt]], [CODE[ccmp]], [CODE[fwid]], [CODE[hwid]], [CODE[jp04]], [CODE[jp78]], [CODE[jp83]], [CODE[jp90]], [CODE[liga]], [CODE[palt]], [CODE[pwid]], [CODE[salt]], [CODE[ss01]], [CODE[ss02]], [CODE[ss03]], [CODE[ss05]], [CODE[ss06]], [CODE[ss07]], [CODE[ss11]], [CODE[ss12]], [CODE[ss20]], [CODE[trad]], [CODE[vert]], [CODE[vkna]], [CODE[vrt2]]
([N[1]], [N[2]]; [N[3]], [N[1]]; [N[4]], [N[1]]; [N[1]], [N[1]])

[CODE[GPOS]]:
[CODE[kern]]
([N[2]], [N[2]]; [N[2]], [N[1]])


[23] 
[CITE[Makoto Comic]]

[CODE[GSUB]]:	
[CODE[aalt]], [CODE[ccmp]], [CODE[dlig]], [CODE[fwid]], [CODE[hist]], [CODE[hwid]], [CODE[jp78]], [CODE[jp83]], [CODE[jp90]], [CODE[liga]], [CODE[locl]], [CODE[nlck]], [CODE[pwid]], [CODE[vert]], [CODE[vrt2]]
([N[1]], [N[2]]; [N[3]], [N[1]]; [N[4]], [N[1]]; [N[1]], [N[1]])

[CODE[GPOS]]:	
[CODE[halt]], [CODE[kern]], [CODE[palt]], [CODE[vhal]], [CODE[vkrn]], [CODE[vpal]]
([N[1]], [N[1]]; [N[2]], [N[1]]; [N[2]], [N[2]]; [N[1]], [N[2]])


[24] 
[CITE[BIZen Antique Bold]]

[CODE[GSUB]]:
[CODE[aalt]], [CODE[ccmp]], [CODE[dlig]], [CODE[expt]], [CODE[frac]], [CODE[fwid]], [CODE[hojo]], [CODE[hwid]], [CODE[jp78]], [CODE[jp83]], [CODE[jp90]], [CODE[liga]], [CODE[nalt]], [CODE[nlck]], [CODE[numr]], [CODE[ruby]], [CODE[sups]], [CODE[trad]], [CODE[vert]], [CODE[vrt2]], [CODE[zero]]
([N[1]], [N[2]]; [N[3]], [N[1]]; [N[4]], [N[1]]; [N[1]], [N[1]])

[25] 
>>24 [CODE[ruby]] で「、」「。」の点が中央に移動します。
果たしてそれが[[ルビ]]に適した[[グリフ]]と言えるのかは疑問。

[26] 
[CITE[OptimaModoki]]

[CODE[GSUB]]:	
[CODE[    ]] ([[空白]]4つ), [CODE[abvf]], [CODE[abvs]], [CODE[akhn]], [CODE[blwf]], [CODE[blws]], [CODE[ccmp]], [CODE[clig]], [CODE[half]], [CODE[init]], [CODE[liga]], [CODE[nukt]], [CODE[pref]], [CODE[pstf]], [CODE[psts]], [CODE[rlig]], [CODE[rphf]], [CODE[vatu]]
([N[4]], [N[1]]; [N[2]], [N[1]]; [N[1]], [N[2]]; [N[6]], [N[3]]; [N[1]], [N[1]])

[CODE[GPOS]]:	
[CODE[abvm]], [CODE[blwm]], [CODE[mkmk]]
([N[4]], [N[1]]; [N[6]], [N[1]])

[27] 
[CITE[STIX Two Text Italic]]

[CODE[GSUB]]:	
[CODE[c2sc]], [CODE[case]], [CODE[ccmp]], [CODE[cv01]], [CODE[cv02]], [CODE[cv03]], [CODE[dnom]], [CODE[frac]], [CODE[liga]], [CODE[locl]], [CODE[numr]], [CODE[onum]], [CODE[pnum]], [CODE[smcp]], [CODE[ss01]], [CODE[ss02]], [CODE[subs]], [CODE[sups]]
([N[7]], [N[1]] ([N[1]], [N[1]]); [N[7]], [N[1]] ([N[1]], [N[2]]); [N[7]], [N[1]] ([N[2]], [N[1]]); [N[7]], [N[1]] ([N[4]], [N[1]]); [N[7]], [N[1]] ([N[6]], [N[3]]))

[CODE[GPOS]]:	
[CODE[kern]], [CODE[mark]], [CODE[mkmk]]
([N[4]], [N[1]]; [N[6]], [N[1]]; [N[9]], [N[1]] ([N[2]], [N[1]]); [N[9]], [N[1]] ([N[2]], [N[2]]))

[28] 
[CITE[Asana Math]]

[CODE[GSUB]]:	
[CODE[dtls]], [CODE[onum]], [CODE[salt]], [CODE[ssty]]
([N[1]], [N[1]]; [N[1]], [N[2]]; [N[3]], [N[1]])

[CODE[GPOS]]:
[CODE[kern]]
([N[2]], [N[1]])


[31] [CITE[Iosevka]],
[TIME[2016-08-03 21:51:01 +09:00]]
<https://be5invis.github.io/Iosevka/>


-[9] [CITE@ja[欧文フォントの異体字にはどんなものがあるのか - 帰ってきた💫Unicode刑事〔デカ〕リターンズ]], [TIME[2022-08-18T04:46:46.000Z]] <https://moji-memo.hatenablog.jp/entry/20120809/1344500965>
-[11] [CITE@ja[フォントによるGSUBフィーチャのサポート状況 - 帰ってきた💫Unicode刑事〔デカ〕リターンズ]], [TIME[2022-08-18T04:57:38.000Z]] <https://moji-memo.hatenablog.jp/entry/20100324/1269410918>
-[10] [CITE@ja[「スラッシュを用いた分数」の仕様変更 - 帰ってきた💫Unicode刑事〔デカ〕リターンズ]], [TIME[2022-08-18T04:52:04.000Z]] <https://moji-memo.hatenablog.jp/entry/20100315/1268632041>
-[12] [CITE@ja[横組み用仮名(hkna)と縦組み用仮名(vkna)は使うべきか - 帰ってきた💫Unicode刑事〔デカ〕リターンズ]], [TIME[2022-08-18T04:59:12.000Z]] <https://moji-memo.hatenablog.jp/entry/20090804/1249369271>
-[13] [CITE@ja[OpenTypeフォントの上付き文字と下付き文字 - 帰ってきた💫Unicode刑事〔デカ〕リターンズ]], [TIME[2022-08-18T05:00:45.000Z]] <https://moji-memo.hatenablog.jp/entry/20100318/1268907174>


- [80] [CITE@ja[約物Webフォント「約味」(YakuAdj) – ものかの]], [TIME[2023-05-24T02:07:40.000Z]], [TIME[2023-05-24T11:53:48.731Z]] <https://tama-san.com/yakuadj-font/>
- [81] [CITE@en[GitHub - monokano/Fonts: Webフォント約味/Webフォント約猫]], [TIME[2023-05-24T11:54:05.000Z]] <https://github.com/monokano/Fonts>

>
-和文の句読点や括弧が連続したときのアキを自動調整するフォント。
-GPOSのchws/vchwで自動調整します。

[82] [CITE@ja[西暦表記を元号による表記にするフォント: mottainaiDTP]], [TIME[2023-05-24T11:57:40.000Z]] <http://mottainaidtp.seesaa.net/article/425166883.html>

[CODE[calt]]

- [90] 
[CITE@en[GitHub - nevesnunes/z80-sans: OpenType font that disassembles Z80 instructions]], [TIME[2024-09-06T03:34:26.000Z]] <https://github.com/nevesnunes/z80-sans>


[83] 
[CITE@ja[3桁ごとにカンマが発生するフォント: mottainaiDTP]], [TIME[2023-05-24T11:58:22.000Z]] <http://mottainaidtp.seesaa.net/article/395328634.html>

[CODE[calt]]

[94] [CITE@ja[小数点以下の数字が小さく表示されるフォント: mottainaiDTP]], [TIME[2024-10-24T12:26:32.000Z]] <https://mottainaidtp.seesaa.net/article/429751961.html?seesaa_related=category>

[CODE[calt]]

[85] 
[CITE[BabelStone Han]]
[CODE[liga]],
[CODE[calt]]

[86] 
[CITE@en-Latf[UnifrakturMaguntia, a Unicode Fraktur Font]], [TIME[2017-03-19T16:32:43.000Z]], [TIME[2023-11-11T03:53:15.187Z]] <https://unifraktur.sourceforge.net/maguntia.html>

[CODE[ss]], [CODE[cv]], 
[CODE[hlig]], [CODE[dlig]],
[CODE[tnum]], [CODE[lnum]],
[CODE[liga]], [CODE[ccmp]]

-[87] 
[CITE@ja[Catrinity OpenType Features - CatrinityOpenTypeFeatures.pdf]], [TIME[2024-05-20T09:40:33.000Z]], [TIME[2024-07-10T03:26:04.776Z]] <https://catrinity-font.de/downloads/CatrinityOpenTypeFeatures.pdf>
-[88] 
[CITE@ja[Catrinity Code Charts - CatrinityCodeCharts.pdf]], [TIME[2024-05-20T09:40:34.000Z]], [TIME[2024-07-10T03:36:34.407Z]] <https://catrinity-font.de/downloads/CatrinityCodeCharts.pdf>

[89] [CITE@en[How to enable stylistic sets · tonsky/FiraCode Wiki · GitHub]], [TIME[2024-08-31T01:12:18.000Z]] <https://github.com/tonsky/FiraCode/wiki/How-to-enable-stylistic-sets>

[CODE[cv]], [CODE[ss]], [CODE[zero]], [CODE[onum]]

[91] [CITE@en-US[Download - Abyssinica SIL]], [TIME[2024-10-14T09:10:07.000Z]] <https://software.sil.org/abyssinica/download/>

[CODE[cv]], 言語

[95] [CITE@ja[OpenTypeフォントで万年カレンダーをつくる - にせねこメモ]], [TIME[2024-10-24T12:51:33.000Z]] <https://nixeneko.hatenablog.com/entry/2017/02/13/000000>

[CODE[mkmk]]

[97] [CITE@en[Details of available Stylistic Sets · Issue #246 · adobe-fonts/source-code-pro · GitHub]], [TIME[2024-11-04T05:22:09.000Z]] <https://github.com/adobe-fonts/source-code-pro/issues/246>

[CODE[ss]], [CODE[cv]], [CODE[salt]], [CODE[zero]]

* メモ

[19] 
[CODE[GSUB]] [[lookup]] が適用された結果、直接または間接に、元の入力に戻ることもあります。

[40] [CITE@ja-jp[OpenType glyph processing (part 1) - Typography | [[Microsoft]] Docs]], [[alib-ms]], [TIME[2022-08-27T07:38:44.000Z]] <https://docs.microsoft.com/ja-jp/typography/develop/processing-part1#opentype-fonts>


[50] [CITE[pango で縦書きとその能力]], [TIME[2022-08-28T05:42:53.000Z]], [TIME[2022-08-28T13:50:50.107Z]] <https://cat-in-136.github.io/2016/04/pango-view-vertical-writing.html>

[77] [CITE@ja-JP[CSS での OpenType 機能の構文]], [TIME[2022-10-10T14:55:24.000Z]] <https://helpx.adobe.com/jp/fonts/using/open-type-syntax.html>


- [78] [CITE[OpenType Feature Database]], [TIME[2021-11-30T20:51:20.000Z]], [TIME[2022-10-10T15:11:10.348Z]] <https://simoncozens.github.io/feature-tags/>
-- [79] [CITE@en[GitHub - simoncozens/feature-tags: A curated guide to the OpenType Specification feature tag repository]], [TIME[2022-10-10T15:11:33.000Z]] <https://github.com/simoncozens/feature-tags>





[FIG(quote)[
[FIGCAPTION[
[84] [CITE@ja[5-B3. 霧ゴシック(ゴシック体フォント)]]
([TIME[2022-03-17T16:46:53.000Z]], [TIME[2023-08-10T08:02:35.694Z]])
<http://www.akenotsuki.com/eyeben/fonts/kirigo.html>
]FIGCAPTION]

> 横書き時、欧文用の三点リーダが使われてしまうことがある問題に対処しました。
> 源ノ角ゴシックのfeatureファイル(フォントの設定ファイル)では、「三点リーダがラテン・ギリシア・キリル文字とともに使われる時、グリフを既定の…(ボックス真ん中に点)から欧文用の...(ベースライン付近に点)に切り替える、ただし日本語環境ではこの切り替えをしない」という設定になっているのですが、Windowsではこれがうまく機能せず、日本語の文書でも欧文用の...になってしまうことがしばしばありましたため、この切り替え機能自体を無効化しました。 

]FIG]


[92] [CITE@ja[Safari で Osaka フォントの表示不具合を CSS で対処 | Memorandom]], [TIME[2024-08-23T08:19:57.000Z]], [TIME[2024-10-24T12:20:03.950Z]] <https://memorandom.whitepenguins.com/posts/safari-osaka/>

[93] >>92 配置がずれる謎の不具合を [CODE[palt]] で回避する。なんかよくわからんけど
[CODE[palt]] を有効にすると文字幅計算方法が変わってまともになる[[ってコト]]!?



[96] 
エディターで[[制御文字]]を表示したいとか、[[結合文字]]の点線を表示したいとか、
空き領域の[[符号位置]]を表示したいとか、みたいな目的で使える[[機能]]があればいいのになあ。


