我在使用 tex4ht 和 tikz 时发现了另一个数学问题。这与之前的问题类似/后续 在 mathjax 模式下使用 tikz/forest 与 tex4ht 时不会生成任何数学运算 但是由于这会影响到现在tikzpicture
,所以forest
我认为提出新问题而不是弄乱旧问题会更好?
问题就在这里。使用上述问题中给出的修复方法后,现在使用时会显示数学forest
,但使用时tikzpicture
所有数学都会消失。
此外,当使用\left
或\right
甚至在forest
其中时,它都无法在 HTML 中正确呈现。
因此,在将数学与 tex4ht 和 tikz 结合使用时存在很大问题。可能是因为使用了 mathjax 模式。但这确实是我现在使用 tex4ht 的唯一模式。
这是 MWE
\documentclass[11pt]{article}
\usepackage[margin=2cm]{geometry}
\usepackage{amsmath}
\usepackage{tikz,tikzpagenodes}
\usepackage{etoolbox}
\usepackage{hyperref}
\usetikzlibrary{shapes,arrows}
\usetikzlibrary{positioning,fit}
\usepackage[edges]{forest}
\begin{document}
\begin{forest}
for tree={
draw, rounded corners, fill=blue!20,
minimum height=1.5cm, minimum width=2cm,
align=center, base=b,
s sep=1cm, l sep=.5cm,
if level<=2{edge=-latex}{edge=red},
}
[\begin{minipage}{2cm}
first order
{\begin{align*}
f(x,y,(y')^n)&=0\\
y'&=\left(a + b x + y\right)^{\frac{1}{n}}
\end{align*}
}
\end{minipage}
,calign=last
]
\end{forest}
\begin{tikzpicture}
\node [rectangle, minimum width=14cm] (A)
{
\begin{minipage}{2cm}
first order
\begin{align*}
f(x,y,(y')^n)&=0\\
y'&=\left(a + b x + y\right)^{\frac{1}{n}}
\end{align*}
\end{minipage}
};
\end{tikzpicture}
\end{document}
使用 lualatex 编译为 pdf 时,这是输出
使用 make4ht 编译时(需要使用下面的 .cfg)
make4ht -ulm default -a debug -c mycfg.cfg foo.tex "mathjax,htm" "-cunihtf -utf8"
这是 .cfg 文件,感谢上述链接中的 michal.h21
\Preamble{xhtml}
\makeatletter
\AddToHook{env/forest/begin}{%
\renewenvironment{align*}
{\start@align \@ne \st@rredtrue \m@ne}
{\math@cr \black@ \totwidth@ \egroup \ifingather@ \restorealignstate@ \egroup \nonumber \ifnum 0=`{\fi \iffalse }\fi \else $$\fi \ignorespacesafterend}
}
\makeatother
\begin{document}
\EndPreamble
在 Linux 上使用 TL 2022
>which tex4ht
/usr/local/texlive/2022/bin/x86_64-linux/tex4ht
>make4ht -v
make4ht version v0.3l
>
答案1
这个问题和上一个问题一样。我们需要在 TikZ 图片中恢复环境的原始版本。我制作了一个宏,可以在我们为 MathJax 重新定义环境之前保存环境。然后您可以使用命令恢复原始含义\RestoreMathJaxEnvironments
。您需要这个版本的mathjax-latex-4ht.4ht
:
% mathjax-latex-4ht.4ht (2022-10-17-13:57), generated from tex4ht-mathjax.tex
% Copyright 2018-2022 TeX Users Group
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
% version 1.3c of this license or (at your option) any
% later version. The latest version of this license is in
% http://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions
% of LaTeX version 2005/12/01 or later.
%
% This work has the LPPL maintenance status "maintained".
%
% The Current Maintainer of this work
% is the TeX4ht Project <http://tug.org/tex4ht>.
%
% If you modify this program, changing the
% version identification would be appreciated.
\immediate\write-1{version 2022-10-17-13:57}
\ExplSyntaxOn
\cs_new_protected:Npn \alteqtoks #1
{
\tl_set:Nx \l_tmpa_tl {\detokenize{#1}}
% % replace < > and & with xml entities
\regex_replace_all:nnN { \x{26} } { & } \l_tmpa_tl
\regex_replace_all:nnN { \x{3C} } { < } \l_tmpa_tl
\regex_replace_all:nnN { \x{3E} } { > } \l_tmpa_tl
% replace \par command with blank lines
\regex_replace_all:nnN { \x{5C}par\b } {\x{A}\x{A}} \l_tmpa_tl
\tl_set:Nx \l_tmpb_tl{ \l_tmpa_tl }
\HCode{\l_tmpb_tl}
}
\ExplSyntaxOff
\NewConfigure{MathJaxConfig}{1}
\NewConfigure{MathJaxMacros}[1]{%
\Configure{@BODY}{\bgroup\NoFonts\ttfamily\detokenize{\(}%
\special{t4ht*<#1}%
\detokenize{\)}\EndNoFonts\egroup}%
}
\long\def\AltlMath#1\){\expandafter\alteqtoks{\(#1\)}\)}
\long\def\AltlDisplay#1\]{\alteqtoks{\[#1\]}\]}
\long\def\AltMathOne#1${\alteqtoks{\(#1\)}$}
% this seems a bit hacky -- we need to skip some code inserted at the
% beginning of each display math
\long\def\AltlDisplayDollars#1$${\alteqtoks{\[#1\]}$$}
\newcommand\VerbMathToks[2]{%
\alteqtoks{\begin{#2}
#1
\end{#2}}%
}
\ExplSyntaxOn
\seq_new:N\:savedmathjaxenvs
\newcommand\:savemathjaxenv[1]{%
\seq_gput_right:Nn\:savedmathjaxenvs{#1}
\expandafter\let\csname mathjax-#1\expandafter\endcsname\csname #1\endcsname
\expandafter\let\csname mathjax-end#1\expandafter\endcsname\csname end#1\endcsname
}
\newcommand\RestoreMathJaxEnvironment[1]{%
\expandafter\let\csname #1\expandafter\endcsname\csname mathjax-#1\endcsname%
\expandafter\let\csname end#1\expandafter\endcsname\csname mathjax-end#1\endcsname%
}
\newcommand\RestoreMathJaxEnvironments{%
\seq_map_function:NN\:savedmathjaxenvs\RestoreMathJaxEnvironment%
}
\cs_generate_variant:Nn \regex_extract_once:nnNTF {nV}
\newcommand\VerbMath[2][]{%
\cs_if_exist:cTF{#2}{
\:savemathjaxenv{#2}%
\RenewDocumentEnvironment{#2}{+!b}{%
\NoFonts\expandafter\VerbMathToks\expandafter{\detokenize{##1}}{#2}\EndNoFonts%
\ifx\relax#1\relax\else%
\refstepcounter{#1}%
\regex_extract_once:nVNTF { label\s* \x{7B}([^\x{7D}]*)\x{7D}} {\l_tmpb_tl} \l_tmp_seq {\label{\seq_item:Nn\l_tmp_seq{2}}} {}%
\fi
}{}
}{}%
}
\ExplSyntaxOff
\def\fixmathjaxtoc#1{\Configure{writetoc}{\def#1{\detokenize{#1}}}}
\AtBeginDocument{%
\VerbMath{subarray}
\VerbMath{smallmatrix}
\VerbMath{matrix}
\VerbMath{pmatrix}
\VerbMath{bmatrix}
\VerbMath{Bmatrix}
\VerbMath{vmatrix}
\VerbMath{Vmatrix}
\VerbMath{cases}
\VerbMath{subequations}
\VerbMath{aligned}
\VerbMath{alignedat}
\VerbMath{gathered}
\VerbMath{gather}
\VerbMath{gather*}
\VerbMath{alignat}
\VerbMath{alignat*}
\VerbMath{xalignat}
\VerbMath{xalignat*}
\VerbMath{xxalignat}
\VerbMath{align}
\VerbMath{align*}
\VerbMath{flalign}
\VerbMath{flalign*}
\VerbMath{split}
\VerbMath{multline}
\VerbMath{multline*}
\VerbMath[equation]{equation}
\VerbMath{equation*}
\VerbMath{math}
\VerbMath{displaymath}
\VerbMath{eqnarray}
\VerbMath{eqnarray*}
\ConfigureEnv{gather}{}{}{}{}
\ConfigureEnv{gather*}{}{}{}{}
\ConfigureEnv{multline}{}{}{}{}
\ConfigureEnv{multline*}{}{}{}{}
\fixmathjaxtoc\int
\fixmathjaxtoc\,
\fixmathjaxtoc\sin
\fixmathjaxtoc\cos
\fixmathjaxtoc\tan
\fixmathjaxtoc\arcsin
\fixmathjaxtoc\arccos
\fixmathjaxtoc\arctan
\fixmathjaxtoc\csc
\fixmathjaxtoc\sec
\fixmathjaxtoc\cot
\fixmathjaxtoc\sinh
\fixmathjaxtoc\cosh
\fixmathjaxtoc\tanh
\fixmathjaxtoc\coth
\fixmathjaxtoc\log
\fixmathjaxtoc\ln
\fixmathjaxtoc\sum
\fixmathjaxtoc\(
\fixmathjaxtoc\)
\fixmathjaxtoc\begin
\fixmathjaxtoc\end
\fixmathjaxtoc\\
\fixmathjaxtoc\exp
\@ifpackageloaded{mhchem}{%
\def\ce#1{\texttt{\detokenize{\(\ce{#1}\)}}}
}{}
}
\endinput
所有使用此配置的 TikZ 环境都可以需要它(感谢@Qrrbrbirlbel 的启发):
\Preamble{xhtml}
\tikzset{every picture/.append code={\RestoreMathJaxEnvironments}}
\begin{document}
\EndPreamble
结果如下: