NAME
   LaTeX::TikZ - Perl object model for generating PGF/TikZ code.

VERSION
   Version 0.03

SYNOPSIS
       use LaTeX::TikZ;

       # A couple of lines
       my $hline = Tikz->line(-1 => 1);
       my $vline = Tikz->line([ 0, -1 ] => [ 0, 1 ]);

       # Paint them in red
       $_->mod(Tikz->color('red')) for $hline, $vline;

       # An octogon
       use Math::Complex;
       my $octo = Tikz->closed_polyline(
        map Math::Complex->emake(1, ($_ * pi)/4), 0 .. 7
       );

       # Only keep a portion of it
       $octo->clip(Tikz->rectangle(-0.5*(1+i), 2*(1+i)));

       # Fill it with dots
       $octo->mod(Tikz->pattern(class => 'Dots'));

       # Create a formatter object
       my $tikz = Tikz->formatter(scale => 5);

       # Put those objects all together and print them
       my $seq = Tikz->seq($octo, $hline, $vline);
       my ($head, $decl, $body) = $tikz->render($seq);
       print "$_\n" for map @$_, $head, $decl, $body;

DESCRIPTION
   This module provides an object model for TikZ, a graphical toolkit for
   LaTeX. It allows you to build structures representing geometrical
   figures, apply a wide set of modifiers on them, transform them globally
   with functors, and print them in the context of an existing TeX
   document.

CONCEPTS
   Traditionally, in TikZ, there are two ways of grouping paths together :

   *   either as a *sequence*, where each path is drawn in its own line :

           \draw (0cm,0cm) -- (0cm,1cm) ;
           \draw (0cm,0cm) -- (1cm,0cm) ;

   *   or as an *union*, where paths are all drawn as one line :

           \draw (0cm,0cm) -- (0cm,1cm) (0cm,0cm) -- (1cm,0cm) ;

   This distinction is important because there are some primitives that
   only apply to paths but not to sequences, and vice versa.

   Figures are made of path or sequence *sets* assembled together in a
   tree.

   *Modifiers* can be applied onto any set to alter the way in which it is
   generated. The two TikZ concepts of *clips* and *layers* have been
   unified with the modifiers.

