読者です 読者をやめる 読者になる 読者になる

Acetaminophen’s diary

化学に関すること,TeXに関すること,ゆきだるまに関すること。

pLaTeX の新しいパッケージバンドル「platex-tools」の紹介

先日、新しい pLaTeX 対応パッケージ群をアップロードした。

既に TeX Live にも W32TeX にもインストールされたので、簡単に入手可能。

  • TeX Live r42263 (2016/10/15) ← collection-langjapanese に含まれる
  • W32TeX (2016/10/16) ← platex.tar.xz の一部

現在入っているのは、以下の5つのパッケージである。

いずれもpLaTeX で海外製パッケージがうまく動かない」という現象に対処するうえで有用だろう(特に縦組対策)。これらについて簡単に紹介(宣伝?)しておく。

GitHub リポジトリはこちら → platex-tools - The pLaTeX standard tools bundle

 

1. plextarray パッケージ:plext + array サポート

pLaTeX には昔から plext パッケージが付属している。これは「連数字 (\rensuji)」や「傍線 (\kasen)」といった縦組で便利な命令を追加する*1だけでなく、横書きがメインの pLaTeX/upLaTeX 文書で「部分的な縦書き」するために用いることもできる。具体的には、「横書き文書中に縦組の表を入れる」や「縦書き文書中に横組の表を入れる」という拡張が含まれていて、< ... > という括弧に組方向を表す t, y, z のいずれかを入れるという使い方をする。

  • \begin{array}<組方向>[垂直位置]{列書式指定}~\end{array}
  • \begin{tabular}<組方向>[垂直位置]{列書式指定}~\end{tabular}
  • \begin{tabular*}<組方向>[幅][垂直位置]{列書式指定}~\end{tabular*}

詳細は以下の記事を参照されたい。

日本独自の拡張がある一方で、本家 LaTeX チームのほうは別の拡張を提供している。それが array パッケージである。これは列書式指定をより柔軟に変えるための、新たな書式を提供する拡張である。

  • m{width}:項目を縦方向の中心に配置する。
  • b{width}:項目を縦方向の下部に配置する。
  • >{$}...<{$}:項目に数式を入れる。

こちらの詳細は、以下のページが参考になるだろう。

ところが、この2つの拡張はともに tabular/array 環境の定義を書き換えているため、従来は「どちらか一つしか使えない」という状態だった。実際に plext → array の順でパッケージを読み込んで両方使おうと試みると

\documentclass{jsarticle}
\usepackage{plext}
\usepackage{array}
\begin{document}

\begin{tabular}<t>{|>{$}c<{$}|c|}\hline
\exp(x) & 指数関数 \\ \hline
\log(x) & 対数関数 \\ \hline
\end{tabular}

\end{document}
! Package array Error: <{..} at wrong position: changed to !{..}.

See the array package documentation for explanation.
Type  H  <return>  for immediate help.
 ...                                              
                                                  
l.6 \begin{tabular}<
                    t>{|>{$}c<{$}|c|}\hline
? 

この場合 plext 拡張 <t> を消すと通るので「plext 拡張が array 拡張によって上書き消去された」ことがわかるだろう。一方、array → plext の順で読み込むと

\documentclass{jsarticle}
\usepackage{array}
\usepackage{plext}
\begin{document}

\begin{tabular}<t>{cc}\hline
$\exp(x)$ & 指数関数 \\ \hline
$\log(x)$ & 対数関数 \\ \hline
\end{tabular}

\end{document}
! Missing # inserted in alignment preamble.
<to be read again>
                   \cr 
l.6 \begin{tabular}<t>{cc}
                          \hline
? 

表組を使ったとたんに意味不明なエラーが出てきていた。

このような問題を解決するのが、plextarray パッケージである。ただ読み込むだけで OK!

\usepackage{plextarray}

これでどちらのケースも期待どおりの結果が得られる。(なお、このパッケージは LuaTeX-ja プロジェクト制作の lltjext パッケージを参考に実装しているが、微妙に内部実装が異なる。前回の記事で「strutbox パッチ」を取り上げたが、将来的なパッチの採否によって結果が変わることのないように配慮して実装したためである。)

余談:なお array パッケージは、tabularx パッケージ(表セル内で揃え位置指定)や dcolumn パッケージ(小数点で位を揃える)といった割と有名なパッケージからも読み込まれている*2。plextarray パッケージは、これらを plext パッケージと共存させたい場合にもやはり有効である。

 

2. plextdelarray パッケージ:plext + delarray サポート

こちらも plext + array と似た問題が起きる。delarray パッケージは「配列 array の左右を自動的に括弧ではさむ」という機能を提供するパッケージである。ところが、delarray の場合は array パッケージを内部で利用しているというだけでなく、さらに問題は深刻となっている。plext パッケージの「組方向拡張」が delarray の内部処理とほとんど相容れないものになっていて、plext を大幅に書き換えない限り完全な共存は困難になっていると思う。

plextdelarray パッケージは、この問題に対して「部分的な対策」を施す。やはり読み込むだけで OK。

\usepackage{plextdelarray}

