句読点・括弧類

LaTeX にとってピリオドは「点を打つ命令」ではなく、次に来る空白の幅を変える命令 です。Dr. Smith の空きは 3.33252pt、ends here. Next の空きは 4.44336pt——同じ . を打っているのに、10pt の文書で 1.11084pt の差が出ます。しかも判定の材料はピリオドの 前の文字 で、小文字なら文末、大文字なら略語だとみなされます。この一行のルールが、NASA. Next の間延び、Fig. 1 の妙な空き、e.g. のあとの違和感の正体です。このページでは、その仕掛け(\sfcode)と直しかた(\@\ ~\frenchspacing)、三点リーダ \ldots\dots の使い分け、数値の桁区切り \,、そして和文の句読点と括弧の選び方までを扱います。

ピリオドのあとの空白が広くなる — \sfcode という仕掛け

文字ごとに スペースファクタ(space factor) という値が割り当てられていて、直前の文字が残した値が 2000 を超えていると、TeX は次の空白にフォントの「余分な空き」\fontdimen7 を足すからです。10pt の article で測ると、ふつうの語間 \fontdimen2 は 3.33252pt、余分な空きは 1.11084pt、合わせて 4.44336pt。つまり文末の空きは語間のちょうど 1.33 倍 です。値は \the\sfcode に文字を続けて覗けます。ピリオドは 3000。この「3000」がすべての出発点です。

文字既定の sfcode次の空白への効果
. ? !3000文末の空き。10pt で +1.11084pt
:2000やや広い空き。3000 の閾値ちょうど
;1500伸縮の余地だけがわずかに変わる
,1250同上。文末とはみなされない
)0透明。直前の文字が残した値をそのまま持ち越す
A B C9991000 未満。直後の . の 3000 を打ち消す

Dr. Smith は狭く ends here. Next は広い — 大文字の sfcode が 999 である理由

大文字の sfcode が 999、つまり 1000 をわずかに下回る値に設定されているからです。TeX の規則はこうです——現在のスペースファクタが 1000 未満のとき、次の文字が 1000 より大きい値を持っていても、スペースファクタは 1000 止まり になる。だから A のあとに .(3000)が来ても、実際に立つ値は 1000 で、文末の余分な空きは入りません。逆に小文字 a は 1000 ちょうどなので、続く . の 3000 がそのまま通ります。実測すると A. a が 18.60657pt に対し、空きを明示した A.\ aまったく同じ 18.60657pt。一方 a. a は 17.21802pt で、\frenchspacing を宣言すると 16.10718pt に縮みます。差の 1.11084pt がまさに文末の余分な空きです。

この設計は、TeX が生まれた当時の英語の組版慣習をそのまま実装したものです。当時の英語圏では、文と文のあいだを語間より広く空けるのが普通でした。そして略語のピリオド——Dr.Ph.D.Mr.——を文末と誤認しないための近似として、「大文字で終わっていれば略語」という一行の経験則が採られました。近似なので当然外れます。NASA. Next は本当に文末なのに狭く組まれ、Fig. 1 は略語なのに広く組まれる。次の二節が、その両方の直しかたです。

\@ で「ここが文末だ」と教える — NASA\@. Next

\@ は「直後の約物を文末として扱え」という指示で、ピリオドの前 に置きます。He joined NASA\@. Then he left. と書けば、大文字 A が立てた 999 が打ち消され、. の 3000 がそのまま通ります。実測でも A. a の 18.60657pt に対し A\@. a は 19.7174pt——差は 1.11083pt で、まさに文末の余分な空きぶんです。置き場所を間違えて NASA.\@ Next と書いても効きません。\@ はピリオドの手前 と覚えてください。頭字語(NASAUSADNA)や大文字で終わる固有名詞で文を終えるときだけの、年に数回の道具です。

略語のあとは \ ~e.g.Fig.~1

逆の誤判定——小文字で終わる略語が文末とみなされる場合——は、空白そのものを命令で書いて直します。\ (バックスラッシュ+空白)は「ふつうの語間をここに置け」という命令で、スペースファクタを見ません。実測すると Fig. 1 は 26.5213pt、Fig.\ 1 は 25.41046pt。1.11084pt 縮んで、正しい語間になります。e.g.i.e.etc.cf.vs.Fig.Eq.No. はすべてこの落とし穴に落ちる語です。

