% \iffalse meta-comment
%<*internal>
\iffalse
%</internal>
%<*readme>
---------------------------------------------------------------
rulercompass --- a TikZ/PGF library for drawing straight-edge
                 and compass diagrams
E-mail: stacey@math.ntnu.no
Released under the LaTeX Project Public Licence v1.3c or later
See http://www.latex-project.org/lppl.txt
---------------------------------------------------------------

This package defines some commands and styles intended for
drawing straight-edge and compass diagrams.
%</readme>
%<*internal>
\fi
\def\nameofplainTeX{plain}
\ifx\fmtname\nameofplainTeX\else
\expandafter\begingroup
\fi
%</internal>
%<*install>
\input docstrip.tex
\keepsilent
\askforoverwritefalse
\preamble
---------------------------------------------------------------
rulercompass --- a TikZ/PGF library for drawing straight-edge
                 and compass diagrams
E-mail: stacey@math.ntnu.no
Released under the LaTeX Project Public Licence v1.3c or later
See http://www.latex-project.org/lppl.txt
---------------------------------------------------------------

\endpreamble
\postamble

Copyright (C) 2013 by Andrew Stacey <stacey@math.ntnu.no>

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


\endpostamble
\usedir{tex/latex/rulercompass}
\generate{\file{tikzlibraryrulercompass.code.tex}{\from{rulercompass.dtx}{tikzlibrary}}}
%</install>
%<install>\endbatchfile
%<*internal>
\usedir{source/latex/rulercompass}
\generate{
  \file{\jobname.ins}{\from{\jobname.dtx}{install}}
}
\nopreamble\nopostamble
\generate{
  \file{README.txt}{\from{\jobname.dtx}{readme}}
}
\ifx\fmtname\nameofplainTeX
  \expandafter\endbatchfile
\else
  \expandafter\endgroup
\fi
%</internal>
%<*driver>
\documentclass[full]{l3doc}
\usepackage[T1]{fontenc}
\usepackage{csquotes}
\usepackage{lmodern}
\usepackage{alphalph}
\usepackage{tikz}
\usetikzlibrary{rulercompass}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
\DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
%
% \CheckSum{785}
%
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
%
%
%
% \DoNotIndex{\newcommand,\newenvironment}
%
% \providecommand*{\url}{\texttt}
% \title{The \textsf{rulercompass} package: code}
% \author{Andrew Stacey \\ \url{stacey@math.ntnu.no}}
% \maketitle
%
%
% \StopEventually{\PrintChanges}
% \section{Implementation}
%
% \iffalse
%<*tikzlibrary>
% \fi
%
% Load in useful tikzlibraries.
%    \begin{macrocode}
\usetikzlibrary{intersections,calc}
%    \end{macrocode}
%^^A
% Are we in draft mode (so display point labels)?
%    \begin{macrocode}
\newif\ifrc@draft
%    \end{macrocode}
%^^A
% Is beamer loaded?
%    \begin{macrocode}
\newif\ifrc@beamer
%    \end{macrocode}
%^^A
% When drawing arc segments, do we flip the segment?
%    \begin{macrocode}
\newif\ifrc@fliparc
%    \end{macrocode}
%^^A
% A picture id that stays the same on beamer frames to make it easier to compare bounding boxes and other information of the ``same'' tikzpicture.
%    \begin{macrocode}
\newcount\rc@picture@id
%    \end{macrocode}
%^^A
% Counter for our point labels.
%    \begin{macrocode}
\newcounter{pointlabels}
%    \end{macrocode}
%^^A
% Set the beamer boolean.
%    \begin{macrocode}
\@ifclassloaded{beamer}{%
  \rc@beamertrue
}{}
%    \end{macrocode}
%^^A
% Internal separator for the path-naming scheme
%    \begin{macrocode}
\def\rc@pathsep{@}
%    \end{macrocode}
%^^A
% Are we running under beamer?
%    \begin{macrocode}
\ifrc@beamer
%    \end{macrocode}
% Make our counters reset on frames
%    \begin{macrocode}
\resetcounteronoverlays{pointlabels}
\resetcountonoverlays{rc@picture@id}
%    \end{macrocode}
%^^A
% Define an overlay-aware style
%    \begin{macrocode}
\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}%
      }%
    }%
  },
%    \end{macrocode}
% Save a path when it is used to compute a point
%     \begin{macrocode}
  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
    }%
  }
}
%    \end{macrocode}
%^^A
% Define overlay-aware versions of the main macros.
%    \begin{macrocode}
\newcommand<>\compass[3][]{%
  \draw#4[#1,ruler compass/compass={#2}{#3}];
}

\newcommand<>\ruler[3][]{%
  \draw#4[#1,ruler compass/ruler={#2}{#3}];
}
%    \end{macrocode}
%^^A
% The \verb+\point+ macro is doubly overlay aware.
% If the intersection has already been computed (say, on another slide of the same picture), reuse it.
%    \begin{macrocode}
\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
}
%    \end{macrocode}
%^^A
% Now for the non-beamer versions
%    \begin{macrocode}
\else
%    \end{macrocode}
%^^A
% The overlay-aware style defaults to the first option.
%    \begin{macrocode}
\tikzset{
  alt if exist/.code args={#1#2#3}{%
    \pgfkeysalso{#2}%
  },
%    \end{macrocode}
% Saving this means we don't have to have two versions of a more complicated bit of code.
%    \begin{macrocode} 
  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
  }
}
%    \end{macrocode}
%^^A
% Non-overlay aware versions of the primary commands.
%    \begin{macrocode}
\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] {};
}
%    \end{macrocode}
%^^A
% End of non-beamer specific section
%    \begin{macrocode}
\fi
%    \end{macrocode}
%^^A
% The following macros process the path/point specifications.
% The first looks to see if the first character is a period.
%    \begin{macrocode}
\def\rc@processpt#1{%
  \pgfutil@ifnextchar.{\rc@processpt@@#1}{\rc@processpt@#1}}
%    \end{macrocode}
% Nope, so now look for a plus or a minus.
%    \begin{macrocode}
\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
}
%    \end{macrocode}
%^^A
% Okay, we got a period.
% That means the current point, possibly with an offset.
%    \begin{macrocode}
\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
}
%    \end{macrocode}
%^^A
% We need to add an offset to the given label, so need to compute the index of the label.
%    \begin{macrocode}
\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
}
%    \end{macrocode}
%^^A
% Same, but with a minus.
%    \begin{macrocode}
\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
}
%    \end{macrocode}
%^^A
% Simplest case.
%    \begin{macrocode}
\def\rc@processpt@bare#1#2\pgf@stop{%
  \def#1{#2}}
