使用 tikz 和 tex4ht 有哪些限制?

使用 tikz 和 tex4ht 有哪些限制?

当我尝试使用 tex4ht 进行 tikz 时,我发现一些小图片无法正确生成,这意味着它们显示的效果与使用 lualatex 编译时的效果不同。下面是一个例子

示例 1

\documentclass[12pt]{article}
\usepackage{tikz} 
\usepackage{tikz-qtree}
\usetikzlibrary{quotes,angles,calc}
\usetikzlibrary{arrows.meta}
\begin{document} 
\begin{tikzpicture}
    \Tree [.A
             [.\node(B){B}; ]
             [.\node(C){C}; ]
          ]
\begin{scope}[xshift=0in,yshift=-2cm]
    \Tree [.\node(Dx){D};
             [.E ]
             [.F ]
          ]
\end{scope}

\draw[-] (B) -- (Dx);
\draw[-] (C) -- (Dx);
\end{tikzpicture}
\end{document}

使用它进行编译时lualatex foo3.tex会给出这个 PDF

Mathematica 图形

但是当使用

   make4ht -ulm default -a debug foo3.tex "htm,mathjax"

HTML 页面显示如下

Mathematica 图形

示例 2

感谢薛定谔的猫在下面的评论中发布的代码,我尝试了该示例并且它在 lualatex 中有效,但在 tex4ht 中,即使树枝出现了,字母也会丢失。

\documentclass[12pt]{article} 
\usepackage{tikz} 
\begin{document} \begin{tikzpicture}[level distance=1cm,sibling distance=1cm] 
\node {A} child {node (B){B}} child {node (C){C}}; 
   \node[yshift=-2cm] (D) {D} child {node {E}} child {node {F}}; 
     \draw (B) -- (D) (C) -- (D); 
\end{tikzpicture} 
\end{document}

使用与上面相同的代码进行编译,以下是 PDF 版本

Mathematica 图形

这是 HTML

Mathematica 图形

我知道使用 tikz 和 tex4ht 应该有一些限制(但它甚至可以在一些示例上运行,这很好)。

但想知道是否有可能更清楚地了解这些限制是什么以及可以期待什么,以避免必须进行大量的反复试验才能知道某些东西在 tex4ht 中是否可行。

使用 TL 2020

答案1

TikZ默认驱动程序中的文本节点经常出现问题tex4ht。有两种方法可以解决此问题。您可以尝试设置TikZ 的选项,或者使用用于转换pgf/tex4ht node/escape的替代驱动程序 。dvisvgm

PGF 手册中对第一个选项的描述如下:

选择使用 tex4ht 驱动程序渲染文本节点的方法。当此键设置为 false 时,文本将 PR 转换为 svg 文本,但会受到一定限制:将显示简单字符(字母、数字、标点符号、、、...)、下标和上标(但不包括下标)但其他所有内容都将被过滤掉、忽略或生成无效的 html 代码(在最坏的情况下)。这意味着两种文本渲染效果相当好:

  1. 首先,纯文本没有数学模式、特殊字符或任何其他特殊内容。
  2. 第二,包含下标或上标的非常简单的数学文本。即便如此,变量也没有正确地设置为斜体,而且一般来说,简单的文本看起来不太好看。

如果您使用包含任何特殊内容的文本,即使像$\alpha$这样简单的内容,也可能会损坏图形。

\tikz \node[draw,/pgf/tex4ht node/escape=false] {例如:$(a+b)^2=a^2+2ab+b^2$};

当您编写 node[/pgf/tex4ht node/escape=true] {htexti} 时,pgf 会转回 html 来呈现 htexti。此方法在大多数情况下都会生成有效的 html 代码,并且对复杂文本节点的支持要好得多,因为在 {pgfpicture} 外部呈现良好的代码也应该在文本节点内部呈现良好。另一个优点是,在固定宽度的文本节点内,html 会对长行产生换行符。另一方面,您需要一个具有良好 svg 支持功能的浏览器来显示图片。此外,文本的显示方式会有所不同,具体取决于您的浏览器、系统上的字体和设置。最后,pgf 必须猜测浏览器呈现的文本的大小以对其进行缩放并防止其粘在节点上。如果失败,文本将被裁剪或太小。

您可以在 Tex4ht 配置文件中设置选项:

\Preamble{xhtml}
\tikzset{every node/.style={/pgf/tex4ht node/escape=true}}
\begin{document}
\EndPreamble

此方法不适用于您的第一个例子,但第二个例子有效:

在此处输入图片描述

第二种方法是使用替代方法TikZ 驱动程序. 在 之前添加以下几行\usepackage{tikz}

\ifdefined\HCode
  \def\pgfsysdriver{pgfsys-dvisvgm4ht.def}
\fi 

它适用于这两个示例并且总体上产生更好的结果,所以我更喜欢它。

第一个例子呈现:

在此处输入图片描述

相关内容