CJK,Unicode パッケージ,ロシア語多書体の利用
since Mar.30 2004
私は消しゴムです.
— Japanese example, languages.ps
(LaTeX Unicode package)
   

-   はじめに
-   前提条件
-   ロシア語ハイフネーションパターン
-   CJK,VnTeX パッケージの導入
-   CJK フォント環境
-   日中韓フォント
-   TrueType Unicode フォント
-   Ttf2pk の導入
-   さざなみ用フォント定義の作成
-   TrueType フォント設定
-   CJK の利用
-   cjk-enc の利用
-   Unicode パッケージの導入
-   PSCyr パッケージの導入
-   タイ語単語分割
-   ThaiLaTeX の導入
-   Unicode,PSCyr の利用
-   Unicode 日中韓の包摂について
-   Emacs 設定の注意事項
-   謝辞

はじめに

 

多言語 TeX 文書を多言語文字コード (Unicode) で記述する試みに Unicode, CJK, Babel の各パッケージを併用する方法がある.CJK 環境内でしか日本語が記述できない,LaTeX2e で処理するため和文マクロの資産が利用できないなどの制限がある一方,pLaTeX2e + Babel にはないメリットも享受できる.まず第一に,韓国語や中国語,ヴェトナム語,タイ語などを併用できる.さらに,本サイトの主な関心であるロシア語については,和文混在原稿にキリル文字を直接タイプでき,PSCyr Type1 フォントを使ったロシア語多書体の文書が作成できる.

本稿は,TeX パッケージ CJK, Unicode, PSCyr, VnTeX, ThaiLaTeX の導入, フォント環境の設定,及び組版実践についてのメモである.ここで述べた構築手順に従えば,ロシア語多書体,日中韓国語,ギリシア語,タイ語,ヴェトナム語混在の TeX 文書が実現できるようになる.タイ語については単語分割の方法にも言及する.

前提条件

 

FreeBSD 5.x-RELEASE,Mac OS X 10.4 Tiger を導入手順/確認の前提環境としている.Linux でも FreeBSD とほぼ同じ手順が通用する.また Windows の場合も Ttf2pk などの実行バイナリの準備,コマンド入力方法を除けば,導入の考え方はほとんど同じである.基本的に UNIX 系 OS と同様の流れで,CJK,Unicode,PSCyr 等の TeX パッケージの各ファイルを TDS(TeX Directory Structure)に従った所定の位置に格納し,フォントマップを更新すればよいはずである.

LaTeX のバージョンは 3.141592-1.21a-2.2 (Web2C 7.5.4, kpathsea 3.5.4) である.teTeX-3,pTeX-3 及び Babel パッケージのインストールは /usr/local/teTeX 下に済ませているものとして省略している.pTeX-p3.1.4 以降の Babel 環境の設定については栗山雅俊氏によるガイド「Babel を使った最新版 LaTeX2e、pLaTeX2e での多言語環境構築 — pTeX-p3.1.4 以降(Win・UNIX・Mac)— 第3版-4」(SJIS版)を参照していただきたい.

コマンドラインの操作は Tcsh の仮想端末(ターミナル)上のものである.Bash ユーザはコマンド操作を一部読替えなければならない.% は一般ユーザ,# はスーパユーザのコマンドプロンプトを示す.行幅の事情により,コマンドライン入力を \ 文字で折返して表示しているところがある.実際には,この \ や改行なしに一息にコマンド文字列を入力すべきである.

手順では,インターネットリソースの一括ダウンロードツールとして Wget を利用している.あらかじめこれをインストールしておくとよい.もちろんダウンロード操作は Curl などのダウンローダや,FTP クライアント,Web ブラウザで代用できる.

UNIX 系のフリーソフトウェアの多くは,付属の configure スクリプトをインストールの手始めに実行する.configure はシステム環境を調べ,これに即した Makefile を生成する.configure のエラーは,往々にして,当該ソフトウェアの前提とするライブラリやヘッダファイルがシステムに存在しないことが原因である.本稿で示した手順どおりに動作しないとき,まずエラー情報を吟味して,前提となるライブラリ,ヘッダファイルの所在を確認いただきたい.

本稿では /usr/local/teTeX/share/texmf-local 以下にパッケージを導入するものとしている.このディレクトリパスを環境変数 $TEXDIR に格納して話を進める.ここでは $TEXDIR 以下のディレクトリツリーを TeX ツリーと呼ぶ.

[ 導入 TeX ディレクトリの環境変数セット ]
% setenv TEXDIR /usr/local/teTeX/share/texmf-local
[ Bash の場合は以下のとおり ] 
$ export TEXDIR=/usr/local/teTeX/share/texmf-local
	

お断りしておくが,私は例示した各言語に通じているわけではない.タイ語やヴェトナム語,中国語,韓国語について全く解するところがない.行の折返し位置の妥当性にすら自信がなく,なんとなくその言語の雰囲気がわかる程度である.ギリシア語についても大学の西欧古典語授業で少し修めたに過ぎない.言語の文例は CJK パッケージ添付のサンプルなどから借用したが,引用の際に粗野な誤りを犯しているかもしれない.ご指摘いただきたい.

なお,多言語 TeX 原稿コード例は古典ギリシア語やタイ語,ヴェトナム語などを含むため,ブラウザ表示には Unicode フォントが必要である.ユーザの Web ブラウザ環境によっては表示されない文字があるかもしれない.ご了承いただきたい.

ロシア語ハイフネーションパターン

 

日本語 pLaTeX + Babel 環境でロシア語をタイプセットする場合,キリル・フォントエンコーディングは通常 OT2 を指定する.これに対し,CJK パッケージ及び Unicode パッケージにおけるロシア語の記述には,キリル文字を直接タイプする入力形態に即して,T2A フォントエンコーディングを用いるのがよい.従ってロシア語のハイフネーションパターンについては,T2A 用パターンファイルを language.dat の russian に指定して,latex フォーマットファイルに読込ませておく.OT2 用のハイフネーションパターンでは全く分綴されないので注意すべきである.ウクライナ語など他のスラヴ語も事情は同じである.

CTAN で配布されているロシア語ハイフネーションパターンはデフォルトで T2A 用となっている.現状 OT2 用のみで運用しているのならば,再度 latex については,以下の手順でフォーマットファイルを T2A 用に生成するとよい.

ruhyphen.tex ファイルをエディタで開き,次に示すとおりになっているか確認する.すでに OT2 用に調整されている場合は,バックアップ(ruhyphen-ot2.tex)を取得したのち,変更を行う.

\ifx\Encoding\undefined
\def\Encoding{t2a}
%\def\Encoding{ucy}
%\def\Encoding{lcy}
%\def\Encoding{ot2}
%\def\Encoding{koi}
\fi

\ifx\Pattern\undefined
\def\Pattern{al}
%\def\Pattern{as}
%\def\Pattern{ct}
%\def\Pattern{dv}
%\def\Pattern{mg}
%\def\Pattern{vl}
%\def\Pattern{zn}
\fi
	

language.dat を latex 用/platex 用それぞれ別個に管理して,フォーマットファイルを生成するとよい.

# cd /usr/local/teTeX/share/texmf-dist/tex/generic/config
# cp language.dat language.dat.ltx
# cp language.dat language.dat.pltx
[ latex 用の編集: T2A ]
# vi language.dat.ltx
# grep -e 'russian' language.dat.ltx
russian  ruhyphen.tex       %% specify file for T2A
# cp language.dat.ltx language.dat
[ latex 用フォーマットファイルの生成: T2A ]
# fmtutil --byfmt latex
[ platex 用の編集: OT2 ]
# vi language.dat.pltx
# grep -e 'russian' language.dat.pltx
russian  ruhyphen-ot2.tex   %% specify file for OT2
# cp language.dat.pltx language.dat
[ platex 用フォーマットファイルの生成: OT2 ]
# fmtutil --byfmt platex
[ 環境によっては fmtutil --byfmt platex-euc ]
	

CJK,VnTeX パッケージの導入

 

CJK パッケージ(2005.8 時点最新版 4.6.0)を CJK のホームページからダウンロードして TeX ツリーに格納する.CJK のサンプル文書にはヴェトナム語も含まれており,この際 VnTeX ヴェトナム語パッケージ(2005.12 時点最新版 3.02)も VnTeX ホームページからダウンロードし,組込むこととする.

パッケージの古い版がすでにインストールされている場合,削除しておく.

[ 古い版の削除 ]
% su -m
# find /usr/local/teTeX/share -name vnr -or -name "CJK*" \
 -type d | xargs rm -fr
# exit
[ 作業用ディレクトリを作成 ]
% mkdir ~/cjk
% cd ~/cjk
[ CJK パッケージをダウンロード ]
% wget -nH -nd http://cjk.ffii.org/cjk-4.6.0.tar.gz
[ VnTeX パッケージをダウンロード ]
% wget -nH -nd \
  http://vntex.sourceforge.net/download/vntex/vntex-3.02.tar.bz2
[ CJK パッケージを TeX ツリーに展開 ]
% tar zxvf cjk-4.6.0.tar.gz
% su -m
# mkdir $TEXDIR/tex/latex/CJK-4.6.0
# cd cjk-4.6.0/texinput
# tar cf - . | ( cd $TEXDIR/tex/latex/CJK-4.6.0; tar xvf - )
[ VnTeX パッケージを TeX ツリーに展開 ]
# cd ~/cjk
# tar jxvf ~/cjk/vntex-3.02.tar.bz2 -C $TEXDIR
# mktexlsr
[ VnTeX フォントマップの登録 ]
# updmap --nohash --nomkmap --disable vnr.map
# updmap --nohash --nomkmap --enable MixedMap vnrtext.map
# updmap --nohash --nomkmap --enable MixedMap vnrother.map
# updmap --nohash --nomkmap --enable Map urwvn.map
# updmap --nohash --nomkmap --enable Map chartervn.map
# updmap --nohash --nomkmap --enable Map mscorevn.map
# updmap
	

CJK フォント
環境

 

CJK パッケージにおける日本語,韓国語,中国語フォントはいくつか選択肢がある.日本語,中国語簡体字/繁体字,韓国語それぞれ,和田研フォント,Arphic フォント,UHC(HLaTeX 用)フォントがサポートされている.これらは主に Type1 フォントである.

CJK UTF-8 環境では Unicode に対応した TrueType フォントが利用できる.ここでは TrueType フォントを PK フォントに変換して文書に埋込む方法について示す.Ttf2pk ユーティリティによって,TrueType 形式を PK ビットマップ形式に変換して使用するわけである.Dvipdfmx で PDF を作成する場合は TrueType フォントを埋込むことも可能である.このため,Ttf2pk 及び TrueType フォントのインストール/環境設定を行う.この際,CJK 標準である Bitstream 社 Cyberbit.ttf 多言語フォントのほか,和文フォントの選択肢を広げるため,さざなみ TrueType フォントを追加して使うカスタマイズ方法についてもしるしている.

日中韓フォント

 

以下のフォントを CTAN からダウンロードする.

