DEV Community

loading...

เขียน LaTeX ด้วย VSCode และ TeX Live Docker Image — EP2

MrChoke
Just For Fun!!
Originally published at mrchoke.Medium on ・10 min read

เขียน LaTeX ด้วย VSCode และ TeX Live Docker Image — EP2

หลังจากสามารถจัดการและใช้งาน Docker Container ได้แล้วคราวนี้ลองมาเขียน LaTeX กับ VSCode กันดูครับ ถ้าใครไม่เคยเขียนมาก่อนก็คงต้องทำการบ้านมาบ้าง เพราะผมไม่ได้ลงรายละเอียดทั้งหมด

เขียน LaTeX ด้วย VSCode และ TeX Live Docker Image — EP1

Attach Container

Attach to New Window

เลือกรูป Computer บน Side Bar ด้านซ้าย แล้วก็ Click ขวาบนชื่อ Container ที่เราต้องการใช้งาน (สั่ง run ไว้ก่อนหน้านี้แล้ว) แล้วเลือก Attach in New Window ก็จะปรากฎหน้าต่างใหม่ขึ้นมาดังรูปถัดไป

Workspace ใหม่

ซึ่งจะมี Terminal ของ Container มาให้ด้วยให้เราสร้าง Folder สำหรับทำเขียน LaTeX ด้วยคำสั่งดังนี้

สร้าง Folder

เนื่องจากตอนเราสร้าง container ได้มีการ mount volume ไว้ใน /root/data ดังนั้นให้เราเข้าไปใน /root/data แล้วสร้าง folder ขึ้นมา 1 folder

mkdir /root/data/latex1
Enter fullscreen mode Exit fullscreen mode

จะสั่งแบบในรูปหรือสั่งตามตัวอย่างก็ได้

เปิด Folder ใน Workspace

เปิดจาก terminal ง่ายๆ ด้วยคำสั่ง

code /root/data/latex1
Enter fullscreen mode Exit fullscreen mode

หรือจะใช้ mouse click ที่รูป icon files บน Side Bar ด้านซ้าย และ Click ที่ปุ่ม Open Folder

Click Open Folder

ใส่ path หรือจะ Click เลือกไปเรื่อยๆ ก็ได้ดังรูปด้านล่าง

เลือก Folder ที่เราสร้างไว้

สร้าง File ใหม่

เมื่อเปิด Folder เรียบร้อยให้ Click ที่ icon new file หรือ Click ขวาบนพื้นที่ว่างในช่อง แล้วเลือก New File จาก Menu ดังรูปด้านบน

ตั้งชื่อ file1.tex

New File

ใส่คำสั่ง LaTeX แรกดังตัวอย่าง

\documentclass{article}
\title{My First \LaTeX{} Document}
\author{MrChoke}
\date{\today}
\begin{document}
   \maketitle
   Hello \LaTeX{} world!
\end{document}
Enter fullscreen mode Exit fullscreen mode

อ่านเกี่ยวกับ LaTeX เพิ่มเติมได้ที่

https://medium.com/media/ff54de4b800cb059c6627c3b4733d06d/href

คำสั่ง LaTeX

หลังจากนี้เราสามารถสั่งให้ Build คำสั่งนี้ได้แล้วโดยการ Click ที่ปุ่มสีเขียวด้านบนขวา

ปุ่มคำสั่งของ LaTeX Workshop Extension

หลังจาก Build

ถ้าหาก Build สำเร็จจะมี files ต่างๆ เกิดขึ้นทางด้านซ้ายมือ โดยเฉพาะ PDF File คือเป้าหมายของเราถ้ามี Error ตัว Extension ก็จะแจ้งเตือนเรามา ก็ต้องไล่อ่านว่าเกิดจากอะไร

PDF View

ถ้าเราต้องการแสดงผล PDF ก็ให้ Click ที่ปุ่มถัดจากปุ่ม Build สีเขียว ที่มีรูปแว่นขยาย ก็จะได้เหมือนรูปด้านบน หลังจากนี้ถ้าเราแก้ไขคำสั่ง LaTeX แล้ว save มันก็จะทำการ Build ให้อัตโนมัติและแสดงผล PDF ให้ทันทีด้วยเช่นกัน

สำหรับค่า defualt จากตัวอย่างด้านบนตอนสั่ง build จะใช้ engine pdfLaTeX นะครับ

ภาษาไทย

ถ้าเราเขียนเอกสารภาษาอังกฤษก็สบายหน่อยเพราะตัวอย่างข้างบนก็เพียงพอแล้วแต่ถ้าเราจะใช้ภาษาไทยใน LaTeX ละเราต้องทำอย่างไร และ ต้องรู้อะไรบ้าง

เลือก Engine

การใช้ LaTeX Engine ที่นิยมหลักๆ ก็จะมี

  • pdfLaTeX
  • XeLaTeX
  • LuaLaTeX

pdfLaTeX

โครงการภาษาไทยสำหรับ LaTeX หรือ ThaiLaTeX เป็นโครงการแรกๆ ที่ Contribute สภาวะแวดล้อมการใช้งานภาษาไทยเข้าไป อ่านรายละเอียดได้ที่

https://linux.thai.net/projects/thailatex

ซึ่งหลัก ๆ เป็นการกำหนดสภาวะแวดล้อมภาษาไทยให้ pdfLaTeX เนื่องจาก pdfLaTeX ค่อนข้างล้าสมัยการใช้ fonts ก็มีข้อจำกัดไม่สามารถใช้ fonts ใหม่ๆ อย่าง OpenType ได้การตัดคำก็ต้องทำเองก่อนจะทำการ Build Project การ shapping สระ และ วรรณยุกต์ก็ยังต้องใช้แบบเก่า

มาดูตัวอย่างการใช้ภาษาไทยด้วย pdfLaTeX กันครับ

pdfLaTeX — Thai LaTeX

ตัวอย่างคำสั่ง

\documentclass{article}
\usepackage[thai]{babel}
\usepackage[utf8x]{inputenc}
\usepackage{fonts-tlwg}
\begin{document}
สวัสดีชาวโลก
\end{document}
Enter fullscreen mode Exit fullscreen mode

ตัวอย่าง Thai LaTeX กับ pdfLaTeX

ตั้งแต่บรรทัดที่ 2–4 เป็นสิ่งจำเป็นที่ต้องประกาศเสมอไม่งั้นจะใช้งานภาษาไทยไม่ถูกต้อง

FONTS TLWG

Fonts ภาษาไทยหลักที่ bundle ไปกับ TeX Live ก็จะมีชุดของ TLWG (Thai Linux Working Group) ดังนี้

\documentclass{article}
\usepackage[thai]{babel}
\usepackage[utf8x]{inputenc}
\usepackage{fonts-tlwg}
\begin{document}

\begin{itemize}
  \item \fontfamily{kinnari} \selectfont Kinnari สวัสดีชาวโลก
  \item \fontfamily{garuda} \selectfont Garuda สวัสดีชาวโลก
  \item \fontfamily{norasi} \selectfont Norasi สวัสดีชาวโลก
  \item \fontfamily{laksaman} \selectfont Laksaman สวัสดีชาวโลก
  \item \fontfamily{purisa} \selectfont Purisa สวัสดีชาวโลก
  \item \fontfamily{loma} \selectfont Loma สวัสดีชาวโลก
  \item \fontfamily{sawasdee} \selectfont Sawasdee สวัสดีชาวโลก
  \item \fontfamily{ttype} \selectfont Ttype สวัสดีชาวโลก
  \item \fontfamily{ttypist} \selectfont TTypist สวัสดีชาวโลก
  \item \fontfamily{umpush} \selectfont Umpush สวัสดีชาวโลก
  \item \fontfamily{waree} \selectfont Waree สวัสดีชาวโลก
\end{itemize}

\end{document}
Enter fullscreen mode Exit fullscreen mode

fonts-tlwg

การเลือก Default Font

ปกติถ้าเราใช้ Thai LaTeX font ที่ถูกใช้คือ

  • Norasi สำหรับ Roman Font
  • Garuda สำหรับ Sans Serif Font
  • TlwgTypist สำหรับ Type Writer

แต่ถ้าเราจะเลือก font ตัวอื่นในรายการด้านบนให้เราประกาศใน

\usepackage{fonts-tlwg}
Enter fullscreen mode Exit fullscreen mode

โดยการกำหนด option ดังนี้

\usepackage[fontname]{fonts-tlwg}
Enter fullscreen mode Exit fullscreen mode

เช่น

\documentclass{article}
\usepackage[thai]{babel}
\usepackage[utf8x]{inputenc}
\usepackage[purisa]{fonts-tlwg}
\begin{document}
เป็นมนุษย์สุดประเสริฐเลิศคุณค่า กว่าบรรดาฝูงสัตว์เดรัจฉาน
จงฝ่าฟันพัฒนาวิชาการ อย่าล้างผลาญฤๅเข่นฆ่าบีฑาใคร
ไม่ถือโทษโกรธแช่งซัดฮึดฮัดด่า หัดอภัยเหมือนกีฬาอัชฌาสัย
ปฏิบัติประพฤติกฎกำหนดใจ พูดจาให้จ๊ะๆ จ๋า น่าฟังเอยฯ

ธรรมคุณหนุนความดีฑีฆรัตน์ สรรพสัตว์วัฏวจรถอนวิถี
อริยสัจตรัสสังโยคโลกโมฬี ดังกุมภีร์ผลาญชิวหาบีฑาทนต์
ฟังฉัตรทองของประเสริฐเลิศวิเศษ ฝ่ายต้นเหตุฎรงกรณ์อุดรผล
ยินสถานฌานสมาอารยะชน พึงซ่อนกลปรนนิบัตินิวัฒน์แฮฯ
\end{document}
Enter fullscreen mode Exit fullscreen mode

Purisa

Laksaman

อ่านเพิ่มเติมได้ที่

https://raw.githubusercontent.com/tlwg/fonts-tlwg/master/latex/README.latex

การตัดคำ

without word/line break

สังเกตว่าการตัดคำและบรรทัดยังแปลกๆ มีการใส่ hyphen ยังไม่ถูกต้องนัก ใน TeX Live Docker image ผมใส่ swath ไปให้แล้วเราสามารถสั่งตัดคำได้เลยโดยสั่งดังนี้

swath -f latex -u u,u < original.tex > processed.tex
Enter fullscreen mode Exit fullscreen mode

จากคำสั่งด้านบน

  • -f latex กำหนด format เป็น LaTeX
  • -u u,u encoding แบบ utf-8 to utf-8 ถ้าสมัยก่อนอาจจะต้องใข้ TIS-620 แต่ปัจจุบันเรา process เป็น UTF-8 ได้เลย
  • < original.tex คือ file ต้นฉบับที่นำเข้า
  • > processed.tex คือ นำออก file จากผลที่ประมวลผลเรียบร้อยแล้ว

หลังจากนั้นเราก็นำ file ที่ตัดคำแล้วไป build ต่อ

LaTeX Source ที่ถูกตัดคำเรียบร้อยแล้ว

ผลของการตัดบรรทัด และใส่ Hyphen ได้ถูกต้องขึ้น

จากตัวอย่าง pdfLaTeX จะเห็นว่าวิธีการยังค่อนข้างซับซ้อนยังต้องมีการตัดคำก่อนที่จะ process และ fonts ที่ใช้ยังเป็นแบบ Type1 การนำ fonts ของระบบหรือ fonts ภายนอกมาใช้ยากมาก

XeLaTeX, LuaLaTeX

ทางเลือกที่คนนิยมใช้กันในปัจจุบันคือ XeLaTeX ส่วน LuaLaTeX ผมยังไม่เคยได้ลองแต่เห็นหลายคนบอกว่าคล้ายๆ กัน คือใช้ FontSpec เหมือนกัน และ เกิดมาเพื่อประมวลผลแบบ UTF-8 และที่สำคัญคือมีการใช้ ICU ในการตัดคำซึ่งสนับสนุนหลากหลายภาษารวมทั้งภาษาไทยด้วย

สร้าง Workspace ใหม่

สร้าง Folder ใหม่ใน /root/data ชื่อ latex2 ทำใน terminal

mkdir /root/data/latex2
Enter fullscreen mode Exit fullscreen mode

เปิด หน้าต่างใหม่ด้วยคำสั่ง

code /root/data/latex2
Enter fullscreen mode Exit fullscreen mode

สร้าง Build Tools และ Recipes

ค่าปกติในการ Build LaTeX ของ VSCode LaTeX Workshop Extension คือ pdfLaTeX ส่วน XeLaTeX ไม่ได้จัดเตรียมไว้ให้ การตั้งค่า Extension ทำได้หลายระดับมีตั้งแต่

  • เฉพาะ Workspace
  • เฉพาะใน Container หรือ SSH
  • ตั้งเป็นค่าของเราระดับ USER ก็ได้

ถ้าเราเขียนหลายแบบก็อาจจะแยกเฉพาะ Workspace ก็ได้ให้เปิด

VSCode Setting → Workspace
Enter fullscreen mode Exit fullscreen mode

แล้วค้นหาคำว่า

latex tools
Enter fullscreen mode Exit fullscreen mode

Recipes & Tools

ให้ Click ที่ Edit in settings.json ของ

Latex-workshop -> Latex: Tools
Enter fullscreen mode Exit fullscreen mode

แล้วเพิ่ม Block ใหม่โดย Copy จาก lualatex

{
      "name": "xelatexmk",
      "command": "latexmk",
      "args": [
        "-synctex=1",
        "-interaction=nonstopmode",
        "-file-line-error",
        "-xelatex",
        "-outdir=%OUTDIR%",
        "%DOC%"
      ],
      "env": {}
  }
Enter fullscreen mode Exit fullscreen mode

ให้เปลี่ยนชื่อ เป็น xelatexmk และ เปลี่ยน args จาก -lualatex เป็น -xelatex

save แล้วปิดหน้าต่าง settings.json ไป

แล้วกลับไป Click ที่ Edit in settings.json ของ

Latex-workshop -> Latex: Recipes
Enter fullscreen mode Exit fullscreen mode

ให้ Copy ฺBlock ของ latexmk (lualatex) แล้วเปลี่ยนให้ตรงกับที่เรากำหนดไว้ใน Tools

{
      "name": "latexmk (xelatex)",
      "tools": [
        "xelatexmk"
      ]
 }
Enter fullscreen mode Exit fullscreen mode

ตั้งให้ใช้ Recipe ล่าสุดในการ Build Project

ให้ค้นหา Setting

latex recipe
Enter fullscreen mode Exit fullscreen mode

เปลี่ยนจาก first เป็น lastUsed

ให้ใช้ Recipe ล่าสุดเสมอ

ถ้าไม่ตั้งแบบนี้มันจะใช้ Recipe อันแรกสุดเสมอ เมื่อเพิ่มค่าต่างๆ ครบแล้วให้ทำการ reload หน้าต่างใหม่อีกครั้ง

Reload Window

ให้เปิด Command Palette จากเมนู หรือจะกด Shotcut ก็

View --> Command Palette
Enter fullscreen mode Exit fullscreen mode

แล้วค้นหาคำว่า

restart
Enter fullscreen mode Exit fullscreen mode

เลือก Restart Extension Host แล้วกด Reload Window หรือจะปิด-เปิด VSCode ใหม่ก็ได้

อย่าลืมว่าถ้าเราตั้งค่าในระดับ Workspace ถ้าเราสร้าง Workspace ใหม่เราก็ต้องตั้งค่าเหล่านี้ใหม่ทุกครั้ง หรืออาจจะ copy .vscode ใน folder ไปก็ได้

Config ของ VSCode ในระดับ Workspace

First XeLaTeX

มาลองเขียน XeLaTeX แรกกัน

สร้าง file1.tex โดย Copy คำสั่งมาจากตัวอย่างแรกของ pdfLaTeX

\documentclass{article}
\title{My First \LaTeX{} Document}
\author{MrChoke}
\date{\today}
\begin{document}
   \maketitle
   Hello \LaTeX{} world!
\end{document}
Enter fullscreen mode Exit fullscreen mode

หลังจากนั้นให้ Click ที่ Icon TeX บน Side Bar ด้านซ้าย

LaTeX WorkShop Extension

ให้ขยายคำสั่ง Build LaTeX project คำสั่งแรกปุ่ม play สีเขียว

Recipe ต่างๆ สำหรับการ Build Project

เราจะเห็นคำสั่งต่างๆ สำหรับการ Build Project ให้สังเกตตรง Recipe โดยปกติเวลาเราสั่งให้ Build มันจะเลือกคำสั่งแรกซึ่งเป็น Recipe: latexmk หรือ pdfLaTeX นั่นเองก่อนหน้านี้เราได้จัดเตรียม latexmk ให้ Build XeLaTeX ไว้แล้วจะเห็นใน Recipe ที่ 4 หรือถ้าใครจะ Build LuaLaTeX ก็เลือกจากตรงนี้เหมือนกันครับ ตรงนี้ให้ Click เลือก XeLaTeX ต้องระวังนิดหนึ่งคือก่อน Click ต้องให้ file ที่เราจะ Build ถูก Focus เสมอนั่นคือให้ Click file ก่อนแล้ว Click Build

Check

รู้ได้ยังไงว่า Build สำเร็จ ?

ให้กลับไปที่หน้า Explorer แล้วดูว่ามี file pdf ถูกสร้างขึ้นมาหรือไม่

หลังจากนั้นก็ลอง Click แสดง pdf ตรง icon มุมขวาบนข้างปุ่ม Build สีเขียว

ปุ่มคำสั่งของ LaTeX Workshop Extension

PDF ที่ได้จาก XeTeX

เรารู้ได้อย่างไรว่า Extension ใช้ Engine อะไร Build ให้เรา ?

หลายคนคงสงสัยว่าที่ Build มานั้นใช้ XeLaTeX จริงหรือเปล่า ผมแนะนำอีกอย่างคือการดู Output ของ Extension ให้เลือกเมนู

View --> Output
Enter fullscreen mode Exit fullscreen mode

แล้วเลือกดู LaTeX Workshop หรือ จะดู LaTeX Compiler ก็แล้วแต่เราจะสนใจนะครับ

Output ต่างๆ

Output

ถ้าเราสังเกตก็จะเห็นบรรทัดคำสั่ง หรือ Recipe ที่เราสั่งรูปด้านบนก็จะบอกว่าเป็น XeLaTeX

นอกจากนั้นการวิเคราะห์ log ของ LaTeX เองก็จะช่วยแก้ปัญหาต่างๆ ได้ดูโดยเลือกเปิด file นามสกุล log ที่มีชื่อเดียวกับ LaTeX ของเรา

file log

XeLaTeX กับภาษาไทย

อย่างที่เคยเกริ่นไปก่อนหน้านี้ว่า XeLaTeX นั้นเกิดมาหลังและสนับสนุน UTF-8 , OpenType และ TrueType Font ตั้งแต่แรกอยู่แล้วการใช้งานพวกนี้ก็ถือว่าง่าย

ข้อดี

  • สนับสนุน UTF-8,Unicode
  • TrueType , OpenType
  • สามารถใช้ Fonts นอกเหนือจากที่มีใน TeX Live ได้ คือสามารถใช้ fonts ของระบบได้เลย และ สามารถ copy fonts มาวางไว้กับ source code ได้ด้วย

ข้อเสีย

  • จากข้อดีข้างบนถ้าคุยกับคนใช้ LaTeX จริงๆ จังๆ เขาอาจจะมองว่าเป็นสิ่งที่อาจจะทำให้เสียความเป็น LaTeX ได้เพราะตอนส่ง source code ให้กันอาจจะลืม Copy Font ให้ไปด้วยเพราะไม่รู้ว่า Font ที่ใช้ ไม่ได้อยู่ใน TeX Live ก็จะเป็นปัญหาคล้ายๆ Microsoft Word ที่แสดงผลผิดพลาดถ้าต้นทางและปลายทางใช้ font ไม่เหมือนกันเป็นต้น
  • ณ ปัจจุบัน TeX Live 2021 มี fonts ไทยไปด้วยทั้ง Type1 และ OpenType Font แต่การตั้งค่าให้ Fontspec ใช้งานได้ผู้ใช้ยังต้องออกแรงเองอยู่ คือต้องประกาศเพิ่มเติมถึงจะใช้ได้ หลายคนจึงนิยมใช้ font ที่หามาเอง หรือ font ที่อยู่ในระบบปฎิบัติการ ก็อาจจะเกิดปัญหาตามมาเมื่อส่งมอบ source code ไปให้คนอื่น

Fonts ไทย

fonts-tlwg

fonts-tlwg มีอยู่แล้วใน TeX Live ที่ติดตั้งแบบทั้งหมด หรือ จะเลือกติดตั้งเพิ่มเติมภายหลังก็ได้การใช้งาน font ใน XeLaTeX จะใช้ package fontspec ซึ่งจะต้องมีการประกาศ font เสียก่อนทำได้หลายแบบ ก่อนอื่นให้ copy file2.tex จากตัวอย่างแรกมาก่อน แล้วแก้ดังนี้

\documentclass{article}
\usepackage{fontspec}
\begin{document}
สวัสดีชาวโลก
\end{document}
Enter fullscreen mode Exit fullscreen mode

แล้วลองสั่ง build ด้วย XeLaTeX Recipes จะไม่มีอะไร error แต่เมื่อสั่ง preview pdf จะไม่เห็นข้อความใด ๆ เลย

ไม่มี output

ทีนี้เราลองสั่งเพิ่มเข้าไปหนึ่งบรรทัดคือ

\setmainfont{Laksaman.otf}
Enter fullscreen mode Exit fullscreen mode

แล้วลอง Build ใหม่อีกรอบก็จะมีข้อความขึ้นมา

Output ภาษาไทย

ข้างบนเป็นตัวอย่างหนึ่งที่ง่ายๆ ในการใช้ font แต่เราต้องรู้ชื่อ file font ด้วยนะไม่งั้นมันจะหาไม่ถูก แล้ว fonts-tlwg มี font อะไรบ้างละ ?

fonts-tlwg ที่มากับ TeX Live จะเก็บใน

texmf-dist/fonts/opentype/public/fonts-tlwg/
Enter fullscreen mode Exit fullscreen mode

ถ้า Docker Image ของผมจะอยู่ที่

/usr/local/texlive/2021/texmf-dist/fonts/opentype/public/fonts-tlwg/
Enter fullscreen mode Exit fullscreen mode

รายชื่อ Files

Garuda-BoldOblique.otf
Garuda-Bold.otf
Garuda-Oblique.otf
Garuda.otf
Kinnari-BoldItalic.otf
Kinnari-BoldOblique.otf
Kinnari-Bold.otf
Kinnari-Italic.otf
Kinnari-Oblique.otf
Kinnari.otf
Laksaman-BoldItalic.otf
Laksaman-Bold.otf
Laksaman-Italic.otf
Laksaman.otf
Loma-BoldOblique.otf
Loma-Bold.otf
Loma-Oblique.otf
Loma.otf
Norasi-BoldItalic.otf
Norasi-BoldOblique.otf
Norasi-Bold.otf
Norasi-Italic.otf
Norasi-Oblique.otf
Norasi.otf
Purisa-BoldOblique.otf
Purisa-Bold.otf
Purisa-Oblique.otf
Purisa.otf
Sawasdee-BoldOblique.otf
Sawasdee-Bold.otf
Sawasdee-Oblique.otf
Sawasdee.otf
TlwgMono-BoldOblique.otf
TlwgMono-Bold.otf
TlwgMono-Oblique.otf
TlwgMono.otf
TlwgTypewriter-BoldOblique.otf
TlwgTypewriter-Bold.otf
TlwgTypewriter-Oblique.otf
TlwgTypewriter.otf
TlwgTypist-BoldOblique.otf
TlwgTypist-Bold.otf
TlwgTypist-Oblique.otf
TlwgTypist.otf
TlwgTypo-BoldOblique.otf
TlwgTypo-Bold.otf
TlwgTypo-Oblique.otf
TlwgTypo.otf
Umpush-BoldOblique.otf
Umpush-Bold.otf
Umpush-LightOblique.otf
Umpush-Light.otf
Umpush-Oblique.otf
Umpush.otf
Waree-BoldOblique.otf
Waree-Bold.otf
Waree-Oblique.otf
Waree.otf
Enter fullscreen mode Exit fullscreen mode

ถ้าสังเกตในตัวอย่างเราจะใช้ font Laksaman.otf ซึ่งเป็น font แบบ Nomal แบบเดียวไม่มีตัวหน้า ตัวเอียงให้ใช้ ลองสั่งดูครับ

จะแสดงเป็นตัวธรรมดาทั้งหมด

fontspec จะมี Options สำหรับการกำหนดค่า font ให้ง่ายขึ้นมาดูตัวอย่าง เพิ่มเติมให้กับ \setmainfont กัน

\setmainfont[
  Extension = .otf ,
  ItalicFont = *-Italic ,
  BoldFont = *-Bold ,
  BoldItalicFont = *-BoldItalic 
]{Laksaman}
Enter fullscreen mode Exit fullscreen mode

การกำหนด Font Shape Options นี้ยังสามารถใช้กับ font ที่เรานำมาใช้เอง โดยการ Copy ชุด fonts มาใส่ใน folder project ของเราแล้วประกาศให้ครบตามนี้แต่อย่าลืมว่าแต่ละ font จะมีไม่เหมือนกันบางตัวไม่มีตัวหนา ไม่มีตัวเอียง หรือ จะมีแบบอื่นเพิ่มขึ้นมาเช่น -Oblique , -Regular, -Light เป็นต้นก็ต้องกำหนดให้ถูกต้อง

ตัวอย่าง Font Shape

BoldFont = ⟨font name⟩
ItalicFont = ⟨font name⟩
BoldItalicFont = ⟨font name⟩
SlantedFont = ⟨font name⟩
BoldSlantedFont = ⟨font name⟩
SmallCapsFont = ⟨font name⟩
UprightFont = ⟨font name⟩
Enter fullscreen mode Exit fullscreen mode

Shaping

ตอนนี้ดูเหมือนจะแสดงภาษาไทยได้แล้วแต่สิ่งที่สำคัญของภาษาไทยอีกอย่างที่เราควรรู้และใส่ใจคือการจัดระดับสระวรรณยุกต์ หรือ Shaping ลองดูตัวอย่าง

\documentclass{article}
\usepackage{fontspec}

\setmainfont[
  Extension = .otf ,
  ItalicFont = *-Italic ,
  BoldFont = *-Bold ,
  BoldItalicFont = *-BoldItalic 
]{Laksaman}

\begin{document}

ป่า ป้า ป๊ะ ป๋า ญู ฐู ฏู ญ ฐ - -- --- `fi' ``ff"

\textbf{ป่า ป้า ป๊ะ ป๋า ญู ฐู ฏู ญ ฐ - -- --- `fi' ``ff"}

\textit{ป่า ป้า ป๊ะ ป๋า ญู ฐู ฏู ญ ฐ - -- --- `fi' ``ff" }

\textbf{\textit{ป่า ป้า ป๊ะ ป๋า ญู ฐู ฏู ญ ฐ - -- --- `fi' ``ff"}}
\end{document}
Enter fullscreen mode Exit fullscreen mode

สระวรรณยุกต์ภาษาไทยไม่สวย

จากตัวอย่างเมื่อเราพิมพ์ข้อความภาษาไทยที่มีสระและวรรณยุกต์หลายระดับจะแสดงผลไม่สวยงามอย่าเพิ่งตกใจเมื่อเราใช้ OpenType หรือ TrueType Fonts จะมี Option Script ให้เราเลือกว่าจะใช้ Script แบบไหนใน Fonts-Tlwg ที่เป็น OpenType มี Script Thai ให้เลือกได้เลย วิธีตรวจสอบว่า fonts ที่เราใช้มี Script อะไรบ้างจะใช้คำสั่ง

otfinfo -s fontname.[ttf,otf]
Enter fullscreen mode Exit fullscreen mode

ลองกำหนด Script

Script = Thai
Enter fullscreen mode Exit fullscreen mode

Script = Thai

ผลที่ได้คือภาษาไทยจัดระดับสระวรรณยุกต์ได้สวยงาม แต่!!! สิ่งที่ต้องสังเกตุอีกอย่างหนึ่งคือ การแสดง Ligatures ของภาษาอังกฤษจะไม่สวยงามแทนเพราะมันต้องใช้ Script = Latin นั่นเองวิธีแก้แบบบัวไม่ให้ช้ำน้ำไม่ให้ขุ่น ให้แสดงสวยงามทั้งสองภาษาคือให้ใช้

Script = Default
Enter fullscreen mode Exit fullscreen mode

Script = Default

มาดูผลเปรียบเทียบกันแบบชัดๆ

ไม่กำหนด Script จะเท่ากับ Script = Latin

Script = Thai

Script = Default

ผู้เชี่ยวชาญหลายท่านยังแนะนำอีก Option คือ

Ligatures=TeX
Enter fullscreen mode Exit fullscreen mode

หรือ จะใช้

Mapping=tex-text
Enter fullscreen mode Exit fullscreen mode

สอง options นี้เลือกตัวใดตัวหนึ่งก็ได้จะทำให้การแสดงผลเกี่ยวกับพวก -, — , — เป็นไปตามแบบของ TeX ทำให้สวยงามขึ้น

การตัดคำ

XeLaTeX จะใช้ lib ของ ICU ในการตัดคำลองมาดูกันว่าเมื่อเทียบกับ pdfLaTeX ที่ใช้ swath ในการตัดคำจะเป็นยังไงบ้าง

Copy จาก file4.tex จากตัวอย่าง pdfLaTeX มาแล้วแก้ไขดังนี้

\documentclass{article}
\usepackage{fontspec}

\setmainfont[
  Extension = .otf ,
  ItalicFont = *-Italic ,
  BoldFont = *-Bold ,
  BoldItalicFont = *-BoldItalic ,
  Script = Default,
  Mapping=tex-text
]{Laksaman}

\begin{document}
เป็นมนุษย์สุดประเสริฐเลิศคุณค่า กว่าบรรดาฝูงสัตว์เดรัจฉาน
จงฝ่าฟันพัฒนาวิชาการ อย่าล้างผลาญฤๅเข่นฆ่าบีฑาใคร
ไม่ถือโทษโกรธแช่งซัดฮึดฮัดด่า หัดอภัยเหมือนกีฬาอัชฌาสัย
ปฏิบัติประพฤติกฎกำหนดใจ พูดจาให้จ๊ะๆ จ๋า น่าฟังเอยฯ

ธรรมคุณหนุนความดีฑีฆรัตน์ สรรพสัตว์วัฏวจรถอนวิถี
อริยสัจตรัสสังโยคโลกโมฬี ดังกุมภีร์ผลาญชิวหาบีฑาทนต์
ฟังฉัตรทองของประเสริฐเลิศวิเศษ ฝ่ายต้นเหตุฎรงกรณ์อุดรผล
ยินสถานฌานสมาอารยะชน พึงซ่อนกลปรนนิบัตินิวัฒน์แฮฯ
\end{document}
Enter fullscreen mode Exit fullscreen mode

เมื่อลอง Build ดู

ข้อความภาษาไทยยาวๆ

จะเห็นว่าตอนนี้ยังไม่มีการตัดคำและบรรทัดที่ถูกต้อง XeLaTeX มีคำสั่งกำหนดภาษาสำหรับการตัดบรรทัดไว้ให้คือ

\XeTeXlinebreaklocale "th"
Enter fullscreen mode Exit fullscreen mode

ค่า “th” คือบอกว่าจะใช้ Locale ของ Thai นั่นเอง อาจจะใช้ “th_TH” หรือ “thai” ก็ได้

เพิ่มคำสั่งในการตัดคำ

เมื่อเรากำหนดคำสั่งให้ตัดบรรทัด (โดยดูจากการตัดคำ) ก็จะดูดีขึ้นแต่ถ้าสังเกตขอบทั้งซ้ายขวายังไม่มีการจัดให้พอดี หรือที่เรียกว่า Justify จริงๆ มันก็ Justify นะแหละแต่มันไม่กล้าแบ่งคำ และ การกระจายช่องว่างที่เหมาะสมนั่นเอง จึงมีคำสั่งอีกคำสั่งที่ช่วยจัดให้การกระจายได้สวยงามขึ้นคือ

\XeTeXlinebreakskip = 0pt plus 1pt\relax
Enter fullscreen mode Exit fullscreen mode

การ Tune การตัดบรรทัดเพิ่มเติม

เมื่อเราทำการ tune การตัดบรรทัดพบว่าดูดีขึ้นมาก ขอบซ้ายขวาตรงดิ่งสวยงาม แต่ถ้าสังเกตดีๆ จะพบว่ามีการแทรกช่องว่างระหว่างคำเล็กน้อยถ้าเทียบกับ pdfLaTeX ก่อนหน้านี้ จากการทดลองพบว่าถ้าจะให้เหมือนกับ pdfLaTeX แป่ะ ๆ ต้องใช้ package polyglossia ช่วยอันนี้ผมเองไม่แน่ใจเรื่องกลไกว่ามันไปทำยังไงถึงทำให้การจัดหน้า ตัดบรรทัดออกมาได้เหมือนกันขนาดนี้

ใช้ polyglossia

ลองเทียบกันแบบจะๆ ดู

pdfLaTeX + swath

XeLaTeX + Polyglossia + thai locale

การใช้ Font นอก

ปกติถ้าเราใช้ font จากในระบบของ TeX Live ก็เพียงพอสำหรับการเขียนตำรา เขียนบทความต่างๆ นอกเสียจากมีการกำหนดชนิด font ของผู้รับตีพิมพ์ ผมจะลองเอา font จาก Windows และ Fonts จาก Internet มาใช้ดูว่าจะแสดงผลได้สวยงามครบถ้วนเหมือนชุด Fonts-Tlwg หรือไม่

Angsana New (TTF)

ตัวแรกผมลอง Angsana New แบบ TrueType Font เท่าที่ดูค่อนข้างเก่ามากมี font script Thai ตัวเดียวด้วย

ผมสร้าง folder ชื่อ fonts ไว้ใน ที่เดียวกับ source code มี Angsana New มี files ทั้งหมด 4 แบบคือ

angsa.ttf angsab.ttf angsai.ttf angsaz.ttf
Enter fullscreen mode Exit fullscreen mode

fontspec ผมกำหนดดังนี้

\setmainfont[
  Path = fonts/,
  Extension = .ttf ,
  UprightFont = angsa,
  ItalicFont = angsai ,
  BoldFont = angsab ,
  BoldItalicFont = angsaz ,
  Script = Thai,
  Mapping=tex-text
]{Angsana New}
Enter fullscreen mode Exit fullscreen mode

Angsana NEW

เนื่องจาก fonts ภาษาไทยส่วนมากขนาดจะเล็กเมื่อเทียบกับ fonts ภาษาอังกฤษ และ fonts-tlwg ที่ถูก scale ให้เท่ากับ fonts ภาษาอังกฤษแล้ว ใน option ผมจะ scale ขึ้นไปให้เท่าๆ กับ Laksaman ตามแบบด้านล่าง

Scale=1.45
Enter fullscreen mode Exit fullscreen mode

Angsana New + Scaled

ผลที่ได้น่าพอใจคือใกล้เคียงกับ Laksaman

Tahoma (TTF)

สำหรับ Tahoma จะเป็น font ที่มี scale เท่ากับ fonts ภาษาอังกฤษอื่นๆ จึงไม่จำเป็นต้อง scale และ มี Script หลายภาษา แต่จะไม่มีค่า Default ดังนั้นตอนเรียกใช้อาจจะต้องแยกว่าจะเรียกแบบ Thai หรือ Latin

\setmainfont[
  Scale=1,
  Path = fonts/,
  Extension = .ttf ,
  UprightFont = tahoma,
  BoldFont = tahomabd ,
  Script = Thai,
  Mapping=tex-text
]{Tahoma}
Enter fullscreen mode Exit fullscreen mode

Angsana New (TTC)

นอกจาก font ที่มีนามสกุลเป็น ttf แล้ว windows ยังใช้ fonts ที่มีนามสกุลว่า ttc หรือ TrueType Collections คือ font เดียวมีครบทุก face นั่นเองแต่ info ยังคงเหมือน Angsana New ที่แยกเป็น ttf ครับคือมี script เดียวคือ Thai

\setmainfont[
  Scale=1.45,
  Path = fonts/,
  UprightFeatures = {FontIndex=0} ,
  BoldFeatures = {FontIndex=1} ,
  ItalicFeatures = {FontIndex=2} ,
  BoldItalicFeatures = {FontIndex=3} ,
  Script = Thai,
  Mapping=tex-text
]{angsana.ttc}
Enter fullscreen mode Exit fullscreen mode

Angsana New TTC

Browallia New (TTC)

อีกตัวอย่างแบบ TTC ของ font Browallia ซึ่งก็เหมือนกับ Angsana New

\setmainfont[
  Scale=1.45,
  Path = fonts/,
  UprightFeatures = {FontIndex=0} ,
  BoldFeatures = {FontIndex=1} ,
  ItalicFeatures = {FontIndex=2} ,
  BoldItalicFeatures = {FontIndex=3} ,
  Script = Thai,
  Mapping=tex-text
]{browalia.ttc}
Enter fullscreen mode Exit fullscreen mode

Browalloa New TTC

Trirong (Google Font TTF)

ลอง Download Font ไทยจาก Google มาลองดูบ้าง ผมสุ่มเอา Font Trirong มาทดสอบดูพบว่ามันมี Face ให้เลือกใช้เยอะมากซึ่งเราสามารถตั้งค่าเอามาใช้แบบละเอียดได้เช่น Black, Light ExtraBold เป็นต้น (ต้องขออ่านคู่มือเพิ่มเติม)

\setmainfont[
  Path = fonts/Trirong/ ,
  Extension = .ttf ,
  UprightFont = *-Light,
  ItalicFont = *-Italic ,
  BoldFont = *-Bold ,
  BoldItalicFont = *-BoldItalic ,
  Script = Default,
  Mapping=tex-text
]{Trirong}
Enter fullscreen mode Exit fullscreen mode

Google Trirong

การเลือกว่าจะจัดชุด font face ก็ขึ้นอยู่กับที่เราเลือกนะ เช่น เราอยากได้แค่เบาๆ ก็อาจจะใช้ UprightFont แบบ Light หรือ เพิ่มขึ้นหน่อยก็ Regular , Nornal หรือ Medium เป็นต้นลองเล่นกันดูครับ ส่วน font นี้มี script แบบ Default ให้ด้วยก็ตั้งค่าง่ายหน่อย

การใช้ Fonts หลาย ๆ แบบในเอกสาร

ใน Fonts-Tlwg มีหลาย Fonts ให้เลือกใช้ถ้าเราต้องการใช้หลายๆ แบบวิธี set แบบด้านบนอาจจะยุ่งอยากและไม่สามารถ Reuse ได้มีผู้เชี่ยวชาญท่านหนึ่งได้ทำตัวอย่างไว้ให้ผมเลยขอนำมาแนะนำต่อละกัน

** ต้นฉบับ (https://github.com/abhabongse/fonts-tlwg/blob/067c1e4f2625604fe31337c9bd2203f634c98560/latex/fonts-tlwg.sty)

Fontspec สามารถประกาศ Features ต่างๆ ไว้ก่อนได้แล้วนำไป Reuse และ ปรับค่า เพิ่มค่าได้ตามต้องการเช่น fonts ในชุด fonts-tlwg เราสามารถประกาศสั้นๆ แบบรวมทุก fonts ดังนี้

\defaultfontfeatures{
  Extension = .otf ,
  Mapping = tex-text,
  Script = Default
  }

% Font families with regular, oblique, bold, and bold-oblique.
\defaultfontfeatures[Garuda,Loma,Purisa,Sawasdee,TlwgMono,TlwgTypewriter,%
TlwgTypist,TlwgTypo,Umpush,Waree]{
ItalicFont = *-Oblique ,
BoldFont = *-Bold ,
BoldItalicFont = *-BoldOblique ,
}

% TlwgMono don't has Script Default
\defaultfontfeatures+[TlwgMono]{Script=Thai}

% Font families with regular, italic, bold, and bold-italic.
\defaultfontfeatures[Laksaman]{
ItalicFont = *-Italic ,
BoldFont = *-Bold ,
BoldItalicFont = *-BoldItalic ,
}
% Font families with regular, italic, oblique, bold, 
% bold-italic, and bold-oblique.
\defaultfontfeatures[Kinnari,Norasi]{
ItalicFont = *-Italic ,
SlantedFont = *-Oblique ,
BoldFont = *-Bold ,
BoldItalicFont = *-BoldItalic ,
BoldSlantedFont = *-BoldOblique ,
}

\setdefaultlanguage{thai}
\XeTeXlinebreaklocale "th"
\XeTeXlinebreakskip = 0pt plus 1pt \relax

\newfontfamily\thaifont{Norasi}
\newfontfamily\thaifontsf{Garuda}
\newfontfamily\thaifonttt{TlwgTypist}
Enter fullscreen mode Exit fullscreen mode

จากตัวอย่างข้างบนเป็นการกำหนด fonts หลักของเอกสาร 3 แบบโดยเราจะใช้ Polyglossia เป็นตัวช่วยในการจัดการให้โดยจะมี

  • Roman font \textrm \rmfamily → Norasi
  • SanSerif font \textsf \sffamily → Garuda
  • TypeWriter font \texttt \ttfamily → Tlwg Typist

ตัวอย่างการแสดงผล

\begin{description}
  \item[Roman] การพิมพ์ภาษาไทย -- English
  \item[\sffamily{}Sans] \sffamily การพิมพ์ภาษาไทย -- English
  \item[\ttfamily{}Typewriter] \ttfamily การพิมพ์ภาษาไทย -- English
\end{description}
Enter fullscreen mode Exit fullscreen mode

Fonts Roman, Sans และ TypeWriter

การแสดง fonts อื่นๆ ที่ไม่ใช่สามแบบนี้จะเราสามารถเรียกใช้ได้หลายแบบ แบบที่แนะนำคือการใช้คำสั่ง

\newfontfamily
Enter fullscreen mode Exit fullscreen mode

เช่นประกาศ fonts ต่างๆ

\newfontfamily\garuda{Garuda}
\newfontfamily\norasi{Norasi}
\newfontfamily\kinnari{Kinnari}
\newfontfamily\laksaman{Laksaman}
\newfontfamily\loma{Loma}
\newfontfamily\purisa{Purisa}
\newfontfamily\sawasdee{Sawasdee}
\newfontfamily\tlwgtypist{TlwgTypist}
\newfontfamily\tlwgtypo{TlwgTypo}
\newfontfamily\tlwgmono{TlwgMono}
\newfontfamily\tlwgtypewriter{TlwgTypewriter}
\newfontfamily\umpush{Umpush}[
  FontFace = {l}{n}{ Font = *-Light },
  FontFace = {l}{it}{ Font = *-LightOblique }
]
\newfontfamily\waree{Waree}
Enter fullscreen mode Exit fullscreen mode

เรียกใช้งาน

\begin{itemize}
  \item \kinnari Kinnari สวัสดีชาวโลก
  \item \garuda Garuda สวัสดีชาวโลก
  \item \norasi Norasi สวัสดีชาวโลก
  \item \laksaman Laksaman สวัสดีชาวโลก
  \item \purisa Purisa สวัสดีชาวโลก
  \item \loma Loma สวัสดีชาวโลก
  \item \sawasdee Sawasdee สวัสดีชาวโลก
  \item \tlwgtypewriter TlwgTypewriter สวัสดีชาวโลก
  \item \tlwgtypist TlwgtTypist สวัสดีชาวโลก
  \item \umpush Umpush สวัสดีชาวโลก
  \item \waree Waree สวัสดีชาวโลก
\end{itemize}
Enter fullscreen mode Exit fullscreen mode

ผล

Fonts ต่างๆของ TLWG

ถ้าสังเกตจะเห็นว่า font Umpush จะมีการกำหนดค่าพิเศษกว่าแบบอื่น คือจะมี fontseries Light และ Light Oblique เพิ่มเข้ามาซึ่งไม่สามารถกำหนดได้ใน \defaultfontfeatures แต่สามารถใช้วิธีในตัวอย่าง หรือ จะใช้วิธีก่อนหน้านี้คือ \setmainfont \setsansfont \setmonofont ก็ได้ถ้าไม่ใช้ PolyGlossia จัดการ fonts ให้

วิธีเรียกใช้ fontsereis และ fontshape

ปกติเราจะใช้ macro เช่น

\begin{description}
  \item[\textbf{ตัวหนา}] \bfseries ปาป่าป้าป๊าป๋า
  \item[\textit{ตัวเอียง}] \itshape ปาป่าป้าป๊าป๋า
\end{description}
Enter fullscreen mode Exit fullscreen mode

ตัวหนา ตัวเอียง

หรือจะใช้ \fontseries{}\fontshape{}\selectfont ก็ได้เช่น

\begin{itemize}
  \item \fontseries{m}\fontshape{n}\selectfont ปาป่าป้าป๊าป๋า
  \item \fontseries{m}\fontshape{it}\selectfont ปาป่าป้าป๊าป๋า
  \item \fontseries{b}\fontshape{n}\selectfont ปาป่าป้าป๊าป๋า
  \item \fontseries{b}\fontshape{it}\selectfont ปาป่าป้าป๊าป๋า
\end{itemize}
Enter fullscreen mode Exit fullscreen mode

รูปแบบหนาเอียงธรรมดา

ส่วน Umpush จะมีเพิ่มมาคือ \fontseries{l}\fontshape{n} และ \fontseries{l}\fontshape{it}

\begin{itemize}
  \item \umpush\fontseries{l}\fontshape{n}\selectfont ปาป่าป้าป๊าป๋า
  \item \umpush\fontseries{m}\fontshape{n}\selectfont ปาป่าป้าป๊าป๋า
  \item \umpush\fontseries{l}\fontshape{it}\selectfont ปาป่าป้าป๊าป๋า
  \item \umpush\fontseries{m}\fontshape{it}\selectfont ปาป่าป้าป๊าป๋า
  \item \umpush\fontseries{b}\fontshape{n}\selectfont ปาป่าป้าป๊าป๋า
  \item \umpush\fontseries{b}\fontshape{it}\selectfont ปาป่าป้าป๊าป๋า
\end{itemize}
Enter fullscreen mode Exit fullscreen mode

Umpush

ปิดท้ายด้วยตัวอย่างการใช้งาน Fonts รูปแบบต่างๆ ซึ่งต้นฉบับมาจากของพี่เทพพิทักษ์

PDF ตัวอย่าง

https://github.com/mrchoke/latex-workshop-medium/raw/main/latex2/file11.pdf

ต้นฉบับ

tlwg/fonts-tlwg

Source Code ที่ใช้ประกอบทั้งหมด

mrchoke/latex-workshop-medium

ถ้ามีเวลาจะมาทดสอบและบันทึกการเรียนรูปใน EP ต่อ ๆ ไปครับ เนื่องจากการเขียนเป็นรูปแบบการบันทึกการทดสอบอาจจะขาดตกบกพร่อง หรือ ผิดพลาดไปบ้างผมยินดีรับฟังคำชี้แนะ เพื่อการปรับแก้ให้สมบูรณ์ยิ่งขึ้น ขอบคุณครับ

Discussion (0)