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
这是我在 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