PerfectVector
著者: Irene Kim2 分で読める

LaTeXでSVGを使う:形を保持し図のラベルを組版する

SVGイラストをPDF、またはPDFとLaTeXの組み合わせで配置します。ラベルの編集性とInkscapeへの依存を理解し、最終文書のPDFを確認します。

目次

LaTeXでSVGイラストを使うには、ラベルを何で描画するかを選びます。既存の文字組みが適しているなら通常のPDFを書き出します。文書のテキストと一緒にLaTeXでラベルを組版するなら、PDFとLaTeXを組み合わせる方法を使います。

svgパッケージはInkscapeによる書き出しを自動化し、その結果を取り込めます。変換をなくすのではなく、その工程を管理します。CTANのパッケージ概要は、書き出したグラフィックとLaTeXで描画する文字の分離を説明しています。

準備したイラストでは、次の修正後にも形と文言が保持されるかが重要です。SVGマスターを保持し、ラベルの扱いを決め、目的のサイズで組み立てた文書を確認します。Pythonで文書を生成する場合は、明示的なサイズ指定と完成ファイルの確認を含む、ReportLabのPDFにSVGを配置する別の手順に従ってください。

文書で使うファイルを選ぶ

要件受け渡しの経路管理するもの
既存のイラストの外観を保持する通常のPDFを書き出しgraphicxを使うSVGマスターと書き出したPDF
LaTeXで図のラベルを組版するPDFとLaTeXを書き出すSVGマスターと対応するPDF/LaTeXの組
文書のコンパイル時に書き出しを更新するInkscapeとsvgパッケージを使うSVG元データとコンパイル環境

たとえば、レンズの横にカードを描いた小さなイラストを考えます。ラベルは「Lens」と「Card」だけです。この例には寸法、測定した光線、プロット結果はありません。

レビュー担当者から「Card」を「Target card」に変えるよう求められたとします。描き直す必要はありませんが、長いラベルには空間が必要です。文字の形をトレースせずに文言を変えられるか、新しいラベルが収まるかという、有用な修正テストになります。

レンズとカードのイラストをグラフィックと文字ラベルに分け、ラベル付きの図に組み立てる図
PDFとLaTeXの分離を示す図です。描画形状とラベル文字を別々の入力として一つの図に組み立てます。組版後もラベル位置の確認が必要です。

方法1:通常のPDFを書き出す

ラベルがすでに正しく見え、文書の文字組みを継承する必要がない場合に使います。

InkscapeのPDF書き出しガイドは、File → Save a CopyからPDFを選び、文字の出力設定を選ぶ方法を説明しています。元のSVGを保持します。通常の検索可能な文字にはフォント埋め込みを確認してください。アウトライン化は字形を固定しますが、編集可能なテキストとしての役割は失われます。

例をメインの.texの隣にlens-card.pdfとして保存します。PDFを出力するLaTeXプロジェクトの基本的な取り込み方は次のとおりです。

\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics[width=0.7\linewidth]{lens-card.pdf}
\end{document}

graphicxと\includegraphicsは、Overleafの画像ガイドに記載された画像の取り込み方法です。ここでの幅はレイアウト例であり、必須の図サイズではありません。

文書に追加する前に書き出したPDFを開き、両方のオブジェクトとラベルがあることを確認します。コンパイル後も図を見ます。ページ全体では読めるラベルでも、狭い段では小さすぎる場合があります。

SVGのラベルを変えたらPDFを再度書き出します。文書が古いコピーを使い続けないよう、名前を明確にしてください。

方法2:グラフィックとLaTeXの文字を一緒に書き出す

図のラベルをLaTeXで組版する場合に使います。PDFとLaTeXの概要は、図の文字が文書の文字組みを使えるよう、描画と文字を別々に扱うことを説明しています。

InkscapeのPDF書き出しダイアログで、書き出しガイドにあるOmit text in PDF and create LaTeX fileを選びます。生成されたlens-card.pdfとlens-card.pdf_texは一緒に保持します。PDFだけ開いても、省略したラベルは見えません。

svgパッケージのマニュアル2.5節は、Inkscapeで書き出し済みのファイル用の\includeinkscapeを説明しています。メインの.texの隣に組を置き、次のように取り込みます。

\documentclass{article}
\usepackage{svg}
\begin{document}
\includeinkscape[width=0.7\linewidth]{lens-card.pdf_tex}
\end{document}

文書ビルドにSVGの書き出しを要求せず、準備した組を使います。プロジェクトを移すときは両方のファイルを保持します。

レンズとカードの例では、組み立てたラベル位置をイラストのマスターと比較します。文書のフォントが幅広いと、形状が変わらなくても「Target card」がレンズ側に押し出される場合があります。ラベル周囲に十分な空間を残し、レイアウトを仕上げる前に長い文言を試します。

文字をすでにパスに変換しているなら、それはアートワークの形状です。LaTeXで組版するには、編集可能なマスターに本物のテキストとしてラベルを保持または再作成します。SVGフォントのガイドは、テキストとアウトライン化した文字の区別を説明しています。

方法3:コンパイル中にsvgパッケージで書き出す

イラストを繰り返し編集する場合、自動化した経路が便利です。

\documentclass{article}
\usepackage{svg}
\begin{document}
\includesvg[width=0.7\linewidth]{lens-card}
\end{document}

元データはlens-card.svgです。パッケージマニュアルは、自動書き出しには動作するInkscape実行ファイルが必要だと説明し、呼び出すためのshell escapeを説明しています。信頼できるローカルプロジェクトでは、記載された実行例は次です。

pdflatex --shell-escape main.tex

