32

Suppose I have a complex figure made ​​with TikZ. How do I use it several times without having to repeat all the commands?

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}

\begin{document}

Base figure

\begin{tikzpicture}
  \draw[blue] circle (2);
  \foreach \i in {0,10,...,350}
    \draw[blue] (\i:1.9) -- (\i:2.1);
\end{tikzpicture}

Using base figure.

\begin{tikzpicture}
  \draw[blue] circle (2);
  \foreach \i in {0,10,...,350}
    \draw[blue] (\i:1.9) -- (\i:2.1);
  \foreach \i in {0,10,...,350}
    \node at (\i:2.7) {\tiny $\i^\circ$};
\end{tikzpicture}

Using base figure.

\begin{tikzpicture}
  \draw[blue] circle (2);
  \foreach \i in {0,10,...,350}
    \draw[blue] (\i:1.9) -- (\i:2.1);
  \foreach \i in {0,10,...,350}
    \draw (0,0) -- (\i:2);
\end{tikzpicture}

\end{document}

enter image description here

Regis Santos
  • 14,463
  • Somewhat related? http://tex.stackexchange.com/questions/5338/latex-equivalent-of-context-buffers – Torbjørn T. Nov 15 '11 at 07:33
  • 5
    A very complex picture could also be saved in a box register and placed using a node into the other pictures. This has a speed benefit. If you use my storebox package the picture is also only stored once in the output PDF. – Martin Scharrer Nov 15 '11 at 08:02

4 Answers4

32

You could define a macro that constructs the base figure, and supply an optional argument that is added to the base figure. That allows you to use it as-is, but optionally add stuff. This abstraction promotes consistency and allows for easy changes in the future:

enter image description here

\documentclass{article}
\usepackage{tikz}% http://ctan.org/pkg/pgf
\begin{document}

\newcommand{\myfigure}[1][]{%
\begin{tikzpicture}
  \draw[blue] circle (2);
  \foreach \i in {0,10,...,350}
    \draw[blue] (\i:1.9) -- (\i:2.1);
  #1
\end{tikzpicture}%
}

Base figure

\myfigure

Using base figure.

\myfigure[%
  \foreach \i in {0,10,...,350}
  \node at (\i:2.7) {\tiny $\i^\circ$};%
]

Using base figure.

\myfigure[%
  \foreach \i in {0,10,...,350}
  \draw (0,0) -- (\i:2);%
]
\end{document}

You use \myfigure for your base figure and \myfigure[<addition>] for adding <addition> to the base figure.

Werner
  • 603,163
24

Enclose it in a newcommand

\newcommand{\bluecircle}{
    \draw[blue] circle (2);
      \foreach \i in {0,10,...,350}
    \draw[blue] (\i:1.9) -- (\i:2.1);
}

Now your final figure would be:

\begin{tikzpicture}
    \bluecircle
    \foreach \i in {0,10,...,350}
    \draw (0,0) -- (\i:2);
\end{tikzpicture}
qubyte
  • 17,299
2

Using xsavebox:

\documentclass{article}

\usepackage{tikz}
\usepackage{xsavebox}

\begin{document}

\begin{xlrbox}{base figure}
  \begin{tikzpicture}
    \draw[blue] circle (2);
    \foreach \i in {0,10,...,350}
      \draw[blue] (\i:1.9) -- (\i:2.1);
  \end{tikzpicture}
\end{xlrbox}%
%
Base figure:

\xusebox{base figure}

Using base figure:

\begin{tikzpicture}
  \node {\xusebox{base figure}};
  \foreach \i in {0,10,...,350}
    \node at (\i:2.7) {\tiny $\i^\circ$};%
\end{tikzpicture}%

Using base figure again:

\begin{tikzpicture}
  \node {\xusebox{base figure}};
  \foreach \i in {0,10,...,350}
    \draw (0,0) -- (\i:2);
\end{tikzpicture}

\end{document}
AlexG
  • 54,894
1

A variation of the answers using the package scontents.

\documentclass{article}
\usepackage{tikz}
\usepackage[store-env=figbase]{scontents}
\begin{document}
Store Base figure

\begin{scontents}
  \draw[blue] circle (2);
  \foreach \i in {0,10,...,350}
    \draw[blue] (\i:1.9) -- (\i:2.1);
\end{scontents}
% print fig base
\begin{tikzpicture}
\getstored[1]{figbase}
\end{tikzpicture}

Using base figure.

\begin{tikzpicture}
  \getstored[1]{figbase}
  \foreach \i in {0,10,...,350}
    \node at (\i:2.7) {\tiny $\i^\circ$};
\end{tikzpicture}

Using base figure.

\begin{tikzpicture}
  \getstored[1]{figbase}
  \foreach \i in {0,10,...,350}
    \draw (0,0) -- (\i:2);
\end{tikzpicture}
\end{document}