Source Code Listings with LaTeX

From macwrench

Listings in TeX Dokumenten[edit]

Um in TeX Dokumenten Quelltexte (Programmlistings) einzufügen, bietet sich die Verwendung des Pakets listings an. Dazu muss das Paket zuerst mit

\usepackage{listings}

eingebunden werden, außerdem empfiehlt sich für farbiges Syntax-Highlighting die Verwendung des Pakets color

 \usepackage{color}

Quellcode einbinden[edit]

Dazu gib es 2 Möglichkeiten, entweder direkt im TeX Dokument (inline) oder als eigenständige Datei:

inline[edit]

 \begin{lstlisting}
    [caption={ein paar Zeilen code}\label{lst:test123},captionpos=t] 
 for i:=maxint to 0 do 
    begin 
    j:=square(root(i)); 
 end; 
 \end{lstlisting}syntaxhighlight

externe Datei[edit]

Hier im Beispiel eine Datei namens beispiel.java < lang="latex">

\lstinputlisting
   [caption={Ein kleines Programm in Java}
      \label{lst:javaclass},
      captionpos=t,language=JAVA]
{listings/beispiel.java}

</syntaxhighlight>

Hinweise[edit]

label: Label für Referenzen auf das Listing mit \ref{lst:xyz}
caption: Beschreibungstext
captionpos: Position des Beschreibungstextes (t=top, b=bottom)
language: [Dialekt]Sprache - Angabe einer Programmiersprache (z.B. JAVA, XML, C, C++) oder eines Dialekts (z.B. [LaTeX]TeX)

Formatierung[edit]

Farben[edit]

Mit Hilfe des Pakets color lassen sich mit Hilfe von

 \color{<colour>}

Farbwerte verwenden sowie eigene definieren, z.B.:

 \definecolor{middlegray}{rgb}{0.5,0.5,0.5}
 \definecolor{lightgray}{rgb}{0.8,0.8,0.8}
 \definecolor{orange}{rgb}{0.8,0.3,0.3}
 \definecolor{yac}{rgb}{0.6,0.6,0.1}

Quellcode[edit]

Die Darstellung der Quellcodeabschnitte wird über

\lstset{}

formatiert, dabei stehen mehrere Variablen zur Verfügung, z.B.:

Variable Beschreibung Beispiel
backgroundcolor Hintergrundfarbe \color{lightgray}
basicstyle Schriftformatierung \scriptsize\ttfamily
keywordstyle Schlüsselwörter \bfseries\ttfamily\color{orange},
stringstyle Variablen \color{green}\ttfamily,
commentstyle Kommentare \color{middlegray}\ttfamily,
emph
emphstyle
emph
emphstyle
Variablen square
\color{blue}\texttt
[2]root,base
[2]\color{yac}\texttt
showstringspaces leerzeichen in Strings darstellen true / false
flexiblecolumns Spaltenbreite dynamisch/fest true / false
tabsize Tabulatorenbreite 2,
numbers Position der Zeilennummern left / right
numberstyle Größe der Zeilennummern \tiny
numberblanklines leere Zeilen durchnummerieren true / false
stepnumber Beginn der Nummerierung 1
numbersep Abstand zwischen Zeilennummern und Quellcode 10pt
xleftmargin Abstand zum Rand 15pt

Anm.:
Formatierung immer $key={$value}, Trennung mehrerer Definitionen durch Kommata

\bfseries: '''fettgedruckt'''<br />
\ttfamily: <font face="courier">typewriter</font><br />
\tiny: <small>klein</small>

Beispiel:

 \lstset{
   basicstyle=\scriptsize\ttfamily,
   keywordstyle=\bfseries\ttfamily\color{orange},
   stringstyle=\color{green}\ttfamily,
   commentstyle=\color{middlegray}\ttfamily,
   emph={square}, 
   emphstyle=\color{blue}\texttt,
   emph={[2]root,base},
   emphstyle={[2]\color{yac}\texttt},
   showstringspaces=false,
   flexiblecolumns=false,
   tabsize=2,
   numbers=left,
   numberstyle=\tiny,
   numberblanklines=false,
   stepnumber=1,
   numbersep=10pt,
   xleftmargin=15pt
 }

Quellcodeverzeichnis[edit]

Analog zu Abbildungs- und Tabellenverzeichnis kann auch ein Quellcodeverzeichnis eingebunden werden, das funktioniert mit

 \lstlistoflistings

Um einen Eintrag im Inhaltsverzeichnis zu ermöglichen, sind jedoch einige Handgriffe erforderlich, so sind im TeX-Kopf (also vor \begin{document}) einige Elemente aus dem Dokumentenstyle (hier book.cls) und listings.sty zu überladen. Zur Info: die beiden Dateien befinden sich üblicherweise an den Orten

/usr/local/teTeX/share/texmf.tetex/tex/latex/base/book.cls

bzw.

/usr/local/teTeX/share/texmf.tetex/tex/latex/listings/listings.sty

wobei diese Dateien ja nicht editiert werden. Das erfolgt durch Einfügen des Code in das TeX-Dokument, und zwar zwischen die Tags

 \makeatletter
 ...
 \makeatother

mit Hilfe der Anweisungen

\renewcommand (einen existierenden Befehl überschreiben)
\newcommand (einen neuen Befehl erzeugen)

Das sieht dann - analog zu den Verzeichnissen etwa so aus:

 \makeatletter
 % Festlegen des Kapitelnamen (nicht unbedingt notwendig):
 % aus listing.sty
 \renewcommand\lstlistlistingname{Quellcode}

 % Erzeugen eines Eintrags im Inhaltsverzeichnis:
 % aus book.cls
 \newcommand\loltableofcontents{%
    \if@twocolumn
      \@restonecoltrue\onecolumn
    \else
      \@restonecolfalse
    \fi
    \chapter*{\contentsname
    %    \@mkboth{%
    %       \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
    \chapter{\lstlistlistingname}
    
    \@starttoc{toc}%
    \if@restonecol\twocolumn\fi
    }

 % Erzeugen des Quellcodeverzeichnisses:
 % aus listing.sty
 \renewcommand\lstlistoflistings{\bgroup
    \let\contentsname\lstlistlistingname
    \let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{lol}}%
    \loltableofcontents \egroup}
 \makeatother