latex数学公式转换器

这学期上课要用latex写数理逻辑作业,十分烦人,因为texstudio的非键盘数学公式写起来实在是太烦人了,又臭又长,所以自己用py写了一个小的latex数学公式转换器。

不定期更新。目前是V2.0

简单介绍一下功能:

输入:一行要转换成latex公式的自然语言字符串,所有非公式部分必须为纯中文

输出:可能多行(如果有\newline的话)变成了latex公式的字符串

输入过程可以重复进行,不必每输入一次就重启一次程序

样例输入:12对任意命题A,A|=t,则t->h \n

样例输出:\newline \n \indent \n 对任意命题$A$,$A \models t$,则$t \leftarrow h$ \n

功能实现顺序:

1.在字符串最开头写1会转换为\newline \n

2.在字符串开头的1后面写2(可以没有1)会转换为\indent \n

3.程序会自动将除了1、2以外的字符串按照中文/非中文的区别分段(注意,中文句号和逗号算入中文),然后对所有非中文的部分两端加上"$"

4.通过修改程序内部的表ls1可以自定义某些翻译方式,如将输入中的英文laplace翻译为$\bigtriangle$,将>=翻译为$\leq$,但注意目前只能实现英文/字符串的翻译(否则会和中文区分自动添加$法混淆)

5.把字符串中出现过的所有flow(大/小写字母)自动转化为\mathscr{大写字母}(花体)(这个功能是为了数理逻辑作业特别设计的)

从某种意义上说,latex对空格的不敏感性让这个程序变得非常好写【滑稽】

def isChinese(chara):
    if('\u4e00'<=chara<='\u9fff' or chara==','or chara=='。'):
        return True
    else:
        return False

def checkChinese(stra):
    start=0
    if(stra[start]=='1'):
        start+=1
    if(stra[start]=='2'):
        start+=1   ##避开这些玩意
    if(not isChinese(stra[start])):
        stra=stra[0:start]+'$'+stra[start:]
    lenth=len(stra)
    while(start<=lenth-1):
        if isChinese(stra[start]):
            if(start+1==lenth):
                break
            elif(isChinese(stra[start+1])):
                start+=1
            else:
                stra=stra[0:start+1]+'$'+stra[start+1:]
                start+=2
        else:
            if(start+1==lenth):##是最后一个
                stra=stra+'$'
                break
            elif(isChinese(stra[start+1])):
                stra=stra[0:start+1]+'$'+stra[start+1:]
                start+=2
            else:
                start+=1
        lenth=len(stra)
    return stra

def checkflower(stra):
    templs=stra.split("flow")
    for i in range(1,len(templs)):
        templs[i]="\mathscr{"+templs[i][1].upper()+"}"+templs[i][3:]
    stra="".join(templs)
    return stra

def indent(stra):
    newline=0
    indent=0
    if(stra[0]=='1'):
        newline+=1
        stra=stra[1:]
    if(stra[0]=='2'):
        indent+=1
        stra=stra[1:]
    if(indent):
        stra="\indent\n"+stra
    if(newline):
        stra="\\newline\n"+stra
    return stra

while True:
    ##rules:[简写,意义,latex全称],可以自行修改,但是注意简写不要重复
    ls1=[##无需加括号划定范围
        ["exists", "存在", "\exists"],\
        ["~","非","\sim"], \
        ["not", "非", "\sim"], \
        ["or","或","\\vee"],\
        ["and","与","\wedge"],\
        ["<->","重言","\leftrightarrow"],\
        ["<=>","等价","\Leftrightarrow"],\
        ["->","则","\\rightarrow"],\
        [">=","大于等于","\geq"],\
        ["<=","小于等于","\leq"], \
        ["=\=","不等于","\\neq"],\
        ["laplace", "拉普拉斯算子", "\\bigtriangleup"], \
        ["grad", "梯度", "\\bigtriangledown"], \
        ["*", "乘", "\\times"], \
        ["`", "瞥", "^{'}"], \
        ["pet", "偏导", "\partial"],\
        ["|-","推出","\\vdash"],\
        ["|=","蕴含","\models"],\
        ##["T'","Gamma","\Gamma^{'}"],\
        ##["T","Gamma","\Gamma"], \
        ["any", "任意", "\\forall"],\
        ["\=/=","不满足","\\nvDash"]

        ##需要加括号划定范围,还没想好怎么写,可能要加函数
        ##["div", "{x}div{y}:{x}除以{y}", "\\frac{x}/{y}"], \
        ##["len", "len{x}:x的模长||x||", "\\left \|  \\right \|"]
    ]
    for i in ls1:
        print("在输入中请用{}以表示{}".format(i[0],i[1]))
        print("在字符串前段增加1可以换行")
        print("在字符串第二位增加2可以缩进")
        print("在字符串中空格代表$")
    while 1:
        a=input("")
        a=checkChinese(a)
        for i in ls1:
            a=a.replace(i[0],i[2]+" ")
        a=checkflower(a)
        a=indent(a)
        print(a)

 

你可能感兴趣的:(python小工具,python,字符串,latex)