LaTeX のソースに打った空白は、文字ではなく 寸法 です。10 ポイントの Computer Modern なら、語と語のあいだのスペースはちょうど 3.33252 pt——そして ~ も、\ (バックスラッシュ+空白)も、測ると同じ 3.33252 pt になります。逆に、いくつ空白を打っても 1 個分も出てこない 場所があります。\LaTeX is が「LATEXis」と出てしまうのがそれです。このページでは、LaTeX が自動で入れるスペースの実測値と、消えた空白を取り戻す命令、そして自分でスペースを置くときの ~・\hspace・\quad の使い分けを扱います。
LaTeX の空白は何ポイントか
10 ポイントの article に T1 の Computer Modern を読み込んで測ると、語間のスペースは 3.33252 pt、伸びしろが 1.66626 pt、縮みしろが 1.11084 pt です。この三つ組はフォント自身が持っている値で、TeX ではそれぞれ \fontdimen2・\fontdimen3・\fontdimen4 と呼ばれます。つまり LaTeX の空白は「ある幅」ではなく「伸び縮みできる幅」——TeX の用語で グルー(glue) です。両端揃えの行がぴたりと収まるのは、この伸びしろと縮みしろを行ごとに配分しているからで、空白が文字だったらそもそも成立しません。
一方、自分で置くスペースには 伸び縮みしないもの があります。\,(細いスペース)は 1.6663 pt、\enspace は 4.99878 pt、\quad は 9.99756 pt、\qquad は 19.99512 pt。この四つはいずれも em 単位で定義 されていて、\quad はちょうど 1 em、\qquad は 2 em、\, は 1/6 em、\enspace は 1/2 em です。em はフォントサイズに連動するので、同じ \quad でも \large の中では 11.74713 pt に伸びます。対して \hspace{10pt} はどこに書いても 10 pt のままです。本文のリズムに合わせたいなら em 系、図版や表の寸法に合わせたいなら絶対長 ——これが選び方の芯です。
| 命令 | 10pt 本文での実測 | 定義と性質 |
|---|---|---|
(ordinary blank) | 3.33252 pt | \fontdimen2。伸び 1.66626 pt/縮み 1.11084 pt を持つグルー |
\ | 3.33252 pt | 制御綴の空白。語間と同じ幅だが、文末判定の影響を受けない |
~ | 3.33252 pt | \nobreak を前置した \ 。同じ幅で、そこでは改行しない |
\, | 1.6663 pt | 1/6 em の細いスペース。\thinspace と同じ。伸び縮みしない |
\negthinspace | −1.66631 pt | \, の逆。詰めたいときに使う |
\enspace | 4.99878 pt | 1/2 em。箇条書きのラベル周りなどに |
\quad | 9.99756 pt | ちょうど 1 em。\large の中では 11.74713 pt に伸びる |
\qquad | 19.99512 pt | 2 em。式や例の区切りに |
\hspace | 指定どおり | \hspace{10pt} は常に 10 pt。ただし行頭に来ると捨てられる |
\hspace* | 指定どおり | 行頭でも消えない版。そこで改行もしない |
\LaTeX\ is と \LaTeX{} is は同じ幅ではない
英字だけでできた命令の直後に打った空白は、命令名の終わりを示す合図として使い切られ、1 ポイントも紙に出てきません。実測すると \LaTeX is の幅は 32.37791 pt、\LaTeX\ is は 35.71043 pt——差はぴったり 3.33252 pt、つまり語間 1 個分です。「latex で空白が消える」と検索する人がまず当たるのがこの症状で、pdftotext で PDF から文字を取り出すと本当に LATEXis と繋がって出てきます。空白を何個打っても、改行を入れても結果は同じです。
直し方は三つあり、\LaTeX\ is・\LaTeX{} is・{\LaTeX} is はいずれも 35.71043 pt になります。ただし「三つとも同じ」は条件つきです。 直前がピリオドだと結果が割れます。実測で etc.\ Next は 39.99023 pt、etc.{} Next は 41.10107 pt で、差は 1.11084 pt——文末に足される余分な空き(\fontdimen7)ちょうどです。\ はこの余分を 受け取らない 空白なのに対し、{} の後ろに打った普通の空白は文末スペースとして広げられるからです。つまり \ は「消えた空白を戻す」だけでなく「文末扱いを止める」働きも兼ねており、Fig.\ 5 のような略語の直しに使われる理由もそこにあります。文末判定そのものの仕組み——\sfcode、\@、\frenchspacing——は「句読点・括弧類」で扱います。
% widths measured with \sbox0{...}\typeout{\the\wd0}
% pdfLaTeX, TeX Live 2024, 10pt article, T1 Computer Modern
\LaTeX is % 32.37791pt -> "LaTeXis" (the blank is eaten)
\LaTeX\ is % 35.71043pt
\LaTeX{} is % 35.71043pt
{\LaTeX} is % 35.71043pt
% ...but after a period the two fixes are NOT the same:
etc.\ Next % 39.99023pt (control space: no sentence space)
etc.{} Next % 41.10107pt (+1.11084pt = \fontdimen7)xspace はなぜ罠にもなるのか
xspace パッケージは、自作命令の末尾に \xspace を置くと「次の文字が句読点でなければ空白を足す」という仕組みで、\LaTeX{} を毎回書く手間から解放してくれます。ただし判定は 例外リストとの照合 にすぎません。TeX Live 2024 同梱の xspace.sty(LaTeX Project 保守、tools バンドル)が持つ例外は、コンマ・ピリオド・アポストロフィ・スラッシュ・疑問符・セミコロン・コロン・感嘆符・チルダ・ハイフン・丸括弧の閉じ、それに \ ・\/・波かっこ・\space・\footnote・\footnotemark です。ここに載っていないものの前では、\xspace は空白を入れます。
角括弧の閉じ ] はリストに 入っていません。そこで \newcommand{\eg}{e.g.\xspace} を定義して [\eg] と書くと、出力は [e.g. ] ——閉じ括弧の直前に空白が入ります。しかも直前がピリオドなので、入るのは語間ではなく文末幅で、実測は 22.2168 pt(\xspace なしなら 17.77344 pt)、差は 4.44336 pt もあります。同じことが \eg\%(→ e.g. %)、\eg\@.、二重引用の " の前でも起きます。さらに厄介なのは逆方向で、安全のつもりで \eg{} と書くと 波かっこが例外に一致してしまい、空白がまったく入りません。\eg{}x は e.g.x になります。
\usepackage{xspace}
\newcommand{\eg}{e.g.\xspace}
\eg foo % "e.g. foo" correct
\eg, foo % "e.g., foo" correct (comma is an exception)
[\eg] % "[e.g. ]" WRONG -- ] is not an exception
\eg\% % "e.g. %" WRONG
\eg{}x % "e.g.x" WRONG -- the brace matches an exception
% You can patch the list, but every new case needs another patch:
\xspaceaddexceptions{]}例外は \xspaceaddexceptions{]} のように後から足せますが、足すたびに「次に何を忘れているか」を数える羽目になります。だから慣れた書き手は \xspace を使わず、\newcommand{\eg}{e.g.} と素直に定義して呼び出し側で \eg{} foo と書くか、そもそも略語命令を作らずに直接 e.g. と打ちます。\xspace が本当に割に合うのは、呼び出し回数が多く、後ろに来るものが本文の語だけだと言い切れる 場合——製品名やプロジェクト名のマクロなどに限られます。
~ はどこで必須か——改行させないスペース
~ は「幅は語間と同じ、しかしそこで行を折らない」スペースです。特別な空白が用意されているわけではなく、latex.ltx の定義は \DeclareRobustCommand{\nobreakspace}{\leavevmode\nobreak\ } ——\nobreak を前に置いた \ そのものです。だから実測でも x~y は x\ y と同じ 3.33252 pt ぶんの空きになり、\ と同じく文末の余分も受け取りません(x.~y は 16.6626 pt、素の x. y は 17.77344 pt)。「latex チルダ 改行」で探している挙動の正体はこの \nobreak の一語です。
効果は狭い段組で試すとはっきり分かります。幅 3 cm の parbox に「We show in Figure 5 that it holds.」を組むと、行末が Figure で切れて次行が 5 から始まります。同じ文を Figure~5 にすると、TeX は代わりに Fig-ure とハイフンで割り、Figure 5 を離しません。つまり ~ は「その空きを禁じる」だけでなく、別の分割案を探させる 指示でもあります。必須と言えるのは、番号・記号・略号が単独で行頭に立つと読めなくなる箇所です——Figure~5、Section~2、Eq.~(3)、Chapter~12、Dr.~Smith、Knuth~(1984)、頭文字の D.~E. Knuth、そして 10~kg のような数値と単位。相互参照や引用では \ref と \cite の前に置くのが定石で、Figure~\ref{fig:main}、see~\cite{knuth1984} と書きます。
% in a 3cm column, the plain space breaks the reference in half:
We show in Figure 5 that it holds. % -> "...in Figure / 5 that..."
We show in Figure~5 that it holds. % -> "...in Fig-/ure 5 that..."
See Section~\ref{sec:method} and Figure~\ref{fig:main}.
As shown by Knuth~\cite{texbook}, a mass of 10~kg suffices.
D.~E. Knuth, Dr.~Smith, Eq.~(3), Chapter~12.注意点が二つ。第一に、~ は行を折らないだけで ハイフネーションは止めません。上の例で Fig-ure が割れたのがまさにそれで、語そのものを守りたいなら \mbox{...} を使います。第二に、~ は LaTeX が アクティブ文字 にしている記号なので、URL やファイルパス、verbatim の外でそのまま波ダッシュを出すことはできません。本文で波ダッシュの字を出すには \textasciitilde を使います。
\hspace と \hspace* の違い——行頭で消えるかどうか
行の途中では両者に差はありません。差が出るのは その空きの位置で行が折れたとき です。TeX は改行の直後に来たグルーを捨てる規則を持っているので、\hspace{1.5cm} はそこで改行されるとまるごと消えます。実測では、幅 3 cm の段に alpha beta gamma\hspace{1.5cm}epsilon zeta を組むと TeX はその空きで改行し、1.5 cm はどこにも現れません。\hspace*{1.5cm} に変えると、改行はそこで起こらず、epsilon のほうがハイフンで割れて 1.5 cm の空きは紙面に残ります。
実務では、その空きが版面の一部として意味を持つなら星付き を選びます。表紙の署名欄、見出しの前後の固定した間、\hfill と組み合わせて要素を左右に振り分けるレイアウトなどです。逆に「読みやすさのために少し空けたい」だけなら星なしで十分で、行末に来たときに勝手に消えてくれるほうがむしろ好都合です。負の値も使えて、\hspace{-1em} は実測で 1 em ぶんぴったり詰まります。
\ignorespaces と \unskip——環境の前後に湧く空白を消す
\ignorespaces は その後ろに続く空白をすべて読み飛ばす 命令、\unskip は 直前に置かれたグルーを 1 つ取り消す 命令です。前者は入力を食べ、後者は出力を削る、と覚えると混乱しません。実測で言えば、a b は 13.8855 pt、a \unskip b は 10.55298 pt——ちょうど語間 1 個ぶん縮みます。a\ignorespaces b(空白 2 個)も 10.55298 pt です。
出番はほぼ 自作環境の前後 です。\newenvironment{note}{\textbf{Note:}}{\textbf{.}} と定義して \begin{note} yes \end{note} tail と書くと、\begin{note} の後ろと \end{note} の前に打った空白がそのまま紙に出て、幅は 70.92018 pt になります。開始側の末尾に \ignorespaces、終了側の先頭に \unskip を足すと 63.1443 pt ——手で \textbf{Note:}yes\textbf{.} tail と書いたときと 1 スケールドポイントも違わない 値に落ち着きます。PDF から取り出した文字列も Note: yes . tail から Note:yes. tail に変わります。この 2 語を環境定義に足しておくのは、共同執筆の原稿では特に効きます——書き手ごとに \begin の後ろで改行するかどうかが違っても、出力が揺れなくなるからです。
% leaks a space on both sides -- measured 70.92018pt
\newenvironment{naive}{\textbf{Note:}}{\textbf{.}}
% tight on both sides -- measured 63.1443pt, identical to hand-set text
\newenvironment{tidy}{\textbf{Note:}\ignorespaces}{\unskip\textbf{.}}
\begin{tidy} yes \end{tidy} tail
% \ignorespacesafterend also swallows the blank AFTER \end{...};
% use it only when the environment must butt against what follows.- まず
~を仕込む。Figure~\ref{...}、Section~2、10~kg、Dr.~Smithは書いた瞬間に入れる。後から探して直すのは高くつきます。 \は「空白を戻す」と「文末扱いを止める」の二役と覚える。Fig.\ 5が効くのは後者の働きです。\xspaceは原則使わない。 使うなら閉じ角括弧・\%・引用符の前を必ず一度検査します。- 版面に効く空きは
\hspace*、読みやすさのための空きは\hspace。 前者は行頭でも消えません。 - 自作環境には
\ignorespacesと\unskipを最初から入れる。 定義した日に入れておけば、原稿が育っても空白が湧きません。