Rstudio rmarkdown: Hoch- und Querformat in einem einzigen PDF

84

Ich frage mich, wie man es benutzt rmarkdown ein PDF generiert, das sowohl Hoch- als auch Querformat im selben Dokument enthält. Wenn es eine reine rmarkdownOption gibt, wäre das sogar noch besser als die Verwendung von Latex.

Hier ist ein kleines, reproduzierbares Beispiel. Rendern Sie dies zunächst .Rmdin RStudio (drücken Sie PDF stricken Schaltfläche stricken), erhalten Sie ein PDF mit allen Seiten im Querformat:

---
title: "All pages landscape"
output: pdf_document
classoption: landscape
---

```{r}
summary(cars)
```

\newpage
```{r}
summary(cars)
```

Dann ein Versuch, ein Dokument zu erstellen, das Hoch- und Querformat mischt. Die Grundeinstellung in YAMLerfolgt gemäß dem Abschnitt "Enthält" hier . Die in_headerDatei ‚header.tex‘ enthält nur \usepackage{lscape}ein Paket für vorgeschlagene knitrLandschaft Layout hier . Die .texDatei befindet sich im selben Verzeichnis wie die .RmdDatei.

---
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)
```

Dieser Code führt jedoch zu einem Fehler:

# ! 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

Jede Hilfe wird sehr geschätzt.

user3712688
quelle

Antworten:

78

Analysiert pandoc also nicht den Inhalt von Latexumgebungen, aber Sie können ihn täuschen, indem Sie die Befehle in Ihrer header.texDatei neu definieren:

\usepackage{lscape}
\newcommand{\blandscape}{\begin{landscape}}
\newcommand{\elandscape}{\end{landscape}}

Somit wird hier \begin{landscape}neu definiert zu \blandscapeund \end{landscape}zu \elandscape. Die Verwendung dieser neu definierten Befehle in der .RmdDatei scheint zu funktionieren:

---
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)
```
Baptiste
quelle
Vielen Dank für Ihre Recherche und Antwort (+1). Das Wort "Analysiert den Inhalt von Latexumgebungen nicht" ist im Abschnitt " Einschlüsse" nicht ganz klar . Aber ich gehe davon aus, dass auch meine latexUnwissenheit schuld ist.
Henrik
4
Es ist eine komplexe Toolchain mit drei / vier verschiedenen Spielern (Knitr-Rmarkdown / Pandoc-Latex), und ich finde, dass es außerhalb der dokumentierten Dinge ziemlich schwierig ist, herauszufinden, wo die Dinge kaputt gehen. Der beste Weg scheint, sie unabhängig voneinander auszuführen: Zuerst stricken, das Ergebnis betrachten .md(gut, hier), dann die md-> tex-Konvertierung (dort ist es schief gelaufen). Die Fehlermeldung war nicht hilfreich, da dies bereits der nächste Schritt ist (Latex).
Taufe
Bei dieser Lösung wird im PDF anstelle des durch "#Introduction" erstellten strukturierten Headers das # als Symbol
angezeigt
3
Ich denke, dumme Latexfrage: Wo lebt (oder sollte) die Datei header.tex, damit sie gelesen wird? Ich benutze RMarkdown stark, bin aber relativ neu und habe noch nicht alle ineinandergreifenden Pakete und deren Zusammenarbeit verstanden.
Mike Williamson
Die Datei header.tex sollte sich im selben Verzeichnis befinden
baptiste
50

Aufbauend auf früheren Lösungen erfordert die folgende Lösung keine header.texZusatzdatei. Alle Inhalte sind in der .RmdDatei enthalten. Die LaTeX-Befehle werden stattdessen in einem header-includesBlock im YAML-Header definiert. Weitere Infos finden Sie hier .

Außerdem habe ich festgestellt, dass bei Verwendung des lscapeLaTeX-Pakets der Inhalt einer Seite gedreht wird, nicht jedoch die PDF-Seite selbst. Dies wird mithilfe des pdflscapePakets behoben .

---
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)
```
Megatron
quelle
1
Auf meinem System funktioniert diese Lösung nicht. Ich verwende R-3.4.4, rmarkdown_1.9, knitr_1.20 unter einem Mac OS_10.13.4. Sie fragen sich, was das Problem sein könnte?
Geochem B
@GeochemB Sind die erforderlichen LaTeX-Pakete korrekt installiert? Ich hatte kürzlich Erfolg mit TinyTeX und empfehle es.
Megatron
Sie haben bei der Installation keinen Fehler ausgegeben, aber ich werde es noch einmal überprüfen und melden. Vielen Dank für das Heads-up, daran hatte ich nicht gedacht und bin neu in der Ausgabe in PDF / Latex.
Geochem B
@ Megatron Ich habe das Tex Live-Dienstprogramm durchgesehen und das Oberdiek-Paket installiert und aktualisiert. Die Anforderungen sind also da, aber immer noch keine Würfel. Selbst wenn ich den obigen Code kopiere / einfüge, ändert sich nichts an der Ausrichtung.
Geochem B
1
@ GeochemB Ich habe das gleiche Problem mit diesem Code. Ich habe versucht, das Dokument in SumatraPDF v3.1.1 und Adobe Acrobat DC und Pro anzuzeigen. Aus der Dokumentation ist Oberdeik in MikTex enthalten. Nach meinem Verständnis sollte pdflscape gut sein, wenn ich MikTex installiert habe. Neugierig, ob jemand eine Lösung hat.
Patrick
22

Für die häufigsten Fälle.

Es gibt 3 Bedingungen.

  1. Alles im Hochformat.
  2. Alles im Querformat.
  3. Mischung aus Hoch- und Querformat.

Lassen Sie uns auf die einzelnen Bedingungen eingrenzen.

  1. Das erste, sagen wir, wir haben ein Abschriften-Dokument, das mit dem folgenden Code beginnt. Dies ist die Standardeinstellung in Rstudio, wenn Sie eine rmd-Datei erstellen. Wenn du es strickst. Es wird ohne Zweifel automatisch davon ausgegangen, dass es sich um einen Porträtmodus handelt.

    title: "Landscape and Portrait"
        author: "Jung-Han Wang"
        date: "Thursday, March 19, 2015"
        output: pdf_document
    
  2. Wenn Sie die PDF-Datei in den Querformatmodus versetzen möchten, müssen Sie nur die Klassenoption Querformat hinzufügen

        title: "Landscape and Portrait"
        author: "Jung-Han Wang"
        date: "Thursday, March 19, 2015"
        output: pdf_document
        classoption: landscape
    
  3. Wenn Sie eine Mischung aus beiden wünschen, müssen Sie eine .tex-Datei in YAML hinzufügen. Indem ich auf den oben erwähnten Link verweise. Sie können den .tex-Code hier herunterladen. http://goo.gl/cptOqg Oder kopieren Sie einfach den Code und speichern Sie ihn als header.tex. Um das Leben zu vereinfachen, legen Sie diese .tex-Datei zusammen mit der zu strickenden rmd-Datei ab. Stellen Sie sicher, dass Sie diese beiden Dinge getan haben: Kopieren Sie die tex-Datei und verschieben Sie sie zusammen mit der rmd-Datei. Ändern Sie den Anfang von rmd in:

     title: "Landscape and Portrait"
        author: "Jung-Han Wang"
        date: "Thursday, March 19, 2015"
        output:
          pdf_document:
            includes:
              in_header: header.tex
    

Dies ist die Zusammenfassung, nachdem ich mit dieser Ausgabe gespielt habe und hauptsächlich von der Antwort von Baptiste profitiert habe.

Ich habe einige Schnappschüsse und Beispiele in meinen Blogger, meinen Blogger, aufgenommen .

Hoffe das hilft. Viel Glück.

Jung-Han Wang
quelle
2
Ihr Ansatz funktioniert. Um das Verständnis zu erleichtern, denke ich, dass das Problem mit Pandoc darin besteht, dass es seltsam wird, wenn Sie Umgebungen anstelle von Makros verwenden. Aus diesem Grund habe ich, wie Sie vorgeschlagen haben, \ newcommand {\ blandscape} {\ begin {Landschaft}} und \ newcommand {\ elandscape} {\ end {Landschaft}} in meinen Header (das pdflandscape-Paket) aufgenommen, und es hat perfekt funktioniert. Vielen Dank!
Gvegayon
1
Ich habe diese Schritte oben befolgt (das Betrachten des Blogs hat geholfen), und es hat großartig funktioniert. Vielen Dank!
Scott Worland
4

Wie bereits erwähnt, analysiert pandoc R-Befehle in einer LaTeX-Umgebung nicht und platziert sie unverändert im generierten LaTeX. Dies verursacht den Fehler. Über die nette und einfache Lösung von baptiste hinaus können Sie das xtableR-Paket verwenden, das die Möglichkeit bietet, aus der R-Ausgabe sexy aussehende LaTeX-Tabellen zu erstellen. Damit das folgende Beispiel funktioniert, müssen Sie \usepackage{rotating}die header.texDatei hinzufügen :

---
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)
```

Die zweite Tabelle wird in der sidewaystableUmgebung und nicht wie üblich tablegedruckt. Daher wird sie im Querformat auf einer separaten Seite gedruckt. Beachten Sie, dass Tabellen und Abbildungen, die vom lscapePaket oder in der sidewaysUmgebung im Querformat platziert werden, immer auf einer separaten Seite platziert werden (siehe Seite 91 dieses sehr wichtigen Dokuments):

http://www.tex.ac.uk/tex-archive/info/epslatex/english/epslatex.pdf

Da ich das etwas nervig finde, habe ich es geschafft, sowohl Hoch- als auch Querformat-Tabellen auf derselben Seite zu halten (wobei ich meinen ganzen Nachmittag damit verschwendete):

---
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}"))
```

Für den Landschaftstisch habe ich das verwendet \rotatebox Vorschlag verwendet:

http://en.wikibooks.org/wiki/LaTeX/Rotations

Damit dies funktioniert, muss ich nur die Erzeugung tabularTeil der Tabelle mit dem print(xtable(...Teil, dann muss ich die Ausgabe und „manuell“ erfassen umgeben sie mit den tableund rotateboxBefehle, alles in einen String R Ausgang konvertieren , so dass pandoc nicht sieht sie als LaTeX-Umgebungen. Für eine reine Rmarkdown-Lösung ... viel Glück!

Renato Vitolo
quelle
Dies ist die einzige auf dieser Seite, die für mich funktioniert hat. Danke, Renato!
Stuart