画像形式と取り込み

論文や書籍に写真・グラフ・図面を載せるには、外部の画像ファイルを文書に取り込みます。その入口が graphicx パッケージの \includegraphics 命令です。このページでは、取り込みの基本構文と拡大・回転・切り抜きといったオプション、画像探索パスの設定、そして「どの形式をどのエンジンが読めるか」を整理します。鍵になるのは、ベクタとラスタという画像の二系統と、使う TeX エンジンによって受け付ける形式が違うという二点です。

graphicx と \includegraphics

画像の取り込みは、標準の graphicx パッケージが担います。プリアンブルで \usepackage{graphicx} と読み込み、本文では \includegraphics[オプション]{ファイル名} と書きます。graphicx は古い graphics パッケージを拡張したもので、オプションを キー=値 の形でまとめて与えられるのが特徴です。どちらも LaTeX 標準の latex-graphics バンドルに含まれ、別途インストールは要りません。

document.tex
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics[width=0.6\textwidth]{plot}
\end{document}

ここで覚えておきたいのが、ファイル名から拡張子を省く ことです。上の例では plot.pdfplot.png があれば、LaTeX がエンジンに応じて適切な形式を自動で選びます。拡張子を書いてしまうと別の形式に差し替えづらくなり、plot.tar.gz のように名前にピリオドを含むファイルでは解釈を誤ることもあります。同じ理由から、画像のファイル名には空白やピリオドを使わない のが安全です。

画像が別フォルダにある場合は、\graphicspath で探索パスを足せます。**ディレクトリ名は一つずつ波括弧で囲み(一つしかなくても囲む)、末尾に必ずスラッシュ / を付け(Windows でも /)** ます。LaTeX はまずカレントディレクトリを見て、その後に並べたディレクトリを順に探します。空白を含むパスは {"my figures/"} のように引用符でくくります。

latex
\usepackage{graphicx}
\graphicspath{ {figures/} {../shared-figures/} }

大きさ・回転・切り抜きのオプション

\includegraphics の角括弧には、キー=値の形でオプションを並べます。実務でほぼ必須なのが大きさの指定です。width=height= は出力上の幅・高さを直接与えるもので、\textwidth(本文の幅)や \linewidth を基準に width=0.8\textwidth のように書くと、版面に合わせて伸縮できます。scale= は元の寸法に対する倍率です。

width=height=両方 指定すると縦横比が崩れて画像が歪みます。それを防ぐのが keepaspectratio で、これを付けると与えた幅・高さに「収まる範囲で」縦横比を保ったまま拡大縮小します。画像を回転させたいときは angle= に反時計回りの角度(度)を与えます。たとえば angle=90 で 90 度回転です。

画像の縁を切り落とす(トリミングする)には trim=clip を組み合わせます。trim には 左・下・右・上 の順に四つの値を与えます(直感的な上下左右ではない点に注意)。既定の単位は bp(ビッグポイント) です。そして **clip を必ず添える** こと。clip がないと、切り取ったはずの部分が消えずに周囲の本文へはみ出してしまいます。負の値を与えると、逆に余白が足されます。絶対座標で切り抜き範囲を指定する viewport= もあります。

latex
% 幅を本文幅の半分に
\includegraphics[width=0.5\textwidth]{photo}

% 縦横比を保って枠に収める
\includegraphics[width=8cm,height=5cm,keepaspectratio]{photo}

% 反時計回りに 90 度回転
\includegraphics[angle=90,width=6cm]{diagram}

% 左20 下20 右30 上10(bp) を切り落として表示
\includegraphics[trim=20 20 30 10,clip,width=6cm]{scan}

オプションは表のように整理できます。実際にはこれらを組み合わせて使うことがほとんどです。

オプション働き
width=出力上の幅。0.8\textwidth のように相対指定が便利
height=出力上の高さ
scale=元の寸法に対する倍率(scale=0.5 で半分)
angle=反時計回りの回転角(度)
keepaspectratio幅・高さ両指定時に縦横比を保って収める
trim= … clip左・下・右・上を切り落とす。clip 必須、既定単位 bp
page=複数ページ PDF から取り込むページを選ぶ

ベクタとラスタ

取り込む画像は大きく二系統に分かれ、どちらを選ぶかが仕上がりを左右します。ベクタ画像 は点・線・曲線・文字を数式的な座標で記述したもので、PDF・EPS・SVG が代表です。拡大しても輪郭が数式から再計算されるため、どこまで拡大しても くっきり したままで、文字も鮮明です。ラスタ画像(ビットマップ) は色のついた画素(ピクセル)を格子状に並べたもので、PNG・JPEG が代表です。拡大すると一つひとつの画素が大きくなり、輪郭が ギザギザ になったりぼやけたりします。

原則はこうです。グラフ・線図・回路図・数式入りの図など「線と文字でできた図」はベクタ(PDF/EPS/SVG) で。印刷時の解像度に依存せず、紙でも画面でも常に最良の品質になります。一方 写真やスクリーンショットなど「連続的な階調の画像」はラスタ(PNG/JPEG) で。写真をベクタにしても利点はなく、ファイルが無駄に肥大します。ラスタを使うときは、印刷に耐える解像度(一般に 300 dpi 以上)の元データを用意してください。LaTeX で図を生成するなら(TikZ や pgfplots など)、出力は自然とベクタになります。

PNG と JPEG の使い分けにも触れておきます。JPEG は写真向けの非可逆圧縮で、ファイルは小さくなりますが、線画や文字の縁に圧縮ノイズが出ます。PNG は可逆圧縮で、スクリーンショットや単色の図、透明度が必要な画像に向きます。迷ったら、写真は JPEG、それ以外のラスタは PNG が無難です。

エンジンごとに読める形式

