マクロツイーター

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

今更だがRatexの0.3.0版で日本語する件について

どうやら世の中ではRust実装の新しいTeXエンジン/システムのRatexが話題になっているようである1。

本記事では、「Ratexの0.3.0版で日本語を含む文書を作る方法」について(記録のため)解説する。

RatexのTeXはどのTeXなのか

Ratexの開発方針は「既存のTeXエンジンのRustでの再実装」ではなく「独自の仕様のエンジンの開発」であると推定される。実際に0.4.0版以降では「\RatexUTFviiiプリミティブ」や「\fontでのOpenTypeフォント指定」などの、Unicodeフォントを直接扱う機能が追加されていて、またfontspecやxeCJKなどの「一部のXeLaTeX用パッケージのエミュレート2」が動作するようになっている。(XeTeXの機能を備えているわけではなく基本的な仕様はpdfTeXのままなので、「普通にLaTeXを使う」以上のことをしたい人は注意が必要である。)

しかし、0.3.0版の段階ではRatexのTeXエンジンの仕様はほぼpdfTeXと変わらず3、特に普通にLaTeXとして使う分にはその仕様はpdfLaTeXと本当に同じと考えてよい。

Ratexの0.3.0版で普通に日本語してみるとどうか

Ratex0.3.0版のLaTeXは要するにpdfLaTeXなので、もしこれで日本語を扱いたいとなると「pdfLaTeXで日本語を扱う」ための普通の手順に従うことになる。

本節ではこの手順がRatexでも利用できるかを検証してみる。

もちろん、日本語(などのCJK言語)については0.4.0版以降で実装された「Unicodeフォント使用」の方式の方が本命であろうが、先述の通りこちらは「独自仕様で調節しにくい」という弱点がある。このため「普通のpdfLaTeXの方式」(これは0.4.0版以降でも有効である)にも考慮の価値があるだろう。

「パターン①:チョットだけ日本語したい」はできる

「パターン①」、つまりCJKutf8パッケージを直接使うパターンについては、日本語フォントファミリとして(事実上唯一の選択肢である)ipxm/ipxgを指定する限り、Ratexでもそのまま通用すると思われる。これらのファミリの実体のフォントを収めたipaex-type1パッケージはRatexに含まれている。

例えば「チョット日本語する例」の文書はRatexでそのまま通用する。

% encoded in UTF-8
\documentclass[a5paper]{article}
\usepackage{CJKutf8}
\begin{document}
\emph{I Am a Cat}
(\begin{CJK}{UTF8}{ipxm}吾輩は猫である\end{CJK})
is a novel written by Natsume Soseki
(\begin{CJK}{UTF8}{ipxm}夏目 漱石\end{CJK}).
\end{document}

なお、ipaex-type1のフォントはType1形式であるため、清水氏の記事にあるような埋込の不整合の問題は起こらないはずである。

min・goth・maruのファミリについては、当該記事でも注意が促されているが、Ratexではさらにヤヤコシイ事態4になっているためとにかく忘れるに限る。

「パターン②:いっぱい日本語したい」もできる

「パターン②」、つまりbxcjkjatypeパッケージを使うパターンについても大丈夫のようである。「いっぱい日本語する例」の文書はRatexでそのまま通る。

% encoded in UTF-8
\documentclass[a5paper]{article}
\usepackage[whole]{bxcjkjatype}
\begin{document}

Soseki's novel \emph{I Am a Cat} (吾輩は猫である)
starts with the following passage:

\begin{quote}
  吾輩は猫である。名前はまだ無い。
  どこで生れたかとんと見当がつかぬ。

  \itshape (Translation)\\
  I am a cat. I have yet no name.
  I have no idea where I was born.
\end{quote}

The word 吾輩 (\emph{wagahai}) is
the first-person pronoun of high register,
and has a nuance of arrogance.
\end{document}

「パターン③:日本語文書したい」ができない(だった)

Ratexの用途として「日本語の文書」の作成を期待している人にとっては、「パターン③」のBXjsclsバンドルを使うパターンが一番大事であろう。何といっても、pdfLaTeX系で使える日本語用の文書クラスがBXjsclsのものに限られるからである。

ところが残念なことに、現状(0.3.0版も最新の0.4.3版も)のRatexではBXjsclsのクラスが使えないことが判っている(ざんねん🙃) 例えば「日本語文書した例」の文書で試してみる。

\documentclass[pdflatex,a5paper,ja=standard]{bxjsarticle}
\title{pdf{\LaTeX}~で日本語文書}
\author{匿名\ 希望}
\begin{document}

BXJS~クラスを利用すると~pdf{\LaTeX}~
で日本語文書を比較的容易に作成できます。
文書ファイルの文字コードは~
UTF-8~にする必要があります。

\section{夏目漱石「吾輩は猫である」冒頭}

吾輩は猫である。
名前はまだ無い。

どこで生れたかとんと見当がつかぬ。
何でも薄暗いじめじめした所で
ニャーニャー泣いていた事だけは記憶している。
吾輩はここで始めて人間というものを見た。
しかもあとで聞くとそれは書生という
人間中で一番獰悪な種族であったそうだ。
この書生というのは時々我々を
捕えて煮て食うという話である。

