UTF-8 で欧文文字を入力する ~inputenc パッケージ~

LaTeX において「UTF-8で文字を直接入力する」機能を提供する、inputenc パッケージの紹介です。

inputencパッケージしない話

……というと、「あれっ?」と思う人もいるでしょう。LaTeXでUTF-8を使うのにパッケージなんか要ったかな?

もちろん、TeXエンジンによっては、エンジン自体がUTF-8を解釈できる場合もあり、その場合は inputenc パッケージを使う必要はありません。具体的には次のようなケースです。

  • XeLaTeX/LuaLaTeX は既定で入力にUTF-8が使えます。そして(事実上)それしか使えません。

    ※この場合、inputencパッケージは絶対に読み込んではいけません

    ※ただし、実際にUTF-8での入力を活かそうとすると、Unicode対応フォントに切り替える必要があるので、実際にはfontspecパッケージが必須です。

    例1
    % XeLaTeX文書, UTF-8
    \documentclass[a4paper]{article}
    % フォントを"Linux Libertine"に切り替える.
    \usepackage{fontspec}
    \setmainfont{Linux Libertine O}
    \begin{document}
    % "フォントにある文字"なら何でもOK!
    Ευχαριστώ {\TeX}, et до свидания!
    \end{document}
    

    ie-xelatex-1.png

  • (u)pLaTeX の和文の文字コードは起動時のオプション -kanji で指定します。UTF-8にする場合は -kanji=utf8 とします。(upLaTeX ではUTF-8が既定です。)

    例2
    % upLaTeX文書, UTF-8
    \documentclass[a4paper,uplatex]{jsarticle}
    \begin{document}
    ありがとう {\TeX}、そして ピㇼカノ パイェ ヤン!
    \end{document}
    

    ie-uplatex-1.png

逆にいうと、これら以外の、次のような場合にはUTF-8での入力は既定では対応していません。

  • 従来の欧文のLaTeX(pdfLaTeXを含む)を使用する場合。
  • (u)pLaTeXで欧文の文字を入力する場合。

このような場合について、ASCIIにない欧文文字をUTF-8で“入力”する機能を提供するのが inputenc パッケージです。以降では、欧文LaTeX(pdfLaTeX)においてUTF-8入力を行う方法を解説します。

(u)pLaTeXユーザのために補足しておく

(u)pLaTeXでの欧文のUTF-8入力については、基本的なところは欧文LaTeXと同じ(つまり inputenc を利用する)なのですが、(u)pLaTeXに特有の設定が色々と必要になります。これについては以下に挙げる記事を参照してください。

inputencしてみる話

inputencの最も基本的な使い方は、次のようにオプションに文字コード(正確には“入力エンコーディング”)の名前を指定してパッケージを読み込むことです。これで以降の入力が指定の文字コードで解釈されます。

\usepackage[文字コード名]{inputenc}

UTF-8を表す文字コード名は utf8 なので、次のようになります。(他に latin1(Latin-1)、koi8-r(KOI8-R)、ansinew(CP1252) 等の8ビットコードが指定できます。)

\usepackage[utf8]{inputenc}
例3
\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\begin{document}
Köszi {\TeX}, és viszlát!
\end{document}

ie-basic-1.png

基本的に、inputencについての必要な知識はこれだけです。簡単でしたね。めでたしめでたし。

……となればいいのですが、残念ながらこれだけでは話は済みません。LaTeXでは文字の“入力”と“出力”の設定を別に取り扱っているからです。

inputencは“入力できるだけ”

よく知られている通り、先の例のような「アクセント付のラテン文字」は、アクセント命令を使うことで「ASCII文字だけで」入力することも可能です。

例4
\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\begin{document}
K\"oszi {\TeX}, \'es viszl\'at!
\end{document}

実は、inputencがやっていることは、ö のような非ASCII文字を \"o のような“LaTeXの標準的な入力”1に変換しているだけです。

ö\"o; é\'e; ß\ss;

従って、例3(UTF-8直接入力)と例4(ASCII入力)は全く同じ出力を行います。

ところで、実際にLaTeXで非英語の欧文の文書を表したことがある人なら気づいたと思いますが、例4には問題があります。これではフォントエンコーディングが既定のOT1のままなので、〈ö〉のようなアクセント付文字が「合成」になってしまって、その結果、PDF中のテキスト情報が不正になる等の“不具合”が起こります。これを解消するには、フォントエンコーディングをT1に変える必要があったのでした。

