디지털 글쓰기

R 마크다운 → PDF

R마크다운 파일을 PDF파일로 변환해보자.

Author
Affiliation

1 YAML 설정

1.1 \(\LaTeX\) 엔진

R마크다운에서 PDF 파일 문서를 생성하기 위해서는 \(\LaTeX\) 엔진이 필요한데 유니코드를 지원하는 xeLaTeX을 기본 엔진으로 설정한다. 이를 위해서 ko.TeX를 설치하고 RStudio에서 RSTUDIO_PDFLATEX 환경변수 설정을 통해 \(\LaTeX\) 엔진을 연결시킨다. usethis::edit_r_environ() 명령어를 통해 RSTUDIO_PDFLATEX="C:\texlive\2020\bin\win32"와 같이 ko.TeX이 설치된 경로를 지정하면 된다.

Code
Sys.getenv("RSTUDIO_PDFLATEX")
#> [1] ""

1.2 \(\LaTeX\) 글꼴

\(\LaTeX\)을 통해 PDF 파일을 조판하기 위해서는 한글글꼴이 필요하다. YAML 헤더에 mainfont: NanumGothic을 지정하여 한글 글꼴을 명시해야 ??? 혹은 와 같은 한글깨짐 문제를 해결할 수 있다.

---
layout: page
title: "LaTeX 과 PDF "
subtitle: "PDF 문서 기본"
author: "이광춘"
date: "2023-05-22"
output:
  pdf_document: 
    latex_engine: xelatex     <-- `LaTeX` 엔진 지정
    toc: true
    toc_depth: 2  
    number_sections: true
    fig_width: 3
    fig_height: 2
    fig_caption: true
    df_print: kable
    highlight: tango
mainfont: NanumGothic        <-- 한글 글꼴 설정
---

1.3 R lorem ipsum

R 마크다운으로도 다른 \(\LaTeX\)과 마찬가지로 로렘입섬(Lorem Ipsum)을 작성할 수 있는 팩키지가 다수 존재한다.

shinipsum은 특히 샤이니 앱을 개발할 때 빠르게 기능을 구현하는데 도움을 준다. lorem::ipsum() 기능도 좋지만, shinipsum::random_*() 함수를 사용하게 되면 텍스트는 물론이고 표, 모형, ggplot, 이미지 등을 빠르게 문서에 Shiny 앱에 넣을 수가 있다.

```{r}
library(tidyverse)
cat(readr::read_lines('lipsum/rmarkdown/basics.Rmd'), sep = '\n')
```

2 PDF 예제

R마크다운 문서파일에 output:pdf_document: 출력결과를 하고 PDF 파일 기본설정을 통해 작성한 PDF 문서를 살펴보자.

Code
knitr::include_graphics("lipsum/rmarkdown/basics.pdf")

2.1 \(\LaTeX\) 구조

\(\LaTeX\) 문서구조는 Preamble 전문과 본문(Body)으로 구성된다. R마크다운에 들어가는 내용은 주로 본문으로 구성되기 때문에 문서 앞과 뒤를 넣을 수 있는 부분을 \(\LaTeX\)의 전문(Preamble) 기능으로 대체할 경우 품질 좋은 데이터 과학 문서를 제작할 수 있다.

Code
\documentclass{article}
% 전문 preamble

\begin{document}
% 본문 body
\end{document}

2.2 R마크다운 PDF 구조

preamble을 조금더 직관적으로 표현하면 \(\LaTeX\)의 팩키지를 가져오는 import.tex 파일로 지정하고, 첫장을 cover.tex PDF 파일로 준비한다. 그리고 나머지 부분은 일반적인 문서 작성하듯이 하면 된다.

Code
report/
|-- rmarkdown.Rmd
|-- biblatex.bib
|-- sections/
  |-- import.tex
  |-- cover.tex
|-- images/
  |-- ggplot.png

2.3 R마크다운 문서

in_header에 가져올 팩키지를 지정하고, 겉표지 PDF는 cover.tex에서 설정한다.

---
layout: page
output:
  bookdown::pdf_document2: 
    latex_engine: xelatex
    toc: true
    toc_depth: 2  
    number_sections: true
    fig_width: 3
    fig_height: 2
    fig_caption: true
    df_print: kable
    highlight: tango
    includes:
      in_header: sections/import.tex   <-- 팩키지 설정
      before_body: sections/cover.tex  <-- 겉표지 PDF
mainfont: NanumGothic
---

