Sublime 和 Python:如何使用 Python 插件在 Latex 中从 Scientific Workplace 创建整洁的方程式

Sublime and Python: How to use Python Plugin to create neat equations from Scientific Workplace in Latex

我正在使用一个有助于编写乳胶的程序。但是,有一个问题,每次我写一个参数时,它都会显示为 eqnarray*

例如

\begin{eqnarray*}
r_{t}^{p} &=&\frac{P_{t}-P_{t-1}}{P_{t-1}} \
&=&\frac{\left( \left( 1-\alpha \right) r_{t}^{\ast }-\alpha \right)
P_{t-1}+\alpha A_{t}}{P_{t-1}} \
&=&\left( 1-\alpha \right) r_{t}^{\ast }-\alpha +\alpha \frac{A_{t}}{P_{t-1}}
\
&=&\left( 1-\alpha \right) r_{t}^{\ast }+\alpha \left( \frac{A_{t}}{P_{t-1}}%
-1\right) 
\end{eqnarray*}

我希望它看起来更有条理

\begin{equation*}
    \begin{split} 
        r_{t}^{p} &=\frac{P_{t}-P_{t-1}}{P_{t-1}} \ 
        &=\frac{((1-\alpha) r_{t}^{\ast}-\alpha) P_{t-1}+\alpha A_{t}}{P_{t-1}} \ 
        &=(1-\alpha) r_{t}^{\ast}-\alpha +\alpha \frac{A_{t}}{P_{t-1}} \ 
        &=(1-\alpha) r_{t}^{\ast}+\alpha (\frac{A_{t}}{P_{t-1}} -1) 
    \end{split}
\end{equation*}

我使用的是 Sublime text 3 编辑器,因此,我发现自己一次又一次地做同样的事情,就是以下步骤

  1. 将所有的\替换为/
  2. 一行

    s= '/begin{eqnarray*} r_{t}^{p} &=&/frac{P_{t}-P_{t-1}}{P_{t-1}} // &=&/frac{/left( /left( 1-/alpha /right) r_{t}^{/ast }-/alpha /right) P_{t-1}+/alpha A_{t}}{P_ {t-1}} // &=&/left( 1-/alpha /right) r_{t}^{/ast }-/alpha +/alpha /frac{A_{t}}{P_{t-1 }} // &=&/left( 1-/alpha /right) r_{t}^{/ast }+/alpha /left( /frac{A_{t}}{P_{t-1}}% - 1/右) /end{eqnarray*}'

  3. 删除 %

    s=s.replace("%", "") s

  4. 用等式*替换eqnarray*

    s1=s.replace("eqnarray*", "equation*")

  5. 如果文本包含 // 然后在 \begin{equation*} 之后直接包含 \begin{split} 并在 \end{equation} 之前包含 \end{split}

    if '//' 在 s1: f1 = "equation*}" f2='/结束{方程式*}' s3=s1[:s1.index(f1) + len(f1)] + '/begin{split}' + s1[s1.index(f1) + len(f1):] s4= s3[:s3.index(f2)] + '/end{split}' + s3[s3.index(f2):s3.index(f2) + len(f2)]

等...

我已经写了一个插件代码

import sublime, sublime_plugin, re, string   #import the required modules

class RonvertCommand(sublime_plugin.TextCommand): #create Text Command
    def run(self, edit):   #implement run method
        for region in self.view.sel():  #get user selection
            if not region.empty():  #if selection not empty then
                s = self.view.substr(region)  #assign s variable the selected region
                s4=s.replace("%", "")
                # s1=s.replace("eqnarray*", "equation*")
                if '\begin{eqnarray*}' in s4:
                    s4=s4.replace("eqnarray*", "equation*")
                    f1 = "equation*}"
                    s4=s4[:s4.index(f1) + len(f1)] + '\begin{split}' + s4[s4.index(f1) + len(f1):]
                    f2='\end{equation*}'
                    s4= s4[:s4.index(f2)] + '\end{split}' + s4[s4.index(f2):s4.index(f2) + len(f2)]
                if '\end{eqnarray*}' in s4:
                    s4=s4.replace("eqnarray*", "equation*")
                    f2='\end{equation*}'
                    s4= s4[:s4.index(f2)] + '\end{split}' + s4[s4.index(f2):s4.index(f2) + len(f2)]
                s4=s4.replace("&=&", "&=")
                s4=s4.replace("\left", "")
                s4=s4.replace("\right", "")
                s4=s4.replace("( ", "(")
                s4=s4.replace(" )", ")")
                s4=s4.replace(" }", "}")
                s4=s4.replace(" _{", "_{")
                s4=s4.replace("[ ", "[")
                s4=s4.replace(" ]", "]")
                s4=s4.replace("& =", "&=")
                s4=s4.replace("+(", "+ (")
                # s1 = '\n'.join([' '.join(para.splitlines()) for para in s.split('\n\n')])
                self.view.replace(edit, region, s4) #replace content in view

但是,在使用插件之前和使用之后,我仍然需要执行一些步骤。这是因为我不能简单地在 python 中写 \ 我需要把它写成 / 任何人都可以帮助我在没有这些混乱的情况下达到这个理想的目标吗?

谢谢

我注意到一些不错的问题,解决了我的问题。首先意识到在将其编码为 sublime text 3 plug-in 之前,我们必须在 python Jupyter notebook 上进行一些测试。正如我在我的问题中提到的那样,在 \ 中使用字符串的问题是有问题的,因此在 sublime text 3 中它会自动将其转换为 \ 因此,对 python 进行一些测试总是最好将所有 \ 替换为 \,然后将其作为字符串粘贴到 python 中。这是我所做的,我能够解决我的问题。

代码如下

import sublime, sublime_plugin, re, string   #import the required modules

class RonvertCommand(sublime_plugin.TextCommand): #create Text Command
    def run(self, edit):   #implement run method
        for region in self.view.sel():  #get user selection
            if not region.empty():  #if selection not empty then
                s = self.view.substr(region)  #assign s variable the selected region
                s4=s.replace("%", "")
                if '\begin{eqnarray*}' in s4:
                    s4=s4.replace("eqnarray*", "equation*")
                    f1 = "equation*}"
                    s4=s4[:s4.index(f1) + len(f1)] + '\n\t\begin{split}' + s4[s4.index(f1) + len(f1):]
                    f2='\end{equation*}'
                    s4= s4[:s4.index(f2)] + '\t\end{split}\n' + s4[s4.index(f2):s4.index(f2) + len(f2)]
                    ss=s4.split('\n')
                    while '\\' in ss:
                            a=ss.index('\\')
                            ss[a-1]= ss[a-1] + '\\'
                            del ss[a]
                    a=ss.index('\t\end{split}')
                    ss[a-1]=ss[a-1]+ '\\'
                    for x in range(ss.index('\t\begin{split}')+1,ss.index('\t\end{split}')-1):
                        if x<ss.index('\t\end{split}')-1:
                            if '&=&' and '\\' not in ss[x]:
                                ss[x]=ss[x]+ss[x+1]
                                del ss[x+1]
                    for x in range(ss.index('\t\begin{split}')+1,ss.index('\t\end{split}')):
                        ss[x]='\t\t'+ ss[x]
                    s4="\n".join(ss)  

                elif ('\[' in s4) or ('\begin{equation*}' in s4):
                    s4=s4.replace("\[","\begin{equation*}")
                    s4=s4.replace("\]","\end{equation*}")
                    ss=s4.split('\n')
                    for x in range(2,len(ss)-1):
                        ss[1]=ss[1]+ss[x]
                    ss=[ss[0],ss[1], ss[-1]]
                    s4="\n".join(ss)
                    s4=s4[0:s4.index('\n')+1]+'\t'+s4[1+s4.index('\n')::]
                # For all the sentences beteween I want to insert two tabs 
                s4=s4.replace("&=&", "&=")
                s4=s4.replace("&&", "&")
                s4=s4.replace("\left", "")
                s4=s4.replace("\right", "")
                s4=s4.replace("( ", "(")
                s4=s4.replace(" )", ")")
                s4=s4.replace(" }", "}")
                s4=s4.replace(" _{", "_{")
                s4=s4.replace("[ ", "[")
                s4=s4.replace(" ]", "]")
                s4=s4.replace("& =", "&=")
                s4=s4.replace("+(", "+ (")
                s4=s4.replace("+\", "+ \")
                s4=s4.replace("}+", "} +")
                s4=s4.replace(") -(", ")-(")
                s4=s4.replace(") -(", ")-(")
                s4=s4.replace(") (", ")(")
                s4=s4.replace(") -", ")-")
                s4=s4.replace(") ^", ")^")
                s4=s4.replace(") $", ")$")
                s4=s4.replace("} +", "}+")
                s4=s4.replace("\text{ and}", "\qquad\text{and}\qquad ")
                s4=s4.replace("\text{ or}", "\qquad\text{or}\qquad ")
                s4=s4.replace("\text{ where}", "\text{,}\qquad\text{where}\qquad")

                if '\vert' in s4:
                    Vert = re.findall('vert', s4)
                    for i in range(0,int(len(Vert)/2)):
                        A=re.search(r'(\vert.*?\vert)', s4).group(1)
                        s3=re.sub(r"{array}{([a-z])+}", "{vmatrix}", A)
                        s3=re.sub(r"{array}", "{vmatrix}", s3)
                        s3=s3.replace("\vert", "")
                        s4=s4[0:s4.index(A)]+s3+s4[s4.index(A)+len(A):]
                s4=s4.replace("\text{if}", "\text{if}\qquad ")

                if '(' in s4:
                    start = '('
                    end = ')'
                    A=s4[s4.find(start)+len(start):s4.rfind(end)-1]
                    if '(' in A:
                        s4=s4[:s4.find(start)]+'\Big('+s4[s4.find(start)+len(start):s4.rfind(end)]+'\Big)'+s4[1+s4.rfind(end)::]


                self.view.replace(edit, region, s4) 

                #replace content in view
                # self.view.replace(edit, region, s.count('\n')) #replace content in view
                # self.view.insert(edit, 0, s.count('\n'))

键绑定的其他步骤

1- 转到键绑定(Preference-Key 绑定)

2- 粘贴以下内容:

{"keys": ["alt+x"], "command": "ronvert"},

3- 保存并关闭

现在您可以 select 所有文本,只需在 windows 上应用按 alt x