TeX2img(数式・図の画像化)

数式や図を画像として書き出す——これは LaTeX がいちばん不得手なことです。理由は身も蓋もなくて、LaTeX の出力単位が「ページ」だから。実測してみると、A4 は 595 × 842 pt、そこに置いたガウス積分の一行は 86 × 28 pt しかありません。差の 99 % 以上は、あなたが要らない白紙です。PowerPoint や Keynote、Word、Web ページに数式を貼りたいだけなのに、この余白との戦いが始まります。このページは、その戦いに勝つための三つの道具——LaTeX 側で切り詰める standalone クラス、できあがった PDF を切り詰める pdfcrop、SVG に変換する dvisvgm——と、それらをまとめて GUI で面倒みる TeX2img を扱います。

standalone クラス — LaTeX 側で内容ぴったりに切り詰める

もっとも素直な答えは standalone クラス です。\documentclass{article} の代わりに \documentclass{standalone} と書くだけで、ページが本文の外接矩形まで縮み、内容ぴったりの 1 ページ PDF ができます。冒頭のガウス積分を border=2pt 付きで組んだ結果は 85.8 × 28.0 pt——A4 の 595 × 842 pt から、要らない紙が完全に消えました。作者は Martin Scharrer で、TeX Live 2024 に入っているのは v1.3b(2022/10/10)です。

figure.tex
% pdflatex figure.tex  ->  a one-page PDF cropped to the formula
\documentclass[border=2pt]{standalone}
\usepackage{amsmath}
\begin{document}
$\displaystyle \int_{-\infty}^{\infty} e^{-x^2}\,dx = \sqrt{\pi}$
\end{document}

ここで一つ、よく書かれているのに 意味のない指定 を潰しておきます。\documentclass[preview]{standalone} は何も変えません——previewstandalone既定 だからです。クラスファイルを読むと、オプション処理の前に既に preview が真になっており、意味があるのは反対側の crop のほうです(crop を指定すると preview が偽になり、preview パッケージを使わない切り詰め方に切り替わります。XeLaTeX で preview が悪さをする場合の逃げ道がこれです)。余白は border= で指定し、値は 1 個なら四辺共通、2 個なら「左右/上下」、4 個なら「左・下・右・上」の順です。既定は 0.50001 bp——つまり 既定でもごくわずかな余白が付いています

その preview の出どころが少し面白いところです。standalone は内部で preview パッケージ を読み込んで切り詰めを実現しているのですが、この preview.styAUCTeX / preview-latex の一部——つまり Emacs が編集中のバッファに数式のプレビューを重ねて表示する、あのしくみと同じコードです。エディタの中で数式を切り出すために作られた仕組みが、そのままスライド用の画像を切り出すのに使われています。TeX Live 2024 に入っているのは v13.3(2024/01/17)です。

standalone にはもう二つ、知っておくと得なオプションがあります。varwidth=<幅> を付けると本文が折り返せるようになり、キャプションのような複数行のテキストを画像化できます(既定では1行に伸び続けます)。multi=<環境名> は、1 つのファイルに置いた複数の tikzpictureそれぞれ別ページ に切り出します——図をまとめて管理して、必要なページだけ取り込む使い方です。そして同名の standalone パッケージ のほうを本文側で読み込むと、\includestandalone{figure} で図ファイルを取り込めます。ソースのまま取り込むか、生成済み PDF を取り込むかを切り替えられるので、下書き中は速い方、入稿時は確実な方、といった運用ができます。

pdfcrop — すでにある PDF の余白を落とす(ノンブルに注意)

ソースに手を入れられないときの道具が pdfcrop です。すでにできあがった PDF を渡すと、各ページの余白を測って切り落とした新しい PDF を書き出します。\documentclass を書き換えられない共著原稿や、他人からもらった図の PDF を切り詰めたいときに使います。TeX Live に同梱、作者は Heiko Oberdiek、TeX Live 2024 の版は 1.42(2023/04/15)です。余白を少し残したいときは --margins "2"(単位は bp)のように指定します。

terminal
pdfcrop page.pdf out.pdf              # trim all margins
pdfcrop --margins "2" page.pdf out.pdf # leave 2 bp on every side
pdfcrop --margins "5 2 5 2" a.pdf b.pdf  # left bottom right top
pdfcrop --hires --clip a.pdf b.pdf     # HiResBoundingBox, and clip the content

