マクロツイーター

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

zxjaナンチャラの現状について語ってみる(1)

つまり、zxjatypezxjafontの解説であるが、その前に一つ重要な話。

はじめに:zxjatypeは(ずっと昔から)壊れている

zxjatypeの本来の主要機能は「少なくともpLaTeXと同等の品質の日本語組版を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でコンパイルすると以下の出力が得られるのに対して:

f:id:zrbabbler:20200209210949p:plain
upLaTeXでの組版結果

同じソースをxelatexでコンパイルすると以下のようになる:

f:id:zrbabbler:20200209211013p:plain
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}

f:id:zrbabbler:20200209220040p:plain
小書き仮名と括弧が並ぶとアレ

この不具合を回避するには、小書き仮名と約物の間に空のボックスを挿入する必要がある。

ベジェ\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の実装を提供する。
  • nouseinhibitglueuseinhibitglueの否定。この場合、\inhibitglueは何もしない命令になる。

和文で☃とかする話

先述の通り、zxjatypeではxeCJKの“文字クラス”の設定を多少変更している。しかし、「文字が和文(CJK)か欧文か」の区別に関してはxeCJKの既定の設定をそのまま踏襲している。それに従うと、(u)pLaTeXやLuaTeX-jaよりも「欧文扱い」される文字が増えることになる。

例えば、次のような「☃」や「♪」の記号を含んだ文書ソースがあったとする。

\documentclass[autodetect-engine,ja=standard,jafont=haranoaji,
    a4paper]{bxjsarticle}
\begin{document}
☃っ☃☃☃っ☃っ☃~~♪
\end{document}

LuaTeX-jaの既定ではこれらの記号は和文扱いになるため、和文フォント(原ノ味明朝)で出力される。

f:id:zrbabbler:20200210080421p:plain
LuaLaTeXでの組版結果(素敵)

ところがxeCJKの既定ではこれらの記号は欧文扱いになる。現在の欧文フォント(Latin Modern Roman)には「♪」の字形はあるが「☃」はないため、結果的に「☃」が出力されないという由々しき事態に陥ってしまう。

f:id:zrbabbler:20200210080441p:plain
XeLaTeXでの組版結果(ざんねん)

xeCJKの「和文扱いの範囲」に関するトラブルを軽減する目的で、0.7版でprefercjkというオプションが導入された。このオプションを指定すると、「和文扱い」になる文字の範囲がLuaTeX-jaの既定により近いものに変更される2

% グローバルで指定したprefercjkがzxjatypeに渡される
\documentclass[autodetect-engine,ja=standard,jafont=haranoaji,
    prefercjk,a4paper]{bxjsarticle}
\begin{document}
☃っ☃☃☃っ☃っ☃~~♪
\end{document}

f:id:zrbabbler:20200210082539p:plain
XeLaTeXでの組版結果(素敵)

まとめ:“(no)prefercjk”オプション

0.7版以降で追加された。

  • prefercjk:「和文扱いの文字」の範囲をLuaTeX-jaのそれに近づける。
  • noprefercjk(既定): prefercjkの否定。xeCJKの既定に従う。

このオプションは実験的で、仕様は将来変更される可能性がある。

その他もろもろ

  • xeCJKの2.x版の使用を非推奨とした。2.x版のサポートは将来廃止される予定。
    • ちなみに、xeCJKの3.0版がリリースされたのは2012年5月。

(つづけ)


  1. (u)pTeXやLuaTeX-jaの既定で適用されている禁則処理は「行分割を完全に禁止はしないが、周りの状況が許す限りは当該の行分割を回避する」という性質のものであり、「禁則を適用すると逆に醜い出力になってしまう」場合には敢えて禁則が無視される。それに対して、zxjatypeのkanakinsokuが提供する禁則処理では禁則位置での行分割は完全に禁止される。

  2. ただしギリシャ文字キリル文字は敢えて「欧文扱い」のままにしている。