본문 서체를 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입니다.
# 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 |
mathptmx | NimbusRomNo9L StandardSymL CMR10 CMSY10 CMMI10 CMEX10 | 남습니다. +와 =는 CMR10, \sum・\int는 CMEX10 |
mathpazo | URWPalladioL PazoMath CMR10 CMSY10 CMEX10 | 남습니다. 큰 연산자는 CMEX10 그대로 |
newtxmath | NewTXMI txsys txmiaX txexs NewTXMI7 | 남지 않습니다. 본문 쪽은 TeXGyreTermesX-Regular |
newpxmath | NewPXMI pxsys pxmiaX txexs | 남지 않습니다. 확장 글꼴은 newtx와 같은 txexs이며 동일한 서브셋이 묻힙니다 |
fourier | Fourier-Math-Symbols / -Extension / -Letters | 남지 않습니다. 본문은 Utopia. 한 줄로 끝나는 구성 |
kpfonts | Kp-Regular Kp-Italic Kp-Ex Kp-Sy | 남지 않습니다. 본문도 수식도 Kp 계열뿐 |
eulervm | EURM10 EUFM10 EUEX10 및 CMR10 CMR7 | 남습니다. 문자・기호・큰 연산자는 Euler가 되지만 operators 족(숫자, 직립 로만)은 본문 서체 그대로 |
mathdesign | MathDesign-CH-Regular 한 벌 전체 | 남지 않습니다. [charter]면 본문은 CharterBT |
기존 방식 — pdfLaTeX에서 본문과 수식을 짝짓기
pdfLaTeX에서 수식 서체를 바꾸는 표준적인 방법은 본문용 패키지와 수식용 패키지를 짝으로 읽어들이는 것입니다. 오늘날 가장 권하기 쉬운 것은 newtx 계열로, \usepackage{newtxtext}와 \usepackage{newtxmath}를 나란히 두면 Times 계열 본문과 어울리는 수식이 갖춰집니다. 다만 이름과 달리 newtxtext가 묻는 것은 Times 자체가 아니라 TeX Gyre Termes의 확장판입니다(pdffonts에는 TeXGyreTermesX-Regular로 나옵니다). Palatino라면 mathpazo, 또는 newpxtext와 newpxmath를 씁니다. 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 계열)를 붙이면 두 글꼴 모두 정상으로 작동하지만, 지면에서는 글자 폭도 회색도(농도) 어긋나 어색해 보입니다.
% --- 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가 다시 정의하려다 충돌하기 때문입니다. 순서를 뒤집어 amsmath → amssymb → unicode-math로 놓으면 같은 문서가 오류 없이 통과합니다. “unicode-math는 언제나 글꼴 관련 패키지 뒤에”라고 기억해 두면 대부분의 사고를 피할 수 있습니다.
| OpenType 수식 글꼴 | 성격과 짝이 되는 본문 서체 |
|---|---|
Latin Modern Math | Computer Modern 계보. 기본으로 읽힘. 짝은 Latin Modern Roman |
TeX Gyre Termes Math | Times 풍. 짝은 TeX Gyre Termes. Pagella / Bonum / Schola / DejaVu 판도 있음 |
STIX Two Math | 과학 출판용으로 수록 범위가 넓음. 짝은 STIX Two Text. macOS에 기본 포함 |
Libertinus Math | Libertinus Serif의 수식 짝. pdfLaTeX에서는 얻을 수 없는 조합 |
XCharter-Math | Charter 계열. xcharter-math.sty는 없으며 OTF를 \setmathfont로 읽습니다 |
NewCMMath-Regular | New Computer Modern의 수식판. CM의 외관 그대로 훨씬 넓은 Unicode 지원 |
Fira Math | 산세리프 수식 글꼴. 발표 슬라이드나 포스터에서 본문과 맞출 때 유용 |
Asana-Math | Palatino 쪽에 가까운 수식 글꼴. 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으로 옮기는 것입니다.
% 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=
고른 수식 글꼴에 필요한 글자가 없을 때는 \setmathfont의 range= 옵션으로 모자란 범위만 다른 글꼴에서 보충할 수 있습니다. range=에는 Unicode 범위, range=\int 같은 단일 기호, range=\symbb(range=bb로도 씁니다) 같은 알파벳 양식, 나아가 range=bfit/{greek,Greek}처럼 양식과 문자 종류를 결합한 지정을 넘길 수 있습니다. 효과는 측정할 수 있습니다. Latin Modern Math를 주 글꼴로 두고 \setmathfont{STIX Two Math}[range=\symbb]를 더한 PDF를 pdffonts로 보면 LatinModernMath-Regular와 STIXTwoMath-Regular가 둘 다 묻히고, 뒤쪽은 칠판 굵은 글자 몇 개만 담고 있습니다. 필요한 자리만 읽어들이는 설계라 이렇게 섞어도 PDF가 크게 부풀지 않습니다. 다만 주가 되는 수식 글꼴을 먼저 보통 방식으로 지정해 두는 것이 전제입니다.
\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는 mathpazo나 newpx 계열, Utopia는 fourier, Kepler는 kpfonts입니다. XeLaTeX나 LuaLaTeX라면 amsmath → amssymb → unicode-math 순으로 읽어들이고, \setmainfont와 \setmathfont에 같은 집안의 이름을 넘깁니다. 그리고 파일을 어디로 보내기 전에 반드시 pdffonts로 확인하세요. 내보냈다고 생각한 글꼴이 실제로 내보낸 글꼴이 아닐 수 있습니다. 이 페이지가 시작된 지점이 바로 그것이었습니다.
- 아무것도 하지 않으면 Computer Modern(pdfLaTeX) 또는 Latin Modern Math(
unicode-math기본)가 됩니다. 규정이 없다면 바꿀 필요가 없습니다. - pdfLaTeX에서 바꾼다면 짝으로 만들어진 패키지를 씁니다. Times는
newtxtext+newtxmath, Palatino는mathpazo, 한 줄로 끝내려면fourier나kpfonts. - XeLaTeX・LuaLaTeX라면
amsmath→amssymb→unicode-math순으로 읽어들이고\setmainfont와\setmathfont를 같은 집안으로 맞춥니다. - 하지 말 것: 짝이 아닌 본문과 수식을 섞는 일(Times 본문에 Palatino 수식). 오류는 나지 않지만 지면에 드러납니다.
- 마지막에는 반드시
pdffonts로 묻힌 글꼴을 확인합니다.mathptmx와mathpazo는CMEX10을 남깁니다.