plext を大幅に書き換えないという制約下で書いたため、残念ながらこれは plextarray ほど完全なものにはなっていない。ただし、とりあえず簡単なパッチのみを提供することで「エラーなく“モノ”が出てくる」ことは達成できたと思う(もしかすると本家 delarray と plextdelarray で出力が異なることはあるかもしれない)。

 

3. pxftnright パッケージ:ftnright の縦組サポート

二段組みでは、デフォルトでは脚注が左右それぞれのカラムの下端に分かれて配置される。ftnright パッケージを読み込むと、脚注が右カラムにまとめられる。

\documentclass[a5paper,papersize,twocolumn]{jsarticle}
\usepackage{ftnright}
\begin{document}
(適当な長い文章)
ここに脚注を\footnote{脚注です。}入れました。
(適当な長い文章)
もう一つ脚注を\footnote{ふたつめの脚注です。}入れてみましょう。
(適当な長い文章)
\end{document}

f:id:acetaminophen:20161017230016p:plain

縦組でも傍注(縦組の場合、\footnote で得られるのは正式には「脚注」ではなく「傍注」とよばれるものである)を上下カラムに分けず、下カラムにまとめたいという需要があるだろう。ところが、このパッケージは縦組クラス(tarticle.cls など)ではエラーが出て使えなかった。

! Incompatible direction list can't be unboxed.
\@startcolumn ...nsert \footins {\unvbox \footins 
                                                  }\fi \fi 
l.11 \end{document}
                   
? 

この現象が話題になったのは TeX Forum の投稿である。

割と簡単な修正で ftnright の縦組対応化は可能であるため、これを pxftnright パッケージとして発表した。これもやはり「読み込むだけ」だが、本家 ftnright より前に pxftnright を読み込む必要がある。

\documentclass[twocolumn]{tarticle}
\usepackage{pxftnright}
\begin{document}
(適当な長い文章)
ここに脚注を\footnote{脚注です。}入れました。
(適当な長い文章)
もう一つ脚注を\footnote{ふたつめの脚注です。}入れてみましょう。
(適当な長い文章)
\end{document}

f:id:acetaminophen:20161017231855p:plain

ちなみに、縦組で ftnright が使えないというだけでなく、pLaTeX では「ボトムフロート→脚注」の順で出力する仕様であることに ftnright の処理を適合させるパッチもついでに含めてある(参考)。

 

4. pxeverysel パッケージ:everysel の pLaTeX 対応版

everysel パッケージは「フォントを切り替えるたびにナントカする」という処理を追加する機能を提供する。「フォントを切り替えたときにメッセージを出す」などの使われ方が多い(ユーザが使うというよりは、パッケージ開発者などがデバッグ目的で使う場合が多いのかもしれない?)ようだが、残念ながら現在の版では pLaTeX について everysel パッケージは知らないようである。したがって、単純に everysel パッケージを読み込むと「日本語フォント切り替え機能が上書き消去される」と言う問題がある。

pxeverysel パッケージを使えば、おそらく多くの場合に pLaTeX でも everysel の機能が使用可能になると思う。これもただ読み込むだけ

ZR さんによる実装 (Gist) を少し改変したもの採録させていただいた。

 

5. pxeveryshi パッケージ:everyshi(TikZ など)の縦組サポート

縦組で tikz 等のパッケージを使うと

ABD: EveryShipout initializing macros
! Incompatible direction list can't be unboxed.
\@EveryShipout@Hook ...vbox \@cclv \unvbox \@cclv 
                                                  \else \hsize =\wd \@cclv \...
l.11 \end{document}
                   
? 

というエラーが出る。これは everyshi パッケージ(ページを出力 = shipout するごとにナントカする)が pLaTeX 縦組を考慮していないためである。everyshi パッケージを使うほかの例はあまり知らないが、TikZ が縦組で使えないというだけでかなり影響は大きいのかもしれない。

この問題は、pxeveryshi パッケージを読み込むことで対処できる。これもただ読み込むだけ。

これも ZR さんによる実装 (Gist) をそのまま採録させていただいた。

 

現在気づいている問題点について

plextarray パッケージを使用した場合に、array パッケージ単独と比べて「括弧の高さが変わる」という事例がある。

これは明らかに変な挙動である。ところが、この原因は plextarray ではなく plext のほうにある:forum:1355 でも既出の不自然な挙動で(意図的にそうしているのかどうかは全く不明)、将来 plext を修正することによって解消するのがよいと思う。

 

余談:何故バンドルにしたか

今回のパッケージたちはすべて latex-tools バンドルと ms バンドルに対する細かいパッチ集である。単独ではなんらユーザコマンドを提供しないため全く使い物にならない;本家を読み込んで初めて動作するものばかりである。このため、バラバラでリリースするよりはバンドルにすることで「platex-tools -- pLaTeX standard tools bundle」といういかにもソレらしい名前を付けたほうが良いと判断した。少しでも存在感を高めることができれば幸いである。

*1:このために、tarticle.cls など「pLaTeX 標準縦組クラス」では plext が自動的に読み込まれる仕組みになっている。

*2:tabularx の基本的な使い方は「tabularx.sty: LaTeX パッケージ」、dcolumn の基本的な使い方は「LaTeX 表の書き方」がわかりやすい。