8

I'm trying to follow this example on how to draw a background grid so I can easily connect arrows, but it draws the (non-transparent) picture on top of the grid making it hard to use. I want to draw the grid in the foreground, how can I do that?

9

You can temporarily use opacity=.5 for the node where you insert the picture:

\node [inner sep=0pt,above right,opacity=.5]   %%% <--- here
            {\includegraphics[width=4cm]{example-image}};

When you are done, simply make opacity = 1 or delete it.

Full code:

\documentclass{beamer} %
\usepackage{tikz}
\usepackage{verbatim}

\usetikzlibrary{arrows,shapes,backgrounds}

\begin{document}
% For every picture that defines or uses external nodes, you'll have to
% apply the 'remember picture' style. To avoid some typing, we'll apply
% the style to all pictures.
\tikzstyle{every picture}+=[remember picture]
\tikzstyle{na} = [baseline=-.5ex]

\begin{frame}

\frametitle{Daniell's pile, saline bridge version}

\begin{columns}
    \begin{column}{0.4\paperwidth}
        % define source coordinates
        \begin{itemize}
            \item Anode \tikz[na] \coordinate (s-anode);
            \item Cathode \tikz[na] \coordinate (s-cathode);
            \item Saline bridge \tikz[na] \coordinate (s-bridge);
        \end{itemize}

    \end{column}
    \begin{column}{0.45\paperwidth}
        % Use a background grid to make it easier to find coordinates
        % When the coordinates have been found, remove the
        % 'show background grid' option.
        \tikzstyle{background grid}=[draw, black!50,step=.5cm]
        \begin{tikzpicture}[show background grid]
            % Put the graphic inside a node. This makes it easy to place the
            % graphic and to draw on top of it.
            % The above right option is used to place the lower left corner
            % of the image at the (0,0) coordinate.            
            \node [inner sep=0pt,above right,opacity=.5]
                {\includegraphics[width=4cm]{example-image}};
            % show origin
            \fill (0,0) circle (2pt);
            % define destination coordinates
            \path (0.7,2) coordinate (cathode)
                  (2,1.8) coordinate (bridge)
                  (2.75,2.5) coordinate (anode);
        \end{tikzpicture}
    \end{column}
\end{columns}

% define overlays
% Note the use of the overlay option. This is required when
% you want to access nodes in different pictures.
\begin{tikzpicture}[overlay]
        \path[->,red,thick] (s-anode) edge [bend left] (anode);
        \path[->,blue,thick] (s-cathode) edge [bend left] (cathode);
        \path[->,red,thick] (s-bridge) edge [out=0, in=-90] (bridge);
\end{tikzpicture}

\end{frame}

\end{document}

enter image description here

Or using a scope to draw them after including image.

       \begin{tikzpicture}
        \node [inner sep=0pt,above right]
            {\includegraphics[width=4cm]{example-image}};
        \path (0.7,2) coordinate (cathode)
            (2,1.2) coordinate (bridge)
            (2.75,2.5) coordinate (anode);
        \begin{scope}
        \draw (current bounding box.south west)
                    grid [step=0.5cm] (current bounding box.north east);
        \end{scope}
    \end{tikzpicture}

enter image description here

PS: I have used example-image from mwe package. Change it with your picture.

| improve this answer | |
8

You can draw the grid on top of the tikzpicture by using the execute at end picture key, which allows executing TikZ code at the end of the tikzpicture environment. To make the grid cover the bounding box, you can use the current bounding box node:

\begin{tikzpicture}[
        execute at end picture={
            \draw (current bounding box.south west)
                grid [step=0.5cm] (current bounding box.north east);
        }
]

\documentclass{beamer} %
\usepackage{tikz}
\usepackage{verbatim}

\usetikzlibrary{arrows,shapes,backgrounds,calc}

\begin{document}
\tikzset{
    every picture/.append style=remember picture,
    na/.style={baseline=-.5ex}
}

\begin{frame}

\frametitle{Daniell's pile, saline bridge version}

\begin{columns}
    \begin{column}{0.4\paperwidth}
        \begin{itemize}
            \item Anode \tikz[na] \coordinate (s-anode);
            \item Cathode \tikz[na] \coordinate (s-cathode);
            \item Saline bridge \tikz[na] \coordinate (s-bridge);
        \end{itemize}

    \end{column}
    \begin{column}{0.45\paperwidth}
        \begin{tikzpicture}[
                execute at end picture={
                    \draw (current bounding box.south west)
                        grid [step=0.5cm] (current bounding box.north east);
                }
            ]
            \node [inner sep=0pt,above right]
                {\includegraphics[width=4cm]{example-image}};
            \path (0.7,2) coordinate (cathode)
                (2,1.2) coordinate (bridge)
                (2.75,2.5) coordinate (anode);
        \end{tikzpicture}
    \end{column}
\end{columns}

\begin{tikzpicture}[overlay]
        \path[->,red,thick] (s-anode) edge [bend left] (anode);
        \path[->,blue,thick] (s-cathode) edge [bend left] (cathode);
        \path[->,red,thick] (s-bridge) edge [out=0, in=-90] (bridge);
\end{tikzpicture}


\end{frame}

\end{document}
| improve this answer | |
6

You can use an additional overlay tikzpicture.Therefore save first the origin with \coordinate (origin) at (0,0) and include the grid at the end with

\begin{tikzpicture}[overlay,shift=(origin)]
    % show origin
    \fill (0,0) circle (2pt);
    % show grid
    \draw[step=0.5] (0,0) grid ++(4cm, 3cm);
\end{tikzpicture}'

When your done you can simply comment this code block.

Full code (with example-image' fromexample-imagefrommwe` packge):

\documentclass{beamer} %
\usepackage{tikz}
\usepackage{verbatim}

\usetikzlibrary{arrows,shapes,backgrounds,calc}

\begin{document}
% For every picture that defines or uses external nodes, you'll have to
% apply the 'remember picture' style. To avoid some typing, we'll apply
% the style to all pictures.
\tikzstyle{every picture}+=[remember picture]
\tikzstyle{na} = [baseline=-.5ex]

\begin{frame}

\frametitle{Daniell's pile, saline bridge version}

\begin{columns}
    \begin{column}{0.4\paperwidth}
        % define source coordinates
        \begin{itemize}
            \item Anode \tikz[na] \coordinate (s-anode);
            \item Cathode \tikz[na] \coordinate (s-cathode);
            \item Saline bridge \tikz[na] \coordinate (s-bridge);
        \end{itemize}

    \end{column}
    \begin{column}{0.45\paperwidth}
        \begin{tikzpicture}
            % Put the graphic inside a node. This makes it easy to place the
            % graphic and to draw on top of it.
            % The above right option is used to place the lower left corner
            % of the image at the (0,0) coordinate.            
            \node [inner sep=0pt,above right]
                {\includegraphics[width=4cm]{example-image}};
            % save origin
            \coordinate (origin) at (0,0);
            % define destination coordinates
            \path (0.7,2) coordinate (cathode)
                (2,1.8) coordinate (bridge)
                (2.75,2.5) coordinate (anode);
        \end{tikzpicture}
    \end{column}
\end{columns}

% define overlays
% Note the use of the overlay option. This is required when
% you want to access nodes in different pictures.
\begin{tikzpicture}[overlay]
        \path[->,red,thick] (s-anode) edge [bend left] (anode);
        \path[->,blue,thick] (s-cathode) edge [bend left] (cathode);
        \path[->,red,thick] (s-bridge) edge [out=0, in=-90] (bridge);
\end{tikzpicture}

% overlay grid
\begin{tikzpicture}[overlay,shift=(origin)]
        % show origin
        \fill (0,0) circle (2pt);
        % show grid
        \draw[step=0.5] (0,0) grid ++(4cm, 3cm);
\end{tikzpicture}

\end{frame}

\end{document}

enter image description here

| improve this answer | |
  • 1
    Nice! An even simpler way might be to add [execute at end picture={\draw (current bounding box.south west) grid [step=0.5cm] (current bounding box.north east);}] to the options of the first tikzpicture, which will draw the grid at the end of the first picture. – Jake Nov 13 '13 at 13:24
  • @Jake: In my opinion this is a valid answer on its own. IMHO I prefer your solution over mine. – crixstox Nov 13 '13 at 13:59

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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