背景:PGF 3.0 添加了一种新的直接创建 SVG 的方法。它现在有一个 dvisvgm 驱动程序 (pgfsys-dvisvgm.def),它比 pgfsys-tex4ht.def 驱动程序的限制更少(据称)。但它似乎根本无法与 dvisvgm 本身的当前版本 (1.8) 配合使用。
PGF/TikZ 手册给出了以下示例:
\documentclass[dvisvgm]{minimal}
\usepackage{tikz}
\begin{document}
Hello \tikz [baseline] \fill [fill=blue!80!black] (0,.75ex) circle[radius=.75ex];
\end{document}
这不会用 MikTeX 为我渲染任何图形。输出 SVG 中只出现“Hello”一词。我确实检查了生成的 dvi 文件是否包含实际的 dvisvgm 特殊内容,例如dvisvgm:raw <g fill="rgb(0.0%,0.0%,80.0003%)">
这可能是蓝点/圆圈的颜色。
如果我[dvisvgm]
从上面的代码中删除,我会在生成的 SVG 中得到蓝色圆圈,但中间的 DVI 使用的是 PostScript 特殊字符;它充满了grestore
,gsave
等等。当然,您需要 ghostscript 才能真正被 dvisvgm 正确处理,而新的直接 dvisvgm 驱动程序不需要 ghostscript。
那么,问题是:有人设法获得 PGF 3.0 dvisgm司机是否可以使用实际的 dvisgm?如果可以使用,该怎么做?如果不行,有谁知道接口错误在哪里吗?
对于专家来说,以下是“反汇编的” dvi 文件(带有 DVItype):
- 使用新的 dvisvgm 驱动程序:http://pastebin.com/mKb6fCWM
- 使用经典 PostScript 特效的版本:http://pastebin.com/iLwpCyjp
相当重要的更新:
另一个有趣的问题是,尽管使用 PostScript 特效的 DVI 比使用 dvisvgm 特效的 DVI 要长得多(您可能从上面的反汇编中看出来),但通过 PostScript 生成的工作 SVG 实际上比使用新的直接驱动程序的非工作 SVG 要短一点……
- 使用 PostScript 特制版作为中介生成的 SVGhttp://pastebin.com/M8yw8Gbu
- 使用新的 dvisvgm specials 作为中介生成 SVGhttp://pastebin.com/8Er3AkC0
这两者之间的区别是:http://pastebin.com/NZxu9bpR
看起来 viewBox 和 viewport 有所不同,对于直接方法来说较小,并且“直接”方法会生成一些额外的“垃圾”东西。
- PS/旧视图框结尾为:32.0864 6.89265' width='32.0864pt'
- 直接/新视图框以以下结尾:22.3323 6.89265' width='22.3323pt'
幸运的是,这些垃圾东西并不重要,如果我只是将旧的 viebox 和宽度复制到新的直接方法 SVG 上,它就会正常显示蓝点/圆圈!但我仍然不知道是驱动程序导致了不好的(太短的)viewbox,还是 dvisvgm 本身的新版本中添加了一个错误,如果是的话,是在哪个版本中……我确实看到下面的评论说 TeXLive 2014 的旧版本运行良好,所以我猜这很可能是 dvisvgm 本身的回归。
顺便说一句,您必须小心解释 Inkscape 显示的内容,因为与 Web 浏览器不同,它还会在 SVG 中显示视图框之外的内容!但 Inkscape 确实会绘制视图框。比较以下两个屏幕截图:https://i.stack.imgur.com/4UEVf.jpg
尝试--bbox
解决方法
鉴于唯一真正的问题是 SVG 视口(仅width
在此示例中)和视图框(viewBox
),当前版本的 dvisvgm(1.8)的修复似乎是使用 来调用它--bbox=none
,这会省略向生成的 SVG 添加和width
,因此所有内容都会显示在 Web 浏览器中。但是,这仅在您单独显示 SVG 时才有效。如果您将其与其他元素一起包含在网页中,我尝试过的所有浏览器(IE 11、Chome 36、Firefox 31)都会在其周围留下大量空间,而具有指定 vieport 和 viewBox 的 SVG 不会发生这种情况;那些 SVG 会紧密排列。height
viewBox
的其他选项都没有--bbox
什么更好的效果。--bbox=min
似乎是默认的,并且得到的结果与没有参数相同,有或没有--exact
。 另一个选择--bbox=dvi
是在输出周围放置一个巨大的框,因此它基本上位于页面的中心。 我用谷歌搜索了一下,但我没有找到任何简单的方法让其他软件正确使用 SVG 视口/视框。 例如,Inkscape 甚至不允许您编辑/指定视框,除非您使用甚至不附带的插件(http://pernsteiner.org/inkscape/viewbox/)而这并不是一个真正的自动化解决方案。
**再次更新(Martin 回复后)** 是的,我现在注意到 dvisvgm 手册上说,dvisvgm:bbox
使用 dvisvgm 自己的特殊功能时需要通过 DVI 进行更新。但使用其 dvisvgm 驱动程序的 PGF 的 DVI 输出不会输出任何 dvisvgm:bbox
调用(参见上面链接的 DVI 示例)。因此,除非 Martin 决定统一处理 dvisvgm 和 PostScript 特殊字符以计算 bbox,否则驱动程序不可能正常工作。我实际上是在他的启动板上将此作为功能请求输入的,然后我注意到他在这里回复了。如果 dvisvgm 将 dvisvgm 和 PostScript 特殊字符统一视为输入,那么这也将允许他对传入的 dvisvgm 特殊字符进行一些优化,而不仅仅是传递它们,因为 PGF 的输出更为冗长……
答案1
虽然这是一个老问题,但现在也许似乎有一个解决方案。
自 2016-07-04 发布 dvisvgm-1.16 以来 (发行公告),它支持特殊纸张尺寸。
独立包自动设置纸张大小,因此使用它作为文档类而不是minimal
。
\documentclass[dvisvgm]{standalone}
\usepackage{tikz}
\begin{document}
Hello \tikz [baseline] \fill [fill=blue!80!black] (0,.75ex) circle[radius=.75ex];
\end{document}
要使用纸张大小作为 SVG 的边界框,请-b papersize
向命令添加选项dvisvgm
(手册页)
$ latex mydocument.tex
$ dvisvgm -b papersize mydocument.dvi
下面是我的浏览器中 SVG 图像的屏幕截图,它是使用/不使用创建的-b papersize
。
注意,CSS 添加了图像边框,以便清晰显示。您可以看到蓝色圆圈已正确显示-b papersize
。
编辑:如果您正在使用luatex
或xetex
,standalone
文档类未设置papersize-special,因此您可能必须将以下代码添加到standalone.cls
。
% in next row of \global\paperheight=... in \def\sa@placebox{ ... }
\special{papersize=\the\paperwidth,\the\paperheight}
standalone.cls
可以使用以下命令找到的路径
$ kpsewhere standalone.cls
/usr/share/texlive/texmf-dist/tex/latex/standalone/standalone.cls