マクロツイーター

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

pTeX-ng エンジンで jsclasses したい話

UTF-8 な jsclasses の話

jsclasses が新しくなって、配布ファイルの文字コードISO-2022-JP*1 から UTF-8 に変更された。以下の TeX Forum の投稿で texjporg の“中の人”がアナウンスしている。

あたかも pTeX-ng で jsclasses できそうな話

なんだけど、チョット気になる記述がある。

これで、platex-ng 上でも jsclasses をそのまま(エンコード変換作業なしに)使えるはずです。

pTeX-ng(ApTeX)のことをチョット知っている人がこれを見ると、多分「jsclasses が platex-ng*2でも使えるようになった」と解釈するだろう。だけど実際はそういう意図ではなかったようだ。

つまり、ファイルを UTF-8 にしたので自分で文字コード変換する必要はなくなったが、ただそれだけであり、正常に動作することを宣言したものではない、ということである。

やっぱり pTeX-ng で jsclasses できない話

上掲のツイートでも述べられているが、現状の jsclasses を platex-ng で使う件については、以下のような問題があることが判っている。

  • papersize オプションが効かない。
    • TeX 言語者向け解説] 要するに papersize special が効かないのである。pTeX-ng は pdfTeX と同じ出力サイズ指定の機構をサポートするため、papersize special をサポートする必然性はない。ただ一応サポートする予定はあるようなので、将来的には解決するかも知れない。
  • usemag 指定の状態(これが既定)で基底フォントサイズを(12pt のように)指定すると出力位置が異常になる。
    • usemag 指定とは何かについては以下の記事を参照されたい。
    • TeX 言語者向け解説] これは pdfTeX 方式の出力用紙サイズ設定機構((DVI 出力のエンジンでは \pdfhorigin/vorigin の値は「常に 1truein」となる。つまり mag 値が変わると“TeX 内部での値は実質的に変わっている”ことになる。\pdfhorigin/vorigin が明示的にパラメタとして存在する pdfTeX(PDF モード)ではそういう扱いはできないため、mag 値を変えた場合にはこのパラメタの値(初期値は 1in)を自分で再設定する必要がある。))に jsclasses が未対応であることが主たる原因である。ただし、実際には mag 値が変更された場合の pTeX-ng と pdfTeX の挙動は食い違いがある。((\pdfpagewidth/height に指定した値が、あたかも true 付であるかのように扱われている。))恐らくこれは意図しないバグではないかと疑っている。

このうち、後者の「usemag が使えない」という問題については、単に「代わりに nomag*(あるいは nomag)を指定する」ことで解決できるため、実際には問題にならない。

\documentclass[uplatex,nomag*,12pt]{jsarticle}

しかし前者の「papersize が使えない」というのは重大な問題である。papersize が使えない、ということは(少なくとも jsclasses 単独では)「文書中で出力用紙サイズを指定できない」ということである。従来の (u)pLaTeX + dvipdfmx のワークフローであれば、このことは致命的ではない。なぜなら dvipdfmx の起動オプションで出力用紙サイズを指定できるからである。しかし、pTeX-ng の場合は dvipdfmx の処理も完全に内包しているため、“dvipdfmx の起動オプション”を指定する手段も残されていない。*3完全に詰んでいる。

もちろん、「pTeX-ng エンジンでは用紙サイズが指定できない」というわけではない。pTeX-ng は「pdfTeX と同じ方式」を採用しているため、TeX 言語レベルでは用紙サイズ指定ができる。従って、あとは要するに「LaTeX パッケージがあるか」という問題になる。

“出力用紙サイズを指定するパッケージ”で一番有名なのは geometry であるが、platex-ng で geometry を読み込むと「DVI 出力のエンジンである」と判定されるため結局失敗する。あとは、bounddvi があるが、これはそもそも DVI 出力エンジン専用だからやはり使えない。そうすると、あと残っているのはアレくらい……。

ついに pTeX-ng で jsclasses できる話

……というわけで、アレを改修して platex-ng に対応させた。

この新版では bxpapersize パッケージの機能のほぼ全て(例外は後述)が platex-ng で使える。従って、jsclasses で用紙サイズ指定を行った場合、単に bxpapersize パッケージを読みこめばそれが出力用紙サイズに反映される。

% platex-ng文書; UTF-8
\documentclass[uplatex,nomag*,9pt,a5paper]{jsarticle}% nomag(*)は必須
\usepackage{bxpapersize}% これで出力がA5になる

jsclasses のトンボ出力オプションにも対応している。

% platex-ng文書; UTF-8
\documentclass[uplatex,tombow,nomag*,9pt,a5paper]{jsarticle}
\usepackage{bxpapersize}% 出力はA5+2inになる
ただし usemag はダメ

bxpapersize 自体は「mag 指定」に対応しているのであるが、現状ではこれは platex-ng については未対応である。jsclasses の usemag 指定は「mag 指定」を利用しているので、これも未対応となる。従って、jsclasses + platex-ng + bxpapersize の組合せの場合は、jsclasses に nomag(*) 指定が必要である。

※「mag 指定」に対応させる試験的機能として、adjustmag オプションを用意していて、これを指定すると(少なくとも単純な場合は)mag 指定時のサイズ指定が正常になる。ただ、現状の「pTeX-ng と pdfTeX の動作が食い違う」というのはバグであるようにも思える。このため mag 指定対応は保留している。

*1:ファイルの文字コードISO-2022-JP にしておくと、pLaTeX/upLaTeX エンジンでは確実に(入力漢字コード・内部漢字コードの設定に関わらず)正常に読み込める、という利点がある。一方で、XeLaTeX/LuaLaTeX(およびこの記事のトピックである platex-ng)は UTF-8 のファイルしか受け付けないので全エンジン共通にはできない、という欠点もある。

*2:pTeX-ng(ApTeX)上の pLaTeX」のこと。取りあえずコマンド名で呼称しておく。

*3:TeX 言語者向け解説] ちなみに dvipdfmx:config special によるサイズ指定は pTeX-ng では効かない。これは papersize special が効かないのと同じ原因である。