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 文件进行后期处理并使用某种脚本(perl
、sed
等)进行修复,直到找到永久修复方法,以便可以用来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了。
再次感谢大家的帮助。从现在开始我将使用此方法。