[2] [DFN[文字幅]]は、
[[全角文字]]や[[半角文字]]です。

[3] 
[[文字のレンダリング]]の問題だったり、
[[文字コード]]表現の問題だったり、
その他何だかよくわからない問題だったりします。

* フォント機能

** フォント機能 [CODE[chws]] (OpenType)

@@

** フォント機能 [CODE[fwid]] (OpenType)

[8] 
[[OpenType]] の[[フォント機能]] [DFN[[CODE[fwid]]]]
は、
Full Widths ([[全幅]])
と説明されています。
[SRC[>>7]]

[REFS[

- [7] 
[CITE@en-us[Registered features, f-j (OpenType 1.9.1) - Typography | Microsoft Learn]], [[PeterCon]], [TIME[2024-05-31T17:42:16.000Z]], [TIME[2025-04-13T13:35:46.695Z]] <https://learn.microsoft.com/en-us/typography/opentype/spec/features_fj?source=recommendations#fwid>

]REFS]

-*-*-

[9] 
[CODE[fwid]]
は、グリフ集合中にあってその他の[RUBYB[[[幅]]][width]]に設定されている[[グリフ]]を置換して、
[RUBYB[全 (通常は [[em]]) 幅][full (usually em) width]]に設定された[[グリフ]]とします。
[SRC[>>7]]

[10] 
[[CJKVフォント]]では、
「lower ASCII」 ラテン文字や各種[RUBYB[記号][symbol]]を含むかもしれません。
[SRC[>>7]]

;; [12] ちょっと何言ってるのかわかりませんが、世にいう[[半角ASCII文字]]のことでしょうか。

[11] 
[RUBYB[欧州のフォント][European font]]では、
[RUBYB[可変幅][proportionally-spaced]][[グリフ]]を[RUBYB[固定幅][fixed-width]][[グリフ]]
([RUBYB[通常][generally]]は 0.6 em 幅に設定) に置換します。
[SRC[>>7]]

[13] 
[[fullwidth]] というのは普通は[[東洋]]の[[全角文字]] (1em 幅で表示) を指す用語ですが、
ここでは[[欧州]]の 0.6em 幅の固定幅の表示にも使えるとされています。
任意幅 → 固定幅、という点こそ共通しているものの、
両者はまったくの別物です。同時実装不能です。
東洋フォントと欧州フォントは別製品なので交わることはないという世界観なのでしょうか。
それとも[[言語系]]などで区別しろということなのでしょうか。

[14] 
[[AJ1]] はじめ[[東洋]]のフォントでは [CODE[fwid]] は実際に[[半角]]から[[全角]]への置換などで一般的に使われています。
欧州のフォントではどうなのでしょう。


** フォント機能 [CODE[halt]] (OpenType)

[21] 
[[フォント機能]] 
[DFN[[CODE[halt]]]]
は、
Alternate Half Widths
と説明されています。
[SRC[>>20]]

[22] 
[CODE[halt]]
は、
[RUBYB[既定の状態][by default]]で[RUBYB[全角の大きさ][have full-width metrics]]の[[グリフ]]を、
[RUBYB[固定幅で半角幅][fixed, half-em widths]]に合わせて[RUBYB[再配置][Re-spaces]]することで、
[[JLREQ]]
(特に [CSECTION[3.1.4 Positioning of Consecutive Opening Brackets, Closing Brackets, Commas, Full Stops and Middle Dots]],
[CSECTION[B. Spacing between Characters]])
や同様の [[CJKV]]
[RUBYB[文章配置][text-layout]]仕様書 (具体例: [[CLREQ]], [[KLREQ]]) で説明されているような、
既定の[[グリフ]]が[RUBYB[全角幅][full-width]]である[[文字]]の[RUBYB[半角形][half-width forms]]を期待するような、
より洗練された文章配置法を近似するものです。
[SRC[>>20]]

[27] 
[[CLREQ]], [[JLREQ]], [[KLREQ]]
で説明される [[CJKV]] [RUBYB[[[文章]]][text]]の[RUBYB[高度な配置][advanced layout]]に対応した[RUBYB[配置エンジン][layout engine]]は、
[CODE[halt]]
を使う[RUBYB[べきではありません][should not]]。
そのような[[応用]]では、
[CODE[halt]]
を用いるかどうかの選択肢を[[利用者]]に提示しないのが適切です。
[SRC[>>20]]

