编辑 PGF 团队报告称该错误已于 2018-12-29 修复
有一个漏洞在 pgf 中,它无法与 tikz/pgf 很好地配合使用。michal.h21 发现,解决方案很简单,只需将 改为一行即可pgfsys-tex4ht.def
。这个错误是向 pgf 团队报告于 2014 年发布,并附带补丁,但截至 TeXLive 2017,该问题仍未得到修复。
问题
有没有什么办法可以pgfsys-tex4ht.def
在 LaTeX 内部修补 pgf 文件?
可以通过编辑/替换 的系统版本来修复此问题pgfsys-tex4ht.def
。但是,我想要的是从里面LaTeX,因为我希望能够在包中解决这个问题。(在理想情况下,pgf 团队只需应用 Michael 的补丁,就可以一劳永逸地解决问题,但他们似乎对此不感兴趣……)
实际发生的错误是:
! Undefined control sequence.
\pgfsys@svg@newline ->\Hnewline
l.190 \pgfusepathqfill}
解决方法是将行\def\pgfsys@svg@newline{\Hnewline}
替换
pgfsys-tex4ht.def
为
\def\pgfsys@svg@newline{^^J} %% corrected
我尝试用多种方式修补此行,在 latex 文件、我的类文件、cfg 文件和 mk4 文件中。遗憾的是,我尝试过的所有方法都无法解决问题。出于我不明白的原因,一旦pgfsys-tex4ht.def
读取了文件,就很难说服 htlatex 使用\pgfsys@svg@newline
或的任何其他定义\Hnewline
。
要查看错误的实际效果,请使用 htlatex 编译以下非常简单的 MWE:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw(0,0)--(10,0);
\end{tikzpicture}
\end{document}
该问题仅发生在 htlatex 和相关程序中 —— MWE 使用 (pdf)latex 进行编译时没有问题。
答案1
这种情况很不幸。pgfsys-tex4ht.def
当使用 编译文档时,TikZ 会自动选择驱动程序tex4ht
。您可以创建替代驱动程序,例如pgfsys-tex4ht-alt.def
:
\input pgfsys-tex4ht.def
\def\pgfsys@svg@newline{^^J}
但问题是替代驱动程序无法在文件中定义.cfg
,因为它是在执行文档前言后解释的。您必须将其放入 TeX 文件中:
\documentclass{article}
\def\pgfsysdriver{pgfsys-tex4ht-alt.def}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw(0,0)--(10,0);
\end{tikzpicture}
\end{document}
或者在文件中使用一个技巧.mk4
:
settings.packages = settings.packages ..'\\def\\pgfsysdriver{pgfsys-tex4ht-alt.def}'
settings.packages
您可以在构建文件中的变量中加载附加包或定义自定义命令mk4
。
编辑2017/11/11:
另一种可能性是使用dvisvgm
来生成SVG
文件。我们可以使用 的内置功能将环境tex4ht
内的任何 TeX 代码转换\Picture* ... \EndPicture
为图片,并且 还TikZ
支持 支持的dvips
命令dvisvgm
。
替代方案pgfsys-tex4ht.def
:
% Copyright 2006 by Till Tantau
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Public License.
%
% See the file doc/generic/pgf/licenses/LICENSE for more details.
\ProvidesFileRCS $Header: /cvsroot/pgf/pgf/generic/pgf/systemlayer/pgfsys-tex4ht.def,v 1.25 2013/08/06 17:46:08 tantau Exp $
% Driver commands for tex4ht
%
% Load common pdf commands:
%
%\input pgfsys-dvisvgm.def
\input pgfsys-dvips.def
%
% tex4ht-specific stuff:
%
\newcount\pgf@sys@svg@picnum
% configure the output picture format to svg
\AtBeginDocument{
\Configure{Picture}{.svg}
}
% Make the code inserted by tex4ht configurable
\NewConfigure{tikzpicture}{2}
\Configure{tikzpicture}{%
% \ifvmode\IgnorePar\fi\EndP%\HtmlParOff
\Picture*{}
}{\EndPicture}
\let\orig@pgfsys@begin\pgfsys@beginpicture
\let\orig@pgfsys@end\pgfsys@endpicture
\def\pgf@sys@postscript@header#1{{\special{! #1}}}
\def\pgfsys@beginpicture{%
\bgroup
\csname a:tikzpicture\endcsname
\pgf@sys@postscript@header{
/pgfsc{}bind def% stroke color is empty by default
/pgffc{}bind def% fill color is empty by default
/pgfstr{stroke}bind def%
/pgffill{fill}bind def%
/pgfeofill{eofill}bind def%
/pgfe{a dup 0 rlineto exch 0 exch rlineto neg 0 rlineto closepath}bind def% rectangle
/pgfw{setlinewidth}bind def% setlinewidth
/pgfs{save pgfpd 72 Resolution div 72 VResolution div neg scale
magscale{1 DVImag div dup scale}if
pgfx neg pgfy neg translate pgffoa .setopacityalpha}bind def% save
/pgfr{pgfsd restore}bind def %restore
userdict begin%
/pgfo{pgfsd /pgfx currentpoint /pgfy exch def def @beginspecial}bind def %open
/pgfc{newpath @endspecial pgfpd}bind def %close
/pgfsd{globaldict /pgfdelta /delta where {pop delta} {0} ifelse put}bind def% save delta
/pgfpd{/delta globaldict /pgfdelta get def}bind def % put delta
/.setopacityalpha where {pop} {/.setopacityalpha{pop}def} ifelse % install .setopacityalpha
/.pgfsetfillopacityalpha{/pgffoa exch def
/pgffill{gsave pgffoa .setopacityalpha fill 1 .setopacityalpha newpath fill grestore newpath}bind def
/pgfeofill{gsave pgffoa .setopacityalpha eofill 1 .setopacityalpha newpath eofill grestore newpath}bind def}bind def
/.pgfsetstrokeopacityalpha{/pgfsoa exch def /pgfstr{gsave pgfsoa .setopacityalpha stroke grestore newpath}bind def}bind def
/pgffoa 1 def
/pgfsoa 1 def
end
}%
\orig@pgfsys@begin%
}%
\def\pgfsys@endpicture{%
% Save the bounding box
%\printdim%
\orig@pgfsys@end%
\csname b:tikzpicture\endcsname%
\egroup
\par% FIXME : was '\Par' but that seems to be undefined!?
}%
\endinput
%%% Local Variables:
%%% mode: latex
%%% End: