How to cross-reference inside of a verbatim (or listings) environment

You're not missing simple features; the standard verbatim environment doesn't allow for interpreting commands. However, the fancyvrb package has this facility:

\documentclass{article}

\usepackage{amsmath}
\usepackage{listings}
\usepackage{fancyvrb}

\begin{document}
This is the pythagorean theorem:
\begin{equation}\label{eq:pyth}
a^2+b^2=c^2
\end{equation}

I can reference it normally: Equation \ref{eq:pyth}.

I can write a code example that will work:
\begin{Verbatim}[commandchars=\\\[\]]
# An R function to solve for c.
# See Equation \ref[eq:pyth] for details.
solve.for.c <- function(a,b){
  return( sqrt(a^2 + b^2))
}
\end{Verbatim}

And also a \texttt{lstlisting} environment:
\begin{lstlisting}[language=R,escapechar=',columns=fullflexible]
# An R function to solve for c.
# See Equation '\ref{eq:pyth}' for details.
solve.for.c <- function(a,b){
  return( sqrt(a^2 + b^2))
}
\end{lstlisting}

\end{document}

For commandchars in Verbatim you have to specify three characters (escaped with the backslash) that aren't otherwise used in the environment's text. The same for escapechar with lstlisting. These characters may be chosen "locally".

Take your pick.

enter image description here


enter image description here

If you have three handy characters that don't appear in the verbatim text you can use them instead of \ { } for example

\documentclass{article}

\usepackage{amsmath}

\makeatletter
\let\oldv\@verbatim
\def\@verbatim{\oldv\catcode`\!=0 \catcode`\`=1 \catcode`\'=2 }
\makeatother

\begin{document}
This is the pythagorean theorem:
\begin{equation}\label{eq:pyth}
a^2+b^2=c^2
\end{equation}

I can reference it normally: Equation \ref{eq:pyth}.

I can write a code example that won't work:
\begin{verbatim}
# An R function to solve for c.
# See Equation !ref`eq:pyth' for details.
solve.for.c <- function(a,b){
  return( sqrt(a^2 + b^2))
}
\end{verbatim}



How can I do this better?
\end{document}