dvipdfm Japanese patch - Troubleshooting

05 Oct 2001

目次


詳細を表示する

-v-vv オプションを付けると詳細が表示されます。 v の数が多くなるほど (255 個まで) より詳しい情報が出力されます。

Kpathsea ライブラリ

古いバージョンの kpathsea ライブラリでは設定ファイルやマップファイルがうまく読み込めないようです。 土谷さんのページ にあるパッチを参考にして修正を行なって下さい。

kpathsea については http://www.tug.org/kpathsea/ を参照して下さい。

Ghostscript に関連した問題

表示できない
日本語を含む PDF ファイルを表示させるには CID-keyed font への対応が必要なので、 これらへの対応が十分ではない古いバージョンの Ghostscript (5.x とそれ以前) では見る事はできません。 CID-keyed font に対応した Ghostscript をインストールしたからといってすべての和文 PDF ファイルを表示することができるとは限りません。

実際に dvipdfm で生成された PDF ファイルを表示するとき、 素の Ghostscript 6.x, 7.0 や Ghostscript-6.x + VFlib パッチ + jpdf パッチ では

/undefined in /H
と言われて終了してしまいます。 これは H という名前の CMap (大雑把にいうとエンコーディング) を理解できないためです。 この場合、H という CMap リソースを追加する必要があります。

以下の手続きを行なって下さい:

  1. CMap リソースファイルを ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/ から取得します。 必要なのは aj14.tar.Z, aj20.tar.Z です。 aj20.tar.Z の方は今の場合は必要ありません。 PDF 1.4 までで最低限必要な日本語用 CMap は aj14.tar.Z に含まれています。 また、Acrobat Reader 用アジアフォントパックにも含まれていますが、 これらはバージョンが違ったりするだけで中身はほとんど同じようです。
  2. 適当なディレクトリ ${GS_RESOURCE_DIR} (例: /usr/local/share/ghostscript/Resource) を作り、そこに CMap というディレクトリを作ります。
  3. 取得したファイルを展開し、aj14/CMap, aj20/CMap にできるファイルを先ほど作ったディレクトリ ${GS_RESOURCE_DIR}/CMap に移します。
  4. ghostscript の配布物に含まれる gs_res.ps (FreeBSD だと /usr/local/share/ghostscript/${GS_VERSION}/lib あたり) で
    pssystemparams begin
      /FontResourceDir (/Resource/Font/) readonly .forcedef   % pssys'params is r-o
      /GenericResourceDir (/Resource/) readonly .forcedef     % pssys'params is r-o
      /GenericResourcePathSep (/) readonly .forcedef        % pssys'params is r-o
    end
    
    となっている部分の /Resource${GS_RESOURCE_DIR} が指すディレクトリ名に置き換えます。

GNU Ghostscript 6.51 がでたことですし、 gs-cjk のことも考えると Ghostscript-6.x や 7.x へ移行すべきでしょう (pdfwrite の日本語対応は充分ではないですが)。

縦書き
バージョン 7.0 までの Ghostscript は縦書き PDF への対応は完成していません。 6.5 までのものはアンチエイリアスをかけると横になったりします。 また、いくつかのオペレータの実装もおかしいです。
フォント
Ghostscript 7.0 では PostScript から PDF への変換で CID フォントを埋め込むようになっていますが、バグがあって生成された PDF ファイルをビューアで開くと OS ごとクラッシュさせる可能性もあります。 角藤さんが配布しておられる Windows 版で比較的新しいものはパッチがあててあるので大丈夫です。 dvipdfm ではデフォルトで PostScript の取り込みの際に Ghostscript に PDF への変換を行なわせるように設定されていますが、 日本語が使用されている場合は注意が必要です。

Ghostscript 6.x とそれ以前のものでは和文フォントはいわゆるビットマップフォントになります。

`しおり' が文字化けする

Unicode への変換が必要です。 hyperref パッケージを使う場合は out2uni を使って下さい。

英語版の Acrobat Reader や Unicode に対応していないプラットフォームでは日本語で書かれた `しおり' を読む事はできません。

画像の取り込み

取り込みが可能な外部ファイルのフォーマットは EPS, PDF, JPEG, PNG です。 特に dvipdfm と相性が良いのは MetaPost で生成された EPS と JPEG, PNG で、比較的単純な PDF でも多くの場合はうまくいきます。 複雑でスケーラブルである必要がないものはむしろ割り切って高解像度の PNG や JPEG にした方がファイルサイズなどの点も含めて有利です。

