Python in Latex, Nutzung des Listings Paketes

Gute Links und Tutorials könnt ihr hier posten.
Antworten
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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:

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}
Darüber hinaus kann man natürlich auch längeren Code einbinden:

Code: Alles auswählen

\begin{lstlisting}
for x in xrange(a):
   # und hier der Rest vom Script
\end{lstlisting}
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:

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
Allerdings kann man Tabulatoren und Leerzeichen auch explizit anzeigen. (Hier ein Pythonbeispiel gegen den Einsatz von Leerzeichen und Tabs in einem File.):

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}  
Liniennummerierung am Rand kann so gesetzt werden:

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
}
Ein Listing kann auch als float verwendet werden:

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}
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.:

Code: Alles auswählen

\usepackage{listings}
\lstloadlanguages{bash, Python}
\lstset{alsolanguage=bash}
\lstset{alsolanguage=Python}
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

Code: Alles auswählen

\lstset{language="Sprache der Wahl"}
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:

Code: Alles auswählen

\lstset{extendedchars=true}
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:

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)$.
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:

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}
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Ja, das listings-Package ist wirklich sehr nuetzlich. Achtung bei der Benutzung mit der beamer-Klasse: Kommt ein Listing im Frame vor, sollte das Frame als fragile deklariert werden: \begin{frame}[fragile].

Hab ewig gebraucht, das rauszufinden...
lunar

Rebecca hat geschrieben:Ja, das listings-Package ist wirklich sehr nuetzlich. Achtung bei der Benutzung mit der beamer-Klasse: Kommt ein Listing im Frame vor, sollte das Frame als fragile deklariert werden: \begin{frame}[fragile].

Hab ewig gebraucht, das rauszufinden...
Tja, latex ist manchmal etwas eigenwillig ;)
Benutzeravatar
Helex
User
Beiträge: 33
Registriert: Mittwoch 21. Februar 2007, 09:52
Wohnort: Dessau, Sachsen-Anhalt
Kontaktdaten:

Hallo Christian,

ich hatte auch vor kurzem ein ähnliches Problem und hab es wie folgt gelöst:

Code: Alles auswählen

\usepackage{listings}
\lstset{language=Python, showstringspaces=false}

\lstinputlisting{konsonanten.py}
wobei ich einfach mit \lstinputlisting{konsonanten.py meinen Python Code direkt einbinde ohne extra etwas reinzu kopieren.

MfG Helex
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Danke, diese Variante hatte ich vergessen. Vergessen, weil ich mich entschlossen habe meinen Code in zwei Spalten zu setzen, um es kleiner zu bekommen und da muß ich dann halt gelegentlich nacheditieren.

Gruß,
Christian
BlackJack

Vielleicht sollte man ``mathescape=true`` noch erwähnen. Dann kann man z.B. Formeln in Kommentaren setzen.
ramin
User
Beiträge: 8
Registriert: Sonntag 15. Mai 2005, 15:07

Vielen Dank für die tolle Zusammenfassung !

Einzig die Zeilen-Referenz hat bei mir nicht funktioniert, da dürfte ein Typo passiert sein:

\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)$.
fnktioniert bei mir nur, wenn ich folgendes eingebe:
z = calc(x) (*@\label{Mein lokaler Schlüssel}@*)
Liebe Grüße
Ramin
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

die Sache mit der Referenz iritiert mich auch etwas. Je nach Rechner funktioniert nämlich mal die eine, mal die andere Version. Dabei sollten die Versionen von LaTex und Listing eigentlich die gleichen sein. Also: Vielen Dank für die Klarstellung, aber ich habe auch keine Ahnung was da vor sich geht und habe bislang nichts Einschlägiges im Netz gefunden.

Gruß,
Christian
cruzer*
User
Beiträge: 21
Registriert: Mittwoch 4. September 2013, 10:50

Helex hat geschrieben:Hallo Christian,

ich hatte auch vor kurzem ein ähnliches Problem und hab es wie folgt gelöst:

Code: Alles auswählen

\usepackage{listings}
\lstset{language=Python, showstringspaces=false}

\lstinputlisting{konsonanten.py}
wobei ich einfach mit \lstinputlisting{konsonanten.py meinen Python Code direkt einbinde ohne extra etwas reinzu kopieren.

MfG Helex
Wie kann ich hier noch den Code farbig darstellen. Und Zeilenumbrüche.
BlackJack

@cruzer*: Das listings-Paket hat eine recht umfangreiche Dokumentation. Da steht auch drin wie man zum Beispiel Schlüsselwörtern ein eigenes Aussehen geben kann, also auch mit dem color-Paket farbig auszeichnen kann. Für Zeilenumbrüche gibt es auch Optionen (Zeichen zur Kennzeichnung, Einrücken).
cruzer*
User
Beiträge: 21
Registriert: Mittwoch 4. September 2013, 10:50

Danke, hier alles gefunden!
Antworten