プログラミングフォント2023年度版

+ Visual Studio Code で等幅フォント(monospace)を設定しているが、なぜか列位置がずれる。
+ 日本語プログラミングフォントといえば Ricty が定番だったが、[今はそうではない](https://qiita.com/sounisi5011/items/62e4da71458ca7ce73c7)らしい。

ということで2023年現在のモダンなプログラミング用のフォントの選び方を色々と調べてまとめてみました。

2010年代前半、プログラミング用の等幅フォントというと VLゴシック か Ricty くらいしか見当たりませんでした。いずれも半角の幅が全角の幅の半分であったため「等幅フォント」を選べば間違いなかったのですが、近年はさまざまな日本語（漢字やカナ）を含むプログラミングフォントが登場し、フォントの選択によっては空白文字やタブ文字で揃えた列の位置がずれる現象が発生するため原因と対策をまとめました。

## 1. 等幅フォントとプロポーショナルフォント

フォントは大きく分けて『等幅フォント（固定幅フォント）』と『プロポーショナルフォント（可変幅フォント）』の２種類が存在します。

### 1.1. プロポーショナルフォント（MS Pゴシック）の例

![MS Pゴシック](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34816/bd1c5160-6bee-e3c7-a8e7-574b7bc212c5.png)

上記の表示例では同じ５文字でも１行目と２行目と３行目で行末の列位置が異なっています。アルファベットならば、どの文字も幅が全て同じというわけでは必ずしもありません。たとえば 'i' と 'm' は往々にしてフォント幅が異なります。

### 1.2. 等幅フォント（MS ゴシック）の例

![MS ゴシック](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34816/748f0de4-826c-66df-ee9a-2897dcde176c.png)

等幅フォントはフォントの幅が全て同じになるようデザインしているため列幅がずれることはありません。

## 2. 半角と全角の幅の比

そこで、等幅フォントを設定すれば全てが解決しそうですが、残念ながら必ずしも上手くはいきません。

### 2.1. Source Han Code JP

"Source Han Code JP" は、Adobe社が Open Font License (OFL) で開発した "Source Code Pro" と "Source Han Sans JP（源ノ角ゴシック）" を組み合わてつくられたプログラミング用の『等幅』フォントです。

![Source Han CODE JP](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34816/f300df1b-2e01-c094-c2ac-4d2f4b43bc8a.png)

一見、アルファベットと漢字の列位置が揃っているように見えますが、上下に線を引くとレガシーな日本語テキストエディタとの表示レイアウトの違いが見えてきます。

![Source Han CODE JPに縦線](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34816/1cc7ec2d-0735-a240-da64-37d8bf961bbb.png)

"Source Han Code JP" は半角文字と全角文字の幅の比が 2 : 3 でデザインされています。このため「半角の幅」は「全角の幅の半分」であることを期待するレガシーな日本語環境と表示レイアウトに相違が生じます。

![Source Han CODE JPを空白文字で揃える](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34816/956f84d8-0137-b582-60de-96ac774a2e2f.png)

半角スペースを使い列位置を調整すると一見揃ったようには見えます。しかし複数の等幅フォント（例えば Consolas と MSゴシック）を混ぜて表示させると半角と全角の幅の比は往々にして割り切れない数字になります。そして、各フォント固有の幅で列位置を揃えたテキストファイルを半角と全角の幅の比を 1 : 2 で表示するレガシーな日本語環境で表示すると崩れてしまいます。

![Source Han CODE JPをタブで揃える](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34816/de729698-6cdb-5443-64b2-a8d3a00f25f3.png)

さらにはタブ文字で列位置を揃えようと試みると、一気に崩れてしまいます。

### 2.2. Ricty Diminished

![Ricty Diminished](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34816/9672903c-8ceb-cb04-7c9f-05f36b90e1c7.png)

そこでレガシーな日本語環境に合わせて半角と全角の幅の比を 1 : 2 に調整したプログラミング専用フォントの登場となります。

![Ricty Diminishedに縦線](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34816/dcf19c34-fe54-e5a6-eb9f-5004c587e7d7.png)

日本語独自の半角と全角の事情を考慮していない Visual Studio Code のような海外製テキストエディタでも、タブ文字で綺麗に列位置を揃えることができます。

ちなみに、MSゴシックなど日本語の等幅フォントの多くは半角と全角の比が 1 : 2 となるようにデザインされています。そこで『半角文字』も『全角文字』もMSゴシックで統一すれば列が崩れる問題は発生しません。しかしながらプログラミング用に <code>0</code> (ゼロ) や <code>O</code> (オー) のフォントのデザイン（グリフ）を工夫した英数フォント（たとえば Consolas）とMSゴシックを混ぜてしまうと 1 : 2 の比が崩れてしまうため上手くいきません。

以上のことから、日本語が混じったソースコードをレガシーな日本語環境に合わせたレイアウトで表示させるためには『半角文字』と『全角文字』の幅を 1 : 2 に調整したプログラミング用フォントだけを使う必要があります。複数のフォント（フォントファミリー）を混在させると往々にして幅（列の位置）がずれます。

## 3. フォントファミリーと総称ファミリー

フォントの指定方法には "フォントファミリー名(font family name)" と "総称ファミリー名(generic family name)" の二種類があります。CSSの仕様ではフォントファミリーは引用符 ' や " で括り、総称フォントは括らないルールになっています。ただし多くのWebブラウザでは引用符で括らない記述もフォントファミリ名として認識します。

| FONT-FAMILY |	引用符 | フォント名の例 |
|:-----------:|:-----:|:------------|
| フォントファミリー名 | 括る |"Consolas", "Courier New", "MS Gothic" |
| 総称ファミリー名 | 括らない | sans-serif, monospace |

CSSでは複数のフォントを指定することができます。複数のフォントが指定されたときは先頭から探します。

たとえば下記のようにフォントを指定すると、

~~~
'Consolas', 'Courier New', monospace
~~~

1. "Consolas" の中を探す。
1. "Consolas" の中に見つからなければ "Courier New" を探す。
1. "Courier New" の中に見つからなければ "monospace (等幅フォント)" の中から代替フォントを探す。
1. 代替フォントの中から、たとえば "ＭＳ ゴシック" を見つける。

この例では、英数字（いわゆる半角）にはConsolasを表示し、漢字（いわゆる全角）にはＭＳ ゴシックを表示します。いずれも等幅フォントですが、幅の比が 1 : 2 ではないため微妙なズレが生じます。

## 4. 各種フォント

半角 : 全角 = 1 : 2 を満たすオープンなフォントの一覧

+ Ricty Diminished
   + 👍 Ricty Diminished ※ 2023年現在 推奨できません。合成元フォントのバージョンアップへの追従、不具合の修正が停止（終了）しています。
+ UDEV Gothic
   + 👍 UDEV Gothic JPDOC : 日本語文書向け
   + 👎 UDEV Gothic 35 : 文字幅比率 半角3:全角5
   + 👎 UDEV Gothic LG : リガチャ対応版
+ Myrica
   + 👍 Myrica M : 等幅フォント
   + 👎 Myrica P : プロポーショナルフォント
   + 👎 Myrica N : 幅を狭くしたフォント
+ PlemolJP
   + 👍 PlamoIJP : 文字幅比率「半角1:全角2」の通常版の PlemolJP
   + 👎 PlemolJP35 : 文字幅比率「半角3:全角5」の PlemolJP
+ Source Han Code JP
   + 👎 Source Han Code JP

各フォント・パッケージには「半角 : 全角 = 1 : 2」のほかに「半角 : 全角 = 3 : 5」や プロポーショナル・フォントなど複数の『フォント・ファミリー』が含まれているものがあります（同梱されているものがあります）。一方で「半角の幅が全角の幅の半分」というレガシーな日本語環境にこだわらないのであれば、2:3 や 3:5 の比を採用した等幅フォントのほうが好みによっては見やすいです。どれを選択すれば良いの？という疑問を解決するための、長々とした解説でした。