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)”,由上面的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 === " ")


发布评论