マクロツイーター

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

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

前回の続き)

pLaTeX和文してしかも CJK パッケージしたい場合

ざんねんでした あきらめましょう

……というのが妥当なアドバイスだと思うが、イロイロ足掻いてみる。

うまくいきません

pxCJKutf8 自体は pLaTeX でも部分的に((つまり「\selectfont のパッチが衝突する」問題への対処は upLaTE))動作する。ただし pTeX では非対応な \disablecjktoken については「単にそれを実行しない」という仕様になっている。従って、例の「中国語の漢字が日本語扱いされる」という問題が発生することになる。

一見すると、「和文しない」の話で出てきたように、pxfltsrc パッケージの機能をもって \disablecjktoken を代用すればいいようにも見える。

% pLaTeX 文書, 文字コードUTF-8
\documentclass[a4paper]{jsarticle}
\usepackage{pxCJKutf8,CJKspace,CJKpunct}
\usepackage[byte]{pxfltsrc}% 和文の認識を無効化
\begin{document}
\filterstart

\begin{CJK*}{UTF8}{gbsn}
{\TeX} 语言很危险,别靠近!
\end{CJK*}

% 無効化されているので"pTeX和文"が失敗する!
{\TeX}言語危険、近づくな! % ダメ

\end{document}

しかし残念ながら今の場合はこの方法は通用しない。次のようなエラーが発生する。((“???”の部分は文字化けして、しかも示している符号位置が不正になっている(正しくは “言 (U+8A00)”のはず)。恐らく高位バイトを含む \the-文字列を生成しようとした時に一部のバイトが和文文字として解釈されたからと思われる。なおここに示した結果は内部漢字コードが sjis の場合のものである。))

! Package inputenc Error: Unicode char ??? (U+39EE00)
(inputenc)                not set up for use with LaTeX.

何故かというと、upLaTeX で pxCJKutf8 を用いた場合は \disablecjktoken は「CJK 環境の中だけで有効」になるのに対し、上掲のソースでは“和文の無効化”が \filterstart 以降の全体で有効になるからである。日本語の部分では「pTeX和文」で処理させるのが目的なので、ここでは和文認識が有効になっている必要がある。

別ファイルにすればうまくいく

残念ながら、一旦 \filterstart で開始した“和文の無効化”のフィルタの効果を途中で解除する機能は用意されていない。しかし、もし CJK 環境の部分のソースだけを別ファイルに分割された状態であれば、そこだけフィルタを適用することができる。ファイル入力に対するフィルタ適用は文書途中で自由に有効化(\filterinput)・無効化(\nofilterinput)できるからである。

[main.tex]
% pLaTeX 文書, 文字コードは UTF-8
\documentclass[a4paper]{jsarticle}
\usepackage{pxCJKutf8,CJKspace,CJKpunct}
\usepackage[byte]{pxfltsrc}% 和文の認識を無効化
\begin{document}
% \filterstart はしない

\filterinput    % ファイル読込でフィルタを有効化
\input{chinese.tex}% この中身だけ和文認識が無効になる
\nofilterinput  % ファイル読込でフィルタを無効化

% ここでは和文認識が有効
{\TeX}言語危険、近づくな!

\end{document}
[chinese.tex]
\begin{CJK*}{UTF8}{gbsn}
{\TeX} 语言很危险,别靠近!
\end{CJK*}

記事が完成しました。
しかし結局かなりアレな内容なので、やっぱり
ゆきだるま☃を見てお楽しみください。