我有一个字符串,我试图拆分然后用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>
我整天都在和这个问题作斗争。有什么想法吗?
答案 0 :(得分:1)
像MathJax和jqMath这样的库为您执行此操作,处理数字,变量,运算符,嵌套括号,指数,矩阵等.MathJax支持用于复杂格式的LaTeX语法,其中jqMath只实现了更简单的基于unicode的语法。例如,在jqMath中,您可以M.sToMathE('x + 2')
创建MathML元素。 (你可以接受它的innerHTML我相信如果你真的想要它的字符串形式。)另见Jqmath - apply after page load。 (完全披露:我写了jqMath。)
答案 1 :(得分: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 += "−";
break;
case '*':
front += "×";
break;
case '/':
front += "/";
break;
case '±':
front += "±";
break;
default:
return "";
}
front += "</mo>";
return front;
}