使用knitr(LaTeX/PDF)在图表上方添加标题

9

我希望在Texmaker中使用knitr将标题放在图片上方。我知道这个问题已经被问过了,我明白到目前为止建议的解决方法是使用:

\begin{figure} 
\caption{This is a caption above the figure} 
<<a-plot, echo=FALSE>>= 
plot(1) 
@ 
\end{figure} 

但是这样我无法展示代码(因为echo=FALSE)。 如果我选择echo=TRUE,我得到的是标题、代码和图形,这也不是我想要的。 我想展示的是R的代码以及使用该R代码绘制的图形,并将标题放在图形上方

4个回答

13

我的偏好是使用LaTeX包来实现这样的自定义:在TeX StackExchange上有一个庞大的社区,他们已经开发出了类似这种问题的加载方法。

可以使用floatrow包将标题重新定位到图像上方。这在很大程度上基于此前的答案

使用R Markdown,由于这是最常用的工作流程,因此可以通过在YAML中包含header-includes参数来加载该包,如下所示:

---
output: pdf_document
header-includes:
   - \usepackage{floatrow}
   - \floatsetup[figure]{capposition=top}
---


```{r fig.cap="cap, cap, and cap"}
plot(1)
```

输出结果按照所需顺序排列,先显示代码,然后是标题和图表。

图片描述

如若不需要显示代码,可以在代码块头部添加echo=FALSE选项。


3
尝试使用钩子(hook):
<<include=FALSE>>=
f <- function(x, options) {
  paste("\\end{kframe}\n", 
        "\\caption{", options$capT, "}\n", 
        hook_plot_tex(x, options), 
        "\n\\begin{kframe}", sep = "")
}
knit_hooks$set(plot = f)
@

\begin{figure} 
<<a-plot, echo=TRUE, capT="cap, cap, and cap">>= 
plot(1) 
@ 
\end{figure} 

enter image description here


非常感谢您的回答!但是我尝试使用您的示例,却在Texmaker中收到了一个错误消息,说“找不到对象'knit_hooks'”。我对texmaker、knitr和hook都很陌生。您有没有想法为什么这对我不起作用? - Serena
@Serena 在第一个代码块的开头插入 library(knitr) - kohske
很棒的解决方案,谢谢!但是有两个缺点:1)需要自己添加\begin{figure},2)需要将fig.cap更改为新的figT。第一个问题很容易解决(只需在f中添加:\begin{figure}\n",“\end{figure}\n")。第二个问题似乎很难解决,因为使用fig.cap会触发在图像下方自动插入\caption,而避免这种情况的唯一方法似乎是完全重写hook_plot_tex... - Matifou

1
这是kohske答案的稍微修改版本,包括\begin{figure}并添加\label。但请注意,它包含5行,而原始代码包含超过150行,因此应仅在非常有限的情况下使用。
f <- function(x, options) {
  lab <- paste0(options$fig.lp, options$label)
  paste("\\end{kframe}\n", 
        "\\begin{figure}\n\\caption{", options$capT, "}\\label{", lab,"}\n", 
        hook_plot_tex(x, options), 
        "\\end{figure}\n\n\\begin{kframe}", sep = "")
}
knit_hooks$set(plot = f)

0
在它下面添加一个新的块,名称相同,用于打印代码。
     \documentclass{article}
     \begin{document}
     \begin{figure} 
     \caption{This is a caption above the figure} 
     <<a-plot, echo=FALSE>>= 
     plot(1) 
     @ 
     \end{figure} 
     <<a-plot,echo=TRUE>>=
     @

\end{document}


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