ZXjatype パッケージ ~XeLaTeX でまともな日本語組版を~ [電脳世界の奥底にて]

ZXjatype パッケージ
~XeLaTeX でまともな日本語組版を~

ZXjatype は XeLaTeX で日本語の標準的な組版を行うためのパッケージであり、 pTeX に匹敵する品質を得ることを目指している。 ここでは ZXjatype の基本的な使用法を解説する。
※ XeTeX による日本語組版に関する現状をまとめた文書 「XeLaTeX で日本語する件について」 も併せて参照するとよいかもしれない。
変更履歴
  • 2012/09/12: ZXjatype 0.6 版。 xeCJK 3.x 版に対応した。 ただし実装上の制限のため、 日本語に特化した一部の調整を廃止しているので、 以前のものと同じ結果にならない。
  • 2012/05/01: ZXjatype 0.5 版。 「行頭禁則仮名 + 開き括弧」の間の空白が入らない不具合を修正した。
  • 2010/08/14: ZXjatype 0.4 版。 xeCJK の新しい版での動作の違いの解説を加筆。

概要

XeTeX には日本語 (および他の CJK 言語) の空白調整をマクロレベルで容易に行うための機能 (文字間トークン自動挿入機能)が備わっている。 これを利用した CJK 言語の組版用のパッケージとしては、 xeCJK パッケージ (作者は Sun Wenchang(孫文昌)氏; 現在は ctex のチームによりメンテナンスされている) が有名である。 zxjatype パッケージは、 xeCJK パッケージの提供する機能を利用して日本語の組版に適した環境を実現する。

注意: xeCJK の 2.x → 3.x 版の改訂において、 コードが全面的に書き直された。 (新しいコードは expl3 の言語で書かれている。) これにより、xeCJK の内部構造に依存している zxjatpye も書き直す必要が生じたが、 zxjatype の改訂(0.6 版)にあたっては、 xeCJK の内部コードに依存しないような実装を行う方針に転換した (但し xeCJK の内部ロジックには依存する部分がある)。 この実装上の制限のため、 従来(0.5 版まで)行ってきた日本語用の調整の一部が改訂後は廃止されている。 その一番大きな点として 「句読点スタイル」 がある。 従来版では日本語用に特別に調整した句読点スタイル 「quasijis」 を新たに実装してこれを用いていたが、 この実装には xeCJK の内部コードへのパッチを必要とするので改訂版では実装されず、 代わりに xeCJK の本来の句読点スタイルの一つである 「fullwidth(全角式)」 を採用している。 (このため、 約物が並んだ箇所での空き量が JIS X 4051 の理想とする値からずれることがある。 差は小さいのであまり目立たないと思われるが。)

また、 zxjatype の 0.6 版以降を xeCJK の 2.x 版とともに用いた場合は zxjatype は 0.5 版の動作になることに注意されたい。 これは、 新しい zxjatype の実装は旧来の 2.x 版の xeCJK では動作しないので、 zxjatype において従来の 0.5 版のコードもそのまま残していて、 必要に応じてそちらを用いるように切替を行っているからである。

以下の説明では、xeCJK 3.x 版/zxjatype 0.6 版以降のことを「新版」、xeCJK 2.x 版/zxjatype 0.5 版のことを「旧版」と呼ぶ。

構成パッケージ一覧

  • zxjatype パッケージ: 本体

対応環境

  • TeX 処理系: XeLaTeX (XeTeX 0.9995 版 [2009/06/28] 以降)
  • 前提パッケージ: xeCJK
    zxjatype パッケージは xeCJK の内部構造に深く依存しているので、 xeCJK の版によって正常動作しない可能性がある。 以下に当方で動作を確認した組み合わせを挙げておく。 (これらの xeCJK の版は CTAN に公開されたことのあるものである。)
    • xeCJK 2.3.5 版 [2009/08/02] ― zxjatype 0.3, 0.4 版
    • xeCJK 2.3.10 版 [2009/09/30] ― zxjatype 0.3, 0.4 版
    • xeCJK 2.3.15 版 [2010/05/31] ― zxjatype 0.3, 0.4 版
    • xeCJK 2.3.19 版 [2011/05/01] ― zxjatype 0.4 版
    • xeCJK 2.4.4 版 [2011/09/17] ― zxjatype 0.4, 0.5, 0.6 版
    • xeCJK 2.4.5 版 [2012/01/31] ― zxjatype 0.5 版
    • xeCJK 3.0.8 版 [2012/07/20] ― zxjatype 0.6 版
