TeX-Info

P. Zimmermann


Ordentlich gesetzter Quellcode gehört zur Pflichtaufgabe bei Abschlussarbeiten aber auch sonstigen Handreichungen insbesondere im naturwissenschaftlichen Bereich. Die einfachste Form beginnt mit einer naturgetreuen Wiedergabe in Schreibmaschinenschrift, geht über eine vorangestellte Zeilennummerierung bis hin zu farbig markierten Schlüsselwörtern. Daneben findet sich häufig der Wunsch, Pseudocode zur Beschreibung von Algorithmen geeignet darzustellen. Aus dem Fundus der zahlreichen einschlägigen Pakete folgt die nachstehende Vorstellung des listings-Pakets für Quellcodewiedergabe und des algorithm2e-Pakets für die Visualisierung von Algorithmen.

Programmcode mit LaTeX - das listings-Paket

Das von Carsten Heinz entworfene und gewartete listings-Paket druckt Quellprogramme komplett oder in Teilen aus. Es arbeitet ähnlich der verbatim-Umgebung und behält die vorgegebene Zeilenstruktur bei. Zahlreiche Parameter erlauben Eingriffe am Layout. Falls Ihre bevorzugte Programmiersprache noch nicht unterstützt wird, definieren Sie einfach die Parameter selbst.

Nach dem Laden des Pakets stellt man vor dem Programmlisting noch die zugrundeliegende Sprache ein:

   \usepackage{listings,color}   %% color für Farbmarkierungen
   \lstset{language=Java}

Derzeit umfasst der Sprachenkatalog 78 Sprachen mit zusätzlichen Dialekten: beispielsweise für C++ die Varianten ANSI, GNU, ISO und Visual; neben den «reinen» Programmiersprachen gehören dazu die Unix Oberflächensprachen bash, csh und ksh, die Web-Sprachen HTML und XML, die Datenbankabfragesprache SQL oder die aus dem mathematisch-statistischen Bereich stammenden SAS, R, Mathematica oder Matlab. \lstset dient der Einstellung von globalen Parametern.

Das Paket unterstützt drei Arten von Quellcode:

  1. Codeschnipsel: kleine Quelltextausschnitte setzt man ähnlich dem \verb-Kommando mit \lstinline. Beispiel: \lstinline$int i;$ → int i; - je ein Zeichen (hier das $) markiert Anfang und Ende.

  2. Codesegmente: für Ausschnitte ist die lstlisting-Umgebung definiert, die den eingeschlossenen Text auflistet.

\begin{lstlisting}[language=Pascal]
WHILE NOT EOLN(Ein) DO
  Begin   {while not eoln}
    READ(Ein,Zahl);
    WRITELN(Zahl,'     ');
    Summe  := Summe + Zahl;
    Anzahl := Anzahl + 1
  End;    {while not eoln}
\end{lstlisting}
TeX-Ausgabe Pascal-Programm
  1. Komplette Quellprogramme liest man mittels des \lstinputlisting-Kommandos ein. Über ein Pfad-Argument wird die einzulesende Datei spezifiziert.
    \lstinputlisting[language=HTML,numbers=right,lastline=5]{Beispiel.html}

TeX-Ausgabe HTML-Quelltext

Per Voreinstellung erscheinen Schlüsselwörter fett, Kommentare kursiv und Leerschläge in Zeichenketten als «». Änderungen am Listinglayout nimmt man über \lstset oder das optionale Argument der lstlisting-Umgebung und des lstinputlisting-Kommandos vor. Das nachstehende Beispiel zeigt einen kleinen Teil der vorhandenen Parameter; die mit «-%%%-» eingeleiteten Zeilen aktivieren die nachgeordneten Parameter nicht. Lange Zeilen werden automatisch umbrochen, Schlüsselwörter ohne weiteres Zutun indiziert.

