【问题标题】:Replace all accented characters by their LaTeX equivalent用对应的 LaTeX 替换所有重音字符
【发布时间】:2011-06-02 12:14:19
【问题描述】:

给定一个 Unicode 字符串,我想用生成它们的 LaTeX 代码替换非 ASCII 字符(例如,将 é 变为 \'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)

但是,编写一个相当完整的翻译表需要我很长时间,而 Google 并没有多大帮助。有人准备好这样的东西吗,或者知道在哪里可以找到?

PS:我是 Python 新手,所以我当然欢迎 cmets 上的代码。

【问题讨论】:

  • 你真的需要这个吗? LaTeX 已经支持 Unicode 很长时间了,在 UTF8 输入的前导码中包含 \usepackage[utf8]{inputenc} 就足够了
  • 我无法控制整个 LaTeX 编译链,它涉及 bibtex 并且必须在各种设置上运行(包括科学出版商,他们往往对他们的选择非常保守)设置)。
  • @Giuseppe: inputenc utf8 在我上次查看时非常有限。基本上它是 Unicode 和 LaTeX 的古老传统字体编码之间的大量映射(在许多情况下这是一个相当糟糕的选择)。 XeLaTeX 在“支持”这个词的正确意义上支持 Unicode。
  • @Joey:是的,inputenc 主要是一种用乳胶代码替换 utf8 序列的 hack。但我不认为 OP 在这种情况下可以使用 XeLaTeX。

标签: python unicode latex diacritics


【解决方案1】:

好的,这是我现在建立的表格。请随时编辑以添加它! (或评论,如果你没有足够的声誉来编辑)

################################################################
# 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"„", ",," ],
]

【讨论】:

【解决方案2】:

下载the Unicode Character Database(约1MB)。您可以找到等效字符组合的关系表,例如 é = \u00E9e+ ́,它等效于 \u0065+\u0301 (LATIN SMALL LETTER E+COMBINING ACUTE ACCENT)。您可以编写简单的代码来转换所有脚本的所有组合字符或只转换您想要的字符(您可以通过数据库中的脚本字段进行控制)。

然后用 LaTeX 代码替换这些组合。例如使用正则表达式\w\u0065 替换变音符号:\'<the_letter>。 (我不确定语法。这取决于您的编程语言和正则表达式引擎。)

编辑: 如果您使用的是 python,则您已经拥有数据库和处理程序的实现来使用它。就像在下面的评论中提到的那样,import unicodedata

【讨论】:

  • 我不认为我会实现它,但这显然是解决我的问题的最聪明的答案!因此,接受。
【解决方案3】:

如果您无法控制 LaTeX 编译选项,则可以使用与 inputenc 包相同的表,这样行为将与您使用 inputenc 时相同。

This document 解释 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,或者你可以谷歌它。

【讨论】:

  • 它在不同的发行版中可能有不同的名称(我的 miktex 有 utf8enc.dfu 和其他一些 .dfu 文件)
  • 似乎utf8enc.dfuutf8ienc.dtx 更广泛可用;它在行首也没有注释字符%,因此您需要将其从re.match 中删除(或更改为%?)。这样做并更改为open(subprocess.check_output(['kpsewhich', 'utf8enc.dfu']).strip())(在添加import subprocess 之后)应该可以在大多数安装了 LaTeX 的 unixy 系统上工作,而无需复制文件。
【解决方案4】:

也许不翻译字符,而是按原样使用inputenc 包和 unicode 文本

【讨论】:

  • 哦,我很想这样做……但我做不到。因此问题:)
  • 好吧,那么我认为最好的方法是在你去的时候建立表格并添加你来的字符
  • 这就是我要做的(建立桌子)。我只是想,也许,我可以在某个地方找到一个不错的起点......
猜你喜欢
  • 2011-10-05
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 2019-02-05
  • 1970-01-01
相关资源
最近更新 更多