如何在 LaTeX 中包含 SVG 图表?

如何在 LaTeX 中包含 SVG 图表?

我使用 Inkscape 将所有图表制作成 SVG 格式,然后将它们导出为其他格式(例如 PDF、EPS 或 PNG)。我编写了一个简短的脚本,可以自动完成此操作,但如果可能的话,我想避免此步骤 --- 有时从 SVG 转换会将文本标签转换为矢量,这很烦人。因此问题是:

有没有办法直接包含 SVG 图表而无需转换为中间格式?

欢迎提出软件包建议或特定 LaTeX 发行版的说明。如果您能提供一些关于哪些工具可靠运行的提示和个人经验,我们将不胜感激。

答案1

现在(撰写本文时约一个月)一套svg在 CTAN 上,也包含在大型 TeX 发行版中。MWE:

\documentclass{article}

\usepackage{svg}

\begin{document}
\includesvg{some_svg_file}
\end{document}

此包使用 pdfTeX 原语。并非所有这些原语都在 LuaTeX 中定义,因此编译时可能会出错。请参阅Heiko Oberdiek 的回答寻求解决方案。

该命令给出的每个 SVG 文件\includesvg都将在一些附加程序的帮助下进行转换,至少在 Windows 上这些程序默认不安装(该软件包声称它无法在 Windows 中运行,但请参见下文):

  • Inkscape(使用其他答案中已经提到的技术)
  • 图像魔术师(实际上包括convert
  • 仅限 MiKTeX 用户: pdf(实际上包括pdftops

笔记:

  1. 编译pdflatex需要命令行开关--shell-escape

  2. 所有可执行文件/二进制文件都必须位于搜索路径中。在 Windows 中,只有“ImageMagick”安装程序默认执行此操作。对于和,inkscapepstopdf需要自己添加路径,或者我建议在本地 texmf 树的二进制路径中为每个批处理文件添加一个批处理文件(无论如何,它本身应该位于搜索路径中)。针对 MiKTeX 用户的附加提示:在 MiKTeX 中创建本地 texmf 树

`inkscape.cmd` _(it **must** get this name!)_:

<!-- language: lang-none -->

    @echo off
    <path-to-inkscape>\inkscape.exe %*

`pdftops.cmd` _(it also **must** be named this way!), not needed for Users of TeX Live_:

<!-- language: lang-none -->

    @echo off
    <path-to-Xpdf>\pdftops.exe %*

<sub>Of course, adjust the paths to your local settings.</sub>
  1. 该软件包使用 *nix 特定的命令mvrm。在 Windows 中,我们可以再次使用批处理脚本模拟它们,这又必须获取此处给出的名称,并应放入本地 texmf 树的 bin 文件夹中:
`mv.cmd`:

<!-- language: lang-none -->

    @echo off
    move /Y %*

The switch `/Y` overwrites existing files without any question! I introduced it here for the use with TeX editors.

`rm.cmd`:

<!-- language: lang-none -->

    @echo off
    del /Q %*

The switch `/Q` also suppresses any question!

答案2

最新版本Inkscape支持PDF+LaTeX导出。图形本身导出为PDF,但可以将所有文本放入一个.tex文件中。这样,所有文本都会以文档字体显示。

最新的Inkscape版本可以在官方网站

CTAN 上有一篇关于出口的免费文章:如何在 LaTeX 中包含 SVG 图像

2015 年 5 月,你可以从那篇文章中读到,完成此任务的最快方法是:

inkscape -D -z --file=image.svg --export-pdf=image.pdf --export-latex

但作为彼得·穆哈切夫在他的评论中指出,inkscape命令已经改变,现在(截至编辑2020 年 7 月)在较新版本的 Inkscape 上进行了如下更正:

inkscape -D image.svg  -o image.pdf --export-latex

2020 年 1 月和Inkscape 1.0beta2,此命令对于 macOS Catalina 是正确的(感谢莫阿泽姆的评论):

/Applications/Inkscape.app/Contents/MacOS/inkscape -D -z image.svg --export-type="pdf" --export-file=image.pdf --export-latex

然后包含生成的 TeX 文件,它将自动导入图像:

\begin{figure}
    \centering
    \def\svgwidth{\columnwidth}
    \input{image.pdf_tex}
\end{figure}

请注意,这用于\includegraphics插入图形,因此您需要在文档中包含graphics或。graphicx

请注意,使用\input你会失去调整大小功能\includegraphics[]{}。相反,你可以使用类似 的内容\scalebox{}{}。例如:

\begin{figure}
    \centering
    \def\svgwidth{\columnwidth}
    \scalebox{0.5}{\input{image.pdf_tex}}
\end{figure}

此外,这是我使用此功能一段时间后发现的两个好处。链接的 PDF 中提到了这两个好处,但我很长时间没有注意到这些提示。

插入文本时,文本框中会出现一个小方块,显示文本的对齐方式。例如,如果您想让箭头从文本指向某个对象,请确保对齐方式正确。 在此处输入图片描述

有一段时间,我一直在想,文本无法处理换行符,但如果您将文本排成一个形状,这是可以实现的。绘制一个矩形,写一些文本,选择两者,然后进入文本菜单,选择“排成框架”。快捷键是Alt+ W

答案3

正如其他答案已经提到的,TeX 后端不支持 SVG 文件格式。这意味着除了转换 SVG 图像之外没有其他方法。

然而,语境提供透明的转换(完整列表:ConTeXt 依赖项) 一些 LuaTeX 本身不支持的文件格式,例如:

  • 将 PostScript 图像转换为 PDF
  • 转换 GIF 和 TIFF 图像
  • 转换 SVG 和压缩 SVG

SVG 转换是在后台使用 Inkscape 完成的。这意味着从用户的角度来看,包含 PNG 或 SVG 文件没有区别。示例:

\starttext
  \externalfigure [image.svg]
\stoptext

一次编译运行将context file创建临时图像m_k_i_v_image.pdf,该图像是 inkscapes 输出并且透明地包含在内。

上述代码的结果(仅包含 SVG 图像的文件image.svg):

结果

答案4

这个问题已经问了快十年了,自提出以来已经发生了很大变化。svg如今在 LaTeX 中添加绘图的规范且最简单的方法是svg包。这已在以前的 答案,但那里的信息已经过时或不完整。我将尝试在这里简要概述必要的设置和流程。

包裹svg

svg软件包依赖 Inkscape 作为后端,将svg绘图转换为一个pdf包含除文本之外的所有内容的文件和一个tex文件(文件扩展名为pdf_tex),其中的代码用于包含 中的所有页面pdf并将省略的文本放置在图片上。\includegraphics您无需使用\includesvg将绘图放置在文档中。当您这样做时,软件包会检查是否需要(重新)生成pdfpdf_tex文件(如果它们不存在或绘图自上次生成后已被修改)。如果需要,它会自动调用 Inkscape,生成文件并包含它们。(为了不使您的目录混乱,软件包为这些文件svg创建了一个名为 的文件夹svg-inkscape。)实际上,这会将绘图的当前版本放置在文档中。

要实现这一目标,需要两个先决条件:

  1. Inkscape 需要安装并位于系统路径中。
  2. LaTeX 需要在启用 shell 转义的情况下运行。

启用 shell 逃逸

启用 shell 转义(也称为\write18)允许 TeX 调用外部程序(参见这个问题)。您可以通过使用选项 调用 LaTeX 来启用它--shell-escape。如果您的编辑器为您调用 LaTeX,您必须在编辑器的首选项中添加此选项。(请注意,如果您在机器上运行外部文档,这样做会带来一定的风险。)

如果您使用 TeXstudio,您还可以使用魔术注释为单个文档启用 shell 转义(并减轻上述风险)。例如,插入

% !TeX TXS-program:compile = txs:///pdflatex/[--shell-escape]

在文档顶部,以便使用pdflatex启用的 shell escape 进行编译。此后,TeXstudio 将在您第一次编译时提示您,您可以仅对该文档允许此操作。

将 Inkscape 放入搜索路径

在 Linux(我认为还有 MacOS)上,Inkscape 会在安装过程中自动添加到系统的搜索路径中。在 Windows 上,您必须在安装过程中主动选择这一点。

您可以通过打开命令行(例如,右键单击 Windows 按钮并选择Windows PowerShell)并执行inkscape(输入并按回车键)来检查 Inkscape 是否在路径中。如果 Inkscape 在路径中,它将打开,否则您将收到错误。

如果您未将 Inkscape 添加到搜索路径并希望追溯添加,则可以按照以下步骤操作(或直接卸载并重新安装 Inkscape):首先,您必须找到 Inkscape 可执行文件所在的目录。默认情况下,这是C:\Program Files\Inkscape\bin。然后,您必须将此目录添加到路径变量。打开 Windows 设置并导航到SystemAboutSystem infoAdvanced system settingsEnvironment Variables。现在双击Path系统变量(适用于所有用户)或用户变量(仅适用于您)列表中的。单击New,粘贴 Inkscape 可执行文件的目录,然后按 Enter。然后按下OK三个打开的​​对话框。完成。

您可能需要重新启动 LaTeX 编辑器或命令行才能使更改生效。

绘图页面上的注释

当 Inkscape 将svg绘图转换为pdfpdf_tex文件时,它可以让页面大小(即图像的边界框)适合绘图内容,而不是使用 中指定的页面大小svg。这将删除绘图中的所有边距,但如果内容超出这些边界,它也会扩展绘图的页面(即使它是不会成为文件一部分的文本pdf)。通常,这不是您想要的。

不幸的是,该svg包默认使用这种“适合图纸”导出。我建议始终使用选项加载它

\usepackage[inkscapearea=page]{svg}

以保留svg的页面大小。如果您希望使特定绘图的页面适合其内容,则可以传递inkscapearea=drawing给相应的\includesvg

数学家

您可以测试您的设置是否适用于此 MWE

% !TeX TXS-program:compile = txs:///pdflatex/[--shell-escape]
\begin{filecontents}[noheader]{drawing.svg}
<?xml version="1.0" encoding="UTF-8"?>
<svg width="96.725mm" height="50.327mm" version="1.1" viewBox="0 0 96.725 50.327" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
 <metadata>
  <rdf:RDF>
   <cc:Work rdf:about="">
    <dc:format>image/svg+xml</dc:format>
    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
    <dc:title/>
   </cc:Work>
  </rdf:RDF>
 </metadata>
 <g transform="translate(-27.689 -45.179)">
  <path d="m100.09 88.093-6.259-9.7729-10.235 5.4701 3.7384-10.987-10.658-4.5917 10.921-3.9274-3.0554-11.196 9.8795 6.0894 6.8483-9.3694 1.3988 11.521 11.595-0.48748-8.1351 8.2767 7.6106 8.7615-11.543-1.1998z" fill="#ff0808"/>
  <text x="83.593781" y="83.789787" fill="#000000" font-family="'CMU Serif'" font-size="12.7px" letter-spacing="0px" stroke-width=".26458" text-align="end" text-anchor="end" word-spacing="0px" style="line-height:1.25" xml:space="preserve"><tspan x="83.593781" y="83.789787" font-size="3.8806px" stroke-width=".26458" text-align="end" text-anchor="end">This is a test: \(\sum_{k = 0}^\infty 2^{-k} = 2\).</tspan></text>
 </g>
</svg>
\end{filecontents}

\documentclass{article}

\usepackage[inkscapearea=page]{svg}

\begin{document}

\includesvg{drawing}

\end{document}

它会drawing.svg在您的工作目录中创建一个并尝试将其包含在内。

相关内容