Acetaminophen’s diary

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

XyMTeX の機能を最大限引き出す「正しい利用法」

LaTeX で化学構造式を描画するパッケージとして、藤田眞作氏による XyMTeX が有名である。

XyMTeX の使い方は公式マニュアル*1に書かれているし、簡単な紹介は TeX Wiki に、また以下のページに使い方の一部が解説されている。

しかし、そもそも XyMTeX のマクロを使用する以前の問題で、XyMTeX パッケージを読み込む際の注意点についてはどこにも明記されていない。そのため、意外と XyMTeX の使い初めの段階でつまずいている場合も多いのではなかろうか? そこで、今回は XyMTeX の3つの描画方式とそれらの正しい利用法を解説する。サンプルソースと PDF は GitHub に置いた(LaTeX ソースファイルは一つだけ置いた;本文は一切書き変えることなく、プリアンブルのみ書き変えることで本記事の画像を再現できる)。

 

XyMTeX の3つの描画方式

藤田氏自身の説明によると、XyMTeX には3つの描画方式がある。

  • TeX/LaTeX モード(推奨しません)
  • PostScript 対応モード
  • PDF 対応モード

それぞれに対応したパッケージ (.sty) が用意されているので、ユーザは単に \usepackage{xymtex}\usepackage{xymtexps}\usepackage{xymtexpdf} かを切り替えるだけでモードを切り替えることができる。

しかし、これらの違いを正しく認識していないためだろうか、XyMTeX の使い方を紹介した記事では単に \usepackage{xymtex} としている場合があまりにも多い。おそらく \usepackage{xymtexps}\usepackage{xymtexpdf} を試しはしたが、望みどおり動かずエラーが発生したのだろう。それもそのはず、これらのパッケージは LaTeX エンジン+ドライバの組み合わせを厳しく選ぶからである。

TeX/LaTeX モード

TeX/LaTeX モードにあたる xymtex.sty は、すべての LaTeX エンジン+ドライバの組み合わせに対して互換性をもつ。このパッケージは、LaTeX の picture 環境に基づく標準の描画機能の範囲内*2で全ての構造式描画を完結させている。この方法は互換性が保証されている代わりに、有名な「picture 環境の制約」により出力はあまり綺麗にならない。

picture 環境の制約といえば、可能な線分の傾きや長さ・円弧の大きさが限られているというものである。これは picture 環境の描画がフォントを並べることによって実現されているからである。要するに、斜めの線分は line10, linew10 というフォントを使い、円弧は lcircle10 や lcirclew10 というフォントによって描かれており、その他の曲線は細かい黒い正方形をひたすら並べることによって近似的に描画しているにすぎない。これでは綺麗に書けないのも当然だと理解できるだろう。

実際にこの方式で作成した構造式を、Adobe Reader で表示したのが以下の図である。斜めの線分が途中で切れて微妙にずれているのがわかるだろう*3

f:id:acetaminophen:20150606190350p:plain

PostScript 対応モードと PDF 対応モード

そこで藤田氏は、互換性を損なってでも新たに開発された拡張機能を活用するためのパッケージを用意することにしたのだろう。それが xymtexps.sty と xymtexpdf.sty というパッケージである。

実際に使ってみると分かるが、xymtexps のほうは PSTricks パッケージを読み込んで処理する。PSTricks による描画命令は、TeX エンジンが処理することなく DVI ファイルに PostScript special として埋め込まれる。そして、埋め込まれたコマンドは特定の DVI ウェアによって PostScript ファイルに書き込まれ、最終的には Ghostscript などのインタプリタが処理して PDF などに変換されたり印刷されたりする。したがって、この PSTricks 依存の xymtexps を使い場合は、日本語ユーザ向けの処理系統は platex → dvips → ps2pdf や xelatex にほぼ限られるだろう。

