nikkie-ftnextの日記

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

SphinxでビルドしたPDFに ⋯(22ef、MIDLINE HORIZONTAL ELLIPSIS)が表示されない

はじめに

キミと一緒に歩いてきた♪ アイ NEED YOUよすぎる😭 nikkieです

アイマスエキスポ準備1より技術ネタです。

目次

SphinxでビルドしたPDFに「⋯」が表示されない

なんの気なしに「⋯」をSphinxで使いました。

吾輩は猫である。
名前はまだ無い⋯⋯

いつものように sphinxdoc/sphinx-latexpdf イメージでPDFをビルドします

% docker run --rm -v $PWD:/docs sphinxdoc/sphinx-latexpdf:8.1.3 sphinx-build -M latexpdf source build

ところが、ビルドされたPDFに「⋯」がないんです!

ビルド中にwarningが表示されていました。

dvipdfmx:warning: No character mapping available.
 CMap name: UniJIS-UTF16-H
 input str: <22ef>

22efは「⋯」の文字コードの16進表現ですね。
Python 3.12.8で確認)

>>> import unicodedata
>>> unicodedata.name("⋯")
'MIDLINE HORIZONTAL ELLIPSIS'
>>> ord("⋯")
8943
>>> hex(ord("⋯"))
'0x22ef'

再現するリポジトリを用意しました

latex_engineの指定で回避

https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-latex_engine

  • language"ja"のとき、"uplatex"です2
    • -l jaを指定してsphinx-quickstartしました
  • これを"platex"に指定することで、22efは紙面に出るようになりました
  • uplatexplatexも sphinxdoc/sphinx-latexpdf イメージで使えます
latex_engine = "platex"

原因切り分け過程

以前platexTeXファイルをビルドしたことがあったので、そこに立ち戻りました

\documentclass[dvipdfmx]{jsarticle}
\begin{document}

吾輩は猫である。
名前はまだ無い⋯⋯

\end{document}
% docker run --rm -it -v $PWD:/docs sphinxdoc/sphinx-latexpdf:8.1.3 bash

root@34853085f945:/docs# platex ex1
root@34853085f945:/docs# dvipdfmx ex1

できあがるex1.pdfには「⋯」が表示されます

platexで知っていた別のドキュメントクラスjsbookでも「⋯」が表示されました。

これをuplatex向けにドキュメントクラスujbookに変更します

-\documentclass[dvipdfmx]{jsarticle}
+\documentclass[dvipdfmx]{ujbook}
\begin{document}

吾輩は猫である。
名前はまだ無い⋯⋯

\end{document}
root@34853085f945:/docs# uplatex ex1
root@34853085f945:/docs# dvipdfmx ex1
ex1.dvi -> ex1.pdf
[1
dvipdfmx:warning: No character mapping available.
 CMap name: UniJIS-UTF16-H
 input str: <22ef>

dvipdfmx:warning: No character mapping available.
 CMap name: UniJIS-UTF16-H
 input str: <22ef>
]
1981 bytes written

再現しました!
uplatexでドキュメントクラスujbookのときに、ビルドされるPDFに「⋯」が表示されないという事象です。

SphinxがビルドするTeXファイルを見ると(build/latex以下)

%% Generated by Sphinx.
\def\sphinxdocclass{ujbook}
\documentclass[letterpaper,10pt,dvipdfmx]{sphinxmanual}

ドキュメントクラスujbookの事象が当てはまっているのかなあと考えています。

latex_engine = "platex"と指定すると、ujbookjsbookに変わっていました。

%% Generated by Sphinx.
\def\sphinxdocclass{jsbook}
\documentclass[letterpaper,10pt,dvipdfmx]{sphinxmanual}

終わりに

SphinxでビルドしたPDFに「⋯」が表示されない事象に直面し、回避手段を見つけました。
ただTeXが私にとって未知すぎるので、分かっていないことが多いです

  • ドキュメントクラスとは?
  • 同じ「⋯」なのにplatexで問題にならなくてuplatexで問題になるってどういうこと?
  • uplatexだけで解決する手段はある?

Sphinxlanguage"ja"のとき、デフォルトでuplatexを使っているというのは今回の学びです。


  1. DAY2 ス17-bでお待ちしています
  2. ドキュメントのここ(language"ja"のとき、platex/dvipdfmxのパイプライン)とは矛盾してるかも https://www.sphinx-doc.org/ja/master/man/sphinx-build.html#cmdoption-sphinx-build-M