nikkie-ftnextの日記

イベントレポートや読書メモを発信

Sphinxで作ったPDFにフォント埋め込みが必要なのはどうして? そしてどうやる? 3年越しで達成し、理解が深まりました

はじめに

やっと意味分かった... nikkieです。

ドキュメント変換ツールSphinxでは、reSTで書いた原稿をPDFに変換することもできます。
Sphinxで作ったPDFに「フォント埋め込みが必要」というのがずっと理解できていなかったのですが、このたび手を動かして理解を深めました。

目次

「PDFにフォント埋め込み」との出会い

それは2019年12月の技書博2まで遡ります。
当時のnikkieはSphinxで技術同人誌を執筆しており、入稿のためにPDFを作りました。
当時の記事を見ると、tokibito/sphinx-texlive Dockerイメージを使っていたようです1

技書博2の懇親会でのLTスライド(の素)も見つかりました2
https://raw.githubusercontent.com/ftnext/2019_slides/759bb2d1d0073b1b46d53e1072162db86aa5ae5a/gishohaku_Dec_retrospectives/PITCHME.md

### 申し込んだ直後の私に伝えたいこと

書き上げて終わりじゃなかったよ!!

そしてフォント埋め込みもよく分からないながら対処しました(本当に分かっていなかった)。

### フォント埋め込みは本当によく分からなかった

- なんで必要?
- `sphinx` で常に必要?
- macのプレビューで「プリント」からPDFにして大丈夫という情報を信じた

なぜフォント埋め込みが必要? TeX Wikiが詳しかった

「はじめに」でTeXのフォントまわりがかなり詳細に説明されています。
文字量は多かったですが、読み進める中で「そもそもTeXはだいぶ違うんだ」と少しずつ分かり始めました。

これは、TeX 以外の多くのアプリケーションソフトが OS にインストールされたフォントを OS の機能を通じて利用しているのに対して、TeX の場合はそうではないからです。

TeXはOSにインストールされたフォントをOSの機能を通じて利用しないのか〜

「フォントを変えてみる(日本語フォント)」には以下のようにあります。

近年は PDF に書体を埋め込むことが推奨され,TeX 文書作成段階で書体を設定することが望ましくなりました。

なるほど、推奨されているんですね。

フォント埋め込みリトライ

脱線:macOSの「プレビュー」でもできる(らしい)

過去に信じたプレビューですが、このたび「PDFとして書き出す」という情報も見つかりました。

フォント埋め込み情報収集(sphinxdoc/sphinx-latexpdfイメージ)

記事執筆時点(2023/06)では、reST原稿からPDFをビルドするにはsphinxdoc/sphinx-latexpdfイメージがオススメです3
SphinxPythonのバージョンが新しいイメージですし、docker runするときにmake latexpdfを渡すだけとかなり簡単に使えます。

このイメージでのフォント埋め込みについては、先人の巨人(shimizukawaさん)の肩に乗ります。

(上で紹介したTeX Wikiへのリンクもあります)

また、TeX Wikiで知った『[改訂第8版]LaTeX2ε美文書作成入門』という書籍も2体目の巨人として追加します4

PDFへの日本語フォント埋め込みは「13.2」と付録の「C.10」がピンポイントでした(sphinxdoc/sphinx-latexpdfイメージがupLaTeX環境というのもあります)。

sphinxdoc/sphinx-latexpdfイメージの設定確認

kanji-config-updmap-sysコマンドで確認します。

% docker run --rm -it sphinxdoc/sphinx-latexpdf:5.3.0 bash

# kanji-config-updmap-sys status
CURRENT family for ja: noEmbed (variant: <empty>)
Standby family : haranoaji
Standby family : ipa
Standby family : ipaex

イメージはデフォルトでフォント埋め込みをしない設定なのですね(だから埋め込みたければ要設定!)。
kanji-config-updmap-sys ipakanji-config-updmap-sys ipaexで埋め込むフォントを設定できます。

sphinxdoc/sphinx-latexpdfベースに独自イメージを作って、フォント埋め込み達成!

