使用带有 tikz forest 包的 htlatex 时出错,生成了无效的 SVG

使用带有 tikz forest 包的 htlatex 时出错,生成了无效的 SVG

htlatex 应该支持 tikz,\def\pgfsysdriver{pgfsys-tex4ht.def}并且在一些示例中确实如此tikz,但是对于其他一些示例,它给出了糟糕的 svg 图像。

更新

我能够将问题简化为一个更简单的例子。我将原始问题保留为附录。但这是更简单的 MWE。当在 tikz 中使用数学时,问题就会出现,并且只有当数学有点复杂时,比如分数。这是一个使用 htlatex 的示例:

\documentclass{article}
\ifdefined\HCode
\def\pgfsysdriver{pgfsys-tex4ht.def}
\fi
\usepackage{tikz,graphicx}
%
\usetikzlibrary{trees}
\begin{document}
\begin{tikzpicture}
 \node {root} 
  child {node {$a=b$}};
\end{tikzpicture}
\end{document}

然后htlatex foo.tex是 HTML:

在此处输入图片描述

所以,它起作用了。现在我改变了上面的内容,只把数学从 $a=b$ 改为 $\frac{a}{b}$,现在失败了

\documentclass{article}
\ifdefined\HCode
\def\pgfsysdriver{pgfsys-tex4ht.def}
\fi
\usepackage{tikz,graphicx}
%
\usetikzlibrary{trees}
\begin{document}
\begin{tikzpicture}
 \node {root} 
  child {node {$\frac{a}{b}$}};
\end{tikzpicture}
\end{document}

然后htlatex foo.tex出现错误

在此处输入图片描述

这是 htlatex 生成的 HTML 文件:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
  "http://www.w3.org/TR/html4/loose.dtd">  
<html > 
<head><title></title> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/)"> 
<meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/)"> 
<!-- html --> 
<meta name="src" content="t4.tex"> 
<meta name="date" content="2013-07-19 08:58:00"> 
<link rel="stylesheet" type="text/css" href="t4.css"> 
</head><body 
>
<!--l. 12--><p class="noindent" ><object data="t4-1.svg" width="33.99898 " height="77.82672 " type="image/svg+xml"><p>SVG-Viewer needed.</p></object>

</body></html> 

下面是针对上述失败情况生成的 SVG 文件的内容,该文件在上面的 HTML 中引用

<?xml version="1.0" encoding="iso-8859-1" standalone="no"?> 
<?xml-stylesheet href="t4.css" type="text/css"?> 
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24.74933pt" height="57.62027pt" viewBox="-12.37466 -51.2119 24.74933 57.62027 "> 
<g transform="translate(0, 6.40837 ) scale(1,-1) translate(0,51.2119 )"> 
    <g> 
 <g stroke="rgb(0.0%,0.0%,0.0%)"> 
 <g fill="rgb(0.0%,0.0%,0.0%)"> 
 <g stroke-width="0.4pt"> 
 <g> 
 <g> 
 <g> 
 <g transform="matrix(1.0,0.0,0.0,1.0,-9.04169,-3.0754)"> 
 <g fill="rgb(0.0%,0.0%,0.0%)"> 
 <text style="stroke:none" transform="scale(1,-1) translate(9.04169,0)" text-anchor="middle"  font-size="10"> 
root</text> 
</g> 
 </g> 
 </g> 
 </g> 
 <g> 
 <g> 
 <g> 
 <g transform="matrix(1.0,0.0,0.0,1.0,-3.3688,-44.43053)"> 
 <g fill="rgb(0.0%,0.0%,0.0%)"> 
 <text style="stroke:none" transform="scale(1,-1) translate(3.36882,0)" text-anchor="middle"  font-size="10"> 
<img 
src="t40x.png" alt="ab"  class="frac" align="middle"></text> 
</g> 
 </g> 
 </g> 
 </g> 
 <path d=" M  0.0 -6.60837 L  0.00002 -33.94635  " style="fill:none"/> 
 </g> 
 </g> 
 </g> 
 </g> 
 </g> 
 </g> 

        </g> 
</svg> 

t40x.png奇怪的是, svg 文件内部引用的文件实际上存在,并且确实正确显示了分数。那么问题出在 SVG 文件上吗?

这里是t40x.png

在此处输入图片描述

因此,数学运算生成正常,它似乎是一个 SVG 问题或类似的东西。

我希望以上内容有助于阐明问题所在。

更新于 2013 年 7 月 19 日下午 5 点

问题归结为上述 SVG 中的解析错误。在验证上述 SVG 文件中的 XML 代码时,使用http://www.w3schools.com/xml/xml_validator.asp,它给出了这个错误

在此处输入图片描述

所以问题是:可以做些什么来修复此类错误?为什么会出现此错误?可以采取任何措施来对这些 .svg 文件进行后期处理并使用某种脚本(perlsed等)进行修复,直到找到永久修复方法,以便可以用来htlatex生成tikz包含数学运算的图片?