% cd ~/cjk
% mkdir cjk-fonts
% cd cjk-fonts
% alias WGET wget -nH -nd
% setenv CTAN ftp://ftp.riken.go.jp/tex-archive/fonts 
[ 中国語簡体字 ]
% WGET $CTAN/arphic/bkai00mp-20050720.tar.gz
% WGET $CTAN/arphic/bsmi00lp-20050720.tar.gz
[ 中国語繁体字 ]
% WGET $CTAN/arphic/gbsn00lp-20050720.tar.gz
% WGET $CTAN/arphic/gkai00mp-20050720.tar.gz
[ 日本語 ]
% WGET $CTAN/wadalab/gothic-0-13-20050730.tar.gz
% WGET $CTAN/wadalab/maru-0-8-20050730.tar.gz
% WGET $CTAN/wadalab/maru-1-8-20050730.tar.gz
% WGET $CTAN/wadalab/mincho-0-12-20050730.tar.gz
% WGET $CTAN/wadalab/mincho-0-8-20050730.tar.gz
% WGET $CTAN/wadalab/mincho-1-8-20050730.tar.gz
[ 韓国語 ]
% WGET $CTAN/korean/HLaTeX/uhc-bom.tar.gz
% WGET $CTAN/korean/HLaTeX/uhc-dinaru.tar.gz
% WGET $CTAN/korean/HLaTeX/uhc-fonts.tar.gz
% WGET $CTAN/korean/HLaTeX/uhc-gothic.tar.gz
% WGET $CTAN/korean/HLaTeX/uhc-graphic.tar.gz
% WGET $CTAN/korean/HLaTeX/uhc-gungseo.tar.gz
% WGET $CTAN/korean/HLaTeX/uhc-jamo.tar.gz
% WGET $CTAN/korean/HLaTeX/uhc-myoungjo.tar.gz
% WGET $CTAN/korean/HLaTeX/uhc-pen.tar.gz
% WGET $CTAN/korean/HLaTeX/uhc-pilgi.tar.gz
% WGET $CTAN/korean/HLaTeX/uhc-pilgia.tar.gz
% WGET $CTAN/korean/HLaTeX/uhc-shinmun.tar.gz
% WGET $CTAN/korean/HLaTeX/uhc-taza.tar.gz
% WGET $CTAN/korean/HLaTeX/uhc-vada.tar.gz
% WGET $CTAN/korean/HLaTeX/uhc-yetgul.tar.gz
	

いったんワークディレクトリに展開したあと,TeX ツリーに格納する.アーカイブがたくさんあるので,Tcsh foreach 文でまとめて処理している.

