LaTeX 수식 글꼴 선택(newtxmath, unicode-math)

본문 서체를 Times로 바꿨는데 수식만 Computer Modern 그대로——LaTeX에서 수식 글꼴을 고를 때 누구나 처음 부딪히는 문제입니다. 더 성가신 부분은 그다음에 옵니다. mathptmx를 읽어들이고 “이제 Times로 통일됐다”고 여긴 PDF를 pdffonts로 확인해 보면 CMEX10이 여전히 묻혀 있습니다. 합 기호와 적분 기호만은 지금도 커누스의 서체 그대로입니다. 이 페이지에서는 pdfLaTeX용 수식 글꼴 패키지(newtxmath, mathpazo, fourier, kpfonts 등)와 XeLaTeX・LuaLaTeX의 unicode-math + \setmathfont실제로 무엇이 PDF에 들어갔는지 세어 가며 비교합니다. 수식 알파벳 명령(\mathbb, \bm 등)은 별도 페이지의 주제이고, 여기서 다루는 것은 문서 전체의 수식 서체를 어떻게 정할 것인가입니다.

본문 글꼴을 바꿔도 수식은 바뀌지 않습니다

LaTeX에서는 본문 글꼴과 수식 모드 글꼴이 완전히 별개의 체계로 관리됩니다. 그래서 \usepackage{...} 한 줄로 본문 서체를 바꿔도, 따로 지정하지 않는 한 변수도 연산자도 아래첨자도 Computer Modern 그대로입니다. 이는 게으름이 아니라 설계입니다. 수식 글꼴은 본문 글꼴에는 없는 정보——기호의 높이와 수학 축의 위치, 근호와 괄호를 늘리기 위한 “이음 조각”, 첨자를 내리는 폭, 분수선의 굵기 같은 수십 개의 치수——를 갖추어야 하며, 본문 서체를 그대로 가져다 수식을 조판할 수는 없습니다. 그래서 수식 서체를 바꾼다는 것은 곧 그 용도로 만들어진 수식 글꼴을 가져오는 일입니다.

실제로 무엇이 묻혔는가 — pdffonts로 세어 보기

수식 글꼴 패키지가 정말로 Computer Modern을 대체했는지는 PDF에 묻힌 글꼴을 세어 보면 단번에 알 수 있습니다. Poppler의 pdffonts(대부분의 환경에서 poppler-utils에 들어 있습니다)에 파일을 넘기기만 하면 됩니다. 같은 짧은 문서——본문 한 줄과 적분・합・그리스 소문자・그리스 대문자를 담은 별행 수식 하나——를 TeX Live 2024의 pdfLaTeX로 조판해 비교하니 결과가 깔끔하게 세 갈래로 나뉘었습니다. 완전히 대체하는 쪽(newtx, newpx, fourier, kpfonts, mathdesign), Computer Modern을 남기는 쪽(mathptmx, mathpazo, eulervm), 그리고 아무것도 하지 않으면 당연히 전부 Computer Modern입니다.

shell
# the only honest way to check which math font you actually shipped
pdflatex paper.tex
pdffonts paper.pdf

# name                                 type              emb sub uni
# ------------------------------------ ----------------- --- --- ---
# QSPJFW+NimbusRomNo9L-Regu            Type 1            yes yes yes
# CZKGAS+CMR10                         Type 1            yes yes yes   <- still Computer Modern
# UYVLXV+CMEX10                        Type 1            yes yes yes   <- the big operators
읽어들이는 것pdffonts가 보고한 수식 쪽 글꼴CM이 남는가
(none)CMR10 CMMI10 CMSY7 CMEX10 CMMI7 CMR7전부 CM. 기본 Computer Modern math
mathptmxNimbusRomNo9L StandardSymL CMR10 CMSY10 CMMI10 CMEX10남습니다. +=는 CMR10, \sum\int는 CMEX10
mathpazoURWPalladioL PazoMath CMR10 CMSY10 CMEX10남습니다. 큰 연산자는 CMEX10 그대로
newtxmathNewTXMI txsys txmiaX txexs NewTXMI7남지 않습니다. 본문 쪽은 TeXGyreTermesX-Regular
newpxmathNewPXMI pxsys pxmiaX txexs남지 않습니다. 확장 글꼴은 newtx와 같은 txexs이며 동일한 서브셋이 묻힙니다
fourierFourier-Math-Symbols / -Extension / -Letters남지 않습니다. 본문은 Utopia. 한 줄로 끝나는 구성
kpfontsKp-Regular Kp-Italic Kp-Ex Kp-Sy남지 않습니다. 본문도 수식도 Kp 계열뿐
eulervmEURM10 EUFM10 EUEX10 및 CMR10 CMR7남습니다. 문자・기호・큰 연산자는 Euler가 되지만 operators 족(숫자, 직립 로만)은 본문 서체 그대로
mathdesignMathDesign-CH-Regular 한 벌 전체남지 않습니다. [charter]면 본문은 CharterBT

