Why doesn’t verbatim work within ...?

The LaTeX verbatim commands work by changing category codes. Knuth says of this sort of thing “Some care is needed to get the timing right...”, since once the category code has been assigned to a character, it doesn’t change. So \verb and \begin{verbatim} have to assume that they are getting the first look at the parameter text; if they aren’t, TeX has already assigned category codes so that the verbatim command doesn’t have a chance. For example:

\verb+\error+

will work (typesetting ‘\error’), but

\newcommand{\unbrace}[1]{#1}
\unbrace{\verb+\error+}

will not (it will attempt to execute \error). Other errors one may encounter are ‘\verb ended by end of line’, or even the rather more helpful ‘\verb illegal in command argument’. The same sorts of thing happen with \begin{verbatim} ... \end{verbatim}:

\ifthenelse{\boolean{foo}}{%
\begin{verbatim}
foobar
\end{verbatim}
}{%
\begin{verbatim}
barfoo
\end{verbatim}
}

provokes errors like ‘File ended while scanning use of \@xverbatim’, as \begin{verbatim} fails to see its matching \end{verbatim}.

This is why the LaTeX book insists that verbatim commands must not appear in the argument of any other command; they aren’t just fragile, they’re quite unusable in any command parameter, regardless of \protection. (The \verb command tries hard to detect if you’re misusing it; unfortunately, it can’t always do so, and the error message is therefore not a reliable indication of problems.)

The first question to ask yourself is: “is \verb actually necessary?”.

Otherwise, there are three partial solutions to the problem.

Documentation of both url and verbdef is in the package files.
fancyvrb.sty
macros/latex/contrib/fancyvrb (gzipped tar, browse)
memoir.cls
macros/latex/contrib/memoir (gzipped tar, browse)
url.sty
macros/latex/contrib/misc/url.sty
verbdef.sty
macros/latex/contrib/misc/verbdef.sty

This question on the Web: http://www.tex.ac.uk/cgi-bin/texfaq2html?label=verbwithin