summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2013-12-12 22:54:58 +0000
committerKarl Berry <karl@freefriends.org>2013-12-12 22:54:58 +0000
commitb2e97cd1b691e067fe3a30311a099576cf31257e (patch)
tree9f2149e7a37b9811e3913367573b4292c9fa26a4 /Master/texmf-dist/source
parent7991cab643e93ba549e06207a24036d4cd8d598a (diff)
rulercompass (12dec13)
git-svn-id: svn://tug.org/texlive/trunk@32392 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source')
-rw-r--r--Master/texmf-dist/source/latex/rulercompass/rulercompass.dtx811
-rw-r--r--Master/texmf-dist/source/latex/rulercompass/rulercompass.ins84
2 files changed, 895 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/rulercompass/rulercompass.dtx b/Master/texmf-dist/source/latex/rulercompass/rulercompass.dtx
new file mode 100644
index 00000000000..58034995083
--- /dev/null
+++ b/Master/texmf-dist/source/latex/rulercompass/rulercompass.dtx
@@ -0,0 +1,811 @@
+% \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 \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/rulercompass/rulercompass.ins b/Master/texmf-dist/source/latex/rulercompass/rulercompass.ins
new file mode 100644
index 00000000000..b370b06876c
--- /dev/null
+++ b/Master/texmf-dist/source/latex/rulercompass/rulercompass.ins
@@ -0,0 +1,84 @@
+%%
+%% This is file `rulercompass.ins',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% rulercompass.dtx (with options: `install')
+%% ---------------------------------------------------------------
+%% 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
+%% ---------------------------------------------------------------
+%%
+\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}}}
+\endbatchfile
+%%
+%% 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
+%%
+%%
+%%
+%% End of file `rulercompass.ins'.