shimizukawaさんのScrapboxにならってDockerイメージをビルドして、make latexpdfを実行することにしました。
docker runには&&でつないだコマンドが渡せなさそうだったからですが、シェルスクリプトを書いてコンテナ内にマウントして実行する方法もありそうです)

FROM sphinxdoc/sphinx-latexpdf:5.3.0
RUN kanji-config-updmap-sys ipaex

イメージビルド(カレントディレクトリにDockerfileがあります)

% docker build -t sphinx-latexpdf-font:5.3.0 .

ビルドしたイメージにmake latexpdfを渡してrunするだけで、IPAexフォントが埋め込まれたPDFが作れます🙌
(カレントディレクトリにSphinxMakefileがあるように設定しています)

% docker run --rm -it -v $PWD:/docs sphinx-latexpdf-font:5.3.0 make latexpdf

このPDFを開くと、文字の見た目がいい感じなんですよ!
「埋め込めたからか〜」と嬉しくなりました。

またshimizukawaさんのScrapboxにあるように、Adobe Acrobat ReaderでPDFのプロパティを見て、埋め込みできているかも確認できます。

終わりに

手を動かしてフォント埋め込みを達成してようやく、SphinxでビルドしたPDFでフォント埋め込みが必要とはどういうことかを理解しました。

  • TeXとフォントの関係は、他のアプリケーションとフォントの関係とは異なる
  • 原稿からPDFをビルドするDockerイメージではフォント埋め込みの設定がされていなかったので必要になった

2019年時点ではSphinxTeXも全然分からなくて、「フォント埋め込みが必要」ということが全然理解できなかったのだと思います。
3年間この件につきっきりだったわけでは全くありませんが、徐々にSphinxの練度が上がっていき、直近でTeX Wikiという自分に合うリソースを見つけたことで、「フォント埋め込みが必要」を理解できる条件が揃ったのかなと思います。
やったぞ!

P.S. IPAフォントのライセンス

TeX Wikiでは、埋め込むフォントのライセンス確認も案内されます。

IPAexフォント/IPAフォントは、

フォントの埋め込みに関しては,フォントがそれが埋め込まれた文書の表示に使われるのみにおいては,基本的に制限を受けません。

IPAフォントライセンスv1.0 | 一般社団法人 文字情報技術促進協議会を確認すると

「許諾プログラム」とは、許諾者が本契約の下で許諾するデジタル・フォント・プログラムをいいます。(第1条 2)

(許諾者=文字情報技術促進協議会で、IPAフォントを許諾するという認識です)

「デジタル・ドキュメント・ファイル」とは、PDFファイルその他、各種ソフトウェア・プログラムによって製作されたデジタル・コンテンツであって、その中にフォントを表示するために許諾プログラムの全部または一部が埋め込まれた(エンベッドされた)ものをいいます。(略)(第1条 5)

「受領者」とは、許諾プログラムを本契約の下で受領した人をいい、受領者から許諾プログラムを受領した人を含みます。(第1条 8)

受領者がデジタル・ドキュメント・ファイルからエンベッドされたフォントを取り出して派生プログラムを作成した場合には、かかる派生プログラムは本契約に定める条件に従う必要があります。(第2条 4)

許諾プログラムのエンベッドされたフォントがデジタル・ドキュメント・ファイル内のデジタル・コンテンツをレンダリングするためにのみ使用される場合において、受領者が当該デジタル・ドキュメント・ファイルを複製その他の利用をする場合には、受領者はかかる行為に関しては本契約の下ではいかなる義務をも負いません。(第2条 5)

TeX Wikiの記載はライセンスに沿っていそうに思います。
※ライセンスに関して専門知識があるわけではないので、考え違いをしていたらご指摘いただけると大変ありがたいです


  1. ありがとう、GitPitch。スライドはいまは見えなくなっていますね(移さなきゃ)
  2. 直近でこんな記事も書きました。
  3. 3年ペースでの改訂らしいです。今喉から手が出るほどほしいなら買うのがオススメ、知識として知りたいならおそらく今年ある改訂タイミングを待つ方がよいかもしれません