Cores diferentes para cada argumento e valor nas listagens

Cores diferentes para cada argumento e valor nas listagens

Esta pergunta recente (imprima colchetes azuis em um idioma e preto em outro)me fez levantar (até) mais duas perguntas sobre o listingspacote:

  1. Existe uma opção semelhante a opstyleque afeta apenasumargumento (usando ", ,ou ;como primeiro delimitador e =como segundo) eumvalor pertencente a esse argumento? (usando =como primeiro delimitador e ", ,ou ;como segundo)?
  2. É possível ajustar a cor utilizada no meio do listingsambiente, sem que ela apareça como comentário ou linha, etc.? Todas essas soluções definem cores fora do ambiente real.

Nem olistingsmanual, nem oArtigo do WikiLivrosdê respostas conclusivas (e também não mencione macros, incluindo \lst@thestyledevo acrescentar), então olhei listings.sty, sem surpresa, sem sucesso, parcialmente porque o .sty-file não tem absolutamente nenhum comentário em nenhuma linha para explicação.

Para sua conveniência, incluí o MWE do opstyleexemplo e a imagem do tópico mencionado anteriormente. No meu caso eu gostaria, por exemplo, de colorir a parte string: ()laranja, mas a {}><;&parte vermelha.

\documentclass{article}

\usepackage{xcolor}
\usepackage{listings}

\newcommand\opstyle{\color{red}} % <--- customise operator style here

\makeatletter

\lstset
{%
  language=C++,
  alsoletter=0123456789,% to prevent \opstyle from being applied to digits
}

% Hook into listings
\lst@AddToHook{OutputOther}{\ProcessOther@silmeth}

% helper macro
\newcommand\ProcessOther@silmeth
{%
  \ifnum\lst@mode=\lst@Pmode%     % If we're in `Processing' mode...
    \def\lst@thestyle{\opstyle}%  % ... redefine the style locally
  \fi%
}

\makeatother

\begin{document}
\begin{lstlisting}[]
int i = 0;
if(i > 1) && (1/2 < 2) {

    // one-line comment ()={}><;&

    printf("string: ()={}><;&");

    /*
      block comment ()={}><&;
    */
}
\end{lstlisting}
\end{document}

exemplo de estilo de operação

informação relacionada