과학기술 분야의 수식에는 무엇을 이탤릭으로, 무엇을 직립(로만)으로 조판할지에 대한 국제적 약속이 있고, 그것을 정한 것이 ISO 80000-2이며 일본에서는 JIS Z 8000-2로 채택되어 있습니다. 규칙 자체는 한 줄로 말할 수 있습니다. 변할 수 있는 양은 이탤릭, 의미가 정해진 것은 직립. 그런데 LaTeX로 자연스럽게 쓰면 이 규칙을 만족하는 것과 만족하지 않는 것이 깔끔하게 갈립니다. \sin도 \partial도 숫자도 기본값으로 이미 옳지만, 자연로그의 밑 e, 허수 단위 i, 미분의 d, 원주율 π는 기본값이 이탤릭——곧 부적합입니다. 이 페이지에서는 표준이 요구하는 바와, \mathrm{d}x・\uppi・isomath・unicode-math의 math-style=ISO로 LaTeX을 맞추는 방법을, 실제로 PDF에서 문자 코드를 꺼내 확인해 가며 정리합니다.
ISO 80000-2와 JIS Z 8000-2(옛 JIS Z 8201)
ISO 80000-2(Quantities and units — Part 2: Mathematics)는 수학 기호의 의미와 조판 방식(서체)을 함께 정하는 국제 표준입니다. 현행은 2019년판(제2판, 초판은 2009년)이며 2021년 11월에 정오 반영판이 발행되었습니다. 일본은 이를 동일 표준으로 채택해 JIS Z 8000-2:2022「양 및 단위—제2부: 수학 기호」를 2022년에 제정했고, 40년 넘게 쓰이던 JIS Z 8201:1981은 2022년 3월 22일에 폐지되었습니다. 오래된 교과서나 사내 규정에는 여전히 JIS Z 8201, 또는 그 원류인 ISO 31-11의 이름이 보이지만, 지금 근거로 삼아야 할 것은 ISO 80000-2 / JIS Z 8000-2입니다.
왜 표준이 서체까지 정할까요? 수학에서는 서체 자체가 의미를 지니기 때문입니다. e는 문맥에 따라 변수 e일 수도 있고 자연로그의 밑 2.718…일 수도 있는데, 변수를 이탤릭으로, 상수를 직립으로 구분해 쓰면 주석 없이도 알아볼 수 있습니다. 표준은 이 구분을 전 세계 공통 규칙으로 고정해 논문・교과서・기술 문서 사이에서 표기가 흔들리지 않게 합니다. 그리고 이 흔들림은 실질적인 해를 낳습니다. 양의 기호와 단위 기호가 같은 서체로 나란히 놓이면 m이 질량인지 미터인지 독자는 알 수 없습니다. LaTeX로 수식을 조판하는 것은 표준 준수의 좋은 출발점입니다. 수식 모드에서는 영문자가 자동으로 기울고, \sin 같은 함수명과 일반 숫자는 처음부터 직립으로 조판되기 때문입니다.
기본 원칙 — 변하는 것은 이탤릭, 정해진 것은 직립
표준의 중심에는 하나의 생각만 있습니다. 문맥에 따라 값이 변할 수 있는 양은 이탤릭, 의미나 값이 하나로 정해진 것은 직립으로 조판합니다. x, y 같은 변수, a, b처럼 그 순간에는 상수로 취급하는 매개변수, 일반 함수 기호 f, g는 모두 값이 고정되어 있지 않으므로 이탤릭입니다. 이는 LaTeX 수식 모드의 기본값 그대로이므로 아무것도 하지 않아도 표준을 따르게 됩니다. 반대편에는 값이 확정된 수학 상수(e, i, π), 미분 연산자 d와 관련 기호(편미분 ∂ 등), 체계적으로 정의된 함수명(sin, exp, ln, Γ), 그리고 숫자와 단위 기호가 직립으로 놓입니다. 표준의 입장은 단순합니다. 이들은 변수가 아니므로 변수의 서체를 입어서는 안 된다는 것입니다.
판단이 애매할 때 가장 빠른 검사는 “이 기호를 다른 글자로 바꿔도 되는가”입니다. x를 t로 바꿔도 식의 의미는 그대로입니다. 그러니 변수이고 이탤릭입니다. 하지만 적분의 dx에 있는 d는 다른 글자로 바꿀 수 없습니다. 의미가 정해진 연산자이므로 직립입니다. 같은 검사로 \sin의 s도, \mathrm{kg}의 k도 바꿀 수 없다는 사실이 설명됩니다.
직립과 이탤릭 한눈에 — LaTeX 기본값은 어디까지 맞는가
결론부터 말하면, LaTeX가 기본값으로 만족하는 것은 함수명, 편미분 ∂, 숫자, 대문자 그리스 문자이고, 직접 손봐야 하는 것은 e, i, π, 미분 연산자 d, 단위, 벡터・텐서입니다. 아래 표에서 “기본 OK”는 일반 수식 모드만으로 표준대로 조판된다는 뜻이고, “대응 필요”는 명시적으로 직립화(또는 굵은 이탤릭화)해야 한다는 뜻입니다.
| 대상 | 표준의 서체 | LaTeX에서 쓰는 법 |
|---|---|---|
variables | 변수・양 x, y, t는 이탤릭 | x(수식 모드 기본값 — OK) |
parameters | 매개변수와 일반 함수 a, b, f, g는 이탤릭 | a, f(x)(기본값 — OK) |
\mathrm{e} | 자연로그의 밑 e는 직립 | \mathrm{e}. 그냥 e는 이탤릭이라 부적합. 대응 필요 |
\mathrm{i} | 허수 단위 i(전기 분야에서는 j)는 직립 | \mathrm{i} / \mathrm{j}. 대응 필요 |
\uppi | 상수로서의 π는 직립 | \uppi(upgreek 또는 unicode-math). 그냥 \pi는 이탤릭. 대응 필요 |
\mathrm{d} | 미분 연산자 d는 직립 | \mathrm{d}x. 그냥 d는 이탤릭이라 부적합. 대응 필요 |
\partial | 편미분 기호 ∂는 직립 | \partial(이미 직립 — OK) |
\sin | 정의된 함수 sin, exp, ln은 직립 | \sin, \exp, \ln(이미 직립 — OK) |
\Gamma | 함수로 쓰는 대문자 그리스 문자 Γ는 직립 | \Gamma(표준 LaTeX에서 기본 직립 — OK. 다만 아래 절 참조) |
digits | 숫자 0–9는 직립 | 123(이미 직립 — OK) |
\unit | 단위 기호 m, kg, s는 직립 | siunitx의 \unit{} / \qty{}{}. 대응 필요 |
\vectorsym | 벡터와 행렬 a, A는 굵은 이탤릭 | \bm{a} 또는 isomath의 \vectorsym{a}. 대응 필요 |
\tensorsym | 텐서 T는 산세리프 굵은 이탤릭 | isomath의 \tensorsym{T}. 대응 필요 |
\mathrm{d}x — 미분의 d와 상수 e・i를 직립으로
가장 많이 나오는 질문의 답은 짧습니다. \mathrm{…}으로 감싸면 됩니다. LaTeX 수식 모드에서 e, i, d는 단순한 영문자라 이탤릭 변수로 조판되지만, \mathrm{e}, \mathrm{i}, \mathrm{d}로 쓰면 직립이 되어 변수 e나 d와 뚜렷이 구분됩니다. 적분에서는 \int_0^1 x^2 \,\mathrm{d}x처럼 가는 공백 \,를 넣는 것이 관례입니다(표준이 공백의 양까지 정하지는 않지만, 가독성을 위해 널리 행해집니다). 여기서 하나 바로잡습니다. \mathup이라는 명령을 볼 때가 있는데, 이것은 isomath이 정의하는 것이 아닙니다. unicode-math가 \mathup을 \mathrm의 별칭으로 정의하고, kpfonts나 mismath 등도 각자 갖고 있습니다. 실측에서도 unicode-math 환경에서 \mathrm{d}, \mathup{d}, \symup{d} 셋 모두 U+0064(그냥 직립 d)를 냈고, 맨 d만 U+1D451(수식 이탤릭 d)이 되었습니다. 즉 \mathup은 \mathrm의 다른 이름일 뿐 별개의 무엇이 아닙니다.
매번 \mathrm{d}를 치는 것은 번거롭고, 어딘가에서는 반드시 빠뜨리게 됩니다. 그래서 프리앰블에 짧은 명령을 한 번만 정의해 두는 것이 정석입니다. \newcommand{\dd}{\mathrm{d}}라고 해 두면 본문에서는 \dd x라고만 쓰면 되고, 나중에 방침이 바뀌어도 정의 한 줄만 고치면 문서 전체가 따라옵니다. 반대로 본문 곳곳에 \mathrm{d}를 직접 써 넣으면, 누군가 “역시 이탤릭 d로 되돌리자”고 말하는 날 손쓸 방법이 없습니다. 표준에 맞추는 일은 곧 약속에 이름을 붙여 한곳에서 관리하는 일이라고 생각하세요.
% define once in the preamble
\newcommand{\dd}{\mathrm{d}} % upright differential operator
\newcommand{\eu}{\mathrm{e}} % base of the natural logarithm
\newcommand{\iu}{\mathrm{i}} % imaginary unit
% ...
\[
\eu^{\iu\uppi} + 1 = 0, \qquad
\frac{\dd}{\dd x}\,\eu^{x} = \eu^{x}, \qquad
\int_0^{\infty} \eu^{-x}\,\dd x = 1.
\]\uppi의 함정 — 직립 π는 다른 서체를 데려옵니다
원주율 π를 표준대로 직립으로 만드는 정석은 upgreek 패키지의 \uppi이지만, 여기에는 놓치기 쉬운 대가가 있습니다. upgreek은 기본적으로 Euler Roman을 사용합니다. 패키지 안의 \ExecuteOptions{Euler}가 그것으로, 실제로 \usepackage{upgreek} 후 $\uppi$를 조판한 PDF를 pdffonts로 보면 EURM10——헤르만 차프가 설계한 Euler 계열 서체——가 묻힙니다. Computer Modern으로 조판한 문서에 그 π 하나만 다른 디자이너의 서체가 섞이는 셈입니다. 신경이 쓰인다면 \usepackage[Symbol]{upgreek}으로 URW Symbol(StandardSymL)에서 가져올 수 있습니다. 어느 쪽이 나은지는 본문 서체에 달렸으니 반드시 출력을 보고 정하세요.
하나 더 알아 두면 좋은 것은 upgreek이 제공하는 것이 그리스 소문자뿐이라는 점입니다. \upalpha부터 \upomega까지는 갖춰져 있지만 \upGamma는 정의되어 있지 않아 쓰면 ! Undefined control sequence.가 납니다. 이는 부족이 아니라 설계입니다. 표준 LaTeX에서 대문자 그리스 문자는 애초에 직립이기 때문입니다. 또한 unicode-math를 쓴다면 upgreek은 필요 없습니다. 그 패키지가 \uppi도 \upGamma도 \symup{…}의 약칭으로 자동 생성합니다.
대문자 그리스 문자가 직립인 것은 ISO가 아니라 TeX의 관습
표준 LaTeX에서는 \Gamma, \Omega 같은 대문자 그리스 문자가 직립으로 조판됩니다. 이는 커누스가 정한 TeX의 전통이지 ISO 80000-2의 요구가 아닙니다. 표준의 생각으로는 변수로 쓰는 대문자 그리스 문자(예컨대 각도 Θ)는 다른 변수와 마찬가지로 기울어야 하고, 직립이어도 되는 것은 Γ 함수처럼 이름이 확정된 함수뿐입니다. 구조는 놀랄 만큼 단순합니다. 표준 LaTeX에서 \Gamma는 \mathchar"7000, 곧 족 0(직립인 operators 족)에 놓여 있습니다. isomath이 내부에서 읽어들이는 fixmath(Walter Schmidt 작성)는 이를 \mathchar"7100으로 바꿀 뿐입니다. 16진수 한 자리가 바뀌면서 대문자 그리스 문자가 족 1(수식 이탤릭인 letters 족)로 옮겨 갑니다. 덤으로 \mathbf 같은 수식 알파벳 명령도 대문자 그리스 문자에 통하게 됩니다.
isomath을 통째로 읽어들이고 싶지 않다면, pdfLaTeX에서는 수식 글꼴 패키지의 옵션으로 같은 결과를 얻을 수 있는 경우가 많습니다. newtxmath에는 slantedGreek과 uprightGreek이 있고, 실측에서 \usepackage[slantedGreek]{newtxmath}를 읽으면 \Gamma가 \mathchar"7100으로 바뀌었습니다(기본값은 \mathchar"7400). 프랑스식 조판에 맞추는 frenchmath 옵션도 있습니다. 어느 방법을 고르든 중요한 것은 대문자 그리스 문자의 기울기를 문서 전체에서 한 번 정하고 도중에 바꾸지 않는 것입니다. 같은 논문 안에서 Θ가 이탤릭이었다가 직립이었다가 하면 독자는 “다른 양인가” 하고 생각하게 됩니다.
math-style=ISO는 무엇을 바꾸는가 — 실측한 문자 코드
XeLaTeX나 LuaLaTeX에서 unicode-math를 쓴다면 서체 방침 전체를 math-style=이라는 키 하나로 바꿀 수 있습니다. 값은 TeX(기본), ISO, french, upright, literal 다섯 가지입니다. 효과는 짐작이 아니라 측정할 수 있습니다. 아래 표는 LuaLaTeX에서 $\Gamma\ \alpha\ A\ a\ \partial\ \pi$를 조판하고 PDF에서 문자를 꺼내 Unicode 부호 위치를 나열한 것입니다. math-style=ISO로 바꾸면 대문자 그리스 문자 Γ가 U+0393(직립)에서 U+1D6E4(수식 이탤릭)로 옮겨 가는 것이 한눈에 보입니다. 바로 이 지점이 표준과 TeX의 전통이 부딪히는 자리입니다.
| 지정 | 대문자 그리스 Γ | 소문자 그리스 α | 편미분 ∂ | 라틴 소문자 a |
|---|---|---|---|---|
math-style=TeX | U+0393 직립 | U+1D6FC 이탤릭 | U+1D715 이탤릭 | U+1D44E 이탤릭 |
math-style=ISO | U+1D6E4 이탤릭 | U+1D6FC 이탤릭 | U+1D715 이탤릭 | U+1D44E 이탤릭 |
math-style=french | U+0393 직립 | U+03B1 직립 | U+2202 직립 | U+1D44E 이탤릭 |
math-style=upright | U+0393 직립 | U+03B1 직립 | U+2202 직립 | U+0061 직립 |
이 표에서 두 가지를 읽어 낼 수 있습니다. 첫째, math-style=ISO로 해도 π는 이탤릭 그대로(U+1D70B)입니다. 표준에서 상수 π는 직립이지만, unicode-math에는 “이 π가 상수인지 변수인지” 판별할 방법이 없습니다. 그래서 앞 절의 \uppi(또는 \symup{\pi})는 ISO로 지정한 뒤에도 여전히 필요합니다. 둘째, math-style=french라는 값이 존재한다는 사실 자체가 흥미롭습니다. 프랑스의 조판 관례는 그리스 문자를 대소문자 모두 직립으로, 라틴 대문자도 직립으로 조판합니다. “올바른 서체”가 하나뿐이 아니라 지역의 전통이 있다는 것을 패키지가 하나의 값으로 인정하고 있는 셈입니다. 굵은꼴에는 별도의 키 bold-style=이 있으며, 기본값 TeX에서는 \symbf{v}가 굵은 직립(U+1D42F)이 됩니다. 표준대로 굵은 이탤릭 벡터를 원한다면 bold-style=ISO를 지정하거나 \symbfit(U+1D497)을 쓰세요.
% compile with xelatex or lualatex
\usepackage{amsmath}
\usepackage[math-style=ISO,bold-style=ISO]{unicode-math}
\setmathfont{STIX Two Math}
% ...
\[
\symup{e}^{\symup{i}\uppi} + 1 = 0, \qquad
\int_0^1 x^2 \,\symup{d}x = \frac{1}{3}, \qquad
\symbfit{v} = \symbfit{A}\,\symbfit{x}.
\]벡터는 굵은 이탤릭, 텐서는 산세리프 굵은 이탤릭
표준은 양의 “종류”에 따른 서체도 정합니다. 벡터와 행렬의 기호는 굵은 이탤릭, 텐서의 기호는 산세리프 굵은 이탤릭입니다. 여기서 가장 큰 함정은 흔히 쓰는 \mathbf{v}가 굵은 직립을 낸다는 점입니다. 이는 표준이 말하는 굵은 이탤릭이 아닙니다. 손쉬운 해결은 bm 패키지의 \bm{v}로, 기울임을 유지한 채 굵기만 더합니다. 표준에 더 충실하게 가려면 isomath가 있고, \vectorsym{v}, \matrixsym{A}, \tensorsym{T}라는 의미로 이름 붙인 명령을 쓸 수 있습니다. 이 명명은 실무에서 효과가 있습니다. 반년 뒤에 원고를 다시 읽을 때 \bm{A}는 A가 행렬인지 벡터인지 그냥 강조인지 알려 주지 않지만, \matrixsym{A}는 한눈에 알려 줍니다.
다만 isomath은 조용히 두 가지 일을 합니다. 첫째, \mathbf을 굵은 이탤릭으로 재정의합니다(OML 인코딩의 bx/it). 표준에 맞는 변경이지만, \mathbf을 “직립 굵은체”로 쓰던 기존 원고를 통과시키면 모양이 달라지므로 도중에 도입할 때는 전문을 다시 살펴보세요. 둘째, 내부에서 fixmath을 읽으므로 대문자 그리스 문자가 이탤릭이 됩니다. 한 가지 더, Computer Modern에는 수식용 산세리프 굵은 이탤릭이 없어서 \tensorsym을 쓰면 로그에 Font shape OML/cmbr/bx/it in size <10> not available이라는 글꼴 대체 정보가 남습니다(오류가 아닙니다). 실측에서는 cmbright 계열이 대신 쓰였습니다. 텐서를 많이 쓰는 문서라면 대체된 그 서체로 정말 괜찮은지 한 번 확인해 볼 가치가 있습니다.
\usepackage{isomath} % loads fixmath: capital Greek becomes italic
% NOTE: isomath also redefines \mathbf as bold ITALIC (OML bx/it)
% ...
\[
\vectorsym{v} = \matrixsym{A}\,\vectorsym{x},
\qquad
\tensorsym{T}_{ij}.
\]실무 방침 — 어디까지 따르고 어디서 타협할 것인가
표준을 엄격히 따를지 관행에 맞출지는 문서의 성격에 달렸습니다. 판단 근거는 분명합니다. 투고처나 사내 규정이 ISO/JIS 준수를 요구하는가? 요구한다면 아래 방침으로 정리하면 충분합니다. 요구하지 않는다면 부분 적용도 얼마든지 합리적입니다. 예컨대 \mathrm{d}만 도입해도 분야를 가리지 않고 가독성이 좋아집니다. 무엇을 고르든 방침은 한 문서 안에서 통일하세요. 같은 기호가 한 쪽에서는 이탤릭이고 다음 쪽에서는 직립인 것만큼 독자를 혼란스럽게 하는 것은 없습니다.
- e, i, d는 직립으로. 프리앰블에서
\dd,\eu,\iu를\mathrm{…}으로 정의하고 본문에는 짧은 명령만 씁니다. - π를 엄격히 하려면
upgreek의\uppi를 씁니다. 다만 기본값에서는 Euler Roman의 글자꼴이 섞이므로[Symbol]옵션과 견주어 보고 정하세요. - 단위는 siunitx에 맡깁니다. 손으로 쓴
\mathrm{…}을 피하고\unit{}과\qty{}{}를 씁니다. 간격도 복합 단위도 애초에 표준대로 맞습니다. - 벡터와 행렬은 굵은 이탤릭.
\mathbf(굵은 직립)이 아니라\bm, 또는 표준을 따르는isomath의\vectorsym/\matrixsym/\tensorsym. - 함수명, 편미분 기호, 숫자는 손댈 것이 없습니다.
\sin,\cos,\log,\lim,\partial,123은 이미 표준을 만족합니다. 자기 함수명을 더할 때는amsmath의\DeclareMathOperator{\rank}{rank}를 쓰면 같은 직립과 간격을 얻습니다. - 대문자 그리스 문자는 한 번 정하고 움직이지 않습니다. 기울이려면
isomath(fixmath경유),newtxmath의slantedGreek, 또는math-style=ISO.
마지막으로 physics 패키지에 대해 한마디. 미분의 \dd와 도함수의 \dv를 직립으로 손쉽게 내주니 매력적으로 보이지만, 명령 이름이 다른 패키지와 충돌하는 것으로 알려져 있습니다. 실측에서도 physics와 siunitx를 함께 읽어들이자 \qty의 정의를 두고 다투면서 ! Missing $ inserted.와 ! Extra }, or forgotten $.가 났습니다(이를 보완하는 physics-patch가 있고, 최근에는 derivative 패키지 같은 대안도 쓰입니다). 이 이야기는 physics 전용 페이지에서 자세히 다룹니다. 단위 자체는 siunitx 페이지가 주인이므로, 복합 단위나 유효숫자까지 들어가려면 그쪽을 읽어 보세요. 서체가 무엇을 의미하는지 의식하고 일관되게 적용하는 것——결국 표준 준수의 본질은 그것뿐입니다.