拆分字符串并将子字符串包装在mathml标记中

split a string and wrap substrings in mathml tags

本文关键字:字符串 mathml 字符 串并 拆分 包装      更新时间:2023-09-26

我有一个字符串,我试图将其拆分,然后用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标记。我如何将每个子字符串映射到一个标签,用该标签包装它(最好是用变量来指代标签),然后也关闭标签(在使用像<msup>这样的多元素MathML时发挥作用)。

更新

例如,这就是我试图生产的:

输入:x + 2

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

我一整天都在和这个问题作斗争。有什么想法吗?

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

这里有一个起点,展示了如何将这种转换为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;
}