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 \addlegendentry
ambiente?
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}
Uma solução alternativa que encontrei é colocar \{
... \}
no \legendentry
caso, mas fazer isso não faz a mesma coisa fora do pgfplot
e quero usar omesmocódigo independentemente, se possível. Talvez a solução seja uma opção que eu tenha que passar para o tikzpicture
ambiente, ou para o tikz
pacote ou para o listing
.
(Esses verb
ambientes 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 \lstinline
argumentos 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
\lstinline
o 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}
Uma alternativa seria usar a listings
interface para fancyvrb
(ou usar fancyvrb
diretamente):
\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}