Como colorir corretamente a listagem de códigos sem obter espaçamentos estranhos entre caracteres?

Como colorir corretamente a listagem de códigos sem obter espaçamentos estranhos entre caracteres?

Quero preparar uma listagem de código semelhante a esta:

insira a descrição da imagem aqui
Eu tentei isso:

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

Mas acabou renderizando assim:

insira a descrição da imagem aqui

Isso parece algo estranho para mim. Por exemplo, o espaçamento entre os caracteres pretos é diferente dos caracteres azuis. Porque isto é assim?

Editar

Configuração columnsda fullflexibleseguinte forma: \begin{lstlisting}[columns=fullflexible]resolveu o problema. Mais detalhes emesta resposta.

Responder1

Você precisa manter o texto literal/listagem fora dos argumentos de outras macros e também fora das regiões de escape.

insira a descrição da imagem aqui

\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}

Responder2

Você pode definir seu próprio ambiente de listagem e atribuir cores diferentes às listas de palavras-chave que você definir:

\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}

informação relacionada