マクロツイーター

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

メモ:xeCJKの空白関連のパラメタ

xeCJKパッケージの動作設定命令(\xeCJKsetup)のオプションキーのうち、「空白の設定」に関するものについて、チョット調べてみた。

※ただし「句読点スタイル()」に関するもの(PunctStyleなど)は除く。

※XeTeXでは(元祖TeXと同様に)空行にならない改行は常に空白文字と同等に扱われる。(u)pTeXのような「改行を特殊に扱う規則」を実装することは不可能である1

マニュアルの記述

f:id:zrbabbler:20200517035124p:plain

……チョット日本人には解りにくいね。

日本語でおk

  • CJKspace[真偽値;省略時=true2;既定値=false]

    • false: CJK文字同士の間の空白文字を無視する。
    • true: CJK文字同士の間の空白文字は欧文空白になる。
  • CJKglue[テキスト;既定値={\hskip 0pt plus 0.08\baselineskip}] CJK文字間に挿入する空きを生成する命令を指定する。両端寄せを行うため、このオプションを設定する場合は伸縮する空きを設定すべきである。

  • CJKecglue[テキスト;既定値={ }(欧文空白)] CJK文字と欧文、およびCJK文字と数式の間の空きを生成する命令を指定する。このオプションを設定する場合は伸縮する空きを設定すべきである。注意すべき点として、この設定はxeCJKが自動的に挿入する空きにのみ影響し、CJK文字と欧文の間に明示的に入れた空白文字の出力には影響しない。空きの自動挿入はうまく機能しない場合があり、そのときは手動で空白文字を入れる必要がある。

  • xCJKecglue[真偽値またはテキスト;省略時=true;既定値=false]

    • false: CJK文字と欧文の間に明示的に入れた空白文字をそのまま欧文空白といて出力する。
    • true: CJK文字と欧文の間に明示的に入れた空白文字について、その箇所が「CJKecglueの空白」が入るべきである場合に、欧文空白でなく「CJKecglueの空白」として出力する。
    • テキスト: xCJKecglue=trueCJKecglue=テキストを設定するのと等価になる。

  1. LuaTeXでは(近似的であるが)「改行を特殊に扱う規則」が実装可能であり、実際にLuaTeX-jaは(u)pTeXと同様の規則を採用している。

  2. つまり\xeCJKsetup{CJKspace}\xeCJKsetup{CJKspace=true}と等価になるということ。一度も\xeCJKsetupCJKspaceを設定しなかった場合はCJKspaceはfalseと見なされる(これが「既定値」)。

BXjsclsが新しくなった(v2.0a)

2020-03-25にBXjsclsの新しいメジャーバージョンとなる2.0版がリリースされた。TeX Liveについては、2020-04-10にリリースされたTeX Live 2020の初期版が2.0版となる。現在の最新版は2.0a版である。

メジャー改版であるため後方互換性を損なう仕様変更が含まれる。注意してほしい。

※2.0→2.0a版の違いは、一部の非推奨機能への警告の追加のみである1

【仕様変更】LuaLaTeX/XeLaTeXで既定の和文フォントが「原ノ味フォント」に変わった

TeX Live 2020において、updmapでの和文(日本語)のフォントの既定値がipaexからharanoajiに変更された2。つまり、(u)pLaTeXの標準和文フォントとして使われる物理フォントが「IPAexフォント」から「原ノ味フォント」変わることになる。これに追随する形で、LuaTeX-jaにおける既定の和文フォントも「IPAexフォント」から「原ノ味フォント」に変更された。

そこで、BXjsclsクラスもこれに追随して、LuaLaTeX/XeLaTeX上の動作における既定の和文フォントを「IPAexフォント」から「原ノ味フォント」に変更することにした3

% LuaLaTeX文書; UTF-8
% フォント指定(jafont)が無い
\documentclass[lualatex,ja=standard,a4paper]{bxjsarticle}
\begin{document}
☃っ☃☃☃っ☃っ☃~~♪
\end{document}

フォント指定(jafontオプション)のない上掲の文書をlualatexでコンパイルした場合、旧版では「IPA明朝」で出力される。

f:id:zrbabbler:20200418211117p:plain
旧版での出力(IPAex明朝)

