人生苦短,我用Python!
tex大法好熏版,適合科技論文的寫作,不用每次看著word奔潰或者是占據(jù)很大的內(nèi)存缀匕。就像寫一個(gè)txt文檔一樣的簡(jiǎn)潔優(yōu)雅纳决,用命令行編譯就能編譯出pdf文件。但是同時(shí)沒有所見即所得的方便和字?jǐn)?shù)統(tǒng)計(jì)等功能乡小。
由于Tex的是一種標(biāo)記語(yǔ)言阔加,所以是語(yǔ)法、命令和內(nèi)容混合在一起的满钟。想要統(tǒng)計(jì)純內(nèi)容的字?jǐn)?shù)胜榔,需要解決的問題如下:
- 區(qū)分語(yǔ)法和內(nèi)容
- 統(tǒng)計(jì)語(yǔ)法調(diào)用
- 統(tǒng)計(jì)文章結(jié)構(gòu)
在網(wǎng)上下載了texcount軟件,試用之后發(fā)現(xiàn)這貨竟然沒法統(tǒng)計(jì)input文件的任何數(shù)據(jù)湃番。所以就萌生了想自己寫個(gè)tex解析的腳本來(lái)統(tǒng)計(jì)tex源文件的字?jǐn)?shù)夭织。
因?yàn)閠ex文件可以通過include和input兩個(gè)命令來(lái)添加外部的文件,所以這里可以使用遞歸的方式將所有的主文件包括加載的其它所有文件進(jìn)行匯總吠撮。為之后的統(tǒng)計(jì)提供文件讀取支持尊惰。
下面是一個(gè)最精簡(jiǎn)版本的tex統(tǒng)計(jì)代碼,旨在說(shuō)明運(yùn)行過程,在后續(xù)的過程中我會(huì)逐漸完善這個(gè)統(tǒng)計(jì)工具弄屡。
#coding:utf-8
import os,sys
def readTex(fileName):
curPath=os.path.dirname(fileName)
lineArray=[]
with open(fileName,'r') as f:
lines=f.readlines()
for line in lines:
line=line.strip()
if '\include' in line or '\input' in line:
fileName=line.split("{")[1][0:-1]+".tex"
lineArray.extend(readTex(os.path.join(curPath,fileName)))
else:
lineArray.append(line)
return lineArray
def count(lineArray):
count=0
for line in lineArray:
if not line.startswith("\\"):
count+=len(line.split(" "))
return count
if __name__ == '__main__':
texFile=sys.argv[1]
print count(readTex(texFile))
上面的代碼已經(jīng)可以統(tǒng)計(jì)出來(lái)了tex中正文內(nèi)容的字?jǐn)?shù)题禀,但是是不準(zhǔn)確的,主要原因有以下幾點(diǎn):
- 基本沒做語(yǔ)法剔除膀捷,只是將
\
為一行開頭的語(yǔ)法直接去除了迈嘹。 - 正文中可能使用了一些其他的語(yǔ)法,比如
\site
,\label
,\ref
等全庸。這些都對(duì)最終的字?jǐn)?shù)產(chǎn)生了影響秀仲。 - 只統(tǒng)計(jì)了正文,一個(gè)健全的tex統(tǒng)計(jì)工具還需要有語(yǔ)法元素 的統(tǒng)計(jì)壶笼。
預(yù)告:下一節(jié)中神僵,我們會(huì)增加部分功能,具體的功能的增加視情況而定拌消。