※詳細については以下の記事を参照してください。

\usepackage[T1]{fontenc}% OT1→T1に変更
\usepackage{lmodern}% T1にするなら当然Latin Modern

そして、UTF-8入力とASCII入力は出力については全く同じなので、例3についても同じ対処が必要になります。

例5
\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\begin{document}
Köszi {\TeX}, és viszlát!
\par% ↑↓出力は全く同じ
K\"oszi {\TeX}, \'es viszl\'at!
\end{document}

ie-basic-2.png

とにかく、UTF-8入力とASCII入力は“出力に関しては等価”であることに注意してください。

“出力に関しては等価”なので、もしある特定の設定の下で、ある文字がASCII入力で出力できないならば、(同じ設定下で)その文字はUTF-8入力でも出力できません。例えば、既定の設定でいきなりキリル文字を出力しようとしても失敗します。

例6(エラー)
\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
% キリル文字の"出力"の設定がない
\begin{document}
До свидания!! %エラー
\end{document}

この文書をコンパイルすると、「文字〈Д〉が利用できない」という旨の inputenc のエラーが表示されます。

! Package inputenc Error: Unicode char \u8:Д not set up for use with LaTeX.

これを解決するには、文字が現れる箇所で有効なフォントエンコーディングがその文字が利用可能なもの(〈Д〉の場合はT2A等)になっている必要があります。

例7
\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T2A]{fontenc}
\begin{document}
До свидания!! %OK
\end{document}

ie-basic-a1.png

要するに、inputencのutf8入力エンコーディングが“実際に役に立つ”のは“出力できる”文字、つまりLaTeXのフォントエンコーディングの機構だけで処理できるものに限られます。現状で該当するのは、ラテン文字・ギリシャ文字・キリル文字の各用字系とtextcompの記号などです。それ以外の用字系を(8ビット欧文)LaTeXで扱うには専用のパッケージ(例えばアラビア文字なら ArabTeX 等)が必要で、その場合の「UTF-8直接入力」への対応はそのパッケージの責任となります。

ギリシャ文字についての注意

utf8入力エンコーディングにギリシャ文字(LGRフォントエンコーディング)が対応したのは割と最近のことで、TeX Liveだと2013以降です。(greek-inputencおよびgreek-fontencというパッケージが当該の機能を提供しています。)

