将 MathML 转换为 LaTeX:使用 \mathop 和 msub 标签

将 MathML 转换为 LaTeX:使用 \mathop 和 msub 标签

使用时 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}

评论

  1. 上面的第一个排版是MathML使用 David 的样式表从上面生成的。在这里,您会注意到(如下面第一个积分所示),距离subscript 0相当远integral
  2. 上面的第二个排版与第一个相同,但这里我用manually包围{\mo{\unicode{8747}}}}\sb{{{0}}}\mathop{...}。现在你看到(在下面的第二个积分中)subscript 0非常接近积分,这是理所当然的。
  3. 上面的第三种排版只是LaTeX为了比较而已。

从上述 LaTeX 生成的 PDF 的屏幕截图

在此处输入图片描述

我的失败尝试

看来 David 的以下部分pmm-nw.stypmm2texfrag.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='&#x222b;']">
 <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
}
}


\]

由此得到上述输出。

相关内容