用LaTeX替换所有重音字符
给定一个Unicode字符串,我想把里面的非ASCII字符替换成对应的LaTeX代码(比如,把 é
替换成 \'e
,把 œ
替换成 \oe
)。我正在把这个功能放到Python代码里。这个过程应该依赖一个翻译表,我想出了以下这段代码,感觉简单又好用:
accents = [
[ u"à", "\\`a"],
[ u"é", "\\'e"]
]
translation_table = dict([(ord(k), unicode(v)) for k, v in accents])
print u"été à l'eau".translate(translation_table)
不过,写一个比较完整的翻译表会花我很长时间,而谷歌也没帮上什么忙。有没有人有现成的翻译表,或者知道在哪里可以找到一个?
PS:我刚学Python,所以欢迎大家对上面的代码提出意见。
4 个回答
如果你无法控制LaTeX的编译选项,可以使用输入编码包(inputenc)所用的相同表格,这样它的行为就和你使用inputenc时一样了。
这份文档解释了inputenc是如何进行映射的,它实际上是一系列的
...
194 hall; t1; ly1i\DeclareUnicodeCharacter{00C2}{\^A}
195 hall; t1; ly1i\DeclareUnicodeCharacter{00C3}{\~A}
196 hall; t1; ly1i\DeclareUnicodeCharacter{00C4}{\"A}
197 hall; t1; ot1; ly1i\DeclareUnicodeCharacter{00C5}{\r A}
198 hall; t1; ot1; ly1; lcyi\DeclareUnicodeCharacter{00C6}{\AE}
199 hall; t1; ly1i\DeclareUnicodeCharacter{00C7}{\c C}
200 hall; t1; ly1i\DeclareUnicodeCharacter{00C8}{\@tabacckludge`E}
你可以解析这个文件,寻找所有的DeclareUnicodeCharacter
行,并用正则表达式提取出映射关系。
编辑:我写了一些代码来实现这个功能:
# -*- coding: utf-8 -*-
import re
translation_table = {}
for line in open('utf8ienc.dtx'):
m = re.match(r'%.*\DeclareUnicodeCharacter\{(\w+)\}\{(.*)\}', line)
if m:
codepoint, latex = m.groups()
latex = latex.replace('@tabacckludge', '') # remove useless (??) '@tabacckludge'
translation_table[int(codepoint, 16)] = unicode(latex)
print u"été à l'eau".translate(translation_table)
# outputs "\'et\'e \`a l'eau"
你应该在你的LaTeX安装目录中找到utf8ienc.dtx
,或者你可以在网上搜索一下。
好的,这是我目前整理的表格。请随意编辑来添加内容!如果你没有足够的权限来编辑,也可以留言评论。
################################################################
# LaTeX accents replacement
latexAccents = [
[ u"à", "\\`a" ], # Grave accent
[ u"è", "\\`e" ],
[ u"ì", "\\`\\i" ],
[ u"ò", "\\`o" ],
[ u"ù", "\\`u" ],
[ u"ỳ", "\\`y" ],
[ u"À", "\\`A" ],
[ u"È", "\\`E" ],
[ u"Ì", "\\`\\I" ],
[ u"Ò", "\\`O" ],
[ u"Ù", "\\`U" ],
[ u"Ỳ", "\\`Y" ],
[ u"á", "\\'a" ], # Acute accent
[ u"é", "\\'e" ],
[ u"í", "\\'\\i" ],
[ u"ó", "\\'o" ],
[ u"ú", "\\'u" ],
[ u"ý", "\\'y" ],
[ u"Á", "\\'A" ],
[ u"É", "\\'E" ],
[ u"Í", "\\'\\I" ],
[ u"Ó", "\\'O" ],
[ u"Ú", "\\'U" ],
[ u"Ý", "\\'Y" ],
[ u"â", "\\^a" ], # Circumflex
[ u"ê", "\\^e" ],
[ u"î", "\\^\\i" ],
[ u"ô", "\\^o" ],
[ u"û", "\\^u" ],
[ u"ŷ", "\\^y" ],
[ u"Â", "\\^A" ],
[ u"Ê", "\\^E" ],
[ u"Î", "\\^\\I" ],
[ u"Ô", "\\^O" ],
[ u"Û", "\\^U" ],
[ u"Ŷ", "\\^Y" ],
[ u"ä", "\\\"a" ], # Umlaut or dieresis
[ u"ë", "\\\"e" ],
[ u"ï", "\\\"\\i" ],
[ u"ö", "\\\"o" ],
[ u"ü", "\\\"u" ],
[ u"ÿ", "\\\"y" ],
[ u"Ä", "\\\"A" ],
[ u"Ë", "\\\"E" ],
[ u"Ï", "\\\"\\I" ],
[ u"Ö", "\\\"O" ],
[ u"Ü", "\\\"U" ],
[ u"Ÿ", "\\\"Y" ],
[ u"ç", "\\c{c}" ], # Cedilla
[ u"Ç", "\\c{C}" ],
[ u"œ", "{\\oe}" ], # Ligatures
[ u"Œ", "{\\OE}" ],
[ u"æ", "{\\ae}" ],
[ u"Æ", "{\\AE}" ],
[ u"å", "{\\aa}" ],
[ u"Å", "{\\AA}" ],
[ u"–", "--" ], # Dashes
[ u"—", "---" ],
[ u"ø", "{\\o}" ], # Misc latin-1 letters
[ u"Ø", "{\\O}" ],
[ u"ß", "{\\ss}" ],
[ u"¡", "{!`}" ],
[ u"¿", "{?`}" ],
[ u"\\", "\\\\" ], # Characters that should be quoted
[ u"~", "\\~" ],
[ u"&", "\\&" ],
[ u"$", "\\$" ],
[ u"{", "\\{" ],
[ u"}", "\\}" ],
[ u"%", "\\%" ],
[ u"#", "\\#" ],
[ u"_", "\\_" ],
[ u"≥", "$\\ge$" ], # Math operators
[ u"≤", "$\\le$" ],
[ u"≠", "$\\neq$" ],
[ u"©", "\copyright" ], # Misc
[ u"ı", "{\\i}" ],
[ u"µ", "$\\mu$" ],
[ u"°", "$\\deg$" ],
[ u"‘", "`" ], #Quotes
[ u"’", "'" ],
[ u"“", "``" ],
[ u"”", "''" ],
[ u"‚", "," ],
[ u"„", ",," ],
]
下载 Unicode字符数据库(大约1MB)。在这个数据库里,你可以找到一些字符组合的对应关系,比如 é = \u00E9
可以表示为 e + ́
,这和 \u0065+\u0301 (拉丁小写字母E
+ 组合重音符)
是一样的。你可以写一些简单的代码来转换所有的组合字符,或者只转换你想要的那些(你可以通过数据库中的脚本字段来控制)。
接下来,用LaTeX代码替换这些组合字符。例如,可以使用正则表达式 \w\u0065
来替换带重音的字母:\'<the_letter>
。(我不太确定语法,这取决于你使用的编程语言和正则表达式引擎。)
编辑:如果你使用的是Python,你已经有了这个数据库和一个可以使用它的处理程序。就像下面的评论提到的那样,import unicodedata
。