这是对此处回答问题的后续问题:make4ht 和 mathml 中的 mhchem 和分数问题。
使用相同的 MWE,但在方程中添加 hyperref、cleverref 和标签不会破坏反应(如果使用 mhchem 构建反应方程式 - 此处未显示),但它会破坏方程式引用并破坏方程式渲染。
\documentclass{book}
\usepackage[english]{babel}
\usepackage{amsmath}
\usepackage{wasysym}
\usepackage{hyperref}
\usepackage[noabbrev]{cleveref} % This makes references better
\usepackage[version=4]{mhchem}
\begin{document}
Text with formula \ce{CuCl2} and \ce{Cu^{2+}} referring to \ref{newLabel}.
\begin{equation}\label{newlabel}
\frac{\ce{mass CuCl2}}{1}\times\frac{\ce{1 mol CuCl2}}{\ce{MM of CuCl2}}= \mathord{?}\mathord{?}~\ce{ mol CuCl2}
\end{equation}
Text before a reaction.
\begin{equation}
\ce{Al^0 (s) -> Al^3+ (aq) + 3e-}\\
\ce{Cu^2+ (aq) + 2e- -> Cu^0 (s)}
\end{equation}
\end{document}
这使用了另一篇文章中的前言配置文件:config.cfg
\Preamble{xhtml,mathjax}
\def\ce#1{\texttt{\detokenize{\(\ce{#1}\)}}}
\begin{document}
\EndPreamble
并使用以下命令运行:
make4ht -c config.cfg mwe.tex
使用@michal.21 答案的代码片段的 HTML 如下:
<!DOCTYPE html>
<html lang='en' xml:lang='en'>
<head> <title></title>
<meta charset='utf-8' />
<meta content='TeX4ht (https://tug.org/tex4ht/)' name='generator' />
<meta content='width=device-width,initial-scale=1' name='viewport' />
<link href='mwe7.css' rel='stylesheet' type='text/css' />
<meta content='mwe7.tex' name='src' />
<script>window.MathJax = { tex: { tags: "ams", }, }; </script>
<script async='async' id='MathJax-script' src='https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js' type='text/javascript'></script>
</head><body>
<!-- l. 11 --><p class='noindent'>Text with formula <span class='cmtt-10'>\(\ce {CuCl2}\) </span>and <span class='cmtt-10'>\(\ce {Cu^{2+}}\) </span>referring to
<span class='cmbx-10'>??</span>.
</p><!-- l. 15 --><p class='indent'> \begin {equation} \@ifnextchar [\label@optarg \label@noarg {newlabel} \frac {\ce {mass CuCl2}}{1}\times \frac {\ce {1 mol CuCl2}}{\ce {MM of CuCl2}}= \mathord {?}\mathord {?}~\ce { mol CuCl2} \end {equation} <a id='x1-2r1'></a>
</p><!-- l. 17 --><p class='indent'> Text before a reaction.
</p><!-- l. 22 --><p class='indent'> \begin {align} \ce {Al^0 (s) -> Al^3+ (aq) + 3e-}\\ \ce {Cu^2+ (aq) + 2e- -> Cu^0 (s)} \end {align}
</p>
</body>
</html>
答案1
问题在于,它\label
位于逐字输出到 HTML 代码的环境内,因此 LaTeX 引用系统根本看不到它。
幸运的是,TeX4ht 将环境内容保存到标记列表中,并且使用 LaTeX 3 正则表达式,我们可以\label
在逐字块之外搜索并设置它。尝试此配置文件:
\Preamble{xhtml,mathjax}
\def\ce#1{\texttt{\detokenize{\(\ce{#1}\)}}}
\ExplSyntaxOn
\makeatletter
\cs_generate_variant:Nn \regex_extract_once:nnNTF {nV}
\AddToHook{env/equation/end}{%
\refstepcounter{equation}%
\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}}} {}
}
\makeatother
\ExplSyntaxOff
\begin{document}
\EndPreamble
由于 ,我们\label
在环境末尾执行了 应该 搜索的代码。我们手动更新计数器,因为在 MathJax 模式下不会自动完成。使用函数提取。是 MathJax 节点用于 MathJax 环境某些操作的变量,因此我们可以将其重新用于我们的目的。 找到后,我们在 regex 命令的 true 分支中输出。equation
\AddToHook{env/equation/end}
equation
\label
\regex_extract_once:nVNTF
\l_tmpb_tl
\label
结果如下: