114

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 Child(Parent):
    def __init__(self, *args, **kwargs):
        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.

2
  • 1
    And why is morekeywords={...} not working with lstinputlistings. It does with lstlistings environment, but doesn't with input from a source file. Commented Nov 21, 2012 at 16:13
  • 6
    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
    Commented Nov 21, 2012 at 16:22

4 Answers 4

21

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 .

146

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,
morekeywords={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

7
  • 2
    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
    Commented May 11, 2014 at 22:39
  • 2
    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
    Commented Oct 10, 2016 at 3:24
  • 1
    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). Commented Mar 9, 2018 at 5:20
  • 2
    Nevermind, found the incantation. It's morestring=[s]{"""}{"""}. Found it here: tex.stackexchange.com/a/235742/156739 Commented Mar 9, 2018 at 5:31
  • 2
    Any chance of getting a listing number and caption with this method? Commented Jun 5, 2019 at 13:58
75

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}
8
  • 6
    Nice. The support for inline code using \pyth{print("Hello World!")} was really helpful! Commented Feb 7, 2019 at 20:47
  • 4
    Grand - and it is even available in Ubuntu's standard packages (apt show texlive-science | grep python). Commented Jun 23, 2019 at 13:26
  • 1
    very nice package ! love it !
    – firdaus
    Commented Dec 19, 2019 at 16:29
  • 4
    This answers to the point. This should have been the accepted answer. Commented Mar 31, 2020 at 0:04
  • 4
    Note that it is based on listings, and internally creates a style named mypython, so you can create derived styles directly (even if it's not documented, I just hope they wont later change the name of the environment). Practical if you want to add line numbering for instance using \lstnewenvironment{pythonLines}[1][]{\lstset{style=mypython,numbers=left}}{}, and then in your document \begin{pythonLines}your python code\end{pythonLines}
    – tobiasBora
    Commented May 13, 2021 at 6:24
6

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

2
  • 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
    Commented Jan 4, 2018 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.
    – BadAtLaTeX
    Commented Jan 4, 2018 at 9:50

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .