用python脚本实现latex文档的自动生成—初级版本

今天实现了一个简单的小程序来完成初级功能, 还有许多需要优化和修改的,留给明天完成(希望明天还能记得), 还是先学学做网站吧。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
This is a file to transfer README file to tex syntax.
You could operate it through several options.
 
Copyright 2010, 陈同 (chentong_biology@163.com).  
Please see the license file for legal information.
===========================================================
'''
__version__ = '0.1'
__revision__ = '0.1'
__author__ = 'chentong & ct586[9]'
__author_email__ = 'chentong_biology@163.com'
#=========================================================
#from __future__ import division, with_statement
import sys
 
def header(texname, projectName):
    '''
    header(texname)
 
    this function is used to get a header file containing filename,
    author, time and other information.
    Then set the documentclass, the author information and the 
    projectName for the document.
    '''
    import time
    now = time.localtime(time.time())
    currentTime = time.strftime("%Y-%m-%d %H:%M:%S %a", now)
    print '%%        File: %s\n%%     Created: %s\n%%Last Changed: \
            %s\n%%' % (texname, currentTime, currentTime)
    print r'''
\documentclass[a4paper, 12pt]{article}
%define the title
\author{\href{mailto:chentong\_biology@163.com}{chentong}}'''
    print '\\title{ %s }\n\\date{\\today}\n' % projectName
 
 
def usingListings():
    print r'''%this is used to display source code
\usepackage{listings}
\usepackage{xcolor}
%set parameter
\lstset{numbers=left, numberstyle=\tiny, keywordstyle=\color{blue!70},
commentstyle=\color{red!50!green!50!blue!50}, frame=shadowbox,
rulesepcolor=\color{red!20!green!20!blue!20}, escapeinside=``,
%chinese character should be in ``
xleftmargin=2em, xrightmargin=2em, aboveskip=1em}
%---------------------------------------listings----------------------
'''
 
#TODO we owe a titile here
def usingHyperlink():
    print r'''%---------------hyperlink------------------------------
\usepackage[colorlinks, bookmarks=true, pdfstartview=FitH, 
pdftitle=Protein repetition, pdfauthor=ct586]{hyperref}
%---------------hyperlink--------------------------------------------
    '''
 
def usingModule():
    usingListings()
    usingHyperlink()
 
def usingNewCommand():
    '''
    This is the using of self constructed command.
    '''
    print r'''
