導入
LaTeXをやったことがある人なら \verb
コマンドはきっと知っているだろう。
例: \verb|hoge|
→ hoge
例: \verb+foo bar+
→ foo bar
亜種として、\verb
の直後にスター *
がついた版は、空白を可視化する(空白が ⎵ みたいな記号になる)。
例:\verb*+foo bar+
→ foo⎵bar
この \verb
というコマンドは、「TeXの特殊文字を無力化する」「任意の文字を終端として使える」という点で、非常に風変わりである。\verb
コマンドを知ることは、TeXの字句解析のルール(カテゴリーコードとか)に対する理解を深めることに直結すると言っても過言でないだろう(たぶん)。というわけで、\verb
について重箱の隅をつついた結果をここに書いておく。
なお、TeXにおける「カテゴリーコード」とかそういうアレはここでは解説しない(対象読者が謎)。
特殊文字との兼ね合い
例:
\newcommand{\greet}{Hello world!}
\texttt{\greet}
\verb+\greet+
→
Hello world!
\greet
通常のコマンド(ここでは \texttt
)の引数の \greet
は展開されるのに対し、\verb
の引数の \greet
は展開されない。(バックスラッシュ \
等の、TeXの特殊文字は意味を持たない)
しかし、plain TeXの \catcode
を使ってカテゴリーコードの変更を行うと、 \verb
の引数であってもマクロの展開が行われる可能性がある。
例:
{
\catcode`|=0 % 縦棒 “|” を、バックスラッシュ “\” と同じような「コマンドの開始文字」として扱う
\def\score{33-4}
\verb+|score+
}
→ 33-4
(“|score
” とはならない!)
例:
{
\catcode`@=13 % アットマーク “@” を、「単独でコマンド名となる文字」として扱う
\def@{33-4}
\verb+@+
}
→ 33-4
(“@
” とはならない!)
LaTeXとしては、特殊文字というのは \{}$&#^_%~
の10文字および空白文字だけなので、それ以外の文字については「無力化」はされない。自前でカテゴリーコードを変更しても、それは LaTeX の知るところではないので、\verb
などのコマンドが思ったように動かなくても知らんがな、ということだろう。
コマンド名直後の空白
TeX では通常、アルファベットからなる名前がついたコマンド名の直後の空白は無視される。(一方で、記号1文字のコマンドの直後の空白は無視されない)
どういうことかというと、TeX的には “foo bar
” と “foobar
” は「別物」だし、“\! \@
” と “\!\@
” は「別物」だが、“\foo \bar
” と “\foo \bar
” と “\foo\bar
” は「全く同じ」である。
ただし、「どの文字が空白として扱われるか」というのは、厳密に言うと \foo
の展開結果によって変わりうるので、 \foo
を展開した結果として通常の空白文字 “
” が空白として扱われなくなる(カテゴリーコードが変更される)とその限りではない。
ほとんどのコマンドは「空白の扱われ方を変える」というようなことはないが、 \verb
はその例外の一つだ。つまり、 \verb
の直後の空白は無視されない。
例:\verb |foo bar|
→ |foo
bar (“|foo
” だけがタイプライター体)
ただし、LaTeXの公式マニュアル的には「\verb
の直後に空白を置いてはいけない」ことになっているようだ(参照:L. Lamport, LaTeX: A Document Preparation System の187ページ)。
他のコマンドの引数には使えない
\verb
コマンドは、\verb
の展開時に「TeXの特殊文字の無力化」と「開始・終了文字のカテゴリーコードの変更」を行なうため、\verb
を書いた場所で展開されないとうまく動かない。
要するに、コマンドの引数に \verb
を使っても動かない。
例:\foo{\verb|piyo|}
→ エラー!
ちなみに、試してみたところ、開始・終了文字をチルダ ~
にすれば、コマンドの引数であってもタイプライター体での出力はできるようだ(特殊文字の無力化はされない)。しかし、この事実は実装の詳細に激しく依存すると考えられるので、素直に \texttt
を使おう。
例:
\newcommand{\foo}[1]{#1}
\foo{\verb~33-4~}
→ 33-4
(素直に \foo{\texttt{33-4}}
と書くべき)