Como usar listagens dentro das legendas do pgfplots?

Como usar listagens dentro das legendas do pgfplots?

Preciso adicionar um código de listagem (geral) em uma legenda de plotagem. Por algum motivo listings(inline) não interage bem com o \addlegendentry, o que posso fazer para que o mesmo código funcione fora e dentro de um \addlegendentryambiente?

Note que até dá um resultado estranho (ver imagem), onde a frase está na ordem errada.

\documentclass[]{article}
\usepackage{pgfplots}
\usepackage[]{listings}
\begin{document}
\lstinline[]|(double x){bbbb}| %ok

\begin{tikzpicture}
\begin{axis}[]
\addlegendentry{\lstinline[]|(double x){bbbb;}|}; %not ok, garbage
\addplot+[mark=none, line join=round, fill opacity = 0.5, ] coordinates {
( 1, 2 )
( 3, 4)
}; 
\end{axis}
\end{tikzpicture}
\end{document}

listagem estranha dentro do pgfplot

Uma solução alternativa que encontrei é colocar \{... \}no \legendentrycaso, mas fazer isso não faz a mesma coisa fora do pgfplote quero usar omesmocódigo independentemente, se possível. Talvez a solução seja uma opção que eu tenha que passar para o tikzpictureambiente, ou para o tikzpacote ou para o listing.

(Esses verbambientes sempre me dão dores de cabeça.)


EDITAR: Graças ao esclarecimento do Gonzalo, fiz esse código que permite usar o mesmo código dentro e fora da legenda, usa um hack ( \textrm, outras soluções são bem-vindas):

\documentclass[]{article}
\usepackage{pgfplots}
\usepackage[]{listings}
\begin{document}
\textrm{\lstinline[]|(double x)\{bbbb\}|} %ok
\begin{tikzpicture}
\begin{axis}[small]
\addlegendentry{\textrm{\lstinline[]|(double x)\{bbbb\}|}}; %now ok
\addplot+[mark=none, line join=round, fill opacity = 0.5, ] coordinates {( 1, 2 )}; 
\addlegendentry{\lstinline[]|(double x){bbbb;}|}; % not ok, garbage
\addplot+[mark=none, line join=round, fill opacity = 0.5, ] coordinates {( 1, 2 )}; 
\addlegendentry{\lstinline[]|(double x)\{bbbb\}|}; % not what one expects
\addplot+[mark=none, line join=round, fill opacity = 0.5, ] coordinates {( 1, 2 )}; 
\end{axis}
\end{tikzpicture}
\end{document}

Responder1

O uso de \lstinlineargumentos internos é experimental; veja esta subseção na documentação:

5.1 Listagens dentro de argumentos

Há algumas coisas a serem consideradas se você quiser usar \lstinlineo ambiente de listagem dentro dos argumentos. Como o TeX lê o argumento antes da "lst-macro" ser executada, este pacote não pode fazer nada para preservar a entrada: os espaços são reduzidos para um espaço, o tabulador e o final da linha são convertidos em espaços, o caractere de comentário do TeX não é imprimível e assim por diante. Portanto, você deve trabalhar um pouco mais. Você deve colocar uma barra invertida na frente de cada um dos quatro caracteres a seguir: \{}%. Além disso, você deve proteger os espaços da mesma maneira se: (i) houver dois ou mais espaços seguidos ou (ii) o espaço for o primeiro caractere da linha. Isso não é suficiente: cada linha deve ser finalizada com um "line feed" ^^J. E você não pode escapar para o LaTeX dentro dessas listagens!

Receio que a única solução seja, conforme sugerido na documentação, usar \{e \}:

\documentclass[]{article}
\usepackage{pgfplots}
\usepackage[]{listings}

\begin{document}

\begin{tikzpicture}
\begin{axis}[]
\addlegendentry{\lstinline[]|(double x)\{bbbb;\}|}; 
\addplot+[mark=none, line join=round, fill opacity = 0.5, ] coordinates {
( 1, 2 )
( 3, 4)
}; 
\end{axis}
\end{tikzpicture}

\end{document}

insira a descrição da imagem aqui

Uma alternativa seria usar a listingsinterface para fancyvrb(ou usar fancyvrbdiretamente):

\documentclass[]{article}
\usepackage{pgfplots}
\usepackage{fancyvrb}

\fvset{commandchars=\\\{\}}

\begin{document}
\Verb!(double x)\{bbbb;\}!

\begin{tikzpicture}
\begin{axis}[]
\addlegendentry{\Verb!(double x)\{bbbb;\}!}; 
\addplot+[mark=none, line join=round, fill opacity = 0.5, ] coordinates {
( 1, 2 )
( 3, 4)
}; 
\end{axis}
\end{tikzpicture}

\end{document}

insira a descrição da imagem aqui

informação relacionada