与 htlatex 一起使用时,如何解决 pgf 中的错误?

与 htlatex 一起使用时,如何解决 pgf 中的错误?

编辑 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: 

相关内容