Include source code in Latex with “Listings”

By thurnherr

 First include the “listings”-package into your document:

\usepackage{listings}

Basics

Now you have basically two possibilities. Either you type/copy your source code directly into the Latex document:

\begin{lstlisting}
place your source code here
\end{lstlisting}

The other possibility is to directly include the source file:

\lstinputlisting{filename.java}

This is particularly useful if you are still editing your source code. Obviously, Latex will always include the latest version of the source while generating the PDF-file.

Supported languages

The listings package does not only support java source code, but there is an exhaustive list of languages which are known to the package:
ABAP (R/2 4.3, R/2 5.0, R/3 3.1, R/3 4.6C, R/3 6.10), ACSL Ada (83, 95), Algol (60, 68), Ant, Assembler (x86masm), Awk (gnu, POSIX), bash, Basic (Visual), C (ANSI, Handel, Objective, Sharp), C++ (ANSI, GNU, ISO, Visual), Caml (light, Objective), Clean, Cobol (1974, 1985, ibm), Comal 80, csh, Delphi, Eiffel, Elan, erlang, Euphoria, Fortran (77, 90, 95), GCL, Gnuplot, Haskell, HTML, IDL (empty, CORBA), inform, Java (empty, AspectJ), JVMIS, ksh, Lisp (empty, Auto), Logo, make (empty, gnu), Mathematica (1.0, 3.0), Matlab, Mercury, MetaPost, Miranda, Mizar, ML, Modula-2, MuPAD, NASTRAN, Oberon-2, OCL (decorative, OMG), Octave, Oz, Pascal (Borland6, Standard, XSC), Perl,PHP, PL/I,Plasm, POV,Prolog, Promela,Python, R,Reduce, Rexx,RSL, Ruby, S (empty, PLUS), SAS, Scilab, sh, SHELXL, Simula (67, CII, DEC, IBM), SQL, tcl (empty, tk), TeX (AlLaTeX, common, LaTeX, plain, primitive), VBScript, Verilog, VHDL (empty, AMS), VRML (97), XML, XSLT.

Custom code formatting

You can customise the way how your code is displayed by using:

\lstset{...}

The following is a list of parameters, which can be used inside the previous command

