TeX で画像を貼り込む場合,PDF ファイルを利用することができます. 直接 PDF ファイルを書き出すことができない Windows のアプリケーション (Excel, PowerPoint など)から PDF を作成するためには,PostScript プリンタドライバを使う手があります. 印刷機能を利用して EPS を出力して PDF に変換してしまおうというわけで,以下のような手順で自動化しておくと便利です.なお,ここでは Windows 10 を想定していますが,他の Windows でも手順は同様です.W32TeX や TeX Live および Ghostscript がすでにインストールされ,PATH が通っていることを前提とします.
EPS の BoundingBox を自動設定とPDF変換をするための準備として,RedMon をインストールします. これは,プリンタドライバの出力を任意のプログラムにリダイレクトするためのものです.
EPS の BoundingBox を自動設定するソフト, ps2eps および EPS を PDF に変換する epstopdf を使用可能にします. ps2eps および epstopdf 自体は W32TeX や TeX Live に含まれていますが,元々が Perl スクリプトなので,Strawberry Perl などの Perl 処理系をインストールしておきます(※TeX Live には tlperl が入っている).
プリンタドライバ経由で EPS を作成するために,PostScript プリンタをインストールします.
「プリンターのプロパティ」から,PostScript オプションで 出力データの形式を EPS に設定します.
作成した RedMon のポート ("RPT1:" など)の設定をして, PS プリンタドライバの出力が ps2eps および epstopdf に引き渡されるようにします. ただし,設定には管理者権限が必要ですので,スタートメニューの「Windows システムツール」→「コマンドプロンプト」を右クリックし,「その他」→「管理者として実行」でコマンドプロンプトを起動したのちに,
rundll32 printui.dll,PrintUIEntry /n "Ghostscript PDF" /pとしてPS プリンタのプロパティ画面を出します(プリンタ名を変えているときは "Ghostscript PDF" の部分を適宜変更). そして,「ポート」→「ポートの構成」で
cmd.exe
/c cd %TEMP% & ps2eps.exe -l -f | epstopdf.exe --filter --outfile="%1"
などと設定すればよいでしょう. また,"Run as User" にもチェックを入れておきます(デフォルトでチェックされている).オプションはお好みで(ps2eps のマニュアルを参照).
新たに設定された PATH などが有効になるよう再起動します.
実際に PDF を作るためには, アプリケーションソフトから上記で設定したプリンタに印刷を行います. このとき,用紙設定が縦 (portrait) になっている必要があります. 横 (landscape) だとうまくいきません. 用紙設定を縦に設定した PowerPoint ファイルや LibreOffice Draw ファイルなどに (一時的に)コピー&ペーストしてもよいでしょう. また,1ページ分だけを印刷する必要があります. あとはダイアログで EPS のファイル名を指定すれば OK です.
このようにすれば,印刷機能を持つほぼすべてのアプリケーションが, PDF 出力対応になります. できた PDF ファイルは,おおむね問題なく graphicx パッケージなどを 使って TeX の文書に取り込め,dvipdfmx などで処理可能です.
うまく PDF が作成できない場合は,再び管理者権限でプリンターのプロパティを開き,「ポート」→「ポートの構成」→「Log File」でログファイルを作成するようにすれば,どんなエラーが発生しているかを調べて対策することができます.
<参考>ローマ数字や丸囲み数字などのいわゆる「機種依存文字」は 各方面で忌み嫌われているわけですが, 諸般の事情でこれを使わざるを得ないことがあります. PDF は各種エンコーディングをサポートしているため,機種依存文字も Acrobat Reader を用いれば問題なく表示できるようです. 例えば Windows 上で機種依存文字の入った文書を Acrobat Distiller などで PDF 化すれば,(例えば)Linux 上の Acrobat Reader でも文字化けなしに 読むことができます.
しかし,TeX の文書を dvips(k) を用いて PS を作り,それを Distiller で PDF に変換する場合は,ふつうだと機種依存文字は(PS を作る段階で) 落ちてしまうようです.これについては以下のような回避手段があるようです.
Windows の場合,DVIOUT から直接 Distiller プリンタなどに出力することで, PDF を作成できます.この場合,機種依存文字は問題なく PDF 化できますが, 英文フォントに TrueType フォント(Bakoma フォントなど)を使用するように 設定していない場合は,英文フォントがビットマップ化されてしまい 美しくありません.
Windows の場合,以下のようにすることで dvips でも,機種依存文字を含む PS ファイルを生成できます. それを Distiller で変換すれば,望みの PDF を得ることが可能です.
以下では角藤版 Windows 用 pLaTeX2e を想定しています.
%TEXMF%/dvips/config/psfsjis.map
を書き換えて,新しいマップファイルを作成します. 具体的には,
rml Ryumin-Light-RKSJ-H rmlv Ryumin-Light-RKSJ-V gbm GothicBBB-Medium-RKSJ-H gbmv GothicBBB-Medium-RKSJ-V
をコメントアウトし,
%rml Ryumin-Light-90ms-RKSJ-H %rmlv Ryumin-Light-90ms-RKSJ-V %gbm GothicBBB-Medium-90ms-RKSJ-H %gbmv GothicBBB-Medium-90ms-RKSJ-V
のコメントアウトを外します.新しいマップファイルは psfsjiswin.map などという名前で保存しておきます.
適当な場所(カレントディレクトリなど)に下記のアーカイブから展開した vf ファイルを置きます.
vf ファイルのアーカイブ
(注:このアーカイブに含まれていないフォントを使用する場合は
vf ファイルを別途作成する必要があると思います)
以上の準備の上で,以下のようにして dvi ファイルから PS を作成します.
# dvips -SJIS -u psfsjiswin -P pdf sample.dvi
生成された PS ファイルを distiller にかければ,望みの PDF (サンプル)ができあがるはずです.
<参考>
以前は画像の圧縮方法を適切にするための tips が必要でしたが, 最近の Ghostscript では,dvipdfmx の設定ファイル (dvipdfmx.cfg) で,
D "rungs -q ..."の行の,
-dAutoFilterGrayImages=false -dAutoFilterColorImages=false -dGrayImageFilter=/FlateEncode -dColorImageFilter=/FlateEncodeの部分を
-dAutoFilterGrayImages=true -dAutoFilterColorImages=true
と Ghostscript の起動オプションを変更すればよくなったようです.ただし,まだ Distiller ほど圧縮方法の選択は適切でないかもしれません.
<参考>
複数の PDF ファイルを結合したり, 特定のページを抽出したりしたいことがよくあります. Acrobat があれば可能ですが,フリーソフトで済ませたい, あるいはコマンドラインから操作したい,という場合には pdftk を使うのが良さそうです.
具体的には,下記のようにすれば OK です. それぞれ,PDF の結合,ページ抽出,ウォーターマーク付加の例です.
# pdftk bar1.pdf bar2.pdf cat output foo.pdf # pdftk bar.pdf cat 1-3 output foo.pdf # pdftk bar.pdf background bg.pdf output foo.pdf
なお,ConTeXt でも同じようなことができます.以下はそれぞれ PDF の結合,ページ抽出,2-up 化の例です (場合によって,オプションを補う必要があるかもしれません).
# texexec --pdfarrange --result=foo.pdf bar1.pdf bar2.pdf # texexec --pdfselect --selection=1,2,3 --result=foo.pdf bar.pdf # texexec --pdfcombine --combination=2*1 --paper=a4,landscape --nobanner --result=foo.pdf bar.pdf
ConTeXt は 角藤版 Win32TeX の配布 にも含まれています.なお,PDFjam なるソフトも使えるようです.
<参考>
PDF にはタイトルや著者,キーワードなどのメタデータを書き込むことができます (pdfmark の DOCINFO). 検索エンジンなどを使う上で,何かと便利です. Acrobat でも自由に書き込むことができるのですが, これをやると PDF のバージョンが強制的に 1.5 (Acrobat 6 Standard の場合)になってしまうようです. これでは不便なことがありますので, 別の方法で書き込むことを考えます.
tex のソースファイルの先頭の方に
{\special{! /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse [ /Author (誰々) /Title (何とかかんとか) /Subject () /Keywords () /DOCINFO pdfmark }}
と書いておく.コンパイルして DVI ファイルを作成した後に,
# dvips -Ppdf -f -z -t a4 foo.dvi | bkmk2uni > foo.ps
として PS ファイルを作り,これを Distiller にかけることで DOCINFO の入った PDF ができる.ただし,dvips の出力に非 ASCII コードが入っている場合(Binary EPS を取り込んでいる場合など),bkmk2uni が正しく動作しないこともあるようだ.なお,メタデータに日本語を使わなければ
# dvips -Ppdf -t a4 foo.dvi
で OK である.
tex のソースファイルの先頭の方に
\AtBeginDvi{\special{pdf:tounicode 90ms-RKSJ-UCS2}}% {\special{pdf:docinfo << /Author (誰々) /Title (何とかかんとか) /Subject () /Keywords ()>>}}
と書いておく.
# dvipdfmx foo.dvi
とすることで DOCINFO の入った PDF ができる.
<参考>
sam2p が使いやすいですが,JPEG ファイルを PDF に変換したら Acrobat で開けないことがありました.このときは
# sam2p -pdf:2 foo.jpg foo.pdf
とオプションを指定(PDFバージョン1.2,XObject imageを指定)することで回避できました.