X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FLaTeX%2FTikZ%2FFormatter.pm;h=efa7dc6ed1da9c6558a18a02940163bdaa3d55b7;hb=ee0f9123624eb8e48675f80303ed436b9a94e348;hp=0838e46d0262176dc216efe45ba9dbf99ebf048f;hpb=c09a50b51230b49b80114d2bd5a3c0a7250c6bf9;p=perl%2Fmodules%2FLaTeX-TikZ.git diff --git a/lib/LaTeX/TikZ/Formatter.pm b/lib/LaTeX/TikZ/Formatter.pm index 0838e46..efa7dc6 100644 --- a/lib/LaTeX/TikZ/Formatter.pm +++ b/lib/LaTeX/TikZ/Formatter.pm @@ -17,6 +17,10 @@ our $VERSION = '0.01'; use Sub::Name (); +use LaTeX::TikZ::Point; + +use LaTeX::TikZ::Interface; + use LaTeX::TikZ::Tools; use Any::Moose; @@ -35,34 +39,41 @@ has 'format' => ( ); has 'scale' => ( - is => 'ro', + is => 'rw', isa => 'Num', default => 1, ); has 'width' => ( - is => 'ro', + is => 'rw', isa => 'Maybe[Num]', ); has 'height' => ( - is => 'ro', + is => 'rw', isa => 'Maybe[Num]', ); has 'origin' => ( - is => 'ro', - isa => 'Maybe[LaTeX::TikZ::Point::Autocoerce]', + is => 'rw', + isa => 'LaTeX::TikZ::Point::Autocoerce', coerce => 1, ); sub id { my $tikz = shift; + my $origin = $tikz->origin; + if (defined $origin) { + my ($x, $y) = map $origin->$_, qw/x y/; + $origin = "($x;$y)"; + } else { + $origin = "(0;0)"; + } + join $;, map { - my $val = $tikz->$_; - defined($val) ? "$val" : '(undef)'; - } qw/unit format scale width height origin/; + defined() ? "$_" : '(undef)'; + } map($tikz->$_, qw/unit format scale width height/), $origin; } my $find_mods = do { @@ -103,29 +114,52 @@ my $find_mods = do { }); }; +my $translate; + sub render { - my $tikz = shift; + my ($tikz, @sets) = @_; + + unless ($translate) { + require LaTeX::TikZ::Functor; + $translate = LaTeX::TikZ::Functor->new( + rules => [ + 'LaTeX::TikZ::Set::Point' => sub { + my ($functor, $set, $v) = @_; + + $set->new( + point => [ + $set->x + $v->x, + $set->y + $v->y, + ], + label => $set->label, + pos => $set->pos, + ); + }, + ], + ); + } - my $seq = LaTeX::TikZ::Set::Sequence->new( - kids => \@_, - ); + my $origin = $tikz->origin; + if (defined $origin) { + @sets = map $_->$translate($origin), @sets; + } my (@layers, @other_mods); + my $seq = LaTeX::TikZ::Set::Sequence->new(kids => \@sets); $find_mods->($seq, \@layers, \@other_mods); - my $o = $tikz->origin; - $seq = $seq->translate($o) if defined $o; - my $w = $tikz->width; my $h = $tikz->height; my $canvas = ''; if (defined $w and defined $h) { require LaTeX::TikZ::Set::Rectangle; - $seq->clip(LaTeX::TikZ::Set::Rectangle->new( - from => 0, - width => $w, - height => $h, - )); + for (@sets) { + $_->clip(LaTeX::TikZ::Set::Rectangle->new( + from => 0, + width => $w, + height => $h, + )); + } $_ = $tikz->len($_) for $w, $h; $canvas = ",papersize={$w,$h},body={$w,$h}"; } @@ -140,13 +174,13 @@ sub render { push @decls, LaTeX::TikZ::Mod::Layer->declare(@layers) if @layers; push @decls, $_->declare($tikz) for @other_mods; - my @content = ( + my @bodies = map [ "\\begin{tikzpicture}", - @{ $seq->draw($tikz) }, + @{ $_->draw($tikz) }, "\\end{tikzpicture}", - ); + ], @sets; - return \@header, \@decls, \@content; + return \@header, \@decls, @bodies; } sub len { @@ -172,7 +206,7 @@ sub label { my $scale = sprintf '%0.2f', $tikz->scale / 5; - "node[scale=$scale,$pos] {\$$name\$}"; + "node[scale=$scale,$pos] {$name}"; } sub thickness { @@ -182,11 +216,13 @@ sub thickness { 0.8 * $width * ($tikz->scale / 5); } -use LaTeX::TikZ::Interface formatter => sub { - shift; +LaTeX::TikZ::Interface->register( + formatter => sub { + shift; - __PACKAGE__->new(@_); -}; + __PACKAGE__->new(@_); + }, +); __PACKAGE__->meta->make_immutable;