\chapter{Abbildungen, Tabellen, Quellcode} \label{cha:Abbildungen} \section{Allgemeines} Abbildungen (\emph{figures}) und Tabellen (\emph{tables}) werden üblicherweise zusammen mit einem nummerierten Titel (\emph{caption}) zentriert angeordnet (siehe Abb.~\ref{fig:CocaCola}). Im Text \emph{muss} es zu jeder Abbildung einen Verweis geben und die eigentliche Abbildung sollte im \latex-Quelltext erst \emph{nach} dem ersten Verweis platziert werden. \begin{figure} \centering \includegraphics[width=.75\textwidth]{cola-public-domain-photo-p} %{CS0031} \caption{Coca-Cola Werbung 1940 \cite{CocaCola1940}.} \label{fig:CocaCola} \end{figure} \section{\emph{Let Them Float!}} Das Platzieren von Abbildungen und Tabellen gehört zu den schwierigsten Aufgaben im Schriftsatz, weil diese meist viel Platz benötigen und häufig nicht auf der aktuellen Seite im laufenden Text untergebracht werden können. Diese Elemente müssen daher an eine geeignete Stelle auf nachfolgenden Seiten verschoben werden, was manuell sehr mühsam (jedoch in \emph{Word} beispielsweise unerlässlich) ist. In \latex funktioniert das weitgehend automatisch, indem Abbildungen, Tabellen und ähnliche als "Floating Bodies" behandelt werden. Bei der Positionierung dieser Elemente wird versucht, einerseits im Textfluss möglichst wenig Leer\-raum entstehen zu lassen und andererseits die Abbildungen und Tabellen nicht zu weit von der ursprünglichen Textstelle zu entfernen. Der Gedanke, dass etwa Abbildungen kaum jemals genau an der ge\-wünsch\-ten Stelle und möglicherweise nicht einmal auf derselben Seite Platz finden, ist für viele Anfänger aber offenbar sehr ungewohnt oder sogar beängstigend. Dennoch sollte zunächst einmal getrost \latex\ diese Arbeit überlassen und \emph{nicht} manuell eingegriffen werden. Erst am Ende, wenn das gesamte Dokument "steht" und die automatische Platzierung wirklich nicht zufriedenstellend erscheint, sollte (durch gezielte Platzierungsanweisungen \cite[S.~49]{Oetiker2018}) \textbf{in Einzelfällen} eingegriffen werden. \section{Captions} Bei Abbildungen steht der Titel üblicherweise \emph{unten}, bei Tabellen hingegen -- je nach Konvention -- \emph{oben} (wie in diesem Dokument) oder ebenfalls \emph{unten}. In \latex\ erfolgt auch die Nummerierung der Abbildungen automatisch, ebenso der Eintrag in das (optionale) Abbildungsverzeichnis% \footnote{Ein eigenes Verzeichnis der Abbildungen am Anfang des Dokuments ist zwar leicht erstellt, in einer Abschlussarbeit aber (und eigentlich überall sonst auch) überflüssig. Man sollte es daher weglassen.} am Beginn des Dokuments. Die Markierung der Captions% \footnote{Ausnahmsweise wird das Wort "Caption" im Folgenden ohne deutsche Übersetzung verwendet.} erfolgt in \latex mithilfe der \verb!\label{}! Anweisung, die unmittelbar auf die \verb!\caption{}! Anweisung folgen muss: % \begin{LaTeXCode}[numbers=none] \begin{figure} \centering \includegraphics[width=.95\textwidth]{cola-public-domain-photo-p} \caption{Coca-Cola Werbung 1940 \cite{CocaCola1940}.} \label{fig:CocaCola} \end{figure} \end{LaTeXCode} % Der Name des Labels (\texttt{fig:CocaCola}) kann beliebig gewählt werden. Die Kennzeichnung \texttt{fig:} ist (wie in Abschn.\ \ref{sec:querverweise} erwähnt) nur eine nützliche Hilfe, um beim Schreiben verschiedene Arten von Labels besser unterscheiden zu können. Die Länge der Captions kann dabei sehr unterschiedlich sein. Je nach Anwendung und Stil ergibt sich manchmal eine sehr kurze Caption (Abb.~\ref{fig:CocaCola}) oder eine längere (Abb.~\ref{fig:ibm360}). Man beachte, wie bei kurzen Captions ein zentrierter Satz und bei langen Captions ein Blocksatz verwendet wird (\latex macht das automatisch). Captions sollten \emph{immer} mit einem Punkt abgeschlossen sein.% \footnote{Kurioserweise verlangen manche Anleitungen genau das Gegenteil, angeblich, weil beim klassischen Bleisatz die abschließenden Punkte im Druck häufig "weggebrochen" sind. Das kann man glauben oder nicht, im Digitaldruck spielt es jedenfalls keine Rolle.} \begin{figure} \centering \fbox{\includegraphics[width=.75\textwidth]{ibm-360-color}} %{CS1065}} %\FramePic{\includegraphics[width=.85\textwidth]{ibm-360-color}} \caption{Beispiel für einen langen Caption-Text. \textsc{Univac} brachte 1961 mit dem Modell 751 den ersten Hochleistungsrechner mit Halbleiterspeicher auf den Markt. Von diesem Computer wurden in den U.S.A.\ bereits im ersten Produktionsjahr über fünfzig Exemplare verkauft, vorwiegend an militärische Dienststellen, Versicherungen und Großbanken. Die Ablöse erfolgte zwei Jahre später durch das zusammen mit \textsc{Sperry} entwickelte Modell 820. Das klingt vielleicht plausibel, ist aber völliger Unsinn, und das Bild zeigt in Wirklichkeit eine System/360 Anlage von IBM. Bildquelle~\cite{IBM360}.} \label{fig:ibm360} \end{figure} \section{Abbildungen} Für die Einbindung von Grafiken in \latex wird die Verwendung des Stan\-dard-Pakets \texttt{graphicx} \cite{Carlisle2017} empfohlen (wird durch das \texttt{hagenberg-thesis}-Paket bereits eingebunden). Mit dem aktuell verwendeten Workflow (\texttt{pdflatex}) können Bild- bzw.\ Grafikformate ausschließlich in folgenden Formaten eingebunden werden: % \begin{itemize} \item \textbf{PNG}: für Grau-, S/W- und Farb-Rasterbilder (bevorzugt), \item \textbf{JPEG}: für Fotos (wenn nicht anders vorhanden), \item \textbf{PDF}: für Vektorgrafiken (Illustrationen, Strichzeichnungen \etc). \end{itemize} % Bei Rasterbildern sollte wenn möglich PNG verwendet werden, weil die darin enthaltenen Bilder verlustfrei komprimiert sind und daher keine sichtbaren Kompressionsartefakte aufweisen. Im Gegensatz dazu sollte JPEG nur dann verwendet werden, wenn das Originalmaterial (Foto) bereits in dieser Form vorliegt. \subsection{Wo liegen die Grafikdateien?} Die Bilder werden üblicherweise in einem Unterverzeichnis (oder in mehreren Unterverzeichnissen) abgelegt, im Fall dieses Dokuments in \nolinkurl{images/}. Dazu dient die folgende Anweisung am Beginn des Hauptdokuments \nolinkurl{_DaBa.tex} (\sa\ Anhang \ref{app:latex}): % \begin{quote} \verb!\graphicspath{{images/}}! \end{quote} % Der (zum Hauptdokument relative) Pfad \texttt{graphicspath} kann innerhalb des Dokuments jederzeit geändert werden, was durchaus nützlich ist, wenn \zB\ die Grafiken einzelner Kapitel getrennt in entsprechenden Verzeichnissen abgelegt werden sollen. Die Größe der Abbildung im Druck kann durch Vorgabe einer bestimmten Breite oder Höhe oder eines Skalierungsfaktors gesteuert werden, {\zB}: % \begin{quote} \verb!\includegraphics[width=.85\textwidth]{ibm-360-color}! \\ \verb!\includegraphics[scale=1.5]{ibm-360-color}! \end{quote} % Man beachte, dass dabei die Dateiendung nicht explizit angegeben werden muss. Das ist \va\ dann praktisch, wenn verschiedene Workflows mit jeweils unterschiedlichen Dateitypen verwendet werden. \subsection{Grafiken einrahmen} %Mit dem Makro \verb!\FramePic{}! (definiert in \texttt{hgb.sty}) kann optional ein dünner %Rahmen rund um die Grafik erzeugt werden, \zB: Mit dem Makro \verb!\fbox{...}! kann optional ein dünner Rahmen rund um die Grafik erzeugt werden, \zB: % \begin{quote} %\verb!\FramePic{\includegraphics[height=50mm]{ibm-360-color}}! \verb!\fbox{\includegraphics[height=50mm]{ibm-360-color}}! \end{quote} % Das wird üblicherweise nur bei Rasterbildern nötig sein, insbesondere wenn sie zum Rand hin sehr hell sind und ohne Rahmen nicht vom Hintergrund abgrenzbar wären. \subsection{Rasterbilder (Pixelgrafiken)} Generell sollten Bilder bereits vorher so aufbereitet werden, dass sie später beim Druck möglichst wenig an Qualität verlieren. Es empfiehlt sich daher, die Bildgröße (Auflösung) bereits im Vorhinein (\zB mit \emph{Photoshop}) richtig einzustellen. Brauchbare Auflösungen bezogen auf die endgültige Bildgröße sind: % \begin{itemize} \item \textbf{Farb- und Grauwertbilder:} 150--300 dpi \item \textbf{Binärbilder (Schwarz/Weiß):} 300--600 dpi \end{itemize} % Eine wesentlich höhere Auflösung macht aufgrund der beim Laserdruck notwendigen Rasterung keinen Sinn, auch bei 1200 dpi-Druckern. Speziell \emph{Screen\-shots} sollten nicht zu klein dargestellt werden, da sie sonst schlecht lesbar sind (max.\ 200 dpi, besser 150 dpi). Dabei ist zu bedenken, dass die Arbeit auch als Kopie in allen Details noch gut lesbar sein sollte. \subsubsection{JPEG-Problematik} In der Regel sollten Bilder, die für den Einsatz in Druckdokumenten gedacht sind, nicht mit verlustbehafteten Kompressionsverfahren abgespeichert werden. Insbesondere sollte die Verwendung von JPEG möglichst vermieden werden, auch wenn viele Dateien dadurch wesentlich kleiner werden. Eine Ausnahme ist, wenn die Originaldaten nur in JPEG vorliegen und für die Einbindung nicht bearbeitet oder verkleinert wurden. Ansonsten sollte immer PNG verwendet werden. Besonders gerne werden farbige \textbf{Screenshots} einer JPEG-Kompression% \footnote{Das JPEG-Verfahren ist für natürliche Fotos konzipiert und sollte auch nur dafür verwendet werden.} unter\-zogen, obwohl deren verheerende Folgen für jeden Laien sichtbar sein sollten (Abb.~\ref{fig:jpeg-pfusch}). \begin{figure} \centering\small \begin{tabular}{@{}cc@{}} \fbox{\includegraphics[width=0.475\textwidth]{screenshot-dirty}} & % JPEG file \fbox{\includegraphics[width=0.475\textwidth]{screenshot-clean}} \\ % PNG file (a) & (b) \end{tabular} \caption{Typischer JPEG-Pfusch. Screenshots und ähnliche im Original verfügbare Rasterbilder sollten für Druckdokumente \emph{keinesfalls} mit JPEG komprimiert werden. Das Ergebnis~(a) sieht gegenüber dem unkomprimierten Original~(b) nicht nur schmutzig aus, sondern wird im Druck auch schnell unleserlich.} \label{fig:jpeg-pfusch} \end{figure} \subsection{Vektorgrafiken} Für schematische Abbildungen (\zB Flussdiagramme, Entity-Relationship-Diagramme oder sonstige strukturelle Darstellungen) sollten unbedingt Vektorgrafiken (PDF) verwendet werden. % (\zB Abb.~\ref{fig:latex-pdf-workflow}). Gerasterte Grafiken, wie sie üblicherweise als GIF- oder PNG-Dateien auf Webseiten vorliegen, haben in einem Druckdokument nichts zu suchen, notfalls müssen sie mit einem entsprechenden Werkzeug \emph{neu} gezeichnet werden (natürlich unter Angabe der ursprünglichen Quelle). In diesem Fall kommt als Datenformat nur PDF %(oder EPS im DVI-PS-Workflow) in Frage, dieses bietet sich aber auch in anderen Umgebungen als universelles Vektor-Format an. Zur Erstellung von PDF-Vektorgrafiken wird ein geeignetes Grafikprogramm, \zB\ %\emph{Freehand} von \emph{Macromedia} oder \emph{Illustrator} von \emph{Adobe} benötigt. Manche gängigen Grafikprogramme unterstützen allerdings keinen direkten Export von PDF-Dateien oder erzeugen unsaubere Dateien. Vor der Entscheidung für eine bestimmte Zeichensoftware sollte das im Zweifelsfall ausprobiert werden. PDF kann im Notfall über einen entsprechenden Druckertreiber erzeugt werden. \subsubsection{Vektorgrafiken mit \emph{Inkscape}} \label{sec:InkscapeGraphics} Mit \emph{Inkscape}\footnote{\url{https://inkscape.org/}} können Vektorgrafiken auf sehr einfache Weise erstellt werden. Das Basisformat von Inkscape ist SVG, nach dem Export als PDF können solche Grafiken aber wie üblich mit \verb!\includegraphics[..]{..}! in \latex\ eingefügt werden. Eine interessante Möglichkeit dabei ist, Texte innerhalb der Grafik durch \latex\ automatisch ersetzen zu lassen. Dadurch werden in der fertigen Grafik dieselben Schriften wie im Fließtext verwendet und \va\ mathematische Elemente entsprechend ersetzt. Abbildung \ref{fig:InkscapeExample} zeigt ein Beispiel dazu: % \begin{itemize} \item Die ursprüngliche Inkscape-Grafik \nolinkurl{images/inkscape-template.svg} enthält Texte, die nachträglich von \latex\ ersetzt werden sollen (siehe Abb.~\ref{fig:InkscapeExample}\,(a)). \item Durch \textsf{Save a Copy...} (als PDF) in Inkscape, mit den Einstellungen wie in Abb.~\ref{fig:InkscapeExample}\,(c), werden folgende zwei Files erzeugt: \begin{itemize} \item[] \nolinkurl{inkscape-template.pdf}: eine PDF-Datei der Grafik ohne Texte, \item[] \nolinkurl{inkscape-template.pdf_tex}: eine \latex-Datei mit allen relevanten Informationen. \end{itemize} \end{itemize} % Die Einbindung der Grafik in das Dokument erfolgt schließlich durch \begin{itemize} \item[] \verb!\input{images/inkscape-template.pdf_tex}!, \end{itemize} mit dem in Abb.~\ref{fig:InkscapeExample}\,(b) gezeigten Ergebnis. \begin{figure} \centering\small \begin{tabular}{cc} \includegraphics[scale=1.0]{inkscape-template-orig} & \input{images/inkscape-template.pdf_tex} \\ (a) & (b) \\[6pt] \multicolumn{2}{c}{\includegraphics[width=0.4\textwidth]{inkscape-pdf-save-screenhot}% ~~\raisebox{25mm}{(c)}} \end{tabular} \caption{Beispiel für eine mit \emph{Inkscape} erzeugte Vektorgrafik (\nolinkurl{inkscape-template.svg}). Originalgrafik im \textit{Inkscape}-Editor (a); beim Einfügen werden die Texte automatisch durch LaTeX ersetzt (b). Beim Speichern in Inkscape (als PDF) ist auf die Einstellung "PDF+LaTeX" zu achten (c).} \label{fig:InkscapeExample} \end{figure} \subsubsection{Einbettung von Schriften} Die Wiedergabe von Textelementen ist abhängig von der auf dem Computer (oder Drucker) installierten Schriften und der Form der Schrifteinbettung im Quelldokument. Die korrekte Darstellung am Bildschirm eines Computers bedeutet nicht, dass dasselbe Dokument auf einem anderen Computer oder Drucker genau so dargestellt wird. Dieser Umstand ist besonders wichtig, wenn Druckdokumente online zur Verfügung gestellt werden. Kontrollieren Sie daher genau, ob die innerhalb Ihrer Grafiken verwendeten Schriften auch exakt wie beabsichtigt im Ausdruck aufscheinen. \subsubsection{Strichstärken -- \emph{Hairlines} vermeiden!} In Grafik-Programmen wie \emph{Freehand} und \emph{Illustrator}, die sich im Wesentlichen an der \emph{PostScript}-Funktionalität orientieren, ist es möglich, Linien bzgl.\ ihrer Stärke als "Hairline" zu definieren. Im zugehörigen \emph{PostScript}-Code wird dies als \texttt{linewidth} mit dem Wert \texttt{0} ausgedrückt und sollte am Ausgabegerät "möglichst dünne" Linien ergeben. Das Ergebnis ist ausschließlich vom jeweiligen Drucker abhängig und somit kaum vorhersagbar. \textbf{Fazit:} Hairlines vermeiden und stattdessen immer konkrete Strichstärken ($\geq 0.25\,\mathrm{pt}$) einstellen! \subsection{\tex-Schriften auch in Grafiken?} \label{sec:tex-schriften-in-grafiken} Während bei Abbildungen, die mit externen Grafik-Programmen erzeugt werden, meist mit ähnlich aussehende Schriften (wie \emph{Times-Roman} oder \emph{Garamond}) Abhilfe schaffen, besteht bei Puristen oft der verständliche Wunsch, die \emph{Computer-Modern} (CM) Schriftfamilie von {\tex}/{\latex} auch innerhalb von eingebetteten Grafiken einzusetzen. \subsubsection{\emph{BaKoMa}-Schriften (TrueType)} Glücklicherweise stehen einige Portierungen von CM als {\em TrueType}-Schriften zur Verfügung, die auch in herkömmlichen DTP-Anwendungen unter \emph{Windows} und \emph{Mac~OS} verwendet werden können. Empfehlenswert ist \zB\ die \emph{BaKoMa Fonts Collection},% \footnote{\url{http://ctan.org/pkg/bakoma-fonts}} die neben den CM-Standardschriften auch die mathematischen Schriften der AMS-Familie ent\-hält und zudem kostenfrei ist. Natürlich müssen die TrueType Schriften vor der Verwendung zunächst auf dem eigenen PC installiert werden. \subsubsection{\emph{Latin Modern Roman} Fonts (OpenType)} Eine Alternative dazu sind die "LM-Roman"% \footnote{\url{http://www.gust.org.pl/projects/e-foundry/latin-modern}} Open-Type Schriften, die speziell für die Verwendung im Umfeld von \latex\ entwickelt wurden. Sie sind auch Teil der MikTeX-Installation.% \footnote{\zB unter \url{C:/Program Files (x86)/MikTeX 2.9/fonts/opentype/public/lm/}} Diese Schriften enthalten \ua\ Zeichen mit Umlauten und sind daher auch für deutsche Texte recht bequem zu verwenden. \subsection{Für Gourmets: Grafiken mit \latex-Overlays} \label{sec:GraphicOverlays} Bisweilen ist es erforderlich, ein bestehendes Bilder oder eine Grafik mit \latex-eigenen (Vektor-)Elementen zu überlagern, \zB\ für Markierungen oder Beschriftungen. Ein typisches Beispiel ist in Abb.~\ref{fig:overpic-example} gezeigt, wo eine mit \emph{Mathematica} generierte PDF-Grafik mit mathematischen Elementen annotiert wird. \begin{figure} \centering\small %\includegraphics[width=0.85\textwidth]{mathematica-example} \vspace*{3mm} \begin{overpic}[width=0.85\textwidth]{mathematica-example} \put(101,14){$x$}% \put(4,31){$f(x)$}% \put(29.5,28){\line(1,1){2}}% {\color{green!70!black}\put(29.5,28){\circle*{2.0}}}% \put(32,30){$\cos(\frac{7}{3} x)$}% \put(59,28){\line(1,1){2}}% {\color{blue!70!black}\put(59,28){\circle*{2.0}}}% \put(61.5,30){$\cos(x)$}% \end{overpic} \caption{Beispiel für die Verwendung des \texttt{overpic}-Pakets zum Einfügen von \latex-Elementen über eine importierte Grafik. In diesem Fall wurden die mathematischen Elemente $x$, $f(x)$, $\cos(x)$ und $\smash{\cos(\frac{7}{3} x)}$ sowie zwei diagonale Geraden und gefüllte (färbige) Kreise eingefügt. Darunter liegt die Vektor\-grafik \texttt{mathematica-example.pdf}.} \label{fig:overpic-example} \end{figure} Dazu wird das \texttt{overpic}-Paket% \footnote{\url{https://www.ctan.org/pkg/overpic}} verwendet und zum Importieren der Grafik anstelle von \verb!\includegraphics! die Umgebung \verb!\begin{overpic}! \ldots \verb!\end{overpic}! verwendet (mit ähnlicher Syntax): \begin{LaTeXCode}[numbers=none] \begin{overpic}[width=0.85\textwidth]{mathematica-example} \put(101,14){$x$}% \put(4,31){$f(x)$}% \put(29.5,28){\line(1,1){2}}% ... \end{overpic} \end{LaTeXCode} Die \texttt{overpic}-Umgebung bildet gleichzeitig eine \texttt{picture}-Umgebung, in der \latex-Zeichenanweisungen (wie \verb!\put! u.ä.) platziert werden können, wie in obigem Beispiel gezeigt.\footnote{Die Standard-Zeichenanweisungen in \latex sind ziemlich restriktiv, weshalb hier zusätzlich das \texttt{pict2e}-Paket (\url{https://www.ctan.org/pkg/pict2e}) verwendet wird.} Die $x/y$-Positionen sind in Prozent der Bildbreite angegeben. Weitere Details finden sich im Quelltext. \subsection{Abbildungen mit mehreren Elementen} Werden mehrere Bilder oder Grafiken zu einer Abbildung zusammengefasst, wird üblicherweise eine gemeinsame Caption verwendet, wie in Abb.~\ref{fig:Bearings} dargestellt. Im Text könnte ein Verweis auf einen einzelnen Teil der Abbildung, etwa das einreihige Rollenlager in Abb.~\ref{fig:Bearings}\,(c), so aussehen: % \begin{LaTeXCode}[numbers=none] ... Abb.~\ref{fig:Bearings} (c) ... \end{LaTeXCode} \subsection{Quellenangaben in Captions} \label{sec:QuellenangabenInCaptions} Wenn Bilder, Grafiken oder Tabellen aus anderen Quellen verwendet werden, dann muss ihre Herkunft in jedem Fall klar ersichtlich gemacht werden, und zwar am besten direkt in der Caption. Wird beispielsweise eine Grafik aus einem Buch oder einer sonstigen zitierfähigen Publikation verwendet, dann sollte diese in das Literaturverzeichnis aufgenommen und wie üblich mit \verb!\cite{..}! zitiert werden, wie in Abb.\ \ref{fig:Bearings} demonstriert. Weitere Details zu dieser Art von Quellenangaben finden sich in Kap.\ \ref{cha:Literatur} (insbes.\ Abschnitt \ref{sec:KategorieOnline}). \begin{figure} \centering\small \begin{tabular}{@{}c@{\hspace{12mm}}c@{}} % mittlerer Abstand = 12mm \includegraphics[width=.45\textwidth]{overhang-mounting} & \includegraphics[width=.45\textwidth]{straddle-mounting} \\ (a) & (b) \\[4pt] %vertical extra spacing (4 points) \includegraphics[width=.45\textwidth]{ball-bearing-1} & \includegraphics[width=.45\textwidth]{ball-bearing-2} \\ (c) & (d) \end{tabular} % \caption{Diverse Maschinenelemente als Beispiel für eine Abbildung mit mehreren Elementen. \emph{Overhang Mounting}~(a), \emph{Straddle Mounting}~(b), einreihiges Rollenlager~(c), Schmierung von Rollenlagern~(d). Diese Abbildung verwendet eine gewöhnliche Tabelle (\texttt{tabular}) mit 2 Spalten und 4 Zeilen (Details finden sich im Quelltext). Bildquelle~\cite{Faires1934}.} \label{fig:Bearings} \end{figure} \section{Tabellen} Tabellen werden häufig eingesetzt um numerische Zusammenhänge, Testergebnisse etc.\ in übersichtlicher Form darzustellen. Ein einfaches Beispiel ist Tab.~\ref{tab:processors}, der \latex-Quelltext dazu findet sich in Prog.~\ref{prog:processors-source}. \begin{table} \caption{Prozessor-Familien im Überblick.} \label{tab:processors} \centering \setlength{\tabcolsep}{5mm} % separator between columns \def\arraystretch{1.25} % vertical stretch factor (Standard = 1.0) \begin{tabular}{|r||c|c|c|} \hline & \emph{PowerPC} & \emph{Pentium} & \emph{Athlon} \\ \hline\hline Manufacturer & Motorola & Intel & AMD \\ \hline Speed & high & medium & high \\ \hline Price & high & high & medium \\ \hline \end{tabular} \end{table} \begin{program} % place caption consistently either at the top or bottom: \caption{\latex\ Quelltext zu Tab.~\ref{tab:processors}. Die Erzeugung des dargestellten Listings selbst ist in Abschn.\ \ref{sec:programmtexte} beschrieben.} \label{prog:processors-source} % \begin{LaTeXCode}[numbers=none] \begin{table} \caption{Prozessor-Familien im Überblick.} \label{tab:processors} \centering \setlength{\tabcolsep}{5mm} % separator between columns \def\arraystretch{1.25} % vertical stretch factor \begin{tabular}{|r||c|c|c|} \hline & \emph{PowerPC} & \emph{Pentium} & \emph{Athlon} \\ \hline \hline Manufacturer & Motorola & Intel & AMD \\ \hline Speed & high & medium & high \\ \hline Price & high & high & medium \\ \hline \end{tabular} \end{table} \end{LaTeXCode} % \end{program} Manchmal ist es notwendig, in Tabellen relativ viel Text in engen Spalten unter zu bringen, wie in Tab.~\ref{tab:synthesis-techniques}. In diesem Fall ist es sinnvoll, auf den Blocksatz zu verzichten und gleichzeitig die strengen Abteilungsregeln zu lockern. Details dazu finden sich im zugehörigen \latex-Quelltext. %-------------------------------------------------------------------------------- % Table with narrow columns %-------------------------------------------------------------------------------- \begin{table} \caption{Beispiel für eine Tabelle mit mehrzeiligem Text in engen Spalten. Hier werden die Zeilen für den Blocksatz zu kurz, daher wird linksbündig gesetzt (im "Flattersatz").} \label{tab:synthesis-techniques} \centering \def\rr{\rightskip=0pt plus1em \spaceskip=.3333em \xspaceskip=.5em\relax} \setlength{\tabcolsep}{1ex} \def\arraystretch{1.20} \setlength{\tabcolsep}{1ex} \small \begin{english} \begin{tabular}{|p{0.2\textwidth}|c|p{0.3\textwidth}|p{0.2\textwidth}|} \hline \multicolumn{1}{|c}{\emph{Method}} & \multicolumn{1}{|c}{\emph{Implem.}} & \multicolumn{1}{|c}{\emph{Features}} & \multicolumn{1}{|c|}{\emph{Status}} \\ \hline\hline {\rr polygon shading} & SW/HW & {\rr flat-shaded polygons} & \\ \hline {\rr flat shading with z-buffer} & SW/HW & {\rr depth values} & \\ \hline {\rr goraud shading with z-buffer} & SW/HW & {\rr smooth shading, simple fog, point light sources} & {\rr SGI entry models} \\ \hline {\rr phong shading with z-buffer} & SW/HW & {\rr highlights} & \\ \hline {\rr texture mapping with z-buffer} & SW/HW & {\rr surface textures, simple shadows} & {\rr SGI high end, flight simulators} \\ \hline % {\rr reflection mapping with z-buffer} & % SW/HW & % {\rr reflections} & % {\rr SGI next generation} \\ %\hline % {\rr raytracing} & % SW & % {\rr refraction, real camera model, area light sources with penumbra, realistic material models} & % {\rr common ray\-tracers} \\ %\hline % {\rr raytracing + global illumination simulation} & % SW & % {\rr indirect illumination} & % \textit{Radiance} \\ %\hline % {\rr raytracing + global illumination simulation + dissipating media} & % none & % {\rr realistic clouds, scattering, ...} & % {\rr research} \\ %\hline \end{tabular} \end{english} \end{table} %-------------------------------------------------------------------------------- \section{Programmtexte} \label{sec:programmtexte} Die Einbindung von Programmtexten (source code) ist eine häufige Notwendigkeit, \va natürlich bei Arbeiten im Bereich der Informatik. \subsection{Formatierung von Programmcode} \label{sec:FormatierungVonProgrammcode} Es gibt für \latex\ spezielle Pakete zur Darstellung von Programmen, die \ua\ auch die automatische Nummerierung der Zeilen vornehmen, insbesondere die Pakete \texttt{listings}% \footnote{\url{https://ctan.org/pkg/listings}} und \texttt{listingsutf8}.% \footnote{\url{https://ctan.org/pkg/listingsutf8}} Damit sind auch die in Tabelle~\ref{tab:CodeUmgebungen} aufgelisteten Code-Umgebungen realisiert. % \begin{table} \caption{In \nolinkurl{hgb.sty} vordefinierte Code-Umgebungen.} \label{tab:CodeUmgebungen} \centering \begin{tabular}{llll} \hline C (ANSI): & \verb!\begin{CCode}! & \verb!...! \verb!\end{CCode}! \\ C++ (ISO): & \verb!\begin{CppCode}! & \verb!...! \verb!\end{CppCode}! \\ C\#: & \verb!\begin{CsCode}! & \verb!...! \verb!\end{CsCode}! \\ CSS: & \verb!\begin{CssCode}! & \verb!...! \verb!\end{CssCode}! \\ HTML: & \verb!\begin{HtmlCode}! & \verb!...! \verb!\end{HtmlCode}! \\ Java: & \verb!\begin{JavaCode}! & \verb!...! \verb!\end{JavaCode}! \\ JavaScript: & \verb!\begin{JsCode}! & \verb!...! \verb!\end{JsCode}! \\ \latex: & \verb!\begin{LaTeXCode}! & \verb!...! \verb!\end{LaTeXCode}! \\ Objective-C: & \verb!\begin{ObjCCode}! & \verb!...! \verb!\end{ObjCCode}! \\ PHP: & \verb!\begin{PhpCode}! & \verb!...! \verb!\end{PhpCode}! \\ Swift: & \verb!\begin{SwiftCode}! & \verb!...! \verb!\end{SwiftCode}! \\ XML: & \verb!\begin{XmlCode}! & \verb!...! \verb!\end{XmlCode}! \\ Generisch: & \verb!\begin{GenericCode}! & \verb!...! \verb!\end{GenericCode}! \\ \hline \end{tabular} \end{table} % Die Verwendung ist äußerst einfach, \zB\ für Quellcode in der Programmiersprache C schreibt man % \begin{quote} \begin{verbatim} \begin{CCode} ... \end{CCode} \end{verbatim} \end{quote} % Der Quellcode innerhalb dieser Umgebungen wird in der jeweiligen Programmiersprache interpretiert, wobei Kommentare erhalten bleiben. Diese Umgebungen können sowohl alleinstehend (im Fließtext) oder innerhalb von Float-Umgebungen (insbes.\ \texttt{program}) verwendet werden. Im ersten Fall wird der Quelltext auch über Seitengrenzen umgebrochen. Mit \verb!/+! ... \verb!+/! ist eine Escape-Möglichkeit nach \latex\ vorgesehen, die \va\ zum Setzen von Labels für Verweise auf einzelne Programmzeilen nützlich ist, \zB\ mit % \begin{quote} \verb!/+\label{ExampleCodeLabel}+/! \end{quote} % Ein Beispiel mit Java ist in Prog.~\ref{prog:CodeExample} gezeigt, wobei der oben angeführte Label in Zeile \ref{ExampleCodeLabel} steht. Man beachte, dass innerhalb der Kommentare auch mathematischer Text (wie etwa in Zeile \ref{MathInCode} von Prog.~\ref{prog:CodeExample}) stehen kann. \subsubsection{Nummerierung der Code-Zeilen} Alle in Tabelle~\ref{tab:CodeUmgebungen} angeführten Code-Umgebungen können mit optionalen Argumenten verwendet werden, die insbesondere zur Steuerung der Zeilennummerierung hilfreich. Im Normalfall (also ohne zusätzliche Angabe) mit % \begin{quote} \verb!\begin{!\texttt{\emph{some}Code}\verb!} ... ! \end{quote} % werden alle Code-Zeilen (einschließlich der Leerzeilen) bei 1 beginnend und fortlaufend nummeriert. % Bei aufeinanderfolgenden Codesegmenten ist es oft hilfreich, die Nummerierung aus dem vorherigen Abschnitt kontinuierlich weiter laufen zu lassen, ermöglicht durch die Angabe des optionalen Arguments \texttt{firstnumber={\obnh}last}: % \begin{quote} \verb!\begin{!\texttt{\emph{some}Code}\verb!}[firstnumber=last] ... ! \end{quote} % Um die Nummerierung der Codezeilen gänzlich zu unterbinden genügt die Angabe des optionalen Arguments \texttt{numbers={\obnh}none}: % \begin{quote} \verb!\begin{!\texttt{\emph{some}Code}\verb!}[numbers=none] ... ! \end{quote} % In diesem Fall ist natürlich die Verwendung von Zeilenlabels im Code nicht sinnvoll. \subsection{Platzierung von Programmcode} Da Quelltexte sehr umfangreich werden können, ist diese Aufgabe nicht immer leicht zu lösen. Abhängig vom Umfang und vom Bezug zum Haupttext gibt es grundsätzlich drei Möglichkeiten zur Einbindung von Programmtext: % \begin{itemize} \item[a)] im laufenden Text für kurze Programmstücke, \item[b)] als Float-Element (\texttt{program}) für mittlere Programmtexte bis max.\ eine Seite oder \item[c)] im Anhang (für lange Programmtexte). \end{itemize} \subsubsection{Programmtext im laufenden Text} Kurze Codesequenzen können ohne weiteres im laufenden Text eingebettet werden, sofern sie an den gegebenen Stellen von unmittelbarer Bedeutung sind. Die folgende (rudimentäre) Java-Methode \texttt{extractEmail} sucht nach einer E-Mail-Adresse in der Zeichenkette \texttt{line}: % \begin{JavaCode}[numbers=none] static String extractEmail(String line) { line = line.trim(); // find the first blank int i = line.indexOf(' '); if (i > 0) return line.substring(i).trim(); else return null; } \end{JavaCode} \medskip \noindent Dieses Codestück wurde mit % \begin{quote} \begin{verbatim} \begin{JavaCode}[numbers=none] static String extractEmail(String line) { line = line.trim(); // find the first blank ... } \end{JavaCode} \end{verbatim} \end{quote} % erstellt (siehe Abschn.\ \ref{sec:FormatierungVonProgrammcode}). In-line Programmstücke sollten maximal einige Zeilen lang sein und nach Möglichkeit nicht durch Seitenumbrüche geteilt werden. %Um auch längere Programmzeilen unterzubringen, empfiehlt es sich, dafür %eine entsprechend kleine Schriftgröße zu wählen (als Standardgröße ist %\texttt{footnotesize} eingestellt). \subsubsection{Programmtexte als Float-Elemente} Sind längere Codesequenzen notwendig, die in unmittelbarer Nähe des laufenden Texts stehen müssen, sollten diese genauso wie andere Abbildungen als Float-Elemente behandelt werden. Diese Programmtexte sollten den Umfang von einer Seite nicht übersteigen. Im Notfall können auch bis zu zwei Seiten in aufeinanderfolgende Abbildungen gepackt werden, jeweils mit eigener Caption. In \texttt{hgb.sty} ist eine neue Float-Umgebung \texttt{program} definiert, die analog zu \texttt{table} verwendet wird: % \begin{quote} \begin{verbatim} \begin{program} \caption{Der Titel zu diesem Programmstück.} \label{prog:xyz} \begin{JavaCode} class IrgendWas { ... } \end{JavaCode} \end{program} \end{verbatim} \end{quote} % Wenn gewünscht, kann die Caption auch unten angebracht werden (jedenfalls aber konsistent und nicht gemischt). Natürlich darf auch hier nicht mit einer linearen Abfolge im fertigen Druckbild gerechnet werden, daher sind Wendungen wie "... im folgenden Programmstück ..." zu vermeiden und entsprechende Verweise einzusetzen. Beispiele sind Programme \ref{prog:processors-source} und \ref{prog:CodeExample}. \begin{program} % place caption consistently either at the top or bottom: \caption{Beispiel für die Auflistung von Programmcode als Float-Element.} \label{prog:CodeExample} \begin{JavaCode} import ij.ImagePlus; import ij.plugin.filter.PlugInFilter; import ij.process.ImageProcessor; public class My_Inverter implements PlugInFilter { int agent_velocity; String title = ""; // just to test printing of double quotes public int setup (String arg, ImagePlus im) { return DOES_8G; // this plugin accepts 8-bit grayscale images /+\label{pr:IjSamplePlugin10}+/ } public void run (ImageProcessor ip) { int w = ip.getWidth(); /+\label{ExampleCodeLabel}+/ int h = ip.getHeight(); /* iterate over all image coordinates */ for (int u = 0; u < w; u++) { for (int v = 0; v < h; v++) { int p = ip.getPixel(u, v); ip.putPixel(u, v, 255-p); // invert: /+$I'(u,v) \leftarrow 255 - I(u,v)$\label{MathInCode}+/ } } } } // end of class My_Inverter \end{JavaCode} % \end{program} \subsubsection{Programmtext im Anhang} Für längere Programmtexte, speziell wenn sie vollständige Implementierungen umfassen und im aktuellen Kontext nicht unmittelbar relevant sind, muss zur Ablage in einem getrennten Anhang am Ende des Dokuments gegriffen werden. Für Hinweise auf bestimmte Details können entweder kurze Ausschnitte in den laufenden Text gestellt oder mit entsprechenden Seitenverweisen gearbeitet werden. Ein solches Beispiel ist der \latex-Quellcode in Anhang \ref{app:latex} (Seite \pageref{app:latex}).% \footnote{% Grundsätzlich ist zu überlegen, ob die gedruckte Einbindung der gesamten Programmtexte einer Implementierung für den Leser überhaupt sinnvoll ist, oder ob diese nicht besser elektronisch (auf Datenträger) beigefügt und nur exemplarisch beschrieben werden.}