マクロツイーター

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

LuaTeX-ja で zw を使う件について

「LuaTeX-ja の現状の日本語組版に十分に満足しているし、 縦組みなんて使う予定全くないし、 自分の強力なマシンだと多少遅いのも気にならない、 だけど、zw の前に \ を書かなければいけないのが我慢ならなくて、 pTeX から移行できない!」とお悩みの皆さんに朗報です!

% 文字コードは UTF-8; LuaLaTeX 文書
\documentclass[a4paper]{ltjsarticle}
\usepackage{bxjacalcux}
\begin{document}

\begin{minipage}{7zw}
\setlength{\baselineskip}{24H}% 1H=0.25mmでしたね
いろはにほへとちりぬるを\\[4H]
わかよ\hspace*{1zw}たれそつねならむ
\end{minipage}

\end{document}

このパッケージ bxjacalcux は 2012/05/25 に紹介した bxjaprnind と同じく BXjatool バンドルに含まれている。(bxjaprnind と同じく BXtoolbox に依存する。)もうこれで LuaTeX-ja に移行して損をすることはない!((なお、bxjacalcux パッケージは LuaTeX-ja 以外に、bxjaclasses の文書クラスでも使用可能で、この場合は ze、zh はともに \jsZw の意味になる。))

種明かし

要するにこのパッケージは次のようなことをしている。

calc パッケージを読み込んだ上で \setlength にフックをかけて、\setlenfth の引数(長さ式)が calc の処理に渡る前に「zw\zw」等のトークン列変換を行う。

周知の通り、calc を読み込むと LaTeX の命令の長さを表す引数の多くについて calc の式が使えるようになる(つまり内部で \setlength が介在している)。従って、calc を修正することで「LaTeX に新しい単位を導入する」ことができるわけである。*1ただし、一部の引数は calc 対応になっていない。私が調べた限りでは、「\hspace[*]、\vspace[*]、\addvspace] の引数」「\\[*] のオプション引数」が該当する。別にこれらの引数を calc 対応にしていけない理由は特に見いだせなかったので、bxjacalcux *2では実際に calc 対応にするパッチを適当している。

おまけ

\DeclareCalcUnit{<単位>}{<置換先>} で新しい単位を導入できる。例えば、最近普及が進みつつある hyde 単位系に対応させることを考える。TeX の文法上、寸法レジスタは内部寸法の一種で「単位」の位置に現れることができる。従って、

% 規約として「定数」扱いとする
\newdimen\xx@hyde \xx@hyde=156cm

と定義すると、\setlength{\xxheight}{1.032\xx@hyde} のように書ける。よって、「hyde」という単位を定義するのには「hyde」を「\xx@hyde」に置換すればよいことになる。

% これは pLaTeX 文書
\documentclass[a4paper]{jsarticle}
% pLaTeX で bxjacalcux を読んでも何も起こらないので
% 下請けの bxcalcux を読む
\usepackage{bxcalcux,bxcalcize}
\makeatletter %-------------------------
\newdimen\xx@hyde \xx@hyde=156cm
\DeclareCalcUnit{hyde}{\xx@hyde}
\newdimen\xx@chyde \xx@chyde=0.01\xx@hyde
\DeclareCalcUnit{chyde}{\xx@chyde}
\newdimen\xx@mhyde \xx@mhyde=0.1\xx@chyde
\DeclareCalcUnit{mhyde}{\xx@mhyde}
\makeatother  %-------------------------
\begin{document}
\setlength{\baselineskip}{1chyde plus 2mhyde}
ここに\rule{15mhyde}{.4pt}15\,mhydeの線を引きます。\\
行送りは1\,chydeになっています。
\end{document}

なお、登録できる単位は英字のみからなる文字列に限られる。((式中で置換の対象となるのは「直前が英字でなくて登録された単位文字列と一致する部分文字列」である(直後に境界検査をしないのは「1zwplus1zw」という書き方があるため)。グループの中は一部の例外を除き変換対象としない。一致する単位が複数存在する場合は最も短いものが選ばれる(つまり aaa を登録すると aaaa は無効になる)。式の構文は全く関知しないので plus とかを登録すると変なことになる。))

*1:もちろん TeX のプリミティブは対象外である。

*2:実際はそれが内部で読む bxcalcize パッケージ。