fontspec(Xe/Lua)

fontspec은 OS에 설치된 OpenType / TrueType 글꼴을 서체 이름으로 직접 부를 수 있게 해 주는 패키지입니다. \setmainfont{Some Font}라고 쓰기만 하면 본문 서체가 바뀌고, 합자나 숫자 스타일 같은 OpenType 기능도 key=value 옵션으로 사용할 수 있습니다. 단, 확실한 전제가 있습니다. XeLaTeX 또는 LuaLaTeX가 필요하며 예전 pdfLaTeX에서는 동작하지 않습니다. 이 페이지에서는 읽어들이는 법, 로마체/산세리프/등폭 지정, 추가 패밀리 정의, 파일 지정과 기능 옵션을 차례로 살펴봅니다.

fontspec이란, 그리고 필요한 엔진

전통적인 TeX는 그 시대에 맞게 준비된 전용 형식의 글꼴만 다룰 수 있었고, 시스템에 있는 서체를 그대로 사용할 수 없었습니다. fontspecOS에 설치되어 있거나 프로젝트 안에 둔 OpenType / TrueType 글꼴을 서체 이름(또는 파일 이름)으로 지정해 사용할 수 있게 하는 패키지입니다. 이 선택을 LaTeX의 NFSS(글꼴 선택 체계)에 연결하고, 굵은꼴/이탤릭 자동 전환과 OpenType의 고급 조판 기능까지 함께 처리합니다.

무엇보다 먼저 알아야 할 제약이 있습니다. fontspec은 Unicode와 시스템 글꼴을 네이티브로 다루는 XeLaTeX 또는 LuaLaTeX에서만 동작합니다. pdfLaTeX(pdftex)에서는 사용할 수 없습니다. pdfLaTeX에서 \usepackage{fontspec}을 시도하면 오류가 납니다. 문서가 어떤 엔진으로 처리되는지 확인하고, 필요하면 lualatex / xelatex로 컴파일하세요. 새로 시작한다면 일본어 지원까지 고려해 LuaLaTeX가 무난한 기본값입니다.

읽어들이는 방법은 단순히 \usepackage{fontspec}입니다. XeLaTeX와 LuaLaTeX에서는 클래스나 다른 패키지를 통해 이미 자동으로 읽혀 있는 경우가 많습니다. 명시적으로 써도 문제 없습니다.

본문, 산세리프, 등폭 글꼴 정하기

문서 전체의 세 가지 기본 서체는 프리앰블에서 다음 세 명령으로 지정합니다. \setmainfont{…}는 로마체(본문 기본 서체), \setsansfont{…}는 산세리프체(\textsf\sffamily가 부르는 서체), \setmonofont{…}는 등폭/타자기체(\texttt\ttfamily의 서체)입니다. 인수에는 시스템에 등록된 글꼴 이름을 그대로 씁니다.

document.tex
% xelatex か lualatex でコンパイルする
\documentclass{article}
\usepackage{fontspec}
\setmainfont{TeX Gyre Termes}   % 本文(ローマン体)
\setsansfont{TeX Gyre Heros}    % サンセリフ体
\setmonofont{TeX Gyre Cursor}   % 等幅体
\begin{document}
This is the main font; \textsf{this is sans}; \texttt{this is mono}.
\end{document}

fontspec은 서체 이름에서 굵은꼴과 이탤릭에 해당하는 글꼴을 자동으로 찾아 \textbf, \textit, 그리고 그 조합에 할당합니다. 평소처럼 \textbf{…}\emph{…}를 쓰면 지정한 서체 패밀리의 굵은꼴과 이탤릭이 사용됩니다. 또한 이 명령들을 프리앰블에 두면 \mathrm 같은 수식 안 로마체에도 같은 서체가 적용됩니다(LaTeX는 이 처리 단계에서 수식 글꼴을 확정하므로 프리앰블의 지정만 효과가 있습니다). 수식 자체의 서체는 별도로 관리되며, 아래의 unicode-math로 설정합니다.

추가 패밀리와 일회성 지정

본문/산세리프/등폭 세 가지 외의 서체를 쓰고 싶을 때는 \newfontfamily로 새 전환 명령을 정의합니다. 첫 번째 인수에는 만들 명령 이름(직접 정하는 백슬래시가 붙은 이름)을, 두 번째 인수에는 서체 이름을 씁니다.

document.tex
\usepackage{fontspec}
\newfontfamily\titlefont{TeX Gyre Bonum}
\newfontfamily\quotefont{TeX Gyre Schola}
% ...
\titlefont A heading in Bonum

{\quotefont A quoted passage in Schola.}

이렇게 정의한 \titlefont\rmfamily와 같은 선언형 명령으로, 이후의 문자에 서체를 적용합니다. 범위를 제한하고 싶으면 {\titlefont …}처럼 중괄호로 감쌉니다. 한 번만 쓸 서체라면 정의하지 않고 \fontspec{Font Name}을 그 자리에서 선언으로 사용할 수도 있습니다. 다만 매번 글꼴을 다시 읽어들이므로 반복해서 쓰는 서체는 \newfontfamily로 정의하는 편이 효율적입니다.

서체 이름으로 고르기 / 파일로 고르기

글꼴 지정에는 두 가지 방법이 있습니다. 하나는 OS에 등록된 서체 이름으로 고르는 방법으로, \setmainfont{TeX Gyre Termes}처럼 이름을 그대로 씁니다. 간편하지만 상대방의 환경에도 같은 서체가 들어 있어야 합니다. 다른 하나는 파일로 고르는 방법으로, 프로젝트 안에 글꼴 파일을 포함해 확실히 같은 출력을 얻고 싶을 때 적합합니다.

파일로 지정할 때는 옵션에 Path=(글꼴이 있는 디렉터리)와 Extension=(.otf.ttf 같은 확장자)을 주고, 각 웨이트와 스타일의 파일을 UprightFont=, BoldFont=, ItalicFont=, BoldItalicFont=로 할당합니다. 이 값에 쓰는 별표 *는 두 번째 인수에 쓴 공통 파일 이름(기본 이름)으로 대체되는 자리표시자입니다.

document.tex
\usepackage{fontspec}
% プロジェクト内の fonts/ に置いた OTF を、ファイル名で指定する
\setmainfont{LibreBaskerville}[
  Path       = ./fonts/ ,
  Extension  = .otf ,
  UprightFont    = *-Regular ,
  BoldFont       = *-Bold ,
  ItalicFont     = *-Italic ,
  BoldItalicFont = *-BoldItalic ,
]

이 예에서는 기본 이름 LibreBaskerville가 각 값에 전개되어 fonts/LibreBaskerville-Regular.otf, fonts/LibreBaskerville-Bold.otf 등이 읽힙니다. 아래 표는 두 지정 방법의 차이를 정리합니다.

지정 방법쓰는 법어울리는 상황
By name\setmainfont{Font Name}; OS 등록 이름빠르게 작업; 내 환경의 초안과 개인 문서
By filePath / Extension / *Font로 포함된 파일 지정재현성 중시; 공동 집필, 배포, CI, 자작 또는 미등록 글꼴

옵션으로 OpenType 기능 사용하기

OpenType 글꼴에는 합자, 숫자 스타일, 작은 대문자 같은 조판 기능이 들어 있으며, fontspec에서는 이를 key=value 옵션으로 불러옵니다. 대표적으로 유용한 것은 다음과 같습니다.

  • Ligatures= — 합자를 제어합니다. Ligatures=TeX는 `--를 en dash로, ---를 em dash로, TeX식 따옴표를 굽은 따옴표로 바꾸는 **TeX식 입력 변환**을 활성화합니다(표준 설정에서 기본으로 켜져 있는 경우도 많습니다). 그 밖에 Common(fi, fl 등 표준 합자), Rare/Discretionary(선택 합자), Historic`이 있습니다.
  • Numbers= — 숫자 스타일입니다. OldStyle(본문에 어울리는 크고 작은 구식 숫자) 또는 Lining(높이가 고른 현대 숫자)을 Proportional(비례 폭) 또는 Monospaced(등폭)와 조합해 지정합니다.
  • Letters=SmallCaps — 작은 대문자입니다. Letters=Uppercase 같은 값도 사용할 수 있습니다.
  • StylisticSet= — 글꼴이 제공하는 대체 글리프 세트(Stylistic Set)를 번호로 선택합니다.
  • Scale= — 확대/축소 비율입니다. 숫자 외에도 Scale=MatchLowercase(소문자 높이에 맞춤), Scale=MatchUppercase(대문자 높이에 맞춤)가 편리하며, 보조 글꼴의 크기를 본문 글꼴에 맞출 수 있습니다.
  • Script= / Language= — 비라틴 문자나 언어별 조형 규칙을 선택합니다(예: Script=Arabic).

이들은 서체를 설정하는 명령의 옵션, 즉 두 번째 인수의 대괄호 안에 씁니다. 다음은 본문 서체에 TeX식 합자구식 숫자를 적용한 예입니다.

document.tex
\usepackage{fontspec}
\setmainfont{TeX Gyre Pagella}[
  Ligatures = TeX ,
  Numbers   = OldStyle ,
]
% サンセリフは本文に大きさをそろえて読み込む
\setsansfont{TeX Gyre Heros}[Scale = MatchLowercase]

문서 전체가 아니라 특정 범위에만 기능을 더하고 싶을 때는 \addfontfeature{…}(여러 개라면 \addfontfeatures{…})를 사용합니다. 이는 현재 서체에 지정한 기능을 국소적으로 추가하는 명령이며, 중괄호로 감싼 범위에만 효과가 있습니다.

latex
In a table we want {\addfontfeature{Numbers={Lining,Monospaced}} 01234 56789} aligned.

수식과 일본어: 따로 다루는 글꼴

fontspec이 담당하는 것은 본문(텍스트)의 라틴 서체입니다. 별도로 구성되는 영역이 두 가지 있습니다.

하나는 수식 서체입니다. XeLaTeX나 LuaLaTeX에서 수식까지 OpenType 글꼴로 맞추고 싶다면 fontspec과 별도로 unicode-math 패키지를 읽어들이고, \setmathfont{…}로 OpenType 수식 글꼴(Latin Modern Math, STIX Two Math 등)을 지정합니다. 본문의 \setmainfont와 수식의 \setmathfont는 역할이 분리되어 있다고 기억하면 좋습니다. 자세한 내용은 수식 글꼴 페이지를 참조하세요.

다른 하나는 일본어(일문)입니다. \setmainfont가 설정하는 것은 라틴 서체뿐이며 일본어 서체에는 효과가 없습니다. LuaLaTeX에서는 fontspec의 일본어판이라고 할 수 있는 luatexja-fontspec 패키지를 사용하고, \setmainjfont{…}(명조, 일본어 본문), \setsansjfont{…}(고딕), \newjfontfamily 같은 “j(Japanese)”가 붙은 명령으로 일본어 글꼴을 지정합니다. 옵션은 대체로 fontspec과 공통입니다. 즉 라틴 문자는 \setmainfont, 일본어는 \setmainjfont라는 두 계통을 함께 쓰는 것입니다. 일본어 글꼴의 자세한 내용은 일본어 페이지에서 다룹니다.