Python in Latex, Nutzung des Listings Paketes
Verfasst: Donnerstag 3. Mai 2007, 15:35
Hoi,
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:
Darüber hinaus kann man natürlich auch längeren Code einbinden:
Mit dem \lstset-Befehl, können direkt nach dem Einbinden des Paketes, also auch vor Beginn der Dokumentenumgebung globale Parameter für den Code gesetzt werden:
Allerdings kann man Tabulatoren und Leerzeichen auch explizit anzeigen. (Hier ein Pythonbeispiel gegen den Einsatz von Leerzeichen und Tabs in einem File.):
Liniennummerierung am Rand kann so gesetzt werden:
Ein Listing kann auch als float verwendet werden:
Was ist nun, wenn man Beispiele mehrerer Sprachen in einem LaTex-Dokument unterbringen will?
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.:
Die beiden \lstset-Befehle müssen explizit gegeben werden. Tauchen Probleme auf (z.B. wenn man 'env' in Python nutzen will (kein Keyword in Python, aber eines in bash)), kann man auch vor jedem Listing
setzen.
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:
Meiner Erfahrung nach funktioniert das aber nicht bei allen Zeichen, z. B. Å, ist aber vor allem editorabhängig (Unicodeunterstützung).
In LaTex nicht unwichtig sind auch Beschriftungen und label:
Sowei so gut, weitere Dinge, werde ich ggf. mal anfügen - oder wer von euch Lust dazu hat.
Gruß,
Christian
PS Noch eine Beispielpräambel:
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}