(u)pLaTeXのデフォルトの日本語フォントを好きなやつに変える方法

## 概要

TeX Liveでは、(u)pLaTeX文書の“標準”の和文フォントに割り当てられる（つまり、dvipdfmxで生成したPDF文書に埋め込まれる）実際の書体を、kanji-config-updmap[^command]というコマンドで設定できます。

[^command]: kanji-config-updmapコマンドには「システムモード（`--sys`）」と「ユーザモード（`--user`）」の2つのモードがあり、特に理由のない限りはシステムモードを使うことが推奨されています。また、「`kanji-config-updmap --sys`」と同値となるコマンド`kanji-config-updmap-sys`が用意されているので、以降ではこれを用いることにします。

```console
# ※ Unix的OSの場合, sudoが必要

# IPAexフォントを使う
$ kanji-config-updmap-sys ipaex

# macOS(El Capitan以降)付属のヒラギノフォントを使う
$ kanji-config-updmap-sys hiragino-elcapitan-pron

# 小塚フォント(Pr6N版)を使う; 2004JIS字形指定
$ kanji-config-updmap-sys --jis2004 kozuka-pr6n
```

これにより、dvipsとdvipdfmxの既定の（他の場所での指定がない場合の）書体を非常に簡単に選択できるわけです。

先に示した例は全て、既定で用意されている設定です。ところが、kanji-config-updmapでは、**ユーザが自分で設定（フォントマップ）を作って**それを適用することもできます。本記事ではその手順を説明します。

※「既定の設定に何があるか」の方を知りたい人は、[ptex-fontmapsパッケージのREADME]を参照してください。

[ptex-fontmapsパッケージのREADME]: https://github.com/texjporg/jfontmaps/blob/master/README

### 前提

  * TeX Live **2014以降**を対象とします。
  * kanji-config-updmapコマンドの基本的な使い方は知っていると仮定します。
  * マップファイルの作り方についての知識は前提と**しません**。
  * PostScript→PDF変換ソフトウェア（Ghostscript等）の設定については扱いません。
  * TeX言語についての知識は不要です。（やったね！）

## 手順①：“設定の中身”をきちんと決める

kanji-config-updmapの設定対象とする和文フォントは、(u)pTeXの標準のものに加えて、[japanese-otfパッケージ]の和文フォントも含まれます。japanese-otfの多書体設定（`deluxe`オプション）においては次の7種類の“フォント”（本記事では[^logi-font]これを**論理フォント**と呼ぶことにします）を使用できます。

 1. 明朝体・細字（`\mcfamily\ltseries`）
 2. 明朝体・中字（`\mcfamily\mdseries`）
 3. 明朝体・太字（`\mcfamily\bfseries`）
 4. ゴシック体・中字（`\gtfamily\mdseries`）
 5. ゴシック体・太字（`\gtfamily\bfseries`）
 6. ゴシック体・極太（`\gtfamily\ebseries`）
 7. 丸ゴシック体（`\mgfamily`）

[japanese-otfパッケージ]: https://www.ctan.org/pkg/japanese-otf

従って、“設定の中身”としては、これらの7つの論理フォントに割り当てる“実際の書体”（これを**物理フォント**と呼びます）を決める必要があります。ただし、これらの全てに異なる物理フォントを割り当てる必要はありません。japanese-otfの多書体設定を用いないのであれば、実際には明朝（`\mcfamily`）とゴシック（`\gtfamily`）の1ウェイトずつしか用いられないので、1～3に同じ“明朝体のフォント”、4～7に同じ“ゴシック体のフォント”を割り当てれば十分です。

“設定の中身”としては、これに加えて、設定に名前（**ファミリ名**という[^family-1]）を付ける必要があります。これはkanji-config-updmapの引数に指定する文字列（先の例における`kozuka-pr6n`など）のことです。

[^family-1]: NFSSのファミリ名（`cmr`とか`mc`とか）とは別の概念です。
[^logi-font]: 「論理フォント」という用語は普通はTeXのTFMのことを指します。しかしここではTeX言語レベルの話は避けたいので、代わりにLaTeXにおけるフォント選択のことを「論理フォント」と見なします。なお、一つのフォント選択（例えば「明朝体・中字」）に対応するTFMは複数あります。

