Замените все акцентированные символы их латексным эквивалентом


Учитывая строку Unicode, я хочу заменить символы, не являющиеся 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, поэтому я приветствую комментарии к коду выше, конечно.
4 14

4 ответа:

Загрузите базу данных символов Unicode (около 1 МБ). вы можете найти реляционную таблицу для эквивалентной комбинации символов, например é = \u00E9 является e+ ́, что эквивалентно \u0065+\u0301 (LATIN SMALL LETTER E+COMBINING ACUTE ACCENT). вы можете написать простые коды для преобразования всех комбинационных символов всех скриптов или только их, которые вы хотите (вы можете управлять полем скрипта в базе данных).

Затем замените комбинации кодом LaTeX. например, используйте регулярное выражение \w\u0065 для замены диактрис: \'<the_letter>. (А я нет уверен насчет синтаксиса. Это зависит от вашего языка программирования и механизма регулярных выражений.)

Редактировать: Если вы используете python, у вас уже есть база данных и реализация обработчика для ее использования. так же, как упоминалось в приведенном ниже комментарии, import unicodedata.

Итак, вот таблица, которую я собрал на данный момент. Пожалуйста, не стесняйтесь редактировать, чтобы добавить к нему! (или комментарий, если у вас недостаточно репутации для редактирования)

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

Если вы не контролируете параметры компиляции 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, и извлечь с регулярным выражением отображение.

EDIT: я написал код, который делает трюк:

# -*- 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"

Вы должны найти utf8ienc.dtx в вашей установке latex, или вы можете погуглить его.

Возможно, не переводить символы, а использовать пакет inputenc и текст unicode как есть