マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

dvipdfmx で preview パッケージする件について

LaTeX のコードで書かれた図や数式*1から「タイトな」―すなわち図のある領域のみからなり無駄な余白のない―画像ファイルを作成する方法の一つとして preview パッケージを使うというものがある。

preview パッケージの概要
[test.tex]
\documentclass{article}
\usepackage[active,tightpage]{preview}
\begin{document}
\begin{preview}
$a + b = c$
\end{preview}
\end{document}

上掲のソースのように、画像として切り出したい部分を preview 環境の中に入れる。この文書を次にあげる様々な方法を用いて PNG 形式等の画像ファイルを生成できる。(以下のコマンドラインの中で「600」は dpi 値。)

  • LaTeX で DVI に変換(latex test.tex)後、dvipng で PNG 画像に変換(dvipng -D 600 test.dvi)する。*2
  • LaTeX で DVI に変換(latex test.tex)後、dvips で PS 文書に変換(dvips test.dvi((W32TeX の場合は「-Pdl」を付けた方がよい。)))する。その後、次のように Ghostscript を起動して PNG 画像(オプションの値により別形式も可能)に変換する。((Ghostscript のコマンド名を gs とする。なお、preview パッケージの方式では敢えて EPS 形式にしていないので、EPS 形式からの変換方法とは異なることに注意。))
    gs -sDEVICE=png16m -dTextAlphaBits=4 -r600 -dGraphicsAlphaBits=4 -dSAFER -q -dNOPAUSE -sOutputFile=test%d.png test.ps
  • pdfLaTeX/XeLaTeX/LuaLaTeX で PDF 文書に変換(pdflatex test.tex)して、それを PNG 画像(など)に変換(convert -density 600 test.pdf test.png *3)する。

(ここでは詳細を略すが文書中に複数の preview 環境を入れると、「複数の画像を綴った形の」DVI/PS/PDF 文書が生成され、そこから同じ方法で複数の画像ファイルを得られる。)

例の test.tex の場合、次のような画像が得られる。*4

dvipdfmx で使えるようにしてみた

ところで、上掲のリストを見ると、dvipdfmx がサポートされていないことが判る。普段 dvipdfmx を使っていて特有の設定(フォントマップ等)を利用している人にとっては、dvipdfmx で preview パッケージが使えたら便利かもしれない。というわけでドライバファイルを作ってみた。

このファイル prdvipdfmx.def を TeX から見える場所に置いて、preview パッケージの読込で、tightpage より前に dvipdfmx というオプションを付ければよい。((順番を間違えるとエラーになる。なお、tightpage を使わない場合は、preview パッケージはそもそもドライバ依存の動作をしないことに注意。ちなみに、preview にはもともと dvipsxetexpdftex のドライバ指定オプションがあるが、この 3 つしか選択肢がなく必ず自動判別が効くので指定は不要である。prdvipdfmx.def が存在しても、DVI 出力の LaTeX での既定のドライバは dvips のままである。また、実装の都合で、dvipdfmx オプションについてはグローバルオプションからの継承が行われない。))

実際に例を示す。折角 dvipdfmx を使うので、pLaTeX の縦書きを試してみる。((ただし縦書きモードのまま preview 環境に入るのは恐らく上手くいかないので、横書きモードで preview に入りその中で <t> 指定の minipage 等で縦書きに切り替えるのが安全だろう。))

[test2.tex]
% pLaTeX 文書
\documentclass[a4paper]{jsarticle}
\usepackage{plext}
\usepackage[active,dvipdfmx,tightpage]{preview}
\begin{document}
\begin{preview}\begin{minipage}<t>{6zw}
難波津に\\
咲くやこの花\\
冬籠り\\
今を春辺と\\
咲くやこの花
\end{minipage}\end{preview}
\end{document}

この文書について、普通に「platex test2.tex」→「dvipdfmx test2.dvi」で PDF に変換した後、「convert -density 300 test2.pdf test2.png」で次のような PNG 画像に変換できる。

画像ファイルとしての PDF

画像ファイルを得るために、上の例では最後に PDF を PNG に変換した。ところで、もしその画像を取り込む先が LaTeX 文書である場合は、graphicx パッケージで PDF 画像を取り込むことができるので、PNG 等のラスタ画像形式に変換するべきでない。といっても、今の話では、「画像」自体が LaTeX で表現できるものである(つまり画像のソースをそのまま取込元の文書に書けば同じことになるはず)から、そういう使い方は有用でないと思われるかも知れない。しかし例えば、pLaTeX で作成した「画像」を pdfLaTeX の文書で取り込むといった使い方は、片方のエンジンでは済まない場合には有効であろう。例えば次のようなことができる。

[test3.tex]
% pdfLaTeX document
\documentclass[a4paper]{article}
\usepackage{graphicx}
\pagestyle{empty}
\begin{document}
\begin{figure}[!h]\centering
  % Includes the output from pLaTeX as an image 
\includegraphics{sample-preview-2.pdf}
\caption{An example of vertical writing}
\end{figure}
\end{document}

*1:別に普通のテキストでもよく、要するに文書の一部分。

*2:普通 dvipng は既定では画像の寸法をタイトにしないが、入力が preview を用いた DVI 文書の場合はそれを検知して preview が計算した寸法に合わせているようだ。

*3:ここでは ImageMagick の convert コマンドを使った。Ghostscript を直接使うことも可能だろうがこちらの方が簡単。

*4:余白を調節せずにそのまま載せた。解像度は 300dpi。