1

我有一个字符串,我试图拆分然后用 MathML 标签包装。目标是为方程提供一个 MathML(可能是 MathJax)渲染输出。我遇到的问题是将 MathML 标签与不同的子字符串匹配。

例如:

str = x + 2;
newStr = str.split(''); //returns [x,+,2]

我可以像这样循环遍历数组:

for (i = 0;i < newStr.length; i++) {
  write('<mn>' + newStr[i] + '</mn>')

但这仅适用于单个 MathML 标记。如何将每个子字符串映射到一个标签,用该标签包装它(最好根据变量引用标签),然后关闭标签(在使用多元素 MathML 时发挥作用<msup>)。

更新

例如,这就是我想要制作的:

输入:x + 2

输出:<mi>x</mi><mo>+</mo><mn>2</mn>

我整天都在与这个问题作斗争。有任何想法吗?

4

2 回答 2

1

MathJaxjqMath这样的库会为您执行此操作,处理数字、变量、运算符、嵌套括号、指数、矩阵等。MathJax 支持复杂格式的 LaTeX 语法,而 jqMath 只是实现了一个更简单的基于 unicode 的语法。例如,在 jqMath 中,您可以M.sToMathE('x + 2')创建一个 MathML 元素。(如果你真的想要它的字符串形式,我相信你可以使用它的 innerHTML。)另见Jqmath - 在页面加载后应用。(完全披露:我写了 jqMath。)

于 2012-01-17T17:25:05.330 回答
0

这是一个起点,展示了如何将这种转换为 MathML。另请注意,它比 javascript 更像是伪代码。

string str = x + 2
newStr = str.split('');

for (i = 0;i < newStr.length; i++)
{
    string value = Operator_AsMathML(newStr[i]);
    if(value == "")
    {
        if(isdigit(newStr[i][0])
            value = Number_AsMathML(newStr[i]);
        else
            value = Variable_AsMathML(newStr[i]);
    }   
    write(value);
}

string Number_AsMathML(string number)
{
    return "<mn>" + number + "</mn>";
}

string Variable_AsMathML(string varname)
{
    return "<mi>" + varname + "</mi>";
}

string Operator_AsMathML(string opname) const
{
    string front = "<mo>";

    switch(opname[0])
    {
        case '+':
            front += "+";
            break;

        case '-':
           front += "&#x2212;"; 
           break;

        case '*':
           front += "&times;";
           break;

        case '/':
           front += "/";
           break;

        case '±':
           front += "&#x00B1;";
           break;

        default:
           return "";
    }

    front += "</mo>";
    return front;
}
于 2012-01-25T21:09:45.023 回答