%--------------self constructed command------------------------------
\newcommand{\ctfoldlink}[1]{\href{http://212.175.204.129/ftp/project1/%
    #1}{#1}}
\newcommand{\descripfont}[1]{\small {#1}}
\newcommand{\fuzzyhref}[1]{\href{http://212.175.204.129/ftp/project1/%
    result/fuzzymatch/qualityEvaluate/#1}{#1}}
\newcommand{\exacthref}[1]{\href{http://212.175.204.129/ftp/project1/%
    result/exactmatch/qualityEvaluate/#1}{#1}}
\newcommand{\numcol}[1]{ {\color{blue}{#1}}}
\newcommand{\report}[1]{\subsection{#1}\label{#1}\verbatimtabinput%
    [4]{document/#1}}
\newcommand{\findrepC}[1]{\subsection{#1}\label{#1}\lstinputlisting%
    [language=C]{../../cbin/findRep/#1}}
%--------------self constructed command------------------------------    
    '''
 
def beginDoc():
    '''
    From this, we begin the document.
    Using a directory to display the outline.
    You can choose whether you want a new page fot the main content.
    '''
    print r'''
\begin{document}
\maketitle
\tableofcontents
\clearpage
    '''
 
def parseDoc(inputfile):
    '''
    This is used to parse the input file to special format and add
    a tex label for each of them to make it can be read by latex.
 
    The file format it can discrimate is like the following.
    Ignore ( and ), you may want to substitue the content in 
    them to your words.
    The words after # is comment.
    All the website should be put in a {}, not allowed to be splited 
    in two lines.
    1.(Introduction)
    (This belongs to the project phosphoBlast.)
        #the folder name: what this folder is used for(for folder name, 
        better no use _, but whatever, now is ok)
        (phosphoblast): (this is a working folder.)
            #the file name: what this file is used for.(this can be a 
            subfolder, too)
            (abandonedIn3.75): this is the abandoned locus in version3.75
            which still in pepfile, total number is 48.
            # a little limit, this second line is not allowed to use colon.
    '''
 
 
    import re
 
    section = re.compile('[1-9]+\.(.+)')
    secDesc = re.compile('\S')
    list = re.compile('\t(\S+):\s*?(.*)')
    listDesc = re.compile('\t(.+)')
    nlist = re.compile('\t\t(\S+):\s*?(.*)')
    nlistDesc = re.compile('\t\t(.+)')
    nnlist = re.compile('\t\t\t(\S+):\s*?(.*)')
    nnlistDesc = re.compile('\t\t\t(.+)')
    specialChar = re.compile('([_])')
    href = re.compile('({.+?})')
    #flags 
    listFlag = 0
    nlistFlag = 0
    nnlistFlag = 0
 
    for line in open(inputfile):
        line = specialChar.sub(r'\\\1', line)   
        line = href.sub(r'\href\1{here}', line)
        match = section.match(line)
        if match:
            if listFlag == 1:
                listFlag = 0
                print r'\end{enumerate}'
                print 
            raw = r'\section{'
            print '%s%s}' % (raw, match.group(1))
        else:
            match = secDesc.match(line)
            if match:
                print line,
            else:
                match = list.match(line)
                if match:
                    if listFlag == 0:
                        listFlag = 1
                        print r'\begin{enumerate}'
                    if nlistFlag == 1:
                        nlistFlag = 0
                        print r'    \end{itemize}'
                    raw1 = r'  \item \ctfoldlink{'
                    print '%s%s}: %s' % (raw1, match.group(1), \
                            match.group(2))
                else:
                    match = nlist.match(line)
                    if match:
                        if nlistFlag == 0:
                            nlistFlag = 1
                            print r'    \begin{itemize}'
                        if nnlistFlag == 1:
                            nnlistFlag = 0
                            print r'      \end{itemize}'
                        raw2 = r'      \item '
                        print '%s%s: %s' % (raw2,match.group(1),\
                                match.group(2))
                    else:
                        match = nnlist.match(line)
                        if match:
                            if nnlistFlag == 0:
                                nnlistFlag == 1
                                print r'      \begin{itemize}'
                            raw2 = r'        \item '
                            print '%s%s: %s'%(raw2,match.group(1),\
                                    match.group(2))
                        else:
                            sum = listFlag + nlistFlag + nnlistFlag
                            if sum == 1:
                                match = listDesc.match(line)
                            elif sum == 2: 
                                match = nlistDesc.match(line)
                            elif sum == 3:
                                match = nnlistDesc.match(line)
                            if match:
                                space = '      ' * sum
                                print '%s%s' % (space, match.group(1))
    if listFlag == 1:
        print r'\end{enumerate}'
 
def endDoc():
    print
    print r'\end{document}'
 
 
 
def yieldTex(texname, projectName, inputfile):
    '''
 
    '''
    header(texname, projectName)
    usingModule()
    usingNewCommand()
    beginDoc()
    parseDoc(inputfile)
 
    endDoc()
 
def compileLatex(texname):
    '''
    This function is used to compile the created tex files.
    '''
    print 'Begin compiling'
    import os
    os.system("xelatex " + texname)
    print 'End compiling'
 
def main():
    if len(sys.argv) != 4:
        print 'Using python %s texname projectName inputfile' \
                % sys.argv[0]
        sys.exit(0)
    oldstdout = sys.stdout
    fh = open(sys.argv[1], 'w')
    sys.stdout = fh
 
    yieldTex(sys.argv[1], sys.argv[2], sys.argv[3])
 
    fh.close()
    sys.stdout = oldstdout
    print 'End'
 
    while True:
        print '''Please choose a command.
        c-->compile, q-->quit.
        If you add a new section, you may need to execute this more 
        than once.
        '''
        cmd = raw_input('>>>>')
        if cmd == 'c':
            compileLatex(sys.argv[1])
        elif cmd == 'q':
            break
 
 
if __name__ == '__main__':
    main()

CHENTONG
版权声明:本文为博主原创文章,转载请注明出处。
alipay.png WeChatPay.png

CHENTONG

CHENTONG
积微,月不胜日,时不胜月,岁不胜时。凡人好敖慢小事,大事至,然后兴之务之。如是,则常不胜夫敦比于小事者矣!何也?小事之至也数,其悬日也博,其为积也大。大事之至也希,其悬日也浅,其为积也小。故善日者王,善时者霸,补漏者危,大荒者亡!故,王者敬日,霸者敬时,仅存之国危而后戚之。亡国至亡而后知亡,至死而后知死,亡国之祸败,不可胜悔也。霸者之善著也,可以时托也。王者之功名,不可胜日志也。财物货宝以大为重,政教功名者反是,能积微者速成。诗曰:德如毛,民鲜能克举之。此之谓也。

生信宝典文章集锦

生信的作用越来越大,想学的人越来越多,不管是为了以后发展,还是为了解决眼下的问题。但生信学习不是一朝一夕就可以完成的事情,也许你可以很短时间学会一个交互式软件的操作,却不能看完程序教学视频后就直接写程序。也许你可以跟着一个测序分析流程完成操作,但不懂得背后的原理,不知道什么...… Continue reading

生信宝典文章集锦

Published on January 01, 2100

生信宝典文章集锦

Published on January 01, 2100