我使用\usepackage{svg}
包含 svg 文件\includesvg{filename.svg}
并使用进行编译pdflatex --shell-escape file.tex
这通常很有效。但是,当 svg 文件(由 inkscape 创建)包含百分比字符 (%) 时,我遇到了问题。
编译期间 pdflatex 给出以下错误消息:
失控的争论?
{\color [rgb]{0,0,0}\makebox (0,0)[lt]{\lineheight {1.25}\smash {\begin \ETC.
! 使用 \put 扫描时文件结束。 \par l.29
\includesvg{filename.svg}
作为一个快速而粗糙的修复,我可以将 svg 中的字体转换为路径,并且一切正常,但是如何将包含正确 % 字符的 svg 包含到 LaTeX 中?
示例代码:
\documentclass{scrartcl}
\usepackage{svg}
\begin{document}
\includesvg{filename.svg}
\end{document}
这使用 svg-image文件名.svg,这是一个简单的 svg 文件,仅包含 % 符号作为文本。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg8"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="filename.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="400"
inkscape:cy="560"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1022"
inkscape:window-height="746"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<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
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.61458302px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="43.089287"
y="111.79166"
id="text10"><tspan
sodipodi:role="line"
id="tspan8"
x="43.089287"
y="111.79166"
style="stroke-width:0.26458332px">%</tspan></text>
</g>
</svg>
答案1
错误似乎出在 Inkscapes 组合 tex/pdf 导出中,因为它无法%
在文本中引用。它也很难用来\catcode
制作%
不需要引用的普通字符,因为它%
几乎在每一行的末尾都插入了一个。
最简单的修复方法是编辑svg-inkscape/filename_svg-tex.pdf_tex
(第一次运行后生成)
\put(-0.11824539,0.01843611){\color[rgb]{0,0,0}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}\textit{%}\end{tabular}}}}%
改为%
得到\%
\put(-0.11824539,0.01843611){\color[rgb]{0,0,0}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}\textit{\%}\end{tabular}}}}%
该包不会在后续运行时覆盖该文件,因此如果您在主文件上重新运行 latex,它将被包含在内而不会出现错误。
答案2
根据设计,该svg
包将 SVG 文件中的文本渲染为 latex。有两种简单的解决方案:
- 如果您想要将 SVG 中的文本呈现为乳胶,请使用正确的乳胶语法(即使用 转义
%
)\
。 - 如果您不希望使用乳胶呈现 SVG 中的文本,请
inkscapelatex=false
在加载svg
包或调用includesvg
命令时提供该选项。
如果您想分割差异 - 例如您希望文本使用文档字体呈现,但您不想%
被解释为评论 - 那么 David Carlisle 的回答可以满足您的要求。
答案3
当我遇到一个简单图形的大量错误消息时,这对我来说很有帮助,尽管我以相同方式实现的其他图形在编译时没有出现任何问题。
@David Carlisle 的修复肯定有效,但是,对我来说更明显的是(甚至可能更容易)将图片本身中的“%”(意味着在 Inkscape 窗口中编辑文件)更改为“\%”,就像在任何 .tex 文件中一样。
把它留在这里也许可以帮助到别人。