「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
とかを登録すると変なことになる。))