Заменить все акцентированные символы их эквивалентом LaTeX - PullRequest
14 голосов
/ 02 января 2011

Учитывая строку 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)

Но написание довольно полной таблицы перевода займет у меня много времении Google мало чем помог.Есть ли у кого-нибудь такая готовая вещь или вы знаете, где ее найти?

PS: Я новичок в Python, поэтому, конечно, я приветствую комментарии к приведенному выше коду.

Ответы [ 4 ]

12 голосов
/ 02 января 2011

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

################################################################
# 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"„", ",," ],
]
10 голосов
/ 02 января 2011

Если вы не контролируете параметры компиляции 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"

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

3 голосов
/ 02 января 2011

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

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

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

1 голос
/ 02 января 2011

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

...