% ls
bkai00mp-20050720.tar.gz        uhc-gothic.tar.gz
bsmi00lp-20050720.tar.gz        uhc-graphic.tar.gz
gbsn00lp-20050720.tar.gz        uhc-gungseo.tar.gz
gkai00mp-20050720.tar.gz        uhc-jamo.tar.gz
gothic-0-13-20050730.tar.gz     uhc-myoungjo.tar.gz
maru-0-8-20050730.tar.gz        uhc-pen.tar.gz
maru-1-8-20050730.tar.gz        uhc-pilgi.tar.gz
mincho-0-12-20050730.tar.gz     uhc-pilgia.tar.gz
mincho-0-8-20050730.tar.gz      uhc-shinmun.tar.gz
mincho-1-8-20050730.tar.gz      uhc-taza.tar.gz
uhc-bom.tar.gz                  uhc-vada.tar.gz
uhc-dinaru.tar.gz               uhc-yetgul.tar.gz
uhc-fonts.tar.gz
[ 韓国語フォントアーカイブの展開 ]
% mkdir -p uhc/texmf/{fonts,doc}
% foreach i (uhc-*.tar.gz)
foreach? tar zxvf $i -C ./uhc/texmf/fonts
foreach? end
% pushd .
% cd uhc/texmf/
% mkdir -p fonts/map/dvips/uhc
% mkdir -p doc/fonts/uhc
% mv fonts/uhc-fonts-1.0/*.map map/dvips/uhc/
% mv fonts/uhc-fonts-1.0/* doc/fonts/uhc/
% popd
[ 日本語・中国語フォントアーカイブの展開 ]
% foreach i ( ^uhc* )
foreach? tar zxvf $i
foreach? end
[ TeX ツリーに格納 ]
% su -m
# foreach i ( `find . -name texmf -type d` )
foreach? pushd .
foreach? cd $i
foreach? tar cf - . | ( cd $TEXDIR ; tar xvf - )
foreach? popd
foreach? end
#
	

次に和田研和文フォントの定義ファイル(CJK パッケージ添付のもの)を TeX ツリーに格納する.

# cd ~/cjk/cjk-4.6.0/contrib/wadalab
# mkdir -p $TEXDIR/tex/latex/CJK-4.6.0/wadalab
# cp -p *.fd* $TEXDIR/tex/latex/CJK-4.6.0/wadalab
# mkdir -p $TEXDIR/fonts/map/dvips/wadalab
# cp -p wadalab.map $TEXDIR/fonts/map/dvips/wadalab
# mktexlsr
	

最後にフォントマップを更新しておく.

# updmap --nohash --nomkmap --enable MixedMap uhc-base.map
# updmap --nohash --nomkmap --enable MixedMap uhc-extra.map
# updmap --nohash --nomkmap --enable MixedMap bkaiu.map
# updmap --nohash --nomkmap --enable MixedMap bsmiu.map
# updmap --nohash --nomkmap --enable MixedMap gbsnu.map
# updmap --nohash --nomkmap --enable MixedMap gkaiu.map
# updmap --nohash --nomkmap --enable MixedMap wadalab.map
# updmap
	

TrueType Unicode フォント

 

TrueType フォントの環境設定を行う.さざなみフォントの追加手順は他の和文フォントにも応用が効くと考える.まず Cyberbit, さざなみ TrueType フォントをダウンロード/展開する.

% cd ~/cjk
% mkdir truetype
% cd truetype
[ フォントのダウンロード,解凍 ]
% wget -nH -nd \
ftp://ftp.netscape.com/pub/communicator/extras/fonts/windows/\
Cyberbit.ZIP
% unzip Cyberbit.ZIP
% wget -nH -nd \
http://prdownloads.sourceforge.jp/efont/10087/\
sazanami-20040629.tar.bz2
% tar jxvf sazanami-20040629.tar.bz2
% su -m
[ TeX ツリーへの格納 ]
# mkdir -p $TEXDIR/fonts/truetype/bitstrea
# cp -p Cyberbit.ttf $TEXDIR/fonts/truetype/bitstrea/cyberbit.ttf
# mkdir -p $TEXDIR/fonts/truetype/sazanami
# cp -p sazanami-20040629/sazanami-*.ttf \
  $TEXDIR/fonts/truetype/sazanami
#
	

Ttf2pk の導入

 

TrueType フォントを PK フォントに変換するためのユーティリティ Ttf2pk が必要である.Ttf2pk ユーティリティは ttf2tfm と ttf2pk の二つのプログラムから構成されている.ttf2tfm は TrueType フォントから TFM フォントを生成する.ttf2pk はこの TFM 情報と TrueType フォントをもとに PK フォントを生成する.

Ttf2pk は FreeType-1 パッケージ contrib に含まれているものを使う.作業の流れとしては,FreeType-1 パッケージのダウンロード,FreeType-1 ライブラリのコンパイル,ttf2pk, ttf2tfm 実行バイナリの生成とインストール,Ttf2pk 環境設定(texmf.cnf, ttfonts.map), TrueType フォントのダウンロードと TeX ツリーへの格納,TrueType フォント用 TFM の生成を順次行う.UNIX 系 OS ユーザにとっては FreeType-1,Ttf2pk のコンパイル/環境設定が作業の山である.以下の手順のとおり,前提環境ではいくつか応用動作を試みなければならなかった.

Ttf2pk のコンパイルについては,configure オプションに kpathsea 関連のパスを指定しないと kpathsea ライブラリとうまくリンクできない.

FreeType-1 のビルドにおいて test/ftdump.c コンパイルがエラー終了する.test ディレクトリのモジュールは Ttf2pk 動作には影響しないが,本手順では,若干の手直しをしてエラーが出ないようにしている.

Mac OS X の場合は,留意事項がさらに三点ある.
- FreeType-1 の configure は Darwin のホストタイプを認識できずエラー終了する.Mac OS X の automake に付属する config.guess と config.sub をコピーして代用する.
- FreeType-1 の make(ライブラリのコンパイル)を行う.しかし,そのあとの make install は実行しなくてもよい.引続き Ttf2pk のビルドを実施する.
- make で ttf2pk, ttf2tfm のリンクに失敗する.-lm オプションを外してリンクを再実行する.

Windows では,角藤先生の Win32-​pTeX サイトの解説に従い,「フルインストール」のためのパッケージ群を含め pTeX システムをインストールすれば Ttf2pk ユーティリティが組込まれるはずである.以下 ttf2pk, ttf2tfm のビルド手順は不要であり Ttf2pk の環境設定に進めばよい(もしかするとこれすら不要かもしれない.Win32-​pTeX は調整の行き届いたディストリビューションである).

[ FreeType-1 パッケージをダウンロード ]
% cd ~/cjk
% wget -nH -nd \
http://heanet.dl.sourceforge.net/sourceforge/freetype/\
freetype-1.3.1.tar.gz
[ パッケージを展開 ]
% tar zxvf freetype-1.3.1.tar.gz
% cd freetype-1.3.1
[ Mac OS X の場合のみ以下の一行を実行する:ホストタイプエラー対策 ]
% cp /usr/share/automake-1.6/config.{guess,sub} .
[ FreeType-1 ライブラリのビルド ]
% ./configure
[ ftdump.c コンパイルエラー対策 ]
% cd test
% cp -p ftdump.c ftdump.c.orig
% sed 's/##//g' ftdump.c.orig > ftdump.c
% cd ..
% make
% su -m
[ FreeType-1 ライブラリのインストール(Mac OS X は不要)]
# make install
# exit
[ Ttf2pk ユーティリティのビルド ]
% cd contrib/ttf2pk
% ./configure \
 --prefix=/usr/local/teTeX \
 --with-kpathsea-dir=/usr/local/teTeX \
 --with-kpathsea-lib=/usr/local/teTeX/lib \
 --with-kpathsea-include=/usr/local/teTeX/include \
 --enable-static --disable-shared
[ Mac OS X では次の make でリンケージが失敗する
  ⇒ -lm オプションを削除して再実行する(後述)]
% make
% su -m
[ Ttf2pk ユーティリティのインストール ]
# make install
# mkdir -p $TEXDIR/ttf2pk
# mkdir -p $TEXDIR/fonts/map/ttf2pk
# cp -p data/*.{sfd,enc,rpl} $TEXDIR/ttf2pk
# mktexlsr
[ ftdump のインストール ]
# cp -p ../../test/ftdump /usr/local/bin
# exit
% rehash
	

Mac OS X Tiger では ttf2pk, ttf2tfm のリンケージが以下のメッセージを出力して失敗する.これはリンケージにおいて libm と libkpathsea との間でシンボルが重複しているためのようである.(行を適当に折返しているので注意)

gcc -g -O2 -Wall -pedantic -I./../../lib \
-I/usr/local/teTeX/include \
-I. -DHAVE_LIBKPATHSEA=1 -DHAVE_LIBM=1 -DHAVE_LIBINTL=1 \
-o ttf2pk errormsg.o filesrch.o ligkern.o \
newobj.o parse.o pklib.o \
subfont.o texenc.o ttf2pk.o ttfenc.o ttflib.o \
../../lib/.libs/libttf.a \
-lm -lintl -lintl -lm -lkpathsea \
-L/usr/local/teTeX/lib
/usr/bin/ld: multiple definitions of symbol _hash_create
/usr/lib/gcc/powerpc-apple-darwin8/4.0.0/../../../libm.dylib\
(strhash.So)
definition of _hash_create
/usr/local/lib/libkpathsea.a(hash.o) definition \
of _hash_create
in section (__TEXT,__text)
collect2: ld returned 1 exit status
make: *** [ttf2pk] Error 1
	

対策としては,シンボル重複を回避するため,以下のように gcc のリンクオプションから -lm を外して ttf2pk 及び ttf2tfm のリンクを再実行するとよい.

% make
[ ttf2pk リンクでエラー ⇒ -lm を外して再実行 ]
% gcc -g -O2 -Wall -pedantic -I./../../lib \
-I/usr/local/teTeX/include \
-I. -DHAVE_LIBKPATHSEA=1 -DHAVE_LIBM=1 -DHAVE_LIBINTL=1 \
-o ttf2pk errormsg.o filesrch.o ligkern.o \
newobj.o parse.o pklib.o \
subfont.o texenc.o ttf2pk.o ttfenc.o ttflib.o \
../../lib/.libs/libttf.a \
-lintl -lkpathsea -L/usr/local/teTeX/lib
% make
[ ttf2tfm リンクでエラー ⇒ -lm を外して再実行 ]
% gcc -g -O2 -Wall -pedantic -I./../../lib \
-I/usr/local/teTeX/include \
-I. -DHAVE_LIBKPATHSEA=1 -DHAVE_LIBM=1 -DHAVE_LIBINTL=1 \
-o ttf2tfm case.o errormsg.o filesrch.o ligkern.o \
newobj.o parse.o \
subfont.o texenc.o tfmaux.o ttf2tfm.o ttfaux.o \
ttfenc.o vplaux.o \
../../lib/.libs/libttf.a \
-lintl -lkpathsea -L/usr/local/teTeX/lib
% sudo make install
	

実行バイナリが生成できたら,次に Ttf2pk 動作環境の設定を行う.texmf.cnf に以下の記述を追加する.

% ttf2pk
TTF2PKINPUTS = .;$TEXMF/ttf2pk//
TTF2TFMINPUTS = .;$TEXMF/ttf2pk//
	

さざなみ用フォント定義の作成

 

さざなみフォントを CJK で利用するためにフォント定義を追加する.c70xxxx.fd というファイル名とする.xxxx の部分はファミリー名であって,システムで一意になるよう独自に命名する.明朝用,ゴシック用それぞれ,szmi, szgo としておく.この名称はその他の定義でも首尾一貫させる必要があるので注意する.c70 の部分は変えてはならない.2ファイルを以下のように作成し,$TEXDIR/tex/latex/CJK-4.6.0/UTF8 下に格納する.

さざなみ明朝用:c70szmi.fd

% This is the file c70szmi.fd of the CJK package
%   for using Asian logographs
%   (Chinese/Japanese/Korean) with LaTeX2e
% created by Isao Yasuda <isao@yasuda.homeip.net>
% Version 4.6.0 (11-Aug-2005)

\def\fileversion{4.6.0}
\def\filedate{2005/12/15}
\ProvidesFile{c70szmi.fd}[\filedate\space\fileversion]

% character set: Unicode U+0080 - U+FFFD
% font encoding: Unicode

\DeclareFontFamily{C70}{szmi}{\hyphenchar \font\m@ne}

\DeclareFontShape{C70}{szmi}{m}{n}{<-> CJK * szmi}{}
\DeclareFontShape{C70}{szmi}{bx}{n}{<-> CJKb * szmi}{\CJKbold}
%\DeclareFontShape{C70}{szmi}{bx}{n}{<-> CJKb * szmib}{}%(*1)
%\DeclareFontShape{C70}{szmi}{m}{n}{<-> CJK *[0.961] szmi}{}%(*2)

\endinput
	

さざなみゴシック用:c70szgo.fd

% This is the file c70szgo.fd of the CJK package
%   for using Asian logographs 
%   (Chinese/Japanese/Korean) with LaTeX2e
% created by Isao Yasuda <isao@yasuda.homeip.net>
% Version 4.6.0 (11-Aug-2005)

\def\fileversion{4.6.0}
\def\filedate{2005/12/15}
\ProvidesFile{c70szgo.fd}[\filedate\space\fileversion]

% character set: Unicode U+0080 - U+FFFD
% font encoding: Unicode

\DeclareFontFamily{C70}{szgo}{\hyphenchar \font\m@ne}

\DeclareFontShape{C70}{szgo}{m}{n}{<-> CJK * szgo}{}
\DeclareFontShape{C70}{szgo}{bx}{n}{<-> CJKb * szgo}{\CJKbold}
%\DeclareFontShape{C70}{szgo}{bx}{n}{<-> CJKb * szgob}{}%(*1)
%\DeclareFontShape{C70}{szgo}{m}{n}{<-> CJK *[0.961] szgo}{}%(*2)

\endinput
	

このように和文用フォントファミリーを追加しておくと,ロシア語,タイ語などは Cyberbit フォントで,和文はさざなみフォントで,という使分けができる.さらに Dvipdfmx PDF のレベルでは,cid-x.map の定義によって szmi, szgo をヒラギノ otf や Ryumin-Light, GothicBBB-Medium に差替えることも可能である.

\CJKbold は \textbf でボールド体を組むときに実行される CJK の命令で,文字を少しずらして重ね打ちする.これではプレビュー/印刷で少々醜いと感じる場合,(*1) に示すように,別のボールド書体用 TFM を指定し,別フォントを dvipdfmx に拾わせることも可能である.

また和文フォントは同一サイズの横文字と比べて大きく感じられるので,少し小さめにしたい場合,(*2) のように縮小指定しておくとよい.

TrueType フォント設定

 

kpsewhich コマンドで ttfonts.map の所在を確認する.kpsewhich のパス応答がなければ,Ttf2pk 付属の ttfonts.map を $TEXDIR/​fonts/​map/​ttf2pk/​ttfonts.map にコピーする.

[ ttfonts.map の確認 ]
# kpsewhich --progname=ttf2pk --format=map ttfonts.map
[ ttfonts.map のパスが返されないのでコピー ]
# cp -p ~/cjk/freetype-1.3.1/contrib/ttf2pk/data/ttfonts.map \
  $TEXDIR/fonts/map/ttf2pk
# mktexlsr
[ ttfonts.map の再確認 ]
# kpsewhich --progname=ttf2pk --format=map ttfonts.map
/usr/local/teTeX/share/texmf-local/fonts/map/ttf2pk/ttfonts.map
	

ttfonts.map に以下の行を追加する.Cyberbit 用はすでに定義されているかもしれない.

% cyberbit.ttf entry
cyberb@Unicode@  cyberbit.ttf
% sazanami entry
szmi@Unicode@    sazanami-mincho.ttf
szmib@Unicode@   sazanami-mincho.ttf
szgo@Unicode@    sazanami-gothic.ttf
szgob@Unicode@   sazanami-gothic.ttf
	

szmib, szgob はボールド書体に別フォントを指定したいときに設定する.さざなみフォントの記述には @Unicode@ を指定している.これはさざなみフォントが Unicode の文字コードマップをもっていることを示す.TrueType フォントの文字コードマップは FreeType-1 に含まれる ftdump コマンド(TrueType フォントダンプツール)で調べることができる.

% ftdump sazanami-mincho.ttf | less
...
character map encodings
----------------------------------...

There are 3 encodings:

encoding  0: Apple Unicode (v.2.0)
encoding  1: Apple Roman
encoding  2: Windows Unicode
...
	

Dvipdfmx での使用のために,cid-x.map に以下の行を追加しておく.Cyberbit 用とさざなみ用は4パターンずつ定義例をあげている:​(1)​PDF に TrueType フォントを埋込む.ボールド書体用にヒラギノ W6 を指定している;​(2)​ヒラギノ Pro OpenType フォントに插替えて埋込む.ボールド書体用にウェイトのかかった W6 フォントを指定している;​(3)​フォントを埋込まず Ryumin​-​Light フォントを指示する;​(4)​TrueType フォントを PK フォントに変換して埋込む.いずれもパターン​(1)​を有効にし,それ以外をコメントとした例であるが,好みのものを選べばよい.​CJK wadalab​(和田研フォント)用の定義も​(2)​及び​(3)​を示している.

%%% for CJK C70 song
%%% 1. Bitstream Cyberbit fonts
%%% (1) Cyberbit truetype fonts embedding
cyberb@Unicode@ unicode cyberbit.ttf

%%% (2) Hiragino opentype fonts embedding
%% cyberb@Unicode@ UniJIS-UCS2-H Hiragino-Mincho-Pro-W3.otf

%%% (3) No embedding. Display fonts of Adobe Reader 
%% cyberb@Unicode@ UniJIS-UCS2-H Ryumin-Light

%%% (4) PK convert and embed
%% cyberb unicode cyberbit.ttf

%%% 2. Sazanami truetype fonts 
%%% (1) Mincho and Gothic fonts embedding
%%%  Normal
szmi@Unicode@ unicode sazanami-mincho.ttf
szgo@Unicode@ unicode sazanami-gothic.ttf
%%%  Bold
szmib@Unicode@ UniJIS-UCS2-H Hiragino-Mincho-Pro-W6.otf
szgob@Unicode@ UniJIS-UCS2-H Hiragino-KakuGothic-Pro-W6.otf

%%% (2) Hiragino opentype fonts embedding
%%%  Normal
%% szmi@Unicode@ UniJIS-UCS2-H Hiragino-Mincho-Pro-W3.otf
%% szgo@Unicode@ UniJIS-UCS2-H Hiragino-KakuGothic-Pro-W3.otf
%%%  Bold
%% szmib@Unicode@ UniJIS-UCS2-H Hiragino-Mincho-Pro-W6.otf
%% szgob@Unicode@ UniJIS-UCS2-H Hiragino-KakuGothic-Pro-W6.otf

%%% (3) No embedding. Display fonts of Adobe Reader 
%% szmi@Unicode@ UniJIS-UCS2-H Ryumin-Light
%% szgo@Unicode@ UniJIS-UCS2-H GothicBBB-Medium

%%% (4) PK convert and embed
%% szmi unicode sazanami-mincho.ttf
%% szgo unicode sazanami-gothic.ttf

%%% 3. wadalab
%%% (2) Hiragino embedding
umcj@Unicode@ UniJIS-UCS2-H Hiragino-Mincho-Pro-W3.otf
udmj@Unicode@ UniJIS-UCS2-H Hiragino-Mincho-Pro-W3.otf
umrj@Unicode@ UniJIS-UCS2-H Hiragino-MaruGothic-Pro-W4.otf
udgj@Unicode@ UniJIS-UCS2-H Hiragino-KakuGothic-Pro-W3.otf

%%% (3) No embed, adobe fonts
%% udcj@Unicode@ UniJIS-UCS2-H Ryumin-Light
%% udmj@Unicode@ UniJIS-UCS2-H Ryumin-Light
%% umrj@Unicode@ UniJIS-UCS2-H GothicBBB-Medium
%% udgj@Unicode@ UniJIS-UCS2-H GothicBBB-Medium
	

(2)​ヒラギノ Pro OpenType フォントに插替えて埋込むパターンは,ヒラギノのフォントファイル名は各自の環境に合わせる必要がある.​(3)​フォントを埋込まず Ryumin​-​Light フォント名を指示するパターンを採用すると,作成した PDF は,Adobe Reader が Ryumin​-​Light に対して指示するフォントで閲覧/印刷できる.いずれも Cyberbit 和文書体を変更したいときに応用できる一方,日本語以外の言語には利用できないことに留意すべきである.上記さざなみフォントのように和文用にファミリーを追加して,使い分けることをお勧めする.

また上記例では wadalab フォントの代わりにヒラギノ明朝/角ゴシック/丸ゴシックを埋込む設定になっている.通常ならば wadalab のファミリーを指定すると Type1 フォントが使われる.

次に Ttf2tfm を実行して TFM フォントを生成する.PK フォント(Dvipdfmx では PK に変換するパターンのとき)は DVIWARE(dvips, dvipdfmx など)が要求する時点で自動的に生成される.

# mkdir -p $TEXDIR/fonts/tfm/bitstrea/cyberbit
# cd $TEXDIR/fonts/tfm/bitstrea/cyberbit
# ttf2tfm cyberbit.ttf -q cyberb@Unicode@
# mkdir -p $TEXDIR/fonts/tfm/sazanami
# cd $TEXDIR/fonts/tfm/sazanami
# ttf2tfm sazanami-mincho.ttf -q szmi@Unicode@
# ttf2tfm sazanami-gothic.ttf -q szgo@Unicode@
# ttf2tfm sazanami-mincho.ttf -q szmib@Unicode@
# ttf2tfm sazanami-gothic.ttf -q szgob@Unicode@
# mktexlsr
	

最後にフォントマップを更新する.

# updmap
	

CJK の利用

 

CJK パッケージを使う文書のプリアンブル例を以下に示す.Babel パッケージと併用するときは inputenc パッケージをエンコーディング未定義で指定する.CJK パッケージにはタイ語の Babel 言語定義(ldf ファイル)が含まれており,Babel の言語オプションに thaicjk が指定できる.また VnTeX パッケージ vietnam スタイルを指定することにより,ヴェトナム語の組版が可能になる.ロシア語の fontenc は,pLaTeX では原則アスキー・トランスクリプションによる OT2 を用いるが,一方 CJK 環境では,キリル文字を直接記述できるので T2A エンコーディングを指定する.CJK パッケージには日本語のルビを組版するマクロ ruby が実装されており,例のように読込んでおく.

\usepackage{CJK}                     % CJK パッケージ
\usepackage{inputenc}                % Babel 指定時必要
\usepackage[T2A, T1]{fontenc}        % キリル・エンコーディング T2A 
\usepackage[german,russian,french,
            polutonikogreek,thaicjk, % thaicjk タイ語
            USenglish]{babel}       
\usepackage[utf8]{vietnam}           % VnTeX
\usepackage[overlap, CJK]{ruby}      % 日本語ルビ
\renewcommand{\rubysep}{-0.1ex}      % ルビ位置調整
\renewcommand{\encodingdefault}{T1}  % T5 併用時 T1 文字化け対策
	

多くの言語をひとつのファイルにまとめて記述したいなら,LaTeX 文書は UTF-8 エンコーディングで準備する.CJK パッケージは固有の UTF-8 処理機能を実装しており,CJK 環境(\begin{CJK}​〜​\end{CJK})内に UTF-8 文字を入力することができる.サポート対象は CJK 言語(日本語,中国語,韓国語)に留まらない.その他 UTF-8 入力を受付ける言語は,T1・T2 系フォントエンコーディングで記述できるラテン系言語・キリル言語,タイ語,ヴェトナム語,現代ギリシア語である.

古典ギリシア語,ヘブライ語,デヴァーナーガリーなど,上記以外の言語・スクリプトを UTF-8 で直接記述するためには,このあとで述べる Unicode パッケージが必要である.

CJK 環境の引数を {UTF8}{song} と指定することにより,記述文字のエンコーディングとして UTF-8 を,フォントファミリーとして song を指示することになる.song は標準では Cyberbit フォントで組版する.韓国語については,UTF8 パラメータは,song ファミリーとともにしか設定できず,よって UTF-8 記述言語の組版は常に Cyberbit フォントを拾う.Cyberbit の和文字デザインは,MS明朝やヒラギノなどの高品質な和製フォントと比べると,日本のユーザには少しもの足りないかもしれない.​cid-x​.​map 定義により,和文フォントを PDF 作成で差替えてもよい.ラテン文字も,アクセント付き文字とその他とのバランスが,EC フォントなどとの比較においていま一歩の印象がある.Unicode CJK 統合漢字は日本語の漢字が出力される.

中国語

UTF-8 中国語入力では Cyberbit フォント以外に Arphic フォントが利用できる.\begin​{CJK}​{UTF8}​{gbsn} のように指定する.ファミリーは以下のとおりである.漢字,句読点は簡体字,繁体字を出力し分けることができる.

簡体字 ノーマル gbsn ファミリー
  楷書体 gkai ファミリー
繁体字 ノーマル bsmi ファミリー
  楷書体 bkai ファミリー

日本語

UTF-8 日本語入力については,標準では Cyberbit, wadalab​フォントが使える.上記さざなみフォントの調整を済ませていれば,\begin​{CJK}​{UTF8}​{szmi} のように指定することで,これを利用できる.和文と他の言語の書体を分けたいときに使える.wadalab,さざなみのフォントファミリーは次のとおり.さざなみフォントは,Cyberbit と同じ局面で指定することが可能であるが,多言語フォントではないことに注意すべきである.

wadalab 明朝 min ファミリー
wadalab ゴシック goth ファミリー
wadalab 丸ゴシック maru ファミリー
さざなみ明朝 szmi ファミリー
さざなみゴシック szgo ファミリー

韓国語

韓国語については,韓国語 EUC で原稿を記述すると,以下のような書体ファミリーが使える.代表的なものを挙げているが,たいへん豊富である.CJK パッケージの KS ディレクトリ以下の fd ファイルをみるとどのようなファミリーがあるか想像がつく.書体は \begin​{CJK}​{KS}​{mj} のように指定する.もしくは \begin​{CJK}​{KS}​{} のように指定し,CJK 環境内で \mj などの書体コントロールシーケンスで書体を切替えることができる.\begin​{CJK}​[HL]​{KS}​{} のようにすれば HLaTeX Type1 フォントが利用できる.多言語文書でこれら書体を利用したい場合は,韓国語のみ別に EUC-​KOREA で用意したファイルを \input するのがよいと思う.

MyoungJo [hjb] \mj mj ファミリー (明朝体)
Jamo MyoungJo [h] \jmj jmj ファミリー (明朝体)
Gothic [jb] \gt gt ファミリー (ゴシック体)
Jamo Gothic [h] \jgt jgt ファミリー (ゴシック体)
Jamo Novel [h] \jnv jnv ファミリー (ゴシック体)
Gungseo [hj] \gs gs ファミリー (楷書体)
Graphic [hb] \gr gr ファミリー (丸ゴシック体)
Jamo Sora [h] \jsr jsr ファミリー (丸ゴシック体)
Dinaru [hb] \dr dr ファミリー (明朝体)

[ ] 内は,b: ボールド指定が擬似的 (重打) でない真性書体で出力可能; h: Hangul; j: Hanja.( ) 内は筆者の印象での日本語書体対応イメージ.

EUC-JAPAN,Big5,GB2312,EUC-KOREA など CJK 各言語それぞれの文字コードで記述した TeX 原稿を個別ファイルで準備し,\input 命令でこれらを読込んで多言語混在文書を作成することができる.

新たに定義した szmi,szgo などのファミリーを \section 命令内に使ったりすると,新ファミリー指定の最初の CJK 環境の文字が化けることがある.文書の先頭に​\begin​{CJK}​{UTF8}​{song}​\end​{CJK} をダミーでいれておくと回避できるようである.その条件,理由は私にはわからない.

\begin{document}
\begin{CJK}{UTF8}{song}\end{CJK}% ダミー;ないと日本語1が文字化け
\section{%
\protect\begin{CJK}{UTF8}{szmi}日本語1%
\protect\end{CJK}}
...
\section{%
\protect\begin{CJK}{UTF8}{szmi}日本語2%
\protect\end{CJK}}
...
	

ヴェトナム語に関して注意事項がある.もし古い VnTeX(v1.3 等)の T5 パッケージを指定すると,T1 で組まれるべき英語やフランス語,ドイツ語においても T5 でフォントを拾ってしまい,ß などのラテン文字が化けてしまう.VnTeX-3 ならば問題ない.T1 エンコーディングのフォントをデフォルトで使うことをプリアンブルで明示すると,この問題を回避できる.

\renewcommand{\encodingdefault}{T1}
	

ロシア語はハイフネーション処理がうまく機能しない.CJK 環境は文字間に特別な情報(グルー等)を付加する場合があり,これはその影響かと思われる.サンプルでは \sloppy を指定することによって,分綴が起こりにくくなるようにしている.UTF-8 によるキリル言語は,Unicode パッケージを用いて,CJK 環境外で記述することを推奨する.

古典ギリシア語(polutonikogreek)の記述では,その直前で ~(チルダ)の分類コードを 12 に再セットしないと曲アクセントがドロップしてしまう(パッケージのいずれかが分類コードを変更してしまっているためと思われるが,詳細はわからない).

{\selectlanguage{polutonikogreek}%
\catcode`\~=12% 曲アクセント脱落対策
>'Andra moi >'ennepe, Mo~usa, ...
...
}
	

タイ語は,単語境界に挿入した \wbr 部(参照: タイ語単語分割)以外で不正に改行されてしまう場合がある.これは CJK 環境では文字ごとに \CJKglue が挿入される仕様になっているためと考えられる.要するに pTeX 漢字の扱いと同様,グルー(伸縮する空白)が文字間に設定され,行ブレークが許容されるようだ.\CJKglue を一時的に無効化して対策とする.サンプルではその例を示している.

タイ語書体の選択肢を広げたいのなら,Unicode 及び ThaiLaTeX パッケージを併用することをお勧めする.つまり,CJK 環境外で CJK パッケージ添付のタイ語言語定義 thaicjk を選択し,ThaiLaTeX のフォントを指示する(後述).

CJK パッケージに含まれるサンプルを利用して作成した CJK パッケージ利用文書例(cjktest.tex)を以下に示す.韓国語の一部は韓国語 EUC の別原稿(korean.tex)を \input している.

% cjktest.tex
% -*- coding: utf-8 -*-
% CJK サンプル
% $Id: cjktest.tex,v 1.1 2005/12/16 11:50:54 isao Exp isao $
% Coded by isao yasuda, 2005
\documentclass[a4paper]{article}
\usepackage{CJK}                    % CJK
\usepackage{inputenc}               % Babel 指定時必要
\usepackage[T2A,T1]{fontenc}        % キリルエンコーディング T2A
\usepackage[russian,german,french,  %
            polutonikogreek,thaicjk,% thaicjk タイ語
            USenglish]{babel}
\usepackage[utf8]{vietnam}          % VnTeX
\usepackage[overlap, CJK]{ruby}     % 日本語ルビ
\renewcommand{\rubysep}{-0.1ex}     % ルビ位置調整
\renewcommand{\encodingdefault}{T1} % ラテン文字対策(VnTeX 1.3)
\renewcommand{\familydefault}{cmr}  % ラテン文字対策(VnTeX 1.3)
\newcommand{\usejp}[2][szmi]%
{\begin{CJK}{UTF8}{#1}#2\end{CJK}\relax}%
\addtolength{\textwidth}{30pt}
\addtolength{\textheight}{40pt}
\begin{document}
\sloppy% ロシア語ハイフネーションうまく機能しない.
\parindent 0pt

\begin{center}
 \Large\bfseries\LaTeX{} Multilingual Document Sample\par
 CJK, Vn\TeX{}
\end{center}

\hfill isao yasuda\qquad\qquad%

\begin{CJK}{UTF8}{song}
\section{\usejp[szgo]{英語}}
{\selectlanguage{USenglish}%
\noindent\fontencoding{T1}\fontfamily{cmr}\selectfont%
This FAQ list was made to summarize some frequently asked 
questions and their answers in a convenient form.  
The structure of this FAQ list has drastically changed 
since the last version.
\textbf{For details of the new structure, see the entry 
of `How to read this FAQ and its structure'.}
}

\section{\usejp[szgo]{フランス語}}
{\selectlanguage{french}%
\noindent\fontencoding{T1}\fontfamily{cmr}\selectfont%
Souvent, la main portée au front, debout sur les vaisseaux,
tandis que la lune se balançait entre les mâts d'une
façon irrégulière, je me suis surpris, faisant
abstraction de tout ce qui n'était pas le but que je
poursuivais, m'efforçant de résoudre ce difficile
problème!
}

\section{\usejp[szgo]{ドイツ語}}
{\selectlanguage{german}%
\noindent\fontencoding{T1}\fontfamily{cmr}\selectfont%
  Dieses FAQ wurde erstellt, um häufig gestellte Fragen 
  und ihre Antworten in einer gefälligen Form 
  zusammenzufassen.  
  Die Struktur dieses FAQ wurde drastisch geändert seit 
  der letzten Version.  
  \textbf{Für Details siehe den Abschnitt ``Wie lese ich
  dieses FAQ''.}
}

\section{\usejp[szgo]{ロシア語}}
{\selectlanguage{russian}%
  Этот список был составлен для суммирования некоторых 
  часто задаваемых вопросов (FAQ), вместе с ответами 
  на них, в удобной форме.  
  Структура этого FAQ кардинально изменилась по сравнению 
  с послед\-ней версией.
  \textbf{В разделе `Как читать этот FAQ и его структура' 
  объяснены детали этой новой структуры.}
}

\section{\usejp[szgo]{ヴェトナム語}}
{%
Phần ``Những câu hỏi và giải đáp thường gặp'' (viết tắt từ 
tiếng Anh là FAQ) được nêu ra ở đây nhằm mục đích thu thập 
những câu hỏi thường gặp trong thực tế và những lời giải 
đáp thích hợp nhất của nó.
Từ lần ấn bản cuối cùng đến nay, đã có những sự thay đổi khá
  lớn trong cấu trúc của FAQ.  
\textbf{Để hiểu rõ hơn bạn nên xem lại
  chương ``Làm sao tôi có thể đọc đuợc FAQ''.}
}

\section{\usejp[szgo]{ギリシア語}}
{\selectlanguage{greek}%
  Η λίστα αυτή ΣΤΕ (συχνά τιθεμένων ερωτήσεων) έχει σαν 
  σκοπό να συμπεριλάβει σε εύχρηστη μορφή κάποιες σημαντικές 
  ερωτήσεις και τις απαντήσεις τους.  Η οργάνωση αυτής 
  της λίστας άλλαξε σημαντικά από την τελευταία έκδοσή 
  της και μετά.  
  \textbf{Για λεπτομέρειες πάνω στη νέα οργάνωση, 
  βλέπε το λήμμα <<Πώς να διαβάσετε αυτή την ΣΤΕ και 
  πώς είναι οργανωμένη>>.}
}

\section{\usejp[szgo]{古典ギリシア語}}
{\selectlanguage{polutonikogreek}%
\catcode`\~=12% 必須
>'Andra moi >'ennepe, Mo~usa, pol'utropon, <`os m'ala poll`a \\
pl'agqjh, >epe`i Tro'ihs <ier'on ptol'iejron >'eperse. \\
poll~wn d''>anjr'wpwn >'iden >'astea ka'i n'oon >'egnw, \\
poll`a d''<'o g''>en p'ontw| p'ajen >'algea <'on kat`a jum'on, \\
>arn'umenos <'hn te yuq'hn ka`i n'oston <eta'irwn. \\
>all'' o>ud''<~ws <et'arous >err'usato, <i'emen'os per;
}

\section{\usejp[szgo]{タイ語}}
{\selectlanguage{thaicjk}%
% タイ語も Cyberbit で組まれてしまう.
% 単語分割もうまくいかない.\CJKglue を無効化しておくとよい.
% Unicode,Thailatex パッケージを併用し,CJK 環境外,thaicjk で組めば,
% フォント選択も単語分割もうまくいく.
\def\CJKglue{\relax}% 無効化
\def\wbr{\hskip0pt plus0.6pt minus0.6pt\relax}% 単語分割点の定義

เป็น{\wbr}มนุษย์{\wbr}สุด{\wbr}ประเสริฐ{\wbr}เลิศ{\wbr}%
คุณค่า{\wbr}กว่า{\wbr}บรรดา{\wbr}ฝูง{\wbr}สัตว์{\wbr}%
เดรัจฉาน{\wbr}จง{\wbr}ฝ่าฟัน{\wbr}พัฒนา{\wbr}วิชาการ{\wbr}%
อย่า{\wbr}ล้าง{\wbr}ผลาญ{\wbr}ฤๅ{\wbr}เข่นฆ่า{\wbr}บีฑา{\wbr}%
ใคร{\wbr}ไม่{\wbr}ถือโทษ{\wbr}โกรธ{\wbr}แช่ง{\wbr}ซัด{\wbr}%
ฮึดฮัด{\wbr}ด่า{\wbr}หัด{\wbr}อภัย{\wbr}เหมือน{\wbr}%
กีฬา{\wbr}อัชฌาสัย{\wbr}ปฏิบัติ{\wbr}ประพฤติ{\wbr}กฎ{\wbr}%
กำหนดใจ{\wbr}พูดจา{\wbr}ให้{\wbr}จ๊ะๆ จ๋าๆ น่าฟัง{\wbr}เอยฯ 
}%
\end{CJK}

\section{\usejp[szgo]{日本語}}
\def\jptext{%
この~FAQ~リストは、よくある質問とその答を集め、役に立つ%
ようにしたものです。この~FAQ~リストの構造は、以前のものと%
比べて大幅に変更されています。%
\textbf{\ruby{新}{あたら}しい構造に関しては、%
「この~FAQ~の読み方とその構造」の項目を%
\ruby{参}{さん}\ruby{照}{しょう}して下さい。}
}
\begin{CJK}{UTF8}{szmi}
\CJKtilde%
\textbf{\usejp{(1) さざなみ明朝 szmi:}}

\vspace{0.3em}
\jptext
\end{CJK}

\vspace{1em}
\begin{CJK}{UTF8}{szgo}
\CJKtilde%
\textbf{\usejp{(2) さざなみゴシック szgo:}}

\vspace{0.3em}
\jptext
\end{CJK}

\section{\usejp[szgo]{中国語}}
\def\cktext{%
本常问问答集~(FAQ list)~是从一些经常被问到的问题及其适当的%
解答中,以方便的形式摘要而出的。跟上一版不同的是,%
其编排结构已彻底改变。%
\textbf{有关新结构的细节,可参考%
「如何阅读本问答集及了解其编排结构」该项中的说明。}
}%
\def\chtext{%
本常問問答集~(FAQ list)~是從一些經常被問到的問題及其適當的%
解答中,以方便的形式摘要而出的。跟上一版不同的是,%
其編排結構已徹底改變。%
\textbf{有關新結構的細節,可參考%
「如何閱讀本問答集及了解其編排結構」該項中的說明。}
}%

\begin{CJK}{UTF8}{gbsn}
\CJKtilde%
\textbf{\usejp{(1) 簡体字 gbsn:}}

\cktext
\end{CJK}

\vspace{1em}
\begin{CJK}{UTF8}{gkai}
\CJKtilde%
\textbf{\usejp{(2) 簡体字 gkai:}}

\cktext
\end{CJK}

\vspace{1em}
\begin{CJK}{UTF8}{bsmi}
\CJKtilde%
\textbf{\usejp{(3) 繁体字 bsmi:}}

\chtext
\end{CJK}

\vspace{1em}
\begin{CJK}{UTF8}{bkai}
\CJKtilde%
\textbf{\usejp{(4) 繁体字 bkai:}}

\chtext
\end{CJK}

\section{\usejp[szgo]{韓国語}}
% 韓国語は別ファイル(EUC-KOREA)でインプットする.
\input korean

\vspace{1em}
\begin{CJK}{UTF8}{song}
\textbf{(6) song family (Cyberbit):}

이 FAQ 은 자주 반복되는 질문과 그에 대한 대답을 간단명료한 
양식으로모아 엮어졌습니다. 이 FAQ 의 구조는 지난 판에 
비하여 획기적으로변경되었습니다. 
\textbf{상세한 것은 ``이 FAQ 을 어떻게 읽을것인가'' 라는
 대목을 참조하시기 바랍니다.}
\end{CJK}

\end{document}
	
% korean.tex
% -*- coding: euc-korea -*-
% $Id: korean.tex,v 1.1 2005/12/16 11:50:10 isao Exp isao $
% Coded by isao yasuda, 2005
{%
\def\ktext{%
이 FAQ 은 자주 반복되는 질문과 그에 대한 대답을 간단명료한 
양식으로모아 엮어졌습니다. 이 FAQ 의 구조는 지난 판에 
비하여 획기적으로변경되었습니다. 
\textbf{상세한 것은 ``이 FAQ 을 어떻게 읽을것인가'' 라는
 대목을 참조하시기 바랍니다.}
}%

\begin{CJK}{KS}{mj}
\textbf{(1) mj family:}

\ktext
\end{CJK}

\vspace{1em}
\begin{CJK}{KS}{gt}
\textbf{(2) gt family:}

\ktext
\end{CJK}

\vspace{1em}
\begin{CJK}{KS}{gs}
\textbf{(3) gs family:}

\ktext
\end{CJK}

\vspace{1em}
\begin{CJK}{KS}{gr}
\textbf{(4) gr family:}

\ktext
\end{CJK}

\vspace{1em}
\begin{CJK}{KS}{dr}
\textbf{(5) dr family:}

\ktext
\end{CJK}
}%
	

サンプル原稿 cjktest.tex を UTF-8 で,korean.tex を EUC-​KOREA で,それぞれ格納し,latex コマンドで処理する(platex は不可).処理結果 cjktest.pdf を掲載しておく.TrueType フォントを PK に変換して埋込む設定をしている場合,はじめて実施する Cyberbit/さざなみ PK フォントの生成はかなりの時間を要する.

% latex cjktest.tex
% dvipdfmx cjktest.dvi
	

cjk-enc の利用

 

CJK パッケージには Emacs を前提として同一 TeX ファイルに多言語を混在して記述するための Lisp ファイル cjk-enc.el が添付されている.これは CJK パッケージ独自のプリプロセッサであり,emacs-mule という Emacs 独自の多言語エンコーディングで記述した TeX 原稿を,TeX 処理可能な文字形式に変換するとともに,CJK の命令を付加して,別ファイル .cjk に出力する.

この方法だと,CJK 言語を CJK 環境で囲む必要がない.和文は和田研フォントで組まれる.韓国語は Type1 に対応するフォントファミリーが選択される.ロシア語については,\begin​{CJK}​{UTF8}​{song}​〜​\end​{CJK} 内に書く場合と異なり,LH フォントが指示され,ハイフネーションもきちんと処理される.

導入は Lisp ファイル群を Emacs のロードパスに格納すればよい.

% cd ~/cjk/cjk-4.6.0/utils/lisp
% su -m
# mkdir -p /usr/local/share/emacs/site-lisp/cjk
# cp -p cjkspace.el cjktilde.el \
        emacs/cjk-enc.el emacs/thai-word.el \
  /usr/local/share/emacs/site-lisp/cjk
	

.emacs 初期設定ファイルに次の一行を書加えて,Emacs 起動時に cjk-enc.el が読込まれるようにしておく.

(load-library "cjk-enc")
	

CJK 添付のサンプル examples/CJKbabel.tex は emacs-mule エンコーディングで書かれている.たとえばこれを Emacs バッファに読込み M-x cjk-write-file RET を実行すると,cjk-enc.el は文字変換,コントロールシーケンス挿入を行い,処理結果を拡張子 cjk のファイル(CJKbabel.cjk)に書出してくれる.この生成物を latex で処理すればよい.

また Emacs 編集中,対話的にタイ語単語境界にマークを付ける機能がある.thai-​word.​el がこれを実現している.M-x thai-​auto-​composition-​mode RET によってタイ語マイナーモードにしたのちに,M-x thai-​break-​words RET を投入し,Separator: 問合わせに対して一文字を応答すると,その文字を,バッファにあるテキストの単語境界に自動的に挿入する.

CJKbabel.tex に対して,thai-word.el, cjk-enc.el を通した処理結果サンプル cjkenc​.​pdf を掲載しておく.

Unicode パッケージの導入

 

Unicode パッケージの導入によって,Unicode(UTF-8)で記述可能な言語数を拡張できる.対応言語は添付のドキュメント languages.ps に掲載されている(pdf に変換したもの).Babel 同様,錚々たる一覧である.日本語,中国語,韓国語を混在させるには,上記 CJK パッケージを併用する.

Unicode Greek Extended U+1F00​-​U+1FFF には,アクセント,気息記号,下書のイオタが付加された古典ギリシア語の文字が定義されている.Unicode パッケージを利用すると,この恩恵にあずかり,Babel の枠組のなかで古典ギリシア語がそのままの姿で記述できる.(図1)

Unicode package
図1.Unicode による編集

Unicode パッケージには,T2D エンコーディング定義ファイルが添付されている.T2D は,LaTeX 標準である T2A, T2B, T2C を補完するキリル・フォントエンコーディングであり,教会スラヴ語等の字母を定義している.こうして,Unicode キリル文字 Unicode Cyrillic U+0400​-​U+04FF を使用し,ロシア語,ウクライナ語など代表的な現代スラヴ語はもちろん,教会スラヴ語や辺境キリル言語(ユカギール語など)も記述可能となる.教会スラヴ語を pTeX でも利用する場合「スラヴ研究者向け LaTeX 多言語環境の構築と利用 ― pTeX p3.1.2: Babel,キリル組版環境」を参照し,t2denc.patch を適用しておくことをお勧めする.

Unicode パッケージの導入は,CTAN から Unicode パッケージをダウンロードして TeX ツリーに格納すればよい.手順では,Unicode 文字定義の最新版を取寄せ,付属の Perl スクリプトを利用してパッケージの文字定義ファイルを作成している.とはいえ,アーカイブには提供者によって生成された文字定義ファイルが添付されており,この作業は任意である.

[ Unicode パッケージのダウンロード ]
% cd ~/cjk
% wget -r -nH --cut-dirs=4 \
  ftp://ftp.dante.de/tex-archive/macros/latex/contrib/unicode/
% cd unicode
[ Unicode 文字テーブルのダウンロード(任意)]
% wget -nH -nd \
  http://www.unicode.org/Public/UNIDATA/UnicodeData.txt
[ Unicode 文字定義のアップデート(任意)]
% perl makeunidef.pl -t data --nocomments \
  config/*.ucf config/*.ucf.gz
[ Unicode パッケージの TeX ツリーへの格納 ]
% su -m
# cd ..
# cp -R unicode $TEXDIR/tex/latex/
# mktexlsr
	

PSCyr パッケージの導入

 

PSCyr はロシア語 Type1 フォントパッケージである.T2A フォントエンコーディングを用いる.CJK 及び Unicode パッケージを併用すると,LaTeX2e によって,日本語を含む多言語混在のロシア語多書体文書が組版できる.pLaTeX2e においても,コントロールシーケンスでキリル文字を記述すれば,T2A フォントエンコーディングが使えないことはないけれども,記述が煩瑣に過ぎる.Babel キリル言語標準では,EC との相性のよい,たいへん質の高い LH フォントを用いる.PSCyr パッケージによって Академическая や Антиква などロシアの書籍でお馴染みの書体が実現でき,さらに嬉しい限りである.

PSCyr パッケージ(2005.8 時点最新版 0.4-beta9)は,Type1 フォントと TeX スタイルとのふたつのアーカイブからなる.これらをダウンロードし,展開する.

% cd ~/cjk
[ PSCyr パッケージをダウンロード ]
% wget -r -nH --cut-dirs=4 --retr-symlinks \
  ftp://ftp.vsu.ru/pub/tex/font-packs/pscyr/0.4d-beta/
% cd 0.4d-beta
[ アーカイブの展開 ]
% tar zxvf PSCyr-0.4-beta9-tex.tar.gz
% tar zxvf PSCyr-0.4-beta9-type1.tar.gz
	

次に,諸々のファイルを $TEXDIR 下のしかるべきディレクトリに格納する.PSCyr の PK フォントがあれば削除しておく.

% su -m
# cd PSCyr
[ ディレクトリの作成 ]
# mkdir -p $TEXDIR/{tex/latex,fonts/tfm/public,fonts/vf/public,\
fonts/type1/public,fonts/afm/public,doc/fonts,fonts/enc/dvips,\
fonts/map/dvips}/pscyr
[ 所定位置へのファイルの格納 ]
# cp dvips/pscyr/*.enc $TEXDIR/fonts/enc/dvips/pscyr
# cp dvips/pscyr/*.map $TEXDIR/fonts/map/dvips/pscyr
# cp tex/latex/pscyr/* $TEXDIR/tex/latex/pscyr
# cp fonts/tfm/public/pscyr/* $TEXDIR/fonts/tfm/public/pscyr
# cp fonts/vf/public/pscyr/* $TEXDIR/fonts/vf/public/pscyr
# cp fonts/type1/public/pscyr/* $TEXDIR/fonts/type1/public/pscyr
# cp fonts/afm/public/pscyr/* $TEXDIR/fonts/afm/public/pscyr
# cp LICENSE doc/README.koi doc/PROBLEMS ChangeLog \
  $TEXDIR/doc/fonts/pscyr
[ 既存の PSCyr PK の削除 ]
# find `kpsewhich --expand-var='$VARTEXFONTS'`/pk -name pscyr |\
  xargs rm -fr
[ TeX ツリーの更新 ]
# mktexlsr
	

updmap.cfg の末尾に以下を追加する.

# PSCyr 0.4-beta9
Map pscyr.map
	

最後に updmap を実行してフォントマップを更新する.

# updmap
	

PSCyr パッケージでは以下の書体が利用できる.デフォルトは Таймс のようである.書体指定のためのコントロールシーケンスもあげておく.

セリフ
  — Академическая (AcademyPSCyr) : \textac
  — Антиква (AntiquaPSCyr) : \textaq
  — Балтика (HandbookPSCyr) : \textha
  — Бодони (CollegePSCyr) : \textco
  — Журнальная (JournalPSCyr) : \textjn
  — Лазурская (Lazurski) : \textlz
  — Таймс (TimesNewRomanPSMT) : \texttm
サンセリフ
  — Ариал (ArialMT) : \textar
  — Букварная (TextbookPSCyr) : \texttx
  — Журнальная Рубленая (MagazinePSCyr) : \textma
モノタイプ
  — Курьер (CourierNewPSMT) : \textcr
  — ER Курьер (ERKurierPSCyr) : \texter
デコレーション
  — Кладезь (CooperPSCyr) : \textcp
  — Рекламный (AdvertisementPSCyr) : \textad

パッケージ添付の文書を次のようにタイプセットしておく.書体のサンプルを閲覧できる.

% cd ~/cjk/0.4d-beta/PSCyr/doc
% latex fonts-ex.tex
% dvipdfmx fonts-ex.dvi
	

タイ語単語分割

 

タイ語は,分書きを行わず,しかも単語の切目で改行しなければならない正書法規則をもつ.タイ語 LaTeX では,単語分割ソフトウェアによってタイ語テキストに単語境界コントロールシーケンスを挿入したのち,タイプセットを行うのがマナーのようだ.

単語分割のためのプログラムは swath を利用する.同様のソフトウェアに CTTeX というのもあるらしい.また Emacs ユーザが編集バッファ上で操作するための Lisp もいくつか公開されている.CJK thai-word.el はそのひとつである.

Debian-Linux のパッケージ・サイトにある swath ソースを入手して導入することとする.FreeBSD,Mac OS X に関し,留意すべき事項がある.abswordseg.cpp のコンパイルがエラーとなる.これは abswordseg.cpp が malloc.h をインクルードしており,BSD の C++ コンパイラがこのヘッダファイルをサポートしていないためである.対策として,ソース8行目の #include <malloc.h> を削除して(stdlib.h が別行でインクルードされているので削除するだけでよい)コンパイルしなければならない.FreeBSD では gmake でビルドする.

% cd ~/cjk
% wget -nH -nd http://ftp.debian.org/debian/pool/main/s/\
swath/swath_0.3.0.cvs20030404.tar.gz
% tar zxvf swath_0.3.0.cvs20030404.tar.gz
% cd swath-0.3.0.cvs20030404
% ./configure
[ FreeBSD,Mac OS X コンパイルエラー対策 ]
% cd src
% cp -p abswordseg.cpp abswordseg.cpp.orig
% sed '/<malloc.h>/d' abswordseg.cpp.orig > abswordseg.cpp
% cd ..
[ コンパイル.FreeBSD の場合は gmake ]
% make
% su
# make install
	

swath はフィルタプログラムである.LaTeX 向け機能の使い方を次に示す.

swath はタイ語 Thai-TIS620 エンコードテキストを入力前提とする.このため,TeX 原稿を UTF-8 とするにせよ,まずタイ語テキストを TIS620 で記述し,これを swath にかけたのち,UTF-8 にコード変換するようにしよう.swath は複数の単語分割アルゴリズムをサポートしている.以下では標準オプションで実行している.swath 処理後,テキスト単語境界には {\wbr} が挿入される.

% swath -f latex < thai-tis620.txt |\
  iconv -f TIS620 -t UTF-8 > thai-utf8.txt  
	

[ swath 処理前 ]

เป็น​มนุษย์​สุด​ประเสริฐ​เลิศ​คุณค่า​กว่า​บรรดา​ฝูง​สัตว์​เดรัจฉาน​จง​ฝ่าฟัน​พัฒนา​วิชาการ​อย่า​ล้าง​ผลาญ​ฤๅ​เข่นฆ่า​บีฑา​ใคร​ไม่​ถือโทษ​โกรธ​แช่ง​ซัด​ฮึดฮัด​ด่า​หัด​อภัย​เหมือน​กีฬา​อัชฌาสัย​ปฏิบัติ​ประพฤติ​กฎ​กำหนดใจ​พูดจา​ให้​จ๊ะๆ จ๋าๆ น่าฟัง​เอยฯ

[ swath 処理後 ]

เป็น{\wbr}​มนุษย์{\wbr}​สุด{\wbr}​ประเสริฐ{\wbr}​เลิศ{\wbr}​คุณค่า{\wbr}​กว่า{\wbr}​บรรดา{\wbr}​ฝูง{\wbr}​สัตว์{\wbr}​เดรัจฉาน{\wbr}​จง{\wbr}​ฝ่าฟัน{\wbr}​พัฒนา{\wbr}​วิชาการ{\wbr}​อย่า{\wbr}​ล้าง{\wbr}​ผลาญ{\wbr}​ฤๅ{\wbr}​เข่นฆ่า{\wbr}​บีฑา{\wbr}​ใคร{\wbr}​ไม่{\wbr}​ถือโทษ{\wbr}​โกรธ{\wbr}​แช่ง{\wbr}​ซัด{\wbr}​ฮึดฮัด{\wbr}​ด่า{\wbr}​หัด{\wbr}​อภัย{\wbr}​เหมือน{\wbr}​กีฬา{\wbr}​อัชฌาสัย{\wbr}​ปฏิบัติ{\wbr}​ประพฤติ{\wbr}​กฎ{\wbr}​กำหนดใจ{\wbr}​พูดจา{\wbr}​ให้{\wbr}​จ๊ะๆ จ๋าๆ น่าฟัง{\wbr}​เอยฯ

swath 処理後のテキストを TeX 原稿に貼付ける.このとき,\wbr コントロールシーケンスに対し,行ブレーク制御のための命令定義を行っておかないと意味がない.すなわち,グルーを挿入し,そこでのみ行分割を許容するようにしておくのである.具体的には,次のような行をタイ語テキストの前に挿入する.

\def\wbr{\hskip0pt plus0.6pt minus0.6pt\relax}%
	

この定義ではグルーの延び縮みは 0.6pt に設定している.Overfull \hbox メッセージが出て,行端がはみ出てしまうような場合,この数値を大きくして調整するとよい.

ThaiLaTeX の
導入

 

CJK 環境のタイ語は,\CJKglue を無効化しないと単語分割が不正になる,書体選択の余地がないなどの問題がある.そこで ThaiLaTeX をインストールしてこの不備を補うこととする.ThaiLaTeX は本来タイ語 Thai-TIS620 エンコーディングで原稿を準備するパッケージである.CJK 及び Unicode パッケージを併用することにより,多言語混在文書において UTF-8 でタイ語を入力し,正格なタイ語組版が実現できるようになる.ThaiLaTeX には Norasi (serif) 及び Garuda (sanserif) の Type1 フォント2書体が添付されている.

ThaiLaTeX サイトからアーカイブ(2005.12 時点最新版 0.3.5.1)をダウンロードしてインストールする.パッケージは Linux プラットフォームを想定しており,Windows ユーザには導入が困難かもしれない.以下手順を示す.

% cd ~/cjk
% wget -nH -nd ftp://linux.thai.net/pub/thailinux/software/\
thailatex/thailatex-0.3.5.1.tar.gz
% tar zxvf thailatex-0.3.5.1.tar.gz
% cd thailatex-0.3.5.1
% ./configure --with-texmfdir=$TEXDIR
[ コンパイル及びインストール.FreeBSD の場合は gmake ]
% su
# make install
	

次に ThaiLaTeX のフォント環境を調整する.ThaiLaTeX のインストール用 Makefile では,map 及び enc ファイルの格納場所が新 TDS に準拠していないので,手動で移動させる.マップを登録して ThaiLaTeX のインストールは完了である.

# cd $TEXDIR
# mv dvips/base/lthuni.enc fonts/enc/dvips/thai/
# mv dvips/config/thai.map fonts/map/dvips/thai/
# mktexlsr
# updmap --enable MixedMap thai.map
	

さらに,CJK パッケージとの連携のために,CJK 用のフォント環境を調整する.CJK doc/​thaifont.txt の指示に従う.ここで ThaiLaTeX 添付のフォント名称を変更してコピーしておかなければならない.つまり,ノーマルシェイプのフォントファイル名(basename)に "n" を追加し,"_" を含むファイル名から "_" を削除するというものである.たとえば garuda.pfb は garudan.pfb に,norasi_bi.pfb は norasibi.pfb にコピーするわけである.この操作のために thaifonts_conv.sh を用意した.新たに作成したフォントを TeX ツリーに格納し,マップ更新を行えば終了である.

# cd ~/cjk/cjk-4.6.0/utils/thaifont/texmf
# tar cf - . | ( cd $TEXDIR; tar xvf - )
[ ThaiLaTeX フォントファイル名変更 ]
# cd ~/cjk/thailatex-0.3.5.1/fonts
# wget -nH -nd http://yasuda.homeip.net/tex/thaifonts_conv.sh
# sh thaifonts_conv.sh
[ フォントファイルを格納 ]
# cp -p *.tfm $TEXDIR/fonts/tfm/public/thai
# cp -p *.pfb $TEXDIR/fonts/type1/public/thai
# cp -p *.afm $TEXDIR/fonts/afm/public/thai
# cp -p *.vf $TEXDIR/fonts/vf/public/thai
# mktexlsr
[ フォントマップ登録 ]
# updmap --enable MixedMap norasi.map
# updmap --enable MixedMap garuda.map
	

pTeX で ThaiLaTeX を使う工夫については,TeX Q & A の記事 39658 及び 39659 を参照.

Unicode,PSCyr の利用

 

ロシア語での PSCyr フォントの書体指定は,CJK 環境の外側で有効となる.CJK 環境:\begin​{CJK}​{UTF8}​{song}​〜​\end​{CJK} 内では Cyberbit フォントが選択されてしまう.UTF-8 のロシア文字の入力処理は,inputenc に utf8x を指定するとともに,ucs.sty(Unicode パッケージ)に委ねる.ヴェトナム語,タイ語も同様である.Unicode パッケージを指定するのなら CJK 環境の内側での言語は,日本語,中国語,韓国語に限定するほうがよい.Unicode パッケージを使って諸々の言語を記述する際に留意すべき事項を次に示す.

Unicode パッケージのドキュメントには,CJK 言語を利用する場合 CJK パッケージのオプションに encapsulated を指定し,cjkjis オプションで ucs.sty を呼出すことが述べられている.このあたりの実例は永田善久先生の試みに負うところが大である.

ドキュメントに記載されたすべての言語が同時に組めるとは限らないようである.私が試した範囲では,古典ギリシア語とヴェトナム語とは Babel 言語定義の相性が悪いようで,混在させることができなかった.この原因調査/対応方法は今後の課題としたい.

サンプルでは Babel ヴェトナム語(vietnam.ldf)ではなく VnTeX を直接利用している.ドイツ語,フランス語などのラテン文字がヴェトナム語 T5 フォントエンコーディングで組まれないよう,\encodingdefault に T1 を,\familydefault に cmr を,プリアンブルで設定している.

タイ語は CJK 環境外,thaicjk Babel 言語環境で記述する.これにより,書体指定が活きるだけでなく,私が確認した範囲では,\wbr の定義によって正しい行末処理が得られるようになる.また,thaicjk はタイ語のフォントエンコーディングとして C90 を要求するので,プリアンブルに次の一行を指定しておく.
  \addto\extrasthaicjk{\fontencoding{C90}\selectfont}%

特殊なキリル文字を,つまり,教会スラヴ語,ユカギール語などに含まれる,現代ロシア語,ウクライナ語などでは使用されないような文字を出力したい場合,それが属するフォントエンコーディングに切替えなければならない.\fontencoding​{T2D}​\selectfont のようにして変更するわけである.

Unicode で定義されている全てのコードポイントがサポートされているわけではない.記述できる文字の一覧は,たとえばキリル文字であれば config/​cyrillic.ucf.gz で確認することができる.もしもこのファイルにない文字を TeX 原稿に入力した場合,次のようなエラーメッセージを出力して待ち状態となる.当該文字出力のための命令を *.ucf.gz に追加し,makeunidef.pl で文字定義を再生成すれば(上記 「Unicode パッケージの導入」を参照),エラーを対策し,当該文字を出力できるかもしれない.

! Package ucs Error: Unknown Unicode character 1221 = U+04C5,
(ucs)                possibly declared in uni-4.def.
(ucs)                Type H to see if it is available with options.
	

サンプル unicode.tex を以下に示す.latex コマンドによる組版結果 unicode.pdf を掲載しておく.

% -*- coding: utf-8 -*-
% CJK + Unicode + PSCyr + VnTeX + ThaiLaTeX サンプル
% $Id: unicode.tex,v 1.2 2005/12/07 15:18:39 isao Exp $
% Coded by isao yasuda, 2005
\documentclass[a4paper]{article}
\usepackage[encapsulated]{CJK}  % CJK
\usepackage[cjkjis]{ucs}        % ucs: Unicode package
\usepackage[utf8x]{inputenc}    % UTF-8 input
\usepackage[T2A,T2B,T2C,T2D,T1]{fontenc}
\usepackage[thaicjk,russian,polutonikogreek,%
            german,french,english]{babel}
\usepackage[utf8]{vietnam}      % VnTeX
\usepackage{pscyr}              % PSCyr Type1 fonts
\addtolength{\textwidth}{30pt}
\addtolength{\textheight}{40pt}
\renewcommand{\encodingdefault}{T1} % ラテン文字対策(VnTeX 1.3)
\renewcommand{\familydefault}{cmr}  % ラテン文字対策(VnTeX 1.3)
\addto\extrasthaicjk{\fontencoding{C90}\selectfont}
\begin{document}
\begin{center}
 \Large\bfseries\LaTeX{} Multilingual Document Sample\par
 CJK, Unicode, PSCyr, Vn\TeX{}, Thai\LaTeX{}
\end{center}

\hfill isao yasuda\qquad\qquad%

\selectlanguage{russian}
\def\rustext{%
Прежде всего откроем тайну которую Мастер не пожелал
открыть Иванушке.
Возлюбленную его звали Маргаритою Николаевной.
Все, что Мастер говорил о ней, было сущей правдой.
Он описал свою возлюбленную верно.
Она была красива и умна.}
\showhyphens{\rustext}%

\fontencoding{T2A}\selectfont%
\section{Русский}
\noindent\fontfamily{larm}\selectfont{}LH font:\\%
\rustext

\hfill {\em \textit{М. Булгаков, «Мастер и Маргарита»}}%

\vspace{1em}
\noindent\texttm{Таймс (TimesNewRomanPSMT):\\%
\rustext}

\vspace{1em}
\noindent\textac{Академическая (AcademyPSCyr):\\%
\rustext}

\vspace{1em}
\noindent\textaq{Антиква (AntiquaPSCyr):\\%
\rustext}

\vspace{1em}
\noindent\textha{Балтика (HandbookPSCyr):\\%
\rustext}

\vspace{1em}
\noindent\textco{Бодони (CollegePSCyr):\\%
\rustext}

\vspace{1em}
\noindent\textjn{Журнальная (JournalPSCyr):\\%
\rustext}

\vspace{1em}
\noindent\textcp{Кладезь (CooperPSCyr):\\%
\rustext}

\clearpage

\selectlanguage{russian}%
\section{Cyrillic T2A, T2B, T2C, T2D}
\noindent\fontencoding{T2A}\fontfamily{larm}\selectfont%
T2A: Ґґ Ғғ Ҙҙ Ққ Ҝҝ Ұұ Ҳҳ Ҹҹ Һһ Ӕӕ %
Әә Ӛӛ Ӣӣ Өө Ӫӫ Ӯӯ Ӱӱ Ӳӳ%

\noindent\fontencoding{T2B}\fontfamily{lbrm}\selectfont%
T2B: Җҗ Ӄӄ Ӌӌ Ӡӡ%

\noindent\fontencoding{T2C}\fontfamily{lcrm}\selectfont%
T2C: Ҍҍ Ҏҏ Ҕҕ Ҟҟ Ҵҵ Ҷҷ Ҽҽ Ҿҿ%

\noindent\fontencoding{T2D}\fontfamily{ldrm}\selectfont%
T2D: Ѡѡ Ѥѥ Ѧѧ Ѩѩ Ѫѫ Ѭѭ Ѯѯ Ѱѱ Ѷѷ Ѻѻ Ѽѽ Ѿѿ Ҁҁ%


\selectlanguage{german}
\section{Deutsch}
\noindent\fontencoding{T1}\fontfamily{cmr}\selectfont%
Dann ließ sie ihre Hände langsam über meine Wangen
heruntergleiten, und ihr Blick ruhte mit unendlicher
Innigkeit auf mir.
Sie schüttelte den Kopf mit einem schmerzlichen Ausdruck,
als könnte sie irgend etwas nicht fassen.
,,Mußst du denn schon heute weg?{}`` fragte sie leise.

\hfill {\em \textit{A. Schnitzler, »Die Frau des Weisen«}}%

\selectlanguage{french}
\section{Français}
\noindent\fontencoding{T1}\fontfamily{cmr}\selectfont%
Souvent, la main portée au front, debout sur les vaisseaux,
tandis que la lune se balançait entre les mâts d'une
façon irrégulière, je me suis surpris, faisant
abstraction de tout ce qui n'était pas le but que je
poursuivais, m'efforçant de résoudre ce difficile
problème!

\hfill {\em \textit{Conte de Lautréamont, 
«Les Chants de Maldoror»}}%

\selectlanguage{polutonikogreek}
\section{\protect\textlatin{Polytonic Greek}}
\noindent%
Ἄνδρα μοι ἔννεπε, Μοῦσα, πολύτροπον, ὃς μάλα πολλὰ \\
πλάγχθη, ἐπεὶ Τροίης ἱερόν πτολίεθρον ἔπερσε. \\
πολλῶν δ᾽ἀνθρώπων ἴδεν ἄστεα καὶ νόον ἔγνω, \\
πολλὰ δ᾽ὅ γ᾽ἐν πόντῳ πάθεν ἄλγεα ὃν κατὰ θῡμόν,\\
ἀρνύμενος ἥν τε ψῡχὴν καὶ νόστον ἑταίρων.\\
ἀλλ᾽οὐδ᾽ὧς ἑτάρους ἐρρύσατο, ἱέμενός περ·\\
αὐτῶν γὰρ σφετέρῃσιν ἀτασθαλίῃσιν ὄλοντο,\\
νήπιοι, οἳ κατὰ βοῦς Ὑπερίονος Ἠελίοιο\\
ἤσθιον· αὐτὰρ ὁ τοῖσιν ἀφείλετο νόστιμον ἦμαρ.\\
τῶν ἁμόθεν γε, θεά, θύγατερ Διός, εἰπὲ καὶ ἡμῖν.

\hfill {\em [ \textit{Ὅμηρος} ]}

\noindent%
-- \textlatin{Accents of Polytonic Greek ---}\\
-- \textlatin{PSILI:} ᾿, ἀ \\
-- \textlatin{DASIA:} ῾, ἁ\\
-- \textlatin{OXIA:} ´, ά\\
-- \textlatin{VARIA:} `, ὰ\\
-- \textlatin{DIALYTIKA:} ¨, ϊ\\
-- \textlatin{PERIPOMENI:} ῀, ῶ\\
-- \textlatin{PROSGEGRAMMENI:} ῼ, ᾼ\\
-- \textlatin{YPOGEGRAMMENI:} ῳ, ᾳ\\
-- \textlatin{VRACHY:} ᾰ, ῐ, ῠ\\
-- \textlatin{MACRON:} ᾱ, ῑ, ῡ\\
-- \textlatin{KORONIS:} ᾽, γ᾽ἐν\\

\clearpage

\selectlanguage{english}
\begin{CJK}{UTF8}{song}
\section{日本語}
\parindent 11pt
雪後庵は起伏の多い小石川界隈の高台にあって、幸いに戦災を免かれた。%
三千坪に及ぶ名高い小堀遠洲流の名園と共に、京都のとある名刹から%
移された中雀門も、奈良の古い寺をそのまま移した玄関や客殿も、%
あとに建てられた大広間も、何一つ損なわれていなかった。

戦後の財産税さわぎの只中に、雪後庵は元の持主の実業家の茶人の手から、%
美しい元気な女主人の手に渡って、たちまち名高い料理屋になった。

\hfill (三島由紀夫『宴のあと』)

\section{韓国語}
\noindent%
이 FAQ 은 자주 반복되는 질문과 그에 대한 대답을 간단명료한 
양식으로모아 엮어졌습니다. 이 FAQ 의 구조는 지난 판에 
비하여 획기적으로변경되었습니다. 
\textbf{상세한 것은 ``이 FAQ 을 어떻게 읽을것인가'' 라는
 대목을 참조하시기 바랍니다.}

\section{中国語}
\CJKtilde
\noindent%
\textbf{(1) 簡体字}\\
本常问问答集~(FAQ list)~是从一些经常被问到的问题及其适当的%
解答中、以方便的形式摘要而出的。跟上一版不同的是、%
其编排结构已彻底改变。%
\textbf{有关新结构的细节、可参考%
「如何阅读本问答集及了解其编排结构」该项中的说明。}

\vspace{1em}
\noindent%
\textbf{(2) 繁体字}\\
本常問問答集~(FAQ list)~是從一些經常被問到的問題及其適當的%
解答中、以方便的形式摘要而出的。跟上一版不同的是、%
其編排結構已徹底改變。%
\textbf{有關新結構的細節、可參考%
「如何閱讀本問答集及了解其編排結構」該項中的說明。}

\end{CJK}

\selectlanguage{thaicjk}%
\section{Thai, \fontencoding{C90}\selectfont{}ภาษาไทย}
% タイ語は CJK 環境外で記述する.
% Thai word break control
\def\wbr{\hskip0pt plus2.6pt minus2.6pt\relax}%
\noindent\fontfamily{nrsr}\selectfont% norasi fonts
(Norasi)\\
เป็น{\wbr}มนุษย์{\wbr}สุด{\wbr}ประเสริฐ{\wbr}เลิศ{\wbr}%
คุณค่า{\wbr}กว่า{\wbr}บรรดา{\wbr}ฝูง{\wbr}สัตว์{\wbr}%
เดรัจฉาน{\wbr}จง{\wbr}ฝ่าฟัน{\wbr}พัฒนา{\wbr}วิชาการ{\wbr}%
อย่า{\wbr}ล้าง{\wbr}ผลาญ{\wbr}ฤๅ{\wbr}เข่นฆ่า{\wbr}บีฑา{\wbr}%
ใคร{\wbr}ไม่{\wbr}ถือโทษ{\wbr}โกรธ{\wbr}แช่ง{\wbr}ซัด{\wbr}%
ฮึดฮัด{\wbr}ด่า{\wbr}หัด{\wbr}อภัย{\wbr}เหมือน{\wbr}%
กีฬา{\wbr}อัชฌาสัย{\wbr}ปฏิบัติ{\wbr}ประพฤติ{\wbr}กฎ{\wbr}%
กำหนดใจ{\wbr}พูดจา{\wbr}ให้{\wbr}จ๊ะๆ จ๋าๆ น่าฟัง{\wbr}เอยฯ 

\vspace{1em}
\noindent\fontfamily{gar}\selectfont% garuda fonts
(Garuda)\\
เป็น{\wbr}มนุษย์{\wbr}สุด{\wbr}ประเสริฐ{\wbr}เลิศ{\wbr}%
คุณค่า{\wbr}กว่า{\wbr}บรรดา{\wbr}ฝูง{\wbr}สัตว์{\wbr}%
เดรัจฉาน{\wbr}จง{\wbr}ฝ่าฟัน{\wbr}พัฒนา{\wbr}วิชาการ{\wbr}%
อย่า{\wbr}ล้าง{\wbr}ผลาญ{\wbr}ฤๅ{\wbr}เข่นฆ่า{\wbr}บีฑา{\wbr}%
ใคร{\wbr}ไม่{\wbr}ถือโทษ{\wbr}โกรธ{\wbr}แช่ง{\wbr}ซัด{\wbr}%
ฮึดฮัด{\wbr}ด่า{\wbr}หัด{\wbr}อภัย{\wbr}เหมือน{\wbr}%
กีฬา{\wbr}อัชฌาสัย{\wbr}ปฏิบัติ{\wbr}ประพฤติ{\wbr}กฎ{\wbr}%
กำหนดใจ{\wbr}พูดจา{\wbr}ให้{\wbr}จ๊ะๆ จ๋าๆ น่าฟัง{\wbr}เอยฯ 

\section{Vietnamese, \fontencoding{T5}\selectfont{}Tiếng Việt}
% ヴェトナム語 Babel は古典ギリシア語と相性が悪い.
\fontencoding{T5}\selectfont%
Phần ``Những câu hỏi và giải đáp thường gặp'' (viết tắt từ 
tiếng Anh là FAQ) được nêu ra ở đây nhằm mục đích thu thập 
những câu hỏi thường gặp trong thực tế và những lời giải 
đáp thích hợp nhất của nó.
Từ lần ấn bản cuối cùng đến nay, đã có những sự thay đổi khá
  lớn trong cấu trúc của FAQ.  
\textbf{Để hiểu rõ hơn bạn nên xem lại
  chương ``Làm sao tôi có thể đọc đuợc FAQ''.}

\end{document}
	

Unicode 日中韓の包摂について

 

Unicode は CJK 統合漢字という概念で,日本語,中国語,韓国語でそれぞれ微妙に字体の異なる文字を同一コードポイントに包摂している.UTF-8 で同一ファイルに日中韓のテキストを混在させ,同一フォント(Cyberbit)で組版すると,当然ながら,この差異は表現できなくなってしまう.これを不満とする方は,cjk-enc.el を用いるか,これら言語をそれぞれ別ファイルで準備し,各国語用のフォントで処理するのがよい.

pTeX では OTF パッケージを指定し,\UTFK(韓国語),\UTFC(中国語簡体字),\UTFT(中国語繁体字)の各コントロールシーケンスを用いて中国語と韓国語のテキストを記述すれば,それぞれの字体の特徴を,句読点の位置も含め,表現することができる.pTeX + OTF で組んだサンプル thaitest.pdf(原稿は thaitest.tex)と,Cyberbit のみで組んだ CJK サンプル cjktestold.pdf とで日中韓の文字出力を見比べていだだきたい.

Emacs 設定の
注意事項

 

多言語 TeX 原稿を編集するには,Unicode フォント及び各国語インプットメソッド(入力プログラム)に対応したエディタが望ましい.多言語エディタ Emacs の Unicode 環境構築については,Windows:「Windows Meadow 2.10 多言語環境の設定」,FreeBSD:「Emacs 21 Unicode 環境」,Mac OS X:「Mac OS X Tiger, X11-Emacs 22.0.50」に整理したので参考にしていただきたい.また,インプットメソッドについては,私が自作した古典ギリシア語,スラヴ語汎用インプットメソッドを利用することができる.

本稿の TeX 文書例の記述に Emacs を利用する場合,Mule-UCS 設定上の注意事項がある.Emacs(20, 21) Mule-UCS パッケージのデフォルト設定では,CJK パッケージにあるサンプルの中国語(GB2312 及び Big5)を UTF-8 で格納するとき,指定コードにない文字が存在するとのエラーが出てしまう.

これを回避するためには,Emacs 初期設定ファイル .emacs において,セーフ・キャラクタセット変数:
    un-define-safe-charsets-for-coding-systems
を指定しておくとよい.また,
    un-define-change-charset-order
によってキャラクタセットの優先順位を指定しておく.以下の例で mule-unicode-0100-24ff が japanese-jisx0208 などのマルチバイト文字セットよりも前に定義されているのは,Emacs 内部文字コードを指定文字コードセットに変換する際に Unicode を優先することを示す.この順番指定が逆になると,ギリシア文字,キリル文字が,JIS や EUC で定義されているいわゆる全角文字のギリシア文字,キリル文字に插替えられてしまうことがあるので注意したい.Emacs-22 ではこの設定は不要である.

;;
;; Unicode Mule-UCS 設定例
;;
(setq un-define-safe-charsets-for-coding-systems
 '(ascii
   latin-iso8859-1 latin-iso8859-2 latin-iso8859-3 latin-iso8859-4
   cyrillic-iso8859-5 greek-iso8859-7
   hebrew-iso8859-8 latin-iso8859-9
   ipa thai-tis620 ethiopic indian-is13194 
   vietnamese-viscii-lower vietnamese-viscii-upper
   mule-unicode-0100-24ff 
   japanese-jisx0208
   japanese-jisx0213-1 japanese-jisx0213-2
   japanese-jisx0212
   korean-ksc5601
   chinese-big5-1 chinese-big5-2
   chinese-gb2312
   chinese-cns11643-1 chinese-cns11643-2 chinese-cns11643-3
   chinese-cns11643-4 chinese-cns11643-5 chinese-cns11643-6
   chinese-cns11643-7
   chinese-sisheng
   mule-unicode-2500-33ff mule-unicode-e000-ffff
   latin-jisx0201 katakana-jisx0201
   ))
(require 'un-define)
(require 'un-tools)
(require 'jisx0213)
(un-define-change-charset-order
 '(ascii
   latin-iso8859-1 latin-iso8859-2 latin-iso8859-3 latin-iso8859-4
   cyrillic-iso8859-5 greek-iso8859-7
   hebrew-iso8859-8 latin-iso8859-9
   ipa thai-tis620 ethiopic indian-is13194 
   vietnamese-viscii-lower vietnamese-viscii-upper
   mule-unicode-0100-24ff 
   japanese-jisx0208
   japanese-jisx0213-1 japanese-jisx0213-2
   japanese-jisx0212
   korean-ksc5601
   chinese-big5-1 chinese-big5-2
   chinese-gb2312
   chinese-cns11643-1 chinese-cns11643-2 chinese-cns11643-3
   chinese-cns11643-4 chinese-cns11643-5 chinese-cns11643-6
   chinese-cns11643-7
   chinese-sisheng
   mule-unicode-2500-33ff mule-unicode-e000-ffff
   latin-jisx0201 katakana-jisx0201
   ))
	

謝辞

 

TeX Q & A のさまざまなご意見,とくに栗山氏,大友氏,Kuno 氏,anonymouse 氏,角藤先生の知見がなければ,私は本稿を整理できなかったと思う.多謝.

更新履歴

 

Apr. 24, 2004 古典ギリシア語関連誤記訂正,追加
Jun. 22, 2004 Emacs 設定の注意事項訂正
Aug. 23, 2005 teTeX-3 新 TDS ベース改訂,Mac OS X
Sept. 19, 2005 誤記訂正
Sept. 23, 2005 記述見直し/サンプル修正
Dec. 10, 2005 VnTeX-3,ThaiLaTeX,サンプル插替
Dec. 16, 2005 CJK フォント,cjk-enc.el 追記,サンプル插替
Dec. 21, 2005 謝辞
Jan. 6, 2006 誤記訂正
Jan. 13, 2006 ボールド書体記述追加(TeX Q & A anonymouse氏,ふぉあすと氏ご教示)
July 10, 2007 韓国語書体指定記述修正