물리나 양자역학 수식을 조판하다 보면 같은 모양이 반복해서 등장합니다. 도함수 d/dx, 편도함수 ∂/∂x, 절댓값이나 노름의 세로줄, bra와 ket, 그리고 위아래로 쌓인 텐서 첨자입니다. 이것들을 매번 \frac나 \left|로 직접 쓰는 것은 번거롭습니다. 이 페이지에서는 이런 표기를 기억하기 쉬운 명령으로 묶어 주는 세 패키지를 소개합니다. 도함수와 자동 크기 조절 구분자를 제공하는 physics, Dirac bra-ket 표기에 특화된 braket, 위첨자와 아래첨자를 깔끔하게 정렬하는 tensor 입니다. 편리하지만 특히 physics에는 표준 명령을 조용히 재정의하는 등의 함정이 있으므로 장점과 주의점을 함께 살펴봅니다.
physics 패키지란
physics 는 Sergio C. de la Barrera가 만든, 물리 수식을 빠르고 읽기 좋게 조판하기 위한 패키지입니다. 프리앰블에 \usepackage{physics} 한 줄을 쓰면 사용할 수 있습니다. 내부적으로 xparse와 amsmath가 필요하며, physics가 amsmath를 자동으로 읽기 때문에 따로 적을 필요는 없습니다. 목적은 명확합니다. 명령 이름만 보고도 무엇을 하는지 알 수 있게 하고, \frac{\mathrm{d}}{\mathrm{d}x} 같은 긴 상투 표현을 짧은 명령으로 바꾸는 것입니다.
\usepackage{physics}제공되는 명령은 크게 자동 크기 조절 구분자(\qty, \abs, \norm, \eval), 벡터 해석(\grad, \div, \curl, \laplacian), 도함수와 미분(\dv, \pdv, \dd), Dirac 표기(\bra, \ket, \braket), 그리고 행렬 매크로로 나뉩니다. 아래에서는 실제 수식 조판에서 가장 자주 쓰는 것들을 차례로 살펴봅니다. physics에는 설계상의 특성도 있으므로 끝부분에서 함께 정리합니다.
physics의 도함수와 미분
physics의 대표 기능은 도함수입니다. \dv는 상미분을 뜻하며 인수 개수에 따라 모양이 달라집니다. \dv{x}처럼 하나만 넘기면 연산자 d/dx를, \dv{f}{x}처럼 둘을 넘기면 df/dx를 조판합니다. 고계 미분은 선택 인수로 지정하여 \dv[2]{f}{x}는 d²f/dx², \dv[n]{f}{x}는 dⁿf/dxⁿ이 됩니다. 분자와 분모의 d는 기본적으로 직립체(로만체)로 조판되며, \usepackage[italicdiff]{physics}를 쓰면 이탤릭 d로 바뀝니다.
편미분은 \pdv로 쓰며 \dv와 같은 방식입니다. \pdv{f}{x}는 ∂f/∂x를, \pdv[2]{f}{x}는 ∂²f/∂x²를 조판합니다. 혼합 편미분은 인수 세 개를 넘겨 \pdv{f}{x}{y}처럼 쓰면 ∂²f/∂x∂y가 됩니다. 미분 요소 자체는 \dd이며, \dd{x}는 앞뒤 문맥에 맞는 간격을 가진 dx를, \dd[3]{x}는 d³x를 조판합니다. 적분 안에서는 \int f(x) \dd{x}처럼 씁니다.
\[
\dv{f}{x}, \qquad \dv[2]{f}{x}, \qquad
\pdv{f}{x}{y}, \qquad \int_0^1 f(x) \dd{x}
\]이 예는 왼쪽부터 df/dx, 2계 도함수 d²f/dx², 혼합 편미분 ∂²f/∂x∂y, 그리고 피적분 함수 뒤에 미분 요소 dx가 오는 0부터 1까지의 적분을 조판합니다. 인라인용으로 분수를 사선 형태로 쓰고 싶다면 별표가 붙은 \dv*{f}{x}를 사용하면 df/dx가 나란한 \flatfrac 형식으로 출력됩니다.
physics의 자동 구분자와 bra-ket
physics는 내용 높이에 맞춰 자동으로 커지는 구분자도 제공합니다. \abs{a}는 절댓값 |a|를, \norm{a}는 노름 ‖a‖를 내용에 맞는 크기로 조판합니다. 내부적으로 \left…\right에 해당하는 처리를 합니다. 크기를 수동으로 정하려면 \abs\Big{a}처럼 \big, \Big 등을 넣을 수 있고, 반대로 크기를 바꾸고 싶지 않으면 별표가 붙은 \abs*{a}를 씁니다. 평가 세로줄은 \eval이며, \eval{x}_0^\infty는 아래와 위 한계를 가진 세로줄을 만듭니다. 범용 구분자는 \qty(...)로, \qty(...), \qty[...], \qty{...}가 각각 둥근괄호, 대괄호, 중괄호에 대응합니다.
\[
\abs{\frac{a}{b}}, \qquad \norm{\vb{v}}, \qquad
\eval{x^2}_0^\infty, \qquad \qty( \frac{1}{2} )
\]이 예에서는 절댓값 세로줄이 분수 a/b의 높이에 맞춰 늘어나고, 노름의 이중 세로줄이 벡터 v를 감싸며, 평가 세로줄은 오른쪽에 0과 ∞를 달고 서 있고, 마지막 둥근괄호는 분수 1/2의 높이에 맞춰 커집니다.
Dirac 표기에서 기본 쌍은 \bra{\phi}와 \ket{\psi}입니다. physics의 설계상 \bra{\phi}\ket{\psi}처럼 사이에 공백 없이 쓰면 bra와 ket이 서로 “축약”되어 하나의 내적 ⟨φ|ψ⟩로 조판됩니다. 내적을 직접 쓰는 \braket{a}{b}(→ ⟨a|b⟩), 한 인수형 \braket{a}(→ ⟨a|a⟩, 노름), 외적 \ketbra{a}{b}(→ |a⟩⟨b|, \dyad의 별칭)도 제공됩니다. 모두 내용 높이에 맞춰 자동으로 크기가 정해지며, 별표를 붙이면 자동 크기 조절이 꺼집니다.
벡터 해석 연산자도 갖추고 있습니다. \grad는 그래디언트 ∇, \div는 발산 ∇·, \curl은 회전 ∇×, \laplacian은 라플라시안 ∇²입니다. 이들은 함수를 인수로 받아 \grad{\Psi}가 ∇Ψ처럼 조판됩니다. 다만 \div의 재정의에는 주의가 필요하며, 이는 다음 절에서 다룹니다.
physics의 주의점과 대안
physics는 편리하지만 표준 명령을 조용히 재정의 하므로 주의가 필요합니다. 대표적인 예가 \div입니다. 표준 LaTeX에서 \div는 나눗셈 기호 ÷이지만, physics는 이것을 발산 ∇·로 바꾸고 원래의 ÷는 \divisionsymbol로 옮깁니다. 삼각함수도 마찬가지로 재정의되어 \sin 등이 자동으로 괄호를 붙이는 형태가 됩니다. 이는 \usepackage[notrig]{physics}로 끌 수 있으며 원래 정의는 \sine 같은 긴 이름으로 남아 있습니다. \Re와 \Im도 바뀝니다. 이를 모르면 “늘 쓰던 기호가 나오지 않는다”고 당황할 수 있습니다.
또 하나의 잘 알려진 함정은 도함수가 바로 뒤의 괄호 묶음을 인수로 삼켜 버리는 동작입니다. physics에서는 \dv{x}(\Psi)처럼 도함수 뒤에 괄호를 이어 쓰는 방식이 “긴 형식”으로 정의되어, d/dx가 괄호 안의 내용에 작용하는 것으로 처리됩니다. 따라서 \dv{f}{x}(g)라고 쓰면 (g)가 독립된 인자가 아니라 \dv의 인수로 빨려 들어가 의도와 다른 출력이 됩니다. 이 동작은 tex.stackexchange에서도 자주 논의되어 개선판 physics-patch 패키지가 있을 정도입니다. 피하려면 뒤따르는 인자 앞에 공백을 넣거나 {}를 끼우거나, 괄호를 \qty()가 아닌 다른 방식으로 씁니다.
패키지끼리 충돌하는 경우도 있습니다. 특히 단위 조판의 표준인 siunitx는 최근 버전에서 quantity 명령 \qty를 도입했기 때문에 physics의 \qty와 이름이 충돌합니다. 동작은 읽는 순서에 따라 달라집니다. 이런 이유로 최근에는 physics 전체를 쓰기보다 목적별 전용 패키지를 고르는 방식도 널리 퍼졌습니다. 도함수에는 고계와 다변수 경우에 강한 derivative 패키지, 미분 연산자를 깔끔하게 조판하려면 fixdif, 그리고 Zhang Tingxuan의 physics2(2022년 첫 릴리스)가 대안입니다. physics2는 같은 영역을 ab(자동 괄호), ab.braket, diagmat, xmat 등의 기능별 모듈로 나누고 필요한 것만 \usephysicsmodule{...}로 읽는 설계입니다.
자동 크기 조절 구분자도 physics에 의존하지 않고 직접 이름 붙은 구분자를 정의 하는 방식이 있습니다. mathtools의 \DeclarePairedDelimiter를 쓰면 \DeclarePairedDelimiter{\abs}{\lvert}{\rvert}처럼 한 번 선언하는 것만으로 자신만의 \abs를 얻고, \abs{x}(기본 크기)와 \abs*{x}(\left…\right로 자동 확장)를 골라 쓸 수 있습니다. 표준 명령을 덮어쓰지 않아 안전하고 동작도 예측하기 쉬우므로 견고함을 중시하는 문서에서는 이 방식이 선호됩니다. 자세한 내용은 mathtools 페이지를 참고하세요.
braket 패키지
Dirac 표기만 가볍게 쓰고 싶다면 Donald Arseneau의 braket 패키지가 알맞습니다. physics처럼 큰 도구 모음이 아니라 bra-ket과 집합 표기에 집중한 작은 패키지이며 \usepackage{braket}로 읽습니다. 제공되는 명령은 두 계열입니다. 내용과 상관없이 크기가 일정한 고정 크기 소문자 버전 \bra{ }, \ket{ }, \braket{ }, \set{ }와, 내부에서 \left…\right를 사용해 내용을 감싸는 자동 확장 대문자 버전 \Bra{ }, \Ket{ }, \Braket{ }, \Set{ }입니다.
대문자 버전의 편리한 점은 인수 안에 세로줄 |를 그대로 쓰면 그 세로줄도 바깥 구분자와 함께 늘어난다는 것입니다. \Braket에서는 내부의 모든 |가 인수 높이에 맞춰 늘어나고, \Set에서는 첫 번째 |가 늘어납니다. 이중 세로줄이 필요하면 \| 또는 그 지역 별칭 ||를 씁니다.
\Braket{ \phi | \frac{\partial^2}{\partial t^2} | \psi }
\Set{ x \in \mathbf{R}^2 | 0 < {|x|} < 5 }이 예에서 앞의 것은 2계 편미분 연산자를 사이에 둔 행렬 원소 ⟨φ| ∂²/∂t² |ψ⟩를 조판하며, 바깥 꺾쇠괄호와 내부 두 세로줄이 모두 연산자의 높이에 맞춰 크게 늘어납니다. 뒤의 것은 집합 { x ∈ R² | 0 < |x| < 5 }를 조판하며, 바깥 중괄호와 구분 세로줄이 늘어납니다. 집합 안의 |x|는 고정 크기로 두고 싶어서 {|x|}처럼 중괄호로 감싸 보호합니다. physics와 달리 braket에는 외적용 \ketbra가 정의되어 있지 않습니다. 저자는 대신 \ket{ }\bra{ }라고 쓰는 것을 권합니다.
tensor 패키지
위첨자와 아래첨자가 섞인 텐서에서는 첨자의 가로 위치와 간격 이 의미를 가집니다. 예를 들어 Γ^μ_{νρ}나 R^μ_{ν}{}^ρ_σ에서는 위첨자와 아래첨자가 왼쪽부터 올바른 순서로 정렬되어야 합니다. 단순히 ^와 _를 이어 쓰면 위아래가 같은 위치에 겹쳐 어떤 첨자가 먼저인지 알 수 없습니다. 이를 해결하는 것이 Philip G. Ratcliffe의 tensor 패키지입니다. Mike Piff의 원본을 전면 개정한 v2.2이며, 외부 패키지가 필요 없고 \usepackage{tensor}로 사용할 수 있습니다.
중심 명령은 두 가지입니다. 가벼운 \indices는 텐서 본체 바로 뒤에 두고 첨자열만 받습니다. 예를 들어 M\indices{^a_b^{cd}_e}라고 쓰면 M 뒤에 위첨자 a, 아래첨자 b, 위첨자 cd, 아래첨자 e가 올바른 가로 위치를 유지하며 정렬됩니다. 첨자열 안에서는 ^(위첨자)와 _(아래첨자)를 그대로 사용하고, 여러 글자 첨자는 ^{cd}처럼 중괄호로 묶습니다. \sp와 \sb도 같은 역할을 합니다.
다른 명령 \tensor는 Mike Piff 원본과 하위 호환되는 형태로, 텐서 본체와 첨자열을 별도의 인수로 받습니다. \tensor{M}{^a_b^{cd}_e}는 위의 \indices 예와 완전히 같은 출력을 만듭니다. \tensor의 장점은 텐서의 앞 에도 첨자를 둘 수 있다는 점입니다. 선택 첫 인수에 앞쪽 첨자열을 넘기면 \tensor[^a_b^c_d]{M}{^e_f^g_h}처럼 본체 M의 앞과 뒤 양쪽에 첨자를 정렬할 수 있습니다.
\[
M\indices{^a_b^{cd}_e}, \qquad
\tensor{M}{^a_b^{cd}_e}, \qquad
\tensor[^a_b^c_d]{M}{^e_f^g_h}
\]세 경우 모두 위아래 첨자가 겹치지 않고 왼쪽부터 올바른 순서로 어긋나며 배열됩니다. 마지막 예만 M 앞에도 첨자 묶음이 붙습니다. \indices와 \tensor에는 별표 형태가 있어 \indices*와 \tensor*가 첨자 사이의 간격을 줄여 더 표준적인 모양으로 되돌립니다. 또한 첨자열의 맨 앞 에 *를 두면 이어지는 위/아래 첨자 쌍이 왼쪽 정렬됩니다. 위치가 지나치게 벌어지는 것을 줄이고 싶을 때 씁니다.
덧붙여 텍스트와 수식 모드 모두에서 쓸 수 있는 \nuclide도 정의되어 있습니다. \nuclide[14][6]{C}라고 쓰면 질량수 14와 원자번호 6을 원소 기호 C의 왼쪽 위와 왼쪽 아래에 붙인 ¹⁴₆C를 조판합니다. 두 숫자는 모두 생략할 수 있습니다. 여러 토큰으로 된 첨자는 중괄호로 묶어야 하며, \mathrm 같은 구성도 \indices{_{\mathrm{H}}^x}처럼 전체를 중괄호로 감싸야 합니다.