Microsoft.Office.Interop.Word 数学

Microsoft.Office.Interop.Word OMath

这是我在 Whosebug 上的第一个问题,请耐心等待 :D

我实际上是在尝试通过 Visual Studio 环境中的 Microsoft.Office.Interop.Word 库从 .txt 文件生成 .docx 文件(我在 C# 中编码)。

这些 Word 文件旨在为儿童提供特定帮助(颜色、大小等)的练习。

一些 txt 文件包含我想使用特定工具 "OMath" 在 Word 上重新创建的方程式(如果我理解,将用于创建那些 "equation" 框)。

当时,我并没有一次生成超过1个盒子。例如,如果一个 txt 有 2 个或更多方程式,则所有方程式都创建在同一个方程式框中,而不是单独创建。

我试过这样的代码:

using Word = Microsoft.Office.Interop.Word;

...

Word.Application wapp = new Word.Application();
Word.Document wdoc = wapp.Documents.Add();

...

wpara = wdoc.Paragraphs.Add();
e.ElementAspect.setFormat(ref wpara); // set wpara format (color, font ...)
Word.Range test1 = wapp.Selection.Range;
test1.Text = e.Content;
test1 = wpara.Range.OMaths.Add(test1);
Word.OMath equation = test1.OMaths[1];
equation.BuildUp();

首先,你不需要使用wapp.Selection对象。 Selection 用于文档中的当前 cursor/user 位置(简而言之)- Selection interface

其次,使用我测试过的wpara = wdoc.Paragraphs.Add(),给你当前选择的段落。

此代码(如您遇到的那样)将在每次迭代中覆盖先前的方程式。

for (int i = 1; i <= 10; i++)
{
    var para = oDoc.Paragraphs.Add();
    var paraRange = para.Range;
    paraRange.Text = "x^2 + " + i + " = y";     
}

最后,您可以向 OMaths 对象添加多个范围,并使用 BuildUp 一次构建所有范围。

尝试此代码并将其与您的解决方案相结合:

var oWord = new Word.Application();
oWord.Visible = true;                       
var oDoc = oWord.Documents.Add();
var math = oDoc.OMaths;

for (int i = 1; i <= 10; i++)
{
    oDoc.Paragraphs.Add();
    var para = oDoc.Paragraphs[i];
    var paraRange = para.Range;
    paraRange.Text = "x^2 + " + i + " = y";
    math.Add(paraRange);
}
math.BuildUp();
oWord.Quit();

/编辑

正如@JLA 所发现的,更复杂的场景,如 \mapsto 不起作用。

第一次尝试:单词宏

Word under the scenes 设法转换它,所以在开发者功能区选项卡中我启用了录音,只是注意到启用录音后它不再工作了...

第二次尝试:将 LaTeX 转换为 MathML

来自问题 Tools for converting LaTeX equations to Content MathML or OpenMath? I got SnuggleTeX with live demo converting to MathML 但它仅适用于非常简单的场景,例如:

<math xmlns="http://www.w3.org/1998/Math/MathML"><mfrac><mn>1</mn><mn>2</mn></mfrac></math>

添加到 Word 的代码:

Clipboard.SetText("<math xmlns=\"http://www.w3.org/1998/Math/MathML\"><mrow><mn>1</mn><mn>x</mn></mrow></math>", TextDataFormat.Text);

第三次尝试:自己转换

将所有不适用于 OMath 的特殊名称更改为 UTF-16 字符。例如:

\mapsto = \u27FC

Word 代码:

paraRange.Text = "x^2 + "+ i + '\u27FC' +" y";

对于在该库上搜索答案的任何人,由于 msdn 文档不是那么友好,我根据我的理解制作了一个快速文档 (PDF)(它是法语的,但我相信您可能会设法理解代码部分 ;) )

https://drive.google.com/file/d/0BybogIUkJwCfU2kzU3E4cE1HX2c/view?usp=sharing