人生苦短,我用Python!
tex大法好,适合科技论文的写作,不用每次看着word奔溃或者是占据很大的内存。就像写一个txt文档一样的简洁优雅,用命令行编译就能编译出pdf文件。但是同时没有所见即所得的方便和字数统计等功能。
由于Tex的是一种标记语言,所以是语法、命令和内容混合在一起的。想要统计纯内容的字数,需要解决的问题如下:
- 区分语法和内容
- 统计语法调用
- 统计文章结构
在网上下载了texcount软件,试用之后发现这货竟然没法统计input文件的任何数据。所以就萌生了想自己写个tex解析的脚本来统计tex源文件的字数。
因为tex文件可以通过include和input两个命令来添加外部的文件,所以这里可以使用递归的方式将所有的主文件包括加载的其它所有文件进行汇总。为之后的统计提供文件读取支持。
下面是一个最精简版本的tex统计代码,旨在说明运行过程,在后续的过程中我会逐渐完善这个统计工具。
#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))
上面的代码已经可以统计出来了tex中正文内容的字数,但是是不准确的,主要原因有以下几点:
- 基本没做语法剔除,只是将
\
为一行开头的语法直接去除了。 - 正文中可能使用了一些其他的语法,比如
\site
,\label
,\ref
等。这些都对最终的字数产生了影响。 - 只统计了正文,一个健全的tex统计工具还需要有语法元素 的统计。
预告:下一节中,我们会增加部分功能,具体的功能的增加视情况而定。