Hatena::ブログ(Diary)

マクロツイーター このページをアンテナに追加 RSSフィード Twitter

2016-06-27

(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}
f:id:zrbabbler:20160627001641p:image

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

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

中国語フォントがアレ

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

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

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

f:id:zrbabbler:20160627004058p:image

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

f:id:zrbabbler:20160627004057p:image

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

f:id:zrbabbler:20160627010824p:image

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

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

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

欧文 LaTeX でのコンパイルを前提とした文書を upLaTeX でコンパイルしたい場合は、プレアンブルの先頭*3\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}
f:id:zrbabbler:20160627020833p:image

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

pLaTeX な場合は

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

% 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:要するに CJK 文字が出現するより前。もし文書クラスの実装の中に CJK 文字が含まれるのであれば、\documentclass 命令の前に書く。

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

*5:懐かしいね……。

ttkttk 2016/06/27 22:10 私の記憶が正しければ、upTeXエンジンで --kanji-internal=euc なり --kanji-internal=sjis とすれば、 \disablecjktoken が使えてほぼ完全に pTeX エンジン互換の動作をするようにしてあったはずです。その上で pLaTeX も動くはずと思います。

zrbabblerzrbabbler 2016/07/02 15:10 原理的にはできそうなんですが、でもこの方法だとフォーマット作製が必要になりそうですね……。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証