悠闲数学娱乐论坛(第2版)'s Archiver

kuing 发表于 2017-11-24 17:14

MathType转码规则研究

之前一直用 mathtype6.0,昨天换了 mathtype6.9,发现在复制为 latex 代码时比之前有了更多的 { },就连简单的 $a^2+b^2$ 都变成 {a^2} + {b^2}。

闲来无事,不如鼓捣一下它的转码规则,于是在其安装目录里找到了相关文件,它们都在 C:\Program Files\MathType\Translators 中,用文本编辑器打开里面的文件就可以看到内容,那些代码连蒙带猜大概还是看得懂的。

为了对比研究,我同时也打开以前保存的 6.0 绿色版的 Translators 里的来看,发现以前的简单很多。

通过对比很快就发现了刚才提到的问题所在:
在 6.0 的 TeX (base).tdl 里有这样的几句[code]sup         = "^#2 ";   
sub         = "_#1 ";   
subsup      = "_#1^#2 ";[/code]而到了 6.9 的 TeX (base rules).tdl 里就变成[code]sup         = "^#2";   
sub         = "_#1";   
sup/scan    = "{#1^#3}";
sub/scan    = "{#1_#2}";
subsup      = "_#1^#2"; [/code]很明显,多出的两句就是 $a^2+b^2$ 变成 {a^2} + {b^2} 的原因,搞不懂这样做的用意。

去掉那两句应该就会少很多 { } 了,不过我没这样做,因为我不想改原文件,我想应该可以自己创建一个文件来自定义规则,试了一下果然可以。

当然我不可能完全重写,毕竟有很多东西还搞不清楚,只能是拿现有的来改,由于 6.9 的比较复杂,我用了 6.0 的来改。

这三个文件是初步成果:[attach]5632[/attach][attach]5630[/attach][attach]5631[/attach]

将它们放到 C:\Program Files\MathType\Translators 中,重启 mathtype,再到转换设置里就会看到 kkkkk 这一项。
[attach]5629[/attach]

目前转换一般公式的代码已经很少有多余的东西了,而且比较符合我自己的习惯,比如 $\ge$ 会转成 \geqslant ,$\Rightarrow$ 会转成 \riff ,复制多行会转成 align* 环境等等,当然还有一些没处理好,如极限就还会有 \mathop 这些多余的东西,\left( \right) 内也会有多余的 { }。

测试一下,将以下文件保存到电脑上,用 mathtype 打开,按上述方法设好 kkkkk 后,全选、复制、粘贴来这里,看看代码如何。
[attach]5633[/attach]

如果OK的话,输出的将是:[code]\begin{align*}
&\sum \frac {a^2}{b^2}\geqslant \sum \frac ab+{\underbrace {1+\cdots +n}_n}+\sqrt a+\sqrt {aa}+\sqrt[3]a+\sqrt[3]{aa}\\
&\riff \sum_{i=1}^na_n+\prod_{i=1}^\infty b_i+\bigcup_{i=1}A_i+\bigcap B_i\\
&\iff \int f(x)dx+\int_a^bx^2\rmd x+\vv {AB}=\bm a+\sin 30\du\\
&\liff x_{1,2}=\frac {-b\pm \sqrt {b^2-4ac}}{2a}+\{x|x\text{ is odd}\}
\end{align*}[/code]欢迎大家测试。

isee 发表于 2017-11-24 18:57

[i=s] 本帖最后由 isee 于 2017-11-24 20:44 编辑 [/i]

