2011-01-02 12 views
14

Unicode文字列を指定すると、ASCII以外の文字をLaTeXコードで置き換えることができます(たとえば、é\'eœ\oeとなります)。私はこれをPythonコードに組み込んでいます。これは、変換テーブルに依存しなければならない、と私は簡単で、うまく動作しているようです次のコード、が出ている:すべてのアクセント付き文字を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はあまり役に立たなかった。誰かがそのようなことを準備しているか、またはどこを見つけるかを知っていますか?

PS:私はPythonの初心者ですので、上記のコードについてのコメントを歓迎します。おそらく

+2

本当に必要ですか? LaTeXは長い間Unicodeをサポートしてきましたが、UTF8入力のプリアンブルに '\ usepackage [utf8] {inputenc}'を含めるだけで十分です –

+0

私はbibtexを含むLaTeXコンパイルチェーン全体を制御できません。さまざまな設定(科学出版社を含む)で実行することができます。これらの設定は、セットアップの選択について非常に慎重な傾向があります。 –

+0

@Giuseppe:inputenc utf8は、私が見て最後にかなり制限されています。基本的には、Unicodeと古くからのLaTeXのフォントエンコーディング(多くの場合、どちらかというと貧弱なオプション)との間のマッピングが非常にたくさんありました。 XeLaTeXは、 "サポート"という言葉の意味でのUnicodeをサポートしています。 – Joey

答えて

3

ダウンロードthe Unicode Character Database(約1MB)。同等の文字の組み合わせ(例:é = \u00E9)のリレーショナルテーブルは、\u0065+\u0301 (LATIN SMALL LETTER E + COMBINING ACUTE ACCENT)に相当するe+ ́です。あなたはすべてのスクリプトのすべての組み合わせ文字を変換するための簡単なコードを書くことができます(データベースのスクリプトフィールドによって制御することができます)。

次に、組み合わせをLaTeXコードで置き換えます。例えば、\w\u0065の正規表現を使用して歯科医学を置き換えてください:\'<the_letter>。 (。。私は構文についてはよく分からないそれはあなたのプログラミング言語と正規表現エンジンによって異なります)

EDIT: あなたのpythonを使用している場合は、あなたが既にデータベースとそれを使用するハンドラの実装を持っています。以下のコメントのように、​​。

+0

Pythonで 'import unicodedata' –

+0

@ 7vies:正確に! –

+0

私はそれを実装するとは思わないが、それは明らかに私の問題のための賢明な答えです!したがって、受け入れる。 –

1

ないように、文字を変換ができますが、LaTeXのコンパイルオプションのコントロールに含まれていない場合、あなたはinputencパッケージで使用されるのと同じテーブルを使用することができます

+1

ああ、私はそれをやりたいです...しかし、私はできません。したがって、質問:) –

+0

よく、その後、私はそれを行う最善の方法は、あなたが行くとあなたが来る文字を追加すると、テーブルを構築することだと思います – Robokop

+0

それは私がやっていることです(テーブルを構築する)です。私はちょうどどこかでまともな出発点を見つけることができたかもしれないと思ったかもしれません... –

10

あるようinputencパッケージとUnicodeテキストを使用しますあなたがinputencを使用した場合と同じ動作になります。

This documentは、それはあなたがすべてのDeclareUnicodeCharacterの行を探しているファイルを解析し、正規表現のマッピングで抽出することができ

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

のシーケンスであり、inputencはマッピングを行いませ方法について説明します。

EDIT:あなたのラテックスインストールでutf8ienc.dtxを見つける必要があり、またはあなたはそれをグーグルことができ

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

:私は、トリックを行いますいくつかのコードを書いています。

+1

別のディストリビューションで別の名前があるかもしれません(私のmiktexにはutf8enc.dfuといくつかの他の.dfuファイルがあります) –

+0

'utf8enc.dfu' 'utf8ienc.dtx'より広く利用できます。それは行頭にコメント文字 '%'を持たないので、 're.match'からその文字列を削除したい(または'%? 'に変更する)でしょう。それを行い、 'open(subprocess.check_output(['kpsewhich'、 'utf8enc.dfu'])。strip())'( 'importサブプロセスを追加した後) 'は、LaTeXをインストールして、ファイルの周り。 – Dougal

11

OK、これは私が今作成したテーブルです。気軽に編集して追加してください! (編集に十分な評判がない場合はコメント)

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

関連する問題