기존 방식 — pdfLaTeX에서 본문과 수식을 짝짓기

pdfLaTeX에서 수식 서체를 바꾸는 표준적인 방법은 본문용 패키지와 수식용 패키지를 짝으로 읽어들이는 것입니다. 오늘날 가장 권하기 쉬운 것은 newtx 계열로, \usepackage{newtxtext}\usepackage{newtxmath}를 나란히 두면 Times 계열 본문과 어울리는 수식이 갖춰집니다. 다만 이름과 달리 newtxtext가 묻는 것은 Times 자체가 아니라 TeX Gyre Termes의 확장판입니다(pdffonts에는 TeXGyreTermesX-Regular로 나옵니다). Palatino라면 mathpazo, 또는 newpxtextnewpxmath를 씁니다. Charter를 쓰고 싶다면, xcharter-math.sty라는 파일은 존재하지 않습니다. pdfLaTeX에서는 \usepackage[xcharter]{newtxmath}처럼 newtxmath의 옵션으로 부르고, OpenType판 XCharter-Math.otf는 다음 절의 \setmathfont로 사용합니다. 같은 방식으로 libertine, libertinus, cochineal, erewhon, stix2, noto 등 여러 본문 서체에 맞출 수 있다는 점이 newtxmath의 강점입니다.

한 줄로 본문과 수식을 한꺼번에 바꾸고 싶다면 fourier(Utopia 본문 + Fourier 수식)와 kpfonts(Kepler 계열)가 확실합니다. 위 실측에서 두 패키지 모두 Computer Modern을 하나도 남기지 않았습니다. 반대로 조심해야 할 것은 본문만 바꾸는 패키지를 수식 패키지로 착각하는 일입니다. 예를 들어 pdfLaTeX에서 libertinus를 읽어들여도 수식은 CM 그대로이고, PDF에는 LibertinusSerif-Regular 옆에 CMMI10, CMR10, CMEX10이 함께 들어갑니다. 이 조합의 실측은 서구권 글꼴 페이지에 실려 있습니다. 또 하나의 사고는 짝이 아닌 본문과 수식을 섞는 것입니다. newtxtext(Times 계열)에 newpxmath(Palatino 계열)를 붙이면 두 글꼴 모두 정상으로 작동하지만, 지면에서는 글자 폭도 회색도(농도) 어긋나 어색해 보입니다.

document.tex
% --- Times-like text and matching math (the easy recommendation) ---
\usepackage{newtxtext}
\usepackage{newtxmath}

% --- Palatino text and math, in one package ---
% \usepackage{mathpazo}

% --- one line for both, with no Computer Modern left behind ---
% \usepackage{fourier}     % Utopia text + Fourier math
% \usepackage{kpfonts}     % the Kepler family

% --- match math to another text face through newtxmath ---
% \usepackage{libertinus}
% \usepackage[libertinus]{newtxmath}

현대 방식 — unicode-math\setmathfont

XeLaTeX나 LuaLaTeX라면 unicode-math를 읽어들이고 \setmathfont{…} 한 줄만 쓰면 수식 전체를 하나의 OpenType 수식 글꼴로 조판할 수 있습니다. 패키지 더미를 한꺼번에 걷어 내는 셈입니다. 엔진 제약은 실제로 존재합니다. pdfLaTeX에서 \usepackage{unicode-math}라고 쓰면 ! Package unicode-math Error: Cannot be run with pdftex!와 이어서 (unicode-math) Use XeLaTeX or LuaLaTeX instead.를 내고 멈춥니다. 이를 가능하게 하는 것은 OpenType의 MATH 테이블입니다. 분수선의 굵기, 첨자가 내려가는 폭, 근호 위 여백, 늘어나는 괄호를 조각으로 잇는 방식 등 TeX가 수식을 조판하는 데 필요한 치수 일습이 글꼴 파일 안에 들어 있는 규격이지요. 그 덕분에 글꼴을 바꾸면 조판 매개변수까지 함께 바뀝니다. 아무 글꼴도 지정하지 않으면 Latin Modern Math가 기본으로 읽힙니다.

읽어들이는 순서에 지뢰가 하나 있습니다. unicode-math 뒤에 amssymb를 읽어들이면 ! LaTeX Error: Command \eth already defined.를 필두로 \smallsetminus, \digamma, \backepsilon까지 같은 형태의 오류가 네 개 납니다(TeX Live 2024에서 실측). unicode-math가 이 기호들을 Unicode 쪽에서 먼저 정의해 두었는데 amssymb가 다시 정의하려다 충돌하기 때문입니다. 순서를 뒤집어 amsmathamssymbunicode-math로 놓으면 같은 문서가 오류 없이 통과합니다. “unicode-math는 언제나 글꼴 관련 패키지 뒤에”라고 기억해 두면 대부분의 사고를 피할 수 있습니다.

OpenType 수식 글꼴성격과 짝이 되는 본문 서체
Latin Modern MathComputer Modern 계보. 기본으로 읽힘. 짝은 Latin Modern Roman
TeX Gyre Termes MathTimes 풍. 짝은 TeX Gyre Termes. Pagella / Bonum / Schola / DejaVu 판도 있음
STIX Two Math과학 출판용으로 수록 범위가 넓음. 짝은 STIX Two Text. macOS에 기본 포함
Libertinus MathLibertinus Serif의 수식 짝. pdfLaTeX에서는 얻을 수 없는 조합
XCharter-MathCharter 계열. xcharter-math.sty는 없으며 OTF를 \setmathfont로 읽습니다
NewCMMath-RegularNew Computer Modern의 수식판. CM의 외관 그대로 훨씬 넓은 Unicode 지원
Fira Math산세리프 수식 글꼴. 발표 슬라이드나 포스터에서 본문과 맞출 때 유용
Asana-MathPalatino 쪽에 가까운 수식 글꼴. STIX 파생인 XITS와 함께 오래된 선택지

The font "Latin Modern Math" cannot be found — XeLaTeX와 LuaLaTeX의 차이

같은 \setmathfont{Latin Modern Math}가 LuaLaTeX에서는 통과하고 XeLaTeX에서는 ! Package fontspec Error: The font "Latin Modern Math" cannot be found.로 실패합니다. TeX Live 2024을 설치한 macOS에서 실측한 결과입니다. 원인은 글꼴 이름을 찾는 방식에 있습니다. LuaTeX은 TeX의 배포 디렉터리(TDS) 안에서 이름으로 글꼴을 찾을 수 있지만, XeTeX은 운영체제의 글꼴 데이터베이스에 묻기 때문에 TeX Live에 함께 들어 있어도 OS에 등록되지 않은 글꼴은 “찾을 수 없음”이 될 수 있습니다. 같은 시험에서 STIX Two Math만 XeLaTeX에서도 통과한 것은 macOS가 이 글꼴을 기본으로 갖고 있기 때문이었습니다. 엔진별 이름 해석의 차이는 fontspec 페이지가 자세히 다루므로 여기서는 대처만 적습니다. 파일 이름으로 지정(\setmathfont{latinmodern-math.otf})하거나, [Path=…]를 덧붙이거나, LuaLaTeX으로 옮기는 것입니다.