### どんなフォントが使えるのか

**この記事にある手順**で対応できるのは、以下の何れかの条件を満たす日本語フォントに限られます。

  * TrueTypeグリフのOpenTypeフォント。
      * 以下ではこれを単に「TrueTypeフォント」と呼ぶ。
      * TrueType Collection 形式もサポートされる。
  * CFFグリフのOpenTypeフォントで、**Adobe-Japan1**（AJ1）**のグリフ集合をもつ**もの。
      * 以下ではこれを単に「OpenTypeフォント」と呼ぶ。
      * OpenType Collection 形式のフォントは、dvipdfmxについてはTeX Live **2016以降**の版が必要である[^otc-dvips-1]。
      * かつては日本語用のOpenTypeフォントのグリフ集合は全てAJ1であったが、最近ではカスタムのグリフ集合をもったフォントも増えている。例えば、「源ノ角ゴシック（Source Han Sans JP）／Noto Sans Japanese」や最近のmacOS付属の日本語フォントの一部（游明朝など）で、これらはこの記事での手順では正常に扱えない。

[^otc-dvips-1]: dvipsはそれ自身は物理フォントを扱わない（PostScript文書に日本語フォントが“埋め込まれる”ことはない）ので、原理的には何でも（存在しないフォント名でも）扱えます。しかし、PostScript文書を扱うソフトウェア（Ghostscript等）がそのフォントに対応しているとは限らないことに注意が必要です。例えば、現状ではGhostscriptはOpenType Collection形式をサポートしていません。

※これに加えて、「全角幅のグリフ（字形）しか利用できない」ということにも注意してください[^fullwidth-1]。この理由は、kanji-config-updmapの対象となる論理フォントが全角幅を前提としているからです[^fullwidth-2]。従って、原則として「等幅」の日本語フォントを選択する必要があります。

[^fullwidth-1]: 全角幅でないグリフが含まれること自体は問題ないですが、そのようなグリフを実際に使うことはできません。例えば、仮名がプロポーショナル幅である「ＭＳ Ｐ明朝」を指定すると、結果として仮名が全く使えなくなってしまうので、そのような指定は有用ではないでしょう。
[^fullwidth-2]: つまり、一般的に「(u)pLaTeXでは全角幅のグリフしか使えない」というわけでは決してありません。しかし、全角幅でないグリフを扱えるような論理フォントを自分で作製することは、通常のLaTeXユーザにとっては至難の業です。

### オレオレ設定

以下では、実際の例に沿って手順を説明することにします。例として、以下のような「オレオレ設定」を使います。

  * ファミリ名： `oreore`
  * 使用フォント：
     1. 明朝体・細字： [はんなり明朝] （Hannari.otf）
     2. 明朝体・中字： はんなり明朝 （Hannari.otf）
     3. 明朝体・太字： はんなり明朝 （Hannari.otf）
     4. ゴシック体・中字： [源真ゴシック]等幅 Regular （GenShinGothic-Monospace-Regular.ttf）
     5. ゴシック体・太字： 源真ゴシック等幅 Bold （GenShinGothic-Monospace-Bold.ttf）
     6. ゴシック体・極太： 源真ゴシック等幅 Heavy （GenShinGothic-Monospace-Heavy.ttf）
     7. 丸ゴシック体： [源柔ゴシック]等幅 Medium （GenJyuuGothic-Monospace-Medium.ttf）

[はんなり明朝]: http://typingart.net/?p=44
[源真ゴシック]: http://jikasei.me/font/genshin/
[源柔ゴシック]: http://jikasei.me/font/genjyuu/

## 手順②：フォントファイルを配置する

物理フォントのフォントファイルを「TeXから見える場所」に置く必要があります。具体的には次のようになります。

  * TrueTypeフォントの場合は以下のディレクトリに置きます。  
    `$TEXMFLOCAL/fonts/truetype/VENDOR/FONT/`
  * OpenTypeフォントの場合は以下のディレクトリに置きます。  
    `$TEXMFLOCAL/fonts/opentype/VENDOR/FONT/`
  * ファイルの実体の代わりにシンボリックリンクを置いても構いません。
  * 一部のシステム（Windowsなど）では、OSにフォントをインストールすることでも目的を果たせます。<br>※<ins>[追記2019-08-27]</ins> Windows 10（バージョン1809以降）の場合、フォントのインストールには「自分用」「全ユーザ用」の2つの方法がありますが、TeXでも使えるようにするにはフォントを**「全ユーザ用」でインストールする**必要があります。（管理者権限が必要です。）

