マクロツイーター

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

BXjscls の新しいやつ(v1.4)

…がリリースされた。

数式中の和文文字の出力のサポート

(以下の話は“標準設定”(standard 和文ドライバ)を前提にする。)

周知の通り、(u)pLaTeX では「数式の一部として和文文字を出力する」((念のため言っておくが、「数式の一部として和文文字を出力する」と「数式の中に日本語を含める(そしてその中で和文文字を出力する)」は全く違う話であり、後者はよく行われるが、前者が行われることは非常に稀である。例えば、「p: 奇素数」のような表記の中の“奇素数”は日本語であって数式ではない(一般に、この用法の“:”の右側には自然言語が書かれる)。よってこれを LaTeX の数式中に含める場合は“p\colon\text{奇素数}”と書くことになる。))ことができる。jsclasses バンドルの文書クラス(JS クラス)ではこの機能が普通に利用できる。

% upLaTeX 文書
\documentclass[uplatex,a4paper]{jsarticle}
\begin{document}
\[ % <の>を数式の一部として使っている
  e^{} = \sum_{k=0}^{\infty} \frac{の^k}{k!}
    = 1 + の + \frac{の^2}{2!} + \frac{の^3}{3!} + \cdots
\]
\end{document}

これに対して、従来の BXjscls の文書クラス(BXJS クラス)では、数式中の和文文字をサポートしていないので、先の例のような数式は通らなかった。

% upLaTeX 文書
\documentclass[uplatex,dvipdfmx,ja=standard,
    a4paper]{bxjsarticle}
\begin{document}
\[
  e^{} = \sum_{k=0}^{\infty} \frac{の^k}{k!}
    = 1 + の + \frac{の^2}{2!} + \frac{の^3}{3!} + \cdots
\]
\end{document}

この bxjsarticle クラスの文書を(uplatex で)コンパイルすると以下のエラーが出る。

! Not two-byte family.
l.6   e^{の
            } = \sum_{k=0}^{\infty} \frac{の^k}{k!}
?

数式の和文に対応してなかった理由は単純で「単にサボっていたから」である。

BXJS クラス + (u)pLaTeX和文の数式ができるようになった話

新しい BXJS クラスでは、エンジンが (u)pLaTeX の場合に JS クラスと同等の「和文数式ファミリ」の設定が行われるため、前掲の文書が正常にコンパイルできるようになる。出力結果は最初に挙げた JS クラスの文書と同じである。

なお、JS クラスでは和文数式ファミリの設定を無効化する“disablejfam”というクラスオプションがあるが、この仕様は((u)pLaTeX では)BXJS クラスでもサポートされる。

だけど和文があまり数式でない話

ただし、飽くまでも「JS クラスと同等」であるため、数式としては組版があまり適切でない場合があることに注意。*1

\[ (の + x)^2 =^2 + 2のx + x^2 \]
[uplatex での出力]

次の BXJS + LuaLaTeX での組版の結果と比較してほしい。

なお、LuaTeX-ja パッケージはそれ自身が和文数式ファミリの設定を行うので、LuaTeX-ja が使われている限りは数式中の和文文字は常に使える状態にある。従って、旧版の BXJS クラスでももちろん使える。無効化はできないので、disablejfam オプションはサポートされない(指定すると警告が出て無視される)。

BXJS クラス + XeLaTeX で和文の数式ができるようになった話

エンジンが XeLaTeX の場合は、既定では数式中の和文文字はサポートされないが、オプションに“enablejfam=true”を指定するとサポートされるようになる。

% XeLaTeX 文書, UTF-8
\documentclass[xelatex,ja=standard,enablejfam=true,
    a4paper]{bxjsarticle}
\begin{document}
\[ (の + x)^3 =^3 + 3の^2x + 3のx^2 + x^3 \]
\end{document}

この機能は xeCJK の \xeCJKsetup{CJKmath=true} を実行することで実現されている。これ自体の仕様について自分があまり理解しておらず、思わぬ副作用が出るおそれがあるため、既定で有効化することを見送っている。

\mathmc とか \mathgt とかの話

和文数式フォント命令の \mathmc\mathgt は、エンジンが (u)pLaTeX(disablejfam でない場合)か LuaLaTeX の場合は“本物の”数式フォント命令として働く。それ以外の場合は、「内部で一時的にテキストに切り替えて出力する」というフォールバック的な動作を行う。従って、これらの“和文数式フォント命令”の引数の中では常に(pdfLaTeX であっても)和文文字が使えることになる。

なお、この「テキストに切り替える」のには既定では \mbox が使われるが、これは添字の中では適切な出力にならない。amstext(または amsmath)パッケージが読み込まれている場合は \text 命令が使われるので、そちらの方が望ましい。

enablejfam オプション、disablejfam オプション
  • enablejfam=true : 数式中の和文文字をサポートする。
  • enablejfam=false : 数式中の和文文字をサポートしない。
  • disablejfam : “enablejfam=false”と同値。(JS クラスとの互換のため。)
  • enablejfam=default : 当該エンジンでの既定の状態に戻す。

既定の値はエンジンごとに異なり、(standard 和文ドライバでは)以下のようになっている。

  • (u)pLaTeX では既定で true だが false に変更できる。
  • XeLaTeX では既定で false だが true に変更できる。
  • LuaLaTeX では常に true である(enablejfam=false を指定すると警告が出る)。
  • pdfLaTeX では常に false である(enablejfam=true を指定すると警告が出る)。

※minimal 和文ドライバでは enablejfam/disablejfam は無視される。

その他諸々

  • 全角幅((「全角幅」とは \zw のこと。もっと厳密にいうと \jsZw のこと。))の水平空きを出力する命令 \zwspace を新設した。
  • アレに対する修正を行った。

*1:「数式としての和文文字」は“日本語ではない”ので日本語用の組版規則が適用されるのは不適切である。