\begin{lstlisting}[basicstyle=\ttfamily,%       generell Schreibmaschinenschrift
                   commentstyle=\color{blue},%  Kommentar blau
                   keywordstyle=\color{red},%   Schlüsselwörter rot
%%%                float=tp,caption=Gruss.java Programm%  bewegliche Abbildung
%%%                showtabs=true,%              Tabulatorenausgabe
%%%                tab=\rightarrowfill,%        Pfeil nach rechts zeigt Tabulator
%%%                frame=single,% shadowbox, leftline, lines, topline, t, r, b, l
%%%                framerule=1pt,%              Linienstärke
                   numbers=left,%               links Zeilennummern
%%%                firstnumber=50,%             beginne mit Zeilenummer 50
%%%                stepnumber=2,%               nur jede zweite Zeile eine Nummer
                   numberstyle=\footnotesize\ttfamily]
/**
 * Das Gruss.java Programm gibt den Text
 * "Grüß Gott!" auf den Bildschirm aus.
 */
public class Gruss
  {
  public static void main(String[] args)
    {
    // Ausgabe von "Grüß Gott!"
    System.out.println("Grüß Gott!");
    }
  }
\end{lstlisting}

TeX-Ausgabe Java-Programm

Abschließend seien noch zwei besondere Glanzpunkte erwähnt:

Programmcode in LaTeX

Neben dem allumfassenden listings-Paket finden sich noch zahlreiche Möglichkeiten, Programmcode in LaTeX wiederzugeben - einige gangbare Wege sind:

moreverb-Paket:
Das Paket verbindet die verbatim-Umgebung mit Zeilennummern (listing-Umgebung) und einem Rahmen (boxedverbatim-Umgebung).
C++2LaTeX
ist ein Konverter, der C/C++-Programme in LaTeX-Code überträgt; er verfügt über Einstellungen von Zeichensätzen für Schlüsselwörter, Kommentare, Zeichenketten und Anweisungen. Er liegt selbst als C-Quellcode vor. Autoren: Sascha Ziemann und Norbert Kiesel, Universität Dortmund.
tiny_c2-Paket:
Das Paket beinhaltet zwei Programme
  1. tiny_c2l einen C/C++/Java nach LaTeX-Konverter und
  2. tiny_t2l ein allgemeines Umtauschprogramm für andere Programmiersprachen; beide erkennen Schlüsselwörter, Kommentare und Zeichenketten und liegen für MS-Windows-Betriebssysteme in ausführbarer Form, aber auch als FLEX-Quellcode vor.
und eine Makrodatei position mit zahlreichen Kommandodefinition für den Umwandlungsprozess. Autor: Michael Plugge, Fachhochschule Mannheim.
lineno- und numline-Paket:
Beide Pakete fügen einem begrenzten Textbereich Zeilennummern hinzu. In Verbindung mit der verbatim-Umgebung liegt eine sehr einfache Form der Quellcodewiedergabe vor.

Pseudocode mit LaTeX - das algorithm2e-Paket

Algorithmen oder Pseudocodes unterscheiden sich von der oben beschriebenen Programmcodeauflistung durch das Fehlen von festen Syntax- und Sprachelementen. Natürlich befolgt ein Pseudocode klare Ausdrucksformen für einen Algorithmus mit mathematischer Notation, mit Tabellen und Abbildungen, die so in einem Programmcode nicht vorkommen.

Ein zum listings-Paket vergleichbar mächtiges Instrumentarium für den Satz von Algorithmen bietet das algorithm2ePaket von Christophe Fiorio. Zur reichhaltigen Ausstattung gehört neben den Kommandos für die Grundstrukturen Auswahl, Reihung und Wiederholung, den Makros zur Gestaltung des Layouts insbesondere eine Sprachenschnittstelle - ein

\usepackage[german,vlined,boxed]{algorithm2e}

lädt das Paket mit der Option «german» zur Eingabe «deutscher» Kommandos; die Option «vlined» sorgt für vertikale Linien mit einem kleinen Haken, der von Anfang bis zum Ende eines Blocks reicht; die Option «boxed» versieht die Algorithmen mit einem Rahmen (vergleiche das Komplettbeispiel Primfaktorzerlegung). Voreingestellt sind englische Sprachkonventionen. Weitere Paketoptionen betreffen eine etwaige Zeilennummerierung (linesnumbered, noresetcount für eine fortlaufende Nummerierung aller Algorithmen) und die Endemarken von Gruppierungen (shortend = end; longend = end+Struktur, endwhile; noend = keine Marke).