※`truetype`と`opentype`のどちらのパスを選ぶかは、フォントの種類によって決まります。ファイル拡張子は無関係なので、例えば「拡張子が`.otf`であるTrueTypeフォントファイル」は`truetype`のパスに置くことになります。

※上記手順に現れる`$TEXMFLOCAL`の実際の値は次のコマンドで調べられます。

```console
$ kpsewhich -var-value=TEXMFLOCAL
/usr/local/texlive/texmf-local
```

※`VENDOR`と`NAME`は実際には任意の文字列で構いませんが、普通は`VENDOR`にはベンダ名（`adobe`や`morisawa`など。有名ベンダに属さないフォントの場合は`public`とします）、`NAME`はフォント（シリーズ）名（`Hannari`など）を用います。

今回の例では以下のディレクトリに配置することにしましょう。

  * はんなり明朝 →  
    `$TEXMFLOCAL/fonts/opentype/public/Hannari/Hannari.otf`
  * 源真ゴシック等幅 Regular →  
    `$TEXMFLOCAL/fonts/truetype/public/GenShinGothic/GenShinGothic-Monospace-Regular.ttf`
  * 源真ゴシック等幅 Bold →  
    `$TEXMFLOCAL/fonts/truetype/public/GenShinGothic/GenShinGothic-Monospace-Bold.ttf`
  * 源真ゴシック等幅 Heavy →  
    `$TEXMFLOCAL/fonts/truetype/public/GenShinGothic/GenShinGothic-Monospace-Heavy.ttf`
  * 源柔ゴシック等幅 Medium →  
    `$TEXMFLOCAL/fonts/truetype/public/GenJyuuGothic/GenJyuuGothic-Monospace-Medium.ttf`

## 手順③：マップファイルを作る

kanji-config-updmapの枠組に従う場合、次の6つのマップファイル（dvipdfmx用）を作成する必要があります。

  * `ptex-FAMILY.map`： pTeX標準フォント用（90JIS字形）
  * `ptex-FAMILY-04.map`： pTeX標準フォント用（2004JIS字形）
  * `uptex-FAMILY.map`： upTeX標準フォント用（90JIS字形）
  * `uptex-FAMILY-04.map`： upTeX標準フォント用（2004JIS字形）
  * `otf-FAMILY.map`：pTeX+japanese-otfパッケージ用
  * `otf-up-FAMILY-04.map`：upTeX+japanese-otfパッケージ用

※ここで`FAMILY`は最初に決めた「ファミリ名」（今の例では`oreore`）です。

マップファイルはそれなりの知識があれば自力でも作成できますが、イロイロと大変なので、ここでは**チート**することにしましょう。TeX Liveに元々含まれている既存のマップファイルを改変コピーするわけです。

ここではヒラギノフォント用のマップ（ファミリ名 `hiragino`）をコピー元に使うことにします。まずは、目当てのマップファイルが置いてある場所を探します[^hiragino-1]。

[^hiragino-1]: なお、ここでいう「ヒラギノフォントのマップ」とは、macOS付属のものだとYosemite以前の版に対応するものです。あるいは、「自分でヒラギノフォントを入手した場合」も想定しています。

```console
$ kpsewhich ptex-hiragino.map
/usr/local/texlive/2016/texmf-dist/fonts/map/dvipdfmx/ptex-fontmaps/hiragino/ptex-hiragino.map
```

ここで示されたディレクトリの中を調べると、想定通りの6つマップファイルが見つかるはずです。

  * `ptex-hiragino.map`
  * `ptex-hiragino-04.map`
  * `uptex-hiragino.map`
  * `uptex-hiragino-04.map`
  * `otf-hiragino.map`
  * `otf-up-hiragino-04.map`

この中の一つ、例えば`ptex-hiragino-04.map`の中をのぞいてみましょう[^tab-1]。

