¿Cómo codificar correctamente el color de la lista sin obtener espacios extraños entre caracteres?

¿Cómo codificar correctamente el color de la lista sin obtener espacios extraños entre caracteres?

Quiero preparar una lista de códigos que se vea así:

ingrese la descripción de la imagen aquí
Probé esto:

\lstset{escapeinside={<@}{@>}}
\begin{lstlisting}
<@\textcolor{blue}{void}@> fun(var<<@\textcolor{blue}{long int}@>> list)
\end{lstlisting}

Pero terminó renderizándose así:

ingrese la descripción de la imagen aquí

Esto me parece algo raro. Por ejemplo, el espacio entre los caracteres negros es diferente al de los caracteres azules. ¿Por qué esto es tan?

Editar

Configuración columnsde fullflexiblela siguiente manera: \begin{lstlisting}[columns=fullflexible]resolvió el problema. Más detalles enesta respuesta.

Respuesta1

Debe mantener el texto textual/listado fuera de los argumentos de otras macros y también fuera de las regiones escapadas.

ingrese la descripción de la imagen aquí

\documentclass{article}

\usepackage{listings}

\usepackage{color}
\def\z#1{\gdef\zz{\color{#1}}\aftergroup\zz}
\begin{document}

\lstset{escapechar=|}
\begin{lstlisting}
|\z{blue}|void|\z{black}| fun(var<|\z{blue}|long int|\z{black}|> list)
\end{lstlisting}

\end{document}

Respuesta2

Puede definir su propio entorno de listado y asignar diferentes colores a las listas de palabras clave que defina:

\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[procnames]{listings}
\usepackage{color}


\lstnewenvironment{myCode}[1][]{
\lstset{
    emph={void,long,int},
emphstyle=\color{blue},
emph={[2]fun},
emphstyle=[2]\color{green}
}}{}


\begin{document}

\begin{myCode}
void fun(var<long int> list)
\end{myCode}

\end{document}

información relacionada