Zum Inhalt springen

Quellcode & Listings

Für HTL-Diplomarbeiten ist die Darstellung von Quellcode besonders wichtig. LaTeX bietet dafür das leistungsfähige listings-Paket.

Grundkonfiguration

\usepackage{listings}
\usepackage{xcolor}

\lstset{
  basicstyle=\ttfamily\small,
  numbers=left,
  numberstyle=\tiny\color{gray},
  numbersep=8pt,
  frame=single,
  breaklines=true,
  breakatwhitespace=true,
  tabsize=2,
  showstringspaces=false,
  captionpos=b,
  keywordstyle=\color{blue}\bfseries,
  commentstyle=\color{green!60!black}\itshape,
  stringstyle=\color{red!70!black},
  backgroundcolor=\color{gray!5},
}

Code inline und als Block

Inline-Code

Die Funktion \lstinline|calculateSum()| gibt die Summe zurück.

% Oder mit anderem Trennzeichen:
Der Befehl \lstinline!rm -rf /! ist gefährlich.

Code-Block direkt im Dokument

\begin{lstlisting}[language=Java, caption={Hauptklasse der Anwendung}, label={lst:main}]
public class Main {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}
\end{lstlisting}

Code aus externer Datei einbinden

\lstinputlisting[
  language=Python,
  caption={Datenverarbeitung},
  label={lst:dataprocessing},
  firstline=10,
  lastline=45
]{code/dataprocessing.py}
Best Practice
Bindet Code aus externen Dateien ein statt ihn in die .tex-Datei zu kopieren. So bleibt der Code immer aktuell und ihr vermeidet Synchronisationsprobleme.

Sprachdefinitionen

Listings unterstützt viele Sprachen out-of-the-box:

SpracheCode
Javalanguage=Java
Pythonlanguage=Python
C / C++language=C / language=C++
C#language=[Sharp]C
JavaScriptlanguage=JavaScript
HTMLlanguage=HTML
SQLlanguage=SQL
PHPlanguage=PHP
Bashlanguage=bash

Eigene Sprachdefinitionen

Für Sprachen wie TypeScript, Kotlin oder Dart müsst ihr eine eigene Definition erstellen:

\lstdefinelanguage{TypeScript}{
  keywords={abstract, any, as, async, await, boolean, break,
    case, catch, class, const, constructor, continue,
    declare, default, delete, do, else, enum, export,
    extends, false, finally, for, from, function, get,
    if, implements, import, in, instanceof, interface,
    let, module, new, null, number, of, package, private,
    protected, public, readonly, return, set, static,
    string, super, switch, this, throw, true, try, type,
    typeof, undefined, var, void, while, yield},
  morecomment=[l]{//},
  morecomment=[s]{/*}{*/},
  morestring=[b]',
  morestring=[b]",
  morestring=[b]`,
  sensitive=true,
}

Verschiedene Stile für verschiedene Sprachen

% Java-Stil:
\lstdefinestyle{java}{
  language=Java,
  keywordstyle=\color{blue!80!black}\bfseries,
  commentstyle=\color{green!50!black}\itshape,
  stringstyle=\color{orange!80!black},
}

% Python-Stil:
\lstdefinestyle{python}{
  language=Python,
  keywordstyle=\color{purple!80!black}\bfseries,
  commentstyle=\color{gray}\itshape,
  stringstyle=\color{green!70!black},
}

% Verwenden:
\begin{lstlisting}[style=java]
// Java-Code hier
\end{lstlisting}

\begin{lstlisting}[style=python]
# Python-Code hier
\end{lstlisting}

Alternative: minted

Das Paket minted bietet noch besseres Syntax-Highlighting (nutzt Python Pygments), erfordert aber zusätzliche Installation:

% Benötigt: Python + Pygments installiert
% Kompilieren mit: pdflatex -shell-escape dokument.tex

\usepackage{minted}

\begin{minted}[linenos, frame=single]{python}
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)
\end{minted}

Pseudocode & Algorithmen

\usepackage{algorithm}
\usepackage{algpseudocode}

\begin{algorithm}[htbp]
  \caption{Binäre Suche}
  \label{alg:binsearch}
  \begin{algorithmic}[1]
    \Procedure{BinarySearch}{$arr, target$}
      \State $low \gets 0$
      \State $high \gets \text{length}(arr) - 1$
      \While{$low \leq high$}
        \State $mid \gets \lfloor (low + high) / 2 \rfloor$
        \If{$arr[mid] = target$}
          \State \Return $mid$
        \ElsIf{$arr[mid] < target$}
          \State $low \gets mid + 1$
        \Else
          \State $high \gets mid - 1$
        \EndIf
      \EndWhile
      \State \Return $-1$
    \EndProcedure
  \end{algorithmic}
\end{algorithm}

Codelistenverzeichnis

Analog zum Abbildungsverzeichnis könnt ihr ein Verzeichnis aller Code-Listings erstellen:

% Im Dokument nach dem Inhaltsverzeichnis:
\lstlistoflistings