参考: CTAN に過去に公開されたことのある xeCJK の旧版のアーカイブ (2.4.4 版以降) は CTAN-HG のサイトで入手できる。 ただし、xeCJK 自体に 「xeCJK → fontspec → expl3」 のような依存関係があるので、 xeCJK だけ古い版に差し替えても正常に動作しない可能性が高い。 (2012 年 7 月に expl3 の大きな改訂が行われているので、これより前に戻るのが難しい状況である。)

ダウンロード

github のページから ZIP アーカイブがダウンロードできる。

「奥底の倉庫」に旧版が置いてある。

基本的な使用方法

プレアンブル

普通のパッケージの同様に、プレアンブルに

\usepackage[<オプション>,...]{zxjatype}

を書くことで読み込む。 この際に、xeCJK が未読込である場合は読み込む。 (さらに、xeCJK は fontspec を読み込む。) オプションについては後で解説するが、 標準的な使用法では指定しなくてよい。

参考: 旧版で存在した、XeTeX の古い版に対応するための oldxetex オプションは新版では廃止された。 (従って、新版は 0.9995 版以降の XeTeX の使用を必須とする。)

xeCJK/zxjatype 機能一覧(新版)

xeCJK では「CJK 文字」と「それ以外の文字」で処理を分別するが、 ここでは便宜的に、 前者を「和文」、 後者を「欧文」と呼ぶ。

★ 印を付したものは zxjatype で追加された機能、 ☆ 印を付したものは zxjatype で動作に変更がある xeCJK の機能である。 それ以外は xeCJK 単体と同じ動作になる。

基本

  • \setCJKmainfont[<属性リスト>]{<ファミリ名>}
    \setCJKsansfont[<属性リスト>]{<ファミリ名>}
    \setCJKmonofont[<属性リスト>]{<ファミリ名>} : それぞれ、総称ファミリ \rmfamily\sffamily\ttfamily が指定されている場合の和文フォントファミリを指定する。 属性リストとファミリ名の指定は fontspec の \setmainfont 等の命令と同じ。 zxjatype では \setjafontscale の指定が有効になる。
  • \setCJKfamilyfont{<CJKファミリ名>}[<属性リスト>]{<ファミリ名>} : 総称ファミリ以外での和文用ファミリの定義。 <CJKファミリ名> はユーザが自由に決める名前で、 \CJKfamily 命令で使用する。 zxjatype では \setjafontscale の指定が有効になる。
  • \setjamainfont\setjasansfont\setjamonofont\setjafamilyfont : それぞれ対応の \setCJK...font 命令と同義。
  • \CJKfamily{<CJKファミリ名>}\setCJKfamilyfont で定義したファミリに、和文フォントを切り替える。 なお、欧文部分のフォントの切り替えは従来どおり fontspec の命令を用いる。
  • \jafamily\CJKfamily と同義。
  • \setjafontscale{<値>} : 和文フォントに対するスケール(fontspec の属性 Scale)を指定する。 値を省略(空に)することもできて、この場合スケール設定は行われない。
    参考: 「ファミリ定義命令のオプション指定」 → 「\setjafontscale での指定」 → 「\defaultCJKfontfeatures での指定」 の順番に優先される。
  • \xeCJKsetup{<キー>=<値>,...}: xeCJK のパラメタ設定。 有効な設定項目の一部を以下に示す。 (真理値は truefalse で指定する。)
    • xeCJKactive = <真理値> : xeCJK の動作を有効にするか。 false にすると xeCJK は (zxjatype も) 全く作動しなくなり、 結果的に入力文字が全て欧文として扱われる。 既定値は true。
    • CJKglue = <LaTeXテキスト> : 和文間空白の設定。 引数に書くのは \hspace{0pt plus 0.1em} 等の(空白を入れる為の)LaTeX 命令である。 xeCJk での既定値は \hspace{0pt plus 0.08\baselineskip}。 zxjatype での既定値は \hspace{0pt plus 0.08\baselineskip minus 0.008\baselineskip}
    • CJKecglue = <LaTeXテキスト> : 和欧文間空白の設定。 引数に書くのは(空白を入れる為の)LaTeX 命令である。 xeCJk での既定値は { } (欧文空白)。 zxjatype での既定値は \hspace{0.25em plus 0.15em minus 0.05em}
  • 以下の命令が旧版との互換性のために残されている。
    • \makexeCJKactive\xeCJKsetup{xeCJKactive=true} と同じ。
    • \makexeCJKinactive\xeCJKsetup{xeCJKactive=false} と同じ。
    • \CJKsetecglue{<テキスト>}\xeCJKsetup{CJKecglue=<テキスト>} と同じ。
  • \CJKecglue : 和欧文間空白を出力する。 通常、和文と欧文が隣接している場合には和欧文間空白が自動的に挿入されるが、 これが働かない場合がある。 その場合にはこの命令を書く必要がある。
  • \> : 非数式モードでは \CJKecglue と同義になり、 数式モードでは LaTeX 本来の意味になる。 (他のパッケージによる再定義が行われていない場合に限り、 再定義が行われる。)
  • \inhibitglue : その箇所において和文文字間に自動的に入る空白を抑制する。
  • \<\inhibitglue と同義。 (他のパッケージによる定義が行われていない場合に限り、 定義が行われる。)

和文処理を無効化する

一時的に zxjatype が行う和文処理(空きの調整と和欧文のフォント切替) を無効にした状態でテキストを出力するための命令である。

  • \textrawen{<テキスト>}: 和文処理を無効化し、欧文フォントで <テキスト> を出力。
  • rawentext 環境: \textrawen の環境版。
  • \textrawja{<テキスト>} 和文処理を無効化し、和文フォントで <テキスト> を出力。
  • rawjatext 環境: \textrawja の環境版。
\documentclass[a4paper]{bxjsarticle}
\usepackage{zxjatype}
\setmainfont{Palatino Linotype} % 欧文の \rmfamily
\setjamainfont{IPA明朝}         % 和文の \rmfamily
\begin{document}
% zxjatype では〈’〉は和文扱いされるので、欧文として出力するために \textrawen が必要
% (注意: ソース上では〈’〉の後に空白文字はない)
L’un l’autre / \textrawen{L’un l’autre} / \textrawja{L’un l’autre}
\end{document}

xeCJK/zxjatype 機能一覧(旧版)

新版との違い

  • \setjascale の設定が有効になるのは、 \setja...font で指定した場合に限り、 xeCJK 本来の \setCJK...font での指定には効かない。
  • \setjascale で引数を空にする指定法がない。 スケールの既定値(他で変更が行われない場合)は 1 である。
  • \xeCJKsetup 命令は存在しない。 \CJKsetecglue 命令等を使う必要がある。 なお、「和文間空白」の量を変更したい場合は、 \CJKglue というマクロを \renewcommand で再定義する。

verbatim 出力の和欧文の切替

(旧版のみで利用可能な機能。)

verbatim 出力(\verbverbatim 環境) の中でも和文処理は無効になる。 既定では verbatim 出力は和文フォントが使われるが、 これを欧文フォントに切り替えることができる。

  • \javerbatim: 以降の verbatim 出力を和文フォントで行う。 (こちらが既定)
  • \nojaverbatim: 以降の verbatim 出力を欧文フォントで行う。
\documentclass[a4paper]{bxjsarticle}
\usepackage{zxjatype}
\setmonofont{Courier New}   % 欧文の \ttfamily
\setjamonofont{IPAゴシック} % 和文の \ttfamily
\begin{document}
\begin{itemize}
\item \nojaverbatim \verb|Давно не видились, \XeTeX!|
\item \javerbatim \verb|やっとかめ、\XeTeX!|
\end{itemize}
\end{document}

改行・空白文字の扱い

(この節の内容は古くなっている。)

