什么?你在写一部参考语法?而且你想当一个负责任的作者?看来你必须在博士论文的结尾添加一个词典了。所有的参考语法都会在最后附上一个简单的词典,标明词性、基本形态和词义等内容。可是,难道我们需要一个一个词地输入进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 |
那么我们的词项应该是:
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)的博士后。
评论