更新于 2013 年 7 月 19 日下午 7 点 聊天中建议尝试将 mathjax 与 htlatex 结合使用,看看是否能使其显示带有 tikz 图片的数学运算。我试过了,但没有效果。

我不会在这里再次发布内容,而是发布一个指向我的 Latex 备忘单的链接,其中记录了这些内容 这里

如果其他人有其他建议让我尝试,我很乐意去做。我希望能够使用 tikz 制作带有标签中的数学的简单图表,但也希望将它们转换为 html,而不仅仅是 pdf。

附录(原始问题)

这是一个与 tikz 配合使用的示例

\documentclass{article}
\ifdefined\HCode
\def\pgfsysdriver{pgfsys-tex4ht.def}
\fi
\usepackage{tikz,graphicx}

\begin{document} 

\begin{tikzpicture}
\draw (0,0) --(1,2);
\end{tikzpicture}
\end{document}

编译后htlatex foo.tex得到一个显示图片的网页。

但是在这个例子中,使用forest包,网页会出现错误

\documentclass{article}
\ifdefined\HCode
\def\pgfsysdriver{pgfsys-tex4ht.def}
\fi
\usepackage{tikz,graphicx}
\usepackage{forest}
\begin{document} 

\begin{forest} for tree={draw,align=center}
[second order partial differential equation 
    [elliptic    
        [Laplace]
        [Poisson]    
    ]
    [parabolic]
    [hyperbolic]
]
\end{forest}

\end{document}

编译htlatex foo.tex然后加载 html 文件会出现错误

在此处输入图片描述

为什么有些例子会出现错误tikz,而其他例子则不会?

我尝试了这个答案中给出的两种解决方案Htlatex 和 Tikz 有时会创建错误的 svg (接受的那个和它之前的那个)。但使用任何一个都无法获得图像。这里我展示了给出的第一个解决方案

\documentclass{article}
\usepackage{tikz,graphicx}
\usetikzlibrary{external}
\makeatletter
\@ifpackageloaded{tex4ht}{
\tikzexternalize[mode=only graphics]
}{
\tikzexternalize
}
\makeatother

\tikzset{
png export/.style={
  /pgf/images/external info,
  /pgf/images/include external/.code={%
    \includegraphics
       [width=\pgfexternalwidth,height=\pgfexternalheight]
       {##1.png}%
   }
  }
}

\tikzset{png export}
\usepackage{forest}


\begin{document} 

\begin{forest} for tree={draw,align=center}
[second order partial differential equation 
    [elliptic    
        [Laplace]
        [Poisson]    
    ]
    [parabolic]
    [hyperbolic]
]
\end{forest}

\end{document}

然后运行显示的相同命令序列:

  pdflatex t3 -shell-escape
  for i in *.pdf; do convert -density 300 $i `echo $i | sed -e 's/\.pdf/\.png/g'`; done
  htlatex t3.tex

但是 HTML 现在只显示文本,没有线条,也没有图形:

在此处输入图片描述

它看起来应该是这样的(pdf 格式)

在此处输入图片描述

我怎样才能让森林包与 htlatex 一起工作?

我正在使用 TL 2013,并更新了所有软件包。在 Linux mint 15 上。

答案1

感谢大家的意见。这是建议我使用的解决方法,我想在这里记录下来。

虽然这只是一个解决方法,但它是一个非常好的解决方法。这个想法是使用单独的 latex 文件,使用 tikz+math 使用类来制作图表standalone

因此,每个图表都会有一个 latex 文件。

然后使用pdflatex生成pdf文件。

接下来,这些 pdf 文件将转换为 png。使用单独的 latex 文件,此 png 将包含在需要的位置。这样,htlatex 和 pdflatex 将能够正确处理最终文档。

步骤如下。

1) 为每个图表创建单独的 latex 文件。例如 diagram.tex

  \documentclass{standalone}
  \usepackage{tikz}
  \usetikzlibrary{trees}
  \begin{document}
  \begin{tikzpicture}
   \node {root}
    child {node {$\frac{a}{b}$}};
  \end{tikzpicture}
  \end{document}

2)将上述文件编译为pdf

  pdflatex diagram.tex

3)将pdf文件转换为png

  pdftoppm -png diagram.pdf > diagram.png

4)创建将使用上图的 latex 文件,例如 main.tex

  \documentclass{article}
  \usepackage{graphicx}

  \begin{document}

  The following diagram was generated using tikz+latex in
  a separate file

  \includegraphics{diagram.png}

  and it is now in html
  \end{document}

5)现在从上面制作pdf和html文件

  pdflatex main.tex
  htlatex main.tex

6)现在可以使用文件main.pdf和main.html了。

在此处输入图片描述

再次感谢大家的帮助。从现在开始我将使用此方法。

相关内容