対して、新版(2.0版以降)では「原ノ味明朝」で出力される。

f:id:zrbabbler:20200418211258p:plain
新版での出力(原ノ味明朝)

なお、和文フォントのプリセットの種類はjafontで指定できるので、「IPAexフォント」で出力したい場合はクラスオプションにjafont=ipaexを指定すればよい。

% LuaLaTeX文書; UTF-8
%フォント指定(jafont=ipaex)がある
\documentclass[lualatex,ja=standard,jafont=ipaex,
    a4paper]{bxjsarticle}
\begin{document}
☃っ☃☃☃っ☃っ☃~~♪
\end{document}

LuaLaTeX・XeLaTeX以外の話

(u)pLaTeX上の動作の場合は、BXjsclsのクラスは和文フォント(のフォントマップ)の指定を何も行わず、従ってDVIウェアの設定(TeX Liveの場合はupdmapの設定)がそのまま適用される。従ってTeX Live 2020であれば、LuaLaTeX/XeLaTeXと同様に「原ノ味フォント」が使用される4

pdfLaTeXで和文を扱う場合は和文フォントを「Type1形式のサブフォント」として用意する必要がある。現状では「原ノ味フォント」のType1形式サブフォントは存在しないので、従来の「IPAexのType1形式サブフォント」(ipaex-type1パッケージ)が引き続き既定値として用いられる。

【仕様変更】\ifdraft が廃止された

開発者用命令5\ifdraftは1.2版(2016-08-01)において既に非推奨の扱いになっていたが、2.0版において廃止された。代わりの開発者用命令として\ifjsDraftが用意されているので、そちらを利用する必要がある。

※ユーザレベルで「draftモードであるかを判定したい」場合は、ifdraftパッケージの使用を推奨する。

\ifdraftはjsclassesの機能を継承したものであるが、本家のjsclassesにおいては\ifdraftは2016年7月に(非推奨ではなく)廃止されている。「ifdraftパッケージと衝突する」という問題があったためである。

【仕様変更】geometry 4.x版のサポートを廃止した

geometry 4.x版の使用は1.2版(2016-08-01)において既に非推奨となっていたが、2.0版ではgeometryの4.x版のサポートが廃止となり、5.0版(2010-02-12)以降が必須となる。

イロイロ非推奨になった

既に1.9版のリリースのときに予告されていたように、旧版との互換のための機能の多くが2.0版で非推奨の扱いとなった。(廃止ではない。)

“ja”オプションの省略は非推奨

エンジンが(u)pLaTeX以外の場合に和文ドライバ指定(jaオプション)を省略した場合はminimalが指定されていた。

% XeLaTeX文書; UTF-8
\documentclass[xelatex,a4paper]{bxjsarticle}
\usepackage{zxjatype}
\setCJKmainfont{IPAexMincho}
\setCJKsansfont{IPAexGothic}
\begin{document}
{\TeX}言語\textsf{危険}、ダメゼッタイ。
\end{document}

以前の版において既にjaオプションを明示することが“推奨”されていたが、2.0版において正式に、省略が非推奨となった。2.0a版においてはjaを省略すると以下のような警告が出る。

Class bxjsarticle Warning: The option 'ja' is MISSING!!
(bxjsarticle)              So 'ja=minimal' is assumed as fallback, but
(bxjsarticle)              such implicit setting is now DEPRECATED!
(bxjsarticle)              You should write 'ja=minimal' explicitly,
(bxjsarticle)              if it is intended.

以前の動作を保ちたい場合はja=minimalを指定すべきである。

% XeLaTeX文書; UTF-8
% 和文ドライバを明示的に指定する
\documentclass[xelatex,ja=minimal,a4paper]{bxjsarticle}
\usepackage{zxjatype}
\setCJKmainfont{IPAexMincho}
\setCJKsansfont{IPAexGothic}
\begin{document}
{\TeX}言語\textsf{危険}、ダメゼッタイ。
\end{document}

ただし実際には「minimalモード」ではなく「standardモード」を使う方が妥当6であることが多いはずである。今まで“ja無し”で使っていた人は「standardモード」への移行を検討してほしい。

