How do I make a reference to a figure in markdown using pandoc?

I'm currently writing a document in markdown and I'd like to make a reference to an image from my text.

this is my text, I want a reference to my image1 [here]. blablabla

![image1](img/image1.png)

I want to do that reference because after converting my markdown to pdf, images get placed in one or two pages after and the document doesn't make any sense.

UPDATE:

I've tried Ryan's answer in that post and I can't make it working. Apparently the code :

[image]: image.png "Image Title" 
![Alt text][image] 
A reference to the [image](#image).

should produce:

\begin{figure}[htbp] 
\centering 
\includegraphics[keepaspectratio,width=\textwidth,height=0.75\textheight]{i mage.png} 
\caption{Alt text} 
\label{image} 
\end{figure} 

A reference to the image (\autoref{image}).

instead, I obtain:

\begin{figure}[htbp]
\centering
\includegraphics{image.png}
\caption{Alt text}
\end{figure}

A reference to the \href{\#image}{image}.

I've noticed two problems :

  • \label{image} doesn't appear : no reference is created.
  • (\autoref{image}) becomes \href{\#image}{image} : no cross reference is detected.

And then, when I convert that to pdf it obviously doesn't link to the image. There's a link, but it doesn't link to anything.

Any help would be much appreciated!!


Solution 1:

In pandoc you can even do:

![This is the caption\label{mylabel}](/url/of/image.png)
See figure \ref{mylabel}.

Solution 2:

You can use the pandoc-fignos filter for figure numbering and referencing. It works with any output format -- not just LaTeX.

Add a label to the image's attributes like this:

 ![Caption.](image.png) {#fig:description}

... and then reference the figure like this:

 @fig:description

Information on how to install and apply the pandoc-fignos filter is given on its Web page. There is also the pandoc-eqnos filter for doing the same kind of thing with equations.

Solution 3:

I've had a chat with Ryan Gray after reading his answer in a similar post. Actually his solution of using :

[image]: image.png "Image Title" 
![Alt text][image] 
A reference to the [image](#image).

is only adapted when using multimarkdown.

When it comes to pandoc, the only solution to make cross references is using directly latex keywords:

[image]: image.png "Image Title"
![Alt text \label{mylabel}][image]
See figure \ref{mylabel}.

Solution 4:

Pandoc supports referencing sections (via section identifiers prefixed by #).

Comments on this open issue describe how the following workaround leverages section identifiers for generating image references in LaTeX and HTML:

<div id="fig:lalune">
![A voyage to the moon\label{fig:lalune}](lalune.jpg)

</div>

[The voyage to the moon](#fig:lalune).

The empty line before </div> is required.

Solution 5:

With pandoc-crossref you can cross reference figures with the following syntax:

![Caption](file.ext){#fig:label}

Then reference the figure in the text similar to the citation syntax [@fig:label] and compile with --filter pandoc-crossref (needs to come before --filter pandoc-citeproc if you're using that also).

You can control the styling with e.g. \usepackage[font=small,labelfont=bf]{caption} in header-includes.


A neat related trick if you use \listoffigures in latex, is this lua-filter, which allows you to set a short title instead of having the entire figure legend showing up in your list of figures:

![Caption](file.ext){#fig:label short-caption='my short caption'}

then compile with --lua-filter short-captions.lua.