つまり、zxjatypeとzxjafontの解説であるが、その前に一つ重要な話。
はじめに:zxjatypeは(ずっと昔から)壊れている
zxjatypeの本来の主要機能は「少なくともpLaTeXと同等の品質の日本語組版をXeLaTeX上で実現すること」だった。しかし、その主要機能については
もう何年も前から“壊れている”状態
にある。詳細については以下のツイッタァーのスレッドを参照されたい。
zxjatypeパッケージの目的は
— 某ZR(ざんねん🙃) (@zr_tex8r) 2019年8月9日
「xeCJKを基にして日本語の行組版規則を実現する」
ことだけど、その肝心要の機能については現状“壊れている”んだよな。それももう7年前(0.6版)から。#TeX #LaTeX #XeLaTeX
これが意味するところは、「日本語文書用のLaTeXについて、本来ならばXeLaTeXも(pLaTeX/upLaTeX/LuaLaTeXと同列の)“主要な”エンジンの地位を得ているべきであるが、残念ながら現状はそうなっていない」ということである。
もちろん、何か理由があってどうしてもXeLaTeXで日本語文書を作る必要があるのなら、その場合の最善策としてzxjatypeは十分に機能するはずであり、その意味で現状のzxjatypeにも存在意義はあるといえる。ただ、この状況は「pdfLaTeXのbxcjkjatypeパッケージ」と同じということになる。つまり、“日本語LaTeX”としてXeLaTeXはLuaLaTeXと同じ地位を得るべきところがpdfLaTeXと同じ地位に甘んじているというわけである。
zxjatype、または“XeLaTeXで日本語”をどうにかしてほしい件
ネットを見る限りでは「XeLaTeXを日本語LaTeXの主流の選択の一つにしたい」という要望は存在する。というわけでここでお願い。
だれか「XeLaTeXでまともに日本語するやつ」をつくってください。
実装の形については、zxjatypeの改良でも新しいパッケージの作製でもよく、またxeCJKを土台にするものでもしないものでも構わない。とにかく、pTeXの品質以上で基本的な日本語の行組版ができる実装があってほしいと思う。
新しいzxjatype(0.7版)の機能を語ってみる
従来の0.6版の機能については以下の記事が参考になる。
小書き仮名で禁則する話
現状のzxjatypeの既定の設定においては、小書き仮名は行頭禁則処理の対象にならない。
\documentclass[autodetect-engine,ja=standard,a4paper]{bxjsarticle} \begin{document} \parbox{21\zw}{% 寿限無寿限無五劫の擦り切れ海砂利水魚の水行末雲来末風来末 食う寝る処に住む処藪ら柑子の藪柑子 パイポパイポパイポのシューリンガンシューリンガンのグーリンダイ グーリンダイのポンポコピーのポンポコナーの長久命の長助 } \end{document}
例えばこのソースをuplatexでコンパイルすると以下の出力が得られるのに対して:
同じソースをxelatexでコンパイルすると以下のようになる:
なりゆきで改行すると小書きの「ュ」の前に改行位置がくることになるが、upLaTeXではここで(緩い1)禁則が適用されて前の「シ」が追い出される。ところがxelatexでは禁則がないため「ュ」の直前で実際に改行が起こる。
zxjatypeにkanakinsoku
オプションを指定すると、小書き仮名に対して(完全な)禁則が適用される。したがって、先ほどのソースでこのオプションを追加すれば、小書きの「ュ」の前での行分割が起こらなくなる。
% グローバルで指定したkanakinsokuがzxjatypeに渡される \documentclass[autodetect-engine,ja=standard,kanakinsoku, a4paper]{bxjsarticle} \begin{document}
この場合、結果的にuplatexのときと同一の出力が得られる。
でも小書き仮名で禁則するとアレ
しかし、このkanakinsoku
オプションには重大な副作用がある。小書き仮名に対する行頭禁則は、内部で「小書き仮名を閉じ括弧類として扱う」ことで実現している。このため、小書き仮名と約物が並んでいると「約物同士が隣接している」と見なされて空きの調節が行われてしまうのである。これは慣習的な日本語の行組版規則に反していて好ましくない。
\documentclass[autodetect-engine,ja=standard,kanakinsoku, a4paper]{bxjsarticle} \begin{document} ベジエ(Bézier)曲線\par ベジェ(Bézier)曲線\par \end{document}
この不具合を回避するには、小書き仮名と約物の間に空のボックスを挿入する必要がある。
ベジェ\mbox{}(Bézier)曲線\par
kanakinsoku
にはこのような副作用があり、また小書き仮名の行頭禁則は一般的に必須のものとは考えられていないという事情があるため、既定で有効にはなっていない。
まとめ:“(no)kanakinsoku”オプション
adjustcharclass
が有効である(既定値)場合に以下のオプションが有効になる(0.6b版以降):kanakinsoku
: 小書き仮名に対して(完全な)行頭禁則を適用する。nokanakinsoku
(既定):kanakinsoku
の否定。小書き仮名を行頭禁則から外す。
adjustcharclass
が無効の場合はxeCJKの既定設定がそのまま適用される。
※xeCJKの既定における小書き仮名の禁則の設定は、昔の版ではkanakinsoku
相当であったが、2016年頃にnokanakinsoku
相当のものに変わっている。
“(no)useinhibitglue”オプション
現状の\inhibitglue
の実装は問題があるので、0.6b版以降では既定で無効になっている。これを有効にするにはuseinhibitglue
オプションの指定が必要である。
useinhibitglue
:\inhibitglue
の実装を提供する。nouseinhibitglue
:useinhibitglue
の否定。この場合、\inhibitglue
は何もしない命令になる。
和文で☃とかする話
先述の通り、zxjatypeではxeCJKの“文字クラス”の設定を多少変更している。しかし、「文字が和文(CJK)か欧文か」の区別に関してはxeCJKの既定の設定をそのまま踏襲している。それに従うと、(u)pLaTeXやLuaTeX-jaよりも「欧文扱い」される文字が増えることになる。
例えば、次のような「☃」や「♪」の記号を含んだ文書ソースがあったとする。
\documentclass[autodetect-engine,ja=standard,jafont=haranoaji, a4paper]{bxjsarticle} \begin{document} ☃っ☃☃☃っ☃っ☃~~♪ \end{document}
LuaTeX-jaの既定ではこれらの記号は和文扱いになるため、和文フォント(原ノ味明朝)で出力される。
ところがxeCJKの既定ではこれらの記号は欧文扱いになる。現在の欧文フォント(Latin Modern Roman)には「♪」の字形はあるが「☃」はないため、結果的に「☃」が出力されないという由々しき事態に陥ってしまう。
xeCJKの「和文扱いの範囲」に関するトラブルを軽減する目的で、0.7版でprefercjk
というオプションが導入された。このオプションを指定すると、「和文扱い」になる文字の範囲がLuaTeX-jaの既定により近いものに変更される2。
% グローバルで指定したprefercjkがzxjatypeに渡される \documentclass[autodetect-engine,ja=standard,jafont=haranoaji, prefercjk,a4paper]{bxjsarticle} \begin{document} ☃っ☃☃☃っ☃っ☃~~♪ \end{document}
まとめ:“(no)prefercjk”オプション
0.7版以降で追加された。
prefercjk
:「和文扱いの文字」の範囲をLuaTeX-jaのそれに近づける。noprefercjk
(既定):prefercjk
の否定。xeCJKの既定に従う。
※このオプションは実験的で、仕様は将来変更される可能性がある。
その他もろもろ
- xeCJKの2.x版の使用を非推奨とした。2.x版のサポートは将来廃止される予定。
- ちなみに、xeCJKの3.0版がリリースされたのは2012年5月。
(つづけ)