また、xymtexpdf のほうは TikZ パッケージを読み込んで処理する。TikZ は PGF (Portable Graphics Format) という描画エンジンのフロントエンドで、PGF の描画命令には最近の主要な TeX エンジンが幅広く対応している。したがって、適切にドライバを指定すれば pdflatex や xelatex のほか、platex → dvipdfmx や platex → dvips → ps2pdf でも処理できる

これらの方式で作成した構造式が以下の図である(上が xymtexps;下が xymtexpdf)。いずれも線分が途中で途切れることなく描画され、楔形も綺麗に表示されている。

f:id:acetaminophen:20150606190559p:plain

f:id:acetaminophen:20150606190612p:plain

 

それぞれの描画モード利用時の注意点

上に貼り付けた3つの図を作成するためには、当然、パッケージの正しい利用法を理解することが必要である。以下で正しい利用法を説明する。

まず、XyMTeX の3方式いずれにおいても内部で xcolor.sty が読み込まれることに注意すべきである。xcolor パッケージはドライバ依存で、例えば platex → dvipdfmx でタイプセットする場合にドライバを指定しなければ自動的に dvips とみなされて都合が悪い。さらに、3つめの方式は tikz.sty を読み込む際に追加で graphicx.sty も読み込まれ、こちらもデフォルトで dvips とみなされてしまう。というわけで、主な処理過程についてまとめておくと:

  1. \usepackage{xymtex}
    • platex + dvipdfmx の場合:dvipdfmx ドライバ指定を追加*4
    • platex + dvips + ps2pdf の場合:特になし*5
    • pdflatex または xelatex の場合:特になし*6
  2. \usepackage{xymtexps}
    • platex + dvips + ps2pdf の場合:特になし*7
    • xelatex の場合:特になし*8
  3. \usepackage{xymtexpdf}
    • platex + dvipdfmx の場合:dvipdfmx ドライバ指定を追加*9
    • platex + dvips + ps2pdf の場合:dvips ドライバ指定を追加*10
    • pdflatex または xelatex の場合:特になし*11

 

結局、どれを使うべきか

XyMTeX の異なる描画モードによる出力を比較した既存の記事が見当たらなかったので、今回の記事で xymtexps または xymtexpdf を使うメリットが初めてわかった読者もいるだろう。日本語の文書を作成する場合は、dvips + ps2pdf というスキームよりも dvipdfmx を使うスキームがメジャーであることは良く知られており、おそらくほとんどの場合 xymtexpdf を使うのが最も好ましいだろう。

しかし、せっかく XyMTeX が「LaTeX 標準の描画機能の範囲内で完結させることができる」という特徴を持っているのに、わざわざ xymtexpdf を使うのは大げさだという考えもあるだろう。そこで、もう一つの選択肢として xymtexpdf を使わずに xymtex 単独でもう少し描画品質を高める方法を考えてみよう。

私が調べた範囲内では「楔形(立体配置の表示に使う記号)を一切使わない場合」に限って、よく知られている軽量な picture 環境の拡張パッケージを利用して少しだけ描画品質を高めることができた。

eepic パッケージ

軽量な picture 環境の拡張として、1つめに挙げられるのが eepic パッケージである。このパッケージを \usepackage{eepic} として読み込むと、描画コマンドは tpic specials として DVI ファイルに埋め込まれる。これが tpic 拡張という DVI ドライバの拡張機能によって処理されることになる。この tpic 拡張は dvipdfmx をはじめ dvips, dviout, xdvi 等の多くの DVI ドライバでサポートされているが、DVI を経由しない pdftex 等でサポートされていないので、現在の主流からは外れてきているようだ。

dvipdfmx で使えるということなので、とりあえず xymtex と組み合わせて利用してみた結果が以下の図である。線分が一本に続けて描画されていることがわかるだろう。ただし、本来の xymtexps や xymtexpdf ならば楔形で表示されるべき部分の描画が美しいとはいえない。化学的には楔形の代わりに太線や破線を利用することになっているので正しいことは正しい…と思いきや、一部が太線にすらなっていない! これは問題である

