使用 mhchem、make4ht 和 cleverref 时出现方程式渲染问题

使用 mhchem、make4ht 和 cleverref 时出现方程式渲染问题

这是对此处回答问题的后续问题: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

结果: 屏幕截图显示了红色的 LaTeX 代码片段,其中开始方程和结束方程以黄色突出显示

使用@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) -&gt; Al^3+ (aq) + 3e-}\\ \ce {Cu^2+ (aq) + 2e- -&gt; 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

结果如下:

在此处输入图片描述

相关内容