特殊文字

LaTeX が予約している特殊文字はちょうど十個——# $ % & ~ _ ^ \ { }——ですが、これは誰かが選んだリストではありません。TeX はすべての文字に カテゴリコード という番号を割り当てており、ふつうの文字は「字(11)」か「その他(12)」です。印字可能な ASCII のうち、そのどちらでもない番号を持つ文字がちょうど十個あり、それが予約文字の正体です。だから「なぜこの十個なのか」の答えは歴史でも趣味でもなく、TeX の入力処理装置の設定表そのものにあります。このページでは、その十個をひとつずつ literal に印字する方法、アクセント記号の付け方、そして UTF-8 が既定になった現在の LaTeX で非 ASCII をどう打つかを扱います。

十個の予約文字とカテゴリコード

予約文字とは、LaTeX が構文の一部として使っている文字です。打てば印字されるのではなく、振る舞いが起動します% を打てばその行の残りが消え、$ を打てば数式モードに切り替わり、& を打てば表の列が区切られます。カテゴリコードで言い直すと、\ は 0(命令の開始)、{ は 1、} は 2(グループの開閉)、$ は 3(数式の切り替え)、& は 4(桁揃えのタブ)、# は 6(引数の番号)、^ は 7(上付き)、_ は 8(下付き)、~ は 13(アクティブ文字)、% は 14(コメント)です。a は 11、1+ は 12——つまり、ただ印字されるだけの文字です。

これらを裸で書いたとき何が起きるかは、文字ごとに違います。もっとも危険なのは % で、エラーにならずに黙って行の残りを食べます&! Misplaced alignment tab character &._^ は本文中で ! Missing $ inserted.}! Too many }'s.\ は続く文字を命令名と読んで ! Undefined control sequence. になります。# だけメッセージが独特で、! You can't use に続けて macro parameter character #' in horizontal mode. と出ます。~ は唯一エラーも警告も出さず、非分割スペースとして静かに組まれます。

文字カテゴリコード役割裸で書くと
\0命令の開始! Undefined control sequence.
{1グループ・引数の開始閉じられないとファイル末尾でエラー
}2グループ・引数の終了! Too many }'s.
$3数式モードの開始と終了対応が崩れると ! Missing $ inserted.
&4表や整列の列区切り! Misplaced alignment tab character &.
#6マクロ定義の引数番号(#1, #2, …)! You can't usein horizontal mode.
^7数式モードの上付き本文中では ! Missing $ inserted.
_8数式モードの下付き本文中では ! Missing $ inserted.
~13アクティブ文字。改行しない空白エラーなし。非分割スペースになる
%14コメント。行の残りを無視エラーなし。行の残りが黙って消える

そのまま印字する——七個は逃がすだけ

十個のうち七個は簡単で、直前にバックスラッシュを一つ置くだけです——\#\$\%\&\_\{\}\$1.23 と書けば $1.23 が出ます。バックスラッシュは「次の一文字は命令の始まりではなく、その文字自身だ」という合図です。仕組みも素朴で、カーネルの中では \%\&\#\chardef——「この番号の文字を印字せよ」という定義そのもの——として書かれています。\$\{\} だけは数式モードかどうかを見て振る舞いを変えるので、数式の中でも同じ書き方が通ります。

入力出力注意
\##バックスラッシュを一つ置くだけ
\$$数式モードの中でも使える
\%%50\% のようにパーセントに
\&&社名や書名の「and」に
\__既定の書体では字ではなく罫線で描かれる
\{{数式モードの中でも使える
\}}数式モードの中でも使える
\textasciitilde~\~{} でも同じ。裸の \~ はアクセント命令
\textasciicircum^\^{} でも同じ。裸の \^ はアクセント命令
\textbackslash\\\ は改行命令。バックスラッシュは出ない

残る三つ——チルダ・ハット・バックスラッシュ

~^\ の三つだけは、逃がすだけでは済みません。理由は単純で、その「逃がした形」がすでに別の意味を持っているからです。\~\^アクセント命令で、次の一文字の上にチルダやハットを載せます——\~n は ñ、\^o は ô。記号そのものが欲しいときは空の引数を渡して載せる先を奪います。それが \~{}\^{} で、実はカーネルの \textasciitilde\textasciicircum の既定の定義は、文字どおりこの二つです。名前のついたほうを書くほうが意図が読み取りやすいので、原稿では \textasciitilde{}\textasciicircum{} を勧めます。

バックスラッシュ自身は \textbackslash で出します。\\ を使ってはいけません——それは二つのバックスラッシュではなく改行命令で、画面には何も出ません。ここで面白いのは、既定の書体にはバックスラッシュの字が入っていないという事実です。カーネルは \textbackslash を数式記号エンコーディングから取ると宣言しており、実際に \textbackslash だけを書いた 1 ページの PDF を作ると、埋め込まれるフォントは数式記号用の CMSY10 です。同じ理由で、既定の \_ は文字ではなく 細い罫線を自前で描いたもので、\_ だけの 1 ページからはフォントが 1 つも埋め込まれません。\usepackage[T1]{fontenc} を入れると、どちらも本文フォント側の正規の字に切り替わります。ついでに言うと、予約文字ではない < > | も既定のエンコーディングでは ¡ ¿ — に化けます。これも fontenc で直ります。

