As listagens aplicam palavras-chave onde não deveriam

As listagens aplicam palavras-chave onde não deveriam

Quero implementar o código Python dentro de um arquivo LaTeX. Segue um exemplo minimalista

\documentclass[12pt]{report}

\usepackage{listings}
\usepackage[dvipsnames]{xcolor}

\begin{document}
\newcommand\pythonstyle{\lstset{
language=Python,
basicstyle=\scriptsize,
backgroundcolor=\color{lightgray},
otherkeywords={self,with,as},
keywordstyle=\color{NavyBlue},
commentstyle=\color{OliveGreen},
emph={MyClass,__init__,In,Out},
emphstyle=\color{red}
showstringspaces=false,
}}

{\pythonstyle\begin{lstlisting}
# with my current listing, this is not working as inteded

import pandas as pd

data = pd.DataFrame()
\end{lstlisting}}


\end{document}

produzindo a seguinte saída

Saída de arquivo Tex

O que posso fazer para que o estilo de palavra-chave seja aplicado apenas a palavras inteiras e não a todos os casos que o tex encontra, mesmo dentro de algumas palavras?

Responder1

Apenas como alternativa: mintedfaz um bom trabalho destacando apenas o que é necessário.

exemplo cunhado

% arara: pdflatex: {shell: yes}
\documentclass[12pt]{report}

\usepackage{minted}
\usepackage[svgnames]{xcolor}

\usemintedstyle{vs}
\setminted{bgcolor=GhostWhite!90!gray}

\begin{document}

\begin{minted}{python}
# with my current listing, this is not working as inteded

import pandas as pd

data = pd.DataFrame()
\end{minted}


\end{document}

Responder2

Uma análise mais aprofundada da documentação das listagens revelou que estou usando as opções erradas. Isso diz que (fonte):

[...]

outras palavras-chave={〈palavras-chave〉}

Define palavras-chave que contêm outros caracteres ou começam com dígitos. Cada 'palavra-chave' fornecida é impressa no estilo de palavra-chave, mas sem alterar o status de 'letra', 'dígito' e 'outros' dos caracteres. Esta chave foi projetada para definir palavras-chave como =>,->,-->,--,:: e assim por diante. Se uma palavra-chave for uma subsequência de outra (como--e-->), você deverá especificar a mais curta primeiro.

[...]

A opção apropriada era morekeywords. Usar morekeywords, em vez de otherkeywords, resolveu meu problema! @Dr.ManuelKuehner, isso deve ser interessante para você! @TeXnician, obrigado pela sua solução alternativa!

\documentclass[12pt]{report}

\usepackage{listings}
\usepackage[dvipsnames]{xcolor}

\begin{document}
\newcommand\pythonstyle{\lstset{
language=Python,
basicstyle=\scriptsize,
backgroundcolor=\color{lightgray},
morekeywords={self,with,as},
keywordstyle=\color{NavyBlue},
commentstyle=\color{OliveGreen},
emph={MyClass,__init__,In,Out},
emphstyle=\color{red}
showstringspaces=false,
}}

{\pythonstyle\begin{lstlisting}
# with my current listing, this is not working as inteded

import pandas as pd

data = pd.DataFrame()
\end{lstlisting}}


\end{document}

Resultado correto

Obrigado novamente! Muitas felicidades

informação relacionada