Замените все акцентированные символы их эквивалентом 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) 

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

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

4 Solutions collect form web for “Замените все акцентированные символы их эквивалентом LaTeX”

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

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

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

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

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

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

  • Невозможно использовать unichr в Python 3.1
  • Изменение кодировки Windows cmd вызывает сбой Python
  • Использование ввода utf-8 для модуля cmd Python
  • Преобразование объекта unicode в латинскую строку с объектами
  • Проверка python, если строка utf-8 в верхнем регистре
  • Python Unicode UnicodeEncodeError
  • Персонаж \ u260e
  • Почему я не могу ввести японские символы в приглашении в Python3?
  • Python - лучший язык программирования в мире.