ただし Fig. 1 のような 参照番号 では、\ より ~(チルダ)のほうが適切です。~ は「語間と同じ幅で、しかもここで改行しない空白」で、実測でも Fig.~1Fig.\ 1 と同じ 25.41046pt。幅は同じで、改行禁止だけが加わります。図表番号・式番号・人名のイニシャルが行末で切り離されると読みにくいので、Fig.~\ref{fig:one}Eq.~\eqref{eq:main}D.~E.~Knuth のように書くのが定石です。参照番号には ~、それ以外の略語には \ と覚えると迷いません。

latex
% a sentence really ending on a capital
He joined NASA\@. Then he left.

% abbreviations that must NOT get a sentence space
See, e.g.\ Knuth (1984); cf.\ the appendix.

% reference numbers: same width, but unbreakable
Fig.~\ref{fig:one} and Eq.~\eqref{eq:main}, after D.~E.~Knuth.

\frenchspacing — 非英語の文書がほぼ必ず要る一行

\frenchspacing は文末の余分な空きを 一括で無効にする 宣言で、プリアンブルに一行書くだけです。中身は驚くほど単純で、latex.ltx の定義は 6 つの sfcode を 1000 に揃えるだけ——. ? ! : ; , のすべてが語間と同じ扱いになります(既定の \nonfrenchspacing は 3000/3000/3000/2000/1500/1250 に戻します)。実測でも a. a が 17.21802pt から 16.10718pt に縮み、A. a は 18.60657pt のまま動きません。もともと余分な空きが入っていなかった箇所は、当然変わらないわけです。

名前に反して、この詰めかたはフランス語だけの流儀ではありません。フランス語・ドイツ語・スペイン語・イタリア語をはじめ、英語以外のほとんどの言語では、文と文のあいだを語間より広く空けません。 現代の英語の組版でも、シングルスペースが主流になっています。babel に言語を渡すと多くの場合これは自動で切り替わりますが、自分で \frenchspacing を宣言しておくのが確実 です。ちなみに LaTeX 自身も verbatim 環境の内部でこれを使っています——コードの中で . のあとが伸びたら困るからです。文末の空きを残すか消すかは共著者と最初に決めておくべき方針で、途中で変えると差分が全ページに広がります。

latex
\documentclass{article}
\usepackage[T1]{fontenc}
\frenchspacing          % . ? ! : ; , all behave like ordinary letters
\begin{document}
This ends here. Next sentence starts with an ordinary space.
\end{document}

三点リーダは ... ではなく \ldots — そして \ldots\dots の違い

ピリオド 3 つを並べた ... は幅 8.3313pt、\ldots は 13.33008pt——1.6 倍も違います... は点が団子になって「省略」に見えず、\ldots は点のあいだに正しい空きが入ります。だから本文の省略記号は必ず \ldots\dots を使ってください。ではその二つの差は何かというと、素の LaTeX では差がありませんlatex.ltx\dots を定義したあと \let\ldots\dots としており、二つは文字どおり同じ命令です。実測でもテキストモードで 13.33008pt、\textellipsis とも一致します。

差が生まれるのは amsmath を読み込んだとき、しかも数式モードの中だけ です。amsmath は二つを別々に定義しなおし、\ldots は常に下付きの点、\dots前後を先読みして点の高さを選ぶ 命令になります。カンマの列なら低い点(\dotsc)、二項演算子や関係子に挟まれれば中央の点(\dotsb\cdots)、積分なら \dotsi、掛け算なら \dotsm。実際にコンパイルして pdftotext で抜くと、$a+\dots+b$ は「a + · · · + b」、$a+\ldots+b$ は「a + . . . + b」と、確かに違う文字 が出てきます。ただしテキストモードではどちらも \textellipsis に落ちるので、地の文で悩む必要はありません。

命令出力いつ使うか
\ldots…(ベースライン寄り)地の文の省略。数式では常に低い点
\dots文脈依存amsmath 下では前後を見て高さを選ぶ。数式ではこれが既定
\cdots⋯(中央)a+\cdots+b のように演算子の列に挟むとき
\vdots⋮(縦)行列や連立式で行を省略するとき
\ddots⋱(斜め)行列の対角方向の省略
latex
\usepackage{amsmath}
% ...
He hesitated\ldots{} then went on.
\[
  x_1, x_2, \dots, x_n \qquad a_1 + a_2 + \dots + a_n
\]
\[
  \begin{pmatrix} a & \cdots & b \\ \vdots & \ddots & \vdots \end{pmatrix}
\]

数字の桁区切りは \, — 「1 000」を 1.6663pt で作る

