Dar formato a la fuente siguiendo las listas de palabras clave

Dar formato a la fuente siguiendo las listas de palabras clave

Me gustaría formatear algún código Python usando lstlistings y tener definiciones de funciones y clases en negrita, es decir, cualquier cosa que siga a la palabra classo def. Sin embargo, no quiero definir individualmente las palabras clave, ya que cuando se llaman las funciones no deben estar en negrita.

MWE:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[lighttt]{lmodern} % bold and italic ttfamily
\usepackage{color}
\usepackage{listings}
\usepackage{setspace}

\definecolor{Code}{rgb}{0.1,0.1,0.1}
\definecolor{Decorators}{rgb}{0.7,0,0.7}
\definecolor{Numbers}{rgb}{0.5,0,0}
\definecolor{MatchingBrackets}{rgb}{0.25,0.5,0.5}
\definecolor{Keywords}{rgb}{0,0,1}
\definecolor{self}{rgb}{.87,.46,0}
\definecolor{Strings}{rgb}{0,0.66,0}
\definecolor{Comments}{rgb}{0.388,0.4705,0.518}
\definecolor{Backquotes}{rgb}{0,0,0}
\definecolor{Classname}{rgb}{0,0,0}
\definecolor{FunctionName}{rgb}{0,0,0}
\definecolor{Operators}{rgb}{0,0,0}
\definecolor{Background}{rgb}{0.99,0.99,0.99}

\lstset{
language=Python,
numbers=left,
numberstyle=\footnotesize,
numbersep=1em,
xleftmargin=3em,
linewidth=23cm,
framextopmargin=1em,
framexbottommargin=1em,
showspaces=false,
showtabs=false,
showstringspaces=false,
frame=l,
tabsize=4,
% Basic
basicstyle=\ttfamily\small,
backgroundcolor=\color{Background},
% Comments
commentstyle=\color{Comments}\slshape,
% Strings
stringstyle=\color{Strings},
morecomment=[s][\color{Strings}]{"""}{"""},
morecomment=[s][\color{Strings}]{'''}{'''},
% keywords
keywordstyle={\color{Keywords}\bfseries},
% additional keywords
keywordstyle={[2]\color{Decorators}},
emph={self},
emphstyle={\color{self}\slshape},
}% 




\begin{document}
\lstset{language=Python, breaklines=true}
\begin{lstlisting}
    class MyClass:
        def __init__(self):
            print('do a thing')

    foo = MyClass()
\end{lstlisting}

\end{document}

Esto produce

ingrese la descripción de la imagen aquí

Me gustaría que la primera instancia de MyClass(siguiente palabra clave class) y __init__(siguiente def) estén en negrita, pero la segunda instancia de MyClass debería ser como se muestra. ¿Cómo haría para hacer eso?

Tenga en cuenta que solo la palabra entre la palabra clave y : o ( debe estar en negrita.

EDITAR: He intentado agregar

\lstset{moredelim=[s][\bfseries]{class }{:},
    moredelim=[s][\bfseries]{def }{(},}

sin suerte

Respuesta1

No deberías recargar el idioma en el argumento opcional. Esto sobrescribirá algunas de sus configuraciones; consulte el segundo ejemplo.

Puede intentar lo siguiente, pero tenga en cuenta que también imprime los dos puntos en negrita. En mi humilde opinión, sería bastante difícil evitarlo.

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[lighttt]{lmodern} % bold and italic ttfamily
\usepackage{color}
\usepackage{listings}
\usepackage{setspace}

\definecolor{Code}{rgb}{0.1,0.1,0.1}
\definecolor{Decorators}{rgb}{0.7,0,0.7}
\definecolor{Numbers}{rgb}{0.5,0,0}
\definecolor{MatchingBrackets}{rgb}{0.25,0.5,0.5}
\definecolor{Keywords}{rgb}{0,0,1}
\definecolor{self}{rgb}{.87,.46,0}
\definecolor{Strings}{rgb}{0,0.66,0}
\definecolor{Comments}{rgb}{0.388,0.4705,0.518}
\definecolor{Backquotes}{rgb}{0,0,0}
\definecolor{Classname}{rgb}{0,0,0}
\definecolor{FunctionName}{rgb}{0,0,0}
\definecolor{Operators}{rgb}{0,0,0}
\definecolor{Background}{rgb}{0.99,0.99,0.99}

\lstdefinestyle{mypython}{
language=Python,
numbers=left,
numberstyle=\footnotesize,
numbersep=1em,
xleftmargin=3em,
linewidth=23cm,
framextopmargin=1em,
framexbottommargin=1em,
showspaces=false,
showtabs=false,
showstringspaces=false,
frame=l,
tabsize=4,
% Basic
basicstyle=\ttfamily\small,
backgroundcolor=\color{Background},
% Comments
commentstyle=\color{Comments}\slshape,
% Strings
stringstyle=\color{Strings},
morecomment=[s][\color{Strings}]{"""}{"""},
morecomment=[s][\color{Strings}]{'''}{'''},
%% keywords
keywordstyle={\color{Keywords}\bfseries},
% additional keywords
keywordstyle={[2]\color{Decorators}},
emph={self},
emphstyle={\color{self}\slshape},
moredelim=**[s][\bfseries]{class }{:},
moredelim=**[s][\bfseries]{def }{:},
moredelim=**[s][\mdseries]{(}{)},
}%




\begin{document}
\begin{lstlisting}[style=mypython]
    class MyClass:
        def __init__(self):
            print('do a thing')

    foo = MyClass()
\end{lstlisting}

%wrong
\begin{lstlisting}[style=mypython,language=Python]
    class MyClass:
        def __init__(self):
            print('do a thing')

    foo = MyClass()
\end{lstlisting}


\end{document}

ingrese la descripción de la imagen aquí

información relacionada