疑問符・感嘆符

疑問符 ? と感嘆符 ! は、ただ打てば出る素直な文字です。けれど言語によって作法が違います。英語では文末で他の文と同じく広めのアキが付き、フランス語では記号の前に細いアキを入れ、スペイン語では文頭に逆さの ¿ ¡ を添え、日本語では全角の ? ! を使います。このページでは、入力の仕方と、LaTeX が自動で面倒を見てくれるスペーシングを、言語ごとに整理します。

欧文の ? と !

英語をはじめとする欧文では、?! はキーボードからそのまま入力します。エスケープは不要で、特別な命令もいりません。前にアキを入れず単語に直付けし、後ろに半角スペースを置くのがふつうです。

TeX は内部で、文字ごとに スペースファクタ(space factor) という値を持っています。ピリオド .、疑問符 ?、感嘆符 ! のスペースファクタはいずれも 3000 で、続く空白を「文末のアキ」として扱う合図になります。既定(\nonfrenchspacing)では、この文末のアキは語間より広めに組まれ、伸縮も語間の 3 倍ほど大きく許されます。つまり ?! で文を終えると、自動的にピリオドと同じ少し広いアキが入るわけです。

ここに落とし穴が一つあります。TeX は 大文字の直後にある約物は文末ではない と判断します(Ph.D. のような略語を想定しているため)。Who is FBI? のように大文字直後で文を終える稀なケースでは、? の前に \@ を置いて「ここは文末だ」と教えます。逆に、文末のアキを一切やめて語間と同じ幅にそろえたいときは、プリアンブルで \frenchspacing を宣言します。詳しくは「自動挿入されるスペース」のページで扱います。

latex
Really? Yes! It works.

% After a capital, mark the true sentence end:
He joined the FBI\@. Then he left.

フランス語は事情が違います。! ? : ; に細いアキ(thin space)を入れるのが正書法で、Vraiment ? のように書きます。これを手で入れる必要はありません。babel[french] オプション(babel-french)を読み込むと、これらの記号の前に正しい(改行しない)アキが自動で挿入されます。

スペイン語の逆さ記号 ¿ ¡

スペイン語では、疑問文・感嘆文の 文頭 に逆さの開き記号を置きます。疑問文は ¿…?、感嘆文は ¡…! と、開きと閉じで挟む形です。閉じ側の ? ! はふつうに打てばよく、問題は開き側の ¿ と ¡ をどう入力するかです。

伝統的な方法は リガチャ(合字)入力 です。標準の欧文フォントエンコーディングでは、感嘆符に続けてバッククォートを打つと ¡ に、疑問符に続けてバッククォートを打つと ¿ に化けます。つまり 開き感嘆符は ! のあとに ` `、開き疑問符は ? のあとに ` です。出力には `` は現れず、逆さ記号一つになります。

もう一つは 明示的な命令 です。¡ は \textexclamdown、¿ は \textquestiondown で出せます。意味が一目で分かり、リガチャを無効にする設定下でも確実に動くので、こちらを好む人も多くいます。さらに babel[spanish] を読み込むと、スペイン語向けのハイフネーションや見出し語が整い、? ! まわりの扱いも言語に合わせて調整されます。

latex
% Ligature input (mark + backtick):
?`Como estas?
!`Hola!

% Explicit commands (identical output):
\textquestiondown Como estas?
\textexclamdown Hola!

注意点として、pdfLaTeX ではこのリガチャがフォントエンコーディングの機能として働きますが、Unicode を直接扱う XeLaTeX / LuaLaTeX ではリガチャに頼らず、逆さ記号 ¿ ¡ をソースにそのまま書く(または \textquestiondown / \textexclamdown を使う)のが確実です。

日本語の ? と !

日本語の文章では、半角の ? ! ではなく 全角の ? ! を使います。これらはソースにそのまま書けば、日本語対応のエンジン(upLaTeX や LuaLaTeX + luatexja)がそのまま組みます。エスケープは不要です。

日本語組版では、文中に来る ? ! の 後ろに全角アキ(全角分の空き) を入れるのが標準的な作法です。W3C の「日本語組版処理の要件(JLREQ)」も、文末に用いる疑問符・感嘆符の字幅は全角とし、その後ろを全角アキとすると定めています(ただし直後に閉じ括弧類が来る場合はベタ組)。重要なのは、この全角アキを 自分で全角スペースとして打つ必要は基本的にない ことです。組版エンジンが約物のアキとして自動で入れてくれます。逆に手で全角スペースを足すと二重に空いてしまいます。

また、日本語では ? ! で文を終えても、句点 。のように改まった文末記号として常用されるわけではありません。会話文や軽い文体で多用される一方、硬い文章では 。が文末を担います。行末に ? ! が来てその後ろの全角アキが余るときは、行末のアキを詰める処理が望ましいとされます(多くのクラス・パッケージが面倒を見ます)。

入力早見表

入力 → 出力 → 注意点をまとめます。リガチャ列のバッククォートは、開き記号を出すための入力であって、出力には現れません。

入力出力注意点
???欧文の疑問符。文末で広めのアキ(SF=3000)
!!!欧文の感嘆符。文末で広めのアキ(SF=3000)
?-backtick? のあとに `¿リガチャ。開き疑問符(スペイン語)
!-backtick! のあとに `¡リガチャ。開き感嘆符(スペイン語)
textquestiondown\textquestiondown¿明示命令。リガチャ無効でも動く
textexclamdown\textexclamdown¡明示命令。リガチャ無効でも動く
fullwidth-question?(全角)日本語。後ろの全角アキは自動
fullwidth-exclam!(全角)日本語。後ろの全角アキは自動

使用例

言語をまたいで実際に書いた例です。スペイン語は開きと閉じで挟み、フランス語は babel-french が記号前の細いアキを入れ、日本語は全角記号をそのまま置くだけで後ろのアキが付きます。

document.tex
% --- Spanish ---
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[spanish]{babel}
\begin{document}
?`Como estas? !`Que bien!

\textquestiondown Listo\textexclamdown
\end{document}

開きの ¿ ¡ をリガチャ(? ! のあとにバッククォート)で出した行と、明示命令で出した行は、まったく同じ出力になります。次は日本語の例で、? ! の直後に全角スペースを打っていない点に注目してください。

document.tex
\documentclass{ltjsarticle}
\begin{document}
本当ですか? はい、できました! 次に進みましょう。
\end{document}

コンパイルすると、「本当ですか?」の後ろに全角アキが入り、「できました!」の後ろにも同じく全角アキが入った、読みやすい日本語の段落になります。手で空白を足していないのに、適切な間隔が確保されるのが日本語組版の利点です。