Yes, fortunately it is! And it is even quite easy.
For this Christian has created a library called external which has made it into the pgf, tikz package and is accessible through that package.
Whatever, is shown below also works for pgfplots as they are typeset within a tikzpicture environment.
What it does is, the following:
Check if an image file corresponding to the currently reached image is found:
- If image found, check whether the image code has changed, and if not, the image is inserted.
- If image is not found or the image code has been changed, do the following:
- Invoke a new shell with your executable and create the image
- Insert image in the document
This means that for each image that is externalized you will get a new compiled document with additional log, aux files etc. I.e. many new files.
It is important to note that since pgf uses hashes of the image code to check whether a recreation of the image is necessary, it cannot determine whether any code in the pre-ample or elsewhere not in the image changes the resulting image. So sometimes it may be advantageous to delete the images.
A most basic example is to do the following:
\documentclass{article}
\usepackage{tikz}
% Load the library
\usetikzlibrary{external}
% Enable the library !!!>>> MUST be in the preamble <<<!!!!
\tikzexternalize
\begin{document}
\begin{tikzpicture}
\draw (0,0) -- (1,1);
\end{tikzpicture}
\end{document}
This will create one additional file called <document name>-figure0.pdf. Which is the first occurring tikzpicture environment in the file.
This has the disadvantage of reading the 0 file even if you rearrange your tikzpicture environments.
For this there is a command: \tikzsetnextfilename which can be used to force the following tikzpicture environment to a specific file name.
This ensures the correct loading order of the figures. I would encourage you to do this on each picture.
So for instance this:
% Default the externalized name to 'hello'
\tikzsetnextfilename{hello}
\begin{tikzpicture}
\draw[red] (0,0) -- (-1,1);
\end{tikzpicture}
Lastly the external library creates the images within the current directory. This means that you will have a very cluttered folder of many files (as it compiles many sub documents only containing the images).
A common way to bypass this is to add a prefixed directory to the output of the files. You do that by the command: \tikzsetexternalprefix which is pretty self-explanatory. So a small example:
\documentclass{article}
\usepackage{tikz}
% Load the library
\usetikzlibrary{external}
% Enable the library
\tikzexternalize
\begin{document}
% Default all images in the subfolder `figs/`
\tikzsetexternalprefix{figs/}
\begin{tikzpicture}
\draw[green] (0,0) -- (1,-1);
\end{tikzpicture}
% You are allowed to rearrange your images to separate folders
\tikzsetexternalprefix{figs/red/}
\begin{tikzpicture}
\draw[red] (0,0) -- (1,-1);
\end{tikzpicture}
\tikzsetexternalprefix{figs/blue/}
\begin{tikzpicture}
\draw[blue] (0,0) -- (1,-1);
\end{tikzpicture}
\end{document}
This can thus also be used to sort your images by chapter, or style, or etc..... :)
Otherwise search for the external tag here, or see the manual.
In general it is always a good custom to delete all your externalised images before doing your final compilation. This ensures that images are updated etc.