[^tab-1]: 本記事では、マップファイルのテキストに含まれるタブ文字は“適当に”空白に展開して示します。

```text:ptex-hiragino-04.map
rml     2004-H  HiraMinPro-W3.otf
rmlv    2004-V  HiraMinPro-W3.otf
gbm     2004-H  HiraKakuPro-W6.otf
gbmv    2004-V  HiraKakuPro-W6.otf
```

この記述の中にある`HiraMinPro-W3.otf`と`HiraKakuPro-W6.otf`がヒラギノフォントのファイル名です。一般の`hiragino`のマップファイルでは次のようなフォントファイル名が指定されています。

  * `HiraMinPro-W2.otf`：明朝体・細字
  * `HiraMinPro-W3.otf`：明朝体・中字
  * `HiraMinPro-W6.otf`：明朝体・太字
  * `HiraKakuPro-W3.otf`：ゴシック体・中字
  * `HiraKakuPro-W6.otf`：ゴシック体・太字
  * `HiraKakuStd-W8.otf`：ゴシック体・極太
  * `HiraMaruPro-W4.otf`：丸ゴシック体

今やりたいのは「物理フォントだけ別のものに変える」ことなので、先のマップの記述の中の**ファイル名だけ**を所望の設定のファイル名に置き換えます。つまり、`oreore`ファミリのための`ptex-oreore-04.map`は以下のようになるわけです。

```text:ptex-oreore-04.map
rml     2004-H  Hannari.otf
rmlv    2004-V  Hannari.otf
gbm     2004-H  GenShinGothic-Monospace-Bold.ttf
gbmv    2004-V  GenShinGothic-Monospace-Bold.ttf
```

同じ要領で、他の5つのマップファイルも作れます。

ただし、`otf-hiragino.map`については一つ注意が必要です。このファイルの末尾には、次のようなマップ行が書かれています。

```
% hiraprop
hiramin-w3-h Identity-H HiraMinPro-W3.otf
hiramin-w6-h Identity-H HiraMinPro-W6.otf
hirakaku-w3-h Identity-H HiraKakuPro-W3.otf
hirakaku-w6-h Identity-H HiraKakuPro-W6.otf
hiramaru-w4-h Identity-H HiraMaruPro-W4.otf
hiramin-w3-v Identity-V HiraMinPro-W3.otf
hiramin-w6-v Identity-V HiraMinPro-W6.otf
hirakaku-w3-v Identity-V HiraKakuPro-W3.otf
hirakaku-w6-v Identity-V HiraKakuPro-W6.otf
hiramaru-w4-v Identity-V HiraMaruPro-W4.otf
```

これらは本当に「ヒラギノ専用[^hiraprop-1]」で、他のフォントでは意味を成さないので、改変後のマップファイルではこの部分は削っておきます。

[^hiraprop-1]: ヒラギノのプロポーショナル幅の仮名グリフを利用するためのhirapropというパッケージのための設定です。

最終的な`otf-oreore.map`は以下のようになります。

```text:otf-oreore.map
% TEXT, 90JIS
hminl-h     H   Hannari.otf
hminl-v     V   Hannari.otf
hminr-h     H   Hannari.otf
hminr-v     V   Hannari.otf
hminb-h     H   Hannari.otf
hminb-v     V   Hannari.otf
hgothr-h    H   GenShinGothic-Monospace-Regular.ttf
hgothr-v    V   GenShinGothic-Monospace-Regular.ttf
……(中略)……
otf-ujmbn-h     UniJIS2004-UTF16-H  Hannari.otf
otf-ujmbn-v     UniJIS2004-UTF16-V  Hannari.otf
otf-ujgrn-h     UniJIS2004-UTF16-H  GenShinGothic-Monospace-Regular.ttf
otf-ujgrn-v     UniJIS2004-UTF16-V  GenShinGothic-Monospace-Regular.ttf
otf-ujgbn-h     UniJIS2004-UTF16-H  GenShinGothic-Monospace-Bold.ttf
otf-ujgbn-v     UniJIS2004-UTF16-V  GenShinGothic-Monospace-Bold.ttf
otf-ujgen-h     UniJIS2004-UTF16-H  GenShinGothic-Monospace-Heavy.ttf
otf-ujgen-v     UniJIS2004-UTF16-V  GenShinGothic-Monospace-Heavy.ttf
otf-ujmgrn-h    UniJIS2004-UTF16-H  GenJyuuGothic-Monospace-Medium.ttf
otf-ujmgrn-v    UniJIS2004-UTF16-V  GenJyuuGothic-Monospace-Medium.ttf
```

