dvisvgm
尝试从 DVI 文件创建 SVG 文件时,我发现了一个奇怪的问题。
我发现,如果我将一个盒子(或棺材)附加到draw
使用l3draw
包创建的 ing 中,并且此盒子(或棺材)在范围内,则通过运行创建的 DVIlatex
无法通过 转换为 SVG dvisvgm
。但如果这个盒子(或棺材)不在范围内,它就可以工作。
考虑以下 MWE:
\documentclass[border=10pt]{standalone}
\usepackage{l3draw}
\begin{document}
\ExplSyntaxOn
\draw_begin:
\draw_path_circle:nn { 0cm , 0cm } { 1cm }
\draw_path_use_clear:n { stroke }
\draw_scope_begin:
\hbox_set:Nn \l_tmpa_box {foo}
\draw_box_use:N \l_tmpa_box
\draw_scope_end:
\draw_end:
\ExplSyntaxOff
\end{document}
我运行latex
,然后就会出现dvisvgm
错误PostScript error: stackunderflow in restore
。如果我注释掉范围,文件转换就会顺利进行,圆圈和框中的文本会显示在生成的 SVG 中。
我不确定问题出在哪里:在l3draw
包裹上还是在dvisvgm
其他地方(或其他地方)。
答案1
这似乎是 dvips 后端的一个错误l3draw
。
\draw_scope_begin:
并\draw_scope_end:
创建如下 PS 代码:
@beginspecial
...
save
@endspecial
...
@beginspecial
restore
@endspecial
PS 操作符save
将一个保存对象放在操作数堆栈上,该保存对象保存有关 PS 解释器当前状态的信息。restore
另一方面,期望堆栈上的保存对象恢复相应的内存状态。
但是,@endspecial
这是由 定义的 PS 过程dvips
,它删除了由 创建的保存对象save
。因此,执行 时堆栈上没有任何内容restore
,这就是 PS 解释器在 处停止的原因stackunderflow in restore
。
答案2
您正在使用 dvips 后端,使用 dvisvgm 后端时不会出现任何错误
\documentclass[border=10pt]{standalone}
\ExplSyntaxOn
\sys_load_backend:n {dvisvgm}
\ExplSyntaxOff
\usepackage{l3draw}
\begin{document}
\ExplSyntaxOn
\draw_begin:
\draw_path_circle:nn { 0cm , 0cm } { 1cm }
\draw_path_use_clear:n { stroke }
\draw_scope_begin:
\hbox_set:Nn \l_tmpa_box {foo}
\draw_box_use:N \l_tmpa_box
\draw_scope_end:
\draw_end:
\ExplSyntaxOff
\end{document}
尽管我刚刚收到短信