マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

writeLaTeX で日本語してみたかった件について

【名残惜しく宣伝】
2012/12/01 〜 2012/12/25

TeX & LaTeX Advent Calendar

→21 日目は例のアレ

*  *  *

Web 上で (La)TeXコンパイルを提供するサービスというのは既にいくつか存在するが、最近、writeLaTeX というサービスが話題になっている。LaTeX 文書のコンパイルを行うだけでなく保存や共有が可能で、また、文書中で参照するファイル(画像や非標準のパッケージファイルなど)がアップロード可能、リアルタイムでの組版結果の表示などの特徴を備えている。

しかし残念ながら、writeLaTeX は pdfTeX エンジンしかサポートしていないので、pLaTeX を前提として日本語文書は取り扱うことができない。最近では日本語文書を XeLaTeX や LuaLaTeX で作成している人もいるが、当然それらも使えない。しかし何とかして writeLaTeX で日本語できればよかったのに、というのが今回の話。

pdfLaTeX(を含む 8 ビット欧文 LaTeX)で日本語を扱うための(TeX Live *1で標準で使える)方法といえば CJK パッケージしかない。そこでまずは、CJK パッケージを用いた日本語を含む文書の組版が正常に行えるかを、次のような非常に基本的なソースで試してみよう。

\documentclass[a4paper]{article}
\usepackage[pass]{geometry}
\usepackage{CJK,CJKspace,CJKpunct}
\begin{document}
\begin{CJK*}{UTF8}{min}
国民は、すべての基本的人権の享有を妨げられない。
この憲法が国民に保障する基本的人権は、
侵すことのできない永久の権利として、
現在及び将来の国民に与へられる。
\end{CJK*}
\end{document}