zxjatype での改行および空白文字(半角空白文字とタブ文字) の扱いは xeCJK のそれに従うが、 xeCJK の版によって微妙に違っている。 普通の欧文 LaTeX との違いを述べると以下のようになる (なお、xeCJK 非読込の XeLaTeX は従来の欧文 LaTeX と全く同じになる ことを念のため注意しておく)。

  • xeCJK 2.3.5 版では、和文(CJK)文字の直後にある改行・空白文字による空白が抑止される。 欧文(非 CJK)文字の直後の空白は保持される。
  • xeCJK 2.3.10 版以降では、和文文字同士の間にある改行・空白文字による空白が抑止される。 和文と欧文の間の空白が保持されることが 2.3.5 版と異なる。
  • 「空白文字の無視」を行った上で、もし和文と欧文が隣接する場合には和欧文間空白 (\CJKecglue)が入る。
  • 空白文字が無視される箇所で、欧文空白を入れたい場合は〈\ 〉命令 (\ + 半角空白)を用いる。

なお、いずれの場合も「改行は空白文字と全く同じ扱い」であり、 pLaTeX のように「改行だけ特別扱い」になることはないことにも注意を要する。 以下では、pLaTeX ユーザに対して、特に注意する点を述べることにする。 なお、pLaTeX のソースにおいて、和欧文間の半角空白文字を (A) のように 入れない人と (B) のように入れる人がいる。 どちらであるかによって特に注意すべき点が異なる。

(A) 和欧文間に半角空白なし (B) 和欧文間に半角空白あり
XeTeXは
Jonathan Kew%
が開発した
Unicode対応
のTeXです。
XeTeX は\ 
Jonathan Kew
が開発した\ 
Unicode 対応
の TeX です。

「区別しない」という逃げ道

改行・空白文字に関わる煩わしさを避ける一つの方策として 「和欧文間空白を欧文空白と同じにする」という設定がある。 xeCJK の場合、次の命令を実行することでこの設定が簡単に実現できる。

\CJKsetecglue{ }      % { } の中は半角空白

この設定の利点は、和文欧文間の改行・空白文字の有無および 有効無効に気を遣う必要が全くなくなることである。

% こんな風に書いても全く問題なし
% 和欧文間には「欧文空白と同じ幅の空白」が入る
XeTeXは
Jonathan Kew
が開発した
Unicode対応
の TeX です。

特に (B) の書き方をしている人は、 「和欧文間空白を欧文空白と同じにする」ことを意図しているはずなので、 この設定は「逃げ道」ではなくむしろ合理的である。 (A) の書き方の人も、 「欧文空白が狭い(四分程度である)」欧文フォントを上手く選べば、 この設定を使うことが可能であると思われる。

逃げたくない人は

(A) の書き方をしていて、 また前述の「逃げ道」を採らない場合の注意点を述べる。

  • xeCJK 2.3.5 版: pLaTeX との違いは、和文文字の直後で改行だけでなく空白文字も 無視されることである。 (A) の人は和文文字の後に空白文字を書くことがほとんどないので 影響が少ない。 (この仕様のもとで (B) の書き方をするのは現実的でない。)
  • xeCJK 2.3.10 版以降: pLaTeX との違いは、和文文字と欧文文字がこの順で並ぶ場合に、 間に改行を入れると、結果として和欧文間空白でなく欧文空白が入ることである。 (和文間の空白文字が無視されるという違いもあるが、この組み合わせは実際には まず起こらない。) 改行を入れる前と同じ結果にしたい場合は、% で改行を 無効化する必要がある。 (この仕様では、逆に (B) の書き方の場合に修正がほとんど要らなくなる。)
    % xeCJK 2.3.10 版以降で (A) と同じ結果を得たい場合
    XeTeX は
    Jonathan Kew%    この % が要るのは pLaTeX と同じ
    が開発した%      さらにこの行でも % が必要
    Unicode 対応
    の TeX です。
    
参考: 全ての組み合わせについての結果を表にまとめると以下のようになる。
  #=なし #=半角空白 #=改行
  pltxcOxcN pltxcOxcN pltxcOxcN
