My Email: yeshengzou@gmail.com

前面通过Google Data API解决了光靠Email不能解决的标签和插图问题,自然,就想到应该可以插入LaTeX语法的数学公式吧,只是把这些公式转成图片插入就可以了。这中间只是多了一个自动编译并转为图片的过程,至少我之前是这么想的。

但在实际的操作中总有意想不到的问题,我第一次碰到了多线程或者多进程的问题。在之前写一些小东西的时候,是没有涉及过多线程或多进程的需求的,可在这里,去编译tex源文件的时候,它出现了。

最先我直接通过os.system把对tex源文件的编译写到某个函数中,可这样是无法执行的,我猜想应该是os.system还没有执行完,这个函数就返回了,而这个函数一返回,就把里面的os.system直接中断了。后来我用subprocessthreading来处理对tex源文件的编译,执行是没有问题了,但我无法在编译tex源文件处做阻塞,一阻塞就不能正常编译。不阻塞倒能正常编译,可我后继的操作必须在tex源文件编译完毕后才能进行,不能并发执行的。

最后这个问题我还是无解,我想可能与python是作为vim的脚本执行有关,这时python执行的这个进程与vim的进程的关系?所以我不得不把原本应该在函数内完成的事放到外部完成,虽然很dirty,但它能正常工作了。

import vim,os,markdown2,re,datetime

reInLineMath = re.compile(r'\$.*?\$')
reBlockMath = re.compile(r'\\\[.*?\\\]', re.S)

def getFileName():
    'get a random filename like 20090423'
    d = datetime.date.today().strftime('%Y%m%d')
    return d

def createTexFile(body, mathInLineList, mathBlockList):
    mathInLineList = '\n\\newpage\n'.join(mathInLineList)
    mathBlockList = '\n\\newpage\n'.join(mathBlockList)
    texcode = '''
                \\documentclass{article}\n
                \\usepackage{tikz}\n
                \\usepackage{amsmath}\n
                \\pagestyle{empty}\n
                \\\begin{document}
%s\n\\newpage\n%s\n
            \\end{document}''' % (mathInLineList, mathBlockList)
    file = open('/home/zys/temp/%s.tex' % getFileName(),'w')
    print >> file,texcode
    file.close()
    return file.name

subject = vim.current.buffer[0]
body = '\n'.join(vim.current.buffer[2:])

mathInLineList = reInLineMath.findall(body)
mathBlockList = reBlockMath.findall(body)

if mathInLineList.__len__() > 0 or mathBlockList.__len__() > 0:

    texFile = createTexFile(body, mathInLineList = mathInLineList,
              mathBlockList = mathBlockList)
    os.system('rxvt -e pdflatex --output-directory=/home/zys/temp/ %s' %
                                texFile)
    os.system('rxvt -e convert -trim  -density 120 -antialias %s.pdf %s.
              jpg' % (texFile.split('.')[0],texFile.split('.')[0]))

    mathList = mathInLineList + mathBlockList
    if mathList.__len__() == 1:
        body = body.replace(mathList[i],
            '![math](%s.jpg)' % (texFile.split('.')[0]))
    else:
        for i in range(mathList.__len__()):
            body = body.replace(mathList[i],
                '![math](%s-%d.jpg)' % (texFile.split('.')[0], i))

主要的代码就这些,用正则表达式从正文中取出tex相关的数学公式,然后把这些公式做成一个单独的tex源文件,一页一个公式,编译后得到一个pdf文件,用convert去把这个pdf文件转成jpg图片,这里带一个-trim参数,得到没有边距的图。如果是多页会得到一组编号的jpg图,再回头用这些图的本机地址去替换正文中的tex数学公式。

另外,代码高亮是通过highlight来做的,在vim中选中代码块,执行highlight就可以得到内嵌css的html带pre标签的代码。


下面纯属演示数学公式效果- -

八卦传播问题

假设某地区的总人口为math,在短期内不变,math表示知道消息的人数所占的百分比,初始时刻的百分比为math,传播率为math,另外有一部分人知道消息,但不传播,不传播率为math,则数学模型为:

math

求解得:

math

于是有:

math

此表明随时间的增长,消息慢慢地会淡化,逐步被人遗忘。

参考

4 Comments:

  1. evlag said...
    你的BOLG变化好大,你学过PYTHON?我也因工作需要要学LUA了。。
    ffan said...
    是啊,我考虑自适应加无图的页面。
    python我自己学来平时用的,好用啊,哈哈。
    貌似有很多游戏都用LUA做嵌入式扩展脚本吧。
    evlag said...
    LUA最出就是WOW嘛。。没想到我现在的公司也要用=。=
    PS:你空间变得很想WIKI了。。不太好看
    ffan said...
    不光是WOW,wiki上看,RO也用,后面应该还有更多的游戏会用它作扩展吧。不过我倒是从来没有接触过它,当初WOW的自定义宏我觉得很强。

    我最早听说LUA是TeX的一个引擎luatex,它可以用LUA作扩展。其它还有什么应用就不知道了。

    这个不好看嘛?-_-,将就了吧,大部分都用RSS订阅的^o^

Post a Comment



较新的博文 较早的博文 主页