2 行目の pass 付きの geometry はドライバ側の用紙設定を LaTeX 側の設定と合致させるために入れている。(writeLaTeX の場合、既定は A4 のようなので、上の文書の場合は不要ではある。*23 行目では CJK パッケージの他に CJKspace と CJKpunct というパッケージを読み込んでいるが、これについては「今時 CJK を用いるのならこの 2 つも併用するのが常識」と思っていてほしい。((CJKspace はソース中の空白文字の扱いを調整する。CJKpunct は約物の周りの空きの自動調整を行うもので、\punctstyle という命令で「句読点スタイル」を選択することができる。xeCJK のインタフェースは、実はこのパッケージが手本となっている。))writeLaTeX は入力ファイルを UTF-8 として扱うのでエンコーディング指定は UTF8、またファミリ指定は min (日本語明朝体、実体は和田研明朝)とする。これを writeLaTeX のソース編集エリアに入力すると無事にコンパイル結果が表示される。PDF をエクスポートして調べてみると、和田研明朝の Type1 フォントが埋め込まれていることが確認できる。

もちろんこのままでは和田研明朝にしかならず実用できないので、IPA 明朝を埋め込みたい。最近の TeX Live であれば IPA 明朝はきっと使えるはずである。

しかしここで問題がある。CJK パッケージで新しいフォントファミリを使えるようにしようとすると、大量の TFM ファイルを新たに(作成した上で)導入しなければならないが、リモートのシステムには「インストール」することができないはずである。実際は、「カレントディレクトリ」に置くことも可能なので、おそらくは、(画像などと同じく)TFM ファイルをアップロードすることはできるかも知れないが、毎回大量の TFM ファイルのアップロードが必要というのは実用的ではないだろう。どうにかならないものか。

最近の TeX Live には zhmetrics というパッケージが含まれている。これは「ドライバ側のフォントマップ設定で任意の TrueType フォントを指定する」ことを想定した、「汎用的な」等幅の Unicode サブフォントを提供している。(何となく pTeX での和文フォントの扱いの慣習と似ている。)この中の、UTF8 の明朝体に相当する zhsong ファミリを用いることにして、文書中に pdfTeX のフォントマップの設定を追加する。

\documentclass[a4paper]{article}
\usepackage[pass]{geometry}
\usepackage{CJK,CJKspace,CJKpunct}
\pdfmapline{=unisong@Unicode@ <ipam.ttf}
\begin{document}
\begin{CJK*}{UTF8}{zhsong} % ファミリ変更
国民は、すべての基本的人権の享有を妨げられない。
この憲法が国民に保障する基本的人権は、
侵すことのできない永久の権利として、
現在及び将来の国民に与へられる。
\end{CJK*}
\end{document}

ローカルの TeX Live 2012 で実行すると、これは正常にコンパイルが行われ、IPA明朝(IPAMincho)が埋め込まれた*3 PDF ファイルが生成される。しかし、残念なことに、writeLaTeX ではエラーになってしまう。どうやら zhmetrics がインストールされていないらしい。*4となると、TeX Live の版がかなり古い可能性がある。[2012-12-29訂正]writeLaTeX のシステムで zhmetrics が入っていないというのは、こちらの確認作業のミスによる誤認でした。実際には使えます。(追記参照)

フォント定義ファイルの存在を色々と調査してみたところ、どうやら Cyberbit 用の設定、つまり cyberb@Unicode@ の TFM と c70song.fd はインストールされているようだ。(これは CJK パッケージの構成要素でかなり昔からあるので当然であるが。なお、Cyberbit フォント自身はフリーでないので TeX Live には含まれていない。)1 ファミリしか使えないのはそもそも実用性に欠けるのは確かだが、とにかくこの設定が writeLaTeX で使えるかどうかを確かめてみる。

\documentclass[a4paper]{article}
\usepackage[pass]{geometry}
\usepackage{CJK,CJKspace,CJKpunct}
\pdfmapline{=cyberb@Unicode@ <ipam.ttf} % Cyberbit 用の TFM を
\begin{document}                        % IPA明朝にマップする
\begin{CJK*}{UTF8}{song} % ファミリは song
国民は、すべての基本的人権の享有を妨げられない。
この憲法が国民に保障する基本的人権は、
侵すことのできない永久の権利として、
現在及び将来の国民に与へられる。
\end{CJK*}
\end{document}

……すると、かなり予想外のことが起きた。なんと「compile timeout」というアラートが返ってきた。さらに調べたところ、どうやら今回は予定通りの処理(IPA明朝を埋め込む)が行われていて、それが本当にタイムアウトしているらしい。pdfTeX では TrueType フォントの埋込の処理が Type1 と比べてかなり重くて、実際にローカルで上記の文書をコンパイルした時も 15 秒ほどかかっている。

実際に使われるサブフォントの個数が少なければ軽くなるから成功するかもしれない、ということで、CJK* 環境の中を「ほげ」だけにしたものを writeLaTeX に入力してみた。すると、案の定、今回は成功してしかもエクスポートした PDF にはちゃんと IPA 明朝が埋め込まれていた。つまり結論は次のようになる。

writeLaTeX は確かに CJK パッケージで IPA 明朝を埋め込んだ文書を作成できる環境にはなっているのだが、実際の文書でそれを行おうとすると処理が重すぎて受け付けてくれない。

というわけで、残念であるが、「writeLaTeX で日本語する件」は諦めるしかなさそうだ。


[2012-12-29 追記] 記事中に「writeLaTeX の TeX システムには zhmetrics が入っていない」と書いたがこれは誤りであった。zhmetrics があるかどうかの判定は \IfFileExists{c70zhsong.fd}{yes}{no} のような TeX コードで行ったのであるが、この時に肝心のファイル名を誤記していたようだ。改めて同じコードを試したら「yes」が出力され、すなわち、zhmetrics は入っていることが判明した。

また後で判ったことだが、TeX Live に含まれる cyberb@Unicode@ の TFM ファイル(cyberb30.tfm 等)は CJK パッケージではなく zhmetrics に含まれるものであった。詳細は次の通り:c70song.fd は CJK パッケージが用意した Cyberbit 用の設定であることは確かだが、cyberb@Unicode@ の TFM は Cyberbit.ttf から(ttf2tfm 等で)生成してできるもので、従って、(Cyberbit のない)TeX Live には本来は含まれていないはずである。しかし zhmetrics では、自身が提供する zhsong 等のファミリの他に、song ファミリについても「代替のための」等幅メトリクスの cyberb@Unicode@ を提供しているのである。

*1:サイトの説明にあるように、writeLaTeX で稼働している TeX システムは TeX Live である。

*2:しかし一部の同様のサービスでは既定がレターサイズである場合があるので注意が必要である。既定以外の b5paper 等を用いる場合はもちろんこの設定が必要となる。

*3:サブフォント毎に別のフォントとして埋め込まれるので、埋め込みフォントの一覧の中に IPAMincho が大量に存在する。

*4:パッケージの一員である c70zhsong.fd というファイルが見つからない。