Rstudio rmarkdown: портретная и альбомная ориентация в одном PDF-файле

86

Интересно, как использовать rmarkdownдля создания PDF-файла, который имеет как портретную, так и альбомную ориентацию в одном документе. Если есть чистый rmarkdownвариант, это будет даже лучше, чем использование латекса.

Вот небольшой воспроизводимый пример. Во-первых, рендеринг этого .Rmdв RStudio (нажмите кнопку Knit 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

Буду признателен за любую оказанную помощь.

user3712688
источник

Ответы:

81

Итак, 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)
```
батист
источник
Спасибо за ваше исследование и ответ (+1). «Не анализирует содержимое латексных сред» не совсем понятно из раздела «Включает» . Но я полагаю, что latexвиновато и мое невежество.
Хенрик
4
это сложная инструментальная цепочка с тремя / четырьмя разными игроками (knitr-rmarkdown / pandoc-latex), и я считаю, что вне документированного материала довольно сложно понять, где что-то ломается. Лучше всего запускать их независимо: сначала вязать, смотреть на результат .md(хорошо, здесь), затем преобразование md-> tex (вот где все пошло не так). Сообщение об ошибке не помогло, потому что это уже следующий шаг (латекс).
Батист
В этом решении в PDF-файле вместо структурированного заголовка, созданного с помощью «#Introduction», # отображается как символ
JMarcelino
3
Думаю, тупой латексный вопрос: где находится (или должен) файл header.tex, чтобы его читали? Я активно использую RMarkdown, но я относительно новичок и еще не понял всех взаимосвязанных пакетов и того, как они работают вместе.
Майк Уильямсон,
файл header.tex должен находиться в том же каталоге
baptiste
50

Основываясь на предыдущих решениях, следующее решение не требует вспомогательного 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)
```
Мегатрон
источник
1
В моей системе это решение не работает. Я использую R-3.4.4, rmarkdown_1.9, knitr_1.20 на Mac OS_10.13.4. Хотите знать, в чем может быть проблема?
Geochem B
@GeochemB Правильно ли установлены необходимые пакеты LaTeX? Недавно я добился успеха с TinyTeX и рекомендую его.
Megatron
Когда я их установил, они не выдали ошибку, но я дважды проверю и сообщу. Спасибо за внимание, я не думал об этом и новичок в выводе в PDF / Latex.
Geochem B
@Megatron Я прошел через утилиту Tex Live, установил и обновил пакет Oberdiek. Итак, требования есть, но кубиков по-прежнему нет. Даже когда я копирую / вставляю приведенный выше код, ориентация не меняется.
Geochem B
1
@GeochemB У меня такая же проблема с этим кодом. Я пробовал просматривать документ в SumatraPDF v3.1.1 и Adobe Acrobat DC и Pro. Из документации Обердейк включен в MikTex. Насколько я понимаю, если у меня установлен MikTex, pdflscape должен быть хорошим. Любопытно, есть ли у кого-нибудь решение.
Патрик
22

Для самых распространенных случаев.

Есть 3 условия.

  1. Все в портретном режиме.
  2. Все в ландшафтном режиме.
  3. Смесь портретного и ландшафтного режимов.

Давайте сузимся до каждого условия.

  1. Первый, скажем, у нас есть документ с уценкой, начинающийся с кода ниже. И это настройка по умолчанию в Rstudio при создании файла rmd. Когда вы его вяжете. Без сомнения, он автоматически предположит, что это портретный режим.

    title: "Landscape and Portrait"
        author: "Jung-Han Wang"
        date: "Thursday, March 19, 2015"
        output: pdf_document
    
  2. Если вы хотите связать PDF-файл с альбомным режимом, единственное, что вам нужно добавить, это классификация: пейзаж

        title: "Landscape and Portrait"
        author: "Jung-Han Wang"
        date: "Thursday, March 19, 2015"
        output: pdf_document
        classoption: landscape
    
  3. Если вы хотите смешать и то, и другое, вам нужно будет добавить файл .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
    

Это резюме после того, как я поиграл с этим вопросом и в основном получил ответ от батиста.

Я включил несколько снимков и примеров в свой блогер мой блоггер .

Надеюсь это поможет. Удачи.

Юнг-Хан Ван
источник
2
Ваш подход работает. Чтобы упростить понимание, я думаю, что проблема с pandoc заключается в том, что он становится странным, когда вы используете среду вместо макросов. Вот почему я включил, как вы предложили, \ newcommand {\ blandscape} {\ begin {landscape}} и \ newcommand {\ elandscape} {\ end {landscape}} в свой заголовок (пакет pdflandscape), и это сработало отлично. Благодаря!
gvegayon,
1
Я выполнил эти шаги выше (просмотр блога помог), и это отлично сработало. Благодаря!
Скотт Уорланд
4

Как упоминал батист, если вы заключите команды R в среду LaTeX, pandoc не будет их анализировать и поместит их в созданном LaTeX в том виде, в котором они есть: вот что вызывает ошибку. Помимо красивого и простого исправления baptiste, вы можете использовать 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 ... удачи!

Renato Vitolo
источник
Это единственный на этой странице, который работал у меня. Спасибо, Ренато!
Стюарт