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

Хочу разместить подпись над фигурой, используя трикотаж в 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, с подписью над графиком.


person Serena    schedule 09.07.2014    source источник


Ответы (3)


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

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

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

person kohske    schedule 15.07.2014
comment
Большое спасибо за ответ! Но я попытался использовать именно ваш пример и получил сообщение об ошибке от Texmaker, в котором говорилось, что объект knit_hooks не найден. Я действительно новичок в Texmaker, Knitr и Hook. У вас есть идеи, почему у меня это не сработало? - person Serena; 15.07.2014
comment
@Serena вставляет library(knitr) в начало первого фрагмента. - person kohske; 16.07.2014
comment
Отличное решение, спасибо! Но 2 недостатка: 1) нужно добавить самого себя \ begin {figure}, 2) нужно поменять fig.cap на новый figT. Первая проблема решается легко (просто добавьте: \\ begin {figure} \ n, \\ end {figure} \ n в f). Вторая проблема кажется очень сложной для решения, поскольку использование fig.cap запускает автоматическую вставку \ caption под рисунком, и кажется, что единственный способ избежать этого - полностью переписать hook_plot_tex ... - person Matifou; 12.11.2014

Я предпочитаю использовать пакеты 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.

person Michael Harper    schedule 04.04.2018

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