「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 でオブジェクト指向プログラミング」はネタなどではなく真っ当に実用的な技術といえるだろう。