![Htlatex 和 Tikz 有时会创建错误的 svg](https://linux22.com/image/244403/Htlatex%20%E5%92%8C%20Tikz%20%E6%9C%89%E6%97%B6%E4%BC%9A%E5%88%9B%E5%BB%BA%E9%94%99%E8%AF%AF%E7%9A%84%20svg.png)
我有一个包含大量 Tikz 图片的文档,我需要从中生成一个 html 页面。我已声明一个驱动程序将 TikZ 图片作为 SVG(之后这个问题)并运行htlatex main.tex
:
\ifx\HCode\UnDef\else\def\pgfsysdriver{pgfsys-tex4ht.def}\fi
然而,有些图片 SVG 可以正确生成,而有些则不能(例如,这个问题)对于大多数,我得到了XML 解析错误:标签不匹配提到的错误</text>
,例如:
alt="ExAAel " class="pic-halign" ></text>
有没有什么网站可以帮助我了解 htlatex 支持哪种 TikZ 图片?
更新:
由于 SVG 生成存在问题,我决定尝试生成 png。我使用 tikzexternalize 作为安德鲁·史黛西建议。我使用的是 MacOs,因此我还需要安装(使用 macports)poppler 才能使用 pdftoppm 和 pnmtopng。这是我的示例文档:
\documentclass[11pt,a4paper]{article}
\usepackage{pgf}
\usepackage{tikz}
\usepackage{pgf}
\usetikzlibrary{external}
\tikzexternalize[prefix=figures_external/]
\begin{document}
\tikzset{external/system call={pdflatex \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource" && pdftoppm "\image.pdf" | pnmtopng > "\image.png"}}
\tikzset{external/figure name={tikz-figure}}
\begin{tikzpicture}
% Picture code
\end{tikzpicture}
\end{document}
不幸的是我得到了以下错误:
> Package tikz Error: Sorry, the system call 'pdflatex -halt-on-error > -interact ion=batchmode -jobname "figures_external/braids-figure0" "\def\tikzexternalreal > job{example_tikz_external}\input{example_tikz_external}" && pdftoppm > "figures_e xternal/braids-figure0.pdf" | pnmtopng > > "figures_external/braids-figure0.png"' did NOT result in a usable > output file 'figures_external/braids-figure0' (expe cted one of > .pdf:.jpg:.jpeg:.png:). Please verify that you have enabled system > calls. For pdflatex, this is 'pdflatex -shell-escape'. Sometimes it is > also nam ed 'write 18' or something like that. Or maybe the command > simply failed? Error messages can be found in > 'figures_external/braids-figure0.log'. If you continu e now, I'll try > to typeset the picture. See the tikz package documentation for > explanation. Type H <return> for immediate help.
我想知道外部化调用失败的原因是什么。
答案1
为了使用该tikz externalize
库,您需要使用--shell-escape
选项调用 latex,这样它才能运行外部命令。tex4ht
不允许运行外部命令。
我的解决方案是先运行pdflatex file -shell-escape
以获取 pdf 图形,然后使用将 pdf 文件转换为 png imagemagick
,最后运行htlatex
以插入生成的 png。
\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}
\begin{document}
\begin{tikzpicture}
\path (0,0) node[draw] (A) {A};
\path (2,0) node[draw] (B) {B};
\draw (A) -- (B) node[midway,above = 0 em] {via};
\end{tikzpicture}
\end{document}
命令序列:
pdflatex myfile -shell-escape
for i in example-figure*.pdf; do convert -density 300 $i `echo $i | sed -e 's/\.pdf/\.png/g'`; done
htlatex myfile
答案2
对我而言有用的 michal.h21 示例的修改版本是(MacOS,MacTex 2011):
\documentclass{article}
\usepackage{tikz,graphicx}
\usetikzlibrary{external}
\makeatletter
\@ifpackageloaded{tex4ht}{
\tikzexternalize[mode=only graphics]
\tikzset{png export/.style={/pgf/images/external info,/pgf/images/include external/.code={%
\includegraphics[width=\pgfexternalwidth,height=\pgfexternalheight]{##1.png}%
}
}
}
\tikzset{png export}%
}{%
\tikzexternalize%
\tikzset{pdf export/.style={/pgf/images/external info,/pgf/images/include external/.code={%
\includegraphics[width=\pgfexternalwidth,height=\pgfexternalheight]{##1.pdf}%
}
}
}
\tikzset{pdf export}%
}
\makeatother
\begin{document}
\begin{tikzpicture}
\path (0,0) node[draw] (A) {A};
\path (2,0) node[draw] (B) {B};
\draw (A) -- (B) node[midway,above = 0 em] {via};
\end{tikzpicture}
\end{document}
命令顺序与 michal.h21 建议的相同。这仍然不是完美的解决方案,因为对于一些图片,我得到了! 未定义控制序列 \Gin@ewidth ->\pgfexternalwidth 错误。
关于错误,我得到了使用的图片记得图片,例如来自http://www.texample.net/tikz/examples/beamer-arrows/。
答案3
使用以下解决方案(对 Skarab 的解决方案稍作修改),您不需要“手动”执行 pdf->png 转换的中间步骤:它是自动执行的(imagemagick
但您仍需要在系统中安装)。它适用于我在 Ubuntu 下使用 TeXLive:
\documentclass{article}
\usepackage{tikz,graphicx}
\usetikzlibrary{external}
\tikzset{
png copy/.style={
external/system call={
pdflatex \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource";
convert -density 300 -transparent white "\image.pdf" "\image.png"
}
}
}
\tikzset{png copy}
\makeatletter
\@ifpackageloaded{tex4ht}{
\tikzexternalize[mode=only graphics]
\tikzset{png export/.style={/pgf/images/external info,/pgf/images/include external/.code={\includegraphics[width=\pgfexternalwidth,height=\pgfexternalheight]{##1.png}}}}
\tikzset{png export}
}{
\tikzexternalize
\tikzset{pdf export/.style={/pgf/images/external info,/pgf/images/include external/.code={\includegraphics[width=\pgfexternalwidth,height=\pgfexternalheight]{##1.pdf}}}}
\tikzset{pdf export}
}
\makeatother
\begin{document}
\begin{tikzpicture}
\path (0,0) node[draw] (A) {A};
\path (2,0) node[draw] (B) {B};
\draw (A) -- (B) node[midway,above = 0 em] {via};
\end{tikzpicture}
\end{document}
因此,使用此解决方案,您只需 2 个步骤即可获得最终tex4ht
输出:
pdflatex -shell-escape mytexfile
htlatex mytexfile
更快、更干净,你不必担心操作系统批量转换命令。我从这里。