使用 dvisvgm 输出驱动程序(PGF/TikZ)时 tikzpicture 尺寸不正确

使用 dvisvgm 输出驱动程序(PGF/TikZ)时 tikzpicture 尺寸不正确

我想生成一个具有节点形状(例如矩形)的 SVG 文件。我使用以下 LaTeX 代码:

\def\pgfsysdriver{pgfsys-dvisvgm.def}
\documentclass{article}
\usepackage[usenames]{color}
\pagestyle{empty}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}
\begin{document}
\pagecolor{white}%
\begin{tikzpicture}
  \node (start) [draw, rectangle, minimum width=24mm, minimum height=16mm] {How are you?};
\end{tikzpicture}
\end{document}

然后我使用 xelatex 和 dvisvgm 来生成 SVG 文件:

xelatex -no-pdf -interaction nonstopmode -output-directory .\ test1.tex & dvisvgm -n -o .\test1.svg test1.xdv

不幸的是,生成的 SVG 文件的背景对象宽度大于矩形的宽度,导致 TikZ 图片的宽度更大。宽度取决于文本宽度,即,如果文本较短,则生成的背景对象宽度不会长于矩形宽度,这样就不会出现问题。但是当文本宽度长于某个临界长度时,tikzpicture 宽度与绘制的对象宽度不同。此外,我注意到高度也存在同样的问题。在下面的示例中,问题出现在 tikzpicture 的顶部:

\def\pgfsysdriver{pgfsys-dvisvgm.def}
\documentclass{article}
\usepackage[usenames]{color}
\pagestyle{empty}             % do not remove
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}
\begin{document}
\pagecolor{white}%
\begin{tikzpicture}
  \node (point1) [coordinate] {};
  \node at (0,-3cm) (start) [draw, color=black, rectangle, minimum width=24mm, minimum height=16mm] {How are you?};
  \draw (point1) -- (start);
\end{tikzpicture}
\end{document}

执行以下命令:

xelatex -no-pdf -interaction nonstopmode -output-directory .\ test3.tex & dvisvgm -n -o .\test3.svg test1.xdv

我正在使用:Windows 11 MiKTeX-XeTeX 4.10(MiKTeX 23.5)dvisvgm 3.0.4 pgf 3.1.10

我希望生成的 SVG 文件包含正确大小的对象。

答案1

当使用 插入图形对象(节点、形状等)时\box...,PGF 的输出驱动程序首先通过插入dvisvgm:bbox ...具有正确 TeX 框尺寸的特殊项来推动最终输出尺寸。但是,dvisvgm它本身会通过检查插入材料的内容来计算并重新调整输出尺寸。在强制调整 bbox 的情况下,应防止这种情况发生。

这是驱动程序的修复程序pgfsys-dvisvgm,它在命令周围放置dvisvgm:bbox lockdvisvgm:bbox unlock特殊\box...。它通过 防止在 DVI 处理期间进一步进行边界框计算dvisvgm。排版为

latex example
dvisvgm --font-format=woff2 --exact --zoom=-1 example

或者

xelatex --no-pdf example
dvisvgm --font-format=woff2 --exact --zoom=-1 example.xdv

dvisvgm选项zoom=-1使 SVG 响应以填充 Web 浏览器的可用显示大小。它使建议的修复效果更加明显。

为了比较:SVG 驱动程序修复SVG 无驱动程序修复

\def\pgfsysdriver{pgfsys-dvisvgm.def}

\documentclass{article}
%\usepackage[usenames]{color}
\pagestyle{empty}
\usepackage{tikz}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%   fix bounding box setting of inserted tikz objects   %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\makeatletter
\def\pgfsys@typesetpicturebox#1{%
  \pgf@ya=\pgf@shift@baseline\relax%
  \advance\pgf@ya by-\pgf@picminy\relax%
  %
  %
  \advance\pgf@picmaxy by-\pgf@picminy\relax% maxy is now the height
  \advance\pgf@picmaxx by-\pgf@picminx\relax% maxx is now the width
  \setbox#1=\hbox{\hskip-\pgf@picminx\lower\pgf@picminy\box#1}%
  \ht#1=\pgf@picmaxy%
  \wd#1=\pgf@picmaxx%
  \dp#1=0pt%
  \leavevmode%
  \pgf@xa=\pgf@trimleft@final\relax  \ifdim\pgf@xa=0pt \else\kern\pgf@xa\fi%
  \raise-\pgf@ya\hbox{\ifpgf@sys@svg@inpicture\else\special{dvisvgm:bbox \pgf@sys@tonumber\pgf@picmaxx\space\pgf@sys@tonumber\pgf@picmaxy}\special{dvisvgm:bbox lock}\fi\box#1\ifpgf@sys@svg@inpicture\else\special{dvisvgm:bbox unlock}\fi}%
  \pgf@xa=\pgf@trimright@final\relax \ifdim\pgf@xa=0pt \else\kern\pgf@xa\fi%
}
\makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%\usetikzlibrary{shapes.geometric}
\begin{document}
\pagecolor{white}%
\begin{tikzpicture}
  \node (start) [draw, rectangle, minimum width=24mm, minimum height=16mm] {How are you?};
\end{tikzpicture}
\end{document}

相关内容