C# OMath()转义字符

C# OMath()转义字符,c#,ms-word,office-interop,C#,Ms Word,Office Interop,我试图通过OMath名称空间为Word编写一个等式,但无法正确生成转义字符。当我执行下面的控制台程序时,它正确地放置了分子和除数,但转义字符“\delta”仍与键入的完全相同,而不是变成小写delta的希腊符号 如果我将光标设置在\delta中的“a”之后,然后按空格键,则光标会转换。如果在功能区中单击“专业”,也会转换 有人能解释一下如何以编程方式创建转义字符,并使其正确显示吗 static void Main(string[] args) { string f

我试图通过OMath名称空间为Word编写一个等式,但无法正确生成转义字符。当我执行下面的控制台程序时,它正确地放置了分子和除数,但转义字符“\delta”仍与键入的完全相同,而不是变成小写delta的希腊符号

如果我将光标设置在\delta中的“a”之后,然后按空格键,则光标会转换。如果在功能区中单击“专业”,也会转换

有人能解释一下如何以编程方式创建转义字符,并使其正确显示吗

    static void Main(string[] args)
    {
        string fName = @"C:\Users\Desktop\Doc_1.docx";

        Word._Application myApp = new Word.Application();
        myApp.Visible = true;

        Word.Document myDoc = myApp.Documents.Open(fName);

        Word.Range myFunctionR = myApp.Selection.OMaths.Add(myApp.Selection.Range);
        Word.OMathFunction myFunction = myApp.Selection.OMaths[1].Functions.Add(
            myApp.Selection.Range, Word.WdOMathFunctionType.wdOMathFunctionBox);
        Word.OMathBox myBox = myFunction.Box;

        myBox.E.Range.Text = @"\delta = (PL)/(AE)";
        myBox.E.BuildUp();
    }
如果我从MS Word粘贴MathML,它看起来如下所示:

正确/所需版本:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">
<mml:mi>δ</mml:mi><mml:mi> 
<mml:mi> </mml:mi>
<mml:mo>=</mml:mo>
<mml:mfrac>
    <mml:mrow>
        <mml:mi>P</mml:mi>
        <mml:mi>L</mml:mi>
    </mml:mrow>
    <mml:mrow>
        <mml:mi>A</mml:mi>
        <mml:mi>E</mml:mi>
        </mml:mrow>
</mml:mfrac>
<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">
<mml:mo>\</mml:mo>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>l</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi> </mml:mi>
<mml:mo>=</mml:mo>
<mml:mfrac>
    <mml:mrow>
        <mml:mi>P</mml:mi>
        <mml:mi>L</mml:mi>
    </mml:mrow>
    <mml:mrow>
        <mml:mi>A</mml:mi>
        <mml:mi>E</mml:mi>
        </mml:mrow>
</mml:mfrac>

δ 
 
=
P
L
A.
E

不正确/编程版本:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">
<mml:mi>δ</mml:mi><mml:mi> 
<mml:mi> </mml:mi>
<mml:mo>=</mml:mo>
<mml:mfrac>
    <mml:mrow>
        <mml:mi>P</mml:mi>
        <mml:mi>L</mml:mi>
    </mml:mrow>
    <mml:mrow>
        <mml:mi>A</mml:mi>
        <mml:mi>E</mml:mi>
        </mml:mrow>
</mml:mfrac>
<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">
<mml:mo>\</mml:mo>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>l</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi> </mml:mi>
<mml:mo>=</mml:mo>
<mml:mfrac>
    <mml:mrow>
        <mml:mi>P</mml:mi>
        <mml:mi>L</mml:mi>
    </mml:mrow>
    <mml:mrow>
        <mml:mi>A</mml:mi>
        <mml:mi>E</mml:mi>
        </mml:mrow>
</mml:mfrac>

\
D
E
L
T
A.
 
=
P
L
A.
E

我已经解决了,两年后。。。以下方法将输入转义文本转换为格式正确的公式。然后,当调用OMath.build()时,它能够按照预期正确格式化方程式

请注意:我最初走的是一条MathML路径,这并不一定不好,但与我最初的目标相切。此路径使用Word的内置公式自动更正(奇特的查找和替换)生成正确的UTF编码字符

private string OMathAutoCorrect(string input)
    {
        if (string.IsNullOrEmpty(input)) return null;
        Globals.ThisAddIn.Application.OMathAutoCorrect.UseOutsideOMath = true;
        var retString = input;
        foreach (OMathAutoCorrectEntry ac in Globals.ThisAddIn.Application.OMathAutoCorrect.Entries)
        {
            if (retString.Contains(ac.Name))
            {
                var matchIndex = retString.IndexOf(ac.Name);
                var sb = new StringBuilder();
                //Capture all data prior to the match:
                sb.Append(retString.Substring(0, matchIndex));
                //Add the Match
                sb.Append(ac.Value);
                //Capture all data after the match:
                var indexAfterMatch = matchIndex + ac.Name.Length;
                var remLength = retString.Length - indexAfterMatch;
                sb.Append(retString.Substring(indexAfterMatch, remLength));
                retString = sb.ToString();

            }
            Debug.WriteLine($"{ac.Name}, {ac.Value}, Char#: {ac.Value.Length}");
        }

        Globals.ThisAddIn.Application.OMathAutoCorrect.UseOutsideOMath = false;
        return retString;
    }

要替换字母表,请使用以下代码

变量脚本=@“\delta=(PL)/(AE)”

script=script.Replace(“\delta”,“\u03B4”);}

您必须识别所有希腊字母,并替换为等效的UTF16代码

请在下面的网站上查找可用的aphabets列表