包含 % 符号的 svg

包含 % 符号的 svg

我使用\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。有两种简单的解决方案:

  1. 如果您想要将 SVG 中的文本呈现为乳胶,请使用正确的乳胶语法(即使用 转义%\
  2. 如果您不希望使用乳胶呈现 SVG 中的文本,请inkscapelatex=false在加载svg包或调用includesvg命令时提供该选项。

如果您想分割差异 - 例如您希望文本使用文档字体呈现,但您不想%被解释为评论 - 那么 David Carlisle 的回答可以满足您的要求。

答案3

当我遇到一个简单图形的大量错误消息时,这对我来说很有帮助,尽管我以相同方式实现的其他图形在编译时没有出现任何问题。

@David Carlisle 的修复肯定有效,但是,对我来说更明显的是(甚至可能更容易)将图片本身中的“%”(意味着在 Inkscape 窗口中编辑文件)更改为“\%”,就像在任何 .tex 文件中一样。

把它留在这里也许可以帮助到别人。

相关内容