diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/pgf/base/doc/text-en/pgfmanual-en-library-fit.tex |
Initial commit
Diffstat (limited to 'graphics/pgf/base/doc/text-en/pgfmanual-en-library-fit.tex')
-rw-r--r-- | graphics/pgf/base/doc/text-en/pgfmanual-en-library-fit.tex | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-fit.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-fit.tex new file mode 100644 index 0000000000..1e0fbbd8f2 --- /dev/null +++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-fit.tex @@ -0,0 +1,161 @@ +% Copyright 2006 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{Fitting Library} +\label{section-library-fit} + +\begin{tikzlibrary}{fit} + The library defines (currently only two) options for fitting a node so that + it contains a set of coordinates. +\end{tikzlibrary} + +When you load this library, the following options become available: + +\begin{key}{/tikz/fit=\meta{coordinates or nodes}} + This option must be given to a |node| path command. The \meta{coordinates + or nodes} should be a sequence of \tikzname\ coordinates or node names, + one directly after the other without commas (like with the + |plot coordinates| path operation). Examples are |(1,0) (2,2)| or + |(a) (1,0) (b)|, where |a| and |b| are nodes. + + For this sequence of coordinates, a minimal bounding box is computed that + encompasses all the listed \meta{coordinates or nodes}. For coordinates in + the list, the bounding box is guaranteed to contain this coordinate, for + nodes it is guaranteed to contain the |east|, |west|, |north| and |south| + anchors of the node. In principle (the details will be explained in a + moment), things are now set up such that the text box of the node will be + exactly this bounding box. + + Here is an example: We fit several points in a rectangular node. By setting + the |inner sep| to zero, we see exactly the text box of the node. Then we + fit these points again in a circular node. Note how the circle encompasses + exactly the same bounding box. + % +\begin{codeexample}[] +\begin{tikzpicture}[inner sep=0pt,thick, + dot/.style={fill=blue,circle,minimum size=3pt}] + \draw[help lines] (0,0) grid (3,2); + \node[dot] (a) at (1,1) {}; + \node[dot] (b) at (2,2) {}; + \node[dot] (c) at (1,2) {}; + \node[dot] (d) at (1.25,0.25) {}; + \node[dot] (e) at (1.75,1.5) {}; + + \node[draw=red, fit=(a) (b) (c) (d) (e)] {box}; + \node[draw,circle,fit=(a) (b) (c) (d) (e)] {}; +\end{tikzpicture} +\end{codeexample} + + Every time the |fit| option is used, the following style is also applied to + the node: + % + \begin{stylekey}{/tikz/every fit (initially \normalfont empty)} + Set this style to change the appearance of a node that uses the |fit| + option. + \end{stylekey} + + The exact effects of the |fit| option are the following: + % + \begin{enumerate} + \item A minimal bounding box containing all coordinates is computed. + Note that if a coordinate like |(a)| is used that contains a node + name, this has the same effect as explicitly providing the + |(a.north)| and |(a.south)| and |(a.west)| and |(a.east)|. If you + wish to refer only to the center of the |a| node, use |(a.center)| + instead. + \item The |text width| option is set to the width of this bounding box. + \item The |align=center| option is set. + \item The |anchor| is set to |center|. + \item The |at| position of the node is set to the center of the + computed bounding box. + \item After the node has been typeset, its height and depth are + adjusted such that they add up to the height of the computed + bounding box and such that the text of the node is vertically + centered inside the box. + \end{enumerate} + % + The above means that, generally speaking, if the node contains text like + |box| in the above example, it will be centered inside the box. It will be + difficult to put the text elsewhere, in particular, changing the |anchor| + of the node will not have the desired effect. Instead, what you should do + is to create a node with the |fit| option that does not contain any text, + give it a name, and then use normal nodes to add text at the desired + positions. Alternatively, consider using the |label| or |pin| options. + + Suppose, for instance, that in the above example we want the word ``box'' + to appear inside the box, but at its top. This can be achieved as follows: + % +\begin{codeexample}[] +\begin{tikzpicture}[inner sep=0pt,thick, + dot/.style={fill=blue,circle,minimum size=3pt}] + \draw[help lines] (0,0) grid (3,2); + \node[dot] (a) at (1,1) {}; + \node[dot] (b) at (2,2) {}; + \node[dot] (c) at (1,2) {}; + \node[dot] (d) at (1.25,0.25) {}; + \node[dot] (e) at (1.75,1.5) {}; + + \node[draw=red,fit=(a) (b) (c) (d) (e)] (fit) {}; + \node[below] at (fit.north) {box}; +\end{tikzpicture} +\end{codeexample} + + Here is a real-life example that uses fitting: + % +\begin{codeexample}[] +\begin{tikzpicture} + [vertex/.style={minimum size=2pt,fill,draw,circle}, + open/.style={fill=none}, + sibling distance=1.5cm,level distance=.75cm, + every fit/.style={ellipse,draw,inner sep=-2pt}, + leaf/.style={label={[name=#1]below:$#1$}},auto] + + \node [vertex] (root) {} + child { node [vertex,open] {} + child { node [vertex,open] {} + child { node [vertex] (b's parent) {} + child { node [vertex] {} + child { node [vertex,leaf=d] {} } + child { node [vertex,leaf=e] {} } } + child { node [vertex,leaf=b] {} } } + child { node [vertex,leaf=a] {} } } + child { node [coordinate] {} + child[missing] + child { node [vertex] (f's parent) {} + child { node [vertex,leaf=c] {} } + child { node [vertex,leaf=f] {} } } } + edge from parent node {$\rho$} }; + + \node [fit=(d) (e) (b) (b's parent),label=above left:$F^{(b,R)}$] {}; + \node [fit=(c) (f) (f's parent),label=above right:$F^{(c,R)}$] {}; +\end{tikzpicture} +\end{codeexample} + % +\end{key} + +\begin{key}{/tikz/rotate fit=\meta{angle} (initially 0)} + This key fits \meta{coordinates or nodes} inside a node that is rotated by + \meta{angle}. As a side effect, it also sets the |/tikz/rotate| key. + % +\begin{codeexample}[] +\begin{tikzpicture}[inner sep=0pt,thick, + dot/.style={fill=blue,circle,minimum size=3pt}] + \draw[help lines] (0,0) grid (3,2); + \node[dot] (a) at (1,1) {}; + \node[dot] (b) at (2,2) {}; + \node[dot] (c) at (1,2) {}; + \node[dot] (d) at (1.25,0.25) {}; + \node[dot] (e) at (1.75,1.5) {}; + \node[draw, fit=(a) (b) (c) (d) (e)] {}; + \node[draw=red, rotate fit=30, fit=(a) (b) (c) (d) (e)] {}; +\end{tikzpicture} +\end{codeexample} + % +\end{key} |