为什么使用 {newtxtext,newtxmath} 包会破坏 tex4ht 中的 MathML 生成?

为什么使用 {newtxtext,newtxmath} 包会破坏 tex4ht 中的 MathML 生成?

我发现在添加\usepackage{newtxtext,newtxmath}由 tex4ht 生成的换行符时,数学运算在浏览器中看起来很糟糕。这似乎是字体问题。

我正在使用 texlive 2014,几周前我更新了它。这是 MWE

\documentclass[10pt,notitlepage]{article}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{newtxtext,newtxmath}
\usepackage{etex}    
\begin{document}
\[
  \int \sin(x) \, dx
\]
\end{document}

我使用标准 .cfg 将其构建为具有 mathjax 支持的 mathml。我将展示使用的命令、HTML 输出和我正在使用的 .cfg。
要编译上述内容:

htlatex foo.tex "nma.cfg,charset=utf-8" " -cunihtf -utf8"

(/usr/local/texlive/2014/texmf-dist/fonts/tfm/public/newtx/ntxmia.tfm)
--- warning --- Couldn't find font `ntxmia.htf' (char codes: 0--255)
(/usr/local/texlive/2014/texmf-dist/fonts/tfm/public/newtx/ntxmia.tfm)
--- warning --- Couldn't find font `ntxmia.htf' (char codes: 0--255)
....

生成的 HTML 是

Mathematica 图形

上述 HTML 的源代码是

<!DOCTYPE html> 
<html> 
<head> <title></title> 
<meta charset="UTF-8" /> 
<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/)" /> 
<link rel="stylesheet" type="text/css" href="foo.css" /> 
<script type="text/x-mathjax-config"> MathJax.Hub.Config({ extensions: ["tex2jax.js"], jax: ["input/TeX", "output/HTML-CSS"], tex2jax: { inlineMath: [ ['$','$'], ["\\(","\\)"] ], displayMath: [ ['$$','$$'], ["\\[","\\]"] ], processEscapes: true }, "HTML-CSS": { availableFonts: ["TeX"] } }); </script> <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"> </script><style type="text/css"> .MathJax_MathML {text-indent: 0;} </style></head><body 
>
   <div class="par-math-display"><!--l. 8--><math 
 xmlns="http://www.w3.org/1998/Math/MathML"  
display="block" ><mrow 
>
                                                           <mo 
class="MathClass-op">Z
<!--nolimits--></mo><!--nolimits--><mo class="qopname"> sin</mo><!--nolimits--><mrow ><mo 
class="MathClass-open">}</mo><mrow><mo 
class="MathClass-op">x</mo></mrow><mo 
class="MathClass-close">~</mo></mrow><mspace width="0.3em" class="thinspace"/><mrow ><mo 
class="MathClass-open">d</mo><mrow><mo 
class="MathClass-op">x</mo>
</mrow></math></div>
<!--l. 10--><p class="nopar" >  
</body> 
</html>

现在,当注释%\usepackage{newtxtext,newtxmath} 并运行上面相同的编译命令时,结果如下

Mathematica 图形

HTML 源代码如下

<!DOCTYPE html> 
<html> 
<head> <title></title> 
<meta charset="UTF-8" /> 
<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/)" /> 
<link rel="stylesheet" type="text/css" href="foo.css" /> 
<script type="text/x-mathjax-config"> MathJax.Hub.Config({ extensions: ["tex2jax.js"], jax: ["input/TeX", "output/HTML-CSS"], tex2jax: { inlineMath: [ ['$','$'], ["\\(","\\)"] ], displayMath: [ ['$$','$$'], ["\\[","\\]"] ], processEscapes: true }, "HTML-CSS": { availableFonts: ["TeX"] } }); </script> <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"> </script><style type="text/css"> .MathJax_MathML {text-indent: 0;} </style></head><body 
>
   <div class="par-math-display"><!--l. 8--><math 
 xmlns="http://www.w3.org/1998/Math/MathML"  
display="block" ><mrow 
>
                                             <mo 
class="MathClass-op">∫
 <!--nolimits--></mo><!--nolimits--><mo class="qopname">sin</mo><!--nolimits--><mrow ><mo 