document.tex
% compile with lualatex (or xelatex, but see the note on name lookup)
\documentclass{article}
\usepackage{amsmath}
\usepackage{amssymb}       % must come BEFORE unicode-math
\usepackage{unicode-math}  % always after the font packages
\setmainfont{TeX Gyre Termes}       % text, via fontspec
\setmathfont{TeX Gyre Termes Math}  % the matching OpenType math font
% \setmathfont{latinmodern-math.otf} % by file name, if lookup by name fails
\begin{document}
\[ f(x) = \int_{-\infty}^{\infty} \hat f(\xi)\, e^{2\pi i x \xi}\, d\xi. \]
\end{document}

일부만 다른 글꼴에서 가져오기 — range=

고른 수식 글꼴에 필요한 글자가 없을 때는 \setmathfontrange= 옵션으로 모자란 범위만 다른 글꼴에서 보충할 수 있습니다. range=에는 Unicode 범위, range=\int 같은 단일 기호, range=\symbb(range=bb로도 씁니다) 같은 알파벳 양식, 나아가 range=bfit/{greek,Greek}처럼 양식과 문자 종류를 결합한 지정을 넘길 수 있습니다. 효과는 측정할 수 있습니다. Latin Modern Math를 주 글꼴로 두고 \setmathfont{STIX Two Math}[range=\symbb]를 더한 PDF를 pdffonts로 보면 LatinModernMath-RegularSTIXTwoMath-Regular둘 다 묻히고, 뒤쪽은 칠판 굵은 글자 몇 개만 담고 있습니다. 필요한 자리만 읽어들이는 설계라 이렇게 섞어도 PDF가 크게 부풀지 않습니다. 다만 주가 되는 수식 글꼴을 먼저 보통 방식으로 지정해 두는 것이 전제입니다.

document.tex
\usepackage{amsmath}
\usepackage{unicode-math}
\setmathfont{Latin Modern Math}                                % the main math font
\setmathfont{STIX Two Math}[range=\symbb]                     % blackboard bold only
\setmathfont{TeX Gyre Termes Math}[range=bfit/{greek,Greek}]  % bold-italic Greek only

결국 무엇을 고를까 — 본문과 수식을 “짝”으로

조언은 하나로 모입니다. 본문 글꼴과 수식 글꼴을 “짝”으로 고를 것. 어떤 엔진이든 이 원칙은 흔들리지 않습니다. 아무것도 하지 않으면 Computer Modern(pdfLaTeX) 또는 Latin Modern Math(unicode-math의 기본)가 되는데, 둘 다 충분히 아름답고 투고 규정이 서체를 지정하지 않는다면 바꿀 이유가 없습니다. pdfLaTeX에서 바꾼다면 서로를 위해 만들어진 것을 고르세요. Times는 newtxtext + newtxmath, Palatino는 mathpazonewpx 계열, Utopia는 fourier, Kepler는 kpfonts입니다. XeLaTeX나 LuaLaTeX라면 amsmathamssymbunicode-math 순으로 읽어들이고, \setmainfont\setmathfont같은 집안의 이름을 넘깁니다. 그리고 파일을 어디로 보내기 전에 반드시 pdffonts로 확인하세요. 내보냈다고 생각한 글꼴이 실제로 내보낸 글꼴이 아닐 수 있습니다. 이 페이지가 시작된 지점이 바로 그것이었습니다.

  • 아무것도 하지 않으면 Computer Modern(pdfLaTeX) 또는 Latin Modern Math(unicode-math 기본)가 됩니다. 규정이 없다면 바꿀 필요가 없습니다.
  • pdfLaTeX에서 바꾼다면 짝으로 만들어진 패키지를 씁니다. Times는 newtxtext + newtxmath, Palatino는 mathpazo, 한 줄로 끝내려면 fourierkpfonts.
  • XeLaTeX・LuaLaTeX라면 amsmathamssymbunicode-math 순으로 읽어들이고 \setmainfont\setmathfont를 같은 집안으로 맞춥니다.
  • 하지 말 것: 짝이 아닌 본문과 수식을 섞는 일(Times 본문에 Palatino 수식). 오류는 나지 않지만 지면에 드러납니다.
  • 마지막에는 반드시 pdffonts로 묻힌 글꼴을 확인합니다. mathptmxmathpazoCMEX10을 남깁니다.