当 l3draw 绘图包含范围框时无法使用 dvisvgm

当 l3draw 绘图包含范围框时无法使用 dvisvgm

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}

尽管我刚刚收到短信

在此处输入图片描述

相关内容