f:id:acetaminophen:20150606192330p:plain

pict2e パッケージ

こちらも軽量な picture 環境の拡張である。ドライバの拡張機能に合わせた命令を投げるので、利用は \usepackage[ドライバ名]{pict2e} のようにする。ドライバとしては pdftex, xetex, dvipdfmx, dvips, xdvi 等の多くの主要なドライバがサポートされており、picture 環境の拡張としては最も信頼できるだろう。

こちらも dvipdfmx で使えるので、xymtex と組み合わせて利用した結果が以下の図である。こちらも楔形で表示されるべき部分が美しくないとはいえ、一応は太線と破線の表示が化学的に正しくなされている

f:id:acetaminophen:20150606192444p:plain

bxeepic パッケージ

先ほど紹介した eepic パッケージが主流から外れつつある今、eepic パッケージのマクロを pict2e の拡張機能で再実装し、最大限活用しようというのが、この bxeepic パッケージである。詳しい説明は開発者である ZR さんのページにあるので省略するが、bxeepic なら pdftex, xetex, dvipdfmx, dvips, xdvi 等の pict2e が対応しているドライバで動作し、最近の PDF 直接出力を目指す風潮とも適合している。

これを、xymtex と組み合わせて利用した結果が以下の図である。

f:id:acetaminophen:20150606192631p:plain

楔形で表示されるべき部分を見てみよう。先ほどまでの eepic, pict2e と同様に太線と破線に置き換わってはいるが、微妙に破線の精度が向上している。太線と破線の表示も化学的に正しく、しかも破線が綺麗ということは、今のところこの bxeepic が一番すぐれていることになる。

 

XyMTeX の上手な利用法まとめ

長くなったが、要するに XyMTeX を日本語で利用する場合は xymtexpdf を platex + dvipdfmx で使うのが描画品質としてベストである*12。ただし、楔形の描画が太線と破線に置き換わることを気にしないのであれば、xymtex + bxeepic の組み合わせを platex + dvipdfmx で使うのも一つの選択肢として有効であろう*13

*1:W32TeX の場合はコマンドで texdoc xymtex-manual と入力すればよい(紛らわしいことに、texdoc xymtex と入力すると古い ver.1.1 のマニュアルが表示される)。TeX Live 2014 にはマニュアルの PDF 版が同梱されていないので、直接公式サイトに読みに行く必要がある。

*2:xymtex.sty が内部的に読み込む epic.sty も、単に LaTeX の標準描画機能だけを利用するマクロである。

*3:これは PDF ビューアとディスプレイやプリンタの解像度との兼ね合いの問題でもある。

*4:グローバルオプション、すなわち \documentclass[dvipdfmx]{jsarticle} とする。この方法が使えない場合は xymtex より前に \usepackage[dvipdfmx]{xcolor} とする。

*5:デフォルトが dvips.def のため。

*6:pdftex.def や xetex.def に自動で切り替わるため。

*7:デフォルトが dvips.def で、PSTricks も dvips 向けのため。

*8:xetex.def に自動で切り替わり、PSTricks も xdvipdfmx 向けに切り替わるため。

*9:グローバルオプション、すなわち \documentclass[dvipdfmx]{jsarticle} とする。この方法が使えない場合は xymtex より前に \usepackage[dvipdfmx]{graphicx,xcolor} とする。

*10:グローバルオプション、すなわち \documentclass[dvips]{jsarticle} とする。

*11:pdftex.def や xetex.def に自動で切り替わるため。

*12:ただし、とりあげて platex + dvips + ps2pdf で処理する必要があれば xymtexps を使うべき。

*13:もちろん bxeepic は pict2e を利用するためドライバ依存になっていることは留意しておく必要があるが、「比較的重いが高度な描画機能をそれひとつで完結させる TikZ や PSTricks」と比べて、「最小限の拡張で済む軽量な pict2e」を知っておくことは XyMTeX に限らず有用であろう。