class="MathClass-open">(</mo><mrow><mi 
>x</mi></mrow><mo 
class="MathClass-close">)</mo></mrow><mspace width="0.3em" class="thinspace"/><mi 
>d</mi><mi 
>x</mi>
</mrow></math></div>
<!--l. 10--><p class="nopar" >  
</body> 
</html>

nma.cfg我在编译命令中使用的文件是:

\Preamble{mathml} 
\Configure{VERSION}{}
  \Configure{DOCTYPE}{\HCode{<!DOCTYPE html>\Hnewline}}
  \Configure{HTML}{\HCode{<html>\Hnewline}}{\HCode{\Hnewline</html>}}
  \Configure{@HEAD}{}
  \Configure{@HEAD}{\HCode{<meta charset="UTF-8" />\Hnewline}}
  \Configure{@HEAD}{\HCode{<meta name="generator" content="TeX4ht
  (http://www.cse.ohio-state.edu/\string~gurari/TeX4ht/)" />\Hnewline}}
  \Configure{@HEAD}{\HCode{<link
           rel="stylesheet" type="text/css"
           href="\expandafter\csname aa:CssFile\endcsname" />\Hnewline}}

  \Configure{@HEAD}{\HCode{%
     <script type="text/x-mathjax-config">
       MathJax.Hub.Config({
         extensions: ["tex2jax.js"],
         jax: ["input/TeX", "output/HTML-CSS"],
         tex2jax: {
           \unexpanded{inlineMath: [ ['$','$'], ["\\(","\\)"] ],}
           \unexpanded{displayMath: [ ['$$','$$'], ["\\[","\\]"] ],}
           processEscapes: true
         },
         "HTML-CSS": { availableFonts: ["TeX"] }
       });
     </script>
  }}

  \Configure{@HEAD}{\HCode{<script type="text/javascript"
    src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
    </script>}}

  \Configure{@HEAD}{\HCode{<style type="text/css">
    .MathJax_MathML {text-indent: 0;}
  </style>}}
\begin{document}
\EndPreamble

答案1

问题在于缺少字体和 Unicode 之间的映射文件。对于 支持的每种字体,都必须存在newtx此类带有扩展名的映射文件。.htftex4ht

这些映射必须手动创建,这是一项非常繁琐的工作。以下是此类映射的示例:

ntxmia 0 255
'&#x0393;' '' Gamma 0
'&#x2206;' '' Delta 1
'&#x0398;' '' Theta 2
'&#x039B;' '' Lambda 3
'&#x039E;' '' Xi 4
'&#x03A0;' '' Pi 5
'&#x03A3;' '' Sigma 6
'&#x03A5;' '' Upsilon 7
'&#x03A6;' '' Phi 8
'&#x03A8;' '' Psi 9
....
Much more lines

第一行包含字体名称、字体支持的第一个字符的编号和最后一个字符的编号。然后开始实际映射。它从第一个字符编号开始直到最后一个字符。该行包含三个记录 - 第一个是用于字符的映射,第二个指定是否应将其转换为图片,其余是注释,通常是字形名称和字符编号。映射包含字符的 XML 实体或单引号中的 ASCII 字符串。有关格式的更多详细信息,htf请参阅tex4ht 文档

无论如何,我创建了一个自动文件生成的工具htf,叫做赫特根。我在这个问题发布时就开始开发,并开发了一堆脚本和库,试图实现这个目标。经过近四年的时间,结果终于看起来很有趣。我创建了一个新库,它可以获取字体名称,检测它是真实字体还是虚拟字体,查找所有使用的字形并查找它们的 Unicode 字符。这个库由新脚本使用,它可以检测 dvi 文件中所有使用的字体并生成 TeX 文件,该文件将为所有尚无文件的字体dvitohtf生成文件。.htf

可以这样使用

 dvitohtf foo.htf > newtx.tex
 tex newtx.tex

这将生成一堆htf文件。请注意,文件中有很多这样的消息newtx.tex

 Missing glyph npropersuperset 

此消息表示没有已知的从此字形到 Unicode 的映射。Newtx 字体中有很多此类缺失字形,一旦找到正确的 Unicode 映射,就必须将对它们的支持添加到 Htfgen。如果存在。

文件nextxt.tex太大,无法在此处发布,因此您可以下载它这里

这是使用新 htf 文件的示例:

在此处输入图片描述

相关内容