- はじめに
- 変数フォントでない通常のフォント
- 変数フォント
- 変数フォントか通常フォントかの判別方法
- 「バリエーション軸」と「インスタンス」
- 変数フォント非対応のアプリケーションを使って変数フォントを使う
- 変数フォントを使えるアプリケーション
- プログラムにおける変数フォント
- 変数フォント通常フォントのアウトラインの違い
- 過去の記事
- こちらもご覧ください
はじめに
「変数フォント」または「バリアブルフォント variable font」とは外部からパラメーターを指定して文字の形を変更して表示する仕様、または技術です。
例えば、フォントを開くときに「ボールド(太字)」を指定することがありますが、もう少し太くとか、逆に細くできないのかと思ったことはないでしょうか。
通常のフォントではできませんが、変数フォントなら太字を数値で指定して調整できるという訳です。

そんなフォントなんか見たことが無い、そもそもExcel等のアプリでボールドの指定はONかOFFしかないのに、太字を数値で指定するなんてできないでしょう、、、
と、思った人がほとんどでしょう。
そう、その通りなのです。
変数フォントは余り使われてませんし、積極的に使えるようにもなっていないというのが実情です。だから「知られざるフォント技術」なのですが、その一方で、Webの世界では変数フォントもそれを使う方法も出揃ってきています。
その辺りも含めて、
今回は変数フォントの話をしたいと思います。
尚、「variable font」は「変数フォント」より「可変フォント」とするのが適切な訳だと思いますが、Windowsの表示に合わせて「変数フォント」に統一します。
変数フォントでない通常のフォント
そもそも、変数フォントでない通常のフォントですが、どうやって文字をボールド(太字)にしているかご存じでしょうか。
まず標準のフォントがあって、ボールドが指定された時はそれを横方向に縮尺を変えている、あるいは画像や図形の加工技術で文字を太らせている、というイメージだったのではないでしょうか。
それは全く違います。ボールドのフォントと標準のフォントは全く別のフォントデータとして作成されているのです。
例えば、「MS ゴシック」であれば、「MS ゴシック 標準」、「MS ゴシック ボールド」、「MS ゴシック イタリック」、「MS ゴシック ボールド イタリック」の4種が全く別のフォントとして作られています。要するに力業をしているだけです。
この4つのフォントを同じグループとして関連付けているのは、フォントの名前だけ、つまりExcel等は、「MS ゴシック」という名前と、ボールド、イタリックの指定から、4つのフォントの中から適切なものを選択しているということです。
ちなみにフォントのグループの名前に相当する「MS ゴシック」をフォントファミリー名と言い、「ボールド」等の事をフォントフェイス名と言います。
そして本当の個々のフォントの名前である「MS ゴシック ボールド」を完全フォント名と言います。
我々が漠然と「フォント」と呼んだ時、意味しているのはフォントファミリーの事だと気が付いたでしょうか。
フォントファミリーは物理的には複数のフォントフェースの集合体ですが、「複数」だという事を意識する事は無いのは、Windowsのフォントの仕組みが非常によくできているのだと考えるべきでしょう。
そしてこれを発展させ。1つのファントにおいて、わざわざ4つのフォントフェースを作らず、標準フォントに変形処理を施すことで、ボールドやイタリックを実現できる、しかもON/OFFで無く、度合いを数値で指定できるようにしたのが、変数フォントという訳です。
変数フォント
ここまで良いこと尽くしのような変数フォントの話をしましたが、それなら何故、変数フォントは余り普及しないのでしょうか。
要因は幾つかあるのでしょうけど、一番の理由、それはおそらく、仕様も概念も複雑すぎるからです。以下は可変フォントの概念を説明するマイクロソフトのホームページです。
理解しがたいほど複雑だとはいいませんが、フォント設計者がこの概念に沿って、指定されたボールド、イタリック、その他の「軸」の度合いを複合して、一つ一つのグリフのアウトライン制御点の位置を移動させなければならないのです。
フォント設計者にしてみればそんな事をするくらいなら、むしろ4つフォントを作った方が遥かに楽だと思うに違いないのです。
とは言え、文字の微妙な太さや傾きの度合いに強くこだわる人、拘らなければならない職業などあるでしょう。
変数フォントにも一定の需要があるに違いないのです。
変数フォントか通常フォントかの判別方法
今日では、様々フォントファイルがネットからダウンロードできるのでが、ダウンロードサイトに変数フォントだと書いてあるとは限りません。どうすればそれが変数フォントだと判別できるでしょうか?
フォントファイルが変数フォントかそうでないか、拡張子は通常フォントと同様に、.ttfまたは.otfですので、外形では直ぐに判別できません。ただ変数フォントのフォントファイルはファイル名の中に"Variable"という単語が含まれている場合も多いので、その場合は可変フォントかなと推測することはできますが、ファイル名が必ずそうなっている訳ではないのです。
フォントファイルのデータを直接確認する
確実に判別するにはフォントビューワー的なツールでフォントファイルの中を見るしかありませんが、フォントデータに含まれるテーブルのディレクトリーはファイルの先頭付近にありますので、専用のビューワーでなくてもバイナリエディターでも確認できます。
拡張子が.otfのフォントファイルの場合、タグ名"CFF2"のテーブルがあれば変数フォントで、"CFF "であれば通常のフォントです。
なので、変数フォント非対応のアプリケーションはあるはずの"CFF "データが無いのですから、フォントファイルは不正であると認識される事になります。

拡張子が.ttfのフォントファイルの場合、タグ名"gvar"のテーブルがあれば変数フォントです。
ちなみにタグ名"glyf"がTrueTypeグリフの図形データでこれは必ずあるはずです。タグ名"gvar"のデータはそれに対する変位のデータが格納されており、変数フォントを認識しないアプリケーションは、"gvar"データの存在を認識せず、"glyf"データだけでグリフを描画する事になります。平たく言えば、必ず「標準」のフォントフェースが描画されるという事です。

Windowsにインストールする
フォントデータの中身を見なくてもWindowsにフォントを導入すれば、それが変数フォントかどうかは分かります。
確認するには、フォントを導入して、設定画面から、フォントを選択、さらに導入したフォントを選択してください。

変数フォントであれば、上記のように「変数フォント」の表示があります。
さらに「変数フォントのプロパティ」をクリックすると、より詳細な変数フォントの情報を確認することができます。
この画面に記載されている「フォントのインスタンス」とか「バリエーション軸」という言葉を覚えておいてください。

「バリエーション軸」と「インスタンス」
用語を説明しておきます。
バリエーション軸
これまで変更可能なパラメータとして、「重さ」とか「傾き」を上げてきましたが、これを「バリエーション軸(Axis Tag)」と言います。
バリエーション軸はこれら以外にも、フォント設計者が任意に設定できます。
なんなら「可愛さ」とか「丸さ」とかの軸タグを設ける事も出来ますが、代表的なバリエーション軸として、以下の5つが登録されています。
| 軸タグ名 | 意味 | |
| 1 | ital | イタリック |
| 2 | opsz | 高額サイズ |
| 3 | slnt | 傾き |
| 4 | wdth | 幅 |
| 5 | wght | 重さ |
「タグ名」とはフォント全般で使われる言葉ですが、フォントのデータやパラメータの名前となる4文字の英数字の事です。
登録済みの軸タグについて、詳しくは以下のリンク先を参照してください
インスタンス
インスタンスとは、各軸を特定の値を決めた設定値軍につけた名前です。
例えば、「軸タグの重さ(wght) 700」を「Bold」という名前のインスタンスとします。
インスタンスも設計者が任意の名前、任意の個数を決める事ができます。
変数フォント非対応のアプリケーションを使って変数フォントを使う
Windowsにおいて、変数フォント非対応のアプリケーションは軸タグの値を指定する事はできません。指定できるのはインスタンスのみです
インスタンス名はフォントファイス名として機能しますので、フォント名指定で「フォントファミリー名+フォントフェイス名」の完全名を指定すれば、今までON/OFFしかなかった「太さ」もインスタンスの数だけ段階的な指定ができるという訳です。
例えば、Excel であれば数では表示しきれていませんが、フォントファミリー名「Source Serif Variable」、インスタンス名はwght 100に相当する「ExtraLight」を組み合わせて「Source Serif Variable ExtraLigh」を指定します。
「t」が抜けてる「Source Serif Variable ExtraLight」ではないか、と思った人が居るかもしれませんが、間違いではありません。
Windowsのフォント名は最大31文字と決まっていて、超過分は切られてしまうのです。

変数フォントを使えるアプリケーション
では、逆に変数フォントを使えるアプリケーションはどのようなものがあるかと言えば、それはずばりWebです。より正確に言えばMS Edge等のブラウザーです。
HTMLやSVG等で変数フォントを使えるのですが、変数フォントのパラメーター指定はスタイルシートでは「font-variation-settings」という属性を使用し、以下のように設定します。
font-variation-settings: 'wght' 100
フォントの太さの場合は’wght'というキーワードを指定しますが、フォント仕様の世界ではこのような機能や特性を表す4文字の名前の事を「タグ名」と呼びますが、変数フォントのパラメーターの場合は「軸タグ Aixis Tag」と呼びます。
冒頭の9つの「S」は同じフォントで’wght'の値を100~900で表示しています。

これを表示するHTMLは以下の通りです。
SourceSerifVariable-Roman.otf はローカルフォルダーに置いたフォントファイルです。
<html>
<head>
<style type="text/css">
@font-face {
font-family: "SourceSerifVariable-Roman";
src: url("fonts vf/SourceSerifVariable-Roman.otf") format("opentype")
}
.vfont {
font-family: "SourceSerifVariable-Roman";
font-size: 120px;
}
</style>
</head>
<body>
<span class="vfont" style="font-variation-settings: 'wght' 100;">S</span>
<span class="vfont" style="font-variation-settings: 'wght' 200;">S</span>
<span class="vfont" style="font-variation-settings: 'wght' 300;">S</span>
<span class="vfont" style="font-variation-settings: 'wght' 400;">S</span>
<span class="vfont" style="font-variation-settings: 'wght' 500;">S</span>
<span class="vfont" style="font-variation-settings: 'wght' 600;">S</span>
<span class="vfont" style="font-variation-settings: 'wght' 700;">S</span>
<span class="vfont" style="font-variation-settings: 'wght' 800;">S</span>
<span class="vfont" style="font-variation-settings: 'wght' 900;">S</span>
</body>
</html>
プログラムにおける変数フォント
Win32 APIのプログラム開発者は、フォント指定は昔からフォントの太さを数値で指定していたことはご存じでしょう。通常なら400、ボールドなら700で、長らく意味のある値はこの2種類だけでした。(だと思っていましたが…)
やっと変数フォントを使えば、それ以外の値も機能するようになるのかと期待する人もいると思いますが、残念ながらそれはならずなのでが、ここは実際に試してみましょう。

上記のプログラムは以下の通りです。
void CChildView::OnPaint()
{
CPaintDC dc(this);
LOGFONT logFont = {0};
wcscpy_s(logFont.lfFaceName, _countof(logFont.lfFaceName), L"Source Serif Variable");
logFont.lfHeight = 200;
dc.SetTextAlign(TA_UPDATECP);
dc.MoveTo(10, 10);
CFont font;
for (int weight = 100; weight <= 900; weight += 100)
{
logFont.lfWeight = weight;
font.CreateFontIndirect(&logFont);
CFont* pOldFont = dc.SelectObject(&font);
dc.TextOut(0, 0, L"S");
dc.SelectObject(pOldFont);
font.DeleteObject();
}
}
上で少し触れましたが、実行結果をよく見ると、フォントの太さは通常とボールドの二種類だけでなく、左から6番目(600 FW_SEMIBOLD)が通常とボールドの中間の太さになっています。いつの間にかこういう機能があったようです、それはさておき。
変数フォントで軸タグの値を指定するには、GDIもGDI+も不可で、DirectWrite APIを使う必要があります。ちょっと面倒です。
軸タグではなく、上記のExcelの例と同様にフォント名にインスタンスを含んだ完全名を指定するのは有効に機能します。

void CChildView::OnPaint()
{
CPaintDC dc(this);
LOGFONT logFont = {0};
logFont.lfHeight = 200;
logFont.lfWeight = FW_NORMAL;
dc.SetTextAlign(TA_UPDATECP);
dc.MoveTo(10, 10);
LPCWSTR fontfaces[] = {
L"Source Serif Variable ExtraLigh",
L"Source Serif Variable Light",
L"Source Serif Variable Regular",
L"Source Serif Variable SemiBold",
L"Source Serif Variable Bold",
L"Source Serif Variable Black",
};
CFont font;
for (int i = 0; i < _countof(fontfaces); i++)
{
wcscpy_s(logFont.lfFaceName, _countof(logFont.lfFaceName), fontfaces[i]);
font.CreateFontIndirect(&logFont);
CFont* pOldFont = dc.SelectObject(&font);
dc.TextOut(0, 0, L"S");
dc.SelectObject(pOldFont);
font.DeleteObject();
}
}
変数フォント通常フォントのアウトラインの違い
変数フォントのアウトラインには、通常フォントとは微妙な違いがあります。下の図を見比べてください。
通常フォントのアウトラインは重なりがありませんが、変数フォントはストロークの重なりがあります。
全てのフォントが項ではないのですが、一般に通常フォントはストロークの重なりは無いのですが、変数フォントには重なりができます。これはグリフをデザインする時、変数フォントは個々のストローク毎に変形させる方法で無ければデザインが困難だからです。


過去の記事
- 占星術の十二星座と実際の星座がずれてること、それとその理由 - SS blog
- 2026年8月12日のスペイン皆既日食の話(それと今後の日食予報) - SS blog
- 建国記念の日 2月11日の謎 - SS blog
- グレゴリウス暦制定物語 - SS blog
- フランス共和暦 - SS blog
- イエス・キリスト処刑の日はいつか? 13日の金曜日? - SS blog
- 変わったローマの日付表記について - SS blog
- 時刻が何種類もある不思議 - SS blog
- モーツァルト「レクイエム」歌詞解説【第1曲 requiem編】 - SS blog
- グレゴリウス暦制定物語
- アヴェ・マリア 歌詞解説 - SS blog
- 知られざるフォント技術の話 -「双方向性」あるいは「Bidi」- - SS blog
- EBCDIC"を何と読むか?と、それにまつわる話 - SS blog
- 拡張メタファイルの話、EMFとEMF+ - SS blog
- Win32apiのリージョンの中身はどうなっているか、パスと何が違うか - SS blog
- SVG(Scalable Vector Graphics)を理解する。初回: SVGの概観 - SS blog
- 色空間と色補間 - RGBとかHSLとか色々あって、なんの役に立つのか - SS blog
- Windows API GDIのモードの比較とGDI+の特徴 - SS blog
- JavaとC/C++処理速度比較 - SS blog
- C/C++ 整数演算と実数演算の速度比較、四則演算と数学関数の速度比較 - SS blog
- 拡張メタファイルの話、EMFとEMF+ - SS blog
- Win32apiのリージョンの中身はどうなっているか、パスと何が違うか - SS blog
- SVG(Scalable Vector Graphics)を理解する。初回: SVGの概観 - SS blog
- 色空間と色補間 - RGBとかHSLとか色々あって、なんの役に立つのか - SS blog
- Windows API GDIのモードの比較とGDI+の特徴 - SS blog
- JavaとC/C++処理速度比較 - SS blog
- C/C++ 整数演算と実数演算の速度比較、四則演算と数学関数の速度比較 - SS blog


























