LaTeX에서 {\bf\it x}라고 써도 굵은 이탤릭이 되지 않습니다. 이탤릭만 됩니다. 순서를 바꿔 {\it\bf x}로 하면 이번에는 이탤릭이 사라지고 정체 볼드가 남습니다. 옛 두 글자 명령에는 이렇게 더해지지 않는 성질이 있고, 그 이유는 article.cls 493행에 낱말 하나로 적혀 있습니다. 그 줄을 읽는 순간, 현대 LaTeX이 모든 글꼴 전환을 왜 두 가지 형태로 갖추고 있는지까지 한 줄기로 이해됩니다. 이 페이지에서는 그 명령들이 패밀리·시리즈·셰이프라는 세 개의 독립된 축 위에 어떻게 놓여 있는지, 인수를 받는 \textbf{...}와 범위로 작동하는 선언 \bfseries를 어떻게 가려 쓸지, 그리고 굵은 스몰캐피털을 요청했는데 보통 볼드가 나올 때 로그가 무엇을 말하고 있는지를 실측값과 함께 살펴봅니다.
\textbf{...}와 \bfseries의 차이
같은 전환이 두 가지로 마련되어 있습니다. \text…으로 시작하는 명령형은 인수를 받고 그 중괄호 안에만 작용합니다. …family / …series / …shape으로 끝나는 선언형은 인수를 받지 않고, 그 지점부터 감싸고 있는 그룹이나 환경이 끝날 때까지 계속 작용합니다. 고르는 기준은 범위의 길이입니다. 몇 낱말이면 \textbf{여기만}, 문단 전체나 환경 전체면 {\bfseries …} 또는 \begin{quote}\itshape …\end{quote}입니다. 선언형을 그룹으로 감싸는 것을 잊으면 문서 끝까지 작용한 채로 남으므로, {와 }의 짝만은 반드시 확인하십시오. 패키지와 클래스 내부에서 선언형을 선호하는 것도, 아무것도 덧붙이지 않고 범위 관리를 호출하는 쪽에 맡길 수 있기 때문입니다.
% command form: for a short span
This is \textbf{bold} and this is \textit{italic}.
% declaration form: a group limits the scope
Normal here. {\bfseries Bold from here on.} Back to normal.
% declaration applied to a whole environment
\begin{quote}
\itshape The whole quotation is set in italic.
\end{quote}범위 말고도 두 형태에는 실질적인 차이가 하나 더 있습니다. 명령형은 이탤릭 보정을 자동으로 넣고, 선언형은 넣지 않습니다. 기울어진 글자는 겉모양이 오른쪽 위로 삐져나오는데 조판상의 너비에는 그만큼이 포함되지 않으므로, 뒤에 정체 글자가 오면 부딪힙니다. 실측하면 \textit{f}h는 10.74167pt, {\itshape f}h는 8.62222pt로, 2.11945pt의 차이가 통째로 모자란 공백입니다. 선언형을 쓴다면 기울어진 범위 끝에 \/를 직접 씁니다({\itshape f\/}h는 10.74167pt가 되어 명령형과 일치했습니다). 이 보정이 무슨 일을 하는지는 강조 페이지에서 자세히 다룹니다.
패밀리·시리즈·셰이프 — 글꼴을 정하는 세 축
LaTeX2e의 글꼴은 서로 독립적인 세 속성의 조합으로 정해집니다. 패밀리(family)는 글자의 골격, 시리즈(series)는 굵기와 폭, 셰이프(shape)는 기울기나 모양입니다. 한 축을 바꿔도 나머지 둘은 그대로 — 이 직교성이 구조의 핵심이고, 그래서 “산세리프인 채로 굵게”, “굵은 채로 이탤릭으로”가 자연스럽게 써집니다. 이 방식은 NFSS(New Font Selection Scheme) 로 1989년에 등장해 1993년에 두 번째 판이 나왔고, 1994년 LaTeX2e에 표준으로 실렸습니다. 그 이전의 LaTeX 2.09에는 글꼴 속성이라는 개념 자체가 없었습니다. 시리즈가 “굵기”만이 아니라 “폭”까지 포함하는 한 축이라는 점은 기억해 두면 쓸모가 있습니다. Computer Modern의 볼드가 bx(bold extended, 굵고 넓은)라는 두 글자로 표기되는 것이 그 때문입니다.
- 패밀리(family) — 로만체(세리프 있음)
\textrm/\rmfamily, 산세리프체\textsf/\sffamily, 타자기체(고정폭)\texttt/\ttfamily. - 시리즈(series) — 미디엄(기본 굵기)
\textmd/\mdseries, 볼드\textbf/\bfseries. 속성값은 굵기와 폭을 나란히 적은 두 글자 이내의 문자열로,m(medium),b(bold),bx(bold extended),c(condensed) 등이 있습니다. - 셰이프(shape) — 정체(기본값)
\textup/\upshape, 이탤릭\textit/\itshape, 슬랜트\textsl/\slshape, 스몰캐피털\textsc/\scshape. 속성값은 차례로n,it,sl,sc입니다. - 이탤릭과 슬랜트는 다른 것입니다.
\itshape은 따로 그려진 활자(Computer Modern이라면cmti10)를 불러오고,\slshape은 정체를 기계적으로 기울인 활자(cmsl10)를 불러옵니다. 글자 모양 자체가 달라서, 이를테면 이탤릭의a는 한 층짜리입니다.
| 키 | 축과 효과 | 명령형(짧은 범위) | 선언형(그룹으로 구분) |
|---|---|---|---|
roman | 패밀리: 로만체(세리프 있음) | \textrm{...} | {\rmfamily ...} |
sans | 패밀리: 산세리프체 | \textsf{...} | {\sffamily ...} |
typewriter | 패밀리: 타자기체(고정폭) | \texttt{...} | {\ttfamily ...} |
bold | 시리즈: 볼드(속성값 bx 등) | \textbf{...} | {\bfseries ...} |
medium | 시리즈: 미디엄(기본값, 속성값 m) | \textmd{...} | {\mdseries ...} |
italic | 셰이프: 이탤릭(속성값 it) | \textit{...} | {\itshape ...} |
slanted | 셰이프: 슬랜트(속성값 sl) | \textsl{...} | {\slshape ...} |
small caps | 셰이프: 스몰캐피털(속성값 sc) | \textsc{...} | {\scshape ...} |
upright | 셰이프: 정체로 복귀(속성값 n) | \textup{...} | {\upshape ...} |
reset all | 세 축을 모두 문서 기본값으로 되돌리기 | \textnormal{...} | {\normalfont ...} |
굵게와 이탤릭을 동시에 적용하기
\textbf{\textit{...}}이라고 쓰면 굵은 이탤릭이 됩니다. 순서는 어느 쪽이든 좋고, 선언형이라면 {\bfseries\itshape ...}처럼 나란히 놓기만 하면 됩니다. 축이 독립적이므로 나중에 쓴 쪽이 앞의 지정을 지우는 일은 없습니다. 실측으로 확인하면 \textbf{\textit{Y}} 안쪽에서는 시리즈가 bx 그대로이고 셰이프만 it이 되어, Computer Modern의 굵은 이탤릭 cmbxti10이 읽혀 들어옵니다. 세 축을 모두 쓰면 \textsf{\textbf{\textit{...}}}로 산세리프 굵은 이탤릭도 됩니다. 다만 “쓸 수 있다”와 “글꼴이 가지고 있다”는 별개의 문제로, 지정한 조합의 활자가 없으면 LaTeX은 가까운 것으로 대체합니다. 그것이 다음 절의 이야기입니다.
% nest the command forms
\textsf{\textbf{\textit{Bold sans-serif italic}}}
% or list the declarations in one group (equivalent)
{\sffamily\bfseries\itshape Bold sans-serif italic\/}
% one word back to the document default inside a sans-serif run
{\sffamily A heading-like line with one \textnormal{normal} word}세 축을 한꺼번에 문서 기본값으로 되돌리는 것이 \textnormal{...}(명령형)과 \normalfont(선언형)입니다. 산세리프 제목 안에 표준 글꼴로 한 낱말만 넣고 싶을 때 같은 상황에서 씁니다. 한 축만 되돌리고 싶다면 그 축의 기본값을 가리키는 명령 — \rmfamily, \mdseries, \upshape — 을 부릅니다. 겸사겸사 알아 두면 좋은 사실은, latex.ltx의 11158행부터 11170행까지가 \DeclareTextFontCommand 호출의 나열이며, 여기 든 \text…가 전부 대응하는 선언에서 기계적으로 만들어진다는 점입니다. 같은 나열에는 \textulc(대소문자로 복귀)와 \textsw(스워시체)도 들어 있지만, 이 자형을 실제로 갖춘 글꼴은 매우 드뭅니다.
\bf와 \it이 조합되지 않는 이유
\bf의 정의 안에 \normalfont이 들어 있기 때문입니다. article.cls 490행부터 496행에는 옛 두 글자 명령이 이렇게 늘어서 있습니다. \DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}, \DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}, 이하 \rm·\sf·\tt·\sl·\sc도 같은 형태입니다. 즉 \bf는 “굵게 하라”는 명령이 아니라 “세 축을 모두 기본값으로 되돌린 다음 굵게 하라”는 명령입니다. {\bf\it x}를 조판하면 \it 속에 숨은 \normalfont이 바로 앞의 \bfseries를 통째로 버립니다. 실측에서도 시리즈가 bx에서 m으로 돌아가고 셰이프만 it이 남았습니다. 순서를 뒤집은 {\it\bf x}에서는 셰이프가 n으로 돌아가고 시리즈만 bx가 남습니다. 옛것과 새것을 섞은 \textbf{\tt x}도 마찬가지로, 패밀리는 cmtt가 되지만 시리즈는 m으로 돌아가 \textbf이 조용히 무효가 됩니다.
% the old two-letter commands do not stack
{\bf\it x} % italic only -- the bold is thrown away
{\it\bf x} % upright bold -- the italic is thrown away
\textbf{\tt x} % typewriter, medium weight -- \textbf silently lost
% the modern commands do stack
{\bfseries\itshape x}
\textbf{\ttfamily x}이 비직교성은 결함이 아니라 1994년 이전 LaTeX 2.09의 글꼴 모델을 그대로 보존한 것입니다. 당시에는 “지금 선택된 글꼴”이 속성의 조합이 아니라 하나의 이름이었으므로, 전환은 언제나 통째로 바꾸는 일이었습니다. LaTeX2e는 1994년에 축별로 쌓을 수 있는 현재의 명령을 도입했고, 옛 명령은 \DeclareOldFontCommand를 통해 기존 문서를 깨뜨리지 않기 위한 호환 계층으로 남겨 두었습니다. 실제로 지금도 오류 없이 동작합니다. 동작하지만 조합되지 않는다는 것 — 이것이 곤란한 점으로, {\bf\it 중요}라고 쓴 사람은 굵은 이탤릭을 의도했고 PDF를 볼 때까지 알아채지 못합니다. 또한 \DeclareOldFontCommand의 세 번째 인수는 수식 모드에서의 의미로, \bf는 수식 안에서 \mathbf처럼 작동합니다. 본문과 수식에서 의미가 달라진다는 점도 이들을 피할 이유 가운데 하나입니다. 새로 쓰는 코드에서는 반드시 \textbf / \bfseries 계열을 쓰십시오.
Font shape ... undefined가 나올 때
철자 오류 보고가 아니라, “요청한 조합의 활자가 글꼴에 없다”는 통지입니다. 전형은 굵은 스몰캐피털로, 기본 OT1 인코딩의 Computer Modern에는 bx와 sc를 겸한 활자가 없습니다. \textsc{\textbf{...}}를 조판하면 아래 로그처럼 Font shape 줄과 using ... instead 줄이 짝을 이루어 나옵니다. LaTeX은 오류로 멈추지 않고 스몰캐피털을 버린 채 보통 볼드로 계속 조판합니다. 그래서 PDF를 보고 나서야 “지정한 스몰캐피털이 나오지 않았다”는 것을 알아채게 됩니다. 같은 이유로 \textsw{...}도 OT1/cmr/m/sw가 정의되어 있지 않다는 경고를 냅니다.
LaTeX Font Warning: Font shape `OT1/cmr/bx/sc' undefined
(Font) using `OT1/cmr/bx/n' instead on input line 8.
LaTeX Font Warning: Some font shapes were not available, defaults substituted.이 특정 경고에는 거의 한 줄로 끝나는 해결책이 있습니다. \usepackage[T1]{fontenc}을 넣으십시오. T1 인코딩용 Computer Modern(EC 글꼴)은 굵은 스몰캐피털을 가지고 있어서, 같은 \textsc{\textbf{...}}가 경고 없이 통과합니다. 실제로 [T1]{fontenc}을 읽어 들여 다시 조판하니 로그에서 글꼴 경고가 사라졌습니다. T1은 서양어의 악센트 문자와 하이픈 분철 처리도 개선하므로, 서양어 문서라면 언젠가는 넣게 되는 지정입니다. 경고가 다른 조합을 가리킬 때는 먼저 로그의 OT1/cmr/bx/sc 같은 네 부분 이름(인코딩/패밀리/시리즈/셰이프)을 읽어 어느 축이 모자란지 짚습니다. 그런 다음 그 축을 가진 글꼴로 바꿀지, 요구를 한 단계 낮출지, 대체를 받아들일지 정하고, 정한 바를 메모로 남겨 둡니다.
% OT1 Computer Modern has no bold small caps -> warning + silent fallback
% T1 (the EC fonts) does have it
\usepackage[T1]{fontenc}
\textsc{\textbf{Bold Small Capitals}}
% low-level NFSS: name the four attributes, then commit with \selectfont
{\fontfamily{cmr}\fontseries{bx}\fontshape{sc}\selectfont Explicit}마지막 두 줄이 보여 주듯, \textbf 같은 상위 명령은 내부에서 NFSS의 하위 명령으로 전개됩니다. \fontfamily{...}, \fontseries{...}, \fontshape{...}이 속성을 고쳐 쓰고, \selectfont이 그 시점의 네 속성으로 글꼴을 실제로 고릅니다. 속성을 설정하기만 해서는 아무 일도 일어나지 않으며, \selectfont을 부르기 전까지 글꼴은 바뀌지 않습니다. 평소에 이 층을 직접 만질 일은 없지만, 특정 활자를 이름으로 불러내고 싶을 때나 경고의 네 부분 이름이 무엇을 가리키는지 확인하고 싶을 때 쓸모가 있습니다. 인코딩의 뜻이나 실제 글꼴 파일을 읽어 들이는 방법은 글꼴 시스템 페이지에 맡깁니다.
일본어 글꼴 전환 — 명조체와 고딕체
pLaTeX / upLaTeX에서는 일본어 텍스트가 서양어와 별도의 축을 가지며, 패밀리 축에는 명조체 \textmc / \mcfamily와 고딕체 \textgt / \gtfamily 두 가지가 있습니다. 정의는 plcore.ltx 1471행부터이며, 일본어 전용 속성인 \kanjifamily를 전환합니다. 흥미로운 것은 \bfseries를 일본어에 걸었을 때의 동작입니다. 실측하면 일본어 패밀리는 mc(명조) 그대로이고 시리즈만 bx가 됩니다. 그리고 jy1mc.fd 25행에 \DeclareFontShape{JY1}{mc}{bx}{n}{<->ssub*gt/m/n}{}이라고 적혀 있어, “명조의 볼드”를 요구하면 고딕의 기본 굵기가 대신 쓰이도록 정의되어 있습니다. 즉 “굵게 했더니 고딕이 되었다”는 것은 우연도 임시변통도 아니고, 글꼴 정의 파일에 그렇게 명시된 공식 대체입니다. 일본어의 강조를 전통적으로 굵기가 아니라 “글꼴 전환”으로 표시해 온 사정이 구현에 그대로 반영되어 있습니다.
원고에서의 운용 규칙
본문에 직접 쓰는 글꼴 명령은 의미를 지닌 것으로만 좁히십시오. 학위 논문이나 기술 문서에서는 글꼴 명령을 “겉모습을 조금 손보는 도구”로 흩뿌릴수록 나중에 고치기 어려워집니다. 제목을 굵게, 캡션을 작게, 정의어를 일관되게 산세리프로 — 이런 규칙은 본문에서 매번 \textbf을 치는 대신 클래스, 패키지, 또는 직접 만든 의미 매크로에 모읍니다. \newcommand{\term}[1]{\textsf{#1}}처럼 한 겹을 끼워 두면 방침이 바뀔 때 고칠 곳은 한 줄입니다. 반대로 인터페이스의 버튼 이름이나 키보드의 키 이름처럼 “그 겉모습이어야 뜻이 전달되는” 것은 본문에서 \textsf나 \texttt를 직접 써도 됩니다. 판단 기준은 “겉모습이 목적인가, 의미의 대리인가”입니다.
- 강조는
\emph에 맡깁니다. 겉모습 지정을 본문에 박아 넣으면 나중에 강조의 모습을 바꿀 수 없게 됩니다. - 긴 범위는 선언형으로. 인용 전체나 방주 전체라면 환경 첫머리에서
\itshape을 선언하고, 환경이 끝나며 그룹째 닫히게 합니다. - 조합은 최소 예제로 먼저 시험합니다.
\textsf{\textbf{...}}나\textsc{...}를 짧은 파일에서 한 번 조판해 로그에 글꼴 경고가 없음을 확인한 뒤 본문에 뿌립니다. - 대체된 글꼴을 방치하지 않습니다. 경고를 무시하면 같은 지정이 장마다 달라 보일 수 있습니다. 글꼴을 바꾸거나 요구를 단순하게 만듭니다.
- 옛 두 글자 명령을 섞지 않습니다. 공동 집필에서
\bf나\it을 발견하면\bfseries/\itshape또는\textbf/\textit으로 바꿉니다. 동작하는 듯 보여도 조합은 되지 않습니다.