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.
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:
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.
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} |
![]() |
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}
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}
Abschließend seien noch zwei besondere Glanzpunkte erwähnt:
Eigene Stildefinitionen: offensichtlich bedarf es eines leicht handhabbaren Mechanismus zum Hin- und Herwechseln zwischen unterschiedlichen Ausgabeschemata - beispielsweise mit und ohne Nummern. \lstdefinestyle{stil}{werteliste} bietet solch ein Instrumentarium.
\lstdefinestyle{nummern} {numbers=left,stepnumber=1,numberstyle=\scriptsize\ttfamily,numbersep=2em} \lstdefinestyle{ohnenummern} {numbers=none}Ein Wechsel erfolgt dann über style=nummern oder style=ohnenummern. Nicht in der Stildefinition eingestellte Parameter bleiben unverändert in Kraft.
Eigene Sprachdefinitionen gelingen mit dem \lstdefinelanguage-Kommando.
\lstdefinelanguage{fraenkisch} {morekeywords={errberd,plotz,grai,sbads,waggerla,gniedla},% sensitive=false,%% Gross- oder Kleinschreibung erlaubt morecomment=[s]{[]},%% Kommentare in eckigen Klammern morestring=[b]"% Zitate in " " }In Kraft setzt man die Sprache über language=fraenkisch.
Neben dem allumfassenden listings-Paket finden sich noch zahlreiche Möglichkeiten, Programmcode in LaTeX wiederzugeben - einige gangbare Wege sind:
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}
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:
\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 Zimmermann | EI: eO-106 | -1351 | peter.zimmermann |