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はより単純なユニコードベースの構文を実装します。たとえば、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 に答える