macOS 付属のヒラギノフォントを Docker コンテナ内の TeX Live から使えるようにする

[以前の記事](https://qiita.com/doraTeX/items/f40f9597763ca63daabb)では，最新の TeX Live 2019 に，高品質なオープンソース和文フォントである[**原ノ味フォント**](https://github.com/trueroad/HaranoAjiFonts)を埋め込む設定を整えた Docker コンテナのイメージを作成しました。

* [TeX Live 2019 + 原ノ味フォント + llmk の Docker コンテナを作る](https://qiita.com/doraTeX/items/f40f9597763ca63daabb)

原ノ味フォントは高品質で大変ありがたいフォントでありますが，macOS ユーザの場合，慣れ親しんだ macOS 付属のヒラギノフォントを埋め込みたいという要望もあるでしょう。そこで，[上記記事](https://qiita.com/doraTeX/items/f40f9597763ca63daabb)で作った [doratex/texlive2019ja-haranoaji](https://hub.docker.com/repository/docker/doratex/texlive2019ja-haranoaji) という汎用的イメージをベースとして，「手元の macOS ホスト環境にあるヒラギノフォントを Docker コンテナ内から使うカスタム版イメージ」を生成してみましょう。

方針としては，macOS ホスト側にあるシステムフォントディレクトリを Docker コンテナ内へマウントし，コンテナ内の `TEXMFLOCAL` へとシンボリックリンクを張ることで，コンテナ内の TeX Live からホスト側のヒラギノフォントが見える状態にします。

# 準備

Docker Desktop for Mac の Preferences 画面の File Sharing の項目で，`/System/Library/Fonts` をリストに加え，マウント可能にしておきます。

<img width="500" alt="名称未設定2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41739/333036f3-e96f-45e3-f4e9-bd71e9388c37.png">


そして，`Apply & Restart` ボタンを押し，Docker for Mac を再起動しておきます。

# 既存イメージのカスタマイズ

次に，ベースとなるイメージ [doratex/texlive2019ja-haranoaji](https://hub.docker.com/repository/docker/doratex/texlive2019ja-haranoaji) をカスタマイズしてゆきましょう。

## システムフォントディレクトリをマウントしながらコンテナ内に入る

まず次のコマンドを実行してコンテナ内に入ります。コンテナには `tl2019-hiragino-temp` という名前を付け，ホスト側の `/System/Library/Fonts` をコンテナ内の `/usr/share/fonts/SystemLibraryFonts` へとマウントしておきます。

```sh:システムフォントディレクトリをマウントしつつコンテナ内に入る
$ docker run -it \
  --name tl2019-hiragino-temp \
  --mount type=bind,src=/System/Library/Fonts,dst=/usr/share/fonts/SystemLibraryFonts \
  doratex/texlive2019ja-haranoaji \
  /bin/bash
```

## コンテナ内でヒラギノフォント埋め込み設定

次に，コンテナ内で，ヒラギノフォントを埋め込み設定をするため，次の一連のコマンドを実行してコンテナから抜けます。

```sh: ホスト側が macOS  10.13  High  Sierra  以降の場合
tlmgr repository add http://contrib.texlive.info/current tlcontrib
tlmgr pinning add tlcontrib '*'
tlmgr update --self
tlmgr install \
   japanese-otf-nonfree \
   japanese-otf-uptex-nonfree \
   ptex-fontmaps-macos \
   cjk-gs-integrate-macos
cjk-gs-integrate-macos --cleanup --force
cjk-gs-integrate-macos --link-texmf --force \
  --fontdef-add=$(kpsewhich -var-value=TEXMFDIST)/fonts/misc/cjk-gs-integrate-macos/cjkgs-macos-highsierra.dat
kanji-config-updmap-sys --jis2004 hiragino-highsierra-pron
luaotfload-tool -u -f
fc-cache -r
exit
```

これによって，コンテナ内の `TEXMFLOCAL` 内にホスト側のヒラギノフォントへのシンボリックリンクが作られ，ヒラギノ埋め込み設定がなされます。（`cjk-gs-integrate-macos` は，通常ならば起動した macOS のバージョンを自動認識して適切なフォント設定を選んでくれますが，今はコンテナ内の Linux 環境で `cjk-gs-integrate-macos` を実行しているので，ホスト側の macOS のバージョンを認識できません。それゆえ `--fontdef-add` による明示指定が必要となります。）

### ※ mac OS のバージョンごとの違い

上記コマンド中の `cjkgs-macos-highsierra.dat` と `hiragino-highsierra-pron` の部分は，ホスト側 macOS のバージョンに応じて，次のように選びます。

| ホスト側 macOS のバージョン | cjk-gs-integrate-macos の fontdef-add の値 | kanji-config-updmap-sys のプリセット名 |
|-------------------|--------------------------------------------|----------------------------------------|
| 10.15 Catalina    | cjkgs-macos-highsierra.dat                 | hiragino-highsierra-pron               |
| 10.14 Mojave      | cjkgs-macos-highsierra.dat                 | hiragino-highsierra-pron               |
| 10.13 High Sierra | cjkgs-macos-highsierra.dat                 | hiragino-highsierra-pron               |
| 10.12 Sierra      | cjkgs-macos-sierra.dat                     | hiragino-elcapitan-pron                |
| 10.11 El Capitan  | cjkgs-macos-elcapitan.dat                  | hiragino-elcapitan-pron                |
| 10.10 Yosemite    | cjkgs-macos-mavericks.dat                  | hiragino-pron                          |

## イメージとして保存

カスタマイズしたコンテナ `tl2019-hiragino-temp` を，`tl2019-hiragino` というイメージとして保存しておきます。`tl2019-hiragino-temp` コンテナ自体はもう使わないので，終わったら削除しておきます。

```sh
$ docker commit tl2019-hiragino-temp tl2019-hiragino
$ docker rm tl2019-hiragino-temp
```

# LaTeX 文書をコンパイルする

使い方は[前回の記事](https://qiita.com/doraTeX/items/f40f9597763ca63daabb)と同様ですが，

* イメージとしてカスタマイズされた `tl2019-hiragino` を使う。
* イメージ生成時と同様，毎回ホスト側の `/System/Library/Font` をコンテナ内の `/usr/share/fonts/SystemLibraryFonts` へとマウントして使う。

という点が違いとなります。そのため，まずエイリアスとして


```sh
alias dockertl-hiragino="docker run --rm \
  --mount type=bind,src=\"\$(pwd)\",dst=/workdir \
  --mount type=volume,src=ltcache,dst=/usr/local/texlive/2019/texmf-var/luatex-cache \
  --mount type=bind,src=/System/Library/Fonts,dst=/usr/share/fonts/SystemLibraryFonts \
  tl2019-hiragino"
```

などと設定しておくとよいでしょう。このエイリアスが設定されている下において，

```sh
$ dockertl-hiragino ptex2pdf -u -l hoge.tex
```

などとすれば，コンテナ内の TeX Live を用いて，ホストの macOS 内のヒラギノフォントを埋め込んだ PDF を生成できます。

## サンプル

### ソース

```tex:hoge.tex
\documentclass[uplatex]{jsarticle}
\usepackage[deluxe]{otf}
\begin{document}
ヒラギノ明朝のＷ３だよ☃\par
{\bfseries ヒラギノ明朝のＷ６だよ☃}\par
{\gtfamily ヒラギノ角ゴシックのＷ３だよ☃}\par
{\gtfamily\bfseries ヒラギノ角ゴシックのＷ６だよ☃}\par
{\gtfamily\ebseries ヒラギノ角ゴシックのＷ８だよ☃}\par
{\mgfamily ヒラギノ丸ゴのＷ４だよ☃}\par
\end{document}
```

### コンパイルコマンド (upLaTeX + dvipdfmx)

```sh
$ dockertl-hiragino ptex2pdf -u -l hoge.tex
```

### コンパイル結果

<img width="400" alt="スクリーンショット 2020-01-05 15.48.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41739/20f9532c-2252-2f0c-a3eb-41634f34e1b1.png">

きちんとヒラギノフォントが埋め込まれていますね！