[b]回复 [url=http://kuing.orzweb.net/redirect.php?goto=findpost&pid=24221&ptid=5016]1#[/url] [i]kuing[/i] [/b]


    你算半个mathtype 的开发人员了。

    直接把你指出的两行标注了,转换后,果然清爽不少。


    反正你会经常用,就会有维护,哈哈,我就用你的修改方案。。。。



=====================

擦,将mathtype转换成LaTeX代码,官方自己的,都不能将方程组,晕。

kuing 发表于 2017-11-24 20:46

[b]回复 [url=http://kuing.orzweb.net/redirect.php?goto=findpost&pid=24222&ptid=5016]2#[/url] [i]isee[/i] [/b]

并不是很复杂的东西,你也可以研究下,按自己的喜好来定义
也可以参考我那三个文件的改法,改动的地方我都用 //*** 标记的

kuing 发表于 2017-11-25 14:44

仔细看了下 6.9 的那些,发现其实也并不是复杂很多,而且它们更科学更易于管理,一方面是文件分得更清,另一方面是定义了更多的变量来统一控制某些东西。

而具体的规则其实除了1楼提到的那个之外,其他也没差多少。

另外我看修改定义时注释似乎不是必要的,直接在后面重写就行(类似于 tex 的 \def),这样说来,如果只是少量修改的话,只需创建一文件,读入需要的文件,再在后面重写想改的那些即可。

先眯一会,晚点再试。

isee 发表于 2017-11-25 15:54

[b]回复 [url=http://kuing.orzweb.net/redirect.php?goto=findpost&pid=24227&ptid=5016]4#[/url] [i]kuing[/i] [/b]


    的确与 $\mathrm \LaTeX$ 语法很像,这也许就是这种语法的优点。

kuing 发表于 2017-11-25 19:16

[b]回复 [url=http://kuing.orzweb.net/redirect.php?goto=findpost&pid=24227&ptid=5016]4#[/url] [i]kuing[/i] [/b]

试了下,基本上和我想的一样,但也有两句意外。

将这个文件 [attach]5636[/attach] 放到 C:\Program Files\MathType\Translators 中,到转换设置里就会看到 kuing 这一项。
(如果你在用较低版本则可能会提示缺少文件)

效果和1楼的大致相同,不同的几点有:
[list]
[*]直接输入 * 会转为 \cdot ,这是为了方便打点乘
[*]内部多行公式(如方程组)会转成 aligned 环境
[*]矩阵会转成 matrix 环境
[/list]

测试文件:
[attach]5638[/attach]
用 mathtype 打开,按上述方法设好 kuing 后,全选、复制、粘贴来这里,OK的话,转出来的代码是:[code]\begin{align*}
&\sum \frac {a^2}{b^2}\geqslant \sum \frac ab+{\underbrace {1+ \cdots +n}_n}+\sqrt a+\sqrt {aa}+\sqrt[3]a+\sqrt[3]{aa}\\
& \riff \sum_{i=1}^na_n+\prod_{i=1}^\infty b_i+\bigcup_{i=1}A_i+\bigcap B_i\\
& \iff \int f(x)dx+\int_a^bx^2\rmd x+\vv {AB}=\bm a+\sin 30\du\\
& \liff x_{1,2}=\frac {-b\pm \sqrt {b^2-4ac}}{2a}+\{x|x/2\text{ is odd}\}\\
&a\cdot b=\left\{ \begin{aligned}
&ax^2+bx+c=0\\
&2ax+b=0\\
&2a=0
\end{aligned} \right.=\begin{matrix}
{11}&{22}&{33}\\
{44}&{55}&{66}\\
{77}&{88}&{99}
\end{matrix}
\end{align*}[/code]

kuing 发表于 2017-11-26 14:27

试了一下其他类型的转换规则,发现 Texvc 那套规则也是不错嘀(选项中的最后一个),它转出来的代码空格相对少,紧凑一些,支持的符号也比较全(LaTeX 2.09 and later 就有些符号不支持或者是用奇怪的方式来实现),唯一的问题是单个字符的上下标也会用 { },不过这没关系,因为可以在某些文本编辑器(如 winedt)里轻松处理掉。

用楼上的方式改写 Texvc ,得:[attach]5639[/attach]
(设置方法相同,同样,如果你在用较低版本则可能会提示缺少文件)

测试文件:
[attach]5641[/attach]
用 mathtype 打开,按上述方法设好 kk_Texvc 后,全选、复制、粘贴来这里,OK的话,转出来的代码是:[code]\begin{align*}
&\sum \frac{a^{2}}{b^{2}}\geqslant \sum \frac{a}{b}+{\underbrace{1+\cdots +n}_{n}}+\sqrt{a}+\sqrt{aa}+\sqrt[3]{a}+\sqrt[3]{aa}\\
&\riff \sum_{i=1}^{n}a_{n}+\prod_{i=1}^{\infty }b_{i}+\bigcup_{i=1}A_{i}+\bigcap B_{i}\\
&\iff \int f(x)dx+\int_{a}^{b}x^{2}\rmd x+\vv{AB}=\bm{a}+\sin 30\du\\
&\liff x_{1,2}=\frac{-b\pm \sqrt{b^{2}-4ac}}{2a}+\{x|x/2\text{ is odd}\}\\
&a\cdot b=\left\{ \begin{aligned}
&ax^{2}+bx+c=0\\
&2ax+b=0\\
&2a=0
\end{aligned} \right.=\begin{matrix}
   11 & 22 & 33  \\
   44 & 55 & 66  \\
   77 & 88 & 99  \\
\end{matrix}\\
&\left( \lim _{x\to \infty }f'(x)+f''(x) \right)
\end{align*}[/code]将其放到 winedt 中做几下批量替换将单个字符的 { } 去掉后:[code]\begin{align*}
&\sum \frac{a^2}{b^2}\geqslant \sum \frac ab+{\underbrace{1+\cdots +n}_n}+\sqrt a+\sqrt{aa}+\sqrt[3]a+\sqrt[3]{aa}\\
&\riff \sum_{i=1}^na_n+\prod_{i=1}^{\infty }b_i+\bigcup_{i=1}A_i+\bigcap B_i\\
&\iff \int f(x)dx+\int_a^bx^2\rmd x+\vv{AB}=\bm a+\sin 30\du\\
&\liff x_{1,2}=\frac{-b\pm \sqrt{b^2-4ac}}{2a}+\{x|x/2\text{ is odd}\}\\
&a\cdot b=\left\{ \begin{aligned}
&ax^2+bx+c=0\\
&2ax+b=0\\
&2a=0
\end{aligned} \right.=\begin{matrix}
   11 & 22 & 33  \\
   44 & 55 & 66  \\
   77 & 88 & 99  \\
\end{matrix}\\
&\left( \lim _{x\to \infty }f'(x)+f''(x) \right)
\end{align*} [/code]已经几乎和手工输入差不多。

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.