JPEG, PNG, PDF を取り込むにはあらかじめ dvipdfm 附属の ebb というプログラムで BoundingBox を記述したファイルを生成する必要があります。 例えば foo.jpg という JPEG 画像を取り込むには

% ebb foo.jpg
として (foo.bb が生成される)、LaTeX で
\usepackage[dvipdfm]{graphicx}
.....
\includegraphics[width=72mm,height=50mm]{foo.jpg}
.....
のようにします。 前もって graphics パッケージが dvipdfm に対応していることを確認して下さい:
% grep dvipdfm `kpsewhich graphics.sty`
\DeclareOption{dvipdfm}{\def\Gin@driver{dvipdfm.def}}
% kpsewhich dvipdfm.def
/usr/local/share/texmf/tex/latex/graphics/dvipdfm.def
もし対応していないのであれば、dvipdfm の配布物に含まれる dvipdfm.defgraphics.sty がインストールされているところに置いて graphics.sty
\DeclareOption{dvipdfm}{\def\Gin@driver{dvipdfm.def}}
を追加します。

EPS は問題を生じやすいので PostScript (EPS) にあまりこだわらない方が良いでしょう。

取り込まれた画像は Linux 版 Acrobat Reader を 16-bit color で使っている場合に表示が乱れることがありますが、 これは Acrobat Reader のバグで dvipdfm の責任ではありません。

EPS の取り込み
EPS などの図の取り込みでは EPS ファイルは ghostscirpt で PDF へ変換されます。 ghostscipt は多バイトフォントは常にビットマップにフォントに変換してしまいます。 日本語を使っていないつもりでもアプリケーションによっては、 例えば Helvetica と Ryumin-Light-H を合成して Helvetica-Ryumin というフォントを定義して使う、 ということをやったりするので Helvetica すらビットマップにされてしまう事があります。

gnuplot の `PLUS-enhanced patch' を使う場合にこれを防ぐには、出力の前に

gnuplot> set locale ""
として下さい。

日本語関連で問題が生じたら gs-cjk を試してみて下さい。

PDF の取り込み
Ghostscript 6.x で作られたものはほぼ問題ないのですが、 PDF を作成したアプリケーションによってはうまくいきません。

メッセージに

<PDF> Invalid PDF name "#82l#82r#83S#83V#83b#83N"
がでる場合は # を通すパッチ (patch-pass-numbersign.diff) でなんとかなると思います。

PDF ファイルが

<< /Type /Page (略) /Contents [ (略) ] (略) >>
のよう ([ (略) ] のところ) になっていたらいまのところダメです。 ページの内容を分割しないようにアプリケーション側で設定できるのでしたらうまくいく可能性があります。 あるいは、 Content streams をひとまとめにするパッチ (patch-concat-stream.diff) でなんとかなるかもしれません。

dvipdfm は独自の PDF パーサが PDF ファイルを処理して、 1 ページ目の内容を PDF の Form XObject として取り込むように試みます。 複雑な PDF だと取り込みに失敗するか、 壊れた PDF を生成してしまうかもしれません。

MetaPost
MetaPost から生成される PostScript ファイルは構造がシンプルなので dvipdfm 内部で PDF へ変換を行なって取り込むことができます。
% mpost foo.mp
とすると foo.n (n は 整数) をいう名前の PostScript ファイルが生成されるので、 これを foo.eps のような名前に直して普通に
\includegraphics{foo.eps}
として DVI ファイルを作ります。 あとは dvipdfm が自動で処理してくれます。

フォントは TeX のフォントと同じような扱いになるので、 図と本文のフォントをあわせたい方は特にお勧めです。

画像を取り込むとサイズが大きくなる
大きな画像を取り込むと Distiller で処理した場合などに比べてファイルサイズが大きくなる場合があります。

これはダウンサンプリングを全く行なわないためです。 ほかのアプリケーションで出力装置の解像度にあわせて画像の解像度を調節する必要があります。

新しくフォントを加える

利用可能な和文フォントを追加するには cid.h を編集してコンパイルしなおす必要があります。 詳しくは cid.h 中のコメントや Adobe の PDF Reference を参照して下さい。 もちろん加えたからといってフォントが埋め込まれるわけではありません。

いくつかのフォントに関する情報が必要です。 下の表を参考にしてフォントファイル (または AFM ファイル) から情報を取得して下さい。 TrueType/OpenType フォントでは得ることが困難なものもあります。
KeyPostScript Type1TrueType/OpenType
SubtypeCIDFontType0 を与えるCIDFontType2 を与える
AscentAFM の 'Ascender''OS/2' テーブルの 'sTypoAscender'
CapHeightAFM の 'CapHeight' `H' の高さを計る ?
DescentAFM の 'Descender''OS/2' テーブルの 'sTypoDescender'
Flags Symbolic に必要に応じて Serif, Italic, FixedPitch などを加える程度でよい Symbolic に必要に応じて Serif, Italic, FixedPitch などを加える程度でよい
FontBBoxAFM の 'FontBBox''head' テーブルの 'xMin', 'xMax', 'yMin' および 'yMax'
FontNameAFM の 'FontName' などから'name' テーブルから
ItalicAngleAFM の 'ItalicAngle''post' テーブルの 'italicAngle'
StemVPrivate Dictionary の '/StdVW' から 大雑把な値は 'OS/2' テーブルの 'usWeightClass' から (usWightClass/65)**2+50 程度らしい