language=Octave -> choose the language of the code
basicstyle=\footnotesize -> the size of the fonts used for the code
numbers=left -> where to put the line-numbers
numberstyle=\footnotesize -> size of the fonts used for the line-numbers
stepnumber=2 -> the step between two line-numbers.
numbersep=5pt -> how far the line-numbers are from the code
backgroundcolor=\color{white} -> sets background color (needs package)
showspaces=false -> show spaces adding particular underscores
showstringspaces=false -> underline spaces within strings
showtabs=false -> show tabs within strings through particular underscores
frame=single -> adds a frame around the code
tabsize=2 -> sets default tab-size to 2 spaces
captionpos=b -> sets the caption-position to bottom
breaklines=true -> sets automatic line breaking
breakatwhitespace=false -> automatic breaks happen at whitespace
morecomment=[l]{//} -> displays comments in italics (language dependent)

If you are using several parameters, they have to be separated by commas.
Example:

\lstset{numbers=left, stepnumber=2, frame=single,}

You might want to have a caption as well as reference the listing later:

\lstset{language=Java, caption=Descriptive Caption Text, label=DescriptiveLabel}

For an exhaustive list of available options to customize your included source code, refer to the documentation on CTAN.

Tricks

The following will draw a frame around your source code with a blue shadow (you will need the color-package).

\lstset{frame=shadowbox, rulesepcolor=\color{blue}}

If you want closed frames on each page, use the following command sequence:

\begin{framed}
\begin{lstlisting}...\end{lstlisting}
or \lstinputlisting{...}
\end{framed}

Tags: , ,

20 Responses to “Include source code in Latex with “Listings””

  1. Katie Says:

    Oh, this is brilliant. I have always used the verbatim-environment. but this has so much more options. great.

  2. Steven Says:

    I have read great things about the listings package but in reality it is causing me lots of problems. I am writing a paper and have to include listings in an enumerated list to answer question numbers
    1/ I have indented my source file to make easier reading/construction – if I have the listing section indented it is reflected in the pdf output! (using pdflatex) which is just madness
    2/ The resulting text just looks ugly with incredibly bad spacing – the character kerning is completely messed up. Currently using the following setup:

    \documentclass[11pt,a4paper,oneside,onecolumn]{article}
    \usepackage{amsmath,amssymb,harvard}
    \usepackage{amsfonts}
    \usepackage{amsthm}
    \usepackage{amssymb}
    \usepackage{graphicx}
    \usepackage{harvard}
    \usepackage{listings}
    \usepackage{algorithm2e}
    \renewcommand{\labelenumii}{(\roman{enumii})}
    \renewcommand{\labelenumiii}{(\alph{enumiii})}
    \renewcommand{\labelenumiv}{(\roman{enumiv})}
    \begin{document}
    \lstset{basicstyle=\footnotesize,language=HTML}
    \headheight 14pt
    \bibliographystyle{plain}

    I will try to find a solution and see which package is conflicting (if any) but the result is really ugly and \verb is starting to look good…

  3. Cesar Says:

    That’s nice and simple.

    I was wondering, why Java is not supported?

  4. thurnherr Says:

    Hi Cesar

    Java is actually supported by the listings package. It appears in the list of supported languages above.

    Tom

  5. Cesar Says:

    Oops… I sure need glasses :)

  6. Frank Says:

    Very interesting, nice post! Please keep up the good work!

  7. Rikke Says:

    I’m having problems using lstinputlisting{}

    I guess that I should use something like C:\Users\Rikke\Documents\…\filename.R

    But it doesn’t work – have you any idea why?

    :o ) Rikke

  8. thurnherr Says:

    Hi Rikke,

    As a starting directory, Latex will always use the location of your main document (where you have \documentclass{…}).
    To move upwards the directory-tree, you simply use “..\”.
    E.g. imagine you have a directory, with two folders, “code” and “report”. Inside “report”, you have your Latex-files and in “code” you have the source files. To include the source files, you would type:

    \lstinputlisting{..\code\filename.R}

    Cheers,
    Tom

  9. Quiron Says:

    Thanks for your work! it’s realy good!

  10. Lorenzo Says:

    May I suggest as an alternative GNU Source-highlight: http://www.gnu.org/software/src-highlite/

    this is not a LaTeX package, but it produces latex output

  11. links for 2008-10-18 « Iveney’s Weblog Says:

    [...] Include source code in Latex with “Listings” « Blog on Latex Matters (tags: listings latex src) [...]

  12. Joe Python Says:

    If you have python distribution in your machine you can use ‘pygmentize’. Using pygmentize you can also generate syntax highlighted code in Word, html and pdf formats besides LateX.

  13. nguyenminhhaivn Says:

    @steven: You’ve said “The resulting text just looks ugly with incredibly bad spacing – the character kerning is completely messed up”. I finally found out that the “columns” option can solve your problem. The complete command is \lstset{columns=fullflexible}.

  14. Philip Machanick Says:

    The main problem I had with setting Awk scripts in verbatim mode is that single quotes are turned into curly apostrophes, making it awkward to copy and paste a typset example into a terminal or editor window to execute. Double quotes are OK in verbatim mode. Using lstlisting mode, ALL quotes are turned into curly quotes, one worse than verbatim.

    Any ideas? The simplest thing to make a listing in any mode without curling quotes would be good. Thanks.

  15. Philip Machanick Says:

    Answered my own question:

    \usepackage{upquote}

    after all other font specs will force typewriter font to Computer Modern Typewriter and make verbatim, verbatim*, verb, and verb* leave ` and ‘ in their original state.

    (” is already set unchanged; I’m not sure of the logic of curling ‘ and ` in a mode that otherwise leaves things unchanged. While it’s true that the old ASCII character set didn’t include encodings for these so it’s useful to be able to create them in verbatim mode, not having an obvious escape to get back to raw apostrophes and grave accents seems to me an omission).

    Not quote as fancy as the listings package but for simple scripts and one-liners, being able to get the various verbatim modes to behave is good. Unless you need the default behaviour for some other purpose in the same document …

  16. James Pyles Says:

    Thanks, Phillip. the \usepackage{upquote} solution was just was just what I was looking for.

  17. Nadine Says:

    God mainly bless you for this page. It was a blessing for me to know how to put my SAS-Code into my latex document. So i just want to acknowledge and to thank you for it.

  18. Nadine Says:

    Can we put the code without frame and without numbering?

  19. Jon Says:

    Thanks for the post. It was useful for dumping code into latex and not worrying about escaping and formatting.

Leave a Reply