そのまま出力(verbatim 系)

打ち込んだ文字を 一字一句そのまま 紙面に出したいことがあります。コマンドやコメント、特殊文字の意味をすべて止め、等幅(タイプライタ体)で印字する仕組みが 逐語(verbatim) です。このページでは、行内の \verb、ブロックの verbatim 環境、ファイル丸ごとの \verbatiminput、そして「コマンドの引数の中では使えない」という重要な制約と回避策、さらに一部のコマンドを生かせる alltt、行番号や枠を付けられる fancyvrb までを順に見ていきます。

verbatim 環境と \verb

逐語出力の土台は、LaTeX に最初から組み込まれている **verbatim 環境** です。\begin{verbatim}\end{verbatim} のあいだに書いたものは、打った通りに出力されます。バックスラッシュは命令を始めず印字される \ になり、% はコメントにならず、空白も改行もそのまま残り、全体がタイプライタ体(\tt)で組まれます。プログラムのソースや、$& を多く含む記号列を見せるのに向いています。

latex
\begin{verbatim}
for i in range(3):
    print("100% & $5")   # nothing here is interpreted
\end{verbatim}

ただ一つ守るべき制約として、**環境の中に文字列 \end{verbatim} をそのまま書くことはできません**。LaTeX はそれを見つけた時点で環境の終わりと判断するからです。逐語の中で \end{verbatim} という文字列自体を見せたいときは、後述の fancyvrb で終端文字列を変えるか、\verb で部分的に逃がします。

行の 途中 にちょっとだけ逐語を差し込みたいときは、行内版の **\verb** を使います。書き方は \verb の直後に区切り文字を 1 つ置き、逐語にしたい文字列を挟み、同じ区切り文字で閉じる、というものです。区切り文字は 本文に現れない任意の非英字 を選べます。よく使われるのは \verb|...| ですが、| が中身に含まれるなら \verb!...!\verb+...+ のように別の文字にします。\verb と区切り文字のあいだに空白を入れてはいけません。

latex
The macro \verb|\textbf{...}| sets bold text, and
the pipe itself is shown with \verb!a|b! instead.

アスタリスク付きの **\verb*** は、中の空白を可視スペース文字(␣)として印字します。空白の個数を正確に示したいコード例などで便利です。同様に verbatim* 環境も、ブロック内の空白を ␣ で表示します。

なお、URL のように ~#%_ を含みがちな文字列だけが目的なら、url または hyperref パッケージの \url{...} の方が、適切な位置での折り返しまでしてくれて扱いやすい場合があります。

ファイルを丸ごと出す(\verbatiminput)

外部ファイルの中身をそのまま貼り付けたいときは、**verbatim パッケージ(LaTeX 必須ツール群に含まれます)が提供する \verbatiminput{ファイル名}** が便利です。プリアンブルで \usepackage{verbatim} を読み込んでおき、本文で \verbatiminput{program.py} のように書くと、そのファイルの全行が逐語で組まれます。原稿に直接コピーするのと違い、元ファイルを編集すれば出力も自動で追従するので、ソースと文書を二重管理せずに済みます。

document.tex
\usepackage{verbatim}
% ...
\verbatiminput{hello.py}

同じ verbatim パッケージは、\begin{comment} から \end{comment} までをまるごと無視する **comment 環境** も追加します(逐語出力ではなく「出力しない」用途で、下書きの一時退避などに使います)。

コマンドの引数の中では使えない

ここが逐語出力で最もつまずきやすい点です。**\verbverbatim 環境は、別のコマンドの引数の中に書くことができません。** たとえば \section{\verb|code|}\footnote{...}、表のセル、\caption{...} の中などです。理由はカテゴリコード(catcode、各文字の役割)にあります。\verb は引数を読む直前に catcode を切り替えますが、コマンドの引数は 呼び出された時点で既に通常の catcode でトークン列へ変換済み のため、\verb が切り替える前に解釈が終わってしまうのです。書くとたいていエラーになります。

