マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

「LaTeXでオブジェクト指向プログラミング」したもの

「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}

どうやら正しく動いているようである。

LaTeXOOP」は実用的な技術!?

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

*1:TikZ の下位システム。

*2:PGF は描画用パッケージであるが、もちろん、この oo モジュールは描画機能と無関係に用いることができる。

*3:pgfplots の機能を PGF/TikZ 本体に持たせようという考えらしい。

*4:ソースのコメントに使い方が書いてある。