% XeLaTeX文書; UTF-8
% standardモードの方が便利
\documentclass[xelatex,ja=standard,jafont=ipaex,a4paper]{bxjsarticle}
\begin{document}
{\TeX}言語\textsf{危険}、ダメゼッタイ。
\end{document}

※エンジンが(ujpLaTeXである場合はjaの既定値はstandardであり、この場合はjaの省略は非推奨ではない。

“dvipdfmx-if-dvi”オプションは非推奨 → “dvi=dvipdfmx”

現在のBXjsclsには「DVIモードでのみ適用されるドライバ指定」を行うためのdviオプションがあるが、昔はdvi=dvipdfmxに相当するdvipdfmx-if-dviというオプションが利用されていた。

% エンジン自動判別, DVIモード時はdvipdfmxドライバを指定
\documentclass[autodetect-engine,dvipdfmx-if-dvi,ja=standard]{bxjsbook}

dvipdfmx-if-dviは2.0版で非推奨の扱いとなり、2.0a版では警告が出る。

Class bxjsbook Warning: The old option 'dvipdfmx-if-dvi' is DEPRECATED
(bxjsbook)              and may be abolished in future!
(bxjsbook)              You should write 'dvi=dvipdfmx' instead.

代わりにdvi=dvipdfmxを指定すべきである。

% エンジン自動判別, DVIモード時はdvipdfmxドライバを指定
\documentclass[autodetect-engine,dvi=dvipdfmx,ja=standard]{bxjsbook}

その他もろもろ非推奨

以上に述べたものの他、以下のオプションが非推奨となる。

  • (no)js(→disguise-js=<真偽値>)
  • (no)zw(→use-zw=<真偽値>)
  • (no)precisetext(→precise-text=<真偽値>)
  • (no)simplejasetup(→simple-ja-setup=<真偽値>)
  • textwidth-limit=<整数>(→textwidth-limit=<整数>zw)
  • magstyle=mag/real/xreal(→magstyle=usemag/nomag/nomag*)
  • jadriver=<名前>(→ja=<名前>)
  • noscale(→scale=1)

  1. 2.0a版においても、非推奨の全てで警告が出るわけではないので注意。

  2. 「原ノ味フォント」自体(haranoajiパッケージ)とupdmapでのサポート(ptex-fontmapsの改版)は2020年2月にCTANに登録されているため、TeX Live 2019の最終版にも含まれている。

  3. なお、updmapの和文フォント既定値のharanoajiについては「2004JIS字形」が指定されている。従来の「IPAexフォント」はAJ1非対応のフォントであり字形選択が無効であるため自動的にフォントの既定である2004JIS字形が選ばれていたが、「原ノ味フォント」はAJ1対応のフォントであり字形選択が有効(かつ必須)になる。そこで従来の2004JIS字形を保つために「2004JIS字形」を選択している。LuaTeX-jaやzxjatype(XeTeX)では字形選択は可能であるが必須ではない。LuaTeX-jaの和文フォントの既定では字形選択を行わず、結果的に「原ノ味フォント」の既定である2004JIS字形が選ばれる。BXjsclsのLuaLaTeX/XeLaTeX上の既定設定も同様である。要するに、旧版でも新版でも既定の和文フォントは2004JIS字形となる。

  4. なお、LuaLaTeX上の動作の場合はLuaTeX-jaの新しい既定値は既に「原ノ味フォント」であるが、XeLaTeXと動作を合わせるために「原ノ味フォント」を明示的に設定している。従って、古いLuaTeX-jaと組み合わせた場合でも既定値は「原ノ味フォント」である。

  5. 実態はTeX言語のif-トークンである。なので、ユーザレベルでもifthenパッケージを介して\ifthenelse{\boolean{draft}}...という形で一応利用できていた。

  6. TeX Wikiの解説をみればわかるように、BXjsclsの多くの追加機能はstandardモードでのみサポートされる。

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

前回の続き)

新しいzxjafont(1.1版)の機能を語ってみる

従来の版(0.4版以前)の情報については以下を参照。

xeCJKでもzxjafontできる話