例8
% TeX Live 2013以降が必要
\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[LGR,T1]{fontenc}% T1を"既定"にする
\usepackage{lmodern}% ※注
% LGRのままラテン文字(ASCII)を書くとギリシャ文字(ASCII翻字)に
% 化けてしまうので, ギリシャ語の部分だけLGRにする
%% \myGrk{テキスト} : LGRに切り替えて出力.
\newcommand\myGrk[1]{{\fontencoding{LGR}\selectfont#1}}
\begin{document}
\myGrk{Ευχαριστώ} {\TeX}, és viszlát!
\end{document}

ie-basic-4.png

※Latin Modernフォントは(名前の通り)ラテン文字のみ含んでいるため当然LGRには対応していないのですが、割と新しいTeX配布では、lm* ファミリのままLGRに変更すると自動的にcm*ファミリに振り替えられます。

それより古いTeX配布の場合、および他のTeX配布でgreek-inputenc等が標準で含まれていない場合は、以下の何れかの対策を講じる必要があります。

  • TeX Live 2012の場合は、fontencでLGRを宣言する代わりに“textalphaパッケージ”を読み込むと、UTF-8直接入力ができるようになります。

  • CTANからgreek-inputencとgreek-fontencの両パッケージを入手してインストールします。これでTex Live 2013以降と同じ機能が使えます。

    ただしこの際に注意点があります。インストールの作業を行った直後は、lgrenc.def というファイルが元からシステムにあるもの(恐らく $TEXMF/tex/generic/babel/greek/ にある)と新たに greek-fontenc から導入されたものの2つがある状態になります。このうち「TeX から見える方」が後者である必要があります。多くのシステムでは実際に後者が優先されるのですが、前者が優先されるシステムも存在します。(mktexlsr の後に)kpsewhich lgrenc.def を実行して「自分が入れた方のパス」が出ることを確認してください。もし上手くいかない場合は、既存の方の lgrenc.def を削除するという強硬策を採る必要があります。

  • “utf8x”という特殊な入力エンコーディングを利用するという方法もあります。(ucs というパッケージが必要です。)

    例9
    % ucsパッケージが必要
    \documentclass[a4paper]{article}
    \usepackage[utf8x]{inputenc}
    \usepackage[LGR,T1]{fontenc}% T1を"既定"にする
    % もし'T1/lmr/...'が無いというフォントのエラーが出る場合は
    % lmodern の使用を諦める(ラテン文字がcm-superになる)
    \usepackage{lmodern}
    \newcommand\myGrk[1]{{\fontencoding{LGR}\selectfont#1}}
    \begin{document}
    \myGrk{Ευχαριστώ} {\TeX}, és viszlát!
    \end{document}
    

    ie-basic-4.png

    ただし、この“utf8x”の実装コードはかなり複雑で、そのため、幾つかのパッケージと共存できないことが知られています。できる限り“utf8”で済ませる方が好ましいでしょう。

“文字の知識”を自分で追加する

既に述べたように、UTF-8入力を利用しても、現在有効なフォントエンコーディングにない文字はそもそも出せません。しかしLaTeXの場合、アクセント合成ができるので、「アクセント付のラテン文字」程度であれば、とにかく“それに見える”ものを出力することはできます。(PDFのテキスト情報は潰れてしまいますが。)例えば、文字〈ḥ〉(下ドット付h)であれば、\d{h} で出力できます。

Dhanyav\=ada\d{h}

ie-basic-a3.png

残念ながら、utf8入力エンコーディングは基本的に「フォントエンコーディングにある文字」を入力するための機構なので、このような「合成で出力する文字」の知識まではもっていません。つまり、 を直接書いてそれを \d{h} に変換させることは既定ではできないのです。

しかし、ユーザが自分で“文字の知識”を追加することができます。このための便利な命令が newunicodechar パッケージが提供する \newunicodechar 命令です。この命令は次のように使います。

\newunicodechar{文字}{その文字を出すためのLaTeXコード}

次の例では、この \newunicodechar 命令で〈ā〉や〈ḥ〉の定義を与えることでUTF-8の直接入力を実現しています2

例10
\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
% "T1にない"文字を使いたい
\usepackage{newunicodechar}
\newunicodechar{ā}{\=a}   % U+0101 latin small letter a with macron
\newunicodechar{}{\d{h}} % U+1E25 latin small letter h with dot below
\begin{document}
Dhanyavādaḥ {\TeX}, punaḥ milāmaḥ.
\end{document}

ie-basic-6.png

なお、\newunicodechar で定義するものは記号でもよいので、例えばシンボルフォントの“文字”をUnicode文字に結び付けて使うこともできます。

例11
\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{wasysym}% \smiley の出処
\usepackage{newunicodechar}
\newunicodechar{}{\smiley}% U+263A white smiling face
\begin{document}
\begin{center}
egy idióta vagy
\par\large\quad\quad\end{center}
\end{document}

ie-basic-7.png

※ newunicodechar パッケージはTeX Liveだと2011以降に含まれます。TeX配布に含まれていない場合は自分でインストールしてください。代替案として、inputenc(のutf8エンコーディング)自身が提供している \DeclareUnicodeCharacter という命令を用いることもできます。この命令は第1引数に定義する文字のUnicode値の16進数をとります。

\DeclareUnicodeCharacter{263A}{\smiley}% ☺ = U+263A
\DeclareUnicodeCharacter{1E25}{\d{h}}% ḥ = U+1E25

まとめ

inputenc パッケージを使うと“旧来の”欧文LaTeX(pdfLaTeX)においてUTF-8で文字を“入力”できます。ただし、実際に非英語文字を“出力”するためには fontenc パッケージも必要です。


  1. “LaTeXの標準的な入力”のことをLaTeX用語で「LICR(LaTeX internal character representation)」といいます。 

  2. なお、2017年1月のLaTeXの改訂において、T1に含まれない(合成により出力される)ラテン文字の一部について、標準で文字の定義が与えられるようになりました。例えば〈ā〉は標準で直接入力が可能です。(〈ḥ〉は不可。) 

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.