knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

Introduction

ถ้าได้ลองพิมพ์ภาษาไทยใน R Markdown แล้ว knit เป็น pdf_document จะพบว่าเกิด error ขึ้น

Error: LaTeX failed to compile something.tex.

การสร้าง PDF จาก R Markdown นั้น จะผ่านกระบวนการที่แปลงเอกสารหลายขั้นตอน ซึ่ง ภาษาไทย จะมีปัญหาที่ขั้นตอน

LaTeX -> PDF

วิธีแก้นั้น จะต้องมีการตั้งค่าต่างๆ ใน LaTeX preamble และ YAML header ของ R Markdown เพื่อให้รองรับกับการใช้งานภาษาไทยได้ โดย R package นี้จึงถูกสร้างขึ้นเพื่อช่วยใน workflow จุดนี้

(ขอบคุณคำแนะนำจาก: คําแนะนําการตั้งค่า LATEX สําหรับใช้ภาษาไทย)

Installation

การ install เหล่านี้ทำเพียงครั้งเดียวเท่านั้น

# install.packages("remotes")
remotes::install_github("Lightbridge-KS/thaipdf")
install.packages("tinytex")

# For using R Markdown
tinytex::install_tinytex() 

# Install LaTeX PKG required by `thaipdf`
tinytex::tlmgr_install(c(
  "fontspec", "ucharclasses", "polyglossia"
))

โดย LaTeX package ที่จำเป็นสำหรับ type setting ภาษาไทยคือ "fontspec", "ucharclasses" และ "polyglossia"

Basic Usage

Stand-alone R Markdown Template

วิธีใช้ที่ง่ายที่สุด คือสร้าง R Markdown ที่รองรับภาษาไทยจาก template ที่ package นี้มีให้

ถ้าท่านใช้ RStudio ให้ไปที่ File -> New File -> R Markdown... -> From Template

New R Markdown Template{alt="New R Markdown Template" width="600"}

เลือก template Thai PDF R Markdown หรือ Thai PDF Bookdown จากเมนู

กดปุ่ม OK จะเปิดไฟล์ R Markdown template ที่รองรับกับภาษาไทย

thaipdf R Markdown in RStudio{alt="thaipdf R Markdown in RStudio" width="600"}

จากนั้นกดปุ่ม Knit (cmd/ctr + shift + K) ได้เลย จะได้เอกสารเป็น PDF ภาษาไทยที่มี เนื้อหา โค้ด และ กราฟ อยู่รวมกัน

ตัวอย่าง R Markdown PDF ภาษาไทย{width="600"}

โปรดสังเกตุว่าการที่ภาษาไทยใช้งานได้นั้น เนื่องจากมีการตั้งค่า YAML header ในส่วน

output: 
  thaipdf::thaipdf_document:

โดยที่ template ของ thaipdf ทั้ง 2 แบบ

Customization

Thai Font & Line Spacing

สำหรับ thaipdf_document() และ thaipdf_book() จะมี argument ที่สร้างไว้ให้รองรับ การตั้งค่าสำหรับภาษาไทย ดังนี้

output: 
  thaipdf::thaipdf_document:
    thai_font: "TH Sarabun New"
    line_spacing: 1.5

R Markdown / Bookdown Arguments

เนื่องจากทั้ง 2 function ของ thaipdf นี้ (thaipdf_document(), thaipdf_book()) สามารถ "ส่งต่อ argument" ไปยัง rmarkdown::pdf_document() หรือ bookdown::pdf_book() ได้

ดังนั้นเราจึงสามารถ ใส่ argument อื่นๆ ที่รองรับโดย 2 function ดังกล่าวได้เลย (ยกเว้น latex_engine กับ includes) เช่น

---
title: "R Markdown ภาษาไทย"
author: "`thaipdf` package"
output: 
  thaipdf::thaipdf_book:
    thai_font: "TH Sarabun New"
    line_spacing: 1.5
    toc: true # table of content
    keep_tex: false # "true" to keep intermediate LaTeX
---

สังเกตุว่าต้อง indent 4 space ด้วย เพราะจากตัวอย่างเป็น argument ที่ส่งเข้า thaipdf_book()

สำหรับ argument ตัวอื่นๆ ที่ใช้ได้ ของ rmarkdown::pdf_document() ยังมีอีกมาก ลองอ่านได้ที่:

Pandoc Variables

เนื่องจาก R Markdown ใช้ pandoc เป็นตัวแปลง LaTeX เป็น PDF ดังนั้นจึงสามารถใส่ pandoc variable ใน YAML header ได้โดยตรง ซึ่งจะมีประโยชน์ในการปรับ setting อื่นๆ เช่น ปรับขนาด font, เปลี่ยน font family ภาษาอังกฤษ, ทำให้ link หรือ citation มีสีสัน เช่น

