Подтвердить что ты не робот

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

Любая помощь очень ценится.

4b9b3361

Ответ 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... удачи!