Seite 1 von 1

Pythoncode in LaTeX

Verfasst: Samstag 25. Februar 2006, 18:26
von Clython
Hallo Leute

da ich bald einen Python-Kurs geben werde, bin ich momentan gerade daran meine Folien mit Latex zu schreiben. Jetzt stellt sich mir aber ein Problem:

Wie kann ich Python-Code mit Latex korrekt darstellen?

Hat da schon jemand Erfahrung?

Danke im voraus und liebe Grüsse

Clython

Verfasst: Samstag 25. Februar 2006, 21:31
von mawe
Hi!

Es gibt z.B. das Paket listings. Hier mal ein kleines Beispielsnippet:

Code: Alles auswählen

\documentclass{article}
\usepackage{listings}

\lstset{numbers=left, numberstyle=\tiny, numbersep=5pt}
\lstset{language=Python}

\begin{document}
Trallala, hier kommt gleich ein Python-Code ...

\begin{lstlisting}
    for i in range(3):
        print i
\end{lstlisting}

\end{document}
Gruß, mawe

Verfasst: Samstag 25. Februar 2006, 21:53
von Clython
Dankeschön.

Verfasst: Dienstag 28. Februar 2006, 00:37
von BlackJack
Die Syntaxbeschreibung beim listings-Package hinkt immer ein bischen hinterher. Das letzte mal als ich aktualisiert hatte, gab's immer noch kein ``assert``. Deshalb habe ich mir folgendes kleines Skript geschrieben, das die Schlüsselwörter aus dem laufenden Interpreter in eine Sprachdefinition für das listings-Package schreibt.

Code: Alles auswählen

#!/usr/bin/env python
"""Syntax highlighting generator for LaTeX *listings* package.

The script creates a language definition from the keywords of the running
interpreter.

Just embed the output of this script into your LaTeX document and choose the
language ``[version]Python`` where *version* is the appropriate version of
the interpreter that was used to generate the output, e.g. ``2.4`` for a
interpreter version 2.4.1::

  \\lstset{language=[2.4]Python}
  \\lstinputlisting{test.py}
"""
import sys
from keyword import kwlist

__author__ = "Marc 'BlackJack' Rintsch"
__date__ = '$Date: 2006-02-27 16:05:10 +0100 (Mon, 27 Feb 2006) $'
__revision__ = '$Rev: 815 $'

source = r"""
%%%% 
%%%% Update of keywords extracted from running Python interpreter.
%%%% Extends existing Python definition of the listings package.
%%%% 
\lstdefinelanguage[%s]{Python}[]{Python}
  {morekeywords={%s}}

%%%% 
%%%% Literate Python. (Experimental)
%%%% 
\lstdefinelanguage[Literate]{Python}[%s]{Python}
 {literate=
  {\ in\ }{~$\in$~}{3}
  {\ lambda\ }{~$\lambda$~}{3}
  {\ lambda:}{~$\lambda$:}{3}
  {=}{$\gets$}{2}
  {==}{$=$}{1}
  {<=}{$\leq$}{1}
  {>=}{$\geq$}{1}
  {!=}{$\neq$}{1}
  {\ and\ }{~$\wedge$~}{3}
  {\ or\ }{~$\vee$~}{3}
  {\ not\ }{~$\neg$}{2}
 }
"""


def get_keywords(first_length=10, max_length=70):
    """Get keywords as string.
    
    Format the keywords as comma delimited lines where no line is longer
    than `max_length`.  The first line is max. `max_length` - `first_length`
    characters long.
    """
    result = list()
    line = list()
    line_length = first_length
    for keyword in kwlist:
        word_length = len(keyword)
        if (line_length + word_length) >= max_length:
            result.append(line)
            line = list()
            line_length = 0
        else:
            line.append(keyword)
            line_length += word_length + 1
    if line:
        result.append(line)
    return ',\n     '.join(map(','.join, result))


def main():
    """Main function."""
    version = '%s.%s' % sys.version_info[:2]
    keywords = get_keywords()
    print source % (version, keywords, version)


if __name__ == '__main__':
    main()

Verfasst: Donnerstag 2. März 2006, 16:48
von Clython
Hey, ihr scheint ja LaTeX-Gurus zu sein, vielleicht kann mir einer damit helfen:

Hab mal auf Beamer (da mir gesagt wurde das Seminar-Package sei veraltet) umgestellt, aber wenn ich in einer frame-Umgebung die listings-Umgebung benutze, bekomme ich einen Fehler:

Code: Alles auswählen

TeX capacity exceeded, sorry [input stack size=1500]- \end{frame}
Wenn ich die frame-Umgebung nicht benutze, funktionierts, das Layout der Folie ist dann aber nicht optimal. Was ist hier nun schon wieder das Problem?

Verfasst: Donnerstag 2. März 2006, 23:18
von BlackJack
Das ist so etwas ähnliches wie die Beschränkung bei CPython, die man mit `sys.getrecursionlimit()` abfragen kann. Wenn mehrere komplexere Pakete/Funktionen benutzt werden, dann läuft bei Tex gerne mal der Stack über. Genau wie bei Python kann man das bei Tex irgendwo selbst einstellen. Bei Tex in irgendeiner Konfigurationsdatei. Ich hab's auch selbst schonmal machen müssen, weiss aber beim besten Willen nicht mehr wo. Eine Suchmaschine hilft sicher weiter.

Verfasst: Donnerstag 2. März 2006, 23:35
von Clython
Die Lösung lautet die neueste beamer-Distro zu benutzen und das Frame Environemnt auf [fragile] zu setzen...

Verfasst: Freitag 3. März 2006, 09:40
von CM
Ein kleiner Nachtrag:
Vor einiger Zeit (Ich weiß nicht mehr wann und habe den Thread auch nicht mehr finden können) gab es auf der Python-Tutor-Mailingliste einen Thread zu eben der Grundfrage mit verschiedenen sehr schönen Lösungen. Wenn jemand dem nachgehen möchte ...

Ansonsten finde ich die Lösung von BlackJack aber auch nicht schlecht ...

Gruß,
Christian