我想生成一个具有节点形状(例如矩形)的 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 lock
和dvisvgm: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}