3 문서구조 상세

3.1 import.tex

pdfpages를 사용하기 위해 import.tex 파일에 가져올 팩키지를 명시하고 HTML 파일을 PDF 파일에서 클릭하면 바로 연결할 수 있도록 \renewcommand 매크로도 함께 설정한다.

Code
cat(readr::read_lines('lipsum/rmarkdown/sections/import.tex'), sep = '\n')
#> \usepackage{kotex}
#> 
#> % PDF 겉장 -------------------------------
#> \usepackage{pdfpages}
#> 
#> % HTML 링크
#> \renewcommand{\href}[2]{#2\footnote{\url{#1}}}

3.2 cover.tex

cover.tex 파일에는 canva 웹사이트에서 제작한 겉표지 PDF 파일을 R마크다운 문서에 넣을 수 있도록 설정한다.

Code
cat(readr::read_lines('lipsum/rmarkdown/sections/cover.tex'), sep = '\n')
#> 
#> \includepdf[fitpaper]{cover-pdf}

3.3 basics-latex.Rmd

basics-latex.Rmd 파일은 PDF \(\LaTeX\) 겉장을 포함시켜 데이터 과학 보고서를 제작할 수 있도록 설정한다.

Code
cat(readr::read_lines('lipsum/rmarkdown/basics-latex.Rmd'), sep = '\n')
#> ---
#> layout: page
#> output:
#>   bookdown::pdf_document2: 
#>     latex_engine: xelatex
#>     toc: true
#>     toc_depth: 2  
#>     number_sections: true
#>     fig_width: 3
#>     fig_height: 2
#>     fig_caption: true
#>     df_print: kable
#>     highlight: tango
#>     includes:
#>       in_header: sections/import.tex
#>       before_body: sections/cover.tex
#> mainfont: NanumGothic
#> ---
#> 
#> ```{r setup, include=FALSE}
#> knitr::opts_chunk$set(echo = TRUE, message=FALSE, warning=FALSE,
#>                       comment="", digits = 3, tidy = FALSE, prompt = FALSE, fig.align = 'center')
#> library(tidyverse)
#> ```
#> 
#> 
#> # 들어가며 {#rmd-intro}
#> 
#> [`lorem`](https://github.com/gadenbuie/lorem), [`shinipsum`](https://github.com/ThinkR-open/shinipsum) 팩키지가 도움이 된다.
#> 
#> `r lorem::ipsum(paragraphs = 1)`
#> 
#> # 텍스트 {#rmd-main}
#> 
#> `r lorem::ipsum(paragraphs = 1)`
#> 
#> ## 증명 {#rmd-proof}
#> 
#> `r lorem::ipsum(paragraphs = 1)`
#> 
#> ## 표 {#rmd-table}
#> 
#> `r shinipsum::random_table(5, 7, "numeric")`
#> 
#> ## 그래프 {#rmd-graph}
#> 
#> <!-- `r shinipsum::random_ggplot()` -->
#> 
#> ```{r lorem-ipsum-penguin}
#> library(palmerpenguins)
#> library(tidyverse)
#> 
#> ggplot(data = penguins,
#>                        aes(x = flipper_length_mm,
#>                            y = body_mass_g)) +
#>   geom_point(aes(color = species,
#>                  shape = species),
#>              size = 1,
#>              alpha = 0.8) +
#>   theme_minimal() +
#>   scale_color_manual(values = c("darkorange","purple","cyan4")) +
#>   theme(legend.position = c(0.2, 0.7),
#>         legend.background = element_rect(fill = "white", color = NA),
#>         plot.title.position = "plot",
#>         plot.caption = element_text(hjust = 0, face= "italic"),
#>         plot.caption.position = "plot")
#> ```
#> 
#> 
#> ## 그림 {#rmd-image}
#> 
#> <!-- `r shinipsum::random_image()` -->
#> 
#> ![](../fig/latex-editor.png)
#> 
#> ## 모형 {#rmd-model}
#> 
#> `r shinipsum::random_print("model")  %>% broom::glance()`
#> 
#> # 마무리 {#rmd-conclusion}
#> 
#> `r lorem::ipsum(paragraphs = 1)`

4 R 마크다운 + \(\LaTeX\)

\(\LaTeX\) 겉장을 R 마크다운 데이터 과학 보고서와 결합시켜 제작한 PDF 산출물은 다음과 같다.

Code
knitr::include_graphics("lipsum/rmarkdown/basics-latex.pdf")