利用Python生成LaTeX词典的指令码(一)

什么?你在写一部参考语法?而且你想当一个负责任的作者?看来你必须在博士论文的结尾添加一个词典了。所有的参考语法都会在最后附上一个简单的词典,标明词性、基本形态和词义等内容。可是,难道我们需要一个一个词地输入进LaTeX文档吗?起码你也得有2000个词吧,就算你能半分钟做完一个词条,你也需要16.67个小时去完成整个词典,一天估计你花一小时在这上边就会烦了,所以你完成这个词典需要半个月的时间。有没有更便利的方法一秒做完呢?今天我来介绍一个用Python自动把你的.txt词典转化成LaTeX能阅读的指令码。

上次我已经用Python整了一个自动标注的程式,可是群众反应不太好用,这次保证比上次好用。。。

像上次一样,我们先必须有一个.txt的词典文件,比如你toolbox上的。也可以用你自己写的,只要每行(词,词性,词义,等等)都有标签就可以了。我今天整了个比上次复杂的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
\lx rsvɑ́ɣ
\ps vi
\mr nə-
\stem2 rsvîɣ
\ge to be rough

\lx vdʑə́
\ps n
\mr
\stem2
\ge friend, mate

\lx ʁvdʑə́z
\ps vi
\mr o-
\stem2 ʁvdʑə̂z
\ge to be involved, to be a member of

\lx ɕæ̂χpə
\ps n
\mr
\stem2
\ge friend

\lx fcə̂
\ps n
\mr
\stem2
\ge mouse

\lx djî
\ps n
\mr
\stem2
\ge roebuck

\lx kətɑ́
\ps n
\mr
\stem2
\ge dog

\lx kʰəmê
\ps n
\mr
\stem2
\ge female dog

\lx pʰôcʰə
\ps n
\mr
\stem2
\ge male dog

\lx mocʰə̂
\ps n
\mr
\stem2
\ge female dog

\lx gəstî=skɑ
\ps adv
\mr
\stem2
\ge sometimes

\lx tɕʰərɑ̂
\ps n
\mr
\stem2
\ge gutterway

\lx rgəmé
\ps n
\mr
\stem2
\ge stone

\lx joɣrqî
\ps n
\mr
\stem2
\ge elbow

多吧?这些词都是绰斯甲语斯跃武话的词汇。每个词项,我们有五个标签:\lx是词的citation form。\ps是词性。 \mr是指morphology,在这里专指动词perfective所使用的前缀。\stem2是指动词的第二词干。 \ge是英文的翻译。如果有的词没有其中某些项目,比如名词是没有perfective前缀也没有第二词干的,我们为了方便也把这些标签写上,然后空一格。这些都是要求你在准备你的词典的时候做到的。

然后,我们来准备一下LaTeX词典的template。这就不用咱们自己写了,网上找一个,然后修改一下就好。我找了一个,请点击此处获取。打开这个template,我们先来研究一下它的代码。

首先,我们应该在引导码中加上我们常用的指令和package。比如fontspec还有xunicode这种语言学中重要的package,必须添加。然后,我还添加了一个输入国际音标的方法,\ipa{}

1
2
\newfontfamily\phon[Mapping=tex-text,Ligatures=Common,Scale=MatchLowercase,FakeSlant=0.1]{Charis SIL}
\newcommand{\ipa}[1]{{\phon \mbox{#1}}
}

这样,我们的国际音标就可以通过\ipa{}来输入了。

我们继续研究这个词典的指令码。我们发现,每一个词项是通过如下的指令来实现的,有三个大括号,第一个是词,第二个是词性,第三个是词义:

1
entry{词}{词性}{词义}

但我们需要五个大括号,分别来装词、词性、前缀、第二词干以及词义。所以我们就把它的\newcommand改成五个大括号:

1
\newcommand{\entry}[5]{\markboth{#1}{#1}\textbf{#1}\ \textit{#2}\ #3\ #4 $\bullet$\ {#5}}

那么我们的词项应该是:

1
\entry{词}{词性}{前缀}{第二词干}{词义}

学会了这个,我们就开始用python把我们的.txt词典转换成LaTeX看得懂的东西。打开你最喜欢的编辑器,创建一个.py文件,就叫wl.py吧。把你的词典文件,比如dico.txt跟它放在一个文件夹里。先例行公事写下以下指令(可以参考上一个相关的部落格):

1
2
3
4
5
6
7
8
9
10
import re
#使用正则表达式

tb = open('dico.txt', 'r')
dico = tb.read()
tb.close()
#打开和阅读词典文件

dico = dico.split("\n")
#删掉不需要的空格

然后,我们用正则表达式找到所有标签后的东西,具体的词、词性、词义等,因为那才是干货:

1
2
3
4
5
6
dico = str(dico)
lx = re.findall(r'\\lx(.+?)\'' , dico)
ps = re.findall(r'\\ps(.+?)\'' , dico)
mr = re.findall(r'\\mr(.+?)\'' , dico)
stem = re.findall(r'\\stem2(.+?)\'', dico)
ge = re.findall(r'\\ge(.+?)\'' , dico)

接下来,我们需要创建一个.tex的文件,让Python帮我们生成的指令都跑到这个文件的里边。用一个for语句,我们把指令写进去:

1
2
3
4
5
6
tex = open('wl.tex', 'w')
i = 0
for j in lx:
    tex.write('\\entry{\ipa{'+lx[i]+'}}{'+ps[i]+'}{\ipa{'+mr[i]+'}}{\ipa{'+stem[i]+'}}{'+ge[i]+'}\n\n')
    i = i+1
tex.close()

这样,我们就生成了wl.tex。里边是这个样子的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
\entry{\ipa{ rsvɑ́ɣ}}{ vi}{\ipa{ nə-}}{\ipa{ rsvîɣ}}{ to be rough}

\entry{\ipa{ vdʑə́}}{ n}{\ipa{ }}{\ipa{ }}{ friend, mate}

\entry{\ipa{ ʁɴjí}}{ vi}{\ipa{ kə-}}{\ipa{ ʁɴjî }}{ to be thin}

\entry{\ipa{ ɕæ̂χpə}}{ n}{\ipa{ }}{\ipa{ }}{ friend}

\entry{\ipa{ fcə̂}}{ n}{\ipa{ }}{\ipa{ }}{ mouse}

\entry{\ipa{ djî}}{ n}{\ipa{ }}{\ipa{ }}{ roebuck}

\entry{\ipa{ kətɑ́}}{ n}{\ipa{ }}{\ipa{ }}{ dog}

\entry{\ipa{ kʰəmê}}{ n}{\ipa{ }}{\ipa{ }}{ female dog}

\entry{\ipa{ pʰôcʰə}}{ n}{\ipa{ }}{\ipa{ }}{ male dog}

\entry{\ipa{ mocʰə̂}}{ n}{\ipa{ }}{\ipa{ }}{ female dog}

\entry{\ipa{ gəstî=skɑ}}{ adv}{\ipa{ }}{\ipa{ }}{ sometimes}

\entry{\ipa{ tɕʰərɑ̂}}{ n}{\ipa{ }}{\ipa{ }}{ gutterway}

\entry{\ipa{ rgəmé}}{ n}{\ipa{ }}{\ipa{ }}{ stone}

\entry{\ipa{ joɣrqî}}{ n}{\ipa{ }}{\ipa{ }}{ elbow}

\entry{\ipa{ ʁlə̂}}{ n}{\ipa{ }}{\ipa{ }}{ chant}

似乎大功告成了,有点难看(有些奇怪的空格),但编译出来的是一样的,所以就懒得改了。所以,如果我们把这个文件\input到你的LaTeX词典里,就会编译出一个不错的词典了:

虽然看起来已经很赞了,主要是得益于词典template的作者,Vel。可是其实还是有点美中不足哦,你们自己思考一下哪里还可以改进吧。我只好把它放到下一个部落格里讲了。

Author: Lai, Yunfan

目前是马克斯普朗克协会人类历史科学研究所(Max-Planck Institut für Menschheitsgeschichte)的博士后。

评论