Rstudio rmarkdown:単一のPDFでの縦向きと横向きの両方のレイアウト


84

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

どんな助けでも大歓迎です。

回答:


78

したがって、latex環境のコンテンツは解析され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
これは複雑なツールチェーンであり、3つまたは4つの異なるプレーヤー(knitr-rmarkdown / pandoc-latex)があり、文書化されたもの以外では、どこで問題が発生するかを理解するのは非常に困難です。最良の方法は、それらを独立して実行するようです。最初に編み、結果を見て.md(ここでは問題ありません)、次にmd-> tex変換(ここで問題が発生しました)を確認します。エラーメッセージはすでに次のステップ(ラテックス)であるため、役に立ちませんでした。
baptiste 2014

このソリューションでは、PDFで、「#Introduction」によって作成された構造化ヘッダーの代わりに、#が記号として表示されます
JMarcelino 2015

3
私はばかげたラテックスの質問を推測します:それが読まれるように、header.texファイルはどこにある(またはすべきである)のですか?私はRMarkdownを多用していますが、比較的新しく、すべての連動パッケージとそれらがどのように連携しているかをまだ理解していません。
マイクウィリアムソン

header.texファイルが同じディレクトリにする必要があります
バティスト

50

以前のソリューションに基づいて構築された次のソリューションは、補助header.texファイルを必要としません。すべての内容が.Rmdファイルに含まれています。LaTeXコマンドは、代わりheader-includesにYAMLヘッダーのブロックで定義されます。詳細については、こちらをご覧ください

また、lscapeLaTeXパッケージを使用すると、ページのコンテンツは回転しますが、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
私のシステムでは、このソリューションは機能していません。Mac OS_10.13.4でR-3.4.4、rmarkdown_1.9、knitr_1.20を実行しています。何が問題なのか疑問に思いますか?
Geochem B 2018

@GeochemB必要なLaTeXパッケージは正しくインストールされていますか?私は最近TinyTeXで成功し、それをお勧めします。
メガトロン

インストール時にエラーは発生しませんでしたが、再確認して報告します。頭を上げてくれてありがとう、私はそれについて考えていなかったし、PDF / Latexに出力するのは初めてです。
Geochem B 2018

@Megatron Tex Liveユーティリティを使用して、Oberdiekパッケージをインストールして更新しました。したがって、要件はありますが、それでもサイコロはありません。上記のコードをコピーして貼り付けても、向きは変わりません。
Geochem B 2018

1
@GeochemBこのコードを使用しても同じ問題が発生しました。SumatraPDFv3.1.1とAdobeAcrobatDCおよびProでドキュメントを表示してみました。ドキュメントから、OberdeikはMikTexに含まれています。私の理解によると、MikTexをインストールしていれば、pdflscapeは良いはずです。誰かが解決策を得たかどうか興味があります。
パトリック

22

最も一般的なケース。

3つの条件があります。

  1. ポートレートモードのすべて。
  2. ランドスケープモードのすべて。
  3. ポートレートモードとランドスケープモードの混合。

それぞれの条件に絞り込みましょう。

  1. 1つ目は、以下のコードで始まるマークダウンドキュメントがあるとします。これは、rmdファイルを作成するときのRstudioのデフォルト設定です。あなたがそれを編むとき。間違いなくポートレートモードであると自動的に想定されます。

    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. 両方を混在させたい場合は、YAMLに.texファイルを追加する必要があります。上記のリンクを参照してください。ここから.texコードをダウンロードできます。http://goo.gl/cptOqgまたは、コードをコピーしてheader.texとして保存するだけです。次に、作業を楽にするために、この.texファイルをニットするrmdファイルと一緒に配置します。次の2つのことを行ったことを確認してください。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の問題は、マクロの代わりに環境を使用すると奇妙になることだと思います。そのため、ご提案のとおり、ヘッダー(pdflandscapeパッケージ)に\ newcommand {\ blandscape} {\ begin {landscape}}と\ newcommand {\ elandscape} {\ end {landscape}}を含めましたが、完全に機能しました。ありがとう!
gvegayon 2015

1
私は上記の手順に従いました(ブログを見ると役に立ちました)、それはうまくいきました。ありがとう!
スコットワーランド2015年

4

baptisteが述べたように、RコマンドをLaTeX環境内に含めると、pandocはそれらを解析せず、生成されたLaTeXにそのまま配置します。これがエラーの原因です。baptisteの素晴らしく単純な修正に加えて、xtableRパッケージを使用することもできます。これにより、R出力からよりセクシーな外観のLaTeXテーブルを作成できます。次の例を機能させるに\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)
```

2番目の表は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(...。次に、出力をキャプチャし、それをtableandrotateboxコマンドで「手動で」囲み、すべてを文字列R出力に変換して、pandocに表示されないようにする必要があります。それらをLaTeX環境として。純粋なrmarkdownソリューションの場合...頑張ってください!


これは私のために働いたこのページの唯一のものです。ありがとう、レナート!
スチュアート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.