※もちろん、こういう単純作業はスクリプトで済ませたいところです。参考として、自分が（この記事を書くために）作ったやつを置いておきます。

  * [generate-fontmap.pl](https://gist.github.com/zr-tex8r/06d4c37dde04fa8ac4146e6d60a71df2)

### チョット注意

  * TrueType/OpenType Collection形式のフォントファイルは、複数のフォントを1つのファイルに束ねたものです。そのようなフォントを指定する場合は、マップ行のファイル名の部分を `:番号:ファイル名` とします。ここで`番号`は所望のフォントの位置を表す整数（0起点）です。

    例えば、Windows付属のフォントファイル`msgothic.ttc`には「ＭＳ ゴシック」「MS UI Gothic」「ＭＳ Ｐゴシック」の3つのフォントが順に含まれています。従って、「ＭＳ ゴシック」を指定したい場合は `:0:msgothic.ttc` と書くことになります。

  * ヒラギノのフォントマップでは、標準の（単ウェイトの）ゴシック体の箇所に、「ゴシック体・太字」に相当する`HiraKakuPro-W6.otf`を割り当てています。「標準のゴシック体は太くないやつがよい」という場合は、`(u)ptex-*.map`に現れるゴシック体のフォント（1種類しかないはず）を太字でなく中字のものにしましょう。

## 手順④：マップファイルを配置する

作成した6つのマップファイルを以下のディレクトリに置きます。

  * `$TEXMFLOCAL/fonts/map/dvipdfmx/FAMILY/`

※例によって`FAMILY`は「ファミリ名」です。`$TEXMFLOCAL`はさっき説明しましたね。

## 手順⑤：mktexlsrする

`$TEXMFLOCAL`のツリーにファイルを追加したので、mktexlsrを実行しましょう。

```console
$ mktexlsr
mktexlsr: Updating /usr/local/texlive/2016/texmf-config/ls-R...
mktexlsr: Updated /usr/local//texlive/2016/texmf-config/ls-R.
……(略)……
mketxlsr: Done.
```

※ちなみに、TeX Liveでは「`ls-R`を置かない運用」は想定されていません。

## 手順⑥：作った設定を適用する

これまでの手順で、既に`oreore`設定が使用できる状態になっています。なので、あとは実際にkanji-config-updmapを実行するだけです。

```console
# 必要ならsudo
$ kanji-config-updmap-sys oreore
Setting up ... ptex-oreore.map
……(略)……
  /usr/local/texlive/2016/texmf-var/fonts/map/dvipdfmx/updmap:
        8395 2017-05-14 08:33:49 kanjix.map
Transcript written on "/usr/local/texlive/2016/texmf-var/web2c/updmap.log".
updmap: Updating ls-R files.
```

※もし次のようなエラーが出た場合は、作成したマップファイルが認識されていない、ということです。パス名やファイル名が正しいかを確認しましょう。

```console
NOT EXIST ptex-oreore.map
```

※kanji-config-updmapの`status`コマンドで現在有効な設定値を確認できます。

```console
$ kanji-config-updmap-sys status
CURRENT family for ja: oreore
Standby family : ipa
Standby family : ipaex
```

### チョット注意

  * カスタムで追加したファミリは、kanji-config-updmapの`auto`コマンドによる自動選択の対象には決して含まれません。また、`status`コマンドの「Standby family」にも現れません（先の例で示したように「CURRENT family」には現れます）。

## 手順⑦：何か組版してみる

フォントマップが正しく変更されたかを確かめるために、適当な文書を組版してみましょう。`oreore`は多ウェイトの設定なので、実際にjapanese-otfの多ウェイトを利用した文書を用意します。

```latex
% pLaTeX文書
\documentclass[a4paper]{jsarticle}
\usepackage[deluxe]{otf}% 多書体設定を使う
\begin{document}

\rmfamily\mcfamily % 明朝体
{\TeX}は{\ltseries アレ}アレ{\bfseries アレ}！

\sffamily\gtfamily % ゴシック体
{\TeX}はアレ{\bfseries アレ}{\ebseries アレ}！

\mgfamily % 丸ゴシック体
{\ajSnowman}は非アレ。

\end{document}
```

これをいつも通りにplatex＋dvipdfmxでコンパイル（dvipdfmxにマップファイル指定は**付けません**）すると、以下の出力が得られます。

![kanjiconfig-1.png](https://qiita-image-store.s3.amazonaws.com/0/14550/39443194-0943-9b99-c63d-50fb8a61f316.png)

指定した通りのフォントが使われていますね！[^newjis-1]（もちろん、明朝体は全ウェイトを同じフォントにしたのでそうなっています。）

[^newjis-1]: ちなみに、「90JIS字形と2004JIS字形の使い分け」についてはフォントの種類によっては正しく効かない場合があります。特に、（この記事の手順に従う場合は）TrueTypeフォントでは両字形の使い分けは、フォントが対応していたとしても無効になります。OpenTypeフォントでは効くはずですが、特にフリーフォントの場合は正しく実装されていない場合があるようです。

**お疲れ様でした！**

## おまけ：pxchfonで自作のマップファイルを適用する

kanji-config-updmapは既定のフォント割当を設定するためのものです。これに対して、使うフォントを文書ごとに変えたい、あるいは、文書の設定として明示したい（つまり「この文書は『はんなり明朝』で組む」と指定したい）という場合は、文書中でフォント割当を指定するのが適切でしょう。そこで、[pxchfonパッケージ]を利用して、先の手順で用意した自作のフォントマップの適用を文書中で指定する方法を紹介します。

[pxchfonパッケージ]: https://www.ctan.org/pkg/pxchfon

### pxchfonの使い方を復習する

pxchfonパッケージの一般的な使い方では、プレアンブルにおいて、フォントファイル名を直接指定する命令を記述します。

```latex
% pLaTeX文書
\documentclass[a4paper]{jsarticle}
\usepackage[noalphabet]{pxchfon}
% 明朝体フォントのファイル名を指定する
\setminchofont{Hannari.otf}% はんなり明朝
% ゴシック体フォントのファイル名を指定する
\setgothicfont[0]{HGRPP1.TTC}% HG創英角ﾎﾟｯﾌﾟ体
\begin{document}
{\TeX}は\textgt{アレ。}
\end{document}
```

この他に、「プリセット名」を指定してフォントを一括で指定することもできます。

```latex
% pLaTeX文書
\documentclass[a4paper]{jsarticle}
% 小塚フォントPr6N版を指定する
\usepackage[kozuka-pr6n]{pxchfon}
\begin{document}
{\TeX}は\textgt{アレ。}
\end{document}
```

しかし、この「プリセット」はパッケージ自体が持っている情報を使う（名前は同じですが、kanji-config-updmapの“`kozuka-pr6n`”のマップファイルを使うのではありません）ものなので、ここで `oreore` を「プリセット名」として指定することはできないわけです。

### TeX Liveのマップファイルをpxchfonで使う

しかし、pxchfonはkanji-config-updmapのマップファイルを利用してフォントを一括指定する機能も備えています。次のように、`tl:FAMILY` という形[^tl]のオプション（つまり`tl:oreore`など）を指定すると、`oreore`ファミリに対するkanji-config-updmap用の一連のマップファイルの読込が指示されます。

[^tl]: “tl”は“TeX Live”の略です（kanji-config-updmapはTeX Liveに特有のコマンドです）。pxchfonの昔の版では`+FAMILY`という形式でしたが、意味がより明確な`tl:FAMILY`に改められました。

```latex
% pLaTeX文書
\documentclass[a4paper]{jsarticle}
% 文書中でオレオレ設定を指定する！
\usepackage[tl:oreore]{pxchfon}
\begin{document}
{\TeX}は\textgt{アレ。}
\end{document}
```

## まとめ

TeX Liveでは、(u)pTeXの和文フォントに対するカスタムの設定が（比較的……）簡単にできます。自分の好みのフォントを指定して素敵な文書を作りましょう！