shell escapeは外部コマンドを許可します。信頼できるプロジェクトのソースにだけ使います。環境で許可されない場合は、ビルド外で書き出しを準備し、前のいずれかの方法を使います。

inkscapelatex=trueは文字を分離してLaTeXで描画する設定で、既定です。Inkscapeの書き出した文字を使いたい場合は、\includesvgにinkscapelatex=falseを設定します。ラベルサイズを調整する前に、意図的に選びます。

これらは資料に記載された取り込み例です。長い文書や共有テンプレートに適用する前に、自分のプロジェクトの小さなコピーで選んだ方法を試します。

形式を変える前に不足した部分を診断する

見える状態最初の確認
SVGはあるが生成PDFがない書き出しが実行されたか、Inkscapeが使えるか、出力パスが正しいか
図はあるがラベルがないPDF/LaTeXの組のPDFだけを取り込んでいないか
ラベルが重なる、間隔が想定外文字のワークフロー、文書のフォント、ラベル用の空間
PDFでテキストのようなエラーが出る画像取り込みコマンドではなく\inputに渡していないか
余白や切れ方が想定外書き出し領域とアートワークのページ範囲

複数の設定を一度に変える前に、最初の関連するコンパイラーエラーを追います。書き出しファイルがなければディスク上を確認し、ラベルの位置が悪ければ組み立てた図を確認します。ワークフローの異なる箇所の確認です。

Overleafでは、選んだ方法に必要なファイルをアップロードします。準備済みPDFや対応する書き出しの組を使えば、コンパイル中のSVG書き出しが不要になります。ローカル、自前サーバー、ホスト型プロジェクトで同じ外部ツールが使えるとは考えないでください。

復元が必要なイラストだけを復元する

編集可能なSVGがあれば使います。数値プロットなら、作図データとソースコードから図を再生成します。数式と科学的ラベルは文字として保持します。ピクセルのトレースでは意味を復元できません。Pythonで生成した図では、MatplotlibのプロットとSVGアートワークの合成手順に従い、文書の書き出し前に別のロゴをパスとして保ちます。

ベクター化が有用なのは、元の描画がなく、単純なイラストのラスターコピーしかない場合です。コピーをアートワークに合わせて切り抜き、ラベルとデータはトレースから除きます。PerfectVectorの科学イラストのベクター化で形状をプレビューし、細い輪郭、空の穴、不要な背景領域を確認します。SVGをダウンロードし、エディターで元のラベルを別に追加して、選んだLaTeXの経路を使います。

レンズとカードの例では、復元するのは描かれたレンズやカードの輪郭です。文言はラベルの元データに属します。ベクター候補はPDF書き出しと文書取り込み後も確認が必要で、測定された形状や出版規定の承認は提供しません。

線画の準備ガイドはラスターの整理を扱います。PDFしか残っていない場合は、PDFからSVGへのガイドで既存のベクターとスキャンページを区別してからトレースします。元データのより広い選択は、画像のベクター化で復元できるものを参照してください。

組み立てた文書を確認し、元データを保持する

コピーでラベルだけの修正テストをします。「Card」を「Target card」に変え、必要なら再書き出しして、文書をコンパイルします。最終的な図の幅で綴りと配置を確認し、その後は意図した文言に戻します。

穴、細線、書き出し範囲も確認します。InkscapeのPDF書き出しガイドは、フィルター効果がラスター化される場合を説明しています。PDFという名前だけでは、見えるすべての部分がベクター形状であるとは判断できません。

編集可能なSVGと文書で使うファイルを一緒に保持します。PDF/LaTeXの組なら両方を渡します。共有予定の正確なプロジェクトコピーを開き直し、そこで図を再確認します。

よくある質問

SVGを直接includegraphicsに渡せますか? ここでの方法では、まずPDFなどの対応するグラフィック形式を書き出すか、svgパッケージでInkscapeの書き出しを管理します。パッケージも書き出したグラフィックを取り込みます。

書き出したPDFにラベルがないのはなぜですか? PDFとLaTeXの書き出しはPDFからラベルを省きます。対応するLaTeX側を取り込んで図を組み立てるか、一つの自己完結した画像が必要なら通常のPDFを書き出します。

文書をビルドするたびにInkscapeが必要ですか? 自動SVG書き出しではビルド環境に必要です。書き出し済みのPDFやPDF/LaTeXの組は、コンパイル中に書き出しを実行せず取り込めます。

LaTeX用にグラフのスクリーンショットをトレースすべきですか? 数値プロットはデータと作図の元コードから再生成します。トレースは編集可能な元データがない適切なイラストに限り、ラベルは別に管理します。

参考資料

  1. CTAN — SVGパッケージ — Inkscapeの自動書き出しと、別にLaTeXで描画する文字。
  2. Inkscape — PDFファイルの書き出し — PDFコピー、文字の出力設定、フィルター効果、書き出し範囲。
  3. Overleaf — 画像を取り込むLaTeXコード — graphicxとグラフィック取り込みコマンド。
  4. CTAN — SVGとInkscapeのワークフロー概要 — 文書の文字組みに合わせるPDFとLaTeXの方法。
  5. Falk Hanisch、Philip Ilten — svgパッケージマニュアル — 書き出し済みファイルの取り込み、自動書き出しの要件、文字描画の設定。

ラベルの組版方法を選び、文書内で一つの完成した図を検証します。ラスターイラストしか残っていなければ、ベクターアートワーク候補を準備し、形を確認してラベルを別に復元し、組み立てたPDFを確認します。

ブログのその他の記事

編集しやすい
よりきれいなSVGから始めましょう