「はてなブログ」でも、MathJax拡張であるXyJaxが使えることが分かって(「はてなブログでもXyJaxが使える」参照)、今後使うために、XyJaxとそのもとになったXy-picについて調べてみました -- そのメモをここに記します。
内容:
Xy-picとXyJax
Xy-picはTeX組版システム上で、絵図〈グラフィックス〉を描くための描画システムです。XyJaxは、Xy-pic機能のかなりの部分(全部ではない)をXyJax上で再現したクローンソフトウェアです。一部のXy-pic機能は実装されてませんが、実装されている部分の互換性は高く、Xy-picに関する情報はそのままXyJaxに対しても適用できます(素晴らしい)。
Xy-pic/XyJaxの主要機能はXyマトリックス(\xymatrix
コマンド)で、これに関しては、『Xy-picユーザーガイド』に記述されています。
『Xy-picユーザーガイド』は、XyJaxのドキュメントとしても(TeX特有の記述を除けば)そのまま使えます。そして、『Xy-picユーザーガイド』の内容を理解すれば、Xy-pic/XyJaxを使う上でほとんど不自由は無いと思います。
Xyマトリックス機能だけでなく、Xy-picの全機能を記述したマニュアルは次です。
このマニュアルはあまり読みやすくありません。構文記述のBNF〈Backus-Naur form〉がなんだか不正確な気がします。僕はちゃんと確認したわけじゃないですが、実際の挙動との食い違いや誤植(コマンド名綴り間違い)もあるようです -- 次のドキュメントで指摘されています。
- "Commutative Diagrams with Xy-pic I. Kernel Functions and Arrows" by Paul A. Blaga
- "Commutative Diagrams with XY-pic II. Frames and Matrices" by Paul A. Blaga
上記の解説(二部作)は分かりやすくてオススメです。
以下、Xy-picについて述べますが、XyJaxでも同じです。2つのシステムに違いがあるときはその旨注意します。
Xy-picの階層的構成
Xy-picグラフィックス・システムは、3つの階層から構成されます。下部構造から順に、カーネル、拡張、フィーチャです。
カーネル〈kernel〉は、描画エンジンと、描画エンジンが受け付ける描画命令の体系からなります。描画エンジンは一種の仮想機械です。その仮想機械のアセンブラ言語が“描画命令の体系”でありカーネル言語〈kernal language〉と呼ばれます。
拡張〈extension〉は、カーネルに対して描画機能を追加するライブラリモジュールです。『Xy-picマニュアル』目次から、拡張の名前だけ引用します。ただし、TeX組版システムとそのバックエンドに固有な拡張は省略します。
- Curve and Spline
- Frame and Bracket
- More Tips
- Line styles
- Rotate and Scale
- Colour
- Pattern and Tile
- Import graphics
これらの拡張はカーネルを強化するもので、Xy-picユーザーやXy-pic応用プログラマからは、カーネルと一体化して見えるものです。拡張によってサポートされる機能(曲線やフレームなど)も(強化された)カーネル機能だとみなしてかまわないでしょう。
フィーチャ〈feature〉は、特定の応用分野で利用するグラフィックスDSL〈domain specific language〉を提供します。Xy-picの目玉であるマトリックス機能もフィーチャのひとつです。Xy-picのフィーチャをマニュアル目次から引用すると:
- Arrow and Path
- Two-cell
- Matrix
- Graph
- Polygon
- Lattice and web
- Circle, Ellipse, Arc
- Knots and Links
- Smart Path(Arrowへの機能追加)
- Barr’s diagram
Arrow and Path は汎用の描画機能なので、拡張に近いもので、他のフィーチャから使われています。XyJaxで実装されているフィーチャは、Arrow and Path と Matrix だけです。Two-cell は、2次元のペースティング図を描けるフィーチャで、僕は欲しいのですがXyJaxでは使えません。Graph は一般的なグラフを描く機能です -- これも欲しい。Knots and Links は結び目理論で出てくる図を描くためのフィーチャです -- あれば便利そう。でも、XyJaxにはありません、残念。
フィーチャはそれ自身の独自の構文〈記法〉を持ちます。「カーネル言語:フィーチャ言語 = アセンブラ言語:応用向け高級言語」という感じです(あまり“高級さ”はないですが)。フィーチャの構文は、カーネル言語の構文ともTeX言語の構文とも(似てるが)違うものです。例えば、アスタリスク文字 '*' は、カーネル構文では描画オペレーター記号ですが、Matrixフィーチャ構文ではオブジェクトを生成する記号です。
カーネル構文、フィーチャ構文、TeX構文が似てるが微妙に違う事態は、混乱しがちでストレスを感じます。実際、注意が必要です。
XyJaxの機能
XyJaxは、Xy-picのMatrixフィーチャを提供することを目的としたソフトウェアだと思ってよいでしょう。Matrixフィーチャを実現するための他のフィーチャ(Arrow and Path)とXy-pic拡張(MathJax拡張ではない)とXy-picカーネル機能が、MathJax拡張フレームワーク内でJavaScript言語で実装されています。
XyJaxの拡張や応用言語〈フィーチャ〉作成のフレームワークは用意されてないようなので、XyJaxを改変するにはJavaScriptコードを編集するしかなさそうです。
MathJaxは現在バージョン3.xになってますが、XyJaxはMathJaxバージョン2.xでないと使えません。3.x対応の予定も現状ないようです。まだしばらくは2.xが使われそうなので、ショートレンジでは問題ないと思います。
XyJaxで実現されているフィーチャはMatrixだけですが、たいていのことはMatrixでなんとかなりそうではあります。どうしてもMatrixで処理できないケースでは、カーネル言語/拡張が使えるので、「XyJax: Xyマトリックスを使わない可換図式描画」で例示したようなMatrix無しの記述もできます。およそ十分な機能性と言えるでしょう。僕は、この機能性のなかでやりくりしてみようと思っています。