Как удерживать позицию фигуры с рисунком в 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()
'''