%%
%% This is file `tikzlibraryrulercompass.code.tex',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% rulercompass.dtx  (with options: `tikzlibrary')
%% ---------------------------------------------------------------
%% rulercompass --- a TikZ/PGF library for drawing straight-edge
%%                  and compass diagrams
%% E-mail: [email protected]
%% Released under the LaTeX Project Public Licence v1.3c or later
%% See http://www.latex-project.org/lppl.txt
%% ---------------------------------------------------------------
%%
\usetikzlibrary{intersections,calc}
\newif\ifrc@draft
\newif\ifrc@beamer
\newif\ifrc@fliparc
\newcount\rc@picture@id
\newcounter{pointlabels}
\@ifclassloaded{beamer}{%
 \rc@beamertrue
}{}
\def\rc@pathsep{@}
\ifrc@beamer
\resetcounteronoverlays{pointlabels}
\resetcountonoverlays{rc@picture@id}
\tikzset{
 alt if exist/.code args={#1#2#3}{%
   \@ifundefined{path@\the\rc@picture@id @#1}{%
     \pgfkeysalso{#2}%
   }{
     \alt<.-\csname path@\the\rc@picture@id @#1\endcsname>{%
       \pgfkeysalso{#2}%
     }{
       \pgfkeysalso{#3}%
     }%
   }%
 },
 intersection/save/.code={%
   \only<.>{%
     \begingroup
     \tikz@intersect@path@names@parse#1\tikz@stop
     \protected@write\pgfutil@auxout{}{%
       \string\global\string\@namedef{path@\the\rc@picture@id @\tikz@intersect@path@a}{\the\beamer@slideinframe}%
       \string\global\string\@namedef{path@\the\rc@picture@id @\tikz@intersect@path@b}{\the\beamer@slideinframe}%
     }%
   \endgroup
   }%
 }
}
\newcommand<>\compass[3][]{%
 \draw#4[#1,ruler compass/compass={#2}{#3}];
}

\newcommand<>\ruler[3][]{%
 \draw#4[#1,ruler compass/ruler={#2}{#3}];
}
\newcommand<>\point[4][]{%
 {%
   \advance\c@pointlabels by 1\relax
   \xdef\rc@temp{\thepointlabels}%
 }%
 \edef\rc@tempa{\the\rc@picture@id}%
 \expandafter\ifx\csname rc@id@\rc@temp\endcsname\rc@tempa
   \path#5 (\rc@temp) node[ruler compass/point,#1] {};
 \else
   \path#5 [name intersections={use=#2 and #3}] (intersection-#4) node[ruler compass/point,#1] {};
 \fi
}
\else
\tikzset{
 alt if exist/.code args={#1#2#3}{%
   \pgfkeysalso{#2}%
 },
 intersection/save/.code={%
   \begingroup
   \tikz@intersect@path@names@parse#1\tikz@stop
   \protected@write\pgfutil@auxout{}{%
       \string\global\string\@namedef{path@\the\rc@picture@id @\tikz@intersect@path@a}{\thepage}%
       \string\global\string\@namedef{path@\the\rc@picture@id @\tikz@intersect@path@b}{\thepage}%
   }%
   \endgroup
 }
}
\newcommand\compass[3][]{%
 \draw [#1,ruler compass/compass={#2}{#3}];
}

\newcommand\ruler[3][]{%
 \draw [#1,ruler compass/ruler={#2}{#3}];
}

\newcommand\point[4][]{%
 \path [name intersections={use=#2 and #3}] (intersection-#4) node[ruler compass/point,#1] {};
}
\fi
\def\rc@processpt#1{%
 \pgfutil@ifnextchar.{\rc@processpt@@#1}{\rc@processpt@#1}}
\def\rc@processpt@#1#2\pgf@stop{%
 \pgfutil@in@+{#2}%
 \ifpgfutil@in@
  \let\@next=\rc@processpt@plus
 \else
  \pgfutil@in@-{#2}%
  \ifpgfutil@in@
   \let\@next=\rc@processpt@minus
  \else
   \let\@next=\rc@processpt@bare
  \fi
 \fi
 \@next#1#2\pgf@stop
}
\def\rc@processpt@@#1.#2\pgf@stop{%
 \def\rc@temp{#2}%
 \ifx\rc@temp\pgfutil@empty
 \edef\rc@temp{\thepointlabels}%
 \else
 \pgfmathparse{int(\the\c@pointlabels + #2)}%
 \begingroup
 \c@pointlabels=\pgfmathresult\relax
 \xdef\rc@temp{\thepointlabels}%
 \endgroup
 \fi
 \let#1\rc@temp
}
\def\rc@processpt@plus#1#2+#3\pgf@stop{%
 \pgfmathsetmacro\rc@temp{0}%
 \rc@reverse#2\pgf@stop%
 \pgfmathparse{int(\rc@temp + #3)}%
 \begingroup
 \c@pointlabels=\pgfmathresult\relax
 \xdef\rc@temp{\thepointlabels}%
 \endgroup
 \let#1\rc@temp
}
\def\rc@processpt@minus#1#2-#3\pgf@stop{%
 \pgfmathsetmacro\rc@temp{0}%
 \rc@reverse#2\pgf@stop%
 \pgfmathparse{int(\rc@temp - #3)}%
 \begingroup
 \c@pointlabels=\pgfmathresult\relax
 \xdef\rc@temp{\thepointlabels}%
 \endgroup
 \let#1\rc@temp
}
\def\rc@processpt@bare#1#2\pgf@stop{%
 \def#1{#2}}
\def\rc@reverse#1{%
 \ifx#1\pgf@stop
   \let\@next=\pgfutil@empty
 \else
   \let\@next=\rc@reverse
   \pgfutil@tempcnta=`#1\relax
   \pgfmathsetmacro\rc@temp{\rc@temp * \rc@factor + \the\pgfutil@tempcnta - \rc@initial}%
 \fi
 \@next}
\def\rc@parsepath#1#2#3#4\pgf@stop{%
 \rc@processpt\rc@tempa#3\pgf@stop
 \rc@processpt\rc@tempb#4\pgf@stop
 \xdef#1{#2\rc@pathsep\rc@tempa\rc@pathsep\rc@tempb}%
}
\tikzset{
 every picture/.append style={
   ruler compass/at begin picture
 },
 intersection/use/.code args={#1 and #2}{%
   \rc@parsepath\rc@pta#1\pgf@stop
   \rc@parsepath\rc@ptb#2\pgf@stop
   \pgfkeysalso{
     of={\rc@pta} and \rc@ptb,
     save={\rc@pta} and \rc@ptb,
   }
 },
 circle through/.style={
   to path={
     \pgfextra{
       \tikz@scan@one@point\pgfutil@firstofone(\tikztostart)\relax
       \pgf@xa=\pgf@x
       \pgf@ya=\pgf@y
       \tikz@scan@one@point\pgfutil@firstofone(\tikztotarget)\relax
       \pgfmathsetmacro\rc@radius{veclen(\pgf@x - \pgf@xa,\pgf@y - \pgf@ya)}%
     }
     circle[radius=\rc@radius pt] (\tikztotarget)
   }
 },
 arc flip/.is if=rc@fliparc,
 centred arc to/.code 2 args={%
   \tikz@scan@one@point\pgfutil@firstofone(#1)\relax
   \pgfmathsetmacro\rc@radius{veclen(\tikz@lastx-\pgf@x,\tikz@lasty-\pgf@y)}%
   \pgfmathsetmacro\rc@sangle{atan2(\tikz@lasty - \pgf@y,\tikz@lastx - \pgf@x)}%
   \pgf@xa=\pgf@x
   \pgf@ya=\pgf@y
   \tikz@scan@one@point\pgfutil@firstofone(#2)\relax
   \pgfmathsetmacro\rc@eangle{atan2(\pgf@y - \pgf@ya,\pgf@x - \pgf@xa)}%
   \pgfmathsetmacro\rc@eangle{\rc@eangle < \rc@sangle ? \rc@eangle +       360 : \rc@eangle}%
   \ifrc@fliparc
   \pgfmathsetmacro\rc@eangle{\rc@eangle - 360}%
   \fi
   \pgfkeysalso{start angle=\rc@sangle, end angle=\rc@eangle, radius=\rc@radius pt}
 },
 ruler compass/.is family,
 ruler compass/.cd,
 draft mode/.is if=rc@draft,
 at begin picture/.style={
   execute at begin picture={
     \global\advance\rc@picture@id by 1\relax
     \setcounter{pointlabels}{0}%
   },
 },
 point labels/.is choice,
 point labels/arabic/.code={%
   \renewcommand\thepointlabels{\@arabic \c@pointlabels}%
   \def\rc@initial{48}%
   \def\rc@factor{10}%
 },
 point labels/alph/.code={%
   \renewcommand\thepointlabels{\@alph \c@pointlabels}%
   \def\rc@initial{96}%
   \def\rc@factor{26}%
 },
 point labels/Alph/.code={%
   \renewcommand\thepointlabels{\@Alph \c@pointlabels}%
   \def\rc@initial{64}%
   \def\rc@factor{26}%
 },
 point labels/alphalph/.code={%
   \@ifundefined{alphalph}{%
     \message{The "alphalph" option only works if the 'alphalph' package has been loaded (using "alph" instead).}%
     \renewcommand\thepointlabels{\@alph \c@pointlabels}%
     \def\rc@initial{96}%
     \def\rc@factor{26}%
   }{%
     \renewcommand\thepointlabels{\alphalph \c@pointlabels}%
     \def\rc@initial{96}%
     \def\rc@factor{26}%
   }%
 },
 point labels/AlphAlph/.code={%
   \@ifundefined{alphalph}{%
     \message{The "AlphAlph" option only works if the 'alphalph' package has been loaded (using "Alph" instead).}%
     \renewcommand\thepointlabels{\@Alph \c@pointlabels}%
     \def\rc@initial{64}%
     \def\rc@factor{26}%
   }{%
     \renewcommand\thepointlabels{\AlphAlph \c@pointlabels}%
     \def\rc@initial{64}%
     \def\rc@factor{26}%
   }%
 },
 construction in use/.style={
   draw=blue
 },
 construction not in use/.style={
   draw=gray!75,
 },
 compass/.code 2 args={%
   \rc@processpt\rc@pta#1\pgf@stop
   \rc@processpt\rc@ptb#2\pgf@stop
   \pgfkeysalso{ruler compass/compass aux={\rc@pta}{\rc@ptb}}%
 },
 compass aux/.style 2 args={
   alt if exist={c\rc@pathsep#1\rc@pathsep#2}{
     ruler compass/construction in use/.try,
   }{
     ruler compass/construction not in use/.try
   },
   name path=c\rc@pathsep#1\rc@pathsep#2,
   ruler compass/every construction path/.try,
   ruler compass/every compass/.try,
   insert path={
     (#1) to[circle through] (#2)
     node[name=c\rc@pathsep#1\rc@pathsep#2\rc@pathsep centre,ruler compass/aux point={#1}] {}
     node[name=c\rc@pathsep#1\rc@pathsep#2\rc@pathsep rim,ruler compass/aux point={#2}] {}
   },
 },
 ruler/.code 2 args={%
   \rc@processpt\rc@pta#1\pgf@stop
   \rc@processpt\rc@ptb#2\pgf@stop
   \pgfkeysalso{ruler compass/ruler aux={\rc@pta}{\rc@ptb}}%
 },
 ruler aux/.style 2 args={
   overlay,
   alt if exist={r\rc@pathsep#1\rc@pathsep#2}{
     ruler compass/construction in use/.try
   }{
     ruler compass/construction not in use/.try
   },
   name path=r\rc@pathsep#1\rc@pathsep#2,
   ruler compass/every construction path/.try,
   ruler compass/every ruler/.try,
   insert path={
     ($(#1)!\pgfkeysvalueof{/tikz/ruler compass/ruler length}!(#2)$) -- ($(#2)!\pgfkeysvalueof{/tikz/ruler compass/ruler length}!(#1)$)
     node[name=r\rc@pathsep#1\rc@pathsep#2\rc@pathsep start,ruler compass/aux point={#1}] {}
     node[name=r\rc@pathsep#1\rc@pathsep#2\rc@pathsep end,ruler compass/aux point={#2}] {}
   },
 },
 ruler length/.initial=20,
 aux point/.style={
   node contents/.try={},
   at={(#1)},
   ruler compass/every aux point/.try
 },
 point/.style={
   ruler compass/name it,
   coordinate,
   node contents/.try={},
   insert path={
     node[
       fill=#1,
       circle,
       minimum width=1mm,
       inner sep=0mm,
       reset label anchor,
       anchor=center,
       node contents/.try={},
       ruler compass/every point/.try,
     ] {}
   }
 },
 name it/.code={%
   \ifx\tikz@fig@name\pgfutil@empty
   \stepcounter{pointlabels}%
   \pgfkeysalso{name=\thepointlabels}%
   \expandafter\xdef\csname rc@id@\thepointlabels\endcsname{\the\rc@picture@id}%
   \ifrc@draft
   \pgfkeysalso{label={[ruler compass/draft label/.try]\thepointlabels}}%
   \fi
   \fi
 },
 point/.default=black,
}
\def\rc@scale{1}
\def\rc@offset{0pt}
\def\jump@setbb#1#2#3{%
 \@ifundefined{jump@#1@maxbb}{%
   \expandafter\gdef\csname jump@#1@maxbb\endcsname{#3}%
 }{%
   \csname jump@#1@maxbb\endcsname
   \pgf@xa=\pgf@x
   \pgf@ya=\pgf@y
   #3
   \pgfmathsetlength\pgf@x{max(\pgf@x,\pgf@xa)}%
   \pgfmathsetlength\pgf@y{max(\pgf@y,\pgf@ya)}%
   \expandafter\xdef\csname jump@#1@maxbb\endcsname{\noexpand\pgfpoint{\the\pgf@x}{\the\pgf@y}}%
 }
 \@ifundefined{jump@#1@minbb}{%
   \expandafter\gdef\csname jump@#1@minbb\endcsname{#2}%
 }{%
   \csname jump@#1@minbb\endcsname
   \pgf@xa=\pgf@x
   \pgf@ya=\pgf@y
   #2
   \pgfmathsetlength\pgf@x{min(\pgf@x,\pgf@xa)}%
   \pgfmathsetlength\pgf@y{min(\pgf@y,\pgf@ya)}%
   \expandafter\xdef\csname jump@#1@minbb\endcsname{\noexpand\pgfpoint{\the\pgf@x}{\the\pgf@y}}%
 }
}
\tikzset{
 stop jumping/.style={
   execute at end picture={%
     \pgfmathsetlength\pgf@xa{\pgf@picminx/\rc@scale}%
     \pgfmathsetlength\pgf@ya{\pgf@picminy/\rc@scale}%
     \pgfmathsetlength\pgf@xb{\pgf@picmaxx/\rc@scale}%
     \pgfmathsetlength\pgf@yb{\pgf@picmaxy/\rc@scale}%
     \immediate\write\pgfutil@auxout{%
       \noexpand\jump@setbb{\the\rc@picture@id}{\noexpand\pgfpoint{\the\pgf@xa}{\the\pgf@ya}}{\noexpand\pgfpoint{\the\pgf@xb}{\the\pgf@yb}}%
     },
     \pgf@x=\pgf@picminx
     \pgf@y=\pgf@picminy
     \csname jump@\the\rc@picture@id @minbb\endcsname
     \pgf@xa=\pgf@x
     \pgf@ya=\pgf@y
     \pgf@x=\pgf@picmaxx
     \pgf@y=\pgf@picmaxy
     \csname jump@\the\rc@picture@id @maxbb\endcsname
     \edef\rc@temp{\noexpand\path (\the\pgf@xa - \rc@offset,\the\pgf@ya - \rc@offset) -- (\the\pgf@x + \rc@offset,\the\pgf@y + \rc@offset);}%
     \rc@temp
   },
 },
 max size/.code 2 args={%
   \pgfutil@ifundefined{jump@\the\rc@picture@id @maxbb}{}{%
     \csname jump@\the\rc@picture@id @maxbb\endcsname
     \pgf@xa=\pgf@x
     \pgf@ya=\pgf@y
     \csname jump@\the\rc@picture@id @minbb\endcsname
     \advance\pgf@xa by -\pgf@x
     \advance\pgf@ya by -\pgf@y
     \advance\pgf@xa by \rc@offset
     \advance\pgf@xa by \rc@offset
     \advance\pgf@ya by \rc@offset
     \advance\pgf@ya by \rc@offset
     \pgfmathsetmacro\rc@xratio{\pgf@xa > #1 ? \pgf@xa/#1 : 1}%
     \pgfmathsetmacro\rc@yratio{\pgf@ya > #2 ? \pgf@ya/#2 : 1}%
     \pgfmathsetmacro\rc@scale{1/max(\rc@xratio,\rc@yratio)}%
     \pgfkeysalso{scale=\rc@scale}%
   }
 },
 enclosing box/offset/.store in=\rc@offset,
 constrain/.style={
   execute at begin picture=\constrain
 }
}
\newcommand\constrain{%
 \pgfutil@ifundefined{jump@\the\rc@picture@id @minbb}{}{%
   \csname jump@\the\rc@picture@id @minbb\endcsname
   \pgfmathsetlength\pgf@xa{\pgf@x-\rc@offset}%
   \pgfmathsetlength\pgf@ya{\pgf@y-\rc@offset}%
   \csname jump@\the\rc@picture@id @maxbb\endcsname
   \pgfmathsetlength\pgf@xb{\pgf@x+\rc@offset}%
   \pgfmathsetlength\pgf@yb{\pgf@y+\rc@offset}%
   \edef\rc@temp{\noexpand\clip (\the\pgf@xa,\the\pgf@ya) rectangle (\the\pgf@xb,\the\pgf@yb);}
   \ifpgf@relevantforpicturesize
     \pgf@relevantforpicturesizefalse
     \rc@temp
     \pgf@relevantforpicturesizetrue
   \else
     \rc@temp
   \fi
 }%
}

\expandafter\def\csname pgf@sh@ns@enclosing box\endcsname{rectangle}
\expandafter\def\csname pgf@sh@np@enclosing box\endcsname{%
 \pgfutil@ifundefined{jump@\the\rc@picture@id @minbb}{%
   \def\southwest{\pgfqpoint{\pgf@picminx}{\pgf@picminy}}%
   \def\northeast{\pgfqpoint{\pgf@picmaxx}{\pgf@picmaxy}}%
}{%
   \csname jump@\the\rc@picture@id @minbb\endcsname
   \pgfmathsetlength\pgf@xa{\pgf@x-\rc@offset}%
   \pgfmathsetlength\pgf@ya{\pgf@y-\rc@offset}%
   \edef\southwest{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
   \csname jump@\the\rc@picture@id @maxbb\endcsname
   \pgfmathsetlength\pgf@xb{\pgf@x+\rc@offset}%
   \pgfmathsetlength\pgf@yb{\pgf@y+\rc@offset}%
   \edef\northeast{\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}%
 }%
}
\expandafter\def\csname pgf@sh@nt@enclosing box\endcsname{{1}{0}{0}{1}{0pt}{0pt}}
\expandafter\def\csname pgf@sh@pi@enclosing box\endcsname{\pgfpictureid}

\tikzset{
 on layer/.code={
   \pgfonlayer{#1}\begingroup
   \aftergroup\endpgfonlayer
   \aftergroup\endgroup
 },
 node on layer/.code={
   \gdef\node@@on@layer{%
     \setbox\tikz@tempbox=\hbox\bgroup\pgfonlayer{#1}\unhbox\tikz@tempbox\endpgfonlayer\egroup}
   \aftergroup\node@on@layer
 },
 reset label anchor/.code={%
   \let\tikz@auto@anchor=\pgfutil@empty
   \def\tikz@anchor{#1}
 },
 reset label anchor/.default=center
}
\def\node@on@layer{\aftergroup\node@@on@layer}
\@ifpackageloaded{alphalph}%
{
 \tikzset{ruler compass/point labels=alphalph}
}
{
 \tikzset{ruler compass/point labels=alph}
}

%%
%% Copyright (C) 2013 by Andrew Stacey <[email protected]>
%%
%% This file may be distributed and/or modified under the conditions
%% of the LaTeX Project Public License, either version 1.3 of this
%% license or (at your option) any later version.
%% The latest version of this license is in:
%%
%%    http://www.latex-project.org/lppl.txt
%%
%% and version 1.3 or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.
%%
%% This work is "maintained" (as per LPPL maintenance status) by
%% Andrew Stacey.
%%
%% This work consists of the files  rulercompass.dtx
%%                                  rulercompass_doc.tex
%% and the derived files            tikzlibraryrulercompass.code.tex
%%                                  rulercompass.ins
%%                                  rulercompass.pdf
%%                                  rulercompass_doc.pdf
%%                                  README.txt
%%
%%
%%
%% End of file `tikzlibraryrulercompass.code.tex'.