물음표와 느낌표

물음표 ?와 느낌표 !는 위아래를 뒤집은 짝을 가진 몇 안 되는 약물입니다. 스페인어의 뒤집힌 물음표 ¿와 느낌표 ¡가 그것으로, LaTeX에서는 기호 뒤에 백틱을 치기만 하는 합자로 만들 수 있습니다. 게다가 이 합자가 커누스의 원래 부호화인 OT1에서도 T1에서도 똑같이 작동한다는 점은 의외로 알려져 있지 않습니다. 그 대가로 OT1에서는 본문에 <를 치면 ¡가 나옵니다. 이 페이지에서는 ¿ ¡의 입력, < >가 깨지는 이유, ? !가 뒤 공백을 넓히는 구조, 프랑스어가 기호 에 넣는 공백, 그리고 수식의 !가 계승이 된다는 사실(\!는 느낌표가 아닙니다)을 실측과 함께 정리합니다.

스페인어의 뒤집힌 ¿ ¡ 만들기 — 백틱 합자와 \textquestiondown

? 바로 뒤에 백틱을 치면 ¿가, ! 바로 뒤에 치면 ¡가 나옵니다. 폰트의 합자이므로 패키지도 명령도 필요 없습니다. 아래 코드 예처럼 쓰면 “¿Como estas?”가 나오고 백틱은 출력에 나타나지 않습니다. 명시적으로 쓰고 싶다면 \textquestiondown\textexclamdown이 있으며, 실측 폭도 합자와 완전히 같습니다. T1에서 ¿가 4.72107pt, ¡가 2.7771pt입니다. 이 뒤집힌 기호들은 18세기에 스페인 왕립 아카데미가 제안한 것으로, 긴 의문문에서 어디부터 의문이 시작되는지를 독자가 미리 알 수 있게 하려는 장치입니다. 그래서 닫는 기호만으로는 불완전하며, 여는 기호를 빠뜨리는 것은 조판의 흐트러짐이라기보다 철자 오류에 가깝게 취급됩니다.

합자와 명령의 관계는 부호화에 따라 방향이 반대가 됩니다. OT1에서는 ot1enc.def\textquestiondown합자 그 자체로 정의해 두었으므로(아래 코드), 명령 쪽이 합자를 불러오는 셈입니다. 합자가 본체이고 명령은 별칭입니다. T1에서는 반대로 t1enc.def\DeclareTextSymbol{\textquestiondown}{T1}{190}이라 선언하고 \textexclamdown을 189번에 두어, 폰트 안에 실재하는 문자 위치를 곧바로 가리킵니다. 어느 부호화에서든 결과는 같으므로 실무에서는 편한 쪽을 쓰면 되지만, \textquestiondown 쪽이 검색과 치환이 쉽고 남이 읽었을 때 의도가 한눈에 들어옵니다. UTF-8 소스에 ¿ ¡를 직접 써도 괜찮습니다. 현대 LaTeX은 UTF-8이 기본이라 T1에서 그대로 통과합니다.

latex
\usepackage[T1]{fontenc}
\usepackage[spanish]{babel}
% ...
?`Como estas?  !`Que bien!
\textquestiondown Como estas?  \textexclamdown Que bien!
¿Como estas?  ¡Que bien!   % direct UTF-8 also works
latex
% ot1enc.def -- in OT1 the COMMAND is defined as the ligature
\DeclareTextCommand{\textexclamdown}{OT1}{!`}
\DeclareTextCommand{\textquestiondown}{OT1}{?`}

% t1enc.def -- in T1 they are real slots in the font
\DeclareTextSymbol{\textexclamdown}{T1}{189}
\DeclareTextSymbol{\textquestiondown}{T1}{190}

OT1에서는 <>가 ¡ ¿가 된다 — 뒤집힌 기호가 앉아 있는 자리

OT1 폰트에는 <>의 글리프가 아예 없고, 그 부호 위치에 ¡와 ¿가 앉아 있기 때문입니다. 실제로 \usepackage[T1]{fontenc} 없이 OT1 angle: <a> and 2<3 and x>y.를 컴파일하고 pdftotext에 걸면 OT1 angle: ¡a¿ and 2¡3 and x¿y.가 돌아옵니다. 오류도 경고도 전혀 나오지 않습니다. 같은 원고에 T1을 읽어 들이면 <a>는 그대로 <a>가 됩니다. 곧 이것은 “오류가 나지 않는 유형의 사고”로, 비교 연산자나 꺾쇠괄호를 본문에 쓰는 순간 말없이 다른 문자로 바뀝니다.

해결책은 셋이며 우선순위도 이 순서입니다. 첫째, \usepackage[T1]{fontenc}를 넣습니다. T1에는 < >의 실제 글자가 있고, 덤으로 악센트 문자가 든 낱말의 분철도 올바르게 되므로 서양어를 조판한다면 결국 필요해집니다. 둘째, 수식 모드로 $<$ $>$라고 씁니다. 비교 연산자로서 의미도 맞습니다. 셋째, \textless \textgreater를 씁니다. 기호임을 명시하고 싶을 때 적합합니다. 뒤집어 말하면 이 현상은 “OT1 그대로 두어도 되는가”를 알려 주는 지표이기도 합니다. 본문에 꺾쇠괄호가 나오는 원고라면 T1을 읽어 들일 이유가 하나 더 생긴 셈입니다.

