Подпись над рисунком с использованием knitr (LaTeX/PDF)

Я хотел бы разместить подпись над рисунком, используя knitr в texmaker. Я знаю, что этот вопрос уже задавался, и я понимаю, что предлагаемое решение заключается в использовании:

\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 ответа

Решение

Попробуйте использовать крючок:

<<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} 

введите описание изображения здесь

Я предпочитаю использовать пакеты LaTeX для настройки, подобной этой: на Tex StackExchange есть большое сообщество, которое разработало методы для загрузки подобных проблем.

Floatrow Пакет может быть использован для изменения заголовка над рисунком. Это в значительной степени основано на этом предыдущем ответе.

Используя R Markdown, так как это наиболее часто используемый рабочий процесс в наши дни, пакет можно загрузить, включив header-includes аргумент в рамках YAML, а именно:

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


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

Вывод имеет желаемый порядок, сначала отображается код, затем подпись и график.

Если код не требуется, echo=FALSE опция может быть добавлена ​​в заголовок чанка.

Это немного измененная версия ответа Кохске, которая включает в себя \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)

Добавьте под ним новый блок с тем же именем, чтобы напечатать код.

           \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>>=
     @

\конец{документ}

Другие вопросы по тегам