「TikZ のマニュアルの Part VI」(の「Object-Oriented Programming」の節)で説明されているのが、PGF *1の oo モジュールで、これを用いるとオブジェクト指向プログラミングができる。*2
とにかく使ってみる
oo モジュールでスタックを(杜撰に)実装してみた。
\documentclass{article} \usepackage{pgf} \usepgfmodule{oo} \makeatletter %------------------------- \pgfooclass{stack}{% class definition \attribute -data; \method stack() {% constructor \pgfoolet{-data}\@empty } \method push(#1) {% pushes #1 into this \edef\xx@tempa{{#1}\pgfoovalueof{-data}} \pgfoolet{-data}\xx@tempa } \method let-pop(#1) {% pops this and puts the value into #1 \edef\xx@tempa{\pgfoovalueof{-data}} \ifx\xx@tempa\@empty \let#1\stackempty \else \edef\xx@tempb{\expandafter\@gobble\xx@tempa} \pgfoolet{-data}\xx@tempb \edef\xx@tempb{\expandafter\@car\xx@tempa\relax\@nil} \let#1\xx@tempb \fi } } \def\stackempty{\stackempety@} \makeatother %------------------------- \begin{document} \pgfoonew\stackA=new stack() % スタックを生成する \pgfoonew\stackB=new stack() % スタックをもう一つ生成する \stackA.push(one) % 両方のスタックに値をプッシュする \stackB.push(eins) % 無論 2 つのスタックは全く独立に動作する \stackB.push(zwei) \stackA.push(two) % 入れた値をポップして表示する \stackA.let-pop(\result)\typeout{\result}%==> two \stackB.let-pop(\result)\typeout{\result}%==> zwei \stackA.let-pop(\result)\typeout{\result}%==> one \end{document}
どうやら正しく動いているようである。
「LaTeX で OOP」は実用的な技術!?
PGF に oo モジュールがあるということは、OOP で実装された PGF/TikZ のライブラリが実際に使われていることも期待できそうである。ただし今のところは oo を使った TikZ のライブラリは datavisualization *3というものしかなくて、これはまだマニュアルに記載されていない。*4
datavisualization の PGF モジュール(pgfmoduledatavisualization.code.tex)((datavisualization ライブラリは「TikZ ライブラリ」「PGF ライブラリ」「PGF モジュール」の三階建てになっているようである。TikZ で使う場合は \usetikzlibrary{datavisualization} として読み込む。))の一部を載せておく。oo モジュールの機能が使われていることが解ると思う。
\usepgfmodule{oo,shapes}
\usepgflibrary{fpu}
% …(略)…
\pgfooclass{data visualization}
{
% …(略)…
\attribute before survey;
\attribute at start survey;
\attribute at end survey;
\attribute after survey;
% …(略)…
\attribute survey count=1;
% …(略)…
\attribute prepare datapoint signal;
\attribute map datapoint signal;
\attribute transform datapoint signal;
% …(略)…
% Constructor
%
% Inits the signals
\method data visualization() {
\pgfoonew{prepare datapoint signal}=new signal()%
\pgfoonew{map datapoint signal}=new signal()%
\pgfoonew{transform datapoint signal}=new signal()%
% …(略)…
\pgfoothis.get handle(\pgf@dv@me)
\pgfkeyslet{/pgf/data visualization/obj}\pgf@dv@me
}
% …(略)…
\method connect(#1,#2,#3) {
\pgfoovalueof{#3}.connect(#1,#2)
}
% …(略)…
\method visualize() {
% Visualization phase.
\let\pgfdatapoint=\pgfdatapoint@visualizationphase%
\pgfoothis.prepare signal macros()
\pgf@signalphase.emit(\pgfdvbeforevisualization)%
\pgfoovalueof{before visualization}
\pgf@signalphase.emit(\pgfdvbeginvisualization)%
\pgfoovalueof{at start visualization}
\pgfoovalueof{data}%
\pgfoovalueof{at end visualization}
\pgf@signalphase.emit(\pgfdvendvisualization)%
\pgfoovalueof{after visualization}
\pgf@signalphase.emit(\pgfdvaftervisualization)%
}
} TikZ の datavisualization ライブラリを実際に使っている例として、TeX.SX の Altermundus 氏の回答を紹介しておく。
今のところは中途半端な公開状態にある datavisualization であるが、これが実際に pgfplots を置き換える日が来るかも知れない。そうなれば、「LaTeX でオブジェクト指向プログラミング」はネタなどではなく真っ当に実用的な技術といえるだろう。