激闘TeX:ギリシャ文字とキリル文字
アクセントと特殊記号 (2)と前回の投稿までで、西ヨーロッパ諸語はなんとかなりました。次はギリシャ語とロシア語をなんとかする番なんですが、今まで避けてきたフォントの話題に触れなければならないのでまあめんどくさかったです。とりあえず私なりの理解をしたためてみます。
pxcjkcatパッケージで「ギリシャ・キリル文字が欧文扱いに」なるはずのprefercjkvar
モードを指定して文中にロシア語を書いてもエラーになります。
\usepackage[T1]{fontenc} \usepackage{textcomp} \usepackage[utf8]{inputenc} \usepackage[prefercjkvar]{pxcjkcat}
もう一度「UTF-8 で欧文文字を入力する ~inputenc パッケージ~」を熟読すると、これはどうやらupLaTeXそのものの挙動とinputencパッケージの働きによるものらしいです。
でここから話が進まなくなって、先にエンコードに関する知識が必要なことが分かったので勉強しました。わけわかんないから今まで触らないようにしてたのに。・゚・(ノД`)・゚・。
恐ろしいことにTeXには、我々が今まで一般的に使ってきたUTF-8やSHIFT-JISとは全く意味が異なるエンコーディングが存在します。
すごくざっくり言っちゃうと、UTF-8というのは「筆者とテキストエディタが原稿を書く」ために用いているエンコード(=ファイルのエンコーディング)で、それとは別に「できたファイルを受け取ったTeXが活字を並べる時に参照する 」エンコードというものがあって、それがかのフォントエンコーディングだというわけです。前者が入力、後者が出力と言えばいいでしょうか。
そしてこの2つはまったく連動していません。いや和文の部分ではどっちもUnicodeだけど。TeXは欧文と和文を扱う部分が右脳と左脳のように分かれています。(語弊のある例えだけどいい言い回しが思いつかない)
UTF-8で書かれたファイルを受け取ったupLaTeXが文を読み、最低限のアルファベットだけ欧文部分が扱い、和文部分がそれを除いたすべての文字をUnicode文字集合というひとつの巨大な袋から取り出して並べてくれます。これが“u”pLaTeXであるゆえんですね。
なのでパッケージを使わずにキリル文字を原稿に書いた時も特にエラーになることはなく、代わりにカナと同じく縦向きに組まれます。ここまで前提です。
そして今やりたいのはフランス語やギリシャ語を横倒しにする、すなわちupLaTeXが出力する時に使う「最低限のアルファベット」の範囲を拡大して、拡張アルファベットもその中に含めることです。
デフォルトの「最低限のアルファベット」の範囲というのが遠い昔、はるか彼方の銀河系でコンピュータが128文字しか扱えなかったころに作られたOT1フォントエンコーディングになります。16×8しかない表にアルファベットと最小限の記号が詰め込まれています。これで組版システムができちゃうんだから表音文字ってのは気楽なもんだよ┐(´д`)┌
まあそんな数では早晩破綻します。そのため16×16あるT1エンコーディングと、さらに追加の記号を収めたTS1エンコーディングが作られました。T1にはほとんどのアクセントつきアルファベットが、TS1には§などの記号が収められています。
これらを使えるようにするための呪文が、最初に書いた\usepackage[T1]{fontenc}
と\usepackage{textcomp}
でした。
これでめでたくフランス語が書けるようになったかというとさにあらず。出力用の袋は追加されたけれど、まだupLaTeXがそれを認識していません。「アクセントつきアルファベットとかは欧文脳の部分で処理しろ」という命令を通してやる必要があって、これがinputencとpxcjkcatパッケージの機能になります。
さてやっと準備が整いました。pxnoncjk
モードでほとんどを欧文扱いにしてやってタイプセットすると、フランス語スペイン語あたりまではちゃんと欧文扱いで組まれますがギリシャ・キリル文字はダメです。何故ならT1・TS1の表の中にないから。
広がったとはいえT1エンコーディングもたかが256文字です。主要なアクセントつきアルファベットを収めたらもういっぱいです。欧文として認識はできたものの、出力の段になって肝心の活字がない、という状態こそがこの壁の原因だったようです。やれやれ。
対策はもちろんあって、活字を用意してやればいいんです。キリル文字を含んでいるフォントエンコーディングがT2A、ギリシャ文字がLGRです。これをT1エンコーディングに追加してやることでupLaTeXは新たな活字を手にしたことになります。
\usepackage[T2A,LGR,T1]{fontenc} %標準にしたいものを最後に置く
さあもう文句ないだろうと思ったら最後の試練がありました。upLaTeXは文字種を自動判別してくれません。キリル文字に出会ったらT2Aエンコーディングに切り替える、みたいな動作はしてくれないので、使うべきエンコーディングをその都度人間が指定してやらなければなりません。
そこで登場するのがBabelパッケージです。本文において\foreignlanguage{russian}{中身}
で囲ってやることでようやくT2Aエンコーディングが働き、めでたく日本語の文書に横倒しのヨーロッパ諸語を埋め込むことができました。
……ああ疲れた。
(※実は筆者の環境においてfontencでT2A“だけ”を指定すると、Babelを使わないベタ書きでもキリル文字とアクセント文字をどちらもきちんと組むことができました。ただどう動いているのかが分からないので裏技としておきます。鋭意調査中です)