疑問符 ? と感嘆符 ! は、上下をひっくり返した相棒を持つ数少ない約物です。スペイン語の逆さ疑問符 ¿ と逆さ感嘆符 ¡ ——LaTeX ではこれを、記号のあとにバッククォートを打つだけの合字で出せます。しかもこの合字は Knuth の元々の符号化 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 でそのまま通ります。
\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% 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 の言語切り替えに任せるのが最も安全です。
\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 で、これは ! の字幅そのものです。両側に 1 スケールドポイントの空きも入っていません。 階乗の n! がぴったり詰まって組まれるのはこのためで、$n!!$ も同じ調子でもう一つ足されるだけ(11.55792pt)なので、二重階乗もそのまま書けます。? も同じく \mathclose に宣言されています。
ここに、名前がまぎらわしい落とし穴があります。\! は感嘆符ではなく、負の細い空き(negative thin space)です。 実測すると $ab$ の 9.57755pt が $a\!b$ では 7.91092pt になり、1.66663pt 縮みます。\,(正の細い空き)とちょうど逆向きの、記号どうしを詰めるための調整用命令です。数式で感嘆符を出したいだけなら、バックスラッシュを付けずにそのまま ! と書いてください。\int\!\int のように積分記号を詰める用途で見かける命令なので、階乗を書くつもりで \! と打つと、記号が消えたうえに前後が詰まるという分かりにくい壊れ方をします。
\[
\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 が考案した記号です。「驚きを伴う問い」を一文字で書きたいという広告文案上の要求から生まれ、一時は専用の活字やタイプライタの玉まで作られました。結局は一般的な句読点として定着しませんでしたが、Unicode に U+203D として収録され、LaTeX にも TS1 経由で残っています。実務での使いどころは、正直なところ、ほぼありません。学術文書で !! や ?? を重ねるのも同様で、感嘆を強めたいときは記号ではなく文の側で強める のが定石です。とはいえ、いざ必要になったときに専用命令があると知っているのは強いものです。
入力早見表 — 何を打つと何が出るか
| 入力 | 出力 | 注意点 |
|---|---|---|
? | ? | 欧文の疑問符。sfcode 3000 なので後ろが文末の空きになる |
?` | ¿ | 合字。OT1 でも T1 でも働く。バッククォートは出力されない |
!` | ¡ | 合字。\textexclamdown と同一の出力 |
\textquestiondown | ¿ | 明示命令。T1 では符号位置 190 の実字 |
\textexclamdown | ¡ | 明示命令。T1 では符号位置 189 の実字 |
\textinterrobang | ‽ | textcomp(TS1)が要る。148 番 |
$n!$ | n! | 階乗。! は \mathclose なので前後に空きが入らない |
\! | (負の空き) | 感嘆符ではない。数式で 1.66663pt 詰める調整命令 |
? ! | ? ! | 和文の全角記号。直後に全角スペースを打たない |
和文の ? ! は全角 — 直後に空白を打たない
和文では 全角の ? ! を使い、直後に全角スペースを打ちません。upLaTeX や LuaLaTeX + luatexja のような日本語対応エンジンは、これらを約物として扱い、後ろのアキを自動で確保します。W3C の「日本語組版処理の要件(JLReq)」も、文末に用いる疑問符・感嘆符は全角字幅とし、その後ろを全角アキとする(ただし直後に閉じ括弧類が来る場合はベタ組)と定めています。ここで自分で全角スペースを足すと、自動のアキと重なって二倍に空きます。行末に ? が来たときの余分なアキの処理も、多くのクラスとパッケージが面倒を見ます。約物のアキをエンジンに任せる ——それが和文側の原則です。
\documentclass{ltjsarticle}
\begin{document}
本当ですか? はい、できました! 次に進みましょう。
\end{document}- 日本語主体の原稿では全角
?!に統一する。 半角?!が混ざると、同じ調子の文なのに行末や語間の見えかたが変わります。 - 欧文の引用・コード・固有名詞は半角のまま残す。 原文の記号は和文の方針と切り離して扱います。
- スペイン語は開き記号を確認する。 閉じの
?!だけ書いて¿¡を忘れる誤りは、体裁ではなく言語としての誤りです。 - フランス語は空きを手で入れない。
babelの[french]に任せ、記号の前に半角スペースを打たないことをチームの規約にします。 - OT1 のままの原稿は山括弧を疑う。 本文に
<>があると黙って ¡ ¿ になるので、\usepackage[T1]{fontenc}の有無を先に確認します。