如何在 Pandoc 中使用 Markdown 引用一个图表?

130

我正在使用Markdown编写文档,希望在文本中引用一张图片。

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

![image1](img/image1.png)

我希望能够引用,因为将我的Markdown转换为PDF后,图像会在一两页后放置,文档就没有意义了。
更新:
我尝试了Ryan的答案那篇文章中,但我无法使它工作。 显然代码:
[image]: image.png "Image Title" 
![Alt text][image] 
A reference to the [image](#image).

应该产生:
\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}).

相反,我得到:
\begin{figure}[htbp]
\centering
\includegraphics{image.png}
\caption{Alt text}
\end{figure}

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

我注意到两个问题:
  • \label{image} 没有出现:没有创建参考。
  • (\autoref{image}) 变成了 \href{\#image}{image}:没有检测到交叉引用。
然后,当我将其转换为pdf时,显然它不会链接到图像。有一个链接,但它没有链接到任何内容。
非常感谢您的帮助!!

1
你尝试过 http://groups.google.com/group/pandoc-discuss/msg/4a42442657a96414 中提到的方法吗? - N.N.
我测试过了,它没有生成自动引用。很奇怪... - Romain Piel
也许你应该编辑你的问题,包括你尝试了什么,得到了什么以及你想要什么(这样更容易帮助你)。 - N.N.
7个回答

119

在 pandoc 中,你甚至可以这样做:

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

48
只有在将Markdown转换为TeX时才有帮助,并不适用于同时从同一份Markdown源文件创建HTML的情况。 - Jakob
13
有两种可用的过滤器可以使图表引用适用于所有输出格式:pandoc-fignospandoc-crossref - joelostblom
不幸的是,这不是一个非常灵活的方式。不能通过这种方式指定图像的宽度或高度。是否可以用这种方式包含PDF?如果不行,那也会有一个缺点,因为在输出PDF的情况下这是首选。 - Zelphir Kaltstahl
2
可以使用以下方式设置宽度和高度:![这是标题\标签{mylabel}](/图片的URL){width=30px height=20px} - Sam Walpole

31
你可以使用pandoc-fignos筛选器来进行图片编号和引用。它适用于任何输出格式--而不仅仅是LaTeX。
像这样将标签添加到图像属性中:
 ![Caption.](image.png) {#fig:description}

...然后像这样引用该图:

 @fig:description

有关如何安装和应用pandoc-fignos过滤器的信息可以在其网页上找到。还有一个pandoc-eqnos过滤器,可以用于处理方程式。


我想用类似的方法处理有序列表中的元素(参考链接:http://stackoverflow.com/questions/29086880/how-to-place-labels-correctly-and-use-cross-reference-in-latex-to-be-able-to-con)。 - DanielTuzes
这也适用于pandoc-crossref。请参见@joelostblom的答案。 - gijswijs

22

我在阅读了他的答案后,与Ryan Gray 进行了一次对话。事实上,他的解决方案是使用:

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

只有在使用多重标记语言时,它才被适配。

当涉及到 Pandoc 时,唯一的交叉引用解决方案是直接使用 LaTeX 关键字:

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

5
但正如Jakob在被接受的答案中所说:“这只有在你将Markdown转换为TeX时才有帮助,但如果你还想从同一份Markdown源代码创建HTML,则无济于事。” - DanielTuzes
对于多重标记语言,是否有一种方法可以通过自动计算的图形编号引用该图形?我想象一下,类似于[](#image),然后多重标记语言将用数字替换空白文本(就像它为脚注所做的那样)。 - Alec Jacobson

6
Pandoc支持引用章节(通过以#为前缀的章节标识符)。
关于这个问题的评论描述了如何利用章节标识符来生成LaTeX和HTML中的图片引用的以下解决方法。
<div id="fig:lalune">
![A voyage to the moon\label{fig:lalune}](lalune.jpg)

</div>

[The voyage to the moon](#fig:lalune).
标签前需要有空行才能正确显示。

4
一个合适的解决方案即对 Pandoc Markdown 语法进行扩展,以允许为图片设置标识符,现在终于有进展了。敬请关注 :) - Susanne Oberhauser

6

使用pandoc-crossref,您可以使用以下语法交叉引用图像:

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

在文本中引用图像,使用引用语法[@fig:label],然后使用--filter pandoc-crossref编译(如果您还使用--filter pandoc-citeproc,则该项需要在前面)。

您可以使用例如\usepackage[font=small,labelfont=bf]{caption}控制样式,在header-includes中添加。


如果您在LaTeX中使用了\listoffigures,一个很棒的相关技巧是使用此lua-filter,它允许您设置短标题,而不是在图例中显示整个图像标题。

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

然后使用--lua-filter short-captions.lua编译。


应该将“--filter pandoc-citeproc”替换为“--filter citeproc”。pandoc-citeproc已被citeproc所取代,现在是pandoc发行版的一个重要组成部分。 - gijswijs

2
假设你希望在 Pandoc 结束时得到 PDF 输出:
我发现插入图片并更改其属性的最佳解决方案是:
\begin{figure}[H]
\includegraphics[width=0.25\textwidth, height=!]{images/path.png}
\centering
\caption{mycaption}
\end{figure}

在我的template.latex中,我有:

\usepackage{wrapfig}
\usepackage{float}

其他解决方案无法指定图像的宽度或高度,至少在标准的Markdown中是这样。然而,在书籍或论文等场景下,指定图表的尺寸通常是必不可少的,除非您想在使用图像之前配置输出大小。在这种情况下,您必须处理用于创建图像的工具的不同设置。

我建议在Matplotlib的情况下,将其导出为PDF,然后使用我发布的代码。这将提供最佳的图像质量和最高的灵活性,以配置图像在输出PDF中的外观,而无需担心其他问题。


所有这些LaTeX语法都直接放入你的Markdown文件中吗? - SpinUp __ A Davis
@spinup 是的。Pandoc 可以处理你的 markdown 文件中嵌入的 LaTeX 代码。另一个建议:从 Matplotlib 导出时,导出为 PDF 文件。这样做可以防止 Pandoc / LaTeX 引擎降低图像质量,同时还能让你拥有可缩放的图像,而不是在缩放 PDF 文件时出现像素化的情况。 - Zelphir Kaltstahl

2

这里有很多很棒的回答。我想提醒您一个细节:

必须有标题! 就像这样:

Lore ipsum @fig:label

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

以下内容不会起作用

Lore ipsum @fig:label

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接