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


84

Цікаво, як використовувати 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

Будь-яка допомога дуже вдячна.

Відповіді:


78

Отже, 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 замість структурованого заголовка, створеного "# Вступ", # відображається як символ
JMarcelino

3
Я думаю, німе латексне запитання: де живе (чи повинен) файл header.tex, щоб його можна було прочитати? Я активно використовую RMarkdown, але порівняно новий, і ще не зрозумів усіх блокуючих пакетів та того, як вони працюють разом.
Mike Williamson

файл 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 і рекомендую його.
Мегатрон

Вони не видали помилки, коли я їх встановив, але я ще раз перевірю та повідомлю. Дякую за увагу, я не думав про це, і я новачок у виведенні в PDF / Latex.
Geochem B

@Megatron Я пройшов утиліту Tex Live і встановив та оновив пакет Oberdiek. Тож вимоги є, але кубиків все одно немає. Навіть коли я копіюю / вставляю код вище, орієнтація не змінюється.
Geochem B

1
@GeochemB Я отримав ту ж проблему, використовуючи цей код. Я спробував переглянути документ у SumatraPDF v3.1.1 та Adobe Acrobat DC та Pro. З документації Oberdeik включений у 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 у альбомному режимі, єдине, що вам потрібно додати, це classoption: landscape

        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-файлом, який потрібно в'язати. Переконайтеся, що ви зробили ці дві речі: Скопіюйте текстовий файл і перемістіть його разом із 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: саме це спричиняє помилку. Окрім приємного та простого виправлення баптиста, ви можете використовувати 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 ... удачі!


Це єдиний на цій сторінці, який працював у мене. Дякую, Ренато!
Стюарт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.