マクロツイーター

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

(u)pLaTeX で CJK パッケージする件(1)

CJK パッケージは欧文 (pdf)LaTeX で日本語(などの CJK 言語)を扱うものである。従って、元々日本語を扱うためのエンジンである (u)pLaTeX で CJK パッケージが入用になるという場合はほとんど考えられないだろう。実際には、CJK と (u)pLaTex の実装は共存できないことが知られている。

ただし、(u)pLaTeX で敢えて CJK パッケージを使おうとする話が全くない、というわけでもない。


というわけで、本記事では「(u)pLaTeX で CJK パッケージする」という話題を扱う。

(u)pLaTeX で CJK パッケージすると何がアレか

まずは、両者を併用するとどういう不具合が出るかを見てみよう。

和文に対するフォント変更がアレ

こちらは (u(pLaTeX の機能が異常になる、という話である。

% pLaTeX 文書, 文字コードは UTF-8
\documentclass[a4paper]{jsarticle}
\usepackage{CJK}
\begin{document}
% 和文文字に対して \Large が効かない!
{\TeX}はアレ。{\Large {\TeX}はアレ。}
\end{document}

見ての通りである。この不具合は CJK パッケージを“読み込むだけ”で発生する。詳細については次の記事を参照されたい。

この記事で触れられているように、「ruby パッケージ」にはくれぐれも注意してほしい。

② 中国語のフォントがアレ

先の話とは反対に、こちらは CJK パッケージの機能に不具合が出る事例である。

% LaTeX 文書, 文字コードUTF-8
\documentclass[a4paper]{article}
\usepackage{CJKutf8,CJKspace,CJKpunct}
\begin{document}
\begin{CJK*}{UTF8}{gbsn}
你用中文可以写!
\end{CJK*}
\end{document}

これを pdfLaTeX でコンパイルした場合、次のような正常な出力が得られる。

一方、pLaTeXコンパイルした場合の出力はコレになる。

よく見ると、一部の漢字の字体が“日本語用”のものになってしまっている。この原因は、一部の漢字(というか、先頭の〈你〉以外全部)が pTeX エンジンにより「和文文字」として扱われて「和文用フォント」(これは通常は日本語用のフォントである)で出力されるからである。*1和文用のフォント」を別のもの(例えば「HGS創英角ポップ体」)に変えてみるとより明確になる。

※inputenc パッケージでギリシャ文字キリル文字を出力する際に (u)pLaTeX で出力が異常になるのも同じ理由による。

和文しなくて CJK パッケージだけできればよい場合

ところで、冒頭に挙げたツイートは Cloud LaTeX の中の人のものである。Cloud LaTeX では現在のところ pLaTeX と XeLaTeX のみがサポートされている。*2このような状況下では、「とにかく CJK パッケージを使いたいのだが、欧文 LaTeX が使えないので他のエンジンで代用したい」というチョット特殊な要求がありえる。このようなケースについては、(残念ながら pLaTeX や XeLaTeX では厄介であるが、)upLaTeX であればかなり容易に対応できる。

欧文 LaTeX でのコンパイルを前提とした文書を upLaTeX でコンパイルしたい場合は、プレアンブルの先頭((要するに CJK 文字が出現するより前。もし文書クラスの実装の中に CJK 文字が含まれるのであれば、\documentclass 命令の前に書く。))に \disablecjktoken という命令を書けばよい。

% upLaTeX 文書, 文字コードは UTF-8
\documentclass[a4paper]{article}
\disablecjktoken % コレでOK
\usepackage{CJKutf8,CJKspace,CJKpunct}
\begin{document}
\begin{CJK*}{UTF8}{gbsn}
用 CJK 宏包和 up{\LaTeX} 可以写中文!
\end{CJK*}
\end{document}

この \disablecjktoken という命令は、和文文字の認識を無効にして欧文 LaTeX と全く同じように処理させる作用をもつ。これにより、前出の②に挙げた問題が解消される。①の現象については相変わらず残っているはずであるが、そもそも“和文文字”を用いない前提だから問題にならない。従って、ほとんどの場合に正常な出力が得られることが期待できる。*3

pLaTeX な場合は

残念ながら \disablecjktoken は upTeX エンジン特有の機能なので pLaTeX では使えない。pLaTeX で同様の処理をしたい場合は「非 ASCII 文字を TeX エスケープするテキストフィルタを適用する」といった、古典的なテクニックを駆使する必要がある。例えば、pxfltsrc パッケージ*4を利用する場合は以下のようになる。

% pLaTeX 文書, 文字コードは UTF-8; -shell-escape 指定が必要
\documentclass[a4paper]{article}
\usepackage{CJKutf8,CJKspace,CJKpunct}
\usepackage[byte]{pxfltsrc}
\filterstart % これ以降のソースの和文文字を無効化する
\filterinput % 以後に読み込まれるファイルの和文文字を無効化する
\begin{document}
\begin{CJK*}{UTF8}{gbsn}
用 CJK 宏包和 p{\LaTeX} 可以写中文!
\end{CJK*}
\end{document}

この場合、コンパイル時にシェル機能を有効にする(-shell-escape)必要がある。(だから Cloud LaTeX ではこの方法は使えない。)

※なお、Cloud LaTeX が前出の①や②の問題に関してどのような対策を施しているか(あるいはそもそも何の対策もしてなくて失敗するのか)については、自分は調査していない。

*1:非 ASCII 文字について、CJK パッケージが予定通り処理するためには、文字が「欧文扱い」であることが前提にある。

*2:upLaTeX と LuaLaTeX のサポートが(近い将来に?)予定されているようである。

*3:LaTeXpLaTeXカーネルの差異により、欧文 LaTeX でのコンパイル結果と全く同一にならない可能性はある。

*4:懐かしいね……。