ここが最もつまずきやすい点です。\includegraphics が受け付ける形式は、どの TeX エンジンで処理し、最終的にどのドライバで出力するか によって変わります。現代の主流である pdfLaTeX・LuaLaTeX・XeLaTeX(PDF を直接出力する経路)は、PDF・PNG・JPEG をそのまま 取り込めます。しかし、これらは EPS を直接は読めません。一方、古くからの **latex + dvips(DVI を経由する経路)は、逆に EPS をそのまま** 扱える代わりに PDF や PNG は不得手です。

日本語でよく使う pLaTeX / upLaTeX は DVI を出し、dvipdfmx で PDF に変換します。この経路では PDF・PNG・JPEG・EPS を扱えます。ただし、PNG・JPEG・PDF については画像の寸法情報(バウンディングボックス)を記した補助ファイル(.xbb)が要ることがあり、extractbb というツールで生成します。また pLaTeX/upLaTeX で graphicx を使うときは、**どのドライバで出力するかを \usepackage[dvipdfmx]{graphicx} のように明示** するのが安全です(pdfLaTeX などでは自動判別されます)。

処理経路直接読める形式EPS は
pdfLaTeXPDF・PNG・JPEG直接は不可。epstopdf で変換
LuaLaTeXPDF・PNG・JPEG直接は不可。epstopdf で変換
XeLaTeXPDF・PNG・JPEG直接は不可。epstopdf で変換
pLaTeX/upLaTeX + dvipdfmxPDF・PNG・JPEG・EPS可(要バウンディングボックス)
latex + dvipsEPS(PostScript 系)これが本来の形式

実務上の結論はシンプルです。新規に始めるなら、図は PDF・PNG・JPEG のいずれかで用意 すれば、pdfLaTeX・LuaLaTeX・XeLaTeX・dvipdfmx のどれでもそのまま通ります。EPS や SVG しか手元にない場合に、次の二節の変換が必要になります。処理経路そのものの詳細は「処理方式と処理の流れ」のページを参照してください。

EPS と SVG を取り込む

EPS(Encapsulated PostScript) は古くからのベクタ形式で、学会の旧い投稿規定などで今も求められます。pdfLaTeX などで EPS を使うには PDF への変換が要りますが、**epstopdf パッケージ を読み込んでおけば、コンパイル時に EPS が自動で PDF に変換され、そのまま取り込まれます。仕組みは、graphicx の処理に割り込んで Ghostscript で変換し、同名の PDF が既にあれば変換を省く、というものです。この自動変換には外部プログラムの実行が必要なので、--shell-escape(または -shell-escape)を付けてコンパイル します。EPS そのものを扱う場合は、画像の範囲を示す BoundingBox** がファイル先頭に正しく記述されている必要があります。

latex
\usepackage{graphicx}
\usepackage{epstopdf}  % EPS をコンパイル時に PDF へ自動変換
% コンパイル例: pdflatex --shell-escape main.tex

SVG は Web で標準的なベクタ形式ですが、TeX エンジンが直接読める形式ではありません。取り込むには **svg パッケージ** を使います。これは \includesvg{ファイル} 命令を提供し、内部で Inkscape のコマンドライン機能を呼んで SVG を PDF(DVI 出力時は EPS)に変換します。さらに、SVG 内の文字を別ファイルに書き出し、それを LaTeX 側で組むため、本文と同じフォントで文字が綺麗に出ます。Inkscape を呼ぶため、こちらも **--shell-escape が必須** で、Inkscape のインストールも要ります。手動なら、Inkscape や各種ツールで SVG を PDF に変換しておくのが確実です。

逆向きの変換、つまり TeX の出力から SVG を生成 したいときは **dvisvgm** が使えます。これは DVI(および EPS・PDF)を SVG に変換するツールで、pTeX の縦組み DVI や XeTeX の XDV にも対応し、必要なフォントの字形を SVG に埋め込みます。数式や図を単体の SVG にして Web に載せたい、といった用途で重宝します。

figure 環境と、つまずきどころ

\includegraphics は画像をその場に 貼るだけ で、番号もキャプションも付けません。論文では普通、画像を **figure 環境 に入れて「図」として扱います。すると LaTeX が、ページの都合に合わせて図を適切な位置へ 自動配置(フロート)** し、\caption{…} で番号付きの説明を付け、\label\ref で本文から「図 3 を参照」のように参照できるようになります。

latex
\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.7\textwidth]{plot}
  \caption{測定値と理論曲線の比較。}
  \label{fig:plot}
\end{figure}

図~\ref{fig:plot} に示すように……

フロートの配置や [htbp] の意味、複数の図を横に並べる方法は「フロートと配置」、キャプションの体裁やサブ図は「キャプションとサブ図」のページで詳しく扱います。ここでは、図の取り込みでよく出会う落とし穴を挙げておきます。

  • 形式の取り違え: pdfLaTeX などに EPS を渡すと「Cannot determine size of graphic」等で止まる。図を PDF/PNG/JPEG にするか、epstopdf で変換する。
  • EPS の BoundingBox: BoundingBox 行が無い・誤っていると正しく配置されない。ps2epsepstool で修正する。
  • 複数ページ PDF: 既定では 1 ページ目だけ取り込まれる。page= で取り込むページを選ぶ(文書まるごとなら pdfpages パッケージ)。
  • PDF の余白: 図の PDF に余白が多いと図が小さく見える。pdfcrop(CTAN)で余白を切り詰めておく。
  • ファイル名の空白・ピリオド: パスや名前に空白やピリオドがあると失敗しやすい。名前を直すか、空白入りパスは引用符でくくる。
  • 拡張子の書きすぎ: 拡張子を明示すると形式の差し替えが効かない。原則は拡張子なしで書く。