67

I am using package listings to import my Python source code into my LaTeX document. I use the command \lstinputlistings. I have a Python source like

class MyClass(Yourclass):
    def __init__(self, my, yours):
        bla bla bla...

What should I write in my \lstset command in order to highlight words MyClass, __init__ etc.? I wouldn't want to write any word I want to be highlighted. I tried using moredelims=[s][\color{teal}]{class}{(} inside lstset but it doesn't work.

migrated from stackoverflow.com Nov 23 '12 at 1:16

This question came from our site for professional and enthusiast programmers.

  • And why is morekeywords={...} not working with lstinputlistings. It does with lstlistings environment, but doesn't with input from a source file. – fmonegaglia Nov 21 '12 at 16:13
  • 4
    I'd recommend using minted instead or pythontex. They produce much better results and also the default highlighting is already coloured (and the colours are nice). Anyway this should really be posted in TeX Exchange as unutbu said. (On a side note: don't add information as comment, edit your question). – Bakuriu Nov 21 '12 at 16:22
11

I'd consider running your code through pygments to generate the latex, probably using the minted package. You can get some details here https://stackoverflow.com/questions/1966425/source-code-highlighting-in-latex#1985330 .

97

Good approach is defining new environments for programming language. Minimal setup can be around this:

\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}

% Default fixed font does not support bold face
\DeclareFixedFont{\ttb}{T1}{txtt}{bx}{n}{12} % for bold
\DeclareFixedFont{\ttm}{T1}{txtt}{m}{n}{12}  % for normal

% Custom colors
\usepackage{color}
\definecolor{deepblue}{rgb}{0,0,0.5}
\definecolor{deepred}{rgb}{0.6,0,0}
\definecolor{deepgreen}{rgb}{0,0.5,0}

\usepackage{listings}

% Python style for highlighting
\newcommand\pythonstyle{\lstset{
language=Python,
basicstyle=\ttm,
otherkeywords={self},             % Add keywords here
keywordstyle=\ttb\color{deepblue},
emph={MyClass,__init__},          % Custom highlighting
emphstyle=\ttb\color{deepred},    % Custom highlighting style
stringstyle=\color{deepgreen},
frame=tb,                         % Any extra options here
showstringspaces=false            % 
}}


% Python environment
\lstnewenvironment{python}[1][]
{
\pythonstyle
\lstset{#1}
}
{}

% Python for external files
\newcommand\pythonexternal[2][]{{
\pythonstyle
\lstinputlisting[#1]{#2}}}

% Python for inline
\newcommand\pythoninline[1]{{\pythonstyle\lstinline!#1!}}

\begin{document}

\section{``In-text'' listing highlighting}

\begin{python}
class MyClass(Yourclass):
    def __init__(self, my, yours):
        bla = '5 1 2 3 4'
        print bla
\end{python}

\section{External listing highlighting}

\pythonexternal{demo.py}

\section{Inline highlighting}

Definition \pythoninline{class MyClass} means \dots

\end{document}

Output:

enter image description here

  • very nice, helped me a lot. My suggestion is to add \small to all styles, to make it smaller. Right now the code looks clumsy and big to me – kadir May 11 '14 at 22:39
  • 1
    Have to look at this more later, I implemented this but then I had lines with answers to question c) where I was putting that in Math Mode: $c)$ and this was tripping up the utf-8 encoding and some other errors, but otherwise this is awesome!! +1 – JimLohse Oct 10 '16 at 3:24
  • This seems to not understand """triple quoted strings""". Any chance there is some wizardry to make this happen? I've been looking for things that can be passed to \lstset, but so far I've come up with nothing useful (only ways to change the color of strings). – Bailey Parker Mar 9 '18 at 5:20
  • Nevermind, found the incantation. It's morestring=[s]{"""}{"""}. Found it here: tex.stackexchange.com/a/235742/156739 – Bailey Parker Mar 9 '18 at 5:31
  • Any chance of getting a listing number and caption with this method? – Luís de Sousa Jun 5 at 13:58
20

I found this python package pythonhighlight on Github

Define it like this \usepackage{pythonhighlight} and use it like this:

\begin{python}
def f(x):
    return x
\end{python}
  • 2
    Nice. The support for inline code using \pyth{print("Hello World!")} was really helpful! – Giacomo Tecya Pigani Feb 7 at 20:47
  • 2
    Grand - and it is even available in Ubuntu's standard packages (apt show texlive-science | grep python). – Gerald Senarclens de Grancy Jun 23 at 13:26
3

Some while ago I have modified the existing python language-definition from the listings-package:

Listings: syntax for literate

You might find something useful. If I remember correctly, one can put all this in an external *.sty-file. Also see the follow-up question.

another problem

  • How do you I remove the first quotation marks? Even though my code doesn't have the quotation marks. In the output PDF the quotation marks appear. I couldn't figure out what creates those quotation marks? – nxkryptor Jan 4 '18 at 6:51
  • @nxkryptor: that was a bug that appeared, because I forgot the comma after some command. See the linked follow up; its code should have that fixed. It was mentioned in the answer of the first question though. – gr4nt3d Jan 4 '18 at 9:50

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.