[28] 
そうでない実装では、 [CODE[halt]]
を[RUBYB[[[横書き]]配置][horizontal layout]]におけるすべての
[[CJKV]] [RUBYB[文章][text]]に対して、
または特別な扱いを必要とする特定の文字、例えば[RUBYB[[[括弧]]][brackets]],
[RUBYB[[[句読点]]][punctuation]], [RUBYB[[[引用符]]][quotation marks]]に選択的に、
有効にする[RUBYB[べきです][should]]。
これは [[CJK]] [[文章]]に対しては既定の状態で有効とする[RUBYB[べきです][should]]。
[SRC[>>20]]

[25] 
[CODE[GPOS]] [F[[CODE[lookupType]]]] [N[1]]
の 
[F[[CODE[xPlacement]]]],
[F[[CODE[yPlacement]]]],
[F[[CODE[xAdvance]]]],
[F[[CODE[yAdvance]]]]
で代替となる metrics を指定することが[RUBYB[推奨][recommended]]されています。
[SRC[>>20]]

[23] 
[CODE[halt]]
は
[CODE[hwid]]
とは違って新しい[[グリフ]]に[RUBYB[置換][substitute]]するものではありません。
[SRC[>>20]]

[24] 
[CODE[halt]]
は
[CODE[chws]]
とは違って[RUBYB[文脈的][contextual]]ではありません。
[SRC[>>20]]

[26] 
[[OpenType]] の仕様上は >>25 以外の方法が禁止されているわけではなく、
例えば他の [F[[CODE[lookupType]]]] により条件を記述することも、
[CODE[GSUB]] で別の[[グリフ]]に置換することも技術的には可能ですが、
>>23 や >>24 のような説明があり、そうした用法は期待されていないようです。


;; [32] 
文脈的でないものに限るとされていること、既定の状態で有効にすることが求められていることで、
この[[フォント機能]]の利用場面は限られてきます。
例えば[CH[。]]は通常次の文章と密着しないように右半分に[[アキ]]がある状態の[[全角]]の[[字形]]とされます。
もし [CODE[halt]] でこの[[アキ]]を削って[[半角]]に調整すると、読みづらい文章になってしまいますから、
それが既定の状態となるべきではなく、 [CODE[halt]] で指定するべきではなかったということになります。
また、[[置換]]ではなく [CODE[GPOS]] によって[[全角]]から[[半角]]に変換することが求められているので、
[[全角英数字]]から[[半角英数字]]への置換には適用できない場合が多いと考えられますし、
[[JLREQ]] の参照箇所から考えてもその用途は想定外と思われます。
こうした適用できない場面を除くと、
実際に使えそうなのは[[括弧]]の前後の空白の除去くらいでしょうか。



[REFS[

- [20] 
[CITE@en-us[Registered features, f-j (OpenType 1.9.1) - Typography | Microsoft Learn]], [[PeterCon]], [TIME[2024-05-31T17:42:16.000Z]], [TIME[2025-05-13T12:06:53.810Z]] <https://learn.microsoft.com/en-us/typography/opentype/spec/features_fj?source=recommendations#halt>

]REFS]

** フォント機能 [CODE[hwid]] (OpenType)


[34] 
[[フォント機能]]
[DFN[[CODE[hwid]]]]
は、
Half Widths
です。
[SRC[>>33]]

[35] 
[[フォント機能]]
[CODE[hwid]]
は、
[RUBYB[可変幅][proportional widths]]や[RUBYB[固定幅][fixed widths]]であっても[RUBYB[半角幅][half an em]]以外の[[グリフ]]を、
[RUBYB[半角幅][half-em (en) widths]]の[[グリフ]]に置換します。
[SRC[>>33]]

[36] 
多くの [[CJKVフォント]]は複数の幅から選べるグリフの集合を有しており、
[CODE[hwid]]
はそのうち[RUBYB[[[半角]]版][half-em variants]]を選ぶものです。 
[SRC[>>33]]

[37] 
これが好ましい挙動である場面はいろいろあります。
例えば[RUBYB[古めの][older]][RUBYB[デスクトップ文書][desktop documents]]との互換性などです。
[SRC[>>33]]

