web-dev-qa-db-ja.com

Rstudio rmarkdown:1つのPDF

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の基本的なセットアップは、 'Includes'セクション here に従って行われます。 in_headerファイル「header.tex」には、knitrランドスケープレイアウトに推奨されるパッケージである\usepackage{lscape}のみが含まれています here.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

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

65
user3712688

したがって、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)
```
64
baptiste

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

また、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)
```
32
Megatron

最も一般的なケース。

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
    

これは、私がこの問題で遊んだ後の要約であり、主にバプテストの答えから恩恵を受けました。

ブロガーにスナップショットとサンプルをいくつか含めました my blogger

お役に立てれば。幸運を。

17
Jung-Han Wang

Baptisteが述べたように、RコマンドをLaTeX環境内で囲むと、pandocはそれらを解析せず、生成されたLaTeXにそのまま配置します。これがエラーの原因です。 baptisteのナイスでシンプルな修正に加えて、xtable Rパッケージを使用できます。これにより、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(...部分で生成するだけで、出力をキャプチャし、tableで「手動で」囲む必要があります。 rotateboxコマンド。pandocがそれらをLaTeX環境として認識しないように、すべてを文字列R出力に変換します。純粋なrmarkdownソリューションの場合...幸運を!

2
renato vitolo