Algorithmen, Funktionen und Prozeduren bilden die grundlegenden Bausteine eines Pseudocodes - im Paket als Umgebungen algorithm, function und procedure definiert. Sie arbeiten wie Abbildungen und Tabellen als Gleitobjekte, als eine zusammengehörige Einheit, und besitzen wie diese die nämlichen optionalen Platzierungsargumente Hhtbp.

\begin{procedure}[ht]                 %% Beginn Pseudocode
\caption{Telefonbuch()}               %% \listofalgorithms liefert Verzeichnis
\KwData{Telefonbuch}                  %% KeyWords: Data, Result, Input, Output
\KwResult{Auf"|finden eines Namens im Telefonbuch}
zu suchenden Namen festlegen\;        %% \; muss am Ende stehen!
Telefonbuch in die Hand nehmen\;
\While{Name nicht gefunden}{          %% Wiederholungsstruktur zweigliedrig
   Telefonbuch an vermuteter Stelle aufschlagen\;
   \eIf{Name gefunden}{fertig}{       %% Auswahlstruktur dreigliedrig
     \eIf{Name vor der aufgeschlagenen Seite}
         {Aufschlagrichtung nach vorne}
         {Aufschlagrichtung nach hinten}
     }
}
\end{procedure}

Prozedur Telefonbuch

Jede nicht mit einem Makro eingeleitete Zeile muss mit einem « \; » abgeschlossen werden.

Für Schlüsselwörter (KeyWords) stehen vordefinierte Kommandos bereit (\KwData, \KwResult), die mittels

\SetKw{schlüssel}{text}
\SetKw{Input}{Eingabe}
\SetKw{Drucke}{schreibe}

umdefinierbar oder erweiterbar sind. Daneben ist das Paket mit einer Vielzahl an Stilparametern ausgestattet, die das Layout einzelner Algorithmenteile wie Kommentar oder Grundstrukturen definieren. Das nachstehende Beispiel zeigt einige Möglichkeiten davon auf:

Primfaktorzerlegung

\begin{algorithm}                    %% Beginn algorithm-Umgebung
\SetKw{Drucke}{schreiben}            %% eigene Kommandodefinition \Drucke
\SetKw{Leer}{\dq{} \, \dq}           %% \Leer --> " "
\SetKwComment{tco}{\{** }{**\}}      %% Kommentar in der Form {** text **}
\linesnumbered                       %% Ausgabe von Zeilennummern
\dontprintsemicolon                  %% Zeilenendemarken \; nicht ausgeben
\Titleofalgo{Primfaktorzerlegung}    %% Name des Algorithmus
\Ein{ganze Zahlen $z$ bis $1000$}    %% Eingabe
\Aus{Zahl mit Primfaktorzerlegung}   %% Ausgabe
\BlankLine                           %% kleiner Abstand
\tco{Start der Zerlegung}            %% Kommentarzeile
\Fuer{$z \leftarrow 2$ \Bis $1000$}{ %% wiederhole für z von 2 bis 1000
  \Drucke \dq Primfaktoren von \dq{} $z$\;  %% Anweisungsende mit \;
  $i \leftarrow 2$\;                 %% beginne mit Teiler 2
  \Wiederh{$z=0$}{                   %% wiederhole bis kein Zahlenrest
    \Solange{$z \% i = 0$}{          %% solange echter Teiler vorhanden
      \Drucke i + \Leer\;            %% gefundenen Teiler ausgeben
      $z \leftarrow z/i$\;           %% Zahl durch Teiler teilen
    }                                %% Ende solange echter Teiler vorhanden
    \eWenn{$i=2$}{$i\leftarrow i+1$} %% wenn Teiler gleich zwei dann um eins
                 {$i\leftarrow i+2$} %% erhöhen sonst um zwei erhöhen
  }                                  %% Ende wiederhole bis kein Zahlenrest
}                                    %% Ende wiederhole von 2 bis 1000
\end{algorithm}                      %% Ende algorithm-Umgebung


Ansprechpartner im URZ:Zimmer: Telefon: PMail:
Peter ZimmermannEI: eO-106-1351peter.zimmermann