diff options
author | Norbert Preining <norbert@preining.info> | 2023-01-16 03:03:27 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2023-01-16 03:03:27 +0000 |
commit | 6f9e1680085e7bb4d258f6f8116369d122e196e1 (patch) | |
tree | 9ac0ecb239240d1d672b188f29c1479de215074b /graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial.tex | |
parent | b8345f39630408bb198e7636381ce4240154ca9b (diff) |
CTAN sync 202301160303
Diffstat (limited to 'graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial.tex')
-rw-r--r-- | graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial.tex | 1400 |
1 files changed, 0 insertions, 1400 deletions
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial.tex deleted file mode 100644 index ae2c47cdc9..0000000000 --- a/graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial.tex +++ /dev/null @@ -1,1400 +0,0 @@ -% 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: A Picture for Karl's Students} - -This tutorial is intended for new users of \tikzname. It does not give an -exhaustive account of all the features of \tikzname, just of those that you are -likely to use right away. - -Karl is a math and chemistry high-school teacher. He used to create the -graphics in his worksheets and exams using \LaTeX's |{picture}| environment. -While the results were acceptable, creating the graphics often turned out to be -a lengthy process. Also, there tended to be problems with lines having slightly -wrong angles and circles also seemed to be hard to get right. Naturally, his -students could not care less whether the lines had the exact right angles and -they find Karl's exams too difficult no matter how nicely they were drawn. But -Karl was never entirely satisfied with the result. - -Karl's son, who was even less satisfied with the results (he did not have to -take the exams, after all), told Karl that he might wish to try out a new -package for creating graphics. A bit confusingly, this package seems to have -two names: First, Karl had to download and install a package called \pgfname. -Then it turns out that inside this package there is another package called -\tikzname, which is supposed to stand for ``\tikzname\ ist \emph{kein} -Zeichenprogramm''. Karl finds this all a bit strange and \tikzname\ seems to -indicate that the package does not do what he needs. However, having used -\textsc{gnu} software for quite some time and ``\textsc{gnu} not being Unix'', -there seems to be hope yet. His son assures him that \tikzname's name is -intended to warn people that \tikzname\ is not a program that you can use to -draw graphics with your mouse or tablet. Rather, it is more like a ``graphics -language''. - - -\subsection{Problem Statement} - -Karl wants to put a graphic on the next worksheet for his students. He is -currently teaching his students about sine and cosine. What he would like to -have is something that looks like this (ideally): -% -\noindent -\begin{tikzpicture} - [scale=3,line cap=round, - % Styles - axes/.style=, - important line/.style={very thick}, - information text/.style={rounded corners,fill=red!10,inner sep=1ex}] - - % Local definitions - \def\costhirty{0.8660256} - - % Colors - \colorlet{anglecolor}{green!50!black} - \colorlet{sincolor}{red} - \colorlet{tancolor}{orange!80!black} - \colorlet{coscolor}{blue} - - % The graphic - \draw[help lines,step=0.5cm] (-1.4,-1.4) grid (1.4,1.4); - - \draw (0,0) circle [radius=1cm]; - - \begin{scope}[axes] - \draw[->] (-1.5,0) -- (1.5,0) node[right] {$x$}; - \draw[->] (0,-1.5) -- (0,1.5) node[above] {$y$}; - - \foreach \x/\xtext in {-1, -.5/-\frac{1}{2}, 1} - \draw[xshift=\x cm] (0pt,1pt) -- (0pt,-1pt) node[below,fill=white] {$\xtext$}; - - \foreach \y/\ytext in {-1, -.5/-\frac{1}{2}, .5/\frac{1}{2}, 1} - \draw[yshift=\y cm] (1pt,0pt) -- (-1pt,0pt) node[left,fill=white] {$\ytext$}; - \end{scope} - - \filldraw[fill=green!20,draw=anglecolor] (0,0) -- (3mm,0pt) arc(0:30:3mm); - \draw (15:2mm) node[anglecolor] {$\alpha$}; - - \draw[important line,sincolor] - (30:1cm) -- node[left=1pt,fill=white] {$\sin \alpha$} +(0,-.5); - - \draw[important line,coscolor] - (0,0) -- node[below=2pt,fill=white] {$\cos \alpha$} (\costhirty,0); - - \draw[important line,tancolor] (1,0) -- - node [right=1pt,fill=white] - { - $\displaystyle \tan \alpha \color{black}= - \frac{{\color{sincolor}\sin \alpha}}{\color{coscolor}\cos \alpha}$ - } (intersection of 0,0--30:1cm and 1,0--1,1) coordinate (t); - - \draw (0,0) -- (t); - - \draw[xshift=1.85cm] node [right,text width=6cm,information text] - { - The {\color{anglecolor} angle $\alpha$} is $30^\circ$ in the - example ($\pi/6$ in radians). The {\color{sincolor}sine of - $\alpha$}, which is the height of the red line, is - \[ - {\color{sincolor} \sin \alpha} = 1/2. - \] - By the Theorem of Pythagoras we have ${\color{coscolor}\cos^2 \alpha} + - {\color{sincolor}\sin^2\alpha} =1$. Thus the length of the blue - line, which is the {\color{coscolor}cosine of $\alpha$}, must be - \[ - {\color{coscolor}\cos\alpha} = \sqrt{1 - 1/4} = \textstyle - \frac{1}{2} \sqrt 3. - \]% - This shows that {\color{tancolor}$\tan \alpha$}, which is the - height of the orange line, is - \[ - {\color{tancolor}\tan\alpha} = \frac{{\color{sincolor}\sin - \alpha}}{\color{coscolor}\cos \alpha} = 1/\sqrt 3. - \]% - }; -\end{tikzpicture} - - -\subsection{Setting up the Environment} - -In \tikzname, to draw a picture, at the start of the picture you need to tell -\TeX\ or \LaTeX\ that you want to start a picture. In \LaTeX\ this is done -using the environment |{tikzpicture}|, in plain \TeX\ you just use -|\tikzpicture| to start the picture and |\endtikzpicture| to end it. - - -\subsubsection{Setting up the Environment in \LaTeX} - -Karl, being a \LaTeX\ user, thus sets up his file as follows: -% -\begin{codeexample}[code only] -\documentclass{article} % say -\usepackage{tikz} -\begin{document} -We are working on -\begin{tikzpicture} - \draw (-1.5,0) -- (1.5,0); - \draw (0,-1.5) -- (0,1.5); -\end{tikzpicture}. -\end{document} -\end{codeexample} - -When executed, that is, run via |pdflatex| or via |latex| followed by |dvips|, -the resulting will contain something that looks like this: -% -\begin{codeexample}[width=7cm] -We are working on -\begin{tikzpicture} - \draw (-1.5,0) -- (1.5,0); - \draw (0,-1.5) -- (0,1.5); -\end{tikzpicture}. -\end{codeexample} - -Admittedly, not quite the whole picture, yet, but we do have the axes -established. Well, not quite, but we have the lines that make up the axes -drawn. Karl suddenly has a sinking feeling that the picture is still some way -off. - -Let's have a more detailed look at the code. First, the package |tikz| is -loaded. This package is a so-called ``frontend'' to the basic \pgfname\ system. -The basic layer, which is also described in this manual, is somewhat more, -well, basic and thus harder to use. The frontend makes things easier by -providing a simpler syntax. - -Inside the environment there are two |\draw| commands. They mean: ``The path, -which is specified following the command up to the semicolon, should be -drawn.'' The first path is specified as |(-1.5,0) -- (0,1.5)|, which means ``a -straight line from the point at position $(-1.5,0)$ to the point at position -$(0,1.5)$''. Here, the positions are specified within a special coordinate -system in which, initially, one unit is 1cm. - -Karl is quite pleased to note that the environment automatically reserves -enough space to encompass the picture. - - -\subsubsection{Setting up the Environment in Plain \TeX} - -Karl's wife Gerda, who also happens to be a math teacher, is not a \LaTeX\ -user, but uses plain \TeX\ since she prefers to do things ``the old way''. She -can also use \tikzname. Instead of |\usepackage{tikz}| she has to write -|\input tikz.tex| and instead of |\begin{tikzpicture}| she writes -|\tikzpicture| and instead of |\end{tikzpicture}| she writes |\endtikzpicture|. - -Thus, she would use: -% -\begin{codeexample}[code only] -%% Plain TeX file -\input tikz.tex -\baselineskip=12pt -\hsize=6.3truein -\vsize=8.7truein -We are working on -\tikzpicture - \draw (-1.5,0) -- (1.5,0); - \draw (0,-1.5) -- (0,1.5); -\endtikzpicture. -\bye -\end{codeexample} - -Gerda can typeset this file using either |pdftex| or |tex| together with -|dvips|. \tikzname\ will automatically discern which driver she is using. If -she wishes to use |dvipdfm| together with |tex|, she either needs to modify the -file |pgf.cfg| or can write |\def\pgfsysdriver{pgfsys-dvipdfm.def}| somewhere -\emph{before} she inputs |tikz.tex| or |pgf.tex|. - - -\subsubsection{Setting up the Environment in Con\TeX t} - -Karl's uncle Hans uses Con\TeX t. Like Gerda, Hans can also use \tikzname. -Instead of |\usepackage{tikz}| he says |\usemodule[tikz]|. Instead of -|\begin{tikzpicture}| he writes |\starttikzpicture| and instead of -|\end{tikzpicture}| he writes |\stoptikzpicture|. - -His version of the example looks like this: -% -\begin{codeexample}[code only] -%% ConTeXt file -\usemodule[tikz] - -\starttext - We are working on - \starttikzpicture - \draw (-1.5,0) -- (1.5,0); - \draw (0,-1.5) -- (0,1.5); - \stoptikzpicture. -\stoptext -\end{codeexample} - -Hans will now typeset this file in the usual way using |texexec| or |context|. - - -\subsection{Straight Path Construction} - -The basic building block of all pictures in \tikzname\ is the path. A -\emph{path} is a series of straight lines and curves that are connected (that -is not the whole picture, but let us ignore the complications for the moment). -You start a path by specifying the coordinates of the start position as a point -in round brackets, as in |(0,0)|. This is followed by a series of ``path -extension operations''. The simplest is |--|, which we used already. It must be -followed by another coordinate and it extends the path in a straight line to -this new position. For example, if we were to turn the two paths of the axes -into one path, the following would result: -% -\begin{codeexample}[] -\tikz \draw (-1.5,0) -- (1.5,0) -- (0,-1.5) -- (0,1.5); -\end{codeexample} - -Karl is a bit confused by the fact that there is no |{tikzpicture}| -environment, here. Instead, the little command |\tikz| is used. This command -either takes one argument (starting with an opening brace as in -|\tikz{\draw (0,0) -- (1.5,0)}|, which yields \tikz{\draw (0,0) --(1.5,0);}) or -collects everything up to the next semicolon and puts it inside a -|{tikzpicture}| environment. As a rule of thumb, all \tikzname\ graphic drawing -commands must occur as an argument of |\tikz| or inside a |{tikzpicture}| -environment. Fortunately, the command |\draw| will only be defined inside this -environment, so there is little chance that you will accidentally do something -wrong here. - - -\subsection{Curved Path Construction} - -The next thing Karl wants to do is to draw the circle. For this, straight lines -obviously will not do. Instead, we need some way to draw curves. For this, -\tikzname\ provides a special syntax. One or two ``control points'' are needed. -The math behind them is not quite trivial, but here is the basic idea: Suppose -you are at point $x$ and the first control point is $y$. Then the curve will -start ``going in the direction of~$y$ at~$x$'', that is, the tangent of the -curve at $x$ will point toward~$y$. Next, suppose the curve should end at $z$ -and the second support point is $w$. Then the curve will, indeed, end at $z$ -and the tangent of the curve at point $z$ will go through $w$. - -Here is an example (the control points have been added for clarity): -% -\begin{codeexample}[] -\begin{tikzpicture} - \filldraw [gray] (0,0) circle [radius=2pt] - (1,1) circle [radius=2pt] - (2,1) circle [radius=2pt] - (2,0) circle [radius=2pt]; - \draw (0,0) .. controls (1,1) and (2,1) .. (2,0); -\end{tikzpicture} -\end{codeexample} - -The general syntax for extending a path in a ``curved'' way is |.. controls| -\meta{first control point} |and| \meta{second control point} |..| -\meta{end point}. You can leave out the |and| \meta{second control point}, -which causes the first one to be used twice. - -So, Karl can now add the first half circle to the picture: -% -\begin{codeexample}[] -\begin{tikzpicture} - \draw (-1.5,0) -- (1.5,0); - \draw (0,-1.5) -- (0,1.5); - \draw (-1,0) .. controls (-1,0.555) and (-0.555,1) .. (0,1) - .. controls (0.555,1) and (1,0.555) .. (1,0); -\end{tikzpicture} -\end{codeexample} - -Karl is happy with the result, but finds specifying circles in this way to be -extremely awkward. Fortunately, there is a much simpler way. - - -\subsection{Circle Path Construction} - -In order to draw a circle, the path construction operation |circle| can be -used. This operation is followed by a radius in brackets as in the following -example: (Note that the previous position is used as the \emph{center} of the -circle.) -% -\begin{codeexample}[] -\tikz \draw (0,0) circle [radius=10pt]; -\end{codeexample} - -You can also append an ellipse to the path using the |ellipse| operation. -Instead of a single radius you can specify two of them: -% -\begin{codeexample}[] -\tikz \draw (0,0) ellipse [x radius=20pt, y radius=10pt]; -\end{codeexample} - -To draw an ellipse whose axes are not horizontal and vertical, but point in an -arbitrary direction (a ``turned ellipse'' like \tikz \draw[rotate=30] (0,0) -ellipse [x radius=6pt, y radius=3pt];) you can use transformations, which are -explained later. The code for the little ellipse is -|\tikz \draw[rotate=30] (0,0) ellipse [x radius=6pt, y radius=3pt];|, by the -way. - -So, returning to Karl's problem, he can write -|\draw (0,0) circle [radius=1cm];| to draw the circle: -% -\begin{codeexample}[] -\begin{tikzpicture} - \draw (-1.5,0) -- (1.5,0); - \draw (0,-1.5) -- (0,1.5); - \draw (0,0) circle [radius=1cm]; -\end{tikzpicture} -\end{codeexample} - -At this point, Karl is a bit alarmed that the circle is so small when he wants -the final picture to be much bigger. He is pleased to learn that \tikzname\ has -powerful transformation options and scaling everything by a factor of three is -very easy. But let us leave the size as it is for the moment to save some -space. - - -\subsection{Rectangle Path Construction} - -The next things we would like to have is the grid in the background. There are -several ways to produce it. For example, one might draw lots of rectangles. -Since rectangles are so common, there is a special syntax for them: To add a -rectangle to the current path, use the |rectangle| path construction operation. -This operation should be followed by another coordinate and will append a -rectangle to the path such that the previous coordinate and the next -coordinates are corners of the rectangle. So, let us add two rectangles to the -picture: -% -\begin{codeexample}[] -\begin{tikzpicture} - \draw (-1.5,0) -- (1.5,0); - \draw (0,-1.5) -- (0,1.5); - \draw (0,0) circle [radius=1cm]; - \draw (0,0) rectangle (0.5,0.5); - \draw (-0.5,-0.5) rectangle (-1,-1); -\end{tikzpicture} -\end{codeexample} - -While this may be nice in other situations, this is not really leading anywhere -with Karl's problem: First, we would need an awful lot of these rectangles and -then there is the border that is not ``closed''. - -So, Karl is about to resort to simply drawing four vertical and four horizontal -lines using the nice |\draw| command, when he learns that there is a |grid| -path construction operation. - - -\subsection{Grid Path Construction} - -The |grid| path operation adds a grid to the current path. It will add lines -making up a grid that fills the rectangle whose one corner is the current point -and whose other corner is the point following the |grid| operation. For -example, the code |\tikz \draw[step=2pt] (0,0) grid (10pt,10pt);| produces -\tikz \draw[step=2pt] (0,0) grid (10pt,10pt);. Note how the optional argument -for |\draw| can be used to specify a grid width (there are also |xstep| and -|ystep| to define the steppings independently). As Karl will learn soon, there -are \emph{lots} of things that can be influenced using such options. - -For Karl, the following code could be used: -% -\begin{codeexample}[] -\begin{tikzpicture} - \draw (-1.5,0) -- (1.5,0); - \draw (0,-1.5) -- (0,1.5); - \draw (0,0) circle [radius=1cm]; - \draw[step=.5cm] (-1.4,-1.4) grid (1.4,1.4); -\end{tikzpicture} -\end{codeexample} - -Having another look at the desired picture, Karl notices that it would be nice -for the grid to be more subdued. (His son told him that grids tend to be -distracting if they are not subdued.) To subdue the grid, Karl adds two more -options to the |\draw| command that draws the grid. First, he uses the color -|gray| for the grid lines. Second, he reduces the line width to |very thin|. -Finally, he swaps the ordering of the commands so that the grid is drawn first -and everything else on top. -% -\begin{codeexample}[] -\begin{tikzpicture} - \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4); - \draw (-1.5,0) -- (1.5,0); - \draw (0,-1.5) -- (0,1.5); - \draw (0,0) circle [radius=1cm]; -\end{tikzpicture} -\end{codeexample} - - -\subsection{Adding a Touch of Style} - -Instead of the options |gray,very thin| Karl could also have said |help lines|. -\emph{Styles} are predefined sets of options that can be used to organize how a -graphic is drawn. By saying |help lines| you say ``use the style that I (or -someone else) has set for drawing help lines''. If Karl decides, at some later -point, that grids should be drawn, say, using the color |blue!50| instead of -|gray|, he could provide the following option somewhere: -% -\begin{codeexample}[code only] -help lines/.style={color=blue!50,very thin} -\end{codeexample} -% -The effect of this ``style setter'' is that in the current scope or environment -the |help lines| option has the same effect as |color=blue!50,very thin|. - -Using styles makes your graphics code more flexible. You can change the way -things look easily in a consistent manner. Normally, styles are defined at the -beginning of a picture. However, you may sometimes wish to define a style -globally, so that all pictures of your document can use this style. Then you -can easily change the way all graphics look by changing this one style. In this -situation you can use the |\tikzset| command at the beginning of the document -as in -% -\begin{codeexample}[code only] -\tikzset{help lines/.style=very thin} -\end{codeexample} - -To build a hierarchy of styles you can have one style use another. So in order -to define a style |Karl's grid| that is based on the |grid| style Karl could -say -% -\begin{codeexample}[code only] -\tikzset{Karl's grid/.style={help lines,color=blue!50}} -... -\draw[Karl's grid] (0,0) grid (5,5); -\end{codeexample} - -Styles are made even more powerful by parametrization. This means that, like -other options, styles can also be used with a parameter. For instance, Karl -could parameterize his grid so that, by default, it is blue, but he could also -use another color. -% -\begin{codeexample}[code only] -\begin{tikzpicture} - [Karl's grid/.style ={help lines,color=#1!50}, - Karl's grid/.default=blue] - - \draw[Karl's grid] (0,0) grid (1.5,2); - \draw[Karl's grid=red] (2,0) grid (3.5,2); -\end{tikzpicture} -\end{codeexample} - - In this example, the definition of the style |Karl's grid| is given as an - optional argument to the |{tikzpicture}| environment. Additional styles for other - elements would follow after a comma. With many styles in effect, the optional - argument of the environment may easily happen to be longer than the actual - contents. - -\subsection{Drawing Options} - -Karl wonders what other options there are that influence how a path is drawn. -He saw already that the |color=|\meta{color} option can be used to set the -line's color. The option |draw=|\meta{color} does nearly the same, only it sets -the color for the lines only and a different color can be used for filling -(Karl will need this when he fills the arc for the angle). - -He saw that the style |very thin| yields very thin lines. Karl is not really -surprised by this and neither is he surprised to learn that |thin| yields thin -lines, |thick| yields thick lines, |very thick| yields very thick lines, -|ultra thick| yields really, really thick lines and |ultra thin| yields lines -that are so thin that low-resolution printers and displays will have trouble -showing them. He wonders what gives lines of ``normal'' thickness. It turns out -that |thin| is the correct choice, since it gives the same thickness as \TeX's -|\hrule| command. Nevertheless, Karl would like to know whether there is -anything ``in the middle'' between |thin| and |thick|. There is: |semithick|. - -Another useful thing one can do with lines is to dash or dot them. For this, -the two styles |dashed| and |dotted| can be used, yielding \tikz[baseline] -\draw[dashed] (0,.5ex) -- ++(2em,0pt); and \tikz[baseline] \draw[dotted] -(0,.5ex) -- ++(2em,0pt);. Both options also exist in a loose and a dense -version, called |loosely dashed|, |densely dashed|, |loosely dotted|, and -|densely dotted|. If he really, really needs to, Karl can also define much -more complex dashing patterns with the |dash pattern| option, but his son -insists that dashing is to be used with utmost care and mostly distracts. -Karl's son claims that complicated dashing patterns are evil. Karl's students -do not care about dashing patterns. - - -\subsection{Arc Path Construction} - -Our next obstacle is to draw the arc for the angle. For this, the |arc| path -construction operation is useful, which draws part of a circle or ellipse. This -|arc| operation is followed by options in brackets that specify the arc. An -example would be \texttt{arc[start angle=10, end angle=80, radius=10pt]}, which -means exactly what it says. Karl obviously needs an arc from $0^\circ$ to -$30^\circ$. The radius should be something relatively small, perhaps around one -third of the circle's radius. When one uses the arc path construction -operation, the specified arc will be added with its starting point at the -current position. So, we first have to ``get there''. -% -\begin{codeexample}[] -\begin{tikzpicture} - \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4); - \draw (-1.5,0) -- (1.5,0); - \draw (0,-1.5) -- (0,1.5); - \draw (0,0) circle [radius=1cm]; - \draw (3mm,0mm) arc [start angle=0, end angle=30, radius=3mm]; -\end{tikzpicture} -\end{codeexample} - -Karl thinks this is really a bit small and he cannot continue unless he learns -how to do scaling. For this, he can add the |[scale=3]| option. He could add -this option to each |\draw| command, but that would be awkward. Instead, he -adds it to the whole environment, which causes this option to apply to -everything within. -% -\begin{codeexample}[] -\begin{tikzpicture}[scale=3] - \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4); - \draw (-1.5,0) -- (1.5,0); - \draw (0,-1.5) -- (0,1.5); - \draw (0,0) circle [radius=1cm]; - \draw (3mm,0mm) arc [start angle=0, end angle=30, radius=3mm]; -\end{tikzpicture} -\end{codeexample} - -As for circles, you can specify ``two'' radii in order to get an elliptical -arc. -% -\begin{codeexample}[] - \tikz \draw (0,0) - arc [start angle=0, end angle=315, - x radius=1.75cm, y radius=1cm]; -\end{codeexample} - - -\subsection{Clipping a Path} - -In order to save space in this manual, it would be nice to clip Karl's graphics -a bit so that we can focus on the ``interesting'' parts. Clipping is pretty -easy in \tikzname. You can use the |\clip| command to clip all subsequent -drawing. It works like |\draw|, only it does not draw anything, but uses the -given path to clip everything subsequently. -% -\begin{codeexample}[] -\begin{tikzpicture}[scale=3] - \clip (-0.1,-0.2) rectangle (1.1,0.75); - \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4); - \draw (-1.5,0) -- (1.5,0); - \draw (0,-1.5) -- (0,1.5); - \draw (0,0) circle [radius=1cm]; - \draw (3mm,0mm) arc [start angle=0, end angle=30, radius=3mm]; -\end{tikzpicture} -\end{codeexample} - -You can also do both at the same time: Draw \emph{and} clip a path. For this, -use the |\draw| command and add the |clip| option. (This is not the whole -picture: You can also use the |\clip| command and add the |draw| option. Well, -that is also not the whole picture: In reality, |\draw| is just a shorthand for -|\path[draw]| and |\clip| is a shorthand for |\path[clip]| and you could also -say |\path[draw,clip]|.) Here is an example: -% -\begin{codeexample}[] -\begin{tikzpicture}[scale=3] - \clip[draw] (0.5,0.5) circle (.6cm); - \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4); - \draw (-1.5,0) -- (1.5,0); - \draw (0,-1.5) -- (0,1.5); - \draw (0,0) circle [radius=1cm]; - \draw (3mm,0mm) arc [start angle=0, end angle=30, radius=3mm]; -\end{tikzpicture} -\end{codeexample} - - -\subsection{Parabola and Sine Path Construction} - -Although Karl does not need them for his picture, he is pleased to learn that -there are |parabola| and |sin| and |cos| path operations for adding parabolas -and sine and cosine curves to the current path. For the |parabola| operation, -the current point will lie on the parabola as well as the point given after the -parabola operation. Consider the following example: -% -\begin{codeexample}[] -\tikz \draw (0,0) rectangle (1,1) (0,0) parabola (1,1); -\end{codeexample} - -It is also possible to place the bend somewhere else: -% -\begin{codeexample}[] -\tikz \draw[x=1pt,y=1pt] (0,0) parabola bend (4,16) (6,12); -\end{codeexample} - -The operations |sin| and |cos| add a sine or cosine curve in the interval -$[0,\pi/2]$ such that the previous current point is at the start of the curve -and the curve ends at the given end point. Here are two examples: -% -\begin{codeexample}[] -A sine \tikz \draw[x=1ex,y=1ex] (0,0) sin (1.57,1); curve. -\end{codeexample} - -\begin{codeexample}[] -\tikz \draw[x=1.57ex,y=1ex] (0,0) sin (1,1) cos (2,0) sin (3,-1) cos (4,0) - (0,1) cos (1,0) sin (2,-1) cos (3,0) sin (4,1); -\end{codeexample} - - -\subsection{Filling and Drawing} - -Returning to the picture, Karl now wants the angle to be ``filled'' with a very -light green. For this he uses |\fill| instead of |\draw|. Here is what Karl -does: -% -\begin{codeexample}[] -\begin{tikzpicture}[scale=3] - \clip (-0.1,-0.2) rectangle (1.1,0.75); - \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4); - \draw (-1.5,0) -- (1.5,0); - \draw (0,-1.5) -- (0,1.5); - \draw (0,0) circle [radius=1cm]; - \fill[green!20!white] (0,0) -- (3mm,0mm) - arc [start angle=0, end angle=30, radius=3mm] -- (0,0); -\end{tikzpicture} -\end{codeexample} - -The color |green!20!white| means 20\% green and 80\% white mixed together. Such -color expression are possible since \tikzname\ uses Uwe Kern's |xcolor| -package, see the documentation of that package for details on color -expressions. - -What would have happened, if Karl had not ``closed'' the path using |--(0,0)| -at the end? In this case, the path is closed automatically, so this could have -been omitted. Indeed, it would even have been better to write the following, -instead: -% -\begin{codeexample}[code only] - \fill[green!20!white] (0,0) -- (3mm,0mm) - arc [start angle=0, end angle=30, radius=3mm] -- cycle; -\end{codeexample} -% -The |--cycle| causes the current path to be closed (actually the current part -of the current path) by smoothly joining the first and last point. To -appreciate the difference, consider the following example: -% -\begin{codeexample}[] -\begin{tikzpicture}[line width=5pt] - \draw (0,0) -- (1,0) -- (1,1) -- (0,0); - \draw (2,0) -- (3,0) -- (3,1) -- cycle; - \useasboundingbox (0,1.5); % make bounding box higher -\end{tikzpicture} -\end{codeexample} - -You can also fill and draw a path at the same time using the |\filldraw| -command. This will first draw the path, then fill it. This may not seem too -useful, but you can specify different colors to be used for filling and for -stroking. These are specified as optional arguments like this: -% -\begin{codeexample}[] -\begin{tikzpicture}[scale=3] - \clip (-0.1,-0.2) rectangle (1.1,0.75); - \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4); - \draw (-1.5,0) -- (1.5,0); - \draw (0,-1.5) -- (0,1.5); - \draw (0,0) circle [radius=1cm]; - \filldraw[fill=green!20!white, draw=green!50!black] (0,0) -- (3mm,0mm) - arc [start angle=0, end angle=30, radius=3mm] -- cycle; -\end{tikzpicture} -\end{codeexample} - - -\subsection{Shading} - -Karl briefly considers the possibility of making the angle ``more fancy'' by -\emph{shading} it. Instead of filling the area with a uniform color, a smooth -transition between different colors is used. For this, |\shade| and -|\shadedraw|, for shading and drawing at the same time, can be used: -% -\begin{codeexample}[] - \tikz \shade (0,0) rectangle (2,1) (3,0.5) circle (.5cm); -\end{codeexample} -% -The default shading is a smooth transition from gray to white. To specify -different colors, you can use options: -% -\begin{codeexample}[] -\begin{tikzpicture}[rounded corners,ultra thick] - \shade[top color=yellow,bottom color=black] (0,0) rectangle +(2,1); - \shade[left color=yellow,right color=black] (3,0) rectangle +(2,1); - \shadedraw[inner color=yellow,outer color=black,draw=yellow] (6,0) rectangle +(2,1); - \shade[ball color=green] (9,.5) circle (.5cm); -\end{tikzpicture} -\end{codeexample} - -For Karl, the following might be appropriate: -% -\begin{codeexample}[] -\begin{tikzpicture}[scale=3] - \clip (-0.1,-0.2) rectangle (1.1,0.75); - \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4); - \draw (-1.5,0) -- (1.5,0); - \draw (0,-1.5) -- (0,1.5); - \draw (0,0) circle [radius=1cm]; - \shadedraw[left color=gray,right color=green, draw=green!50!black] - (0,0) -- (3mm,0mm) - arc [start angle=0, end angle=30, radius=3mm] -- cycle; -\end{tikzpicture} -\end{codeexample} - -However, he wisely decides that shadings usually only distract without adding -anything to the picture. - - -\subsection{Specifying Coordinates} - -Karl now wants to add the sine and cosine lines. He knows already that he can -use the |color=| option to set the lines' colors. So, what is the best way to -specify the coordinates? - -There are different ways of specifying coordinates. The easiest way is to say -something like |(10pt,2cm)|. This means 10pt in $x$-direction and 2cm in -$y$-directions. Alternatively, you can also leave out the units as in |(1,2)|, -which means ``one times the current $x$-vector plus twice the current -$y$-vector''. These vectors default to 1cm in the $x$-direction and 1cm in the -$y$-direction, respectively. - -In order to specify points in polar coordinates, use the notation |(30:1cm)|, -which means 1cm in direction 30 degree. This is obviously quite useful to ``get -to the point $(\cos 30^\circ,\sin 30^\circ)$ on the circle''. - -You can add a single |+| sign in front of a coordinate or two of them as in -|+(0cm,1cm)| or |++(2cm,0cm)|. Such coordinates are interpreted differently: -The first form means ``1cm upwards from the previous specified position'' and -the second means ``2cm to the right of the previous specified position, making -this the new specified position''. For example, we can draw the sine line as -follows: -% -\begin{codeexample}[] -\begin{tikzpicture}[scale=3] - \clip (-0.1,-0.2) rectangle (1.1,0.75); - \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4); - \draw (-1.5,0) -- (1.5,0); - \draw (0,-1.5) -- (0,1.5); - \draw (0,0) circle [radius=1cm]; - \filldraw[fill=green!20,draw=green!50!black] (0,0) -- (3mm,0mm) - arc [start angle=0, end angle=30, radius=3mm] -- cycle; - \draw[red,very thick] (30:1cm) -- +(0,-0.5); -\end{tikzpicture} -\end{codeexample} - -Karl used the fact $\sin 30^\circ = 1/2$. However, he very much doubts that his -students know this, so it would be nice to have a way of specifying ``the point -straight down from |(30:1cm)| that lies on the $x$-axis''. This is, indeed, -possible using a special syntax: Karl can write \verb!(30:1cm |- 0,0)!. In -general, the meaning of |(|\meta{p}\verb! |- !\meta{q}|)| is ``the intersection -of a vertical line through $p$ and a horizontal line through $q$''. - -Next, let us draw the cosine line. One way would be to say -\verb!(30:1cm |- 0,0) -- (0,0)!. Another way is the following: we ``continue'' -from where the sine ends: -% -\begin{codeexample}[] -\begin{tikzpicture}[scale=3] - \clip (-0.1,-0.2) rectangle (1.1,0.75); - \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4); - \draw (-1.5,0) -- (1.5,0); - \draw (0,-1.5) -- (0,1.5); - \draw (0,0) circle [radius=1cm]; - \filldraw[fill=green!20,draw=green!50!black] (0,0) -- (3mm,0mm) - arc [start angle=0, end angle=30, radius=3mm] -- cycle; - \draw[red,very thick] (30:1cm) -- +(0,-0.5); - \draw[blue,very thick] (30:1cm) ++(0,-0.5) -- (0,0); -\end{tikzpicture} -\end{codeexample} - -Note that there is no |--| between |(30:1cm)| and |++(0,-0.5)|. In detail, this -path is interpreted as follows: ``First, the |(30:1cm)| tells me to move my pen -to $(\cos 30^\circ,1/2)$. Next, there comes another coordinate specification, -so I move my pen there without drawing anything. This new point is half a unit -down from the last position, thus it is at $(\cos 30^\circ,0)$. Finally, I move -the pen to the origin, but this time drawing something (because of the |--|).'' - -To appreciate the difference between |+| and |++| consider the following -example: -% -\begin{codeexample}[] -\begin{tikzpicture} - \def\rectanglepath{-- ++(1cm,0cm) -- ++(0cm,1cm) -- ++(-1cm,0cm) -- cycle} - \draw (0,0) \rectanglepath; - \draw (1.5,0) \rectanglepath; -\end{tikzpicture} -\end{codeexample} - -By comparison, when using a single |+|, the coordinates are different: -% -\begin{codeexample}[] -\begin{tikzpicture} - \def\rectanglepath{-- +(1cm,0cm) -- +(1cm,1cm) -- +(0cm,1cm) -- cycle} - \draw (0,0) \rectanglepath; - \draw (1.5,0) \rectanglepath; -\end{tikzpicture} -\end{codeexample} - - -Naturally, all of this could have been written more clearly and more -economically like this (either with a single or a double |+|): -% -\begin{codeexample}[] -\tikz \draw (0,0) rectangle +(1,1) (1.5,0) rectangle +(1,1); -\end{codeexample} - - -\subsection{Intersecting Paths} - -Karl is left with the line for $\tan \alpha$, which seems difficult to specify -using transformations and polar coordinates. The first -- and easiest -- thing -he can do is so simply use the coordinate |(1,{tan(30)})| since \tikzname's -math engine knows how to compute things like |tan(30)|. Note the added braces -since, otherwise, \tikzname's parser would think that the first closing -parenthesis ends the coordinate (in general, you need to add braces around -components of coordinates when these components contain parentheses). - -Karl can, however, also use a more elaborate, but also more ``geometric'' way -of computing the length of the orange line: He can specify intersections of -paths as coordinates. The line for $\tan \alpha$ starts at $(1,0)$ and goes -upward to a point that is at the intersection of a line going ``up'' and a line -going from the origin through |(30:1cm)|. Such computations are made available -by the |intersections| library. - -What Karl must do is to create two ``invisible'' paths that intersect at the -position of interest. Creating paths that are not otherwise seen can be done -using the |\path| command without any options like |draw| or |fill|. Then, Karl -can add the |name path| option to the path for later reference. Once the paths -have been constructed, Karl can use the |name intersections| to assign names to -the coordinate for later reference. -% -\begin{codeexample}[code only] -\path [name path=upward line] (1,0) -- (1,1); -\path [name path=sloped line] (0,0) -- (30:1.5cm); % a bit longer, so that there is an intersection - -% (add `\usetikzlibrary{intersections}' after loading tikz in the preamble) -\draw [name intersections={of=upward line and sloped line, by=x}] - [very thick,orange] (1,0) -- (x); -\end{codeexample} - - -\subsection{Adding Arrow Tips} - -Karl now wants to add the little arrow tips at the end of the axes. He has -noticed that in many plots, even in scientific journals, these arrow tips seem -to be missing, presumably because the generating programs cannot produce them. -Karl thinks arrow tips belong at the end of axes. His son agrees. His students -do not care about arrow tips. - -It turns out that adding arrow tips is pretty easy: Karl adds the option |->| -to the drawing commands for the axes: -% -\begin{codeexample}[preamble={\usetikzlibrary{intersections}}] -\begin{tikzpicture}[scale=3] - \clip (-0.1,-0.2) rectangle (1.1,1.51); - \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4); - \draw[->] (-1.5,0) -- (1.5,0); - \draw[->] (0,-1.5) -- (0,1.5); - \draw (0,0) circle [radius=1cm]; - \filldraw[fill=green!20,draw=green!50!black] (0,0) -- (3mm,0mm) - arc [start angle=0, end angle=30, radius=3mm] -- cycle; - \draw[red,very thick] (30:1cm) -- +(0,-0.5); - \draw[blue,very thick] (30:1cm) ++(0,-0.5) -- (0,0); - - \path [name path=upward line] (1,0) -- (1,1); - \path [name path=sloped line] (0,0) -- (30:1.5cm); - \draw [name intersections={of=upward line and sloped line, by=x}] - [very thick,orange] (1,0) -- (x); -\end{tikzpicture} -\end{codeexample} - -If Karl had used the option |<-| instead of |->|, arrow tips would have been -put at the beginning of the path. The option |<->| puts arrow tips at both ends -of the path. - -There are certain restrictions to the kind of paths to which arrow tips can be -added. As a rule of thumb, you can add arrow tips only to a single open -``line''. For example, you cannot add tips to, say, a rectangle or a circle. -However, you can add arrow tips to curved paths and to paths that have several -segments, as in the following examples: -% -\begin{codeexample}[] -\begin{tikzpicture} - \draw [<->] (0,0) arc [start angle=180, end angle=30, radius=10pt]; - \draw [<->] (1,0) -- (1.5cm,10pt) -- (2cm,0pt) -- (2.5cm,10pt); -\end{tikzpicture} -\end{codeexample} - -Karl has a more detailed look at the arrow that \tikzname\ puts at the end. It -looks like this when he zooms it: \tikz[baseline] \draw[->,line width=1pt] -(0pt,.5ex) -- ++(10pt,0pt);. The shape seems vaguely familiar and, indeed, this -is exactly the end of \TeX's standard arrow used in something like $f\colon A -\to B$. - -Karl likes the arrow, especially since it is not ``as thick'' as the arrows -offered by many other packages. However, he expects that, sometimes, he might -need to use some other kinds of arrow. To do so, Karl can say |>=|\meta{kind of -end arrow tip}, where \meta{kind of end arrow tip} is a special arrow tip -specification. For example, if Karl says |>=Stealth|, then he tells \tikzname\ -that he would like ``stealth-fighter-like'' arrow tips: -\todosp{remaining instance of bug \#473} -% -\begin{codeexample}[preamble={\usetikzlibrary{arrows.meta}}] -\begin{tikzpicture}[>=Stealth] - \draw [->] (0,0) arc [start angle=180, end angle=30, radius=10pt]; - \draw [<<-,very thick] (1,0) -- (1.5cm,10pt) -- (2cm,0pt) -- (2.5cm,10pt); -\end{tikzpicture} -\end{codeexample} - -Karl wonders whether such a military name for the arrow type is really -necessary. He is not really mollified when his son tells him that Microsoft's -PowerPoint uses the same name. He decides to have his students discuss this at -some point. - -In addition to |Stealth| there are several other predefined kinds of arrow tips -Karl can choose from, see Section~\ref{section-arrows}. Furthermore, he can -define arrows types himself, if he needs new ones. - - -\subsection{Scoping} - -Karl saw already that there are numerous graphic options that affect how paths -are rendered. Often, he would like to apply certain options to a whole set of -graphic commands. For example, Karl might wish to draw three paths using a -|thick| pen, but would like everything else to be drawn ``normally''. - -If Karl wishes to set a certain graphic option for the whole picture, he can -simply pass this option to the |\tikz| command or to the |{tikzpicture}| -environment (Gerda would pass the options to |\tikzpicture| and Hans passes -them to |\starttikzpicture|). However, if Karl wants to apply graphic options -to a local group, he put these commands inside a |{scope}| environment (Gerda -uses |\scope| and |\endscope|, Hans uses |\startscope| and |\stopscope|). This -environment takes graphic options as an optional argument and these options -apply to everything inside the scope, but not to anything outside. - -Here is an example: -% -\begin{codeexample}[] -\begin{tikzpicture}[ultra thick] - \draw (0,0) -- (0,1); - \begin{scope}[thin] - \draw (1,0) -- (1,1); - \draw (2,0) -- (2,1); - \end{scope} - \draw (3,0) -- (3,1); -\end{tikzpicture} -\end{codeexample} - -Scoping has another interesting effect: Any changes to the clipping area are -local to the scope. Thus, if you say |\clip| somewhere inside a scope, the -effect of the |\clip| command ends at the end of the scope. This is useful -since there is no other way of ``enlarging'' the clipping area. - -Karl has also already seen that giving options to commands like |\draw| apply -only to that command. It turns out that the situation is slightly more complex. -First, options to a command like |\draw| are not really options to the command, -but they are ``path options'' and can be given anywhere on the path. So, -instead of |\draw[thin] (0,0) -- (1,0);| one can also write -|\draw (0,0) [thin] -- (1,0);| or |\draw (0,0) -- (1,0) [thin];|; all of these -have the same effect. This might seem strange since in the last case, it would -appear that the |thin| should take effect only ``after'' the line from $(0,0)$ -to $(1,0)$ has been drawn. However, most graphic options only apply to the -whole path. Indeed, if you say both |thin| and |thick| on the same path, the -last option given will ``win''. - -When reading the above, Karl notices that only ``most'' graphic options apply -to the whole path. Indeed, all transformation options do \emph{not} apply to -the whole path, but only to ``everything following them on the path''. We will -have a more detailed look at this in a moment. Nevertheless, all options given -during a path construction apply only to this path. - - -\subsection{Transformations} - -When you specify a coordinate like |(1cm,1cm)|, where is that coordinate -placed on the page? To determine the position, \tikzname, \TeX, and -\textsc{pdf} or PostScript all apply certain transformations to the given -coordinate in order to determine the final position on the page. - -\tikzname\ provides numerous options that allow you to transform coordinates in -\tikzname's private coordinate system. For example, the |xshift| option allows -you to shift all subsequent points by a certain amount: - -\begin{codeexample}[] -\tikz \draw (0,0) -- (0,0.5) [xshift=2pt] (0,0) -- (0,0.5); -\end{codeexample} - -It is important to note that you can change transformation ``in the middle of a -path'', a feature that is not supported by \pdf\ or PostScript. The reason is -that \tikzname\ keeps track of its own transformation matrix. - -Here is a more complicated example: -% -\begin{codeexample}[] -\begin{tikzpicture}[even odd rule,rounded corners=2pt,x=10pt,y=10pt] - \filldraw[fill=yellow!80!black] (0,0) rectangle (1,1) - [xshift=5pt,yshift=5pt] (0,0) rectangle (1,1) - [rotate=30] (-1,-1) rectangle (2,2); -\end{tikzpicture} -\end{codeexample} - -The most useful transformations are |xshift| and |yshift| for shifting, |shift| -for shifting to a given point as in |shift={(1,0)}| or |shift={+(0,0)}| (the -braces are necessary so that \TeX\ does not mistake the comma for separating -options), |rotate| for rotating by a certain angle (there is also a -|rotate around| for rotating around a given point), |scale| for scaling by a -certain factor, |xscale| and |yscale| for scaling only in the $x$- or -$y$-direction (|xscale=-1| is a flip), and |xslant| and |yslant| for slanting. -If these transformation and those that I have not mentioned are not sufficient, -the |cm| option allows you to apply an arbitrary transformation matrix. Karl's -students, by the way, do not know what a transformation matrix is. - - -\subsection{Repeating Things: For-Loops} - -Karl's next aim is to add little ticks on the axes at positions $-1$, $-1/2$, -$1/2$, and $1$. For this, it would be nice to use some kind of ``loop'', -especially since he wishes to do the same thing at each of these positions. -There are different packages for doing this. \LaTeX\ has its own internal -command for this, |pstricks| comes along with the powerful |\multido| command. -All of these can be used together with \tikzname, so if you are familiar with -them, feel free to use them. \tikzname\ introduces yet another command, called -|\foreach|, which I introduced since I could never remember the syntax of the -other packages. |\foreach| is defined in the package |pgffor| and can be used -independently of \tikzname, but \tikzname\ includes it automatically. - -In its basic form, the |\foreach| command is easy to use: -% -\begin{codeexample}[] -\foreach \x in {1,2,3} {$x =\x$, } -\end{codeexample} - -The general syntax is -|\foreach| \meta{variable}| in {|\meta{list of values}|} |\meta{commands}. -Inside the \meta{commands}, the \meta{variable} will be assigned to the -different values. If the \meta{commands} do not start with a brace, everything -up to the next semicolon is used as \meta{commands}. - -For Karl and the ticks on the axes, he could use the following code: -% -\begin{codeexample}[] -\begin{tikzpicture}[scale=3] - \clip (-0.1,-0.2) rectangle (1.1,1.51); - \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4); - \filldraw[fill=green!20,draw=green!50!black] (0,0) -- (3mm,0mm) - arc [start angle=0, end angle=30, radius=3mm] -- cycle; - \draw[->] (-1.5,0) -- (1.5,0); - \draw[->] (0,-1.5) -- (0,1.5); - \draw (0,0) circle [radius=1cm]; - - \foreach \x in {-1cm,-0.5cm,1cm} - \draw (\x,-1pt) -- (\x,1pt); - \foreach \y in {-1cm,-0.5cm,0.5cm,1cm} - \draw (-1pt,\y) -- (1pt,\y); -\end{tikzpicture} -\end{codeexample} - -As a matter of fact, there are many different ways of creating the ticks. For -example, Karl could have put the |\draw ...;| inside curly braces. He could -also have used, say, -% -\begin{codeexample}[code only] -\foreach \x in {-1,-0.5,1} - \draw[xshift=\x cm] (0pt,-1pt) -- (0pt,1pt); -\end{codeexample} - -Karl is curious what would happen in a more complicated situation where there -are, say, 20 ticks. It seems bothersome to explicitly mention all these numbers -in the set for |\foreach|. Indeed, it is possible to use |...| inside the -|\foreach| statement to iterate over a large number of values (which must, -however, be dimensionless real numbers) as in the following example: -% -\begin{codeexample}[] -\tikz \foreach \x in {1,...,10} - \draw (\x,0) circle (0.4cm); -\end{codeexample} - -If you provide \emph{two} numbers before the |...|, the |\foreach| statement -will use their difference for the stepping: -% -\begin{codeexample}[] -\tikz \foreach \x in {-1,-0.5,...,1} - \draw (\x cm,-1pt) -- (\x cm,1pt); -\end{codeexample} - -We can also nest loops to create interesting effects: -% -\begin{codeexample}[] -\begin{tikzpicture} - \foreach \x in {1,2,...,5,7,8,...,12} - \foreach \y in {1,...,5} - { - \draw (\x,\y) +(-.5,-.5) rectangle ++(.5,.5); - \draw (\x,\y) node{\x,\y}; - } -\end{tikzpicture} -\end{codeexample} - -The |\foreach| statement can do even trickier stuff, but the above gives the -idea. - - -\subsection{Adding Text} - -Karl is, by now, quite satisfied with the picture. However, the most important -parts, namely the labels, are still missing! - -\tikzname\ offers an easy-to-use and powerful system for adding text and, more -generally, complex shapes to a picture at specific positions. The basic idea is -the following: When \tikzname\ is constructing a path and encounters the -keyword |node| in the middle of a path, it reads a \emph{node specification}. -The keyword |node| is typically followed by some options and then some text -between curly braces. This text is put inside a normal \TeX\ box (if the node -specification directly follows a coordinate, which is usually the case, -\tikzname\ is able to perform some magic so that it is even possible to use -verbatim text inside the boxes) and then placed at the current position, that -is, at the last specified position (possibly shifted a bit, according to the -given options). However, all nodes are drawn only after the path has been -completely drawn/filled/shaded/clipped/whatever. -% -\begin{codeexample}[] -\begin{tikzpicture} - \draw (0,0) rectangle (2,2); - \draw (0.5,0.5) node [fill=yellow!80!black] - {Text at \verb!node 1!} - -- (1.5,1.5) node {Text at \verb!node 2!}; -\end{tikzpicture} -\end{codeexample} - -Obviously, Karl would not only like to place nodes \emph{on} the last specified -position, but also to the left or the right of these positions. For this, every -node object that you put in your picture is equipped with several -\emph{anchors}. For example, the |north| anchor is in the middle at the upper -end of the shape, the |south| anchor is at the bottom and the |north east| -anchor is in the upper right corner. When you give the option |anchor=north|, -the text will be placed such that this northern anchor will lie on the current -position and the text is, thus, below the current position. Karl uses this to -draw the ticks as follows: -% -\begin{codeexample}[] -\begin{tikzpicture}[scale=3] - \clip (-0.6,-0.2) rectangle (0.6,1.51); - \draw[step=.5cm,help lines] (-1.4,-1.4) grid (1.4,1.4); - \filldraw[fill=green!20,draw=green!50!black] (0,0) -- (3mm,0mm) - arc [start angle=0, end angle=30, radius=3mm] -- cycle; - \draw[->] (-1.5,0) -- (1.5,0); \draw[->] (0,-1.5) -- (0,1.5); - \draw (0,0) circle [radius=1cm]; - - \foreach \x in {-1,-0.5,1} - \draw (\x cm,1pt) -- (\x cm,-1pt) node[anchor=north] {$\x$}; - \foreach \y in {-1,-0.5,0.5,1} - \draw (1pt,\y cm) -- (-1pt,\y cm) node[anchor=east] {$\y$}; -\end{tikzpicture} -\end{codeexample} - -This is quite nice, already. Using these anchors, Karl can now add most of the -other text elements. However, Karl thinks that, though ``correct'', it is quite -counter-intuitive that in order to place something \emph{below} a given point, -he has to use the \emph{north} anchor. For this reason, there is an option -called |below|, which does the same as |anchor=north|. Similarly, |above right| -does the same as |anchor=south west|. In addition, |below| takes an optional -dimension argument. If given, the shape will additionally be shifted downwards -by the given amount. So, |below=1pt| can be used to put a text label below some -point and, additionally shift it 1pt downwards. - -Karl is not quite satisfied with the ticks. He would like to have $1/2$ or -$\frac{1}{2}$ shown instead of $0.5$, partly to show off the nice capabilities -of \TeX\ and \tikzname, partly because for positions like $1/3$ or $\pi$ it is -certainly very much preferable to have the ``mathematical'' tick there instead -of just the ``numeric'' tick. His students, on the other hand, prefer $0.5$ -over $1/2$ since they are not too fond of fractions in general. - -Karl now faces a problem: For the |\foreach| statement, the position |\x| -should still be given as |0.5| since \tikzname\ will not know where -|\frac{1}{2}| is supposed to be. On the other hand, the typeset text should -really be |\frac{1}{2}|. To solve this problem, |\foreach| offers a special -syntax: Instead of having one variable |\x|, Karl can specify two (or even -more) variables separated by a slash as in |\x / \xtext|. Then, the elements in -the set over which |\foreach| iterates must also be of the form -\meta{first}|/|\meta{second}. In each iteration, |\x| will be set to -\meta{first} and |\xtext| will be set to \meta{second}. If no \meta{second} is -given, the \meta{first} will be used again. So, here is the new code for the -ticks: -% -\begin{codeexample}[] -\begin{tikzpicture}[scale=3] - \clip (-0.6,-0.2) rectangle (0.6,1.51); - \draw[step=.5cm,help lines] (-1.4,-1.4) grid (1.4,1.4); - \filldraw[fill=green!20,draw=green!50!black] (0,0) -- (3mm,0mm) - arc [start angle=0, end angle=30, radius=3mm] -- cycle; - \draw[->] (-1.5,0) -- (1.5,0); \draw[->] (0,-1.5) -- (0,1.5); - \draw (0,0) circle [radius=1cm]; - - \foreach \x/\xtext in {-1, -0.5/-\frac{1}{2}, 1} - \draw (\x cm,1pt) -- (\x cm,-1pt) node[anchor=north] {$\xtext$}; - \foreach \y/\ytext in {-1, -0.5/-\frac{1}{2}, 0.5/\frac{1}{2}, 1} - \draw (1pt,\y cm) -- (-1pt,\y cm) node[anchor=east] {$\ytext$}; -\end{tikzpicture} -\end{codeexample} - -Karl is quite pleased with the result, but his son points out that this is -still not perfectly satisfactory: The grid and the circle interfere with the -numbers and decrease their legibility. Karl is not very concerned by this (his -students do not even notice), but his son insists that there is an easy -solution: Karl can add the |[fill=white]| option to fill out the background of -the text shape with a white color. - -The next thing Karl wants to do is to add the labels like $\sin \alpha$. For -this, he would like to place a label ``in the middle of the line''. To do so, -instead of specifying the label |node {$\sin\alpha$}| directly after one of -the endpoints of the line (which would place the label at that endpoint), Karl -can give the label directly after the |--|, before the coordinate. By default, -this places the label in the middle of the line, but the |pos=| options can be -used to modify this. Also, options like |near start| and |near end| can be used -to modify this position: -% -\begin{codeexample}[preamble={\usetikzlibrary{intersections}}] -\begin{tikzpicture}[scale=3] - \clip (-2,-0.2) rectangle (2,0.8); - \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4); - \filldraw[fill=green!20,draw=green!50!black] (0,0) -- (3mm,0mm) - arc [start angle=0, end angle=30, radius=3mm] -- cycle; - \draw[->] (-1.5,0) -- (1.5,0) coordinate (x axis); - \draw[->] (0,-1.5) -- (0,1.5) coordinate (y axis); - \draw (0,0) circle [radius=1cm]; - - \draw[very thick,red] - (30:1cm) -- node[left=1pt,fill=white] {$\sin \alpha$} (30:1cm |- x axis); - \draw[very thick,blue] - (30:1cm |- x axis) -- node[below=2pt,fill=white] {$\cos \alpha$} (0,0); - \path [name path=upward line] (1,0) -- (1,1); - \path [name path=sloped line] (0,0) -- (30:1.5cm); - \draw [name intersections={of=upward line and sloped line, by=t}] - [very thick,orange] (1,0) -- node [right=1pt,fill=white] - {$\displaystyle \tan \alpha \color{black}= - \frac{{\color{red}\sin \alpha}}{\color{blue}\cos \alpha}$} (t); - - \draw (0,0) -- (t); - - \foreach \x/\xtext in {-1, -0.5/-\frac{1}{2}, 1} - \draw (\x cm,1pt) -- (\x cm,-1pt) node[anchor=north,fill=white] {$\xtext$}; - \foreach \y/\ytext in {-1, -0.5/-\frac{1}{2}, 0.5/\frac{1}{2}, 1} - \draw (1pt,\y cm) -- (-1pt,\y cm) node[anchor=east,fill=white] {$\ytext$}; -\end{tikzpicture} -\end{codeexample} - -You can also position labels on curves and, by adding the |sloped| option, have -them rotated such that they match the line's slope. Here is an example: -% -\begin{codeexample}[] -\begin{tikzpicture} - \draw (0,0) .. controls (6,1) and (9,1) .. - node[near start,sloped,above] {near start} - node {midway} - node[very near end,sloped,below] {very near end} (12,0); -\end{tikzpicture} -\end{codeexample} - -It remains to draw the explanatory text at the right of the picture. The main -difficulty here lies in limiting the width of the text ``label'', which is -quite long, so that line breaking is used. Fortunately, Karl can use the option -|text width=6cm| to get the desired effect. So, here is the full code: -% -\begin{codeexample}[code only] -\begin{tikzpicture} - [scale=3,line cap=round, - % Styles - axes/.style=, - important line/.style={very thick}, - information text/.style={rounded corners,fill=red!10,inner sep=1ex}] - - % Colors - \colorlet{anglecolor}{green!50!black} - \colorlet{sincolor}{red} - \colorlet{tancolor}{orange!80!black} - \colorlet{coscolor}{blue} - - % The graphic - \draw[help lines,step=0.5cm] (-1.4,-1.4) grid (1.4,1.4); - - \draw (0,0) circle [radius=1cm]; - - \begin{scope}[axes] - \draw[->] (-1.5,0) -- (1.5,0) node[right] {$x$} coordinate(x axis); - \draw[->] (0,-1.5) -- (0,1.5) node[above] {$y$} coordinate(y axis); - - \foreach \x/\xtext in {-1, -.5/-\frac{1}{2}, 1} - \draw[xshift=\x cm] (0pt,1pt) -- (0pt,-1pt) node[below,fill=white] {$\xtext$}; - - \foreach \y/\ytext in {-1, -.5/-\frac{1}{2}, .5/\frac{1}{2}, 1} - \draw[yshift=\y cm] (1pt,0pt) -- (-1pt,0pt) node[left,fill=white] {$\ytext$}; - \end{scope} - - \filldraw[fill=green!20,draw=anglecolor] (0,0) -- (3mm,0pt) - arc [start angle=0, end angle=30, radius=3mm]; - \draw (15:2mm) node[anglecolor] {$\alpha$}; - - \draw[important line,sincolor] - (30:1cm) -- node[left=1pt,fill=white] {$\sin \alpha$} (30:1cm |- x axis); - - \draw[important line,coscolor] - (30:1cm |- x axis) -- node[below=2pt,fill=white] {$\cos \alpha$} (0,0); - - \path [name path=upward line] (1,0) -- (1,1); - \path [name path=sloped line] (0,0) -- (30:1.5cm); - \draw [name intersections={of=upward line and sloped line, by=t}] - [very thick,orange] (1,0) -- node [right=1pt,fill=white] - {$\displaystyle \tan \alpha \color{black}= - \frac{{\color{red}\sin \alpha}}{\color{blue}\cos \alpha}$} (t); - - \draw (0,0) -- (t); - - \draw[xshift=1.85cm] - node[right,text width=6cm,information text] - { - The {\color{anglecolor} angle $\alpha$} is $30^\circ$ in the - example ($\pi/6$ in radians). The {\color{sincolor}sine of - $\alpha$}, which is the height of the red line, is - \[ - {\color{sincolor} \sin \alpha} = 1/2. - \] - By the Theorem of Pythagoras ... - }; -\end{tikzpicture} -\end{codeexample} - - -\subsection{Pics: The Angle Revisited} - -Karl expects that the code of certain parts of the picture he created might be -so useful that he might wish to reuse them in the future. A natural thing to do -is to create \TeX\ macros that store the code he wishes to reuse. However, -\tikzname\ offers another way that is integrated directly into its parser: -pics! - -A ``pic'' is ``not quite a full picture'', hence the short name. The idea is -that a pic is simply some code that you can add to a picture at different -places using the |pic| command whose syntax is almost identical to the |node| -command. The main difference is that instead of specifying some text in curly -braces that should be shown, you specify the name of a predefined picture that -should be shown. - -Defining new pics is easy enough, see Section~\ref{section-pics}, but right now -we just want to use one such predefined pic: the |angle| pic. As the name -suggests, it is a small drawing of an angle consisting of a little wedge and an -arc together with some text (Karl needs to load the |angles| library and the -|quotes| for the following examples). What makes this pic useful is the fact -that the size of the wedge will be computed automatically. - -The |angle| pic draws an angle between the two lines $BA$ and $BC$, where $A$, -$B$, and $C$ are three coordinates. In our case, $B$ is the origin, $A$ is -somewhere on the $x$-axis and $C$ is somewhere on a line at $30^\circ$. -% -\begin{codeexample}[preamble={\usetikzlibrary{angles,quotes}}] -\begin{tikzpicture}[scale=3] - \coordinate (A) at (1,0); - \coordinate (B) at (0,0); - \coordinate (C) at (30:1cm); - - \draw (A) -- (B) -- (C) - pic [draw=green!50!black, fill=green!20, angle radius=9mm, - "$\alpha$"] {angle = A--B--C}; -\end{tikzpicture} -\end{codeexample} - -Let us see, what is happening here. First we have specified three -\emph{coordinates} using the |\coordinate| command. It allows us to name a -specific coordinate in the picture. Then comes something that starts as a -normal |\draw|, but then comes the |pic| command. This command gets lots of -options and, in curly braces, comes the most important point: We specify that -we want to add an |angle| pic and this angle should be between the points we -named |A|, |B|, and |C| (we could use other names). Note that the text that we -want to be shown in the pic is specified in quotes inside the options of the -|pic|, not inside the curly braces. - -To learn more about pics, please see Section~\ref{section-pics}. |