%    \end{macrocode}
%^^A
% Reverse lookup the counter value from its displayed format.
%    \begin{macrocode}
\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}
%    \end{macrocode}
%^^A
% Compute the actual path name from the three token (lists).
%    \begin{macrocode}
\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}%
}
%    \end{macrocode}
%^^A
% Now we install all our styles
%    \begin{macrocode}
\tikzset{
%    \end{macrocode}
%^^A
% Code which initialises our counters at the start of a picture.
%    \begin{macrocode}
  every picture/.append style={
    ruler compass/at begin picture
  },
%    \end{macrocode}
%^^A
% Passes the paths to the intersection but also takes note of their use.
%    \begin{macrocode}
  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,
    }
  },
%    \end{macrocode}
%^^A
% \verb+to path+ for a circle through a given point.
%    \begin{macrocode}
  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)
    }
  },
%    \end{macrocode}
%^^A
% Flip an arc when drawing a segment.
%    \begin{macrocode}
  arc flip/.is if=rc@fliparc,
%    \end{macrocode}
%^^A
% Arc from one point to another centred on specified point.
%    \begin{macrocode}
  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}
  },
%    \end{macrocode}
%^^A
% Most of our keys are in this family.
%    \begin{macrocode}
  ruler compass/.is family,
  ruler compass/.cd,
%    \end{macrocode}
%^^A
% Draft mode displays the labels.
%    \begin{macrocode}
  draft mode/.is if=rc@draft,
%  beamer mode/.is if=rc@beamer,
%    \end{macrocode}
%^^A
% This is the actual code for resetting the counters.
%    \begin{macrocode}
  at begin picture/.style={
    execute at begin picture={
      \global\advance\rc@picture@id by 1\relax
      \setcounter{pointlabels}{0}%
    },
  },
%    \end{macrocode}
%^^A
% Styling the point labels.
%    \begin{macrocode}
  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}%
  },
%    \end{macrocode}
%^^A
% Styling the point labels with the \verb+alphalph+ package.
%    \begin{macrocode}
  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}%
    }%
  },
%    \end{macrocode}
%^^A
% Styles for if the path is still in use or not.
%    \begin{macrocode}
  construction in use/.style={
    draw=blue
  },
  construction not in use/.style={
    draw=gray!75,
  },
%    \end{macrocode}
%^^A
% Code for drawing a circle.
%    \begin{macrocode}
  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}] {}
    },
  },
%    \end{macrocode}
%^^A
% Code for drawing a straight line.
%    \begin{macrocode}
  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}] {}
    },
  },
%    \end{macrocode}
%^^A
% Sets the ruler length.
%    \begin{macrocode}
  ruler length/.initial=20,
%    \end{macrocode}
%^^A
% Auxiliary point style.
%    \begin{macrocode}
  aux point/.style={
    node contents/.try={},
    at={(#1)},
    ruler compass/every aux point/.try
  },
%    \end{macrocode}
%^^A
% Draws a point as a coordinate with another node for styling.
%    \begin{macrocode}
  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,
      ] {}
    }
  },
%    \end{macrocode}
%^^A
% Forces a point to be named.
%    \begin{macrocode}
  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,
}
%    \end{macrocode}
%^^A
% Sets the initial scale and offset of the enclosing box.
%    \begin{macrocode}
\def\rc@scale{1}
\def\rc@offset{0pt}
%    \end{macrocode}
%^^A
% Sets the bounding box from the auxiliary file.
%    \begin{macrocode}
\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}}%
  }
}
%    \end{macrocode}
%^^A
% Installs the code to save the bounding box. 
%    \begin{macrocode}
\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
    },
  },
%    \end{macrocode}
%^^A
% Scales the picture to fit inside a given rectangle.
%    \begin{macrocode}
  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}%
    }
  },
%    \end{macrocode}
%^^A
%^^A
%    \begin{macrocode}
  enclosing box/offset/.store in=\rc@offset,
  constrain/.style={
    execute at begin picture=\constrain
  }
}
%    \end{macrocode}
%^^A
% Defines a clip to the enclosing box.
%    \begin{macrocode}
\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
  }%
}

%    \end{macrocode}
%^^A
% Defines the enclosing box node.
%    \begin{macrocode}
\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}


%    \end{macrocode}
%^^A
% Defines the layer code for individual paths and nodes.
%    \begin{macrocode}
\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}
%    \end{macrocode}
%^^A
% Sets the point label style.
%    \begin{macrocode}
\@ifpackageloaded{alphalph}%
{
  \tikzset{ruler compass/point labels=alphalph}
}
{
  \tikzset{ruler compass/point labels=alph}
}

\endinput
%    \end{macrocode}
% \iffalse
%</tikzlibrary>
% \fi
%
%\Finale