summaryrefslogtreecommitdiff
path: root/graphics/pgf/base/doc/pgfmanual-en-tutorial-Euclid.tex
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/pgf/base/doc/pgfmanual-en-tutorial-Euclid.tex')
-rw-r--r--graphics/pgf/base/doc/pgfmanual-en-tutorial-Euclid.tex692
1 files changed, 692 insertions, 0 deletions
diff --git a/graphics/pgf/base/doc/pgfmanual-en-tutorial-Euclid.tex b/graphics/pgf/base/doc/pgfmanual-en-tutorial-Euclid.tex
new file mode 100644
index 0000000000..228cfbbe19
--- /dev/null
+++ b/graphics/pgf/base/doc/pgfmanual-en-tutorial-Euclid.tex
@@ -0,0 +1,692 @@
+% Copyright 2019 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Tutorial: Euclid's Amber Version of the \emph{Elements}}
+
+In this third tutorial we have a look at how \tikzname\ can be used to draw
+geometric constructions.
+
+Euclid is currently quite busy writing his new book series, whose working title
+is ``Elements'' (Euclid is not quite sure whether this title will convey the
+message of the series to future generations correctly, but he intends to change
+the title before it goes to the publisher). Up to now, he wrote down his text
+and graphics on papyrus, but his publisher suddenly insists that he must submit
+in electronic form. Euclid tries to argue with the publisher that electronics
+will only be discovered thousands of years later, but the publisher informs him
+that the use of papyrus is no longer cutting edge technology and Euclid will
+just have to keep up with modern tools.
+
+Slightly disgruntled, Euclid starts converting his papyrus entitled ``Book I,
+Proposition I'' to an amber version.
+
+
+\subsection{Book I, Proposition I}
+
+The drawing on his papyrus looks like this:\footnote{The text is taken from the
+wonderful interactive version of Euclid's Elements by David E. Joyce, to be
+found on his website at Clark University.}
+
+\bigskip
+\noindent
+\begin{tikzpicture}[thick,help lines/.style={thin,draw=black!50}]
+ \pgfmathsetseed{1}
+ \def\A{\textcolor{input}{$A$}}
+ \def\B{\textcolor{input}{$B$}}
+ \def\C{\textcolor{output}{$C$}}
+ \def\D{$D$}
+ \def\E{$E$}
+
+ \colorlet{input}{blue!80!black}
+ \colorlet{output}{red!70!black}
+ \colorlet{triangle}{orange}
+
+ \coordinate [label=left:\A]
+ (A) at ($ (0,0) + .1*(rand,rand) $);
+ \coordinate [label=right:\B]
+ (B) at ($ (1.25,0.25) + .1*(rand,rand) $);
+
+ \draw [input] (A) -- (B);
+
+ \node [name path=D,help lines,draw,label=left:\D] (D) at (A) [circle through=(B)] {};
+ \node [name path=E,help lines,draw,label=right:\E] (E) at (B) [circle through=(A)] {};
+
+ \path [name intersections={of=D and E,by={[label=above:\C]C}}];
+
+ \draw [output] (A) -- (C);
+ \draw [output] (B) -- (C);
+
+ \foreach \point in {A,B,C}
+ \fill [black,opacity=.5] (\point) circle (2pt);
+
+ \begin{pgfonlayer}{background}
+ \fill[triangle!80] (A) -- (C) -- (B) -- cycle;
+ \end{pgfonlayer}
+
+ \node [below right,text width=10cm,align=justify] at (4,3)
+ {
+ \small
+ \textbf{Proposition I}\par
+ \emph{To construct an \textcolor{triangle}{equilateral triangle}
+ on a given \textcolor{input}{finite straight line}.}
+ \par
+ \vskip1em
+ Let \A\B\ be the given \textcolor{input}{finite straight line}. It
+ is required to construct an \textcolor{triangle}{equilateral
+ triangle} on the \textcolor{input}{straight line}~\A\B.
+
+ Describe the circle \B\C\D\ with center~\A\ and radius \A\B. Again
+ describe the circle \A\C\E\ with center~\B\ and radius \B\A. Join the
+ \textcolor{output}{straight lines} \C\A\ and \C\B\ from the
+ point~\C\ at which the circles cut one another to the points~\A\ and~\B.
+
+ Now, since the point~\A\ is the center of the circle \C\D\B,
+ therefore \A\C\ equals \A\B. Again, since the point \B\ is the
+ center of the circle \C\A\E, therefore \B\C\ equals \B\A. But
+ \A\C\ was proved equal to \A\B, therefore each of the straight
+ lines \A\C\ and \B\C\ equals \A\B. And
+ things which equal the same thing also equal one another,
+ therefore \A\C\ also equals \B\C. Therefore the three straight
+ lines \A\C, \A\B, and \B\C\ equal one another.
+ Therefore the \textcolor{triangle}{triangle} \A\B\C\ is
+ equilateral, and it has been constructed on the given finite
+ \textcolor{input}{straight line}~\A\B.
+ };
+\end{tikzpicture}
+\bigskip
+
+Let us have a look at how Euclid can turn this into \tikzname\ code.
+
+
+\subsubsection{Setting up the Environment}
+
+As in the previous tutorials, Euclid needs to load \tikzname, together with
+some libraries. These libraries are |calc|, |intersections|, |through|, and
+|backgrounds|. Depending on which format he uses, Euclid would use one of the
+following in the preamble:
+%
+\begin{codeexample}[code only]
+% For LaTeX:
+\usepackage{tikz}
+\usetikzlibrary{calc,intersections,through,backgrounds}
+\end{codeexample}
+
+\begin{codeexample}[code only]
+% For plain TeX:
+\input tikz.tex
+\usetikzlibrary{calc,intersections,through,backgrounds}
+\end{codeexample}
+
+\begin{codeexample}[code only]
+% For ConTeXt:
+\usemodule[tikz]
+\usetikzlibrary[calc,intersections,through,backgrounds]
+\end{codeexample}
+
+
+\subsubsection{The Line \emph{AB}}
+
+The first part of the picture that Euclid wishes to draw is the line $AB$. That
+is easy enough, something like |\draw (0,0) -- (2,1);| might do. However,
+Euclid does not wish to reference the two points $A$ and $B$ as $(0,0)$ and
+$(2,1)$ subsequently. Rather, he wishes to just write |A| and |B|. Indeed, the
+whole point of his book is that the points $A$ and $B$ can be arbitrary and all
+other points (like $C$) are constructed in terms of their positions. It would
+not do if Euclid were to write down the coordinates of $C$ explicitly.
+
+So, Euclid starts with defining two coordinates using the |\coordinate|
+command:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \coordinate (A) at (0,0);
+ \coordinate (B) at (1.25,0.25);
+
+ \draw[blue] (A) -- (B);
+\end{tikzpicture}
+\end{codeexample}
+
+That was easy enough. What is missing at this point are the labels for the
+coordinates. Euclid does not want them \emph{on} the points, but next to them.
+He decides to use the |label| option:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \coordinate [label=left:\textcolor{blue}{$A$}] (A) at (0,0);
+ \coordinate [label=right:\textcolor{blue}{$B$}] (B) at (1.25,0.25);
+
+ \draw[blue] (A) -- (B);
+\end{tikzpicture}
+\end{codeexample}
+
+At this point, Euclid decides that it would be even nicer if the points $A$ and
+$B$ were in some sense ``random''. Then, neither Euclid nor the reader can make
+the mistake of taking ``anything for granted'' concerning these position of
+these points. Euclid is pleased to learn that there is a |rand| function in
+\tikzname\ that does exactly what he needs: It produces a number between $-1$
+and $1$. Since \tikzname\ can do a bit of math, Euclid can change the
+coordinates of the points as follows:
+%
+\begin{codeexample}[code only]
+\coordinate [...] (A) at (0+0.1*rand,0+0.1*rand);
+\coordinate [...] (B) at (1.25+0.1*rand,0.25+0.1*rand);
+\end{codeexample}
+
+This works fine. However, Euclid is not quite satisfied since he would prefer
+that the ``main coordinates'' $(0,0)$ and $(1.25,0.25)$ are ``kept separate''
+from the perturbation $0.1(\mathit{rand},\mathit{rand})$. This means, he would
+like to specify that coordinate $A$ as ``the point that is at $(0,0)$ plus one
+tenth of the vector $(\mathit{rand},\mathit{rand})$''.
+
+It turns out that the |calc| library allows him to do exactly this kind of
+computation. When this library is loaded, you can use special coordinates that
+start with |($| and end with |$)| rather than just |(| and~|)|. Inside these
+special coordinates you can give a linear combination of coordinates. (Note
+that the dollar signs are only intended to signal that a ``computation'' is
+going on; no mathematical typesetting is done.)
+
+The new code for the coordinates is the following:
+%
+\begin{codeexample}[code only]
+\coordinate [...] (A) at ($ (0,0) + .1*(rand,rand) $);
+\coordinate [...] (B) at ($ (1.25,0.25) + .1*(rand,rand) $);
+\end{codeexample}
+
+Note that if a coordinate in such a computation has a factor (like |.1|), you
+must place a |*| directly before the opening parenthesis of the coordinate. You
+can nest such computations.
+
+
+\subsubsection{The Circle Around \emph{A}}
+
+The first tricky construction is the circle around~$A$. We will see later how
+to do this in a very simple manner, but first let us do it the ``hard'' way.
+
+The idea is the following: We draw a circle around the point $A$ whose radius
+is given by the length of the line $AB$. The difficulty lies in computing the
+length of this line.
+
+Two ideas ``nearly'' solve this problem: First, we can write |($ (A) - (B) $)|
+for the vector that is the difference between $A$ and~$B$. All we need is the
+length of this vector. Second, given two numbers $x$ and $y$, one can write
+|veclen(|$x$|,|$y$|)| inside a mathematical expression. This gives the value
+$\sqrt{x^2+y^2}$, which is exactly the desired length.
+
+The only remaining problem is to access the $x$- and $y$-coordinate of the
+vector~$AB$. For this, we need a new concept: the \emph{let operation}. A let
+operation can be given anywhere on a path where a normal path operation like a
+line-to or a move-to is expected. The effect of a let operation is to evaluate
+some coordinates and to assign the results to special macros. These macros make
+it easy to access the $x$- and $y$-coordinates of the coordinates.
+
+Euclid would write the following:
+%
+\begin{codeexample}[preamble={\usetikzlibrary{calc}}]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (1.25,0.25);
+ \draw (A) -- (B);
+
+ \draw (A) let
+ \p1 = ($ (B) - (A) $)
+ in
+ circle ({veclen(\x1,\y1)});
+\end{tikzpicture}
+\end{codeexample}
+
+Each assignment in a let operation starts with |\p|, usually followed by a
+\meta{digit}. Then comes an equal sign and a coordinate. The coordinate is
+evaluated and the result is stored internally. From then on you can use the
+following expressions:
+%
+\begin{enumerate}
+ \item |\x|\meta{digit} yields the $x$-coordinate of the resulting point.
+ \item |\y|\meta{digit} yields the $y$-coordinate of the resulting point.
+ \item |\p|\meta{digit} yields the same as
+ |\x|\meta{digit}|,\y|\meta{digit}.
+\end{enumerate}
+%
+You can have multiple assignments in a let operation, just separate them with
+commas. In later assignments you can already use the results of earlier
+assignments.
+
+Note that |\p1| is not a coordinate in the usual sense. Rather, it just expands
+to a string like |10pt,20pt|. So, you cannot write, for instance,
+|(\p1.center)| since this would just expand to |(10pt,20pt.center)|, which
+makes no sense.
+
+Next, we want to draw both circles at the same time. Each time the radius is
+|veclen(\x1,\y1)|. It seems natural to compute this radius only once. For this,
+we can also use a let operation: Instead of writing |\p1 = ...|, we write
+|\n2 = ...|. Here, ``n'' stands for ``number'' (while ``p'' stands for
+``point''). The assignment of a number should be followed by a number in curly
+braces.
+%
+\begin{codeexample}[preamble={\usetikzlibrary{calc}}]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (1.25,0.25);
+ \draw (A) -- (B);
+
+ \draw let \p1 = ($ (B) - (A) $),
+ \n2 = {veclen(\x1,\y1)}
+ in
+ (A) circle (\n2)
+ (B) circle (\n2);
+\end{tikzpicture}
+\end{codeexample}
+%
+In the above example, you may wonder, what |\n1| would yield? The answer is
+that it would be undefined -- the |\p|, |\x|, and |\y| macros refer to the same
+logical point, while the |\n| macro has ``its own namespace''. We could even
+have replaced |\n2| in the example by |\n1| and it would still work. Indeed,
+the digits following these macros are just normal \TeX\ parameters. We could
+also use a longer name, but then we have to use curly braces:
+%
+\begin{codeexample}[preamble={\usetikzlibrary{calc}}]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (1.25,0.25);
+ \draw (A) -- (B);
+
+ \draw let \p1 = ($ (B) - (A) $),
+ \n{radius} = {veclen(\x1,\y1)}
+ in
+ (A) circle (\n{radius})
+ (B) circle (\n{radius});
+\end{tikzpicture}
+\end{codeexample}
+
+At the beginning of this section it was promised that there is an easier way to
+create the desired circle. The trick is to use the |through| library. As the
+name suggests, it contains code for creating shapes that go through a given
+point.
+
+The option that we are looking for is |circle through|. This option is given to
+a \emph{node} and has the following effects: First, it causes the node's inner
+and outer separations to be set to zero. Then it sets the shape of the node to
+|circle|. Finally, it sets the radius of the node such that it goes through the
+parameter given to |circle through|. This radius is computed in essentially the
+same way as above.
+%
+\begin{codeexample}[preamble={\usetikzlibrary{through}}]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (1.25,0.25);
+ \draw (A) -- (B);
+
+ \node [draw,circle through=(B),label=left:$D$] at (A) {};
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{The Intersection of the Circles}
+
+Euclid can now draw the line and the circles. The final problem is to compute
+the intersection of the two circles. This computation is a bit involved if you
+want to do it ``by hand''. Fortunately, the |intersections| library allows us
+to compute the intersection of arbitrary paths.
+
+The idea is simple: First, you ``name'' two paths using the |name path| option.
+Then, at some later point, you can use the option |name intersections|, which
+creates coordinates called |intersection-1|, |intersection-2|, and so on at all
+intersections of the paths. Euclid assigns the names |D| and |E| to the paths
+of the two circles (which happen to be the same names as the nodes themselves,
+but nodes and their paths live in different ``namespaces'').
+%
+\begin{codeexample}[preamble={\usetikzlibrary{intersections,through}}]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (1.25,0.25);
+ \draw (A) -- (B);
+
+ \node (D) [name path=D,draw,circle through=(B),label=left:$D$] at (A) {};
+ \node (E) [name path=E,draw,circle through=(A),label=right:$E$] at (B) {};
+
+ % Name the coordinates, but do not draw anything:
+ \path [name intersections={of=D and E}];
+
+ \coordinate [label=above:$C$] (C) at (intersection-1);
+
+ \draw [red] (A) -- (C);
+ \draw [red] (B) -- (C);
+\end{tikzpicture}
+\end{codeexample}
+
+It turns out that this can be further shortened: The |name intersections| takes
+an optional argument |by|, which lets you specify names for the coordinates and
+options for them. This creates more compact code. Although Euclid does not need
+it for the current picture, it is just a small step to computing the bisection
+of the line $AB$:
+%
+\begin{codeexample}[preamble={\usetikzlibrary{intersections,through}}]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (1.25,0.25);
+ \draw [name path=A--B] (A) -- (B);
+
+ \node (D) [name path=D,draw,circle through=(B),label=left:$D$] at (A) {};
+ \node (E) [name path=E,draw,circle through=(A),label=right:$E$] at (B) {};
+
+ \path [name intersections={of=D and E, by={[label=above:$C$]C, [label=below:$C'$]C'}}];
+
+ \draw [name path=C--C',red] (C) -- (C');
+
+ \path [name intersections={of=A--B and C--C',by=F}];
+ \node [fill=red,inner sep=1pt,label=-45:$F$] at (F) {};
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{The Complete Code}
+
+Back to Euclid's code. He introduces a few macros to make life simpler, like a
+|\A| macro for typesetting a blue $A$. He also uses the |background| layer for
+drawing the triangle behind everything at the end.
+%
+\begin{codeexample}[pre={\pgfmathsetseed{1}},preamble={\usetikzlibrary{backgrounds,calc,intersections,through}}]
+\begin{tikzpicture}[thick,help lines/.style={thin,draw=black!50}]
+ \def\A{\textcolor{input}{$A$}} \def\B{\textcolor{input}{$B$}}
+ \def\C{\textcolor{output}{$C$}} \def\D{$D$}
+ \def\E{$E$}
+
+ \colorlet{input}{blue!80!black} \colorlet{output}{red!70!black}
+ \colorlet{triangle}{orange}
+
+ \coordinate [label=left:\A] (A) at ($ (0,0) + .1*(rand,rand) $);
+ \coordinate [label=right:\B] (B) at ($ (1.25,0.25) + .1*(rand,rand) $);
+
+ \draw [input] (A) -- (B);
+
+ \node [name path=D,help lines,draw,label=left:\D] (D) at (A) [circle through=(B)] {};
+ \node [name path=E,help lines,draw,label=right:\E] (E) at (B) [circle through=(A)] {};
+
+ \path [name intersections={of=D and E,by={[label=above:\C]C}}];
+
+ \draw [output] (A) -- (C) -- (B);
+
+ \foreach \point in {A,B,C}
+ \fill [black,opacity=.5] (\point) circle (2pt);
+
+ \begin{pgfonlayer}{background}
+ \fill[triangle!80] (A) -- (C) -- (B) -- cycle;
+ \end{pgfonlayer}
+
+ \node [below right, text width=10cm,align=justify] at (4,3) {
+ \small\textbf{Proposition I}\par
+ \emph{To construct an \textcolor{triangle}{equilateral triangle}
+ on a given \textcolor{input}{finite straight line}.}
+ \par\vskip1em
+ Let \A\B\ be the given \textcolor{input}{finite straight line}. \dots
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Book I, Proposition II}
+
+The second proposition in the Elements is the following:
+
+\bigskip\noindent
+\begin{tikzpicture}[thick,help lines/.style={thin,draw=black!50}]
+ \pgfmathsetseed{1}
+ \def\A{\textcolor{orange}{$A$}} \def\B{\textcolor{input}{$B$}}
+ \def\C{\textcolor{input}{$C$}} \def\D{$D$}
+ \def\E{$E$} \def\F{$F$}
+ \def\G{$G$} \def\H{$H$}
+ \def\K{$K$} \def\L{\textcolor{output}{$L$}}
+
+ \colorlet{input}{blue!80!black} \colorlet{output}{red!70!black}
+
+ \coordinate [label=left:\A] (A) at ($ (0,0) + .1*(rand,rand) $);
+ \coordinate [label=right:\B] (B) at ($ (1,0.2) + .1*(rand,rand) $);
+ \coordinate [label=above:\C] (C) at ($ (1,2) + .1*(rand,rand) $);
+
+ \draw [input] (B) -- (C);
+ \draw [help lines] (A) -- (B);
+
+ \coordinate [label=above:\D] (D) at ($ (A)!.5!(B) ! {sin(60)*2} ! 90:(B) $);
+
+ \draw [help lines] (D) -- ($ (D)!3.75!(A) $) coordinate [label=-135:\E] (E);
+ \draw [help lines] (D) -- ($ (D)!3.75!(B) $) coordinate [label=-45:\F] (F);
+
+ \node (H) at (B) [name path=H,help lines,circle through=(C),draw,label=135:\H] {};
+ \path [name path=B--F] (B) -- (F);
+ \path [name intersections={of=H and B--F}]
+ coordinate [label=right:\G] (G) at (intersection-1);
+
+ \node (K) at (D) [name path=K,help lines,circle through=(G),draw,label=135:\K] {};
+
+ \path [name path=A to E line] (A) -- (E);
+ \path [name intersections={of=K and A to E line}]
+ coordinate [label=below:\L] (L) at (intersection-1);
+
+ \draw [output] (A) -- (L);
+
+ \foreach \point in {A,B,C,D,G,L}
+ \fill [black,opacity=.5] (\point) circle (2pt);
+
+ \node [below right, text width=9cm,align=justify] at (4,4) {
+ \small\textbf{Proposition II}\par
+ \emph{To place a \textcolor{output}{straight line} equal to a
+ given \textcolor{input}{straight line} with
+ one end at a \textcolor{orange}{given point}.}
+ \par\vskip1em
+ Let \A\ be the given point, and \B\C\ the given
+ \textcolor{input}{straight line}.
+ It is required to place a \textcolor{output}{straight line} equal
+ to the given \textcolor{input}{straight line} \B\C\ with one end
+ at the point~\A.
+
+ Join the straight line \A\B\ from the point \A\ to the point \B, and
+ construct the equilateral triangle \D\A\B\ on it.
+
+ Produce the straight lines \A\E\ and \B\F\ in a straight line with
+ \D\A\ and \D\B. Describe the circle \C\G\H\ with center \B\ and
+ radius \B\C, and again, describe the circle \G\K\L\ with center
+ \D\ and radius \D\G.
+
+ Since the point \B\ is the center of the circle \C\G\H, therefore
+ \B\C\ equals \B\G. Again, since the point \D\ is the center of the
+ circle \G\K\L, therefore \D\L\ equals \D\G. And in these \D\A\
+ equals \D\B, therefore the remainder \A\L\ equals the remainder
+ \B\G. But \B\C\ was also proved equal to \B\G, therefore each of
+ the straight lines \A\L\ and \B\C\ equals \B\G. And things which
+ equal the same thing also equal one another, therefore \A\L\ also
+ equals \B\C.
+
+ Therefore the \textcolor{output}{straight line} \A\L\ equal to the
+ given \textcolor{input}{straight line} \B\C\ has been placed with
+ one end at the \textcolor{orange}{given point}~\A.
+ };
+\end{tikzpicture}
+
+
+\subsubsection{Using Partway Calculations for the Construction of \emph{D}}
+
+Euclid's construction starts with ``referencing'' Proposition~I for the
+construction of the point~$D$. Now, while we could simply repeat the
+construction, it seems a bit bothersome that one has to draw all these circles
+and do all these complicated constructions.
+
+For this reason, \tikzname\ supports some simplifications. First, there is a
+simple syntax for computing a point that is ``partway'' on a line from $p$
+to~$q$: You place these two points in a coordinate calculation -- remember,
+they start with |($| and end with |$)| -- and then combine them using
+|!|\meta{part}|!|. A \meta{part} of |0| refers to the \emph{first} coordinate,
+a \meta{part} of |1| refers to the second coordinate, and a value in between
+refers to a point on the line from $p$ to~$q$. Thus, the syntax is similar to
+the |xcolor| syntax for mixing colors.
+
+Here is the computation of the point in the middle of the line $AB$:
+%
+\begin{codeexample}[preamble={\usetikzlibrary{calc}}]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (1.25,0.25);
+ \draw (A) -- (B);
+ \node [fill=red,inner sep=1pt,label=below:$X$] (X) at ($ (A)!.5!(B) $) {};
+\end{tikzpicture}
+\end{codeexample}
+
+The computation of the point $D$ in Euclid's second proposition is a bit more
+complicated. It can be expressed as follows: Consider the line from $X$ to $B$.
+Suppose we rotate this line around $X$ for 90$^\circ$ and then stretch it by a
+factor of $\sin(60^\circ) \cdot 2$. This yields the desired point~$D$. We can
+do the stretching using the partway modifier above, for the rotation we need a
+new modifier: the rotation modifier. The idea is that the second coordinate in
+a partway computation can be prefixed by an angle. Then the partway point is
+computed normally (as if no angle were given), but the resulting point is
+rotated by this angle around the first point.
+%
+\begin{codeexample}[preamble={\usetikzlibrary{calc}}]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (1.25,0.25);
+ \draw (A) -- (B);
+ \node [fill=red,inner sep=1pt,label=below:$X$] (X) at ($ (A)!.5!(B) $) {};
+ \node [fill=red,inner sep=1pt,label=above:$D$] (D) at
+ ($ (X) ! {sin(60)*2} ! 90:(B) $) {};
+ \draw (A) -- (D) -- (B);
+\end{tikzpicture}
+\end{codeexample}
+
+Finally, it is not necessary to explicitly name the point $X$. Rather, again
+like in the |xcolor| package, it is possible to chain partway modifiers:
+%
+\begin{codeexample}[preamble={\usetikzlibrary{calc}}]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (1.25,0.25);
+ \draw (A) -- (B);
+ \node [fill=red,inner sep=1pt,label=above:$D$] (D) at
+ ($ (A) ! .5 ! (B) ! {sin(60)*2} ! 90:(B) $) {};
+ \draw (A) -- (D) -- (B);
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{Intersecting a Line and a Circle}
+
+The next step in the construction is to draw a circle around $B$ through $C$,
+which is easy enough to do using the |circle through| option. Extending the
+lines $DA$ and $DB$ can be done using partway calculations, but this time with
+a part value outside the range $[0,1]$:
+%
+\begin{codeexample}[preamble={\usetikzlibrary{calc,through}}]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (0.75,0.25);
+ \coordinate [label=above:$C$] (C) at (1,1.5);
+ \draw (A) -- (B) -- (C);
+ \coordinate [label=above:$D$] (D) at
+ ($ (A) ! .5 ! (B) ! {sin(60)*2} ! 90:(B) $) {};
+ \node (H) [label=135:$H$,draw,circle through=(C)] at (B) {};
+ \draw (D) -- ($ (D) ! 3.5 ! (B) $) coordinate [label=below:$F$] (F);
+ \draw (D) -- ($ (D) ! 2.5 ! (A) $) coordinate [label=below:$E$] (E);
+\end{tikzpicture}
+\end{codeexample}
+
+We now face the problem of finding the point $G$, which is the intersection of
+the line $BF$ and the circle $H$. One way is to use yet another variant of the
+partway computation: Normally, a partway computation has the form
+\meta{p}|!|\meta{factor}|!|\meta{q}, resulting in the point
+$(1-\meta{factor})\meta{p} + \meta{factor}\meta{q}$. Alternatively, instead of
+\meta{factor} you can also use a \meta{dimension} between the points. In this
+case, you get the point that is \meta{dimension} away from \meta{p} on the
+straight line to \meta{q}.
+
+We know that the point $G$ is on the way from $B$ to $F$. The distance is given
+by the radius of the circle~$H$. Here is the code for computing $H$:
+%
+{\ifpgfmanualexternalize\tikzexternaldisable\fi
+\begin{codeexample}[
+ preamble={\usetikzlibrary{calc,through}},
+ pre={\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (0.75,0.25);
+ \coordinate [label=above:$C$] (C) at (1,1.5);
+ \draw (A) -- (B) -- (C);
+ \coordinate [label=above:$D$] (D) at
+ ($ (A) ! .5 ! (B) ! {sin(60)*2} ! 90:(B) $) {};
+ \draw (D) -- ($ (D) ! 3.5 ! (B) $) coordinate [label=below:$F$] (F);
+ \draw (D) -- ($ (D) ! 2.5 ! (A) $) coordinate [label=below:$E$] (E);},
+ post={\end{tikzpicture}},
+]
+ \node (H) [label=135:$H$,draw,circle through=(C)] at (B) {};
+ \path let \p1 = ($ (B) - (C) $) in
+ coordinate [label=left:$G$] (G) at ($ (B) ! veclen(\x1,\y1) ! (F) $);
+ \fill[red,opacity=.5] (G) circle (2pt);
+\end{codeexample}
+
+However, there is a simpler way: We can simply name the path of the circle and
+of the line in question and then use |name intersections| to compute the
+intersections.
+%
+\begin{codeexample}[
+ preamble={\usetikzlibrary{calc,intersections,through}},
+ pre={\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (0.75,0.25);
+ \coordinate [label=above:$C$] (C) at (1,1.5);
+ \draw (A) -- (B) -- (C);
+ \coordinate [label=above:$D$] (D) at
+ ($ (A) ! .5 ! (B) ! {sin(60)*2} ! 90:(B) $) {};
+ \draw (D) -- ($ (D) ! 3.5 ! (B) $) coordinate [label=below:$F$] (F);
+ \draw (D) -- ($ (D) ! 2.5 ! (A) $) coordinate [label=below:$E$] (E);},
+ post={\end{tikzpicture}},
+]
+ \node (H) [name path=H,label=135:$H$,draw,circle through=(C)] at (B) {};
+ \path [name path=B--F] (B) -- (F);
+ \path [name intersections={of=H and B--F,by={[label=left:$G$]G}}];
+ \fill[red,opacity=.5] (G) circle (2pt);
+\end{codeexample}
+}%
+
+
+\subsubsection{The Complete Code}
+
+\begin{codeexample}[pre={\pgfmathsetseed{1}},preamble={\usetikzlibrary{calc,intersections,through}}]
+\begin{tikzpicture}[thick,help lines/.style={thin,draw=black!50}]
+ \def\A{\textcolor{orange}{$A$}} \def\B{\textcolor{input}{$B$}}
+ \def\C{\textcolor{input}{$C$}} \def\D{$D$}
+ \def\E{$E$} \def\F{$F$}
+ \def\G{$G$} \def\H{$H$}
+ \def\K{$K$} \def\L{\textcolor{output}{$L$}}
+
+ \colorlet{input}{blue!80!black} \colorlet{output}{red!70!black}
+
+ \coordinate [label=left:\A] (A) at ($ (0,0) + .1*(rand,rand) $);
+ \coordinate [label=right:\B] (B) at ($ (1,0.2) + .1*(rand,rand) $);
+ \coordinate [label=above:\C] (C) at ($ (1,2) + .1*(rand,rand) $);
+
+ \draw [input] (B) -- (C);
+ \draw [help lines] (A) -- (B);
+
+ \coordinate [label=above:\D] (D) at ($ (A)!.5!(B) ! {sin(60)*2} ! 90:(B) $);
+
+ \draw [help lines] (D) -- ($ (D)!3.75!(A) $) coordinate [label=-135:\E] (E);
+ \draw [help lines] (D) -- ($ (D)!3.75!(B) $) coordinate [label=-45:\F] (F);
+
+ \node (H) at (B) [name path=H,help lines,circle through=(C),draw,label=135:\H] {};
+ \path [name path=B--F] (B) -- (F);
+ \path [name intersections={of=H and B--F,by={[label=right:\G]G}}];
+
+ \node (K) at (D) [name path=K,help lines,circle through=(G),draw,label=135:\K] {};
+ \path [name path=A--E] (A) -- (E);
+ \path [name intersections={of=K and A--E,by={[label=below:\L]L}}];
+
+ \draw [output] (A) -- (L);
+
+ \foreach \point in {A,B,C,D,G,L}
+ \fill [black,opacity=.5] (\point) circle (2pt);
+
+ % \node ...
+\end{tikzpicture}
+\end{codeexample}