2011-01-02 11 views
14

Dada una cadena Unicode, quiero reemplazar caracteres no ASCII por código LaTeX producción de ellos (por ejemplo, tener é se convierten en \'e, y œ convertido \oe). Estoy incorporando esto en un código de Python. Esto debería depender de una tabla de traducción, y me han llegado con el siguiente código, que es simple y parece funcionar muy bien:Reemplazar todos los caracteres acentuados por su látex equivalente

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) 

Pero, escribiendo una tabla de traducción bastante completa me va a llevar mucho tiempo, y Google no ayudó mucho. ¿Alguien tiene algo así o sabe dónde encontrarlo?

PD: Soy nuevo en Python, así que bienvenida a los comentarios en el código anterior, por supuesto.

+2

¿Realmente necesita esto? LaTeX ha estado apoyando Unicode durante mucho tiempo, es suficiente para incluir '\ usepackage [UTF-8] {}' inputenc en el preámbulo para la entrada UTF8 –

+0

no estoy en control de toda la cadena de compilación de látex, que implica bibtex y tiene para ejecutar en una amplia variedad de configuraciones (incluidos los editores científicos, que tienden a ser muy muy conservadores sobre su elección de configuración). –

+0

@Giuseppe: inputenc utf8 es bastante limitado la última vez que miré.Básicamente fue una gran cantidad de mapeo entre Unicode y las antiguas codificaciones de fuentes heredadas de LaTeX (que es una opción bastante pobre en muchos casos). XeLaTeX es compatible con Unicode en el sentido correcto de la palabra "soporte". – Joey

Respuesta

3

Descargar the Unicode Character Database (alrededor de 1 MB). se puede encontrar una tabla relacional para la combinación equivalente de caracteres, por ejemplo é = \u00E9 es e+ ́ que es equivalente a \u0065+\u0301 (LATIN SMALL LETTER E + COMBINING ACUTE ACCENT). puede escribir códigos simples para convertir todos los caracteres combinatorios de todos los scripts o simplemente los que desee (puede controlar por campo de script en la base de datos).

luego vuelva a colocar las combinaciones con código LaTeX. por ejemplo, use la expresión regular \w\u0065 para reemplazar diactrics: \'<the_letter>. (No estoy seguro acerca de la sintaxis Depende de su lenguaje de programación y motor de expresiones regulares..)

EDIT: Si está utilizando Python, ya tiene la base de datos y una implementación de un controlador de usarlo . como se menciona en el comentario siguiente, import unicodedata.

+0

en python simplemente 'importe unicodedata' –

+0

@ 7vies: ¡exactamente! –

+0

No creo que vaya a implementar eso, ¡pero es claramente la respuesta más inteligente para mi problema! Por lo tanto, aceptando. –

1

quizá no traducir los caracteres, sino utilizar el paquete inputenc y el texto Unicode como es

+1

Oh, me encantaría hacer eso ... pero no puedo. De ahí la pregunta :) –

+0

bueno, entonces creo que la mejor manera de hacerlo es construir la mesa sobre la marcha y agregar los caracteres que vengan – Robokop

+0

Eso es lo que haré (construyendo la tabla). Solo pensé, quizás, podría encontrar un punto de partida decente en alguna parte ... –

10

Si no está en control de las opciones de compilación de LaTeX, se puede utilizar la misma tabla utilizada por el paquete inputenc, por lo que la el comportamiento será el mismo que si hubiera usado inputenc.

This document explica cómo inputenc el mapeo, es una secuencia de

... 
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} 

Se podría analizar el archivo en busca de todas las líneas DeclareUnicodeCharacter y extraer con una expresión regular la asignación.

EDIT: He escrito un código que hace el truco:

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

Debe encontrar utf8ienc.dtx en su instalación de látex, o puede google.

+1

podría tener diferentes nombres en diferentes distribuciones (mi miktex tiene utf8enc.dfu y algunos otros archivos .dfu) –

+0

Parece que 'utf8enc.dfu' es más ampliamente disponible que 'utf8ienc.dtx'; tampoco tiene el carácter de comentario '%' al comienzo de la línea, por lo que querrá eliminarlo de 're.match' (o cambiar a'%? '). Hacer eso y cambiar a 'open (subprocess.check_output (['kpsewhich', 'utf8enc.dfu']). Strip())' (después de agregar 'import subprocess') debería funcionar en la mayoría de los sistemas unixy con una instalación de LaTeX sin copiar el archivo alrededor. – Dougal

11

OK, así que aquí está la mesa me he construido por ahora. ¡No dude en editar para agregarlo! (o comentar si no tiene suficiente reputación para editar)

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

es muy útil, gracias –

+0

Aquí hay un enlace a lo que parece una tabla completa (en Elisp y con espacios adicionales): https://raw.githubusercontent.com/clarkgrubb/latex-input/master/latex.el – AlwaysLearning

+0

un diccionario hace que su operación de reemplazo sea mucho más elegante – API

Cuestiones relacionadas