一、什么是EQ域?
嗯,大概清楚了。它是用来编写公式用的东东。那该怎么怎么使用呢?
二、EQ域的基本使用
基本格式是{ eq switch}
eq为域的限定符,switch代表开关,如:分数开关 \f(分子,分母)
。实例{ eq \f(3,4)}
渲染出来的是3 4 \frac{3}{4}43。注意:在WORD中直接输入该格式的文本是不起作用的,需要使用ctrl + f9
快捷键插入一个域,此时会自动添加出一对花括号{}
,然后再输入eq限定符及相应的开关即可。
三、EQ域开关switch
明白了EQ域如何用后,接下来了解开关的编写及都有哪些关种类。上面已经介绍过了一个分数开关\f(3,4)
基本结构就是 \开关字符[\参数1\参数2..](表达式)
。
EQ域开关主要有以下几种:
- 数组开关
\a [参数...] (表达式1[,表达式2[,...]])
参数值如下:- \al 左对齐
- \ac 居中对齐
- \ar 右对齐
- \co{n} 将表达式中的元素排n列,如:
\co6
- \vs{n} 设置行间距为n磅,如:
\vs6
- \hs{n} 设置列间距为n磅,如:
\hs6
- 括号开关
\b [参数...] (表达式)
,参数值如下:- \lc{c} 设置左边括号为字符c,如:
\lc\{
- \rc{c} 设置右边括号为字符c,如:
\rc\}
- \bc{c} 设置左右括号为字符c,如:
\bc\|
- \lc{c} 设置左边括号为字符c,如:
- 位移开关
\d [参数...] (表达式)
,参数值如下:- \fo{n} 下一个字符向右移动n磅
- \ba{n} 下一个字符向左移动n磅
- \li 为下一个字符前的空白添加下划线
- 分数开关
\f(分子表达式, 分母表达式)
- 积分开关
\i [参数...] (表达式1,表达式2,表达式3)
,参数值如下:- \pr 积分号改为求积
- \in 积分限不写到上下,而是改为右边
- \fc{n} 积分号改为固定大小的符号n
- \vc{n} 积分号改为可变大小的符号n,可随着积分表达式大小变化
- 列表开关
\l(表达式)
- 重叠开关
\o(表达式)
- 根号开关
\r(,)
- 上下标开关
\s()
- \ain() 在段落上面添加n磅的空白
- \din() 在段落下面添加n磅的空白
- \upn() 将给定的字符向上平移n磅
- \don() 将给定的字符向下平移n磅
- 方框开关
\x()
- \ri 在右边添加边框
- \to 在上边添加边框
- \bo 在下边添加边框
四、思考
如果想把eq域公式在web中显示,我们该怎么做???网页中是怎样显示数学公式的???
MathML
数学标记语言,是一种基于XML(标准通用标记语言的子集)的标准,用来在互联网上书写数学符号和公式的置标语言。
对,就是它。先来看一下,上面我们提到的3 4 \frac{3}{4}43 ,用MathML来编写,结构如下:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mfrac>
<mn>3</mn>
<mn>4</mn>
</mfrac>
</math>
- 1
- 2
- 3
- 4
- 5
- 6
这个是可以直接在网页显示的,但是直接放到浏览器中运行会发现,样式不太对。so,MathJax前端插件就出现了,我们用它来渲染显示,立马就不一样。当你在页面右键一个公式:
有个TeX Commands
菜单,点击后:
嗯,这才是我们的主菜!!!\frac{3}{4}
与EQ域代码\f(3,4)
对比一下是不是十分相像?突破点就在这里。我们只要把EQ代码里的f => frac; ( => {; , => }{; ) => }
这样一替换不就实现转换过来了吗?然后用MathJax进行渲染就可以了。
思路就是将EQ域的公式代码转换成Latex格式代码,即可实现在网页中显示。用C#写的部分思路代码如下:
static string ConvertEqToLatex(string strEqution)
{
Regex reg = new Regex(@"((?<cmd>\\f|\\r)\((?<con>(?:[^()])+?)\))+?");
MatchCollection mc = reg.Matches(strEqution);
if (mc.Count <= 0)
{
return strEqution;
}
foreach(Match m in mc)
{
string strReplace = "";
if (m.Groups["cmd"].Value.Contains("\\f"))
{
strReplace = m.Groups["con"].Value.Replace(@",", "}{");
strReplace = @"\frac{" + strReplace + "}";
}
else if (m.Groups["cmd"].Value.Contains("\\r"))
{
strReplace = @"\sqrt{" + m.Groups["con"].Value + "}";
}
else //if(...)
{
// todo: 完善其它开关的转化...
}
strEqution = strEqution.Replace(m.Value, strdh);
}
return ConvertEqToLatex(strEqution);
}
五、总结
记录一下最近项目遇到的情景,需要对WORD文档进行解析处理。文字图片什么的都好说,公式的处理确实挺麻烦的,需要花点时间专研。