latex
\usepackage[T1]{fontenc}   % real glyphs for \, _, < > |

100\% \& \$5 cost \#1

A Windows path: C:\textbackslash Users\textbackslash doc

Standalone marks: \textasciitilde{} and \textasciicircum{}

アクセント記号を付ける

初期の TeX は 7 ビットの ASCII しか読めませんでした。だから é を出すには「e の上に鋭アクセントを載せよ」と命じる必要があり、その命令が今日まで残っています。書き方は「アクセント命令+文字」で、\'e が é、\"o が ö、\^e が ê、\~n が ñ、\c{c} が ç、\v{s} が š、\r{a} が å です。ひとつだけ落とし穴があります。i と j にアクセントを載せるときは点が邪魔になるので、点のない \i\j を使い、\'{\i} のように書きます。

命令名称
\'é鋭アクセント(アキュート)
\`è重アクセント(グレーブ)
\^ê曲アクセント(サーカムフレックス)
\"öウムラウト・トレマ
\~ñチルダ
\=ōマクロン(長音記号)
\.ż上点
\uğブレーヴェ(短音記号)
\všハーチェク(キャロン)
\Hő二重鋭アクセント
\cçセディーユ
\rå上リング
\d下点
\b下線(バー)
\to͡o二文字にまたがる連結記号

アクセントでは作れない字もあります。ドイツ語のエスツェット \ss(ß)、北欧の \aa(å)と \o(ø)、ポーランド語の \l(ł)、そして合字の \ae(æ)と \oe(œ)は、それぞれ独立した文字なので独立した命令を持ちます。大文字は \AA\O\L\AE\OE のように綴りを大文字にするだけです。これらの命令はどれも LaTeX 標準で、追加パッケージは要りません。

UTF-8 でそのまま打つ

現在の LaTeX では、café も Grüße も naïve も そのまま打てます。2018 年 4 月のリリース(LaTeX News 28 の「UTF-8: the new default input encoding」)で UTF-8 がカーネルの既定の入力エンコーディングになったため、\usepackage[utf8]{inputenc} はもう要りません(書いても害はなく、古い文書がそのまま通ります)。それでも \usepackage[T1]{fontenc} は入れる価値があります。出力の側で 8 ビットのフォントエンコーディングに切り替わり、アクセント付きの語が正しくハイフネーションされ、PDF から文字をコピーしたときにも壊れないからです。XeLaTeX と LuaLaTeX なら話はさらに単純で、fontspec で OpenType フォントを指定すれば、入力も出力も最初から Unicode です。

latex
% pdfLaTeX: UTF-8 input is the default; T1 fixes output and hyphenation
\usepackage[T1]{fontenc}

café, Gr\"u\ss e, na\"{\i}ve, \AA ngstr\"om, \oe uvre, a\~no

% XeLaTeX / LuaLaTeX: Unicode all the way through
% \usepackage{fontspec}
% \setmainfont{TeX Gyre Pagella}

記号が多いとき——\verb\url

記号だらけの断片を一文字ずつ逃がすのは骨が折れますし、逃がし忘れも増えます。そこで verbatim の仕組みを使います。行内なら \verb|...| と書き、中身に現れない任意の文字(ここでは |)で囲むと、その内側では予約文字の特別な意味がすべて切られ、等幅で組まれます。複数行なら verbatim 環境です。ひとつ制約があり、\verb は引数の中では使えません——\section{... \verb|x| ...} と書くと ! LaTeX Error: \verb illegal in argument. になります。URL のように ~#%_ を含みやすい文字列には、url または hyperref パッケージの \url{...} が最善です。中の予約文字を自動で処理し、等幅で組み、長い URL を適切な位置で折ってくれます。

latex
\usepackage{hyperref}   % provides \url as well

Use \verb|a_b^c & d%| to show specials literally.

\begin{verbatim}
foo_bar = 100% & #1   % every character printed as-is
\end{verbatim}

See \url{https://example.com/path?id=1#sec_2~ok}

貼り付けたデータが表を壊すとき

実際の原稿では、特殊文字は自分で打ったから紛れ込むのではありません。CSV や Web ページ、メール、PDF から貼り付けられて入ってきます。とくに危ないのが表です。& は列の区切りなので、社名や論文題目に含まれる素の & ひとつで列数が狂い、! Misplaced alignment tab character &. が出るか、行の後半が消えます。貼る前に、その素材を三種類に分けてしまうのが早道です——散文として読ませる文字列、そのまま見せるコード、リンクとして処理する URL。分け終えれば、逃がし方は自動的に決まります。

latex
% before pasting into a table, search the pasted region for & % _ #
\begin{tabular}{ll}
  Smith \& Wesson & company name \\
  95\%            & reported rate \\
\end{tabular}

% do not escape URLs by hand; hand them to \url
\url{https://example.com/report?id=95#table_1}

まとめると、判断はほぼ三段階です。散文の中の一つ二つの記号は表のとおりに逃がす。まとまったコードや端末の出力\verbverbatim に渡す。URL\url{} に任せる。そのうえで、表がひと列ずれた、行の後半が消えた、突然 ! Missing $ inserted. が出た——という症状が出たら、まず貼り付けた範囲だけを検索し、&%_# を一つずつ「散文か、LaTeX の構文か」で仕分けます。原因はほぼ確実にそこにあります。