in der Vergangenheit gab es hier im Forum ja schon einige Hinweise wie man (Python)-Code mit Latex schreiben/drucken kann. Aus aktuellem Anlaß habe ich mir aber mal ein Paar Gedanken dazu gemacht und stelle diese hier ins Forum und zur Diskussion.
In der letzten Zeit sitze ich daran einige Scripte in einer größeren Arbeit unterzubringen. Meine Anforderungen sind:
- Farbiges Syntaxhighlighting in einer PDF-Version, aber schwarz-weiß in der gedruckten Version, um Druckkosten zu sparen.
- Optional mehrspaltiger Druck. Dies spart u. U. auch Druckkosten, aber vor allem erleichtert es das Lesen, da nicht unbedingt zwischen zwei Seiten geblättert werden muß. Wie sich das auswirkt hängt natürlich vom jeweiligen Codebeispiel ab.
- Unterstützung mehrer Programmiersprachen.
Diese Dinge und noch etwas mehr kann man in Verbindung mit dem listings-Package für LaTex erreichen und eine Kurzzusammenfassung möchte ich hier geben. Im Übrigen verweise ich auf das listings-Package auf www.ctan.org. Hieraus habe ich auch den Beginn meiner Zusammenstellung zusammengefasst.
Grundsätzlich ließe sich Code als Snippet folgendermaßen in Latex einbinden:
Code: Alles auswählen
\usepackage{listings}
\begin{document}
\lstset{language=Python}
% Und hier etwas Text:
Wie man in der list comprehension sehen kann \lstinline![x for x in longlist]! ...
Dasselbe läßt sich auch mit $ als Begrenzern erreichen: \lstinline$[x for x in longlist]$
\end{document}
Code: Alles auswählen
\begin{lstlisting}
for x in xrange(a):
# und hier der Rest vom Script
\end{lstlisting}
Code: Alles auswählen
\lstset{
basicstyle=\tiny, % alle listings winzig drucken (meine Standardeinstellung)
keywordstyle=\color{black}\bfseries % Schlüsselwörter fett und schwarz drucken
commentstyle=\color{blue} % Kommentare blau drucken
stringstyle=\ttfamily, % Strings im Code Schreibmaschinenähnlich - setzt sich etwas vom Code ab
showstringspaces=false} % Strings im Code ohne Kenntlichmachung von Leerzeichen - finde ich angebracht und empfehlenswert
Code: Alles auswählen
\lstset{showspaces=true, % Leerzeichen explizit anzeigen (default)
showtabs=true, % Tabs explizit anzeigen
tab=\rightarrowfill} % und zwar mit einem Pfeil nach rechts
\begin{lstlisting}
for i in range(19):
# Pythoncode mit Tab != 4 Leerzeichen, um ein schlechtes Beispiel zu geben
# Pythoncode mit 4 Leerzeichen
\end{lstlisting}
Code: Alles auswählen
\lstset{
numbers=left, % Nummerierung der Linien links vom Code
numberstyle=\tiny, % Art der Nummerierung, hier z. B.: winzige Schrift
stepnumber=5, % Intervall der Nummern, hier z.B. 5
% falls nicht gesetzt: Alle Nummern werden ausgegeben.
numbersep=5 pt % Abstand vom Code, hier z.B. 5 pt
}
Code: Alles auswählen
\begin{lstlisting}[float] % oder auch z. B. [float=hb]
for x in xrange(a):
# und hier der Rest vom Script
\end{lstlisting}
Die Doku empfiehlt nach Einbinden des Pakets direkt eine Liste der Sprachen anzugeben, um das Setzen nicht durch ständige Ladevorgänge zu unterbrechen. Also, z.B.:
Code: Alles auswählen
\usepackage{listings}
\lstloadlanguages{bash, Python}
\lstset{alsolanguage=bash}
\lstset{alsolanguage=Python}
Code: Alles auswählen
\lstset{language="Sprache der Wahl"}
Listings unterstüzt für einige Sprachen auch verschiedene Dialekte. Da dies für Python noch nicht vorgesehen ist, gibt es dafür hier auch kein Beispiel.
Mit inputenc oder anderen Internationalisierungspaketen können auch Sonderzeichen im Code dargestellt werden:
Code: Alles auswählen
\lstset{extendedchars=true}
In LaTex nicht unwichtig sind auch Beschriftungen und label:
Code: Alles auswählen
\lstset{escapeinside={(*@}{@*)}}
\begin{lstlisting}[caption={Beschriftung: bla}, label={Meine globaler Schlüssel}]
for x in y:
z = calc(x) (*\label={Mein lokaler Schlüssel}*)
\end{lstlisting}
In Zeile \ref={Mein lokaler Schlüssel} sieht man den Aufruf von \lstinline$calc(x)$.
Gruß,
Christian
PS Noch eine Beispielpräambel:
Code: Alles auswählen
%Farbunterstützung (ausserhalb der Bilder)
\usepackage[usenames, dvips]{color}
%for code examples
\usepackage{listings}
\lstloadlanguages{bash, Python}
%\lstset{alsolanguage=bash}
%\lstset{alsolanguage=Python}
%definitionblock with colors
\lstset{commentstyle=\color{PineGreen}\bfseries,
keywordstyle=\color{BlueViolet}\bfseries,
stringstyle=\ttfamily\color{BrickRed}}
%definitionblock without colors
%\lstset{commentstyle=\bfseries,
%keywordstyle=\bfseries,
%stringstyle=\ttfamily}
\lstset{showspaces=false,
basicstyle=\tiny,
showstringspaces=false}
\lstset{numbers=left, stepnumber=5, numberstyle=\tiny, numbersep=5pt}