LaTeX の \verb についてのメモ

導入

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||foobar (“|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}} と書くべき)

Spread the love

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です