欧文#欧文 000 333 333
欧文#和文 222 [3][3][3] 333
和文#欧文 222 [3][2][3] 223
和文#和文 111 (3)(1)(1) 111
plt = pLaTeX; xcO = xeCJK 2.3.5 版; xcN = xeCJK 2.3.10 版以降
0 = 空白なし; 1 = 和文間空白; 2 = 和欧文間空白; 3 = 欧文空白
(x) : 普通は和文文字間には空白文字を入れない
[x] : (A) の書き方の場合はこの組み合わせは起こらない

和文の約物の間の改行・空白文字

和文の間の改行・空白文字は無視されるのが原則であるはずだが、 和文の約物(句読点や括弧)の間についてはそうでない場合があり、 また xeCJK の版間で仕様が安定していないようにみえる (2.3.10 版と 2.3.15 版の間でも異なるケースがある)。 従って、約物の間に改行・空白文字を入れるのは避けた方が 無難である。 すなわち、約物の間において、 本当に欧文空白を入れたいのであれば〈\ 〉命令を用い、 また「ソース上で改行を入れたい」のであれば改行を % で 無効化しておくといいであろう。

注意事項

  • zxjatype 使用時には、和文文字の直後にある改行や空白文字による空白が抑止される。 (その上で、もし和文と欧文が隣接する場合には和欧文間空白が入る。) 和文文字の後に欧文空白を入れたい場合は〈\ 〉命令 (\ + 空白)を使えばよい。 これに対して、欧文文字の後の空白は保持される。

    従って、普段 pLaTeX 文書で和欧文間に空白を書かない方式を採っている人は、 和文後で改行だけでなく「空白文字」も無視されることを除けばそのままの書き方が可能である。

    XeTeXは
    Jonathan Kew%   この % が要るのは pLaTeX と同じ
    が開発した
    Unicode対応
    のTeXです。
    % 和文と欧文の間に和欧文間空白が自動挿入される。
    

    これに対して、pLaTeX 文書で和欧文間に欧文空白を書く方式を採っている人は、 和文後の空白が無視されることの影響を受ける。

    日本語で XeTeX しよう!
    

    この場合、「XeTeX」の前は空白文字が無視されるので和欧文間空白となり、 一方「XeTeX」の後はそのまま欧文空白が出力されるのでアンバランスになってしまう。 このような書き方をしている場合は和欧文間の空白を欧文空白と同じにしたい ということであろうから、\CJKecglue{ } を指定すればよい。

  • zxjatype(xeCJK)では Unicode 文字を和文(CJK)文字と欧文文字に分類していて、 和文と欧文でフォントを切り替えている。 和文文字とみなされるのは、符号位置 U+2000~U+FFFF の文字および第 2 面(SIP) にある漢字である。
  • 残念ながら、現状では zxjatype(xeCJK)の機能の有効・無効を切り替える 機構は用意されていない。 現在検討中である。
    参考: 基本的には、\XeTeXinterchartokenstate の値を設定すればよい のであるが、現状の実装では、実装の中身を知らずに下手に値を変えると 異常動作する可能性がある。 段落の外であれば大丈夫だと思われる。

高度な使用方法

パッケージオプション

パッケージオプション、すなわち zxjatype の読込の \usepackage 命令のオプションに書くもの。

zxjatype のパッケージオプション

  • default (既定): パッケージ読込直後に日本語用の設定への切替を行う。 すなわち \zxjapanesestyle を実行する。
  • nodefaultdefault の否定。 xeCJK の初期設定が保持される。
  • CJKchecksingle (既定): xeCJK の文字ウィドウ抑制機能を有効にする。
  • noCJKchecksingle : xeCJK の文字ウィドウ抑制機能を無効にする。
    注意: xeCJK の既定ではウィドウ抑制機能は無効で、(xeCJK の)パッケージオプション CJKchecksingle でこの機能が有効になる。 (新版では途中で設定を変更できる。) zxjatype では CJKchecksingle を既定としたため、 否定のためのオプション no~ を用意している。
  • adjustcharclass (既定;新版のみ): 小書き仮名文字の属する xeCJK の文字クラスを 「閉じ括弧類」 から 「通常 CJK 文字」 に変更する。
  • noadjustcharclass (新版のみ): adjustcharclass の否定。 xeCJK の文字クラス設定を変更しない。
    参考: 小書き仮名文字を「閉じ括弧類」にしているのは行頭禁則の対象とするためであるが、 この扱いには副作用があって、 直後に約物がある場合の空きが不正になる (約物が並んでいると解釈されるため)。 旧版(0.5 版)では個別の処理を施してこの副作用を解消していた。 しかし、新藩では実装の制限でそれができないので、 通常の文字扱いに変えて (つまり行頭禁則も放棄して) 不正な空きの問題を解消している。
  • 上記以外で xeCJK の有効なオプションを指定すると、 内部で xeCJK を読み込む時にそれが渡される。 (xeCJK が未読込の場合に限る。)