?! 뒤가 넓어진다 — 문장 끝으로 판정되는 구조

?!는 마침표와 같은 스페이스 팩터 3000을 가져, 뒤따르는 공백을 문장 끝 공백으로 바꿉니다. 실측하면 wow! Next는 47.2107pt인 반면 낱말 사이를 명시한 wow!\ Next는 46.09985pt로, 차이 1.11085pt가 문장 끝의 여분 공백입니다. 곧 ?!로 문장을 끝내면 아무것도 하지 않아도 마침표와 같은 너비가 됩니다. 뒤집어 말하면 문장 도중에 느낌표를 놓아도 같은 공백이 들어간다는 뜻입니다. Wow! he said 같은 표현이나 Yahoo! 같은 고유명사 뒤에서는 Yahoo!\ Inc.처럼 낱말 사이를 명시하거나, \frenchspacing으로 문장 끝 공백 자체를 끄면 됩니다.

프랑스어는 ? ! 에 공백을 넣는다 — babel이 넣는 양은 실측 1.66626pt

프랑스어 정서법은 ? ! ; : 앞에 공백을 두며, babel[french]를 읽어 들이면 직접 치지 않아도 자동으로 들어갑니다. 그 양은 french.ldf에 분명히 적혀 있어서, \FBthinspace\hskip .5\fontdimen2\font, 곧 낱말 사이의 절반이며 10pt에서 1.66626pt입니다. 실측해도 Quoi가 21.10596pt, Quoi!가 25.54932pt로 차이가 4.44336pt이고, T1 !의 글자폭 2.7771pt를 빼면 정확히 1.66626pt가 남습니다. 콜론만은 별도로, \FBcolonspace\space, 곧 낱말 사이 전체인 3.33252pt입니다. 실측에서도 Non 18.05115pt에 대해 Non:은 24.16077pt이고, :의 글자폭을 빼면 3.33252pt가 그대로 남습니다.

실무상의 결론은 명쾌합니다. 프랑스어 원고에서는 기호 앞의 공백을 직접 치지 마세요. babel이 넣어 주며, 그 공백은 줄을 바꾸지 않는 공백이라 행 첫머리에 ? 하나만 떨어지는 사고도 막아 줍니다. 손으로 공백을 치면 두 배로 벌어지고, 게다가 그 자리에서 줄이 바뀔 가능성까지 생깁니다. 반대로 프랑스어가 아닌 언어에서는 ? ! 앞에 공백을 넣지 않습니다. 영어・독일어・스페인어는 앞 낱말에 붙여 씁니다. 다국어 문서에서는 이 차이를 babel의 언어 전환에 맡기는 편이 가장 안전합니다.

latex
\usepackage[french]{babel}
% ...
% babel adds the space itself; typing one is unnecessary
Vraiment? Voici: ceci; cela!   % prints as: Vraiment ? Voici : ceci ; cela !

수식의 !는 계승 — 그리고 \!는 느낌표가 아니다

