考虑以下简单的 Latex 文件:
\documentclass{article}
\ifdefined\HCode\def\pgfsysdriver{pgfsys-tex4ht-alt.def}\fi
\usepackage{tikz}
\usepackage{filecontents}
\begin{document}
% see https://tex.stackexchange.com/questions/386757/work-around-for-bug-in-pgf-when-used-with-htlatex
\begin{filecontents}{pgfsys-tex4ht-alt.def}
% Fix due to Michal Hoftich
\input pgfsys-tex4ht.def
\def\pgfsys@svg@newline{^^J}
\end{filecontents}
\begin{tikzpicture}
\foreach \x in {-3,...,3} {
\draw(\x,0.25) --(\x,0)node[below]{$\x$};
}
\foreach \x in {-2.5,...,2.5} {
\draw(\x,0.18) --(\x,0);
}
\draw[thick,<->](-3.5,0)--(3.5,0);
\filldraw[blue](1.5,0) circle (1mm);
\end{tikzpicture}
-3 -2 -1 0 1 2 3
\end{document}
运行时pdflatex
会生成 pdf 图像:
运行时make4ht
会产生基本相同的 html/svg 图像:
make4ht -u
不幸的是,当我们使用 utf-8 选项运行 MWE 时,情况变得很糟糕,因为我们得到:
make4ht -u
前两幅图像是正确的,但在使用tikz 代码中出现的负数时,存在编码/svg 问题;更准确地说,减号有问题。我的真实应用程序使用 utf-8,因此放弃-u
开关对我来说不是一个真正的选择。
知道如何在使用时修复最后一张图片make4ht -u
吗?
我认为使用 utf-8 编码会遇到同样的错误,htlatex
但我更喜欢使用它,make4ht
因为它的语法更好。
[使用文件内容MWE 中的包是为了纠正 PGF 中的一个错误,该错误导致 tikz 无法与 tex4ht 很好地播放;请参阅与 htlatex 一起使用时,如何解决 pgf 中的错误?
了解详情。pdflatex
首先在 MWE 上运行,否则make4ht
会出错,因为文件pgfsys-tex4ht-alt.def
尚未创建。
答案1
问题是pgfsys-tex4ht.def
将 SVG 文件的编码设置为iso-8859-1
:
\pgfsys@invoke{<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
这个定义在这个文件中是硬连线的,所以它不能真正从外部改变,我们需要pgfsys-tex4ht.def
直接编辑。
我们可以使用以下宏来获取所使用的输出编码的值tex4ht
:
\def\getEncoding#1charset=#2,#3\@nil{\if|#2|iso-8859-1\else#2\fi}
\def\htmlencoding{\expandafter\getEncoding\Preamble ,charset=,\@nil}
它Latin1
默认使用,但它将utf-8
使用-u
选项进行检测make4ht
。
这是完整的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-common-svg.def
%
% tex4ht-specific stuff:
%
\def\pgfsys@invoke#1{\pgf@sys@fail{svg code in preamble}}
\def\pgfsys@body@invoke#1{\HCode{#1}}
\newcount\pgf@sys@svg@picnum
\def\pgfsys@pictureboxsynced#1{%
\pgfsys@beginscope\pgflowlevelsynccm\box#1\pgfsys@endscope%
}
%%
%% initial support of Mathml and xhtml inside svg through the svg:foreignelement tag
%%
%% it'll allow us to have complicated text nodes in the tex4ht driver
%%
%Example (to improve the display, you have to use css)
%
%\tikzpicture[svg text only=false]
%\draw (0,0) node[inner sep=0pt,draw] {tight}
%(0cm,2em) node[inner sep=5pt,draw] {loose}
%(0cm,4em) node[fill=red!20] {default};
%\draw (3,0) node[inner sep=0pt,draw] {TIGHT}
%(3cm,2em) node[inner sep=5pt,draw] {LOOSE}
%(3cm,4em) node[fill=red!20] {DEFAULT};
%\draw (6,0) node[inner sep=0pt,draw] {$tight$}
%(6cm,2em) node[inner sep=5pt,draw] {$loose$}
%(6cm,4em) node[fill=red!20] {$default$};
%\draw (9,0) node[inner sep=0pt,draw] {$TIGHT$}
%(9cm,2em) node[inner sep=5pt,draw] {$LOOSE$}
%(9cm,4em) node[fill=red!20] {$Default$};
%\endtikzpicture
%
% you can use the options "svg text css=filename", "svg text id=idname", "svg text class=classname" to customize the display through the use of css
%
%\def\pgfsys@beginpicture{%
% % \Configure{[]}{$}{$} these two lines aren't needed for tex4ht and moreother they produce errors with plain tex !
% % \Configure{()}{$}{$}
% \Configure{$$}{}{}{}%$$
% \Configure{$}{}{}{}%$
% \Configure{SUB}{\HCode{<tspan baseline-shift="sub">}}{\HCode{</tspan>}}
% \Configure{SUP}{\HCode{<tspan baseline-shift="sub">}}{\HCode{</tspan>}}
% \Configure{SUBSUP}{}{}{}
% \Configure{htf}
% {0}{+}{<tspan font-family="}
% {\%s}{" font-size="\%s}{}{}
% {">}{</tspan>}
%}
%\def\pgfsys@endpicture{%
% % undo:
% \Configure{htf}{0}{+}{<span\Hnewline
% class="}{\%s}{-\%s}{x-x-\%d}{}{">}{</span>}
%}
\def\pgfsys@svg@newline{\Hnewline}
% we don't want tex4ht putting <p> and </p> tags automatically in our svg code and causing invalid xhtml in our svg pictures
\newif\ifpgfsys@CssIncluded@\pgfsys@CssIncluded@false
\def\pgfsys@beginpicture{%
\EndP\HtmlParOff
\pgfkeys{/pgf/tex4ht node/escape=false}%
% text only nodes are the default. Advantage : pure svg pictures are
% the default, nicer for text only nodes.
% Disadvantages : this rendering methods produce more invalid or degraded svg pictures than with the foreignelement tag
%% we use css to control the display of foreignelement rendered text nodes
\ifpgfsys@CssIncluded@
\else
\Css{
.foreignobject {%
line-height:100\%;
font-size:120\%; % this is the trick....a font of size 100% in
% a box scaled down to half size makes it a
% half size font.
% you'll have to double the size of things
% that you want to have a regular size in
% this half-scaled box though
font-family:STIXgeneral,Times,Symbol,cmr10,CMSY10,CMEX10;%
% can't wait for the stix font...the cmr10, etc font are
% available from the mozilla site, times and symbols should be
% okey
padding:0;
margin:0;
% background-color:\#12ff55; usefull for debugging positioning
text-align:center; % good for centered text nodes...will have to improve that later on...with more integration with pgf options for text nodes
}
}%
\Css{%
math {%, math[mode="inline"] {
vertical-align:baseline;
line-height:100\%;
font-size:100\%;
font-family:STIXGeneral,Times,Symbol, cmr10,cmsy10,cmex10,cmmi10;
font-style: normal;
margin:0;
% background-color:\#99ff99;
padding:0;
}%
}%
\pgfsys@CssIncluded@true
\fi
}%
\def\pgfsys@endpicture{%
\HtmlParOn
\par% FIXME : was '\Par' but that seems to be undefined!?
}%
\def\getEncoding#1charset=#2,#3\@nil{\if|#2|iso-8859-1\else#2\fi}
\def\htmlencoding{\expandafter\getEncoding\Preamble ,charset=,\@nil}
% this is okay for both rendering methods for text nodes (mtext or foreignelement)...
\def\pgfsys@typesetpicturebox#1{%
\global\advance\pgf@sys@svg@picnum by 1\relax%
% Ok, compute width/height
\pgf@xa=\pgf@picminx%
\pgf@ya=\pgf@picminy%
\pgf@xb=\pgf@picmaxx%
\pgf@yb=\pgf@picmaxy%
\pgf@x=\pgf@xb%
\advance\pgf@x by-\pgf@xa%
\pgf@y=\pgf@yb%
\advance\pgf@y by-\pgf@ya%
\ifdim\pgf@y<1pt%
\pgf@y=1pt%
\fi%
\pgf@xc=\pgf@x%
\pgf@yc=\pgf@y%
\pgfsysprotocol@flushcurrentprotocol%
\HCode{<object data="\jobname-\the\pgf@sys@[email protected]" width="}%
% Calculate pixel coordinates (this does not really make sense, but
% we have to do it anyway). Assume 96dpi.
\pgf@x=1.3333333\pgf@x%
\pgf@y=1.3333333\pgf@y%
% Add one pixel for security:
\advance\pgf@x by1pt%
\advance\pgf@y by1pt%
\pgf@sys@pt\pgf@x%
\pgfsysprotocol@flushcurrentprotocol%
\pgfsys@invoke{" height="}%
\pgf@sys@pt\pgf@y%
\pgfsysprotocol@flushcurrentprotocol%
\pgfsys@invoke{" type="image/svg+xml"><p>SVG-Viewer needed.</p></object>}%
\special{t4ht>\jobname-\the\pgf@sys@[email protected]}%
%%%%%%%% This is necessary to control the svg through css
\pgfkeys{%
/pgf/tex4ht node/css/.get=\pgfsys@foreignobject@css
}%
\pgfsys@invoke{<?xml version="1.0" encoding="\htmlencoding" standalone="no"?>\Hnewline% added that
<?xml-stylesheet href="\pgfsys@[email protected]" type="text/css"?>\Hnewline}% added that
%%%%%%%%%%%%%%% maybee I should add an option to change the css, for the whole picture
\pgfsys@invoke{<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" width="\the\pgf@xc"
height="\the\pgf@yc" viewBox="}%
\pgf@sys@pt{\pgf@xa}\pgf@sys@pt{\pgf@ya}\pgf@sys@pt{\pgf@xc}\pgf@sys@pt{\pgf@yc}%
\pgfsysprotocol@flushcurrentprotocol%
\pgf@ya=-\pgf@ya%
\pgfsys@invoke{">\Hnewline <g transform="translate(0,}
\pgf@sys@pt\pgf@yb\pgfsysprotocol@flushcurrentprotocol%
\pgfsys@invoke{) scale(1,-1) translate(0,}%
\pgf@sys@pt\pgf@ya\pgfsysprotocol@flushcurrentprotocol%
\pgfsys@invoke{)">\Hnewline }%
%
\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\box#1%
\pgf@xa=\pgf@trimright@final\relax \ifdim\pgf@xa=0pt \else\kern\pgf@xa\fi
\pgfsys@invoke{</g>\Hnewline </svg>\Hnewline }%
\special{t4ht<\jobname-\the\pgf@sys@[email protected]}%
}%
%% we'll use this hbox for the mtext rendering method (the "text only=true" option)
\def\pgfsys@hbox#1{%
\pgf@x=.5\wd#1%
\ifx\tikz@textcolor\relax\else\ifx\tikz@textcolor\@undefined\else%
\ifx\tikz@textcolor\pgfutil@empty%
\pgfsetfillcolor{.}%
\else%
\pgfsetfillcolor{\tikz@textcolor}%
\fi%
\fi\fi% tweak for TikZ
\HCode{<text
style="stroke:none"
transform="scale(1,-1) translate(\pgf@sys@tonumber{\pgf@x},0)"
text-anchor="middle"
}%
\ifpgfutil@format@is@latex%
\ifx\f@size\pgfutil@empty%
\else%
\HCode{ font-size="\f@size"}%
\fi%
\fi%
\HCode{>\Hnewline }%
\wd#1=0pt%
\ht#1=0pt%
\dp#1=0pt%
\box#1
\HCode{</text>\Hnewline }%
}%
%% we save this definition
\let\pgfsys@mtext@hbox\pgfsys@hbox
%% we have to use some "evil" ^^ tex4ht hackery
% tex4ht hackery
{% grouping necessary cause we change the catcode of ":"
\catcode`:=11\relax
%%% this is necessary to calculate the size of text nodes with
%%% inline maths
% (it is an improvement of tex4ht, got to ask eitan gurary if he
% could put it in the tex4ht code)
\gdef\DviMathAlt{%
\a:DviMath\leavevmode \MathClass
\ht:special{t4ht@(}\hbox\bgroup{\expandafter\ifx\csname
ht:everypar\endcsname\relax\expandafter\everypar\else
\expandafter\ht:everypar\fi{}\leavevmode\ht:special{t4ht@)}}\DviSend
}%
% these are configures for the foreignelement rendering method of text nodes : we let tex4ht write xhtml and mathml in the svg picture
%
\gdef\pgfsys@foreignobject@configure{%
\Configure{$}{\Configure{@math}{%\a:mathml
display="inline" }\DviMathAlt}{\EndDviMath}{}%%% we REALLY need to use \DviMathAlt here instead of \DviMath see above remark
\Configure{$$}{\Configure{@math}{%\a:mathml
display="block" }\IgnorePar
\ifvmode\else \HCode{<!--tex4ht:inline-->}\fi\EndP
\DviMath}{\EndDviMath\ShowPar\pgfsys@foreignobject@par{\csname HCondtrue\endcsname\noindent}
}{\DisplayMathtrue}%
\Configure{SUB}{\Send{BACK}{<\a:mathml msub><\a:mathml mrow\Hnewline>}%
\Tg</\a:mathml mrow>\Tg<\a:mathml mrow\Hnewline>\trap:base}{\Tg</\a:mathml mrow>\TG</\a:mathml msub\Hnewline>}%
\Configure{SUP}{\Send{BACK}{<\a:mathml msup><\a:mathml mrow\Hnewline>}%
\Tg</\a:mathml mrow>\Tg<\a:mathml mrow\Hnewline>\trap:base}{\Tg</\a:mathml mrow>\TG</\a:mathml msup\Hnewline>}%
\Configure{SUBSUP}{\Send{BACK}{<\a:mathml msubsup><\a:mathml mrow\Hnewline>}%
\Tg</\a:mathml mrow>\Tg<\a:mathml mrow\Hnewline>\trap:base}{\Tg</\a:mathml mrow>\Tg<\a:mathml mrow\Hnewline>\trap:base}{\Tg</\a:mathml mrow>\TG</\a:mathml msubsup\Hnewline>}%
\Configure{htf}{0}{+}{<span\Hnewline
class="}{\%s}{-\%s}{x-x-\%d}{}{">}{</span>}%
}%
\global\let\pgfsys@foreignobject@par=\par % use this instead of \par
% -- \Configure is no \long macro (at
% least in one of the older
% versions).
% these are the configures for the mtext rendering method of text
% nodes : we turn everything into regular character (don't want math
% modes or subsup)
% and we hope it works (it doesn't if the text nodes aren't simple)
\gdef\pgfsys@mtext@configure{%
% no configures for \(\) and \[\] those might be needed for
% context or Latex. Let me know !
\Configure{$$}{}{}{}% no block maths
\Configure{$}{}{}{}%$ no inline maths
\Configure{SUB}{\HCode{<tspan baseline-shift="sub">}}{\HCode{</tspan>}}%
\Configure{SUP}{\HCode{<tspan baseline-shift="sub">}}{\HCode{</tspan>}}%
\Configure{SUBSUP}{}{}{}% not both sub and sup
\Configure{htf} {0}{+}{<tspan font-family="}{\%s}{" font-size="\%s}{}{}{">}{</tspan>}%
}%
}%
% a counter to produce unique ids for each text node rendered with foreign element
\newcount\pgf@sys@svg@nodenum
% pgfutil@minipage
%
% I had to change it to make it play nice with the way tex4ht puts <p> and <\p> tags
%
\newif\ifpgfsys@textonly
\def\pgfutil@minipage[#1]#2{%
\hbox to#2\bgroup
\hsize=#2\relax
\vbox\bgroup
% though it works, I'm desabling the above mentioned hack to make tex4ht behave with <p> <\p>, because it blurps the positioning
% (I''l try to fix that later, it's a css thing)
%
% \ifpgfsys@textonly\else\HtmlParOn\fi
%
% \noindent is better as it doesn't produce indentation AND it makes you leave vertical mode
\noindent%\leavevmode
}%
\def\pgfutil@endminipage{%
% same thing here
%
% \ifpgfsys@textonly\else\EndP\HtmlParOff\fi
\egroup\egroup
}%
% I'll have to fix those names later
\newbox\pgfsys@foreignobject@Box
\newdimen\pgf@s
\newdimen\pgf@t
% this is the alternate hbox routine that renders text nodes through the foreignobject tag
\def\pgfsys@foreignobject@hbox#1{%
% Compute box y translation (x translation is correct).
\pgf@y=-\ht#1\relax
\HCode{<g transform="scale(1,-1) translate(0,\pgf@sys@tonumber{\pgf@y}) % got to translate in y
scale(0.5,0.5)">\Hnewline}% scaling work around (damn dumb browsers !)
% Compute box size (scaled 2 times)
% this is necessary to make the browser scale the font down 50% (the STUPID browsers won't make font-size:50% happen,
% so we have to work around this by making svg scale the things down 50%, doubling the size of the text node frame (i.e. no changement there)
\pgf@x=2\wd#1\relax
\pgf@y=2\ht#1\relax
\advance\pgf@y by 2\dp#1\relax
% this is to adjust the y translation to compensate for the differences between the TeX and the Html models for lines
\setbox\pgfsys@foreignobject@Box=\hbox{abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZf_1^1\overline D)_1^1\vec i\vec j$}%
\pgf@t=\ht#1\relax
\advance\pgf@t by -\ht\pgfsys@foreignobject@Box\relax
\pgf@s=\pgf@t\relax
\advance\pgf@s by \dp#1\relax
\advance\pgf@s by -\dp\pgfsys@foreignobject@Box\relax
\ifnum\pgf@s>0\relax
\pgf@s=0pt
\pgf@t=0pt
\else
\advance \pgf@y by -2\pgf@s\relax
\pgf@t=2\pgf@t\relax
\fi
%
\HCode{<foreignObject x="0" y="\pgf@sys@tonumber{\pgf@t}"
width="\pgf@sys@tonumber{\pgf@x}" height="\pgf@sys@tonumber{\pgf@y}">}%
% this is to make use of the css, class and id options through which you can control the way things display
\pgfkeys{%
/pgf/tex4ht node/css/.get=\pgfsys@foreignobject@css,%
/pgf/tex4ht node/class/.get=\pgfsys@foreignobject@class,%
/pgf/tex4ht node/id/.get=\pgfsys@foreignobject@id
}%
\HCode{<head>\Hnewline
<link rel="stylesheet" type="text/css" href="\pgfsys@[email protected]" />\Hnewline
</head>\Hnewline
% I'll have to look into this, perhaps there are better
% doctype.... aren't recognised and produces invalid svg
% pictures a workaround (not implemented yet) would be to make
% them into entities of the svg picture.
<body id="\pgfsys@foreignobject@id" class="\pgfsys@foreignobject@class" xmlns="http://www.w3.org/1999/xhtml" >\Hnewline
<div>\Hnewline
}%
\box#1%
\HCode{%
</div>\Hnewline
</body>\Hnewline
</foreignObject>\Hnewline
}%
% debug positioning not needed but it would be nice to let it there to control things later on
% \HCode{<rect x="0" y="0" width="\pgf@sys@tonumber{\pgf@x}" height="\pgf@sys@tonumber{\pgf@y}"
% style="fill:yellow;stroke:red; fill-opacity:0.5;stroke-opacity:0.5"/>}
\HCode{</g>\Hnewline}%
\global\advance\pgf@sys@svg@nodenum by 1\relax
}%
% the options and the code that controls it all (switches between \pgfsys@mtext@hbox and \pgfsys@foreignelement@hbox)
\pgfkeys{%
/pgf/.cd,
tex4ht node/escape/.is choice,
tex4ht node/escape/false/.code={\let\pgfsys@hbox\pgfsys@mtext@hbox\pgfsys@mtext@configure\pgfsys@textonlytrue},
tex4ht node/escape/true/.code={\let\pgfsys@hbox\pgfsys@foreignobject@hbox\pgfsys@foreignobject@configure\pgfsys@textonlyfalse},
tex4ht node/css/.initial=\jobname,
tex4ht node/class/.initial=foreignobject,
tex4ht node/id/.initial=\jobname\the\pgf@sys@svg@picnum-\the\pgf@sys@svg@nodenum
}%
% this might be needed
%\font\SvgText=cmr10\relax
% There is something rellay wrong with the way "%" chars are used in here... you should code "}%" to avoid unnecessary spaces
% and it is unnecessary to code \cs%
% got to be carefull with numbers though, cf the texbook...2\relax and 2 % are okey
\def\pgfsys@outerinvoke{\ifpgfpicture\expandafter\pgfsys@invoke\else\expandafter\pgfutil@gobble\fi}
\def\pgfsys@shadingoutsidepgfpicture#1{\pgf@sys@fail{svg code in preamble}}
\def\pgfsys@shadinginsidepgfpicture#1{\pgf@sys@fail{svg code in preamble}}
\def\pgfsys@body@shadingoutsidepgfpicture#1{%
\begingroup%
#1%
\setbox\pgfpic=\hbox to0pt{%
\pgfsys@beginpicture%
\pgfsys@beginscope%
\pgf@sys@svg@sh@defs%
\pgf@sys@svg@sh%
\pgfsys@endscope%
\pgfsys@endpicture%
\hss%
}%
\pgf@process{\pgf@sys@svg@pos}%
\pgf@picminx=0pt%
\pgf@picminy=0pt%
\pgf@picmaxx=\pgf@x%
\pgf@picmaxy=\pgf@y%
\def\pgf@shift@baseline{0pt}%
\pgfsys@typesetpicturebox\pgfpic%
\endgroup%
}
\def\pgfsys@body@shadinginsidepgfpicture#1{%
#1%
\pgf@sys@svg@sh@defs% hmmm....
\pgf@process{\pgf@sys@svg@pos}
\pgf@xa=-.5\pgf@x%
\pgf@ya=-.5\pgf@y%
\pgfsysprotocol@literal{<g transform="translate(\pgf@sys@tonumber{\pgf@xa},\pgf@sys@tonumber{\pgf@ya})">\Hnewline}%
\pgf@sys@svg@sh%
\pgfsysprotocol@literal{</g>\Hnewline}%
}
\ifpgfutil@format@is@latex
% Protect against color.4ht evil meddling with xcolor:
\RequirePackage{xcolor}
\let\pgf@xcolor@declaredcolor=\@declaredcolor
\let\pgf@xcolor@undeclaredcolor=\@undeclaredcolor
\fi
\AtBeginDocument{
\let\pgfsys@invoke=\pgfsys@body@invoke
\let\pgfsys@shadingoutsidepgfpicture=\pgfsys@body@shadingoutsidepgfpicture
\let\pgfsys@shadinginsidepgfpicture=\pgfsys@body@shadinginsidepgfpicture
\ifpgfutil@format@is@latex
\let\pgf@texht@declaredcolor=\@declaredcolor
\let\pgf@texht@undeclaredcolor=\@undeclaredcolor
\def\@declaredcolor{\ifpgfpicture\expandafter\pgf@xcolor@declaredcolor\else\expandafter\pgf@texht@declaredcolor\fi}
\def\@undeclaredcolor{\ifpgfpicture\expandafter\pgf@xcolor@undeclaredcolor\else\expandafter\pgf@texht@undeclaredcolor\fi}
\fi
\def\pgfutil@color{\pgfsetcolor}
% \ConfigureEnv{pgfpicture}{}{}{}{} there is no environment in plain TeX and this produces errors
% this might be needed for context or latex though....let me know !
}%
\endinput
%%% Local Variables:
%%% mode: latex
%%% End:
现在SVG
可以正确呈现了:
答案2
Michal 的解决方案完美地回答了我的问题。对于我的用例,我需要稍微重新打包它,因为我想从包的文档类文件中自动应用它,所以编辑pgfsys-tex4ht.def
对我来说不是一个选择。由于这对于评论来说太长了,我在这里给出了详细信息,但这实际上只是 Michal 想法的一个小变化。
为了自动应用 Michal 的“补丁”,我们扩展了与 htlatex 一起使用时,如何解决 pgf 中的错误?通过创建一个pgfsys-tex4ht-alt.def
包含以下内容的新文件:
% Two fixes to pgfsys-tex4ht.def due to Michal Hoftich
\input pgfsys-tex4ht.def
% from https://tex.stackexchange.com/questions/386757
\def\pgfsys@svg@newline{^^J}
% from https://tex.stackexchange.com/questions/390421
\RequirePackage{etoolbox}% for \patchcmd
\def\getEncoding#1charset=#2,#3\@nil{\if|#2|iso-8859-1\else#2\fi}
\def\htmlencoding{\expandafter\getEncoding\Preamble ,charset=,\@nil}
\patchcmd{\pgfsys@typesetpicturebox}{iso-8859-1}{\htmlencoding}{}{}
这里的第一行修复\Hnewline
了与 htlatex 一起使用时,如何解决 pgf 中的错误?最后一部分是 Michal 解决方案的代码,它使用\patchcmd
来自电子工具箱包裹。
pgfsys-tex4ht.def
我希望每当给出(可选)类选项时,我的文档类都会自动加载“修补”版本tikz
。这可以通过类文件中的以下几行来实现:
\newif\ifTikz\Tikzfalse
\DeclareOption{tikz}{\Tikztrue}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\PassOptionsToClass{a4paper}{article}
\ProcessOptions\relax
\LoadClass{article}
\ifTikz
% hack to fix two pgf bugs - apply only when when using tex4ht
\ifdefined\HCode
\def\pgfsysdriver{pgfsys-tex4ht-alt.def}
\fi
\RequirePackage{tikz}
\fi