2024年6月14日发(作者:)

将MathML公式转换为域代码公式

在上一篇文章中将Html导出为Docx介绍了如何包含MathML公式的网页转换为Docx

文件,但我个人总是嫌Word公式不好看,在整理试卷的时候我用的都是Word自带的域代

码公式,所以想在题库导出中添加生成域代码公式的功能。

比方说2 的域代码公式是EQ R(2),如何用编程的方式将这个公式插入到Word文件

中去呢?可以用Open XML SDK 2.5 Productivity Tool打开包含这个公式的Word文件,找到

对应的方法如下:

Paragraph paragraph1 = new Paragraph(){ RsidParagraphAddition =

"002A4C03", RsidRunAdditionDefault = "003B4857" };

Run run1 = new Run();

FieldChar fieldChar1 = new FieldChar(){ FieldCharType =

};

(fieldChar1);

Run run2 = new Run();

FieldCode fieldCode1 = new FieldCode(){ Space =

ve };

= " EQ R(2)";

(fieldCode1);

Run run3 = new Run();

FieldChar fieldChar2

};

(fieldChar2);

(run1);

(run2);

(run3);

非常简单!因此我采用了如下方法实现了域代码公式的插入。

= new FieldChar(){ FieldCharType =

初步的尝试

在前端的Html页面中输入域代码公式,由于不想在页面中显示这个信息,我将它放置

标签的data-eq属性中,即:

然后在提交数据到后台的时候,将这个信息包装在一个自定义的标签中,即:

R(2)

在后端提取出“R(2)”,由上面的C#代码将域代码公式插入到Word中,可以正常显示。

期间费了好大劲解决了这么一个问题:前端输入题目所用的富文本编辑器是CKEditor,

它会自动将空的标签过滤掉,在网上搜到了答案(具体网址忘了记录,好像是在

CKEditor官网论坛上),即在配置文件中加上如下代码:

Config = function( config ) {

……

// 允许输入所有元素

dContent = {

$1: {

elements: ,

attributes: true,

styles: true,

classes: false

}

};

// 过滤掉不允许输入的元素

owedContent = 'script;

*[on*];a;blockquote;body;dd;dl;div;dt;fieldset;form;frame;framese

t;h1;h2;h3;h4;h5;h6;noframes;ol;ul;center;dir;hr;menu;pre;li;head

';

// 只允许输入的形式

(//g);

};

但这种做法有两个很大的问题:

1.在题库中已经输入了几千个以Latex格式的保存的公式,用这个方法意味着还需要

输入几千个域代码公式,工作量不小。

2.不能处理包含上,下标以及斜体的公式。

目前采用的前端方法

要解决上述第1个问题,思路很简单,因为Html网页中可以提取公式的Latex表达,

只要将它转变为域代码公式即可。以2 为例,就是将“(sqrt 2 )”转换成“R(2)”,但自

身水平不够不知如何处理。

万幸在

/questions/26357109/parsing-mathml-to-plain-math-expression找到了

另一个方法,即将MathML公式在前端转换为普通的文本格式,最关键的一个方法为

remove_tags,代码如下:

function remove_tags(node) {

var result = "";

var nodes = odes;

var tagName = e;

if (!) {

if (lue === " ")