我发现在添加\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 是
上述 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}
并运行上面相同的编译命令时,结果如下
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
此类带有扩展名的映射文件。.htf
tex4ht
这些映射必须手动创建,这是一项非常繁琐的工作。以下是此类映射的示例:
ntxmia 0 255
'Γ' '' Gamma 0
'∆' '' Delta 1
'Θ' '' Theta 2
'Λ' '' Lambda 3
'Ξ' '' Xi 4
'Π' '' Pi 5
'Σ' '' Sigma 6
'Υ' '' Upsilon 7
'Φ' '' Phi 8
'Ψ' '' 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 文件的示例: