Which fonts to use, where to get them, how to install them, and how to pair Thai with English.
XeLaTeX loads fonts by their system name, not by filename. This means fonts must be installed system-wide before XeLaTeX can find them. The steps below cover each platform.
The standard choice for Thai academic and government documents. Good Latin coverage for mixed documents. XeLaTeX font name: TH Sarabun New.
f0nt.com/release/th-sarabun-new/ — github.com/fontuni/boon (Boon, a refined derivative)
Serif Thai, similar in feel to Times. Already present in TeX Live Medium — no download needed. XeLaTeX font name: Norasi.
Sans-serif Thai. Good for presentations and headings. XeLaTeX font name: Garuda.
Part of the TeX Gyre collection. Included in TeX Live Medium and MacTeX — no download needed. XeLaTeX font name: TeX Gyre Pagella.
tex-gyre package but may not install automatically when referenced via \setmainfont{}. If you get a font-not-found error, run mpm --install=tex-gyre from a command prompt, or install it through the MikTeX Console package manager.
Direct download (all TeX Gyre families, Type 1 + OpenType, 20.7MB): ctan.org/pkg/tex-gyre
TeX Live Medium already includes Norasi, Garuda, and TeX Gyre Pagella. Only THSarabunNew needs manual installation. The steps below install it system-wide so XeLaTeX can find it by name.
/Library/Fonts/ for system-wide installation/usr/local/share/fonts/thai/ (create directory if needed)sudo fc-cache -fv to rebuild the font cachefc-list | grep -i sarabun — should show the font path and namesudo mkdir -p /usr/local/share/fonts/thai sudo cp THSarabunNew*.ttf /usr/local/share/fonts/thai/ sudo fc-cache -fv fc-list | grep -i sarabun
/usr/local/share/fonts/TTF/. Run fc-cache -fv without sudo if your user owns the directory.
XeLaTeX uses the font's internal name, not the filename. If \setmainfont{TH Sarabun New} fails, check what name the system registered:
fc-list | grep -i sarabun # Linux / macOS / FreeBSD
The string before the colon is the font file path; after the colon is the registered name. Use that name exactly in \setmainfont{}.
THSarabunNew.ttf but the internal name registered with fontconfig is TH Sarabun New. These are different. XeLaTeX wants the internal name.
In a mixed Thai-English document, fontspec lets you assign different fonts to different scripts. A common and reliable pairing:
\usepackage{fontspec}
\usepackage{polyglossia}
\setmainlanguage{thai}
\setotherlanguage{english}
\setmainfont{TH Sarabun New}[
Script=Thai,
BoldFont={TH Sarabun New Bold},
ItalicFont={TH Sarabun New Italic}
]
\newfontfamily\englishfont{TeX Gyre Pagella}[
Ligatures=TeX
]
With polyglossia, Thai text uses THSarabunNew automatically and English text switches to Pagella when inside an \textenglish{} block or an English-language environment.
| Thai font | English pair | character | notes |
|---|---|---|---|
| TH Sarabun New | TeX Gyre Pagella | serif, warm | best general pairing; similar weight and x-height |
| TH Sarabun New | TeX Gyre Termes | serif, neutral | Times-derived; more formal feel |
| Garuda | TeX Gyre Heros | sans-serif | Helvetica-derived; good for presentations |
| Norasi | TeX Gyre Termes | serif, classic | both Times-family; consistent but safe |