Как удерживать позицию фигуры с рисунком в pdf-выходе ножа?

Я использую knitr (1.9.5 и 1.9.17) и rmarkdown (0.5.3.1) и хотел бы удерживать позицию фигуры в pdf-выходе. Сгенерированный файл PDF отлично работает, когда используется опция chunk fig.pos="H".

Однако положение фигуры не удерживается, когда fig_caption: yes задано в yaml.

Как мне исправить эту проблему? Спасибо за любые предложения.

EDIT:

После изучения среды с плавающей точкой в ​​латексе. Я добавляю пакет float в заголовок.

\usepackage{float}

Но сгенерированный файл tex всегда использует htbp в среде figure в отношении любых опций fig.pos. После ручной смены htbp на H позиции всех фигур будут удерживаться.

Это мой пример файла rmd:

---
title: "Untitled"
output:
  pdf_document:
    fig_caption: yes
    includes:
        in_header: mystyles.sty
---

# Section 1


Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot.

Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot.

Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot.

Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot.


```{r fig1, echo=FALSE, fig.height=8.5, fig.pos="H"}
plot(cars)
```

# Section 2

More test

```{r fig2, echo=FALSE, fig.height=8.5, fig.pos="H"}
plot(cars)
```

# Section 3

```{r fig3, echo=FALSE, fig.height=8.5, fig.pos="H"}
plot(cars)
```

More test

Ответ 1

Как сказал Yihui в своем ответе (Позиция фигуры в уценке при конвертации в PDF с knitr и pandoc), мы не можем ожидать слишком многого о форматировании из mardown. Чтобы обойти эту проблему, просто напишите некоторые R-скрипты, чтобы заменить htbp на H.

По сравнению с knit из пакета knitr я обнаружил, что render из rmarkdown лучше экспортировать файл tex. Просто не забудьте добавить keep_tex: yes в заголовок yaml вашего файла rmarkdown.

library(rmarkdown)
render('filepath.Rmd')
x <- readLines('filepath.tex')
pos <- grep('begin\\{figure\\}\\[htbp\\]', x)
x[pos] <- gsub('htbp', 'H', x[pos])
writeLines(x, 'filepath.tex')
tools::texi2pdf('filepath.tex', clean = TRUE)  # gives foo.pdf

file.remove('filepath.tex')

Ответ 2

Как отметил Эндрю, этот fig.pos не работает в блоках, но он работает, если он включен в глобальные параметры:

'''{r global_options, include=FALSE}
knitr::opts_chunk$set(fig.pos = 'H')
'''

РЕДАКТИРОВАТЬ: вышеупомянутое, по-видимому, используется для работы и нуждается в \usepackage{float} в преамбуле:

header-includes:
 \usepackage{float}

Смотрите также здесь.

Ответ 3

Обновить посмотрите на это лучшее решение здесь. (резюме проблемы ниже все еще хорошо, но следуйте ссылке на лучшее решение).

Чтобы обобщить некоторые тесты в RStudio

Аргумент chitr chrin fig.pos = "H" работает до тех пор, пока fig_caption: yes не находится в заголовке yaml.

Каждая фигура в сгенерированном .tex выглядит так:

\subsection{my_section}\label{my_section}

\includegraphics{path_to_fig.pdf}

Но если fig_caption: yes находится в заголовке yaml, тогда .tex выглядит так:

\subsection{my_section}\label{my_section}

\begin{figure}[htbp]
\centering
\includegraphics{path_to_fig.pdf}
\caption{}
\end{figure}

fig.pos = "H" не используется, вместо этого "htbp".

Обходной путь для этого с помощью RStudio:

положить

fig_caption: yes
keep_tex: yes

в ямле, а также

header-includes: \usepackage{float}

затем выполните поиск и замените [htbp] на [H] в сгенерированном файле .tex

затем откройте файл .tex в RStudio и используйте кнопку "Скомпилировать PDF".


Пример .Rmd

---
title: "Testing fig placement with captions"
author: "Andrew Dolman"
date: "1 September 2015"
output: 
  pdf_document: 
    fig_caption: yes
    keep_tex: yes
header-includes: \usepackage{float}
---

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see <http://rmarkdown.rstudio.com>.

When you click the **Knit** button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

```{r}
summary(cars)
```

You can also embed plots, for example:

```{r, echo=FALSE, fig.pos="H"}
plot(cars)
```

Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot.

```{r, echo=FALSE, fig.pos="H"}
plot(cars)
```

Ответ 4

Для меня добавление пакета float, а затем \floatplacement{figure}{H} в YAML решило такую проблему как:

---
title: "test"
date: "'r Sys.Date()'"
output: 
  pdf_document :
    keep_tex: true
    number_sections: true
header-includes:
 \usepackage{booktabs}
 \usepackage{longtable}
 \usepackage{array}
 \usepackage{multirow}
 \usepackage[table]{xcolor}
 \usepackage{wrapfig}
 \usepackage{float}
 \floatplacement{figure}{H}
---

Ответ 5

Хотя ответ, предоставленный @Bangyou, работает, он усложняет вязание.

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

\makeatletter\renewcommand*{\[email protected]}{H}\makeatother

Как описано здесьздесь для части \makeat...).

Таким образом вы можете просто использовать кнопку вязания в RStudio или rmarkdown:: render и сделать с ней.

Проблема заключается в том, что все цифры заполняются принудительно с помощью H, и вы не сможете настроить его для размещения.

Ответ 6

Вариант, который работал у меня:

В начале .tex в начале: \usepackage{float}.

В начале Rmd: knitr::opts_chunk$set(fig.pos = 'H'). H в верхнем регистре).

И в каждом фрагменте с изображением: fig.cap="lorem blabla" и out.extra='' (значение параметра = пустая строка).

Нет необходимо определить: fig_caption: yes и keep_tex: yes в yaml.

Эти параметры заставляют изображение сохранять свою позицию либо для include_graphics, либо для графиков, созданных кодом R.

Я использовал их в среде bookdown, создавая pdf и html, как ожидалось:)

Ответ 7

В случае, если кто-то еще сталкивался с этим потоком, мне пришлось использовать маленький регистр 'h', и он работал в версии R 3.5.3 и латексе 2018.

'''{r, echo=FALSE, fig.pos="h"}
plot(cars)
'''

Ответ 8

Код из положения на рисунке в уценке при преобразовании в PDF с knitr и pandoc помогает мне, помогает кому-то еще находить это полезным.

---
title: "Example"
author: "Martin"
output: pdf_document
---

'''{r}
knitr::knit_hooks$set(plot = function(x, options)  {
  knitr::hook_plot_tex(x, options)
})
'''


'''{r myplot, echo=FALSE, results='hide', fig.cap='Test', fig.pos='h'}
library(ggplot2)
ggplot(mtcars, aes(mpg, drat)) + geom_point()
'''