Htlatex 和 Tikz 有时会创建错误的 svg

Htlatex 和 Tikz 有时会创建错误的 svg

我有一个包含大量 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

更快、更干净,你不必担心操作系统批量转换命令。我从这里

相关内容