---
title: "R Markdown ภาษาไทย"
author: "`thaipdf` package"
output: 
  thaipdf::thaipdf_document:
    thai_font: "TH Sarabun New"
fontsize: 12pt
mainfont: "TeX Gyre Termes"
monofont: "Fira Code iScript"
# Color provided by LaTeX "xcolor" package
linkcolor: BrickRed 
urlcolor: NavyBlue
---

Font size --- จากตัวอย่าง ปรับขนาด font ด้วย fontsize

Font family --- จากตัวอย่าง มี font family ทั้ง 3 ชนิดในเอกสารคือ

Color --- จากตัวอย่าง ปรับสีของ link ในเอกสาร และ URL ได้ด้วย linkcolor และ urlcolor ตามลำดับ

นอกจากนี้ยังมี pandoc variable อื่นๆ อีกมาก ลองอ่านได้ที่ Pandoc variable for LaTeX


Advance Usage

R Markdown Template with LaTeX preamble {#rmd-pre}

สำหรับผู้ที่ใช้ LaTeX เป็น และต้องการ customize หลายสิ่งกับ LaTeX ให้ลองเลือก template ที่ชื่อว่า Thai PDF R Markdown (with preamble)

New R Markdown Template with Preamble{alt="New R Markdown Template with Preamble" width="600"}

จากนั้นใส่ชื่อไฟล์และตำแหน่งที่ให้สร้างที่ช่อง Name กับ Location แล้วคลิก OK

จะมีการสร้าง folder ใน structure แบบนี้ (<NAME> คือชื่อที่กรอกในช่อง Name ไป)

<NAME>/
 |
 |--> <NAME>.Rmd
 |
 |--> pre-tex/
       |
       |--> thai-preamble.tex

ใน folder จะมี R Markdown file ที่มี YAML header ที่ตั้งค่าที่สำคัญคือ:

output:
  pdf_document:
    latex_engine: xelatex  # จำเป็นต้องใช้ xelatex สำหรับภาษาไทย
    includes:
      in_header: "pre-tex/thai-preamble.tex" # path ไปยัง preamble ที่มีปรับให้ใช้ภาษาไทยได้

ดังนั้นเราจึงสามารถเขียน LaTeX เพิ่มเติม หรือ load package และตั้งค่าอื่นๆ ในไฟล์ thai-preamble.tex ได้อีกด้วย เช่นทำ link ให้มีสี (เหมือนภาพแรกสุดที่แสดง)

Use LaTeX preamble {#latex-preamble}

จะเป็นการสร้างไฟล์ thai-preamble.tex ที่เป็น LaTeX preamble สำหรับภาษาไทย ขึ้นมาใน working directory (สามารถเปลี่ยนได้) และมีคำแนะนำการตั้งค่าใน YAML ของ R Markdown ให้ด้วย

ทางเลือกนี้เหมาะสำหรับ

  1. ผู้ที่มีไฟล์ R Markdown อยู่แล้ว แต่ต้องการปรับให้ใช้กับภาษาไทยได้
  2. ผู้ที่ใช้ LaTeX เป็น สามารถดึงตัว LaTeX preamble ภาษาไทยมาใช้ และ customize เพิ่มเติมตามที่ต้องการได้เลย

ฟังก์ชั่น thaipdf::use_thai_preamble() ถูกออกแบบในทำนอง usethis package โดยจะทำการ

จากนั้นให้ ปรับ YAML header ของ R Markdown ในส่วนของ pdf_document: หรือ bookdown::pdf_document2: ซึ่งต้องทำเอง ดังนี้

Example

.old_wd <- setwd(tempdir()) # for example only

thaipdf::use_thai_preamble()

setwd(.old_wd) # for example only

ใน R Markdown (pdf_document) ให้ปรับ YAML header และใส่คำสั่ง \sloppy

---
title: "ทดสอบภาษาไทย" 
output:
  pdf_document:
    latex_engine: xelatex  # จำเป็นต้องใช้ xelatex สำหรับภาษาไทย
    includes:
      in_header: thai-preamble.tex # path ไปยัง preamble ที่มีปรับให้ใช้ภาษาไทยได้
---

\sloppy

# สวัสดีชาวโลก

นี่คือเอกสาร R Markdown **ภาษาไทย** ที่สร้าง PDF ด้วย \LaTeX

เสร็จแล้วสามารถกด knit ได้เลย

{width="600"}

Special Thanks


Last Updated: r Sys.Date()



Lightbridge-KS/thaipdf documentation built on June 18, 2022, 6:58 a.m.