Python 将所有重音字符替换为其等效字符
给定一个Unicode字符串,我想用生成它们的LaTeX代码替换非ASCII字符(例如,使Python 将所有重音字符替换为其等效字符,python,unicode,latex,diacritics,Python,Unicode,Latex,Diacritics,给定一个Unicode字符串,我想用生成它们的LaTeX代码替换非ASCII字符(例如,使é变成\'e,和œ变成\oe)。我正在将其合并到Python代码中。这应该依赖于一个翻译表,我已经提出了以下代码,它很简单,而且似乎工作得很好: accents = [ [ u"à", "\\`a"], [ u"é", "\\'e"] ] translation_table = dict([(ord(k), unicode(v)) for k, v in accents]) print
é
变成\'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新手,所以我当然欢迎对上面代码的评论。可能不翻译字符,但使用
inputenc
包和unicode文本原样。如果您不能控制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
行,并使用regexp提取映射
编辑:我已经编写了一些代码来实现这一点:
# -*- 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安装中找到utf8ency.dtx
,或者你可以用谷歌搜索它。下载(大约1MB)。您可以找到等效字符组合的关系表,例如é=\u00E9
ise++/code>,它等效于\u0065++\u0301(拉丁文小写字母e
+组合锐重音)
。您可以编写简单的代码来转换所有脚本的所有组合字符,或者只转换它们(您可以通过数据库中的脚本字段进行控制)
然后用LaTeX代码替换组合。例如,使用正则表达式\w\u0065
替换双字符:\'
。(我不确定语法。这取决于您的编程语言和正则表达式引擎。)
编辑:
如果您使用的是python,那么您已经有了数据库和处理程序的实现来使用它。正如在下面的评论中提到的,导入Unicode数据
好的,下面是我现在建立的表。请随时编辑添加到它!(如果您没有足够的声誉进行编辑,请发表评论)
你真的需要这个吗?LaTeX长期以来一直支持Unicode,在utf8输入的序言中包含\usepack[utf8]{inputenc}
就足够了。我无法控制整个LaTeX编译链,它涉及bibtex,并且必须在各种设置上运行(包括科学出版商,他们对设置的选择往往非常保守)。@Giuseppe:inputenc utf8在我看来是非常有限的。基本上,它是Unicode和LaTeX的古老传统字体编码之间的大量映射(在许多情况下,这是一个非常糟糕的选择).XeLaTeX支持Unicode这个词的正确含义是“支持”。@Joey:是的,inputenc主要是一种用latex代码替换utf8序列的黑客行为。但我认为OP在这种情况下不能使用XeLaTeX。哦,我很想这样做……但我不能。因此问题是:)嗯,那么我认为最好的方法就是边走边摆桌子,加上你沿途的角色,这就是我要做的(摆桌子)。我只是想,也许,我可以在某个地方找到一个合适的起点……它在不同的发行版中可能有不同的名称(我的miktex有utf8enc.dfu和其他一些.dfu文件),看起来utf8enc.dfu
比utf8ency.dtx
更广泛可用;它在行首也没有注释字符%
,因此您需要将其从re.match
(或更改为%?
)中删除。这样做并更改为open(subprocess.check_output(['kpsewhich',utf8enc.dfu']).strip()
(添加import subprocess
)应该可以在大多数带有LaTeX安装的unixy系统上运行,而无需复制文件。我不认为我会实现它,但这显然是解决我的问题的最聪明的答案!因此,这里有一个链接,看起来像是一个完整的表(在Elisp中并带有额外的空格):字典使替换操作更加优雅
################################################################
# 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"„", ",," ],
]