;; [38] 
古めのデスクトップ文書というのが何を意味しているのかよくわかりませんが、
[[固定幅フォント]]が標準的に使われていた[[平成時代]]初期頃までの[[パソコン]]の[[ワープロ]]、[[表計算]]その他の[[文書]]が想定されているのでしょうか。

[REFS[

- [33] 
[CITE@en-us[Registered features, f-j (OpenType 1.9.1) - Typography | Microsoft Learn]], [[PeterCon]], [TIME[2024-05-31T17:42:16.000Z]], [TIME[2025-05-15T11:39:38.036Z]] <https://learn.microsoft.com/en-us/typography/opentype/spec/features_fj?source=recommendations#hwid>

]REFS]

** 共通

[29] 
水平グリフ幅機能 ([CODE[chws]], [CODE[fwid]],
[CODE[halt]],
[CODE[hwid]], [CODE[palt]],
[CODE[pkna]], [CODE[pwid]], [CODE[qwid]], [CODE[twid]], [CODE[pnum]], [CODE[tnum]])
とは互いに排他的であり、 [CODE[halt]] が適用されるときはこれらは無効とする[RUBYB[べきです][should]]。
[SRC[>>7, >>20, >>33]]

[30] 
[CODE[halt]] が適用されるときは [CODE[apkn]] や [CODE[kern]]
は無効とする[RUBYB[べき][should]]です。
[SRC[>>7, >>20, >>33]]

[18] 
[CODE[lfbd]], [CODE[rtbd]] は[[固定幅]]機能を使った[[グリフ]]に適用されるべきではありません。
[SEE[ [[lfbd]] ]]

;; 
[31] 
こうした排他的適用に関する推奨事項が誰に対するものなのか、[[フォント]]開発者なのか (仕様上難しそう)、
[[応用]]の実装者なのか、[[フォント]]と[[応用]]の[[利用者]]なのか、よくわかりません。
[CSECTION[UI suggestion]]
から参照されていることがある [SRC[>>20]] ので、[[応用]]が提示する[[利用者インターフェイス]]と[[利用者]]に対する推奨でしょうか。


-*-*-

[15] 
[CODE[fwid]],
[CODE[hwid]]
は、
[CODE[GSUB]] [[lookup]] [N[1]] で[[グリフ]]を[RUBYB[全[[前進幅]]][full advance width]] 
([CODE[fwid]])
ないし
[RUBYB[半角幅][half-em widths]]
([CODE[hwid]])
のものに置換することもできますし、
[CODE[GPOS]] [[lookup]] [N[1]] の [F[[CODE[xPlacement]]]]
と [F[[CODE[xAdvance]]]] で 
proportional グリフに全角 metrics ([CODE[fwid]])
ないし元のグリフに半角の metrics ([CODE[hwid]])
を指定することもできます。
[SRC[>>7, >>33]]

[17] 
こうした実装方法が[RUBYB[推奨][recommended]]されている [SRC[>>7, >>33]]
ものの、その他の [[lookup]] 型が禁止されているわけではありません。

[16] 
既定の状態では無効とする[RUBYB[べき][should]]で、
[[文書]]の[[マーク付け]]や[[利用者]]の制御やその他の[[応用]]の基準に応じて[[グリフ]]の[[連なり]]に適用できるという形に実装できます。
[SRC[>>7, >>33]]



* 関連


[6] 関連: 
[[幅写像]],
[[AA]]

* メモ

-
[1]
[CITE[Emacs22 + UTF-8 における文脈依存な文字幅の問題について]] ([TIME[2008-06-29 01:03:38 +09:00]] 版) <http://www.pqrs.org/tekezo/emacs/doc/wide-character/index.html>
-- [4] 消滅確認 [TIME[2022-10-29T04:24:23.400Z]]
-- [5] [CITE[Emacs22 + UTF-8 における文脈依存な文字幅の問題について]], [TIME[2022-10-29T04:24:10.000Z]], [TIME[2008-03-13T00:24:02.705Z]] <https://web.archive.org/web/20080313002338/http://www.pqrs.org/tekezo/emacs/doc/wide-character/index.html>

