我使用 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 中运行,但请参见下文):
笔记:
编译
pdflatex
需要命令行开关--shell-escape
。所有可执行文件/二进制文件都必须位于搜索路径中。在 Windows 中,只有“ImageMagick”安装程序默认执行此操作。对于和,
inkscape
您pstopdf
需要自己添加路径,或者我建议在本地 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>
- 该软件包使用 *nix 特定的命令
mv
和rm
。在 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
将绘图放置在文档中。当您这样做时,软件包会检查是否需要(重新)生成pdf
和pdf_tex
文件(如果它们不存在或绘图自上次生成后已被修改)。如果需要,它会自动调用 Inkscape,生成文件并包含它们。(为了不使您的目录混乱,软件包为这些文件svg
创建了一个名为 的文件夹svg-inkscape
。)实际上,这会将绘图的当前版本放置在文档中。
要实现这一目标,需要两个先决条件:
- Inkscape 需要安装并位于系统路径中。
- 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 设置并导航到System
→ About
→ System info
→ Advanced system settings
→ Environment Variables
。现在双击Path
系统变量(适用于所有用户)或用户变量(仅适用于您)列表中的。单击New
,粘贴 Inkscape 可执行文件的目录,然后按 Enter。然后按下OK
三个打开的对话框。完成。
您可能需要重新启动 LaTeX 编辑器或命令行才能使更改生效。
绘图页面上的注释
当 Inkscape 将svg
绘图转换为pdf
和pdf_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
在您的工作目录中创建一个并尝试将其包含在内。