zxjafontのプリセットの指定対象は、例えばipaの場合は以下のようになる。

  • zxjatypeを読み込んだ場合: 和文\rmfamilyが「IPA明朝」、和文\sffamilyが「IPAゴシック」になる。(和文サポートモード
  • それ以外: \rmfamilyが「IPA明朝」、\sffamilyが「IPAゴシック」になる。

zxjatypeがない場合は日本語組版はサポートされないしそもそもフォントに「和文と欧文」の区別もない。しかしzxjafontはそういう状況で使うことも想定されていて、その場合は(区別のない)全体のフォントが設定対象となる。

ところがこれまでzxjafontは「zxjatypeが読まれずxeCJKだけ読み込まれている」状況は想定しておらず、この状況で無理に使うと「日本語のフォントが欧文だけに設定される」という奇妙な動作になっていた。「日本語組版をやりたいならzxjatypeを使っていて当然」であればそうで構わないのであるが、前回に述べたの通り、「日本語組版機能のためのzxjatype」という地位が非常に危ういものになっている。この辺りの事情を踏まえて考慮した結果、1.0版において、「xeCJKが読み込まれた場合も、zxjatype読込時と同様に和文サポートモードを適用する」という仕様変更を行うことにした。

zxjafontで原ノ味フォントできる話

既に前回のzxjatypeの例の中に登場しているが、「原ノ味フォント」を指定するプリセットオプションharanoajiが追加された。

※BXjsclsのクラスを用いたXeLaTeX文書でクラスオプションにjafont=haranoajiを指定した場合、zxjafontが読み込まれてプリセットharanoajiが適用される。

% XeLaTeX文書; UTF-8
\documentclass[xelatex,ja=standard,jafont=haranoaji,
    prefercjk,a4paper]{bxjsarticle}
\begin{document}
①☀っ☁☂☀~っ?\par
❷☃っ☃☃☃~っ!\par
\end{document}

f:id:zrbabbler:20200211062926p:plain
原ノ味フォントしてみた結果(素敵)

これで、ptex-fontmaps、pxchfon、luatexja-preset、zxjafontの全ててharanoajiが使用可能になったことになる。

XeLaTeXでも3ウェイトが使える話

zxjafontパッケージの目的は「(u)pLaTeXのpxchfonパッケージやLuaLaTeXのluatexja-presetパッケージが提供するようなプリセット指定機能をXeLaTeXで実現すること」であるが、特に多ウェイトのプリセットについてはzxjafontは他のパッケージにはない制限があった。それは「明朝・ゴシック各々2ウェイトしか使えない」ということである。

例えば、LuaLaTeXでluatexja-presetパッケージをdeluxe付きで読み込んだ場合、明朝体で細字(通常より細い)を指定する\ltseriesとゴシック体で極太を指定する\ebseriesが使えるようになる。

※(u)pLaTeXでjapanese-otfをdeluxe付きで読み込んだ場合と同じ。

% LuaLaTeX文書; UTF-8
\documentclass[a4paper]{ltjsarticle}
% 源ノフォントを多ウェイトで使う
\usepackage[sourcehan,deluxe]{luatexja-preset}
\begin{document}
% 3ウェイトが使える
☃明朝体で{\ltseries 細字}や中字や\textbf{太字}\par
\sffamily
ゴシックで中字や\textbf{太字}{\ebseries 極太}\par
\end{document}

対して、旧来のzxjafontでは、多ウェイトのプリセットを指定した場合でも、\ltseries\ebseriesは提供されず、またそもそもプリセット自体が中字と太字の2ウェイトしか定義されていなかった。

源ノフォントで3ウェイトしてみる話

1.0版以降のzxjafontでは、luatexja-presetやjapanese-otfと同様に「明朝・ゴシック各々3ウェイト」が使えるようになる。すなわち、\ltseries\ebseriesの命令が提供され、プリセットの定義も3ウェイトになる。

% XeLaTeX文書; UTF-8
\documentclass[xelatex,ja=standard,jafont=sourcehan,prefercjk,
    a4paper]{bxjsarticle}
\begin{document}
☃明朝体で{\ltseries 細字}や中字や\textbf{太字}\par
\sffamily
ゴシックで中字や\textbf{太字}{\ebseries 極太}\par
\end{document}

f:id:zrbabbler:20200211111751p:plain
threeweight有効時の出力

この「3ウェイト定義」を有効にするオプションはthreeweightであるが、このオプションは原則的に既定で有効になっているので指定は不要である。逆に、何らかの理由(例えば\ltseries\ebseriesの定義がトラブルを起こす、など)でthreeweightの機能を無効にしたい場合はnothreeweightというオプションを指定1すればよい。

% XeLaTeX文書; UTF-8
\documentclass[xelatex,ja=standard,jafont=sourcehan,prefercjk,
    nothreeweight,a4paper]{bxjsarticle}
\begin{document}
☃明朝体で中字や\textbf{太字}\par
\sffamily
ゴシックで中字や\textbf{太字}\par
\end{document}

f:id:zrbabbler:20200211112120p:plain
threeweightを無効にした時の出力

源ノフォントだけど単ウェイトしてみる話

「源ノフォント」を使いたいが、でも「明朝・ゴシック各々1ウェイトしか使わず、かつ明朝の太字をゴシックにする」という「単ウェイトの和文フォント設定」を維持したい場合は、oneweightというオプション(これは昔から存在する)を指定すればよい。

\documentclass[xelatex,ja=standard,jafont=sourcehan,prefercjk,
    oneweight,a4paper]{bxjsarticle}
%……あとは直前の例と同じ

f:id:zrbabbler:20200211112200p:plain
oneweight有効時の出力

出力結果をみて判るように、このoneweightを指定したときに明朝とゴシックで実際に使われるウェイトは、多ウェイトプリセットにおいて「中字」のウェイトに相当するものである2

0.7版以降ではboldというオプションが利用できる。これを利用すると、oneweightと同じく「単ウェイトの設定」が維持されるが、そこで使われるゴシックのウェイトがプリセットの「太字」に相当するものになる。これはluatexja-presetやjapanese-otfのboldオプションと同様の機能である。

\documentclass[xelatex,ja=standard,jafont=sourcehan,prefercjk,
    bold,a4paper]{bxjsarticle}
%……あとは直前の例と同じ

f:id:zrbabbler:20200211112220p:plain
bold有効時の出力

まとめ

多ウェイトのプリセットの制御のオプションをまとめると以下のようになる。

  • threeweight: 3ウェイトを使用。これが既定。
  • nothreeweight: 2ウェイトを使用。
  • oneweight: 単ウェイト用設定。
  • bold: 単ウェイト用設定3で、ゴシックを太字にする。

ただしこれらのオプションの実際の仕様は少し複雑で以下のとおりである:

  • threeweightoneweightboldにはそれぞれ無効にするオプションnothreeweightnooneweightnoboldが存在して、独立に有効無効を切り替えられる。
  • フォント設定に関して、3つのオプションの優先度はboldoneweightthreeweightとなる。
  • threeweightが有効の場合、\ltseries\ebseriesが定義される。これはboldoneweightには影響されない。
  • boldoneweightは既定で無効。threeweightは既定で有効であるが、fontspecの版が古い(3ウェイトの設定がサポートされない)場合は無効になる。

その他もろもろ

  • たとえzxjatypeやxeCJKが読み込まれていても無視して和文サポートモードへの移行を抑止するためのオプションを追加。
    • ignorejatype: zxjatype/xeCJKの読込を無視し、和文サポートモードを無効にする。
    • noignorejatypeignorejatypeの否定。
  • 90jisjis2004の両方を否定して既定状態に戻すオプションnojisshapeを追加。
  • haranoaji以外の新設プリセットオプション:
    • nopreset和文フォントのプリセット設定を行わない。
    • Mogaフォント系のプリセットを整理した(mogaN-90を追加)。恐らく現在はMogaフォントの需要はないと思われるので、詳細は笑楽する。
  • luatexja-preset互換のオプション別名を追加。
    • deluxenooneweightの別名
    • nodeluxeoneweightの別名
    • jis9090jisの別名
    • 2004jisjis2004の別名
    • match: 何もしないオプション
    • noembednopresetの別名。
  • ptex-fontmapsとの互換のためのプリセット別名を追加。
    • kozukakozuka-proの別名
    • morisawamorisawa-proの別名
    • hiraginohiragino-proの別名
  • 0.3版で非推奨となったプリセットを0.5版で廃止した。
    • kozuka4kozuka6kozuka6nhiraginoms-dxipa-dxhiragino-dxが廃止。

  1. BXjsclsクラスのjafontオプションによりzxjafontが読み込まれている場合、zxjafontにオプションを指定するにはクラスオプション(グローバルオプション)として指定すればよい。

  2. 厳密にいうと、プリセットの種類によってはゴシックについて「oneweight指定時専用のウェイト」が使われる。例えば、sourcehanプリセットではゴシックの中字は「Source Han Sans Regular」であるが、oneweight指定時のゴシックは「Source Han Sans Medium」であり、これは「Regular」よりも若干太い。

  3. luatexja-presetと異なり、zxjafontのboldはそれ自体が単ウェイト用設定を有効化する。

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. ただしギリシャ文字キリル文字は敢えて「欧文扱い」のままにしている。

2020年のパズル年賀状

今年の年賀状。

f:id:zrbabbler:20191227022742j:plain

以前に述べたとおり、年賀状にはその年の数に関連した数学パズルを載せるのが通例である1。しかし去年はパズルを作っている時間が2時間しかなかったので2、割と普通の(マジで)虫食い算で済ませた。

肝心のパズル問題の部分の文字が小さくで読みづらいが、以下のように書かれている。

以下の条件に従って、乗算の虫食い算を解きなさい。

  • には0または2が入る。
  • には0と2以外の数字が入る。
(問題の図)
f:id:zrbabbler:20191227023211p:plain

一番上にあるのはチェロキー語での新年の挨拶。


  1. ぱんどっくのマニュアルを読破するのに時間を取られている人が多いためか、年を追うごとに年賀状で数学パズルを見ることが少なくなっているようで感じる。

  2. そのうち本腰を入れて数学パズルを作りたいですね……。

TeX言語のマクロも“1回展開”にしたい話

1回展開を実現するにはLuaしないといけない問題

某アドベントカレンダーの最終日の記事では、LuaTeXで「“1回展開”のマクロ」を実現する方法について解説した。

ただし、この記事にある方法では、機能の実現の部分(具体的には「YYYY/MM/DD形式で出力する」という機能)をLuaで実装する必要がある。

-- Luaでの実装
function xx.todayYMD()
  tex.sprint(("%04d/%02d/%02d"):format(
      tex.year, tex.month, tex.day))
end

Lua言語自体はTeX言語よりもずっと習得しやすい言語ではあるが、それでも「LuaTeX上のLuaコードでTeXに関連した機能を実現する」にはそれなりの知識(例えばtexライブラリの使用法など)の習得が必要であり、決して自明ではない。

何より、(例の記事の流れに従うと)機能要件を実現するための「完全展開可能(ただし“先頭~”ではない)なTeX言語のコード」が既に得られている。

% TeX言語での実装
\def\todayYMD{%
  \the\year/\two@digits\month/\two@digits\day}

そうであれば、この「完全展開可能なコードから“1回展開”のマクロが作れる」ほうが、フツーのTeX言語者(※要定義)にとっては便利なのは間違いないだろう。

ixquickmacroパッケージ

というわけで、作ってみた

ixquickmacroパッケージは開発者用のパッケージで、以下の機能を提供する。

  • \defquickmacro\制御綴{<定義本体>}\制御綴を1回展開すると「<定義本体>の完全展開」になるように、\制御綴の意味をローカルに定義する。
  • \gdefquickmacro\制御綴{<定義本体>}\defquickmacroのグローバル定義版。

※現状では、引数をもつマクロはサポートされない。

このパッケージを利用すると、先に示した「TeX言語による完全展開可能な\todayYMDの定義」について、\def\defquickmacroに変えるだけで、“1回展開”の\todayYMDが実現できる。

\defquickmacro\todayYMD{%
  \the\year/\two@digits\month/\two@digits\day}

例の記事で使った\xInspectマクロをここでも利用して、“1回展開”が実現できているかを確かめてみよう。

\documentclass{article}
\usepackage{ixquickmacro}
\makeatletter %!!!!!!!!!!!!!!!!!!!!!!!!! TeX code BEGIN
% 例の \xInspect
\def\xInspect#1{\typeout{%
  once->\unexpanded\expandafter{#1}^^J%
  twice->\unexpanded\expandafter\expandafter\expandafter{#1}^^J%
  full->#1}}

%% "1回展開"な \todayYMD の定義
\defquickmacro\todayYMD{%
  % 中のコードは単に"完全展開可能"に過ぎない
  \the\year/\two@digits\month/\two@digits\day}

\makeatother  %!!!!!!!!!!!!!!!!!!!!!!!!! TeX code END
\begin{document}

\xInspect{\todayYMD}

\stop

このソースをlualatexでコンパイルすると、\xInspectによる端末出力は以下のようになる。

once->2019/12/31
twice->2019/12/31
full->2019/12/31

ixquickmacroパッケージを利用することで、Luaを知らなくても、TeX言語の知識だけで“1回展開”のマクロを作ることができた。スバラシイ。


*「ところで」
ZR「ん?」
*「マクロを“1回展開”にできると何が嬉しいわけ?」
ZR「何だろうねえ」
*「えっ!? 明確なメリットは存在しないの? だったら、この記事もtexadvent2019の記事も単なるくだらないTeX芸でしかないんじゃないの?」
ZR「というわけで、皆さん、来年も当(くだらない)ブログをよろしくお願いします!」

今年もやっぱりMerry TeXmas! ― \end{texadvent2019}

f:id:zrbabbler:20191125025549p:plain
TeX & LaTeX アドベントカレンダー 2019
*  *  *

アドベントカレンダーやっぱり完走!

TeXmas!
\expandafter\expandafter\expandafter\expandafter\expandafter  \catcode
` =  7 \  ,  %  4\:=\  #  !  4  #  /  $  %\:   &\:`  "\:`_'12% 2019/ %
\:   #1\  ,  %  4\,\  ,  %  4\  0  $  &  /  5  4  0  5  4  }1% 12/25 %
\,\  $&\  $  5  -  0#\:`\  ;1\:`\  =2\  $  %  &\ {  =\:`\#6\ \:`@  }11
\,\?\  '  $  %  &\?\  3&{\  #  /  5  .  4@0_\@  7  (  )  ,  %  .  5  -
{\  #  /  5  .  4@<'400}\  $  /{\  )  &  .  5  -\  #  !  4  #  /  $  %
\  #  /  5  .  4@=15_\  #  !  4  #  /  $  %\  #  /  5  .  4@12_\  &  )
\  !  $  6  !  .  #  %\  #  /  5  .  4@1_  =\  *&}\  ,  /  .  '\?\  *&
#1\  54  %  58  -  !  3{  =\ \?\  $  5  -  0{\  %  6  %  2  9  *  /  "
\  %  8  0  !  .  $  !  &  4  %  2{\  4  (  %\  %  6  %  2  9  *  /  "
\  3&}\  $&  =\ \ \?\,{\  )  .  0  5  4_  ,  !  4  %  8.  ,  4  8_}  =
\  3  #  2  /  ,  ,  -  /  $  %\:`\&  }12\  2  %  ,  !  8\:'40  }10_\,
(↑pdftex -etex -iniコンパイル

というわけで、8回目の開催となる TeX & LaTeX Advent Calendar 2019 も、素敵なTeXネタを途絶えさせることなくやっぱり無事にクリスマスの日を迎えられました。今年の参加者は全部で23名、うち8名が初参加でした。参加者の皆様に心からの感謝をやっぱり捧げたいと思います。

今年の重点テーマは「やっぱりLua(La)TeXしよう」でした。改めてやっぱり振り返ってみると、様々な面から「LuaTeXの特徴」を紹介した記事がやっぱり多く、テーマとして一定の役割をやっぱり果たせたのではないでしょうか。これをきっかけにしてLua(La)TeXにやっぱり興味を持つ人が増えることになればやっぱり幸いです。

TeX & LaTeX Advent Calendar 2019 を楽しんでくれた皆さんに、

やっぱりありがとう!

そして

*  *  *

*「去年の記事の文章になんでもかんでも『やっぱり』を付ければ済む、という考えがいくら何でもヒドすぎる」
ZR「あっ、そこは『やっぱりヒドすぎる』じゃないとやっぱりイマイチ」
*「………………」