使用时 David Carlisle 的样式表将 MathML 转换为LaTeX
,由于某些原因,符号subscript
上的integral
似乎显示得明显远离积分,如下所示:
数学语法:
<math xmlns:mml="http://www.w3.org/1998/Math/MathML">
<mrow>
<msubsup>
<mo stretchy="false">∫</mo>
<mn>0</mn>
<mi>1</mi>
</msubsup>
<mrow>
<msup>
<mi>x</mi>
<mi>3</mi>
</msup>
<mi>d</mi>
<mi>x</mi>
</mrow>
</mrow>
</math>
David 的样式表生成的 LaTeX[我在文件中加入了序言,tex
以便进行测试]:
\documentclass[11pt]{article}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{enumitem}
\usepackage[parfill]{parskip}
\usepackage{pmml-new}
\begin{document}
\par
\[\let\par\empty
{{{{\mo{\unicode{8747}}}}\sb{{{0}}}\sp{{1}}}{{\msup{{x}}{{3}}}dx}}
\]\par
\[\let\par\empty
{{{\mathop{{\mo{\unicode{8747}}}}\sb{{{0}}}}\sp{{1}}}{{\msup{{x}}{{3}}}dx}}
\]\par
\[\int_0^1x^3dx\]
\end{document}
评论:
- 上面的第一个排版是
MathML
使用 David 的样式表从上面生成的。在这里,您会注意到(如下面第一个积分所示),距离subscript 0
相当远integral
- 上面的第二个排版与第一个相同,但这里我用
manually
包围{\mo{\unicode{8747}}}}\sb{{{0}}}
了\mathop{...}
。现在你看到(在下面的第二个积分中)subscript 0
非常接近积分,这是理所当然的。 - 上面的第三种排版只是
LaTeX
为了比较而已。
从上述 LaTeX 生成的 PDF 的屏幕截图:
我的失败尝试:
看来 David 的以下部分pmm-nw.sty
和pmm2texfrag.xsl
文件在这里起到了显示这些上限/下限和下标/上标的作用。我dared
想修改它们,但没有成功。也许有人有更好的想法/建议。
pmm-nw.sty 文件的可能相关部分:
......
\def\msub#1#2{%
\mathop{#1}\nolimits\sb{#2}}
\def\mosub#1#2{%
#1\nolimits\sb{#2}}
\def\msup#1#2{%
\mathop{#1}\nolimits\sp{#2}}
\def\msubsup#1#2#3{%
\mathop{#1}\nolimits\sb{#2}\sp{#3}}
\def\mosubsup#1#2#3{%
#1\nolimits\sb{#2}\sp{#3}}
\def\munder#1#2{%
\mathop{#1}\sb{#2}}
\def\mover#1#2{%
\mathop{#1}\sp{#2}}
\def\munderover#1#2#3{%
\mathop{#1}\sb{#2}\sp{#3}}
.....
pmm2texfrag.xsl 文件的可能相关部分:
<xsl:template mode="pmml2tex" match="m:mover">
<xsl:text>{</xsl:text>
<xsl:text>\mathop{</xsl:text>
<xsl:apply-templates mode="pmml2tex" select="*[1]"/>
<xsl:text>}\limits</xsl:text>
<xsl:text>\sp{</xsl:text>
<xsl:apply-templates mode="pmml2tex" select="*[2]"/>
<xsl:text>}</xsl:text>
<xsl:text>}</xsl:text>
</xsl:template>
.....
<xsl:template mode="pmml2tex" match="m:munder">
<xsl:text>{</xsl:text>
<xsl:text>\mathop{</xsl:text>
<xsl:apply-templates mode="pmml2tex" select="*[1]"/>
<xsl:text>}\limits</xsl:text>
<xsl:text>\sb{</xsl:text>
<xsl:apply-templates mode="pmml2tex" select="*[2]"/>
<xsl:text>}</xsl:text>
<xsl:text>}</xsl:text>
</xsl:template>
<xsl:template mode="pmml2tex" match="m:munderover">
<xsl:text>{</xsl:text>
<xsl:text>\mathop{</xsl:text>
<xsl:apply-templates mode="pmml2tex" select="*[1]"/>
<xsl:text>}\limits</xsl:text>
<xsl:text>\sb{</xsl:text>
<xsl:apply-templates mode="pmml2tex" select="*[2]"/>
<xsl:text>}</xsl:text>
<xsl:text>\sp{</xsl:text>
<xsl:apply-templates mode="pmml2tex" select="*[3]"/>
<xsl:text>}</xsl:text>
<xsl:text>}</xsl:text>
</xsl:template>
答案1
一切都过去这么久了......
但
首先,您需要更正源中的命名空间声明,否则根本不匹配
<math xmlns="http://www.w3.org/1998/Math/MathML">
然后,真的pmml2tex
添加了太多的括号组(这使得它不太可能产生tex错误,但更有可能产生糟糕的间距)在这里,你可以用一个自定义的积分模板去掉其中一些,添加
<xsl:template mode="pmml2tex" match="m:msubsup[*[1]/self::m:mo='∫']">
<xsl:text>\int\sb{</xsl:text>
<xsl:apply-templates mode="pmml2tex" select="*[2]"/>
<xsl:text>}</xsl:text>
<xsl:text>\sp{</xsl:text>
<xsl:apply-templates mode="pmml2tex" select="*[3]"/>
<xsl:text>}</xsl:text>
</xsl:template>
生产pmml2texfrag.xsl
\[\let\par\empty
{
\int\sb{{0}}\sp{1}
{
{\msup{x}{3}}
d
x
}
}
\]
由此得到上述输出。