dvipdfmx

dvipdfmx は DVI を PDF へ変換するソフトウェアです. 元々 Mark A. Wicks 氏によって開発された dvipdfm というソフトウェアがあり,dvipdfmx は主に CJK 対応を強化した拡張版 (eXtended version) です. 現在では dvipdfm コマンドは dvipdfmx へのシンボリックリンクとなっており,dvipdfm として実行した場合は互換モードで動作するようになっています*1



特徴

元となった dvipdfm の主な特徴としては,Dvipdfm User's Manual Version 0.12.4b では次が挙げられています.

dvipdfmx での主な変更・拡張は

などです.

xdvipdfmx

似たような名前のプログラムとして xdvipdfmx というものがあります. これは XeTeX が出力する XDV ファイルを処理するための dvipdfmx の拡張版です. 通常は XeTeX の裏で自動的に呼ばれるので,意識する必要はありません.

XeTeX であえて XDV ファイルを出力したい場合は -no-pdf オプションをつけます.

使い方

変換したい DVI ファイル名を引数として与えると,デフォルトの設定で PDF ファイルへの変換が行われます.

$ dvipdfmx foo.dvi
foo.dvi -> foo.pdf
[1]
14514 bytes written

なお,拡張子は省略できます. 上の場合,単に foo としても foo.dvi が変換されます. ただし,別に foo という(拡張子のない)ファイルが存在する場合は明示的に foo.dvi と書く必要があります. なお,2018/05/23 以降の W32TeX では,別に foo という ファイルが存在する場合にも,単に foo とした場合,まず foo.dvi を優先して探しま す.TeX Live の場合も遅くても TeX Live 2019 からそのようになります.

なにも設定しなくともとりあえず動く場合がほとんどだとは思いますが,フォントなどはそれぞれの OS にあった設定がなされていることを確認しましょう. 特に Windows 10 や macOS では収録文字数が大幅に増え,また多ウェイト化なども進んで来ているため古い習慣にとらわれず新しいものを使いましょう. フォントは PDF へ埋め込むことを基本としてください. 非埋め込みで PDF を作成することは推奨されません.

例えば,TeXLive/Windows 10 で標準搭載の游明朝・游ゴシックを埋め込むように設定するにはコマンドラインで(tlmgr で ptex-fontmaps パッケージをインストールしておきます)

 kanji-config-updmap yu-win10

とします. macOS ではヒラギノを使うとよいかもしれません(設定については TeX Live/Mac を参照してください).

コマンドラインオプション

 $ dvipdfmx -h
 Usage: dvipdfmx [options] [dvifile[.dvi|.xdv]]
        dvipdfmx --extractbb|--xbb|--ebb [options]     "extractbb" になる
        dvipdfmx --help|--version
 Options:
   -c            カラースペシャルを無視する (モノクロ印刷用)
   --dvipdfm     DVIPDFM 互換モードを有効にする
   -d 数値       PDF 出力の小数点以下の桁数を設定 (0-5) [2]
   -f ファイル名 マップファイル名を設定 [pdftex.map]
   -g 寸法       アノーテーションの余白 [0.0in]
   -h | --help   このメッセージを表示し終了
   -l            ランドスケープモード
   -m 数値       追加の拡大率を設定 [1.0]
   -o ファイル名 出力ファイル名を設定, "-" で標準出力 [dvifile.pdf]
   -p 用紙サイズ 用紙サイズを設定 [a4]
   -q            静かに
   -r 解像度     ビットマップフォントの解像度を DPI で指定 [600]
   -s ページ範囲 ページ範囲を指定 (-)
   --showpaper   使用可能な用紙形式を表示して終了
   -t            PNG 形式のサムネイルを埋め込む [dvifile.1]
   --version     バージョン情報を出力し終了
   -v            うるさく
   -vv           よりうるさく
   --kpathsea-debug 数値       kpathsearch デバッグフラグを設定 [0]
   -x 寸法       水平方向のオフセットを指定 [1.0in]
   -y 寸法       垂直方向のオフセットを指定 [1.0in]
   -z 数値       zlib の圧縮レベルを指定 (0-9) [9]
   -C 数値       様々なオプションフラグ [0]:
                   0x0001 予約済み
                   0x0002 TPIC シェーディングコマンドに不透明なグレーの代わりに
                          半透明な塗りつぶしを使う (PDF 1.4 が必要)
                   0x0004 CID フォントを固定幅として扱う
                   0x0008 重複したフォントマップエントリーを置き換えない
                   0x0010 PDF デスティネーションの最適化を抑制する
                 正の値は常に前に与えられた値と OR される
                 負の値を指定すると前の値を置き換える
   -D 文字列     PS->PDF 変換コマンドラインテンプレート [none]
   -E            フォントライセンスフラグに関わらず常にフォントを埋め込む
   -I 数値       画像キャッシュの寿命 [-2]
                  0: すべての古い画像を消去し新しい画像を残す
                 -1: すべての古い画像を消去し新しい画像も消去する
                 -2: 画像キャッシュを無視する
   -K 数値       暗号化キー長 [40]
   -M            MetaPost PostScript 出力を処理
   -O 数値       開いたブックマークアイテムの最大深度 [0]
   -P 数値       暗号化の許可フラグを設定 [0x003C]
   -S            PDF 暗号化を有効に
   -V 数値       PDF のマイナーバージョンを設定 [5]
 コマンドラインから入力されるすべての寸法は "True" 付きと解釈される.
 "-s" の引数はコンマで分離されたページレンジを列挙したものです,
         例えば,"-s 1-3,5-6".
 ページサイズは用紙フォーマット (例: "a4")
         あるいは w<unit>,h<unit> (例: "20cm,30cm") で指定.
 バグ報告は電子メールで: tex-k@tug.org.

マニュアル

dvipdfmx には The dvipdfmx project team によるマニュアルが存在します.

コマンドラインから

texdoc dvipdfmx

を実行することで dvipdfmx のマニュアルを読むことができます.

dvipdfm のマニュアルも参考になります.

フォントの設定

フォントの設定は TeX 関連プログラムを使う際に大きな困難となる部分です. TeX とその関連プログラムがどのようにフォントを取り扱うのか,あまり理解していない場合は各ディストリビューションのデフォルト設定に従うのが賢明です. dvipdfmx で使用するフォントの設定方法は,dvipdfmx/フォントの設定を参照してください.

画像や PDF のとりこみ

dvipdfmx がサポートする画像フォーマットは PNG,JPEG,BMP,JPEG 2000(2014/08/11 より)および MetaPost が出力した EPS (MPS) です. これに加えて PDF のページもとり込めます. dvipdfmx を使用して画像をとりこむ方法の詳細は,dvipdfmx/画像のとりこみを参照してください.

special 命令

本来 DVI ファイルは名前のとおり device-independent なものですが,さまざまな拡張機能を \special 命令によって実現することができます. 文書やページの設定を行うもの,描画や画像のとりこみを行うもの,HTML 形式のハイパーリンクを付加するもの,出力 PDF のバージョンや文書情報を指定するもの等があります. これらの機能のうちほとんどはユーザーが直接意識することはありません. 通常はパッケージの製作者が LaTeX 等の為の使い易いインターフェイスを提供しているでしょう. しかし,これらの機能を用いて作成された DVI ファイルはデバイス依存であることに注意が必要です. dvipdfm(x) でこれらの \special 命令を利用する方法については,dvipdfmx で用いることができる \special 命令を参照してください. ただし,dvipdfm(x) 独自の機能を使う場合は,それにより他の DVI ドライバとの互換性を酷く損なうという事に注意してください. いくつかの機能は DVI の設計思想に反することもあります.

その他

PDF のバージョンを指定する

例えば,PDF 1.4 で出力したい場合はプリアンブルに

\special{pdf: minorversion=4}

と書きます(minorversion とは 1.x の 'x' のことです). もしくは,ZR さんによる bxpdfver パッケージを使用して

\usepackage[dvipdfmx,1.4]{bxpdfver}

としてもよいです. 1.4 以外に,1.5, 1.6, 1.7 が指定できます.

コマンドラインオプションで指定することもできます.

-V number     Set PDF minor version

画像キャッシュで高速化

デフォルトでは有効にならないようになっています. 有効にするにはコマンドラインオプション

-I number

において,number を正整数にします. この数値は,キャッシュが有効な時間を表しています. デフォルトで有効にしたい場合,dvipdfmx.cfg の I セクションで

I 24

のように設定しておきます. この場合,一日以内ならキャッシュにイメージがある場合,それを使用することを意味しています.

extractbb などの名前でシンボリックリンクを作成する

dvipdfmx はコマンドの名前によって機能を変えることができます. dvipdfmx.c の main 関数を見るとコマンド名によって処理を変えています. UNIX ではプログラムに複数の機能を実装してシンボリックリンクを使用して別の名前をつけることで機能を変えることは普通に行われます.

PDF/X について

今のところ dvipdfmx は PDF/X 出力には対応していませんが,\special コマンドを駆使して PDF/X 準拠を謳った PDF を作成することはできます.ここではその方法を示しますが,自分が何をやっているのかよく理解したうえで行ってください

 \usepackage{bophook}
 \AtBeginDocument{
   \special{pdf:minorversion=3}
   \special{pdf:put @docinfo <<
     /Title (タイトル)
     /Author (著者)
     /CreationDate (D:20150124111528+09'00')
     /ModDate (D:20150124111528+09'00')
     /Trapped /False
     /GTS_PDFXVersion (PDF/X-1:2001)
     /GTS_PDFXConformance (PDF/X-1a:2001)
   >>}
   \special{pdf:put @catalog << /OutputIntents [ <<
     /Type /OutputIntent
     /S /GTS_PDFX
     /OutputConditionIdentifier (JC200103)
     /OutputCondition (JC200103 (Japan Color 2001 Coated))
     /RegistryName (http://www.color.org)
   >> ] >>}
 }
 \AtBeginPage{\special{pdf:put @thispage <<
     /BleedBox [0 0 595.28 841.89]
     /TrimBox [0 0 595.28 841.89]
 >>}}

dvipdfmx には出力結果が PDF/X 準拠かどうか検証したり,準拠するように適切に処理したりする機能はありません.少なくとも以下の点をよく検証してください:

外部画像はトラブルの元なので特に要注意です.また PostScript と PDF \special は何を引き起こすか分からないので使われていないことを確認しましょう (dvitype で DVI ファイルを検証するとよいでしょう).

よくある問題

EPS 画像

EPS の画像が表示されない,位置がずれるなどの問題は頻発します. Dvipdfmx は EPS (PostScript) には対応していません.EPS 画像を取り込む際には,EPS を PDF へ変換する外部プログラムが呼ばれ,それが行われます.この際に不具合が起こります.

用紙サイズと向き

LaTeX で用紙サイズや向きを指定したのに,生成された PDF ファイルに反映されないと悩む人がいます.それもそのはずで,LaTeX (TeX) が処理結果として出力する DVI フォーマットには,用紙サイズや用紙の向きという概念はないのです.Dvipdfmx の入力である DVI ファイルにそのような情報が記載されていない以上,どうにもならないので,何らかの方法でそれを与えてやる必要があります.

Dvipdfmx のオプションや,用紙サイズ・向きの情報を無理やり埋め込む \special コマンドを利用します.詳しくは「使い方」の項や「special コマンド」の項を参照してください.

処理が遅い

EPS ファイルを使っていないか確認しましょう.EPS を PDF へ変換する外部プログラムが呼び出され,その処理に時間がかかります.EPS の使用を辞めるか,前述の画像キャッシュ機能を使うかで対応します.

PDF 画像のバウンディングボックス判定に関する問題

TeX Live 2016 以降および W32TeX では,\includegraphics に pagebox オプションによって “意図どおりの Box” を指定することができるようになりました.

不具合

dvipdfmx Version 20130624 でのみ起こる不具合

以下の不具合はいずれも TeX Live 2014 (dvipdfmx Version 20140317), TeX Live 2013 (dvipdfmx-20130405) では問題ない,Version 20130624 に特有のものです. 最新のバージョンにアップデートして下さい.

TikZ を使用した DVI ファイルを処理すると ** ERROR ** Invalid object type: 10

TeX Live 2014 (Revision 31738, Revision 31739) で修正されました.

hyperref で作成したリンクやしおりが機能しない

TeX Live 2014 (Revision 31386, Revision 31672, Revision 31691, Revision 31759) で修正されました.

A5 サイズ (148mm×210mm) で出力できない

TeX Live 2014 (Revision 31398) で修正されました.

dvipdfmx-20120420 で IPAexフォント (Ver.002.01) を使うと ** ERROR ** Could not obtain necessary font info.

TeX Live 2013 (Revision 28787) で修正されました.

dvipdfmx-20120420, xdvipdfmx-0.7.8 で LucidaBitstream Charter のアクセント記号 (発音記号) が表示できない

TeX Live 2013 (Revision 27479, Revision 27480) で修正されました.

dvipdfmx-20120420, xdvipdfmx-0.7.8, dvipdfm, version 0.13.3TL-j-p1d では,LucidaBitstream Charter のアクセント記号 (発音記号) が表示できません.

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{charter}
\begin{document}
chass\'e du G\"obe
\end{document}

以下のように \' や \" の直後に {}$\!\!\!$ を追加すれば表示できるようになりました.

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{charter}
\begin{document}
chass\'{}$\!\!\!$e du G\"{}$\!\!\!$obe
\end{document}

なお,Type1 フォントの合成済字形(これが seac を使っている)でなくて,TeX 上の合成で事足りるのであれば,アクセント自動置換をごまかして TeX 上の合成を強制することにすればよいでしょう.(アクセント合成済文字を避ける を参照)

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{charter}
\begin{document}
chass\'{\empty e} du G\"{\empty o}be /
CHASS\'{\empty E} DU G\"{\empty O}BE
\end{document}

注意点

upLaTeX + dvipdfmx で波ダッシュ「〜」(U+301C) が 全角チルダ「~」(U+FF5E) で表示される

map ファイルの UniJIS-UTF16-H を unicode に変更するか,ソース中に \AtBeginDvi{\special{pdf:mapline uprml-h unicode :0:msmincho.ttc}} を追加することで解決できます.

PNG 画像を取り込むと色が変わってしまうことがある

Photoshop 等のバグです. PNG ファイルを一度 ImageMagick の magick コマンドを通しておくことで回避できます. 問題の画像を foo.png とするとき,

$ magick foo.png foo_c.png

として,できた foo_c.png の方を取り込みます.

現在わかっているこの現象の発生条件は「取り込む PNG 画像が cHRM チャンクを持ちかつ gAMA チャンクを持たないこと」です(正確にはこれに加えて iCCP, sRGB チャンクも持たないこと). Adobe 製品で出力した PNG が該当することがあるようです.

チャンクの情報を調べるには,ImageMagick の identify コマンドが便利です.

$ identify -verbose foo.png
Image: foo.png
  Format: PNG (Portable Network Graphics)
  Mime type: image/png
...
  Properties:
    date:create: 2015-05-18T08:31:39+09:00
    date:modify: 2015-05-18T08:31:39+09:00
    png:bKGD: chunk was found (see Background color, above)
    png:cHRM: chunk was found (see Chromaticity, above)
    png:gAMA: gamma=0.45454544 (See Gamma, above)
...

このように,埋め込まれているチャンクの情報が表示されます. もし png:cHRM がありかつ png:gAMA がない場合は発生条件にあてはまるため,色が変わる可能性があります. 一度 magick を通すと gAMA チャンクが付加されるため,正しく取り込まれるようになります.

(注意)sRGB チャンクについては,

    png:sRGB: intent=0 (Perceptual Intent)

という表示があっても実際には埋め込まれていないことがあるようです(詳細要調査).

問題の背景には,PNG 画像のガンマ補正機能があります. PNG には制作環境の情報を埋め込むことで,異なるディスプレイ環境でも色の変化を軽減するように補正する機能があります. この補正のための情報が cHRM チャンクと gAMA チャンクに書き込まれます. PNG の仕様書では,ガンマ補正値のデフォルト値は規定されず,cHRM チャンクがある場合は gAMA チャンクも書き出すべきとなっているのですが,ソフトウェアの設定によっては cHRM チャンクだけが書き込まれることがあります. この場合,デコードの際に予期しないガンマ値で補正されてしまうことがあります. 実際に,Adobe 製品などでは PNG のガンマ値のデフォルトが 2.2 (一般的な CRT モニタの値で Windows や最近の Mac の標準)であると仮定して出力しますが,dvipdfmx では gAMA チャンクがない場合にガンマ値を 1.0(PDF のデフォルト値)として出力してしまいます. このため,色調に変化が生じてしまいます.

なお,ICC プロファイルや sRGB チャンクが埋め込まれている場合はそちらの情報が優先されるため,この問題は発生しません.

PDF 画像が意図しない方向に回転してしまう(原因は /Rotate に非対応であること)

Adobe Acrobat Pro や Preview.app を使用して PDF を回転させた場合や,Acrobat Distiller や Ghostscript を使用して作成した PDF ファイルの一部で

dvipdfmx:warning: << /Rotate 90 >> found. (Not supported yet)

という警告が出て,ビューアで見た場合と異なる向きに回転して PDF 画像が取り込まれることがあります. これは,PDF の中に書かれている /Rotate という回転の命令に dvipdfmx が非対応であるためです. バージョン 20170806 以降では /Rotate に対応しています.XeTeXも xdvipdfmx-20170806 に対応したものであれば,/Rotate に対応します. TeX Live では TeX Live 2018 になります.W32TeX の場合には,dvipdfmx, XeTeX が 既にアプデートされており,/Rotate を含む PDF イメージのとりこみに関して, pdfTeX と互換になっています.

現状で有効な対処法として

が考えられます.

PDF-1.5 以上の図を取り込めない場合がある(2014/08/14 以前の dvipdfmx の場合;原因は /DecodeParms)

TeX Live 2014 以前,W32TeX [2014/08/14] 以前の dvipdfmx では,PDF-1.5 以上の一部のファイルについて

** WARNING ** Streams with DecodeParams not supported.
** WARNING ** Cannot parse cross-reference stream.
** WARNING ** Error while parsing PDF file.
** WARNING ** ./hoge.pdf does not look like a PDF file…

という警告を吐いて取り込みに失敗することがありました. これは「dvipdfmx が解釈する必要のある領域に /DecodeParms がある PDF ファイル」に dvipdfmx が未対応だったことによるものです. 2014/08/14 の修正でそのような PDF ファイルにも対応しましたので,以降の W32TeX および TeX Live 2015 以降では問題なく取り込むことができます.

dvips, dvipdfm, dvipdfmx で \scalebox を使用した場合に dvipdfmx の縦組時のみ他のドライバと挙動が異なる

これは,graphics/x パッケージの dvipdfm ドライバでは dvips 互換な PostScript specials を用いるのに対し,dvipdfmx ドライバ は PDF 用 specials を用いるように改良されていることが原因です. ZR さんによるパッチ(pxtatescale パッケージ)を読み込むと解決できます.

関連リンク

ライセンス

GPLv2

ChangeLog


*1 ただし,完全に同じというわけではありません.W32TeX には dvipdfmo というプログラムも存在し,そちらは完全に古い dvipdfm と同じ動作をします.

Last-modified: 2018-05-25 (金) 15:43:08 (26d)