INTERFACE
 Containers
  "union"
       Tikz->union(@kids)

   Creates a LaTeX::TikZ::Set::Union object out of the paths @kids.

       # A path made of two circles
       Tikz->union(
              Tikz->circle(0, 1),
              Tikz->circle(1, 1),
             )
           ->mod(
              Tikz->fill('red'),
              'even odd rule',
             );

  "path"
       Tikz->path(@kids)

   A synonym for "union".

  "join"
       Tikz->join($connector, @kids)

   Creates a LaTeX::TikZ::Set::Chain object that joins the paths @kinds
   with the given $connector which can be, according to "connector" in
   LaTeX::TikZ::Set::Chain, a string, an array reference or a code
   reference.

       # A stair
       Tikz->join('-|', map [ $_, $_ ], 0 .. 5);

  "chain"
       Tikz->chain($kid0, $link0, $kid1, $link1, ... $kidn)

   Creates a LaTeX::TikZ::Set::Chain object that chains $kid0 to $kid1 with
   the string $link0, $kid1 to $kid2 with $link1, and so on.

       # An heart-like shape
       Tikz->chain([ 0, 1 ]
        => '.. controls (-1, 1.5)    and (-0.75, 0.25) ..' => [ 0, 0 ]
        => '.. controls (0.75, 0.25) and (1, 1.5)      ..' => [ 0, 1 ]
       );

  "seq"
       Tikz->seq(@kids)

   Creates a LaTeX::TikZ::Set::Sequence object out of the sequences or
   paths @kids.

       my $bag = Tikz->seq($sequence, $path, $circle, $raw, $point);

 Elements
   Those are the building blocks of your geometrical figure.

  "point"
       Tikz->point($point)

   Creates a LaTeX::TikZ::Set::Point object by coercing $point into a
   LaTeX::TikZ::Point. The following rules are available :

   *   If $point isn't given, the point defaults to "(0, 0)".

           my $origin = Tikz->point;

   *   If $point is a numish Perl scalar, it is treated as "($point, 0)".

           my $unit = Tikz->point(1);

   *   If two numish scalars $x and $y are given, they result in the point
       "($x, $y)".

           my $one_plus_i = Tikz->point(1, 1);

   *   If $point is an array reference, it is parsed as "($point->[0],
       $point->[1])".

           my $i = Tikz->point([ 0, 1 ]);

   *   If $point is a Math::Complex object, the
       LaTeX::TikZ::Point::Math::Complex class is automatically loaded and
       the point is coerced into "($point->Re, $point->Im)".

           my $j = Tikz->point(Math::Complex->emake(1, 2*pi/3));

   You can define automatic coercions from your user point types to
   LaTeX::TikZ::Point by writing your own
   "LaTeX::TikZ::Point::My::User::Point" class. See
   LaTeX::TikZ::Meta::TypeConstraint::Autocoerce for the rationale and
   LaTeX::TikZ::Point::Math::Complex for an example.

  "line"
       Tikz->line($from => $to)

   Creates a LaTeX::TikZ::Set::Line object between the points $from and
   $to.

       my $x_axis = Tikz->line(-5 => 5);
       my $y_axis = Tikz->line([ 0, -5 ] => [ 0, 5 ]);

  "polyline"
       Tikz->polyline(@points)

   Creates a LaTeX::TikZ::Set::Polyline object that links the successive
   elements of @points by segments.

       my $U = Tikz->polyline(
        Tikz->point(0, 1),
        Tikz->point(0, 0),
        Tikz->point(1, 0),
        Tikz->point(1, 1),
       );

  "closed_polyline"
       Tikz->closed_polyline(@points)

   Creates a LaTeX::TikZ::Set::Polyline object that cycles through
   successive elements of @points.

       my $diamond = Tikz->closed_polyline(
        Tikz->point(0, 1),
        Tikz->point(-1, 0),
        Tikz->point(0, -2),
        Tikz->point(1, 0),
       );

  "rectangle"
       Tikz->rectangle($from => $to)
       Tikz->rectangle($from => { width => $width, height => $height })

   Creates a LaTeX::TikZ::Set::Rectangle object with opposite corners $from
   and $to, or with anchor point $from and dimensions $width and $height.

       my $square = Tikz->rectangle(
        Tikz->point,
        Tikz->point(2, 1),
       );

  "circle"
       Tikz->circle($center, $radius)

   Creates a LaTeX::TikZ::Set::Circle object of center $center and radius
   $radius.

       my $unit_circle = Tikz->circle(0, 1);

  "arc"
       Tikz->arc($from => $to, $center)

   Creates a LaTeX::TikZ::Set structure that represents an arc going from
   $from to $to with center $center.

       # An arc. The points are automatically coerced into LaTeX::TikZ::Set::Point objects
       my $quarter = Tikz->arc(
        [ 1, 0 ] => [ 0, 1 ],
        [ 0, 0 ]
       );

  "arrow"
       Tikz->arrow($from => $to)
       Tikz->arrow($from => dir => $dir)

   Creates a LaTeX::TikZ::Set structure that represents an arrow going from
   $from towards $to, or starting at $from in direction $dir.

       # An horizontal arrow
       my $arrow = Tikz->arrow(0 => 1);

  "raw"
       Tikz->raw($content)

   Creates a LaTeX::TikZ::Set::Raw object that will instantiate to the raw
   TikZ code $content.

 Modifiers
   Modifiers are applied onto sets by calling the "->mod" method, like in
   "$set->mod($mod)". This method returns the $set object, so it can be
   chained.

  "clip"
       Tikz->clip($path)

   Creates a LaTeX::TikZ::Mod::Clip object that can be used to clip a given
   sequence by the (closed) path $path.

       my $box = Tikz->clip(
        Tikz->rectangle(0 => [ 1, 1 ]),
       );

   Clips can also be directly applied to sets with the "->clip" method.

       my $set = Tikz->circle(0, 1.5)
                     ->clip(Tikz->rectangle([-1, -1] => [1, 1]));

  "layer"
       Tikz->layer($name, above => \@above, below => \@below)

   Creates a LaTeX::TikZ::Mod::Layer object with name $name and optional
   relative positions @above and @below.

       my $layer = Tikz->layer(
        'top'
        above => [ 'main' ],
       );

   The default layer is "main".

   Layers are stored into a global hash, so that when you refer to them by
   their name, you get the existing layer object.

   Layers can also be directly applied to sets with the "->layer" method.

       my $dots = Tikz->rectangle(0 => [ 1, 1 ])
                      ->mod(Tikz->pattern(class => 'Dots'))
                      ->layer('top');

  "scale"
       Tikz->scale($factor)

   Creates a LaTeX::TikZ::Mod::Scale object that scales the sets onto which
   it apply by the given $factor.

       my $circle_of_radius_2 = Tikz->circle(0 => 1)
                                    ->mod(Tikz->scale(2));

  "width"
       Tikz->width($line_width)

   Creates a LaTeX::TikZ::Mod::Width object that sets the line width to
   $line_width when applied.

       my $thick_arrow = Tikz->arrow(0 => 1)
                             ->mod(Tikz->width(5));

  "color"
       Tikz->color($color)

   Creates a LaTeX::TikZ::Mod::Color object that sets the line color to
   $color (given in the "xcolor" syntax).

       # Paint the previous $thick_arrow in red.
       $thick_arrow->mod(Tikz->color('red'));

  "fill"
       Tikz->fill($color)

   Creates a LaTeX::TikZ::Mod::Fill object that fills the interior of a
   path with the solid color $color (given in the "xcolor" syntax).

       my $red_box = Tikz->rectangle(0 => { width => 1, height => 1 })
                         ->mod(Tikz->fill('red'));

  "pattern"
       Tikz->pattern(class => $class, %args)

   Creates a LaTeX::TikZ::Mod::Pattern object of class $class and arguments
   %args that fills the interior of a path with the specified pattern.
   $class is prepended with "LaTeX::TikZ::Mod::Pattern" when it doesn't
   contain "::". See LaTeX::TikZ::Mod::Pattern::Dots and
   LaTeX::TikZ::Mod::Pattern::Lines for two examples of pattern classes.

       my $hatched_circle = Tikz->circle(0 => 1)
                                ->mod(Tikz->pattern(class => 'Lines'));

  "raw_mod"
       Tikz->raw_mod($content)

   Creates a LaTeX::TikZ::Mod::Raw object that will instantiate to the raw
   TikZ mod code $content.

       my $homemade_arrow = Tikz->line(0 => 1)
                                ->mod(Tikz->raw_mod('->')) # or just ->mod('->')

 Helpers
  "formatter"
       Tikz->formatter(%args)

   Creates a LaTeX::TikZ::Formatter object that can render a
   LaTeX::TikZ::Set tree.

       my $tikz = Tikz->formatter;
       my ($header, $declarations, $seq1_body, $seq2_body) = $tikz->render($set1, $set2);

  "functor"
       Tikz->functor(@rules)

   Creates a LaTeX::TikZ::Functor anonymous subroutine that can be called
   against LaTeX::TikZ::Set trees to clone them according to the given
   rules. @rules should be a list of array references whose first element
   is the class/role to match against and the second the handler to
   execute.

       # The default is a clone method
       my $clone = Tikz->functor;
       my $dup = $set->$clone;

       # A translator
       my $translate = Tikz->functor(
        'LaTeX::TikZ::Set::Point' => sub {
         my ($functor, $set, $x, $y) = @_;

         $set->new(
          point => [
           $set->x + $x,
           $set->y + $y,
          ],
          label => $set->label,
          pos   => $set->pos,
         );
        },
       );
       my $shifted = $set->$translate(1, 1);

       # A mod stripper
       my $strip = Tikz->functor(
        '+LaTeX::TikZ::Mod' => sub { return },
       );
       my $naked = $set->$strip;

DEPENDENCIES
   Mouse 0.80 or greater.

   Sub::Name.

   Math::Complex, Math::Trig.

   Scalar::Util, List::Util, Task::Weaken.

SEE ALSO
   PGF/TikZ - <http://pgf.sourceforge.net>.

AUTHOR
   Vincent Pit, "<perl at profvince.com>", <http://www.profvince.com>.

   You can contact me by mail or on "irc.perl.org" (vincent).

BUGS
   Please report any bugs or feature requests to "bug-latex-tikz at
   rt.cpan.org", or through the web interface at
   <http://rt.cpan.org/NoAuth/ReportBug.html?Queue=LaTeX-TikZ>. I will be
   notified, and then you'll automatically be notified of progress on your
   bug as I make changes.

SUPPORT
   You can find documentation for this module with the perldoc command.

       perldoc LaTeX::TikZ

COPYRIGHT & LICENSE
   Copyright 2010,2011,2012,2013,2014,2015 Vincent Pit, all rights
   reserved.

   This program is free software; you can redistribute it and/or modify it
   under the same terms as Perl itself.