8

I am trying to make a reference to a plot inside a figure's caption while using the externalize library.

The issue of plot reference using externalization has already been raised in this question. I decided notto externalize the references images and defined the following command:

\newcommand{\plotref}1{\tikzexternaldisable\ref{#1}\tikzexternalenable}

Then, the following code with the reference outside the caption works :

\documentclass{article}

\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize[prefix=tikz/,shell escape=-enable-write18]

\newcommand{\plotref}[1]{\tikzexternaldisable\ref{#1}\tikzexternalenable}

\begin{document}

\begin{figure}
  \centering
  \tikzset{external/remake next}
  \tikzsetnextfilename{figname}
\begin{tikzpicture}[baseline]

  \pgfplotstableread{
    1 4   
    2 4.2 
    3 3.1 
    4 2.5 
  }\table

\begin{axis}[width=5cm,height=5cm]

\addplot table[x index=0,y index=1]{\table};\label{LAB}

\end{axis}
\end{tikzpicture}
  \caption{You must defeat Sheng Long to stand a chance.}
  \label{dummy}
\end{figure}

Xyzzy ! \plotref{LAB} happens.

\end{document}

I have seen in this question that legend in caption are normally possible. However, the following code with the reference inside the caption does not work :

\documentclass{article}

\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize[prefix=tikz/,shell escape=-enable-write18]

\newcommand{\plotref}[1]{\tikzexternaldisable\ref{#1}\tikzexternalenable}

\begin{document}

\begin{figure}
  \centering
  \tikzset{external/remake next}
  \tikzsetnextfilename{figname}
\begin{tikzpicture}[baseline]

  \pgfplotstableread{
    1 4   
    2 4.2 
    3 3.1 
    4 2.5 
  }\table

\begin{axis}[width=5cm,height=5cm]

\addplot table[x index=0,y index=1]{\table};\label{LAB}

\end{axis}
\end{tikzpicture}
  \caption{Xyzzy ! \plotref{LAB} happens.}
  \label{dummy}
\end{figure}

You must defeat Sheng Long to stand a chance.

\end{document}

It raises the following error message

! Incomplete \iffalse; all text was ignored after line 35.

              \fi </p>

that I fail to interpret.

An alternative to not externalizing the small reference images has been proposed in this question but I did not understand how to implement it and don't know if this would solve my problem.

Do you know how to make plot references in caption and use externalization ?


Side note: it sometimes simpler and more effective to do things manually. See this question for similar results, not automatic but somehow more straightforward.

M. Toya
  • 3,227
  • Does it help to write \protect\plotref{LAB} in your caption? I suppose that it is an expansion issue; your \plotref command is "fragile" in terms of LaTeX, and "fragile" commands need to be \protected inside of captions, section titles etc. – Christian Feuersänger Aug 01 '12 at 20:32
  • It does help. Now something happens and I stand a chance ! Can you copy and paste your comment into an anwer so that I can accept it? – M. Toya Aug 02 '12 at 09:52

1 Answers1

7

You should write \protect\plotref{LAB} in your caption. I suppose that it is an expansion issue; your \plotref command is "fragile" in terms of LaTeX, and "fragile" commands need to be \protected inside of captions, section titles etc.