Rstudio rmarkdown: cả bố cục dọc và ngang trong một tệp PDF duy nhất


84

Tôi tự hỏi làm thế nào để sử dụng rmarkdownđể tạo một pdf có cả bố cục dọc và ngang trong cùng một tài liệu. Nếu có một rmarkdownlựa chọn nguyên chất thậm chí còn tốt hơn sử dụng mủ cao su.

Đây là một ví dụ nhỏ, có thể tái tạo. Đầu tiên, kết xuất điều này .Rmdtrong RStudio (nhấn nút Knit PDF ) kết quả là một pdf với tất cả các trang ở bố cục ngang:

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

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

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

Sau đó, cố gắng tạo một tài liệu kết hợp giữa bố cục dọc và ngang. Thiết lập cơ bản trong YAMLđược thực hiện theo phần 'Bao gồm' tại đây . Các in_headertập tin 'header.tex' chỉ chứa \usepackage{lscape}, một gói đề xuất để knitrbố trí cảnh quan ở đây . Các .textập tin trong thư mục tương tự như các .Rmdtập tin.

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

Tuy nhiên, mã này dẫn đến lỗi:

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

Bất kỳ sự giúp đỡ nào cũng được đánh giá cao.

Câu trả lời:


78

Vì vậy, pandoc không phân tích cú pháp nội dung của môi trường latex, nhưng bạn có thể đánh lừa nó bằng cách xác định lại các lệnh trong header.textệp của mình :

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

Do đó, ở đây \begin{landscape}được định nghĩa lại thành \blandscape, và \end{landscape}đến \elandscape. Sử dụng các lệnh mới được xác định trong .Rmdtệp dường như hoạt động:

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

Cảm ơn vì nghiên cứu và câu trả lời của bạn (+1). Phần 'không phân tích cú pháp nội dung của môi trường cao su' không hoàn toàn rõ ràng trong phần Bao gồm . Nhưng tôi cho rằng latexsự thiếu hiểu biết của mình cũng đáng trách.
Henrik

4
đó là một chuỗi công cụ phức tạp, với ba / bốn người chơi khác nhau (đan xen-rmarkdown / pandoc-latex) và tôi thấy rằng bên ngoài những thứ được ghi lại, thật khó để tìm ra nơi mọi thứ vỡ ra. Cách tốt nhất dường như chạy chúng một cách độc lập: đầu tiên đan, nhìn vào kết quả .md(tốt, ở đây), sau đó là chuyển đổi md-> tex (đó là nơi nó đã sai). Thông báo lỗi không hữu ích vì nó đã là bước tiếp theo (cao su).
baptiste

Với giải pháp này, trong pdf, thay vì tiêu đề có cấu trúc được tạo ra bởi "#Introduction", các # xuất hiện như một biểu tượng
JMarcelino

3
Tôi đoán câu hỏi ngu ngốc: tệp header.tex sống ở đâu, để nó được đọc? Tôi sử dụng RMarkdown rất nhiều, nhưng tương đối mới và chưa hiểu tất cả các gói lồng vào nhau và cách chúng hoạt động cùng nhau.
Mike Williamson

tệp header.tex phải nằm trong cùng một thư mục
baptiste

50

Xây dựng dựa trên các giải pháp trước, giải pháp sau không yêu cầu header.textệp phụ trợ . Tất cả nội dung được chứa trong .Rmdtệp. Thay vào đó, các lệnh LaTeX được định nghĩa trong một header-includeskhối trong tiêu đề YAML. Thông tin thêm có thể được tìm thấy ở đây .

Ngoài ra, tôi nhận thấy rằng việc sử dụng lscapegói LaTeX sẽ xoay nội dung của một trang, nhưng không xoay chính trang PDF. Điều này được giải quyết bằng cách sử dụng pdflscapegói.

---
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
Trên hệ thống của tôi, giải pháp này không hoạt động. Tôi đang chạy R-3.4.4, rmarkdown_1.9, đantr_1.20 trên Mac OS_10.13.4. Tự hỏi những gì có thể là vấn đề?
Geochem B

@GeochemB Các gói LaTeX cần thiết có được cài đặt chính xác không? Gần đây tôi đã thành công với TinyTeX và giới thiệu nó.
Megatron

Họ không báo lỗi khi tôi cài đặt chúng, nhưng tôi sẽ kiểm tra lại và báo cáo. Cảm ơn các bạn đã chú ý, tôi chưa nghĩ đến điều đó và chưa quen với việc xuất ra PDF / Latex.
Geochem B

@Megatron Tôi đã xem qua tiện ích Tex Live và đã cài đặt và cập nhật gói Oberdiek. Vì vậy, các yêu cầu là có, nhưng vẫn không có xúc xắc. Ngay cả khi tôi sao chép / dán mã ở trên, không có thay đổi đối với hướng.
Geochem B

1
@GeochemB Tôi gặp vấn đề tương tự khi sử dụng mã này. Tôi đã thử xem tài liệu trong SumatraPDF v3.1.1 và Adobe Acrobat DC và Pro. Từ tài liệu Oberdeik được bao gồm trong MikTex. Theo sự hiểu biết của tôi nếu tôi đã cài đặt MikTex thì pdflscape sẽ tốt. Tò mò nếu có ai có giải pháp.
Patrick

22

Đối với các trường hợp phổ biến nhất.

Có 3 điều kiện.

  1. Mọi thứ ở chế độ dọc.
  2. Mọi thứ ở chế độ ngang.
  3. Sự kết hợp của chế độ chân dung và phong cảnh.

Hãy thu hẹp từng điều kiện.

  1. Đầu tiên, giả sử chúng ta có một tài liệu đánh dấu bắt đầu bằng đoạn mã bên dưới. Và đây là cài đặt mặc định trong Rstudio khi bạn tạo tệp rmd. Khi bạn đan nó. Nó sẽ tự động cho rằng đó là chế độ chân dung mà không nghi ngờ gì.

    title: "Landscape and Portrait"
        author: "Jung-Han Wang"
        date: "Thursday, March 19, 2015"
        output: pdf_document
    
  2. Khi bạn muốn đan tệp PDF sang chế độ ngang, điều duy nhất bạn cần thêm là phân loại: phong cảnh

        title: "Landscape and Portrait"
        author: "Jung-Han Wang"
        date: "Thursday, March 19, 2015"
        output: pdf_document
        classoption: landscape
    
  3. Nếu bạn muốn kết hợp cả hai, bạn sẽ cần thêm tệp .tex trong YAML. Bằng cách tham khảo liên kết tôi đã đề cập ở trên. Bạn có thể tải mã .tex tại đây. http://goo.gl/cptOqg Hoặc chỉ cần sao chép mã và lưu dưới dạng header.tex Sau đó, để làm cho cuộc sống dễ dàng hơn, hãy đặt tệp .tex này cùng với tệp rmd sẽ được dệt kim. Đảm bảo rằng bạn đã làm hai điều này: Sao chép tệp tex và di chuyển nó cùng với tệp rmd. Thay đổi phần đầu của rmd thành:

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

Đây là bản tóm tắt sau khi tôi chơi với vấn đề này và hầu như được hưởng lợi từ câu trả lời của baptiste.

Tôi đã bao gồm một số ảnh chụp nhanh và ví dụ trong blogger của tôi blogger của tôi .

Hi vọng điêu nay co ich. Chúc may mắn.


2
Cách tiếp cận của bạn hoạt động. Để dễ hiểu hơn, tôi nghĩ rằng vấn đề với pandoc là nó trở nên kỳ lạ khi bạn sử dụng môi trường thay vì macro. Đó là lý do tại sao tôi đưa vào, như bạn đã đề xuất, \ newcommand {\ blandscape} {\ begin {Landscape}} và \ newcommand {\ elandscape} {\ end {Landscape}} trong tiêu đề của mình (gói pdflandscape) và nó hoạt động hoàn hảo. Cảm ơn!
gvegayon

1
Tôi đã làm theo các bước này ở trên (xem blog đã giúp), và nó hoạt động tốt. Cảm ơn!
Scott Worland

4

Như baptiste đã đề cập, nếu bạn đặt các lệnh R trong môi trường LaTeX, pandoc sẽ không phân tích cú pháp chúng và sẽ đặt chúng như cũ vào LaTeX đã tạo: đây là nguyên nhân gây ra lỗi. Ngoài bản sửa lỗi đơn giản và đẹp mắt của baptiste, bạn có thể sử dụng xtablegói R, cung cấp khả năng tạo các bảng LaTeX trông quyến rũ hơn từ đầu ra R. Để ví dụ sau hoạt động, bạn cần thêm \usepackage{rotating}vào header.textệp:

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

Bảng thứ hai sẽ được in trong sidewaystablemôi trường, thay vì thông thường table: do đó nó sẽ được in ở chế độ ngang, trong một trang riêng biệt. Lưu ý rằng các bảng và số liệu được lscapegói hoặc trong sidewaysmôi trường đặt ở chế độ ngang sẽ luôn được đặt trong một trang riêng biệt, hãy xem trang 91 của tài liệu rất quan trọng này:

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

Vì tôi thấy điều này hơi khó chịu, tôi đã cố gắng tìm cách để giữ cả bảng dọc và bảng ngang trong cùng một trang (lãng phí cả buổi chiều của tôi trong quá trình này):

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

Đối với bảng ngang, tôi đã sử dụng \rotateboxđề xuất được cung cấp ở đây:

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

Để điều này hoạt động, tôi phải chỉ tạo tabularphần của bảng với print(xtable(...phần đó, sau đó tôi phải nắm bắt đầu ra và "thủ công" bao quanh nó bằng các lệnh tablerotatebox, chuyển đổi mọi thứ thành đầu ra chuỗi R để pandoc không nhìn thấy chúng dưới dạng môi trường LaTeX. Để có một giải pháp rmarkdown thuần túy ... chúc may mắn!


Đây là trang duy nhất trên trang này phù hợp với tôi. Cảm ơn, Renato!
Stuart
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.