Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

Is it possible to draw edges or paths in the background of nodes independently of whether they are constructed before or after the nodes are defined?

In the following example, the \draw instruction comes after the nodes are declared and so the path from (foo) to (baz) crosses the node (bar).

\documentclass{article}

\usepackage{tikz}

\begin{document}
  \begin{tikzpicture}
    \node [fill=gray!30] (foo) at (0,0) { foo };
    \node [fill=gray!30] (bar) at (2,0) { bar };
    \node [fill=gray!30] (baz) at (4,0) { baz };

    \draw (foo) -- (baz);
  \end{tikzpicture}
\end{document}

What I would like to achieve is that the path crosses (bar) in the background, so the node is not crossed visually. Is this possible without changing the order of the instructions (in particular, without moving the creation of (bar) below the \draw instruction)?

Here is how the above example looks like:

edge crossing the node in the foreground

And here is the desired result:

edge crossing the node in the background

share|improve this question
add comment

1 Answer

TikZ/PGF has a concept of layers. They are described in chapter 82 “Layered Graphics” in the (v2.10) manual and can be used to have later commands be drawn below the things before them. In your example, you could write

\documentclass{article}
\usepackage{tikz}

\pgfdeclarelayer{bg}    % declare background layer
\pgfsetlayers{bg,main}  % set the order of the layers (main is the standard layer)

\begin{document}
  \begin{tikzpicture}
    \node [fill=gray!30] (foo) at (0,0) { foo };
    \node [fill=gray!30] (bar) at (2,0) { bar };
    \node [fill=gray!30] (baz) at (4,0) { baz };

    \begin{pgfonlayer}{bg}    % select the background layer
        \draw (foo) -- (baz);
    \end{pgfonlayer}
  \end{tikzpicture}
\end{document}

Actually, the backgrounds library (see chapter 25 in v2.10) already defines a background layer and a key that has to be used on a scope to select the layer:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{backgrounds}

\begin{document}
  \begin{tikzpicture}
    \node [fill=gray!30] (foo) at (0,0) { foo };
    \node [fill=gray!30] (bar) at (2,0) { bar };
    \node [fill=gray!30] (baz) at (4,0) { baz };

    \begin{scope}[on background layer]
        \draw (foo) -- (baz);
    \end{scope}
  \end{tikzpicture}
\end{document}

(The two solutions compile to the same code (except that the backgrounds library calls the layer background).)

share|improve this answer
    
I've used layers before but I wonder if it's possible to achieve what I want without drawing the path in a scope on the background layer. Are there any TikZ keys to define the layer per path/node or anything similar? –  Jannis Pohlmann May 14 '11 at 2:11
    
@Jannis: None that I know. –  Caramdir May 14 '11 at 2:22
    
I talked to Till and soon edges might be drawn in the background of nodes by default, at least inside the new \graphs{} syntax that will be part of the next release. –  Jannis Pohlmann Jul 18 '11 at 19:25
    
There are situations where the two solutions aren't equivalent. For example, in case the background picture needs to refer to the current bounding box node, only the method with the backgrounds library will give the expected output. –  T. Verron May 6 '13 at 16:22
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.