\end{document}

Ratexでビルドすると、以下のようなエラーが発生する。

error: Illegal unit of measure (pt inserted).
  --> <embedded:bxjsarticle.cls>:2565:3
     |
2565 |   \bxjs@invscale\@tempdima\bxjs@tmpa
     |   ^^^^^^^^^^^^^^
  = help: add a TeX dimension unit such as `pt`, `mm`, `cm`, or `em`
  = while expanding: \bxjs@invscale
  = included from: main.tex:2:2

このエラーの理由は端的にいえば「BXjsclsはpdfLaTeXには対応するが、独自仕様のRatexには対応していない」からである。ただしそのエラーが起こっている部分は「元祖TeXの文法の極めて細かい仕様をRatexが満たしていない」という事例5なので、独自仕様ではなくバグなのかもしれない。開発元にはこの件は報告している。

一応、bxjsarticle.clsの側でこれらの不具合を回避するように修正することもできる。

--- orig/bxjsarticle.cls
+++ bxjsarticle.cls
@@ -401,6 +401,8 @@
 \mathchardef\bxjs@isc@ll=128
 \mathchardef\bxjs@isc@sl=259
 \def\bxjs@isc@sl@h{65539 }
+\let\bxjs@sp\@ne
+\ifjsWitheTeX \newdimen\bxjs@sp \bxjs@sp=1sp \fi
 \def\bxjs@invscale#1#2{%
   \begingroup \@tempdima=#1\relax \@tempdimb#2\p@\relax
     \ifdim\@tempdima<\bxjs@isc@ll\p@
@@ -412,15 +414,15 @@
     \fi
     \@tempcntb\p@ \divide\@tempcntb\@tempdimb
     \advance\@tempcnta-\@tempcntb \advance\@tempcnta-\tw@
-    \@tempdimb\@tempcnta\@ne
+    \@tempdimb\@tempcnta\bxjs@sp
     \advance\@tempcnta\@tempcntb \advance\@tempcnta\@tempcntb
-    \advance\@tempcnta\bxjs@isc@sl \@tempdimc\@tempcnta\@ne
+    \advance\@tempcnta\bxjs@isc@sl \@tempdimc\@tempcnta\bxjs@sp
     \@whiledim\@tempdimb<\@tempdimc\do{%
       \@tempcntb\@tempdimb \advance\@tempcntb\@tempdimc
       \advance\@tempcntb\@ne \divide\@tempcntb\tw@
       \ifdim #2\@tempcntb>\@tempdima
-        \advance\@tempcntb\m@ne \@tempdimc=\@tempcntb\@ne
-      \else \@tempdimb=\@tempcntb\@ne \fi}%
+        \advance\@tempcntb\m@ne \@tempdimc=\@tempcntb\bxjs@sp
+      \else \@tempdimb=\@tempcntb\bxjs@sp \fi}%
     \xdef\bxjs@gtmpa{\the\@tempdimb}%
   \endgroup #1=\bxjs@gtmpa\relax}
 \DeclareOption{pandoc}{%
@@ -2495,6 +2497,7 @@
     \def\bxjs@next{\unexpanded\expandafter{\warekitoday}}}
 \fi\fi
 \def\!#1#2#3{\noexpand#1\noexpand#2\noexpand#3}
+\ifjsWitheTeX \def\!#1#2#3{\unexpanded{#1#2#3}} \fi
 \ifx\bxjs@iai\@empty \let\!\@empty \fi
 \xdef\bxjs@today{%
   \if@english

修正後のbxjsarticle.clsをカレントに置くとビルドが成功して以下の結果が得られる。

追記:0.4.4版で日本語文書できるようになった

先の話に出てきた「TeXの仕様通りでない」という不具合はRatexの0.4.4版において修正された。従って、最新のRatexではBXjsclsが普通に使えるようになっている。

まとめ

とりあえず、ざんねん🙃
とりあえず、あんしん😊


  1. ちょうど同じ時期にRaTeXというソフトウェアも話題になっているが、こちらは「KaTeXのRust版」であり別物である。↩
  2. Ratexは「パッケージのファイル群をバイナリに内蔵する」形をとるが、fontspec.styやxeCJK.styなどの一部のファイルについてはRatex用のエミュレートを行う実装のファイルに置き換えられている。↩
  3. 細かい拡張はあって、例えば\Ucharcatが存在しているが、ここでも文字コードの有効範囲は0~255に限られている。↩
  4. これらの「CJKパッケージの標準日本語ファミリ」は本来は「ユーザが自分で適切な物理フォントに紐づける」ことが前提であるはずだが、TeX Liveでは非実用的な「wadalabフォント」への紐づけが固定されているため「普通に使う方法が封印された」状態になっている。実はRatexの0.3.0版はwadalabフォントを含んでいなかったので「自分で紐づける」方法が使えたのであるが、0.4.0版でwadalabフォントが追加されたため、結局TeX Liveと同じ状態に陥っている。↩
  5. 逆にいうと、BXjsclsの実装コードがそれだけ「TeXの極めて細かい仕様」に依拠した超絶アレ🍣なものであるということでもある(ざんねん🙃)↩