マクロツイーター

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

BXjscls の新しいやつ(v1.1e)

CTAN に上がったのが先月(2016年5月)末なので大分時間が経ってしまったが……。

\subtitle の定義の衝突の回避

(1.1e 版での改修。)

コレへの対策。

すなわち、プレアンブルで \newcommand{\subtitle} があっても重複定義のエラーにならないようにした。

ただしこの“代償”として、「\subtitle\title より後に実行する必要がある」という制限が加わった。((要するに、「\title が実行された」時点で \subtitle 命令を(未定義ならば)定義している。))どうしても先にサブタイトルを設定したい場合は、\subtitle の代わりに \jsSubtitle 命令を用いるとよい。

※ちなみに、LaTeX を Pandoc から呼び出される場合は、Pandoc モードを利用したほうがよいだろう。

PDF 文字列中の BMP 外の文字の取扱

(1.1d 版での改修。)

BXJS クラスでは、hyperref が読み込まれた場合に、PDF 文字列の文字コードについて自動的に適切な設定が行われるようになっている。ところが、以前の版では、エンジンが upLaTeX の場合に BMP 外の文字が化けてしまう。

% upLaTeX 文書; 文字コードUTF-8
\documentclass[uplatex,dvipdfmx,a4paper,
  ja=standard,jafont=moga-mobo]{bxjsarticle}
\usepackage[colorlinks]{hyperref}
\begin{document}
\section{限りなく透明に近い𠮷野家}
\end{document}

新しい版では、比較的新しい TeX 環境であれば、特に何も設定しなくても BMP 外の文字が正しく扱えるようになっている。

bigcode オプション

upLaTeX において PDF 文字列中の BMP 外文字を扱うには、「UTF8-UTF16」という名前のファイルが TeX 環境にインストールされている必要がある。次のコマンドを実行して何らかのパス名が出力されればインストールされていることが判る。

kpsewhich -format=cmap UTF8-UTF16

そして、BXJS クラスでは、「UTF8-UTF16」ファイルが存在する場合にそれを利用して BMP 外文字を扱えるようにするため、次のオプションを用意している。*1

  • bigcode: 「UTF8-UTF16」を利用する。BMP 外の文字を扱えるようになるが、「UTF8-UTF16」が存在しない場合は失敗する(dvipdfmx の実行でエラーが発生する)。「UTF8-UTF16」がインストールされている場合はこちらの指定が望ましい。
  • nobigcode: 「UTF8-UTF16」を利用しない。ゆえに BMP 外の文字は扱えない。「UTF8-UTF16」がインストールされていない場合はこちらを指定する必要がある。

無論、「UTF8-UTF16」がインストールされているかを自動的に判断するのが理想的であるが、その判定は非常に困難なので*2、ユーザが自分で判断して設定できるようにオプションを設けているのである。その上で、デフォルトの値を次のようにしている。

TeX エンジンのバージョンが(2014 年 1 月リリースの)3.14159265 以上であるならば、(「TeX 環境が新しいので UTF8-UTF16 がきっとあるだろう」という推定の上で、)bigcode を既定にする。それ以外は nobigcode を既定にする。

もちろん、TeX のバージョンと UTF8-UTF16 の存在には本来は何の関係もなく、“新しさ”を判定するアドホックな手段に過ぎない。TeX Live の場合、2014 以降で bigcode が既定となるが、実際は、upTeX が使える(2012 以降)ならば UTF8-UTF16 も存在するはずである。既定の値が不都合な場合は明示的に (no)bigcode のオプションを指定してほしい。

hyperref の unicode オプションの自動有効化

(1.1d 版での改修。)

これも hyperref 使用下の PDF 文字列に関する話であるが、BXJS クラスでは、hyperref が読み込まれた場合の unicode オプションについて、前もって次のような設定を行っている。(hyperref が読み込まれない場合は影響しない。)

  • (u)pLaTeX では unicode を無効に“固定”する。((つまり、hyperref のオプションや \hypersetupunicode(=true) が指定されてもその指定は無視される。unicode を無条件に有効化しているテンプレートに対する対策。))
  • pdfLaTeX では unicode を既定で有効にする。
  • LuaLaTeX では unicode を有効に“固定”する。

残るは XeLaTeX であるが、1.1d 版での改修においてこの場合の挙動が変更される。

  • 旧来の版では何も設定しなかった。つまり unicode は既定で無効になる。
  • 新しい版では、XeTeX のバージョンが 0.99992 版以降の場合に限り unicode を既定で有効にする。そうでない場合は何も設定しない。
詳細

実は XeTeX の場合、unicode が有効と無効のどちらの場合にも(内部動作は大きく異なるが)PDF 文字列を(仕様上は)正しく扱うことができる。だから、この改修についてはユーザはあまり気にする必要はない。「本来は unicode を有効にする方が好ましい」ので、“新しい環境”については有効にした、と考えればよいだろう。実際には、unicode が無効の場合には以前に紹介したバグの影響で BMP 外の文字を正しく扱えないという問題があるので、その対策としても、unicode を有効化したほうが得である。

*1:なお、「bigcode」の名前は pxjahyper パッケージの同名のオプションに由来する。

*2:「UTF8-UTF16」は dvipdfmx が利用するファイルなので、TeX からは元々“見えない”のである。