5

I have \newcommand\dd[2]{\item[\texttt{#1}] #2} and later I have

\dd{bc}{text \verb#$(echo 5+4 | bc)# text \verb#$((5+4))# text}

and I get

! You can't use `macro parameter character #' in math mode.
<argument> ...nicht mit \verb ##$(echo 5+4 | bc)##
rechnen, sondern die neue...
l.74 ...ekten Rechnen, \verb#$((5+4))#, benutzen.}
Sorry, but I'm not programmed to handle this case;
I'll just pretend that you didn't ask for it.
If you're in the wrong mode, you might be able to
return to the right one by typing `I}' or `I$' or `I\par'.

How can I get the verbatim into my command without the command interpreting it wrongly?

Martin Ueding
  • 2,873
  • 4
  • 23
  • 38

4 Answers4

3

As already mentioned in comment, verbatim or its short form \verb is a different beast altogether. If you must pass verbatim stuff as arguments, you could consider a fancyvrb work-around.

Using fancyvrb you can save and restore your verbatim commands in the following way:

\usepackage{fancyvrb}% http://ctan.org/pkg/fancyvrb
\DefineShortVerb{\#}% # denotes verbatim opening/closing character
\SaveVerb{VerbA}#(echo 5+4 | bc)#
\SaveVerb{VerbB}#$((5+4))#

This stores (echo 5+4 | bc) as-is in VerbA, and $((5+4)) in VerbB, which can be used (restored) later by means of \UseVerb{VerbA} and \UseVerb{VerbB} respectively. Here is a minimal working example:

enter image description here

\documentclass{article}
\usepackage{fancyvrb}
\newcommand\dd[2]{\item[\texttt{#1}] #2}
\begin{document}
\DefineShortVerb{\#}% # denotes verbatim opening/closing character
\SaveVerb{VerbA}#(echo 5+4 | bc)#
\SaveVerb{VerbB}#$((5+4))#
\begin{description}
  \dd{bc}{text \UseVerb{VerbA} text \UseVerb{VerbB} text}
\end{description}
\end{document}

Edit: A similar work-around exist using the verbdef package. It provides \verbdef{<cmd>}{<verb>} that defines \<cmd> with verbatim <verb> content. The following MWE produces the same output as above:

\documentclass{article}
\usepackage{verbdef}
\newcommand\dd[2]{\item[\texttt{#1}] #2}
\begin{document}
\verbdef\VerbA{(echo 5+4 | bc)}
\verbdef\VerbB{$((5+4))}
\begin{description}
  \dd{bc}{text \VerbA\ text \VerbB\ text}
\end{description}
\end{document}
Werner
  • 603,163
3

Nowadays you can use the more "robust" \Verb from fvextra package.

Note both \Verb|...| and \Verb{...} is supported (with some restrictions). Also when used as argument, don't use # as delimiters.

\documentclass{article}
\usepackage{fvextra}
\newcommand\dd[2]{\item[\texttt{#1}] #2}

\begin{document} \begin{description} \dd{bc}{text \Verb{$(echo 5+4 | bc)} text \Verb{$((5+4))} text} \end{description} \end{document}

enter image description here

muzimuzhi Z
  • 26,474
2

I'm not sure I fully understand what you're trying to achieve, but I think the simplest solution may be something along the following model. Note that one has to "escape" the dollar sign by prefixing a backslash to it; on the other hand, it's not necessary to introduce verbatim strings explicitly.

\documentclass{article}
\newcommand\dd[2]{\item[\texttt{#1}] #2}
\begin{document}
\begin{description}
\dd{bc}{text \texttt{\$(echo 5+4 $|$ bc)} text \texttt{\$((5+4))} text}
\end{description}
\end{document}

enter image description here

Martin Scharrer
  • 262,582
Mico
  • 506,678
0

Use the following:

\newcommand\dd[2]{\texttt{\detokenize{#1}} #2}

This will print #1 vermbatim.

Alkis
  • 101