回避策は二つあります。一つは **cprotect パッケージ**。守りたいコマンドの前に \cprotect を付けるだけで、引数の中の逐語が通るようになります。たとえば \cprotect\section{\verb"foo"} のように書きます。環境の \begin を守る \cprotEnv も用意されています。

もう一つは、後述の fancyvrb の **\SaveVerb / \UseVerb**。先に逐語テキストを名前を付けて保存しておき、引数の中ではその名前を呼び出すだけにする、という二段構えです。\SaveVerb{ラベル}|逐語テキスト| で保存し、\UseVerb{ラベル} で取り出します。

latex
% Workaround 1: cprotect
\usepackage{cprotect}
\cprotect\section{The \verb|\foo| command}

% Workaround 2: fancyvrb SaveVerb / UseVerb
\usepackage{fancyvrb}
\SaveVerb{cmd}|\foo|
\section{The \UseVerb{cmd} command}

コマンドを生かす alltt

通常の逐語では、せっかくのコード例に 一部だけ強調や色 を付けたくても、命令が効かないため手が出せません。そこで **alltt パッケージ(これも LaTeX 標準配布に含まれます)の alltt 環境** が役立ちます。allttverbatim とほぼ同じく等幅でそのまま組みますが、**バックスラッシュ \ と波括弧 { } だけは通常の意味を保ちます**。つまり逐語のような見た目のまま、内部で LaTeX のコマンドを使えるのです。

latex
\usepackage{alltt}
% ...
\begin{alltt}
def \textbf{greet}(name):
    return "Hi, " + name   \textit{# a comment}
\end{alltt}

この例では、関数名 greet が太字に、コメント部分が斜体になり、それ以外はすべて打った通りに残ります。引き換えに、\ { } の 3 文字を 文字として 出したいときは \textbackslash\{\} のように明示する必要があります(verbatim 環境ならそのまま出ます)。手作業で軽く飾りたいときは alltt、完全にそのまま出したいときは verbatim、と使い分けます。

行番号・枠を付ける fancyvrb

組み込みの逐語には、行番号も枠も付けられません。より高機能なのが **fancyvrb パッケージ で、その中心が 大文字始まりの Verbatim 環境**(小文字の verbatim とは別物)です。オプションは、\begin{Verbatim}[キー=値, ...] のように環境ごとに指定するか、\fvset{キー=値, ...} でプリアンブルから一括設定します。

よく使うオプションは次のとおりです。numbers=left(または right)で行番号を付け、frame=single で全体を枠で囲み、fontsize=\small のようにフォントサイズを指定します。さらに commandchars を使うと、逐語の中でも一部の命令を生かせます。

オプション主な値働き
numbersnone / left / right行番号の位置(既定は none)
framenone / single / lines / leftline / topline / bottomline枠の種類(既定は none)
fontsize\small\footnotesize などフォントサイズ(既定は本文と同じ)
commandchars\\\{\}エスケープ文字とグループ開始・終了の 3 文字を指定し、命令を有効化

次の例は、行番号を左に付け、一重枠で囲み、文字を小さめにした Verbatim ブロックです。

latex
\usepackage{fancyvrb}
% ...
\begin{Verbatim}[numbers=left, frame=single, fontsize=\small]
def greet(name):
    return "Hello, " + name
\end{Verbatim}

commandchars=\\\{\} を指定すると、逐語の中でも \{} がそれぞれエスケープ文字とグループ区切りとして働き、alltt のように命令を埋め込めます。ファイルを丸ごと取り込む **\VerbatimInput[オプション]{ファイル名}** もあり、\verbatiminput と違って上記のオプションをそのまま渡せます。さらに前述の \SaveVerb\UseVerb により、コマンド引数の中でも逐語が使えます。

最後に注意点を一つ。ここで扱ったのはあくまで 「そのまま出す」 ための仕組みで、キーワードの色分けなどの 構文ハイライト は行いません。プログラムのソースを色付き・整形して載せたいなら、専用の **listings や、Python の Pygments を使う minted** が適任です(「ソースコード掲載」のページで扱います)。