Pythoncode in LaTeX

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Pythoncode in LaTeX

Beitragvon Clython » Samstag 25. Februar 2006, 18:26

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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Samstag 25. Februar 2006, 21:31

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
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Beitragvon Clython » Samstag 25. Februar 2006, 21:53

Dankeschön.
BlackJack

Beitragvon BlackJack » Dienstag 28. Februar 2006, 00:37

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()
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Beitragvon Clython » Donnerstag 2. März 2006, 16:48

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?
BlackJack

Beitragvon BlackJack » Donnerstag 2. März 2006, 23:18

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.
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Beitragvon Clython » Donnerstag 2. März 2006, 23:35

Die Lösung lautet die neueste beamer-Distro zu benutzen und das Frame Environemnt auf [fragile] zu setzen...
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Freitag 3. März 2006, 09:40

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

Wer ist online?

Mitglieder in diesem Forum: redone