수식 모드의 !는 앞뒤에 공백을 전혀 넣지 않습니다. fontmath.ltx\DeclareMathSymbol{!}{\mathclose}{operators}{"21}이라고 선언한 대로, !닫는 기호(\mathclose) 부류이며 바로 앞 기호에 달라붙습니다. 실측해 보면 $ab$가 9.57755pt인데 $a!b$는 12.35533pt로 차이가 2.77778pt이고, 이는 !의 글자폭 그 자체입니다. 양옆에 스케일드 포인트 하나의 공백도 없습니다. 계승 n!이 딱 붙어 조판되는 이유가 이것이며, $n!!$도 같은 식으로 글리프 하나가 더해질 뿐(11.55792pt)이라 이중 계승도 그대로 쓰면 됩니다. ? 역시 똑같이 \mathclose로 선언되어 있습니다.

여기에 이름이 헷갈리게 만드는 함정이 있습니다. \!는 느낌표가 아니라 음의 가는 공백(negative thin space)입니다. 실측하면 $ab$의 9.57755pt가 $a\!b$에서는 7.91092pt가 되어 1.66663pt 줄어듭니다. \,(양의 가는 공백)와 정확히 반대 방향으로, 기호끼리 붙이기 위한 조정용 명령입니다. 수식에서 느낌표를 내고 싶을 뿐이라면 백슬래시 없이 그냥 !라고 쓰세요. \!\int\!\int처럼 적분 기호를 붙이는 용도로 주로 보이므로, 계승을 쓰려다 \!를 치면 기호는 사라지고 앞뒤가 붙는, 알아채기 어려운 방식으로 망가집니다.

latex
\[
  \binom{n}{k} = \frac{n!}{k!\,(n-k)!}, \qquad (2n)!! = 2^n n!
\]
% \! is a NEGATIVE thin space, not an exclamation mark:
\[ \int\!\!\int_D f(x,y)\,dx\,dy \]

인터로뱅 ‽ 과 !! ?? — 기호를 겹쳐 쓰고 싶을 때

!!??는 특별한 명령 없이 그대로 늘어놓아 치면 됩니다. 합자도 아무것도 일어나지 않습니다. 그리고 “의문과 놀라움을 한 글자로” 나타내는 기호 — 인터로뱅 ‽ — 은 뜻밖에도 LaTeX의 표준 장치 안에 들어 있습니다. textcomp를 읽어 들이면 쓸 수 있는 TS1 부호화의 \textinterrobang이 그것으로, ts1enc.def의 148번에 선언되어 있습니다(뒤집힌 \textinterrobangdown은 149번). 실제로 컴파일해 pdftotext에 통과시키면 제대로 ‽가 뽑혀 나옵니다. 폭은 4.72107pt로 ?와 같습니다.

인터로뱅은 1962년 미국의 광고 대행사를 이끌던 Martin K. Speckter가 고안한 기호입니다. “놀라움을 담은 물음”을 한 글자로 쓰고 싶다는 광고 카피의 요구에서 태어났고, 한때는 전용 활자와 타자기 볼까지 만들어졌습니다. 결국 일반적인 구두점으로 자리 잡지는 못했지만 유니코드에 U+203D로 수록되었고 LaTeX에도 TS1을 통해 남아 있습니다. 솔직히 실무에서 쓸 자리는 거의 없습니다. 학술 문서에서 !!??를 겹쳐 쓰는 것도 마찬가지로, 감탄을 강조하고 싶으면 기호가 아니라 문장 쪽에서 강조하는 것이 정석입니다. 그래도 막상 필요할 때 전용 명령이 있다는 사실을 아는 것은 든든합니다.

입력 조견표 — 무엇을 치면 무엇이 나오는가

입력출력주의점
??서양식 물음표. sfcode 3000이라 뒤가 문장 끝 공백이 됨
?`¿합자. OT1에서도 T1에서도 작동하며 백틱은 출력되지 않음
!`¡합자. \textexclamdown과 출력이 동일
\textquestiondown¿명시적 명령. T1에서는 부호 위치 190의 실제 글자
\textexclamdown¡명시적 명령. T1에서는 부호 위치 189의 실제 글자
\textinterrobangtextcomp(TS1)이 필요. 148번
$n!$n!계승. !\mathclose라 앞뒤에 공백이 들어가지 않음
\!(음의 공백)느낌표가 아님. 수식에서 1.66663pt 좁히는 조정 명령
? !? !일본어 전각 기호. 바로 뒤에 전각 공백을 치지 않음

일본어의 ? !는 전각 — 바로 뒤에 공백을 치지 않는다

일본어에서는 전각 ? !를 쓰고 바로 뒤에 전각 공백을 치지 않습니다. upLaTeX이나 LuaLaTeX + luatexja 같은 일본어 지원 엔진은 이들을 약물로 다루어 뒤쪽 공백을 자동으로 확보합니다. W3C의 「일본어 조판 처리의 요건(JLReq)」도 문장 끝에 쓰는 물음표・느낌표는 전각 글자폭으로 하고 그 뒤에 전각 공백을 둔다(다만 바로 뒤에 닫는 괄호류가 오면 붙여 조판)고 정하고 있습니다. 여기서 직접 전각 공백을 더하면 자동 공백과 겹쳐 두 배로 벌어집니다. 행 끝에 ?가 왔을 때 남는 공백의 처리도 대부분의 클래스와 패키지가 알아서 합니다. 약물의 공백은 엔진에 맡긴다 — 그것이 일본어 쪽의 원칙입니다.

latex
\documentclass{ltjsarticle}
\begin{document}
本当ですか? はい、できました! 次に進みましょう。
\end{document}
  • 일본어 중심 원고에서는 전각 로 통일합니다. 반각 ? !가 섞이면 어조가 같은 문장인데도 행 끝과 낱말 사이의 모습이 달라집니다.
  • 서양어 인용・코드・고유명사는 반각 그대로 둡니다. 원문에서 인용한 기호는 일본어 본문의 방침과 분리해 다룹니다.
  • 스페인어는 여는 기호를 확인합니다. 닫는 ? !만 쓰고 ¿ ¡를 빠뜨리는 것은 체재가 아니라 언어의 오류입니다.
  • 프랑스어는 공백을 손으로 넣지 않습니다. [french]를 붙인 babel에 맡기고, “기호 앞에 공백을 치지 않는다”를 팀 규약으로 정합니다.
  • OT1 그대로인 원고는 꺾쇠괄호를 의심합니다. 본문의 < >가 말없이 ¡ ¿가 되므로 \usepackage[T1]{fontenc}의 유무를 먼저 확인합니다.