
忙里偷闲,滚过来写
布置的作业……
MathType 是个大坑,回答完毕。接下来说为啥。
话说我也算是 MathType 准资深(DB)用户了,当然自从感觉用 DB 不好之后,我基本上已经抛弃它了,只是前不久因为玛尼的原因又捡起来用了用,30天试用期间又比较深入的折腾了下,也算是变成半个 MathType 砖家,于是被李阿玲拎过来写作业。
事情还要从很遥远的上个世纪开始说起……
在很可能看到这儿的你还没有出生的某个年月(1987),Design Science 发布了一款针对公式的图像编辑器,起名叫 MathType;
比尔大叔在次年发布了 Office 之后,觉得 Office 不能没有公式支持。他看 MathType 是好的,于是决定把 MathType 收过来(来源请求);
两家经过耐心细致的沟通交流,最终决定,Design Science 搞一个缩水版的 MathType 授权给微软使用,想要完整功能呢,用户还得从我这儿买。是年公元 1990。
于是在长达十五年的时间内,所有 Office 都自带 MathType 的缩水版,——没错你猜对了,这货就是坑死人不偿命的微软公式编辑器。
微软公式编辑器这十几年的时间内没多大变化,而 MathType 就不一样了,变化还不少。不过呢,这俩都是一种特殊的图像编辑器,用来排版数学公式的。用在 Office 中,是以 OLE(windows) 或者 EGO(OS X) 对象的形式嵌入到文档中,一方面存储了已经渲染好的图像(一般为矢量图,比如 Windows 平台上的 WMF,比如 EPS 等),另一方面为了自身编辑处理的需要,存储了自己格式(MTEF)的数据文件(或者将这些数据以64进制文本以注释的方式放在图片文件中)。
MathType 的各种牛(dou)逼(bi)功能,就依赖于这种特定的数据存储格式。
不得不说,当年 Design Science 造出来的这种公式存储格式,还是很有点儿意思的。熟悉公式的代码汪都了解,目前主流的公式处理方式,要么是结合线性与层级的 LaTeX 格式,要么是人看着别扭的层级 MathML,总的来说,用来显示的公式不容易用线性方式表示(当然用来给计算机算的还是应该往线性了写),MTEF 呢就是一种层级结构的嵌套表示方式。整个公式的创建与渲染过程,大体上类似于:
内容决定框的大小,模版各自有自己的排布方式和渲染方式,比如分数模版就在两个子框中间画一条线……于是一方面公式里面存的到底是个什么样儿的公式就知道了,顺带一起渲染了张图存了起来。
在 MTEQ 的宿主程序比如 word 中,MTEF 没有毛线用,宿主程序只负责把它那张图摆在这儿显示出来。
然而,虽然 MathType 借助于 Design Science 这种非常赚钱的营销方式,遍布于上百个不同的宿主应用中为它们提供公式编辑的支持,它的这种私有格式并没有得到广大不明真相的人民群众的支持,——OMML 好歹是 XML 文本而且文档丰富,你一私有的二进制格式还好多个不同版本不一定怎么变,开源社区就不待见了。于是啊,LibreOffice/OpenOffice 支持 OMML 公式的编辑修改、甚至部分的支持 MSEQ 3.0(猜测也是反向 doc 的时候顺带反出来的),就是那个缩水定制版 MathType 公式,却没办法正儿八经支持 MathType。
还有一个问题是关于字体的。MathType 安装之后会添加若干字体,而 MSEQ 却没有那些字体,所以大部分情况下,用 MSEQ 创建的公式都特别丑,大部分情况下用的是宋体(中文 word 下)。那 MathType 的字体又坑在哪儿呢?
说到这儿,不得不提到万恶的编码,关门!放 Unicode!
LaTeX 玩家应该了解,公式就是拿一堆字符堆起来么,变长、放大怎么了,我可以拿几个字符拼出一个爱多长多长的括号来……对了,MathType 也是这么干的,因为 Unicode 里面那些个字符就是这么玩儿的吖。
现在问题来了,如果我要的字符,Unicode 里面暂时没有,咋整?好说好说,换个别的字体,把字符都改掉就行了呗。嗯,大家都是这么干的,LaTeX 是,Word 是,MathType 也是……况且,Unicode 自己还给我们留了一些私有区域用来做这件事情。于是呢,我们从 MathType 面板里面敲出来的一些符号,它的实际编码可能跟符号不一样……MathType 在 MTEF/WMF 里面写了谁是用什么字体,但是别的软件不一定知道/不一定找得到啊,于是比如用 LibreOffice 打开带有 MathType 公式的 doc 文档之后,你经常会发现一堆乱码。别跟我说 WPS,它们也是 Design Science 的客户好么。
再说公式转换。前面提到了 MTEF 的层级嵌套格式,后来 Design Science 发现,卧槽这个格式屌爆了,大家的数学公式不都是差不多这么存的么?是不是就可以转来转去了?于是从某个版本开始,提供公式转换的功能,并且,自己定义了一种叫“转换定义语言”(tdl)的语法,想把 MathType 的公式转换搞成通用的平台。这个转换的原理其实很简单,把不同的模版用不同的代码替换掉、把对应的符号用对应的代码替换掉,从外层开始层层剥离,搞定。反过来的转换就稍微有些难度了,所以直到 MathType 6(是吧?),才开始支持 LaTeX 转 MathType。由于他们对 LaTeX 的掌握程度明显不如
,导致有些转换不对,并且转换不可逆,就是比如 LaTeX->MathType->LaTeX 这样就变样了(比如典型的 \cdot)。当然,这个跟 MathType 自己的格式有残缺有关,而正是这种残缺,使得 MathType 转换 LaTeX 时有不少恶心的表现,暂且不表。
由于 Design Science 那群人放着好好的 LaTeX 格式不用,自己造了那么个东西,而他们对 LaTeX 也不见得多么熟悉,所以目前版本的 MathType 自带的转换到 LaTeX 的定义文件写的很水很水,所以前面有人提到转换之后的 LaTeX 公式多了一些没用的 {},这个主要一方面怪 tdl 文件的定义不对,一方面也怪那个嵌套模型和傻傻的机器处理方式。总而言之言而总之,目前的 MathType 跟 LaTeX 公式(AMS)无法作双射。
(当然还是有方法让 MathType 转 LaTeX 的结果更好的,方法嘛,给李阿姨捐钱啊你懂的)
########### 孤独寂寞的昏哥线 ###########
上面都是内部细节,下面说说 MathType 的外在表现。
所见即所得,这是最大的优势。当然,与其它所有 WYSIWYG 软件一样,正因为这种优势,使得很多人造出来的公式其实不规范。举个栗子,
对 LaTeX 语法而言没所谓,顺序输入就可以了,但对于 WYSIWYG 的 MathType,甚至 Office 2010+ 的 OMML,由于模版-占位符和嵌套的效应,你需要时刻注意,比如上面的例子中,sin(x) dx 是在积分模版的那个框框里的,但等号不是。
这方面需要注意的其实还有不少,也正是因为注意不注意,显示效果对很多人而言没多大差别所以就没几个人去注意,所以……呵呵。
顺便,MathType 虽然所见即所得,如果你不去熟悉它那套快捷键,输公式根本不够快。当然,自从支持 LaTeX 转换之后,很多时候我是先打 LaTeX 公式,然后 Alt-\ 转过去。这个时候你又会遇到另一个坑,——word 的自动替换功能使得纯文本输入需要时刻注意。
再接下来,MathType 的另一个功能,公式编号。直接上结论好了,鉴于 MathType 自己提供的公式编号很多人学不会,而且操作起来也有不少坑,推荐使用 Word 题注的方式进行编号,并顺便了解下所谓的“样式分隔符”。
与 OMML 的比较:如果你的文档交换对象都用 Word,但可能还有人在用棺材里的 Word 2003,而且你说服不了他换成新版,——好吧你基本上告别 docx 跟 OMML 了,那就 MathType 吧,反正尽管他们没有 MathType 不能编辑也是能看到图片的;
否则,尽管目前 word 中 OMML 的公式渲染效果(嗯,这个问题相信如果某软把李阿姨拉到 Office 组里面是可以解决的,当然可能某软是真没本事结局这个问题,毕竟这么久了还是这个 SHI 样)还比不上不怎么好的 MathType,为了方便文档共享,还是别用 MathType 了。
最后,如果你非要用 MathType,一方面,一定要熟悉那些快捷键(至少上下标希腊字母什么的得熟练啊),另一方面,建议打开 `Show Nesting` 开关,方便看出嵌套关系。再有,注意区分行内公式与行间公式(虽然平常用没多大影响)。最后的最后,虽然我之前也没买过,如果你非要用,还是建议用正版(这公司弄这么点东西竟然能活到现在!你不考虑下帮人家续续命?毕竟人家也帮了你不少)。
(
来检查作业,哪儿还需要补充我再修改)
