Rstudio rmarkdown: как портретный, так и альбомный макет в одном PDF файле
Интересно, как использовать rmarkdown
для создания pdf файла, который имеет как портретный, так и альбомный макет в том же документе. Если есть чистая опция rmarkdown
, которая будет даже лучше, чем использование латекса.
Вот небольшой, воспроизводимый пример. Во-первых, рендеринг этого .Rmd
в RStudio (нажмите кнопку Вязать PDF) приводит к созданию PDF со всеми страницами в альбомной макете:
---
title: "All pages landscape"
output: pdf_document
classoption: landscape
---
```{r}
summary(cars)
```
\newpage
```{r}
summary(cars)
```
Затем попытка создать документ, который смешивает портретную и альбомную макет. Базовая установка в YAML
выполняется в соответствии с разделом "Включает" здесь. Файл in_header
'header.tex' содержит только \usepackage{lscape}
, пакет, предложенный для knitr
ландшафтного макета здесь. Файл .tex
находится в том же каталоге, что и файл .Rmd
.
---
title: "Mixing portrait and landscape"
output:
pdf_document:
includes:
in_header: header.tex
---
Portrait:
```{r}
summary(cars)
```
\newpage
\begin{landscape}
Landscape:
```{r}
summary(cars)
```
\end{landscape}
\newpage
More portrait:
```{r}
summary(cars)
```
Однако этот код приводит к ошибке:
# ! You can't use `macro parameter character #' in horizontal mode.
# l.116 #
# pandoc.exe: Error producing PDF from TeX source
# Error: pandoc document conversion failed with error 43
Любая помощь очень ценится.
Ответы
Ответ 1
Итак, pandoc
не анализирует содержимое латексных сред, но вы можете обмануть его переопределением команд в вашем файле header.tex
:
\usepackage{lscape}
\newcommand{\blandscape}{\begin{landscape}}
\newcommand{\elandscape}{\end{landscape}}
Таким образом, здесь \begin{landscape}
переопределяется на \blandscape
и \end{landscape}
до \elandscape
. Использование этой новой команды в файле .Rmd
, похоже, работает:
---
title: "Mixing portrait and landscape"
output:
pdf_document:
includes:
in_header: header.tex
---
Portrait
```{r}
summary(cars)
```
\newpage
\blandscape
Landscape
```{r}
summary(cars)
```
\elandscape
\newpage
More portrait
```{r}
summary(cars)
```
Ответ 2
Для наиболее распространенных случаев.
Есть 3 условия.
- Все в портретном режиме.
- Все в ландшафтном режиме.
- Смесь портретных и ландшафтных режимов.
Укорачивается до каждого условия.
-
Первый, скажем, у нас есть документ с уценкой, начинающийся с кода ниже. И это значение по умолчанию в Rstudio при создании файла rmd. Когда ты вязаешь его. Он будет автоматически считать свой портретный режим без сомнения.
title: "Landscape and Portrait"
author: "Jung-Han Wang"
date: "Thursday, March 19, 2015"
output: pdf_document
-
Когда вы хотите вязать PDF файл в альбомный режим, вам нужно добавить только класс: пейзаж
title: "Landscape and Portrait"
author: "Jung-Han Wang"
date: "Thursday, March 19, 2015"
output: pdf_document
classoption: landscape
-
Если вам нужна смесь обоих, вам нужно будет добавить файл .tex в YAML. Перечислив ссылку, упомянутую выше. Вы можете скачать здесь код .tex. http://goo.gl/cptOqg Или просто скопируйте код и сохраните его как header.tex. Затем, чтобы облегчить жизнь, поместите этот .tex файл вместе с rmd файлом, который нужно вязать, Убедитесь, что вы выполнили следующие две задачи:
Скопируйте файл tex и переместите его вместе с файлом rmd.
Измените начало rmd следующим образом:
title: "Landscape and Portrait"
author: "Jung-Han Wang"
date: "Thursday, March 19, 2015"
output:
pdf_document:
includes:
in_header: header.tex
Это резюме после того, как я сыграл с этой проблемой и в основном получал выгоду от ответа баптиста.
Я включил некоторые снимки и примеры в свой блоггер мой блоггер.
Надеюсь, это поможет.
Удачи.
Ответ 3
Основываясь на предыдущих решениях, следующее решение не требует вспомогательного файла header.tex
. Все содержимое содержится в файле .Rmd
. Вместо этого команды LaTeX определяются в блоке header-includes
в заголовке YAML. Более подробную информацию можно найти здесь.
Кроме того, я заметил, что использование пакета lscape
LaTeX приводит к вращению содержимого страницы, но не самой страницы PDF. Это разрешается с помощью пакета pdflscape
.
---
title: "Mixing portrait and landscape WITHOUT a header.tex file"
header-includes:
- \usepackage{pdflscape}
- \newcommand{\blandscape}{\begin{landscape}}
- \newcommand{\elandscape}{\end{landscape}}
output: pdf_document
---
Portrait
```{r}
summary(cars)
```
\newpage
\blandscape
Landscape
```{r}
summary(cars)
```
\elandscape
\newpage
More portrait
```{r}
summary(cars)
```
Ответ 4
Как упоминалось в baptiste, если вы вставляете команды R в среде LaTeX, pandoc не будет анализировать их и поместить их в том виде, в каком они были в сгенерированном LaTeX: это и вызывает ошибку. Помимо баптиста с хорошим и простым исправлением, вы можете использовать пакет xtable
R, который предлагает возможность создания более сексуальных таблиц LaTeX из вывода R. Для следующего примера вам нужно добавить \usepackage{rotating}
в файл header.tex
:
---
title: "Mixing portrait and landscape"
output:
pdf_document:
keep_tex: true
includes:
in_header: header.tex
---
```{r, echo=FALSE}
library(xtable)
```
Portrait
```{r, results='asis', echo=FALSE}
print(xtable(summary(cars), caption="Landscape table"), comment=FALSE)
```
Landscape:
```{r, results='asis', echo=FALSE}
print(xtable(summary(cars), caption="Landscape table"),
floating.environment="sidewaystable", comment=FALSE)
```
Вторая таблица будет напечатана в среде sidewaystable
, а не в обычном table
: поэтому она будет напечатана в альбомном режиме на отдельной странице. Обратите внимание, что таблицы и рисунки, помещенные в ландшафтном режиме пакетом lscape
или в среде sideways
, всегда будут размещаться на отдельной странице, см. Стр. 91 этого очень важного документа:
http://www.tex.ac.uk/tex-archive/info/epslatex/english/epslatex.pdf
Так как я нахожу это немного раздражающим, мне удалось найти способ сохранить как портретные, так и альбомные таблицы на одной странице (теряя весь день в процессе):
---
title: "Mixing portrait and landscape"
output:
pdf_document:
keep_tex: true
includes:
in_header: header.tex
---
```{r, echo=FALSE}
library(xtable)
```
Portrait:
```{r, results='asis', echo=FALSE}
print(xtable(summary(cars), caption="Portrait table."), comment=FALSE)
```
Landscape:
```{r, results='asis', echo=FALSE}
cat(paste0(
"\\begin{table}[ht]\\centering\\rotatebox{90}{",
paste0(capture.output(
print(xtable(summary(cars)), floating=FALSE, comment=FALSE)),
collapse="\n"),
"}\\caption{Landscape table.}\\end{table}"))
```
Для таблицы ландшафта я использовал предложение \rotatebox
, приведенное здесь:
http://en.wikibooks.org/wiki/LaTeX/Rotations
Для этого мне нужно только создать часть tabular
таблицы с частью print(xtable(...
, тогда я должен захватить вывод и "вручную" окружать его с помощью table
и rotatebox
команды, преобразуя все в вывод строки R, чтобы pandoc не рассматривал их как среды LaTeX. Для чистого решения rmarkdown... удачи!