\,細い空き(thin space) を入れる命令で、幅は 1.6663pt、つまり 1 em の 6 分の 1 です。1\,000 を測ると 21.66142pt、1000 は 19.99512pt——差はきっちり 1.6663pt。桁区切りにカンマを使うか点を使うかは国によって逆になる(英語圏の 1,000 はドイツ語圏では 1.000)ため、国際的な慣行では 細い空きで区切る ことが長く推奨されてきました。\, はまさにそのための空きです。単位の前にも同じものを使い、5\,\mathrm{kg} のように書きます。

ただし \, を手で撒くのは、桁数が増えると割に合いません。数値と単位を大量に扱う原稿では siunitx に任せて \num{1000000}\qty{5}{\kilogram} と書くほうが、桁区切りも単位前の空きも、負号の扱いまで一貫します。\, は「本文にたまたま出てきた一つの数値」のための道具だと考えてください。

和文は「、。」か「,.」か — jsclasses に切り替えオプションはない

どちらを出すかは原稿に何を打つかで決まり、クラスオプションでは切り替えられません。 jsarticle・jsbook をはじめ jsclasses には、句読点を ,.に替えるオプションはありません。コンマピリオドにしたいなら地の文に ,. を直接入力するのが最も素直な方法です。この流儀そのものは、規格票の様式を定めた JIS Z 8301 が横書きで「,」「.」を用いてきた流れを汲むもので、数学書や理工系の論文で今も広く使われています。一方、2022 年(令和 4 年)の文化審議会建議「公用文作成の考え方」は、読点には原則として「、」を用いるとし、横書きでは事情に応じて「,」も使えると整理しました。投稿規定と分野の慣習に従い、一つの文書内では必ず統一する ——判断の基準はそれだけです。

latex
% comma-period style: just type the marks you want
\documentclass{ltjsarticle}
\begin{document}
本稿では,記法を次のように定める.まず,集合 $A$ を……
\end{document}

和文の括弧 「」『』() — どれをいつ使うか

会話・引用・語句の括り出しは 鉤括弧 「」、書名と作品名、そして「」の内側の入れ子は 二重鉤括弧 『』 が基本です。補足や読みは 全角の()。和文には全角の括弧を使い、欧文の半角 () を混ぜないでください。半角括弧は前後のアキの取りかたが違うので、和文の行の中で一箇所だけ字面が浮きます。逆に欧文(Latin)の引用の中では半角 ( ) を使います。

括弧名称主な用途
「 」鉤括弧(かぎかっこ)会話・引用・語句の括り出し。和文の第一の引用符
『 』二重鉤括弧書名・作品名、および「」の内側の入れ子
( )丸括弧(全角)補足・注記・読みがな
[ ]角括弧(全角)編集者による補足・省略の明示
【 】隅付き括弧見出し・項目名の強い括り出し
〔 〕亀甲括弧注記・補足。角括弧の代用

なお、和文の約物が どうやってアキを得ているか——JFM に書かれた字幅、閉じ括弧が続いたときの詰め、\inhibitxspcode、和欧文間に自動で入る \xkanjiskip、行頭・行末の禁則とそのペナルティ——は「日本語組版の詳細」のページが扱います。ここで押さえておくべき実務上の一点は単純です。約物の前後に自分でスペースを打たないこと。 打つと、エンジンが用意したアキと二重になって不自然に空きます。

提出前にソースを検索する — 約物のゆれをまとめて潰す

約物のずれは コンパイルエラーにならず、PDF 上の違和感としてだけ現れます。だから最後に一度、ソースを機械的に検索して潰すのが確実です。特に共同執筆では、ある章だけ \frenchspacing 前提で書かれ、ある章だけ e.g. のあとが生の空白のまま残り、ある章だけ和文に半角括弧が混ざる、といった揺れが必ず起きます。次の 4 点を grep にかけてください。

  • 略語のあとの生の空白。 e.g.i.e.cf.etc.Fig. に続く空白を探し、\ ~ に置き換えます(\frenchspacing を使っているなら不要)。
  • 大文字で終わる文末。 頭字語+. の並び(NASA.USA.DNA.)を探し、本当に文末なら \@ を入れます。
  • 三点リーダ。 ピリオド 3 連 ... を探し、\ldots に直します。数式の中なら amsmath\dots に任せます。
  • 和文中の半角括弧。 日本語の行に混ざった ( ) を探し、全角の ( ) に直します。半角スペースが約物の前後に打たれていないかも同時に見ます。
terminal
# abbreviation followed by a bare space
grep -nE "(e\.g\.|i\.e\.|cf\.|etc\.|Fig\.) " *.tex

# a sentence that may end on an acronym
grep -nE "[A-Z]{2,}\." *.tex

# three typed periods instead of \ldots
grep -n "\.\.\." *.tex