2011-01-02 6 views
14

유니 코드 문자열이 주어지면 비 ASCII 문자를 LaTeX 코드로 바꾸어서 (예 : é\'e, œ\oe이됩니다). 이 코드를 파이썬 코드에 통합하려고합니다. 이 변환 테이블에 의존해야하고, 나는 간단하고 잘 작동하는 것 같다 다음 코드와 함께 올라와있다 :모든 악센트 부호가있는 문자를 해당 LaTeX 문자로 바꿉니다

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은별로 도움이되지 못했습니다. 누군가 준비가되어 있거나 어디에서 찾을 수 있는지 알고 있습니까?

추신 : 나는 Python을 처음 사용하기 때문에 위의 코드에 대한 의견을 환영한다.

+2

정말로 필요한가? LaTeX는 오랫동안 유니 코드를 지원해 왔으며, UTF8 입력에 대한 전문에'\ usepackage [utf8] {inputenc} '를 포함하는 것만으로도 충분합니다. –

+0

bibtex가 포함 된 LaTeX 컴파일 체인 전체를 제어하지 못하고 있습니다. (자신의 설정 선택에 대해 매우 보수적 인 경향이있는 과학 출판사를 포함하여) 다양한 설정을 실행할 수 있습니다. –

+0

@Giuseppe : inputenc utf8은 내가 본 마지막으로 매우 제한적입니다.기본적으로 유니 코드와 고대의 레거시 글꼴 인코딩 인 LaTeX (많은 경우에있어서 다소 가난한 옵션 임) 간의 매핑이 아주 많이있었습니다. XeLaTeX는 "지원"이라는 단어의 의미에서 유니 코드를 지원합니다. – Joey

답변

3

다운로드 the Unicode Character Database (약 1MB). 예를 들어 é = \u00E9과 같은 문자 조합에 대한 관계형 테이블은 e+ ́이고 \u0065+\u0301 (LATIN SMALL LETTER E + COMBINING ACUTE ACCENT)과 같습니다. 모든 스크립트의 모든 결합 문자 또는 원하는 문자를 변환하기위한 간단한 코드를 작성할 수 있습니다 (데이터베이스의 스크립트 필드로 제어 할 수 있음).

그런 다음 조합을 LaTeX 코드로 바꿉니다. 예를 들어 정규식 \w\u0065을 사용하여 다이어트 트릭을 대체하십시오 : \'<the_letter>. (나는 구문에 대한 확실하지 않다 그것은 당신의 프로그래밍 언어 및 정규 표현식 엔진에 따라 달라집니다.).

이 편집 :가 당신이 파이썬을 사용하는 경우, 당신이 이미 가지고있는 데이터베이스와 핸들러의 구현이 그것을 사용하기 . 아래 코멘트에 언급 된 것처럼, import unicodedata.

+0

in python 그냥'import unicodedata' –

+0

@ 7vies : 정확히! –

+0

구현할 생각은 없지만 문제는 분명히 분명합니다. 따라서 수락합니다. –

1

아마도 문자를 번역하지만

+1

아, 그렇게하고 싶지만 ... 할 수 없어요. 따라서 질문 : –

+0

글쎄, 그럼 내가 할 가장 좋은 방법은 당신이 가서 당신이 와서 문자를 추가로 테이블을 구축하는 것입니다 – Robokop

+0

그게 내가 (테이블을 구축하고있을거야). 나는 어쩌면 어딘가에 괜찮은 출발점을 찾을 수 있을지도 모른다고 생각했다. –

10

입니다 당신이 LaTeX의 컴파일 옵션의 제어에없는 경우 inputenc 패키지 및 유니 코드 문자를 사용하지, 당신은 그래서 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" 

당신은 당신의 라텍스 설치에 utf8ienc.dtx 찾아야한다을, 또는 당신은 그것을 구글 수 있습니다.

+1

다른 배포본에 다른 이름이있을 수있다. (내 miktex는 utf8enc.dfu와 다른 .dfu 파일을 가지고있다) –

+0

'utf8enc.dfu'는 'utf8ienc.dtx'보다 더 광범위하게 이용 가능합니다; 줄의 시작 부분에 주석 문자'%'가 없기 때문에,'re.match' (또는'%?')로 바꾸고 싶을 것이다. 그 작업을하고'open (subprocess.check_output ([ 'kpsewhich', 'utf8enc.dfu']). strip())'('import subprocess '를 추가 한 후)는 복사하지 않고 LaTeX 설치를하는 대부분의 unixy 시스템에서 작동해야합니다 주위의 파일. – Dougal

11

좋아요, 그럼 여기에 제가 작성한 표가 있습니다. 언제든지 편집하여 추가하십시오! (또는 편집하기에 충분한 평판이 없다면 의견을 말하십시오)

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

덕분에 매우 유용합니다. –

+0

다음은 Elisp 및 여분의 공백으로 된 전체 테이블 모양의 링크입니다. https://raw.githubusercontent.com/clarkgrubb/latex-input/master/latex.el – AlwaysLearning

+0

사전을 사용하면 교체 작업이 훨씬 더 우아 해집니다. – API

관련 문제