# Putting math inside a verbatim environment without altering the formatting

In a verbatim code listing, I want to use inline math in comments with the same formatting that I get for inline math in body text. I can use a math environment, but the spacing is weird. In this example, there is a lot of space inside the angle brackets and after the comma.

\documentclass{article}
\usepackage{fancyvrb}
\begin{document}

\begin{Verbatim}[commandchars=\\\{\},codes={\catcode^=7}]
# visit each $$\langle x, y \rangle \in s^2$$
for x in s:
for y in s:
foo(x, y)
\end{Verbatim}

\end{document}


Is there a way to get normal spacing?

• Spaces are obeyed in verbatim mode; so $$\langle{}x,y\rangle\in{}s^2$$ should do. – egreg Jul 23 '13 at 20:26
• May be you can look into using one of the algorithmic packages in latex to typeset this? It will look better also than verbatim. – Nasser Jul 23 '13 at 20:34
• @egreg Oh, that's what's going on! I guess spaces are a different character class in verbatim mode. If you make that into an answer, I'll accept it. – Heatsink Jul 24 '13 at 1:32

Spaces are obeyed in verbatim mode and Verbatim uses \  (backslash-space) when it finds a space in the input. There are some workarounds. In all the examples I omitted \catcode^=7, preferring \sp instead of ^; but your option can be employed as well.

## Using empty groups

\documentclass{article}
\usepackage{fancyvrb}
\begin{document}

\begin{Verbatim}[commandchars=\\\{\}]
# visit each $$\langle{}x,y\rangle\in{}s\sp{2}$$
for x in s:
for y in s:
foo(x, y)
\end{Verbatim}

\end{document}


This adds ordinary math atoms, but it should rarely be a concern with respect to spacing.

## Using a noop macro

\documentclass{article}
\usepackage{fancyvrb}
\begin{document}

\newcommand{\?}{}

\begin{Verbatim}[commandchars=\\\{\}]
# visit each $$\langle\?x,y\rangle\in\?s\sp{2}$$
for x in s:
for y in s:
foo(x, y)
\end{Verbatim}

\end{document}


This avoids all possible spacing issues. Notice that a control symbol is used, so there's no need to delimit it with spaces.

## Make the space again an ignored space in math mode

\documentclass{article}
\usepackage{fancyvrb}
\begin{document}

\makeatletter
\newcommand{\verbmathspace}{\let\FV@Space\space}
\makeatother

\begin{Verbatim}[commandchars=\\\{\},
codes=\everymath\expandafter{\the\everymath\verbmathspace}]
# visit each $$\langle x, y\rangle\in s\sp{2}$$
for x in s:
for y in s:
foo(x, y)
\end{Verbatim}

\end{document}


In math mode the space is reverted to a normal space, so it will be ignored by TeX rule.