CJK パッケージは欧文 (pdf)LaTeX で日本語(などの CJK 言語)を扱うものである。従って、元々日本語を扱うためのエンジンである (u)pLaTeX で CJK パッケージが入用になるという場合はほとんど考えられないだろう。実際には、CJK と (u)pLaTex の実装は共存できないことが知られている。
- CJK パッケージと pLaTeX / upLaTeX (アレForum)
ただし、(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 が前出の①や②の問題に関してどのような対策を施しているか(あるいはそもそも何の対策もしてなくて失敗するのか)については、自分は調査していない。