xeCJK のパッケージオプション(抜粋)

  • CJKchecksingle : 文字ウィドウ抑制機能を有効にする。
  • nospace (既定): 和文文字間の空白文字を無視する。
  • space : 和文文字間の空白文字を保持する。
  • fallback : 和文文字のフォールバック機能を有効にする。
  • 新版では、パッケージオプションにおいて \xeCJKsetup の引数の形式で設定を行うことができる。 例えば、CheckSingle = true を指定すると、 CJKchecksingle と同義になる。 互換性のために上掲のオプションも残されている。
  • 上記以外で fontspec の有効なオプションを指定すると、 内部で fontspec を読み込む時にそれが渡される。 (fontspec が未読込の場合に限る。)

高度な命令

既に解説したもの以外の命令。

zxjatype の命令

  • \zxjapanesestyle : 日本語用の設定に切り替える。 この命令はユーザによる再定義(\renewcommand)が可能で、 既定の定義は以下の通り。
    (新版)
    \xeCJKsetup{
      AllowBreakBetweenPuncts = true,
      PunctStyle = fullwidth,
    }%
    \zxusejapaneseparameters
    
    (旧版)
    \punctstyle{quasijis}%
    \xeCJKallowbreakbetweenpuncts
    \zxusejapaneseparameters
    
  • \zxusejapaneseparameters: 和欧文間空白と和文間空白を日本語に適した値にする:
    和欧文間空白(CJKecglue) = 0.25em plus 0.15em minus 0.05em
    和文間空白(CJKglue) = 0pt plus .08\baselineskip minus .008\baselineskip
  • \zxuseoriginalparameters: 和欧文間空白と和文間空白を xeCJK の初期設定に戻す。

xeCJK の命令

  • \xeCJKsetup で指定する設定項目(新版のみ):
    • CJKspace=<真理値> : 和文文字の間の空白文字を保持するか。 既定は false。
    • CheckSingle=<真理値> : 文字ウィドウを抑止するか。 既定は false だが、zxjatype では true である。
    • AutoFallBack=<真理値> : 和文文字のフォールバック機能を有効にするか。
    • PunctStyle=<スタイル名> : 句読点スタイルを設定する。 zxjatype の旧版で新設された日本語用のスタイルの名前は quasijis である。 xeCJK で用意されたスタイルには fullwidth(または quanjiao;全角式)、 halfwidth(または hanjiao;半角式)、 mixedwidth(または kaiming;開明式)、 marginkerning(または hangmobanjiao;行末半角式) 等がある。 既定は fullwidth だが、zxjatype の旧版では quasijis である。
    • AllowBreakBetweenPuncts=<真理値> : 約物の間の行分割を許可するか。 (もちろん禁則に該当する場合は常に禁止される。) 既定は false(何故だろう?)だが、zxjatype では true である。
  • \CJKspace\punctstyle{CJKspace=true} と同義。
  • \CJKnospace\punctstyle{CJKspace=false} と同義。
  • \xeCJKenablefallback\punctstyle{AutoFallBack=true} と同義。
  • \xeCJKdisablefallback\punctstyle{AutoFallBack=false} と同義。
  • \punctstyle{<スタイル名>}\punctstyle{PunctStyle=<スタイル名>} と同義。
  • \xeCJKallowbreakbetweenpuncts\punctstyle{AllowBreakBetweenPuncts=true} と同義。
  • \xeCJKnobreakbetweenpuncts\punctstyle{AllowBreakBetweenPuncts=false} と同義。