tex4ht 删除空格导致 mathjax 失败

tex4ht 删除空格导致 mathjax 失败

这仅仅是 tex4ht 特有的问题。

此 MWE

\documentclass[11pt]{article}
\usepackage{amsmath}
\begin{document}

$ 2\ x\ {\arcsin x} $

\end{document}

是有效的 latex。它使用 lualatex 进行编译以

Mathematica 图形

但是当使用 mathjax 模式编译为 HTML 时

  make4ht -ulm default  foo.tex "htm,mathjax"

生成的 latex 会丢失 和 之间的重要空白,x\ {变成x\{。这是原始 HTML

<!DOCTYPE html> 
<html lang="en-US" xml:lang="en-US" > 
<head><title></title> 
<meta  charset="utf-8" /> 
<meta name="generator" content="TeX4ht (http://www.tug.org/tex4ht/)" /> 
<meta name="viewport" content="width=device-width,initial-scale=1" /> 
<link rel="stylesheet" type="text/css" href="foo.css" /> 
<meta name="src" content="foo.tex" /> 
 <script type="text/x-mathjax-config"> MathJax.Hub.Config({ 'fast-preview': {disabled: true}, TeX: { extensions: ["color.js","AMSmath.js"], equationNumbers: { autoNumber: "AMS" } }, extensions: ["tex2jax.js"], tex2jax: {  inlineMath: [ ["\\\(","\\\)"] ], displayMath: [ ['$$','$$'], ["\\[","\\]"] ], processEscapes: true, processEnvironments: true } }); </script> 
 <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>  
</head><body 
>
<!--l. 6--><p class="noindent" >\( 2\ x\{\arcsin x} \)
</p>   

</body> 
</html>

因此,mathjax 无法渲染它。

Mathematica 图形

手动编辑上面的 HTML 并添加源中的额外空白,现在可以正常工作。

 <!--l. 6--><p class="noindent" >\( 2\ x\ {\arcsin x} \)

Mathematica 图形

在有人抱怨应该使用类似x\, {而不是仅仅使用类似的东西之前x\ {,此代码是由计算机代数程序自动生成的。 我没有自己写它。

在 Linux 上使用 TL 2019

答案1

这是由 TeX4ht 使用的一种变通方法引起的,该方法用于将 LaTeX 数学模式代码保留在 HTML 中。它使用 中定义的以下代码mathjax-latex-4ht.4ht

\ExplSyntaxOn
\cs_new_protected:Npn \alteqtoks #1
{
  \tl_set:Nx \l_tmpa_tl {\detokenize{#1}}
  % delete spaces before left brackets
  \regex_replace_all:nnN { \x{20} \x{7B} } { \x{7B} } \l_tmpa_tl
  % replace < > and & with xml entities
  \regex_replace_all:nnN { \x{26} } { &amp; } \l_tmpa_tl
  \regex_replace_all:nnN { \x{3C} } { &lt; } \l_tmpa_tl
  \regex_replace_all:nnN { \x{3E} } { &gt; } \l_tmpa_tl
  \tl_set:Nx \l_tmpb_tl{ \l_tmpa_tl }
  \HCode{\l_tmpb_tl}
}
\ExplSyntaxOff

它使用\detokenize命令来防止代码扩展并将其保存在标记列表中。然后它使用 LaTeX 3 正则表达式来修复一些问题。相关的是:

  % delete spaces before left brackets
  \regex_replace_all:nnN { \x{20} \x{7B} } { \x{7B} } \l_tmpa_tl

问题是\detokenize命令在命令后插入空格,因此例如\sqrt{a}转换为\sqrt {a}。在某些情况下,MathJax 无法显示此类代码。所以这就是我们使用它的原因。在您的例子中,您有\ {,它也会捕获这个正则表达式。

为了解决这个问题,我们可以引入另一个正则表达式来转换\ {为其他空间命令,例如\:

\regex_replace_all:nnN { \x{5C} \x{20} \x{7B} } { \x{5C} \x{3A} \x{7B} } \l_tmpa_tl

命令\x{code}包含我们要匹配的字符的十六进制代码,所以\x{5C} \x{20} \x{7B}意味着 \ {

改变后的函数如下所示:

\ExplSyntaxOn
\cs_new_protected:Npn \alteqtoks #1
{
  \tl_set:Nx \l_tmpa_tl {\detokenize{#1}}
  % delete spaces before left brackets
  \regex_replace_all:nnN { \x{5C} \x{20} \x{7B} } { \x{5C} \x{3A} \x{7B} } \l_tmpa_tl
  \regex_replace_all:nnN { \x{20} \x{7B} } { \x{7B} } \l_tmpa_tl
  % replace < > and & with xml entities
  \regex_replace_all:nnN { \x{26} } { &amp; } \l_tmpa_tl
  \regex_replace_all:nnN { \x{3C} } { &lt; } \l_tmpa_tl
  \regex_replace_all:nnN { \x{3E} } { &gt; } \l_tmpa_tl
  \tl_set:Nx \l_tmpb_tl{ \l_tmpa_tl }
  \HCode{\l_tmpb_tl}
}
\ExplSyntaxOff

生成的 HTML:

<p class='noindent'>\( 2\ x\:{\arcsin x} \)
</p>

由 MathJax 呈现:

在此处输入图片描述

相关内容