TrueType/OpenType で長さを示す sTypeAscender, sTypeDescender, xMin, xMax, yMin, yMax は PDF のユニットに変換します。 TrueType での値 xTTF は 'head' テーブルにある 'unitsPerEm' の値から、 xPDF = 1000 * xTTF / unitsPerEm で変換されます。

その他に付加的なものですが、/Style に /Panose を加えることが推奨されます。 これがないとフォントの代用がうまく行なわれません。 いくつかのフォントでは、 ゴシックの場合は 0801 (Sans Serif, IBM Neo-grotesque Gothic) で、 明朝などの場合は 0105 (Oldstyle Serif, Dutch Modern) などで始まっているようです。 Windows 用 TrueType フォントの場合は 'OS/2' table にある 'sFamilyClass' と 'PANOSE' を連結してそのまま持ってくると良いでしょう。 私はよく分からないので、詳細は Microsoft の OpenType Spec. から見つけて下さい。

Ghostscript ではフォントの代用が自動的には行なわれないので注意して下さい。 多くの場合、Courier になって文字化けしてしまいます。 同じような環境間で文書をやりとりする場合にのみ有効です (特に Mac ?)。

フォントを埋め込みたい場合は `開発版' を取得して開発に協力して下さい。

より良い PDF を作る

数学記号など特別な文字を使わなかったり書体にあまりこだわらないのであれば、 Times, Helvetica, Courier など 13 種類 (14?) ある PostScrip 標準フォントを使うようにしましょう。 これらのフォントは PDF ファイルに埋め込む必要がないため、 場合によってはファイルサイズを大幅に小さくすることができます。 PDF 仕様に準拠したビューアはファイルに字形データが埋め込まれていなくともこれらのフォントを描画できなければなりません。 さらにほとんどすべての PostScript プリンタはこれらのフォントを内蔵しています。

Times 系フォントは TeX で標準的に利用される Computer Modern フォントと比べると線幅が一様で太いのか、 ディスプレイ上でよりはっきりと見えることが多いようです。 数式も使う場合で本文と数式中の文字の見た目をあわせたければ TX フォントを使うといいと思います。

使い方は以下のページを参照して下さい:

TeX 標準の Computer Modern はディスプレイ上では見づらい場合が多いと思います。

dvipdfm は PostScript Type1 や TrueType フォントを埋め込むと、 (他のアプリケーションと比べて) ファイルサイズが大きくなる傾向があります。

Mac OS X

Mac OS X の PDF ビューアは和文フォントの代替がうまくいかず、 cid.map をデフォルトのまま
rml Ryumin-Light
gbm GothicBBB-Medium
で使うと生成された PDF はうまく表示できなくなるそうです。

Acrobar Reader を使うのであれば、cid.map

rml HeiseiMin-W3
gbm HeiseiKakuGo-W5
にすれば (`Darwin-jp なページ' にあるものは既にこの修正が行なわれています) 見ることはできますが、今度は OS 附属のビューアで見れなくなるそうです。

ヒラギノのエントリも加えようかと思ったのですが、 フォントそのものがどういうものか分からないのでちょっと手がだせません。 Web 上で拾った PDF に埋め込まれていたものは Registry-Ordering (文字集合) が Adobe-Japan1 ではなかったのですが (判別不能な文字列)、 どうなっているのでしょうか。


Index