しくみを知っておくと挙動が読めます。pdfcropPDF を自分で解析していません。外接矩形は Ghostscript に問い合わせ、その結果をもとに pdfTeX(あるいは --xetex / --luatex)をもう一度走らせて 新しい紙型でページを組み直します。つまり PDF を切るのに TeX が動きます。Ghostscript が入っていなければ動きませんし、--gscmd でその呼び出し名を指定できるのもこのためです。

そして いちばんよく踏む地雷 がこれです。pdfcrop はページ上の すべてのインクを内容とみなす ので、article の既定のように ページ下部にノンブル(ページ番号)が出ていると、そこまで含んだ縦長の箱 になります。実際に \[ E = mc^2 \] だけの A4 一枚を切り詰めると 43 × 559 pt——数式は上端に、ページ番号は下端に、あいだは空白です。\pagestyle{empty} を足してから同じことをすると 43 × 13 pt になります。「切り詰めたのにやけに縦長」の九割はこれです。

SVG で書き出す — dvisvgm と、文字をアウトライン化するか残すか

Web ページや、SVG を扱える描画アプリに渡すなら dvisvgm が本命です。DVI・EPS・PDF を SVG に変換するプログラムで、TeX Live に同梱、Martin Gieseking が 2005 年から開発を続けています(TeX Live 2024 の版は 3.2.2)。もっとも確実な経路は latex で DVI を作り、それを dvisvgm に渡す ことです。数式ひとつを渡すと、変換しながら graphic size: 81.5pt x 23.4pt のように 実寸を報告してくれる ので、貼り先で何倍に拡大すべきかもその場で分かります。

terminal
latex figure.tex                            # produce figure.dvi
dvisvgm --no-fonts --exact-bbox figure.dvi  # glyphs as paths, tight box
dvisvgm --font-format=woff2 figure.dvi      # keep real text, web font
dvisvgm --eps figure.eps                    # EPS input
dvisvgm --pdf figure.pdf                    # PDF input: needs gs or mutool

選択の分かれ目は 文字をアウトライン化するかどうか です。--no-fonts を付けるとグリフが path 要素として描かれ、相手の環境にフォントが無くても見た目が完全に再現 されます。反面、SVG 内のテキストは検索も選択もできなくなり、ファイルはやや大きくなります。逆に文字として残すなら --font-format=woff2 などでフォントを埋め込みます。Web の数式ならアウトライン化が無難、本文と一緒に検索させたいならフォント埋め込み、という分け方です。切り詰めの精度を上げたいときは --exact-bbox を付けると、グリフの実際の輪郭から外接矩形を計算します。

注意点がひとつ。PDF を入力にする --pdf は、dvisvgm 単体では動きません。 PDF の解釈には Ghostscript か、MuPDF の mutool が必要で、どちらも見つからないと ERROR: can't retrieve number of pages from file で止まります。TeX Live には mutool は同梱されていないので、この経路を使うなら別途入れるか、素直に DVI 経路を選んでください(dvisvgm そのものの詳細は DVI 変換ツールのページが持ち主です)。

PNG など画像形式で欲しいとき — 解像度と透過

貼り先がベクター(PDF・SVG・EPS)を受け付けるなら 必ずベクターを選んでください。拡大しても輪郭が崩れず、印刷でもスライドでも線が鮮明なままです。ラスター(PNG・JPEG)が必要になるのは、貼り先がベクターを受け付けないとき、あるいは相手の環境で確実に同じ見た目にしたいときです。ラスターにするなら 解像度を最初に決める のが鉄則で、スライドに全画面で映すなら 300〜600 dpi 相当は見ておきます。あとから拡大しても情報は増えません。

standalone にはこの用途向けに convert オプション があり、コンパイルの流れの中でそのままラスター画像まで作れます。外部の変換ツールを呼ぶので -shell-escape が必要 です。透過背景が欲しいときは PNG を選び、余白をゼロにせず border を少し残しておくと、スライドの背景色に自然に溶け込みます。JPEG は写真向けの圧縮なので、数式や線画に使うと輪郭のまわりにノイズが出ます——数式に JPEG は選ばない のが正解です。

TeX2img — コンパイルから書き出しまでを GUI でまとめて

ここまでの道具を 一つのアプリにまとめたのが TeX2img です。数式や図の断片を窓に貼り、エンジンと出力形式を選んで押すだけで、コンパイル・切り詰め・書き出しが一続きに走ります。日本の TeX コミュニティから生まれたツールで、寺田侑祐(Yusuke Terada) がバージョン 1.2 まで開発し、以降は Windows 版を阿部紀行(Noriyuki Abe) が、macOS 版を寺田氏が、それぞれ独立に開発しています。Web サービスではなく 手元で動くアプリ なので、自分の環境に入れた独自のスタイルファイルやフォントがそのまま使えるのが強みです。

内部でやっていることは、これまで見てきたことの組み合わせです。まず選んだエンジン(pdflatexplatexuplatexlualatexxelatex など)で断片をコンパイルし、platex / uplatex のように DVI を経由する経路では dvipdfmxdvips を挟み、最後に Ghostscript(バージョン 9 以上)で外接矩形に合わせて切り出して、指定の形式へ書き出します。したがって 動作する TeX 環境と Ghostscript が前提 です。Windows 版で SVG を出すには MuPDF が別途必要 で、これは前節で dvisvgm --pdfmutool を要求したのと同じ事情です。エンジンを自分で選べるので、日本語の数式や和文フォントを含む断片も普段どおりの品質で画像にできます。

出力できる形式は幅広く、ベクターの EPS・PDF・SVG(SVGZ)・EMF、ラスターの PNG・JPEG・GIF・TIFF・BMP が選べます。EMF は Windows の Office に貼るためのベクター形式で、Windows 版でのみ 使えます。余白・解像度・背景の透過はそれぞれ設定でき、GUI ではプレビューを見ながら調整できます。多数の数式を一括変換したい、あるいはビルドに組み込みたいときのために コマンドライン版 も用意されていて、Windows では TeX2imgc.exe が GUI を CUI モードで動かします。書式は「オプションのあとに入力と出力を対で並べる」形です。

terminal
TeX2imgc.exe /transparent /resolution=600 equation.tex equation.png
TeX2imgc.exe /latex=uplatex /gs=gswin64c formula.tex formula.svg

実際に使うときに効いてくる細部が三つあります。第一に、\documentclass を省いた本文だけを貼れば済みます——TeX2img がひな形で包んでからコンパイルするので、数式一行を試すのに前後を書く必要がありません。もちろん自前のプリアンブルを含む完全な断片も渡せますし、既存の .tex ファイルや、すでにある PDF・PS・EPS を入力にして画像化することもできます。第二に、PDF と SVG では 文字をアウトライン化するか、文字情報として残すか を選べます(前節の dvisvgm --no-fonts と同じ判断です)。第三に、macOS 版には 生成結果を Illustrator・Word・PowerPoint などへ直接ペーストする 機能があり、ファイルを経由せずスライドに置けます。

貼り先で決める — Word・PowerPoint・Keynote・Web・印刷

形式選びは好みではなく 貼り先の都合 で決まります。下の表がその対応です。原則としてベクターを第一候補にし、受け付けない相手にだけラスターを使います。そして忘れがちな点をひとつ——画像化した数式は、あとから直せません。 論文本文のように何度も式が変わるものは画像にせず LaTeX のままにしておき、画像化するのは「もう変わらないもの」「LaTeX が使えない場所に置くもの」に絞るのが安全です。元の .tex 断片は必ず残しておいてください。

形式種類向いている貼り先
PDFベクターLaTeX 文書への再取り込み、印刷、Keynote。第一候補
SVGベクターWeb ページ、Figma や Illustrator などの描画アプリ
EPSベクター旧来の入稿フロー、EPS を要求する出版社
EMFベクターWindows の Word / PowerPoint。TeX2img は Windows 版のみ対応
PNGラスタースライド全般、チャット、透過が要る場面。解像度を先に決める
JPEGラスター写真と混ぜる場面のみ。数式・線画には使わない

最後に道具の使い分けをまとめます。LaTeX 文書の中で完結させる なら standalone クラス——図を別ファイルにして \includestandalone で取り込む運用が定石です。ソースを触れない PDF を切り詰める なら pdfcropSVG が要る なら dvisvgm。そして 手元で何枚も試しながら形式を決めたい、あるいは日本語環境ごと GUI で扱いたいなら TeX2img が最短です。図そのものの描き方は TikZ のページ、できた画像を文書に入れる方法は画像の挿入のページが持ち主です。