这仅仅是 tex4ht 特有的问题。
此 MWE
\documentclass[11pt]{article}
\usepackage{amsmath}
\begin{document}
$ 2\ x\ {\arcsin x} $
\end{document}
是有效的 latex。它使用 lualatex 进行编译以
但是当使用 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 无法渲染它。
手动编辑上面的 HTML 并添加源中的额外空白,现在可以正常工作。
<!--l. 6--><p class="noindent" >\( 2\ x\ {\arcsin x} \)
在有人抱怨应该使用类似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} } { & } \l_tmpa_tl
\regex_replace_all:nnN { \x{3C} } { < } \l_tmpa_tl
\regex_replace_all:nnN { \x{3E} } { > } \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} } { & } \l_tmpa_tl
\regex_replace_all:nnN { \x{3C} } { < } \l_tmpa_tl
\regex_replace_all:nnN { \x{3E} } { > } \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 呈现: